From cae026230353fba1d6e960017101a024bd7a5c5d Mon Sep 17 00:00:00 2001 From: Zuoqiu Yingyi <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Thu, 30 Apr 2026 22:03:03 +0800 Subject: [PATCH 01/15] chore(dependencies): Upgrade devDependencies and refresh pnpm lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bump multiple devDependencies in package.json (eslint -> ^10.2.1, @eslint/js -> ^10.0.1, @typescript-eslint/* -> ^8.59.1, typescript -> ^6.0.3, webpack -> ^5.106.2, sass -> ^1.99.0, tslib -> ^2.8.1, siyuan -> 1.2.2-alpha.0, globals -> ^17.5.0, and others). Regenerate pnpm-lock.yaml to match the upgraded packages — updates include resolved versions/integrity for eslint ecosystem, parcel-watcher binaries, ajv/acorn/other dependencies, and some added type packages. This keeps the build/lint toolchain up to date and syncs the lockfile with the new dependency set. --- package.json | 36 +- pnpm-lock.yaml | 1671 +++++++++++++++++++++--------------------------- 2 files changed, 762 insertions(+), 945 deletions(-) diff --git a/package.json b/package.json index a029cb7..aba0f59 100644 --- a/package.json +++ b/package.json @@ -12,23 +12,23 @@ "author": "Vanessa", "license": "MIT", "devDependencies": { - "@eslint/eslintrc": "^3.3.3", - "@eslint/js": "^9.39.1", - "@typescript-eslint/eslint-plugin": "8.40.0", - "@typescript-eslint/parser": "8.40.0", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.7.1", - "esbuild-loader": "^3.0.1", - "eslint": "^9.33.0", - "mini-css-extract-plugin": "2.3.0", - "sass": "^1.62.1", - "sass-loader": "^12.6.0", - "siyuan": "1.2.0", - "tslib": "2.4.0", - "typescript": "4.8.4", - "webpack": "^5.76.0", - "webpack-cli": "^5.0.2", - "zip-webpack-plugin": "^4.0.1", - "globals": "^16.3.0" + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "^10.0.1", + "@typescript-eslint/eslint-plugin": "^8.59.1", + "@typescript-eslint/parser": "^8.59.1", + "copy-webpack-plugin": "^14.0.0", + "css-loader": "^7.1.4", + "esbuild-loader": "^4.4.3", + "eslint": "^10.2.1", + "globals": "^17.5.0", + "mini-css-extract-plugin": "^2.10.2", + "sass": "^1.99.0", + "sass-loader": "^16.0.7", + "siyuan": "1.2.2-alpha.0", + "tslib": "^2.8.1", + "typescript": "^6.0.3", + "webpack": "^5.106.2", + "webpack-cli": "^7.0.2", + "zip-webpack-plugin": "^4.0.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0977ce3..e55e788 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,206 +9,233 @@ importers: .: devDependencies: '@eslint/eslintrc': - specifier: ^3.3.3 - version: 3.3.3 + specifier: ^3.3.5 + version: 3.3.5 '@eslint/js': - specifier: ^9.39.1 - version: 9.39.1 + specifier: ^10.0.1 + version: 10.0.1(eslint@10.2.1) '@typescript-eslint/eslint-plugin': - specifier: 8.40.0 - version: 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.39.1)(typescript@4.8.4))(eslint@9.39.1)(typescript@4.8.4) + specifier: ^8.59.1 + version: 8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.2.1)(typescript@6.0.3))(eslint@10.2.1)(typescript@6.0.3) '@typescript-eslint/parser': - specifier: 8.40.0 - version: 8.40.0(eslint@9.39.1)(typescript@4.8.4) + specifier: ^8.59.1 + version: 8.59.1(eslint@10.2.1)(typescript@6.0.3) copy-webpack-plugin: - specifier: ^11.0.0 - version: 11.0.0(webpack@5.104.1) + specifier: ^14.0.0 + version: 14.0.0(webpack@5.106.2) css-loader: - specifier: ^6.7.1 - version: 6.11.0(webpack@5.104.1) + specifier: ^7.1.4 + version: 7.1.4(webpack@5.106.2) esbuild-loader: - specifier: ^3.0.1 - version: 3.2.0(webpack@5.104.1) + specifier: ^4.4.3 + version: 4.4.3(webpack@5.106.2) eslint: - specifier: ^9.33.0 - version: 9.39.1 + specifier: ^10.2.1 + version: 10.2.1 globals: - specifier: ^16.3.0 - version: 16.5.0 + specifier: ^17.5.0 + version: 17.5.0 mini-css-extract-plugin: - specifier: 2.3.0 - version: 2.3.0(webpack@5.104.1) + specifier: ^2.10.2 + version: 2.10.2(webpack@5.106.2) sass: - specifier: ^1.62.1 - version: 1.94.2 + specifier: ^1.99.0 + version: 1.99.0 sass-loader: - specifier: ^12.6.0 - version: 12.6.0(sass@1.94.2)(webpack@5.104.1) + specifier: ^16.0.7 + version: 16.0.7(sass@1.99.0)(webpack@5.106.2) siyuan: - specifier: 1.2.0 - version: 1.2.0 + specifier: 1.2.2-alpha.0 + version: 1.2.2-alpha.0 tslib: - specifier: 2.4.0 - version: 2.4.0 + specifier: ^2.8.1 + version: 2.8.1 typescript: - specifier: 4.8.4 - version: 4.8.4 + specifier: ^6.0.3 + version: 6.0.3 webpack: - specifier: ^5.76.0 - version: 5.104.1(webpack-cli@5.1.4) + specifier: ^5.106.2 + version: 5.106.2(webpack-cli@7.0.2) webpack-cli: - specifier: ^5.0.2 - version: 5.1.4(webpack@5.104.1) + specifier: ^7.0.2 + version: 7.0.2(webpack@5.106.2) zip-webpack-plugin: - specifier: ^4.0.1 - version: 4.0.3(webpack-sources@3.3.3)(webpack@5.104.1) + specifier: ^4.0.3 + version: 4.0.3(webpack-sources@3.4.1)(webpack@5.106.2) packages: - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} + '@discoveryjs/json-ext@1.0.0': + resolution: {integrity: sha512-dDlz3W405VMFO4w5kIP9DOmELBcvFQGmLoKSdIRstBDubKFYwaNHV1NnlzMCQpXQFGWVALmeMORAuiLx18AvZQ==} + engines: {node: '>=14.17.0'} - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} + '@dop251/types-goja_nodejs-buffer@0.0.0-20260212111938-1f56ff5bcf14': + resolution: {integrity: sha512-+ZEK3z3RVSE9O7Ml8HoeLtYSI/yR2ifa7Ppabfjq5fW06Kf00PcUz6hjz2we1h9CxlhiI7pLglEy4+hTUYGsQA==} + + '@dop251/types-goja_nodejs-global@0.0.0-20260212111938-1f56ff5bcf14': + resolution: {integrity: sha512-NYnSveyts20w79Qp+Cs6a8vyrP3+8QVisseCU/2F0rMXK/WmLvbQYmyjNFMlDbY8g3HcooTIB/2AwcwonabQEg==} + + '@dop251/types-goja_nodejs-url@0.0.0-20260212111938-1f56ff5bcf14': + resolution: {integrity: sha512-RyxfUr5u0WOO0dV2/BxV+zJ2QwUqnIoSwIoPQcGHakWp8elJ/nSU86pUB9gSO77e2XHWZYAZvNN5tXa9yOXJaA==} + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -217,40 +244,49 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.3': - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + '@eslint/eslintrc@3.3.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.1': - resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.7.1': + resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -277,98 +313,92 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] - '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} '@types/eslint-scope@3.7.7': @@ -377,72 +407,75 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.2.1': - resolution: {integrity: sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==} + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} - '@typescript-eslint/eslint-plugin@8.40.0': - resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} + '@typescript-eslint/eslint-plugin@8.59.1': + resolution: {integrity: sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.40.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser': ^8.59.1 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.40.0': - resolution: {integrity: sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==} + '@typescript-eslint/parser@8.59.1': + resolution: {integrity: sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.40.0': - resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} + '@typescript-eslint/project-service@8.59.1': + resolution: {integrity: sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.40.0': - resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} + '@typescript-eslint/scope-manager@8.59.1': + resolution: {integrity: sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.40.0': - resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} + '@typescript-eslint/tsconfig-utils@8.59.1': + resolution: {integrity: sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.40.0': - resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} + '@typescript-eslint/type-utils@8.59.1': + resolution: {integrity: sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.40.0': - resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} + '@typescript-eslint/types@8.59.1': + resolution: {integrity: sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.40.0': - resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} + '@typescript-eslint/typescript-estree@8.59.1': + resolution: {integrity: sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.40.0': - resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} + '@typescript-eslint/utils@8.59.1': + resolution: {integrity: sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.40.0': - resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} + '@typescript-eslint/visitor-keys@8.59.1': + resolution: {integrity: sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@webassemblyjs/ast@1.14.1': @@ -490,31 +523,6 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@webpack-cli/configtest@2.1.1': - resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - - '@webpack-cli/info@2.0.2': - resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - - '@webpack-cli/serve@2.0.5': - resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true - '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -532,8 +540,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true @@ -545,25 +553,16 @@ packages: ajv: optional: true - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - ajv-keywords@5.1.0: resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: ajv: ^8.8.2 - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -571,25 +570,27 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - baseline-browser-mapping@2.9.19: - resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.24: + resolution: {integrity: sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==} + engines: {node: '>=6.0.0'} hasBin: true big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -603,12 +604,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001769: - resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + caniuse-lite@1.0.30001791: + resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} @@ -622,19 +619,9 @@ packages: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -642,9 +629,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - copy-webpack-plugin@11.0.0: - resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} - engines: {node: '>= 14.15.0'} + copy-webpack-plugin@14.0.0: + resolution: {integrity: sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA==} + engines: {node: '>= 20.9.0'} peerDependencies: webpack: ^5.1.0 @@ -652,12 +639,12 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-loader@6.11.0: - resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} - engines: {node: '>= 12.13.0'} + css-loader@7.1.4: + resolution: {integrity: sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==} + engines: {node: '>= 18.12.0'} peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.0.0 + '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 + webpack: ^5.27.0 peerDependenciesMeta: '@rspack/core': optional: true @@ -681,24 +668,19 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - electron-to-chromium@1.5.286: - resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} + electron-to-chromium@1.5.345: + resolution: {integrity: sha512-F9JXQGiMrz6yVNPI2qOVPvB9HzjH5cGzhs8oJ6A28V5L/YnzN/0KsuiibqF+F1Fd9qxFzD1BUnYSd8JfULxTwg==} emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - enhanced-resolve@5.19.0: - resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + enhanced-resolve@5.21.0: + resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} engines: {node: '>=10.13.0'} envinfo@7.21.0: @@ -706,17 +688,21 @@ packages: engines: {node: '>=4'} hasBin: true - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} - esbuild-loader@3.2.0: - resolution: {integrity: sha512-lnIdRMQpk50alCa0QoW0ozc0D3rjJXl02mtMsk9INIcW25RPZhDja332bu85ixwVNbhQ7VfBRcQyZ/qza8mWiA==} + esbuild-loader@4.4.3: + resolution: {integrity: sha512-Wpui03EzqC151xFteKlgJQhbyZl5CgnBpUHXVuao02nItULlkaTeiLdEMPTmR2zdwpEBWkXVNoT5dDOYJluUzg==} peerDependencies: webpack: ^4.40.0 || ^5.0.0 - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: @@ -731,9 +717,9 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -743,9 +729,13 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.1: - resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.2.1: + resolution: {integrity: sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -757,8 +747,12 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -784,10 +778,6 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -801,17 +791,19 @@ packages: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -828,18 +820,14 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-tsconfig@4.13.0: - resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} @@ -852,26 +840,19 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.5.0: - resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + globals@17.5.0: + resolution: {integrity: sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==} engines: {node: '>=18'} - globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} icss-utils@5.1.0: @@ -888,8 +869,8 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - immutable@5.1.4: - resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + immutable@5.1.5: + resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -920,10 +901,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -946,9 +923,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -970,16 +944,12 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - loader-runner@4.3.1: - resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + loader-runner@4.3.2: + resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} engines: {node: '>=6.11.5'} loader-utils@2.0.4: @@ -994,40 +964,25 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} - mini-css-extract-plugin@2.3.0: - resolution: {integrity: sha512-uzWaOwC+gJrnKbr23J1ZRWx/Wd9W9Ce1mKPlsBGBV/r8zG7/G7oKMxGmxbI65pVGbae2cR7CUx9Ulk0HQt8BfQ==} + mini-css-extract-plugin@2.10.2: + resolution: {integrity: sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1046,8 +1001,8 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -1092,16 +1047,12 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} @@ -1138,8 +1089,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.12: + resolution: {integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1150,12 +1101,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1183,32 +1128,22 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} hasBin: true - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - sass-loader@12.6.0: - resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} - engines: {node: '>= 12.13.0'} + sass-loader@16.0.7: + resolution: {integrity: sha512-w6q+fRHourZ+e+xA1kcsF27iGM6jdB8teexYCfdUw0sYgcDNeZESnDNT9sUmmPm3ooziwUJXGwZJSTF3kOdBfA==} + engines: {node: '>= 18.12.0'} peerDependencies: - fibers: '>= 3.1.0' - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 sass: ^1.3.0 sass-embedded: '*' webpack: ^5.0.0 peerDependenciesMeta: - fibers: + '@rspack/core': optional: true node-sass: optional: true @@ -1216,27 +1151,26 @@ packages: optional: true sass-embedded: optional: true + webpack: + optional: true - sass@1.94.2: - resolution: {integrity: sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==} + sass@1.99.0: + resolution: {integrity: sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==} engines: {node: '>=14.0.0'} hasBin: true - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - schema-utils@4.3.3: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@7.0.5: + resolution: {integrity: sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==} + engines: {node: '>=20.0.0'} shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} @@ -1250,15 +1184,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - siyuan@1.2.0: - resolution: {integrity: sha512-5jcyggBDIkFVkAYi4URGWcizbJ2dNkeW8r/67xmnEtm4Cd2ao2BzV7GkaQ7iVJO6RuZyElLmZgDX4NEkRnmcdA==} - - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - - source-list-map@2.0.1: - resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + siyuan@1.2.2-alpha.0: + resolution: {integrity: sha512-zVBkvhOhjn98MFNga9qlbfVsT9OYEKF2jegHYpEtypoa1jQsxKULKzHUOUqK0pw26nwaSrv+fzh7viLTj4wkjQ==} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} @@ -1275,10 +1202,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} @@ -1287,12 +1210,12 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - terser-webpack-plugin@5.3.16: - resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} + terser-webpack-plugin@5.5.0: + resolution: {integrity: sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -1307,35 +1230,35 @@ packages: uglify-js: optional: true - terser@5.46.0: - resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} + terser@5.46.2: + resolution: {integrity: sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==} engines: {node: '>=10'} hasBin: true - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' - tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript@4.8.4: - resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} - engines: {node: '>=4.2.0'} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} hasBin: true - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} @@ -1353,36 +1276,30 @@ packages: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} - webpack-cli@5.1.4: - resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} - engines: {node: '>=14.15.0'} + webpack-cli@7.0.2: + resolution: {integrity: sha512-dB0R4T+C/8YuvM+fabdvil6QE44/ChDXikV5lOOkrUeCkW5hTJv2pGLE3keh+D5hjYw8icBaJkZzpFoaHV4T+g==} + engines: {node: '>=20.9.0'} hasBin: true peerDependencies: - '@webpack-cli/generators': '*' - webpack: 5.x.x - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' + webpack: ^5.101.0 + webpack-bundle-analyzer: ^4.0.0 || ^5.0.0 + webpack-dev-server: ^5.0.0 peerDependenciesMeta: - '@webpack-cli/generators': - optional: true webpack-bundle-analyzer: optional: true webpack-dev-server: optional: true - webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} - webpack-sources@1.4.3: - resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} - - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + webpack-sources@3.4.1: + resolution: {integrity: sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==} engines: {node: '>=10.13.0'} - webpack@5.104.1: - resolution: {integrity: sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==} + webpack@5.106.2: + resolution: {integrity: sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -1418,130 +1335,156 @@ packages: snapshots: - '@discoveryjs/json-ext@0.5.7': {} + '@discoveryjs/json-ext@1.0.0': {} + + '@dop251/types-goja_nodejs-buffer@0.0.0-20260212111938-1f56ff5bcf14': + dependencies: + '@dop251/types-goja_nodejs-global': 0.0.0-20260212111938-1f56ff5bcf14 + + '@dop251/types-goja_nodejs-global@0.0.0-20260212111938-1f56ff5bcf14': {} + + '@dop251/types-goja_nodejs-url@0.0.0-20260212111938-1f56ff5bcf14': + dependencies: + '@dop251/types-goja_nodejs-global': 0.0.0-20260212111938-1f56ff5bcf14 + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true - '@esbuild/aix-ppc64@0.19.12': + '@esbuild/android-x64@0.27.7': optional: true - '@esbuild/android-arm64@0.19.12': + '@esbuild/darwin-arm64@0.27.7': optional: true - '@esbuild/android-arm@0.19.12': + '@esbuild/darwin-x64@0.27.7': optional: true - '@esbuild/android-x64@0.19.12': + '@esbuild/freebsd-arm64@0.27.7': optional: true - '@esbuild/darwin-arm64@0.19.12': + '@esbuild/freebsd-x64@0.27.7': optional: true - '@esbuild/darwin-x64@0.19.12': + '@esbuild/linux-arm64@0.27.7': optional: true - '@esbuild/freebsd-arm64@0.19.12': + '@esbuild/linux-arm@0.27.7': optional: true - '@esbuild/freebsd-x64@0.19.12': + '@esbuild/linux-ia32@0.27.7': optional: true - '@esbuild/linux-arm64@0.19.12': + '@esbuild/linux-loong64@0.27.7': optional: true - '@esbuild/linux-arm@0.19.12': + '@esbuild/linux-mips64el@0.27.7': optional: true - '@esbuild/linux-ia32@0.19.12': + '@esbuild/linux-ppc64@0.27.7': optional: true - '@esbuild/linux-loong64@0.19.12': + '@esbuild/linux-riscv64@0.27.7': optional: true - '@esbuild/linux-mips64el@0.19.12': + '@esbuild/linux-s390x@0.27.7': optional: true - '@esbuild/linux-ppc64@0.19.12': + '@esbuild/linux-x64@0.27.7': optional: true - '@esbuild/linux-riscv64@0.19.12': + '@esbuild/netbsd-arm64@0.27.7': optional: true - '@esbuild/linux-s390x@0.19.12': + '@esbuild/netbsd-x64@0.27.7': optional: true - '@esbuild/linux-x64@0.19.12': + '@esbuild/openbsd-arm64@0.27.7': optional: true - '@esbuild/netbsd-x64@0.19.12': + '@esbuild/openbsd-x64@0.27.7': optional: true - '@esbuild/openbsd-x64@0.19.12': + '@esbuild/openharmony-arm64@0.27.7': optional: true - '@esbuild/sunos-x64@0.19.12': + '@esbuild/sunos-x64@0.27.7': optional: true - '@esbuild/win32-arm64@0.19.12': + '@esbuild/win32-arm64@0.27.7': optional: true - '@esbuild/win32-ia32@0.19.12': + '@esbuild/win32-ia32@0.27.7': optional: true - '@esbuild/win32-x64@0.19.12': + '@esbuild/win32-x64@0.27.7': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.2.1)': dependencies: - eslint: 9.39.1 + eslint: 10.2.1 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.23.5': dependencies: - '@eslint/object-schema': 2.1.7 + '@eslint/object-schema': 3.0.5 debug: 4.4.3 - minimatch: 3.1.2 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': + '@eslint/config-helpers@0.5.5': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 - '@eslint/core@0.17.0': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.3': + '@eslint/eslintrc@3.3.5': dependencies: - ajv: 6.12.6 + ajv: 6.15.0 debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.1.1 - minimatch: 3.1.2 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.39.1': {} + '@eslint/js@10.0.1(eslint@10.2.1)': + optionalDependencies: + eslint: 10.2.1 - '@eslint/object-schema@2.1.7': {} + '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.4.1': + '@eslint/plugin-kit@0.7.1': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 levn: 0.4.1 - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.7': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} @@ -1565,77 +1508,65 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@parcel/watcher-android-arm64@2.5.1': + '@parcel/watcher-android-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-arm64@2.5.1': + '@parcel/watcher-darwin-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-x64@2.5.1': + '@parcel/watcher-darwin-x64@2.5.6': optional: true - '@parcel/watcher-freebsd-x64@2.5.1': + '@parcel/watcher-freebsd-x64@2.5.6': optional: true - '@parcel/watcher-linux-arm-glibc@2.5.1': + '@parcel/watcher-linux-arm-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm-musl@2.5.1': + '@parcel/watcher-linux-arm-musl@2.5.6': optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.1': + '@parcel/watcher-linux-arm64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm64-musl@2.5.1': + '@parcel/watcher-linux-arm64-musl@2.5.6': optional: true - '@parcel/watcher-linux-x64-glibc@2.5.1': + '@parcel/watcher-linux-x64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-x64-musl@2.5.1': + '@parcel/watcher-linux-x64-musl@2.5.6': optional: true - '@parcel/watcher-win32-arm64@2.5.1': + '@parcel/watcher-win32-arm64@2.5.6': optional: true - '@parcel/watcher-win32-ia32@2.5.1': + '@parcel/watcher-win32-ia32@2.5.6': optional: true - '@parcel/watcher-win32-x64@2.5.1': + '@parcel/watcher-win32-x64@2.5.6': optional: true - '@parcel/watcher@2.5.1': + '@parcel/watcher@2.5.6': dependencies: - detect-libc: 1.0.3 + detect-libc: 2.1.2 is-glob: 4.0.3 - micromatch: 4.0.8 node-addon-api: 7.1.1 + picomatch: 4.0.4 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.1 - '@parcel/watcher-darwin-arm64': 2.5.1 - '@parcel/watcher-darwin-x64': 2.5.1 - '@parcel/watcher-freebsd-x64': 2.5.1 - '@parcel/watcher-linux-arm-glibc': 2.5.1 - '@parcel/watcher-linux-arm-musl': 2.5.1 - '@parcel/watcher-linux-arm64-glibc': 2.5.1 - '@parcel/watcher-linux-arm64-musl': 2.5.1 - '@parcel/watcher-linux-x64-glibc': 2.5.1 - '@parcel/watcher-linux-x64-musl': 2.5.1 - '@parcel/watcher-win32-arm64': 2.5.1 - '@parcel/watcher-win32-ia32': 2.5.1 - '@parcel/watcher-win32-x64': 2.5.1 + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 optional: true '@types/eslint-scope@3.7.7': @@ -1648,106 +1579,106 @@ snapshots: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 + '@types/esrecurse@4.3.1': {} + '@types/estree@1.0.8': {} '@types/json-schema@7.0.15': {} - '@types/node@25.2.1': + '@types/node@25.6.0': dependencies: - undici-types: 7.16.0 + undici-types: 7.19.2 - '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.39.1)(typescript@4.8.4))(eslint@9.39.1)(typescript@4.8.4)': + '@typescript-eslint/eslint-plugin@8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.2.1)(typescript@6.0.3))(eslint@10.2.1)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.40.0(eslint@9.39.1)(typescript@4.8.4) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/type-utils': 8.40.0(eslint@9.39.1)(typescript@4.8.4) - '@typescript-eslint/utils': 8.40.0(eslint@9.39.1)(typescript@4.8.4) - '@typescript-eslint/visitor-keys': 8.40.0 - eslint: 9.39.1 - graphemer: 1.4.0 + '@typescript-eslint/parser': 8.59.1(eslint@10.2.1)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.1 + '@typescript-eslint/type-utils': 8.59.1(eslint@10.2.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.1(eslint@10.2.1)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.1 + eslint: 10.2.1 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@4.8.4) - typescript: 4.8.4 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.40.0(eslint@9.39.1)(typescript@4.8.4)': + '@typescript-eslint/parser@8.59.1(eslint@10.2.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@4.8.4) - '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/scope-manager': 8.59.1 + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.1 debug: 4.4.3 - eslint: 9.39.1 - typescript: 4.8.4 + eslint: 10.2.1 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.40.0(typescript@4.8.4)': + '@typescript-eslint/project-service@8.59.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@4.8.4) - '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@6.0.3) + '@typescript-eslint/types': 8.59.1 debug: 4.4.3 - typescript: 4.8.4 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.40.0': + '@typescript-eslint/scope-manager@8.59.1': dependencies: - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/visitor-keys': 8.59.1 - '@typescript-eslint/tsconfig-utils@8.40.0(typescript@4.8.4)': + '@typescript-eslint/tsconfig-utils@8.59.1(typescript@6.0.3)': dependencies: - typescript: 4.8.4 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.40.0(eslint@9.39.1)(typescript@4.8.4)': + '@typescript-eslint/type-utils@8.59.1(eslint@10.2.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@4.8.4) - '@typescript-eslint/utils': 8.40.0(eslint@9.39.1)(typescript@4.8.4) + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.1(eslint@10.2.1)(typescript@6.0.3) debug: 4.4.3 - eslint: 9.39.1 - ts-api-utils: 2.1.0(typescript@4.8.4) - typescript: 4.8.4 + eslint: 10.2.1 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.40.0': {} + '@typescript-eslint/types@8.59.1': {} - '@typescript-eslint/typescript-estree@8.40.0(typescript@4.8.4)': + '@typescript-eslint/typescript-estree@8.59.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.40.0(typescript@4.8.4) - '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@4.8.4) - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/project-service': 8.59.1(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@6.0.3) + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/visitor-keys': 8.59.1 debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.3 - ts-api-utils: 2.1.0(typescript@4.8.4) - typescript: 4.8.4 + minimatch: 10.2.5 + semver: 7.7.4 + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.40.0(eslint@9.39.1)(typescript@4.8.4)': + '@typescript-eslint/utils@8.59.1(eslint@10.2.1)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@4.8.4) - eslint: 9.39.1 - typescript: 4.8.4 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1) + '@typescript-eslint/scope-manager': 8.59.1 + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) + eslint: 10.2.1 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.40.0': + '@typescript-eslint/visitor-keys@8.59.1': dependencies: - '@typescript-eslint/types': 8.40.0 - eslint-visitor-keys: 4.2.1 + '@typescript-eslint/types': 8.59.1 + eslint-visitor-keys: 5.0.1 '@webassemblyjs/ast@1.14.1': dependencies: @@ -1825,94 +1756,69 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.104.1)': - dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.104.1) - - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.104.1)': - dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.104.1) - - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.104.1)': - dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.104.1) - '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} - acorn-import-phases@1.0.4(acorn@8.15.0): + acorn-import-phases@1.0.4(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn@8.15.0: {} + acorn@8.16.0: {} - ajv-formats@2.1.1(ajv@8.17.1): + ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: - ajv: 8.17.1 - - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 + ajv: 8.20.0 - ajv-keywords@5.1.0(ajv@8.17.1): + ajv-keywords@5.1.0(ajv@8.20.0): dependencies: - ajv: 8.17.1 + ajv: 8.20.0 fast-deep-equal: 3.1.3 - ajv@6.12.6: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.17.1: + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - argparse@2.0.1: {} balanced-match@1.0.2: {} - baseline-browser-mapping@2.9.19: {} + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.24: {} big.js@5.2.2: {} - brace-expansion@1.1.12: + brace-expansion@1.1.14: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.2: + brace-expansion@5.0.5: dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 + balanced-match: 4.0.4 - browserslist@4.28.1: + browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001769 - electron-to-chromium: 1.5.286 - node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + baseline-browser-mapping: 2.10.24 + caniuse-lite: 1.0.30001791 + electron-to-chromium: 1.5.345 + node-releases: 2.0.38 + update-browserslist-db: 1.2.3(browserslist@4.28.2) buffer-crc32@0.2.13: {} @@ -1920,12 +1826,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001769: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + caniuse-lite@1.0.30001791: {} chokidar@4.0.3: dependencies: @@ -1939,29 +1840,20 @@ snapshots: kind-of: 6.0.3 shallow-clone: 3.0.1 - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - colorette@2.0.20: {} - - commander@10.0.1: {} + commander@14.0.3: {} commander@2.20.3: {} concat-map@0.0.1: {} - copy-webpack-plugin@11.0.0(webpack@5.104.1): + copy-webpack-plugin@14.0.0(webpack@5.106.2): dependencies: - fast-glob: 3.3.3 glob-parent: 6.0.2 - globby: 13.2.2 normalize-path: 3.0.0 schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) + serialize-javascript: 7.0.5 + tinyglobby: 0.2.16 + webpack: 5.106.2(webpack-cli@7.0.2) cross-spawn@7.0.6: dependencies: @@ -1969,18 +1861,18 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-loader@6.11.0(webpack@5.104.1): + css-loader@7.1.4(webpack@5.106.2): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) + icss-utils: 5.1.0(postcss@8.5.12) + postcss: 8.5.12 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.12) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.12) + postcss-modules-scope: 3.2.1(postcss@8.5.12) + postcss-modules-values: 4.0.0(postcss@8.5.12) postcss-value-parser: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.106.2(webpack-cli@7.0.2) cssesc@3.0.0: {} @@ -1990,59 +1882,60 @@ snapshots: deep-is@0.1.4: {} - detect-libc@1.0.3: + detect-libc@2.1.2: optional: true - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - electron-to-chromium@1.5.286: {} + electron-to-chromium@1.5.345: {} emojis-list@3.0.0: {} - enhanced-resolve@5.19.0: + enhanced-resolve@5.21.0: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.3 envinfo@7.21.0: {} - es-module-lexer@2.0.0: {} + es-errors@1.3.0: {} + + es-module-lexer@2.1.0: {} - esbuild-loader@3.2.0(webpack@5.104.1): + esbuild-loader@4.4.3(webpack@5.106.2): dependencies: - esbuild: 0.19.12 - get-tsconfig: 4.13.0 + esbuild: 0.27.7 + get-tsconfig: 4.14.0 loader-utils: 2.0.4 - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-sources: 1.4.3 + webpack: 5.106.2(webpack-cli@7.0.2) + webpack-sources: 3.4.1 - esbuild@0.19.12: + esbuild@0.27.7: optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 escalade@3.2.0: {} @@ -2053,8 +1946,10 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@8.4.0: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -2062,29 +1957,28 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.1: + eslint-visitor-keys@5.0.1: {} + + eslint@10.2.1: dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.39.1 - '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.7 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.5.5 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.1 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - ajv: 6.12.6 - chalk: 4.1.2 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -2094,8 +1988,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 transitivePeerDependencies: @@ -2103,11 +1996,17 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 - esquery@1.6.0: + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -2125,14 +2024,6 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} @@ -2141,18 +2032,14 @@ snapshots: fastest-levenshtein@1.0.16: {} - fastq@1.19.1: - dependencies: - reusify: 1.1.0 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -2165,23 +2052,19 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.2 keyv: 4.5.4 flat@5.0.2: {} - flatted@3.3.3: {} + flatted@3.4.2: {} function-bind@1.1.2: {} - get-tsconfig@4.13.0: + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -2190,35 +2073,25 @@ snapshots: globals@14.0.0: {} - globals@16.5.0: {} - - globby@13.2.2: - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 4.0.0 + globals@17.5.0: {} graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - has-flag@4.0.0: {} - hasown@2.0.2: + hasown@2.0.3: dependencies: function-bind: 1.1.2 - icss-utils@5.1.0(postcss@8.5.6): + icss-utils@5.1.0(postcss@8.5.12): dependencies: - postcss: 8.5.6 + postcss: 8.5.12 ignore@5.3.2: {} ignore@7.0.5: {} - immutable@5.1.4: {} + immutable@5.1.5: {} import-fresh@3.3.1: dependencies: @@ -2236,7 +2109,7 @@ snapshots: is-core-module@2.16.1: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 is-extglob@2.1.1: {} @@ -2244,8 +2117,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-number@7.0.0: {} - is-plain-object@2.0.4: dependencies: isobject: 3.0.1 @@ -2256,7 +2127,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 25.2.1 + '@types/node': 25.6.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -2266,8 +2137,6 @@ snapshots: json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -2282,14 +2151,12 @@ snapshots: kind-of@6.0.3: {} - klona@2.0.6: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - loader-runner@4.3.1: {} + loader-runner@4.3.2: {} loader-utils@2.0.4: dependencies: @@ -2305,35 +2172,23 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.merge@4.6.2: {} - merge-stream@2.0.0: {} - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 + mime-db@1.54.0: {} - mini-css-extract-plugin@2.3.0(webpack@5.104.1): + mini-css-extract-plugin@2.10.2(webpack@5.106.2): dependencies: - schema-utils: 3.3.0 - webpack: 5.104.1(webpack-cli@5.1.4) + schema-utils: 4.3.3 + tapable: 2.3.3 + webpack: 5.106.2(webpack-cli@7.0.2) - minimatch@3.1.2: + minimatch@10.2.5: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 5.0.5 - minimatch@9.0.5: + minimatch@3.1.5: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 1.1.14 ms@2.1.3: {} @@ -2346,7 +2201,7 @@ snapshots: node-addon-api@7.1.1: optional: true - node-releases@2.0.27: {} + node-releases@2.0.38: {} normalize-path@3.0.0: {} @@ -2387,36 +2242,34 @@ snapshots: path-parse@1.0.7: {} - path-type@4.0.0: {} - picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@4.0.4: {} pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + postcss-modules-extract-imports@3.1.0(postcss@8.5.12): dependencies: - postcss: 8.5.6 + postcss: 8.5.12 - postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + postcss-modules-local-by-default@4.2.0(postcss@8.5.12): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.5.12) + postcss: 8.5.12 postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.6): + postcss-modules-scope@3.2.1(postcss@8.5.12): dependencies: - postcss: 8.5.6 + postcss: 8.5.12 postcss-selector-parser: 7.1.1 - postcss-modules-values@4.0.0(postcss@8.5.6): + postcss-modules-values@4.0.0(postcss@8.5.12): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.5.12) + postcss: 8.5.12 postcss-selector-parser@7.1.1: dependencies: @@ -2425,7 +2278,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.6: + postcss@8.5.12: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -2435,17 +2288,11 @@ snapshots: punycode@2.3.1: {} - queue-microtask@1.2.3: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - readdirp@4.1.2: {} rechoir@0.8.0: dependencies: - resolve: 1.22.11 + resolve: 1.22.12 require-from-string@2.0.2: {} @@ -2459,54 +2306,38 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.11: + resolve@1.22.12: dependencies: + es-errors: 1.3.0 is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.1.0: {} - - run-parallel@1.2.0: + sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2): dependencies: - queue-microtask: 1.2.3 - - safe-buffer@5.2.1: {} - - sass-loader@12.6.0(sass@1.94.2)(webpack@5.104.1): - dependencies: - klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: - sass: 1.94.2 + sass: 1.99.0 + webpack: 5.106.2(webpack-cli@7.0.2) - sass@1.94.2: + sass@1.99.0: dependencies: chokidar: 4.0.3 - immutable: 5.1.4 + immutable: 5.1.5 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.1 - - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) + '@parcel/watcher': 2.5.6 schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + ajv-keywords: 5.1.0(ajv@8.20.0) - semver@7.7.3: {} + semver@7.7.4: {} - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 + serialize-javascript@7.0.5: {} shallow-clone@3.0.1: dependencies: @@ -2518,11 +2349,11 @@ snapshots: shebang-regex@3.0.0: {} - siyuan@1.2.0: {} - - slash@4.0.0: {} - - source-list-map@2.0.1: {} + siyuan@1.2.2-alpha.0: + dependencies: + '@dop251/types-goja_nodejs-buffer': 0.0.0-20260212111938-1f56ff5bcf14 + '@dop251/types-goja_nodejs-global': 0.0.0-20260212111938-1f56ff5bcf14 + '@dop251/types-goja_nodejs-url': 0.0.0-20260212111938-1f56ff5bcf14 source-map-js@1.2.1: {} @@ -2535,55 +2366,51 @@ snapshots: strip-json-comments@3.1.1: {} - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - supports-color@8.1.1: dependencies: has-flag: 4.0.0 supports-preserve-symlinks-flag@1.0.0: {} - tapable@2.3.0: {} + tapable@2.3.3: {} - terser-webpack-plugin@5.3.16(webpack@5.104.1): + terser-webpack-plugin@5.5.0(webpack@5.106.2): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - terser: 5.46.0 - webpack: 5.104.1(webpack-cli@5.1.4) + terser: 5.46.2 + webpack: 5.106.2(webpack-cli@7.0.2) - terser@5.46.0: + terser@5.46.2: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 + acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 - to-regex-range@5.0.1: + tinyglobby@0.2.16: dependencies: - is-number: 7.0.0 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 - ts-api-utils@2.1.0(typescript@4.8.4): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - typescript: 4.8.4 + typescript: 6.0.3 - tslib@2.4.0: {} + tslib@2.8.1: {} type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - typescript@4.8.4: {} + typescript@6.0.3: {} - undici-types@7.16.0: {} + undici-types@7.19.2: {} - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -2598,37 +2425,28 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - webpack-cli@5.1.4(webpack@5.104.1): + webpack-cli@7.0.2(webpack@5.106.2): dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.104.1) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.104.1) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.104.1) - colorette: 2.0.20 - commander: 10.0.1 + '@discoveryjs/json-ext': 1.0.0 + commander: 14.0.3 cross-spawn: 7.0.6 envinfo: 7.21.0 fastest-levenshtein: 1.0.16 import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-merge: 5.10.0 + webpack: 5.106.2(webpack-cli@7.0.2) + webpack-merge: 6.0.1 - webpack-merge@5.10.0: + webpack-merge@6.0.1: dependencies: clone-deep: 4.0.1 flat: 5.0.2 wildcard: 2.0.1 - webpack-sources@1.4.3: - dependencies: - source-list-map: 2.0.1 - source-map: 0.6.1 - - webpack-sources@3.3.3: {} + webpack-sources@3.4.1: {} - webpack@5.104.1(webpack-cli@5.1.4): + webpack@5.106.2(webpack-cli@7.0.2): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -2636,27 +2454,26 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.28.1 + acorn: 8.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) + browserslist: 4.28.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.19.0 - es-module-lexer: 2.0.0 + enhanced-resolve: 5.21.0 + es-module-lexer: 2.1.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.1 - mime-types: 2.1.35 + loader-runner: 4.3.2 + mime-db: 1.54.0 neo-async: 2.6.2 schema-utils: 4.3.3 - tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(webpack@5.104.1) + tapable: 2.3.3 + terser-webpack-plugin: 5.5.0(webpack@5.106.2) watchpack: 2.5.1 - webpack-sources: 3.3.3 + webpack-sources: 3.4.1 optionalDependencies: - webpack-cli: 5.1.4(webpack@5.104.1) + webpack-cli: 7.0.2(webpack@5.106.2) transitivePeerDependencies: - '@swc/core' - esbuild @@ -2676,8 +2493,8 @@ snapshots: yocto-queue@0.1.0: {} - zip-webpack-plugin@4.0.3(webpack-sources@3.3.3)(webpack@5.104.1): + zip-webpack-plugin@4.0.3(webpack-sources@3.4.1)(webpack@5.106.2): dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-sources: 3.3.3 + webpack: 5.106.2(webpack-cli@7.0.2) + webpack-sources: 3.4.1 yazl: 2.5.1 From 33174a36bc9380bf196d44466cecdffa8890c543 Mon Sep 17 00:00:00 2001 From: Zuoqiu Yingyi <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Sat, 9 May 2026 20:40:08 +0800 Subject: [PATCH 02/15] docs: add kernel plugin demo design spec Co-Authored-By: Claude Sonnet 4.6 (1M context) --- .../2026-05-09-kernel-plugin-demo-design.md | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md diff --git a/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md b/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md new file mode 100644 index 0000000..023ccea --- /dev/null +++ b/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md @@ -0,0 +1,146 @@ +# Kernel Plugin Demo — Design Spec + +**Date:** 2026-05-09 +**Status:** Approved +**Scope:** `plugin-sample/src/kernel.ts` + `petal/kernel.d.ts` + +--- + +## Goal + +Implement a TypeScript reference demo of the kernel plugin API in `src/kernel.ts`. This file is the living, authoritative example for community developers. It will be updated alongside `petal/kernel.d.ts` whenever new kernel APIs are added. + +--- + +## Architecture + +### `src/kernel.ts` + +Single file, single class `KernelPlugin`. Webpack compiles it to `kernel.js` (CommonJS2, executed inside the kernel's goja runtime). + +``` +/// + +class KernelPlugin { + private readonly siyuan: ISiyuan + private ws: IWebSocket | null + private es: IEventSource | null + + constructor() — wire lifecycle hooks + server/event handlers + onload() — siyuan.rpc.bind + siyuan.storage CRUD + onloaded() — siyuan.client.fetch (kernel REST API) + onrunning() — HTTP RPC loopback + WebSocket client + SSE client + onunload() — rpc.broadcast + ws/es cleanup + eventHandler() — siyuan.event.handler + siyuan.event.emit + httpHandler() — siyuan.server.private.http.handler → IHttpResponse + wsHandler() — siyuan.server.private.ws.handler (IServerWsRequest) + esHandler() — siyuan.server.private.es.handler (IServerEsRequest) +} + +new KernelPlugin(); +``` + +### `petal/kernel.d.ts` additions + +The current `IServerRequestHandler` hard-codes `IServerRequest` as the handler argument. WS and SSE server handlers receive an augmented request that also carries a `port` back-channel to the connected client. The following additions are required (all backward-compatible): + +| Addition | Purpose | +|---|---| +| `IEsServerPort` | Server-side SSE port: `onopen`, `onclose`, `send(eventType, data)`, `close()` | +| `IServerWsRequest extends IServerRequest` | Adds `port: IWebSocket` for WS server handlers | +| `IServerEsRequest extends IServerRequest` | Adds `port: IEsServerPort` for SSE server handlers | +| `IServerRequestHandler` | Second type param (default = `IServerRequest`) for request type — backward-compatible | +| `IServerScope.ws` / `.es` updated | Use `IServerWsRequest` / `IServerEsRequest` as handler argument | + +--- + +## API Coverage + +Every public API on `globalThis.siyuan` is exercised: + +| Namespace | Demonstrated | +|---|---| +| `siyuan.plugin` | `name`, `version`, `platform`, `i18n`; all four lifecycle hooks | +| `siyuan.logger` | All five levels: `trace`, `debug`, `info`, `warn`, `error` | +| `console` | Sync logging; note difference vs `siyuan.logger` (sync, 3 levels, `util.format`) | +| `siyuan.storage` | `put`, `get` → `.text()` / `.json()` / `.arrayBuffer()`, `list`, `remove` | +| `siyuan.rpc` | `bind` (with description), `unbind`, `broadcast` | +| `siyuan.client` | `fetch` (HTTP RPC loopback), `socket` (WS client), `event` (SSE client) | +| `siyuan.event` | `handler` (receive), `emit` (publish) | +| `siyuan.server` | `private.http.handler`, `private.ws.handler`, `private.es.handler` | + +--- + +## Comment Strategy (TSDoc) + +### Method-level TSDoc blocks + +Every method gets a TSDoc block with: +- Summary line describing which API/feature it demonstrates +- `@remarks` for behavioral constraints (e.g. lifecycle state semantics, when RPC calls are accepted) +- `@example` snippet for non-obvious usage patterns (e.g. `ws.open()` must be called explicitly) + +Example: + +```typescript +/** + * Demonstrates {@link IRpc}: registering, calling, and broadcasting RPC methods. + * + * @remarks + * `siyuan.rpc.bind` should be called in `onload` so methods are ready when the + * plugin reaches the `running` state. RPC calls are rejected with `-32002` if + * the plugin has not yet reached `running`. + */ +private async onload(): Promise { ... } +``` + +### Inline comments + +Key constraints or non-obvious behavior are annotated at the call site: + +```typescript +// Assign all callbacks before calling open() — onopen fires only after +// the TCP/WebSocket handshake completes. +await this.ws.open(); +``` + +### Class-level TSDoc + +`KernelPlugin` gets a full class-level doc block explaining: +- purpose (living reference for the kernel plugin API) +- lifecycle state diagram reference +- how to update the file when new APIs are added + +--- + +## Type Usage + +| Location | Type | +|---|---| +| `this.siyuan` field | `ISiyuan` | +| `this.ws` field | `IWebSocket \| null` | +| `this.es` field | `IEventSource \| null` | +| `onload` / `onloaded` / `onrunning` / `onunload` | `() => Promise` | +| `eventHandler` param | `IEventMessage` | +| `httpHandler` param | `IServerRequest` | +| `httpHandler` return | `IHttpResponse` | +| `wsHandler` param | `IServerWsRequest` | +| `esHandler` param | `IServerEsRequest` | +| `any` | Only where the underlying API type is already `any` (e.g. `IEventMessage.detail`, `IRpc.bind` fn args) | + +--- + +## Files Changed + +| File | Change | +|---|---| +| `plugin-sample/src/kernel.ts` | Full implementation (was a one-line stub) | +| `petal/kernel.d.ts` | Add `IEsServerPort`, `IServerWsRequest`, `IServerEsRequest`; extend `IServerRequestHandler` generic; update `IServerScope` | + +--- + +## Out of Scope + +- No changes to `src/index.ts`, `plugin.json`, `webpack.config.js`, or any other file +- No new dependencies +- No unit tests (kernel plugin runs inside goja; tested by loading in a live SiYuan instance) From 1600518500e0bf518c9025fed79d7d380003176d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yingyi=20/=20=E9=A2=96=E9=80=B8?= <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Sat, 9 May 2026 20:58:12 +0800 Subject: [PATCH 03/15] docs: add kernel plugin demo implementation plan Co-Authored-By: Claude Sonnet 4.6 (1M context) --- .../plans/2026-05-09-kernel-plugin-demo.md | 708 ++++++++++++++++++ 1 file changed, 708 insertions(+) create mode 100644 docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md diff --git a/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md b/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md new file mode 100644 index 0000000..a067677 --- /dev/null +++ b/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md @@ -0,0 +1,708 @@ +# Kernel Plugin Demo Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Implement the TypeScript kernel plugin demo in `plugin-sample/src/kernel.ts` and extend `petal/kernel.d.ts` with the server-side port types needed to fully type WS and SSE server handlers. + +**Architecture:** Single `KernelPlugin` class covering all 8 API namespaces (`siyuan.plugin`, `siyuan.logger`, `console`, `siyuan.storage`, `siyuan.rpc`, `siyuan.client`, `siyuan.event`, `siyuan.server`). Type additions to `petal/kernel.d.ts` are additive and backward-compatible. The installed `siyuan` npm package in `plugin-sample/node_modules` is kept in sync manually until the package is republished. + +**Tech Stack:** TypeScript 6, goja JS runtime (kernel-side), webpack (esbuild-loader), TSDoc. + +**Spec:** `plugin-sample/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md` + +--- + +## File Map + +| File | Action | Responsibility | +|---|---|---| +| `petal/kernel.d.ts` | Modify lines 880–927 | Add `IEsServerPort`, `IServerWsRequest`, `IServerEsRequest`; extend `IServerRequestHandler` generic; update `IServerScope.ws`/`.es` | +| `plugin-sample/node_modules/.pnpm/siyuan@1.2.2-alpha.0/node_modules/siyuan/kernel.d.ts` | Overwrite | Keep installed package in sync with `petal/kernel.d.ts` so TypeScript picks up new types locally | +| `plugin-sample/src/kernel.ts` | Rewrite | Full `KernelPlugin` class with TSDoc | + +--- + +## Task 1: Extend `petal/kernel.d.ts` with server-side port types + +**Files:** +- Modify: `petal/kernel.d.ts:880–927` + +### Background + +`IServerRequestHandler` currently hard-codes `IServerRequest` as the handler argument. WS and SSE server handlers receive an augmented request with a `port` property — so we need: + +- `IEsServerPort` — SSE server-side port (onopen/onclose/send/close) +- `IServerWsRequest extends IServerRequest` — adds `port: IWebSocket` +- `IServerEsRequest extends IServerRequest` — adds `port: IEsServerPort` +- `IServerRequestHandler` — second generic (default preserves backward compat); `handler` field uses `TReq` +- `IServerScope.ws` → `IServerRequestHandler`, `.es` → `IServerRequestHandler` + +- [ ] **Step 1: Insert new interfaces before `IServerRequestHandler`** + + Open `petal/kernel.d.ts`. Find the comment `// ── Server handler interfaces ─────────────────────────────────────────────────` (line ~879). Insert the following block immediately before the `IServerRequestHandler` interface (i.e. before line 882): + + ```typescript + // ── Server-side connection ports ────────────────────────────────────────────── + + /** + * Server-side SSE (Server-Sent Events) port provided to + * {@link IServerEsRequest.port}. + * + * @remarks + * The kernel opens the SSE response stream before invoking the handler. + * After the handler returns, the kernel fires {@link IEsServerPort.onopen} + * to signal that the stream is ready. Call {@link IEsServerPort.send} to + * push SSE events to the client and {@link IEsServerPort.close} to + * terminate the stream. The connection stays open until `close()` is called + * or the client disconnects. + */ + export interface IEsServerPort { + /** Called once when the SSE stream is ready to accept events. */ + onopen: ((event: IEventSourceOpenEvent) => void | Promise) | null; + /** Called when the client disconnects or after {@link IEsServerPort.close}. */ + onclose: ((event: IEventSourceCloseEvent) => void | Promise) | null; + /** + * Pushes one SSE event to the connected client. + * + * @remarks + * `send` is synchronous — no `await` required. It enqueues the event in + * the kernel's SSE write buffer; the actual flush is asynchronous. + * + * @param eventType - Value for the SSE `event:` field (e.g. `"message"`, `"update"`). + * @param data - Value for the SSE `data:` field (UTF-8 string). + */ + send(eventType: string, data: string): void; + /** Terminates the SSE stream and closes the response. */ + close(): void; + } + + /** + * The request object received by {@link IServerScope.ws | WebSocket server handlers}. + * + * @remarks + * Extends {@link IServerRequest} with a `port` property that mirrors the + * {@link IWebSocket} client interface. The kernel upgrades the HTTP connection + * to WebSocket before invoking the handler. After the handler returns, the + * kernel auto-opens the port's read loop if `port.open()` was not called + * explicitly. + */ + export interface IServerWsRequest extends IServerRequest { + /** + * Bidirectional WebSocket port connected to the client. + * + * @remarks + * Assign event callbacks (`onopen`, `onmessage`, `onping`, `onpong`, + * `onclose`, `onerror`) before the handler returns. Calling `port.open()` + * is optional — the kernel opens the read loop automatically. + */ + readonly port: IWebSocket; + } + + /** + * The request object received by {@link IServerScope.es | SSE server handlers}. + * + * @remarks + * Extends {@link IServerRequest} with a `port` property for pushing + * Server-Sent Events to the client. The kernel opens the SSE response before + * the handler is invoked; {@link IEsServerPort.onopen} fires once streaming + * begins. + */ + export interface IServerEsRequest extends IServerRequest { + /** + * Server-side SSE port for pushing events to the connected client. + * + * @remarks + * Assign `onopen` and `onclose` callbacks in the handler body. Call + * `port.send(eventType, data)` inside `onopen` to emit SSE events. + */ + readonly port: IEsServerPort; + } + + ``` + +- [ ] **Step 2: Replace `IServerRequestHandler` with the generic version** + + Replace the existing `IServerRequestHandler` interface (lines 882–899 approx): + + ```typescript + // BEFORE: + export interface IServerRequestHandler { + /** + * The function invoked for each incoming request of this type. + * + * @remarks The kernel passes the parsed {@link IServerRequest} as the + * sole argument and awaits any returned `Promise` before writing the + * response. + */ + handler: ((request: IServerRequest) => TRes | Promise) | null; + } + ``` + + With: + + ```typescript + // AFTER: + /** + * Handler slot for one request type within a server scope. + * + * @remarks + * The object is sealed by the kernel; only the `handler` property may be + * reassigned. Set `handler` to `null` to leave the slot empty — the kernel + * will return `500 Internal Server Error` for any unhandled request. + * + * @typeParam TRes - Expected return type of the handler function. + * @typeParam TReq - Request object type passed to the handler. Defaults to + * {@link IServerRequest} for the HTTP slot; specialised to + * {@link IServerWsRequest} and {@link IServerEsRequest} for the WS and SSE + * slots respectively. + */ + export interface IServerRequestHandler { + /** + * The function invoked for each incoming request of this type. + * + * @remarks + * The kernel passes the parsed request as the sole argument and awaits + * any returned `Promise` before writing the response. + */ + handler: ((request: TReq) => TRes | Promise) | null; + } + ``` + +- [ ] **Step 3: Update `IServerScope.ws` and `.es`** + + Replace the `IServerScope` interface body (the `ws` and `es` readonly properties and their doc blocks). The `http` property is unchanged. + + ```typescript + // BEFORE (ws block): + /** + * WebSocket upgrade handler. + * + * @remarks Reserved — not yet implemented by the kernel. + */ + readonly ws: IServerRequestHandler; + /** + * Server-Sent Events handler. + * + * @remarks Reserved — not yet implemented by the kernel. + */ + readonly es: IServerRequestHandler; + ``` + + ```typescript + // AFTER (ws + es blocks): + /** + * WebSocket upgrade handler. + * + * @remarks + * The handler receives an {@link IServerWsRequest} that includes + * `request.port`, a bidirectional {@link IWebSocket} connected to the + * client. Assign event callbacks before the handler returns; the kernel + * auto-opens the port's read loop afterwards. + */ + readonly ws: IServerRequestHandler; + /** + * Server-Sent Events handler. + * + * @remarks + * The handler receives an {@link IServerEsRequest} that includes + * `request.port`, an {@link IEsServerPort} for pushing SSE events. + * Assign `onopen` / `onclose` callbacks and call `port.send` inside + * `onopen`. + */ + readonly es: IServerRequestHandler; + ``` + +- [ ] **Step 4: Sync installed package** + + Copy the updated file so TypeScript in `plugin-sample` picks up the changes. + Run from the `plugin-sample` root (both repos are siblings): + + ```bash + cp ../petal/kernel.d.ts \ + node_modules/.pnpm/siyuan@1.2.2-alpha.0/node_modules/siyuan/kernel.d.ts + ``` + +- [ ] **Step 5: Commit `petal/kernel.d.ts`** + + ```bash + cd ../petal + git add kernel.d.ts + git commit -m "feat(kernel): add IEsServerPort, IServerWsRequest, IServerEsRequest; extend IServerRequestHandler generic" + ``` + +--- + +## Task 2: Implement `plugin-sample/src/kernel.ts` + +**Files:** +- Modify: `plugin-sample/src/kernel.ts` (currently a one-line stub) + +The full file content is specified below. Each method covers one or more API namespaces as documented in the spec. All type annotations reference interfaces from `petal/kernel.d.ts` via `/// `. + +- [ ] **Step 1: Write the full file** + + Replace the entire contents of `plugin-sample/src/kernel.ts` with: + + ```typescript + /// + + /** + * Reference implementation of the kernel plugin API for SiYuan. + * + * @remarks + * This class exercises every public surface on `globalThis.siyuan`. It is the + * living reference for community developers and is updated in lock-step with + * `petal/kernel.d.ts` whenever new kernel APIs are added. + * + * ## Lifecycle state machine + * + * ``` + * ready → loading → loaded → running → stopping → stopped + * ↓onload ↓onloaded ↓onrunning ↓onunload + * ``` + * + * Each hook is `async`-safe: the kernel awaits the returned `Promise` before + * advancing to the next state, so slow hooks stall the plugin's own startup. + * Keep hooks non-blocking; defer long-running work to fire-and-forget tasks. + * + * ## Adding a new API + * + * 1. Add the type declaration to `petal/kernel.d.ts`. + * 2. Add a demonstration call in the appropriate lifecycle method below. + * 3. Add a TSDoc block linking to the new interface and explaining any + * non-obvious constraints. + */ + class KernelPlugin { + private readonly siyuan: ISiyuan = globalThis.siyuan; + + /** Client-side WebSocket connection to the plugin's own RPC endpoint. */ + private ws: IWebSocket | null = null; + + /** Client-side SSE connection to the kernel broadcast endpoint. */ + private es: IEventSource | null = null; + + constructor() { + // Wire lifecycle hooks + this.siyuan.plugin.lifecycle.onload = this.onload.bind(this); + this.siyuan.plugin.lifecycle.onloaded = this.onloaded.bind(this); + this.siyuan.plugin.lifecycle.onrunning = this.onrunning.bind(this); + this.siyuan.plugin.lifecycle.onunload = this.onunload.bind(this); + + // Wire the inbound kernel event handler + this.siyuan.event.handler = this.eventHandler.bind(this); + + // Wire server-side request handlers (private scope: /plugin/private//*) + this.siyuan.server.private.http.handler = this.httpHandler.bind(this); + this.siyuan.server.private.ws.handler = this.wsHandler.bind(this); + this.siyuan.server.private.es.handler = this.esHandler.bind(this); + } + + // ── Lifecycle ───────────────────────────────────────────────────────────── + + /** + * Demonstrates {@link IRpc} and {@link IStorage}. + * + * @remarks + * Called when the plugin script is first evaluated. Register RPC methods + * here so they are ready once the plugin reaches the `running` state. + * RPC calls are rejected with `-32002` before `running` is reached. + * + * `siyuan.storage` paths are relative to + * `data/storage/petal//`. Path traversal is blocked by the + * kernel. + * + * @example + * ```ts + * await siyuan.rpc.bind("echo", async (...args) => args, "description"); + * ``` + */ + private async onload(): Promise { + const { rpc, storage, logger, plugin } = this.siyuan; + + // ── siyuan.logger (all five levels) ─────────────────────────────────── + // Unlike console.*, each call returns a Promise and serialises args as JSON. + await logger.trace("onload: plugin name =", plugin.name); + await logger.debug("onload: version =", plugin.version); + await logger.info( "onload: platform =", plugin.platform); + await logger.warn( "onload: i18n keys =", Object.keys(plugin.i18n)); + await logger.error("onload: (error-level demo — not a real error)"); + + // ── console.* (synchronous, Node.js util.format, 3 levels) ──────────── + // Routed to the kernel log at INFO/WARN/ERROR. No await needed. + console.log( "onload: console.log (sync, util.format)"); + console.warn( "onload: console.warn"); + console.error("onload: console.error"); + + // ── siyuan.rpc ──────────────────────────────────────────────────────── + // bind(name, fn, ...descriptions): registers a JSON-RPC method. + // The third argument and beyond are optional human-readable descriptions. + await rpc.bind( + "echo", + async (...args: any[]) => { + await logger.debug("echo called with:", args); + return args; + }, + "Returns all received arguments unchanged.", + ); + + // ── siyuan.storage ──────────────────────────────────────────────────── + // put: write a UTF-8 string to a path relative to the plugin data dir + await storage.put("demo.txt", new Date().toISOString()); + + // get: returns IDataObject — a lazy accessor; call each decoder at most once + const obj = await storage.get("demo.txt"); + await logger.debug("storage.get → text():", await obj.text()); + + const obj2 = await storage.get("demo.txt"); + await logger.debug("storage.get → json():", await obj2.json()); + + const obj3 = await storage.get("demo.txt"); + await logger.debug("storage.get → arrayBuffer():", await obj3.arrayBuffer()); + + // list: returns IStorageEntry[] for the given relative directory + const entries = await storage.list("."); + await logger.debug("storage.list:", entries); + + // remove: deletes a file or directory tree + await storage.remove("demo.txt"); + } + + /** + * Demonstrates {@link IClient.fetch} against the kernel's own REST API. + * + * @remarks + * Called after all plugins have completed `onload`. At this point every + * enabled kernel plugin is visible in the plugin registry. + * + * `siyuan.client.fetch` tunnels the request through the kernel and injects + * the plugin's JWT token automatically — no manual auth header needed. + * + * @example + * ```ts + * const resp = await siyuan.client.fetch("/api/system/version", { method: "POST", body: "{}" }); + * const data = await resp.json(); + * ``` + */ + private async onloaded(): Promise { + const { client, logger } = this.siyuan; + + // List all loaded plugins via the kernel REST API. + // fetch() returns IFetchResponse; the body is a lazy IDataObject. + const resp = await client.fetch("/api/plugin/listLoadedPlugins", { + method: "POST", + // body must be a string or ArrayBuffer + body: "{}", + }); + + await logger.debug("onloaded: resp.ok =", resp.ok); + await logger.debug("onloaded: resp.status =", resp.status); + await logger.debug("onloaded: resp.statusText =", resp.statusText); + await logger.debug("onloaded: resp.headers =", resp.headers); + await logger.debug("onloaded: listLoadedPlugins =", await resp.json()); + } + + /** + * Demonstrates {@link IClient.socket} (WebSocket client) and + * {@link IClient.event} (SSE client), plus an HTTP JSON-RPC loopback call. + * + * @remarks + * Called after `onloaded` resolves. The kernel is fully running and all + * RPC methods registered in `onload` are now reachable. + * + * ### WebSocket client + * `siyuan.client.socket` returns a sealed {@link IWebSocket} in + * `CONNECTING` state immediately. **`ws.open()` must be called explicitly** + * to initiate the TCP/WebSocket handshake; `onopen` fires only after + * `open()` resolves. Assign all callbacks before calling `open()`. + * + * ### SSE client + * `siyuan.client.event` returns immediately; the kernel starts the SSE + * subscription in the background and fires `onopen` once connected. + * + * @example + * ```ts + * // Assign all callbacks BEFORE calling open(). + * const ws = await siyuan.client.socket("/ws/plugin/rpc/my-plugin"); + * ws.onopen = async () => { await ws.send("hello"); }; + * await ws.open(); + * ``` + */ + private async onrunning(): Promise { + const { client, logger, plugin } = this.siyuan; + + // ── HTTP RPC loopback (JS → HTTP → Go → JS → Go → HTTP → JS) ────────── + const echoResp = await client.fetch( + `/api/plugin/rpc/${plugin.name}`, + { + method: "POST", + // body must be a string — stringify the JSON-RPC payload + body: JSON.stringify({ + jsonrpc: "2.0", + method: "echo", + params: ["hello from onrunning", 42, { key: true }], + id: 1, + }), + }, + ); + await logger.debug("onrunning: HTTP RPC echo =", await echoResp.json()); + + // ── WebSocket client ────────────────────────────────────────────────── + this.ws = await client.socket(`/ws/plugin/rpc/${plugin.name}`); + + // Assign all callbacks before calling open() — onopen fires only after + // the TCP/WebSocket handshake completes. + this.ws.onopen = async (event) => { + await logger.debug("ws client: open", event); + // Send a JSON-RPC request over the WebSocket connection + await this.ws!.send(JSON.stringify({ + jsonrpc: "2.0", + method: "echo", + params: { message: "hello via WebSocket", ts: Date.now() }, + id: 2, + })); + // Demonstrate ping/pong control frames + await this.ws!.ping("ping from plugin"); + }; + this.ws.onmessage = async (event) => { await logger.debug("ws client: message", event); }; + this.ws.onping = async (event) => { await logger.debug("ws client: ping", event); }; + this.ws.onpong = async (event) => { await logger.debug("ws client: pong", event); }; + this.ws.onerror = async (event) => { await logger.debug("ws client: error", event); }; + this.ws.onclose = async (event) => { await logger.debug("ws client: close", event); }; + + // Initiate the connection after wiring all callbacks + await this.ws.open(); + + // ── SSE / EventSource client ────────────────────────────────────────── + this.es = await client.event("/es/broadcast/subscribe"); + this.es.onopen = async (e) => { await logger.debug("es client: open", e); }; + this.es.onmessage = async (e) => { await logger.debug("es client: message", e); }; + this.es.onclose = async (e) => { await logger.debug("es client: close", e); }; + this.es.onerror = async (e) => { await logger.debug("es client: error", e); }; + } + + /** + * Demonstrates {@link IRpc.broadcast} and connection cleanup. + * + * @remarks + * Called when the plugin is stopping. `rpc.broadcast` pushes a JSON-RPC + * 2.0 notification (no `id`) to all connected RPC WebSocket clients. It + * is a no-op if the plugin is not in the `running` state, so it is safe + * to call here even during a fast shutdown. + * + * After broadcasting, close any open client-side connections to avoid + * resource leaks in the kernel process. + */ + private async onunload(): Promise { + const { rpc, logger } = this.siyuan; + + // Unbind the RPC method registered in onload + await rpc.unbind("echo"); + + // Push a notification to all connected RPC WebSocket clients + await rpc.broadcast("unload", ["Plugin is unloading"]); + + // Close client-side connections — optional chaining guards against the + // case where onrunning was never reached (e.g. error during startup) + this.ws?.close(); + this.es?.close(); + + await logger.debug("onunload: cleanup complete"); + } + + // ── Event bridge ────────────────────────────────────────────────────────── + + /** + * Demonstrates {@link IEvent.handler} (receive) and {@link IEvent.emit} (publish). + * + * @remarks + * `siyuan.event.handler` receives every kernel broadcast event. + * `event` has shape `{ id: UUID, type: string, detail: any }`. + * + * `siyuan.event.emit` publishes an event to the in-process bus. + * The first argument is the topic string used for routing; + * the second is the payload. + * + * @param event - The incoming kernel event message. + */ + private async eventHandler(event: IEventMessage): Promise { + const { event: eventApi, logger } = this.siyuan; + + await logger.debug("event received:", event); + + // Re-publish the event under the "plugin" topic + await eventApi.emit("plugin", { + id: event.id, + type: "echo", + detail: event, + }); + } + + // ── Server-side handlers ────────────────────────────────────────────────── + + /** + * Demonstrates the HTTP server handler at + * `ANY /plugin/private//*path`. + * + * @remarks + * Must return an {@link IHttpResponse}. The `body` field supports: + * `data` (JSON / XML / YAML / …), `file` (local filesystem path), + * `string` (Go `fmt.Sprintf`), `raw` (bytes + Content-Type), `redirect`. + * Set exactly one; the kernel uses the first non-null value. + * + * The route requires kernel authentication and admin role — unauthenticated + * requests are rejected before reaching the handler. + * + * @param request - Parsed URL, headers, body, and Gin routing context. + * @returns An {@link IHttpResponse} that the kernel writes to the client. + */ + private async httpHandler(request: IServerRequest): Promise { + await this.siyuan.logger.debug("http handler: path =", request.url.path); + + return { + statusCode: 200, + headers: { + // Multi-value headers are arrays of strings + "X-Plugin": [this.siyuan.plugin.name], + }, + body: { + // type: "JSON" delegates to c.JSON in Gin + data: { + type: "JSON", + data: { + path: request.url.path, + method: request.request.method, + contentType: request.request.contentType, + query: request.url.query, + params: request.context.params, + }, + }, + }, + }; + } + + /** + * Demonstrates the WebSocket server handler at + * `GET /plugin/private//*path` (WebSocket upgrade). + * + * @remarks + * `request.port` mirrors the {@link IWebSocket} interface — same event + * callbacks, same `send` / `ping` / `pong` / `close` methods. + * + * Assign all callbacks in this handler body. The kernel auto-opens the + * port's read loop after the handler returns; calling `port.open()` + * explicitly is optional. + * + * `onmessage` events carry + * `{ type: "text" | "binary", data: string | ArrayBuffer }`. + * + * @param request - Server request augmented with `port` (a bidirectional + * WebSocket back-channel to the connected client). + */ + private async wsHandler(request: IServerWsRequest): Promise { + const { logger } = this.siyuan; + + request.port.onopen = async (event) => { + await logger.debug("ws server: port open", event); + // Greet the client on connection + await request.port.send("Hello from plugin WebSocket server!"); + }; + request.port.onmessage = async (event) => { + await logger.debug("ws server: message", event); + // Echo the message back to the client + await request.port.send(event.data as string); + }; + request.port.onping = async (event) => { + await logger.debug("ws server: ping", event); + // Reply with a pong carrying the same application data + await request.port.pong(event.data); + }; + request.port.onpong = async (event) => { await logger.debug("ws server: pong", event); }; + request.port.onclose = async (event) => { await logger.debug("ws server: close", event); }; + request.port.onerror = async (event) => { await logger.debug("ws server: error", event); }; + // port.open() is optional — the kernel auto-opens after this handler returns. + } + + /** + * Demonstrates the SSE server handler at + * `GET /plugin/private//*path` (Server-Sent Events). + * + * @remarks + * `request.port.onopen` fires once the SSE stream is ready. Call + * `port.send(eventType, data)` inside `onopen` or later to push events. + * `eventType` maps to the SSE `event:` field; `data` maps to `data:`. + * `send` is **synchronous** — no `await` needed. + * + * The connection stays open until `port.close()` is called or the + * client disconnects, which fires `onclose`. + * + * @param request - Server request augmented with `port` (an SSE + * back-channel to the connected client). + */ + private async esHandler(request: IServerEsRequest): Promise { + const { logger } = this.siyuan; + + request.port.onopen = async (event) => { + await logger.debug("sse server: port open", event); + // send is synchronous; eventType becomes the SSE `event:` field + request.port.send("message", "Connected to plugin SSE!"); + request.port.send("update", JSON.stringify({ ts: Date.now() })); + }; + request.port.onclose = async (event) => { + await logger.debug("sse server: port close", event); + }; + } + } + + new KernelPlugin(); + ``` + +- [ ] **Step 2: Verify TypeScript types** + + The project uses `esbuild-loader` which strips types without checking them — `npm run build` will succeed even if types are wrong. Use `tsc --noEmit` to actually type-check. + Run from the `plugin-sample` root: + + ```bash + npx tsc --noEmit 2>&1 + ``` + + Expected: no output (zero errors). Fix any reported errors before proceeding. + +- [ ] **Step 3: Build the production bundle** + + ```bash + npm run build 2>&1 | tail -20 + ``` + + Expected: webpack exits with code 0. The build produces `dist/kernel.js`. + +- [ ] **Step 4: Commit `plugin-sample/src/kernel.ts`** + + ```bash + git add src/kernel.ts + git commit -m "feat: implement kernel plugin demo with full API coverage and TSDoc" + ``` + +--- + +## Task 3: Verify the built output is valid for the goja runtime + +The webpack build outputs `kernel.js` in CommonJS2 format. The goja runtime in the kernel loads it as a CommonJS module. + +- [ ] **Step 1: Confirm `siyuan` is the only external `require` call** + + `webpack.config.js` declares `siyuan` as an external, so `require("siyuan")` will appear in the bundle — that is expected and intentional. Any other `require("")` would indicate an accidental import of a module the goja runtime cannot resolve. + Run from the `plugin-sample` root: + + ```bash + grep -o 'require("[^"]*")' dist/kernel.js | sort -u + ``` + + Expected output: exactly `require("siyuan")` (the external stub). Any additional package name is a bug — investigate and remove the offending import. + +- [ ] **Step 2: Confirm file size is reasonable** + + ```bash + wc -c dist/kernel.js + ``` + + Expected: a few kilobytes (minified). A multi-megabyte file would indicate an accidental bundling of large dependencies. From 24f24565aa1079e65d17c8c32e5ff61f045ad346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yingyi=20/=20=E9=A2=96=E9=80=B8?= <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Sat, 9 May 2026 21:16:59 +0800 Subject: [PATCH 04/15] feat: implement kernel plugin demo with full API coverage and TSDoc --- src/kernel.ts | 430 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 430 insertions(+) create mode 100644 src/kernel.ts diff --git a/src/kernel.ts b/src/kernel.ts new file mode 100644 index 0000000..4b4e553 --- /dev/null +++ b/src/kernel.ts @@ -0,0 +1,430 @@ +/// + +import type { + ISiyuan, + IWebSocket, + IEventSource, + IEventMessage, + IServerRequest, + IHttpResponse, + IServerWsRequest, + IServerEsRequest, +} from 'siyuan/kernel'; + +/** + * Reference implementation of the kernel plugin API for SiYuan. + * + * @remarks + * This class exercises every public surface on `globalThis.siyuan`. It is the + * living reference for community developers and is updated in lock-step with + * `petal/kernel.d.ts` whenever new kernel APIs are added. + * + * ## Lifecycle state machine + * + * ``` + * ready → loading → loaded → running → stopping → stopped + * ↓onload ↓onloaded ↓onrunning ↓onunload + * ``` + * + * Each hook is `async`-safe: the kernel awaits the returned `Promise` before + * advancing to the next state, so slow hooks stall the plugin's own startup. + * Keep hooks non-blocking; defer long-running work to fire-and-forget tasks. + * + * ## Adding a new API + * + * 1. Add the type declaration to `petal/kernel.d.ts`. + * 2. Add a demonstration call in the appropriate lifecycle method below. + * 3. Add a TSDoc block linking to the new interface and explaining any + * non-obvious constraints. + */ +class KernelPlugin { + private readonly siyuan: ISiyuan = siyuan; + + /** Client-side WebSocket connection to the plugin's own RPC endpoint. */ + private ws: IWebSocket | null = null; + + /** Client-side SSE connection to the kernel broadcast endpoint. */ + private es: IEventSource | null = null; + + constructor() { + // Wire lifecycle hooks + this.siyuan.plugin.lifecycle.onload = this.onload.bind(this); + this.siyuan.plugin.lifecycle.onloaded = this.onloaded.bind(this); + this.siyuan.plugin.lifecycle.onrunning = this.onrunning.bind(this); + this.siyuan.plugin.lifecycle.onunload = this.onunload.bind(this); + + // Wire the inbound kernel event handler + this.siyuan.event.handler = this.eventHandler.bind(this); + + // Wire server-side request handlers (private scope: /plugin/private//*) + this.siyuan.server.private.http.handler = this.httpHandler.bind(this); + this.siyuan.server.private.ws.handler = this.wsHandler.bind(this); + this.siyuan.server.private.es.handler = this.esHandler.bind(this); + } + + // ── Lifecycle ───────────────────────────────────────────────────────────── + + /** + * Demonstrates {@link IRpc} and {@link IStorage}. + * + * @remarks + * Called when the plugin script is first evaluated. Register RPC methods + * here so they are ready once the plugin reaches the `running` state. + * RPC calls are rejected with `-32002` before `running` is reached. + * + * {@link IStorage} paths are relative to + * `data/storage/petal//`. Path traversal is blocked by the + * kernel. Each {@link IDataObject} returned by `storage.get` is + * single-use — call at most one decoder per instance. + * + * @example + * ```ts + * await siyuan.rpc.bind("echo", async (...args) => args, "description"); + * ``` + */ + private async onload(): Promise { + const { rpc, storage, logger, plugin } = this.siyuan; + + // ── siyuan.logger (all five levels) ─────────────────────────────────── + // Unlike console.*, each call returns a Promise and serialises args as JSON. + await logger.trace("onload: plugin name =", plugin.name); + await logger.debug("onload: version =", plugin.version); + await logger.info("onload: platform =", plugin.platform); + await logger.warn("onload: i18n keys =", Object.keys(plugin.i18n)); + await logger.error("onload: (error-level demo — not a real error)"); + + // ── console.* (synchronous, Node.js util.format, 3 levels) ──────────── + // Routed to the kernel log at INFO/WARN/ERROR. No await needed. + console.log("onload: console.log (sync, util.format)"); + console.warn("onload: console.warn"); + console.error("onload: console.error"); + + // ── siyuan.rpc ──────────────────────────────────────────────────────── + // bind(name, fn, ...descriptions): registers a JSON-RPC method. + // The third argument and beyond are optional human-readable descriptions. + await rpc.bind( + "echo", + async (...args: any[]) => { + await logger.debug("echo called with:", args); + return args; + }, + "Returns all received arguments unchanged.", + ); + + // ── siyuan.storage ──────────────────────────────────────────────────── + // put: write a UTF-8 string to a path relative to the plugin data dir + await storage.put("demo.txt", new Date().toISOString()); + + // get: returns IDataObject — a lazy accessor. Each IDataObject is single-use: + // call at most one decoder (.text(), .json(), or .arrayBuffer()) per instance. + // A separate get() call is required for each decoder demonstration here. + const obj = await storage.get("demo.txt"); + await logger.debug("storage.get → text():", await obj.text()); + + const obj2 = await storage.get("demo.txt"); + await logger.debug("storage.get → json():", await obj2.json()); + + const obj3 = await storage.get("demo.txt"); + await logger.debug("storage.get → arrayBuffer():", await obj3.arrayBuffer()); + + // list: returns IStorageEntry[] for the given relative directory + const entries = await storage.list("."); + await logger.debug("storage.list:", entries); + + // remove: deletes a file or directory tree + await storage.remove("demo.txt"); + } + + /** + * Demonstrates {@link IClient.fetch} against the kernel's own REST API. + * + * @remarks + * Called after all plugins have completed `onload`. At this point every + * enabled kernel plugin is visible in the plugin registry. + * + * `siyuan.client.fetch` tunnels the request through the kernel and injects + * the plugin's JWT token automatically — no manual auth header needed. + * + * @example + * ```ts + * const resp = await siyuan.client.fetch("/api/system/version", { method: "POST", body: "{}" }); + * const data = await resp.json(); + * ``` + */ + private async onloaded(): Promise { + const { client, logger } = this.siyuan; + + // List all loaded plugins via the kernel REST API. + // fetch() returns IFetchResponse; the body is a lazy IDataObject. + const resp = await client.fetch("/api/plugin/listLoadedPlugins", { + method: "POST", + // body must be a string or ArrayBuffer + body: "{}", + }); + + await logger.debug("onloaded: resp.ok =", resp.ok); + await logger.debug("onloaded: resp.status =", resp.status); + await logger.debug("onloaded: resp.statusText =", resp.statusText); + await logger.debug("onloaded: resp.headers =", resp.headers); + await logger.debug("onloaded: listLoadedPlugins =", await resp.json()); + } + + /** + * Demonstrates {@link IClient.socket} (WebSocket client) and + * {@link IClient.event} (SSE client), plus an HTTP JSON-RPC loopback call. + * + * @remarks + * Called after `onloaded` resolves. The kernel is fully running and all + * RPC methods registered in `onload` are now reachable. + * + * ### WebSocket client + * `siyuan.client.socket` returns a sealed {@link IWebSocket} in + * `CONNECTING` state immediately. **`ws.open()` must be called explicitly** + * to initiate the TCP/WebSocket handshake; `onopen` fires only after + * `open()` resolves. Assign all callbacks before calling `open()`. + * + * ### SSE client + * `siyuan.client.event` returns immediately; the kernel starts the SSE + * subscription in the background and fires `onopen` once connected. + * + * @example + * ```ts + * // Assign all callbacks BEFORE calling open(). + * const ws = await siyuan.client.socket("/ws/plugin/rpc/my-plugin"); + * ws.onopen = async () => { await ws.send("hello"); }; + * await ws.open(); + * ``` + */ + private async onrunning(): Promise { + const { client, logger, plugin } = this.siyuan; + + // ── HTTP RPC loopback (JS → HTTP → Go → JS → Go → HTTP → JS) ────────── + const echoResp = await client.fetch( + `/api/plugin/rpc/${plugin.name}`, + { + method: "POST", + // body must be a string — stringify the JSON-RPC payload + body: JSON.stringify({ + jsonrpc: "2.0", + method: "echo", + params: ["hello from onrunning", 42, { key: true }], + id: 1, + }), + }, + ); + await logger.debug("onrunning: HTTP RPC echo =", await echoResp.json()); + + // ── WebSocket client ────────────────────────────────────────────────── + this.ws = await client.socket(`/ws/plugin/rpc/${plugin.name}`); + + // Assign all callbacks before calling open() — onopen fires only after + // the TCP/WebSocket handshake completes. + this.ws.onopen = async (event) => { + await logger.debug("ws client: open", event); + // Send a JSON-RPC request over the WebSocket connection + await this.ws!.send(JSON.stringify({ + jsonrpc: "2.0", + method: "echo", + params: { message: "hello via WebSocket", ts: Date.now() }, + id: 2, + })); + // Demonstrate ping/pong control frames + await this.ws!.ping("ping from plugin"); + }; + this.ws.onmessage = async (event) => { await logger.debug("ws client: message", event); }; + this.ws.onping = async (event) => { await logger.debug("ws client: ping", event); }; + this.ws.onpong = async (event) => { await logger.debug("ws client: pong", event); }; + this.ws.onerror = async (event) => { await logger.debug("ws client: error", event); }; + this.ws.onclose = async (event) => { await logger.debug("ws client: close", event); }; + + // Initiate the connection after wiring all callbacks + await this.ws.open(); + + // ── SSE / EventSource client ────────────────────────────────────────── + this.es = await client.event("/es/broadcast/subscribe"); + this.es.onopen = async (e) => { await logger.debug("es client: open", e); }; + this.es.onmessage = async (e) => { await logger.debug("es client: message", e); }; + this.es.onclose = async (e) => { await logger.debug("es client: close", e); }; + this.es.onerror = async (e) => { await logger.debug("es client: error", e); }; + } + + /** + * Demonstrates {@link IRpc.broadcast} and connection cleanup. + * + * @remarks + * Called when the plugin is stopping. `rpc.broadcast` pushes a JSON-RPC + * 2.0 notification (no `id`) to all connected RPC WebSocket clients. It + * is a no-op if the plugin is not in the `running` state, so it is safe + * to call here even during a fast shutdown. + * + * After broadcasting, close any open client-side connections to avoid + * resource leaks in the kernel process. + */ + private async onunload(): Promise { + const { rpc, logger } = this.siyuan; + + // Unbind the RPC method registered in onload + await rpc.unbind("echo"); + + // Push a notification to all connected RPC WebSocket clients + await rpc.broadcast("unload", ["Plugin is unloading"]); + + // Close client-side connections — optional chaining guards against the + // case where onrunning was never reached (e.g. error during startup) + this.ws?.close(); + this.es?.close(); + + await logger.debug("onunload: cleanup complete"); + } + + // ── Event bridge ────────────────────────────────────────────────────────── + + /** + * Demonstrates {@link IEvent.handler} (receive) and {@link IEvent.emit} (publish). + * + * @remarks + * `siyuan.event.handler` receives every kernel broadcast event. + * `event` has shape `{ id: UUID, type: string, detail: any }`. + * + * `siyuan.event.emit` publishes an event to the in-process bus. + * The first argument is the topic string used for routing; + * the second is the payload. + * + * @param event - The incoming kernel event message. + */ + private async eventHandler(event: IEventMessage): Promise { + const { event: eventApi, logger } = this.siyuan; + + await logger.debug("event received:", event); + + // Re-publish the event under the "plugin" topic + await eventApi.emit("plugin", { + id: event.id, + type: "echo", + detail: event, + }); + } + + // ── Server-side handlers ────────────────────────────────────────────────── + + /** + * Demonstrates the HTTP server handler at + * `ANY /plugin/private//*path`. + * + * @remarks + * Must return an {@link IHttpResponse}. The `body` field supports: + * `data` (JSON / XML / YAML / …), `file` (local filesystem path), + * `string` (Go `fmt.Sprintf`), `raw` (bytes + Content-Type), `redirect`. + * Set exactly one; the kernel uses the first non-null value. + * + * The route requires kernel authentication and admin role — unauthenticated + * requests are rejected before reaching the handler. + * + * @param request - Parsed URL, headers, body, and Gin routing context. + * @returns An {@link IHttpResponse} that the kernel writes to the client. + */ + private async httpHandler(request: IServerRequest): Promise { + await this.siyuan.logger.debug("http handler: path =", request.url.path); + + return { + statusCode: 200, + headers: { + // Multi-value headers are arrays of strings + "X-Plugin": [this.siyuan.plugin.name], + }, + body: { + // type: "JSON" delegates to c.JSON in Gin + data: { + type: "JSON", + data: { + path: request.url.path, + method: request.request.method, + contentType: request.request.contentType, + query: request.url.query, + params: request.context.params, + }, + }, + }, + }; + } + + /** + * Demonstrates the WebSocket server handler at + * `GET /plugin/private//*path` (WebSocket upgrade). + * + * @remarks + * `request.port` mirrors the {@link IWebSocket} interface — same event + * callbacks, same `send` / `ping` / `pong` / `close` methods. + * + * Assign all callbacks in this handler body. The kernel auto-opens the + * port's read loop after the handler returns; calling `port.open()` + * explicitly is optional. + * + * `onmessage` events carry + * `{ type: "text" | "binary", data: string | ArrayBuffer }`. + * + * @param request - Server request augmented with `port` (a bidirectional + * WebSocket back-channel to the connected client). + */ + private async wsHandler(request: IServerWsRequest): Promise { + const { logger } = this.siyuan; + + request.port.onopen = async (event) => { + await logger.debug("ws server: port open", event); + // Greet the client on connection + await request.port.send("Hello from plugin WebSocket server!"); + }; + request.port.onmessage = async (event) => { + await logger.debug("ws server: message", event); + // send text frames back as-is; convert binary frames to a string representation + if (typeof event.data === "string") { + await request.port.send(event.data); + } else { + // Binary frame — event.data is always ArrayBuffer in the else branch + await request.port.send(new TextDecoder().decode(event.data as ArrayBuffer)); + } + }; + request.port.onping = async (event) => { + await logger.debug("ws server: ping", event); + // Reply with a pong carrying the same application data + await request.port.pong(event.data); + }; + request.port.onpong = async (event) => { await logger.debug("ws server: pong", event); }; + request.port.onclose = async (event) => { await logger.debug("ws server: close", event); }; + request.port.onerror = async (event) => { await logger.debug("ws server: error", event); }; + // port.open() is optional — the kernel auto-opens after this handler returns. + } + + /** + * Demonstrates the SSE server handler at + * `GET /plugin/private//*path` (Server-Sent Events). + * + * @remarks + * `request.port.onopen` fires once the SSE stream is ready. Call + * `port.send(eventType, data)` inside `onopen` or later to push events. + * `eventType` maps to the SSE `event:` field; `data` maps to `data:`. + * `send` is **synchronous** — no `await` needed. + * + * The connection stays open until `port.close()` is called or the + * client disconnects, which fires `onclose`. + * + * @param request - Server request augmented with `port` (an SSE + * back-channel to the connected client). + */ + private async esHandler(request: IServerEsRequest): Promise { + const { logger } = this.siyuan; + + request.port.onopen = async (event) => { + await logger.debug("sse server: port open", event); + // send is synchronous; eventType becomes the SSE `event:` field + request.port.send("message", "Connected to plugin SSE!"); + request.port.send("update", JSON.stringify({ ts: Date.now() })); + }; + request.port.onclose = async (event) => { + await logger.debug("sse server: port close", event); + }; + // Note: IEsServerPort has no onerror callback — SSE errors surface as onclose. + } +} + +new KernelPlugin(); From d49d380a8795243046b9d0a18275342513b722fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yingyi=20/=20=E9=A2=96=E9=80=B8?= <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Sat, 9 May 2026 23:10:05 +0800 Subject: [PATCH 05/15] Add kernel build and split dev/build scripts Introduce a dedicated kernel build target and developer workflows: add webpack.kernel.config.js and pnpm-workspace.yaml, split dev/build scripts in package.json into kernel and app targets, and add a combined dev script. Expose supported kernels in plugin.json, ignore kernel.js in .gitignore, and make small code/import cleanup in src/index.ts. Update docs to clarify SSE/WS server handler signatures and handler typing. Dev dependencies were bumped accordingly. --- .gitignore | 1 + .../2026-05-09-kernel-plugin-demo-design.md | 6 +- package.json | 18 +- plugin.json | 10 + pnpm-lock.yaml | 316 +++++++++--------- pnpm-workspace.yaml | 3 + src/index.ts | 20 +- src/kernel.ts | 47 ++- webpack.config.js | 34 +- webpack.kernel.config.js | 53 +++ 10 files changed, 286 insertions(+), 222 deletions(-) create mode 100644 pnpm-workspace.yaml create mode 100644 webpack.kernel.config.js diff --git a/.gitignore b/.gitignore index f0ccc1c..86df0ee 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ dist package.zip index.css index.js +kernel.js /i18n diff --git a/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md b/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md index 023ccea..654a16a 100644 --- a/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md +++ b/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md @@ -46,11 +46,11 @@ The current `IServerRequestHandler` hard-codes `IServerRequest` as the han | Addition | Purpose | |---|---| -| `IEsServerPort` | Server-side SSE port: `onopen`, `onclose`, `send(eventType, data)`, `close()` | +| `IEsServerPort` | Server-side SSE port: `onopen`, `onclose`, `send(eventType: string, data: string): void` (synchronous — no `await` needed), `close(): void` | | `IServerWsRequest extends IServerRequest` | Adds `port: IWebSocket` for WS server handlers | | `IServerEsRequest extends IServerRequest` | Adds `port: IEsServerPort` for SSE server handlers | -| `IServerRequestHandler` | Second type param (default = `IServerRequest`) for request type — backward-compatible | -| `IServerScope.ws` / `.es` updated | Use `IServerWsRequest` / `IServerEsRequest` as handler argument | +| `IServerRequestHandler` | Second type param (default = `IServerRequest`) — backward-compatible. The `handler` field body is updated to `((request: TReq) => TRes \| Promise) \| null` so the type parameter is actually applied to the handler argument | +| `IServerScope.ws` / `.es` updated | `IServerRequestHandler` / `IServerRequestHandler` | --- diff --git a/package.json b/package.json index aba0f59..4666ff4 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,12 @@ "main": ".src/index.js", "scripts": { "lint": "eslint . --fix --cache", - "dev": "webpack --mode development", - "build": "webpack --mode production" + "dev": "pnpm run dev:kernel & pnpm run dev:app", + "dev:app": "webpack --config webpack.config.js --mode development", + "dev:kernel": "webpack --config webpack.kernel.config.js --mode development", + "build": "pnpm run build:kernel && pnpm run build:app", + "build:app": "webpack --config webpack.config.js --mode production", + "build:kernel": "webpack --config webpack.kernel.config.js --mode production" }, "keywords": [], "author": "Vanessa", @@ -14,16 +18,16 @@ "devDependencies": { "@eslint/eslintrc": "^3.3.5", "@eslint/js": "^10.0.1", - "@typescript-eslint/eslint-plugin": "^8.59.1", - "@typescript-eslint/parser": "^8.59.1", + "@typescript-eslint/eslint-plugin": "^8.59.2", + "@typescript-eslint/parser": "^8.59.2", "copy-webpack-plugin": "^14.0.0", "css-loader": "^7.1.4", "esbuild-loader": "^4.4.3", - "eslint": "^10.2.1", - "globals": "^17.5.0", + "eslint": "^10.3.0", + "globals": "^17.6.0", "mini-css-extract-plugin": "^2.10.2", "sass": "^1.99.0", - "sass-loader": "^16.0.7", + "sass-loader": "^16.0.8", "siyuan": "1.2.2-alpha.0", "tslib": "^2.8.1", "typescript": "^6.0.3", diff --git a/plugin.json b/plugin.json index 6b20c59..c94b557 100644 --- a/plugin.json +++ b/plugin.json @@ -4,6 +4,16 @@ "url": "https://github.com/siyuan-note/plugin-sample", "version": "0.4.7", "minAppVersion": "3.6.4", + "kernels": [ + "windows", + "linux", + "darwin", + "ios", + "android", + "harmony", + "docker", + "all" + ], "backends": [ "windows", "linux", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e55e788..39f3795 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,13 +13,13 @@ importers: version: 3.3.5 '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.2.1) + version: 10.0.1(eslint@10.3.0) '@typescript-eslint/eslint-plugin': - specifier: ^8.59.1 - version: 8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.2.1)(typescript@6.0.3))(eslint@10.2.1)(typescript@6.0.3) + specifier: ^8.59.2 + version: 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) '@typescript-eslint/parser': - specifier: ^8.59.1 - version: 8.59.1(eslint@10.2.1)(typescript@6.0.3) + specifier: ^8.59.2 + version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) copy-webpack-plugin: specifier: ^14.0.0 version: 14.0.0(webpack@5.106.2) @@ -30,11 +30,11 @@ importers: specifier: ^4.4.3 version: 4.4.3(webpack@5.106.2) eslint: - specifier: ^10.2.1 - version: 10.2.1 + specifier: ^10.3.0 + version: 10.3.0 globals: - specifier: ^17.5.0 - version: 17.5.0 + specifier: ^17.6.0 + version: 17.6.0 mini-css-extract-plugin: specifier: ^2.10.2 version: 2.10.2(webpack@5.106.2) @@ -42,8 +42,8 @@ importers: specifier: ^1.99.0 version: 1.99.0 sass-loader: - specifier: ^16.0.7 - version: 16.0.7(sass@1.99.0)(webpack@5.106.2) + specifier: ^16.0.8 + version: 16.0.8(sass@1.99.0)(webpack@5.106.2) siyuan: specifier: 1.2.2-alpha.0 version: 1.2.2-alpha.0 @@ -65,8 +65,8 @@ importers: packages: - '@discoveryjs/json-ext@1.0.0': - resolution: {integrity: sha512-dDlz3W405VMFO4w5kIP9DOmELBcvFQGmLoKSdIRstBDubKFYwaNHV1NnlzMCQpXQFGWVALmeMORAuiLx18AvZQ==} + '@discoveryjs/json-ext@1.1.0': + resolution: {integrity: sha512-Xc3VhU02wqZ1HvHRJUwL09HkZSTvidqY5Ya0NXBSYOxAp+Ln9dcJr9fySI+CkONzP3PekQo9WdzCv0PGER/mOA==} engines: {node: '>=14.17.0'} '@dop251/types-goja_nodejs-buffer@0.0.0-20260212111938-1f56ff5bcf14': @@ -410,72 +410,72 @@ packages: '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.6.0': - resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} + '@types/node@25.6.2': + resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} - '@typescript-eslint/eslint-plugin@8.59.1': - resolution: {integrity: sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==} + '@typescript-eslint/eslint-plugin@8.59.2': + resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.59.1 + '@typescript-eslint/parser': ^8.59.2 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.59.1': - resolution: {integrity: sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==} + '@typescript-eslint/parser@8.59.2': + resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.59.1': - resolution: {integrity: sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==} + '@typescript-eslint/project-service@8.59.2': + resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.59.1': - resolution: {integrity: sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==} + '@typescript-eslint/scope-manager@8.59.2': + resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.59.1': - resolution: {integrity: sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==} + '@typescript-eslint/tsconfig-utils@8.59.2': + resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.59.1': - resolution: {integrity: sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==} + '@typescript-eslint/type-utils@8.59.2': + resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.59.1': - resolution: {integrity: sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==} + '@typescript-eslint/types@8.59.2': + resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.59.1': - resolution: {integrity: sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==} + '@typescript-eslint/typescript-estree@8.59.2': + resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.59.1': - resolution: {integrity: sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==} + '@typescript-eslint/utils@8.59.2': + resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.59.1': - resolution: {integrity: sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==} + '@typescript-eslint/visitor-keys@8.59.2': + resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@webassemblyjs/ast@1.14.1': @@ -574,8 +574,8 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.10.24: - resolution: {integrity: sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==} + baseline-browser-mapping@2.10.27: + resolution: {integrity: sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==} engines: {node: '>=6.0.0'} hasBin: true @@ -585,8 +585,8 @@ packages: brace-expansion@1.1.14: resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} browserslist@4.28.2: @@ -604,8 +604,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001791: - resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} + caniuse-lite@1.0.30001792: + resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} @@ -672,15 +672,15 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - electron-to-chromium@1.5.345: - resolution: {integrity: sha512-F9JXQGiMrz6yVNPI2qOVPvB9HzjH5cGzhs8oJ6A28V5L/YnzN/0KsuiibqF+F1Fd9qxFzD1BUnYSd8JfULxTwg==} + electron-to-chromium@1.5.352: + resolution: {integrity: sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==} emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - enhanced-resolve@5.21.0: - resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} + enhanced-resolve@5.21.2: + resolution: {integrity: sha512-xe9vQb5kReirPUxgQrXA3ihgbCqssmTiM7cOZ+Gzu+VeGWgpV98lLZvp0dl4yriyAePcewxGUs9UpKD8PET9KQ==} engines: {node: '>=10.13.0'} envinfo@7.21.0: @@ -733,8 +733,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.2.1: - resolution: {integrity: sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==} + eslint@10.3.0: + resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -784,8 +784,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} @@ -840,8 +840,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@17.5.0: - resolution: {integrity: sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==} + globals@17.6.0: + resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} engines: {node: '>=18'} graceful-fs@4.2.11: @@ -889,8 +889,8 @@ packages: resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} engines: {node: '>=10.13.0'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} is-extglob@2.1.1: @@ -987,8 +987,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1089,8 +1089,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.12: - resolution: {integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==} + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1133,8 +1133,8 @@ packages: engines: {node: '>= 0.4'} hasBin: true - sass-loader@16.0.7: - resolution: {integrity: sha512-w6q+fRHourZ+e+xA1kcsF27iGM6jdB8teexYCfdUw0sYgcDNeZESnDNT9sUmmPm3ooziwUJXGwZJSTF3kOdBfA==} + sass-loader@16.0.8: + resolution: {integrity: sha512-hcov4ZwZJIGbEuyNr9EmiTmZueyrxSToE6GOzoZnq5JM7ecRO7ttyvilPn+VmRsqiP16+VYZzVnGZj/hzZgKBA==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 @@ -1230,8 +1230,8 @@ packages: uglify-js: optional: true - terser@5.46.2: - resolution: {integrity: sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==} + terser@5.47.1: + resolution: {integrity: sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==} engines: {node: '>=10'} hasBin: true @@ -1335,7 +1335,7 @@ packages: snapshots: - '@discoveryjs/json-ext@1.0.0': {} + '@discoveryjs/json-ext@1.1.0': {} '@dop251/types-goja_nodejs-buffer@0.0.0-20260212111938-1f56ff5bcf14': dependencies: @@ -1425,9 +1425,9 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.1)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)': dependencies: - eslint: 10.2.1 + eslint: 10.3.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -1462,9 +1462,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@10.0.1(eslint@10.2.1)': + '@eslint/js@10.0.1(eslint@10.3.0)': optionalDependencies: - eslint: 10.2.1 + eslint: 10.3.0 '@eslint/object-schema@3.0.5': {} @@ -1572,32 +1572,32 @@ snapshots: '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 '@types/esrecurse@4.3.1': {} - '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} '@types/json-schema@7.0.15': {} - '@types/node@25.6.0': + '@types/node@25.6.2': dependencies: undici-types: 7.19.2 - '@typescript-eslint/eslint-plugin@8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.2.1)(typescript@6.0.3))(eslint@10.2.1)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.1(eslint@10.2.1)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/type-utils': 8.59.1(eslint@10.2.1)(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.1(eslint@10.2.1)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.1 - eslint: 10.2.1 + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/type-utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 + eslint: 10.3.0 ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -1605,56 +1605,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.1(eslint@10.2.1)(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3 - eslint: 10.2.1 + eslint: 10.3.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.1(typescript@6.0.3)': + '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@6.0.3) - '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.59.1': + '@typescript-eslint/scope-manager@8.59.2': dependencies: - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 - '@typescript-eslint/tsconfig-utils@8.59.1(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.59.1(eslint@10.2.1)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.1(eslint@10.2.1)(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) debug: 4.4.3 - eslint: 10.2.1 + eslint: 10.3.0 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.59.1': {} + '@typescript-eslint/types@8.59.2': {} - '@typescript-eslint/typescript-estree@8.59.1(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.59.1(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@6.0.3) - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3 minimatch: 10.2.5 semver: 7.7.4 @@ -1664,20 +1664,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.1(eslint@10.2.1)(typescript@6.0.3)': + '@typescript-eslint/utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1) - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) - eslint: 10.2.1 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + eslint: 10.3.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.59.1': + '@typescript-eslint/visitor-keys@8.59.2': dependencies: - '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/types': 8.59.2 eslint-visitor-keys: 5.0.1 '@webassemblyjs/ast@1.14.1': @@ -1789,7 +1789,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.1.2 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -1799,7 +1799,7 @@ snapshots: balanced-match@4.0.4: {} - baseline-browser-mapping@2.10.24: {} + baseline-browser-mapping@2.10.27: {} big.js@5.2.2: {} @@ -1808,15 +1808,15 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@5.0.5: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.24 - caniuse-lite: 1.0.30001791 - electron-to-chromium: 1.5.345 + baseline-browser-mapping: 2.10.27 + caniuse-lite: 1.0.30001792 + electron-to-chromium: 1.5.352 node-releases: 2.0.38 update-browserslist-db: 1.2.3(browserslist@4.28.2) @@ -1826,7 +1826,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001791: {} + caniuse-lite@1.0.30001792: {} chokidar@4.0.3: dependencies: @@ -1863,12 +1863,12 @@ snapshots: css-loader@7.1.4(webpack@5.106.2): dependencies: - icss-utils: 5.1.0(postcss@8.5.12) - postcss: 8.5.12 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.12) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.12) - postcss-modules-scope: 3.2.1(postcss@8.5.12) - postcss-modules-values: 4.0.0(postcss@8.5.12) + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.14) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.14) + postcss-modules-scope: 3.2.1(postcss@8.5.14) + postcss-modules-values: 4.0.0(postcss@8.5.14) postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: @@ -1885,11 +1885,11 @@ snapshots: detect-libc@2.1.2: optional: true - electron-to-chromium@1.5.345: {} + electron-to-chromium@1.5.352: {} emojis-list@3.0.0: {} - enhanced-resolve@5.21.0: + enhanced-resolve@5.21.2: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -1949,7 +1949,7 @@ snapshots: eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -1959,9 +1959,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.2.1: + eslint@10.3.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.5.5 @@ -1970,7 +1970,7 @@ snapshots: '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 @@ -2028,7 +2028,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-uri@3.1.0: {} + fast-uri@3.1.2: {} fastest-levenshtein@1.0.16: {} @@ -2073,7 +2073,7 @@ snapshots: globals@14.0.0: {} - globals@17.5.0: {} + globals@17.6.0: {} graceful-fs@4.2.11: {} @@ -2083,9 +2083,9 @@ snapshots: dependencies: function-bind: 1.1.2 - icss-utils@5.1.0(postcss@8.5.12): + icss-utils@5.1.0(postcss@8.5.14): dependencies: - postcss: 8.5.12 + postcss: 8.5.14 ignore@5.3.2: {} @@ -2107,7 +2107,7 @@ snapshots: interpret@3.1.1: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: hasown: 2.0.3 @@ -2127,7 +2127,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 25.6.0 + '@types/node': 25.6.2 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -2184,7 +2184,7 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.6 minimatch@3.1.5: dependencies: @@ -2192,7 +2192,7 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.11: {} + nanoid@3.3.12: {} natural-compare@1.4.0: {} @@ -2250,26 +2250,26 @@ snapshots: dependencies: find-up: 4.1.0 - postcss-modules-extract-imports@3.1.0(postcss@8.5.12): + postcss-modules-extract-imports@3.1.0(postcss@8.5.14): dependencies: - postcss: 8.5.12 + postcss: 8.5.14 - postcss-modules-local-by-default@4.2.0(postcss@8.5.12): + postcss-modules-local-by-default@4.2.0(postcss@8.5.14): dependencies: - icss-utils: 5.1.0(postcss@8.5.12) - postcss: 8.5.12 + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.12): + postcss-modules-scope@3.2.1(postcss@8.5.14): dependencies: - postcss: 8.5.12 + postcss: 8.5.14 postcss-selector-parser: 7.1.1 - postcss-modules-values@4.0.0(postcss@8.5.12): + postcss-modules-values@4.0.0(postcss@8.5.14): dependencies: - icss-utils: 5.1.0(postcss@8.5.12) - postcss: 8.5.12 + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 postcss-selector-parser@7.1.1: dependencies: @@ -2278,9 +2278,9 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.12: + postcss@8.5.14: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -2309,11 +2309,11 @@ snapshots: resolve@1.22.12: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 + is-core-module: 2.16.2 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2): + sass-loader@16.0.8(sass@1.99.0)(webpack@5.106.2): dependencies: neo-async: 2.6.2 optionalDependencies: @@ -2379,10 +2379,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - terser: 5.46.2 + terser: 5.47.1 webpack: 5.106.2(webpack-cli@7.0.2) - terser@5.46.2: + terser@5.47.1: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.16.0 @@ -2427,7 +2427,7 @@ snapshots: webpack-cli@7.0.2(webpack@5.106.2): dependencies: - '@discoveryjs/json-ext': 1.0.0 + '@discoveryjs/json-ext': 1.1.0 commander: 14.0.3 cross-spawn: 7.0.6 envinfo: 7.21.0 @@ -2449,7 +2449,7 @@ snapshots: webpack@5.106.2(webpack-cli@7.0.2): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 @@ -2458,7 +2458,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.16.0) browserslist: 4.28.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.21.0 + enhanced-resolve: 5.21.2 es-module-lexer: 2.1.0 eslint-scope: 5.1.1 events: 3.3.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..f588aaa --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +allowBuilds: + '@parcel/watcher': false + esbuild: false diff --git a/src/index.ts b/src/index.ts index e03f18e..bbe0ada 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,10 +26,10 @@ import { platformUtils, openSetting, openAttributePanel, - saveLayout + saveLayout, + IMenuItem } from "siyuan"; import "./index.scss"; -import {IMenuItem} from "siyuan/types"; const STORAGE_NAME = "menu-config"; const TAB_TYPE = "custom_tab"; @@ -57,7 +57,7 @@ export default class PluginSample extends Plugin { } onload() { - this.data[STORAGE_NAME] = {readonlyText: "Readonly"}; + this.data[STORAGE_NAME] = { readonlyText: "Readonly" }; const frontEnd = getFrontend(); this.isMobile = frontEnd === "mobile" || frontEnd === "browser-mobile"; @@ -100,7 +100,7 @@ export default class PluginSample extends Plugin { this.addDock({ config: { position: "LeftBottom", - size: {width: 200, height: 0}, + size: { width: 200, height: 0 }, icon: "iconSaving", title: "Custom Dock", hotkey: "⌥⌘W", @@ -148,7 +148,7 @@ export default class PluginSample extends Plugin { const textareaElement = document.createElement("textarea"); this.setting = new Setting({ confirmCallback: () => { - this.saveData(STORAGE_NAME, {readonlyText: textareaElement.value}).catch(e => { + this.saveData(STORAGE_NAME, { readonlyText: textareaElement.value }).catch(e => { showMessage(`[${this.name}] save data [${STORAGE_NAME}] fail: `, e); }); } @@ -240,7 +240,7 @@ export default class PluginSample extends Plugin { statusIconTemp.content.firstElementChild.addEventListener("click", () => { confirm("⚠️", this.i18n.confirmRemove.replace("${name}", this.name), () => { this.removeData(STORAGE_NAME).then(() => { - this.data[STORAGE_NAME] = {readonlyText: "Readonly"}; + this.data[STORAGE_NAME] = { readonlyText: "Readonly" }; showMessage(`[${this.name}]: ${this.i18n.removedData}`); }).catch(e => { showMessage(`[${this.name}] remove data [${STORAGE_NAME}] fail: `, e); @@ -324,11 +324,11 @@ export default class PluginSample extends Plugin { }); } - private eventBusLog({detail}: any) { + private eventBusLog({ detail }: any) { console.log(detail); } - private blockIconEvent({detail}: any) { + private blockIconEvent({ detail }: any) { detail.menu.addItem({ id: "pluginSample_removeSpace", iconHTML: "", @@ -493,7 +493,7 @@ export default class PluginSample extends Plugin { label: "Open Float Layer(open doc first)", click: () => { this.addFloatLayer({ - refDefs: [{refID: this.getEditor().protyle.block.rootID}], + refDefs: [{ refID: this.getEditor().protyle.block.rootID }], x: window.innerWidth - 768 - 120, y: 32, isBacklink: false @@ -505,7 +505,7 @@ export default class PluginSample extends Plugin { label: "Open Doc Window(open doc first)", click: () => { openWindow({ - doc: {id: this.getEditor().protyle.block.rootID} + doc: { id: this.getEditor().protyle.block.rootID } }); } }); diff --git a/src/kernel.ts b/src/kernel.ts index 4b4e553..e402645 100644 --- a/src/kernel.ts +++ b/src/kernel.ts @@ -1,15 +1,6 @@ /// -import type { - ISiyuan, - IWebSocket, - IEventSource, - IEventMessage, - IServerRequest, - IHttpResponse, - IServerWsRequest, - IServerEsRequest, -} from 'siyuan/kernel'; +import type * as kernel from 'siyuan/kernel'; /** * Reference implementation of the kernel plugin API for SiYuan. @@ -38,13 +29,13 @@ import type { * non-obvious constraints. */ class KernelPlugin { - private readonly siyuan: ISiyuan = siyuan; + private readonly siyuan: kernel.ISiyuan = siyuan; /** Client-side WebSocket connection to the plugin's own RPC endpoint. */ - private ws: IWebSocket | null = null; + private ws: kernel.IWebSocket | null = null; /** Client-side SSE connection to the kernel broadcast endpoint. */ - private es: IEventSource | null = null; + private es: kernel.IEventSource | null = null; constructor() { // Wire lifecycle hooks @@ -65,16 +56,16 @@ class KernelPlugin { // ── Lifecycle ───────────────────────────────────────────────────────────── /** - * Demonstrates {@link IRpc} and {@link IStorage}. + * Demonstrates {@link kernel.IRpc} and {@link kernel.IStorage}. * * @remarks * Called when the plugin script is first evaluated. Register RPC methods * here so they are ready once the plugin reaches the `running` state. * RPC calls are rejected with `-32002` before `running` is reached. * - * {@link IStorage} paths are relative to + * {@link kernel.IStorage} paths are relative to * `data/storage/petal//`. Path traversal is blocked by the - * kernel. Each {@link IDataObject} returned by `storage.get` is + * kernel. Each {@link kernel.IDataObject} returned by `storage.get` is * single-use — call at most one decoder per instance. * * @example @@ -113,7 +104,7 @@ class KernelPlugin { // ── siyuan.storage ──────────────────────────────────────────────────── // put: write a UTF-8 string to a path relative to the plugin data dir - await storage.put("demo.txt", new Date().toISOString()); + await storage.put("demo.txt", JSON.stringify(new Date().toISOString())); // get: returns IDataObject — a lazy accessor. Each IDataObject is single-use: // call at most one decoder (.text(), .json(), or .arrayBuffer()) per instance. @@ -121,11 +112,11 @@ class KernelPlugin { const obj = await storage.get("demo.txt"); await logger.debug("storage.get → text():", await obj.text()); - const obj2 = await storage.get("demo.txt"); - await logger.debug("storage.get → json():", await obj2.json()); + await logger.debug("storage.get → json():", await obj.json()); - const obj3 = await storage.get("demo.txt"); - await logger.debug("storage.get → arrayBuffer():", await obj3.arrayBuffer()); + await logger.debug("storage.get → arrayBuffer():", await obj.arrayBuffer()); + + await logger.debug("storage.get → buffer():", await obj.buffer()); // list: returns IStorageEntry[] for the given relative directory const entries = await storage.list("."); @@ -133,6 +124,12 @@ class KernelPlugin { // remove: deletes a file or directory tree await storage.remove("demo.txt"); + + try { + throw new Error("This is a test error to demonstrate logger.error with stack trace"); + } catch (error) { + console.error((error as Error).stack?.trim()); + } } /** @@ -292,7 +289,7 @@ class KernelPlugin { * * @param event - The incoming kernel event message. */ - private async eventHandler(event: IEventMessage): Promise { + private async eventHandler(event: kernel.IEventMessage): Promise { const { event: eventApi, logger } = this.siyuan; await logger.debug("event received:", event); @@ -323,7 +320,7 @@ class KernelPlugin { * @param request - Parsed URL, headers, body, and Gin routing context. * @returns An {@link IHttpResponse} that the kernel writes to the client. */ - private async httpHandler(request: IServerRequest): Promise { + private async httpHandler(request: kernel.IServerRequest): Promise { await this.siyuan.logger.debug("http handler: path =", request.url.path); return { @@ -366,7 +363,7 @@ class KernelPlugin { * @param request - Server request augmented with `port` (a bidirectional * WebSocket back-channel to the connected client). */ - private async wsHandler(request: IServerWsRequest): Promise { + private async wsHandler(request: kernel.IServerWsRequest): Promise { const { logger } = this.siyuan; request.port.onopen = async (event) => { @@ -411,7 +408,7 @@ class KernelPlugin { * @param request - Server request augmented with `port` (an SSE * back-channel to the connected client). */ - private async esHandler(request: IServerEsRequest): Promise { + private async esHandler(request: kernel.IServerEsRequest): Promise { const { logger } = this.siyuan; request.port.onopen = async (event) => { diff --git a/webpack.config.js b/webpack.config.js index 9ee4986..0d4d667 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,25 +1,19 @@ const path = require("path"); const fs = require("fs"); const webpack = require("webpack"); -const {EsbuildPlugin} = require("esbuild-loader"); +const { EsbuildPlugin } = require("esbuild-loader"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const CopyPlugin = require("copy-webpack-plugin"); const ZipPlugin = require("zip-webpack-plugin"); module.exports = (env, argv) => { - const isPro = argv.mode === "production"; + const production = argv.mode === "production"; const plugins = [ new MiniCssExtractPlugin({ - filename: isPro ? "dist/index.css" : "index.css", + filename: production ? "dist/index.css" : "index.css", }) ]; - let entry = { - "index": "./src/index.ts", - }; - if (isPro) { - entry = { - "dist/index": "./src/index.ts", - }; + if (production) { plugins.push(new webpack.BannerPlugin({ banner: () => { return fs.readFileSync("LICENSE").toString(); @@ -27,11 +21,11 @@ module.exports = (env, argv) => { })); plugins.push(new CopyPlugin({ patterns: [ - {from: "preview.png", to: "./dist/"}, - {from: "icon.png", to: "./dist/"}, - {from: "README*.md", to: "./dist/"}, - {from: "plugin.json", to: "./dist/"}, - {from: "src/i18n/", to: "./dist/i18n/"}, + { from: "preview.png", to: "./dist/" }, + { from: "icon.png", to: "./dist/" }, + { from: "README*.md", to: "./dist/" }, + { from: "plugin.json", to: "./dist/" }, + { from: "src/i18n/", to: "./dist/i18n/" }, ], })); plugins.push(new ZipPlugin({ @@ -51,8 +45,8 @@ module.exports = (env, argv) => { } return { mode: argv.mode || "development", - watch: !isPro, - devtool: isPro ? false : "eval", + watch: !production, + devtool: production ? false : "eval-source-map", output: { filename: "[name].js", path: path.resolve(__dirname), @@ -64,9 +58,11 @@ module.exports = (env, argv) => { externals: { siyuan: "siyuan", }, - entry, + entry: { + [production ? "dist/index" : "index"]: "./src/index.ts", + }, optimization: { - minimize: true, + minimize: production, minimizer: [ new EsbuildPlugin(), ], diff --git a/webpack.kernel.config.js b/webpack.kernel.config.js new file mode 100644 index 0000000..55d0e47 --- /dev/null +++ b/webpack.kernel.config.js @@ -0,0 +1,53 @@ +const path = require("path"); +const { EsbuildPlugin } = require("esbuild-loader"); + +module.exports = (env, argv) => { + const production = argv.mode === "production"; + return { + mode: argv.mode || "development", + watch: !production, + devtool: production ? false : "inline-source-map", + entry: { + [production ? "dist/kernel" : "kernel"]: "./src/kernel.ts", + }, + experiments: { + outputModule: true, + }, + output: { + filename: "[name].js", + path: path.resolve(__dirname), + library: { + type: "module", + }, + }, + externals: { + siyuan: "siyuan", + }, + optimization: { + minimize: production, + minimizer: [ + new EsbuildPlugin(), + ], + }, + resolve: { + extensions: [".ts", ".js", ".json"], + }, + module: { + rules: [ + { + test: /\.ts(x?)$/, + include: [path.resolve(__dirname, "src")], + use: [ + { + loader: "esbuild-loader", + options: { + target: "esnext", + } + }, + ], + }, + ], + }, + plugins: [], + }; +}; From 0ca1aec822ece2bce180e69766dcb24176eaac83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yingyi=20/=20=E9=A2=96=E9=80=B8?= <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Sat, 9 May 2026 23:46:57 +0800 Subject: [PATCH 06/15] Use explicit WebSocket/EventSource request types Rename server request parameter types in src/kernel.ts from IServerWsRequest/IServerEsRequest to IServerWebSocketRequest/IServerEventSourceRequest to improve type clarity. Also apply minor spacing/style fix in webpack.config.js copy pattern for consistent formatting. --- src/kernel.ts | 4 ++-- webpack.config.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/kernel.ts b/src/kernel.ts index e402645..b58924a 100644 --- a/src/kernel.ts +++ b/src/kernel.ts @@ -363,7 +363,7 @@ class KernelPlugin { * @param request - Server request augmented with `port` (a bidirectional * WebSocket back-channel to the connected client). */ - private async wsHandler(request: kernel.IServerWsRequest): Promise { + private async wsHandler(request: kernel.IServerWebSocketRequest): Promise { const { logger } = this.siyuan; request.port.onopen = async (event) => { @@ -408,7 +408,7 @@ class KernelPlugin { * @param request - Server request augmented with `port` (an SSE * back-channel to the connected client). */ - private async esHandler(request: kernel.IServerEsRequest): Promise { + private async esHandler(request: kernel.IServerEventSourceRequest): Promise { const { logger } = this.siyuan; request.port.onopen = async (event) => { diff --git a/webpack.config.js b/webpack.config.js index 0d4d667..0dcb2c7 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -39,7 +39,7 @@ module.exports = (env, argv) => { } else { plugins.push(new CopyPlugin({ patterns: [ - {from: "src/i18n/", to: "./i18n/"}, + { from: "src/i18n/", to: "./i18n/" }, ], })); } From 8ef824eff74dfae707763a464280730f3c978970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yingyi=20/=20=E9=A2=96=E9=80=B8?= <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Mon, 11 May 2026 18:16:12 +0800 Subject: [PATCH 07/15] ci(format): add dprint configuration and integrate into workspace --- .gitignore | 1 + dprint.json | 55 +++++++++++++++++++++ package.json | 3 ++ pnpm-lock.yaml | 116 ++++++++++++++++++++++++++++++++++++++++++++ pnpm-workspace.yaml | 1 + 5 files changed, 176 insertions(+) create mode 100644 dprint.json diff --git a/.gitignore b/.gitignore index 86df0ee..aa4c6b1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ node_modules .DS_Store .eslintcache +.dprint dist package.zip index.css diff --git a/dprint.json b/dprint.json new file mode 100644 index 0000000..1912c32 --- /dev/null +++ b/dprint.json @@ -0,0 +1,55 @@ +{ + "$schema": "https://dprint.dev/schemas/v0.json", + "lineWidth": 180, + "indentWidth": 4, + "useTabs": false, + "newLineKind": "lf", + "includes": [ + "**/*.{ts,tsx,js,jsx,mjs,cjs}", + "**/*.{json,jsonc}", + "**/*.{css,scss}", + "**/*.{md,markdown}", + "**/*.{yaml,yml}" + ], + "excludes": [ + "**/.git", + "**/node_modules", + "**/dist", + "**/pnpm-lock.yaml", + "index.js", + "kernel.js", + "index.css" + ], + "typescript": { + "quoteStyle": "alwaysDouble", + "semiColons": "always", + "trailingCommas": "onlyMultiLine", + "operatorPosition": "sameLine", + "nextControlFlowPosition": "sameLine", + "importDeclaration.forceMultiLine": "always", + "importDeclaration.sortNamedImports": "caseInsensitive" + }, + "json": { + "indentWidth": 2, + "trailingCommas": "never" + }, + "markdown": { + "textWrap": "maintain", + "unorderedListKind": "asterisks" + }, + "malva": { + "printWidth": 120, + "indentWidth": 2 + }, + "yaml": { + "printWidth": 120, + "indentWidth": 2 + }, + "plugins": [ + "https://plugins.dprint.dev/typescript-0.96.0.wasm", + "https://plugins.dprint.dev/json-0.21.3.wasm", + "https://plugins.dprint.dev/markdown-0.21.1.wasm", + "https://plugins.dprint.dev/g-plane/malva-v0.15.3.wasm", + "https://plugins.dprint.dev/g-plane/pretty_yaml-v0.6.0.wasm" + ] +} diff --git a/package.json b/package.json index 4666ff4..9c804d7 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,8 @@ "description": "This is a sample plugin for Siyuan (https://b3log.org/siyuan)", "main": ".src/index.js", "scripts": { + "format": "dprint fmt", + "format:check": "dprint check", "lint": "eslint . --fix --cache", "dev": "pnpm run dev:kernel & pnpm run dev:app", "dev:app": "webpack --config webpack.config.js --mode development", @@ -16,6 +18,7 @@ "author": "Vanessa", "license": "MIT", "devDependencies": { + "dprint": "latest", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "^10.0.1", "@typescript-eslint/eslint-plugin": "^8.59.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 39f3795..6cc8226 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: css-loader: specifier: ^7.1.4 version: 7.1.4(webpack@5.106.2) + dprint: + specifier: latest + version: 0.54.0 esbuild-loader: specifier: ^4.4.3 version: 4.4.3(webpack@5.106.2) @@ -78,6 +81,68 @@ packages: '@dop251/types-goja_nodejs-url@0.0.0-20260212111938-1f56ff5bcf14': resolution: {integrity: sha512-RyxfUr5u0WOO0dV2/BxV+zJ2QwUqnIoSwIoPQcGHakWp8elJ/nSU86pUB9gSO77e2XHWZYAZvNN5tXa9yOXJaA==} + '@dprint/darwin-arm64@0.54.0': + resolution: {integrity: sha512-yqRI4enH+BDp+4+ZsPVdZM5h873JK1lN7li9l9A5u4C4cvh1oEsiBWAzEPccRkJ2ctF8LgaizBSxO38sqEVYbw==} + cpu: [arm64] + os: [darwin] + + '@dprint/darwin-x64@0.54.0': + resolution: {integrity: sha512-W9BARpgHypcQwatg5mnHaCpX6pLX5dBxxiv+tZKruhOmq8MKYOrAYDXlceMuHSowmWREfUF5yL4SRgXDGI6WQw==} + cpu: [x64] + os: [darwin] + + '@dprint/linux-arm64-glibc@0.54.0': + resolution: {integrity: sha512-VhM7p70VFuNqxZMdiv1e+nMboPj/hMFlTIBWrRaX7+6VThs9mJr9+94wrUeXgfnfsyaEKSbRFa/dru1PINoSNw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@dprint/linux-arm64-musl@0.54.0': + resolution: {integrity: sha512-QS1A74Lv60/L9oemHCzbHgOLbV2smSJG5IxS5fjf8ZWetyUt918WDzIHBilz/+uiB+OlW2UVTsm952UG0YOrLw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@dprint/linux-loong64-glibc@0.54.0': + resolution: {integrity: sha512-8Myka2/0KbhuZnEKL6jagPXTgDKVpd/tfXDRa0oibUBgaqOSku6iRMzHGa/PhqHL+s14Gcp+/cIHz0zU3Tkgug==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@dprint/linux-loong64-musl@0.54.0': + resolution: {integrity: sha512-/AN3xCuMhC4PK7Pbj7/4zBuhFGr4m0OHV/5uGTfzpkKX/3+AXoyKl7PbT2VlNMGXAK0kuRThfjtx23gIwlWk7Q==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@dprint/linux-riscv64-glibc@0.54.0': + resolution: {integrity: sha512-Aw2vXzzwFDpPbXh6ajsSabVCkCc66C3hCyMKprR/IxYvFtjYX80nh1ox0c7iaw6c4HacHMRLGw7FUSXvomPaEQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@dprint/linux-x64-glibc@0.54.0': + resolution: {integrity: sha512-zZqj3wQELOX8n6QfT2uuWoMf64Wv0lMXNyam3btm+PKkg0P6a54TPL09Bs9XsViOdxgTcamsiQ7HlErt/LEjIA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@dprint/linux-x64-musl@0.54.0': + resolution: {integrity: sha512-it6Qdt06dyW2adbAXpOCb7/KQLxlm4i1UphUAWqWsZk4t3EYetyAza9J0g3Vu9itIWSEIo9MnccgANckQJ6+qw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@dprint/win32-arm64@0.54.0': + resolution: {integrity: sha512-F5kjV/6I9YtNOTDWHUpTqM2HHHS510BPL7z4NJuU0nDnaVeks7GwNEltGr56CcsG8XQYhkiAsqZytPu6AhA2hQ==} + cpu: [arm64] + os: [win32] + + '@dprint/win32-x64@0.54.0': + resolution: {integrity: sha512-AAr2ye/DtgYXDplRoPS+5U++x7T6W4a3I9FvTFWFxziFmUptvAg5G2c4FcXoAduSruhYZJvjDZrLseR2c3IwXg==} + cpu: [x64] + os: [win32] + '@esbuild/aix-ppc64@0.27.7': resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} @@ -672,6 +737,10 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + dprint@0.54.0: + resolution: {integrity: sha512-sIy25poR2gRP/tWPTgP0MPeJoJcpv0xzYDcsboapvthbEt1Qw3Al252CA0xFyIh2cYEGGKyBJtKokryv4ERlJw==} + hasBin: true + electron-to-chromium@1.5.352: resolution: {integrity: sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==} @@ -1347,6 +1416,39 @@ snapshots: dependencies: '@dop251/types-goja_nodejs-global': 0.0.0-20260212111938-1f56ff5bcf14 + '@dprint/darwin-arm64@0.54.0': + optional: true + + '@dprint/darwin-x64@0.54.0': + optional: true + + '@dprint/linux-arm64-glibc@0.54.0': + optional: true + + '@dprint/linux-arm64-musl@0.54.0': + optional: true + + '@dprint/linux-loong64-glibc@0.54.0': + optional: true + + '@dprint/linux-loong64-musl@0.54.0': + optional: true + + '@dprint/linux-riscv64-glibc@0.54.0': + optional: true + + '@dprint/linux-x64-glibc@0.54.0': + optional: true + + '@dprint/linux-x64-musl@0.54.0': + optional: true + + '@dprint/win32-arm64@0.54.0': + optional: true + + '@dprint/win32-x64@0.54.0': + optional: true + '@esbuild/aix-ppc64@0.27.7': optional: true @@ -1885,6 +1987,20 @@ snapshots: detect-libc@2.1.2: optional: true + dprint@0.54.0: + optionalDependencies: + '@dprint/darwin-arm64': 0.54.0 + '@dprint/darwin-x64': 0.54.0 + '@dprint/linux-arm64-glibc': 0.54.0 + '@dprint/linux-arm64-musl': 0.54.0 + '@dprint/linux-loong64-glibc': 0.54.0 + '@dprint/linux-loong64-musl': 0.54.0 + '@dprint/linux-riscv64-glibc': 0.54.0 + '@dprint/linux-x64-glibc': 0.54.0 + '@dprint/linux-x64-musl': 0.54.0 + '@dprint/win32-arm64': 0.54.0 + '@dprint/win32-x64': 0.54.0 + electron-to-chromium@1.5.352: {} emojis-list@3.0.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f588aaa..47cf251 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ allowBuilds: '@parcel/watcher': false + dprint: true esbuild: false From 60120ceeb71c39b10af86026e5605e4b2e8d5269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yingyi=20/=20=E9=A2=96=E9=80=B8?= <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Mon, 11 May 2026 19:33:12 +0800 Subject: [PATCH 08/15] style(dprint): Format code, docs and config tweaks Apply non-functional formatting and documentation fixes across the repo. Changes include: tidy Markdown tables and examples in docs/superpowers, adjust dprint.json formatting rules (lineWidth -> 120; importDeclaration rules), restructure and reformat eslint.config.mjs, minor pnpm-workspace quoting change, whitespace/commas and template formatting in src/index.ts, multiline handler formatting in src/kernel.ts, small tsconfig spacing fix, and clean up plugin-related blocks in webpack.config.js. These are style/docs/config updates only and do not alter runtime behavior. --- CHANGELOG.md | 2 +- .../plans/2026-05-09-kernel-plugin-demo.md | 159 ++++++++------ .../2026-05-09-kernel-plugin-demo-design.md | 88 ++++---- dprint.json | 6 +- eslint.config.mjs | 80 +++---- pnpm-workspace.yaml | 2 +- src/index.ts | 198 +++++++++--------- src/kernel.ts | 50 +++-- tsconfig.json | 2 +- webpack.config.js | 68 +++--- webpack.kernel.config.js | 2 +- 11 files changed, 363 insertions(+), 294 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39bb7ce..49f4c77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -148,7 +148,7 @@ ## v0.1.9 -* [Add `open-menu-xxx` event bus for plugins ](https://github.com/siyuan-note/siyuan/issues/8617) +* [Add `open-menu-xxx` event bus for plugins](https://github.com/siyuan-note/siyuan/issues/8617) ## v0.1.8 diff --git a/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md b/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md index a067677..9de48a8 100644 --- a/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md +++ b/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md @@ -14,30 +14,31 @@ ## File Map -| File | Action | Responsibility | -|---|---|---| -| `petal/kernel.d.ts` | Modify lines 880–927 | Add `IEsServerPort`, `IServerWsRequest`, `IServerEsRequest`; extend `IServerRequestHandler` generic; update `IServerScope.ws`/`.es` | -| `plugin-sample/node_modules/.pnpm/siyuan@1.2.2-alpha.0/node_modules/siyuan/kernel.d.ts` | Overwrite | Keep installed package in sync with `petal/kernel.d.ts` so TypeScript picks up new types locally | -| `plugin-sample/src/kernel.ts` | Rewrite | Full `KernelPlugin` class with TSDoc | +| File | Action | Responsibility | +| --------------------------------------------------------------------------------------- | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| `petal/kernel.d.ts` | Modify lines 880–927 | Add `IEsServerPort`, `IServerWsRequest`, `IServerEsRequest`; extend `IServerRequestHandler` generic; update `IServerScope.ws`/`.es` | +| `plugin-sample/node_modules/.pnpm/siyuan@1.2.2-alpha.0/node_modules/siyuan/kernel.d.ts` | Overwrite | Keep installed package in sync with `petal/kernel.d.ts` so TypeScript picks up new types locally | +| `plugin-sample/src/kernel.ts` | Rewrite | Full `KernelPlugin` class with TSDoc | --- ## Task 1: Extend `petal/kernel.d.ts` with server-side port types **Files:** -- Modify: `petal/kernel.d.ts:880–927` + +* Modify: `petal/kernel.d.ts:880–927` ### Background `IServerRequestHandler` currently hard-codes `IServerRequest` as the handler argument. WS and SSE server handlers receive an augmented request with a `port` property — so we need: -- `IEsServerPort` — SSE server-side port (onopen/onclose/send/close) -- `IServerWsRequest extends IServerRequest` — adds `port: IWebSocket` -- `IServerEsRequest extends IServerRequest` — adds `port: IEsServerPort` -- `IServerRequestHandler` — second generic (default preserves backward compat); `handler` field uses `TReq` -- `IServerScope.ws` → `IServerRequestHandler`, `.es` → `IServerRequestHandler` +* `IEsServerPort` — SSE server-side port (onopen/onclose/send/close) +* `IServerWsRequest extends IServerRequest` — adds `port: IWebSocket` +* `IServerEsRequest extends IServerRequest` — adds `port: IEsServerPort` +* `IServerRequestHandler` — second generic (default preserves backward compat); `handler` field uses `TReq` +* `IServerScope.ws` → `IServerRequestHandler`, `.es` → `IServerRequestHandler` -- [ ] **Step 1: Insert new interfaces before `IServerRequestHandler`** +* [ ] **Step 1: Insert new interfaces before `IServerRequestHandler`** Open `petal/kernel.d.ts`. Find the comment `// ── Server handler interfaces ─────────────────────────────────────────────────` (line ~879). Insert the following block immediately before the `IServerRequestHandler` interface (i.e. before line 882): @@ -117,10 +118,9 @@ */ readonly port: IEsServerPort; } - ``` -- [ ] **Step 2: Replace `IServerRequestHandler` with the generic version** +* [ ] **Step 2: Replace `IServerRequestHandler` with the generic version** Replace the existing `IServerRequestHandler` interface (lines 882–899 approx): @@ -168,7 +168,7 @@ } ``` -- [ ] **Step 3: Update `IServerScope.ws` and `.es`** +* [ ] **Step 3: Update `IServerScope.ws` and `.es`** Replace the `IServerScope` interface body (the `ws` and `es` readonly properties and their doc blocks). The `http` property is unchanged. @@ -212,7 +212,7 @@ readonly es: IServerRequestHandler; ``` -- [ ] **Step 4: Sync installed package** +* [ ] **Step 4: Sync installed package** Copy the updated file so TypeScript in `plugin-sample` picks up the changes. Run from the `plugin-sample` root (both repos are siblings): @@ -222,7 +222,7 @@ node_modules/.pnpm/siyuan@1.2.2-alpha.0/node_modules/siyuan/kernel.d.ts ``` -- [ ] **Step 5: Commit `petal/kernel.d.ts`** +* [ ] **Step 5: Commit `petal/kernel.d.ts`** ```bash cd ../petal @@ -235,15 +235,16 @@ ## Task 2: Implement `plugin-sample/src/kernel.ts` **Files:** -- Modify: `plugin-sample/src/kernel.ts` (currently a one-line stub) + +* Modify: `plugin-sample/src/kernel.ts` (currently a one-line stub) The full file content is specified below. Each method covers one or more API namespaces as documented in the spec. All type annotations reference interfaces from `petal/kernel.d.ts` via `/// `. -- [ ] **Step 1: Write the full file** +* [ ] **Step 1: Write the full file** Replace the entire contents of `plugin-sample/src/kernel.ts` with: - ```typescript + ````typescript /// /** @@ -283,18 +284,18 @@ The full file content is specified below. Each method covers one or more API nam constructor() { // Wire lifecycle hooks - this.siyuan.plugin.lifecycle.onload = this.onload.bind(this); - this.siyuan.plugin.lifecycle.onloaded = this.onloaded.bind(this); + this.siyuan.plugin.lifecycle.onload = this.onload.bind(this); + this.siyuan.plugin.lifecycle.onloaded = this.onloaded.bind(this); this.siyuan.plugin.lifecycle.onrunning = this.onrunning.bind(this); - this.siyuan.plugin.lifecycle.onunload = this.onunload.bind(this); + this.siyuan.plugin.lifecycle.onunload = this.onunload.bind(this); // Wire the inbound kernel event handler this.siyuan.event.handler = this.eventHandler.bind(this); // Wire server-side request handlers (private scope: /plugin/private//*) this.siyuan.server.private.http.handler = this.httpHandler.bind(this); - this.siyuan.server.private.ws.handler = this.wsHandler.bind(this); - this.siyuan.server.private.es.handler = this.esHandler.bind(this); + this.siyuan.server.private.ws.handler = this.wsHandler.bind(this); + this.siyuan.server.private.es.handler = this.esHandler.bind(this); } // ── Lifecycle ───────────────────────────────────────────────────────────── @@ -321,16 +322,16 @@ The full file content is specified below. Each method covers one or more API nam // ── siyuan.logger (all five levels) ─────────────────────────────────── // Unlike console.*, each call returns a Promise and serialises args as JSON. - await logger.trace("onload: plugin name =", plugin.name); - await logger.debug("onload: version =", plugin.version); - await logger.info( "onload: platform =", plugin.platform); - await logger.warn( "onload: i18n keys =", Object.keys(plugin.i18n)); + await logger.trace("onload: plugin name =", plugin.name); + await logger.debug("onload: version =", plugin.version); + await logger.info("onload: platform =", plugin.platform); + await logger.warn("onload: i18n keys =", Object.keys(plugin.i18n)); await logger.error("onload: (error-level demo — not a real error)"); // ── console.* (synchronous, Node.js util.format, 3 levels) ──────────── // Routed to the kernel log at INFO/WARN/ERROR. No await needed. - console.log( "onload: console.log (sync, util.format)"); - console.warn( "onload: console.warn"); + console.log("onload: console.log (sync, util.format)"); + console.warn("onload: console.warn"); console.error("onload: console.error"); // ── siyuan.rpc ──────────────────────────────────────────────────────── @@ -351,10 +352,10 @@ The full file content is specified below. Each method covers one or more API nam // get: returns IDataObject — a lazy accessor; call each decoder at most once const obj = await storage.get("demo.txt"); - await logger.debug("storage.get → text():", await obj.text()); + await logger.debug("storage.get → text():", await obj.text()); const obj2 = await storage.get("demo.txt"); - await logger.debug("storage.get → json():", await obj2.json()); + await logger.debug("storage.get → json():", await obj2.json()); const obj3 = await storage.get("demo.txt"); await logger.debug("storage.get → arrayBuffer():", await obj3.arrayBuffer()); @@ -394,10 +395,10 @@ The full file content is specified below. Each method covers one or more API nam body: "{}", }); - await logger.debug("onloaded: resp.ok =", resp.ok); - await logger.debug("onloaded: resp.status =", resp.status); + await logger.debug("onloaded: resp.ok =", resp.ok); + await logger.debug("onloaded: resp.status =", resp.status); await logger.debug("onloaded: resp.statusText =", resp.statusText); - await logger.debug("onloaded: resp.headers =", resp.headers); + await logger.debug("onloaded: resp.headers =", resp.headers); await logger.debug("onloaded: listLoadedPlugins =", await resp.json()); } @@ -438,9 +439,9 @@ The full file content is specified below. Each method covers one or more API nam // body must be a string — stringify the JSON-RPC payload body: JSON.stringify({ jsonrpc: "2.0", - method: "echo", - params: ["hello from onrunning", 42, { key: true }], - id: 1, + method: "echo", + params: ["hello from onrunning", 42, { key: true }], + id: 1, }), }, ); @@ -456,28 +457,46 @@ The full file content is specified below. Each method covers one or more API nam // Send a JSON-RPC request over the WebSocket connection await this.ws!.send(JSON.stringify({ jsonrpc: "2.0", - method: "echo", - params: { message: "hello via WebSocket", ts: Date.now() }, - id: 2, + method: "echo", + params: { message: "hello via WebSocket", ts: Date.now() }, + id: 2, })); // Demonstrate ping/pong control frames await this.ws!.ping("ping from plugin"); }; - this.ws.onmessage = async (event) => { await logger.debug("ws client: message", event); }; - this.ws.onping = async (event) => { await logger.debug("ws client: ping", event); }; - this.ws.onpong = async (event) => { await logger.debug("ws client: pong", event); }; - this.ws.onerror = async (event) => { await logger.debug("ws client: error", event); }; - this.ws.onclose = async (event) => { await logger.debug("ws client: close", event); }; + this.ws.onmessage = async (event) => { + await logger.debug("ws client: message", event); + }; + this.ws.onping = async (event) => { + await logger.debug("ws client: ping", event); + }; + this.ws.onpong = async (event) => { + await logger.debug("ws client: pong", event); + }; + this.ws.onerror = async (event) => { + await logger.debug("ws client: error", event); + }; + this.ws.onclose = async (event) => { + await logger.debug("ws client: close", event); + }; // Initiate the connection after wiring all callbacks await this.ws.open(); // ── SSE / EventSource client ────────────────────────────────────────── this.es = await client.event("/es/broadcast/subscribe"); - this.es.onopen = async (e) => { await logger.debug("es client: open", e); }; - this.es.onmessage = async (e) => { await logger.debug("es client: message", e); }; - this.es.onclose = async (e) => { await logger.debug("es client: close", e); }; - this.es.onerror = async (e) => { await logger.debug("es client: error", e); }; + this.es.onopen = async (e) => { + await logger.debug("es client: open", e); + }; + this.es.onmessage = async (e) => { + await logger.debug("es client: message", e); + }; + this.es.onclose = async (e) => { + await logger.debug("es client: close", e); + }; + this.es.onerror = async (e) => { + await logger.debug("es client: error", e); + }; } /** @@ -531,8 +550,8 @@ The full file content is specified below. Each method covers one or more API nam // Re-publish the event under the "plugin" topic await eventApi.emit("plugin", { - id: event.id, - type: "echo", + id: event.id, + type: "echo", detail: event, }); } @@ -569,11 +588,11 @@ The full file content is specified below. Each method covers one or more API nam data: { type: "JSON", data: { - path: request.url.path, - method: request.request.method, + path: request.url.path, + method: request.request.method, contentType: request.request.contentType, - query: request.url.query, - params: request.context.params, + query: request.url.query, + params: request.context.params, }, }, }, @@ -616,9 +635,15 @@ The full file content is specified below. Each method covers one or more API nam // Reply with a pong carrying the same application data await request.port.pong(event.data); }; - request.port.onpong = async (event) => { await logger.debug("ws server: pong", event); }; - request.port.onclose = async (event) => { await logger.debug("ws server: close", event); }; - request.port.onerror = async (event) => { await logger.debug("ws server: error", event); }; + request.port.onpong = async (event) => { + await logger.debug("ws server: pong", event); + }; + request.port.onclose = async (event) => { + await logger.debug("ws server: close", event); + }; + request.port.onerror = async (event) => { + await logger.debug("ws server: error", event); + }; // port.open() is optional — the kernel auto-opens after this handler returns. } @@ -645,7 +670,7 @@ The full file content is specified below. Each method covers one or more API nam await logger.debug("sse server: port open", event); // send is synchronous; eventType becomes the SSE `event:` field request.port.send("message", "Connected to plugin SSE!"); - request.port.send("update", JSON.stringify({ ts: Date.now() })); + request.port.send("update", JSON.stringify({ ts: Date.now() })); }; request.port.onclose = async (event) => { await logger.debug("sse server: port close", event); @@ -654,9 +679,9 @@ The full file content is specified below. Each method covers one or more API nam } new KernelPlugin(); - ``` + ```` -- [ ] **Step 2: Verify TypeScript types** +* [ ] **Step 2: Verify TypeScript types** The project uses `esbuild-loader` which strips types without checking them — `npm run build` will succeed even if types are wrong. Use `tsc --noEmit` to actually type-check. Run from the `plugin-sample` root: @@ -667,7 +692,7 @@ The full file content is specified below. Each method covers one or more API nam Expected: no output (zero errors). Fix any reported errors before proceeding. -- [ ] **Step 3: Build the production bundle** +* [ ] **Step 3: Build the production bundle** ```bash npm run build 2>&1 | tail -20 @@ -675,7 +700,7 @@ The full file content is specified below. Each method covers one or more API nam Expected: webpack exits with code 0. The build produces `dist/kernel.js`. -- [ ] **Step 4: Commit `plugin-sample/src/kernel.ts`** +* [ ] **Step 4: Commit `plugin-sample/src/kernel.ts`** ```bash git add src/kernel.ts @@ -688,7 +713,7 @@ The full file content is specified below. Each method covers one or more API nam The webpack build outputs `kernel.js` in CommonJS2 format. The goja runtime in the kernel loads it as a CommonJS module. -- [ ] **Step 1: Confirm `siyuan` is the only external `require` call** +* [ ] **Step 1: Confirm `siyuan` is the only external `require` call** `webpack.config.js` declares `siyuan` as an external, so `require("siyuan")` will appear in the bundle — that is expected and intentional. Any other `require("")` would indicate an accidental import of a module the goja runtime cannot resolve. Run from the `plugin-sample` root: @@ -699,7 +724,7 @@ The webpack build outputs `kernel.js` in CommonJS2 format. The goja runtime in t Expected output: exactly `require("siyuan")` (the external stub). Any additional package name is a bug — investigate and remove the offending import. -- [ ] **Step 2: Confirm file size is reasonable** +* [ ] **Step 2: Confirm file size is reasonable** ```bash wc -c dist/kernel.js diff --git a/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md b/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md index 654a16a..2900c67 100644 --- a/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md +++ b/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md @@ -1,7 +1,7 @@ # Kernel Plugin Demo — Design Spec -**Date:** 2026-05-09 -**Status:** Approved +**Date:** 2026-05-09\ +**Status:** Approved\ **Scope:** `plugin-sample/src/kernel.ts` + `petal/kernel.d.ts` --- @@ -44,13 +44,13 @@ new KernelPlugin(); The current `IServerRequestHandler` hard-codes `IServerRequest` as the handler argument. WS and SSE server handlers receive an augmented request that also carries a `port` back-channel to the connected client. The following additions are required (all backward-compatible): -| Addition | Purpose | -|---|---| -| `IEsServerPort` | Server-side SSE port: `onopen`, `onclose`, `send(eventType: string, data: string): void` (synchronous — no `await` needed), `close(): void` | -| `IServerWsRequest extends IServerRequest` | Adds `port: IWebSocket` for WS server handlers | -| `IServerEsRequest extends IServerRequest` | Adds `port: IEsServerPort` for SSE server handlers | +| Addition | Purpose | +| --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `IEsServerPort` | Server-side SSE port: `onopen`, `onclose`, `send(eventType: string, data: string): void` (synchronous — no `await` needed), `close(): void` | +| `IServerWsRequest extends IServerRequest` | Adds `port: IWebSocket` for WS server handlers | +| `IServerEsRequest extends IServerRequest` | Adds `port: IEsServerPort` for SSE server handlers | | `IServerRequestHandler` | Second type param (default = `IServerRequest`) — backward-compatible. The `handler` field body is updated to `((request: TReq) => TRes \| Promise) \| null` so the type parameter is actually applied to the handler argument | -| `IServerScope.ws` / `.es` updated | `IServerRequestHandler` / `IServerRequestHandler` | +| `IServerScope.ws` / `.es` updated | `IServerRequestHandler` / `IServerRequestHandler` | --- @@ -58,16 +58,16 @@ The current `IServerRequestHandler` hard-codes `IServerRequest` as the han Every public API on `globalThis.siyuan` is exercised: -| Namespace | Demonstrated | -|---|---| -| `siyuan.plugin` | `name`, `version`, `platform`, `i18n`; all four lifecycle hooks | -| `siyuan.logger` | All five levels: `trace`, `debug`, `info`, `warn`, `error` | -| `console` | Sync logging; note difference vs `siyuan.logger` (sync, 3 levels, `util.format`) | -| `siyuan.storage` | `put`, `get` → `.text()` / `.json()` / `.arrayBuffer()`, `list`, `remove` | -| `siyuan.rpc` | `bind` (with description), `unbind`, `broadcast` | -| `siyuan.client` | `fetch` (HTTP RPC loopback), `socket` (WS client), `event` (SSE client) | -| `siyuan.event` | `handler` (receive), `emit` (publish) | -| `siyuan.server` | `private.http.handler`, `private.ws.handler`, `private.es.handler` | +| Namespace | Demonstrated | +| ---------------- | -------------------------------------------------------------------------------- | +| `siyuan.plugin` | `name`, `version`, `platform`, `i18n`; all four lifecycle hooks | +| `siyuan.logger` | All five levels: `trace`, `debug`, `info`, `warn`, `error` | +| `console` | Sync logging; note difference vs `siyuan.logger` (sync, 3 levels, `util.format`) | +| `siyuan.storage` | `put`, `get` → `.text()` / `.json()` / `.arrayBuffer()`, `list`, `remove` | +| `siyuan.rpc` | `bind` (with description), `unbind`, `broadcast` | +| `siyuan.client` | `fetch` (HTTP RPC loopback), `socket` (WS client), `event` (SSE client) | +| `siyuan.event` | `handler` (receive), `emit` (publish) | +| `siyuan.server` | `private.http.handler`, `private.ws.handler`, `private.es.handler` | --- @@ -76,9 +76,10 @@ Every public API on `globalThis.siyuan` is exercised: ### Method-level TSDoc blocks Every method gets a TSDoc block with: -- Summary line describing which API/feature it demonstrates -- `@remarks` for behavioral constraints (e.g. lifecycle state semantics, when RPC calls are accepted) -- `@example` snippet for non-obvious usage patterns (e.g. `ws.open()` must be called explicitly) + +* Summary line describing which API/feature it demonstrates +* `@remarks` for behavioral constraints (e.g. lifecycle state semantics, when RPC calls are accepted) +* `@example` snippet for non-obvious usage patterns (e.g. `ws.open()` must be called explicitly) Example: @@ -107,40 +108,41 @@ await this.ws.open(); ### Class-level TSDoc `KernelPlugin` gets a full class-level doc block explaining: -- purpose (living reference for the kernel plugin API) -- lifecycle state diagram reference -- how to update the file when new APIs are added + +* purpose (living reference for the kernel plugin API) +* lifecycle state diagram reference +* how to update the file when new APIs are added --- ## Type Usage -| Location | Type | -|---|---| -| `this.siyuan` field | `ISiyuan` | -| `this.ws` field | `IWebSocket \| null` | -| `this.es` field | `IEventSource \| null` | -| `onload` / `onloaded` / `onrunning` / `onunload` | `() => Promise` | -| `eventHandler` param | `IEventMessage` | -| `httpHandler` param | `IServerRequest` | -| `httpHandler` return | `IHttpResponse` | -| `wsHandler` param | `IServerWsRequest` | -| `esHandler` param | `IServerEsRequest` | -| `any` | Only where the underlying API type is already `any` (e.g. `IEventMessage.detail`, `IRpc.bind` fn args) | +| Location | Type | +| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | +| `this.siyuan` field | `ISiyuan` | +| `this.ws` field | `IWebSocket \| null` | +| `this.es` field | `IEventSource \| null` | +| `onload` / `onloaded` / `onrunning` / `onunload` | `() => Promise` | +| `eventHandler` param | `IEventMessage` | +| `httpHandler` param | `IServerRequest` | +| `httpHandler` return | `IHttpResponse` | +| `wsHandler` param | `IServerWsRequest` | +| `esHandler` param | `IServerEsRequest` | +| `any` | Only where the underlying API type is already `any` (e.g. `IEventMessage.detail`, `IRpc.bind` fn args) | --- ## Files Changed -| File | Change | -|---|---| -| `plugin-sample/src/kernel.ts` | Full implementation (was a one-line stub) | -| `petal/kernel.d.ts` | Add `IEsServerPort`, `IServerWsRequest`, `IServerEsRequest`; extend `IServerRequestHandler` generic; update `IServerScope` | +| File | Change | +| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------- | +| `plugin-sample/src/kernel.ts` | Full implementation (was a one-line stub) | +| `petal/kernel.d.ts` | Add `IEsServerPort`, `IServerWsRequest`, `IServerEsRequest`; extend `IServerRequestHandler` generic; update `IServerScope` | --- ## Out of Scope -- No changes to `src/index.ts`, `plugin.json`, `webpack.config.js`, or any other file -- No new dependencies -- No unit tests (kernel plugin runs inside goja; tested by loading in a live SiYuan instance) +* No changes to `src/index.ts`, `plugin.json`, `webpack.config.js`, or any other file +* No new dependencies +* No unit tests (kernel plugin runs inside goja; tested by loading in a live SiYuan instance) diff --git a/dprint.json b/dprint.json index 1912c32..5664525 100644 --- a/dprint.json +++ b/dprint.json @@ -1,6 +1,6 @@ { "$schema": "https://dprint.dev/schemas/v0.json", - "lineWidth": 180, + "lineWidth": 120, "indentWidth": 4, "useTabs": false, "newLineKind": "lf", @@ -26,8 +26,8 @@ "trailingCommas": "onlyMultiLine", "operatorPosition": "sameLine", "nextControlFlowPosition": "sameLine", - "importDeclaration.forceMultiLine": "always", - "importDeclaration.sortNamedImports": "caseInsensitive" + "importDeclaration.forceMultiLine": "whenMultiple", + "importDeclaration.sortNamedImports": "maintain" }, "json": { "indentWidth": 2, diff --git a/eslint.config.mjs b/eslint.config.mjs index eabe866..807c75b 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,54 +1,58 @@ +import { FlatCompat } from "@eslint/eslintrc"; +import js from "@eslint/js"; import typescriptEslint from "@typescript-eslint/eslint-plugin"; -import globals from "globals"; import tsParser from "@typescript-eslint/parser"; +import globals from "globals"; import path from "node:path"; -import {fileURLToPath} from "node:url"; -import js from "@eslint/js"; -import {FlatCompat} from "@eslint/eslintrc"; +import { fileURLToPath } from "node:url"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const compat = new FlatCompat({ baseDirectory: __dirname, recommendedConfig: js.configs.recommended, - allConfig: js.configs.all + allConfig: js.configs.all, }); -export default [{ - ignores: [ - "dist", - "node_modules", - "index.js", - ], -}, ...compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended"), { - plugins: { - "@typescript-eslint": typescriptEslint, +export default [ + { + ignores: [ + "dist", + "node_modules", + "index.js", + ], }, - - languageOptions: { - globals: { - ...globals.node, - ...globals.browser, + ...compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended"), + { + plugins: { + "@typescript-eslint": typescriptEslint, }, - parser: tsParser, - }, + languageOptions: { + globals: { + ...globals.node, + ...globals.browser, + }, + + parser: tsParser, + }, - rules: { - semi: [2, "always"], - quotes: [2, "double", { - avoidEscape: true, - }], - "@typescript-eslint/no-unused-vars": ["warn", {caughtErrors: "none"}], - "no-async-promise-executor": "off", - "no-prototype-builtins": "off", - "no-useless-escape": "off", - "no-irregular-whitespace": "off", - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-var-requires": "off", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-require-imports": "off", + rules: { + semi: [2, "always"], + quotes: [2, "double", { + avoidEscape: true, + }], + "@typescript-eslint/no-unused-vars": ["warn", { caughtErrors: "none" }], + "no-async-promise-executor": "off", + "no-prototype-builtins": "off", + "no-useless-escape": "off", + "no-irregular-whitespace": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-require-imports": "off", + }, }, -}]; +]; diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 47cf251..7b8c789 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,4 @@ allowBuilds: - '@parcel/watcher': false + "@parcel/watcher": false dprint: true esbuild: false diff --git a/src/index.ts b/src/index.ts index bbe0ada..3d28b30 100644 --- a/src/index.ts +++ b/src/index.ts @@ -27,7 +27,7 @@ import { openSetting, openAttributePanel, saveLayout, - IMenuItem + IMenuItem, } from "siyuan"; import "./index.scss"; @@ -36,7 +36,6 @@ const TAB_TYPE = "custom_tab"; const DOCK_TYPE = "dock_tab"; export default class PluginSample extends Plugin { - private custom: () => Custom; private isMobile: boolean; private blockIconEventBindThis = this.blockIconEvent.bind(this); @@ -51,7 +50,7 @@ export default class PluginSample extends Plugin { tip: this.i18n.insertEmoji, click(protyle: Protyle) { protyle.insert("😊"); - } + }, }); return toolbar; } @@ -79,7 +78,7 @@ export default class PluginSample extends Plugin { }, destroy() { console.log("destroy tab:", TAB_TYPE); - } + }, }); this.addCommand({ @@ -106,7 +105,7 @@ export default class PluginSample extends Plugin { hotkey: "⌥⌘W", }, data: { - text: "This is my custom dock" + text: "This is my custom dock", }, type: DOCK_TYPE, resize() { @@ -132,7 +131,9 @@ export default class PluginSample extends Plugin { Custom Dock - +
${dock.data.text} @@ -142,7 +143,7 @@ export default class PluginSample extends Plugin { }, destroy() { console.log("destroy dock:", DOCK_TYPE); - } + }, }); const textareaElement = document.createElement("textarea"); @@ -151,7 +152,7 @@ export default class PluginSample extends Plugin { this.saveData(STORAGE_NAME, { readonlyText: textareaElement.value }).catch(e => { showMessage(`[${this.name}] save data [${STORAGE_NAME}] fail: `, e); }); - } + }, }); this.setting.addItem({ title: "Readonly text", @@ -178,15 +179,17 @@ export default class PluginSample extends Plugin { this.protyleSlash = [{ filter: ["insert emoji 😊", "插入表情 😊", "crbqwx"], - html: `
${this.i18n.insertEmoji}😊
`, + html: + `
${this.i18n.insertEmoji}😊
`, id: "insertEmoji", callback(protyle: Protyle) { protyle.insert("😊"); - } + }, }]; this.protyleOptions = { - toolbar: ["block-ref", + toolbar: [ + "block-ref", "a", "|", "text", @@ -229,7 +232,7 @@ export default class PluginSample extends Plugin { } this.addMenu(rect); } - } + }, }); const statusIconTemp = document.createElement("template"); statusIconTemp.innerHTML = `
@@ -336,18 +339,18 @@ export default class PluginSample extends Plugin { click: () => { const doOperations: IOperation[] = []; detail.blockElements.forEach((item: HTMLElement) => { - const editElement = item.querySelector('[contenteditable="true"]'); + const editElement = item.querySelector("[contenteditable=\"true\"]"); if (editElement) { editElement.textContent = editElement.textContent.replace(/ /g, ""); doOperations.push({ id: item.dataset.nodeId, data: item.outerHTML, - action: "update" + action: "update", }); } }); detail.protyle.getInstance().transaction(doOperations); - } + }, }); } @@ -389,7 +392,7 @@ export default class PluginSample extends Plugin { label: "Open Setting", click: () => { openSetting(this.app); - } + }, }); menu.addItem({ icon: "iconDrag", @@ -400,7 +403,7 @@ export default class PluginSample extends Plugin { protyle: this.getEditor().protyle, focusName: "custom", }); - } + }, }); menu.addItem({ icon: "iconInfo", @@ -408,14 +411,17 @@ export default class PluginSample extends Plugin { accelerator: this.commands[0].customHotkey, click: () => { this.showDialog(); - } + }, }); menu.addItem({ icon: "iconFocus", label: "Select Opened Doc(open doc first)", click: () => { - (getModelByDockType("file") as Files).selectItem(this.getEditor().protyle.notebookId, this.getEditor().protyle.path); - } + (getModelByDockType("file") as Files).selectItem( + this.getEditor().protyle.notebookId, + this.getEditor().protyle.path, + ); + }, }); if (!this.isMobile) { menu.addItem({ @@ -430,11 +436,11 @@ export default class PluginSample extends Plugin { data: { text: platformUtils.isHuawei() ? "Hello, Huawei!" : "This is my custom tab", }, - id: this.name + TAB_TYPE + id: this.name + TAB_TYPE, }, }); console.log(tab); - } + }, }); menu.addItem({ icon: "iconImage", @@ -443,11 +449,11 @@ export default class PluginSample extends Plugin { const tab = openTab({ app: this.app, asset: { - path: "assets/paragraph-20210512165953-ag1nib4.svg" - } + path: "assets/paragraph-20210512165953-ag1nib4.svg", + }, }); console.log(tab); - } + }, }); menu.addItem({ icon: "iconFile", @@ -457,10 +463,10 @@ export default class PluginSample extends Plugin { app: this.app, doc: { id: this.getEditor().protyle.block.rootID, - } + }, }); console.log(tab); - } + }, }); menu.addItem({ icon: "iconSearch", @@ -469,11 +475,11 @@ export default class PluginSample extends Plugin { const tab = openTab({ app: this.app, search: { - k: "SiYuan" - } + k: "SiYuan", + }, }); console.log(tab); - } + }, }); menu.addItem({ icon: "iconRiffCard", @@ -482,11 +488,11 @@ export default class PluginSample extends Plugin { const tab = openTab({ app: this.app, card: { - type: "all" - } + type: "all", + }, }); console.log(tab); - } + }, }); menu.addItem({ icon: "iconLayout", @@ -496,18 +502,18 @@ export default class PluginSample extends Plugin { refDefs: [{ refID: this.getEditor().protyle.block.rootID }], x: window.innerWidth - 768 - 120, y: 32, - isBacklink: false + isBacklink: false, }); - } + }, }); menu.addItem({ icon: "iconOpenWindow", label: "Open Doc Window(open doc first)", click: () => { openWindow({ - doc: { id: this.getEditor().protyle.block.rootID } + doc: { id: this.getEditor().protyle.block.rootID }, }); - } + }, }); } else { menu.addItem({ @@ -515,7 +521,7 @@ export default class PluginSample extends Plugin { label: "Open Doc(open doc first)", click: () => { openMobileFileById(this.app, this.getEditor().protyle.block.rootID); - } + }, }); } menu.addItem({ @@ -523,14 +529,14 @@ export default class PluginSample extends Plugin { label: "Lockscreen", click: () => { lockScreen(this.app); - } + }, }); menu.addItem({ icon: "iconQuit", label: "Exit Application", click: () => { exitSiYuan(); - } + }, }); menu.addItem({ icon: "iconDownload", @@ -539,7 +545,7 @@ export default class PluginSample extends Plugin { saveLayout(() => { showMessage("Layout saved"); }); - } + }, }); menu.addItem({ icon: "iconScrollHoriz", @@ -550,326 +556,326 @@ export default class PluginSample extends Plugin { label: "On ws-main", click: () => { this.eventBus.on("ws-main", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off ws-main", click: () => { this.eventBus.off("ws-main", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On click-blockicon", click: () => { this.eventBus.on("click-blockicon", this.blockIconEventBindThis); - } + }, }, { icon: "iconClose", label: "Off click-blockicon", click: () => { this.eventBus.off("click-blockicon", this.blockIconEventBindThis); - } + }, }, { icon: "iconSelect", label: "On click-pdf", click: () => { this.eventBus.on("click-pdf", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off click-pdf", click: () => { this.eventBus.off("click-pdf", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On click-editorcontent", click: () => { this.eventBus.on("click-editorcontent", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off click-editorcontent", click: () => { this.eventBus.off("click-editorcontent", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On click-editortitleicon", click: () => { this.eventBus.on("click-editortitleicon", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off click-editortitleicon", click: () => { this.eventBus.off("click-editortitleicon", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On click-flashcard-action", click: () => { this.eventBus.on("click-flashcard-action", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off click-flashcard-action", click: () => { this.eventBus.off("click-flashcard-action", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On open-noneditableblock", click: () => { this.eventBus.on("open-noneditableblock", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off open-noneditableblock", click: () => { this.eventBus.off("open-noneditableblock", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On loaded-protyle-static", click: () => { this.eventBus.on("loaded-protyle-static", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off loaded-protyle-static", click: () => { this.eventBus.off("loaded-protyle-static", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On loaded-protyle-dynamic", click: () => { this.eventBus.on("loaded-protyle-dynamic", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off loaded-protyle-dynamic", click: () => { this.eventBus.off("loaded-protyle-dynamic", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On switch-protyle", click: () => { this.eventBus.on("switch-protyle", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off switch-protyle", click: () => { this.eventBus.off("switch-protyle", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On destroy-protyle", click: () => { this.eventBus.on("destroy-protyle", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off destroy-protyle", click: () => { this.eventBus.off("destroy-protyle", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On open-menu-doctree", click: () => { this.eventBus.on("open-menu-doctree", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off open-menu-doctree", click: () => { this.eventBus.off("open-menu-doctree", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On open-menu-blockref", click: () => { this.eventBus.on("open-menu-blockref", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off open-menu-blockref", click: () => { this.eventBus.off("open-menu-blockref", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On open-menu-fileannotationref", click: () => { this.eventBus.on("open-menu-fileannotationref", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off open-menu-fileannotationref", click: () => { this.eventBus.off("open-menu-fileannotationref", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On open-menu-tag", click: () => { this.eventBus.on("open-menu-tag", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off open-menu-tag", click: () => { this.eventBus.off("open-menu-tag", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On open-menu-link", click: () => { this.eventBus.on("open-menu-link", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off open-menu-link", click: () => { this.eventBus.off("open-menu-link", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On open-menu-image", click: () => { this.eventBus.on("open-menu-image", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off open-menu-image", click: () => { this.eventBus.off("open-menu-image", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On open-menu-av", click: () => { this.eventBus.on("open-menu-av", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off open-menu-av", click: () => { this.eventBus.off("open-menu-av", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On open-menu-content", click: () => { this.eventBus.on("open-menu-content", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off open-menu-content", click: () => { this.eventBus.off("open-menu-content", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On open-menu-breadcrumbmore", click: () => { this.eventBus.on("open-menu-breadcrumbmore", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off open-menu-breadcrumbmore", click: () => { this.eventBus.off("open-menu-breadcrumbmore", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On open-menu-inbox", click: () => { this.eventBus.on("open-menu-inbox", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off open-menu-inbox", click: () => { this.eventBus.off("open-menu-inbox", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On input-search", click: () => { this.eventBus.on("input-search", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off input-search", click: () => { this.eventBus.off("input-search", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On paste", click: () => { this.eventBus.on("paste", this.eventBusPaste); - } + }, }, { icon: "iconClose", label: "Off paste", click: () => { this.eventBus.off("paste", this.eventBusPaste); - } + }, }, { icon: "iconSelect", label: "On open-siyuan-url-plugin", click: () => { this.eventBus.on("open-siyuan-url-plugin", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off open-siyuan-url-plugin", click: () => { this.eventBus.off("open-siyuan-url-plugin", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On open-siyuan-url-block", click: () => { this.eventBus.on("open-siyuan-url-block", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off open-siyuan-url-block", click: () => { this.eventBus.off("open-siyuan-url-block", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On opened-notebook", click: () => { this.eventBus.on("opened-notebook", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off opened-notebook", click: () => { this.eventBus.off("opened-notebook", this.eventBusLog); - } + }, }, { icon: "iconSelect", label: "On closed-notebook", click: () => { this.eventBus.on("closed-notebook", this.eventBusLog); - } + }, }, { icon: "iconClose", label: "Off closed-notebook", click: () => { this.eventBus.off("closed-notebook", this.eventBusLog); - } - }] + }, + }], }); menu.addSeparator(); menu.addItem({ diff --git a/src/kernel.ts b/src/kernel.ts index b58924a..3bc27e8 100644 --- a/src/kernel.ts +++ b/src/kernel.ts @@ -1,6 +1,6 @@ /// -import type * as kernel from 'siyuan/kernel'; +import type * as kernel from "siyuan/kernel"; /** * Reference implementation of the kernel plugin API for SiYuan. @@ -228,21 +228,39 @@ class KernelPlugin { // Demonstrate ping/pong control frames await this.ws!.ping("ping from plugin"); }; - this.ws.onmessage = async (event) => { await logger.debug("ws client: message", event); }; - this.ws.onping = async (event) => { await logger.debug("ws client: ping", event); }; - this.ws.onpong = async (event) => { await logger.debug("ws client: pong", event); }; - this.ws.onerror = async (event) => { await logger.debug("ws client: error", event); }; - this.ws.onclose = async (event) => { await logger.debug("ws client: close", event); }; + this.ws.onmessage = async (event) => { + await logger.debug("ws client: message", event); + }; + this.ws.onping = async (event) => { + await logger.debug("ws client: ping", event); + }; + this.ws.onpong = async (event) => { + await logger.debug("ws client: pong", event); + }; + this.ws.onerror = async (event) => { + await logger.debug("ws client: error", event); + }; + this.ws.onclose = async (event) => { + await logger.debug("ws client: close", event); + }; // Initiate the connection after wiring all callbacks await this.ws.open(); // ── SSE / EventSource client ────────────────────────────────────────── this.es = await client.event("/es/broadcast/subscribe"); - this.es.onopen = async (e) => { await logger.debug("es client: open", e); }; - this.es.onmessage = async (e) => { await logger.debug("es client: message", e); }; - this.es.onclose = async (e) => { await logger.debug("es client: close", e); }; - this.es.onerror = async (e) => { await logger.debug("es client: error", e); }; + this.es.onopen = async (e) => { + await logger.debug("es client: open", e); + }; + this.es.onmessage = async (e) => { + await logger.debug("es client: message", e); + }; + this.es.onclose = async (e) => { + await logger.debug("es client: close", e); + }; + this.es.onerror = async (e) => { + await logger.debug("es client: error", e); + }; } /** @@ -386,9 +404,15 @@ class KernelPlugin { // Reply with a pong carrying the same application data await request.port.pong(event.data); }; - request.port.onpong = async (event) => { await logger.debug("ws server: pong", event); }; - request.port.onclose = async (event) => { await logger.debug("ws server: close", event); }; - request.port.onerror = async (event) => { await logger.debug("ws server: error", event); }; + request.port.onpong = async (event) => { + await logger.debug("ws server: pong", event); + }; + request.port.onclose = async (event) => { + await logger.debug("ws server: close", event); + }; + request.port.onerror = async (event) => { + await logger.debug("ws server: error", event); + }; // port.open() is optional — the kernel auto-opens after this handler returns. } diff --git a/tsconfig.json b/tsconfig.json index 96ffebc..db1c786 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,5 +6,5 @@ }, "include": [ "src/**/*.ts" - ], + ] } diff --git a/webpack.config.js b/webpack.config.js index 0dcb2c7..27a8932 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -11,37 +11,45 @@ module.exports = (env, argv) => { const plugins = [ new MiniCssExtractPlugin({ filename: production ? "dist/index.css" : "index.css", - }) + }), ]; if (production) { - plugins.push(new webpack.BannerPlugin({ - banner: () => { - return fs.readFileSync("LICENSE").toString(); - }, - })); - plugins.push(new CopyPlugin({ - patterns: [ - { from: "preview.png", to: "./dist/" }, - { from: "icon.png", to: "./dist/" }, - { from: "README*.md", to: "./dist/" }, - { from: "plugin.json", to: "./dist/" }, - { from: "src/i18n/", to: "./dist/i18n/" }, - ], - })); - plugins.push(new ZipPlugin({ - filename: "package.zip", - algorithm: "gzip", - include: [/dist/], - pathMapper: (assetPath) => { - return assetPath.replace("dist/", ""); - }, - })); + plugins.push( + new webpack.BannerPlugin({ + banner: () => { + return fs.readFileSync("LICENSE").toString(); + }, + }), + ); + plugins.push( + new CopyPlugin({ + patterns: [ + { from: "preview.png", to: "./dist/" }, + { from: "icon.png", to: "./dist/" }, + { from: "README*.md", to: "./dist/" }, + { from: "plugin.json", to: "./dist/" }, + { from: "src/i18n/", to: "./dist/i18n/" }, + ], + }), + ); + plugins.push( + new ZipPlugin({ + filename: "package.zip", + algorithm: "gzip", + include: [/dist/], + pathMapper: (assetPath) => { + return assetPath.replace("dist/", ""); + }, + }), + ); } else { - plugins.push(new CopyPlugin({ - patterns: [ - { from: "src/i18n/", to: "./i18n/" }, - ], - })); + plugins.push( + new CopyPlugin({ + patterns: [ + { from: "src/i18n/", to: "./i18n/" }, + ], + }), + ); } return { mode: argv.mode || "development", @@ -80,7 +88,7 @@ module.exports = (env, argv) => { loader: "esbuild-loader", options: { target: "es6", - } + }, }, ], }, @@ -96,7 +104,7 @@ module.exports = (env, argv) => { loader: "sass-loader", // compiles Sass to CSS }, ], - } + }, ], }, plugins, diff --git a/webpack.kernel.config.js b/webpack.kernel.config.js index 55d0e47..934c1a0 100644 --- a/webpack.kernel.config.js +++ b/webpack.kernel.config.js @@ -42,7 +42,7 @@ module.exports = (env, argv) => { loader: "esbuild-loader", options: { target: "esnext", - } + }, }, ], }, From 64ce68cd8f09334b8b3ce38b33751f1aab3bb01d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yingyi=20/=20=E9=A2=96=E9=80=B8?= <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Mon, 11 May 2026 19:36:10 +0800 Subject: [PATCH 09/15] style(dprint): Prefer double quotes; simplify selector quoting Update dprint config: change typescript.quoteStyle from "alwaysDouble" to "preferDouble". Adjust src/index.ts to use a single-quoted selector with unescaped inner double quotes ("[contenteditable=\"true\"]" -> '[contenteditable="true"]') to improve readability and reduce escaping. --- dprint.json | 2 +- src/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dprint.json b/dprint.json index 5664525..1fcb5c6 100644 --- a/dprint.json +++ b/dprint.json @@ -21,7 +21,7 @@ "index.css" ], "typescript": { - "quoteStyle": "alwaysDouble", + "quoteStyle": "preferDouble", "semiColons": "always", "trailingCommas": "onlyMultiLine", "operatorPosition": "sameLine", diff --git a/src/index.ts b/src/index.ts index 3d28b30..7c0258b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -339,7 +339,7 @@ export default class PluginSample extends Plugin { click: () => { const doOperations: IOperation[] = []; detail.blockElements.forEach((item: HTMLElement) => { - const editElement = item.querySelector("[contenteditable=\"true\"]"); + const editElement = item.querySelector('[contenteditable="true"]'); if (editElement) { editElement.textContent = editElement.textContent.replace(/ /g, ""); doOperations.push({ From 8f5de2039b78088d6f7067ec19bc2b6066a43176 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yingyi=20/=20=E9=A2=96=E9=80=B8?= <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Mon, 11 May 2026 19:42:57 +0800 Subject: [PATCH 10/15] style(dprint): Enforce no-space around object properties Update formatting rules and apply spacing changes to remove spaces surrounding object properties and destructured bindings. Added dprint setting "spaceSurroundingProperties": false and normalized object-brace spacing across docs, ESLint config, source files (src/index.ts, src/kernel.ts), and webpack configs. Purely stylistic changes to improve consistency; no functional behavior altered. --- .../plans/2026-05-09-kernel-plugin-demo.md | 20 +++++++++---------- dprint.json | 1 + eslint.config.mjs | 2 +- src/index.ts | 16 +++++++-------- src/kernel.ts | 20 +++++++++---------- webpack.config.js | 14 ++++++------- webpack.kernel.config.js | 2 +- 7 files changed, 38 insertions(+), 37 deletions(-) diff --git a/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md b/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md index 9de48a8..900d179 100644 --- a/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md +++ b/docs/superpowers/plans/2026-05-09-kernel-plugin-demo.md @@ -318,7 +318,7 @@ The full file content is specified below. Each method covers one or more API nam * ``` */ private async onload(): Promise { - const { rpc, storage, logger, plugin } = this.siyuan; + const {rpc, storage, logger, plugin} = this.siyuan; // ── siyuan.logger (all five levels) ─────────────────────────────────── // Unlike console.*, each call returns a Promise and serialises args as JSON. @@ -385,7 +385,7 @@ The full file content is specified below. Each method covers one or more API nam * ``` */ private async onloaded(): Promise { - const { client, logger } = this.siyuan; + const {client, logger} = this.siyuan; // List all loaded plugins via the kernel REST API. // fetch() returns IFetchResponse; the body is a lazy IDataObject. @@ -429,7 +429,7 @@ The full file content is specified below. Each method covers one or more API nam * ``` */ private async onrunning(): Promise { - const { client, logger, plugin } = this.siyuan; + const {client, logger, plugin} = this.siyuan; // ── HTTP RPC loopback (JS → HTTP → Go → JS → Go → HTTP → JS) ────────── const echoResp = await client.fetch( @@ -440,7 +440,7 @@ The full file content is specified below. Each method covers one or more API nam body: JSON.stringify({ jsonrpc: "2.0", method: "echo", - params: ["hello from onrunning", 42, { key: true }], + params: ["hello from onrunning", 42, {key: true}], id: 1, }), }, @@ -458,7 +458,7 @@ The full file content is specified below. Each method covers one or more API nam await this.ws!.send(JSON.stringify({ jsonrpc: "2.0", method: "echo", - params: { message: "hello via WebSocket", ts: Date.now() }, + params: {message: "hello via WebSocket", ts: Date.now()}, id: 2, })); // Demonstrate ping/pong control frames @@ -512,7 +512,7 @@ The full file content is specified below. Each method covers one or more API nam * resource leaks in the kernel process. */ private async onunload(): Promise { - const { rpc, logger } = this.siyuan; + const {rpc, logger} = this.siyuan; // Unbind the RPC method registered in onload await rpc.unbind("echo"); @@ -544,7 +544,7 @@ The full file content is specified below. Each method covers one or more API nam * @param event - The incoming kernel event message. */ private async eventHandler(event: IEventMessage): Promise { - const { event: eventApi, logger } = this.siyuan; + const {event: eventApi, logger} = this.siyuan; await logger.debug("event received:", event); @@ -618,7 +618,7 @@ The full file content is specified below. Each method covers one or more API nam * WebSocket back-channel to the connected client). */ private async wsHandler(request: IServerWsRequest): Promise { - const { logger } = this.siyuan; + const {logger} = this.siyuan; request.port.onopen = async (event) => { await logger.debug("ws server: port open", event); @@ -664,13 +664,13 @@ The full file content is specified below. Each method covers one or more API nam * back-channel to the connected client). */ private async esHandler(request: IServerEsRequest): Promise { - const { logger } = this.siyuan; + const {logger} = this.siyuan; request.port.onopen = async (event) => { await logger.debug("sse server: port open", event); // send is synchronous; eventType becomes the SSE `event:` field request.port.send("message", "Connected to plugin SSE!"); - request.port.send("update", JSON.stringify({ ts: Date.now() })); + request.port.send("update", JSON.stringify({ts: Date.now()})); }; request.port.onclose = async (event) => { await logger.debug("sse server: port close", event); diff --git a/dprint.json b/dprint.json index 1fcb5c6..173ab39 100644 --- a/dprint.json +++ b/dprint.json @@ -26,6 +26,7 @@ "trailingCommas": "onlyMultiLine", "operatorPosition": "sameLine", "nextControlFlowPosition": "sameLine", + "spaceSurroundingProperties": false, "importDeclaration.forceMultiLine": "whenMultiple", "importDeclaration.sortNamedImports": "maintain" }, diff --git a/eslint.config.mjs b/eslint.config.mjs index 807c75b..1018c18 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -42,7 +42,7 @@ export default [ quotes: [2, "double", { avoidEscape: true, }], - "@typescript-eslint/no-unused-vars": ["warn", { caughtErrors: "none" }], + "@typescript-eslint/no-unused-vars": ["warn", {caughtErrors: "none"}], "no-async-promise-executor": "off", "no-prototype-builtins": "off", "no-useless-escape": "off", diff --git a/src/index.ts b/src/index.ts index 7c0258b..1826892 100644 --- a/src/index.ts +++ b/src/index.ts @@ -56,7 +56,7 @@ export default class PluginSample extends Plugin { } onload() { - this.data[STORAGE_NAME] = { readonlyText: "Readonly" }; + this.data[STORAGE_NAME] = {readonlyText: "Readonly"}; const frontEnd = getFrontend(); this.isMobile = frontEnd === "mobile" || frontEnd === "browser-mobile"; @@ -99,7 +99,7 @@ export default class PluginSample extends Plugin { this.addDock({ config: { position: "LeftBottom", - size: { width: 200, height: 0 }, + size: {width: 200, height: 0}, icon: "iconSaving", title: "Custom Dock", hotkey: "⌥⌘W", @@ -149,7 +149,7 @@ export default class PluginSample extends Plugin { const textareaElement = document.createElement("textarea"); this.setting = new Setting({ confirmCallback: () => { - this.saveData(STORAGE_NAME, { readonlyText: textareaElement.value }).catch(e => { + this.saveData(STORAGE_NAME, {readonlyText: textareaElement.value}).catch(e => { showMessage(`[${this.name}] save data [${STORAGE_NAME}] fail: `, e); }); }, @@ -243,7 +243,7 @@ export default class PluginSample extends Plugin { statusIconTemp.content.firstElementChild.addEventListener("click", () => { confirm("⚠️", this.i18n.confirmRemove.replace("${name}", this.name), () => { this.removeData(STORAGE_NAME).then(() => { - this.data[STORAGE_NAME] = { readonlyText: "Readonly" }; + this.data[STORAGE_NAME] = {readonlyText: "Readonly"}; showMessage(`[${this.name}]: ${this.i18n.removedData}`); }).catch(e => { showMessage(`[${this.name}] remove data [${STORAGE_NAME}] fail: `, e); @@ -327,11 +327,11 @@ export default class PluginSample extends Plugin { }); } - private eventBusLog({ detail }: any) { + private eventBusLog({detail}: any) { console.log(detail); } - private blockIconEvent({ detail }: any) { + private blockIconEvent({detail}: any) { detail.menu.addItem({ id: "pluginSample_removeSpace", iconHTML: "", @@ -499,7 +499,7 @@ export default class PluginSample extends Plugin { label: "Open Float Layer(open doc first)", click: () => { this.addFloatLayer({ - refDefs: [{ refID: this.getEditor().protyle.block.rootID }], + refDefs: [{refID: this.getEditor().protyle.block.rootID}], x: window.innerWidth - 768 - 120, y: 32, isBacklink: false, @@ -511,7 +511,7 @@ export default class PluginSample extends Plugin { label: "Open Doc Window(open doc first)", click: () => { openWindow({ - doc: { id: this.getEditor().protyle.block.rootID }, + doc: {id: this.getEditor().protyle.block.rootID}, }); }, }); diff --git a/src/kernel.ts b/src/kernel.ts index 3bc27e8..dad914c 100644 --- a/src/kernel.ts +++ b/src/kernel.ts @@ -74,7 +74,7 @@ class KernelPlugin { * ``` */ private async onload(): Promise { - const { rpc, storage, logger, plugin } = this.siyuan; + const {rpc, storage, logger, plugin} = this.siyuan; // ── siyuan.logger (all five levels) ─────────────────────────────────── // Unlike console.*, each call returns a Promise and serialises args as JSON. @@ -149,7 +149,7 @@ class KernelPlugin { * ``` */ private async onloaded(): Promise { - const { client, logger } = this.siyuan; + const {client, logger} = this.siyuan; // List all loaded plugins via the kernel REST API. // fetch() returns IFetchResponse; the body is a lazy IDataObject. @@ -193,7 +193,7 @@ class KernelPlugin { * ``` */ private async onrunning(): Promise { - const { client, logger, plugin } = this.siyuan; + const {client, logger, plugin} = this.siyuan; // ── HTTP RPC loopback (JS → HTTP → Go → JS → Go → HTTP → JS) ────────── const echoResp = await client.fetch( @@ -204,7 +204,7 @@ class KernelPlugin { body: JSON.stringify({ jsonrpc: "2.0", method: "echo", - params: ["hello from onrunning", 42, { key: true }], + params: ["hello from onrunning", 42, {key: true}], id: 1, }), }, @@ -222,7 +222,7 @@ class KernelPlugin { await this.ws!.send(JSON.stringify({ jsonrpc: "2.0", method: "echo", - params: { message: "hello via WebSocket", ts: Date.now() }, + params: {message: "hello via WebSocket", ts: Date.now()}, id: 2, })); // Demonstrate ping/pong control frames @@ -276,7 +276,7 @@ class KernelPlugin { * resource leaks in the kernel process. */ private async onunload(): Promise { - const { rpc, logger } = this.siyuan; + const {rpc, logger} = this.siyuan; // Unbind the RPC method registered in onload await rpc.unbind("echo"); @@ -308,7 +308,7 @@ class KernelPlugin { * @param event - The incoming kernel event message. */ private async eventHandler(event: kernel.IEventMessage): Promise { - const { event: eventApi, logger } = this.siyuan; + const {event: eventApi, logger} = this.siyuan; await logger.debug("event received:", event); @@ -382,7 +382,7 @@ class KernelPlugin { * WebSocket back-channel to the connected client). */ private async wsHandler(request: kernel.IServerWebSocketRequest): Promise { - const { logger } = this.siyuan; + const {logger} = this.siyuan; request.port.onopen = async (event) => { await logger.debug("ws server: port open", event); @@ -433,13 +433,13 @@ class KernelPlugin { * back-channel to the connected client). */ private async esHandler(request: kernel.IServerEventSourceRequest): Promise { - const { logger } = this.siyuan; + const {logger} = this.siyuan; request.port.onopen = async (event) => { await logger.debug("sse server: port open", event); // send is synchronous; eventType becomes the SSE `event:` field request.port.send("message", "Connected to plugin SSE!"); - request.port.send("update", JSON.stringify({ ts: Date.now() })); + request.port.send("update", JSON.stringify({ts: Date.now()})); }; request.port.onclose = async (event) => { await logger.debug("sse server: port close", event); diff --git a/webpack.config.js b/webpack.config.js index 27a8932..80d0734 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,7 +1,7 @@ const path = require("path"); const fs = require("fs"); const webpack = require("webpack"); -const { EsbuildPlugin } = require("esbuild-loader"); +const {EsbuildPlugin} = require("esbuild-loader"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const CopyPlugin = require("copy-webpack-plugin"); const ZipPlugin = require("zip-webpack-plugin"); @@ -24,11 +24,11 @@ module.exports = (env, argv) => { plugins.push( new CopyPlugin({ patterns: [ - { from: "preview.png", to: "./dist/" }, - { from: "icon.png", to: "./dist/" }, - { from: "README*.md", to: "./dist/" }, - { from: "plugin.json", to: "./dist/" }, - { from: "src/i18n/", to: "./dist/i18n/" }, + {from: "preview.png", to: "./dist/"}, + {from: "icon.png", to: "./dist/"}, + {from: "README*.md", to: "./dist/"}, + {from: "plugin.json", to: "./dist/"}, + {from: "src/i18n/", to: "./dist/i18n/"}, ], }), ); @@ -46,7 +46,7 @@ module.exports = (env, argv) => { plugins.push( new CopyPlugin({ patterns: [ - { from: "src/i18n/", to: "./i18n/" }, + {from: "src/i18n/", to: "./i18n/"}, ], }), ); diff --git a/webpack.kernel.config.js b/webpack.kernel.config.js index 934c1a0..61989e7 100644 --- a/webpack.kernel.config.js +++ b/webpack.kernel.config.js @@ -1,5 +1,5 @@ const path = require("path"); -const { EsbuildPlugin } = require("esbuild-loader"); +const {EsbuildPlugin} = require("esbuild-loader"); module.exports = (env, argv) => { const production = argv.mode === "production"; From d988d5f222656494ab831fb9576bd867fe831031 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yingyi=20/=20=E9=A2=96=E9=80=B8?= <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Mon, 11 May 2026 20:09:14 +0800 Subject: [PATCH 11/15] chore(build): Add kernel.js to webpack copy patterns Update webpack.config.js to include dist/kernel.js in the CopyWebpackPlugin patterns so kernel.js is copied into the final ./dist/ directory. Ensures kernel.js is present in the packaged build output. --- webpack.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/webpack.config.js b/webpack.config.js index 80d0734..f2445f7 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -29,6 +29,7 @@ module.exports = (env, argv) => { {from: "README*.md", to: "./dist/"}, {from: "plugin.json", to: "./dist/"}, {from: "src/i18n/", to: "./dist/i18n/"}, + {from: "dist/kernel.js", to: "./dist/"}, ], }), ); From d8c3ed22e7f45f5c340893a5fc8c098076f32dca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yingyi=20/=20=E9=A2=96=E9=80=B8?= <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Mon, 11 May 2026 23:35:07 +0800 Subject: [PATCH 12/15] style(kernel): Add Chinese docs and clarify kernel API comments Expand and translate inline documentation in src/kernel.ts: add Chinese TSDoc and examples, clarify lifecycle state machine, storage semantics (single-use IDataObject, path roots), client.fetch/socket/event behavior (JWT injection, open semantics), and server handler details for HTTP, WebSocket and SSE. Mostly comment, formatting and explanatory changes to make kernel APIs and examples clearer for contributors; no functional logic changes. --- src/kernel.ts | 408 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 288 insertions(+), 120 deletions(-) diff --git a/src/kernel.ts b/src/kernel.ts index dad914c..922581d 100644 --- a/src/kernel.ts +++ b/src/kernel.ts @@ -3,70 +3,124 @@ import type * as kernel from "siyuan/kernel"; /** - * Reference implementation of the kernel plugin API for SiYuan. + * SiYuan 内核插件 API 的参考实现。 + * + * This file provides a reference implementation of the SiYuan kernel plugin API. * * @remarks - * This class exercises every public surface on `globalThis.siyuan`. It is the - * living reference for community developers and is updated in lock-step with - * `petal/kernel.d.ts` whenever new kernel APIs are added. + * 该类调用 `globalThis.siyuan` 的所有公共接口。 + * 它作为社区开发者的活体参考。 + * + * --- + * This class exercises every public surface on `globalThis.siyuan`. + * It is the living reference for community developers. + * + * ## 生命周期状态机 + * + * ready → loading → loaded → running → stopping → stopped + * ↓onload ↓onloaded ↓onrunning ↓onunload + * + * 每个钩子都是异步安全的。 + * 内核会等待返回的 `Promise` 完成后再前进到下一个状态。 + * 因此慢的钩子会阻塞插件自身启动。 + * 请保持钩子非阻塞。 + * 将耗时工作交给 fire-and-forget 的任务。 * + * --- * ## Lifecycle state machine * - * ``` * ready → loading → loaded → running → stopping → stopped * ↓onload ↓onloaded ↓onrunning ↓onunload - * ``` * - * Each hook is `async`-safe: the kernel awaits the returned `Promise` before - * advancing to the next state, so slow hooks stall the plugin's own startup. - * Keep hooks non-blocking; defer long-running work to fire-and-forget tasks. + * Each hook is async-safe. + * The kernel awaits the returned `Promise` before advancing to the next state. + * Slow hooks therefore stall the plugin's own startup. + * Keep hooks non-blocking. + * Defer long-running work to fire-and-forget tasks. * + * ## 添加新 API 的步骤 + * + * 1. 在 `petal/kernel.d.ts` 中添加类型声明。 + * 2. 在相应的生命周期方法中添加示例调用。 + * 3. 添加 TSDoc 块来说明任何特殊约束。 + * + * --- * ## Adding a new API * * 1. Add the type declaration to `petal/kernel.d.ts`. * 2. Add a demonstration call in the appropriate lifecycle method below. - * 3. Add a TSDoc block linking to the new interface and explaining any - * non-obvious constraints. + * 3. Add a TSDoc block linking to the new interface and explaining any non-obvious constraints. */ class KernelPlugin { private readonly siyuan: kernel.ISiyuan = siyuan; - /** Client-side WebSocket connection to the plugin's own RPC endpoint. */ + /** + * 客户端 WebSocket 连接。 + * 连接到插件自身的 RPC 端点。 + * + * --- + * Client-side WebSocket connection. + * Connects to the plugin's own RPC endpoint. + */ private ws: kernel.IWebSocket | null = null; - /** Client-side SSE connection to the kernel broadcast endpoint. */ + /** + * 客户端 SSE 连接。 + * 订阅内核广播端点。 + * + * --- + * Client-side SSE connection. + * Subscribes to the kernel broadcast endpoint. + */ private es: kernel.IEventSource | null = null; constructor() { - // Wire lifecycle hooks + // 绑定生命周期钩子。 + // Wire lifecycle hooks. this.siyuan.plugin.lifecycle.onload = this.onload.bind(this); this.siyuan.plugin.lifecycle.onloaded = this.onloaded.bind(this); this.siyuan.plugin.lifecycle.onrunning = this.onrunning.bind(this); this.siyuan.plugin.lifecycle.onunload = this.onunload.bind(this); - // Wire the inbound kernel event handler + // 绑定内核入站事件处理器。 + // Wire the inbound kernel event handler. this.siyuan.event.handler = this.eventHandler.bind(this); - // Wire server-side request handlers (private scope: /plugin/private//*) + // 绑定服务器端请求处理器(私有作用域:/plugin/private//*)。 + // Wire server-side request handlers (private scope: /plugin/private//*). this.siyuan.server.private.http.handler = this.httpHandler.bind(this); this.siyuan.server.private.ws.handler = this.wsHandler.bind(this); this.siyuan.server.private.es.handler = this.esHandler.bind(this); } - // ── Lifecycle ───────────────────────────────────────────────────────────── + // ── 生命周期 / Lifecycle ───────────────────────────────────────────────── /** - * Demonstrates {@link kernel.IRpc} and {@link kernel.IStorage}. + * 演示 {@link kernel.IRpc} 的用法。 + * 演示 {@link kernel.IStorage} 的用法。 * * @remarks - * Called when the plugin script is first evaluated. Register RPC methods - * here so they are ready once the plugin reaches the `running` state. + * 在插件脚本首次求值时调用。 + * 在这里注册 RPC 方法,使其在插件到达 `running` 状态后可用。 + * 在 `running` 之前对 RPC 的调用会以 `-32002` 拒绝。 + * + * {@link kernel.IStorage} 的路径相对于 `data/storage/petal//`。 + * 内核会阻止路径遍历。 + * `storage.get` 返回的每个 {@link kernel.IDataObject} 只能使用一次。 + * 每个实例最多调用一个解码器。 + * + * --- + * Demonstrates {@link kernel.IRpc} usage. + * Demonstrates {@link kernel.IStorage} usage. + * + * Called when the plugin script is first evaluated. + * Register RPC methods here so they are ready once the plugin reaches the `running` state. * RPC calls are rejected with `-32002` before `running` is reached. * - * {@link kernel.IStorage} paths are relative to - * `data/storage/petal//`. Path traversal is blocked by the - * kernel. Each {@link kernel.IDataObject} returned by `storage.get` is - * single-use — call at most one decoder per instance. + * {@link kernel.IStorage} paths are relative to `data/storage/petal//`. + * Path traversal is blocked by the kernel. + * Each {@link kernel.IDataObject} returned by `storage.get` is single-use. + * Call at most one decoder per instance. * * @example * ```ts @@ -74,9 +128,11 @@ class KernelPlugin { * ``` */ private async onload(): Promise { - const {rpc, storage, logger, plugin} = this.siyuan; + const { rpc, storage, logger, plugin } = this.siyuan; - // ── siyuan.logger (all five levels) ─────────────────────────────────── + // ── siyuan.logger(示例) + // ── siyuan.logger (example) + // 与 console.* 不同,每次调用返回 Promise,并将参数序列化为 JSON。 // Unlike console.*, each call returns a Promise and serialises args as JSON. await logger.trace("onload: plugin name =", plugin.name); await logger.debug("onload: version =", plugin.version); @@ -84,14 +140,18 @@ class KernelPlugin { await logger.warn("onload: i18n keys =", Object.keys(plugin.i18n)); await logger.error("onload: (error-level demo — not a real error)"); - // ── console.* (synchronous, Node.js util.format, 3 levels) ──────────── + // ── console.*(同步,Node.js util.format) + // ── console.* (synchronous, Node.js util.format) + // 会路由到内核日志的 INFO/WARN/ERROR。无需 await。 // Routed to the kernel log at INFO/WARN/ERROR. No await needed. console.log("onload: console.log (sync, util.format)"); console.warn("onload: console.warn"); console.error("onload: console.error"); - // ── siyuan.rpc ──────────────────────────────────────────────────────── + // ── siyuan.rpc 示例 + // bind(name, fn, ...descriptions):注册一个 JSON-RPC 方法。 // bind(name, fn, ...descriptions): registers a JSON-RPC method. + // 第三个及其后参数为可选的人类可读描述。 // The third argument and beyond are optional human-readable descriptions. await rpc.bind( "echo", @@ -102,13 +162,17 @@ class KernelPlugin { "Returns all received arguments unchanged.", ); - // ── siyuan.storage ──────────────────────────────────────────────────── - // put: write a UTF-8 string to a path relative to the plugin data dir + // ── siyuan.storage 示例 + // put:将 UTF-8 字符串写入相对于插件数据目录的路径。 + // put: write a UTF-8 string to a path relative to the plugin data dir. await storage.put("demo.txt", JSON.stringify(new Date().toISOString())); - // get: returns IDataObject — a lazy accessor. Each IDataObject is single-use: - // call at most one decoder (.text(), .json(), or .arrayBuffer()) per instance. - // A separate get() call is required for each decoder demonstration here. + // get:返回 IDataObject — 懒加载访问器。 + // 每个 IDataObject 为单次使用。 + // 调用时每个实例最多使用一个解码器(.text(), .json(), .arrayBuffer())。 + // get: returns IDataObject — a lazy accessor. + // Each IDataObject is single-use. + // Call at most one decoder (.text(), .json(), or .arrayBuffer()) per instance. const obj = await storage.get("demo.txt"); await logger.debug("storage.get → text():", await obj.text()); @@ -118,11 +182,13 @@ class KernelPlugin { await logger.debug("storage.get → buffer():", await obj.buffer()); - // list: returns IStorageEntry[] for the given relative directory + // list:返回指定相对目录下的 IStorageEntry[]。 + // list: returns IStorageEntry[] for the given relative directory. const entries = await storage.list("."); await logger.debug("storage.list:", entries); - // remove: deletes a file or directory tree + // remove:删除文件或目录树。 + // remove: deletes a file or directory tree. await storage.remove("demo.txt"); try { @@ -133,14 +199,24 @@ class KernelPlugin { } /** - * Demonstrates {@link IClient.fetch} against the kernel's own REST API. + * 演示通过内核自身的 REST API 使用 {@link IClient.fetch}。 * * @remarks - * Called after all plugins have completed `onload`. At this point every - * enabled kernel plugin is visible in the plugin registry. + * 在所有插件完成 `onload` 后调用。 + * 此时已加载的插件可在插件注册表中看到。 + * + * `siyuan.client.fetch` 会通过内核隧道请求并自动注入插件的 JWT token。 + * 无需手动设置认证头。 + * + * --- + * Demonstrates {@link IClient.fetch} against the kernel's own REST API. + * + * Called after all plugins have completed `onload`. + * At this point every enabled kernel plugin is visible in the plugin registry. * * `siyuan.client.fetch` tunnels the request through the kernel and injects - * the plugin's JWT token automatically — no manual auth header needed. + * the plugin's JWT token automatically. + * No manual auth header is needed. * * @example * ```ts @@ -149,9 +225,11 @@ class KernelPlugin { * ``` */ private async onloaded(): Promise { - const {client, logger} = this.siyuan; + const { client, logger } = this.siyuan; + // 列出通过内核 REST API 加载的所有插件。 // List all loaded plugins via the kernel REST API. + // fetch() 返回 IFetchResponse;body 为懒加载的 IDataObject。 // fetch() returns IFetchResponse; the body is a lazy IDataObject. const resp = await client.fetch("/api/plugin/listLoadedPlugins", { method: "POST", @@ -167,35 +245,51 @@ class KernelPlugin { } /** + * 演示 {@link IClient.socket} 和 {@link IClient.event}, + * 以及一个 HTTP JSON-RPC 回环调用。 + * + * @remarks + * 在 `onloaded` 解析后调用。 + * 此时内核已完全运行。 + * `onload` 中注册的 RPC 方法均可调用。 + * + * ### WebSocket 客户端 + * `siyuan.client.socket` 立即返回一个封闭的 {@link IWebSocket} 且处于 `CONNECTING` 状态。 + * 必须显式调用 `ws.open()` 发起握手。 + * 在调用 `open()` 前先分配所有回调。 + * + * ### SSE 客户端 + * `siyuan.client.event` 立即返回。 + * 内核在后台启动 SSE 订阅并在连接后触发 `onopen`。 + * + * --- * Demonstrates {@link IClient.socket} (WebSocket client) and * {@link IClient.event} (SSE client), plus an HTTP JSON-RPC loopback call. * - * @remarks - * Called after `onloaded` resolves. The kernel is fully running and all - * RPC methods registered in `onload` are now reachable. + * Called after `onloaded` resolves. + * The kernel is fully running and all RPC methods registered in `onload` are now reachable. * * ### WebSocket client - * `siyuan.client.socket` returns a sealed {@link IWebSocket} in - * `CONNECTING` state immediately. **`ws.open()` must be called explicitly** - * to initiate the TCP/WebSocket handshake; `onopen` fires only after - * `open()` resolves. Assign all callbacks before calling `open()`. + * `siyuan.client.socket` returns a sealed {@link IWebSocket} in `CONNECTING` state. + * `ws.open()` must be called explicitly to initiate the TCP/WebSocket handshake. + * Assign all callbacks before calling `open()`. * * ### SSE client - * `siyuan.client.event` returns immediately; the kernel starts the SSE - * subscription in the background and fires `onopen` once connected. + * `siyuan.client.event` returns immediately. + * The kernel starts the SSE subscription in the background and fires `onopen` once connected. * * @example * ```ts - * // Assign all callbacks BEFORE calling open(). * const ws = await siyuan.client.socket("/ws/plugin/rpc/my-plugin"); * ws.onopen = async () => { await ws.send("hello"); }; * await ws.open(); * ``` */ private async onrunning(): Promise { - const {client, logger, plugin} = this.siyuan; + const { client, logger, plugin } = this.siyuan; - // ── HTTP RPC loopback (JS → HTTP → Go → JS → Go → HTTP → JS) ────────── + // ── HTTP RPC 回环(示例) + // ── HTTP RPC loopback (example) const echoResp = await client.fetch( `/api/plugin/rpc/${plugin.name}`, { @@ -204,28 +298,31 @@ class KernelPlugin { body: JSON.stringify({ jsonrpc: "2.0", method: "echo", - params: ["hello from onrunning", 42, {key: true}], + params: ["hello from onrunning", 42, { key: true }], id: 1, }), }, ); await logger.debug("onrunning: HTTP RPC echo =", await echoResp.json()); - // ── WebSocket client ────────────────────────────────────────────────── + // ── WebSocket 客户端示例 + // ── WebSocket client example this.ws = await client.socket(`/ws/plugin/rpc/${plugin.name}`); - // Assign all callbacks before calling open() — onopen fires only after - // the TCP/WebSocket handshake completes. + // 在调用 open() 之前分配所有回调。 + // Assign all callbacks before calling open(). this.ws.onopen = async (event) => { await logger.debug("ws client: open", event); - // Send a JSON-RPC request over the WebSocket connection + // 通过 WebSocket 发送一个 JSON-RPC 请求。 + // Send a JSON-RPC request over the WebSocket connection. await this.ws!.send(JSON.stringify({ jsonrpc: "2.0", method: "echo", - params: {message: "hello via WebSocket", ts: Date.now()}, + params: { message: "hello via WebSocket", ts: Date.now() }, id: 2, })); - // Demonstrate ping/pong control frames + // 演示 ping/pong 控制帧。 + // Demonstrate ping/pong control frames. await this.ws!.ping("ping from plugin"); }; this.ws.onmessage = async (event) => { @@ -244,10 +341,12 @@ class KernelPlugin { await logger.debug("ws client: close", event); }; - // Initiate the connection after wiring all callbacks + // 在绑定好所有回调后发起连接。 + // Initiate the connection after wiring all callbacks. await this.ws.open(); - // ── SSE / EventSource client ────────────────────────────────────────── + // ── SSE / EventSource 客户端示例 + // ── SSE / EventSource client example this.es = await client.event("/es/broadcast/subscribe"); this.es.onopen = async (e) => { await logger.debug("es client: open", e); @@ -264,55 +363,79 @@ class KernelPlugin { } /** - * Demonstrates {@link IRpc.broadcast} and connection cleanup. + * 演示 {@link IRpc.broadcast} 与连接清理逻辑。 * * @remarks - * Called when the plugin is stopping. `rpc.broadcast` pushes a JSON-RPC - * 2.0 notification (no `id`) to all connected RPC WebSocket clients. It - * is a no-op if the plugin is not in the `running` state, so it is safe - * to call here even during a fast shutdown. + * 在插件停止时调用。 + * `rpc.broadcast` 会向所有已连接的 RPC WebSocket 客户端推送一个 JSON-RPC 通知(无 `id`)。 + * 如果插件不在 `running` 状态,该调用是空操作。 + * 因此在快速关机时调用也是安全的。 + * + * 广播后关闭任何打开的客户端连接以避免内核进程中的资源泄露。 * - * After broadcasting, close any open client-side connections to avoid - * resource leaks in the kernel process. + * --- + * Demonstrates {@link IRpc.broadcast} and connection cleanup. + * + * Called when the plugin is stopping. + * `rpc.broadcast` pushes a JSON-RPC 2.0 notification (no `id`) to all connected RPC WebSocket clients. + * It is a no-op if the plugin is not in the `running` state. + * Therefore it is safe to call here even during a fast shutdown. + * + * After broadcasting, close any open client-side connections to avoid resource leaks in the kernel process. */ private async onunload(): Promise { - const {rpc, logger} = this.siyuan; + const { rpc, logger } = this.siyuan; - // Unbind the RPC method registered in onload + // 解绑在 onload 中注册的 RPC 方法。 + // Unbind the RPC method registered in onload. await rpc.unbind("echo"); - // Push a notification to all connected RPC WebSocket clients + // 向所有已连接的 RPC WebSocket 客户端推送一条通知。 + // Push a notification to all connected RPC WebSocket clients. await rpc.broadcast("unload", ["Plugin is unloading"]); - // Close client-side connections — optional chaining guards against the - // case where onrunning was never reached (e.g. error during startup) + // 关闭客户端连接。 + // 可选链用于防护 onrunning 未达成的情况(例如启动失败)。 + // Close client-side connections. + // Optional chaining guards against the case where onrunning was never reached (e.g. error during startup). this.ws?.close(); this.es?.close(); await logger.debug("onunload: cleanup complete"); } - // ── Event bridge ────────────────────────────────────────────────────────── + // ── 事件桥 / Event bridge ───────────────────────────────────────────────── /** - * Demonstrates {@link IEvent.handler} (receive) and {@link IEvent.emit} (publish). + * 演示 {@link IEvent.handler}(接收)与 {@link IEvent.emit}(发布)。 * * @remarks + * `siyuan.event.handler` 会接收每个内核广播事件。 + * `event` 的形状为 `{ id: UUID, type: string, detail: any }`。 + * + * `siyuan.event.emit` 将事件发布到进程内总线。 + * 第一个参数是用于路由的主题字符串。 + * 第二个参数是负载。 + * + * --- + * Demonstrates {@link IEvent.handler} (receive) and {@link IEvent.emit} (publish). + * * `siyuan.event.handler` receives every kernel broadcast event. * `event` has shape `{ id: UUID, type: string, detail: any }`. * * `siyuan.event.emit` publishes an event to the in-process bus. - * The first argument is the topic string used for routing; - * the second is the payload. + * The first argument is the topic string used for routing. + * The second argument is the payload. * * @param event - The incoming kernel event message. */ private async eventHandler(event: kernel.IEventMessage): Promise { - const {event: eventApi, logger} = this.siyuan; + const { event: eventApi, logger } = this.siyuan; await logger.debug("event received:", event); - // Re-publish the event under the "plugin" topic + // 在 "plugin" 主题下重新发布该事件。 + // Re-publish the event under the "plugin" topic. await eventApi.emit("plugin", { id: event.id, type: "echo", @@ -320,20 +443,28 @@ class KernelPlugin { }); } - // ── Server-side handlers ────────────────────────────────────────────────── + // ── 服务器端处理器 / Server-side handlers ───────────────────────────────── /** - * Demonstrates the HTTP server handler at - * `ANY /plugin/private//*path`. + * 演示位于 `ANY /plugin/private//*path` 的 HTTP 服务器处理器。 * * @remarks - * Must return an {@link IHttpResponse}. The `body` field supports: - * `data` (JSON / XML / YAML / …), `file` (local filesystem path), - * `string` (Go `fmt.Sprintf`), `raw` (bytes + Content-Type), `redirect`. + * 必须返回 {@link IHttpResponse}。 + * `body` 字段支持:`data`(JSON / XML / YAML / …)、`file`(本地文件系统路径)、`string`(Go 的 fmt.Sprintf)、`raw`(字节 + Content-Type)、`redirect`。 + * 仅设置其中一个;内核会使用第一个非空值。 + * + * 该路由需要内核认证和管理员角色。 + * 未认证的请求会在到达处理器前被拒绝。 + * + * --- + * Demonstrates the HTTP server handler at `ANY /plugin/private//*path`. + * + * Must return an {@link IHttpResponse}. + * The `body` field supports: `data` (JSON / XML / YAML / …), `file` (local filesystem path), `string` (Go `fmt.Sprintf`), `raw` (bytes + Content-Type), `redirect`. * Set exactly one; the kernel uses the first non-null value. * - * The route requires kernel authentication and admin role — unauthenticated - * requests are rejected before reaching the handler. + * The route requires kernel authentication and admin role. + * Unauthenticated requests are rejected before reaching the handler. * * @param request - Parsed URL, headers, body, and Gin routing context. * @returns An {@link IHttpResponse} that the kernel writes to the client. @@ -344,11 +475,13 @@ class KernelPlugin { return { statusCode: 200, headers: { - // Multi-value headers are arrays of strings + // 多值头为字符串数组。 + // Multi-value headers are arrays of strings. "X-Plugin": [this.siyuan.plugin.name], }, body: { - // type: "JSON" delegates to c.JSON in Gin + // type: "JSON" 将委托给 Gin 的 c.JSON。 + // type: "JSON" delegates to c.JSON in Gin. data: { type: "JSON", data: { @@ -364,44 +497,59 @@ class KernelPlugin { } /** - * Demonstrates the WebSocket server handler at - * `GET /plugin/private//*path` (WebSocket upgrade). + * 演示位于 `GET /plugin/private//*path` 的 WebSocket 服务器处理器(WebSocket 升级)。 * * @remarks - * `request.port` mirrors the {@link IWebSocket} interface — same event - * callbacks, same `send` / `ping` / `pong` / `close` methods. + * `request.port` 的接口与 {@link IWebSocket} 相同。 + * 提供相同的事件回调和 `send` / `ping` / `pong` / `close` 方法。 + * + * 在此处理器函数体内分配所有回调。 + * 内核在处理器返回后会自动打开端口的读取循环。 + * 显式调用 `port.open()` 是可选的。 * - * Assign all callbacks in this handler body. The kernel auto-opens the - * port's read loop after the handler returns; calling `port.open()` - * explicitly is optional. + * `onmessage` 事件携带 `{ type: "text" | "binary", data: string | ArrayBuffer }`。 * - * `onmessage` events carry - * `{ type: "text" | "binary", data: string | ArrayBuffer }`. + * --- + * Demonstrates the WebSocket server handler at `GET /plugin/private//*path` (WebSocket upgrade). * - * @param request - Server request augmented with `port` (a bidirectional - * WebSocket back-channel to the connected client). + * `request.port` mirrors the {@link IWebSocket} interface. + * It provides the same event callbacks and `send` / `ping` / `pong` / `close` methods. + * + * Assign all callbacks in this handler body. + * The kernel auto-opens the port's read loop after the handler returns. + * Calling `port.open()` explicitly is optional. + * + * `onmessage` events carry `{ type: "text" | "binary", data: string | ArrayBuffer }`. + * + * @param request - Server request augmented with `port` (a bidirectional WebSocket back-channel to the connected client). */ private async wsHandler(request: kernel.IServerWebSocketRequest): Promise { - const {logger} = this.siyuan; + const { logger } = this.siyuan; request.port.onopen = async (event) => { await logger.debug("ws server: port open", event); - // Greet the client on connection + // 在连接时向客户端问好。 + // Greet the client on connection. await request.port.send("Hello from plugin WebSocket server!"); }; request.port.onmessage = async (event) => { await logger.debug("ws server: message", event); - // send text frames back as-is; convert binary frames to a string representation + // 将文本帧原样回送。 + // 将二进制帧转换为字符串表示后回送。 + // Send text frames back as-is. + // Convert binary frames to a string representation before sending. if (typeof event.data === "string") { await request.port.send(event.data); } else { - // Binary frame — event.data is always ArrayBuffer in the else branch + // 二进制帧 — 在 else 分支中 event.data 始终为 ArrayBuffer。 + // Binary frame — event.data is always ArrayBuffer in the else branch. await request.port.send(new TextDecoder().decode(event.data as ArrayBuffer)); } }; request.port.onping = async (event) => { await logger.debug("ws server: ping", event); - // Reply with a pong carrying the same application data + // 使用相同的应用数据回复 pong。 + // Reply with a pong carrying the same application data. await request.port.pong(event.data); }; request.port.onpong = async (event) => { @@ -413,38 +561,58 @@ class KernelPlugin { request.port.onerror = async (event) => { await logger.debug("ws server: error", event); }; - // port.open() is optional — the kernel auto-opens after this handler returns. + // port.open() 是可选的。 + // 内核在此处理器返回后会自动打开端口。 + // port.open() is optional. + // The kernel auto-opens the port after this handler returns. } /** - * Demonstrates the SSE server handler at - * `GET /plugin/private//*path` (Server-Sent Events). + * 演示位于 `GET /plugin/private//*path` 的 SSE 服务器处理器(Server-Sent Events)。 * * @remarks - * `request.port.onopen` fires once the SSE stream is ready. Call - * `port.send(eventType, data)` inside `onopen` or later to push events. - * `eventType` maps to the SSE `event:` field; `data` maps to `data:`. - * `send` is **synchronous** — no `await` needed. + * `request.port.onopen` 在 SSE 流准备好后触发。 + * 可在 `onopen` 内或之后调用 `port.send(eventType, data)` 来推送事件。 + * `eventType` 映射到 SSE 的 `event:` 字段。 + * `data` 映射到 `data:`。 + * `send` 是同步的。 + * + * 连接保持打开直到调用 `port.close()` 或客户端断开连接。 + * 客户端断开连接会触发 `onclose`。 + * + * --- + * Demonstrates the SSE server handler at `GET /plugin/private//*path` (Server-Sent Events). + * + * `request.port.onopen` fires once the SSE stream is ready. + * Call `port.send(eventType, data)` inside `onopen` or later to push events. + * `eventType` maps to the SSE `event:` field. + * `data` maps to `data:`. + * `send` is synchronous. * - * The connection stays open until `port.close()` is called or the - * client disconnects, which fires `onclose`. + * The connection stays open until `port.close()` is called or the client disconnects. + * The client disconnect triggers `onclose`. * - * @param request - Server request augmented with `port` (an SSE - * back-channel to the connected client). + * @param request - Server request augmented with `port` (an SSE back-channel to the connected client). */ private async esHandler(request: kernel.IServerEventSourceRequest): Promise { - const {logger} = this.siyuan; + const { logger } = this.siyuan; request.port.onopen = async (event) => { await logger.debug("sse server: port open", event); - // send is synchronous; eventType becomes the SSE `event:` field + // send 是同步的。 + // eventType 会成为 SSE 的 `event:` 字段。 + // send is synchronous. + // eventType becomes the SSE `event:` field. request.port.send("message", "Connected to plugin SSE!"); - request.port.send("update", JSON.stringify({ts: Date.now()})); + request.port.send("update", JSON.stringify({ ts: Date.now() })); }; request.port.onclose = async (event) => { await logger.debug("sse server: port close", event); }; - // Note: IEsServerPort has no onerror callback — SSE errors surface as onclose. + // 注意:IEsServerPort 没有 onerror 回调。 + // SSE 的错误作为 onclose 曝露。 + // Note: IEsServerPort has no onerror callback. + // SSE errors surface as onclose. } } From 5160d6b9d6d789302c4ebb30a68f28805583530b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yingyi=20/=20=E9=A2=96=E9=80=B8?= <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Tue, 12 May 2026 10:44:32 +0800 Subject: [PATCH 13/15] feat(kenrel): Log globalThis properties for goja inspection Add a diagnostic in src/kernel.ts to list all properties on globalThis so developers can see which global objects and built-in modules the goja engine supports. Includes a bilingual comment (Chinese/English) and a commented example output. This is intended as a discovery/debugging aid and does not change core logic. --- src/kernel.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/kernel.ts b/src/kernel.ts index 922581d..957fb6d 100644 --- a/src/kernel.ts +++ b/src/kernel.ts @@ -2,6 +2,14 @@ import type * as kernel from "siyuan/kernel"; +/** + * 列出 globalThis 上的所有属性以查看 goja 引擎支持的全局对象和内置模块。 + * List all properties on globalThis to see the global objects and built-in modules supported by the goja engine. + */ +console.log(Object.getOwnPropertyNames(globalThis)); +// Object,Function,Array,String,Number,BigInt,RegExp,Date,Boolean,Proxy,Reflect,Error,AggregateError,TypeError,ReferenceError,SyntaxError,RangeError,EvalError,URIError,GoError,eval,Math,JSON,ArrayBuffer,DataView,Uint8Array,Uint8ClampedArray,Int8Array,Uint16Array,Int16Array,Uint32Array,Int32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array,Symbol,WeakSet,WeakMap,Map,Set,Promise,globalThis,NaN,undefined,Infinity,isNaN,parseInt,parseFloat,isFinite,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,escape,unescape,require,console,setTimeout,setInterval,setImmediate,clearTimeout,clearInterval,clearImmediate,URL,URLSearchParams,Buffer,siyuan + + /** * SiYuan 内核插件 API 的参考实现。 * From 34bf82874b4f5d51a905002998a5a6e106406c47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yingyi=20/=20=E9=A2=96=E9=80=B8?= <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Tue, 12 May 2026 13:42:52 +0800 Subject: [PATCH 14/15] fix: Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/kernel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernel.ts b/src/kernel.ts index 957fb6d..1638b76 100644 --- a/src/kernel.ts +++ b/src/kernel.ts @@ -551,7 +551,7 @@ class KernelPlugin { } else { // 二进制帧 — 在 else 分支中 event.data 始终为 ArrayBuffer。 // Binary frame — event.data is always ArrayBuffer in the else branch. - await request.port.send(new TextDecoder().decode(event.data as ArrayBuffer)); + await request.port.send(Buffer.from(event.data as ArrayBuffer).toString("utf-8")); } }; request.port.onping = async (event) => { From 3a0cfaa51a5789aec15e78769d4aa5bfb06f8503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yingyi=20/=20=E9=A2=96=E9=80=B8?= <49649786+Zuoqiu-Yingyi@users.noreply.github.com> Date: Tue, 12 May 2026 13:56:05 +0800 Subject: [PATCH 15/15] chore(build): Use npm-run-all for dev/build scripts Replace shell-style parallel/serial script invocations with npm-run-all (run-p/run-s) to improve cross-platform script orchestration; add npm-run-all as a devDependency. Bump @typescript-eslint packages to 8.59.3 and adjust devDependency ordering. Update pnpm-lock.yaml to reflect the dependency changes. Remove two "Out of Scope" bullets from the spec doc and apply a small change to src/kernel.ts. --- .../2026-05-09-kernel-plugin-demo-design.md | 2 - package.json | 11 +- pnpm-lock.yaml | 1389 +++++++++++++++-- src/kernel.ts | 21 +- 4 files changed, 1303 insertions(+), 120 deletions(-) diff --git a/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md b/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md index 2900c67..c9c479a 100644 --- a/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md +++ b/docs/superpowers/specs/2026-05-09-kernel-plugin-demo-design.md @@ -143,6 +143,4 @@ await this.ws.open(); ## Out of Scope -* No changes to `src/index.ts`, `plugin.json`, `webpack.config.js`, or any other file -* No new dependencies * No unit tests (kernel plugin runs inside goja; tested by loading in a live SiYuan instance) diff --git a/package.json b/package.json index 9c804d7..e5050e7 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,10 @@ "format": "dprint fmt", "format:check": "dprint check", "lint": "eslint . --fix --cache", - "dev": "pnpm run dev:kernel & pnpm run dev:app", + "dev": "run-p dev:kernel dev:app", "dev:app": "webpack --config webpack.config.js --mode development", "dev:kernel": "webpack --config webpack.kernel.config.js --mode development", - "build": "pnpm run build:kernel && pnpm run build:app", + "build": "run-s build:kernel build:app", "build:app": "webpack --config webpack.config.js --mode production", "build:kernel": "webpack --config webpack.kernel.config.js --mode production" }, @@ -18,17 +18,18 @@ "author": "Vanessa", "license": "MIT", "devDependencies": { - "dprint": "latest", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "^10.0.1", - "@typescript-eslint/eslint-plugin": "^8.59.2", - "@typescript-eslint/parser": "^8.59.2", + "@typescript-eslint/eslint-plugin": "^8.59.3", + "@typescript-eslint/parser": "^8.59.3", "copy-webpack-plugin": "^14.0.0", "css-loader": "^7.1.4", + "dprint": "latest", "esbuild-loader": "^4.4.3", "eslint": "^10.3.0", "globals": "^17.6.0", "mini-css-extract-plugin": "^2.10.2", + "npm-run-all": "^4.1.5", "sass": "^1.99.0", "sass-loader": "^16.0.8", "siyuan": "1.2.2-alpha.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6cc8226..5471ce7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,11 +15,11 @@ importers: specifier: ^10.0.1 version: 10.0.1(eslint@10.3.0) '@typescript-eslint/eslint-plugin': - specifier: ^8.59.2 - version: 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) + specifier: ^8.59.3 + version: 8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) '@typescript-eslint/parser': - specifier: ^8.59.2 - version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) + specifier: ^8.59.3 + version: 8.59.3(eslint@10.3.0)(typescript@6.0.3) copy-webpack-plugin: specifier: ^14.0.0 version: 14.0.0(webpack@5.106.2) @@ -41,6 +41,9 @@ importers: mini-css-extract-plugin: specifier: ^2.10.2 version: 2.10.2(webpack@5.106.2) + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 sass: specifier: ^1.99.0 version: 1.99.0 @@ -58,7 +61,7 @@ importers: version: 6.0.3 webpack: specifier: ^5.106.2 - version: 5.106.2(webpack-cli@7.0.2) + version: 5.106.2(postcss@8.5.14)(webpack-cli@7.0.2) webpack-cli: specifier: ^7.0.2 version: 7.0.2(webpack@5.106.2) @@ -481,66 +484,66 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.6.2': - resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} + '@types/node@25.7.0': + resolution: {integrity: sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==} - '@typescript-eslint/eslint-plugin@8.59.2': - resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==} + '@typescript-eslint/eslint-plugin@8.59.3': + resolution: {integrity: sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.59.2 + '@typescript-eslint/parser': ^8.59.3 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.59.2': - resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} + '@typescript-eslint/parser@8.59.3': + resolution: {integrity: sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.59.2': - resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} + '@typescript-eslint/project-service@8.59.3': + resolution: {integrity: sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.59.2': - resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} + '@typescript-eslint/scope-manager@8.59.3': + resolution: {integrity: sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.59.2': - resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} + '@typescript-eslint/tsconfig-utils@8.59.3': + resolution: {integrity: sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.59.2': - resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} + '@typescript-eslint/type-utils@8.59.3': + resolution: {integrity: sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.59.2': - resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} + '@typescript-eslint/types@8.59.3': + resolution: {integrity: sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.59.2': - resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} + '@typescript-eslint/typescript-estree@8.59.3': + resolution: {integrity: sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.59.2': - resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} + '@typescript-eslint/utils@8.59.3': + resolution: {integrity: sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.59.2': - resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} + '@typescript-eslint/visitor-keys@8.59.3': + resolution: {integrity: sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@webassemblyjs/ast@1.14.1': @@ -629,9 +632,29 @@ packages: ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -639,8 +662,8 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.10.27: - resolution: {integrity: sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==} + baseline-browser-mapping@2.10.29: + resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -665,6 +688,18 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -672,6 +707,10 @@ packages: caniuse-lite@1.0.30001792: resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -684,6 +723,12 @@ packages: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -700,6 +745,10 @@ packages: peerDependencies: webpack: ^5.1.0 + cross-spawn@6.0.6: + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} + engines: {node: '>=4.8'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -721,6 +770,18 @@ packages: engines: {node: '>=4'} hasBin: true + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -733,6 +794,14 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -741,15 +810,19 @@ packages: resolution: {integrity: sha512-sIy25poR2gRP/tWPTgP0MPeJoJcpv0xzYDcsboapvthbEt1Qw3Al252CA0xFyIh2cYEGGKyBJtKokryv4ERlJw==} hasBin: true - electron-to-chromium@1.5.352: - resolution: {integrity: sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.353: + resolution: {integrity: sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==} emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - enhanced-resolve@5.21.2: - resolution: {integrity: sha512-xe9vQb5kReirPUxgQrXA3ihgbCqssmTiM7cOZ+Gzu+VeGWgpV98lLZvp0dl4yriyAePcewxGUs9UpKD8PET9KQ==} + enhanced-resolve@5.21.3: + resolution: {integrity: sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==} engines: {node: '>=10.13.0'} envinfo@7.21.0: @@ -757,6 +830,17 @@ packages: engines: {node: '>=4'} hasBin: true + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -764,6 +848,18 @@ packages: es-module-lexer@2.1.0: resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + esbuild-loader@4.4.3: resolution: {integrity: sha512-Wpui03EzqC151xFteKlgJQhbyZl5CgnBpUHXVuao02nItULlkaTeiLdEMPTmR2zdwpEBWkXVNoT5dDOYJluUzg==} peerDependencies: @@ -778,6 +874,10 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -892,9 +992,36 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} @@ -913,17 +1040,51 @@ packages: resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} engines: {node: '>=18'} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + hasown@2.0.3: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + icss-utils@5.1.0: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} @@ -954,26 +1115,120 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + interpret@3.1.1: resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} engines: {node: '>=10.13.0'} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + is-core-module@2.16.2: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -992,6 +1247,9 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -1017,6 +1275,10 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + loader-runner@4.3.2: resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} engines: {node: '>=6.11.5'} @@ -1033,6 +1295,14 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -1067,20 +1337,47 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-releases@2.0.38: - resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} + node-releases@2.0.44: + resolution: {integrity: sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -1105,10 +1402,18 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1116,6 +1421,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1123,10 +1432,23 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postcss-modules-extract-imports@3.1.0: resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} @@ -1170,6 +1492,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1178,6 +1504,14 @@ packages: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} engines: {node: '>= 10.13.0'} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -1202,6 +1536,18 @@ packages: engines: {node: '>= 0.4'} hasBin: true + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + engines: {node: '>=0.4'} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + sass-loader@16.0.8: resolution: {integrity: sha512-hcov4ZwZJIGbEuyNr9EmiTmZueyrxSToE6GOzoZnq5JM7ecRO7ttyvilPn+VmRsqiP16+VYZzVnGZj/hzZgKBA==} engines: {node: '>= 18.12.0'} @@ -1232,8 +1578,12 @@ packages: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@7.8.0: + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} engines: {node: '>=10'} hasBin: true @@ -1241,18 +1591,58 @@ packages: resolution: {integrity: sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==} engines: {node: '>=20.0.0'} + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + siyuan@1.2.2-alpha.0: resolution: {integrity: sha512-zVBkvhOhjn98MFNga9qlbfVsT9OYEKF2jegHYpEtypoa1jQsxKULKzHUOUqK0pw26nwaSrv+fzh7viLTj4wkjQ==} @@ -1267,10 +1657,50 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string.prototype.padend@3.1.6: + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} @@ -1283,19 +1713,46 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - terser-webpack-plugin@5.5.0: - resolution: {integrity: sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==} + terser-webpack-plugin@5.6.0: + resolution: {integrity: sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==} engines: {node: '>= 10.13.0'} peerDependencies: + '@minify-html/node': '*' '@swc/core': '*' + '@swc/css': '*' + '@swc/html': '*' + clean-css: '*' + cssnano: '*' + csso: '*' esbuild: '*' + html-minifier-terser: '*' + lightningcss: '*' + postcss: '*' uglify-js: '*' webpack: ^5.1.0 peerDependenciesMeta: + '@minify-html/node': + optional: true '@swc/core': optional: true + '@swc/css': + optional: true + '@swc/html': + optional: true + clean-css: + optional: true + cssnano: + optional: true + csso: + optional: true esbuild: optional: true + html-minifier-terser: + optional: true + lightningcss: + optional: true + postcss: + optional: true uglify-js: optional: true @@ -1321,13 +1778,33 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true - undici-types@7.19.2: - resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@7.21.0: + resolution: {integrity: sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==} update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} @@ -1341,6 +1818,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + watchpack@2.5.1: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} @@ -1377,6 +1857,26 @@ packages: webpack-cli: optional: true + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1687,18 +2187,18 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@25.6.2': + '@types/node@25.7.0': dependencies: - undici-types: 7.19.2 + undici-types: 7.21.0 - '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.59.2 - '@typescript-eslint/type-utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.2 + '@typescript-eslint/parser': 8.59.3(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/type-utils': 8.59.3(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.3 eslint: 10.3.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -1707,41 +2207,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.3(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.2 - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.2 + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.3 debug: 4.4.3 eslint: 10.3.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': + '@typescript-eslint/project-service@8.59.3(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) - '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.59.2': + '@typescript-eslint/scope-manager@8.59.3': dependencies: - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/visitor-keys': 8.59.2 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/visitor-keys': 8.59.3 - '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.59.3(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.59.3(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.3.0)(typescript@6.0.3) debug: 4.4.3 eslint: 10.3.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -1749,37 +2249,37 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.59.2': {} + '@typescript-eslint/types@8.59.3': {} - '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.59.3(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/visitor-keys': 8.59.2 + '@typescript-eslint/project-service': 8.59.3(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/visitor-keys': 8.59.3 debug: 4.4.3 minimatch: 10.2.5 - semver: 7.7.4 + semver: 7.8.0 tinyglobby: 0.2.16 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': + '@typescript-eslint/utils@8.59.3(eslint@10.3.0)(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) - '@typescript-eslint/scope-manager': 8.59.2 - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) eslint: 10.3.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.59.2': + '@typescript-eslint/visitor-keys@8.59.3': dependencies: - '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/types': 8.59.3 eslint-visitor-keys: 5.0.1 '@webassemblyjs/ast@1.14.1': @@ -1895,13 +2395,38 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + argparse@2.0.1: {} + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + balanced-match@1.0.2: {} balanced-match@4.0.4: {} - baseline-browser-mapping@2.10.27: {} + baseline-browser-mapping@2.10.29: {} big.js@5.2.2: {} @@ -1916,20 +2441,43 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.27 + baseline-browser-mapping: 2.10.29 caniuse-lite: 1.0.30001792 - electron-to-chromium: 1.5.352 - node-releases: 2.0.38 + electron-to-chromium: 1.5.353 + node-releases: 2.0.44 update-browserslist-db: 1.2.3(browserslist@4.28.2) buffer-crc32@0.2.13: {} buffer-from@1.1.2: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} caniuse-lite@1.0.30001792: {} + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -1942,6 +2490,12 @@ snapshots: kind-of: 6.0.3 shallow-clone: 3.0.1 + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-name@1.1.3: {} + commander@14.0.3: {} commander@2.20.3: {} @@ -1955,7 +2509,15 @@ snapshots: schema-utils: 4.3.3 serialize-javascript: 7.0.5 tinyglobby: 0.2.16 - webpack: 5.106.2(webpack-cli@7.0.2) + webpack: 5.106.2(postcss@8.5.14)(webpack-cli@7.0.2) + + cross-spawn@6.0.6: + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 cross-spawn@7.0.6: dependencies: @@ -1972,18 +2534,48 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.14) postcss-modules-values: 4.0.0(postcss@8.5.14) postcss-value-parser: 4.2.0 - semver: 7.7.4 + semver: 7.8.0 optionalDependencies: - webpack: 5.106.2(webpack-cli@7.0.2) + webpack: 5.106.2(postcss@8.5.14)(webpack-cli@7.0.2) cssesc@3.0.0: {} + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + debug@4.4.3: dependencies: ms: 2.1.3 deep-is@0.1.4: {} + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + detect-libc@2.1.2: optional: true @@ -2001,27 +2593,113 @@ snapshots: '@dprint/win32-arm64': 0.54.0 '@dprint/win32-x64': 0.54.0 - electron-to-chromium@1.5.352: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.353: {} emojis-list@3.0.0: {} - enhanced-resolve@5.21.2: + enhanced-resolve@5.21.3: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 envinfo@7.21.0: {} + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.24.2: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.3 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.4 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.20 + + es-define-property@1.0.1: {} + es-errors@1.3.0: {} es-module-lexer@2.1.0: {} + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + esbuild-loader@4.4.3(webpack@5.106.2): dependencies: esbuild: 0.27.7 get-tsconfig: 4.14.0 loader-utils: 2.0.4 - webpack: 5.106.2(webpack-cli@7.0.2) + webpack: 5.106.2(postcss@8.5.14)(webpack-cli@7.0.2) webpack-sources: 3.4.1 esbuild@0.27.7: @@ -2055,6 +2733,8 @@ snapshots: escalade@3.2.0: {} + escape-string-regexp@1.0.5: {} + escape-string-regexp@4.0.0: {} eslint-scope@5.1.1: @@ -2175,8 +2855,49 @@ snapshots: flatted@3.4.2: {} + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + function-bind@1.1.2: {} + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.3 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.3 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -2191,14 +2912,41 @@ snapshots: globals@17.6.0: {} + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + graceful-fs@4.2.11: {} + has-bigints@1.1.0: {} + + has-flag@3.0.0: {} + has-flag@4.0.0: {} + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + hasown@2.0.3: dependencies: function-bind: 1.1.2 + hosted-git-info@2.8.9: {} + icss-utils@5.1.0(postcss@8.5.14): dependencies: postcss: 8.5.14 @@ -2221,29 +2969,135 @@ snapshots: imurmurhash@0.1.4: {} + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.3 + side-channel: 1.1.0 + interpret@3.1.1: {} + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + is-core-module@2.16.2: dependencies: hasown: 2.0.3 + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + isexe@2.0.0: {} isobject@3.0.1: {} jest-worker@27.5.1: dependencies: - '@types/node': 25.6.2 + '@types/node': 25.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -2253,6 +3107,8 @@ snapshots: json-buffer@3.0.1: {} + json-parse-better-errors@1.0.2: {} + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -2272,6 +3128,13 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + loader-runner@4.3.2: {} loader-utils@2.0.4: @@ -2288,6 +3151,10 @@ snapshots: dependencies: p-locate: 5.0.0 + math-intrinsics@1.1.0: {} + + memorystream@0.3.1: {} + merge-stream@2.0.0: {} mime-db@1.54.0: {} @@ -2296,7 +3163,7 @@ snapshots: dependencies: schema-utils: 4.3.3 tapable: 2.3.3 - webpack: 5.106.2(webpack-cli@7.0.2) + webpack: 5.106.2(postcss@8.5.14)(webpack-cli@7.0.2) minimatch@10.2.5: dependencies: @@ -2314,13 +3181,47 @@ snapshots: neo-async@2.6.2: {} + nice-try@1.0.5: {} + node-addon-api@7.1.1: optional: true - node-releases@2.0.38: {} + node-releases@2.0.44: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.12 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} + npm-run-all@4.1.5: + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.6 + memorystream: 0.3.1 + minimatch: 3.1.5 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.3 + string.prototype.padend: 3.1.6 + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -2330,6 +3231,12 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -2352,20 +3259,37 @@ snapshots: dependencies: callsites: 3.1.0 + parse-json@4.0.0: + dependencies: + error-ex: 1.3.4 + json-parse-better-errors: 1.0.2 + path-exists@4.0.0: {} + path-key@2.0.1: {} + path-key@3.1.1: {} path-parse@1.0.7: {} + path-type@3.0.0: + dependencies: + pify: 3.0.0 + picocolors@1.1.1: {} picomatch@4.0.4: {} + pidtree@0.3.1: {} + + pify@3.0.0: {} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 + possible-typed-array-names@1.1.0: {} + postcss-modules-extract-imports@3.1.0(postcss@8.5.14): dependencies: postcss: 8.5.14 @@ -2404,12 +3328,38 @@ snapshots: punycode@2.3.1: {} + read-pkg@3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + readdirp@4.1.2: {} rechoir@0.8.0: dependencies: resolve: 1.22.12 + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + require-from-string@2.0.2: {} resolve-cwd@3.0.0: @@ -2429,12 +3379,31 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + sass-loader@16.0.8(sass@1.99.0)(webpack@5.106.2): dependencies: neo-async: 2.6.2 optionalDependencies: sass: 1.99.0 - webpack: 5.106.2(webpack-cli@7.0.2) + webpack: 5.106.2(postcss@8.5.14)(webpack-cli@7.0.2) sass@1.99.0: dependencies: @@ -2451,20 +3420,80 @@ snapshots: ajv-formats: 2.1.1(ajv@8.20.0) ajv-keywords: 5.1.0(ajv@8.20.0) - semver@7.7.4: {} + semver@5.7.2: {} + + semver@7.8.0: {} serialize-javascript@7.0.5: {} + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 + shebang-regex@1.0.0: {} + shebang-regex@3.0.0: {} + shell-quote@1.8.3: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siyuan@1.2.2-alpha.0: dependencies: '@dop251/types-goja_nodejs-buffer': 0.0.0-20260212111938-1f56ff5bcf14 @@ -2480,8 +3509,63 @@ snapshots: source-map@0.6.1: {} + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.23 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 + + spdx-license-ids@3.0.23: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string.prototype.padend@3.1.6: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.1 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + strip-bom@3.0.0: {} + strip-json-comments@3.1.1: {} + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + supports-color@8.1.1: dependencies: has-flag: 4.0.0 @@ -2490,13 +3574,15 @@ snapshots: tapable@2.3.3: {} - terser-webpack-plugin@5.5.0(webpack@5.106.2): + terser-webpack-plugin@5.6.0(postcss@8.5.14)(webpack@5.106.2): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.47.1 - webpack: 5.106.2(webpack-cli@7.0.2) + webpack: 5.106.2(postcss@8.5.14)(webpack-cli@7.0.2) + optionalDependencies: + postcss: 8.5.14 terser@5.47.1: dependencies: @@ -2520,9 +3606,49 @@ snapshots: dependencies: prelude-ls: 1.2.1 + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + typescript@6.0.3: {} - undici-types@7.19.2: {} + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@7.21.0: {} update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: @@ -2536,6 +3662,11 @@ snapshots: util-deprecate@1.0.2: {} + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + watchpack@2.5.1: dependencies: glob-to-regexp: 0.4.1 @@ -2551,7 +3682,7 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.106.2(webpack-cli@7.0.2) + webpack: 5.106.2(postcss@8.5.14)(webpack-cli@7.0.2) webpack-merge: 6.0.1 webpack-merge@6.0.1: @@ -2562,7 +3693,7 @@ snapshots: webpack-sources@3.4.1: {} - webpack@5.106.2(webpack-cli@7.0.2): + webpack@5.106.2(postcss@8.5.14)(webpack-cli@7.0.2): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.9 @@ -2574,7 +3705,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.16.0) browserslist: 4.28.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.21.2 + enhanced-resolve: 5.21.3 es-module-lexer: 2.1.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -2585,16 +3716,70 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.5.0(webpack@5.106.2) + terser-webpack-plugin: 5.6.0(postcss@8.5.14)(webpack@5.106.2) watchpack: 2.5.1 webpack-sources: 3.4.1 optionalDependencies: webpack-cli: 7.0.2(webpack@5.106.2) transitivePeerDependencies: + - '@minify-html/node' - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso - esbuild + - html-minifier-terser + - lightningcss + - postcss - uglify-js + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.20 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -2611,6 +3796,6 @@ snapshots: zip-webpack-plugin@4.0.3(webpack-sources@3.4.1)(webpack@5.106.2): dependencies: - webpack: 5.106.2(webpack-cli@7.0.2) + webpack: 5.106.2(postcss@8.5.14)(webpack-cli@7.0.2) webpack-sources: 3.4.1 yazl: 2.5.1 diff --git a/src/kernel.ts b/src/kernel.ts index 1638b76..5971eb8 100644 --- a/src/kernel.ts +++ b/src/kernel.ts @@ -9,7 +9,6 @@ import type * as kernel from "siyuan/kernel"; console.log(Object.getOwnPropertyNames(globalThis)); // Object,Function,Array,String,Number,BigInt,RegExp,Date,Boolean,Proxy,Reflect,Error,AggregateError,TypeError,ReferenceError,SyntaxError,RangeError,EvalError,URIError,GoError,eval,Math,JSON,ArrayBuffer,DataView,Uint8Array,Uint8ClampedArray,Int8Array,Uint16Array,Int16Array,Uint32Array,Int32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array,Symbol,WeakSet,WeakMap,Map,Set,Promise,globalThis,NaN,undefined,Infinity,isNaN,parseInt,parseFloat,isFinite,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,escape,unescape,require,console,setTimeout,setInterval,setImmediate,clearTimeout,clearInterval,clearImmediate,URL,URLSearchParams,Buffer,siyuan - /** * SiYuan 内核插件 API 的参考实现。 * @@ -136,7 +135,7 @@ class KernelPlugin { * ``` */ private async onload(): Promise { - const { rpc, storage, logger, plugin } = this.siyuan; + const {rpc, storage, logger, plugin} = this.siyuan; // ── siyuan.logger(示例) // ── siyuan.logger (example) @@ -233,7 +232,7 @@ class KernelPlugin { * ``` */ private async onloaded(): Promise { - const { client, logger } = this.siyuan; + const {client, logger} = this.siyuan; // 列出通过内核 REST API 加载的所有插件。 // List all loaded plugins via the kernel REST API. @@ -294,7 +293,7 @@ class KernelPlugin { * ``` */ private async onrunning(): Promise { - const { client, logger, plugin } = this.siyuan; + const {client, logger, plugin} = this.siyuan; // ── HTTP RPC 回环(示例) // ── HTTP RPC loopback (example) @@ -306,7 +305,7 @@ class KernelPlugin { body: JSON.stringify({ jsonrpc: "2.0", method: "echo", - params: ["hello from onrunning", 42, { key: true }], + params: ["hello from onrunning", 42, {key: true}], id: 1, }), }, @@ -326,7 +325,7 @@ class KernelPlugin { await this.ws!.send(JSON.stringify({ jsonrpc: "2.0", method: "echo", - params: { message: "hello via WebSocket", ts: Date.now() }, + params: {message: "hello via WebSocket", ts: Date.now()}, id: 2, })); // 演示 ping/pong 控制帧。 @@ -392,7 +391,7 @@ class KernelPlugin { * After broadcasting, close any open client-side connections to avoid resource leaks in the kernel process. */ private async onunload(): Promise { - const { rpc, logger } = this.siyuan; + const {rpc, logger} = this.siyuan; // 解绑在 onload 中注册的 RPC 方法。 // Unbind the RPC method registered in onload. @@ -438,7 +437,7 @@ class KernelPlugin { * @param event - The incoming kernel event message. */ private async eventHandler(event: kernel.IEventMessage): Promise { - const { event: eventApi, logger } = this.siyuan; + const {event: eventApi, logger} = this.siyuan; await logger.debug("event received:", event); @@ -532,7 +531,7 @@ class KernelPlugin { * @param request - Server request augmented with `port` (a bidirectional WebSocket back-channel to the connected client). */ private async wsHandler(request: kernel.IServerWebSocketRequest): Promise { - const { logger } = this.siyuan; + const {logger} = this.siyuan; request.port.onopen = async (event) => { await logger.debug("ws server: port open", event); @@ -603,7 +602,7 @@ class KernelPlugin { * @param request - Server request augmented with `port` (an SSE back-channel to the connected client). */ private async esHandler(request: kernel.IServerEventSourceRequest): Promise { - const { logger } = this.siyuan; + const {logger} = this.siyuan; request.port.onopen = async (event) => { await logger.debug("sse server: port open", event); @@ -612,7 +611,7 @@ class KernelPlugin { // send is synchronous. // eventType becomes the SSE `event:` field. request.port.send("message", "Connected to plugin SSE!"); - request.port.send("update", JSON.stringify({ ts: Date.now() })); + request.port.send("update", JSON.stringify({ts: Date.now()})); }; request.port.onclose = async (event) => { await logger.debug("sse server: port close", event);