diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e3dc42b4..fae0bf0d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -182,17 +182,11 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} BUILD_MANIFEST_NAME: target/distrib/global-dist-manifest.json - VSCE_PAT: ${{ secrets.VSCE_PAT }} - APP_VERSION: ${{ fromJson(needs.plan.outputs.val).releases[0].app_version }} - VSCE_ARGS: --changelog-path docs/changelog.md steps: - uses: actions/checkout@v6 with: persist-credentials: false submodules: recursive - - uses: actions/setup-node@v6 - with: - node-version: 24 - name: Install cached dist uses: actions/download-artifact@v7 with: @@ -209,11 +203,6 @@ jobs: - id: cargo-dist shell: bash run: | - npm install -g @vscode/vsce - npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-win32-x64-${APP_VERSION}.vsix $VSCE_ARGS - npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-linux-x64-${APP_VERSION}.vsix $VSCE_ARGS - npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-darwin-x64-${APP_VERSION}.vsix $VSCE_ARGS - npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-darwin-arm64-${APP_VERSION}.vsix $VSCE_ARGS dist build ${{ needs.plan.outputs.tag-flag }} --output-format=json "--artifacts=global" > dist-manifest.json echo "dist ran successfully" @@ -248,6 +237,9 @@ jobs: with: persist-credentials: false submodules: recursive + - uses: actions/setup-node@v6 + with: + node-version: 24 - name: Install cached dist uses: actions/download-artifact@v7 with: @@ -291,7 +283,17 @@ jobs: ANNOUNCEMENT_TITLE: "${{ fromJson(steps.host.outputs.manifest).announcement_title }}" ANNOUNCEMENT_BODY: "${{ fromJson(steps.host.outputs.manifest).announcement_github_body }}" RELEASE_COMMIT: "${{ github.sha }}" + APP_VERSION: ${{ fromJson(needs.plan.outputs.val).releases[0].app_version }} + VSCE_PAT: ${{ secrets.VSCE_PAT }} + VSCE_PRERELEASE_FLAG: "${{ fromJson(steps.host.outputs.manifest).announcement_is_prerelease && '--pre-release' || '' }}" + VSCE_ARGS: --changelog-path docs/changelog.md run: | + npm install -g @vscode/vsce + npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-win32-x64-${APP_VERSION}.vsix $VSCE_ARGS $VSCE_PRERELEASE_FLAG + npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-linux-x64-${APP_VERSION}.vsix $VSCE_ARGS $VSCE_PRERELEASE_FLAG + npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-darwin-x64-${APP_VERSION}.vsix $VSCE_ARGS $VSCE_PRERELEASE_FLAG + npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-darwin-arm64-${APP_VERSION}.vsix $VSCE_ARGS $VSCE_PRERELEASE_FLAG + # Write and read notes from a file to avoid quoting breaking things echo "$ANNOUNCEMENT_BODY" > $RUNNER_TEMP/notes.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index b0bca9e1..8fc10ee6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,14 @@ Changelog [Github master](https://github.com/bjones1/CodeChat_Editor) ----------------------------------------------------------- -* No changes. +* Correct Markdown conversion of the last doc block -- properly append all + post-conversion text to it. +* Improve browser automated testing framework. +* Add the ability for the IDE cursor to follow the line when the Client cursor + is in a doc block. +* Add the ability to create pre-releases for testing. +* Improve cursor tracking in a re-translation. +* Reduce unnecessary re-translations with better HTML comparison. Version 0.1.54 -- 2026-Apr-16 ----------------------------- diff --git a/builder/Cargo.lock b/builder/Cargo.lock index 20cb2340..a0e6d496 100644 --- a/builder/Cargo.lock +++ b/builder/Cargo.lock @@ -81,9 +81,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -103,9 +103,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", @@ -210,9 +210,9 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "jiff" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" +checksum = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d" dependencies = [ "jiff-static", "log", @@ -223,9 +223,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" +checksum = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7" dependencies = [ "proc-macro2", "quote", @@ -234,9 +234,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.185" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "log" @@ -280,9 +280,9 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] diff --git a/builder/src/main.rs b/builder/src/main.rs index 2a6b366d..b95add5e 100644 --- a/builder/src/main.rs +++ b/builder/src/main.rs @@ -464,16 +464,16 @@ fn run_format_and_lint(check_only: bool) -> io::Result<()> { }; run_cmd!( info "cargo clippy and fmt"; - cargo clippy --all-targets --all-features --tests -- $clippy_check_only; + cargo clippy --all-targets --all-features -- $clippy_check_only; cargo fmt --all $check; info "Builder: cargo clippy and fmt"; - cargo clippy --all-targets --all-features --tests --manifest-path=$BUILDER_PATH/Cargo.toml -- $clippy_check_only; + cargo clippy --all-targets --all-features --manifest-path=$BUILDER_PATH/Cargo.toml -- $clippy_check_only; cargo fmt --all $check --manifest-path=$BUILDER_PATH/Cargo.toml; info "VSCode extension: cargo clippy and fmt"; - cargo clippy --all-targets --all-features --tests --manifest-path=$VSCODE_PATH/Cargo.toml -- $clippy_check_only; + cargo clippy --all-targets --all-features --manifest-path=$VSCODE_PATH/Cargo.toml -- $clippy_check_only; cargo fmt --all $check --manifest-path=$VSCODE_PATH/Cargo.toml; info "test_utils: cargo clippy and fmt" - cargo clippy --all-targets --all-features --tests --manifest-path=$TEST_UTILS_PATH/Cargo.toml -- $clippy_check_only; + cargo clippy --all-targets --all-features --manifest-path=$TEST_UTILS_PATH/Cargo.toml -- $clippy_check_only; cargo fmt --all $check --manifest-path=$TEST_UTILS_PATH/Cargo.toml; info "cargo audit"; diff --git a/client/package.json5 b/client/package.json5 index 35cdc1b3..d7440150 100644 --- a/client/package.json5 +++ b/client/package.json5 @@ -64,13 +64,13 @@ '@codemirror/legacy-modes': '^6.5.2', '@codemirror/state': '^6.6.0', '@codemirror/view': '6.38.8', - '@hpcc-js/wasm-graphviz': '^1.21.2', - '@mathjax/mathjax-newcm-font': '^4.1.1', + '@hpcc-js/wasm-graphviz': '^1.21.5', + '@mathjax/mathjax-newcm-font': '^4.1.2', codemirror: '^6.0.2', - mathjax: '^4.1.1', + mathjax: '^4.1.2', mermaid: '^11.14.0', 'pdfjs-dist': '5.4.624', - tinymce: '^8.4.0', + tinymce: '^8.5.0', 'toastify-js': '^1.12.0', }, devDependencies: { @@ -81,20 +81,20 @@ '@types/mocha': '^10.0.10', '@types/node': '^24.12.2', '@types/toastify-js': '^1.12.4', - '@typescript-eslint/eslint-plugin': '^8.58.2', - '@typescript-eslint/parser': '^8.58.2', + '@typescript-eslint/eslint-plugin': '^8.59.2', + '@typescript-eslint/parser': '^8.59.2', chai: '^6.2.2', esbuild: '^0.28.0', - eslint: '^10.2.0', + eslint: '^10.3.0', 'eslint-config-prettier': '^10.1.8', 'eslint-plugin-import': '^2.32.0', 'eslint-plugin-prettier': '^5.5.5', - globals: '^17.5.0', + globals: '^17.6.0', mocha: '^11.7.5', - 'npm-check-updates': '^21.0.0', + 'npm-check-updates': '^22.1.0', prettier: '^3.8.3', - typescript: '^6.0.2', - 'typescript-eslint': '^8.58.2', + typescript: '^6.0.3', + 'typescript-eslint': '^8.59.2', }, scripts: { test: 'echo "Error: no test specified" && exit 1', diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index a74d330b..8448c8a2 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -66,17 +66,17 @@ importers: specifier: 6.38.8 version: 6.38.8 '@hpcc-js/wasm-graphviz': - specifier: ^1.21.2 - version: 1.21.2 + specifier: ^1.21.5 + version: 1.21.5 '@mathjax/mathjax-newcm-font': - specifier: ^4.1.1 - version: 4.1.1 + specifier: ^4.1.2 + version: 4.1.2 codemirror: specifier: ^6.0.2 version: 6.0.2 mathjax: - specifier: ^4.1.1 - version: 4.1.1 + specifier: ^4.1.2 + version: 4.1.2 mermaid: specifier: ^11.14.0 version: 11.14.0 @@ -84,15 +84,15 @@ importers: specifier: 5.4.624 version: 5.4.624 tinymce: - specifier: ^8.4.0 - version: 8.4.0 + specifier: ^8.5.0 + version: 8.5.0 toastify-js: specifier: ^1.12.0 version: 1.12.0 devDependencies: '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.2.0) + version: 10.0.1(eslint@10.3.0) '@types/chai': specifier: ^5.2.3 version: 5.2.3 @@ -112,11 +112,11 @@ importers: specifier: ^1.12.4 version: 1.12.4 '@typescript-eslint/eslint-plugin': - specifier: ^8.58.2 - version: 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2) + 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.58.2 - version: 8.58.2(eslint@10.2.0)(typescript@6.0.2) + specifier: ^8.59.2 + version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) chai: specifier: ^6.2.2 version: 6.2.2 @@ -124,35 +124,35 @@ importers: specifier: ^0.28.0 version: 0.28.0 eslint: - specifier: ^10.2.0 - version: 10.2.0 + specifier: ^10.3.0 + version: 10.3.0 eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@10.2.0) + version: 10.1.8(eslint@10.3.0) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0) + version: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0) eslint-plugin-prettier: specifier: ^5.5.5 - version: 5.5.5(eslint-config-prettier@10.1.8(eslint@10.2.0))(eslint@10.2.0)(prettier@3.8.3) + version: 5.5.5(eslint-config-prettier@10.1.8(eslint@10.3.0))(eslint@10.3.0)(prettier@3.8.3) globals: - specifier: ^17.5.0 - version: 17.5.0 + specifier: ^17.6.0 + version: 17.6.0 mocha: specifier: ^11.7.5 version: 11.7.5 npm-check-updates: - specifier: ^21.0.0 - version: 21.0.0 + specifier: ^22.1.0 + version: 22.1.0 prettier: specifier: ^3.8.3 version: 3.8.3 typescript: - specifier: ^6.0.2 - version: 6.0.2 + specifier: ^6.0.3 + version: 6.0.3 typescript-eslint: - specifier: ^8.58.2 - version: 8.58.2(eslint@10.2.0)(typescript@6.0.2) + specifier: ^8.59.2 + version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) packages: @@ -177,8 +177,8 @@ packages: '@chevrotain/utils@12.0.0': resolution: {integrity: sha512-lB59uJoaGIfOOL9knQqQRfhl9g7x8/wqFkp13zTdkRu1huG9kg6IJs1O8hqj9rs6h7orGxHJUKb+mX3rPbWGhA==} - '@codemirror/autocomplete@6.20.1': - resolution: {integrity: sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==} + '@codemirror/autocomplete@6.20.2': + resolution: {integrity: sha512-G5FPkgIiLjOgZMjqVjvuKQ1rGPtHogLldJr33eFJdVLtmwY+giGrlv/ewljLz6b9BSQLkjxuwBc6g6omDM+YxQ==} '@codemirror/commands@6.10.3': resolution: {integrity: sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==} @@ -231,11 +231,11 @@ packages: '@codemirror/legacy-modes@6.5.2': resolution: {integrity: sha512-/jJbwSTazlQEDOQw2FJ8LEEKVS72pU0lx6oM54kGpL8t/NJ2Jda3CZ4pcltiKTdqYSRk3ug1B3pil1gsjA6+8Q==} - '@codemirror/lint@6.9.5': - resolution: {integrity: sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==} + '@codemirror/lint@6.9.6': + resolution: {integrity: sha512-6Kp7r6XfCi/D/5sdXieMfg9pJU1bUEx96WITuLU6ESaKizCz0QHFMjY/TaFSbigDdEAIgi93itLBIUETP4oK+A==} - '@codemirror/search@6.6.0': - resolution: {integrity: sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==} + '@codemirror/search@6.7.0': + resolution: {integrity: sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg==} '@codemirror/state@6.6.0': resolution: {integrity: sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==} @@ -243,6 +243,9 @@ packages: '@codemirror/view@6.38.8': resolution: {integrity: sha512-XcE9fcnkHCbWkjeKyi0lllwXmBLtyYb5dt89dJyx23I9+LSh5vZDIuk7OLG4VM1lgrXZQcY6cxyZyk5WVPRv/A==} + '@codemirror/view@6.42.0': + resolution: {integrity: sha512-+PJEyndSCrsS2oLH3DfWoLBcF3xfeyGXtLnpXqHY01kL3TogyCLD12hNvSu73ww2KFftrx3Rd0nGOigbSkU3Hw==} + '@esbuild/aix-ppc64@0.28.0': resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} engines: {node: '>=18'} @@ -438,15 +441,19 @@ packages: resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@hpcc-js/wasm-graphviz@1.21.2': - resolution: {integrity: sha512-UKvY3MSI1CfkOsVL6Wgg9m8S0x/28u27NgFX5UG+myTYfxU0Sl6jYKXQkcEQLZfulHKQjgHjz5/Rpw5R0CC3/g==} + '@hpcc-js/wasm-graphviz@1.21.5': + resolution: {integrity: sha512-rgFx1A5gd1BdMrLkrKg44cdOjTvEQVWODf1PDTwgiKDfmJioD+tyoMBvmEJdH6OC7rh1JaeqFJ2+r92F1Ip/sA==} + + '@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': @@ -460,8 +467,8 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.1.0': - resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + '@iconify/utils@3.1.2': + resolution: {integrity: sha512-jVf75icVVgSVGf9+QWBeCHdFL35yZ06HMHl9sCa059pITTP781lOacvRazfwAmXDKiBiUdQQMWVnuiw/RaQNhQ==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -494,8 +501,8 @@ packages: '@lezer/json@1.0.3': resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} - '@lezer/lr@1.4.8': - resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==} + '@lezer/lr@1.4.10': + resolution: {integrity: sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==} '@lezer/markdown@1.6.3': resolution: {integrity: sha512-jpGm5Ps+XErS+xA4urw7ogEGkeZOahVQF21Z6oECF0sj+2liwZopd2+I8uH5I/vZsRuuze3OxBREIANLf6KKUw==} @@ -518,85 +525,85 @@ packages: '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} - '@mathjax/mathjax-newcm-font@4.1.1': - resolution: {integrity: sha512-LeV5AWzoR7k/k2tg5mW0Ad3Jr9oK9guW/zBUIP8aoiIZcZIhvAV9dlbtUSqSe1wgEBUP1KOcJXcrE/NxOqkxlQ==} + '@mathjax/mathjax-newcm-font@4.1.2': + resolution: {integrity: sha512-lZHMjNP2XbABHA3kVn40rbse5ERUeMEmrGH03qLkCwxq4/5Z/eNLr0akw1MmQcqTwCbvkx1BFcmJ7RCfbRlw3Q==} '@mermaid-js/parser@1.1.0': resolution: {integrity: sha512-gxK9ZX2+Fex5zu8LhRQoMeMPEHbc73UKZ0FQ54YrQtUxE1VVhMwzeNtKRPAu5aXks4FasbMe4xB4bWrmq6Jlxw==} - '@napi-rs/canvas-android-arm64@0.1.98': - resolution: {integrity: sha512-O45Ifr0WZJUrSyg0QgB+67TiC0zYBRkBK+d43ZV4JtlwH3XttiVxLvlxEeULiH5y1MSELruspF0bjF6xXwJNPQ==} + '@napi-rs/canvas-android-arm64@0.1.100': + resolution: {integrity: sha512-hjhCKhntPv9+t4ckHymdx0phYNcVW+GKQR6Lzw2zE+pOVjOplSmtx9nNNknTjbEDLcuLZqA1y8ufKg1XfgftzQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@napi-rs/canvas-darwin-arm64@0.1.98': - resolution: {integrity: sha512-1b/nQhw6Isdv14JokUqat+i5wrAYD+ce3egiotedBGRUjVxYSj4s2uQCh2bFsyX5/9A5iTKVGsWoQhFft+j7Lg==} + '@napi-rs/canvas-darwin-arm64@0.1.100': + resolution: {integrity: sha512-2PcswRaC7Ly645DGt88///zuFDhJxJYdKAs1uU3mfk1atYkXufgcgLfBpk6Tm12nCQBaNt1wpybuPZ4qOhTo8A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@napi-rs/canvas-darwin-x64@0.1.98': - resolution: {integrity: sha512-oefzfBM8mwnyYp6S+yNXwjCoLdkOalFG24mssHgvrJDS0FulOryyI35Q7GdJGmrzuL4oo1XW3ZTOcTBLdJ8Zkg==} + '@napi-rs/canvas-darwin-x64@0.1.100': + resolution: {integrity: sha512-ePNZtj7pNIva/siZMg+HmbeozkIjqUIYdoymH8HaA3qK7LfzFN4WMBM8G6HQ9ZC+H3+Dnn5pqtiXpgLykaPOhw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.98': - resolution: {integrity: sha512-NDH5QXGmf8wlo5yhijCNGVFiJk7an5GvHwb2LHyfLQWY/6/S48i5+YtY6FPqPVVCUckNGudYOfXEJnb3/FiJGQ==} + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100': + resolution: {integrity: sha512-d5cDB48oWFGU8/XPhUOFAlySgb/VAu7D+s8fi55K1Pcfg8aPplHWqMgibhVLU8ky7Pyg/fuiVLz4Nf3JrSTuUA==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@napi-rs/canvas-linux-arm64-gnu@0.1.98': - resolution: {integrity: sha512-KBLLM6tu1xs80LSAqdSLBKkgct0S23MCEf/aq8yxzg5imAceqp1ulKeELgWaYm27MgpUhm3Q7jmegX12FfphwA==} + '@napi-rs/canvas-linux-arm64-gnu@0.1.100': + resolution: {integrity: sha512-rDxgxRu69RvDlX/bh9o22DxLsGr8EqsNgotL9+RwQE1S0b0cqeatqsw6aW45mukm0B42DIAaAacKaYQ8cqS1nw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@napi-rs/canvas-linux-arm64-musl@0.1.98': - resolution: {integrity: sha512-mfMNhjN5zDcJafqQ6sHj4Tc3YMTRxP5UA3MHtp/ssytBR/k6XO0x+1IIPtscnUKwha+ql1++WjDCGEgqu8OfWQ==} + '@napi-rs/canvas-linux-arm64-musl@0.1.100': + resolution: {integrity: sha512-K3mDW66N+xT2/V439u1alFANiBUjdEx2gLiNYnCmUsva5jZMxWTjafBYwTzYK+EMFMHrUoabuU+T1BIP5CgbYQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@napi-rs/canvas-linux-riscv64-gnu@0.1.98': - resolution: {integrity: sha512-nfW8esrcaeuhrO3qGA5cwuyk4Ak6cn2eB0LtEYtqROIl+fz06CNGNCU0M95+Tspw5ZgfSbc98SaigT5r5B3LVQ==} + '@napi-rs/canvas-linux-riscv64-gnu@0.1.100': + resolution: {integrity: sha512-mooqUBTIsccZpnoQC4NgrC1v6C1vof39etLNMnBwCY+p0gajWJvAHLGQ6g/gGyS5YrpDW+GefSN4+Cvcr08UWw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] libc: [glibc] - '@napi-rs/canvas-linux-x64-gnu@0.1.98': - resolution: {integrity: sha512-318UT8j6Gro2bTjtutjQXHWp9SLTNw+WRS4wQ6XIRPAyzBGnGHg7x2ndD+oqkPrrSRIbYLA5WoBcCasaF7lSTQ==} + '@napi-rs/canvas-linux-x64-gnu@0.1.100': + resolution: {integrity: sha512-1eCvkDCazm7FFhsT7DfGOdSaHgZVK3bt/dSBl5EWHOWmnz+I7j8tPseJqqD81NF+MH21jKUK4wQSDjN0mdhnTg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@napi-rs/canvas-linux-x64-musl@0.1.98': - resolution: {integrity: sha512-0vZhI74UxnA4VqlW4UvM0dFRrjE1RLEe/OXSBjzytGIxV+yOG4exlrhGoIpAQaIpQQQXMCdb1EmbvPC1k9vEqQ==} + '@napi-rs/canvas-linux-x64-musl@0.1.100': + resolution: {integrity: sha512-20arT6lnI19S68qNlii73TSEDbECNgzMz2EpldC1V3mZFuRkeujXkcebRk0LRJe9SEUAooYiLokfMViY8IX7yA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@napi-rs/canvas-win32-arm64-msvc@0.1.98': - resolution: {integrity: sha512-oiC/IxgFEEVcZ7VH7JXXlmgsqRvmFb57PIQ4gQck35IKFZCNUvdNCcN3OeoLP7Hpf5160MWJf9jj/+E5V0bSvw==} + '@napi-rs/canvas-win32-arm64-msvc@0.1.100': + resolution: {integrity: sha512-DZFFT1wIAg37LJw37yhMRFfjATd3vTQzjZ1Yki8u2vhO6Hi5VE6BVaGQ1aaDu7xb4iMErz+9EOwjpS7xcxFeBw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@napi-rs/canvas-win32-x64-msvc@0.1.98': - resolution: {integrity: sha512-ZqstKAJBSyZetU8udUvBQWPlGN9buawFvjuo9mgCAxzbOoJAgXX39ihec/nn42T5Vb6/qyn45eTimx5ND9kMEw==} + '@napi-rs/canvas-win32-x64-msvc@0.1.100': + resolution: {integrity: sha512-MyT1j3mHC2+Lu4pBi9mKyMJhtP6U7k7EldY7sj/uS5gJA65gTXt8MefJQXLJo5d/vZbuWmfxzkEUNc/urV3pHA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@napi-rs/canvas@0.1.98': - resolution: {integrity: sha512-WDg3lxYMqlrg49sDVUlrHVfIEPsd5AjYDRuGD6Fu82K5agJx0UnWA+l5qd53GNLRiMN2WhOw7FLR+Er5QB/0SA==} + '@napi-rs/canvas@0.1.100': + resolution: {integrity: sha512-xglYA6q3XO5P3BNJYxVZ1IV7DLVjp1Py6nwag88YntrS+3vKHyYcMqXVS4ZztJmwz2uGvz1FWhI/4LgbR5uQDA==} engines: {node: '>= 10'} '@pkgjs/parseargs@0.11.0': @@ -742,63 +749,63 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@typescript-eslint/eslint-plugin@8.58.2': - resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} + '@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.58.2 + '@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.58.2': - resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==} + '@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.58.2': - resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} + '@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.58.2': - resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} + '@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.58.2': - resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} + '@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.58.2': - resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==} + '@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.58.2': - resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} + '@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.58.2': - resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} + '@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.58.2': - resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} + '@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.58.2': - resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} + '@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} '@upsetjs/venn.js@2.0.0': @@ -814,8 +821,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -916,8 +923,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chevrotain-allstar@0.4.1: - resolution: {integrity: sha512-PvVJm3oGqrveUVW2Vt/eZGeiAIsJszYweUcYwcskg9e+IubNYKKD+rHHem7A6XVO22eDAL+inxNIGAzZ/VIWlA==} + chevrotain-allstar@0.4.3: + resolution: {integrity: sha512-2X4mkroolSMKqW+H22pyPMUVDqYZzPhephTmg/NODKb1IGYPHfxfhcW0EjS7wcPJNbze2i4vBWT7zT5FKF2lrQ==} peerDependencies: chevrotain: ^12.0.0 @@ -954,9 +961,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} @@ -980,8 +984,8 @@ packages: peerDependencies: cytoscape: ^3.2.0 - cytoscape@3.33.2: - resolution: {integrity: sha512-sj4HXd3DokGhzZAdjDejGvTPLqlt84vNFN8m7bGsOzDY5DyVcxIb2ejIXat2Iy7HxWhdT/N1oKyheJ5YdpsGuw==} + cytoscape@3.33.3: + resolution: {integrity: sha512-Gej7U+OKR+LZ8kvX7rb2HhCYJ0IhvEFsnkud4SB1PR+BUY/TsSO0dmOW59WEVLu51b1Rm+gQRKoz4bLYxGSZ2g==} engines: {node: '>=0.10'} d3-array@2.12.1: @@ -1184,8 +1188,8 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dompurify@3.4.0: - resolution: {integrity: sha512-nolgK9JcaUXMSmW+j1yaSvaEaoXYHwWyGJlkoCTghc97KgGDDSnpoU/PlEnw63Ah+TGKFOyY+X5LnxaWbCSfXg==} + dompurify@3.4.2: + resolution: {integrity: sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==} dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} @@ -1307,8 +1311,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.2.0: - resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==} + eslint@10.3.0: + resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1424,8 +1428,8 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - 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'} globalthis@1.0.4: @@ -1462,8 +1466,8 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} he@1.2.0: @@ -1482,6 +1486,9 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -1517,8 +1524,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - 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-data-view@1.0.2: @@ -1645,8 +1652,8 @@ packages: khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - langium@4.2.2: - resolution: {integrity: sha512-JUshTRAfHI4/MF9dH2WupvjSXyn8JBuUEWazB8ZVJUtXutT0doDlAv1XKbZ1Pb5sMexa8FF4CFBc0iiul7gbUQ==} + langium@4.2.3: + resolution: {integrity: sha512-sOPIi4hISFnY7twwV97ca1TsxpBtXq0URu/LL1AvxwccPG/RIBBlKS7a/f/EL6w8lTNaS0EFs/F+IdSOaqYpng==} engines: {node: '>=20.10.0', npm: '>=10.2.3'} layout-base@1.0.2: @@ -1682,8 +1689,8 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mathjax@4.1.1: - resolution: {integrity: sha512-NyvA8c39LUUM/m+oCg7sfA13hmw7yGkre5kiRWN9qzChCyhce39lecnbjgMA/oEUgq9Vyetk6u78apwcIXpW/A==} + mathjax@4.1.2: + resolution: {integrity: sha512-EQDS8xBpVg179BXoLeZ9JlwUFftOC5qylw20UlAMDhrTuooENigOocY79aNkkFSyvj/AST/89ZAo12+r5bPI4w==} mermaid@11.14.0: resolution: {integrity: sha512-GSGloRsBs+JINmmhl0JDwjpuezCsHB4WGI4NASHxL3fHo3o/BRXTxhDLKnln8/Q0lRFRyDdEjmk1/d5Sn1Xz8g==} @@ -1706,9 +1713,6 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - mlly@1.8.2: - resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - mocha@11.7.5: resolution: {integrity: sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1727,8 +1731,8 @@ packages: node-readable-to-web-readable-stream@0.4.2: resolution: {integrity: sha512-/cMZNI34v//jUTrI+UIo4ieHAB5EZRY/+7OmXZgBxaWBMcW2tGdceIw06RFxWxrKZ5Jp3sI2i5TsRo+CBhtVLQ==} - npm-check-updates@21.0.0: - resolution: {integrity: sha512-iGFLoW1QWsEDLR6Cnklyk+iHTf20hS84o79idR6AKhjSwk0whMdCd5FS0bTgEe6gMrRnJ0fGr2P6BEZ2zOelYg==} + npm-check-updates@22.1.0: + resolution: {integrity: sha512-zKjYAa205S6UyHkNJGmiLFmm6M31175cvUA3OdHvVlCdtyTfkyQbPWoov/GJEc6PWVbCV5e+60c7S2eVp0ybOA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: '>=10.0.0'} hasBin: true @@ -1800,9 +1804,6 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pdfjs-dist@5.4.624: resolution: {integrity: sha512-sm6TxKTtWv1Oh6n3C6J6a8odejb5uO4A4zo/2dgkHuC0iu8ZMAXOezEODkVaoVp8nX1Xzr+0WxFJJmUr45hQzg==} engines: {node: '>=20.16.0 || >=22.3.0'} @@ -1814,9 +1815,6 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - points-on-curve@0.2.0: resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} @@ -1877,8 +1875,8 @@ packages: rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} safe-buffer@5.2.1: @@ -1990,8 +1988,8 @@ packages: style-mod@4.1.3: resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} - stylis@4.3.6: - resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + stylis@4.4.0: + resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -2009,16 +2007,16 @@ packages: resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} - tinyexec@1.1.1: - resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} + tinyexec@1.1.2: + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} engines: {node: '>=18'} tinyglobby@0.2.16: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} - tinymce@8.4.0: - resolution: {integrity: sha512-Q/0/iLycB7hgSkOBoRqfceOz/7Obs9zIo0DwTRuvrReLxb6qdz/1vI7aVJMcW2BAuW80QqZiTyYdVM2amBkqIg==} + tinymce@8.5.0: + resolution: {integrity: sha512-DnKEfPNQnOJc8Ca1roZBs/GSbkAZyIIbC4p8eHZyZQi85OSAXtiVNYMaRxo4mzsGKpa0sA4/Us4KXQkX8q7w2A==} toastify-js@1.12.0: resolution: {integrity: sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==} @@ -2056,21 +2054,18 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.58.2: - resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==} + typescript-eslint@8.59.2: + resolution: {integrity: sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==} 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@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true - ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -2081,8 +2076,8 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + uuid@11.1.1: + resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} hasBin: true vscode-jsonrpc@8.2.0: @@ -2169,7 +2164,7 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.6.0 - tinyexec: 1.1.1 + tinyexec: 1.1.2 '@braintree/sanitize-url@7.1.2': {} @@ -2188,7 +2183,7 @@ snapshots: '@chevrotain/utils@12.0.0': {} - '@codemirror/autocomplete@6.20.1': + '@codemirror/autocomplete@6.20.2': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 @@ -2209,7 +2204,7 @@ snapshots: '@codemirror/lang-css@6.3.1': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@lezer/common': 1.5.2 @@ -2217,7 +2212,7 @@ snapshots: '@codemirror/lang-go@6.0.1': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@lezer/common': 1.5.2 @@ -2225,7 +2220,7 @@ snapshots: '@codemirror/lang-html@6.4.11': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/lang-css': 6.3.1 '@codemirror/lang-javascript': 6.2.5 '@codemirror/language': 6.12.3 @@ -2242,9 +2237,9 @@ snapshots: '@codemirror/lang-javascript@6.2.5': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 - '@codemirror/lint': 6.9.5 + '@codemirror/lint': 6.9.6 '@codemirror/state': 6.6.0 '@codemirror/view': 6.38.8 '@lezer/common': 1.5.2 @@ -2257,7 +2252,7 @@ snapshots: '@codemirror/lang-markdown@6.5.0': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/lang-html': 6.4.11 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 @@ -2275,7 +2270,7 @@ snapshots: '@codemirror/lang-python@6.2.1': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@lezer/common': 1.5.2 @@ -2288,16 +2283,16 @@ snapshots: '@codemirror/lang-sql@6.10.0': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@codemirror/lang-xml@6.1.0': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.38.8 @@ -2306,12 +2301,12 @@ snapshots: '@codemirror/lang-yaml@6.1.3': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@lezer/yaml': 1.0.4 '@codemirror/language@6.12.3': @@ -2320,20 +2315,20 @@ snapshots: '@codemirror/view': 6.38.8 '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 style-mod: 4.1.3 '@codemirror/legacy-modes@6.5.2': dependencies: '@codemirror/language': 6.12.3 - '@codemirror/lint@6.9.5': + '@codemirror/lint@6.9.6': dependencies: '@codemirror/state': 6.6.0 - '@codemirror/view': 6.38.8 + '@codemirror/view': 6.42.0 crelt: 1.0.6 - '@codemirror/search@6.6.0': + '@codemirror/search@6.7.0': dependencies: '@codemirror/state': 6.6.0 '@codemirror/view': 6.38.8 @@ -2350,6 +2345,13 @@ snapshots: style-mod: 4.1.3 w3c-keyname: 2.2.8 + '@codemirror/view@6.42.0': + dependencies: + '@codemirror/state': 6.6.0 + crelt: 1.0.6 + style-mod: 4.1.3 + w3c-keyname: 2.2.8 + '@esbuild/aix-ppc64@0.28.0': optional: true @@ -2428,9 +2430,9 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)': dependencies: - eslint: 10.2.0 + eslint: 10.3.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -2451,9 +2453,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.2.0)': + '@eslint/js@10.0.1(eslint@10.3.0)': optionalDependencies: - eslint: 10.2.0 + eslint: 10.3.0 '@eslint/object-schema@3.0.5': {} @@ -2462,26 +2464,31 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 - '@hpcc-js/wasm-graphviz@1.21.2': {} + '@hpcc-js/wasm-graphviz@1.21.5': {} - '@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': {} '@iconify/types@2.0.0': {} - '@iconify/utils@3.1.0': + '@iconify/utils@3.1.2': dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/types': 2.0.0 - mlly: 1.8.2 + import-meta-resolve: 4.2.0 '@isaacs/cliui@8.0.2': dependencies: @@ -2498,19 +2505,19 @@ snapshots: dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@lezer/css@1.3.3': dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@lezer/go@1.0.1': dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@lezer/highlight@1.2.3': dependencies: @@ -2520,27 +2527,27 @@ snapshots: dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@lezer/java@1.1.3': dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@lezer/javascript@1.5.4': dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@lezer/json@1.0.3': dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 - '@lezer/lr@1.4.8': + '@lezer/lr@1.4.10': dependencies: '@lezer/common': 1.5.2 @@ -2553,86 +2560,86 @@ snapshots: dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@lezer/python@1.1.18': dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@lezer/rust@1.0.2': dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@lezer/xml@1.0.6': dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@lezer/yaml@1.0.4': dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@marijn/find-cluster-break@1.0.2': {} - '@mathjax/mathjax-newcm-font@4.1.1': {} + '@mathjax/mathjax-newcm-font@4.1.2': {} '@mermaid-js/parser@1.1.0': dependencies: - langium: 4.2.2 + langium: 4.2.3 - '@napi-rs/canvas-android-arm64@0.1.98': + '@napi-rs/canvas-android-arm64@0.1.100': optional: true - '@napi-rs/canvas-darwin-arm64@0.1.98': + '@napi-rs/canvas-darwin-arm64@0.1.100': optional: true - '@napi-rs/canvas-darwin-x64@0.1.98': + '@napi-rs/canvas-darwin-x64@0.1.100': optional: true - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.98': + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100': optional: true - '@napi-rs/canvas-linux-arm64-gnu@0.1.98': + '@napi-rs/canvas-linux-arm64-gnu@0.1.100': optional: true - '@napi-rs/canvas-linux-arm64-musl@0.1.98': + '@napi-rs/canvas-linux-arm64-musl@0.1.100': optional: true - '@napi-rs/canvas-linux-riscv64-gnu@0.1.98': + '@napi-rs/canvas-linux-riscv64-gnu@0.1.100': optional: true - '@napi-rs/canvas-linux-x64-gnu@0.1.98': + '@napi-rs/canvas-linux-x64-gnu@0.1.100': optional: true - '@napi-rs/canvas-linux-x64-musl@0.1.98': + '@napi-rs/canvas-linux-x64-musl@0.1.100': optional: true - '@napi-rs/canvas-win32-arm64-msvc@0.1.98': + '@napi-rs/canvas-win32-arm64-msvc@0.1.100': optional: true - '@napi-rs/canvas-win32-x64-msvc@0.1.98': + '@napi-rs/canvas-win32-x64-msvc@0.1.100': optional: true - '@napi-rs/canvas@0.1.98': + '@napi-rs/canvas@0.1.100': optionalDependencies: - '@napi-rs/canvas-android-arm64': 0.1.98 - '@napi-rs/canvas-darwin-arm64': 0.1.98 - '@napi-rs/canvas-darwin-x64': 0.1.98 - '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.98 - '@napi-rs/canvas-linux-arm64-gnu': 0.1.98 - '@napi-rs/canvas-linux-arm64-musl': 0.1.98 - '@napi-rs/canvas-linux-riscv64-gnu': 0.1.98 - '@napi-rs/canvas-linux-x64-gnu': 0.1.98 - '@napi-rs/canvas-linux-x64-musl': 0.1.98 - '@napi-rs/canvas-win32-arm64-msvc': 0.1.98 - '@napi-rs/canvas-win32-x64-msvc': 0.1.98 + '@napi-rs/canvas-android-arm64': 0.1.100 + '@napi-rs/canvas-darwin-arm64': 0.1.100 + '@napi-rs/canvas-darwin-x64': 0.1.100 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.100 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.100 + '@napi-rs/canvas-linux-arm64-musl': 0.1.100 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.100 + '@napi-rs/canvas-linux-x64-gnu': 0.1.100 + '@napi-rs/canvas-linux-x64-musl': 0.1.100 + '@napi-rs/canvas-win32-arm64-msvc': 0.1.100 + '@napi-rs/canvas-win32-x64-msvc': 0.1.100 optional: true '@pkgjs/parseargs@0.11.0': @@ -2791,95 +2798,95 @@ snapshots: '@types/trusted-types@2.0.7': optional: true - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2)': + '@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.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.2 - eslint: 10.2.0 + '@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.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2)': + '@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.2 + '@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(supports-color@8.1.1) - eslint: 10.2.0 - typescript: 6.0.2 + eslint: 10.3.0 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.2(typescript@6.0.2)': + '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 debug: 4.4.3(supports-color@8.1.1) - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.58.2': + '@typescript-eslint/scope-manager@8.59.2': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 - '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': dependencies: - typescript: 6.0.2 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)': + '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@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(supports-color@8.1.1) - eslint: 10.2.0 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + 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.58.2': {} + '@typescript-eslint/types@8.59.2': {} - '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.2)': + '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.58.2(typescript@6.0.2) - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@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(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)': + '@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.0) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - eslint: 10.2.0 - typescript: 6.0.2 + '@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.58.2': + '@typescript-eslint/visitor-keys@8.59.2': dependencies: - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.59.2 eslint-visitor-keys: 5.0.1 '@upsetjs/venn.js@2.0.0': @@ -2893,7 +2900,7 @@ snapshots: acorn@8.16.0: {} - ajv@6.14.0: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -3015,7 +3022,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chevrotain-allstar@0.4.1(chevrotain@12.0.0): + chevrotain-allstar@0.4.3(chevrotain@12.0.0): dependencies: chevrotain: 12.0.0 lodash-es: 4.18.1 @@ -3040,11 +3047,11 @@ snapshots: codemirror@6.0.2: dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/commands': 6.10.3 '@codemirror/language': 6.12.3 - '@codemirror/lint': 6.9.5 - '@codemirror/search': 6.6.0 + '@codemirror/lint': 6.9.6 + '@codemirror/search': 6.7.0 '@codemirror/state': 6.6.0 '@codemirror/view': 6.38.8 @@ -3060,8 +3067,6 @@ snapshots: concat-map@0.0.1: {} - confbox@0.1.8: {} - cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -3078,17 +3083,17 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.2): + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.3): dependencies: cose-base: 1.0.3 - cytoscape: 3.33.2 + cytoscape: 3.33.3 - cytoscape-fcose@2.2.0(cytoscape@3.33.2): + cytoscape-fcose@2.2.0(cytoscape@3.33.3): dependencies: cose-base: 2.2.0 - cytoscape: 3.33.2 + cytoscape: 3.33.3 - cytoscape@3.33.2: {} + cytoscape@3.33.3: {} d3-array@2.12.1: dependencies: @@ -3318,7 +3323,7 @@ snapshots: dependencies: esutils: 2.0.3 - dompurify@3.4.0: + dompurify@3.4.2: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -3358,7 +3363,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -3376,7 +3381,7 @@ snapshots: object.assign: 4.1.7 own-keys: 1.0.1 regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 + safe-array-concat: 1.1.4 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 @@ -3404,11 +3409,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 es-to-primitive@1.3.0: dependencies: @@ -3449,29 +3454,29 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.2.0): + eslint-config-prettier@10.1.8(eslint@10.3.0): dependencies: - eslint: 10.2.0 + eslint: 10.3.0 eslint-import-resolver-node@0.3.10: dependencies: debug: 3.2.7 - is-core-module: 2.16.1 + is-core-module: 2.16.2 resolve: 2.0.0-next.6 transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.2.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - eslint: 10.2.0 + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + eslint: 10.3.0 eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -3480,11 +3485,11 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 10.2.0 + eslint: 10.3.0 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.2.0) - hasown: 2.0.2 - is-core-module: 2.16.1 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0) + hasown: 2.0.3 + is-core-module: 2.16.2 is-glob: 4.0.3 minimatch: 3.1.5 object.fromentries: 2.0.8 @@ -3494,20 +3499,20 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@10.2.0))(eslint@10.2.0)(prettier@3.8.3): + eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@10.3.0))(eslint@10.3.0)(prettier@3.8.3): dependencies: - eslint: 10.2.0 + eslint: 10.3.0 prettier: 3.8.3 prettier-linter-helpers: 1.0.1 synckit: 0.11.12 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@10.2.0) + eslint-config-prettier: 10.1.8(eslint@10.3.0) eslint-scope@9.1.2: dependencies: @@ -3520,19 +3525,19 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.2.0: + eslint@10.3.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0) + '@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 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.1 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - ajv: 6.14.0 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 @@ -3620,7 +3625,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 - hasown: 2.0.2 + hasown: 2.0.3 is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -3639,7 +3644,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 math-intrinsics: 1.1.0 get-proto@1.0.1: @@ -3666,7 +3671,7 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - globals@17.5.0: {} + globals@17.6.0: {} globalthis@1.0.4: dependencies: @@ -3695,7 +3700,7 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.2: + hasown@2.0.3: dependencies: function-bind: 1.1.2 @@ -3709,12 +3714,14 @@ snapshots: ignore@7.0.5: {} + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.2 + hasown: 2.0.3 side-channel: 1.1.0 internmap@1.0.1: {} @@ -3746,9 +3753,9 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 is-data-view@1.0.2: dependencies: @@ -3799,7 +3806,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 is-set@2.0.3: {} @@ -3869,11 +3876,11 @@ snapshots: khroma@2.1.0: {} - langium@4.2.2: + langium@4.2.3: dependencies: '@chevrotain/regexp-to-ast': 12.0.0 chevrotain: 12.0.0 - chevrotain-allstar: 0.4.1(chevrotain@12.0.0) + chevrotain-allstar: 0.4.3(chevrotain@12.0.0) vscode-languageserver: 9.0.1 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 @@ -3904,33 +3911,33 @@ snapshots: math-intrinsics@1.1.0: {} - mathjax@4.1.1: + mathjax@4.1.2: dependencies: - '@mathjax/mathjax-newcm-font': 4.1.1 + '@mathjax/mathjax-newcm-font': 4.1.2 mermaid@11.14.0: dependencies: '@braintree/sanitize-url': 7.1.2 - '@iconify/utils': 3.1.0 + '@iconify/utils': 3.1.2 '@mermaid-js/parser': 1.1.0 '@types/d3': 7.4.3 '@upsetjs/venn.js': 2.0.0 - cytoscape: 3.33.2 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.2) - cytoscape-fcose: 2.2.0(cytoscape@3.33.2) + cytoscape: 3.33.3 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.3) + cytoscape-fcose: 2.2.0(cytoscape@3.33.3) d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.14 dayjs: 1.11.20 - dompurify: 3.4.0 + dompurify: 3.4.2 katex: 0.16.45 khroma: 2.1.0 lodash-es: 4.18.1 marked: 16.4.2 roughjs: 4.6.6 - stylis: 4.3.6 + stylis: 4.4.0 ts-dedent: 2.2.0 - uuid: 11.1.0 + uuid: 11.1.1 minimatch@10.2.5: dependencies: @@ -3948,13 +3955,6 @@ snapshots: minipass@7.1.3: {} - mlly@1.8.2: - dependencies: - acorn: 8.16.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.3 - mocha@11.7.5: dependencies: browser-stdout: 1.3.1 @@ -3993,7 +3993,7 @@ snapshots: node-readable-to-web-readable-stream@0.4.2: optional: true - npm-check-updates@21.0.0: {} + npm-check-updates@22.1.0: {} object-inspect@1.13.4: {} @@ -4075,23 +4075,15 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.3 - pathe@2.0.3: {} - pdfjs-dist@5.4.624: optionalDependencies: - '@napi-rs/canvas': 0.1.98 + '@napi-rs/canvas': 0.1.100 node-readable-to-web-readable-stream: 0.4.2 picocolors@1.1.1: {} picomatch@4.0.4: {} - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.8.2 - pathe: 2.0.3 - points-on-curve@0.2.0: {} points-on-path@0.2.1: @@ -4142,7 +4134,7 @@ snapshots: resolve@2.0.0-next.6: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 + is-core-module: 2.16.2 node-exports-info: 1.6.0 object-keys: 1.1.1 path-parse: 1.0.7 @@ -4159,7 +4151,7 @@ snapshots: rw@1.3.3: {} - safe-array-concat@1.1.3: + safe-array-concat@1.1.4: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -4302,7 +4294,7 @@ snapshots: style-mod@4.1.3: {} - stylis@4.3.6: {} + stylis@4.4.0: {} supports-color@7.2.0: dependencies: @@ -4318,20 +4310,20 @@ snapshots: dependencies: '@pkgr/core': 0.2.9 - tinyexec@1.1.1: {} + tinyexec@1.1.2: {} tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - tinymce@8.4.0: {} + tinymce@8.5.0: {} toastify-js@1.12.0: {} - ts-api-utils@2.5.0(typescript@6.0.2): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - typescript: 6.0.2 + typescript: 6.0.3 ts-dedent@2.2.0: {} @@ -4379,20 +4371,18 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.58.2(eslint@10.2.0)(typescript@6.0.2): + typescript-eslint@8.59.2(eslint@10.3.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - eslint: 10.2.0 - typescript: 6.0.2 + '@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/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@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) + eslint: 10.3.0 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - typescript@6.0.2: {} - - ufo@1.6.3: {} + typescript@6.0.3: {} unbox-primitive@1.1.0: dependencies: @@ -4407,7 +4397,7 @@ snapshots: dependencies: punycode: 2.3.1 - uuid@11.1.0: {} + uuid@11.1.1: {} vscode-jsonrpc@8.2.0: {} diff --git a/client/src/CodeChatEditor.mts b/client/src/CodeChatEditor.mts index 59411f89..672b8b6c 100644 --- a/client/src/CodeChatEditor.mts +++ b/client/src/CodeChatEditor.mts @@ -69,13 +69,14 @@ import { CodeMirrorDiffable, UpdateMessageContents, CodeMirror, - autosave_timeout_ms, + auto_update_timeout_ms, rand, } from "./shared.mjs"; import { show_toast } from "./show_toast.mjs"; // ### CSS import "./css/CodeChatEditor.css"; +import { CursorPosition } from "./rust-types/CursorPosition.js"; // Data structures // --------------- @@ -103,12 +104,12 @@ declare global { open_lp: ( codechat_for_web: CodeChatForWeb, is_re_translation: boolean, - cursor_line?: number, + cursor_position?: CursorPosition, scroll_line?: number, ) => Promise; - on_save: (_only_if_dirty: boolean) => Promise; + send_update: (_only_if_dirty: boolean) => Promise; scroll_to_line: ( - cursor_line?: number, + cursor_position?: CursorPosition, scroll_line?: number, ) => void; show_toast: (text: string) => void; @@ -121,9 +122,9 @@ declare global { // Globals // ------- // -// The ID of the autosave timer; when this timer expires, the document will be -// autosaved. -let autosaveTimeoutId: null | number = null; +// The ID of the auto update timer; when this timer expires, the document will +// be updated. +let autoUpdateTimeoutId: null | number = null; // Store the lexer info for the currently-loaded language. // @@ -172,7 +173,7 @@ const is_doc_only = () => { const open_lp = async ( codechat_for_web: CodeChatForWeb, is_re_translation: boolean, - cursor_line?: number, + cursor_position?: CursorPosition, scroll_line?: number, ) => // Wait for the DOM to load before opening the file. @@ -181,7 +182,7 @@ const open_lp = async ( await _open_lp( codechat_for_web, is_re_translation, - cursor_line, + cursor_position, scroll_line, ); resolve(); @@ -205,7 +206,7 @@ const _open_lp = async ( // associated metadata. See [`AllSource`](#AllSource). codechat_for_web: CodeChatForWeb, is_re_translation: boolean, - cursor_line?: number, + cursor_position?: CursorPosition, scroll_line?: number, ) => { // Note that globals, such as `is_dirty` and document contents, may change @@ -218,8 +219,8 @@ const _open_lp = async ( // Process any pending events before proceeding. Sometimes, TinyMCE has a // pending edit that hasn't been processed yet, meaning the `is_dirty` flag - // is incorrect. - tinymce.activeEditor?.save(); + // is incorrect. Use the raw format; see the implementation notes. + tinymce.activeEditor?.save({ format: "raw" }); await new Promise((resolve) => setTimeout(resolve, 0)); // The only call to `await` is based on TinyMCE init, which should only @@ -289,11 +290,11 @@ const _open_lp = async ( codechat_body.innerHTML = `
${doc_content}
`; await init({ selector: ".CodeChat-doc-contents", - // In the doc-only mode, add autosave functionality. While - // there is an + // In the doc-only mode, add auto update functionality. + // While there is an // [autosave plugin](https://www.tiny.cloud/docs/tinymce/6/autosave/), // this autosave functionality is completely different from - // the autosave provided here. Per + // the auto update provided here. Per // [handling editor events](https://www.tiny.cloud/docs/tinymce/6/events/#handling-editor-events), // this is how to create a TinyMCE event handler. setup: (editor: Editor) => { @@ -309,7 +310,18 @@ const _open_lp = async ( // `event` data instead. event.target.setDirty(false); is_dirty = true; - startAutosaveTimer(); + startAutoUpdateTimer(); + }, + ); + // Send updates on cursor movement. + editor.on( + "SelectionChange", + ( + _event: EditorEvent< + Events.EditorEventMap["SelectionChange"] + >, + ) => { + startAutoUpdateTimer(); }, ); }, @@ -331,7 +343,7 @@ const _open_lp = async ( } } await mathJaxTypeset(codechat_body); - scroll_to_line(cursor_line, scroll_line); + scroll_to_line(cursor_position, scroll_line); } else { if (is_dirty && "Diff" in source) { // Send an `OutOfSync` response, so that the IDE will send the @@ -349,7 +361,7 @@ const _open_lp = async ( codechat_body, codechat_for_web, [], - cursor_line, + cursor_position, scroll_line, ); } @@ -359,8 +371,8 @@ const _open_lp = async ( // // Per the discussion at the beginning of this function, the dirty // contents have been overwritten by contents from the IDE. By the same - // reasoning, restart the autosave timer. - clearAutosaveTimer(); + // reasoning, restart the auto update timer. + clearAutoUpdateTimer(); is_dirty = false; // If tests should be run, then the @@ -383,7 +395,20 @@ const save_lp = async ( is_re_translation: false, }; if (is_doc_only()) { - // TODO: set cursor/scroll position. + const location = saveSelection(); + // If there's a selection (cursor location), send it to the server, + // which will locate the corresponding line. + if (location.selection_offset !== undefined) { + update.cursor_position = { + DomLocation: { + dom_path: location.selection_path, + dom_offset: location.selection_offset, + // Use this since it's a Markdown-only file; the server will + // ignore this value. + from: 0, + }, + }; + } } else { set_CodeMirror_positions(update); } @@ -404,7 +429,7 @@ const save_lp = async ( // To save a document only, simply get the HTML from the only // Tiny MCE div. Update the `doc_contents` to stay in sync with // the Server. - doc_content = tinymce.activeEditor!.save(); + doc_content = tinymce.activeEditor!.save({ format: "raw" }); ( code_mirror_diffable as { Plain: CodeMirror; @@ -445,7 +470,7 @@ export const saveSelection = () => { if (sel?.anchorNode) { // Find a path from the selection back to the containing div. for ( - let current_node = sel.anchorNode, is_first = true; + let current_node = sel.anchorNode; // Continue until we find the div which contains the doc block // contents: either it's not an element (such as a div), ... current_node.nodeType !== Node.ELEMENT_NODE || @@ -457,29 +482,21 @@ export const saveSelection = () => { // the TinyMCE div and returns the overall div. I don't know // why. !(current_node as Element).classList.contains("CodeChat-doc")); - current_node = current_node.parentNode!, is_first = false + current_node = current_node.parentNode! ) { // Store the index of this node in its' parent list of child - // nodes/children. Use `childNodes` on the first iteration, since - // the selection is often in a text node, which isn't in the - // `parents` list. However, using `childNodes` all the time causes - // trouble when reversing the selection -- sometimes, the - // `childNodes` change based on whether text nodes (such as a - // newline) are included are not after tinyMCE parses the content. + // nodes/children. const p = current_node.parentNode; // In case we go off the rails, give up if there are no more // parents. if (p === null) { return { selection_path: [], - selection_offset: 0, + selection_offset: undefined, }; } selection_path.unshift( - Array.prototype.indexOf.call( - is_first ? p.childNodes : p.children, - current_node, - ), + Array.prototype.indexOf.call(p.childNodes, current_node), ); } } @@ -499,40 +516,36 @@ export const restoreSelection = ({ // the selected node. if (selection_path.length && typeof selection_offset === "number") { let selection_node = tinymce.activeEditor!.getContentAreaContainer(); - for ( - ; - selection_path.length && - // If something goes wrong, bail out instead of producing - // exceptions. - selection_node !== undefined; - selection_node = - // As before, use the more-consistent `children` except for the - // last element, where we might be selecting a `text` node. - ( - selection_path.length > 1 - ? selection_node.children - : selection_node.childNodes - )[selection_path.shift()!]! as HTMLElement - ); - // Exit on failure. - if (selection_node === undefined) { - return; + while (selection_path.length) { + const new_selection_node = selection_node.childNodes[ + selection_path.shift()! + ] as HTMLElement; + // If we get lost during the descent, then stop just before that. + if (new_selection_node === undefined) { + break; + } + selection_node = new_selection_node; } + // In case of edits, avoid an offset past the end of the node. + const final_selection_offset = Math.min( + selection_offset, + (selection_node.nodeValue?.length ?? 1) - 1, + ); // Use that to set the selection. tinymce.activeEditor!.selection.setCursorLocation( selection_node, - // In case of edits, avoid an offset past the end of the node. - Math.min(selection_offset, selection_node.nodeValue?.length ?? 0), + final_selection_offset, ); } }; -// Save CodeChat Editor contents. -const on_save = async (only_if_dirty: boolean = false) => { +// Save CodeChat Editor contents if dirty; send the current selection and scroll +// position. +const send_update = async (only_if_dirty: boolean = false) => { if (only_if_dirty && !is_dirty) { return; } - clearAutosaveTimer(); + clearAutoUpdateTimer(); // Save the provided contents back to the filesystem, by // sending an update message over the websocket. @@ -544,25 +557,26 @@ const on_save = async (only_if_dirty: boolean = false) => { is_dirty = false; }; -// ### Autosave feature +// ### Auto update feature // -// Schedule an autosave; call this whenever the document is modified. -export const startAutosaveTimer = () => { - // When the document is changed, perform an autosave after no changes have - // occurred for a little while. To do this, first cancel any current - // timeout... - clearAutosaveTimer(); - // ...then start another timeout which saves the document when it expires. - autosaveTimeoutId = window.setTimeout(() => { - console_log("CodeChat Editor Client: autosaving."); - on_save(); - }, autosave_timeout_ms); +// Schedule an autosave and/or a selection/scroll update; call this whenever the +// document is modified or the selection/scroll offset changes. +export const startAutoUpdateTimer = () => { + // When the document/selection/scroll position is changed, perform an auto + // update after no changes have occurred for a little while. To do this, + // first cancel any current timeout... + clearAutoUpdateTimer(); + // ...then start another timeout which updates the document when it expires. + autoUpdateTimeoutId = window.setTimeout(() => { + console_log("CodeChat Editor Client: auto updating."); + send_update(); + }, auto_update_timeout_ms); }; -const clearAutosaveTimer = () => { - if (autosaveTimeoutId !== null) { - clearTimeout(autosaveTimeoutId); - autosaveTimeoutId = null; +const clearAutoUpdateTimer = () => { + if (autoUpdateTimeoutId !== null) { + clearTimeout(autoUpdateTimeoutId); + autoUpdateTimeoutId = null; } }; @@ -645,7 +659,7 @@ const on_click = (event: MouseEvent) => { // Save the current document, then navigate to the provided URL, which must be a // reference to another CodeChat Editor document. const save_then_navigate = (codeChatEditorUrl: URL) => { - on_save(true).then((_value) => { + send_update(true).then((_value) => { // Avoid recursion! window.navigation.removeEventListener("navigate", on_navigate); parent.window.CodeChatEditorFramework.webSocketComm.current_file( @@ -656,11 +670,14 @@ const save_then_navigate = (codeChatEditorUrl: URL) => { // This can be called by the framework. Therefore, make no assumptions about // variables being valid; it be called before a file is loaded, etc. -const scroll_to_line = (cursor_line?: number, scroll_line?: number) => { +const scroll_to_line = ( + cursor_position?: CursorPosition, + scroll_line?: number, +) => { if (is_doc_only()) { // TODO. } else { - codemirror_scroll_to_line(cursor_line, scroll_line); + codemirror_scroll_to_line(cursor_position, scroll_line); } }; @@ -702,7 +719,7 @@ on_dom_content_loaded(async () => { window.CodeChatEditor = { open_lp, - on_save, + send_update, scroll_to_line, show_toast, allow_navigation: false, diff --git a/client/src/CodeChatEditorFramework.mts b/client/src/CodeChatEditorFramework.mts index f871a210..b25354e5 100644 --- a/client/src/CodeChatEditorFramework.mts +++ b/client/src/CodeChatEditorFramework.mts @@ -47,6 +47,7 @@ import { on_dom_content_loaded, } from "./CodeChatEditor.mjs"; import { ResultErrTypes } from "./rust-types/ResultErrTypes.js"; +import { CursorPosition } from "./rust-types/CursorPosition.js"; // Websocket // --------- @@ -262,7 +263,7 @@ class WebSocketComm { // If the page is still loading, then don't save. // Otherwise, save the editor contents if necessary. const cce = get_client(); - await cce?.on_save(true); + await cce?.send_update(true); // Now, it's safe to load a new file. Tell the client to // allow this navigation -- the document it contains has // already been saved. @@ -427,7 +428,7 @@ const get_client = () => root_iframe?.contentWindow?.CodeChatEditor; const set_content = async ( contents: CodeChatForWeb, is_re_translation: boolean, - cursor_line?: number, + cursor_position?: CursorPosition, scroll_line?: number, ) => { const client = get_client(); @@ -448,7 +449,7 @@ const set_content = async ( await root_iframe!.contentWindow!.CodeChatEditor.open_lp( contents, is_re_translation, - cursor_line, + cursor_position, scroll_line, ); } diff --git a/client/src/CodeMirror-integration.mts b/client/src/CodeMirror-integration.mts index fa076ab6..5af4318f 100644 --- a/client/src/CodeMirror-integration.mts +++ b/client/src/CodeMirror-integration.mts @@ -94,7 +94,7 @@ import { Editor, EditorEvent, Events } from "tinymce"; // ### Local import { set_is_dirty, - startAutosaveTimer, + startAutoUpdateTimer, saveSelection, restoreSelection, } from "./CodeChatEditor.mjs"; @@ -108,6 +108,7 @@ import { } from "./shared.mjs"; import { assert } from "./assert.mjs"; import { show_toast } from "./show_toast.mjs"; +import { CursorPosition } from "./rust-types/CursorPosition"; // Globals // ------- @@ -657,8 +658,9 @@ const on_dirty = ( // I'd like to extract this string, then untypeset only that string, not // the actual div. But I don't know how. mathJaxUnTypeset(contents_div); + // Use the raw format; see the implementation notes. const contents = is_tinymce - ? tinymce.activeEditor!.save() + ? tinymce.activeEditor!.save({ format: "raw" }) : contents_div.innerHTML; await mathJaxTypeset(contents_div); current_view.dispatch({ @@ -780,7 +782,7 @@ export const DocBlockPlugin = ViewPlugin.fromClass( const [contents_div, is_tinymce] = get_contents(target); // Send updated cursor/scroll info. - startAutosaveTimer(); + startAutoUpdateTimer(); // See if this is already a TinyMCE instance; if not, move it // here. @@ -815,8 +817,9 @@ export const DocBlockPlugin = ViewPlugin.fromClass( const old_contents_div = document.createElement("div"); old_contents_div.className = "CodeChat-doc-contents"; old_contents_div.contentEditable = "true"; - old_contents_div.innerHTML = - tinymce.activeEditor!.getContent(); + old_contents_div.innerHTML = tinymce.activeEditor!.save( + { format: "raw" }, + ); tinymce_div.parentNode!.insertBefore( old_contents_div, null, @@ -905,10 +908,10 @@ const autosaveExtension = EditorView.updateListener.of( } if (isChanged) { set_is_dirty(); - startAutosaveTimer(); + startAutoUpdateTimer(); } else if (v.selectionSet) { // Send an update if only the selection changed. - startAutosaveTimer(); + startAutoUpdateTimer(); } }, ); @@ -922,7 +925,7 @@ export const CodeMirror_load = async ( codechat_for_web: CodeChatForWeb, // Additional extensions. extensions: Array, - cursor_line?: number, + cursor_position?: CursorPosition, scroll_line?: number, ) => { if ("Plain" in codechat_for_web.source) { @@ -1089,6 +1092,18 @@ export const CodeMirror_load = async ( setTimeout(() => on_dirty(target_or_false)); }, ); + + // Send updates on cursor movement. + editor.on( + "SelectionChange", + ( + _event: EditorEvent< + Events.EditorEventMap["SelectionChange"] + >, + ) => { + startAutoUpdateTimer(); + }, + ); }, }); } else { @@ -1135,12 +1150,15 @@ export const CodeMirror_load = async ( annotations: noAutosaveAnnotation.of(true), }); } - scroll_to_line(cursor_line, scroll_line); + scroll_to_line(cursor_position, scroll_line); }; // Scroll to the provided `scroll_line`; place the cursor at `cursor_line`. -export const scroll_to_line = (cursor_line?: number, scroll_line?: number) => { - if (cursor_line === undefined && scroll_line === undefined) { +export const scroll_to_line = ( + cursor_position?: CursorPosition, + scroll_line?: number, +) => { + if (cursor_position === undefined && scroll_line === undefined) { return; } @@ -1150,13 +1168,19 @@ export const scroll_to_line = (cursor_line?: number, scroll_line?: number) => { const dispatch_data: TransactionSpec = { annotations: noAutosaveAnnotation.of(true), }; - if (cursor_line !== undefined) { + if (cursor_position !== undefined) { // Translate the line numbers to a position. - const cursor_pos = current_view?.state.doc.line(cursor_line).from; - dispatch_data.selection = { - anchor: cursor_pos, - head: cursor_pos, - }; + if ("Line" in cursor_position) { + const cursor_pos = current_view?.state.doc.line( + cursor_position.Line, + ).from; + dispatch_data.selection = { + anchor: cursor_pos, + head: cursor_pos, + }; + } else { + report_error("Not supported."); + } // If a scroll position is provided, use it; otherwise, scroll the // cursor into the current view. if (scroll_line == undefined) { @@ -1211,18 +1235,35 @@ export const set_CodeMirror_positions = ( ) => { // If a doc block has focus, then the CodeMirror selection reports line 1. // Use the starting line number of the doc block instead. - let cursor_line; const doc_block = document.activeElement?.closest(".CodeChat-doc"); + let cursor_position; if (doc_block) { - cursor_line = current_view.state.doc.lineAt( - current_view.posAtDOM(doc_block), - ).number; + const from = current_view.posAtDOM(doc_block); + const location = saveSelection(); + // If there's a selection in the doc block, pass the DOM location; + // otherwise, pass the line where the doc block starts. + if (location.selection_offset === undefined) { + cursor_position = { + Line: current_view.state.doc.lineAt(from).number, + }; + } else { + cursor_position = { + DomLocation: { + dom_path: location.selection_path, + dom_offset: location.selection_offset, + from, + }, + }; + } } else { - cursor_line = current_view.state.doc.lineAt( - current_view.state.selection.main.from, - ).number; + // For a code block, we can simply retrieve the line number. + cursor_position = { + Line: current_view.state.doc.lineAt( + current_view.state.selection.main.from, + ).number, + }; } - update_message_contents.cursor_position = cursor_line; + update_message_contents.cursor_position = cursor_position; // `current_view.viewport.from` isn't accurate, since it's not really the // top line, but a margin before it; see the diff --git a/client/src/shared.mts b/client/src/shared.mts index 334fc344..d3550b0f 100644 --- a/client/src/shared.mts +++ b/client/src/shared.mts @@ -19,7 +19,7 @@ // // The time, in ms, to wait between the last user edit and sending updated data // to the Server. -export const autosave_timeout_ms = 300; +export const auto_update_timeout_ms = 300; // Produce a whole random number. Fractional numbers aren't consistently // converted to the same number across JavaScript and Rust. Note that the mantissa of a JavaScript `Number` diff --git a/docs/implementation.md b/docs/implementation.md index 445d7776..427831c9 100644 --- a/docs/implementation.md +++ b/docs/implementation.md @@ -358,6 +358,41 @@ removed them. This means that some HTML tags won't be properly closed, since the closing tags are removed from the HTML. This is fixed by later HTML processing steps (currently, by TinyMCE), which properly closes tags. +### Cursor tracking + +Ideally, both the scroll location and the cursor position/current selection +would be synced between the IDE and the Client. However, it's difficult to +maintain the selection through a number of transformations which occur between +the IDE and Client. + +#### Client to IDE selection sync + +One approach to maintaining the selection through these transformations is to +insert a marker character in the Client, transform this to the IDE, then recover +the line number of the marker, removing it after the transformations. However, +this requires sending updated text each time the cursor moves; for a Markdown +document, this means sending the entire document. Therefore, this approach is +impractical. + +A second approach is to store the selection as offsets with the HTML DOM in the +Client; the server then re-parses the DOM, inserts a marker, performs +transformations, then recovers the line number and removes the marker. This is +the approach taken. + +However, this leads to several challenges: whitespace differences in HTML are +often not rendered, but produce different DOMs. TinyMCE minifies incoming HTML, +adds additional nodes and attributes for editing, then removes these and +de-minifies when retrieving the HTML from the editor. Again, this produces +dissimilar DOMs. + +To overcome this, the Server uses a minifier that produces similar results to +TinyMCE's minifier, so that the HTML DOM before edits will be very similar.  +HTML from TinyMCE is taken in raw form, preserving the DOM; the Server then +removes TinyMCE attributes and tags as an initial transformation step. The few +differences not corrected by this process are fixed via (kludgy) string +replacements when comparing HTML between a re-translation from the Server and +the Client's updated text. + Future work ----------- diff --git a/extensions/VSCode/.vscode/launch.json b/extensions/VSCode/.vscode/launch.json index b876fe84..b3fcfd5f 100644 --- a/extensions/VSCode/.vscode/launch.json +++ b/extensions/VSCode/.vscode/launch.json @@ -10,7 +10,10 @@ "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", - "args": ["--extensionDevelopmentPath=${workspaceFolder}"] + "args": ["--extensionDevelopmentPath=${workspaceFolder}"], + "env": { + "RUST_BACKTRACE": "full" + } }, { "name": "Extension Tests", diff --git a/extensions/VSCode/Cargo.lock b/extensions/VSCode/Cargo.lock index f72e0ce7..b150006f 100644 --- a/extensions/VSCode/Cargo.lock +++ b/extensions/VSCode/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.11.1", + "bitflags", "bytes", "futures-core", "futures-sink", @@ -29,7 +29,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web", - "bitflags 2.11.1", + "bitflags", "bytes", "derive_more", "futures-core", @@ -44,16 +44,16 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.12.0" +version = "3.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f860ee6746d0c5b682147b2f7f8ef036d4f92fe518251a3a35ffa3650eafdf0e" +checksum = "93acb4a42f64936f9b8cae4a433b237599dd6eb6ed06124eb67132ef8cc90662" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-utils", "base64", - "bitflags 2.11.1", + "bitflags", "brotli", "bytes", "bytestring", @@ -72,7 +72,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.9.4", + "rand 0.10.1", "sha1", "smallvec", "tokio", @@ -246,6 +246,30 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.4" @@ -399,10 +423,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "bitflags" -version = "1.3.2" +name = "base64-simd" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" +dependencies = [ + "simd-abstraction", +] + +[[package]] +name = "base64-simd" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref 0.5.2", + "vsimd", +] [[package]] name = "bitflags" @@ -410,6 +447,18 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -468,6 +517,28 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "byteorder" version = "1.5.0" @@ -485,18 +556,27 @@ dependencies = [ [[package]] name = "bytestring" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" +checksum = "86566c496f2f47d9b8147a4c8b02ffdb69c919fe0c2b2e7195d22cbba0e635c9" dependencies = [ "bytes", ] +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + [[package]] name = "cc" -version = "1.2.60" +version = "1.2.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" dependencies = [ "find-msvc-tools", "jobserver", @@ -536,9 +616,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -558,9 +638,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", @@ -580,6 +660,15 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f88a43d011fc4a6876cb7344703e297c71dda42494fee094d5f7c76bf13f746" +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror", +] + [[package]] name = "codechat-editor-server" version = "0.1.54" @@ -610,13 +699,14 @@ dependencies = [ "markup5ever_rcdom", "mime", "mime_guess", + "minify-html", "minreq", "normalize-line-endings", "notify-debouncer-full", "path-slash", "pest", "pest_derive", - "phf", + "phf 0.13.1", "pulldown-cmark 0.13.3", "rand 0.10.1", "regex", @@ -661,12 +751,55 @@ dependencies = [ "memchr", ] +[[package]] +name = "compact_str" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", +] + [[package]] name = "const-oid" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" +[[package]] +name = "const-str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" +dependencies = [ + "const-str-proc-macro", +] + +[[package]] +name = "const-str-proc-macro" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "convert_case" version = "0.10.0" @@ -712,6 +845,12 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cow-utils" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417bef24afe1460300965a25ff4a24b8b45ad011948302ec221e8a0a81eb2c79" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -784,20 +923,42 @@ dependencies = [ ] [[package]] -name = "ctor" -version = "0.10.0" +name = "cssparser" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.11.3", + "smallvec", +] + +[[package]] +name = "cssparser-color" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +dependencies = [ + "cssparser", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95d0d11eb38e7642efca359c3cf6eb7b2e528182d09110165de70192b0352775" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ - "ctor-proc-macro", - "dtor", + "quote", + "syn 2.0.117", ] [[package]] -name = "ctor-proc-macro" -version = "0.0.12" +name = "ctor" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ab264ea985f1bd27887d7b21ea2bb046728e05d11909ca138d700c494730db" +checksum = "400a21f1014a968ec518c7ccdf9b4a4ed0cac8c56ccb6d604f8b91f00110501e" [[package]] name = "ctutils" @@ -808,6 +969,34 @@ dependencies = [ "cmov", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] + [[package]] name = "deranged" version = "0.5.8" @@ -864,9 +1053,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4850db49bf08e663084f7fb5c87d202ef91a3907271aff24a94eb97ff039153c" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.0", "const-oid", @@ -931,19 +1120,25 @@ dependencies = [ ] [[package]] -name = "dtor" -version = "0.7.0" +name = "dragonbox_ecma" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f72721db8027a4e96dd6fb50d2a1d32259c9d3da1b63dee612ccd981e14293" -dependencies = [ - "dtor-proc-macro", -] +checksum = "fd8e701084c37e7ef62d3f9e453b618130cbc0ef3573847785952a3ac3f746bf" + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" [[package]] -name = "dtor-proc-macro" -version = "0.0.12" +name = "dtoa-short" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c98b077c7463d01d22dde8a24378ddf1ca7263dc687cffbed38819ea6c21131" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] [[package]] name = "dunce" @@ -951,6 +1146,24 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -1043,6 +1256,12 @@ dependencies = [ "libc", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.32" @@ -1141,6 +1360,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.3.4" @@ -1186,7 +1416,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 2.11.1", + "bitflags", "ignore", "walkdir", ] @@ -1210,6 +1440,21 @@ dependencies = [ "tracing", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.5" @@ -1226,6 +1471,9 @@ name = "hashbrown" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +dependencies = [ + "allocator-api2", +] [[package]] name = "heck" @@ -1239,24 +1487,24 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" dependencies = [ - "digest 0.11.2", + "digest 0.11.3", ] [[package]] name = "htmd" version = "0.5.4" -source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#68b5d9cfa22131ea32c71fa480b6746828700cc6" +source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#deafeb4b579530a94314828218cfbda79c615ef8" dependencies = [ "html5ever", "markup5ever_rcdom", - "phf", + "phf 0.13.1", ] [[package]] name = "html5ever" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8" dependencies = [ "log", "markup5ever", @@ -1309,9 +1557,9 @@ checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hybrid-array" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" +checksum = "08d46837a0ed51fe95bd3b05de33cd64a1ee88fc797477ca48446872504507c5" dependencies = [ "typenum", ] @@ -1441,9 +1689,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -1508,7 +1756,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" dependencies = [ - "bitflags 2.11.1", + "bitflags", "inotify-sys", "libc", ] @@ -1528,6 +1776,24 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" @@ -1595,14 +1861,22 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.95" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" +checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] +[[package]] +name = "json-escape-simd" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e770254dd7802184595b1d30da2a15cb72569e2aca2b177aef8d22eac8a693" + [[package]] name = "kqueue" version = "1.1.1" @@ -1615,11 +1889,11 @@ dependencies = [ [[package]] name = "kqueue-sys" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +checksum = "a7b65860415f949f23fa882e669f2dbd4a0f0eeb1acdd56790b30494afd7da2f" dependencies = [ - "bitflags 1.3.2", + "bitflags", "libc", ] @@ -1643,9 +1917,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.185" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libloading" @@ -1666,6 +1940,46 @@ dependencies = [ "libc", ] +[[package]] +name = "lightningcss" +version = "1.0.0-alpha.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6314c2f0590ac93c86099b98bb7ba8abcf759bfd89604ffca906472bb54937" +dependencies = [ + "ahash 0.8.12", + "bitflags", + "const-str", + "cssparser", + "cssparser-color", + "dashmap", + "data-encoding", + "getrandom 0.3.4", + "indexmap", + "itertools 0.10.5", + "lazy_static", + "lightningcss-derive", + "parcel_selectors", + "parcel_sourcemap", + "pastey", + "pathdiff", + "rayon", + "serde", + "serde-content", + "smallvec", +] + +[[package]] +name = "lightningcss-derive" +version = "1.0.0-alpha.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" +dependencies = [ + "convert_case 0.6.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -1750,9 +2064,9 @@ dependencies = [ [[package]] name = "markup5ever" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" dependencies = [ "log", "tendril", @@ -1761,9 +2075,9 @@ dependencies = [ [[package]] name = "markup5ever_rcdom" -version = "0.38.0+unofficial" +version = "0.39.0+unofficial" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "333171ccdf66e915257740d44e38ea5b1b19ce7b45d33cc35cb6f118fbd981ff" +checksum = "3ac010f19d6c4af81eeb4018a39d7a115de9d285af45c126a4ac02e6fc5716b7" dependencies = [ "html5ever", "markup5ever", @@ -1771,6 +2085,12 @@ dependencies = [ "xml5ever", ] +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + [[package]] name = "md-5" version = "0.11.0" @@ -1778,7 +2098,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" dependencies = [ "cfg-if", - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -1803,6 +2123,38 @@ dependencies = [ "unicase", ] +[[package]] +name = "minify-html" +version = "0.18.1" +source = "git+https://github.com/bjones1/minify-html.git?branch=dev#b5cce1953106d00b5e622214a99457d3312c5fa9" +dependencies = [ + "ahash 0.8.12", + "aho-corasick", + "lightningcss", + "memchr", + "minify-html-common", + "once_cell", + "oxc_allocator", + "oxc_codegen", + "oxc_minifier", + "oxc_parser", + "oxc_span", +] + +[[package]] +name = "minify-html-common" +version = "0.0.3" +source = "git+https://github.com/bjones1/minify-html.git?branch=dev#b5cce1953106d00b5e622214a99457d3312c5fa9" +dependencies = [ + "ahash 0.8.12", + "aho-corasick", + "itertools 0.14.0", + "memchr", + "once_cell", + "serde", + "serde_json", +] + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1839,11 +2191,11 @@ checksum = "dce6dd36094cac388f119d2e9dc82dc730ef91c32a6222170d630e5414b956e6" [[package]] name = "napi" -version = "3.8.5" +version = "3.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa73b028610e2b26e9e40bd2c8ff8a98e6d7ed5d67d89ebf4bfd2f992616b024" +checksum = "8e55037284865448ecf329baa86a4d05401f647ebde99f5747b640d32c2c5226" dependencies = [ - "bitflags 2.11.1", + "bitflags", "ctor", "futures", "napi-build", @@ -1861,9 +2213,9 @@ checksum = "d376940fd5b723c6893cd1ee3f33abbfd86acb1cd1ec079f3ab04a2a3bc4d3b1" [[package]] name = "napi-derive" -version = "3.5.4" +version = "3.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7430702d3cc05cf55f0a2c9e41d991c3b7a53f91e6146a8f282b1bfc7f3fd133" +checksum = "a4ba740fe4c9524d86fd90798fd8ccdb23402b3eef7e7c30897a8a369b529fcf" dependencies = [ "convert_case 0.11.0", "ctor", @@ -1875,9 +2227,9 @@ dependencies = [ [[package]] name = "napi-derive-backend" -version = "5.0.3" +version = "5.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca5a083f2c9b49a0c7d33ec75c083498849c6fcc46f5497317faa39ea77f5d5" +checksum = "0d5af30503edf933ce7377cf6d4c877a62b0f1107ea05585f1b5e430e88d5baf" dependencies = [ "convert_case 0.11.0", "proc-macro2", @@ -1913,6 +2265,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +[[package]] +name = "nonmax" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" + [[package]] name = "normalize-line-endings" version = "0.3.0" @@ -1925,7 +2283,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.11.1", + "bitflags", "fsevent-sys", "inotify", "kqueue", @@ -1956,7 +2314,17 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.11.1", + "bitflags", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", ] [[package]] @@ -1966,12 +2334,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] -name = "num-traits" -version = "0.2.19" +name = "num-integer" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", ] [[package]] @@ -1989,7 +2366,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.1", + "bitflags", ] [[package]] @@ -2004,7 +2381,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.1", + "bitflags", "objc2", ] @@ -2038,6 +2415,415 @@ dependencies = [ "num-traits", ] +[[package]] +name = "outref" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + +[[package]] +name = "owo-colors" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" + +[[package]] +name = "oxc-browserslist" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be1f075e9100260ff5ecb2b375fb24d6c5f2c97a23e6a86367720831e9faa8e" +dependencies = [ + "flate2", + "postcard", + "rustc-hash", + "serde", + "thiserror", +] + +[[package]] +name = "oxc-miette" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4356a61f2ed4c9b3610245215fbf48970eb277126919f87db9d0efa93a74245c" +dependencies = [ + "cfg-if", + "owo-colors", + "oxc-miette-derive", + "textwrap", + "thiserror", + "unicode-segmentation", + "unicode-width", +] + +[[package]] +name = "oxc-miette-derive" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b237422b014f8f8fff75bb9379e697d13f8d57551a22c88bebb39f073c1bf696" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "oxc_allocator" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd3b8bfef454857d3d9ca08fb84c8955da8591b5a82a21bb34a7ebbf94da7b0f" +dependencies = [ + "allocator-api2", + "hashbrown 0.17.0", + "oxc_data_structures", + "rustc-hash", +] + +[[package]] +name = "oxc_ast" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381ae8356082431bd7e217dd78c7179bfc379dbbe7a32494e28be4fc678812c7" +dependencies = [ + "bitflags", + "oxc_allocator", + "oxc_ast_macros", + "oxc_data_structures", + "oxc_diagnostics", + "oxc_estree", + "oxc_regular_expression", + "oxc_span", + "oxc_str", + "oxc_syntax", +] + +[[package]] +name = "oxc_ast_macros" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50246449a5fa669debd2debeb90be4c30f0a3a2e954f852ec40e5ef49701285" +dependencies = [ + "phf 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "oxc_ast_visit" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82466fd1885834078becf1385380c40624bf511723b695104b21f293c7dc5271" +dependencies = [ + "oxc_allocator", + "oxc_ast", + "oxc_span", + "oxc_syntax", +] + +[[package]] +name = "oxc_codegen" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b69f394fa01810f99943a9191dde9d5757bdccd5c06347af62663eea671a5153" +dependencies = [ + "bitflags", + "cow-utils", + "dragonbox_ecma", + "itoa", + "oxc_allocator", + "oxc_ast", + "oxc_data_structures", + "oxc_index", + "oxc_semantic", + "oxc_sourcemap", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", +] + +[[package]] +name = "oxc_compat" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20b656d726e4dafe2341759dc2f1fefa39fc736773f382885714f139d4dc69cc" +dependencies = [ + "cow-utils", + "oxc-browserslist", + "oxc_syntax", + "rustc-hash", + "serde", +] + +[[package]] +name = "oxc_data_structures" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1defc2fd17ee94f2c8511b0c4a4756d5868fbee891478953f2354ef444b1962f" + +[[package]] +name = "oxc_diagnostics" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7ccb0e8e7c9f1fb75e0700b2c75d9d854e534a7a356b13d2936893651f2b98" +dependencies = [ + "cow-utils", + "oxc-miette", + "percent-encoding", +] + +[[package]] +name = "oxc_ecmascript" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1904566c4e725c1511c88166ec203ae97bebb62887441b4a29b1e7757ec39859" +dependencies = [ + "cow-utils", + "num-bigint", + "num-traits", + "oxc_allocator", + "oxc_ast", + "oxc_regular_expression", + "oxc_span", + "oxc_syntax", +] + +[[package]] +name = "oxc_estree" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87cd0e290bab4cb5d81377bbc1ebd414f01a7af72d7f8e5ccbb4a9a157d71df" + +[[package]] +name = "oxc_index" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3e6120999627ec9703025eab7c9f410ebb7e95557632a8902ca48210416c2b" +dependencies = [ + "nonmax", + "serde", +] + +[[package]] +name = "oxc_mangler" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc7dcb6b22f8e7aa9a8d2afa8f29e62a7892a02de780dab976aa42eb09e977a9" +dependencies = [ + "itertools 0.14.0", + "oxc_allocator", + "oxc_ast", + "oxc_data_structures", + "oxc_index", + "oxc_semantic", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", +] + +[[package]] +name = "oxc_minifier" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59700b3cd4906c9e1878ac925bd86a284a1efd0a69353516f65ffc3ebb08a8ff" +dependencies = [ + "cow-utils", + "itoa", + "oxc_allocator", + "oxc_ast", + "oxc_ast_visit", + "oxc_compat", + "oxc_data_structures", + "oxc_ecmascript", + "oxc_index", + "oxc_mangler", + "oxc_parser", + "oxc_regular_expression", + "oxc_semantic", + "oxc_span", + "oxc_str", + "oxc_syntax", + "oxc_traverse", + "rustc-hash", +] + +[[package]] +name = "oxc_parser" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71acdb67749ff68bfbbd346da7dd2fe4947964be49ac9ec34d73d10a2396dcd" +dependencies = [ + "bitflags", + "cow-utils", + "memchr", + "num-bigint", + "num-traits", + "oxc_allocator", + "oxc_ast", + "oxc_data_structures", + "oxc_diagnostics", + "oxc_ecmascript", + "oxc_regular_expression", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", + "seq-macro", +] + +[[package]] +name = "oxc_regular_expression" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a1273168ec6d8083e161565d264847249b9aad51c430d92d344303ede058b2" +dependencies = [ + "bitflags", + "oxc_allocator", + "oxc_ast_macros", + "oxc_diagnostics", + "oxc_span", + "oxc_str", + "phf 0.13.1", + "rustc-hash", + "unicode-id-start", +] + +[[package]] +name = "oxc_semantic" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63d4f8a0d3eb4e8e03aa413f54300235cb0314dc26649d2ff19f609b7b478272" +dependencies = [ + "itertools 0.14.0", + "memchr", + "oxc_allocator", + "oxc_ast", + "oxc_ast_visit", + "oxc_diagnostics", + "oxc_ecmascript", + "oxc_index", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", + "self_cell", +] + +[[package]] +name = "oxc_sourcemap" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d378eb8bad20e89d66276aebab51f6a5408571092cac94abdd3eabb773713d6" +dependencies = [ + "base64-simd 0.8.0", + "json-escape-simd", + "rustc-hash", + "serde", + "serde_json", +] + +[[package]] +name = "oxc_span" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9af84474452c3caa7aca1bcaca04b6e16552fe29472059b7921ae7a69790dccf" +dependencies = [ + "compact_str", + "oxc-miette", + "oxc_allocator", + "oxc_ast_macros", + "oxc_estree", + "oxc_str", +] + +[[package]] +name = "oxc_str" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136bcc6bed1182df0b9c529e478da55a490b38ba5f1189abf2e7a9b13f46f0b1" +dependencies = [ + "compact_str", + "hashbrown 0.17.0", + "oxc_allocator", + "oxc_estree", +] + +[[package]] +name = "oxc_syntax" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b448a086623714675f66b79271e25fa2b51708255fa6af7dad83be88cc6e8726" +dependencies = [ + "bitflags", + "cow-utils", + "dragonbox_ecma", + "nonmax", + "oxc_allocator", + "oxc_ast_macros", + "oxc_estree", + "oxc_index", + "oxc_span", + "oxc_str", + "phf 0.13.1", + "unicode-id-start", +] + +[[package]] +name = "oxc_traverse" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "648c4e7c8ee0a8d2ff28751cc9dc8d5502a7d3b2b96d4fa73de7fb31b46d54c6" +dependencies = [ + "itoa", + "oxc_allocator", + "oxc_ast", + "oxc_ast_visit", + "oxc_data_structures", + "oxc_ecmascript", + "oxc_semantic", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", +] + +[[package]] +name = "parcel_selectors" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54fd03f1ad26cb6b3ec1b7414fa78a3bd639e7dbb421b1a60513c96ce886a196" +dependencies = [ + "bitflags", + "cssparser", + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "precomputed-hash", + "rustc-hash", + "smallvec", +] + +[[package]] +name = "parcel_sourcemap" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" +dependencies = [ + "base64-simd 0.7.0", + "data-url", + "rkyv", + "serde", + "serde_json", + "vlq", +] + [[package]] name = "parking_lot" version = "0.12.5" @@ -2073,6 +2859,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "percent-encoding" version = "2.3.2" @@ -2122,25 +2914,55 @@ dependencies = [ "sha2 0.10.9", ] +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + [[package]] name = "phf" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ - "phf_macros", - "phf_shared", + "phf_macros 0.13.1", + "phf_shared 0.13.1", "serde", ] +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + [[package]] name = "phf_codegen" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.6", ] [[package]] @@ -2150,7 +2972,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ "fastrand", - "phf_shared", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] @@ -2159,13 +2994,22 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", "proc-macro2", "quote", "syn 2.0.117", ] +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "phf_shared" version = "0.13.1" @@ -2187,6 +3031,18 @@ version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + [[package]] name = "postgres-protocol" version = "0.6.11" @@ -2293,13 +3149,33 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "pulldown-cmark" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "679341d22c78c6c649893cbd6c3278dcbe9fc4faa62fea3a9296ae2b50c14625" dependencies = [ - "bitflags 2.11.1", + "bitflags", "memchr", "unicase", ] @@ -2310,7 +3186,7 @@ version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" dependencies = [ - "bitflags 2.11.1", + "bitflags", "memchr", "pulldown-cmark-escape", "unicase", @@ -2343,6 +3219,21 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "rand" version = "0.9.4" @@ -2374,6 +3265,12 @@ dependencies = [ "rand_core 0.9.5", ] +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + [[package]] name = "rand_core" version = "0.9.5" @@ -2389,13 +3286,33 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.1", + "bitflags", ] [[package]] @@ -2433,6 +3350,44 @@ version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rustc-hash" version = "2.1.2" @@ -2454,7 +3409,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.1", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -2488,12 +3443,30 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "self_cell" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + [[package]] name = "semver" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + [[package]] name = "serde" version = "1.0.228" @@ -2504,6 +3477,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-content" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3753ca04f350fa92d00b6146a3555e63c55388c9ef2e11e09bce2ff1c0b509c6" +dependencies = [ + "serde", +] + [[package]] name = "serde-value" version = "0.7.0" @@ -2574,13 +3556,13 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", + "cpufeatures 0.3.0", + "digest 0.11.3", ] [[package]] @@ -2602,7 +3584,7 @@ checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", "cpufeatures 0.3.0", - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -2621,6 +3603,15 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-abstraction" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" +dependencies = [ + "outref 0.1.0", +] + [[package]] name = "simd-adler32" version = "0.3.9" @@ -2645,9 +3636,9 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "siphasher" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "slab" @@ -2661,6 +3652,12 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "smawk" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" + [[package]] name = "socket2" version = "0.5.10" @@ -2687,6 +3684,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "string_cache" version = "0.9.0" @@ -2695,7 +3698,7 @@ checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" dependencies = [ "new_debug_unreachable", "parking_lot", - "phf_shared", + "phf_shared 0.13.1", "precomputed-hash", "serde", ] @@ -2706,8 +3709,8 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", "proc-macro2", "quote", ] @@ -2762,6 +3765,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" version = "3.27.0" @@ -2809,6 +3818,17 @@ dependencies = [ "log", ] +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", + "unicode-linebreak", + "unicode-width", +] + [[package]] name = "thiserror" version = "2.0.18" @@ -2897,9 +3917,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.0" +version = "1.52.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91135f59b1cbf38c91e73cf3386fca9bb77915c45ce2771460c9d92f0f3d776" +checksum = "110a78583f19d5cdb2c5ccf321d1290344e71313c6c37d43520d386027d18386" dependencies = [ "bytes", "libc", @@ -2938,7 +3958,7 @@ dependencies = [ "log", "parking_lot", "percent-encoding", - "phf", + "phf 0.13.1", "pin-project-lite", "postgres-protocol", "postgres-types", @@ -3028,9 +4048,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "ucd-trie" @@ -3050,12 +4070,24 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" +[[package]] +name = "unicode-id-start" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b79ad29b5e19de4260020f8919b443b2ef0277d242ce532ec7b7a2cc8b6007" + [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + [[package]] name = "unicode-normalization" version = "0.1.25" @@ -3140,6 +4172,16 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "v_htmlescape" version = "0.15.8" @@ -3152,6 +4194,18 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vlq" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + [[package]] name = "walkdir" version = "2.5.0" @@ -3179,11 +4233,11 @@ dependencies = [ [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -3192,7 +4246,7 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] @@ -3206,9 +4260,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" +checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" dependencies = [ "cfg-if", "once_cell", @@ -3219,9 +4273,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" +checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3229,9 +4283,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" +checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" dependencies = [ "bumpalo", "proc-macro2", @@ -3242,9 +4296,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" +checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" dependencies = [ "unicode-ident", ] @@ -3277,7 +4331,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.1", + "bitflags", "hashbrown 0.15.5", "indexmap", "semver", @@ -3285,9 +4339,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.95" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" +checksum = "2eadbac71025cd7b0834f20d1fe8472e8495821b4e9801eb0a60bd1f19827602" dependencies = [ "js-sys", "wasm-bindgen", @@ -3295,21 +4349,21 @@ dependencies = [ [[package]] name = "web_atoms" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576" +checksum = "d7cff6eef815df1834fd250e3a2ff436044d82a9f1bc1980ca1dbdf07effc538" dependencies = [ - "phf", - "phf_codegen", + "phf 0.13.1", + "phf_codegen 0.13.1", "string_cache", "string_cache_codegen", ] [[package]] name = "webbrowser" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe985f41e291eecef5e5c0770a18d28390addb03331c043964d9e916453d6f16" +checksum = "0fc95580916af1e68ff6a7be07446fc5db73ebf71cf092de939bbf5f7e189f72" dependencies = [ "core-foundation", "jni", @@ -3323,9 +4377,9 @@ dependencies = [ [[package]] name = "whoami" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6a5b12f9df4f978d2cfdb1bd3bac52433f44393342d7ee9c25f5a1c14c0f45d" +checksum = "998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d" dependencies = [ "libc", "libredox", @@ -3640,6 +4694,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -3689,7 +4749,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.1", + "bitflags", "indexmap", "log", "serde", @@ -3725,11 +4785,20 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "xml5ever" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dc9559429edf0cd3f327cc0afd9d6b36fa8cec6d93107b7fbe64f806b5f2d9" +checksum = "5ab627f34ff61b80d756180d556f9c68801d836d271b3b8c094504ceca69d221" dependencies = [ "log", "markup5ever", diff --git a/extensions/VSCode/package.json b/extensions/VSCode/package.json index 4d1805d9..5de4e3ca 100644 --- a/extensions/VSCode/package.json +++ b/extensions/VSCode/package.json @@ -80,20 +80,20 @@ "escape-html": "^1.0.3" }, "devDependencies": { - "@emnapi/core": "^1.9.2", - "@emnapi/runtime": "^1.9.2", + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", "@eslint/js": "^10.0.1", "@napi-rs/cli": "^3.6.2", - "@tybys/wasm-util": "^0.10.1", + "@tybys/wasm-util": "^0.10.2", "@types/escape-html": "^1.0.4", "@types/node": "^24.12.2", "@types/vscode": "1.61.0", - "@typescript-eslint/eslint-plugin": "^8.58.2", - "@typescript-eslint/parser": "^8.58.2", - "@vscode/vsce": "^3.8.1", + "@typescript-eslint/eslint-plugin": "^8.59.2", + "@typescript-eslint/parser": "^8.59.2", + "@vscode/vsce": "^3.9.1", "chalk": "^5.6.2", "esbuild": "^0.28.0", - "eslint": "^10.2.0", + "eslint": "^10.3.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", "eslint-plugin-node": "^11.1.0", @@ -101,8 +101,8 @@ "npm-run-all2": "^8.0.4", "ovsx": "^0.10.11", "prettier": "^3.8.3", - "typescript": "^6.0.2", - "typescript-eslint": "^8.58.2" + "typescript": "^6.0.3", + "typescript-eslint": "^8.59.2" }, "optionalDependencies": { "bufferutil": "^4.1.0" diff --git a/extensions/VSCode/pnpm-lock.yaml b/extensions/VSCode/pnpm-lock.yaml index 35b2ff6c..37676e31 100644 --- a/extensions/VSCode/pnpm-lock.yaml +++ b/extensions/VSCode/pnpm-lock.yaml @@ -13,20 +13,20 @@ importers: version: 1.0.3 devDependencies: '@emnapi/core': - specifier: ^1.9.2 - version: 1.9.2 + specifier: ^1.10.0 + version: 1.10.0 '@emnapi/runtime': - specifier: ^1.9.2 - version: 1.9.2 + specifier: ^1.10.0 + version: 1.10.0 '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.2.0) + version: 10.0.1(eslint@10.3.0) '@napi-rs/cli': specifier: ^3.6.2 - version: 3.6.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@24.12.2) + version: 3.6.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@24.12.2) '@tybys/wasm-util': - specifier: ^0.10.1 - version: 0.10.1 + specifier: ^0.10.2 + version: 0.10.2 '@types/escape-html': specifier: ^1.0.4 version: 1.0.4 @@ -37,14 +37,14 @@ importers: specifier: 1.61.0 version: 1.61.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.58.2 - version: 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2) + 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.58.2 - version: 8.58.2(eslint@10.2.0)(typescript@6.0.2) + specifier: ^8.59.2 + version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) '@vscode/vsce': - specifier: ^3.8.1 - version: 3.8.1 + specifier: ^3.9.1 + version: 3.9.1 chalk: specifier: ^5.6.2 version: 5.6.2 @@ -52,20 +52,20 @@ importers: specifier: ^0.28.0 version: 0.28.0 eslint: - specifier: ^10.2.0 - version: 10.2.0 + specifier: ^10.3.0 + version: 10.3.0 eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@10.2.0) + version: 10.1.8(eslint@10.3.0) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0) + version: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0) eslint-plugin-node: specifier: ^11.1.0 - version: 11.1.0(eslint@10.2.0) + version: 11.1.0(eslint@10.3.0) eslint-plugin-prettier: specifier: ^5.5.5 - version: 5.5.5(eslint-config-prettier@10.1.8(eslint@10.2.0))(eslint@10.2.0)(prettier@3.8.3) + version: 5.5.5(eslint-config-prettier@10.1.8(eslint@10.3.0))(eslint@10.3.0)(prettier@3.8.3) npm-run-all2: specifier: ^8.0.4 version: 8.0.4 @@ -76,11 +76,11 @@ importers: specifier: ^3.8.3 version: 3.8.3 typescript: - specifier: ^6.0.2 - version: 6.0.2 + specifier: ^6.0.3 + version: 6.0.3 typescript-eslint: - specifier: ^8.58.2 - version: 8.58.2(eslint@10.2.0)(typescript@6.0.2) + specifier: ^8.59.2 + version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) optionalDependencies: bufferutil: specifier: ^4.1.0 @@ -126,16 +126,16 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/msal-browser@5.6.3': - resolution: {integrity: sha512-sTjMtUm+bJpENU/1WlRzHEsgEHppZDZ1EtNyaOODg/sQBtMxxJzGB+MOCM+T2Q5Qe1fKBrdxUmjyRxm0r7Ez9w==} + '@azure/msal-browser@5.9.0': + resolution: {integrity: sha512-CzE+4PefDSJWj26zU7G1bKchlGRRHMBFreG4tAlGuzyI8hAPiYGobaJvZBgZBf6L63iphX7VH+ityL8VgEQz9Q==} engines: {node: '>=0.8.0'} - '@azure/msal-common@16.4.1': - resolution: {integrity: sha512-Bl8f+w37xkXsYh7QRkAKCFGYtWMYuOVO7Lv+BxILrvGz3HbIEF22Pt0ugyj0QPOl6NLrHcnNUQ9yeew98P/5iw==} + '@azure/msal-common@16.5.2': + resolution: {integrity: sha512-GkDEL6TYo3HgT3UuqakdgE9PZfc1hMki6+Hwgy1uddb/EauvAKfu85vVhuofRSo22D1xTnWt8Ucwfg4vSCVwvA==} engines: {node: '>=0.8.0'} - '@azure/msal-node@5.1.2': - resolution: {integrity: sha512-DoeSJ9U5KPAIZoHsPywvfEj2MhBniQe0+FSpjLUTdWoIkI999GB5USkW6nNEHnIaLVxROHXvprWA1KzdS1VQ4A==} + '@azure/msal-node@5.1.5': + resolution: {integrity: sha512-ObTeMoNPmq19X3z40et9Xvs4ZoWVeJg43PZMRLG5iwVL+2nCtAerG3YTDItqPp1CfXNwmCXBbg8jn1DOx65c3g==} engines: {node: '>=20'} '@babel/code-frame@7.29.0': @@ -146,11 +146,11 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@emnapi/core@1.9.2': - resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@emnapi/runtime@1.9.2': - resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -350,12 +350,16 @@ packages: resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -370,8 +374,8 @@ packages: resolution: {integrity: sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - '@inquirer/checkbox@5.1.3': - resolution: {integrity: sha512-+G7I8CT+EHv/hasNfUl3P37DVoMoZfpA+2FXmM54dA8MxYle1YqucxbacxHalw1iAFSdKNEDTGNV7F+j1Ldqcg==} + '@inquirer/checkbox@5.1.4': + resolution: {integrity: sha512-w6KF8ZYRvqHhROkOTHXYC3qIV/KYEu5o12oLqQySvch61vrYtRxNSHTONSdJqWiFJPlCUQAHT5OgOIyuTr+MHQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -379,8 +383,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@6.0.11': - resolution: {integrity: sha512-pTpHjg0iEIRMYV/7oCZUMf27/383E6Wyhfc/MY+AVQGEoUobffIYWOK9YLP2XFRGz/9i6WlTQh1CkFVIo2Y7XA==} + '@inquirer/confirm@6.0.12': + resolution: {integrity: sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -388,8 +392,8 @@ packages: '@types/node': optional: true - '@inquirer/core@11.1.8': - resolution: {integrity: sha512-/u+yJk2pOKNDOh1ZgdUH2RQaRx6OOH4I0uwL95qPvTFTIL38YBsuSC4r1yXBB3Q6JvNqFFc202gk0Ew79rrcjA==} + '@inquirer/core@11.1.9': + resolution: {integrity: sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -397,8 +401,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@5.1.0': - resolution: {integrity: sha512-6wlkYl65Qfayy48gPCfU4D7li6KCAGN79mLXa/tYHZH99OfZ820yY+HA+DgE88r8YwwgeuY6PQgNqMeK6LuMmw==} + '@inquirer/editor@5.1.1': + resolution: {integrity: sha512-6y11LgmNpmn5D2aB5FgnCfBUBK8ZstwLCalyJmORcJZ/WrhOjm16mu6eSqIx8DnErxDqSLr+Jkp+GP8/Nwd5tA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -406,8 +410,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@5.0.12': - resolution: {integrity: sha512-vOfrB33b7YIZfDauXS8vNNz2Z86FozTZLIt7e+7/dCaPJ1RXZsHCuI9TlcERzEUq57vkM+UdnBgxP0rFd23JYQ==} + '@inquirer/expand@5.0.13': + resolution: {integrity: sha512-dF2zvrFo9LshkcB23/O1il13kBkBltWIXzut1evfbuBLXMiGIuC45c+ZQ0uukjCDsvI8OWqun4FRYMnzFCQa3g==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -428,8 +432,8 @@ packages: resolution: {integrity: sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - '@inquirer/input@5.0.11': - resolution: {integrity: sha512-twUWidn4ocPO8qi6fRM7tNWt7W1FOnOZqQ+/+PsfLUacMR5rFLDPK9ql0nBPwxi0oELbo8T5NhRs8B2+qQEqFQ==} + '@inquirer/input@5.0.12': + resolution: {integrity: sha512-uiMFBl4LqFzJClh80Q3f9hbOFJ6kgkDWI4LjAeBuyO6EanVVMF69AgOvpi1qdqjDSjDN6578B6nky9ceEpI+1Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -437,8 +441,8 @@ packages: '@types/node': optional: true - '@inquirer/number@4.0.11': - resolution: {integrity: sha512-Vscmim9TCksQsfjPtka/JwPUcbLhqWYrgfPf1cHrCm24X/F2joFwnageD50yMKsaX14oNGOyKf/RNXAFkNjWpA==} + '@inquirer/number@4.0.12': + resolution: {integrity: sha512-/vrwhEf7Xsuh+YlHF4IjSy3g1cyrQuPaSiHIxCEbLu8qnfvrcvJyCkoktOOF+xV9gSb77/G0n3h04RbMDW2sIg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -446,8 +450,8 @@ packages: '@types/node': optional: true - '@inquirer/password@5.0.11': - resolution: {integrity: sha512-9KZFeRaNHIcejtPb0wN4ddFc7EvobVoAFa049eS3LrDZFxI8O7xUXiITEOinBzkZFAIwY5V4yzQae/QfO9cbbg==} + '@inquirer/password@5.0.12': + resolution: {integrity: sha512-CBh7YHju623lxJRcAOo498ZUwIuMy63bqW/vVq0tQAZVv+lkWlHkP9ealYE1utWSisEShY5VMdzIXRmyEODzcQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -455,8 +459,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@8.4.1': - resolution: {integrity: sha512-AH5xPQ997K7e0F0vulPlteIHke2awMkFi8F0dBemrDfmvtPmHJo82mdHbONC4F/t8d1NHwrbI5cGVI+RbLWdoQ==} + '@inquirer/prompts@8.4.2': + resolution: {integrity: sha512-XJmn/wY4AX56l1BRU+ZjDrFtg9+2uBEi4JvJQj82kwJDQKiPgSn4CEsbfGGygS4Gw6rkL4W18oATjfVfaqub2Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -464,8 +468,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@5.2.7': - resolution: {integrity: sha512-AqRMiD9+uE1lskDPrdqHwrV/EUmxKEBLX44SR7uxK3vD2413AmVfE5EQaPeNzYf5Pq5SitHJDYUFVF0poIr09w==} + '@inquirer/rawlist@5.2.8': + resolution: {integrity: sha512-Su7FQvp5buZmCymN3PPoYv31ZQQX4ve2j02k7piGgKAWgE+AQRB5YoYVveGXcl3TZ9ldgRMSxj56YfDFmmaqLg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -473,8 +477,8 @@ packages: '@types/node': optional: true - '@inquirer/search@4.1.7': - resolution: {integrity: sha512-1y7+0N65AWk5RdlXH/Kn13txf3IjIQ7OEfhCEkDTU+h5wKMLq8DUF3P6z+/kLSxDGDtQT1dRBWEUC3o/VvImsQ==} + '@inquirer/search@4.1.8': + resolution: {integrity: sha512-fGiHKGD6DyPIYUWxoXnQTeXeyYqSOUrasDMABBmMHUalH/LxkuzY0xVRtimXAt1sUeeyYkVuKQx1bebMuN11Kw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -482,8 +486,8 @@ packages: '@types/node': optional: true - '@inquirer/select@5.1.3': - resolution: {integrity: sha512-zYyqWgGQi3NhBcNq4Isc5rB3oEdQEh1Q/EcAnOW0FK4MpnXWkvSBYgA4cYrTM4A9UB573omouZbnL9JJ74Mq3A==} + '@inquirer/select@5.1.4': + resolution: {integrity: sha512-2kWcGKPMLAXAWRp1AH1SLsQmX+j0QjeljyXMUji9WMZC8nRDO0b7qquIGr6143E7KMLt3VAIGNXzwa/6PXQs4Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1071,23 +1075,23 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} - '@textlint/ast-node-types@15.5.4': - resolution: {integrity: sha512-bVtB6VEy9U9DpW8cTt25k5T+lz86zV5w6ImePZqY1AXzSuPhqQNT77lkMPxonXzUducEIlSvUu3o7sKw3y9+Sw==} + '@textlint/ast-node-types@15.6.0': + resolution: {integrity: sha512-CxZHFbYAU7J0A4izz31wV2ZZfySR6aVj2OSR6/3tppZm7VV6hM7nA7sutsLwIiBL/v4lsB1RM79l4Dc/VrH4qw==} - '@textlint/linter-formatter@15.5.4': - resolution: {integrity: sha512-D9qJedKBLmAo+kiudop4UKgSxXMi4O8U86KrCidVXZ9RsK0NSVIw6+r2rlMUOExq79iEY81FRENyzmNVRxDBsg==} + '@textlint/linter-formatter@15.6.0': + resolution: {integrity: sha512-IwHRhjwxs0a5t1eNAoKAdV224CDca38LyopPofXpwO/d0J75wBvzf/cBHXNl4TMsLKhYGtR83UprcLEKj/gZsA==} - '@textlint/module-interop@15.5.4': - resolution: {integrity: sha512-JyAUd26ll3IFF87LP0uGoa8Tzw5ZKiYvGs6v8jLlzyND1lUYCI4+2oIAslrODLkf0qwoCaJrBQWM3wsw+asVGQ==} + '@textlint/module-interop@15.6.0': + resolution: {integrity: sha512-MHY6pJx9i5kOlrvUSK51887tYZjHAV2qnr6unBm7LtBLGDFo93utdYqHyWep8r9QLsilQdeijWtufJI46z4v4w==} - '@textlint/resolver@15.5.4': - resolution: {integrity: sha512-5GUagtpQuYcmhlOzBGdmVBvDu5lKgVTjwbxtdfoidN4OIqblIxThJHHjazU+ic+/bCIIzI2JcOjHGSaRmE8Gcg==} + '@textlint/resolver@15.6.0': + resolution: {integrity: sha512-T1l2Gd3455pwtm0cTewhX/LLy3bL9z6/Fu/am+jj+jjGfXVoknYkjfkZEKrjHlA7xzay0EfUKnu//teYemLeZw==} - '@textlint/types@15.5.4': - resolution: {integrity: sha512-mY28j2U7nrWmZbxyKnRvB8vJxJab4AxqOobLfb6iozrLelJbqxcOTvBQednadWPfAk9XWaZVMqUr9Nird3mutg==} + '@textlint/types@15.6.0': + resolution: {integrity: sha512-CvgYb1PiqF4BGyoZebGWzAJCZ4ChJAZ9gtWjpQIMKE4Xe2KlSwDA8m8MsiZIV321f5Ibx38BMjC1Z/2ZYP2GQg==} - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} '@types/escape-html@1.0.4': resolution: {integrity: sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==} @@ -1116,63 +1120,63 @@ packages: '@types/vscode@1.61.0': resolution: {integrity: sha512-9k5Nwq45hkRwdfCFY+eKXeQQSbPoA114mF7U/4uJXRBJeGIO7MuJdhF1PnaDN+lllL9iKGQtd6FFXShBXMNaFg==} - '@typescript-eslint/eslint-plugin@8.58.2': - resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} + '@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.58.2 + '@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.58.2': - resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==} + '@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.58.2': - resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} + '@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.58.2': - resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} + '@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.58.2': - resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} + '@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.58.2': - resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==} + '@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.58.2': - resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} + '@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.58.2': - resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} + '@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.58.2': - resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} + '@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.58.2': - resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} + '@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} '@typespec/ts-http-runtime@0.3.5': @@ -1227,9 +1231,9 @@ packages: '@vscode/vsce-sign@2.0.9': resolution: {integrity: sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==} - '@vscode/vsce@3.8.1': - resolution: {integrity: sha512-Ij1i53rvR2Z/BR8tdESNqb5l5GNvOLQIWSbE1NnRnXQrvJu/xhK8nVfe6vXKdI6L7/fUwzlqqB1gOjt901mTmg==} - engines: {node: '>= 22'} + '@vscode/vsce@3.9.1': + resolution: {integrity: sha512-MPn5p+DoudI+3GfJSpAZZraE1lgLv0LcwbH3+xy7RgEhty3UIkmUMUA+5jPTDaxXae00AnX5u77FxGM8FhfKKA==} + engines: {node: '>= 20'} hasBin: true acorn-jsx@5.3.2: @@ -1246,11 +1250,11 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} @@ -1552,8 +1556,8 @@ packages: resolution: {integrity: sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==} engines: {ecmascript: '>= es5', node: '>=4'} - emnapi@1.9.2: - resolution: {integrity: sha512-OdUoQe/8so7FvubnE/DNV9sNNSFwDYQiK4ZCAz4agMnD1s6faLuDn2gzxfJrmMoKfxZhhsckqGNwqPnS5K140A==} + emnapi@1.10.0: + resolution: {integrity: sha512-swoyZjupDvLoe/KC3HZ4SY1JUN+tviT6eOZ3Px28TZAYdBHtRIiMWWrIUUH+2/9CYY4fNTID1YhYZ+kdFHszHg==} peerDependencies: node-addon-api: '>= 6.1.0' peerDependenciesMeta: @@ -1613,8 +1617,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.45.1: - resolution: {integrity: sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==} + es-toolkit@1.46.1: + resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} esbuild@0.28.0: resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} @@ -1714,8 +1718,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.2.0: - resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==} + eslint@10.3.0: + resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1773,8 +1777,8 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - 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==} fast-wrap-ansi@0.2.0: resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} @@ -1919,8 +1923,8 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} hosted-git-info@4.1.0: @@ -2003,8 +2007,8 @@ packages: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} hasBin: true - 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-data-view@1.0.2: @@ -2161,8 +2165,8 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - jsonfile@6.2.0: - resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} jsonwebtoken@9.0.3: resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} @@ -2225,8 +2229,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.3.5: - resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} + lru-cache@11.3.6: + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} engines: {node: 20 || >=22} lru-cache@6.0.0: @@ -2306,8 +2310,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-abi@3.89.0: - resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==} + node-abi@3.91.0: + resolution: {integrity: sha512-B+S7X/GS3Un6wMICtnsNjQD7oSpVBQrZftHE6GZ1Fe9/k3XOOoqbM5DZZ0GO4x3YiSCQfrM28yj1ppplwgIsfg==} engines: {node: '>=10'} node-addon-api@4.3.0: @@ -2569,8 +2573,8 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} safe-buffer@5.2.1: @@ -2824,15 +2828,15 @@ packages: typed-rest-client@1.8.11: resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} - typescript-eslint@8.58.2: - resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==} + typescript-eslint@8.59.2: + resolution: {integrity: sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==} 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@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -2877,10 +2881,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -3025,8 +3025,8 @@ snapshots: '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@azure/msal-browser': 5.6.3 - '@azure/msal-node': 5.1.2 + '@azure/msal-browser': 5.9.0 + '@azure/msal-node': 5.1.5 open: 10.2.0 tslib: 2.8.1 transitivePeerDependencies: @@ -3039,17 +3039,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/msal-browser@5.6.3': + '@azure/msal-browser@5.9.0': dependencies: - '@azure/msal-common': 16.4.1 + '@azure/msal-common': 16.5.2 - '@azure/msal-common@16.4.1': {} + '@azure/msal-common@16.5.2': {} - '@azure/msal-node@5.1.2': + '@azure/msal-node@5.1.5': dependencies: - '@azure/msal-common': 16.4.1 + '@azure/msal-common': 16.5.2 jsonwebtoken: 9.0.3 - uuid: 8.3.2 '@babel/code-frame@7.29.0': dependencies: @@ -3059,12 +3058,12 @@ snapshots: '@babel/helper-validator-identifier@7.28.5': {} - '@emnapi/core@1.9.2': + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 - '@emnapi/runtime@1.9.2': + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 @@ -3150,9 +3149,9 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)': dependencies: - eslint: 10.2.0 + eslint: 10.3.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -3173,9 +3172,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.2.0)': + '@eslint/js@10.0.1(eslint@10.3.0)': optionalDependencies: - eslint: 10.2.0 + eslint: 10.3.0 '@eslint/object-schema@3.0.5': {} @@ -3184,36 +3183,41 @@ snapshots: '@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': {} '@inquirer/ansi@2.0.5': {} - '@inquirer/checkbox@5.1.3(@types/node@24.12.2)': + '@inquirer/checkbox@5.1.4(@types/node@24.12.2)': dependencies: '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/figures': 2.0.5 '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/confirm@6.0.11(@types/node@24.12.2)': + '@inquirer/confirm@6.0.12(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/core@11.1.8(@types/node@24.12.2)': + '@inquirer/core@11.1.9(@types/node@24.12.2)': dependencies: '@inquirer/ansi': 2.0.5 '@inquirer/figures': 2.0.5 @@ -3225,17 +3229,17 @@ snapshots: optionalDependencies: '@types/node': 24.12.2 - '@inquirer/editor@5.1.0(@types/node@24.12.2)': + '@inquirer/editor@5.1.1(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/external-editor': 3.0.0(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/expand@5.0.12(@types/node@24.12.2)': + '@inquirer/expand@5.0.13(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 @@ -3249,62 +3253,62 @@ snapshots: '@inquirer/figures@2.0.5': {} - '@inquirer/input@5.0.11(@types/node@24.12.2)': + '@inquirer/input@5.0.12(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/number@4.0.11(@types/node@24.12.2)': + '@inquirer/number@4.0.12(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/password@5.0.11(@types/node@24.12.2)': + '@inquirer/password@5.0.12(@types/node@24.12.2)': dependencies: '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/prompts@8.4.1(@types/node@24.12.2)': - dependencies: - '@inquirer/checkbox': 5.1.3(@types/node@24.12.2) - '@inquirer/confirm': 6.0.11(@types/node@24.12.2) - '@inquirer/editor': 5.1.0(@types/node@24.12.2) - '@inquirer/expand': 5.0.12(@types/node@24.12.2) - '@inquirer/input': 5.0.11(@types/node@24.12.2) - '@inquirer/number': 4.0.11(@types/node@24.12.2) - '@inquirer/password': 5.0.11(@types/node@24.12.2) - '@inquirer/rawlist': 5.2.7(@types/node@24.12.2) - '@inquirer/search': 4.1.7(@types/node@24.12.2) - '@inquirer/select': 5.1.3(@types/node@24.12.2) + '@inquirer/prompts@8.4.2(@types/node@24.12.2)': + dependencies: + '@inquirer/checkbox': 5.1.4(@types/node@24.12.2) + '@inquirer/confirm': 6.0.12(@types/node@24.12.2) + '@inquirer/editor': 5.1.1(@types/node@24.12.2) + '@inquirer/expand': 5.0.13(@types/node@24.12.2) + '@inquirer/input': 5.0.12(@types/node@24.12.2) + '@inquirer/number': 4.0.12(@types/node@24.12.2) + '@inquirer/password': 5.0.12(@types/node@24.12.2) + '@inquirer/rawlist': 5.2.8(@types/node@24.12.2) + '@inquirer/search': 4.1.8(@types/node@24.12.2) + '@inquirer/select': 5.1.4(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/rawlist@5.2.7(@types/node@24.12.2)': + '@inquirer/rawlist@5.2.8(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/search@4.1.7(@types/node@24.12.2)': + '@inquirer/search@4.1.8(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/figures': 2.0.5 '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/select@5.1.3(@types/node@24.12.2)': + '@inquirer/select@5.1.4(@types/node@24.12.2)': dependencies: '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/figures': 2.0.5 '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: @@ -3316,22 +3320,22 @@ snapshots: '@isaacs/cliui@9.0.0': {} - '@napi-rs/cli@3.6.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@24.12.2)': + '@napi-rs/cli@3.6.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@24.12.2)': dependencies: - '@inquirer/prompts': 8.4.1(@types/node@24.12.2) - '@napi-rs/cross-toolchain': 1.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - '@napi-rs/wasm-tools': 1.0.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@inquirer/prompts': 8.4.2(@types/node@24.12.2) + '@napi-rs/cross-toolchain': 1.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-tools': 1.0.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@octokit/rest': 22.0.1 clipanion: 4.0.0-rc.4(typanion@3.14.0) colorette: 2.0.20 - emnapi: 1.9.2 - es-toolkit: 1.45.1 + emnapi: 1.10.0 + es-toolkit: 1.46.1 js-yaml: 4.1.1 obug: 2.1.1 semver: 7.7.4 typanion: 3.14.0 optionalDependencies: - '@emnapi/runtime': 1.9.2 + '@emnapi/runtime': 1.10.0 transitivePeerDependencies: - '@emnapi/core' - '@napi-rs/cross-toolchain-arm64-target-aarch64' @@ -3348,10 +3352,10 @@ snapshots: - node-addon-api - supports-color - '@napi-rs/cross-toolchain@1.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/cross-toolchain@1.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/lzma': 1.4.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - '@napi-rs/tar': 1.1.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/lzma': 1.4.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/tar': 1.1.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) debug: 4.4.3 transitivePeerDependencies: - '@emnapi/core' @@ -3397,9 +3401,9 @@ snapshots: '@napi-rs/lzma-linux-x64-musl@1.4.5': optional: true - '@napi-rs/lzma-wasm32-wasi@1.4.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/lzma-wasm32-wasi@1.4.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -3414,7 +3418,7 @@ snapshots: '@napi-rs/lzma-win32-x64-msvc@1.4.5': optional: true - '@napi-rs/lzma@1.4.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/lzma@1.4.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': optionalDependencies: '@napi-rs/lzma-android-arm-eabi': 1.4.5 '@napi-rs/lzma-android-arm64': 1.4.5 @@ -3429,7 +3433,7 @@ snapshots: '@napi-rs/lzma-linux-s390x-gnu': 1.4.5 '@napi-rs/lzma-linux-x64-gnu': 1.4.5 '@napi-rs/lzma-linux-x64-musl': 1.4.5 - '@napi-rs/lzma-wasm32-wasi': 1.4.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/lzma-wasm32-wasi': 1.4.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@napi-rs/lzma-win32-arm64-msvc': 1.4.5 '@napi-rs/lzma-win32-ia32-msvc': 1.4.5 '@napi-rs/lzma-win32-x64-msvc': 1.4.5 @@ -3473,9 +3477,9 @@ snapshots: '@napi-rs/tar-linux-x64-musl@1.1.0': optional: true - '@napi-rs/tar-wasm32-wasi@1.1.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/tar-wasm32-wasi@1.1.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -3490,7 +3494,7 @@ snapshots: '@napi-rs/tar-win32-x64-msvc@1.1.0': optional: true - '@napi-rs/tar@1.1.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/tar@1.1.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': optionalDependencies: '@napi-rs/tar-android-arm-eabi': 1.1.0 '@napi-rs/tar-android-arm64': 1.1.0 @@ -3504,7 +3508,7 @@ snapshots: '@napi-rs/tar-linux-s390x-gnu': 1.1.0 '@napi-rs/tar-linux-x64-gnu': 1.1.0 '@napi-rs/tar-linux-x64-musl': 1.1.0 - '@napi-rs/tar-wasm32-wasi': 1.1.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/tar-wasm32-wasi': 1.1.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@napi-rs/tar-win32-arm64-msvc': 1.1.0 '@napi-rs/tar-win32-ia32-msvc': 1.1.0 '@napi-rs/tar-win32-x64-msvc': 1.1.0 @@ -3514,16 +3518,16 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@tybys/wasm-util': 0.10.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@tybys/wasm-util': 0.10.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 optional: true '@napi-rs/wasm-tools-android-arm-eabi@1.0.1': @@ -3553,9 +3557,9 @@ snapshots: '@napi-rs/wasm-tools-linux-x64-musl@1.0.1': optional: true - '@napi-rs/wasm-tools-wasm32-wasi@1.0.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-tools-wasm32-wasi@1.0.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -3570,7 +3574,7 @@ snapshots: '@napi-rs/wasm-tools-win32-x64-msvc@1.0.1': optional: true - '@napi-rs/wasm-tools@1.0.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-tools@1.0.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': optionalDependencies: '@napi-rs/wasm-tools-android-arm-eabi': 1.0.1 '@napi-rs/wasm-tools-android-arm64': 1.0.1 @@ -3581,7 +3585,7 @@ snapshots: '@napi-rs/wasm-tools-linux-arm64-musl': 1.0.1 '@napi-rs/wasm-tools-linux-x64-gnu': 1.0.1 '@napi-rs/wasm-tools-linux-x64-musl': 1.0.1 - '@napi-rs/wasm-tools-wasm32-wasi': 1.0.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-tools-wasm32-wasi': 1.0.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@napi-rs/wasm-tools-win32-arm64-msvc': 1.0.1 '@napi-rs/wasm-tools-win32-ia32-msvc': 1.0.1 '@napi-rs/wasm-tools-win32-x64-msvc': 1.0.1 @@ -3738,7 +3742,7 @@ snapshots: '@secretlint/profiler': 10.2.2 '@secretlint/resolver': 10.2.2 '@secretlint/types': 10.2.2 - ajv: 8.18.0 + ajv: 8.20.0 debug: 4.4.3 rc-config-loader: 4.1.4 transitivePeerDependencies: @@ -3757,9 +3761,9 @@ snapshots: dependencies: '@secretlint/resolver': 10.2.2 '@secretlint/types': 10.2.2 - '@textlint/linter-formatter': 15.5.4 - '@textlint/module-interop': 15.5.4 - '@textlint/types': 15.5.4 + '@textlint/linter-formatter': 15.6.0 + '@textlint/module-interop': 15.6.0 + '@textlint/types': 15.6.0 chalk: 5.6.2 debug: 4.4.3 pluralize: 8.0.0 @@ -3805,15 +3809,15 @@ snapshots: '@sindresorhus/merge-streams@2.3.0': {} - '@textlint/ast-node-types@15.5.4': {} + '@textlint/ast-node-types@15.6.0': {} - '@textlint/linter-formatter@15.5.4': + '@textlint/linter-formatter@15.6.0': dependencies: '@azu/format-text': 1.0.2 '@azu/style-format': 1.0.1 - '@textlint/module-interop': 15.5.4 - '@textlint/resolver': 15.5.4 - '@textlint/types': 15.5.4 + '@textlint/module-interop': 15.6.0 + '@textlint/resolver': 15.6.0 + '@textlint/types': 15.6.0 chalk: 4.1.2 debug: 4.4.3 js-yaml: 4.1.1 @@ -3826,15 +3830,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@textlint/module-interop@15.5.4': {} + '@textlint/module-interop@15.6.0': {} - '@textlint/resolver@15.5.4': {} + '@textlint/resolver@15.6.0': {} - '@textlint/types@15.5.4': + '@textlint/types@15.6.0': dependencies: - '@textlint/ast-node-types': 15.5.4 + '@textlint/ast-node-types': 15.6.0 - '@tybys/wasm-util@0.10.1': + '@tybys/wasm-util@0.10.2': dependencies: tslib: 2.8.1 @@ -3858,95 +3862,95 @@ snapshots: '@types/vscode@1.61.0': {} - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2)': + '@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.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.2 - eslint: 10.2.0 + '@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.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2)': + '@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.2 + '@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.0 - typescript: 6.0.2 + eslint: 10.3.0 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.2(typescript@6.0.2)': + '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 debug: 4.4.3 - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.58.2': + '@typescript-eslint/scope-manager@8.59.2': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 - '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': dependencies: - typescript: 6.0.2 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)': + '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@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.0 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + 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.58.2': {} + '@typescript-eslint/types@8.59.2': {} - '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.2)': + '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.58.2(typescript@6.0.2) - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@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 tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)': + '@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.0) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - eslint: 10.2.0 - typescript: 6.0.2 + '@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.58.2': + '@typescript-eslint/visitor-keys@8.59.2': dependencies: - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.59.2 eslint-visitor-keys: 5.0.1 '@typespec/ts-http-runtime@0.3.5': @@ -3996,7 +4000,7 @@ snapshots: '@vscode/vsce-sign-win32-arm64': 2.0.6 '@vscode/vsce-sign-win32-x64': 2.0.6 - '@vscode/vsce@3.8.1': + '@vscode/vsce@3.9.1': dependencies: '@azure/identity': 4.13.1 '@secretlint/node': 10.2.2 @@ -4040,17 +4044,17 @@ snapshots: agent-base@7.1.4: {} - ajv@6.14.0: + 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.18.0: + 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 @@ -4385,7 +4389,7 @@ snapshots: dependencies: version-range: 4.15.0 - emnapi@1.9.2: {} + emnapi@1.10.0: {} emoji-regex@8.0.0: {} @@ -4431,7 +4435,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -4449,7 +4453,7 @@ snapshots: object.assign: 4.1.7 own-keys: 1.0.1 regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 + safe-array-concat: 1.1.4 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 @@ -4477,11 +4481,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 es-to-primitive@1.3.0: dependencies: @@ -4489,7 +4493,7 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.45.1: {} + es-toolkit@1.46.1: {} esbuild@0.28.0: optionalDependencies: @@ -4524,35 +4528,35 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.2.0): + eslint-config-prettier@10.1.8(eslint@10.3.0): dependencies: - eslint: 10.2.0 + eslint: 10.3.0 eslint-import-resolver-node@0.3.10: dependencies: debug: 3.2.7 - is-core-module: 2.16.1 + is-core-module: 2.16.2 resolve: 2.0.0-next.6 transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.2.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - eslint: 10.2.0 + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + eslint: 10.3.0 eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color - eslint-plugin-es@3.0.1(eslint@10.2.0): + eslint-plugin-es@3.0.1(eslint@10.3.0): dependencies: - eslint: 10.2.0 + eslint: 10.3.0 eslint-utils: 2.1.0 regexpp: 3.2.0 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -4561,11 +4565,11 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 10.2.0 + eslint: 10.3.0 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.2.0) - hasown: 2.0.2 - is-core-module: 2.16.1 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0) + hasown: 2.0.3 + is-core-module: 2.16.2 is-glob: 4.0.3 minimatch: 3.1.5 object.fromentries: 2.0.8 @@ -4575,30 +4579,30 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-node@11.1.0(eslint@10.2.0): + eslint-plugin-node@11.1.0(eslint@10.3.0): dependencies: - eslint: 10.2.0 - eslint-plugin-es: 3.0.1(eslint@10.2.0) + eslint: 10.3.0 + eslint-plugin-es: 3.0.1(eslint@10.3.0) eslint-utils: 2.1.0 ignore: 5.3.2 minimatch: 3.1.5 resolve: 1.22.12 semver: 6.3.1 - eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@10.2.0))(eslint@10.2.0)(prettier@3.8.3): + eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@10.3.0))(eslint@10.3.0)(prettier@3.8.3): dependencies: - eslint: 10.2.0 + eslint: 10.3.0 prettier: 3.8.3 prettier-linter-helpers: 1.0.1 synckit: 0.11.12 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@10.2.0) + eslint-config-prettier: 10.1.8(eslint@10.3.0) eslint-scope@9.1.2: dependencies: @@ -4617,19 +4621,19 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.2.0: + eslint@10.3.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0) + '@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 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.1 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - ajv: 6.14.0 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 @@ -4697,7 +4701,7 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.0: {} + fast-uri@3.1.2: {} fast-wrap-ansi@0.2.0: dependencies: @@ -4747,7 +4751,7 @@ snapshots: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.2 + hasown: 2.0.3 mime-types: 2.1.35 fs-constants@1.0.0: @@ -4756,7 +4760,7 @@ snapshots: fs-extra@11.3.4: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.2.0 + jsonfile: 6.2.1 universalify: 2.0.1 function-bind@1.1.2: {} @@ -4767,7 +4771,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 - hasown: 2.0.2 + hasown: 2.0.3 is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -4784,7 +4788,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 math-intrinsics: 1.1.0 get-proto@1.0.1: @@ -4854,7 +4858,7 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.2: + hasown@2.0.3: dependencies: function-bind: 1.1.2 @@ -4915,7 +4919,7 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.2 + hasown: 2.0.3 side-channel: 1.1.0 is-array-buffer@3.0.5: @@ -4947,9 +4951,9 @@ snapshots: dependencies: ci-info: 2.0.0 - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 is-data-view@1.0.2: dependencies: @@ -5008,7 +5012,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 is-set@2.0.3: {} @@ -5088,7 +5092,7 @@ snapshots: jsonc-parser@3.3.1: {} - jsonfile@6.2.0: + jsonfile@6.2.1: dependencies: universalify: 2.0.1 optionalDependencies: @@ -5163,7 +5167,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.3.5: {} + lru-cache@11.3.6: {} lru-cache@6.0.0: dependencies: @@ -5228,7 +5232,7 @@ snapshots: natural-compare@1.4.0: {} - node-abi@3.89.0: + node-abi@3.91.0: dependencies: semver: 7.7.4 optional: true @@ -5339,7 +5343,7 @@ snapshots: ovsx@0.10.11: dependencies: - '@vscode/vsce': 3.8.1 + '@vscode/vsce': 3.9.1 commander: 6.2.1 follow-redirects: 1.16.0 is-ci: 2.0.0 @@ -5400,7 +5404,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.3.5 + lru-cache: 11.3.6 minipass: 7.1.3 path-type@6.0.0: {} @@ -5429,7 +5433,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.89.0 + node-abi: 3.91.0 pump: 3.0.4 rc: 1.2.8 simple-get: 4.0.1 @@ -5529,14 +5533,14 @@ 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 resolve@2.0.0-next.6: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 + is-core-module: 2.16.2 node-exports-info: 1.6.0 object-keys: 1.1.1 path-parse: 1.0.7 @@ -5550,7 +5554,7 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.3: + safe-array-concat@1.1.4: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -5760,7 +5764,7 @@ snapshots: table@6.9.0: dependencies: - ajv: 8.18.0 + ajv: 8.20.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -5805,9 +5809,9 @@ snapshots: dependencies: is-number: 7.0.0 - ts-api-utils@2.5.0(typescript@6.0.2): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - typescript: 6.0.2 + typescript: 6.0.3 tsconfig-paths@3.15.0: dependencies: @@ -5872,18 +5876,18 @@ snapshots: tunnel: 0.0.6 underscore: 1.13.8 - typescript-eslint@8.58.2(eslint@10.2.0)(typescript@6.0.2): + typescript-eslint@8.59.2(eslint@10.3.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - eslint: 10.2.0 - typescript: 6.0.2 + '@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/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@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) + eslint: 10.3.0 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - typescript@6.0.2: {} + typescript@6.0.3: {} uc.micro@2.1.0: {} @@ -5917,8 +5921,6 @@ snapshots: util-deprecate@1.0.2: optional: true - uuid@8.3.2: {} - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 diff --git a/extensions/VSCode/src/extension.ts b/extensions/VSCode/src/extension.ts index fe592075..9e003ea8 100644 --- a/extensions/VSCode/src/extension.ts +++ b/extensions/VSCode/src/extension.ts @@ -39,7 +39,7 @@ import { CodeChatEditorServer, initServer } from "./index.js"; // ### Local packages import { - autosave_timeout_ms, + auto_update_timeout_ms, EditorMessage, EditorMessageContents, KeysOfRustEnum, @@ -233,7 +233,7 @@ export const activate = (context: vscode.ExtensionContext) => { // before this command was executed to retain // the focus and be immediately rendered. preserveFocus: true, - // Put this in the a column beside the current + // Put this in the column beside the current // column. viewColumn: vscode.ViewColumn.Beside, }, @@ -437,19 +437,23 @@ export const activate = (context: vscode.ExtensionContext) => { ); } - const cursor_line = current_update.cursor_position; - if (cursor_line !== undefined && editor) { + const cursor_position = + current_update.cursor_position; + if (cursor_position !== undefined && editor) { + assert("Line" in cursor_position); + const cursor_line = cursor_position.Line; ignore_selection_change = true; - const cursor_position = new vscode.Position( - // The VSCode line is zero-based; the - // CodeMirror line is one-based. - cursor_line - 1, - 0, - ); + const vscode_cursor_position = + new vscode.Position( + // The VSCode line is zero-based; the + // CodeMirror line is one-based. + cursor_line - 1, + 0, + ); editor.selections = [ new vscode.Selection( - cursor_position, - cursor_position, + vscode_cursor_position, + vscode_cursor_position, ), ]; // I'd prefer to set `ignore_selection_change = @@ -658,7 +662,7 @@ const send_update = (this_is_dirty: boolean) => { if (idle_timer !== undefined) { clearTimeout(idle_timer); } - // ... schedule a render after an autosave timeout. + // ... schedule a render after an auto update timeout. idle_timer = setTimeout(async () => { if (can_render()) { const ate = vscode.window.activeTextEditor; @@ -712,7 +716,7 @@ const send_update = (this_is_dirty: boolean) => { scroll_position, ); } - }, autosave_timeout_ms); + }, auto_update_timeout_ms); } }; diff --git a/server/.cargo/config.toml b/server/.cargo/config.toml index 62c59ce9..7f3b9ce6 100644 --- a/server/.cargo/config.toml +++ b/server/.cargo/config.toml @@ -17,31 +17,7 @@ TS_RS_EXPORT_DIR = { value = "../client/src/rust-types", relative = true } # TypeScript's convention. TS_RS_IMPORT_EXTENSION = "ts" -# Code coverage, the manual way: -# -# 1. Run `cargo install rustfilt` per the -# [code coverage docs](https://doc.rust-lang.org/rustc/instrument-coverage.html#building-the-demangler). -# 2. You must manually run `rustup component add llvm-tools-preview` following -# the -# [coverge docs](https://doc.rust-lang.org/rustc/instrument-coverage.html#installing-llvm-coverage-tools). -# Per some searching, also run `cargo install cargo-binutils` to put these -# tools in the path. -# 3. In Powershell, `$Env:RUSTFLAGS = "-C instrument-coverage"` then `cargo -# test`. When the tests run, record the name of the test binary. -# 4. `rust-profdata merge -sparse default_*.profraw -o default.profdata`. -# 5. `rust-cov show --Xdemangler=rustfilt -# target\debug\deps\code_chat_editor-4dbe5c7815a53cd9.exe -# --instr-profile=default.profdata --ignore-filename-regex=\\.cargo\\registry -# --format=html --output-dir=coverage`, replacing the binary path with the -# one recorded in step 3. -# 6. Open the file `coverage\index.html`. -# -# Or, `cargo install cargo-tarpaulin` then `cargo tarpaulin --ignore-panics -# --out=html --skip-clean`. [build] -# Set these to match the output from `cargo tarpaulin --print-rust-flags` to -# avoid recompiles. -# -# This is commented out; for development, uncomment this. -##rustflags = ["-Cdebuginfo=2", "-Cstrip=none", "--cfg=tarpaulin", "-Cinstrument-coverage"] +# To check coverage, `cargo install cargo-tarpaulin` then `cargo tarpaulin +# --skip-clean --out=html --target-dir=tarpaulin`. \ No newline at end of file diff --git a/server/.gitignore b/server/.gitignore index 52b06b87..c935c389 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -23,14 +23,12 @@ target/ # Output from profiling. +tarpaulin/ *.profraw tarpaulin-report.html -# Copied files needed to `cargo publish`. -static/ +# Other files. hashLocations.json - -config.json *.log -.windows/ + # CodeChat Editor lexer: python. See TODO. diff --git a/server/Cargo.lock b/server/Cargo.lock index f93653c3..b979d999 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.11.1", + "bitflags", "bytes", "futures-core", "futures-sink", @@ -29,7 +29,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web", - "bitflags 2.11.1", + "bitflags", "bytes", "derive_more", "futures-core", @@ -44,16 +44,16 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.12.0" +version = "3.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f860ee6746d0c5b682147b2f7f8ef036d4f92fe518251a3a35ffa3650eafdf0e" +checksum = "93acb4a42f64936f9b8cae4a433b237599dd6eb6ed06124eb67132ef8cc90662" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-utils", "base64", - "bitflags 2.11.1", + "bitflags", "brotli", "bytes", "bytestring", @@ -72,8 +72,8 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.9.4", - "sha1", + "rand 0.10.1", + "sha1 0.11.0", "smallvec", "tokio", "tokio-util", @@ -246,6 +246,30 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.4" @@ -371,12 +395,12 @@ dependencies = [ "flate2", "log", "md-5 0.10.6", - "rand 0.8.5", + "rand 0.8.6", "reqwest 0.12.28", "scroll", "serde", "serde-xml-rs", - "sha1", + "sha1 0.10.6", "sha2 0.10.9", "signature", "thiserror 2.0.18", @@ -418,9 +442,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "assert_cmd" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a686bbee5efb88a82df0621b236e74d925f470e5445d3220a5648b892ec99c9" +checksum = "39bae1d3fa576f7c6519514180a72559268dd7d1fe104070956cb687bc6673bd" dependencies = [ "anstyle", "bstr", @@ -481,9 +505,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.16.2" +version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" +checksum = "0ec6fb3fe69024a75fa7e1bfb48aa6cf59706a101658ea01bfd33b2b248a038f" dependencies = [ "aws-lc-sys", "zeroize", @@ -491,9 +515,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.39.1" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a25cf98105baa966497416dbd42565ce3a8cf8dbfd59803ec9ad46f3126399" +checksum = "f50037ee5e1e41e7b8f9d161680a725bd1626cb6f8c7e901f91f942850852fe7" dependencies = [ "cc", "cmake", @@ -507,6 +531,25 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64-simd" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" +dependencies = [ + "simd-abstraction", +] + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref 0.5.2", + "vsimd", +] + [[package]] name = "base64ct" version = "1.8.3" @@ -540,15 +583,21 @@ checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22" [[package]] name = "bitflags" -version = "1.3.2" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] -name = "bitflags" -version = "2.11.1" +name = "bitvec" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] [[package]] name = "block-buffer" @@ -609,6 +658,28 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "byteorder" version = "1.5.0" @@ -626,9 +697,9 @@ dependencies = [ [[package]] name = "bytestring" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" +checksum = "86566c496f2f47d9b8147a4c8b02ffdb69c919fe0c2b2e7195d22cbba0e635c9" dependencies = [ "bytes", ] @@ -662,11 +733,20 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + [[package]] name = "cc" -version = "1.2.60" +version = "1.2.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" dependencies = [ "find-msvc-tools", "jobserver", @@ -674,12 +754,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cfb" version = "0.7.3" @@ -730,9 +804,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -752,9 +826,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", @@ -783,6 +857,15 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f88a43d011fc4a6876cb7344703e297c71dda42494fee094d5f7c76bf13f746" +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.18", +] + [[package]] name = "codechat-editor-server" version = "0.1.54" @@ -817,13 +900,14 @@ dependencies = [ "markup5ever_rcdom", "mime", "mime_guess", + "minify-html", "minreq", "normalize-line-endings", "notify-debouncer-full", "path-slash", "pest", "pest_derive", - "phf", + "phf 0.13.1", "predicates", "pretty_assertions", "pulldown-cmark 0.13.3", @@ -860,6 +944,20 @@ dependencies = [ "memchr", ] +[[package]] +name = "compact_str" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -872,13 +970,34 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" +[[package]] +name = "const-str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" +dependencies = [ + "const-str-proc-macro", +] + +[[package]] +name = "const-str-proc-macro" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "const_format" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" dependencies = [ "const_format_proc_macros", + "konst", ] [[package]] @@ -892,6 +1011,15 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "convert_case" version = "0.10.0" @@ -928,6 +1056,12 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cow-utils" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417bef24afe1460300965a25ff4a24b8b45ad011948302ec221e8a0a81eb2c79" + [[package]] name = "cpio-archive" version = "0.10.0" @@ -969,9 +1103,9 @@ dependencies = [ [[package]] name = "crc-catalog" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" [[package]] name = "crc32fast" @@ -1043,6 +1177,38 @@ dependencies = [ "x509-certificate", ] +[[package]] +name = "cssparser" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.11.3", + "smallvec", +] + +[[package]] +name = "cssparser-color" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +dependencies = [ + "cssparser", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.117", +] + [[package]] name = "ctutils" version = "0.4.2" @@ -1052,11 +1218,33 @@ dependencies = [ "cmov", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-encoding" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] [[package]] name = "debpkg" @@ -1121,7 +1309,7 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ - "convert_case", + "convert_case 0.10.0", "proc-macro2", "quote", "rustc_version", @@ -1159,9 +1347,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4850db49bf08e663084f7fb5c87d202ef91a3907271aff24a94eb97ff039153c" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.0", "const-oid 0.10.2", @@ -1246,12 +1434,51 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "dragonbox_ecma" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd8e701084c37e7ef62d3f9e453b618130cbc0ef3573847785952a3ac3f746bf" + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + [[package]] name = "dunce" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -1421,6 +1648,12 @@ dependencies = [ "libc", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.32" @@ -1579,7 +1812,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 2.11.1", + "bitflags", "ignore", "walkdir", ] @@ -1608,6 +1841,15 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" @@ -1625,6 +1867,9 @@ name = "hashbrown" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +dependencies = [ + "allocator-api2", +] [[package]] name = "heck" @@ -1644,24 +1889,24 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" dependencies = [ - "digest 0.11.2", + "digest 0.11.3", ] [[package]] name = "htmd" version = "0.5.4" -source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#68b5d9cfa22131ea32c71fa480b6746828700cc6" +source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#deafeb4b579530a94314828218cfbda79c615ef8" dependencies = [ "html5ever", "markup5ever_rcdom", - "phf", + "phf 0.13.1", ] [[package]] name = "html5ever" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8" dependencies = [ "log", "markup5ever", @@ -1747,9 +1992,9 @@ checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hybrid-array" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" +checksum = "08d46837a0ed51fe95bd3b05de33cd64a1ee88fc797477ca48446872504507c5" dependencies = [ "typenum", ] @@ -1938,9 +2183,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -2033,7 +2278,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" dependencies = [ - "bitflags 2.11.1", + "bitflags", "inotify-sys", "libc", ] @@ -2053,16 +2298,6 @@ version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" -[[package]] -name = "iri-string" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "is_executable" version = "1.0.5" @@ -2078,6 +2313,24 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" @@ -2086,9 +2339,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" +checksum = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d" dependencies = [ "jiff-static", "log", @@ -2099,31 +2352,15 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" +checksum = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7" dependencies = [ "proc-macro2", "quote", "syn 2.0.117", ] -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys 0.3.1", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - [[package]] name = "jni" version = "0.22.4" @@ -2133,7 +2370,7 @@ dependencies = [ "cfg-if", "combine", "jni-macros", - "jni-sys 0.4.1", + "jni-sys", "log", "simd_cesu8", "thiserror 2.0.18", @@ -2154,15 +2391,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "jni-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" -dependencies = [ - "jni-sys 0.4.1", -] - [[package]] name = "jni-sys" version = "0.4.1" @@ -2194,9 +2422,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.95" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" +checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" dependencies = [ "cfg-if", "futures-util", @@ -2204,6 +2432,27 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json-escape-simd" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e770254dd7802184595b1d30da2a15cb72569e2aca2b177aef8d22eac8a693" + +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + [[package]] name = "kqueue" version = "1.1.1" @@ -2216,11 +2465,11 @@ dependencies = [ [[package]] name = "kqueue-sys" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +checksum = "a7b65860415f949f23fa882e669f2dbd4a0f0eeb1acdd56790b30494afd7da2f" dependencies = [ - "bitflags 1.3.2", + "bitflags", "libc", ] @@ -2244,15 +2493,15 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libbz2-rs-sys" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" +checksum = "b3a6a8c165077efc8f3a971534c50ea6a1a18b329ef4a66e897a7e3a1494565f" [[package]] name = "libc" -version = "0.2.185" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libredox" @@ -2260,10 +2509,50 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ - "bitflags 2.11.1", + "bitflags", "libc", "plain", - "redox_syscall 0.7.4", + "redox_syscall 0.7.5", +] + +[[package]] +name = "lightningcss" +version = "1.0.0-alpha.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6314c2f0590ac93c86099b98bb7ba8abcf759bfd89604ffca906472bb54937" +dependencies = [ + "ahash 0.8.12", + "bitflags", + "const-str", + "cssparser", + "cssparser-color", + "dashmap", + "data-encoding", + "getrandom 0.3.4", + "indexmap 2.14.0", + "itertools 0.10.5", + "lazy_static", + "lightningcss-derive", + "parcel_selectors", + "parcel_sourcemap", + "pastey 0.1.1", + "pathdiff", + "rayon", + "serde", + "serde-content", + "smallvec", +] + +[[package]] +name = "lightningcss-derive" +version = "1.0.0-alpha.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" +dependencies = [ + "convert_case 0.6.0", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -2376,9 +2665,9 @@ dependencies = [ [[package]] name = "markup5ever" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" dependencies = [ "log", "tendril", @@ -2387,9 +2676,9 @@ dependencies = [ [[package]] name = "markup5ever_rcdom" -version = "0.38.0+unofficial" +version = "0.39.0+unofficial" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "333171ccdf66e915257740d44e38ea5b1b19ce7b45d33cc35cb6f118fbd981ff" +checksum = "3ac010f19d6c4af81eeb4018a39d7a115de9d285af45c126a4ac02e6fc5716b7" dependencies = [ "html5ever", "markup5ever", @@ -2397,6 +2686,12 @@ dependencies = [ "xml5ever", ] +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + [[package]] name = "md-5" version = "0.10.6" @@ -2414,7 +2709,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" dependencies = [ "cfg-if", - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -2439,6 +2734,38 @@ dependencies = [ "unicase", ] +[[package]] +name = "minify-html" +version = "0.18.1" +source = "git+https://github.com/bjones1/minify-html.git?branch=dev#b5cce1953106d00b5e622214a99457d3312c5fa9" +dependencies = [ + "ahash 0.8.12", + "aho-corasick", + "lightningcss", + "memchr", + "minify-html-common", + "once_cell", + "oxc_allocator", + "oxc_codegen", + "oxc_minifier", + "oxc_parser", + "oxc_span", +] + +[[package]] +name = "minify-html-common" +version = "0.0.3" +source = "git+https://github.com/bjones1/minify-html.git?branch=dev#b5cce1953106d00b5e622214a99457d3312c5fa9" +dependencies = [ + "ahash 0.8.12", + "aho-corasick", + "itertools 0.14.0", + "memchr", + "once_cell", + "serde", + "serde_json", +] + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -2485,6 +2812,12 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "nonmax" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" + [[package]] name = "normalize-line-endings" version = "0.3.0" @@ -2497,7 +2830,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.11.1", + "bitflags", "fsevent-sys", "inotify", "kqueue", @@ -2528,7 +2861,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.11.1", + "bitflags", ] [[package]] @@ -2541,12 +2874,31 @@ dependencies = [ "time", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-conv" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2571,7 +2923,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.1", + "bitflags", ] [[package]] @@ -2586,7 +2938,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.1", + "bitflags", "objc2", ] @@ -2624,12 +2976,421 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] -name = "ordered-float" -version = "2.10.1" +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "outref" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + +[[package]] +name = "owo-colors" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" + +[[package]] +name = "oxc-browserslist" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be1f075e9100260ff5ecb2b375fb24d6c5f2c97a23e6a86367720831e9faa8e" +dependencies = [ + "flate2", + "postcard", + "rustc-hash", + "serde", + "thiserror 2.0.18", +] + +[[package]] +name = "oxc-miette" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4356a61f2ed4c9b3610245215fbf48970eb277126919f87db9d0efa93a74245c" +dependencies = [ + "cfg-if", + "owo-colors", + "oxc-miette-derive", + "textwrap", + "thiserror 2.0.18", + "unicode-segmentation", + "unicode-width", +] + +[[package]] +name = "oxc-miette-derive" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b237422b014f8f8fff75bb9379e697d13f8d57551a22c88bebb39f073c1bf696" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "oxc_allocator" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd3b8bfef454857d3d9ca08fb84c8955da8591b5a82a21bb34a7ebbf94da7b0f" +dependencies = [ + "allocator-api2", + "hashbrown 0.17.0", + "oxc_data_structures", + "rustc-hash", +] + +[[package]] +name = "oxc_ast" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381ae8356082431bd7e217dd78c7179bfc379dbbe7a32494e28be4fc678812c7" +dependencies = [ + "bitflags", + "oxc_allocator", + "oxc_ast_macros", + "oxc_data_structures", + "oxc_diagnostics", + "oxc_estree", + "oxc_regular_expression", + "oxc_span", + "oxc_str", + "oxc_syntax", +] + +[[package]] +name = "oxc_ast_macros" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50246449a5fa669debd2debeb90be4c30f0a3a2e954f852ec40e5ef49701285" +dependencies = [ + "phf 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "oxc_ast_visit" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82466fd1885834078becf1385380c40624bf511723b695104b21f293c7dc5271" +dependencies = [ + "oxc_allocator", + "oxc_ast", + "oxc_span", + "oxc_syntax", +] + +[[package]] +name = "oxc_codegen" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b69f394fa01810f99943a9191dde9d5757bdccd5c06347af62663eea671a5153" +dependencies = [ + "bitflags", + "cow-utils", + "dragonbox_ecma", + "itoa", + "oxc_allocator", + "oxc_ast", + "oxc_data_structures", + "oxc_index", + "oxc_semantic", + "oxc_sourcemap", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", +] + +[[package]] +name = "oxc_compat" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20b656d726e4dafe2341759dc2f1fefa39fc736773f382885714f139d4dc69cc" +dependencies = [ + "cow-utils", + "oxc-browserslist", + "oxc_syntax", + "rustc-hash", + "serde", +] + +[[package]] +name = "oxc_data_structures" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1defc2fd17ee94f2c8511b0c4a4756d5868fbee891478953f2354ef444b1962f" + +[[package]] +name = "oxc_diagnostics" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7ccb0e8e7c9f1fb75e0700b2c75d9d854e534a7a356b13d2936893651f2b98" +dependencies = [ + "cow-utils", + "oxc-miette", + "percent-encoding", +] + +[[package]] +name = "oxc_ecmascript" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1904566c4e725c1511c88166ec203ae97bebb62887441b4a29b1e7757ec39859" +dependencies = [ + "cow-utils", + "num-bigint", + "num-traits", + "oxc_allocator", + "oxc_ast", + "oxc_regular_expression", + "oxc_span", + "oxc_syntax", +] + +[[package]] +name = "oxc_estree" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87cd0e290bab4cb5d81377bbc1ebd414f01a7af72d7f8e5ccbb4a9a157d71df" + +[[package]] +name = "oxc_index" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3e6120999627ec9703025eab7c9f410ebb7e95557632a8902ca48210416c2b" +dependencies = [ + "nonmax", + "serde", +] + +[[package]] +name = "oxc_mangler" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc7dcb6b22f8e7aa9a8d2afa8f29e62a7892a02de780dab976aa42eb09e977a9" +dependencies = [ + "itertools 0.14.0", + "oxc_allocator", + "oxc_ast", + "oxc_data_structures", + "oxc_index", + "oxc_semantic", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", +] + +[[package]] +name = "oxc_minifier" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59700b3cd4906c9e1878ac925bd86a284a1efd0a69353516f65ffc3ebb08a8ff" +dependencies = [ + "cow-utils", + "itoa", + "oxc_allocator", + "oxc_ast", + "oxc_ast_visit", + "oxc_compat", + "oxc_data_structures", + "oxc_ecmascript", + "oxc_index", + "oxc_mangler", + "oxc_parser", + "oxc_regular_expression", + "oxc_semantic", + "oxc_span", + "oxc_str", + "oxc_syntax", + "oxc_traverse", + "rustc-hash", +] + +[[package]] +name = "oxc_parser" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71acdb67749ff68bfbbd346da7dd2fe4947964be49ac9ec34d73d10a2396dcd" +dependencies = [ + "bitflags", + "cow-utils", + "memchr", + "num-bigint", + "num-traits", + "oxc_allocator", + "oxc_ast", + "oxc_data_structures", + "oxc_diagnostics", + "oxc_ecmascript", + "oxc_regular_expression", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", + "seq-macro", +] + +[[package]] +name = "oxc_regular_expression" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a1273168ec6d8083e161565d264847249b9aad51c430d92d344303ede058b2" +dependencies = [ + "bitflags", + "oxc_allocator", + "oxc_ast_macros", + "oxc_diagnostics", + "oxc_span", + "oxc_str", + "phf 0.13.1", + "rustc-hash", + "unicode-id-start", +] + +[[package]] +name = "oxc_semantic" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63d4f8a0d3eb4e8e03aa413f54300235cb0314dc26649d2ff19f609b7b478272" +dependencies = [ + "itertools 0.14.0", + "memchr", + "oxc_allocator", + "oxc_ast", + "oxc_ast_visit", + "oxc_diagnostics", + "oxc_ecmascript", + "oxc_index", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", + "self_cell", +] + +[[package]] +name = "oxc_sourcemap" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d378eb8bad20e89d66276aebab51f6a5408571092cac94abdd3eabb773713d6" +dependencies = [ + "base64-simd 0.8.0", + "json-escape-simd", + "rustc-hash", + "serde", + "serde_json", +] + +[[package]] +name = "oxc_span" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9af84474452c3caa7aca1bcaca04b6e16552fe29472059b7921ae7a69790dccf" +dependencies = [ + "compact_str", + "oxc-miette", + "oxc_allocator", + "oxc_ast_macros", + "oxc_estree", + "oxc_str", +] + +[[package]] +name = "oxc_str" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136bcc6bed1182df0b9c529e478da55a490b38ba5f1189abf2e7a9b13f46f0b1" +dependencies = [ + "compact_str", + "hashbrown 0.17.0", + "oxc_allocator", + "oxc_estree", +] + +[[package]] +name = "oxc_syntax" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b448a086623714675f66b79271e25fa2b51708255fa6af7dad83be88cc6e8726" +dependencies = [ + "bitflags", + "cow-utils", + "dragonbox_ecma", + "nonmax", + "oxc_allocator", + "oxc_ast_macros", + "oxc_estree", + "oxc_index", + "oxc_span", + "oxc_str", + "phf 0.13.1", + "unicode-id-start", +] + +[[package]] +name = "oxc_traverse" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "648c4e7c8ee0a8d2ff28751cc9dc8d5502a7d3b2b96d4fa73de7fb31b46d54c6" +dependencies = [ + "itoa", + "oxc_allocator", + "oxc_ast", + "oxc_ast_visit", + "oxc_data_structures", + "oxc_ecmascript", + "oxc_semantic", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", +] + +[[package]] +name = "parcel_selectors" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54fd03f1ad26cb6b3ec1b7414fa78a3bd639e7dbb421b1a60513c96ce886a196" +dependencies = [ + "bitflags", + "cssparser", + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "precomputed-hash", + "rustc-hash", + "smallvec", +] + +[[package]] +name = "parcel_sourcemap" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" dependencies = [ - "num-traits", + "base64-simd 0.7.0", + "data-url", + "rkyv", + "serde", + "serde_json", + "vlq", ] [[package]] @@ -2663,9 +3424,9 @@ checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" [[package]] name = "pastey" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b867cad97c0791bbd3aaa6472142568c6c9e8f71937e98379f584cfb0cf35bec" +checksum = "c5a797f0e07bdf071d15742978fc3128ec6c22891c31a3a931513263904c982a" [[package]] name = "path-slash" @@ -2673,6 +3434,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "pem" version = "3.0.6" @@ -2732,25 +3499,55 @@ dependencies = [ "sha2 0.10.9", ] +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + [[package]] name = "phf" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ - "phf_macros", - "phf_shared", + "phf_macros 0.13.1", + "phf_shared 0.13.1", "serde", ] +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + [[package]] name = "phf_codegen" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.6", ] [[package]] @@ -2760,7 +3557,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ "fastrand", - "phf_shared", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] @@ -2769,13 +3579,22 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", "proc-macro2", "quote", "syn 2.0.117", ] +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "phf_shared" version = "0.13.1" @@ -2811,13 +3630,25 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + [[package]] name = "postgres-protocol" version = "0.6.11" @@ -2937,13 +3768,33 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "pulldown-cmark" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "679341d22c78c6c649893cbd6c3278dcbe9fc4faa62fea3a9296ae2b50c14625" dependencies = [ - "bitflags 2.11.1", + "bitflags", "memchr", "unicase", ] @@ -2954,7 +3805,7 @@ version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" dependencies = [ - "bitflags 2.11.1", + "bitflags", "memchr", "pulldown-cmark-escape", "unicase", @@ -3043,11 +3894,17 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -3119,22 +3976,42 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.1", + "bitflags", ] [[package]] name = "redox_syscall" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" +checksum = "4666a1a60d8412eab19d94f6d13dcc9cea0a5ef4fdf6a5db306537413c661b1b" dependencies = [ - "bitflags 2.11.1", + "bitflags", ] [[package]] @@ -3183,6 +4060,15 @@ version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + [[package]] name = "reqwest" version = "0.12.28" @@ -3225,9 +4111,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" dependencies = [ "base64", "bytes", @@ -3274,6 +4160,35 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rustc-hash" version = "2.1.2" @@ -3295,7 +4210,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.1", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -3304,9 +4219,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.38" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f9466fb2c14ea04357e91413efb882e2a6d4a406e625449bc0a5d360d53a21" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ "aws-lc-rs", "once_cell", @@ -3331,9 +4246,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "web-time", "zeroize", @@ -3341,13 +4256,13 @@ dependencies = [ [[package]] name = "rustls-platform-verifier" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" dependencies = [ "core-foundation", "core-foundation-sys", - "jni 0.21.1", + "jni", "log", "once_cell", "rustls", @@ -3368,9 +4283,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.12" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "aws-lc-rs", "ring", @@ -3434,13 +4349,19 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "security-framework" version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.1", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -3460,7 +4381,7 @@ dependencies = [ [[package]] name = "selenium-manager" version = "0.4.41" -source = "git+https://github.com/bjones1/thirtyfour.git?branch=selenium_manager#fd15160c17fde42df55df1c30b77321a16d55312" +source = "git+https://github.com/bjones1/thirtyfour.git?branch=selenium_manager#58b929e8700d7187fb7c0e9a8e543d0d49bb5345" dependencies = [ "anyhow", "apple-flat-package", @@ -3491,12 +4412,24 @@ dependencies = [ "zip", ] +[[package]] +name = "self_cell" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + [[package]] name = "semver" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + [[package]] name = "serde" version = "1.0.228" @@ -3507,6 +4440,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-content" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3753ca04f350fa92d00b6146a3555e63c55388c9ef2e11e09bce2ff1c0b509c6" +dependencies = [ + "serde", +] + [[package]] name = "serde-value" version = "0.7.0" @@ -3636,6 +4578,17 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha1" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + [[package]] name = "sha2" version = "0.10.9" @@ -3655,7 +4608,7 @@ checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", "cpufeatures 0.3.0", - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -3683,6 +4636,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simd-abstraction" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" +dependencies = [ + "outref 0.1.0", +] + [[package]] name = "simd-adler32" version = "0.3.9" @@ -3713,9 +4675,9 @@ checksum = "5dd19be0257552dd56d1bb6946f89f193c6e5b9f13cc9327c4bc84a357507c74" [[package]] name = "siphasher" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "slab" @@ -3729,6 +4691,12 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "smawk" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" + [[package]] name = "socket2" version = "0.5.10" @@ -3765,6 +4733,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "string_cache" version = "0.9.0" @@ -3773,7 +4747,7 @@ checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" dependencies = [ "new_debug_unreachable", "parking_lot", - "phf_shared", + "phf_shared 0.13.1", "precomputed-hash", "serde", ] @@ -3784,8 +4758,8 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", "proc-macro2", "quote", ] @@ -3864,6 +4838,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tar" version = "0.4.45" @@ -3922,10 +4902,21 @@ dependencies = [ "log", ] +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", + "unicode-linebreak", + "unicode-width", +] + [[package]] name = "thirtyfour" -version = "0.36.1" -source = "git+https://github.com/bjones1/thirtyfour.git?branch=selenium_manager#fd15160c17fde42df55df1c30b77321a16d55312" +version = "0.36.2" +source = "git+https://github.com/bjones1/thirtyfour.git?branch=selenium_manager#58b929e8700d7187fb7c0e9a8e543d0d49bb5345" dependencies = [ "arc-swap", "async-trait", @@ -3937,8 +4928,8 @@ dependencies = [ "http 1.4.0", "indexmap 2.14.0", "libc", - "pastey 0.2.1", - "reqwest 0.13.2", + "pastey 0.2.2", + "reqwest 0.13.3", "selenium-manager", "serde", "serde_json", @@ -3954,7 +4945,7 @@ dependencies = [ [[package]] name = "thirtyfour-macros" version = "0.2.0" -source = "git+https://github.com/bjones1/thirtyfour.git?branch=selenium_manager#fd15160c17fde42df55df1c30b77321a16d55312" +source = "git+https://github.com/bjones1/thirtyfour.git?branch=selenium_manager#58b929e8700d7187fb7c0e9a8e543d0d49bb5345" dependencies = [ "proc-macro2", "quote", @@ -4069,9 +5060,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.0" +version = "1.52.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91135f59b1cbf38c91e73cf3386fca9bb77915c45ce2771460c9d92f0f3d776" +checksum = "110a78583f19d5cdb2c5ccf321d1290344e71313c6c37d43520d386027d18386" dependencies = [ "bytes", "libc", @@ -4110,7 +5101,7 @@ dependencies = [ "log", "parking_lot", "percent-encoding", - "phf", + "phf 0.13.1", "pin-project-lite", "postgres-protocol", "postgres-types", @@ -4187,7 +5178,7 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.1", + "winnow 1.0.2", ] [[package]] @@ -4213,20 +5204,20 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "a28f0d049ccfaa566e14e9663d304d8577427b368cb4710a20528690287a738b" dependencies = [ - "bitflags 2.11.1", + "bitflags", "bytes", "futures-util", "http 1.4.0", "http-body", - "iri-string", "pin-project-lite", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -4313,7 +5304,7 @@ dependencies = [ "httparse", "log", "rand 0.9.4", - "sha1", + "sha1 0.10.6", "thiserror 2.0.18", ] @@ -4328,9 +5319,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "ucd-trie" @@ -4350,12 +5341,24 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" +[[package]] +name = "unicode-id-start" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b79ad29b5e19de4260020f8919b443b2ef0277d242ce532ec7b7a2cc8b6007" + [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + [[package]] name = "unicode-normalization" version = "0.1.25" @@ -4448,9 +5451,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" dependencies = [ "js-sys", "wasm-bindgen", @@ -4468,6 +5471,18 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vlq" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + [[package]] name = "wait-timeout" version = "0.2.1" @@ -4513,11 +5528,11 @@ dependencies = [ [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -4526,7 +5541,7 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] @@ -4540,9 +5555,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" +checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" dependencies = [ "cfg-if", "once_cell", @@ -4553,9 +5568,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.68" +version = "0.4.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" +checksum = "af934872acec734c2d80e6617bbb5ff4f12b052dd8e6332b0817bce889516084" dependencies = [ "js-sys", "wasm-bindgen", @@ -4563,9 +5578,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" +checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4573,9 +5588,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" +checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" dependencies = [ "bumpalo", "proc-macro2", @@ -4586,9 +5601,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" +checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" dependencies = [ "unicode-ident", ] @@ -4621,7 +5636,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.1", + "bitflags", "hashbrown 0.15.5", "indexmap 2.14.0", "semver", @@ -4629,9 +5644,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.95" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" +checksum = "2eadbac71025cd7b0834f20d1fe8472e8495821b4e9801eb0a60bd1f19827602" dependencies = [ "js-sys", "wasm-bindgen", @@ -4649,24 +5664,24 @@ dependencies = [ [[package]] name = "web_atoms" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576" +checksum = "d7cff6eef815df1834fd250e3a2ff436044d82a9f1bc1980ca1dbdf07effc538" dependencies = [ - "phf", - "phf_codegen", + "phf 0.13.1", + "phf_codegen 0.13.1", "string_cache", "string_cache_codegen", ] [[package]] name = "webbrowser" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe985f41e291eecef5e5c0770a18d28390addb03331c043964d9e916453d6f16" +checksum = "0fc95580916af1e68ff6a7be07446fc5db73ebf71cf092de939bbf5f7e189f72" dependencies = [ "core-foundation", - "jni 0.22.4", + "jni", "log", "ndk-context", "objc2", @@ -4677,18 +5692,18 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" +checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" dependencies = [ "rustls-pki-types", ] [[package]] name = "webpki-roots" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" dependencies = [ "rustls-pki-types", ] @@ -4704,9 +5719,9 @@ dependencies = [ [[package]] name = "whoami" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6a5b12f9df4f978d2cfdb1bd3bac52433f44393342d7ee9c25f5a1c14c0f45d" +checksum = "998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d" dependencies = [ "libc", "libredox", @@ -4847,15 +5862,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -4883,21 +5889,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -4940,12 +5931,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -4958,12 +5943,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -4976,12 +5955,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -5006,12 +5979,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -5024,12 +5991,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -5042,12 +6003,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -5060,12 +6015,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -5086,9 +6035,9 @@ checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" [[package]] name = "winnow" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" [[package]] name = "wit-bindgen" @@ -5099,6 +6048,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -5148,7 +6103,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.1", + "bitflags", "indexmap 2.14.0", "log", "serde", @@ -5184,6 +6139,15 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "x509-certificate" version = "0.24.0" @@ -5221,9 +6185,9 @@ checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" [[package]] name = "xml5ever" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dc9559429edf0cd3f327cc0afd9d6b36fa8cec6d93107b7fbe64f806b5f2d9" +checksum = "5ab627f34ff61b80d756180d556f9c68801d836d271b3b8c094504ceca69d221" dependencies = [ "log", "markup5ever", diff --git a/server/Cargo.toml b/server/Cargo.toml index 9cc55218..1cdfa772 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -67,16 +67,17 @@ dunce = "1.0.5" futures-util = "0.3.29" htmd = { git = "https://github.com/bjones1/htmd.git", branch = "dom-interface", version = "0.5" } # This must match the version of `markup5ever_rcdom`. -html5ever = "0.38" +html5ever = "0.39" htmlize = "1.0.6" imara-diff = { version = "0.2", features = [] } indoc = "2.0.5" lazy_static = "1" log = "0.4" log4rs = "1.3" -markup5ever_rcdom = "0.38" +markup5ever_rcdom = "0.39" mime = "0.3.17" mime_guess = "2.0.5" +minify-html = { git = "https://github.com/bjones1/minify-html.git", branch = "dev", version = "0.18.1" } minreq = "2.12.0" normalize-line-endings = "0.3.0" notify-debouncer-full = "0.7" diff --git a/server/run_until_fail.ps1 b/server/run_until_fail.ps1 new file mode 100644 index 00000000..bba4489f --- /dev/null +++ b/server/run_until_fail.ps1 @@ -0,0 +1,11 @@ +$iteration = 0 +while ($true) { + $iteration++ + clear + Write-Host "--- Iteration $iteration ---" + cargo test --test overall_2 + if ($LASTEXITCODE -ne 0) { + Write-Host "Test failed on iteration $iteration. Exiting." + exit $LASTEXITCODE + } +} diff --git a/server/src/ide.rs b/server/src/ide.rs index b609b441..67d139de 100644 --- a/server/src/ide.rs +++ b/server/src/ide.rs @@ -66,9 +66,9 @@ use crate::{ processing::{CodeChatForWeb, CodeMirror, CodeMirrorDiffable, SourceFileMetadata}, translation::{CreatedTranslationQueues, create_translation_queues}, webserver::{ - self, EditorMessage, EditorMessageContents, INITIAL_IDE_MESSAGE_ID, MESSAGE_ID_INCREMENT, - REPLY_TIMEOUT_MS, ResultErrTypes, ResultOkTypes, UpdateMessageContents, WebAppState, - setup_server, + self, CursorPosition, EditorMessage, EditorMessageContents, INITIAL_IDE_MESSAGE_ID, + MESSAGE_ID_INCREMENT, REPLY_TIMEOUT_MS, ResultErrTypes, ResultOkTypes, + UpdateMessageContents, WebAppState, setup_server, }, }; @@ -271,7 +271,7 @@ impl CodeChatEditorServer { ) -> std::io::Result { self.send_message_timeout(EditorMessageContents::Update(UpdateMessageContents { file_path, - cursor_position, + cursor_position: cursor_position.map(CursorPosition::Line), scroll_position: scroll_position.map(|x| x as f32), is_re_translation: false, contents: option_contents.map(|contents| CodeChatForWeb { diff --git a/server/src/ide/filewatcher.rs b/server/src/ide/filewatcher.rs index 72abcf8b..308056cc 100644 --- a/server/src/ide/filewatcher.rs +++ b/server/src/ide/filewatcher.rs @@ -89,6 +89,7 @@ pub const FILEWATCHER_PATH_PREFIX: &[&str] = &["fw", "fsc"]; /// replaced by something better. /// /// Redirect from the root of the filesystem to the actual root path on this OS. +#[cfg(not(tarpaulin_include))] pub async fn filewatcher_root_fs_redirect() -> impl Responder { HttpResponse::TemporaryRedirect() .insert_header((header::LOCATION, "/fw/fsb/")) @@ -310,6 +311,7 @@ async fn dir_listing(web_path: &str, dir_path: &Path) -> HttpResponse { /// Copied almost verbatim from the /// [win\_partitions crate](https://docs.rs/crate/win_partitions/0.3.0/source/src/win_api.rs#144) /// when compilation errors broke the crate. +#[cfg(not(tarpaulin_include))] #[cfg(target_os = "windows")] pub fn get_logical_drive() -> Result, std::io::Error> { let bitmask = unsafe { GetLogicalDrives() }; diff --git a/server/src/ide/vscode/tests.rs b/server/src/ide/vscode/tests.rs index bf431a5e..509cff9e 100644 --- a/server/src/ide/vscode/tests.rs +++ b/server/src/ide/vscode/tests.rs @@ -47,9 +47,12 @@ use tokio_tungstenite::{ tungstenite::{http::StatusCode, protocol::Message}, }; -use crate::webserver::{ - EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, INITIAL_IDE_MESSAGE_ID, - INITIAL_MESSAGE_ID, IdeType, MESSAGE_ID_INCREMENT, ResultErrTypes, +use crate::{ + processing::CodeMirrorDocBlockUpdate, + webserver::{ + EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, INITIAL_IDE_MESSAGE_ID, + INITIAL_MESSAGE_ID, IdeType, MESSAGE_ID_INCREMENT, ResultErrTypes, + }, }; use crate::{ processing::{ @@ -557,7 +560,7 @@ async fn test_vscode_ide_websocket8() { to: 1, indent: "".to_string(), delimiter: "#".to_string(), - contents: "

testing

\n".to_string() + contents: "

testing".to_string() }], }), version: 0.0, @@ -689,7 +692,7 @@ async fn test_vscode_ide_websocket7() { to: 1, indent: "".to_string(), delimiter: "#".to_string(), - contents: "

more

\n".to_string() + contents: "

more".to_string() }] }), version: 0.0, @@ -764,13 +767,27 @@ async fn test_vscode_ide_websocket7() { to: None, insert: "code\n\n".to_string() }], - doc_blocks: vec![CodeMirrorDocBlockTransaction::Add(CodeMirrorDocBlock { - from: 6, - to: 7, - indent: "".to_string(), - delimiter: "#".to_string(), - contents: "

most

\n".to_string() - })], + doc_blocks: vec![ + CodeMirrorDocBlockTransaction::Update(CodeMirrorDocBlockUpdate { + from: 0, + from_new: None, + to: None, + indent: None, + delimiter: None, + contents: vec![StringDiff { + from: 0, + to: Some(7,), + insert: "

more

".to_string(), + },], + }), + CodeMirrorDocBlockTransaction::Add(CodeMirrorDocBlock { + from: 6, + to: 7, + indent: "".to_string(), + delimiter: "#".to_string(), + contents: "

most".to_string(), + },), + ], version: 0.0, }), version: 1.0, @@ -996,7 +1013,7 @@ async fn test_vscode_ide_websocket4() { to: 1, indent: "".to_string(), delimiter: "#".to_string(), - contents: "

test.py

\n".to_string() + contents: "

test.py".to_string() }], }), version: cast!(&msg.message, EditorMessageContents::Update) diff --git a/server/src/processing.rs b/server/src/processing.rs index dcb2ecc9..858b3fe3 100644 --- a/server/src/processing.rs +++ b/server/src/processing.rs @@ -24,6 +24,7 @@ use std::{ borrow::Cow, cell::RefCell, cmp::{max, min}, + collections::HashSet, ffi::OsStr, io, iter::Map, @@ -31,6 +32,8 @@ use std::{ path::{Path, PathBuf}, rc::Rc, slice::Iter, + string::FromUtf8Error, + sync::LazyLock, }; // ### Third-party @@ -54,6 +57,7 @@ use html5ever::{ use imara_diff::{Algorithm, Diff, Hunk, InternedInput, TokenSource}; use lazy_static::lazy_static; use markup5ever_rcdom::{Node, NodeData, RcDom, SerializableHandle}; +use minify_html; use phf::phf_map; use pulldown_cmark::{Options, Parser, html}; use regex::Regex; @@ -296,7 +300,7 @@ const DOC_BLOCK_SEPARATOR_STRING: &str = concat!( // apart. Since this is post hydration, the element names are normalized to // lower case. const DOC_BLOCK_SEPARATOR_SPLIT_STRING: &str = - "\n"; + ""; // Correctly terminated fenced code blocks produce this, which can be removed // from the HTML produced by Markdown conversion. const DOC_BLOCK_SEPARATOR_REMOVE_FENCE: &str = r#" @@ -420,15 +424,14 @@ pub fn codechat_for_web_to_source( ) -> Result { let lexer_name = &codechat_for_web.metadata.mode; // Given the mode, find the lexer. - let lexer: &std::sync::Arc = - match LEXERS.map_mode_to_lexer.get(lexer_name) { - Some(v) => v, - None => { - return Err(CodechatForWebToSourceError::InvalidLexer( - lexer_name.clone(), - )); - } - }; + let lexer = match LEXERS.map_mode_to_lexer.get(lexer_name) { + Some(v) => v, + None => { + return Err(CodechatForWebToSourceError::InvalidLexer( + lexer_name.clone(), + )); + } + }; // Extract the plain (not diffed) CodeMirror contents. let CodeMirrorDiffable::Plain(ref code_mirror) = codechat_for_web.source else { @@ -443,14 +446,14 @@ pub fn codechat_for_web_to_source( } // Translate the HTML document to Markdown. let converter = HtmlToMarkdownWrapped::new(); - let tree = html_to_tree(&code_mirror.doc)?; + let tree = html_to_tree(&code_mirror.doc, &None)?; dehydrating_walk_node(&tree); return converter .convert(&tree) .map_err(CodechatForWebToSourceError::HtmlToMarkdownFailed); } let code_doc_block_vec_html = code_mirror_to_code_doc_blocks(code_mirror); - let code_doc_block_vec = doc_block_html_to_markdown(code_doc_block_vec_html) + let code_doc_block_vec = doc_block_html_to_markdown(code_doc_block_vec_html, &None) .map_err(CodechatForWebToSourceError::HtmlToMarkdownFailed)?; code_doc_block_vec_to_source(&code_doc_block_vec, lexer) .map_err(CodechatForWebToSourceError::CannotTranslateCodeChat) @@ -458,7 +461,7 @@ pub fn codechat_for_web_to_source( /// Return the byte index of `s[utf_16_index]`, where the indexing operation is /// in UTF-16 code units. -fn byte_index_of(s: &str, utf_16_index: usize) -> usize { +pub fn byte_index_of(s: &str, utf_16_index: usize) -> usize { let mut byte_index = 0; let mut current_index = 0; for c in s.chars() { @@ -577,7 +580,7 @@ impl HtmlToMarkdownWrapped { // ignored (by an // [ignoreFileDirective](https://dprint.dev/plugins/markdown/config/)). // Simply return the unchanged text in this case. - .unwrap_or_else(|| converted.to_string()), + .unwrap_or(converted), ) } @@ -585,11 +588,7 @@ impl HtmlToMarkdownWrapped { let converted = self.html_to_markdown.finalize_conversion(); Ok( format_text(&converted, &self.word_wrap_config, |_, _, _| Ok(None))? - // A return value of `None` means the text was unchanged or - // ignored (by an - // [ignoreFileDirective](https://dprint.dev/plugins/markdown/config/)). - // Simply return the unchanged text in this case. - .unwrap_or_else(|| converted.to_string()), + .unwrap_or(converted), ) } @@ -602,26 +601,45 @@ impl HtmlToMarkdownWrapped { } // Transform HTML in doc blocks to Markdown. -fn doc_block_html_to_markdown( +pub fn doc_block_html_to_markdown( mut code_doc_block_vec: Vec, + // If provided, the index of each successive node in the DOM, ending with + // the offset in UTF-16 characters within the last node (which must be a + // text node) at which a marker character will be inserted. + // + // For this reason, when provided, this function must called with a vec + // containing only one doc block. + dom_location: &Option<(Vec, usize)>, ) -> Result, HtmlToMarkdownWrappedError> { let mut converter = HtmlToMarkdownWrapped::new(); - for code_doc_block in &mut code_doc_block_vec { + let mut last_doc_block_index = None; + // Only perform marker insertions to a length 1 vec. + assert!(dom_location.is_none() || code_doc_block_vec.len() == 1); + for (index, code_doc_block) in &mut code_doc_block_vec.iter_mut().enumerate() { if let CodeDocBlock::DocBlock(doc_block) = code_doc_block { - let tree = html_to_tree(&doc_block.contents)?; + last_doc_block_index = Some(index); + let tree = html_to_tree(&doc_block.contents, dom_location)?; dehydrating_walk_node(&tree); + // Calculate the total delimiter width: the delimiter width plus the + // extra space after it. Special case: an empty delimiter means + // we're wrapping a Markdown document to insert a marker, so don't + // add the extra space. + let delimiter_width = doc_block.delimiter.chars().count(); + let total_delimiter_width = if delimiter_width > 0 { + delimiter_width + 1 + } else { + 0 + }; // Compute a line wrap width based on the current indent. Set a // minimum of half the line wrap width, to prevent ridiculous // wrapping with large indents. converter.set_line_width(max( WORD_WRAP_MIN_WIDTH, - // The +1 factor is for the space separating the delimiter and - // the comment text. Use `min` to avoid overflow with unsigned - // subtraction. + // Use `min` to avoid overflow with unsigned subtraction. WORD_WRAP_COLUMN - min( - doc_block.delimiter.chars().count() + 1 + doc_block.indent.chars().count(), + total_delimiter_width + doc_block.indent.chars().count(), WORD_WRAP_COLUMN, ), )); @@ -629,12 +647,15 @@ fn doc_block_html_to_markdown( } } - // Output the finalized conversion. - if let Some(code_doc_block) = code_doc_block_vec.last_mut() - && let CodeDocBlock::DocBlock(doc_block) = code_doc_block - { + // Append the finalized conversion to the last doc block. + if let Some(last_doc_block_index) = last_doc_block_index { + let CodeDocBlock::DocBlock(ref mut last_doc_block) = + code_doc_block_vec[last_doc_block_index] + else { + unreachable!(); + }; let last = converter.last()?; - doc_block.contents.push_str(&last); + last_doc_block.contents.push_str(&last); } Ok(code_doc_block_vec) @@ -802,6 +823,8 @@ pub enum SourceToCodeChatForWebError { // convert the IO error to a string. #[error("unable to parse HTML {0}")] ParseFailed(String), + #[error("encoding error {0}")] + EncodeFailed(#[from] FromUtf8Error), } // Transform from source code to `CodeChatForWeb` @@ -855,6 +878,7 @@ pub fn source_to_codechat_for_web( let dry_html = markdown_to_html(file_contents); let html = hydrate_html(&dry_html) .map_err(|e| SourceToCodeChatForWebError::ParseFailed(e.to_string()))?; + let html = minify(&html)?; CodeMirrorDiffable::Plain(CodeMirror { doc: html, doc_blocks: vec![], @@ -910,6 +934,7 @@ pub fn source_to_codechat_for_web( // 3. Hydrate the cleaned HTML. let html = hydrate_html(&html) .map_err(|e| SourceToCodeChatForWebError::ParseFailed(e.to_string()))?; + let html = minify(&html)?; // 4. Split on the separator. let mut doc_block_contents_iter = html.split(DOC_BLOCK_SEPARATOR_SPLIT_STRING); // @@ -951,6 +976,27 @@ pub fn source_to_codechat_for_web( Ok(TranslationResults::CodeChat(codechat_for_web)) } +// Options for a spec-compliant minifier. +static MINIFY_OPTIONS: LazyLock = LazyLock::new(|| { + let mut cfg = minify_html::Cfg::new(); + cfg.allow_noncompliant_unquoted_attribute_values = false; + cfg.allow_optimal_entities = false; + cfg.allow_removing_spaces_between_attributes = false; + cfg.keep_comments = true; + cfg.keep_html_and_head_opening_tags = true; + cfg.minify_doctype = false; + let mut override_whitespace: HashSet> = HashSet::new(); + override_whitespace.insert(b"wc-mermaid".to_vec()); + override_whitespace.insert(b"graphviz-graph".to_vec()); + cfg.override_whitespace = override_whitespace; + cfg +}); + +/// A spec-compliant minifier. +pub fn minify(html: &str) -> Result { + String::from_utf8(minify_html::minify(html.as_bytes(), &MINIFY_OPTIONS)) +} + // Compute the length of the provided string in UTF16 characters. fn len_utf16(s: &str) -> usize { s.chars().map(|c| c.len_utf16()).sum() @@ -1033,8 +1079,17 @@ fn markdown_to_html(markdown: &str) -> String { html_output } -// Use html5ever to parse a string containing HTML to a DOM tree. -fn html_to_tree(html: &str) -> io::Result> { +// Mark the current cursor position with a +// [private use area code point](https://en.wikipedia.org/wiki/Private_Use_Areas), +// something that's unlike to appear in source code. +pub const UNICODE_CURSOR_MARKER: char = '\u{E83B}'; + +/// Use html5ever to parse a string containing HTML to a DOM tree. +fn html_to_tree( + html: &str, + // See the same parameter from `doc_block_html_to_markdown`. + dom_location: &Option<(Vec, usize)>, +) -> io::Result> { let dom = parse_document( RcDom::default(), ParseOpts { @@ -1048,21 +1103,46 @@ fn html_to_tree(html: &str) -> io::Result> { .from_utf8() .read_from(&mut html.as_bytes())?; - // TODO: should we report parse errors? If so, how and where? - /*** - if let Some(err) = dom.errors.borrow().first() { - //return Err(io::Error::other(err.to_string())); - } - */ + if let Some((dom_path, dom_offset)) = dom_location { + // Each element in `dom_offsets` is the index of a node in the `dom`. + // Take the first index, then descend into the indicated node. Repeat + // this process until the last node, which should be a text node. The + // last index is the UTF-16 offset with the text contents to insert a + // `UNICODE_CURSOR_MARKER` character. Any failures (index exceeds number + // of nodes, etc.) use an approximation where possible. + let mut current_node = get_dom_body(&dom.document); + 'outer: for &offset in dom_path { + let next_node = { + let children = current_node.children.borrow(); + if offset < children.len() { + children[offset].clone() + } else if let Some(last) = children.last() { + last.clone() + } else { + break 'outer; + } + }; + current_node = next_node; + } + // Insert the cursor marker at the given character offset within the + // text node. + if let NodeData::Text { contents } = ¤t_node.data { + let mut text = contents.borrow().to_string(); + // Convert the character offset into a byte offset. + let byte_offset = byte_index_of(&text, *dom_offset); + text.insert(byte_offset, UNICODE_CURSOR_MARKER); + *contents.borrow_mut() = text.into(); + } + } Ok(dom.document) } // A framework to transform HTML by parsing it to a DOM tree, walking the tree, // then serializing the tree back to an HTML string. -pub fn transform_html)>(html: &str, transform: T) -> io::Result { - let tree = html_to_tree(html)?; - transform(tree.clone()); +pub fn transform_html)>(html: &str, transform: T) -> io::Result { + let tree = html_to_tree(html, &None)?; + transform(&tree); // Serialize the transformed DOM back to a string. let so = SerializeOpts { @@ -1071,6 +1151,18 @@ pub fn transform_html)>(html: &str, transform: T) -> io::Resu ..Default::default() }; let mut bytes = vec![]; + serialize( + &mut bytes, + &SerializableHandle::from(get_dom_body(&tree)), + so, + )?; + let html_out = String::from_utf8(bytes).map_err(io::Error::other)?; + + Ok(html_out) +} + +/// Get the body element from a top-level DOM. +fn get_dom_body(document: &Rc) -> Rc { // HTML is: // // ```html @@ -1079,11 +1171,7 @@ pub fn transform_html)>(html: &str, transform: T) -> io::Resu // ... <-- element 1 // // ``` - let body = tree.children.borrow()[0].children.borrow()[1].clone(); - serialize(&mut bytes, &SerializableHandle::from(body.clone()), so)?; - let html_out = String::from_utf8(bytes).map_err(io::Error::other)?; - - Ok(html_out) + document.children.borrow()[0].children.borrow()[1].clone() } // HTML produced from Markdown needs additional processing, termed hydration: @@ -1096,7 +1184,7 @@ fn hydrate_html(html: &str) -> io::Result { transform_html(html, hydrating_walk_node) } -fn hydrating_walk_node(node: Rc) { +fn hydrating_walk_node(node: &Rc) { for child in node.children.borrow_mut().iter_mut() { let possible_replacement_child = // Look for a `

` tag
@@ -1144,10 +1232,10 @@ fn hydrating_walk_node(node: Rc) {
 
         // Replace the child if we found a replacement; otherwise, walk it.
         if let Some(replacement_child) = possible_replacement_child {
-            replacement_child.parent.set(Some(Rc::downgrade(&node)));
+            replacement_child.parent.set(Some(Rc::downgrade(node)));
             *child = replacement_child;
         } else {
-            hydrating_walk_node(child.clone());
+            hydrating_walk_node(child);
         }
     }
 }
@@ -1229,53 +1317,129 @@ fn replace_math_node(child: &Rc, is_hydrate: bool) -> Option> {
     }
 }
 
-fn dehydrating_walk_node(node: &Rc) {
-    for child in node.children.borrow_mut().iter_mut() {
-        // Look for a custom element tag
-        let possible_replacement_child = if let Some(child_name) = get_node_tag_name(child)
-        && let Some(language_name) = CUSTOM_ELEMENT_TO_CODE_BLOCK_LANGUAGE.get(child_name)
-            // with no attributes
-            && let NodeData::Element {
-                attrs: ref_attrs, ..
-            } = &child.data
-            && ref_attrs.borrow().is_empty()
-            // and only one Text child
-            && let text_children = &child.children.borrow()
-            && text_children.len() == 1
-            && let Some(text_child) = text_children.iter().next()
-            && let NodeData::Text { .. } = &text_child.data
+pub fn remove_tinymce_data(
+    parent: &Rc,
+    // The index of the node in parent.children.
+    index: usize,
+) -> Option> {
+    let node = parent.children.borrow()[index].clone();
+    // Remove TinyMCE temp attributes produced in the raw format.
+    if let NodeData::Element { name, attrs, .. } = &node.data {
+        // Look for any temporary elements inserted for GUI manipulation.
+        if name.local == *"span"
+            && attrs
+                .borrow()
+                .iter()
+                .any(|attr| attr.name.local == *"class" && attr.value.starts_with("mce"))
         {
-            // Create `
text_child
-            // contents
`. - let pre = Node::new(NodeData::Element { - name: QualName::new(None, Namespace::from(""), LocalName::from("pre")), - attrs: RefCell::new(vec![]), - template_contents: RefCell::new(None), - mathml_annotation_xml_integration_point: false, - }); - let code = Node::new(NodeData::Element { - name: QualName::new(None, Namespace::from(""), LocalName::from("code")), - attrs: RefCell::new(vec![Attribute { - name: QualName::new(None, Namespace::from(""), LocalName::from("class")), - value: (*language_name).into(), - }]), - template_contents: RefCell::new(None), - mathml_annotation_xml_integration_point: false, - }); - code.parent.set(Some(Rc::downgrade(&pre))); - code.children.borrow_mut().push(text_child.clone()); - pre.children.borrow_mut().push(code); - Some(pre) - } else { - replace_math_node(child, false) - }; + // Replace this element with its children. First, update the + // children with the new parent. + let new_parent = node + .parent + .take() + .unwrap_or_else(|| panic!("Must be non-root node, but saw {:#?}.", node.data)); + for child in node.children.borrow_mut().iter_mut() { + child.parent.set(Some(new_parent.clone())); + } - // Replace the child if we found a replacement; otherwise, walk it. - if let Some(replacement_child) = possible_replacement_child { - *child = replacement_child; + // Insert the children in place of the node. + let children: Vec<_> = node.children.borrow().to_vec(); + let no_children = children.is_empty(); + parent.children.borrow_mut().splice(index..=index, children); + // Process the first child which replaced the current node, since it + // hasn't been processed yet, then return it as the updated node. + return if no_children { + None + } else { + // Important: all previous borrows of `parent` must be dropped, + // since this will re-borrow it. + remove_tinymce_data(parent, index) + }; } else { - dehydrating_walk_node(child); + // If we didn't remove this element, then filter out unwanted + // attributes. + attrs.borrow_mut().retain(|attr| { + !(attr.name.local.starts_with("data-mce-") + || (attr.name.local == *"class" && attr.value.starts_with("mce-"))) + }); + } + } + Some(node.clone()) +} + +/// Walk a node, dehydrating it by removing TineMCE temporary attributes, +/// changing math to pulldown-cmark's output, and changing graphviz/Mermaid to +/// fenced code blocks. +fn dehydrating_walk_node(node: &Rc) { + let mut index = 0; + // Avoid a `while` loop, since accessing `node.children` requires a borrow + // held for the body of the loop. + while index < node.children.borrow().len() { + // Remove TinyMCE data from the child at `index`; if the child was + // spliced away (no replacement), the slot is gone; leave \`index\`\` + // unchanged to process what is now at this position. + if remove_tinymce_data(node, index).is_none() { + continue; + } + + // Compute the replacement (if any) inside a block so `borrow_mut` is + // dropped before the recursive walk, which may itself need `borrow_mut` + // via `remove_tinymce_data`. + let child_to_walk = { + let mut children = node.children.borrow_mut(); + if index >= children.len() { + break; + } + let child = &mut children[index]; + let replacement = if let Some(child_name) = get_node_tag_name(child) + && let Some(language_name) = CUSTOM_ELEMENT_TO_CODE_BLOCK_LANGUAGE.get(child_name) + // with no attributes + && let NodeData::Element { + attrs: ref_attrs, .. + } = &child.data + && ref_attrs.borrow().is_empty() + // and only one Text child + && let text_children = &child.children.borrow() + && text_children.len() == 1 + && let Some(text_child) = text_children.iter().next() + && let NodeData::Text { .. } = &text_child.data + { + // Create `
text_child
+                // contents
`. + let pre = Node::new(NodeData::Element { + name: QualName::new(None, Namespace::from(""), LocalName::from("pre")), + attrs: RefCell::new(vec![]), + template_contents: RefCell::new(None), + mathml_annotation_xml_integration_point: false, + }); + let code = Node::new(NodeData::Element { + name: QualName::new(None, Namespace::from(""), LocalName::from("code")), + attrs: RefCell::new(vec![Attribute { + name: QualName::new(None, Namespace::from(""), LocalName::from("class")), + value: (*language_name).into(), + }]), + template_contents: RefCell::new(None), + mathml_annotation_xml_integration_point: false, + }); + code.parent.set(Some(Rc::downgrade(&pre))); + code.children.borrow_mut().push(text_child.clone()); + pre.children.borrow_mut().push(code); + Some(pre) + } else { + replace_math_node(child, false) + }; + if let Some(replacement_child) = replacement { + *child = replacement_child; + None + } else { + Some(children[index].clone()) + } + }; + // `borrow_mut` is now dropped; safe to recurse. + if let Some(child) = child_to_walk { + dehydrating_walk_node(&child); } + index += 1; } } diff --git a/server/src/processing/tests.rs b/server/src/processing/tests.rs index d54f3848..70245d23 100644 --- a/server/src/processing/tests.rs +++ b/server/src/processing/tests.rs @@ -24,7 +24,7 @@ use std::{io, path::PathBuf, rc::Rc, str::FromStr}; // ### Third-party -use indoc::indoc; +use indoc::{formatdoc, indoc}; use markup5ever_rcdom::Node; use predicates::prelude::predicate::str; use pretty_assertions::assert_eq; @@ -42,10 +42,10 @@ use crate::{ processing::{ CodeDocBlockVecToSourceError, CodeMirrorDiffable, CodeMirrorDocBlockDelete, CodeMirrorDocBlockTransaction, CodeMirrorDocBlockUpdate, CodechatForWebToSourceError, - HtmlToMarkdownWrapped, SourceToCodeChatForWebError, byte_index_of, + HtmlToMarkdownWrapped, SourceToCodeChatForWebError, UNICODE_CURSOR_MARKER, byte_index_of, code_doc_block_vec_to_source, code_mirror_to_code_doc_blocks, codechat_for_web_to_source, - dehydrating_walk_node, diff_code_mirror_doc_blocks, diff_str, html_to_tree, hydrate_html, - markdown_to_html, source_to_codechat_for_web, + dehydrating_walk_node, diff_code_mirror_doc_blocks, diff_str, doc_block_html_to_markdown, + html_to_tree, hydrate_html, markdown_to_html, source_to_codechat_for_web, }, }; use test_utils::{cast, prep_test_dir, test_utils::stringit}; @@ -514,7 +514,7 @@ fn test_source_to_codechat_for_web_1() { ), Ok(TranslationResults::CodeChat(build_codechat_for_web( MARKDOWN_MODE, - &format!("

{lexer_spec}markdown

\n"), + &format!("

{lexer_spec}markdown"), vec![] ))) ); @@ -545,7 +545,7 @@ fn test_source_to_codechat_for_web_1() { Ok(TranslationResults::CodeChat(build_codechat_for_web( "javascript", "\n", - vec![build_codemirror_doc_block(0, 1, "", "//", "

Test

\n")] + vec![build_codemirror_doc_block(0, 1, "", "//", "

Test")] ))) ); assert_eq!( @@ -553,13 +553,7 @@ fn test_source_to_codechat_for_web_1() { Ok(TranslationResults::CodeChat(build_codechat_for_web( "javascript", "let a = 1;\n\n", - vec![build_codemirror_doc_block( - 11, - 12, - "", - "//", - "

Test

\n" - )] + vec![build_codemirror_doc_block(11, 12, "", "//", "

Test")] ))) ); assert_eq!( @@ -567,7 +561,7 @@ fn test_source_to_codechat_for_web_1() { Ok(TranslationResults::CodeChat(build_codechat_for_web( "javascript", "\nlet a = 1;", - vec![build_codemirror_doc_block(0, 1, "", "//", "

Test

\n")] + vec![build_codemirror_doc_block(0, 1, "", "//", "

Test")] ))) ); @@ -585,13 +579,7 @@ fn test_source_to_codechat_for_web_1() { "javascript", "\nlet a = 1;\n\n", vec![ - build_codemirror_doc_block( - 0, - 1, - "", - "//", - "

Link

\n" - ), + build_codemirror_doc_block(0, 1, "", "//", "

Link

"), build_codemirror_doc_block(12, 13, "", "/*", "") ] ))) @@ -620,7 +608,7 @@ fn test_source_to_codechat_for_web_1() { "cpp", "\n\n\n\n", vec![ - build_codemirror_doc_block(0, 1, "", "//", "
\n
\n"), + build_codemirror_doc_block(0, 1, "", "//", "
\n
"), build_codemirror_doc_block(2, 3, "", "//", ""), build_codemirror_doc_block(4, 5, "", "//", "") ] @@ -662,13 +650,7 @@ fn test_source_to_codechat_for_web_1() { Ok(TranslationResults::CodeChat(build_codechat_for_web( "cpp", "\n;", - vec![build_codemirror_doc_block( - 0, - 1, - "", - "//", - "

σ😄👉🏿👨‍👦🇺🇳

\n" - ),] + vec![build_codemirror_doc_block(0, 1, "", "//", "

σ😄👉🏿👨‍👦🇺🇳"),] ))) ); @@ -691,9 +673,9 @@ fn test_source_to_codechat_for_web_1() { 2, "", "/*", - "

\n\n
\n" + "
\n\n
" ), - build_codemirror_doc_block(2, 3, "", "//", "

Test

\n"), + build_codemirror_doc_block(2, 3, "", "//", "

Test"), ] ))) ); @@ -715,9 +697,9 @@ fn test_source_to_codechat_for_web_1() { 2, "", "/*", - "

\n\n
\n" + "
\n\n
" ), - build_codemirror_doc_block(2, 3, "", "//", "

Test

\n"), + build_codemirror_doc_block(2, 3, "", "//", "

Test"), ] ))) ); @@ -728,8 +710,8 @@ fn test_source_to_codechat_for_web_1() { "cpp", "\n\n", vec![ - build_codemirror_doc_block(0, 1, "", "//", "

\n
\n"), - build_codemirror_doc_block(1, 2, " ", "//", "
\n"), + build_codemirror_doc_block(0, 1, "", "//", "
\n
"), + build_codemirror_doc_block(1, 2, " ", "//", "
"), ] ))) ); @@ -741,8 +723,8 @@ fn test_source_to_codechat_for_web_1() { "cpp", "\n\n", vec![ - build_codemirror_doc_block(0, 1, "", "//", "\n"), - build_codemirror_doc_block(1, 2, " ", "//", "

Test

\n
"), + build_codemirror_doc_block(0, 1, "", "//", " "), + build_codemirror_doc_block(1, 2, " ", "//", "

Test

"), ] ))) ); @@ -762,7 +744,7 @@ fn test_source_to_codechat_for_web_1() { "\n\n", vec![ build_codemirror_doc_block(0, 1, "", "//", "
\n"),
-                build_codemirror_doc_block(1, 2, " ", "//", "

Test

\n
"), + build_codemirror_doc_block(1, 2, " ", "//", "\n

Test

\n
"), ] ))) ); @@ -1244,6 +1226,32 @@ fn test_diff_2() { ); } +#[test] +fn test_doc_block_html_to_markdown_1() { + assert_eq!( + doc_block_html_to_markdown( + vec![build_doc_block( + "", + "", + "

Index 0

Index 1.0Index 1.1012345

" + )], + &Some((vec![1, 2], 3)), + ) + .unwrap(), + vec![build_doc_block( + "", + "", + &formatdoc!( + " + Index 0 + + Index 1.0**Index 1.1**012{UNICODE_CURSOR_MARKER}345 + " + ) + )] + ); +} + #[test] fn test_hydrate_html_1() { // These tests check the translation from Markdown to "wet" HTML (what the user provides) instead of dry -> wet HTML. @@ -1326,7 +1334,7 @@ fn test_hydrate_html_1() { } fn dehydrate_html(html: &str) -> io::Result> { - let tree = html_to_tree(html)?; + let tree = html_to_tree(html, &None)?; dehydrating_walk_node(&tree); //println!("{:#?}", tree); Ok(tree) diff --git a/server/src/translation.rs b/server/src/translation.rs index 5bbf5908..e87cf978 100644 --- a/server/src/translation.rs +++ b/server/src/translation.rs @@ -206,8 +206,9 @@ // ------- // // ### Standard library -use std::{collections::HashMap, ffi::OsStr, fmt::Debug, path::PathBuf}; +use std::{collections::HashMap, ffi::OsStr, fmt::Debug, path::PathBuf, rc::Rc}; +use htmd::Node; // ### Third-party use lazy_static::lazy_static; use log::{debug, error, warn}; @@ -221,20 +222,21 @@ use tokio::{ // ### Local use crate::{ - lexer::supported_languages::MARKDOWN_MODE, + lexer::{CodeDocBlock, DocBlock, supported_languages::MARKDOWN_MODE}, processing::{ CodeChatForWeb, CodeMirror, CodeMirrorDiff, CodeMirrorDiffable, CodeMirrorDocBlock, - CodeMirrorDocBlockVec, SourceFileMetadata, TranslationResultsString, - codechat_for_web_to_source, diff_code_mirror_doc_blocks, diff_str, - source_to_codechat_for_web_string, transform_html, + CodeMirrorDocBlockVec, SourceFileMetadata, TranslationResultsString, UNICODE_CURSOR_MARKER, + byte_index_of, codechat_for_web_to_source, diff_code_mirror_doc_blocks, diff_str, + doc_block_html_to_markdown, minify, remove_tinymce_data, source_to_codechat_for_web_string, + transform_html, }, queue_send, queue_send_func, webserver::{ - EditorMessage, EditorMessageContents, INITIAL_MESSAGE_ID, MESSAGE_ID_INCREMENT, - ProcessingTaskHttpRequest, ProcessingTaskHttpRequestFlags, ResultErrTypes, ResultOkTypes, - SimpleHttpResponse, SimpleHttpResponseError, UpdateMessageContents, WebAppState, - WebsocketQueues, file_to_response, path_to_url, send_response, try_canonicalize, - try_read_as_text, url_to_path, + CursorPosition, EditorMessage, EditorMessageContents, INITIAL_MESSAGE_ID, + MESSAGE_ID_INCREMENT, ProcessingTaskHttpRequest, ProcessingTaskHttpRequestFlags, + ResultErrTypes, ResultOkTypes, SimpleHttpResponse, SimpleHttpResponseError, + UpdateMessageContents, WebAppState, WebsocketQueues, file_to_response, path_to_url, + send_response, try_canonicalize, try_read_as_text, url_to_path, }, }; @@ -1054,8 +1056,7 @@ impl TranslationTask { let mut cfw_version = cfw.version; // Translate back to the Client to see if there are - // any changes after this conversion. Only check - // CodeChat documents, not Markdown docs. + // any changes after this conversion. if let Ok(ccfws) = source_to_codechat_for_web_string( &new_source_code, &clean_file_path, @@ -1100,7 +1101,7 @@ impl TranslationTask { )) || (!is_markdown_mode && (code_mirror_translated.doc != self.code_mirror_doc - || !doc_block_compare( + || !doc_blocks_compare( &code_mirror_translated.doc_blocks, self.code_mirror_doc_blocks.as_ref().unwrap(), ))) @@ -1181,12 +1182,115 @@ impl TranslationTask { } }, }; + + // Translate the cursor position from `DomLocation` (the + // Client's DOM-based coordinate) to `Line` (the IDE's + // line-number coordinate) before forwarding to the IDE, which + // only understands line numbers. + let cursor_position = if let Some(CursorPosition::DomLocation { + from, + dom_path, + dom_offset, + }) = update_message_contents.cursor_position + { + // Use a closure to allow early returns on error (returning + // `None` so the IDE receives no cursor position). + (|| { + // Detect Markdown mode: Markdown documents store all + // HTML in `code_mirror_doc` with an empty doc-blocks + // list; CodeChat documents have non-empty doc blocks. + // We can't rely on the lexer name in + // `CodeChatForWeb::SourceFileMetaData`, since the + // message `contents` may be None. This won't confuse a + // CodeChat document with no doc blocks, since the + // Client won't send a `DomLocation` in this case. + let is_markdown = self + .code_mirror_doc_blocks + .as_ref() + .is_none_or(|v| v.is_empty()); + + // 1. Find the HTML (for a Markdown document) or the doc + // block the cursor is in. Create a temporary + // one-element `Vec` from this + // containing only the relevant doc block. + let (preceding_newlines, doc_block) = if is_markdown { + // 1. For Markdown, there are zero preceding + // newlines and the relevant HTML is in + // `self.code_mirror_doc`. + ( + 0, + DocBlock { + indent: String::new(), + delimiter: String::new(), + contents: self.code_mirror_doc.clone(), + lines: 0, + }, + ) + } else { + // 1. Locate the relevant doc block, identified by + // its starting offset matching `from`. If not + // found, abort and return `None`. + let blocks = self.code_mirror_doc_blocks.as_ref().unwrap(); + let block = blocks.iter().find(|b| b.from == from)?; + + // 2. Count all newlines in `self.code_mirror_doc` + // which precede `from`. `from` is in UTF-16 code + // units; convert to a byte index first. + let byte_idx = byte_index_of(&self.code_mirror_doc, from); + let preceding_newlines = self.code_mirror_doc[..byte_idx] + .chars() + .filter(|&c| c == '\n') + .count(); + + ( + preceding_newlines, + DocBlock { + indent: block.indent.clone(), + delimiter: block.delimiter.clone(), + contents: block.contents.clone(), + lines: 0, + }, + ) + }; + + // 2. Insert a `UNICODE_CURSOR_MARKER` at the cursor + // location specified by `dom_offsets`, then convert + // the HTML to Markdown. + let translated = doc_block_html_to_markdown( + vec![CodeDocBlock::DocBlock(doc_block)], + &Some((dom_path, dom_offset)), + ) + .ok()?; + let CodeDocBlock::DocBlock(db) = &translated[0] else { + return None; + }; + + // 3. Count newlines before the marker and add them to + // the preceding-newlines total for the final line + // number. If the marker is absent, treat its + // position as 0 (contributing zero newlines), even + // if an existing marker precedes the inserted one. + let marker_byte = db.contents.find(UNICODE_CURSOR_MARKER).unwrap_or(0); + let newlines_before_marker = db.contents[..marker_byte] + .chars() + .filter(|&c| c == '\n') + .count(); + + // CodeMirror uses 1-based line numbers. + Some(CursorPosition::Line( + (preceding_newlines + newlines_before_marker + 1) as u32, + )) + })() + } else { + update_message_contents.cursor_position + }; + debug!("Sending update id = {}", client_message.id); queue_send_func!(self.to_ide_tx.send(EditorMessage { id: client_message.id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: clean_file_path.to_str().expect("Since the path started as a string, assume it losslessly translates back to a string.").to_string(), - cursor_position: update_message_contents.cursor_position, + cursor_position, scroll_position: update_message_contents.scroll_position, is_re_translation: false, contents: codechat_for_web, @@ -1211,6 +1315,18 @@ fn eol_convert(s: String, eol_type: &EolType) -> String { } } +fn compare_html_walker(node: &Rc) { + let mut index = 0; + while index < node.children.borrow().len() { + if let Some(child) = remove_tinymce_data(node, index) { + compare_html_walker(&child); + index += 1; + } + // If remove\_tinymce\_data returned None, the node was removed with no + // replacement; the next child is now at the same index. + } +} + // TinyMCE replaces newlines inside paragraphs with a space and (I think) avoids // surrogate pairs by breaking them into a series of UTF-16 characters. // Therefore, to compare HTML, normalize HTML touched by TinyMCE first. @@ -1221,35 +1337,31 @@ fn compare_html( // processing by TinyMCE. raw_html: &str, ) -> bool { - // The normalized HTML is word-wrapped, while the raw HTML is not. Use this - // to ignore the differences between newlines and spaces, in order to ignore - // these differences. - fn map_newlines_to_spaces<'a>( - s: &'a str, - ) -> std::iter::Map, impl FnMut(char) -> char> { - s.trim() - .chars() - .map(|c: char| if c == '\n' { ' ' } else { c }) - } - - // Normalized `
` elements are followed by a newline; raw `
` elements - // aren't. Remove the newline. - let fixed_normalized_html = normalized_html.replace("
\n", "
"); + // Remove TinyMCE temp data before comparison; this also normalizes the + // characters via html5ever. Order here in very important: the + // `source_to_codechat_for_web()` function transforms, then minifies, since + // both transform and minify tend to rearrange attributes in their own + // preferred order. Use the same order to make comparisons work. + if let Ok(raw_html) = transform_html(raw_html, compare_html_walker) + && let Ok(raw_html) = minify(&raw_html) + { + // pulldown-cmark puts a newline after a `
`, which `minify` + // doesn't remove but TinyMCE does. + let normalized_html = normalized_html.replace("
", "
"); + // TinyMCE wraps an `

`, which minifies to `

Previous paragraph

`. The IDE doesn't wrap the ``, which minifies to `

Previous paragraph

`. Fix up this difference. + let raw_html = raw_html.replace("

".to_string(), + }]; + let client = vec![CodeMirrorDocBlock { + from: 0, + to: 20, + indent: "".to_string(), + delimiter: "//".to_string(), + contents: "

  • Task list

Line
break

Non-breaking  space.

".to_string(), + }]; + assert!(doc_blocks_compare(&ide, &client)); + } + + #[test] + fn test_x2() { + let ide = vec![CodeMirrorDocBlock { from: 0, to: 20, indent: "".to_string(), delimiter: "//".to_string(), - contents: "

Copyright (C) 2025 Bryan A. Jones.

\n

This file is part of the CodeChat Editor. The CodeChat Editor is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

\n

The CodeChat Editor is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

\n

You should have received a copy of the GNU General Public License along with the CodeChat Editor. If not, see http://www.gnu.org/licenses.

\n

debug_enable.mts -- Configure debug features

\n

True to enable additional debug logging.

".to_string(), + contents: "
    1. 1
".to_string(), }]; - let after = vec![CodeMirrorDocBlock { + let client = vec![CodeMirrorDocBlock { from: 0, to: 20, indent: "".to_string(), delimiter: "//".to_string(), - contents: "

Copyright (C) 2025 Bryan A. Jones.

\n

This file is part of the CodeChat Editor. The CodeChat Editor is free\nsoftware: you can redistribute it and/or modify it under the terms of the GNU\nGeneral Public License as published by the Free Software Foundation, either\nversion 3 of the License, or (at your option) any later version.

\n

The CodeChat Editor is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\nFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more\ndetails.

\n

You should have received a copy of the GNU General Public License along with\nthe CodeChat Editor. If not, see\nhttp://www.gnu.org/licenses.

\n

debug_enable.mts -- Configure debug features

\n

True to enable additional debug logging.

\n".to_string(), + contents: "
    1. 1
".to_string(), }]; - assert!(doc_block_compare(&before, &after)); + assert!(doc_blocks_compare(&ide, &client)); } } diff --git a/server/src/webserver.rs b/server/src/webserver.rs index b4fb389e..59df0f54 100644 --- a/server/src/webserver.rs +++ b/server/src/webserver.rs @@ -343,10 +343,10 @@ pub struct UpdateMessageContents { /// transition times when the IDE and Client have different files loaded, /// guaranteeing to updates are still applied to the correct file. pub file_path: String, - /// The line in the file where the cursor is located. TODO: Selections are - /// not yet supported. + /// The line in the file where the cursor is located or the DOM location of + /// the cursor. TODO: Selections are not yet supported. #[serde(skip_serializing_if = "Option::is_none")] - pub cursor_position: Option, + pub cursor_position: Option, /// The line at the top of the screen. #[serde(skip_serializing_if = "Option::is_none")] pub scroll_position: Option, @@ -360,6 +360,30 @@ pub struct UpdateMessageContents { pub contents: Option, } +/// Store the location of the cursor (the selection, assuming it's a zero-length +/// selection, i.e. a standard cursor). +#[derive(Debug, Serialize, Deserialize, PartialEq, TS)] +#[ts(export)] +pub enum CursorPosition { + /// The line the cursor is on. + Line(u32), + /// The exact location of the cursor in the HTML DOM. Only the Client and + /// the Server may use this in messages to each other. The IDE will not + /// receive a message with this variant and must not generate a message with + /// this variant. + DomLocation { + /// The `from` location (character offset) of the doc block the cursor + /// is in. + from: usize, + /// The index of each successive node in the DOM of the current + /// selection (cursor location). + dom_path: Vec, + /// The offset within the last node (which must be a text node) of the + /// current selection (cursor location). + dom_offset: usize, + }, +} + /// ### Data structures used by the webserver /// /// Define the [state](https://actix.rs/docs/application/#state) available to @@ -1474,7 +1498,7 @@ async fn basic_validator( if let Some(app_state) = &req.app_data::() && let Some(expected_credentials) = app_state.credentials.as_ref() && credentials.user_id() == expected_credentials.username - && credentials.password() == Some(&expected_credentials.password) + && credentials.password() == Some(expected_credentials.password.as_str()) { Ok(req) } else { diff --git a/server/tests/overall_1.rs b/server/tests/overall_1.rs index 317931d6..208601c7 100644 --- a/server/tests/overall_1.rs +++ b/server/tests/overall_1.rs @@ -27,30 +27,19 @@ mod overall_common; // ------- // // ### Standard library -use std::{ - env, - error::Error, - panic::AssertUnwindSafe, - path::{Path, PathBuf}, - time::Duration, -}; +use std::{error::Error, path::PathBuf, time::Duration}; // ### Third-party -use assert_fs::TempDir; use dunce::canonicalize; -use futures::FutureExt; use indoc::indoc; use pretty_assertions::assert_eq; -use thirtyfour::{ - By, ChromiumLikeCapabilities, DesiredCapabilities, Key, WebDriver, error::WebDriverError, - start_webdriver_process, -}; +use thirtyfour::{By, Key, WebDriver, error::WebDriverError}; use tokio::time::sleep; // ### Local use crate::overall_common::{ - ExpectedMessages, TIMEOUT, assert_no_more_messages, get_version, goto_line, perform_loadfile, - select_codechat_iframe, + ExpectedMessages, TIMEOUT, assert_no_more_messages, get_version, goto_line, optional_message, + perform_loadfile, select_codechat_iframe, }; use code_chat_editor::{ ide::CodeChatEditorServer, @@ -59,8 +48,8 @@ use code_chat_editor::{ CodeChatForWeb, CodeMirrorDiff, CodeMirrorDiffable, SourceFileMetadata, StringDiff, }, webserver::{ - EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, MESSAGE_ID_INCREMENT, - ResultOkTypes, UpdateMessageContents, set_root_path, + CursorPosition, EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, + MESSAGE_ID_INCREMENT, ResultOkTypes, UpdateMessageContents, }, }; use test_utils::{cast, prep_test_dir}; @@ -79,8 +68,8 @@ make_test!(test_server, test_server_core); #[allow(deprecated)] async fn test_server_core( codechat_server: CodeChatEditorServer, - driver_ref: &WebDriver, - test_dir: &Path, + driver: WebDriver, + test_dir: PathBuf, ) -> Result<(), WebDriverError> { let mut expected_messages = ExpectedMessages::new(); let path = canonicalize(test_dir.join("test.py")).unwrap(); @@ -88,7 +77,7 @@ async fn test_server_core( let mut version = 1.0; let mut server_id = perform_loadfile( &codechat_server, - test_dir, + &test_dir, "test.py", Some(("# Test\ncode()".to_string(), version)), true, @@ -101,15 +90,15 @@ async fn test_server_core( // #### Doc block tests // // Verify the first doc block. - let codechat_iframe = select_codechat_iframe(driver_ref).await; + let codechat_iframe = select_codechat_iframe(&driver).await; let indent_css = ".CodeChat-CodeMirror .CodeChat-doc-indent"; - let doc_block_indent = driver_ref.find(By::Css(indent_css)).await.unwrap(); + let doc_block_indent = driver.find(By::Css(indent_css)).await.unwrap(); assert_eq!(doc_block_indent.inner_html().await.unwrap(), ""); let contents_css = ".CodeChat-CodeMirror .CodeChat-doc-contents"; - let doc_block_contents = driver_ref.find(By::Css(contents_css)).await.unwrap(); + let doc_block_contents = driver.find(By::Css(contents_css)).await.unwrap(); assert_eq!( doc_block_contents.inner_html().await.unwrap(), - "

Test

\n" + "

Test

" ); // Focus it. @@ -123,7 +112,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: None, @@ -134,7 +123,7 @@ async fn test_server_core( client_id += MESSAGE_ID_INCREMENT; // Refind it, since it's now switched with a TinyMCE editor. - let tinymce_contents = driver_ref.find(By::Id("TinyMCE-inst")).await.unwrap(); + let tinymce_contents = driver.find(By::Id("TinyMCE-inst")).await.unwrap(); // Make an edit. tinymce_contents.send_keys("foo").await.unwrap(); @@ -150,7 +139,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -161,7 +150,7 @@ async fn test_server_core( doc: vec![StringDiff { from: 0, to: Some(7), - insert: "# Testfoo\n".to_string() + insert: "# Tesfoot\n".to_string() }], doc_blocks: vec![], version, @@ -186,7 +175,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -197,7 +186,7 @@ async fn test_server_core( doc: vec![StringDiff { from: 0, to: Some(10), - insert: " # Testfoo\n".to_string(), + insert: " # Tesfoot\n".to_string(), }], doc_blocks: vec![], version, @@ -215,7 +204,7 @@ async fn test_server_core( // // Verify the first line of code. let code_line_css = ".CodeChat-CodeMirror .cm-line"; - let code_line = driver_ref.find(By::Css(code_line_css)).await.unwrap(); + let code_line = driver.find(By::Css(code_line_css)).await.unwrap(); assert_eq!(code_line.inner_html().await.unwrap(), "code()"); // A click will update the current position and focus the code block. @@ -226,7 +215,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(2), + cursor_position: Some(CursorPosition::Line(2)), scroll_position: Some(1.0), is_re_translation: false, contents: None, @@ -247,7 +236,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: None, @@ -269,7 +258,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(2), + cursor_position: Some(CursorPosition::Line(2)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -315,16 +304,32 @@ async fn test_server_core( ); // Verify them. - let doc_block_indent = driver_ref.find(By::Css(indent_css)).await.unwrap(); + let doc_block_indent = driver.find(By::Css(indent_css)).await.unwrap(); assert_eq!(doc_block_indent.inner_html().await.unwrap(), " "); - let doc_block_contents = driver_ref.find(By::Css(contents_css)).await.unwrap(); + let doc_block_contents = driver.find(By::Css(contents_css)).await.unwrap(); assert_eq!( doc_block_contents.inner_html().await.unwrap(), "

Testfood

" ); - let code_line = driver_ref.find(By::Css(code_line_css)).await.unwrap(); + let code_line = driver.find(By::Css(code_line_css)).await.unwrap(); assert_eq!(code_line.inner_html().await.unwrap(), "code()bark"); + assert_eq!( + codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), + EditorMessage { + id: client_id, + message: EditorMessageContents::Update(UpdateMessageContents { + file_path: path_str.clone(), + cursor_position: Some(CursorPosition::Line(1)), + scroll_position: Some(1.0), + is_re_translation: false, + contents: None + }) + } + ); + codechat_server.send_result(client_id, None).await.unwrap(); + client_id += MESSAGE_ID_INCREMENT; + /*x TODO: these tests fail, since the Client sends an unnecessary OutOfSync message. How to test sending a diff to the client? // Perform a second edit and verification, to produce a diff sent to the // Client. @@ -345,21 +350,21 @@ async fn test_server_core( message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)) } ); - let doc_block_indent = driver_ref.find(By::Css(indent_css)).await.unwrap(); + let doc_block_indent = driver.find(By::Css(indent_css)).await.unwrap(); assert_eq!(doc_block_indent.inner_html().await.unwrap(), " "); - let doc_block_contents = driver_ref.find(By::Css(contents_css)).await.unwrap(); + let doc_block_contents = driver.find(By::Css(contents_css)).await.unwrap(); assert_eq!( doc_block_contents.inner_html().await.unwrap(), "

food

" ); - let code_line = driver_ref.find(By::Css(code_line_css)).await.unwrap(); + let code_line = driver.find(By::Css(code_line_css)).await.unwrap(); assert_eq!(code_line.inner_html().await.unwrap(), "bark"); */ // ### Document-only tests let toc_path = canonicalize(test_dir.join("toc.md")).unwrap(); server_id = perform_loadfile( &codechat_server, - test_dir, + &test_dir, "test.md", Some(("A **markdown** file.".to_string(), version)), true, @@ -369,7 +374,7 @@ async fn test_server_core( // Check the content. let body_css = "#CodeChat-body .CodeChat-doc-contents"; - let body_content = driver_ref.find(By::Css(body_css)).await.unwrap(); + let body_content = driver.find(By::Css(body_css)).await.unwrap(); assert_eq!( body_content.inner_html().await.unwrap(), "

A markdown file.

" @@ -379,7 +384,19 @@ async fn test_server_core( body_content.send_keys("foo ").await.unwrap(); let md_path = canonicalize(test_dir.join("test.md")).unwrap(); let md_path_str = md_path.to_str().unwrap().to_string(); - let msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); + // Sometimes, a cursor update gets sent before the edit. + let msg = optional_message( + &codechat_server, + &mut client_id, + EditorMessageContents::Update(UpdateMessageContents { + file_path: md_path_str.clone(), + cursor_position: Some(CursorPosition::Line(1)), + scroll_position: None, + is_re_translation: false, + contents: None, + }), + ) + .await; let client_version = get_version(&msg); assert_eq!( msg, @@ -387,7 +404,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: md_path_str.clone(), - cursor_position: None, + cursor_position: Some(CursorPosition::Line(1)), scroll_position: None, is_re_translation: false, contents: Some(CodeChatForWeb { @@ -422,7 +439,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: md_path_str.clone(), - cursor_position: None, + cursor_position: Some(CursorPosition::Line(1)), scroll_position: None, is_re_translation: false, contents: None, @@ -455,6 +472,23 @@ async fn test_server_core( "

food A markdown file.

" ); + // Wait for a cursor update produced by the edit. + assert_eq!( + codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), + EditorMessage { + id: client_id, + message: EditorMessageContents::Update(UpdateMessageContents { + file_path: md_path_str.clone(), + cursor_position: Some(CursorPosition::Line(1)), + scroll_position: None, + is_re_translation: false, + contents: None, + }) + } + ); + codechat_server.send_result(client_id, None).await.unwrap(); + client_id += MESSAGE_ID_INCREMENT; + // ### Unsupported document let txt_path = canonicalize(test_dir.join("test.txt")).unwrap(); let txt_path_str = txt_path.to_str().unwrap().to_string(); @@ -521,10 +555,7 @@ async fn test_server_core( server_id += MESSAGE_ID_INCREMENT; // Look at the content, which should be an iframe. - let plain_content = driver_ref - .find(By::Css("#CodeChat-contents")) - .await - .unwrap(); + let plain_content = driver.find(By::Css("#CodeChat-contents")).await.unwrap(); assert!( plain_content .outer_html() @@ -539,13 +570,9 @@ async fn test_server_core( // #### PDF viewer // // Click on the link for the PDF to test. - let toc_iframe = driver_ref.find(By::Css("#CodeChat-sidebar")).await.unwrap(); - driver_ref - .switch_to() - .frame_element(&toc_iframe) - .await - .unwrap(); - let test_pdf = driver_ref.find(By::LinkText("test.pdf")).await.unwrap(); + let toc_iframe = driver.find(By::Css("#CodeChat-sidebar")).await.unwrap(); + driver.switch_to().frame_element(&toc_iframe).await.unwrap(); + let test_pdf = driver.find(By::LinkText("test.pdf")).await.unwrap(); test_pdf.click().await.unwrap(); // Respond to the current file, then load requests for the PDf and the TOC. @@ -601,15 +628,12 @@ async fn test_server_core( // Check that the PDF viewer was sent. // // Target the iframe containing the Client. - driver_ref + driver .switch_to() .frame_element(&codechat_iframe) .await .unwrap(); - let plain_content = driver_ref - .find(By::Css("#CodeChat-contents")) - .await - .unwrap(); + let plain_content = driver.find(By::Css("#CodeChat-contents")).await.unwrap(); assert!( plain_content .outer_html() @@ -634,25 +658,21 @@ make_test!(test_client, test_client_core); #[allow(deprecated)] async fn test_client_core( codechat_server: CodeChatEditorServer, - driver_ref: &WebDriver, - test_dir: &Path, + driver: WebDriver, + test_dir: PathBuf, ) -> Result<(), WebDriverError> { let mut server_id = - perform_loadfile(&codechat_server, test_dir, "test.py", None, true, 6.0).await; + perform_loadfile(&codechat_server, &test_dir, "test.py", None, true, 6.0).await; let path = canonicalize(test_dir.join("test.py")).unwrap(); let path_str = path.to_str().unwrap().to_string(); // Target the iframe containing the Client. - let codechat_iframe = select_codechat_iframe(driver_ref).await; + let codechat_iframe = select_codechat_iframe(&driver).await; // Click on the link for the PDF to test. - let toc_iframe = driver_ref.find(By::Css("#CodeChat-sidebar")).await.unwrap(); - driver_ref - .switch_to() - .frame_element(&toc_iframe) - .await - .unwrap(); - let test_py = driver_ref.find(By::LinkText("test.py")).await.unwrap(); + let toc_iframe = driver.find(By::Css("#CodeChat-sidebar")).await.unwrap(); + driver.switch_to().frame_element(&toc_iframe).await.unwrap(); + let test_py = driver.find(By::LinkText("test.py")).await.unwrap(); test_py.click().await.unwrap(); // Respond to the current file, then load requests for the PDF and the TOC. @@ -694,15 +714,12 @@ async fn test_client_core( sleep(Duration::from_millis(3000)).await; // Look for the test results. - driver_ref + driver .switch_to() .frame_element(&codechat_iframe) .await .unwrap(); - let mocha_results = driver_ref - .find(By::Css("#mocha-stats .result")) - .await - .unwrap(); + let mocha_results = driver.find(By::Css("#mocha-stats .result")).await.unwrap(); assert_eq!(mocha_results.inner_html().await.unwrap(), "✓"); server_id -= MESSAGE_ID_INCREMENT; @@ -724,8 +741,8 @@ make_test!(test_client_updates, test_client_updates_core); async fn test_client_updates_core( codechat_server: CodeChatEditorServer, - driver_ref: &WebDriver, - test_dir: &Path, + driver: WebDriver, + test_dir: PathBuf, ) -> Result<(), WebDriverError> { let ide_version = 0.0; let orig_text = indoc!( @@ -739,7 +756,7 @@ async fn test_client_updates_core( .to_string(); let mut server_id = perform_loadfile( &codechat_server, - test_dir, + &test_dir, "test.py", Some((orig_text.clone(), ide_version)), true, @@ -751,11 +768,11 @@ async fn test_client_updates_core( let path_str = path.to_str().unwrap().to_string(); // Target the iframe containing the Client. - select_codechat_iframe(driver_ref).await; + select_codechat_iframe(&driver).await; // Select the doc block and add to the line, causing a word wrap. let contents_css = ".CodeChat-CodeMirror .CodeChat-doc-contents"; - let doc_block_contents = driver_ref.find(By::Css(contents_css)).await.unwrap(); + let doc_block_contents = driver.find(By::Css(contents_css)).await.unwrap(); doc_block_contents .send_keys("" + Key::End + " testing") .await @@ -776,7 +793,7 @@ async fn test_client_updates_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: None, @@ -784,6 +801,7 @@ async fn test_client_updates_core( } ); client_id += MESSAGE_ID_INCREMENT; + assert_eq!(client_id, 7.0); msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); } @@ -795,7 +813,7 @@ async fn test_client_updates_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(2)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -818,6 +836,7 @@ async fn test_client_updates_core( ); codechat_server.send_result(client_id, None).await.unwrap(); client_id += MESSAGE_ID_INCREMENT; + assert!(client_id == 10.0 || client_id == 7.0); // The Server sends the Client a wrapped version of the text; the Client // replies with a Result(Ok). @@ -830,13 +849,14 @@ async fn test_client_updates_core( ); server_id += MESSAGE_ID_INCREMENT; - goto_line(&codechat_server, driver_ref, &mut client_id, &path_str, 4) + // After this, ID is 13. + goto_line(&codechat_server, &driver, &mut client_id, &path_str, 4) .await .unwrap(); // Add an indented comment. let code_line_css = ".CodeChat-CodeMirror .cm-line"; - let code_line = driver_ref.find(By::Css(code_line_css)).await.unwrap(); + let code_line = driver.find(By::Css(code_line_css)).await.unwrap(); code_line.send_keys(Key::Home + "# ").await.unwrap(); // This should edit the (new) third line of the file after word wrap: `def // foo():`. @@ -848,7 +868,7 @@ async fn test_client_updates_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(4), + cursor_position: Some(CursorPosition::Line(4)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -870,7 +890,7 @@ async fn test_client_updates_core( } ); codechat_server.send_result(client_id, None).await.unwrap(); - //client_id += MESSAGE_ID_INCREMENT; + client_id += MESSAGE_ID_INCREMENT; // The Server sends the Client a re-translated version of the text with the // new doc block; the Client replies with a Result(Ok). @@ -881,7 +901,23 @@ async fn test_client_updates_core( message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)) } ); - //server_id += MESSAGE_ID_INCREMENT; + + // The Client sends an cursor position update. + assert_eq!( + codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), + EditorMessage { + id: client_id, + message: EditorMessageContents::Update(UpdateMessageContents { + file_path: path_str.clone(), + cursor_position: Some(CursorPosition::Line(4)), + scroll_position: Some(1.0), + is_re_translation: false, + contents: None, + }) + } + ); + codechat_server.send_result(client_id, None).await.unwrap(); + //client_id += MESSAGE_ID_INCREMENT; /*x TODO broken by OutOfSync due to unnecessary save after re-translate. // Send the original text back, to ensure the re-translation correctly updated the Client. @@ -903,7 +939,7 @@ async fn test_client_updates_core( } ); // Trigger a client edit to send the Client contents back. - let code_line = driver_ref.find(By::Css(code_line_css)).await.unwrap(); + let code_line = driver.find(By::Css(code_line_css)).await.unwrap(); code_line.send_keys(" ").await.unwrap(); let msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); @@ -914,7 +950,7 @@ async fn test_client_updates_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(2), + cursor_position: Some(CursorPosition::Line(2)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -936,9 +972,9 @@ async fn test_client_updates_core( } ); codechat_server.send_result(client_id, None).await.unwrap(); - - assert_no_more_messages(&codechat_server).await; */ + assert_no_more_messages(&codechat_server).await; + Ok(()) } diff --git a/server/tests/overall_2.rs b/server/tests/overall_2.rs index 70a3d528..db5cab73 100644 --- a/server/tests/overall_2.rs +++ b/server/tests/overall_2.rs @@ -27,30 +27,18 @@ mod overall_common; // ------- // // ### Standard library -use std::{ - env, - error::Error, - panic::AssertUnwindSafe, - path::{Path, PathBuf}, - time::Duration, -}; +use std::{error::Error, path::PathBuf}; // ### Third-party -use assert_fs::TempDir; use dunce::canonicalize; -use futures::FutureExt; use indoc::indoc; use pretty_assertions::assert_eq; -use thirtyfour::{ - By, ChromiumLikeCapabilities, DesiredCapabilities, WebDriver, error::WebDriverError, - start_webdriver_process, -}; -use tokio::time::sleep; +use thirtyfour::{By, WebDriver, error::WebDriverError}; // ### Local use crate::overall_common::{ - TIMEOUT, assert_no_more_messages, get_empty_client_update, get_version, perform_loadfile, - select_codechat_iframe, + TIMEOUT, assert_no_more_messages, get_empty_client_update, get_version, optional_message, + perform_loadfile, select_codechat_iframe, }; use code_chat_editor::{ ide::CodeChatEditorServer, @@ -58,11 +46,11 @@ use code_chat_editor::{ CodeChatForWeb, CodeMirrorDiff, CodeMirrorDiffable, SourceFileMetadata, StringDiff, }, webserver::{ - EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, MESSAGE_ID_INCREMENT, - ResultOkTypes, UpdateMessageContents, set_root_path, + CursorPosition, EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, + MESSAGE_ID_INCREMENT, ResultOkTypes, UpdateMessageContents, }, }; -use test_utils::{cast, prep_test_dir}; +use test_utils::prep_test_dir; make_test!(test_4, test_4_core); @@ -70,15 +58,15 @@ make_test!(test_4, test_4_core); // ----- async fn test_4_core( codechat_server: CodeChatEditorServer, - driver_ref: &WebDriver, - test_dir: &Path, + driver: WebDriver, + test_dir: PathBuf, ) -> Result<(), WebDriverError> { let path = canonicalize(test_dir.join("test.py")).unwrap(); let path_str = path.to_str().unwrap().to_string(); let ide_version = 0.0; perform_loadfile( &codechat_server, - test_dir, + &test_dir, "test.py", Some(( indoc!( @@ -99,12 +87,12 @@ async fn test_4_core( .await; // Target the iframe containing the Client. - select_codechat_iframe(driver_ref).await; + select_codechat_iframe(&driver).await; // Switch from one doc block to another. It should produce an update with // only cursor/scroll info (no contents). let mut client_id = INITIAL_CLIENT_MESSAGE_ID; - let doc_blocks = driver_ref.find_all(By::Css(".CodeChat-doc")).await.unwrap(); + let doc_blocks = driver.find_all(By::Css(".CodeChat-doc")).await.unwrap(); doc_blocks[0].click().await.unwrap(); assert_eq!( codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), @@ -112,7 +100,7 @@ async fn test_4_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: None, @@ -130,7 +118,7 @@ async fn test_4_core( &mut client_id, &mut client_version, "python", - Some(3), + Some(CursorPosition::Line(3)), Some(1.0), ) .await; @@ -142,7 +130,7 @@ async fn test_4_core( &mut client_id, &mut client_version, "python", - Some(5), + Some(CursorPosition::Line(5)), Some(1.0), ) .await; @@ -157,8 +145,8 @@ make_test!(test_5, test_5_core); // Verify that newlines in Mermaid and Graphviz diagrams aren't removed. async fn test_5_core( codechat_server: CodeChatEditorServer, - driver_ref: &WebDriver, - test_dir: &Path, + driver: WebDriver, + test_dir: PathBuf, ) -> Result<(), WebDriverError> { let path = canonicalize(test_dir.join("test.py")).unwrap(); let path_str = path.to_str().unwrap().to_string(); @@ -180,9 +168,9 @@ async fn test_5_core( " ) .to_string(); - let mut server_id = perform_loadfile( + let _server_id = perform_loadfile( &codechat_server, - test_dir, + &test_dir, "test.py", Some((orig_text.clone(), version)), false, @@ -191,11 +179,11 @@ async fn test_5_core( .await; // Target the iframe containing the Client. - select_codechat_iframe(driver_ref).await; + select_codechat_iframe(&driver).await; // Focus it. let contents_css = ".CodeChat-CodeMirror .CodeChat-doc-contents"; - let doc_block_contents = driver_ref.find(By::Css(contents_css)).await.unwrap(); + let doc_block_contents = driver.find(By::Css(contents_css)).await.unwrap(); doc_block_contents.click().await.unwrap(); // The click produces an updated cursor/scroll location after an autosave // delay. @@ -206,17 +194,19 @@ async fn test_5_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: None, }) } ); + codechat_server.send_result(client_id, None).await.unwrap(); client_id += MESSAGE_ID_INCREMENT; + assert_eq!(client_id, 7.0); // Refind it, since it's now switched with a TinyMCE editor. - let tinymce_contents = driver_ref.find(By::Id("TinyMCE-inst")).await.unwrap(); + let tinymce_contents = driver.find(By::Id("TinyMCE-inst")).await.unwrap(); // Make an edit. tinymce_contents.send_keys("foo").await.unwrap(); @@ -232,7 +222,7 @@ async fn test_5_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -256,17 +246,7 @@ async fn test_5_core( let version = client_version; codechat_server.send_result(client_id, None).await.unwrap(); client_id += MESSAGE_ID_INCREMENT; - - // The Server sends the Client a wrapped version of the text; the Client - // replies with a Result(Ok). - assert_eq!( - codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), - EditorMessage { - id: server_id, - message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)) - } - ); - server_id += MESSAGE_ID_INCREMENT; + assert_eq!(client_id, 10.0); // Send new text, which turns into a diff. let ide_id = codechat_server @@ -295,7 +275,7 @@ async fn test_5_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -320,17 +300,6 @@ async fn test_5_core( codechat_server.send_result(client_id, None).await.unwrap(); //client_id += MESSAGE_ID_INCREMENT; - // The Server sends the Client a wrapped version of the text; the Client - // replies with a Result(Ok). - assert_eq!( - codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), - EditorMessage { - id: server_id, - message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)) - } - ); - //server_id += MESSAGE_ID_INCREMENT; - assert_no_more_messages(&codechat_server).await; Ok(()) @@ -341,8 +310,8 @@ make_test!(test_6, test_6_core); // Verify that edits in document-only mode don't result in data corruption. async fn test_6_core( codechat_server: CodeChatEditorServer, - driver_ref: &WebDriver, - test_dir: &Path, + driver: WebDriver, + test_dir: PathBuf, ) -> Result<(), WebDriverError> { let path = canonicalize(test_dir.join("test.md")).unwrap(); let path_str = path.to_str().unwrap().to_string(); @@ -357,7 +326,7 @@ async fn test_6_core( .to_string(); perform_loadfile( &codechat_server, - test_dir, + &test_dir, "test.md", Some((orig_text.clone(), version)), false, @@ -366,16 +335,28 @@ async fn test_6_core( .await; // Target the iframe containing the Client. - select_codechat_iframe(driver_ref).await; + select_codechat_iframe(&driver).await; // Check the content. let body_css = "#CodeChat-body .CodeChat-doc-contents"; - let body_content = driver_ref.find(By::Css(body_css)).await.unwrap(); + let body_content = driver.find(By::Css(body_css)).await.unwrap(); // Perform edits. body_content.send_keys("a").await.unwrap(); - let client_id = INITIAL_CLIENT_MESSAGE_ID; - let msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); + let mut client_id = INITIAL_CLIENT_MESSAGE_ID; + // Sometimes, a cursor update gets sent before the edit. + let msg = optional_message( + &codechat_server, + &mut client_id, + EditorMessageContents::Update(UpdateMessageContents { + file_path: path_str.clone(), + cursor_position: Some(CursorPosition::Line(1)), + scroll_position: None, + is_re_translation: false, + contents: None, + }), + ) + .await; let client_version = get_version(&msg); assert_eq!( msg, @@ -383,7 +364,7 @@ async fn test_6_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: None, + cursor_position: Some(CursorPosition::Line(1)), scroll_position: None, is_re_translation: false, contents: Some(CodeChatForWeb { @@ -406,7 +387,7 @@ async fn test_6_core( ); let version = client_version; codechat_server.send_result(client_id, None).await.unwrap(); - //client_id += MESSAGE_ID_INCREMENT; + client_id += MESSAGE_ID_INCREMENT; // Send new text, which turns into a diff. let ide_id = codechat_server @@ -443,6 +424,23 @@ async fn test_6_core( "
  • aaa

b

" ); + // Get a final cursor update. + assert_eq!( + codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), + EditorMessage { + id: client_id, + message: EditorMessageContents::Update(UpdateMessageContents { + file_path: path_str.clone(), + cursor_position: Some(CursorPosition::Line(1)), + scroll_position: None, + is_re_translation: false, + contents: None, + }) + } + ); + codechat_server.send_result(client_id, None).await.unwrap(); + //client_id += MESSAGE_ID_INCREMENT; + assert_no_more_messages(&codechat_server).await; Ok(()) diff --git a/server/tests/overall_common/mod.rs b/server/tests/overall_common/mod.rs index 894a4e40..3cd1f06e 100644 --- a/server/tests/overall_common/mod.rs +++ b/server/tests/overall_common/mod.rs @@ -38,23 +38,36 @@ // ------- // // ### Standard library -use std::{collections::HashMap, error::Error, path::Path, time::Duration}; +use std::{ + collections::HashMap, + env, + error::Error, + panic::AssertUnwindSafe, + path::{Path, PathBuf}, + time::Duration, +}; +use assert_fs::TempDir; // ### Third-party use dunce::canonicalize; +use futures::FutureExt; use pretty_assertions::assert_eq; -use thirtyfour::{By, Key, WebDriver, WebElement}; +use thirtyfour::{ + By, ChromiumLikeCapabilities, DesiredCapabilities, Key, WebDriver, WebElement, + error::WebDriverError, start_webdriver_process, +}; // ### Local use code_chat_editor::{ ide::CodeChatEditorServer, processing::{CodeChatForWeb, CodeMirrorDiff, CodeMirrorDiffable, SourceFileMetadata}, webserver::{ - EditorMessage, EditorMessageContents, MESSAGE_ID_INCREMENT, ResultOkTypes, - UpdateMessageContents, + CursorPosition, EditorMessage, EditorMessageContents, MESSAGE_ID_INCREMENT, ResultOkTypes, + UpdateMessageContents, set_root_path, }, }; use test_utils::cast; +use tokio::time::sleep; // Utilities // --------- @@ -69,7 +82,14 @@ impl ExpectedMessages { ExpectedMessages(HashMap::new()) } - pub fn insert(&mut self, editor_message: EditorMessage, is_dynamic: bool) { + pub fn insert( + &mut self, + editor_message: EditorMessage, + // For this message, copy the version from the received + // EditorMessage.contents.version to the same field in the message to + // check against. + is_dynamic: bool, + ) { assert!( self.0 .insert( @@ -131,129 +151,100 @@ pub const TIMEOUT: Duration = Duration::from_millis(2000); // A test harness. It runs the webdriver, the Server, opens the Client, then // runs provided tests. After testing finishes, it cleans up (handling panics // properly). -// -// The goal was to pass the harness a function which runs the tests. This -// currently doesn't work, due to problems with lifetimes (see comments). So, -// implement this as a macro instead (kludge!). -#[macro_export] -macro_rules! harness { - // The name of the test function to call inside the harness. - ($func: ident) => { - pub async fn harness< - 'a, - F: FnOnce(CodeChatEditorServer, &'a WebDriver, &'a Path) -> Fut, - Fut: Future>, - >( - // The function which performs tests using thirtyfour. TODO: not - // used. - _f: F, - // The output from calling `prep_test_dir!()`. - prep_test_dir: (TempDir, PathBuf), - ) -> Result<(), Box> { - let (temp_dir, test_dir) = prep_test_dir; - // The logger gets configured by (I think) - // `start_webdriver_process`, which delegates to `selenium-manager`. - // Set logging level here. - unsafe { env::set_var("RUST_LOG", "debug") }; - // Start the webdriver. - let server_url = "http://localhost:4444"; - let mut caps = DesiredCapabilities::chrome(); - // Ensure the screen is wide enough for an 80-character line, used - // to word wrapping test in `test_client_updates`. Otherwise, this - // test send the End key to go to the end of the line...but it's not - // the end of the full line on a narrow screen. - caps.add_arg("--window-size=1920,768")?; - caps.add_arg("--headless")?; - // On Ubuntu CI, avoid failures, probably due to running Chrome as - // root. - #[cfg(target_os = "linux")] - if env::var("CI") == Ok("true".to_string()) { - caps.add_arg("--disable-gpu")?; - caps.add_arg("--no-sandbox")?; - } - if let Err(err) = start_webdriver_process(server_url, &caps, true) { - // Often, the "failure" is that the webdriver is already - // running. - eprintln!("Failed to start the webdriver process: {err:#?}"); - } - // Wait for the driver to start up. - sleep(Duration::from_millis(500)).await; - let driver = WebDriver::new(server_url, caps).await?; - let driver_clone = driver.clone(); - let driver_ref = &driver_clone; +pub async fn harness< + F: FnOnce(CodeChatEditorServer, WebDriver, PathBuf) -> Fut, + Fut: Future>, +>( + f: F, + // The output from calling `prep_test_dir!()`. + prep_test_dir: (TempDir, PathBuf), +) -> Result<(), Box> { + let (temp_dir, test_dir) = prep_test_dir; + // The logger gets configured by (I think) `start_webdriver_process`, which + // delegates to `selenium-manager`. Set logging level here. + unsafe { env::set_var("RUST_LOG", "debug") }; + // Start the webdriver. + let server_url = "http://localhost:4444"; + let mut caps = DesiredCapabilities::chrome(); + // Ensure the screen is wide enough for an 80-character line, used to word + // wrapping test in `test_client_updates`. Otherwise, this test send the End + // key to go to the end of the line...but it's not the end of the full line + // on a narrow screen. + caps.add_arg("--window-size=1920,768")?; + caps.add_arg("--headless")?; + // On Ubuntu CI, avoid failures, probably due to running Chrome as root. + #[cfg(target_os = "linux")] + if env::var("CI") == Ok("true".to_string()) { + caps.add_arg("--disable-gpu")?; + caps.add_arg("--no-sandbox")?; + } + if let Err(err) = start_webdriver_process(server_url, &caps, true) { + // Often, the "failure" is that the webdriver is already running. + eprintln!("Failed to start the webdriver process: {err:#?}"); + } + // Wait for the driver to start up. + sleep(Duration::from_millis(500)).await; + let driver = WebDriver::new(server_url, caps).await?; + let driver_clone = driver.clone(); - // Run the test inside an async, so we can shut down the driver - // before returning an error. Mark the function as unwind safe. - // though I'm not certain this is correct. Hopefully, it's good - // enough for testing. - let ret = AssertUnwindSafe(async move { - // ### Setup - let p = env::current_exe().unwrap().parent().unwrap().join("../.."); - set_root_path(Some(&p)).unwrap(); - let codechat_server = CodeChatEditorServer::new().unwrap(); + // Run the test inside an async, so we can shut down the driver before + // returning an error. Mark the function as unwind safe. though I'm not + // certain this is correct. Hopefully, it's good enough for testing. + let ret = AssertUnwindSafe(async move { + // ### Setup + let p = env::current_exe().unwrap().parent().unwrap().join("../.."); + set_root_path(Some(&p)).unwrap(); + let codechat_server = CodeChatEditorServer::new().unwrap(); - // Get the resulting web page text. - let opened_id = codechat_server.send_message_opened(true).await.unwrap(); - pretty_assertions::assert_eq!( - codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), - EditorMessage { - id: opened_id, - message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)) - } - ); - let em_html = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); - codechat_server.send_result(em_html.id, None).await.unwrap(); + // Get the resulting web page text. + let opened_id = codechat_server.send_message_opened(true).await.unwrap(); + assert_eq!( + codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), + EditorMessage { + id: opened_id, + message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)) + } + ); + let em_html = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); + codechat_server.send_result(em_html.id, None).await.unwrap(); - // Parse out the address to use. - let client_html = cast!(&em_html.message, EditorMessageContents::ClientHtml); - let find_str = "