diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index da04a74c..03d99e61 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -36,7 +36,7 @@ jobs: run: wasm-pack build --target web && cd pkg && npm install - name: Setup pnpm - uses: pnpm/action-setup@v4.0.0 + uses: pnpm/action-setup@v4.1.0 with: version: 9.15.1 run_install: | diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 00000000..dc62a814 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,9 @@ +{ + "ignorePatterns": [ + "node_modules", + "dist", + "pkg", + "target", + "website/public/parsers/*.wasm" + ] +} diff --git a/Cargo.lock b/Cargo.lock index 3fad445a..0dfacd02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,19 +11,12 @@ dependencies = [ "memchr", ] -[[package]] -name = "anyhow" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" - [[package]] name = "ast-grep-config" -version = "0.35.0" +version = "0.38.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9e0f6086c07e76bfef52b76ca9563e15cdb453fcb7f58d115a61fa8fb7249b1" +checksum = "742665858253c18b0db5ee9da5739f1dd617c82b58ec11458644dcafed1c7f1d" dependencies = [ - "anyhow", "ast-grep-core", "bit-set", "globset", @@ -36,40 +29,26 @@ dependencies = [ [[package]] name = "ast-grep-core" -version = "0.35.0" +version = "0.38.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f6eb6f1b7d07f46ed8b9e13519e9fa4796be6e5a3a3394d8a088dfa6d6eda5" +checksum = "506bcd7f8c73ac53af75d0c11a31df48ce0af9bd35b42e9675bc5009cf7d951a" dependencies = [ "bit-set", "regex", "thiserror", - "tree-sitter-facade-sg", -] - -[[package]] -name = "ast-grep-language" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaee9123d4aceac443d19748b4f3d471261b0a7339bf23dba4d034ef53df8768" -dependencies = [ - "ast-grep-core", - "ignore", - "serde", ] [[package]] name = "ast-grep-wasm" -version = "0.26.3" +version = "0.38.0" dependencies = [ "ast-grep-config", "ast-grep-core", - "ast-grep-language", "console_error_panic_hook", "once_cell", "serde", "serde-wasm-bindgen", "serde_json", - "tree-sitter-facade-sg", "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-test", @@ -77,12 +56,6 @@ dependencies = [ "wee_alloc", ] -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - [[package]] name = "bit-set" version = "0.8.0" @@ -116,9 +89,9 @@ checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "cc" -version = "1.2.5" +version = "1.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" +checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" dependencies = [ "shlex", ] @@ -145,38 +118,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2fe95351b870527a5d09bf563ed3c97c0cffb87cf1c78a591bf48bb218d9aa" -dependencies = [ - "autocfg", - "cfg-if 1.0.0", - "crossbeam-utils", - "memoffset", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f" -dependencies = [ - "cfg-if 1.0.0", -] - [[package]] name = "dyn-clone" version = "1.0.16" @@ -208,22 +149,6 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" -[[package]] -name = "ignore" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" -dependencies = [ - "crossbeam-deque", - "globset", - "log", - "memchr", - "regex-automata", - "same-file", - "walkdir", - "winapi-util", -] - [[package]] name = "indexmap" version = "2.2.3" @@ -267,15 +192,6 @@ version = "2.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - [[package]] name = "memory_units" version = "0.4.0" @@ -294,9 +210,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "proc-macro2" @@ -392,9 +308,9 @@ checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -412,9 +328,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", @@ -434,9 +350,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.139" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -463,12 +379,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" - [[package]] name = "syn" version = "2.0.90" @@ -500,39 +410,6 @@ dependencies = [ "syn", ] -[[package]] -name = "tree-sitter" -version = "0.24.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ac95b18f0f727aaaa012bd5179a1916706ee3ed071920fdbda738750b0c0bf5" -dependencies = [ - "cc", - "regex", - "regex-syntax", - "streaming-iterator", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-facade-sg" -version = "0.24.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9195ab85ddd7df7ddac5b2e397ec6264816ae640346013002ceccf0f9b3578f1" -dependencies = [ - "js-sys", - "tree-sitter", - "tree-sitter-language", - "wasm-bindgen", - "web-sys", - "web-tree-sitter-sg", -] - -[[package]] -name = "tree-sitter-language" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c199356c799a8945965bb5f2c55b2ad9d9aa7c4b4f6e587fe9dea0bc715e5f9c" - [[package]] name = "unicode-ident" version = "1.0.9" @@ -652,9 +529,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -662,9 +539,9 @@ dependencies = [ [[package]] name = "web-tree-sitter-sg" -version = "0.24.5" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cf7d34b16550f076d75b4a5d4673f1a9692f79787d040e3ac7ddb04e5c48a0" +checksum = "0c769bd29dd6612783fffb7090d29ed8b390672fb9e968b9e76bbc07bf78600c" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/Cargo.toml b/Cargo.toml index a617bfb2..eabcb0fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ast-grep-wasm" -version = "0.26.3" +version = "0.38.0" authors = ["HerringtonDarkholme <2883231+HerringtonDarkholme@users.noreply.github.com>"] edition = "2018" description = "Search and Rewrite code at large scale using precise AST pattern" @@ -16,8 +16,8 @@ crate-type = ["cdylib", "rlib"] default = [] [dependencies] -wasm-bindgen = {version = "0.2.92", features = ["serde-serialize"]} -wasm-bindgen-futures = "0.4.42" +wasm-bindgen = {version = "=0.2.93", features = ["serde-serialize"]} +wasm-bindgen-futures = "=0.4.43" serde = { version = "1.0", features = ["derive"] } # The `console_error_panic_hook` crate provides better debugging of panics by @@ -28,12 +28,10 @@ console_error_panic_hook = { version = "0.1.7", optional = true } once_cell = "1.19.0" wee_alloc = { version = "0.4.5" } -ast-grep-core = { version = "0.35.0" } -ast-grep-config = { version = "0.35.0" } -ast-grep-language = { version = "0.35.0", default-features = false } -web-tree-sitter-sg = "0.24.4" -tree-sitter = { version = "0.24.5", package = "tree-sitter-facade-sg" } -serde-wasm-bindgen = "0.6" +ast-grep-core = { version = "0.38.3", default-features = false } +ast-grep-config = { version = "0.38.3", default-features = false } +web-tree-sitter-sg = "0.25.3" +serde-wasm-bindgen = "0.6.5" serde_json = "1.0.116" [dev-dependencies] diff --git a/dprint.json b/dprint.json new file mode 100644 index 00000000..3bd768a2 --- /dev/null +++ b/dprint.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://dprint.dev/schemas/v0.json", + "projectType": "openSource", + "incremental": true, + "typescript": { + "useTabs": false, + "indentWidth": 2, + "lineWidth": 100, + "semiColons": "asi", + "quoteStyle": "preferSingle", + "nextControlFlowPosition": "sameLine", + "operatorPosition": "maintain", + "singleBodyPosition": "maintain", + "trailingCommas": "onlyMultiLine", + "useBraces": "whenNotSingleLine", + "bracePosition": "sameLineUnlessHanging", + "spaceSurroundingProperties": true, + "objectExpression.spaceSurroundingProperties": true, + "importDeclaration.spaceSurroundingNamedImports": true, + "exportDeclaration.spaceSurroundingNamedExports": true + }, + "json": { + "useTabs": false, + "indentWidth": 2, + "lineWidth": 100 + }, + "includes": [ + "**/*.{ts,tsx,js,jsx,vue,json,md,css,scss,sass,less,html,yaml,yml}" + ], + "excludes": [ + "node_modules", + "dist", + "pkg", + "target", + "**/*.d.ts", + "website/public/parsers/*.wasm", + "website/public/parsers/*.mjs", + "pnpm-lock.yaml", + "Cargo.lock" + ], + "plugins": [ + "https://plugins.dprint.dev/typescript-0.93.0.wasm", + "https://plugins.dprint.dev/json-0.19.3.wasm" + ] +} diff --git a/package.json b/package.json index 724cb0d0..1681e35b 100644 --- a/package.json +++ b/package.json @@ -8,26 +8,31 @@ "dev-force": "vitepress dev website --force", "build": "vue-tsc --noEmit && NODE_OPTIONS=--max_old_space_size=4096 vitepress build website", "download-parsers": "node --experimental-strip-types website/public/parsers/downloadParsers.mjs", - "serve": "vitepress serve website" + "serve": "vitepress serve website", + "lint": "oxlint && dprint check", + "lint:fix": "oxlint --fix && dprint fmt" }, "dependencies": { - "@number-flow/vue": "0.4.3", + "@number-flow/vue": "0.4.8", "@types/js-yaml": "4.0.9", "js-yaml": "4.1.0", "monaco-editor": "0.52.2", - "monaco-yaml": "5.3.1", - "vue": "3.5.13" + "monaco-yaml": "5.4.0", + "vitepress-plugin-llms": "1.7.0", + "vue": "3.5.17" }, "optionalDependencies": { "ast-grep-wasm": "file:./pkg/" }, "devDependencies": { - "@algolia/client-search": "5.19.0", + "dprint": "0.50.1", + "@algolia/client-search": "5.29.0", "markdown-it": "14.1.0", + "oxlint": "1.7.0", "search-insights": "2.17.3", - "typescript": "5.7.3", - "vite": "6.1.0", + "typescript": "5.8.3", + "vite": "7.0.2", "vitepress": "1.6.3", - "vue-tsc": "2.2.2" + "vue-tsc": "3.0.1" } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7efcb612..2bd07968 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@number-flow/vue': - specifier: 0.4.3 - version: 0.4.3(vue@3.5.13(typescript@5.7.3)) + specifier: 0.4.8 + version: 0.4.8(vue@3.5.17(typescript@5.8.3)) '@types/js-yaml': specifier: 4.0.9 version: 4.0.9 @@ -21,33 +21,42 @@ importers: specifier: 0.52.2 version: 0.52.2 monaco-yaml: - specifier: 5.3.1 - version: 5.3.1(monaco-editor@0.52.2) + specifier: 5.4.0 + version: 5.4.0(monaco-editor@0.52.2) + vitepress-plugin-llms: + specifier: 1.7.0 + version: 1.7.0 vue: - specifier: 3.5.13 - version: 3.5.13(typescript@5.7.3) + specifier: 3.5.17 + version: 3.5.17(typescript@5.8.3) devDependencies: '@algolia/client-search': - specifier: 5.19.0 - version: 5.19.0 + specifier: 5.29.0 + version: 5.29.0 + dprint: + specifier: 0.50.1 + version: 0.50.1 markdown-it: specifier: 14.1.0 version: 14.1.0 + oxlint: + specifier: 1.7.0 + version: 1.7.0 search-insights: specifier: 2.17.3 version: 2.17.3 typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 5.8.3 + version: 5.8.3 vite: - specifier: 6.1.0 - version: 6.1.0 + specifier: 7.0.2 + version: 7.0.2(lightningcss@1.30.1)(yaml@2.7.1) vitepress: specifier: 1.6.3 - version: 1.6.3(@algolia/client-search@5.19.0)(postcss@8.5.1)(search-insights@2.17.3)(typescript@5.7.3) + version: 1.6.3(@algolia/client-search@5.29.0)(lightningcss@1.30.1)(postcss@8.5.6)(search-insights@2.17.3)(typescript@5.8.3) vue-tsc: - specifier: 2.2.2 - version: 2.2.2(typescript@5.7.3) + specifier: 3.0.1 + version: 3.0.1(typescript@5.8.3) optionalDependencies: ast-grep-wasm: specifier: file:./pkg/ @@ -75,93 +84,93 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.20.0': - resolution: {integrity: sha512-YaEoNc1Xf2Yk6oCfXXkZ4+dIPLulCx8Ivqj0OsdkHWnsI3aOJChY5qsfyHhDBNSOhqn2ilgHWxSfyZrjxBcAww==} + '@algolia/client-abtesting@5.23.4': + resolution: {integrity: sha512-WIMT2Kxy+FFWXWQxIU8QgbTioL+SGE24zhpj0kipG4uQbzXwONaWt7ffaYLjfge3gcGSgJVv+1VlahVckafluQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.20.0': - resolution: {integrity: sha512-CIT9ni0+5sYwqehw+t5cesjho3ugKQjPVy/iPiJvtJX4g8Cdb6je6SPt2uX72cf2ISiXCAX9U3cY0nN0efnRDw==} + '@algolia/client-analytics@5.23.4': + resolution: {integrity: sha512-4B9gChENsQA9kFmFlb+x3YhBz2Gx3vSsm81FHI1yJ3fn2zlxREHmfrjyqYoMunsU7BybT/o5Nb7ccCbm/vfseA==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.19.0': - resolution: {integrity: sha512-2ERRbICHXvtj5kfFpY5r8qu9pJII/NAHsdgUXnUitQFwPdPL7wXiupcvZJC7DSntOnE8AE0lM7oDsPhrJfj5nQ==} + '@algolia/client-common@5.23.4': + resolution: {integrity: sha512-bsj0lwU2ytiWLtl7sPunr+oLe+0YJql9FozJln5BnIiqfKOaseSDdV42060vUy+D4373f2XBI009K/rm2IXYMA==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.20.0': - resolution: {integrity: sha512-iSTFT3IU8KNpbAHcBUJw2HUrPnMXeXLyGajmCL7gIzWOsYM4GabZDHXOFx93WGiXMti1dymz8k8R+bfHv1YZmA==} + '@algolia/client-common@5.29.0': + resolution: {integrity: sha512-T0lzJH/JiCxQYtCcnWy7Jf1w/qjGDXTi2npyF9B9UsTvXB97GRC6icyfXxe21mhYvhQcaB1EQ/J2575FXxi2rA==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.20.0': - resolution: {integrity: sha512-w9RIojD45z1csvW1vZmAko82fqE/Dm+Ovsy2ElTsjFDB0HMAiLh2FO86hMHbEXDPz6GhHKgGNmBRiRP8dDPgJg==} + '@algolia/client-insights@5.23.4': + resolution: {integrity: sha512-XSCtAYvJ/hnfDHfRVMbBH0dayR+2ofVZy3jf5qyifjguC6rwxDsSdQvXpT0QFVyG+h8UPGtDhMPoUIng4wIcZA==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.20.0': - resolution: {integrity: sha512-p/hftHhrbiHaEcxubYOzqVV4gUqYWLpTwK+nl2xN3eTrSW9SNuFlAvUBFqPXSVBqc6J5XL9dNKn3y8OA1KElSQ==} + '@algolia/client-personalization@5.23.4': + resolution: {integrity: sha512-l/0QvqgRFFOf7BnKSJ3myd1WbDr86ftVaa3PQwlsNh7IpIHmvVcT83Bi5zlORozVGMwaKfyPZo6O48PZELsOeA==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.20.0': - resolution: {integrity: sha512-m4aAuis5vZi7P4gTfiEs6YPrk/9hNTESj3gEmGFgfJw3hO2ubdS4jSId1URd6dGdt0ax2QuapXufcrN58hPUcw==} + '@algolia/client-query-suggestions@5.23.4': + resolution: {integrity: sha512-TB0htrDgVacVGtPDyENoM6VIeYqR+pMsDovW94dfi2JoaRxfqu/tYmLpvgWcOknP6wLbr8bA+G7t/NiGksNAwQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.19.0': - resolution: {integrity: sha512-Ctg3xXD/1VtcwmkulR5+cKGOMj4r0wC49Y/KZdGQcqpydKn+e86F6l3tb3utLJQVq4lpEJud6kdRykFgcNsp8Q==} + '@algolia/client-search@5.23.4': + resolution: {integrity: sha512-uBGo6KwUP6z+u6HZWRui8UJClS7fgUIAiYd1prUqCbkzDiCngTOzxaJbEvrdkK0hGCQtnPDiuNhC5MhtVNN4Eg==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.20.0': - resolution: {integrity: sha512-KL1zWTzrlN4MSiaK1ea560iCA/UewMbS4ZsLQRPoDTWyrbDKVbztkPwwv764LAqgXk0fvkNZvJ3IelcK7DqhjQ==} + '@algolia/client-search@5.29.0': + resolution: {integrity: sha512-cZ0Iq3OzFUPpgszzDr1G1aJV5UMIZ4VygJ2Az252q4Rdf5cQMhYEIKArWY/oUjMhQmosM8ygOovNq7gvA9CdCg==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.20.0': - resolution: {integrity: sha512-shj2lTdzl9un4XJblrgqg54DoK6JeKFO8K8qInMu4XhE2JuB8De6PUuXAQwiRigZupbI0xq8aM0LKdc9+qiLQA==} + '@algolia/ingestion@1.23.4': + resolution: {integrity: sha512-Si6rFuGnSeEUPU9QchYvbknvEIyCRK7nkeaPVQdZpABU7m4V/tsiWdHmjVodtx3h20VZivJdHeQO9XbHxBOcCw==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.20.0': - resolution: {integrity: sha512-aF9blPwOhKtWvkjyyXh9P5peqmhCA1XxLBRgItT+K6pbT0q4hBDQrCid+pQZJYy4HFUKjB/NDDwyzFhj/rwKhw==} + '@algolia/monitoring@1.23.4': + resolution: {integrity: sha512-EXGoVVTshraqPJgr5cMd1fq7Jm71Ew6MpGCEaxI5PErBpJAmKdtjRIzs6JOGKHRaWLi+jdbJPYc2y8RN4qcx5Q==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.20.0': - resolution: {integrity: sha512-T6B/WPdZR3b89/F9Vvk6QCbt/wrLAtrGoL8z4qPXDFApQ8MuTFWbleN/4rHn6APWO3ps+BUePIEbue2rY5MlRw==} + '@algolia/recommend@5.23.4': + resolution: {integrity: sha512-1t6glwKVCkjvBNlng2itTf8fwaLSqkL4JaMENgR3WTGR8mmW2akocUy/ZYSQcG4TcR7qu4zW2UMGAwLoWoflgQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.19.0': - resolution: {integrity: sha512-GfnhnQBT23mW/VMNs7m1qyEyZzhZz093aY2x8p0era96MMyNv8+FxGek5pjVX0b57tmSCZPf4EqNCpkGcGsmbw==} + '@algolia/requester-browser-xhr@5.23.4': + resolution: {integrity: sha512-UUuizcgc5+VSY8hqzDFVdJ3Wcto03lpbFRGPgW12pHTlUQHUTADtIpIhkLLOZRCjXmCVhtr97Z+eR6LcRYXa3Q==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.20.0': - resolution: {integrity: sha512-t6//lXsq8E85JMenHrI6mhViipUT5riNhEfCcvtRsTV+KIBpC6Od18eK864dmBhoc5MubM0f+sGpKOqJIlBSCg==} + '@algolia/requester-browser-xhr@5.29.0': + resolution: {integrity: sha512-og+7Em75aPHhahEUScq2HQ3J7ULN63Levtd87BYMpn6Im5d5cNhaC4QAUsXu6LWqxRPgh4G+i+wIb6tVhDhg2A==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.19.0': - resolution: {integrity: sha512-oyTt8ZJ4T4fYvW5avAnuEc6Laedcme9fAFryMD9ndUTIUe/P0kn3BuGcCLFjN3FDmdrETHSFkgPPf1hGy3sLCw==} + '@algolia/requester-fetch@5.23.4': + resolution: {integrity: sha512-UhDg6elsek6NnV5z4VG1qMwR6vbp+rTMBEnl/v4hUyXQazU+CNdYkl++cpdmLwGI/7nXc28xtZiL90Es3I7viQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.20.0': - resolution: {integrity: sha512-FHxYGqRY+6bgjKsK4aUsTAg6xMs2S21elPe4Y50GB0Y041ihvw41Vlwy2QS6K9ldoftX4JvXodbKTcmuQxywdQ==} + '@algolia/requester-fetch@5.29.0': + resolution: {integrity: sha512-JCxapz7neAy8hT/nQpCvOrI5JO8VyQ1kPvBiaXWNC1prVq0UMYHEL52o1BsPvtXfdQ7BVq19OIq6TjOI06mV/w==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.19.0': - resolution: {integrity: sha512-p6t8ue0XZNjcRiqNkb5QAM0qQRAKsCiebZ6n9JjWA+p8fWf8BvnhO55y2fO28g3GW0Imj7PrAuyBuxq8aDVQwQ==} + '@algolia/requester-node-http@5.23.4': + resolution: {integrity: sha512-jXGzGBRUS0oywQwnaCA6mMDJO7LoC3dYSLsyNfIqxDR4SNGLhtg3je0Y31lc24OA4nYyKAYgVLtjfrpcpsWShg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.20.0': - resolution: {integrity: sha512-kmtQClq/w3vtPteDSPvaW9SPZL/xrIgMrxZyAgsFwrJk0vJxqyC5/hwHmrCraDnStnGSADnLpBf4SpZnwnkwWw==} + '@algolia/requester-node-http@5.29.0': + resolution: {integrity: sha512-lVBD81RBW5VTdEYgnzCz7Pf9j2H44aymCP+/eHGJu4vhU+1O8aKf3TVBgbQr5UM6xoe8IkR/B112XY6YIG2vtg==} engines: {node: '>= 14.0.0'} - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/parser@7.25.6': - resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.25.6': - resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} engines: {node: '>=6.9.0'} '@docsearch/css@3.8.2': @@ -187,14 +196,59 @@ packages: search-insights: optional: true + '@dprint/darwin-arm64@0.50.1': + resolution: {integrity: sha512-NNKf3dxXn567pd/hpCVLHLbC0dI7s3YvQnUEwjRTOAQVMp6O7/ME+Tg1RPGsDP1IB+Y2fIYSM4qmG02zQrqjAQ==} + cpu: [arm64] + os: [darwin] + + '@dprint/darwin-x64@0.50.1': + resolution: {integrity: sha512-PcY75U3UC/0CLOxWzE0zZJZ2PxzUM5AX2baYL1ovgDGCfqO1H0hINiyxfx/8ncGgPojWBkLs+zrcFiGnXx7BQg==} + cpu: [x64] + os: [darwin] + + '@dprint/linux-arm64-glibc@0.50.1': + resolution: {integrity: sha512-q0TOGy9FsoSKsEQ4sIMKyFweF5M8rW1S5OfwJDNRR2TU2riWByU9TKYIZUzg53iuwYKRypr/kJ5kdbl516afRQ==} + cpu: [arm64] + os: [linux] + + '@dprint/linux-arm64-musl@0.50.1': + resolution: {integrity: sha512-XRtxN2cA9rc06WFzzVPDIZYGGLmUXqpVf3F0XhhHV77ikQLJZ5reF4xBOQ+0HjJ/zy8W/HzuGDAHedWyCrRf9g==} + cpu: [arm64] + os: [linux] + + '@dprint/linux-riscv64-glibc@0.50.1': + resolution: {integrity: sha512-vAk/eYhSjA3LJ/yuYgxkHamiK8+m6YdqVBO/Ka+i16VxyjQyOdcMKBkrLCIqSxgyXd6b8raf9wM59HJbaIpoOg==} + cpu: [riscv64] + os: [linux] + + '@dprint/linux-x64-glibc@0.50.1': + resolution: {integrity: sha512-EpW5KLekaq4hXmKBWWtfBgZ244S4C+vFmMOd1YaGi8+f0hmPTJzVWLdIgpO2ZwfPQ5iycaVI/JS514PQmXPOvg==} + cpu: [x64] + os: [linux] + + '@dprint/linux-x64-musl@0.50.1': + resolution: {integrity: sha512-assISBbaKKL8LkjrIy/5tpE157MVW6HbyIKAjTtg3tPNM3lDn1oH3twuGtK9WBsN/VoEP3QMZVauolcUJT/VOg==} + cpu: [x64] + os: [linux] + + '@dprint/win32-arm64@0.50.1': + resolution: {integrity: sha512-ZeaRMQYoFjrsO3lvI1SqzDWDGH1GGXWmNSeXvcFuAf2OgYQJWMBlLotCKiHNJ3uyYneoyhTg2tv9QkApNkZV4Q==} + cpu: [arm64] + os: [win32] + + '@dprint/win32-x64@0.50.1': + resolution: {integrity: sha512-pMm8l/hRZ9zYylKw/yCaYkSV3btYB9UyMDbWqyxNthkQ1gckWrk17VTI6WjwwQuHD4Iaz5JgAYLS36hlUzWkxA==} + cpu: [x64] + os: [win32] + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + '@esbuild/aix-ppc64@0.25.2': + resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -205,8 +259,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + '@esbuild/android-arm64@0.25.2': + resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -217,8 +271,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + '@esbuild/android-arm@0.25.2': + resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -229,8 +283,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + '@esbuild/android-x64@0.25.2': + resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -241,8 +295,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + '@esbuild/darwin-arm64@0.25.2': + resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -253,8 +307,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + '@esbuild/darwin-x64@0.25.2': + resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -265,8 +319,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + '@esbuild/freebsd-arm64@0.25.2': + resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -277,8 +331,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + '@esbuild/freebsd-x64@0.25.2': + resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -289,8 +343,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + '@esbuild/linux-arm64@0.25.2': + resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -301,8 +355,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + '@esbuild/linux-arm@0.25.2': + resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -313,8 +367,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + '@esbuild/linux-ia32@0.25.2': + resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -325,8 +379,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + '@esbuild/linux-loong64@0.25.2': + resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -337,8 +391,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + '@esbuild/linux-mips64el@0.25.2': + resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -349,8 +403,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + '@esbuild/linux-ppc64@0.25.2': + resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -361,8 +415,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + '@esbuild/linux-riscv64@0.25.2': + resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -373,8 +427,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + '@esbuild/linux-s390x@0.25.2': + resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -385,14 +439,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + '@esbuild/linux-x64@0.25.2': + resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + '@esbuild/netbsd-arm64@0.25.2': + resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -403,14 +457,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + '@esbuild/netbsd-x64@0.25.2': + resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + '@esbuild/openbsd-arm64@0.25.2': + resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -421,8 +475,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + '@esbuild/openbsd-x64@0.25.2': + resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -433,8 +487,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + '@esbuild/sunos-x64@0.25.2': + resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -445,8 +499,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + '@esbuild/win32-arm64@0.25.2': + resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -457,8 +511,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + '@esbuild/win32-ia32@0.25.2': + resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -469,237 +523,203 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + '@esbuild/win32-x64@0.25.2': + resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@iconify-json/simple-icons@1.2.21': - resolution: {integrity: sha512-aqbIuVshMZ2fNEhm25//9DoKudboXF3CpoEQJJlHl9gVSVNOTr4cgaCIZvgSEYmys2HHEfmhcpoZIhoEFZS8SQ==} + '@iconify-json/simple-icons@1.2.32': + resolution: {integrity: sha512-gxgLq0raip7SJaeJ0302vwhsqupQttS21B93Ci1kA/++B+hIgGw71HzTOWQoUhwjlrdWcoVUxSvpPJoMs7oURg==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@number-flow/vue@0.4.3': - resolution: {integrity: sha512-FSgAzisKV/qOSExDKXT22P632dMaK0E86uGJ0lXYJXvdeE3ReDKh07tZiiAtV6DGuvti2fhNHKB+6XGjuuj3hw==} + '@number-flow/vue@0.4.8': + resolution: {integrity: sha512-g1kh66wndJ4MYkX5Z00GvyLxdOMbRotiTeTQujzb1XS009dL/mVH0ZRI5slXH1mzpl78yzzsjz3vjzGhTMM3CA==} peerDependencies: vue: ^3 - '@rollup/rollup-android-arm-eabi@4.28.0': - resolution: {integrity: sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==} - cpu: [arm] - os: [android] + '@oxlint/darwin-arm64@1.7.0': + resolution: {integrity: sha512-51vhCSQO4NSkedwEwOyqThiYqV0DAUkwNdqMQK0d29j5zmtNJJJRRBLeQuLGdstNmn3F7WMQ75Ci0/3Nq4ff8A==} + cpu: [arm64] + os: [darwin] - '@rollup/rollup-android-arm-eabi@4.34.6': - resolution: {integrity: sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==} - cpu: [arm] - os: [android] + '@oxlint/darwin-x64@1.7.0': + resolution: {integrity: sha512-c0GN52yehYZ4TYuh4lBH9wYbBOI/RDOxZhJdBsttG0GwfvKYg/tiPNrNEsPzu0/rd1j6x3yT0zt6vezDMeC1sQ==} + cpu: [x64] + os: [darwin] - '@rollup/rollup-android-arm64@4.28.0': - resolution: {integrity: sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==} + '@oxlint/linux-arm64-gnu@1.7.0': + resolution: {integrity: sha512-pam/lbzbzVMDzc3f1hoRPtnUMEIqkn0dynlB5nUll/MVBSIvIPLS9kJLrRA48lrlqbkS9LGiF37JvpwXA58A9A==} cpu: [arm64] - os: [android] + os: [linux] - '@rollup/rollup-android-arm64@4.34.6': - resolution: {integrity: sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==} + '@oxlint/linux-arm64-musl@1.7.0': + resolution: {integrity: sha512-LTyPy9FYS3SZ2XxJx+ITvlAq/ek5PtZK9Z2m3W72TA8hchGhJy5eQ+aotYjd/YVXOpGRpB12RdOpOTsZRu50bA==} cpu: [arm64] - os: [android] + os: [linux] - '@rollup/rollup-darwin-arm64@4.28.0': - resolution: {integrity: sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==} - cpu: [arm64] - os: [darwin] + '@oxlint/linux-x64-gnu@1.7.0': + resolution: {integrity: sha512-YtZ4DiAgjaEiqUiwnvtJ/znZMAAVPKR7pnsi6lqbA3BfXJ/IwMaNpdoGlCGVdDGeN4BuGCwnFtBVqKVvVg3DDg==} + cpu: [x64] + os: [linux] - '@rollup/rollup-darwin-arm64@4.34.6': - resolution: {integrity: sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==} + '@oxlint/linux-x64-musl@1.7.0': + resolution: {integrity: sha512-5aIpemNUBvwMMk4MCx1V3M6R9eMB1/SS6/24Orax9FqaI1lDX08tySdv696sr4Lms9ocA+rotxIPW9NP9439vA==} + cpu: [x64] + os: [linux] + + '@oxlint/win32-arm64@1.7.0': + resolution: {integrity: sha512-fpFpkHwbAu0NcR5bc1WapCPcM9qSYi5lCRVOp1WwDoFLKI2b9/UWB8OEg8UHWV5dnBu7HZAWH/SEslYGkZNsbQ==} cpu: [arm64] - os: [darwin] + os: [win32] - '@rollup/rollup-darwin-x64@4.28.0': - resolution: {integrity: sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==} + '@oxlint/win32-x64@1.7.0': + resolution: {integrity: sha512-0EPWBWOiD3wZHgeWDlTUaiFzhzIonXykxYUC+NRerPQFkO/G+bd9uLMJddHDKqfP/7g8s3E5V6KvBvvFpb7U6g==} cpu: [x64] - os: [darwin] + os: [win32] - '@rollup/rollup-darwin-x64@4.34.6': - resolution: {integrity: sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==} - cpu: [x64] - os: [darwin] + '@rollup/rollup-android-arm-eabi@4.41.1': + resolution: {integrity: sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==} + cpu: [arm] + os: [android] - '@rollup/rollup-freebsd-arm64@4.28.0': - resolution: {integrity: sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==} + '@rollup/rollup-android-arm64@4.41.1': + resolution: {integrity: sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==} cpu: [arm64] - os: [freebsd] + os: [android] - '@rollup/rollup-freebsd-arm64@4.34.6': - resolution: {integrity: sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==} + '@rollup/rollup-darwin-arm64@4.41.1': + resolution: {integrity: sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==} cpu: [arm64] - os: [freebsd] + os: [darwin] - '@rollup/rollup-freebsd-x64@4.28.0': - resolution: {integrity: sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==} + '@rollup/rollup-darwin-x64@4.41.1': + resolution: {integrity: sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==} cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.41.1': + resolution: {integrity: sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==} + cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.34.6': - resolution: {integrity: sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==} + '@rollup/rollup-freebsd-x64@4.41.1': + resolution: {integrity: sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.28.0': - resolution: {integrity: sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-gnueabihf@4.34.6': - resolution: {integrity: sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==} + '@rollup/rollup-linux-arm-gnueabihf@4.41.1': + resolution: {integrity: sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.28.0': - resolution: {integrity: sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==} + '@rollup/rollup-linux-arm-musleabihf@4.41.1': + resolution: {integrity: sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.34.6': - resolution: {integrity: sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.28.0': - resolution: {integrity: sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.34.6': - resolution: {integrity: sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.28.0': - resolution: {integrity: sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==} + '@rollup/rollup-linux-arm64-gnu@4.41.1': + resolution: {integrity: sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.6': - resolution: {integrity: sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==} + '@rollup/rollup-linux-arm64-musl@4.41.1': + resolution: {integrity: sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.34.6': - resolution: {integrity: sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==} + '@rollup/rollup-linux-loongarch64-gnu@4.41.1': + resolution: {integrity: sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': - resolution: {integrity: sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': + resolution: {integrity: sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': - resolution: {integrity: sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.28.0': - resolution: {integrity: sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==} + '@rollup/rollup-linux-riscv64-gnu@4.41.1': + resolution: {integrity: sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.6': - resolution: {integrity: sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==} + '@rollup/rollup-linux-riscv64-musl@4.41.1': + resolution: {integrity: sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.28.0': - resolution: {integrity: sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.34.6': - resolution: {integrity: sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==} + '@rollup/rollup-linux-s390x-gnu@4.41.1': + resolution: {integrity: sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.28.0': - resolution: {integrity: sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==} + '@rollup/rollup-linux-x64-gnu@4.41.1': + resolution: {integrity: sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.6': - resolution: {integrity: sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==} + '@rollup/rollup-linux-x64-musl@4.41.1': + resolution: {integrity: sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.28.0': - resolution: {integrity: sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.34.6': - resolution: {integrity: sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.28.0': - resolution: {integrity: sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-arm64-msvc@4.34.6': - resolution: {integrity: sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==} + '@rollup/rollup-win32-arm64-msvc@4.41.1': + resolution: {integrity: sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.28.0': - resolution: {integrity: sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==} + '@rollup/rollup-win32-ia32-msvc@4.41.1': + resolution: {integrity: sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.6': - resolution: {integrity: sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.28.0': - resolution: {integrity: sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==} + '@rollup/rollup-win32-x64-msvc@4.41.1': + resolution: {integrity: sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.6': - resolution: {integrity: sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==} - cpu: [x64] - os: [win32] + '@shikijs/core@2.5.0': + resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} - '@shikijs/core@2.1.0': - resolution: {integrity: sha512-v795KDmvs+4oV0XD05YLzfDMe9ISBgNjtFxP4PAEv5DqyeghO1/TwDqs9ca5/E6fuO95IcAcWqR6cCX9TnqLZA==} + '@shikijs/engine-javascript@2.5.0': + resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} - '@shikijs/engine-javascript@2.1.0': - resolution: {integrity: sha512-cgIUdAliOsoaa0rJz/z+jvhrpRd+fVAoixVFEVxUq5FA+tHgBZAIfVJSgJNVRj2hs/wZ1+4hMe82eKAThVh0nQ==} + '@shikijs/engine-oniguruma@2.5.0': + resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} - '@shikijs/engine-oniguruma@2.1.0': - resolution: {integrity: sha512-Ujik33wEDqgqY2WpjRDUBECGcKPv3eGGkoXPujIXvokLaRmGky8NisSk8lHUGeSFxo/Cz5sgFej9sJmA9yeepg==} + '@shikijs/langs@2.5.0': + resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} - '@shikijs/langs@2.1.0': - resolution: {integrity: sha512-Jn0gS4rPgerMDPj1ydjgFzZr5fAIoMYz4k7ZT3LJxWWBWA6lokK0pumUwVtb+MzXtlpjxOaQejLprmLbvMZyww==} + '@shikijs/themes@2.5.0': + resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} - '@shikijs/themes@2.1.0': - resolution: {integrity: sha512-oS2mU6+bz+8TKutsjBxBA7Z3vrQk21RCmADLpnu8cy3tZD6Rw0FKqDyXNtwX52BuIDKHxZNmRlTdG3vtcYv3NQ==} + '@shikijs/transformers@2.5.0': + resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} - '@shikijs/transformers@2.1.0': - resolution: {integrity: sha512-3sfvh6OKUVkT5wZFU1xxiq1qqNIuCwUY3yOb9ZGm19y80UZ/eoroLE2orGNzfivyTxR93GfXXZC/ghPR0/SBow==} + '@shikijs/types@2.5.0': + resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} - '@shikijs/types@2.1.0': - resolution: {integrity: sha512-OFOdHA6VEVbiQvepJ8yqicC6VmBrKxFFhM2EsHHrZESqLVAXOSeRDiuSYV185lIgp15TVic5vYBYNhTsk1xHLg==} + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@shikijs/vscode-textmate@10.0.1': - resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -719,85 +739,91 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/web-bluetooth@0.0.20': - resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitejs/plugin-vue@5.2.1': - resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} + '@vitejs/plugin-vue@5.2.3': + resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@volar/language-core@2.4.11': - resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} + '@volar/language-core@2.4.17': + resolution: {integrity: sha512-chmRZMbKmcGpKMoO7Reb70uiLrzo0KWC2CkFttKUuKvrE+VYgi+fL9vWMJ07Fv5ulX0V1TAyyacN9q3nc5/ecA==} - '@volar/source-map@2.4.11': - resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==} + '@volar/source-map@2.4.17': + resolution: {integrity: sha512-QDybtQyO3Ms/NjFqNHTC5tbDN2oK5VH7ZaKrcubtfHBDj63n2pizHC3wlMQ+iT55kQXZUUAbmBX5L1C8CHFeBw==} - '@volar/typescript@2.4.11': - resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==} + '@volar/typescript@2.4.17': + resolution: {integrity: sha512-3paEFNh4P5DkgNUB2YkTRrfUekN4brAXxd3Ow1syMqdIPtCZHbUy4AW99S5RO/7mzyTWPMdDSo3mqTpB/LPObQ==} - '@vue/compiler-core@3.5.13': - resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.17': + resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} - '@vue/compiler-dom@3.5.13': - resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + '@vue/compiler-dom@3.5.17': + resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} - '@vue/compiler-sfc@3.5.13': - resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + '@vue/compiler-sfc@3.5.17': + resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} - '@vue/compiler-ssr@3.5.13': - resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + '@vue/compiler-ssr@3.5.17': + resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} - '@vue/devtools-api@7.7.1': - resolution: {integrity: sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==} + '@vue/devtools-api@7.7.2': + resolution: {integrity: sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==} - '@vue/devtools-kit@7.7.1': - resolution: {integrity: sha512-yhZ4NPnK/tmxGtLNQxmll90jIIXdb2jAhPF76anvn5M/UkZCiLJy28bYgPIACKZ7FCosyKoaope89/RsFJll1w==} + '@vue/devtools-kit@7.7.2': + resolution: {integrity: sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==} - '@vue/devtools-shared@7.7.1': - resolution: {integrity: sha512-BtgF7kHq4BHG23Lezc/3W2UhK2ga7a8ohAIAGJMBr4BkxUFzhqntQtCiuL1ijo2ztWnmusymkirgqUrXoQKumA==} + '@vue/devtools-shared@7.7.2': + resolution: {integrity: sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==} - '@vue/language-core@2.2.2': - resolution: {integrity: sha512-QotO41kurE5PLf3vrNgGTk3QswO2PdUFjBwNiOi7zMmGhwb25PSTh9hD1MCgKC06AVv+8sZQvlL3Do4TTVHSiQ==} + '@vue/language-core@3.0.1': + resolution: {integrity: sha512-sq+/Mc1IqIexWEQ+Q2XPiDb5SxSvY5JPqHnMOl/PlF5BekslzduX8dglSkpC17VeiAQB6dpS+4aiwNLJRduCNw==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@vue/reactivity@3.5.13': - resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + '@vue/reactivity@3.5.17': + resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} - '@vue/runtime-core@3.5.13': - resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + '@vue/runtime-core@3.5.17': + resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} - '@vue/runtime-dom@3.5.13': - resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + '@vue/runtime-dom@3.5.17': + resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} - '@vue/server-renderer@3.5.13': - resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + '@vue/server-renderer@3.5.17': + resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} peerDependencies: - vue: 3.5.13 + vue: 3.5.17 '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} - '@vueuse/core@12.5.0': - resolution: {integrity: sha512-GVyH1iYqNANwcahAx8JBm6awaNgvR/SwZ1fjr10b8l1HIgDp82ngNbfzJUgOgWEoxjL+URAggnlilAEXwCOZtg==} + '@vue/shared@3.5.17': + resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} - '@vueuse/integrations@12.5.0': - resolution: {integrity: sha512-HYLt8M6mjUfcoUOzyBcX2RjpfapIwHPBmQJtTmXOQW845Y/Osu9VuTJ5kPvnmWJ6IUa05WpblfOwZ+P0G4iZsQ==} + '@vueuse/core@12.8.2': + resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} + + '@vueuse/integrations@12.8.2': + resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} peerDependencies: async-validator: ^4 axios: ^1 @@ -837,18 +863,29 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@12.5.0': - resolution: {integrity: sha512-Ui7Lo2a7AxrMAXRF+fAp9QsXuwTeeZ8fIB9wsLHqzq9MQk+2gMYE2IGJW48VMJ8ecvCB3z3GsGLKLbSasQ5Qlg==} + '@vueuse/metadata@12.8.2': + resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} - '@vueuse/shared@12.5.0': - resolution: {integrity: sha512-vMpcL1lStUU6O+kdj6YdHDixh0odjPAUM15uJ9f7MY781jcYkIwFA4iv2EfoIPO6vBmvutI1HxxAwmf0cx5ISQ==} + '@vueuse/shared@12.8.2': + resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} - algoliasearch@5.20.0: - resolution: {integrity: sha512-groO71Fvi5SWpxjI9Ia+chy0QBwT61mg6yxJV27f5YFf+Mw+STT75K6SHySpP8Co5LsCrtsbCH5dJZSRtkSKaQ==} + algoliasearch@5.23.4: + resolution: {integrity: sha512-QzAKFHl3fm53s44VHrTdEo0TkpL3XVUYQpnZy1r6/EHvMAyIg+O4hwprzlsNmcCHTNyVcF2S13DAUn7XhkC6qg==} engines: {node: '>= 14.0.0'} - alien-signals@1.0.3: - resolution: {integrity: sha512-zQOh3wAYK5ujENxvBBR3CFGF/b6afaSzZ/c9yNhJ1ENrGHETvpUuKQsa93Qrclp0+PzTF93MaZ7scVp1uUozhA==} + alien-signals@2.0.5: + resolution: {integrity: sha512-PdJB6+06nUNAClInE3Dweq7/2xVAYM64vvvS1IHVHSJmgeOtEdrAGyp7Z2oJtYm0B342/Exd2NT0uMJaThcjLQ==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -856,14 +893,20 @@ packages: ast-grep-wasm@file:pkg: resolution: {directory: pkg, type: directory} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} birpc@0.2.19: resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + byte-size@9.0.1: + resolution: {integrity: sha512-YLe9x3rabBrcI0cueCdLS2l5ONUKywcRpTs02B8KP9/Cimhj7o3ZccGrPnRvcbyHMbb7W79/3MUJl7iGgTXKEw==} + engines: {node: '>=12.17'} + peerDependencies: + '@75lb/nature': latest + peerDependenciesMeta: + '@75lb/nature': + optional: true ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -874,6 +917,20 @@ packages: character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -887,16 +944,39 @@ packages: de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dprint@0.50.1: + resolution: {integrity: sha512-s+kUyQp2rGpwsM3vVmXySOY3v1NjYyRpKfQZdP4rfNTz6zQuICSO6nqIXNm3YdK1MwNFR/EXSFMuE1YPuulhow==} + hasBin: true + emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -906,27 +986,70 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + esbuild@0.25.2: + resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + esm-env@1.2.2: resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + focus-trap@7.6.4: resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==} + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - hast-util-to-html@9.0.4: - resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} @@ -941,22 +1064,109 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} @@ -965,33 +1175,107 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true + markdown-title@1.0.2: + resolution: {integrity: sha512-MqIQVVkz+uGEHi3TsHx/czcxxCbRIL7sv5K5DnYw/tI+apY54IbPefV/cmgxp6LoJSEx/TqcHdLs/298afG5QQ==} + engines: {node: '>=6'} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - minisearch@7.1.1: - resolution: {integrity: sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + millify@6.1.0: + resolution: {integrity: sha512-H/E3J6t+DQs/F2YgfDhxUVZz/dF8JXPPKTLHL/yHCcLZLtCXJDUaqvhJXQwqOVBvbyNn4T0WjLpIHd7PAw7fBA==} + hasBin: true + + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + + minisearch@7.1.2: + resolution: {integrity: sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==} mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} @@ -1002,10 +1286,8 @@ packages: monaco-languageserver-types@0.4.0: resolution: {integrity: sha512-QQ3BZiU5LYkJElGncSNb5AKoJ/LCs6YBMCJMAz9EA7v+JaOdn3kx2cXpPTcZfKA5AEsR0vc97sAw+5mdNhVBmw==} - monaco-marker-data-provider@1.1.1: - resolution: {integrity: sha512-PGB7TJSZE5tmHzkxv/OEwK2RGNC2A7dcq4JRJnnj31CUAsfmw0Gl+1QTrH0W0deKhcQmQM0YVPaqgQ+0wCt8Mg==} - peerDependencies: - monaco-editor: '>=0.30.0' + monaco-marker-data-provider@1.2.4: + resolution: {integrity: sha512-4DsPgsAqpTyUDs3humXRBPUJoihTv+L6v9aupQWD80X2YXaCXUd11mWYeSCYHuPgdUmjFaNWCEOjQ6ewf/QA1Q==} monaco-types@0.1.0: resolution: {integrity: sha512-aWK7SN9hAqNYi0WosPoMjenMeXJjwCxDibOqWffyQ/qXdzB/86xshGQobRferfmNz7BSNQ8GB0MD0oby9/5fTQ==} @@ -1015,89 +1297,111 @@ packages: peerDependencies: monaco-editor: '>=0.30.0' - monaco-yaml@5.3.1: - resolution: {integrity: sha512-1MN8i1Tnc8d8RugQGqv5jp+Ce2xtNhrnbm0ZZbe5ceExj9C2PkKZfHJhY9kbdUS4G7xSVwKlVdMTmLlStepOtw==} + monaco-yaml@5.4.0: + resolution: {integrity: sha512-tuBVDy1KAPrgO905GHTItu8AaA5bIzF5S4X0JVRAE/D66FpRhkDUk7tKi5bwKMVTTugtpMLsXN4ewh4CgE/FtQ==} peerDependencies: monaco-editor: '>=0.36' + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + number-flow@0.5.8: + resolution: {integrity: sha512-FPr1DumWyGi5Nucoug14bC6xEz70A1TnhgSHhKyfqjgji2SOTz+iLJxKtv37N5JyJbteGYCm6NQ9p1O4KZ7iiA==} - number-flow@0.5.3: - resolution: {integrity: sha512-iLKyssImNWQmJ41rza9K7P5lHRZTyishi/9FarWPLQHYY2Ydtl6eiXINEjZ1fa8dHeY0O7+YOD+Py3ZsJddYkg==} + oniguruma-to-es@3.1.1: + resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} - oniguruma-to-es@2.3.0: - resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} + oxlint@1.7.0: + resolution: {integrity: sha512-krJN1fIRhs3xK1FyVyPtYIV9tkT4WDoIwI7eiMEKBuCjxqjQt5ZemQm1htPvHqNDOaWFRFt4btcwFdU8bbwgvA==} + engines: {node: '>=8.*'} + hasBin: true path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} - engines: {node: ^10 || ^12 || >=14} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} - postcss@8.5.1: - resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - preact@10.11.3: - resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} + preact@10.26.5: + resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} hasBin: true - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} - regex-recursion@5.1.1: - resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - regex@5.1.1: - resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.28.0: - resolution: {integrity: sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - rollup@4.34.6: - resolution: {integrity: sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==} + rollup@4.41.1: + resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true search-insights@2.17.3: resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} - shiki@2.1.0: - resolution: {integrity: sha512-yvKPdNGLXZv7WC4bl7JBbU3CEcUxnBanvMez8MG3gZXKpClGL4bHqFyLhTx+2zUvbjClUANs/S22HXb7aeOgmA==} + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + shiki@2.5.0: + resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} @@ -1110,37 +1414,64 @@ packages: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} engines: {node: '>=0.10.0'} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - superjson@2.2.1: - resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tokenx@1.1.0: + resolution: {integrity: sha512-KCjtiC2niPwTSuz4ktM82Ki5bjqBwYpssiHDsGr5BpejN/B3ksacRvrsdoxljdMIh2nCX78alnDkeemBmYUmTA==} trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} @@ -1156,8 +1487,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@5.4.14: - resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -1187,19 +1518,19 @@ packages: terser: optional: true - vite@6.1.0: - resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@7.0.2: + resolution: {integrity: sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' - less: '*' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -1227,6 +1558,9 @@ packages: yaml: optional: true + vitepress-plugin-llms@1.7.0: + resolution: {integrity: sha512-J4va/lPTBcrlV5RXmuML8Lg1nzRR8cB1nJszqjITtayOrliR1jDbho31nkzJCdU/SmwdR7PFVQDRwwOTEDdoHA==} + vitepress@1.6.3: resolution: {integrity: sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==} hasBin: true @@ -1239,197 +1573,210 @@ packages: postcss: optional: true - vscode-jsonrpc@8.1.0: - resolution: {integrity: sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==} + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} engines: {node: '>=14.0.0'} - vscode-languageserver-protocol@3.17.3: - resolution: {integrity: sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==} + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} - vscode-languageserver-textdocument@1.0.8: - resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==} + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} - vscode-languageserver-types@3.17.3: - resolution: {integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==} + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} - vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - vue-tsc@2.2.2: - resolution: {integrity: sha512-1icPKkxAA5KTAaSwg0wVWdE48EdsH8fgvcbAiqojP4jXKl6LEM3soiW1aG/zrWrFt8Mw1ncG2vG1PvpZpVfehA==} + vue-tsc@3.0.1: + resolution: {integrity: sha512-UvMLQD0hAGL1g/NfEQelnSVB4H5gtf/gz2lJKjMMwWNOUmSNyWkejwJagAxEbSjtV5CPPJYslOtoSuqJ63mhdg==} hasBin: true peerDependencies: typescript: '>=5.0.0' - vue@3.5.13: - resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + vue@3.5.17: + resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - web-tree-sitter-sg@0.22.2: - resolution: {integrity: sha512-44N4PXnTc48KcCvZf71ChgeRCnIIQ7FbktO1/674swkJnSUsJZdnlCMrZKZBOe1FchjAePLc4KkxN7ITD/TX1A==} + web-tree-sitter@0.25.3: + resolution: {integrity: sha512-e0hdXG+nJ18Zd/QJFhSx0DNTSMz7miwUjKyJ/lglTnZo6ke08++BQzXkaeaqnGJFi9qq+nPJg2L8hYAjduToHQ==} - web-tree-sitter@0.22.6: - resolution: {integrity: sha512-hS87TH71Zd6mGAmYCvlgxeGDjqd9GTeqXNqTT+u0Gs51uIozNIaaq/kUAbV/Zf56jb2ZOyG8BxZs2GG9wbLi6Q==} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} - yaml@2.2.1: - resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.20.0)(search-insights@2.17.3)': + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.23.4)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.20.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.20.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.23.4)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.23.4) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.20.0)(search-insights@2.17.3)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.23.4)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.20.0) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.23.4) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.20.0)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.23.4)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.20.0) - '@algolia/client-search': 5.19.0 - algoliasearch: 5.20.0 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.23.4) + '@algolia/client-search': 5.29.0 + algoliasearch: 5.23.4 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.20.0)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.23.4)': dependencies: - '@algolia/client-search': 5.19.0 - algoliasearch: 5.20.0 + '@algolia/client-search': 5.29.0 + algoliasearch: 5.23.4 - '@algolia/client-abtesting@5.20.0': + '@algolia/client-abtesting@5.23.4': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 - '@algolia/client-analytics@5.20.0': + '@algolia/client-analytics@5.23.4': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 - '@algolia/client-common@5.19.0': {} + '@algolia/client-common@5.23.4': {} - '@algolia/client-common@5.20.0': {} + '@algolia/client-common@5.29.0': {} - '@algolia/client-insights@5.20.0': + '@algolia/client-insights@5.23.4': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 - '@algolia/client-personalization@5.20.0': + '@algolia/client-personalization@5.23.4': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 - '@algolia/client-query-suggestions@5.20.0': + '@algolia/client-query-suggestions@5.23.4': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 - '@algolia/client-search@5.19.0': + '@algolia/client-search@5.23.4': dependencies: - '@algolia/client-common': 5.19.0 - '@algolia/requester-browser-xhr': 5.19.0 - '@algolia/requester-fetch': 5.19.0 - '@algolia/requester-node-http': 5.19.0 + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 - '@algolia/client-search@5.20.0': + '@algolia/client-search@5.29.0': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.29.0 + '@algolia/requester-browser-xhr': 5.29.0 + '@algolia/requester-fetch': 5.29.0 + '@algolia/requester-node-http': 5.29.0 - '@algolia/ingestion@1.20.0': + '@algolia/ingestion@1.23.4': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 - '@algolia/monitoring@1.20.0': + '@algolia/monitoring@1.23.4': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 - '@algolia/recommend@5.20.0': + '@algolia/recommend@5.23.4': dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 - '@algolia/requester-browser-xhr@5.19.0': + '@algolia/requester-browser-xhr@5.23.4': dependencies: - '@algolia/client-common': 5.19.0 + '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr@5.20.0': + '@algolia/requester-browser-xhr@5.29.0': dependencies: - '@algolia/client-common': 5.20.0 + '@algolia/client-common': 5.29.0 - '@algolia/requester-fetch@5.19.0': + '@algolia/requester-fetch@5.23.4': dependencies: - '@algolia/client-common': 5.19.0 + '@algolia/client-common': 5.23.4 - '@algolia/requester-fetch@5.20.0': + '@algolia/requester-fetch@5.29.0': dependencies: - '@algolia/client-common': 5.20.0 + '@algolia/client-common': 5.29.0 - '@algolia/requester-node-http@5.19.0': + '@algolia/requester-node-http@5.23.4': dependencies: - '@algolia/client-common': 5.19.0 + '@algolia/client-common': 5.23.4 - '@algolia/requester-node-http@5.20.0': + '@algolia/requester-node-http@5.29.0': dependencies: - '@algolia/client-common': 5.20.0 + '@algolia/client-common': 5.29.0 - '@babel/helper-string-parser@7.24.8': {} + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/parser@7.25.6': + '@babel/parser@7.27.5': dependencies: - '@babel/types': 7.25.6 + '@babel/types': 7.27.6 - '@babel/types@7.25.6': + '@babel/types@7.27.6': dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@docsearch/css@3.8.2': {} - '@docsearch/js@3.8.2(@algolia/client-search@5.19.0)(search-insights@2.17.3)': + '@docsearch/js@3.8.2(@algolia/client-search@5.29.0)(search-insights@2.17.3)': dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.19.0)(search-insights@2.17.3) - preact: 10.11.3 + '@docsearch/react': 3.8.2(@algolia/client-search@5.29.0)(search-insights@2.17.3) + preact: 10.26.5 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -1437,331 +1784,341 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.8.2(@algolia/client-search@5.19.0)(search-insights@2.17.3)': + '@docsearch/react@3.8.2(@algolia/client-search@5.29.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.20.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.20.0) + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.23.4)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.23.4) '@docsearch/css': 3.8.2 - algoliasearch: 5.20.0 + algoliasearch: 5.23.4 optionalDependencies: search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' + '@dprint/darwin-arm64@0.50.1': + optional: true + + '@dprint/darwin-x64@0.50.1': + optional: true + + '@dprint/linux-arm64-glibc@0.50.1': + optional: true + + '@dprint/linux-arm64-musl@0.50.1': + optional: true + + '@dprint/linux-riscv64-glibc@0.50.1': + optional: true + + '@dprint/linux-x64-glibc@0.50.1': + optional: true + + '@dprint/linux-x64-musl@0.50.1': + optional: true + + '@dprint/win32-arm64@0.50.1': + optional: true + + '@dprint/win32-x64@0.50.1': + optional: true + '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.24.2': + '@esbuild/aix-ppc64@0.25.2': optional: true '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.24.2': + '@esbuild/android-arm64@0.25.2': optional: true '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.24.2': + '@esbuild/android-arm@0.25.2': optional: true '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.24.2': + '@esbuild/android-x64@0.25.2': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.24.2': + '@esbuild/darwin-arm64@0.25.2': optional: true '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.24.2': + '@esbuild/darwin-x64@0.25.2': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.24.2': + '@esbuild/freebsd-arm64@0.25.2': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.24.2': + '@esbuild/freebsd-x64@0.25.2': optional: true '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.24.2': + '@esbuild/linux-arm64@0.25.2': optional: true '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.24.2': + '@esbuild/linux-arm@0.25.2': optional: true '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.24.2': + '@esbuild/linux-ia32@0.25.2': optional: true '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.24.2': + '@esbuild/linux-loong64@0.25.2': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.24.2': + '@esbuild/linux-mips64el@0.25.2': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.24.2': + '@esbuild/linux-ppc64@0.25.2': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.24.2': + '@esbuild/linux-riscv64@0.25.2': optional: true '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.24.2': + '@esbuild/linux-s390x@0.25.2': optional: true '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.24.2': + '@esbuild/linux-x64@0.25.2': optional: true - '@esbuild/netbsd-arm64@0.24.2': + '@esbuild/netbsd-arm64@0.25.2': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.24.2': + '@esbuild/netbsd-x64@0.25.2': optional: true - '@esbuild/openbsd-arm64@0.24.2': + '@esbuild/openbsd-arm64@0.25.2': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.24.2': + '@esbuild/openbsd-x64@0.25.2': optional: true '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.24.2': + '@esbuild/sunos-x64@0.25.2': optional: true '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.24.2': + '@esbuild/win32-arm64@0.25.2': optional: true '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.24.2': + '@esbuild/win32-ia32@0.25.2': optional: true '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.24.2': + '@esbuild/win32-x64@0.25.2': optional: true - '@iconify-json/simple-icons@1.2.21': + '@iconify-json/simple-icons@1.2.32': dependencies: '@iconify/types': 2.0.0 '@iconify/types@2.0.0': {} - '@jridgewell/sourcemap-codec@1.5.0': {} + '@isaacs/balanced-match@4.0.1': {} - '@number-flow/vue@0.4.3(vue@3.5.13(typescript@5.7.3))': + '@isaacs/brace-expansion@5.0.0': dependencies: - esm-env: 1.2.2 - number-flow: 0.5.3 - vue: 3.5.13(typescript@5.7.3) - - '@rollup/rollup-android-arm-eabi@4.28.0': - optional: true - - '@rollup/rollup-android-arm-eabi@4.34.6': - optional: true + '@isaacs/balanced-match': 4.0.1 - '@rollup/rollup-android-arm64@4.28.0': - optional: true - - '@rollup/rollup-android-arm64@4.34.6': - optional: true - - '@rollup/rollup-darwin-arm64@4.28.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.34.6': - optional: true - - '@rollup/rollup-darwin-x64@4.28.0': - optional: true - - '@rollup/rollup-darwin-x64@4.34.6': - optional: true + '@jridgewell/sourcemap-codec@1.5.0': {} - '@rollup/rollup-freebsd-arm64@4.28.0': - optional: true + '@number-flow/vue@0.4.8(vue@3.5.17(typescript@5.8.3))': + dependencies: + esm-env: 1.2.2 + number-flow: 0.5.8 + vue: 3.5.17(typescript@5.8.3) - '@rollup/rollup-freebsd-arm64@4.34.6': + '@oxlint/darwin-arm64@1.7.0': optional: true - '@rollup/rollup-freebsd-x64@4.28.0': + '@oxlint/darwin-x64@1.7.0': optional: true - '@rollup/rollup-freebsd-x64@4.34.6': + '@oxlint/linux-arm64-gnu@1.7.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.28.0': + '@oxlint/linux-arm64-musl@1.7.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + '@oxlint/linux-x64-gnu@1.7.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.28.0': + '@oxlint/linux-x64-musl@1.7.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.34.6': + '@oxlint/win32-arm64@1.7.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.28.0': + '@oxlint/win32-x64@1.7.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.6': + '@rollup/rollup-android-arm-eabi@4.41.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.28.0': + '@rollup/rollup-android-arm64@4.41.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.34.6': + '@rollup/rollup-darwin-arm64@4.41.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + '@rollup/rollup-darwin-x64@4.41.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': + '@rollup/rollup-freebsd-arm64@4.41.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + '@rollup/rollup-freebsd-x64@4.41.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.28.0': + '@rollup/rollup-linux-arm-gnueabihf@4.41.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.6': + '@rollup/rollup-linux-arm-musleabihf@4.41.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.28.0': + '@rollup/rollup-linux-arm64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.34.6': + '@rollup/rollup-linux-arm64-musl@4.41.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.28.0': + '@rollup/rollup-linux-loongarch64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.34.6': + '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': optional: true - '@rollup/rollup-linux-x64-musl@4.28.0': + '@rollup/rollup-linux-riscv64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-x64-musl@4.34.6': + '@rollup/rollup-linux-riscv64-musl@4.41.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.28.0': + '@rollup/rollup-linux-s390x-gnu@4.41.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.6': + '@rollup/rollup-linux-x64-gnu@4.41.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.28.0': + '@rollup/rollup-linux-x64-musl@4.41.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.6': + '@rollup/rollup-win32-arm64-msvc@4.41.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.28.0': + '@rollup/rollup-win32-ia32-msvc@4.41.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.6': + '@rollup/rollup-win32-x64-msvc@4.41.1': optional: true - '@shikijs/core@2.1.0': + '@shikijs/core@2.5.0': dependencies: - '@shikijs/engine-javascript': 2.1.0 - '@shikijs/engine-oniguruma': 2.1.0 - '@shikijs/types': 2.1.0 - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - hast-util-to-html: 9.0.4 + hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@2.1.0': + '@shikijs/engine-javascript@2.5.0': dependencies: - '@shikijs/types': 2.1.0 - '@shikijs/vscode-textmate': 10.0.1 - oniguruma-to-es: 2.3.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 3.1.1 - '@shikijs/engine-oniguruma@2.1.0': + '@shikijs/engine-oniguruma@2.5.0': dependencies: - '@shikijs/types': 2.1.0 - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@2.1.0': + '@shikijs/langs@2.5.0': dependencies: - '@shikijs/types': 2.1.0 + '@shikijs/types': 2.5.0 - '@shikijs/themes@2.1.0': + '@shikijs/themes@2.5.0': dependencies: - '@shikijs/types': 2.1.0 + '@shikijs/types': 2.5.0 - '@shikijs/transformers@2.1.0': + '@shikijs/transformers@2.5.0': dependencies: - '@shikijs/core': 2.1.0 - '@shikijs/types': 2.1.0 + '@shikijs/core': 2.5.0 + '@shikijs/types': 2.5.0 - '@shikijs/types@2.1.0': + '@shikijs/types@2.5.0': dependencies: - '@shikijs/vscode-textmate': 10.0.1 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@10.0.1': {} + '@shikijs/vscode-textmate@10.0.2': {} - '@types/estree@1.0.6': {} + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@1.0.7': {} '@types/hast@3.0.4': dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 '@types/js-yaml@4.0.9': {} @@ -1774,182 +2131,194 @@ snapshots: '@types/mdast@4.0.4': dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 '@types/mdurl@2.0.0': {} - '@types/unist@3.0.2': {} + '@types/ms@2.1.0': {} - '@types/web-bluetooth@0.0.20': {} + '@types/unist@3.0.3': {} - '@ungap/structured-clone@1.2.0': {} + '@types/web-bluetooth@0.0.21': {} - '@vitejs/plugin-vue@5.2.1(vite@5.4.14)(vue@3.5.13(typescript@5.7.3))': + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-vue@5.2.3(vite@5.4.19(lightningcss@1.30.1))(vue@3.5.17(typescript@5.8.3))': dependencies: - vite: 5.4.14 - vue: 3.5.13(typescript@5.7.3) + vite: 5.4.19(lightningcss@1.30.1) + vue: 3.5.17(typescript@5.8.3) - '@volar/language-core@2.4.11': + '@volar/language-core@2.4.17': dependencies: - '@volar/source-map': 2.4.11 + '@volar/source-map': 2.4.17 - '@volar/source-map@2.4.11': {} + '@volar/source-map@2.4.17': {} - '@volar/typescript@2.4.11': + '@volar/typescript@2.4.17': dependencies: - '@volar/language-core': 2.4.11 + '@volar/language-core': 2.4.17 path-browserify: 1.0.1 - vscode-uri: 3.0.8 + vscode-uri: 3.1.0 - '@vue/compiler-core@3.5.13': + '@vue/compiler-core@3.5.17': dependencies: - '@babel/parser': 7.25.6 - '@vue/shared': 3.5.13 + '@babel/parser': 7.27.5 + '@vue/shared': 3.5.17 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.13': + '@vue/compiler-dom@3.5.17': dependencies: - '@vue/compiler-core': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-core': 3.5.17 + '@vue/shared': 3.5.17 - '@vue/compiler-sfc@3.5.13': + '@vue/compiler-sfc@3.5.17': dependencies: - '@babel/parser': 7.25.6 - '@vue/compiler-core': 3.5.13 - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 + '@babel/parser': 7.27.5 + '@vue/compiler-core': 3.5.17 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-ssr': 3.5.17 + '@vue/shared': 3.5.17 estree-walker: 2.0.2 - magic-string: 0.30.11 - postcss: 8.4.49 + magic-string: 0.30.17 + postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.13': + '@vue/compiler-ssr@3.5.17': dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-dom': 3.5.17 + '@vue/shared': 3.5.17 '@vue/compiler-vue2@2.7.16': dependencies: de-indent: 1.0.2 he: 1.2.0 - '@vue/devtools-api@7.7.1': + '@vue/devtools-api@7.7.2': dependencies: - '@vue/devtools-kit': 7.7.1 + '@vue/devtools-kit': 7.7.2 - '@vue/devtools-kit@7.7.1': + '@vue/devtools-kit@7.7.2': dependencies: - '@vue/devtools-shared': 7.7.1 + '@vue/devtools-shared': 7.7.2 birpc: 0.2.19 hookable: 5.5.3 mitt: 3.0.1 perfect-debounce: 1.0.0 speakingurl: 14.0.1 - superjson: 2.2.1 + superjson: 2.2.2 - '@vue/devtools-shared@7.7.1': + '@vue/devtools-shared@7.7.2': dependencies: rfdc: 1.4.1 - '@vue/language-core@2.2.2(typescript@5.7.3)': + '@vue/language-core@3.0.1(typescript@5.8.3)': dependencies: - '@volar/language-core': 2.4.11 - '@vue/compiler-dom': 3.5.13 + '@volar/language-core': 2.4.17 + '@vue/compiler-dom': 3.5.17 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.13 - alien-signals: 1.0.3 - minimatch: 9.0.3 + '@vue/shared': 3.5.17 + alien-signals: 2.0.5 + minimatch: 10.0.3 muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 - '@vue/reactivity@3.5.13': + '@vue/reactivity@3.5.17': dependencies: - '@vue/shared': 3.5.13 + '@vue/shared': 3.5.17 - '@vue/runtime-core@3.5.13': + '@vue/runtime-core@3.5.17': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.17 + '@vue/shared': 3.5.17 - '@vue/runtime-dom@3.5.13': + '@vue/runtime-dom@3.5.17': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/runtime-core': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.17 + '@vue/runtime-core': 3.5.17 + '@vue/shared': 3.5.17 csstype: 3.1.3 - '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))': + '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3))': dependencies: - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 - vue: 3.5.13(typescript@5.7.3) + '@vue/compiler-ssr': 3.5.17 + '@vue/shared': 3.5.17 + vue: 3.5.17(typescript@5.8.3) '@vue/shared@3.5.13': {} - '@vueuse/core@12.5.0(typescript@5.7.3)': + '@vue/shared@3.5.17': {} + + '@vueuse/core@12.8.2(typescript@5.8.3)': dependencies: - '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 12.5.0 - '@vueuse/shared': 12.5.0(typescript@5.7.3) - vue: 3.5.13(typescript@5.7.3) + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 12.8.2 + '@vueuse/shared': 12.8.2(typescript@5.8.3) + vue: 3.5.17(typescript@5.8.3) transitivePeerDependencies: - typescript - '@vueuse/integrations@12.5.0(focus-trap@7.6.4)(typescript@5.7.3)': + '@vueuse/integrations@12.8.2(focus-trap@7.6.4)(typescript@5.8.3)': dependencies: - '@vueuse/core': 12.5.0(typescript@5.7.3) - '@vueuse/shared': 12.5.0(typescript@5.7.3) - vue: 3.5.13(typescript@5.7.3) + '@vueuse/core': 12.8.2(typescript@5.8.3) + '@vueuse/shared': 12.8.2(typescript@5.8.3) + vue: 3.5.17(typescript@5.8.3) optionalDependencies: focus-trap: 7.6.4 transitivePeerDependencies: - typescript - '@vueuse/metadata@12.5.0': {} + '@vueuse/metadata@12.8.2': {} - '@vueuse/shared@12.5.0(typescript@5.7.3)': + '@vueuse/shared@12.8.2(typescript@5.8.3)': dependencies: - vue: 3.5.13(typescript@5.7.3) + vue: 3.5.17(typescript@5.8.3) transitivePeerDependencies: - typescript - algoliasearch@5.20.0: + algoliasearch@5.23.4: + dependencies: + '@algolia/client-abtesting': 5.23.4 + '@algolia/client-analytics': 5.23.4 + '@algolia/client-common': 5.23.4 + '@algolia/client-insights': 5.23.4 + '@algolia/client-personalization': 5.23.4 + '@algolia/client-query-suggestions': 5.23.4 + '@algolia/client-search': 5.23.4 + '@algolia/ingestion': 1.23.4 + '@algolia/monitoring': 1.23.4 + '@algolia/recommend': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 + + alien-signals@2.0.5: {} + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: dependencies: - '@algolia/client-abtesting': 5.20.0 - '@algolia/client-analytics': 5.20.0 - '@algolia/client-common': 5.20.0 - '@algolia/client-insights': 5.20.0 - '@algolia/client-personalization': 5.20.0 - '@algolia/client-query-suggestions': 5.20.0 - '@algolia/client-search': 5.20.0 - '@algolia/ingestion': 1.20.0 - '@algolia/monitoring': 1.20.0 - '@algolia/recommend': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 + color-convert: 2.0.1 - alien-signals@1.0.3: {} + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 argparse@2.0.1: {} ast-grep-wasm@file:pkg: dependencies: - web-tree-sitter-sg: 0.22.2 + web-tree-sitter: 0.25.3 optional: true - balanced-match@1.0.2: {} + bail@2.0.2: {} birpc@0.2.19: {} - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 + byte-size@9.0.1: {} ccount@2.0.1: {} @@ -1957,6 +2326,20 @@ snapshots: character-entities-legacy@3.0.0: {} + character-entities@2.0.2: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + comma-separated-tokens@2.0.3: {} copy-anything@3.0.5: @@ -1967,14 +2350,39 @@ snapshots: de-indent@1.0.2: {} + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.1.0: + dependencies: + character-entities: 2.0.2 + dequal@2.0.3: {} + detect-libc@2.0.4: + optional: true + devlop@1.1.0: dependencies: dequal: 2.0.3 + dprint@0.50.1: + optionalDependencies: + '@dprint/darwin-arm64': 0.50.1 + '@dprint/darwin-x64': 0.50.1 + '@dprint/linux-arm64-glibc': 0.50.1 + '@dprint/linux-arm64-musl': 0.50.1 + '@dprint/linux-riscv64-glibc': 0.50.1 + '@dprint/linux-x64-glibc': 0.50.1 + '@dprint/linux-x64-musl': 0.50.1 + '@dprint/win32-arm64': 0.50.1 + '@dprint/win32-x64': 0.50.1 + emoji-regex-xs@1.0.0: {} + emoji-regex@8.0.0: {} + entities@4.5.0: {} esbuild@0.21.5: @@ -2003,55 +2411,86 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.24.2: + esbuild@0.25.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 + '@esbuild/aix-ppc64': 0.25.2 + '@esbuild/android-arm': 0.25.2 + '@esbuild/android-arm64': 0.25.2 + '@esbuild/android-x64': 0.25.2 + '@esbuild/darwin-arm64': 0.25.2 + '@esbuild/darwin-x64': 0.25.2 + '@esbuild/freebsd-arm64': 0.25.2 + '@esbuild/freebsd-x64': 0.25.2 + '@esbuild/linux-arm': 0.25.2 + '@esbuild/linux-arm64': 0.25.2 + '@esbuild/linux-ia32': 0.25.2 + '@esbuild/linux-loong64': 0.25.2 + '@esbuild/linux-mips64el': 0.25.2 + '@esbuild/linux-ppc64': 0.25.2 + '@esbuild/linux-riscv64': 0.25.2 + '@esbuild/linux-s390x': 0.25.2 + '@esbuild/linux-x64': 0.25.2 + '@esbuild/netbsd-arm64': 0.25.2 + '@esbuild/netbsd-x64': 0.25.2 + '@esbuild/openbsd-arm64': 0.25.2 + '@esbuild/openbsd-x64': 0.25.2 + '@esbuild/sunos-x64': 0.25.2 + '@esbuild/win32-arm64': 0.25.2 + '@esbuild/win32-ia32': 0.25.2 + '@esbuild/win32-x64': 0.25.2 + + escalade@3.2.0: {} + + escape-string-regexp@5.0.0: {} esm-env@1.2.2: {} + esprima@4.0.1: {} + estree-walker@2.0.2: {} + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + fault@2.0.1: + dependencies: + format: 0.2.2 + + fdir@6.4.6(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + focus-trap@7.6.4: dependencies: tabbable: 6.2.0 + format@0.2.2: {} + fsevents@2.3.3: optional: true - hast-util-to-html@9.0.4: + get-caller-file@2.0.5: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 ccount: 2.0.1 comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - property-information: 6.5.0 + property-information: 7.0.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 @@ -2066,19 +2505,80 @@ snapshots: html-void-elements@3.0.0: {} + is-extendable@0.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-plain-obj@4.1.0: {} + is-what@4.1.16: {} + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsonc-parser@3.2.0: {} + jsonc-parser@3.3.1: {} + + kind-of@6.0.3: {} + + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + optional: true linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 - magic-string@0.30.11: + longest-streak@3.1.0: {} + + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -2093,42 +2593,220 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 + markdown-title@1.0.2: {} + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + mdast-util-to-hast@13.2.0: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 + micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 vfile: 6.0.3 + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdurl@2.0.0: {} - micromark-util-character@2.1.0: + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-encode@2.0.0: {} + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} - micromark-util-sanitize-uri@2.0.0: + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-symbol@2.0.0: {} + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 - micromark-util-types@2.0.0: {} + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - minimatch@9.0.3: + micromark-util-subtokenize@2.1.0: dependencies: - brace-expansion: 2.0.1 + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} - minisearch@7.1.1: {} + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + millify@6.1.0: + dependencies: + yargs: 17.7.2 + + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minisearch@7.1.2: {} mitt@3.0.1: {} @@ -2137,12 +2815,12 @@ snapshots: monaco-languageserver-types@0.4.0: dependencies: monaco-types: 0.1.0 - vscode-languageserver-protocol: 3.17.3 - vscode-uri: 3.0.8 + vscode-languageserver-protocol: 3.17.5 + vscode-uri: 3.1.0 - monaco-marker-data-provider@1.1.1(monaco-editor@0.52.2): + monaco-marker-data-provider@1.2.4: dependencies: - monaco-editor: 0.52.2 + monaco-types: 0.1.0 monaco-types@0.1.0: {} @@ -2150,136 +2828,161 @@ snapshots: dependencies: monaco-editor: 0.52.2 - monaco-yaml@5.3.1(monaco-editor@0.52.2): + monaco-yaml@5.4.0(monaco-editor@0.52.2): dependencies: - jsonc-parser: 3.2.0 + jsonc-parser: 3.3.1 monaco-editor: 0.52.2 monaco-languageserver-types: 0.4.0 - monaco-marker-data-provider: 1.1.1(monaco-editor@0.52.2) + monaco-marker-data-provider: 1.2.4 monaco-types: 0.1.0 monaco-worker-manager: 2.0.1(monaco-editor@0.52.2) path-browserify: 1.0.1 - prettier: 3.4.2 - vscode-languageserver-textdocument: 1.0.8 - vscode-languageserver-types: 3.17.3 - vscode-uri: 3.0.8 - yaml: 2.2.1 + prettier: 3.5.3 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + yaml: 2.7.1 - muggle-string@0.4.1: {} + ms@2.1.3: {} - nanoid@3.3.7: {} + muggle-string@0.4.1: {} - nanoid@3.3.8: {} + nanoid@3.3.11: {} - number-flow@0.5.3: + number-flow@0.5.8: dependencies: esm-env: 1.2.2 - oniguruma-to-es@2.3.0: + oniguruma-to-es@3.1.1: dependencies: emoji-regex-xs: 1.0.0 - regex: 5.1.1 - regex-recursion: 5.1.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + + oxlint@1.7.0: + optionalDependencies: + '@oxlint/darwin-arm64': 1.7.0 + '@oxlint/darwin-x64': 1.7.0 + '@oxlint/linux-arm64-gnu': 1.7.0 + '@oxlint/linux-arm64-musl': 1.7.0 + '@oxlint/linux-x64-gnu': 1.7.0 + '@oxlint/linux-x64-musl': 1.7.0 + '@oxlint/win32-arm64': 1.7.0 + '@oxlint/win32-x64': 1.7.0 path-browserify@1.0.1: {} + path-to-regexp@8.2.0: {} + perfect-debounce@1.0.0: {} picocolors@1.1.1: {} - postcss@8.4.49: - dependencies: - nanoid: 3.3.7 - picocolors: 1.1.1 - source-map-js: 1.2.1 + picomatch@4.0.2: {} - postcss@8.5.1: + postcss@8.5.6: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.11.3: {} + preact@10.26.5: {} - prettier@3.4.2: {} + prettier@3.5.3: {} - property-information@6.5.0: {} + property-information@7.0.0: {} punycode.js@2.3.1: {} - regex-recursion@5.1.1: + regex-recursion@6.0.2: dependencies: - regex: 5.1.1 regex-utilities: 2.3.0 regex-utilities@2.3.0: {} - regex@5.1.1: + regex@6.0.1: dependencies: regex-utilities: 2.3.0 - rfdc@1.4.1: {} + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color - rollup@4.28.0: + remark-parse@11.0.0: dependencies: - '@types/estree': 1.0.6 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.28.0 - '@rollup/rollup-android-arm64': 4.28.0 - '@rollup/rollup-darwin-arm64': 4.28.0 - '@rollup/rollup-darwin-x64': 4.28.0 - '@rollup/rollup-freebsd-arm64': 4.28.0 - '@rollup/rollup-freebsd-x64': 4.28.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.28.0 - '@rollup/rollup-linux-arm-musleabihf': 4.28.0 - '@rollup/rollup-linux-arm64-gnu': 4.28.0 - '@rollup/rollup-linux-arm64-musl': 4.28.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.28.0 - '@rollup/rollup-linux-riscv64-gnu': 4.28.0 - '@rollup/rollup-linux-s390x-gnu': 4.28.0 - '@rollup/rollup-linux-x64-gnu': 4.28.0 - '@rollup/rollup-linux-x64-musl': 4.28.0 - '@rollup/rollup-win32-arm64-msvc': 4.28.0 - '@rollup/rollup-win32-ia32-msvc': 4.28.0 - '@rollup/rollup-win32-x64-msvc': 4.28.0 - fsevents: 2.3.3 + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color - rollup@4.34.6: + remark-stringify@11.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + require-directory@2.1.1: {} + + rfdc@1.4.1: {} + + rollup@4.41.1: + dependencies: + '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.6 - '@rollup/rollup-android-arm64': 4.34.6 - '@rollup/rollup-darwin-arm64': 4.34.6 - '@rollup/rollup-darwin-x64': 4.34.6 - '@rollup/rollup-freebsd-arm64': 4.34.6 - '@rollup/rollup-freebsd-x64': 4.34.6 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.6 - '@rollup/rollup-linux-arm-musleabihf': 4.34.6 - '@rollup/rollup-linux-arm64-gnu': 4.34.6 - '@rollup/rollup-linux-arm64-musl': 4.34.6 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.6 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.6 - '@rollup/rollup-linux-riscv64-gnu': 4.34.6 - '@rollup/rollup-linux-s390x-gnu': 4.34.6 - '@rollup/rollup-linux-x64-gnu': 4.34.6 - '@rollup/rollup-linux-x64-musl': 4.34.6 - '@rollup/rollup-win32-arm64-msvc': 4.34.6 - '@rollup/rollup-win32-ia32-msvc': 4.34.6 - '@rollup/rollup-win32-x64-msvc': 4.34.6 + '@rollup/rollup-android-arm-eabi': 4.41.1 + '@rollup/rollup-android-arm64': 4.41.1 + '@rollup/rollup-darwin-arm64': 4.41.1 + '@rollup/rollup-darwin-x64': 4.41.1 + '@rollup/rollup-freebsd-arm64': 4.41.1 + '@rollup/rollup-freebsd-x64': 4.41.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.41.1 + '@rollup/rollup-linux-arm-musleabihf': 4.41.1 + '@rollup/rollup-linux-arm64-gnu': 4.41.1 + '@rollup/rollup-linux-arm64-musl': 4.41.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.41.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.41.1 + '@rollup/rollup-linux-riscv64-gnu': 4.41.1 + '@rollup/rollup-linux-riscv64-musl': 4.41.1 + '@rollup/rollup-linux-s390x-gnu': 4.41.1 + '@rollup/rollup-linux-x64-gnu': 4.41.1 + '@rollup/rollup-linux-x64-musl': 4.41.1 + '@rollup/rollup-win32-arm64-msvc': 4.41.1 + '@rollup/rollup-win32-ia32-msvc': 4.41.1 + '@rollup/rollup-win32-x64-msvc': 4.41.1 fsevents: 2.3.3 search-insights@2.17.3: {} - shiki@2.1.0: + section-matter@1.0.0: dependencies: - '@shikijs/core': 2.1.0 - '@shikijs/engine-javascript': 2.1.0 - '@shikijs/engine-oniguruma': 2.1.0 - '@shikijs/langs': 2.1.0 - '@shikijs/themes': 2.1.0 - '@shikijs/types': 2.1.0 - '@shikijs/vscode-textmate': 10.0.1 + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + shiki@2.5.0: + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/langs': 2.5.0 + '@shikijs/themes': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 source-map-js@1.2.1: {} @@ -2288,96 +2991,158 @@ snapshots: speakingurl@14.0.1: {} + sprintf-js@1.0.3: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - superjson@2.2.1: + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom-string@1.0.0: {} + + superjson@2.2.2: dependencies: copy-anything: 3.0.5 tabbable@6.2.0: {} - to-fast-properties@2.0.0: {} + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + + tokenx@1.1.0: {} trim-lines@3.0.1: {} - typescript@5.7.3: {} + trough@2.2.0: {} + + typescript@5.8.3: {} uc.micro@2.1.0: {} + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + unist-util-is@6.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-position@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 + + unist-util-remove@4.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 unist-util-stringify-position@4.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-visit-parents@6.0.1: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 vfile-message@4.0.2: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 vfile@6.0.3: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@5.4.14: + vite@5.4.19(lightningcss@1.30.1): dependencies: esbuild: 0.21.5 - postcss: 8.4.49 - rollup: 4.28.0 + postcss: 8.5.6 + rollup: 4.41.1 optionalDependencies: fsevents: 2.3.3 + lightningcss: 1.30.1 - vite@6.1.0: + vite@7.0.2(lightningcss@1.30.1)(yaml@2.7.1): dependencies: - esbuild: 0.24.2 - postcss: 8.5.1 - rollup: 4.34.6 + esbuild: 0.25.2 + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.6 + rollup: 4.41.1 + tinyglobby: 0.2.14 optionalDependencies: fsevents: 2.3.3 + lightningcss: 1.30.1 + yaml: 2.7.1 + + vitepress-plugin-llms@1.7.0: + dependencies: + byte-size: 9.0.1 + gray-matter: 4.0.3 + markdown-it: 14.1.0 + markdown-title: 1.0.2 + millify: 6.1.0 + minimatch: 10.0.3 + path-to-regexp: 8.2.0 + picocolors: 1.1.1 + remark: 15.0.1 + remark-frontmatter: 5.0.0 + tokenx: 1.1.0 + unist-util-remove: 4.0.0 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - '@75lb/nature' + - supports-color - vitepress@1.6.3(@algolia/client-search@5.19.0)(postcss@8.5.1)(search-insights@2.17.3)(typescript@5.7.3): + vitepress@1.6.3(@algolia/client-search@5.29.0)(lightningcss@1.30.1)(postcss@8.5.6)(search-insights@2.17.3)(typescript@5.8.3): dependencies: '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.19.0)(search-insights@2.17.3) - '@iconify-json/simple-icons': 1.2.21 - '@shikijs/core': 2.1.0 - '@shikijs/transformers': 2.1.0 - '@shikijs/types': 2.1.0 + '@docsearch/js': 3.8.2(@algolia/client-search@5.29.0)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.32 + '@shikijs/core': 2.5.0 + '@shikijs/transformers': 2.5.0 + '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.1(vite@5.4.14)(vue@3.5.13(typescript@5.7.3)) - '@vue/devtools-api': 7.7.1 + '@vitejs/plugin-vue': 5.2.3(vite@5.4.19(lightningcss@1.30.1))(vue@3.5.17(typescript@5.8.3)) + '@vue/devtools-api': 7.7.2 '@vue/shared': 3.5.13 - '@vueuse/core': 12.5.0(typescript@5.7.3) - '@vueuse/integrations': 12.5.0(focus-trap@7.6.4)(typescript@5.7.3) + '@vueuse/core': 12.8.2(typescript@5.8.3) + '@vueuse/integrations': 12.8.2(focus-trap@7.6.4)(typescript@5.8.3) focus-trap: 7.6.4 mark.js: 8.11.1 - minisearch: 7.1.1 - shiki: 2.1.0 - vite: 5.4.14 - vue: 3.5.13(typescript@5.7.3) + minisearch: 7.1.2 + shiki: 2.5.0 + vite: 5.4.19(lightningcss@1.30.1) + vue: 3.5.17(typescript@5.8.3) optionalDependencies: - postcss: 8.5.1 + postcss: 8.5.6 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -2405,43 +3170,58 @@ snapshots: - typescript - universal-cookie - vscode-jsonrpc@8.1.0: {} + vscode-jsonrpc@8.2.0: {} - vscode-languageserver-protocol@3.17.3: + vscode-languageserver-protocol@3.17.5: dependencies: - vscode-jsonrpc: 8.1.0 - vscode-languageserver-types: 3.17.3 + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 - vscode-languageserver-textdocument@1.0.8: {} + vscode-languageserver-textdocument@1.0.12: {} - vscode-languageserver-types@3.17.3: {} + vscode-languageserver-types@3.17.5: {} - vscode-uri@3.0.8: {} + vscode-uri@3.1.0: {} - vue-tsc@2.2.2(typescript@5.7.3): + vue-tsc@3.0.1(typescript@5.8.3): dependencies: - '@volar/typescript': 2.4.11 - '@vue/language-core': 2.2.2(typescript@5.7.3) - typescript: 5.7.3 + '@volar/typescript': 2.4.17 + '@vue/language-core': 3.0.1(typescript@5.8.3) + typescript: 5.8.3 - vue@3.5.13(typescript@5.7.3): + vue@3.5.17(typescript@5.8.3): dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-sfc': 3.5.13 - '@vue/runtime-dom': 3.5.13 - '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3)) - '@vue/shared': 3.5.13 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-sfc': 3.5.17 + '@vue/runtime-dom': 3.5.17 + '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@5.8.3)) + '@vue/shared': 3.5.17 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 - web-tree-sitter-sg@0.22.2: - dependencies: - web-tree-sitter: 0.22.6 + web-tree-sitter@0.25.3: optional: true - web-tree-sitter@0.22.6: - optional: true + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + y18n@5.0.8: {} - yaml@2.2.1: {} + yaml@2.7.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 zwitch@2.0.4: {} diff --git a/src/dump_tree.rs b/src/dump_tree.rs index 81aaf8ed..17f7091b 100644 --- a/src/dump_tree.rs +++ b/src/dump_tree.rs @@ -1,16 +1,14 @@ use serde::{Deserialize, Serialize}; -use tree_sitter as ts; -use crate::wasm_lang::WasmLang; +use crate::wasm_lang::{WasmDoc, WasmLang}; use ast_grep_core::{ - Language, Pattern, Node, StrDoc, - matcher::PatternNode + matcher::PatternNode, AstGrep, Language, Node, Pattern }; use wasm_bindgen::prelude::JsError; +use web_tree_sitter_sg::{Point, TreeCursor}; #[derive(Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct DumpNode { - id: usize, field: Option, kind: String, start: Pos, @@ -26,33 +24,31 @@ pub struct Pos { column: u32, } -impl From for Pos { - #[inline] - fn from(pt: ts::Point) -> Self { - Pos { - row: pt.row(), - column: pt.column(), +impl From for Pos { + fn from(point: Point) -> Self { + Self { + row: point.row(), + column: point.column(), } } } -pub fn dump_one_node(cursor: &mut ts::TreeCursor, target: &mut Vec) { - let node = cursor.node(); +pub fn dump_one_node(cursor: &mut TreeCursor, target: &mut Vec) { + let node = cursor.current_node(); let kind = if node.is_missing() { - format!("MISSING {}", node.kind()) + format!("MISSING {}", node.type_()) } else { - node.kind().to_string() + format!("{}", node.type_()) }; let start = node.start_position().into(); let end = node.end_position().into(); - let field = cursor.field_name().map(|c| c.to_string()); + let field = cursor.current_field_name().map(|c| format!("{}", c)); let mut children = vec![]; if cursor.goto_first_child() { dump_nodes(cursor, &mut children); cursor.goto_parent(); } target.push(DumpNode { - id: node.id(), field, kind, start, @@ -62,7 +58,7 @@ pub fn dump_one_node(cursor: &mut ts::TreeCursor, target: &mut Vec) { }) } -fn dump_nodes(cursor: &mut ts::TreeCursor, target: &mut Vec) { +fn dump_nodes(cursor: &mut TreeCursor, target: &mut Vec) { loop { dump_one_node(cursor, target); if !cursor.goto_next_sibling() { @@ -74,7 +70,8 @@ fn dump_nodes(cursor: &mut ts::TreeCursor, target: &mut Vec) { pub fn dump_pattern(query: String, selector: Option) -> Result { let lang = WasmLang::get_current(); let processed = lang.pre_process_pattern(&query); - let root = lang.ast_grep(processed); + let doc = WasmDoc::try_new(processed.to_string(), lang)?; + let root = AstGrep::doc(doc); let pattern = if let Some(sel) = selector { Pattern::contextual(&query, &sel, lang)? } else { @@ -85,12 +82,12 @@ pub fn dump_pattern(query: String, selector: Option) -> Result>, node_id: usize, pattern: &PatternNode) -> PatternTree { +fn dump_pattern_tree(node: Node, node_id: usize, pattern: &PatternNode) -> PatternTree { if node.node_id() == node_id { return dump_pattern_impl(node, pattern) } let children: Vec<_> = node.children().map(|n| dump_pattern_tree(n, node_id, pattern)).collect(); - let ts = node.get_ts_node(); + let ts = node.get_inner_node().0; let text = if children.is_empty() { Some(node.text().into()) } else { @@ -112,9 +109,9 @@ fn dump_pattern_tree(node: Node>, node_id: usize, pattern: &Pat } } -fn dump_pattern_impl(node: Node>, pattern: &PatternNode) -> PatternTree { +fn dump_pattern_impl(node: Node, pattern: &PatternNode) -> PatternTree { use PatternNode as PN; - let ts = node.get_ts_node(); + let ts = node.get_inner_node().0; let kind = if ts.is_missing() { format!("MISSING {}", node.kind()) } else { diff --git a/src/lib.rs b/src/lib.rs index 2b256720..ca97dce8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,7 +11,7 @@ use ast_grep_core::{AstGrep, Node as SgNode}; use serde_wasm_bindgen::from_value as from_js_val; use std::collections::HashMap; use std::error::Error; -use tree_sitter as ts; +use web_tree_sitter_sg::TreeSitter; use wasm_bindgen::prelude::*; type Node<'a> = SgNode<'a, WasmDoc>; @@ -21,7 +21,7 @@ static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; #[wasm_bindgen(js_name = initializeTreeSitter)] pub async fn initialize_tree_sitter() -> Result<(), JsError> { - ts::TreeSitter::init().await + TreeSitter::init().await } #[wasm_bindgen(js_name = setupParser)] @@ -38,10 +38,9 @@ pub fn find_nodes(src: String, configs: Vec) -> Result = combined.scan(&root, sets, false).matches.into_iter().map(|(rule, matches)| { + let ret: HashMap<_, _> = combined.scan(&root, false).matches.into_iter().map(|(rule, matches)| { let matches: Vec<_> = matches.into_iter().map(|m| { WasmMatch::from_match(m, rule) }).collect(); @@ -60,10 +59,9 @@ pub fn fix_errors(src: String, configs: Vec) -> Result rules.push(finder); } let combined = CombinedScan::new(rules.iter().collect()); - let doc = WasmDoc::new(src.clone(), lang); + let doc = WasmDoc::try_new(src.clone(), lang)?; let root = AstGrep::doc(doc); - let sets = combined.find(&root); - let diffs = combined.scan(&root, sets, true).diffs; + let diffs = combined.scan(&root, true).diffs; if diffs.is_empty() { return Ok(src); } @@ -75,8 +73,9 @@ pub fn fix_errors(src: String, configs: Vec) -> Result if start > range.start { continue; } - let fixer = rule.get_fixer()?.expect("rule returned by diff must have fixer"); - let edit = nm.make_edit(&rule.matcher, &fixer); + let fixers = rule.get_fixer()?; + let fixer = fixers.first().expect("rule returned by diff must have fixer"); + let edit = nm.make_edit(&rule.matcher, fixer); new_content.extend(&src[start..edit.position]); new_content.extend(&edit.inserted_text); start = edit.position + edit.deleted_length; @@ -87,7 +86,7 @@ pub fn fix_errors(src: String, configs: Vec) -> Result } fn convert_to_debug_node(n: Node) -> DumpNode { - let mut cursor = n.get_ts_node().walk(); + let mut cursor = n.get_inner_node().0.walk(); let mut target = vec![]; dump_one_node(&mut cursor, &mut target); target.pop().expect_throw("found empty node") @@ -96,7 +95,7 @@ fn convert_to_debug_node(n: Node) -> DumpNode { #[wasm_bindgen(js_name = dumpASTNodes)] pub fn dump_ast_nodes(src: String) -> Result { let lang = WasmLang::get_current(); - let doc = WasmDoc::new(src, lang); + let doc = WasmDoc::try_new(src, lang)?; let root = AstGrep::doc(doc); let debug_node = convert_to_debug_node(root.root()); let ret = serde_wasm_bindgen::to_value(&debug_node)?; diff --git a/src/utils.rs b/src/utils.rs index 9201403b..8f61685a 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -30,7 +30,7 @@ pub struct WasmNode { #[derive(Serialize, Deserialize)] pub struct WasmMatch { - pub id: usize, + pub kind: String, pub node: WasmNode, pub env: BTreeMap, pub message: String, @@ -47,12 +47,12 @@ fn get_message(rule: &RuleConfig, node: &NodeMatch) -> String { impl WasmMatch { pub fn from_match(nm: NodeMatch, rule: &RuleConfig) -> Self { let node = nm.get_node().clone(); - let id = node.node_id(); + let kind = node.kind().to_string(); let node = WasmNode::from(node); let env = nm.get_env().clone(); let env = env_to_map(env); let message = get_message(rule, &nm); - Self { node, env, message, id } + Self { node, env, message, kind } } } diff --git a/src/wasm_lang.rs b/src/wasm_lang.rs index 80278702..92903b5b 100644 --- a/src/wasm_lang.rs +++ b/src/wasm_lang.rs @@ -1,14 +1,14 @@ use std::str::FromStr; use ast_grep_core::language::Language; -use ast_grep_core::meta_var::MetaVariable; -use ast_grep_core::source::{Content, Doc, Edit, TSParseError}; -use ast_grep_language as L; +use ast_grep_core::source::{Content, Doc, Edit, SgNode}; +use ast_grep_core::matcher::{PatternBuilder, PatternError, Pattern}; +use ast_grep_core::Position; use std::borrow::Cow; use std::ops::Range; use std::sync::Mutex; -use tree_sitter as ts; -use tree_sitter::{InputEdit, Node, Parser, ParserError, Point, Tree}; +use web_tree_sitter_sg::{SyntaxNode, Parser, Point, Tree}; +use web_tree_sitter_sg as ts; use wasm_bindgen::prelude::*; use serde::{Deserialize, Deserializer, de}; @@ -25,10 +25,12 @@ pub enum WasmLang { Cpp, Elixir, Go, + Haskell, Html, Java, Json, Kotlin, + Lua, Php, Python, Ruby, @@ -66,8 +68,10 @@ impl FromStr for WasmLang { "elixir" => Elixir, "go" => Go, "html" => Html, + "haskell" => Haskell, "java" => Java, "json" => Json, + "lua" => Lua, "kotlin" => Kotlin, "php" => Php, "python" => Python, @@ -90,7 +94,13 @@ impl<'de> Deserialize<'de> for WasmLang { } } -static TS_LANG: Mutex> = Mutex::new(None); +#[derive(Clone)] +struct TsLang(ts::Language); + +unsafe impl Send for TsLang {} +unsafe impl Sync for TsLang {} + +static TS_LANG: Mutex> = Mutex::new(None); static LANG: Mutex = Mutex::new(JavaScript); impl WasmLang { @@ -105,102 +115,117 @@ impl WasmLang { pub fn get_current() -> Self { *LANG.lock().expect_throw("get language error") } + + fn get_ts_language(&self) -> ts::Language { + TS_LANG + .lock() + .expect_throw("get language error") + .clone() + .expect_throw("current language is not set") + .0 + } + } -async fn setup_parser(parser_path: &str) -> Result<(), JsError> { - let mut parser = ts::Parser::new()?; +async fn setup_parser(parser_path: &str) -> Result<(), SgWasmError> { + let parser = ts::Parser::new()?; let lang = get_lang(parser_path).await?; - parser.set_language(&lang)?; + parser.set_language(Some(&lang))?; let mut curr_lang = TS_LANG.lock().expect_throw("set language error"); - *curr_lang = Some(lang); + *curr_lang = Some(TsLang(lang)); Ok(()) } #[cfg(target_arch = "wasm32")] -async fn get_lang(parser_path: &str) -> Result { - let lang = web_tree_sitter_sg::Language::load_path(parser_path) - .await - .map_err(ts::LanguageError::from)?; - Ok(ts::Language::from(lang)) +async fn get_lang(parser_path: &str) -> Result { + let lang = ts::Language::load_path(parser_path) + .await?; + Ok(lang) } #[cfg(not(target_arch = "wasm32"))] -async fn get_lang(_path: &str) -> Result { +async fn get_lang(_path: &str) -> Result { unreachable!() } -macro_rules! execute_lang_method { - ($me: path, $method: ident, $($pname:tt),*) => { +impl Language for WasmLang { + fn expando_char(&self) -> char { use WasmLang as W; - match $me { - W::Bash => L::Bash.$method($($pname,)*), - W::C => L::C.$method($($pname,)*), - W::Cpp => L::Cpp.$method($($pname,)*), - W::CSharp => L::CSharp.$method($($pname,)*), - W::Css => L::Css.$method($($pname,)*), - W::Elixir => L::Elixir.$method($($pname,)*), - W::Go => L::Go.$method($($pname,)*), - W::Html => L::Html.$method($($pname,)*), - W::Java => L::Java.$method($($pname,)*), - W::Json => L::Json.$method($($pname,)*), - W::Kotlin => L::Kotlin.$method($($pname,)*), - W::JavaScript => L::JavaScript.$method($($pname,)*), - W::Php => L::Php.$method($($pname,)*), - W::Python => L::Python.$method($($pname,)*), - W::Ruby => L::Ruby.$method($($pname,)*), - W::Rust => L::Rust.$method($($pname,)*), - W::Scala => L::Scala.$method($($pname,)*), - W::Swift => L::Swift.$method($($pname,)*), - W::TypeScript => L::TypeScript.$method($($pname,)*), - W::Tsx => L::Tsx.$method($($pname,)*), - W::Yaml => L::Yaml.$method($($pname,)*), + match self { + W::Bash => '$', + W::C => '_', + W::Cpp => '_', + W::CSharp => 'µ', + W::Css => '_', + W::Elixir => 'µ', + W::Go => 'µ', + W::Html => 'z', + W::Java => '$', + W::JavaScript => '$', + W::Json => '$', + W::Haskell => 'µ', + W::Kotlin => 'µ', + W::Lua => '$', + W::Php => 'µ', + W::Python => 'µ', + W::Ruby => 'µ', + W::Rust => 'µ', + W::Scala => '$', + W::Swift => 'µ', + W::TypeScript => '$', + W::Tsx => '$', + W::Yaml => '$', } } -} - -macro_rules! impl_lang_method { - ($method: ident, ($($pname:tt: $ptype:ty),*) => $return_type: ty) => { - #[inline] - fn $method(&self, $($pname: $ptype),*) -> $return_type { - execute_lang_method!{ self, $method, $($pname),* } - } - }; -} -impl Language for WasmLang { - fn get_ts_language(&self) -> ts::Language { - TS_LANG - .lock() - .expect_throw("get language error") - .clone() - .expect_throw("current language is not set") + fn build_pattern(&self, builder: &PatternBuilder) -> Result { + builder.build(|src| { + let src = src.to_string(); + let ret = WasmDoc::try_new(src, self.clone()).map_err(|e| e.to_string()); + Ok(ret?) + }) } - impl_lang_method!(meta_var_char, () => char); - impl_lang_method!(extract_meta_var, (source: &str) => Option); - impl_lang_method!(expando_char, () => char); - fn pre_process_pattern<'q>(&self, query: &'q str) -> Cow<'q, str> { - execute_lang_method! { self, pre_process_pattern, query } + pre_process_pattern(self.expando_char(), query) + } + fn kind_to_id(&self, kind: &str) -> u16 { + let lang = self.get_ts_language(); + lang.id_for_node_kind(kind, true) + } + fn field_to_id(&self, field: &str) -> Option { + let lang = self.get_ts_language(); + lang.field_id_for_name(field) + } +} + +fn pre_process_pattern(expando: char, query: &str) -> Cow { + let mut ret = Vec::with_capacity(query.len()); + let mut dollar_count = 0; + for c in query.chars() { + if c == '$' { + dollar_count += 1; + continue; + } + let need_replace = matches!(c, 'A'..='Z' | '_') // $A or $$A or $$$A + || dollar_count == 3; // anonymous multiple + let sigil = if need_replace { expando } else { '$' }; + ret.extend(std::iter::repeat(sigil).take(dollar_count)); + dollar_count = 0; + ret.push(c); } + // trailing anonymous multiple + let sigil = if dollar_count == 3 { expando } else { '$' }; + ret.extend(std::iter::repeat(sigil).take(dollar_count)); + std::borrow::Cow::Owned(ret.into_iter().collect()) } #[derive(Clone)] pub struct Wrapper { inner: Vec, } - -impl Content for Wrapper { - type Underlying = char; - fn parse_tree_sitter( - &self, - parser: &mut Parser, - tree: Option<&Tree>, - ) -> std::result::Result, ParserError> { - let s: String = self.inner.iter().cloned().collect(); - parser.parse(&s, tree) - } - fn accept_edit(&mut self, edit: &Edit) -> InputEdit { +impl Wrapper { + fn accept_edit(&mut self, edit: &Edit) -> ts::Edit { let start_byte = edit.position; let old_end_byte = edit.position + edit.deleted_length; let new_end_byte = edit.position + edit.inserted_text.len(); @@ -209,7 +234,7 @@ impl Content for Wrapper { let old_end_position = pos_for_char_offset(&input, old_end_byte); input.splice(start_byte..old_end_byte, edit.inserted_text.clone()); let new_end_position = pos_for_char_offset(&input, new_end_byte); - InputEdit::new( + ts::Edit::new( start_byte as u32, old_end_byte as u32, new_end_byte as u32, @@ -218,10 +243,10 @@ impl Content for Wrapper { &new_end_position, ) } - fn get_text<'a>(&'a self, node: &Node) -> Cow<'a, str> { - // dummy for wasm tree! - node.utf8_text(&[]).expect("get_text should work") - } +} + +impl Content for Wrapper { + type Underlying = char; fn get_range(&self, range: Range) -> &[char] { &self.inner[range] } @@ -255,51 +280,186 @@ fn pos_for_char_offset(input: &[char], offset: usize) -> Point { pub struct WasmDoc { lang: WasmLang, source: Wrapper, + tree: Tree, +} + +#[derive(Clone, Debug)] +pub enum SgWasmError { + ParserError(ts::ParserError), + LanguageError(ts::LanguageError), + FailedToParse, +} + +impl std::fmt::Display for SgWasmError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + SgWasmError::ParserError(err) => write!(f, "Parser error: {}", err.message()), + SgWasmError::LanguageError(err) => write!(f, "Language error: {}", err.message()), + SgWasmError::FailedToParse => write!(f, "Failed to parse"), + } + } +} + +impl std::error::Error for SgWasmError {} + +impl From for SgWasmError { + fn from(err: ts::ParserError) -> Self { + SgWasmError::ParserError(err) + } +} +impl From for SgWasmError { + fn from(err: ts::LanguageError) -> Self { + SgWasmError::LanguageError(err) + } } impl WasmDoc { - pub fn new(src: String, lang: WasmLang) -> Self { + pub fn try_new(src: String, lang: WasmLang) -> Result { let source = Wrapper { inner: src.chars().collect(), }; - Self { source, lang } + let parser = Parser::new()?; + let ts_lang = lang.get_ts_language(); + parser.set_language(Some(&ts_lang))?; + let Some(tree) = parser.parse_with_string(&src.into(), None, None)? else { + return Err(SgWasmError::FailedToParse); + }; + Ok(Self { source, lang, tree }) + } +} + +#[derive(Clone)] +pub struct Node(pub SyntaxNode); + +impl<'a> SgNode<'a> for Node { + fn parent(&self) -> Option { + self.0.parent().map(Node) + } + fn ancestors(&self, _root: Self) -> impl Iterator { + let mut parent = self.0.parent(); + std::iter::from_fn(move || { + let inner = parent.clone()?; + let ret = Some(Node(inner.clone())); + parent = inner.parent(); + ret + }) + } + // fn dfs(&self) -> impl Iterator { + // TsPre::new(self) + // } + fn child(&self, nth: usize) -> Option { + self.0.child(nth as u32).map(Node) + } + fn children(&self) -> impl ExactSizeIterator { + self.0.children().to_vec().into_iter().map(|n| n.unchecked_into::()).map(Node) + } + fn child_by_field_id(&self, field_id: u16) -> Option { + self.0.child_for_field_id(field_id).map(Node) + } + fn next(&self) -> Option { + self.0.next_sibling().map(Node) + } + fn prev(&self) -> Option { + self.0.previous_sibling().map(Node) + } + // fn next_all(&self) -> impl Iterator { } + // fn prev_all(&self) -> impl Iterator {} + fn is_named(&self) -> bool { + self.0.is_named() + } + /// N.B. it is different from is_named && is_leaf + /// if a node has no named children. + fn is_named_leaf(&self) -> bool { + self.0.named_child_count() == 0 + } + fn is_leaf(&self) -> bool { + self.0.child_count() == 0 + } + fn kind(&self) -> Cow { + Cow::Owned(self.0.type_().into()) + } + fn kind_id(&self) -> u16 { + self.0.type_id() + } + fn node_id(&self) -> usize { + self.0.id() as usize + } + fn range(&self) -> std::ops::Range { + (self.0.start_index() as usize)..(self.0.end_index() as usize) + } + fn start_pos(&self) -> Position { + let start = self.0.start_position(); + let offset = self.0.start_index(); + Position::new(start.row() as usize, start.column() as usize, offset as usize) + } + fn end_pos(&self) -> Position { + let end = self.0.end_position(); + let offset = self.0.end_index(); + Position::new(end.row() as usize, end.column() as usize, offset as usize) + } + // missing node is a tree-sitter specific concept + fn is_missing(&self) -> bool { + self.0.is_missing() + } + fn is_error(&self) -> bool { + self.0.is_error() + } + + fn field(&self, name: &str) -> Option { + self.0.child_for_field_name(name).map(Node) + } + fn field_children(&self, field_id: Option) -> impl Iterator { + let cursor = self.0.walk(); + cursor.goto_first_child(); + // if field_id is not found, iteration is done + let mut done = field_id.is_none(); + + std::iter::from_fn(move || { + if done { + return None; + } + while cursor.current_field_id() != field_id { + if !cursor.goto_next_sibling() { + return None; + } + } + let ret = cursor.current_node(); + if !cursor.goto_next_sibling() { + done = true; + } + Some(Node(ret)) + }) } } impl Doc for WasmDoc { type Lang = WasmLang; type Source = Wrapper; - fn parse(&self, old_tree: Option<&Tree>) -> std::result::Result { - let mut parser = Parser::new()?; - let ts_lang = self.lang.get_ts_language(); - parser.set_language(&ts_lang)?; - if let Some(tree) = self.source.parse_tree_sitter(&mut parser, old_tree)? { - Ok(tree) - } else { - Err(TSParseError::TreeUnavailable) - } - } + type Node<'a> = Node; fn get_lang(&self) -> &Self::Lang { &self.lang } fn get_source(&self) -> &Self::Source { &self.source } - fn get_source_mut(&mut self) -> &mut Self::Source { - &mut self.source + fn root_node(&self) -> Self::Node<'_> { + Node(self.tree.root_node()) } - fn from_str(src: &str, lang: Self::Lang) -> Self { - Self { - lang, - source: Wrapper { - inner: src.chars().collect(), - }, - } + fn do_edit(&mut self, edit: &ast_grep_core::source::Edit) -> Result<(), String> { + let edit = self.source.accept_edit(edit); + self.tree.edit(&edit); + let parser = Parser::new().map_err(|e| e.to_string())?; + let ts_lang = self.lang.get_ts_language(); + parser.set_language(Some(&ts_lang)).map_err(|e| e.to_string())?; + let src = self.source.inner.iter().collect::(); + let parse_ret = parser.parse_with_string(&src.into(), Some(&self.tree), None); + let Some(tree) = parse_ret.map_err(|e| e.to_string())? else { + return Err("Failed to parse".to_string()); + }; + self.tree = tree; + Ok(()) } - fn clone_with_lang(&self, lang: Self::Lang) -> Self { - Self { - lang, - source: self.source.clone(), - } + fn get_node_text<'a>(&'a self, node: &Self::Node<'a>) -> Cow<'a, str> { + Cow::Owned(node.0.text().into()) } } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 9102e8ef..db5ed8d5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,4 +15,4 @@ }, "include": ["website/**/*.ts", "website/**/*.d.ts", "website/**/*.tsx", "website/**/*.vue"], "references": [{ "path": "./tsconfig.node.json" }] -} \ No newline at end of file +} diff --git a/website/.vitepress/config.ts b/website/.vitepress/config.ts index b921d972..8880ad40 100644 --- a/website/.vitepress/config.ts +++ b/website/.vitepress/config.ts @@ -1,4 +1,5 @@ -import { defineConfig } from 'vitepress' +import { DefaultTheme, defineConfig } from 'vitepress' +import llmstxt from 'vitepress-plugin-llms' const gaScript = ` window.dataLayer = window.dataLayer || []; @@ -7,18 +8,188 @@ gtag('js', new Date()); gtag('config', 'G-EZSJ3YF2RG'); ` +const sidebar: DefaultTheme.Sidebar = [ + { + text: 'Guide', + link: '/guide/introduction.html', + items: [ + { text: 'Quick Start', link: '/guide/quick-start.html' }, + { text: 'Pattern Syntax', link: '/guide/pattern-syntax.html' }, + { + text: 'Rule Essentials', + link: '/guide/rule-config.html', + collapsed: true, + items: [ + { text: 'Atomic Rule', link: '/guide/rule-config/atomic-rule.html' }, + { text: 'Relational Rule', link: '/guide/rule-config/relational-rule.html' }, + { text: 'Composite Rule', link: '/guide/rule-config/composite-rule.html' }, + { text: 'Utility Rule', link: '/guide/rule-config/utility-rule.html' }, + ], + }, + { + text: 'Project Setup', + collapsed: true, + link: '/guide/scan-project.html', + items: [ + { text: 'Project Configuration', link: '/guide/project/project-config.html' }, + { text: 'Lint Rule', link: '/guide/project/lint-rule.html' }, + { text: 'Test Your Rule', link: '/guide/test-rule.html' }, + { text: 'Error Report', link: '/guide/project/severity.html' }, + ], + }, + { + text: 'Rewrite Code', + link: '/guide/rewrite-code.html', + collapsed: true, + items: [ + { text: 'Transform Code', link: '/guide/rewrite/transform.html' }, + { text: 'Rewriter Rule', link: '/guide/rewrite/rewriter.html' }, + ], + }, + { + text: 'Tooling Overview', + link: '/guide/tooling-overview.html', + collapsed: true, + items: [ + { text: 'Editor Integration', link: '/guide/tools/editors.html' }, + { text: 'JSON mode', link: '/guide/tools/json.html' }, + ], + }, + { + text: 'API Usage', + link: '/guide/api-usage.html', + collapsed: true, + items: [ + { text: 'JavaScript API', link: '/guide/api-usage/js-api.html' }, + { text: 'Python API', link: '/guide/api-usage/py-api.html' }, + { text: 'Performance Tip', link: '/guide/api-usage/performance-tip.html' }, + ], + }, + ], + collapsed: false, + }, + { + text: 'Examples', + link: '/catalog', + items: [ + { text: 'C', link: '/catalog/c/' }, + { text: 'C++', link: '/catalog/cpp/' }, + { text: 'Go', link: '/catalog/go/' }, + { text: 'HTML', link: '/catalog/html/' }, + { text: 'Java', link: '/catalog/java/' }, + { text: 'Kotlin', link: '/catalog/kotlin/' }, + { text: 'Python', link: '/catalog/python/' }, + { text: 'Ruby', link: '/catalog/ruby/' }, + { text: 'Rust', link: '/catalog/rust/' }, + { text: 'TypeScript', link: '/catalog/typescript/' }, + { text: 'TSX', link: '/catalog/tsx/' }, + { text: 'YAML', link: '/catalog/yaml/' }, + ], + collapsed: true, + }, + { + text: 'Cheat Sheet', + items: [ + { text: 'Rule Cheat Sheet', link: '/cheatsheet/rule.html' }, + { text: 'Config Cheat Sheet', link: '/cheatsheet/yaml.html' }, + ], + collapsed: true, + }, + { + text: 'Reference', + items: [ + { + text: 'Command Line Interface', + link: '/reference/cli.html', + collapsed: true, + items: [ + { text: 'ast-grep run', link: '/reference/cli/run.html' }, + { text: 'ast-grep scan', link: '/reference/cli/scan.html' }, + { text: 'ast-grep test', link: '/reference/cli/test.html' }, + { text: 'ast-grep new', link: '/reference/cli/new.html' }, + ], + }, + { text: 'Project Config', link: '/reference/sgconfig.html' }, + { + text: 'Rule Config', + link: '/reference/yaml.html', + collapsed: false, + items: [ + { text: 'fix', link: '/reference/yaml/fix.html' }, + { text: 'transformation', link: '/reference/yaml/transformation.html' }, + { text: 'rewriter', link: '/reference/yaml/rewriter.html' }, + ], + }, + { text: 'Rule Object', link: '/reference/rule.html' }, + { text: 'API Reference', link: '/reference/api.html' }, + { text: 'Language List', link: '/reference/languages.html' }, + { text: 'Playground Manual', link: '/reference/playground.html' }, + ], + collapsed: true, + }, + { + text: 'Advanced Topics', + items: [ + { text: 'Frequently Asked Questions', link: '/advanced/faq.html' }, + { + text: 'How ast-grep Works', + link: '/advanced/how-ast-grep-works.html', + collapsed: false, + items: [ + { text: 'Core Concepts', link: '/advanced/core-concepts.html' }, + { text: 'Pattern Syntax', link: '/advanced/pattern-parse.html' }, + { text: 'Pattern Match Algorithm', link: '/advanced/match-algorithm.html' }, + { text: 'How Rewrite Works', link: '/advanced/find-n-patch.html' }, + ], + }, + { text: 'Custom Language Support', link: '/advanced/custom-language.html' }, + { text: 'Multi-Language Documents', link: '/advanced/language-injection.html' }, + { text: 'Comparison with Other Tools', link: '/advanced/tool-comparison.html' }, + ], + collapsed: true, + }, + { + text: 'Contributing', + items: [ + { text: 'Guide', link: '/contributing/how-to.html' }, + { text: 'Development', link: '/contributing/development.html' }, + { text: 'Add New Language', link: '/contributing/add-lang.html' }, + ], + collapsed: true, + }, + { + text: 'Links', + items: [ + { text: 'Playground', link: '/playground.html' }, + { text: 'Codemod Studio', link: 'https://app.codemod.com/studio' }, + { text: 'Blog', link: '/blog.html' }, + { + text: 'VSCode', + link: 'https://marketplace.visualstudio.com/items?itemName=ast-grep.ast-grep-vscode', + }, + { text: 'Discord', link: 'https://discord.com/invite/4YZjf6htSQ' }, + { text: 'StackOverflow', link: 'https://stackoverflow.com/questions/tagged/ast-grep' }, + { text: 'Reddit', link: 'https://www.reddit.com/r/astgrep/' }, + { text: 'Docs.rs', link: 'https://docs.rs/ast-grep-core/latest/ast_grep_core/' }, + ], + collapsed: true, + }, +] + export default defineConfig({ lang: 'en-US', title: 'ast-grep', - description: 'ast-grep(sg) is a lightning fast and user friendly tool for code searching, linting, rewriting at large scale.', + description: + 'ast-grep(sg) is a lightning fast and user friendly tool for code searching, linting, rewriting at large scale.', head: [ - ['script', {async: 'async', src: 'https://www.googletagmanager.com/gtag/js?id=G-EZSJ3YF2RG'}], + ['script', { async: 'async', src: 'https://www.googletagmanager.com/gtag/js?id=G-EZSJ3YF2RG' }], ['script', {}, gaScript], ], outDir: './dist', // appearance: false, lastUpdated: true, vite: { + plugins: [llmstxt()], build: { target: 'es2020', }, @@ -29,7 +200,7 @@ export default defineConfig({ }, }, themeConfig: { - logo: 'logo.svg', + logo: '/logo.svg', nav: [ { text: 'Guide', link: '/guide/introduction.html' }, { @@ -39,13 +210,13 @@ export default defineConfig({ { text: 'Rule Config', link: '/reference/yaml.html' }, { text: 'Rule Object', link: '/reference/rule.html' }, { text: 'Playground Manual', link: '/reference/playground.html' }, - ] + ], }, { text: 'Resources', items: [ { text: 'FAQ', link: '/advanced/faq.html' }, - { text: 'Rule Examples', link: '/catalog/' }, + { text: 'Rule Examples', link: '/catalog' }, { text: 'Custom Language', link: '/advanced/custom-language.html' }, { text: 'Contributing', link: '/contributing/how-to.html' }, { text: 'Blog', link: '/blog.html' }, @@ -58,149 +229,22 @@ export default defineConfig({ { icon: 'discord', link: 'https://discord.com/invite/4YZjf6htSQ' }, ], editLink: { - pattern: 'https://github.com/ast-grep/ast-grep.github.io/edit/main/website/:path' + pattern: 'https://github.com/ast-grep/ast-grep.github.io/edit/main/website/:path', }, sidebar: { '/blog/': [ { text: 'Blog List', link: '/blog.html' }, { text: 'Homepage', link: '/' }, - { text: 'VSCode', link: 'https://marketplace.visualstudio.com/items?itemName=ast-grep.ast-grep-vscode'}, - { text: 'Discord', link: 'https://discord.com/invite/4YZjf6htSQ'}, - { text: 'StackOverflow', link: 'https://stackoverflow.com/questions/tagged/ast-grep'}, - { text: 'Reddit', link: 'https://www.reddit.com/r/astgrep/'}, - { text: 'Docs.rs', link: 'https://docs.rs/ast-grep-core/latest/ast_grep_core/' }, - ], - '/': [ - { - text: 'Guide', - link: '/guide/introduction.html', - items: [ - { text: 'Quick Start', link: '/guide/quick-start.html' }, - { text: 'Pattern Syntax', link: '/guide/pattern-syntax.html' }, - { text: 'Rule Essentials', link: '/guide/rule-config.html', collapsed: true, - items:[ - { text: 'Atomic Rule', link: '/guide/rule-config/atomic-rule.html' }, - { text: 'Relational Rule', link: '/guide/rule-config/relational-rule.html' }, - { text: 'Composite Rule', link: '/guide/rule-config/composite-rule.html' }, - { text: 'Utility Rule', link: '/guide/rule-config/utility-rule.html' }, - ],}, - { - text: 'Project Setup', collapsed: true, link: '/guide/scan-project.html', - items: [ - { text: 'Project Configuration', link: '/guide/project/project-config.html' }, - { text: 'Lint Rule', link: '/guide/project/lint-rule.html' }, - { text: 'Test Your Rule', link: '/guide/test-rule.html' }, - { text: 'Error Report', link: '/guide/project/severity.html' }, - ], - }, - { text: 'Rewrite Code', link: '/guide/rewrite-code.html', collapsed: true, - items: [ - { text: 'Transform Code', link: '/guide/rewrite/transform.html' }, - { text: 'Rewriter Rule', link: '/guide/rewrite/rewriter.html' }, - ], - }, - { - text: 'Tooling Overview', link: '/guide/tooling-overview.html', collapsed: true, - items: [ - { text: 'Editor Integration', link: '/guide/tools/editors.html' }, - { text: 'JSON mode', link: '/guide/tools/json.html' }, - ], - }, - { text: 'API Usage', link: '/guide/api-usage.html', collapsed: true, - items:[ - { text: 'JavaScript API', link: '/guide/api-usage/js-api.html' }, - { text: 'Python API', link: '/guide/api-usage/py-api.html' }, - { text: 'Performance Tip', link: '/guide/api-usage/performance-tip.html' }, - ]}, - ], - collapsed: false, - }, - { - text: 'Examples', - link: '/catalog/', - items: [ - { text: 'C', link: '/catalog/c/'}, - { text: 'C++', link: '/catalog/cpp/'}, - { text: 'Go', link: '/catalog/go/'}, - { text: 'HTML', link: '/catalog/html/'}, - { text: 'Java', link: '/catalog/java/'}, - { text: 'Kotlin', link: '/catalog/kotlin/'}, - { text: 'Python', link: '/catalog/python/'}, - { text: 'Ruby', link: '/catalog/ruby/'}, - { text: 'Rust', link: '/catalog/rust/'}, - { text: 'TypeScript', link: '/catalog/typescript/'}, - { text: 'TSX', link: '/catalog/tsx/'}, - { text: 'YAML', link: '/catalog/yaml/'}, - ], - collapsed: true, - }, { - text: 'Reference', - items: [ - { text: 'Command Line Interface', link: '/reference/cli.html', collapsed: true, - items: [ - { text: 'ast-grep run', link: '/reference/cli/run.html' }, - { text: 'ast-grep scan', link: '/reference/cli/scan.html' }, - { text: 'ast-grep test', link: '/reference/cli/test.html' }, - { text: 'ast-grep new', link: '/reference/cli/new.html' }, - ], - }, - { text: 'Project Config', link: '/reference/sgconfig.html' }, - { text: 'Rule Config', link: '/reference/yaml.html', collapsed: false, - items: [ - { text: 'fix', link: '/reference/yaml/fix.html' }, - { text: 'transformation', link: '/reference/yaml/transformation.html' }, - { text: 'rewriter', link: '/reference/yaml/rewriter.html' }, - ], - }, - { text: 'Rule Object', link: '/reference/rule.html' }, - { text: 'API Reference', link: '/reference/api.html' }, - { text: 'Language List', link: '/reference/languages.html' }, - { text: 'Playground Manual', link: '/reference/playground.html' }, - ], - collapsed: true, - }, - { - text: 'Advanced Topics', - items: [ - { text: 'Frequently Asked Questions', link: '/advanced/faq.html'}, - { text: 'How ast-grep Works', link: '/advanced/how-ast-grep-works.html', collapsed: false, - items: [ - { text: 'Core Concepts', link: '/advanced/core-concepts.html'}, - { text: 'Pattern Syntax', link: '/advanced/pattern-parse.html'}, - { text: 'Pattern Match Algorithm', link: '/advanced/match-algorithm.html'}, - { text: 'How Rewrite Works', link: '/advanced/find-n-patch.html'}, - ] , - }, - { text: 'Custom Language Support', link: '/advanced/custom-language.html'}, - { text: 'Multi-Language Documents', link: '/advanced/language-injection.html'}, - { text: 'Comparison with Other Tools', link: '/advanced/tool-comparison.html'}, - ], - collapsed: true, - }, - { - text: 'Contributing', - items: [ - { text: 'Guide', link: '/contributing/how-to.html' }, - { text: 'Development', link: '/contributing/development.html' }, - { text: 'Add New Language', link: '/contributing/add-lang.html' }, - ], - collapsed: true, - }, - { - text: 'Links', - items: [ - { text: 'Playground', link: '/playground.html' }, - { text: 'Blog', link: '/blog.html' }, - { text: 'VSCode', link: 'https://marketplace.visualstudio.com/items?itemName=ast-grep.ast-grep-vscode'}, - { text: 'Discord', link: 'https://discord.com/invite/4YZjf6htSQ'}, - { text: 'StackOverflow', link: 'https://stackoverflow.com/questions/tagged/ast-grep'}, - { text: 'Reddit', link: 'https://www.reddit.com/r/astgrep/'}, - { text: 'Docs.rs', link: 'https://docs.rs/ast-grep-core/latest/ast_grep_core/' }, - ], - collapsed: true, + text: 'VSCode', + link: 'https://marketplace.visualstudio.com/items?itemName=ast-grep.ast-grep-vscode', }, + { text: 'Discord', link: 'https://discord.com/invite/4YZjf6htSQ' }, + { text: 'StackOverflow', link: 'https://stackoverflow.com/questions/tagged/ast-grep' }, + { text: 'Reddit', link: 'https://www.reddit.com/r/astgrep/' }, + { text: 'Docs.rs', link: 'https://docs.rs/ast-grep-core/latest/ast_grep_core/' }, ], + '/': sidebar, }, footer: { message: 'Made with ❤️ with Rust', @@ -210,4 +254,7 @@ export default defineConfig({ provider: 'local', }, }, -}) \ No newline at end of file + sitemap: { + hostname: 'https://ast-grep.github.io', + }, +}) diff --git a/website/_data/blog.data.ts b/website/_data/blog.data.ts index 944f60ff..67bce79c 100644 --- a/website/_data/blog.data.ts +++ b/website/_data/blog.data.ts @@ -8,6 +8,7 @@ interface Post { time: number string: string } + description: string } declare const data: Post[] @@ -22,6 +23,8 @@ export default createContentLoader('blog/*.md', { .content, url, date: formatDate(frontmatter.date), + description: frontmatter.head.find((e: any) => e[1].property === 'og:description')[1] + .content, })) .sort((a, b) => b.date.time - a.date.time) }, @@ -38,4 +41,4 @@ function formatDate(raw: string): Post['date'] { day: 'numeric', }), } -} \ No newline at end of file +} diff --git a/website/_data/catalog.data.ts b/website/_data/catalog.data.ts index d9164483..2c45cdd3 100644 --- a/website/_data/catalog.data.ts +++ b/website/_data/catalog.data.ts @@ -1,6 +1,6 @@ -import { createContentLoader, type ContentData } from 'vitepress' +import { JSON_SCHEMA, loadAll } from 'js-yaml' +import { type ContentData, createContentLoader } from 'vitepress' import { ExampleLangs } from '../src/catalog/data' -import { loadAll, JSON_SCHEMA } from 'js-yaml' export interface RuleMeta { id: string @@ -33,7 +33,8 @@ function extractRuleInfo({ url, src }: ContentData): RuleMeta { const source = src! const id = url.split('/').pop()?.replace(/\.md$/, '') || '' const type = source.includes('```yml') || source.includes('```yaml') - ? 'YAML' : 'Pattern' + ? 'YAML' : + 'Pattern' const playgroundLink = /\[Playground Link\]\((.+)\)/.exec(source)?.[1] || '' const hasFix = source.includes('[]): string[] { if ('transform' in yaml) { features.add('transform') } + if ('labels' in yaml) { + features.add('labels') + } } } return [...features] -} \ No newline at end of file +} diff --git a/website/_data/parsers.ts b/website/_data/parsers.ts index 36edf060..a1f5615d 100644 --- a/website/_data/parsers.ts +++ b/website/_data/parsers.ts @@ -45,21 +45,21 @@ export const repos: Record = { // https://github.com/ast-grep/ast-grep/blob/main/crates/language/Cargo.toml export const versions: Record = { - bash: "0.23.3", - c: "0.23.5", - cpp: "0.23.4", - csharp: "0.23.1", - css: "0.23.1", - go: "0.23.4", - html: "0.23.2", - java: "0.23.5", - javascript: "0.23.1", - json: "0.24.2", - php: "0.23.11", - python: "0.23.3", - ruby: "0.23.1", - rust: "0.23.2", - scala: "0.23.4", - tsx: "0.23.2", - typescript: "0.23.2", -} \ No newline at end of file + bash: '0.23.3', + c: '0.23.5', + cpp: '0.23.4', + csharp: '0.23.1', + css: '0.23.1', + go: '0.23.4', + html: '0.23.2', + java: '0.23.5', + javascript: '0.23.1', + json: '0.24.2', + php: '0.23.11', + python: '0.23.3', + ruby: '0.23.1', + rust: '0.23.2', + scala: '0.23.3', + tsx: '0.23.2', + typescript: '0.23.2', +} diff --git a/website/advanced/custom-language.md b/website/advanced/custom-language.md index 9c3d9def..b80e88eb 100644 --- a/website/advanced/custom-language.md +++ b/website/advanced/custom-language.md @@ -1,9 +1,5 @@ # Custom Language Support -:::danger Experimental Feature -Custom language in ast-grep is an experimental option. Use it with caution! -::: - In this guide, we will show you how to use a custom language that is not built into ast-grep. We will use [Mojo 🔥](https://www.modular.com/mojo) as an example! diff --git a/website/advanced/faq.md b/website/advanced/faq.md index 0f290089..c6779472 100644 --- a/website/advanced/faq.md +++ b/website/advanced/faq.md @@ -197,7 +197,7 @@ If your rule depends on using meta variables in later rules, the best way is to ## `kind` and `pattern` rules are not working together, why? -The most common scneario is that your pattern is parsed as a different AST node than you expected. And you may use `kind` rule to filter out the AST node you want to match. This does not work in ast-grep for two reasons: +The most common scenario is that your pattern is parsed as a different AST node than you expected. And you may use `kind` rule to filter out the AST node you want to match. This does not work in ast-grep for two reasons: 1. tree-sitter, the underlying parser library, does not offer a way to parse a string of a specific kind. So `kind` rule cannot be used to change the parsing outcome of a `pattern`. 2. ast-grep rules are mostly independent of each other, except sharing meta-variables during a match. `pattern` will behave the same regardless of another `kind` rule. diff --git a/website/advanced/tool-comparison.md b/website/advanced/tool-comparison.md index 5a8bc8ca..a2942957 100644 --- a/website/advanced/tool-comparison.md +++ b/website/advanced/tool-comparison.md @@ -9,7 +9,7 @@ The author is grateful to these predecessor tools for inspiring ast-grep! The re ## ast-grep **Pros**: -* It is very performant. It uses ignore to do multi-thread processing, which makes it utilize all your CPU cores. +* It is very performant. It uses [ignore](https://docs.rs/ignore/latest/ignore/) to do multi-thread processing, which makes it utilize all your CPU cores. * It is language aware. It uses tree-sitter, a real parser, to parse the code into ASTs, which enables more precise and accurate matching and fixing. * It has a powerful and flexible rule system. It allows you to write patterns, AST types and regular expressions to match code. It provides operators to compose complex matching rules for various scenarios. * It can be used as a lightweight CLI tool or as a library, depending on your usage. It has a simple and user-friendly interface, and it also exposes its core functionality as a library for other applications. @@ -37,6 +37,18 @@ Semgrep is a well-established tool that uses code patterns to find and fix bugs * It is relatively slow when used as command line tools. * It cannot be used as a library in other applications, which may reduce its integration and customization options. +## [GritQL](https://about.grit.io/) + +[GritQL](https://docs.grit.io/language/overview) language is [Grit](https://docs.grit.io/)'s embedded query language for searching and transforming source code. + +**Pros**: + +* GritQL is generally more powerful. It has features like [clause](https://docs.grit.io/language/modifiers) from [logic programming language](https://en.wikipedia.org/wiki/Logic_programming#:~:text=A%20logic%20program%20is%20a,Programming%20(ASP)%20and%20Datalog.) and [operations](https://docs.grit.io/language/conditions#match-condition) from imperative programming languages. +* It is used as [linter plugins](https://biomejs.dev/linter/plugins/) in [Biome](https://biomejs.dev/), a toolchain for JS ecosystem. + +**Cons**: +* Depending on different background, developers may find it harder to learn a multi-paradigm DSL. + ## [Comby](https://comby.dev/) Comby is a fast and flexible tool that uses structural patterns to match and rewrite code across languages and file formats. @@ -51,6 +63,16 @@ Comby is a fast and flexible tool that uses structural patterns to match and rew * It does not support indentation-sensitive languages like Python or Haskell, which require special handling for whitespace and indentation. * It is hard to write complex queries with Comby, such as finding a function that does not call another function. It does not support logical operators or filters for patterns. +## [IntelliJ Structural Search Replace](https://www.jetbrains.com/help/idea/structural-search-and-replace.html) + +IntelliJ Structural Search Replace is not a standalone tool, but a feature of the IntelliJ IDE that allows users to search and replace code using structural patterns. + +**Pros**: +* It is integrated with the IntelliJ IDE, which makes it easy to use and customize. + +**Cons**: +* Currently, IntelliJ IDEA supports the structural search and replace for Java, Kotlin and Groovy. + ## [Shisho](https://docs.shisho.dev/shisho) Shisho is a new and promising tool that uses code patterns to search and manipulate code in various languages. @@ -61,13 +83,4 @@ Shisho is a new and promising tool that uses code patterns to search and manipul **Cons**: * It is still in development and it has limited language support compared to the other tools. It currently supports only 3 languages, while the other tools support over 20 languages. - -## [IntelliJ Structural Search Replace](https://www.jetbrains.com/help/idea/structural-search-and-replace.html) - -IntelliJ Structural Search Replace is not a standalone tool, but a feature of the IntelliJ IDE that allows users to search and replace code using structural patterns. - -**Pros**: -* It is integrated with the IntelliJ IDE, which makes it easy to use and customize. - -**Cons**: -* Currently, IntelliJ IDEA supports the structural search and replace for Java, Kotlin and Groovy. +* The tool's parent company seems to have changed their business direction. diff --git a/website/blog/ast-grep-agent.md b/website/blog/ast-grep-agent.md new file mode 100644 index 00000000..c26d3a99 --- /dev/null +++ b/website/blog/ast-grep-agent.md @@ -0,0 +1,80 @@ +--- +author: + - name: Herrington Darkholme +date: 2025-06-21 +head: + - - meta + - property: og:type + content: website + - - meta + - property: og:title + content: ast-grep's Journey to AI Generated Rules + - - meta + - property: og:url + content: https://ast-grep.github.io/blog/ast-grep-agent.html + - - meta + - property: og:description + content: Advancements in AI have made it possible to generate ast-grep rules with a well-written prompt. +--- + +# ast-grep's Journey to AI Generated Rules + +ast-grep is a command-line tool that empowers developers to find and replace code with precision. It operates directly on the syntax tree (AST), the true structure of your code. While powerful, writing ast-grep rules is a hurdle that requires grokking the tool. + +This project has always been about designed and built as a tool for human beings, not for AI hype. But ast-grep been [exploring how to use Al](/blog/more-llm-support.html) to improve the human experience. This is the story of my journey into using Al to generate YAML rules. + +## Why ast-grep Rules are Hard for AI + +Generating ast-grep rules is not an easy task,especially for AI. First, ast-grep is a relatively new tool, so Large Language Models have not been extensively trained on its specific syntax, leading to hallucinations or a complete lack of understanding. While [in-context learning](https://www.prompthub.us/blog/in-context-learning-guide) can help an LLM grasp the basic syntax, it often fails to address the problem of [compounding errors](https://arxiv.org/abs/2505.24187v1). + +This is particularly true for ast-grep, where rules are frequently composed of smaller, [atomic rules](/guide/rule-config/atomic-rule.html). Human developers often need to debug these smaller rules through [trial and error](/advanced/faq.html#my-pattern-does-not-work-why), and pay extra attention to how they are orchestrated into a [working composition](/advanced/faq.html#my-rule-does-not-work-why). For an LLM, a small mistake in one part of the rule can snowball into a completely incorrect rule. Quoting from the paper [Faith and Fate](https://arxiv.org/abs/2305.18654): + +> _These tasks require breaking problems down into sub-steps and synthesizing these steps into a precise answer._ + +This explains why a simple LLM ask won't work for ast-grep. However, recent advancements in "thinking" and "agentic" models, which can correct their mistakes, may [reduce the probability of such errors](https://arxiv.org/abs/2501.15602v2). This makes it a good time to give AI-powered ast-grep rule generation another try. + + +## The First Foray a Year Ago + +My initial attempt, about a year ago, was a lesson in humility. I tried to build an agent using [DSPy](https://dspy.ai/) with a rigid, fixed pipeline: generate use cases, create code examples, describe the rule in natural language, translate that description to an ast-grep rule, and finally, verify it. + +The results were, to put it mildly, not good. + +The models I was using are mostly free-tier APIs from [Ollama](https://ollama.com/) and [aistudio](https://aistudio.google.com)(thank [$GOOG](https://finance.yahoo.com/quote/GOOG/)). They struggled to adhere to a consistent output format. They often failed to generate correct code examples, let alone valid ast-grep rules. The limited context windows meant I couldn't even provide sufficient instructions to guide them properly. It felt like I was missing two crucial pieces: a way for the agent to refine a rule based on search result feedback, and a method to dynamically break down complex requests into smaller, manageable rules. The agent architecture could solve these, but the underlying models could not. + +## One Year After: Better Models, Better Agents + +Fast forward to today. The landscape has changed dramatically. Modern LLMs boast long context windows and a much-improved ability to follow complex instructions. Armed with these new capabilities and inspired by [Anthropic's new guide](https://www.anthropic.com/engineering/building-effective-agents), I tried again. + +This time, I discovered that a complex agent framework wasn't necessary. AI programming tools like [Cursor](https://www.cursor.com/) have sufficient agent frameworks for tool developers. The secret sauce was something far simpler: prompt engineering. And by "[prompt engineering](https://www.promptingguide.ai/)", I don't mean any framework or trick. It's just writing a clear, human-readable manual for both human and Al. + +Before the prompt engineering, however, I saw some interesting failure modes across different models that somehow reflects different LLM vendors' training setup. All of them did a decent job of interpreting the user's intent and creating relevant code examples, but their approaches to rule generation were wildly different. + +* **OpenAI O3** hallucinated with wild abandon. It invented syntax that looked more like [CodeQL](https://codeql.github.com/) or [jscodeshift](https://github.com/facebook/jscodeshift), completely ignoring the ast-grep documentation available online. It couldn't recover from tool errors and would quickly give up on using the tools I gave it. It felt like OpenAI's pretraining dataset glanced at my documentation, decided it knew better, and threw it in the bin. (Oops, like how OpenAI treated my resume) + +* **Gemini** was a bit more grounded. Its hallucinations were at least in the right ballpark, borrowing syntax from a [related but more established](/advanced/tool-comparison.html#semgrep) tool, [Semgrep](https://semgrep.dev/). (Thanks for the flattery, again, $GOOG). It also showed a decent ability to recover from errors but had a stubborn streak, preferring to invent its own ast-grep cli commands rather than using the [MCP](https://modelcontextprotocol.io) tools I [provided](https://github.com/ast-grep/ast-grep-mcp). +* **Claude 4** was the most promising out of the box. It correctly identified ast-grep and produced syntactically valid rules. Looks like Anthropic's training data is indexing ast-grep's doc! Hoooray! However, it struggled with subtle semantic details that would make a rule functionally correct. To its credit, it tried very hard, retrying the tools I gave it over and over with different inputs, demonstrating a dogged persistence the others lacked. + +## Prompting AI Agents like Teaching a Human + +After iterating on the prompt, I found that all three models could perform remarkably well. The key was to treat the prompt not as a magic incantation, but as a straightforward instruction manual. + +The core of my final prompt gives the Al a simple, five-step plan: + +1. First, clearly understand the user's request. +2. Next, write a simple code snippet that the user wants to find. +3. Then, write an ast-grep rule that precisely matches that code snippet. +4. [Test the rule](https://github.com/ast-grep/ast-grep-mcp/blob/b69eb5391bd93d46ef3dec07de814c3c39675c8f/main.py#L33-L57) against the example to ensure it works as expected. +5. Finally, [search](https://github.com/ast-grep/ast-grep-mcp/blob/b69eb5391bd93d46ef3dec07de814c3c39675c8f/main.py#L72-L82) the codebase with the verified rule. + +This clear, step-by-step process turned erratic geniuses into more reliable assistants. By breaking the problem down and providing a verification loop, I gave the models the structure they needed to succeed. You can see the full prompt in the [sg-mcp GitHub repository](https://github.com/ast-grep/ast-grep-mcp/blob/main/ast-grep.mdc). + +The end result is quite impressive, see the [demo video](https://youtube.com/shorts/2hah-9N5YQ8?si=bzl6PF2tuFbBwXpL) below. No speed up, but with music and cats. (It is oddly satisfactory to watch AI generating the rules while I myself is nodding like the kitty in the video) + + + + +This journey has reinforced a core belief: Al's true power isn't about replacing the developer, but about building better tools for them. It also demonstrates that the best way to teach an AI, with the progress of more capable Large Language Models, is not through complex frameworks or rigid pipelines, but through clear, human-readable instructions. + +By teaching an Al to write rules, I hope it makes ast-grep more accessible, more powerful, and easier to use. +Happy grepping! diff --git a/website/blog/interactive-demo.md b/website/blog/interactive-demo.md new file mode 100644 index 00000000..ad98425e --- /dev/null +++ b/website/blog/interactive-demo.md @@ -0,0 +1,67 @@ +--- +author: + - name: Herrington Darkholme +date: 2025-06-07 +head: + - - meta + - property: og:type + content: website + - - meta + - property: og:title + content: Interactive Code Fixes with Multiple Options! + - - meta + - property: og:url + content: https://ast-grep.github.io/blog/interactive-demo.html + - - meta + - property: og:description + content: Today, we're thrilled to showcase a game-changing feature, multi-option interactive code fixes! +--- + +# Interactive Code Fixes with Multiple Options! + +Today, we're thrilled to showcase a game-changing feature: **multi-option interactive code fixes!** + + + + +## Beyond Simple Search: Interactive Refactoring + +ast-grep's interactive mode, activated with `ast-grep scan --interactive`, transforms code analysis into a dynamic, actionable workflow. When a rule identifies a pattern match, you're presented with: + +1. **Clear Diff Views:** Instantly see the problematic code (red) and the proposed change (green), making it easy to understand the impact of the fix. +2. **Contextual Markdown Notes:** Rules can embed rich Markdown notes, providing instant documentation, best practices, and explanations directly in your terminal – no need to jump to external docs. + +## The Power of Choice: Multiple Fix Options + +This is where ast-grep truly stands out. Instead of a single, rigid fix, many rules now offer **multiple, intelligent remediation options**. + +**How it works:** + +* When a match is found, ast-grep displays a list of available fixes. +* Simply use the **`tab` key** to cycle through the different fix proposals. +* Once you've found the ideal solution, hit `Enter` to apply it. + +This flexibility allows you to choose the fix that best aligns with your project's coding standards or specific refactoring goals. + +## Real-World Example: Angular `@Input()` Optionality + +Consider a common TypeScript scenario in Angular: an `@Input()` decorator where the component property is typed as `string`, but it's optional by default (meaning it could be `undefined`). + +ast-grep's rule for this issue intelligently offers two distinct fixes: + +1. **Add `undefined` to Type:** Transforms `test: string;` to `test: string | undefined;`, explicitly acknowledging the optionality in the type system. +2. **Make Input Required:** Adds `{ required: true }` to the `@Input()` decorator, enforcing that the input must always be provided. + +You choose the solution that fits your use case, and ast-grep applies the transformation seamlessly. + +## Behind the Scenes: Configurable Fixes + +This powerful multi-fix capability is driven by the rule's YAML configuration. Rules can define an array of `fix` templates, each with a unique `title` and `template`, allowing rule authors to provide comprehensive repair options. + + +### Streamline Your Workflow Today! + +Ast-grep with its interactive multi-fix feature is a game-changer for maintaining code quality, enforcing standards, and accelerating large-scale code transformations. It puts the power of intelligent, context-aware refactoring directly into your hands. + +**Ready to refactor like a pro?** +Give ast-grep a try and experience the future of code analysis and transformation! diff --git a/website/blog/more-llm-support.md b/website/blog/more-llm-support.md new file mode 100644 index 00000000..daba8a37 --- /dev/null +++ b/website/blog/more-llm-support.md @@ -0,0 +1,84 @@ +--- +author: + - name: Herrington Darkholme +search: false +date: 2025-03-23 +head: + - - meta + - property: og:type + content: website + - - meta + - property: og:title + content: ast-grep gets more LLM support! + - - meta + - property: og:url + content: https://ast-grep.github.io/blog/more-llm-support.html + - - meta + - property: og:description + content: ast-grep is getting even better with enhanced Large Language Model (LLM) support. This exciting development opens up new possibilities for developers to analyze, understand, and transform code more efficiently. Let's dive into the details of these new features. +--- + +# ast-grep Gets More LLM Support! + +## Leveling Up Code Analysis with AI + +ast-grep, the powerful tool for structural code search, is getting even better with enhanced Large Language Model (LLM) support. This exciting development opens up new possibilities for developers to analyze, understand, and transform code more efficiently. Let's dive into the details of these new features. + +## `llms.txt` Support + +ast-grep now supports a new file format, [`llms.txt`](https://llmstxt.org/), designed to work seamlessly with LLMs. It is also on [llmstxthub](https://llmstxthub.com/websites/ast-grep) for easy access to the latest files. + +A key challenge for large language models is their limited ability to process extensive website content. They often struggle with the complexity of converting full HTML pages, which include navigation, advertisements, and JavaScript, into a simplified text format that LLMs can effectively use. + +On the other hand, ast-grep faces challenges due to the limited training data available for LLMs. Because of this, LLMs often confuse ast-grep with other similar tools, even when provided with accurate prompts. Furthermore, despite ast-grep's comprehensive online documentation, LLM search capabilities don't guarantee accurate retrieval of information on rule writing. This hinders ast-grep's widespread adoption in the AI era. + +`llms.txt` addresses this by providing models with comprehensive context, enhancing their [in-context learning](https://arxiv.org/abs/2301.00234) and improving the accuracy of their output. It is particularly effective with models that have large context windows, such as [Google’s Gemini](https://aistudio.google.com/). + +![Example Usage with $GOOG Gemini](/image/blog/gemini.jpeg) +
Example llms.txt usage with Gemini. The full doc reduces model hallucination.
+ + +The general usage of `llms.txt` is as follows: + +1. Visit [https://ast-grep.github.io/llms-full.txt](https://ast-grep.github.io/llms-full.txt) and copy the full documentation text +2. Paste these documents into your conversation with your preferred AI chatbot +3. Ask AI questions about ast-grep + + +## AI-powered Codemod Studio + +[Codemod.com](https://codemod.com/) is a long-time [contributor](https://go.codemod.com/ast-grep-contributions) [supporter](https://github.com/ast-grep/ast-grep?tab=readme-ov-file#sponsor) of ast-grep and has recently introduced a new feature called [Codemod Studio](https://app.codemod.com/studio). + +The studio introduces an AI assistant which is is a game-changer for writing ast-grep rules. This interactive environment allows you to use natural language to describe the code patterns you want to find, and then the AI will help you write the corresponding ast-grep rule. Here's how it works: + +* **Describe your goal**: In plain English, explain what you want to achieve with your ast-grep rule (e.g., "Find all instances of `console.log`"). +* **AI assistance**: The AI analyzes your description and suggests an appropriate ast-grep pattern. +* **Refine and test**: You can then refine the generated rule, test it against your codebase, and iterate until it meets your needs. + +This innovative approach democratizes ast-grep rule creation, making it accessible to developers of all skill levels, even without previous experience with ast-grep. + +## GenAI Script Support + +Microsoft’s GenAI Script supports [ast-grep](https://microsoft.github.io/genaiscript/reference/scripts/ast-grep/)! + +> [GenAIScript](https://microsoft.github.io/genaiscript/) is a scripting language that integrates LLMs into the scripting process using a simplified JavaScript syntax. Supported by our VS Code GenAIScript extension, it allows users to create, debug, and automate LLM-based scripts. + +Notably, GenAIScript provides a wrapper around `ast-grep` to search for patterns within a script's AST and transform that AST. This enables the creation of highly efficient scripts that modify source code by precisely targeting specific code elements. + + +## Upcoming MCP Support + +Looking ahead, ast-grep has a plan to support [Model Context Protocol](https://modelcontextprotocol.io) (MCP). This upcoming feature will further enhance the integration of LLMs with ast-grep, enabling even more sophisticated code analysis and transformation. + +MCP will provide a standardized interface for LLMs to interact with ast-grep, streamlining the process of analyzing and transforming code. Some of the key features of ast-grep MCP include: + +* List all ast-grep's [resources](https://modelcontextprotocol.io/docs/concepts/resources) in the project: rules, utils, and test cases. +* Orchestrate the LLM's actions by providing predefined [prompts](https://modelcontextprotocol.io/docs/concepts/prompts) and workflows. +* Provide [tools](https://modelcontextprotocol.io/docs/concepts/tools) to create/validate rules and search the codebase. + +See the tracking GitHub issue [here](https://github.com/ast-grep/ast-grep/issues/1895) + + +## Conclusion + +ast-grep's integration of LLMs, including `llms.txt`, Codemod Studio, and GenAI Script, represents a significant leap forward in code analysis. With the promise of MCP on the horizon, ast-grep is poised to become an indispensable tool for developers seeking to harness the power of AI to understand, transform, and elevate their code. The future of code analysis is here, and it's powered by ast-grep. diff --git a/website/blog/new-ver-38.md b/website/blog/new-ver-38.md new file mode 100644 index 00000000..da4a0f04 --- /dev/null +++ b/website/blog/new-ver-38.md @@ -0,0 +1,91 @@ +--- +author: + - name: Herrington Darkholme +search: false +date: 2025-05-18 +head: + - - meta + - property: og:type + content: website + - - meta + - property: og:title + content: ast-grep new release 0.38 + - - meta + - property: og:url + content: https://ast-grep.github.io/blog/new-ver-38.html + - - meta + - property: og:description + content: ast-grep 0.38 brings some fantastic new features to improve your code searching and linting experience, alongside a significant internal shift. +--- + +# ast-grep 0.38 is Here + +We're excited to announce the release of ast-grep 0.38! This version brings some fantastic new features to improve your code searching and linting experience, alongside a significant internal shift that paves the way for exciting future developments. + +For those new to ast-grep, it's a powerful command-line tool that lets you search and rewrite code based on its structure (Abstract Syntax Trees or ASTs), not just text. Think of it as `grep` or `sed`, but for code syntax! + +Let's dive into what's new: + +## New Features + +### Customizable Code Highlighting with `labels` + +One of the exciting new additions is the `labels` field for your rule configurations. Previously, ast-grep's highlighting was pre-programmed and could not provide much context. Now, you can customize the highlighting of your matches with labels that are more meaningful and relevant to your codebase. These clearer labels also contribute to a cleaner and more intuitive user interface when viewing diagnostics. + +![Example of Customizable Code Highlighting](/image/blog/labels-demo.png) + +But the benefits don't stop at individual understanding. The labels field offers a fantastic way to embed more guidance directly into your rules, and it allow you to share coding best practices, style guide reminders, or domain-specific knowledge across your entire team. This feature helps disseminate expertise and maintain consistency effortlessly. For example, [Sam Wight](https://github.com/samwightt), the labels feature's proposer, is using ast-grep to help his team to write better [Angular code](/catalog/typescript/missing-component-decorator.html)! + +![Example of VSCode](/image/blog/labels-vscode.jpeg) + +Furthermore, this improved diagnostic experience isn't confined to the command line. The ast-grep VSCode extension now fully respects these labels, bringing this enhanced highlighting via the Language Server Protocol (LSP). You can click on the label message in the VSCode diagnostic popup and jump to the relevant code point! + +### `--json` Output Gets More Informative + +The `--json` output option can now include rule `metadata` when you use the new `--include-metadata` flag. This is helpful for integrating ast-grep into other tools or for more detailed programmatic analysis, e.g. [SonarQube](https://github.com/ast-grep/ast-grep/issues/1987). + +## Tree-sitter Independence + +This is a significant architectural change! Previously, ast-grep was tightly coupled with tree-sitter, a fantastic parser generator tool. While tree-sitter has been foundational to ast-grep's ability to support many languages, this tight coupling had limitations. + +* **Introducing `SgNode`:** We've abstracted the core AST node representation with a new trait called `SgNode`. This makes ast-grep's core logic more flexible and less dependent on a single parsing technology. +* **WASM Power-Up:** The ast-grep WebAssembly (WASM) module, which powers our interactive playground, now directly uses `tree-sitter-web` instead of the wrapper library [`tree-sitter-facade`](https://github.com/ast-grep/tree-sitter-wasm/tree/main/crates/tree-sitter-facade). +* **Paving the Way for the Future:** This independence opens doors for exciting new possibilities: + * **Proof of Concept OXC Integration:** We're exploring [integration](https://github.com/ast-grep/ast-grep/pull/1970) with Oxc, a high-performance JavaScript/TypeScript toolchain written in Rust. Oxc boasts an extremely fast parser, which could bring significant performance benefits to ast-grep for JavaScript and TypeScript projects. + * **Future SWC Integration:** Similarly, we're looking into [leveraging SWC](https://github.com/swc-project/plugins/pull/435), another Rust-based platform for fast JavaScript/TypeScript compilation and transformation. + +This move is all about future-proofing ast-grep and allowing us to adopt the best parsing technologies for different languages and use cases, ultimately leading to a faster and more versatile tool for you. + +## Breaking Changes + +### Dropped Support for Older Linux Versions (glibc < 2.35) + +Due to [an upgrade in the GitHub Actions build images](https://github.com/actions/runner-images/issues/11101), ast-grep binaries are now built on Ubuntu 22.04. This means they rely on a newer version of glibc (GNU C Library). + +**Impact:** Pre-compiled ast-grep binaries will no longer support distributions with glibc versions older than 2.35. For example, Ubuntu 20.04, which has glibc 2.31, is no longer directly supported by our pre-built binaries. This change also impacts [@ast-grep/napi](https://www.npmjs.com/package/@ast-grep/napi). + +**Alternatives:** If you are on an older Linux distribution, you can still use ast-grep by: +* Building it from source. +* Using package managers that might compile it for your specific distribution if available (like AUR for Arch Linux). +* Consider upgrading your system to a more recent version of your Linux distribution. +* Keep using ast-grep 0.37 if you don't want to upgrade your system. + +### Rust Library API Breaking Changes + +For users of ast-grep as a Rust library, please note the following API adjustments: + +* `AstGrep` is now an alias for `Root`. +* Tree-sitter specific methods within the `Language` trait have been moved to a new `LanguageExt` trait. +* `StrDoc` and related types have been relocated to the `ast_grep_core::tree_sitter` module. + +These changes are part of the larger effort to decouple ast-grep from tree-sitter and provide a cleaner, more maintainable library interface. + +## Get Started with 0.38! + +We believe these changes, especially the move towards parser independence and the enhanced diagnostic labeling, will make ast-grep an even more powerful and user-friendly tool for your everyday development tasks. + +Head over to our [GitHub repo](https://github.com/ast-grep/ast-grep) to grab the latest version. Check out the [documentation](https://ast-grep.github.io/) for more details on how to use the new features. + +We're excited to see how you use ast-grep 0.38! As always, your feedback is invaluable, so please don't hesitate to open issues or discussions on our GitHub repository. + +Happy Grepping! diff --git a/website/blog/optimize-ast-grep.md b/website/blog/optimize-ast-grep.md index 1fb6192b..562b5b66 100644 --- a/website/blog/optimize-ast-grep.md +++ b/website/blog/optimize-ast-grep.md @@ -114,7 +114,7 @@ ast-grep can match an AST node by rules, and those rules can be composed togethe For example, the rule `any: [rule1, rule2]` is a composite rule that consists of two sub-rules and the composite rule matches a node when either one of the sub-rules matches the node. This can be expensive since multiple rules must be tried for every node to see if they actually make a match. -I have already forsee it so every rule in ast-grep has an optimzation called `potential_kinds`. AST node in tree-sitter has its own type encoded in a unsigned number called `kind`. +I have already forsee it so every rule in ast-grep has an optimization called `potential_kinds`. AST node in tree-sitter has its own type encoded in a unsigned number called `kind`. If a rule can only match nodes with specific kinds, then we can avoid calling `match_node` for nodes if its kind is not in the `potential_kinds` set. I used a BitSet to encode the set of potential kinds. Naturally the `potential_kinds` of composite rules can be constructed by merging the `potential_kinds` of its sub-rules, according to their logic nature. For example, `any`'s potential_kinds is the union of its sub-rules' potential_kinds, and `all`'s potential_kinds is the intersection of its sub-rules' potential_kinds. diff --git a/website/blog/stars-6000.md b/website/blog/stars-6000.md index 0c1ecd4f..84e60936 100644 --- a/website/blog/stars-6000.md +++ b/website/blog/stars-6000.md @@ -93,4 +93,4 @@ As ast-grep continues to grow, we remain committed to providing a tool that not ![sponsors](/image/blog/sponsor2.png) -We thank each and every one of you, espeically ast-grep's sponsors, for your support, contributions, and feedback that have shaped ast-grep into what it is today. Here's to many more milestones ahead! \ No newline at end of file +We thank each and every one of you, especially ast-grep's sponsors, for your support, contributions, and feedback that have shaped ast-grep into what it is today. Here's to many more milestones ahead! \ No newline at end of file diff --git a/website/blog/stars-8000.md b/website/blog/stars-8000.md new file mode 100644 index 00000000..26cb5883 --- /dev/null +++ b/website/blog/stars-8000.md @@ -0,0 +1,145 @@ +--- +author: + - name: Herrington Darkholme +search: false +date: 2025-03-04 +head: + - - meta + - property: og:type + content: website + - - meta + - property: og:title + content: ast-grep Rockets to 8000 Stars! + - - meta + - property: og:url + content: https://ast-grep.github.io/blog/stars-8000.html + - - meta + - property: og:description + content: ast-grep has recently reached 6000 stars on GitHub! This is a remarkable achievement for the project and I am deeply grateful for all the support and feedback that I have received from the open source community. +--- + +# ast-grep Rockets to 8000 Stars! + +We are absolutely bursting with excitement to announce that ast-grep has soared past **8,000 stars** on GitHub! Every star represents a developer who sees the potential in ast-grep, and we're deeply grateful for your support. + +![stars-8000](/image/blog/stars-8k.jpeg) + +ast-grep's mission to make code searching, linting, and rewriting more accessible and powerful has truly resonated with the community. This blog post is your guide to all the fantastic updates, encompassing both the core ast-grep CLI tool and our ever-improving website. Buckle up, let's explore what's new! + + +## Expanding the Language Universe: YAML, PHP, and More! + +ast-grep is rapidly becoming a truly polyglot code analysis powerhouse! We've significantly expanded our language support to empower you to work with even more of your codebase: + +**YAML Support Arrives!** YAML is the backbone of configuration for countless projects. Now, ast-grep CLI officially speaks [YAML](/catalog/yaml/), allowing you to leverage the same powerful rule system to lint, search, and even rewrite your YAML configuration files. Imagine using ast-grep rules to enforce best practices in your Kubernetes manifests or streamline your CI/CD pipelines! And yes, you can even write ast-grep rules *using YAML* itself! + +**Enhanced PHP Analysis:** We've introduced a dedicated PHP language parser (`php-only-language`) for the CLI. This means more accurate and reliable analysis for your PHP code, helping you catch tricky bugs and enforce code quality standards with greater confidence. + +**Dynamic Languages in APIs:** Python and JavaScript API users, rejoice! You can now tap into dynamic language support within [PyO3](https://github.com/ast-grep/ast-grep/blob/main/crates/pyo3/tests/test_register_lang.py) and [napi](https://github.com/ast-grep/ast-grep/blob/main/crates/napi/__test__/custom.spec.ts). This unlocks exciting possibilities for extending ast-grep's reach and integrating it into even more diverse and dynamic environments. + +**Embedded Language in HTML:** We've refined support for registering [embedded languages](/advanced/language-injection.html) in the CLI, giving you even more flexibility when dealing with complex code structures like searching JavaScript/CSS in HTML. + +## More Powerful Rules & Patterns + +We've been laser-focused on making the ast-grep's rule system an even more powerful and precise tool for code manipulation: + +**CSS inspired `nthChild` Matcher:** [nthChild](/guide/rule-config/atomic-rule.html#nthchild) is a rule to find nodes based on their positions in the parent node's children list. It is heavily inspired by CSS's nth-child pseudo-class and helps you target specific nodes in a more granular way. + +**Pinpoint Precision with `range` Matchers:** Need to refine your rules to target a very specific section of code, even down to the character? ast-grep now supports [range](/guide/rule-config/atomic-rule.html#range) matchers! You can define rules that activate only within a particular line *and* character column range. This is useful for interacting with external tools like compilers. + +**Pattern with `--selector` and `--strictness` in `sg run`:** Need to fine tune your search pattern? The `--selector` and `--strictness` flag in [`sg run`](/reference/cli/run.html#run-specific-options) gives you fine-grained control over pattern matching. + +**Simplified Suppression with `ast-grep-ignore`:** [Suppressing rules](/guide/project/severity.html) just got simpler! You can now use the `ast-grep-ignore` comment directly on the same line as the code you want to exclude. Less clutter, more control. + +**More Robust Partial Pattern Snippet** The `ERROR` node in patterns can now match *anything*. This makes partial pattern snippet even more robust. + +## Sharpening the Code Search CLI + +**Glob Path Matching & Symbolic Link Traversal Unleashed:** CLI users can now leverage the power of [glob patterns](/reference/cli/run.html#globs-globs) to specify file paths and effortlessly traverse [symbolic links](/reference/cli/run.html#follow). Navigating and analyzing your projects is now more intuitive than ever. + +**Rule Entity Inspection & Overwrite: Deeper Insights, More Control:** Gain insights by `--inspect` CLI flag with [semi-structured tracing output](/reference/cli/scan.html#inspect-granularity). This feature empowers advanced users with deeper debugging and customization capabilities. + +**Contextual Code Scanning with Before/After Flags:** Enhance your CLI scan results with surrounding code context using the new `context`, `before`, and `after` flags. Understand the bigger picture around your matches at a glance. + +**Know Your Impact: Fixed Rules Count:** The CLI now prints a count of fixed rules, giving you immediate feedback on the scope of your code modifications. + +**Debugging Supercharged:** We've significantly improved debugging with prettified pattern output, Debug AST/CST visualization, and colorized output via the [`--debug-query`](/reference/cli/run.html#debug-query-format) flag. Troubleshooting and refining your rules is now a much smoother and more visual experience. + + +## Enhanced Tooling and API Experience + +We're committed to providing a seamless developer experience across all of ast-grep's interfaces: + +**Typed `SgNode` and `SgRoot` in NAPI:** For our NAPI users, we've introduced [typed `SgNode` and `SgRoot`](/blog/typed-napi.html), significantly improving type safety and code clarity when working with the API. This enhancement is [initiated](https://github.com/ast-grep/ast-grep/pull/1661) by [mohebifar](https://github.com/mohebifar) from [Codemod](https://codemod.com/). + +**Rule Config in `SgNode` Match Methods:** Flexibility at your fingertips! Rule configurations can now be [passed directly](https://github.com/ast-grep/ast-grep/pull/1730) to `SgNode` match methods like `matches`, `has`, `inside`, `follows`, and `precedes`. Configure your rules dynamically within your code. This feature is also contributed by [mohebifar](https://codemod.com/). + +**New `fieldChildren`:** The new `fieldChildren` method in NAPI and PyO3 provides easier access to named children nodes, simplifying AST traversal and manipulation in your API integrations. + +**Powerful Code Modification in PyO3/NAPI:** Unlock advanced code modification features with Fix Related Features and Modify Edit Range in [PyO3](/guide/api-usage/py-api.html#fix-code)/[NAPI](/guide/api-usage/js-api.html#fix-code). Refactoring and code transformation just got even more powerful from within your Python and JavaScript code. + +**Smaller, Faster NAPI Binaries:** We've reduced the NAPI binary size, resulting in smaller downloads and faster installations – get up and running with ast-grep even quicker! + +**Robust Python Integration:** Typings for PyO3 and strictness improvements in PyO3/YAML enhance the overall robustness and reliability of our Python integration. + +## Website: Documentation & Interactive Exploration + +The ast-grep website isn't just a static page; it's your interactive command center for learning, exploring, and mastering ast-grep! We've poured significant effort into expanding and refining the website to be your ultimate resource: + +**Documentation Deep Dive:** We've massively expanded and clarified the documentation, with deeper dives into crucial topics, clearer explanations of pattern objects, a comprehensive FAQ, and enhanced API documentation. Whether you're a beginner or an expert, you'll find valuable resources to level up your ast-grep skills. + +**Revamped Blog Section:** Dive into in-depth articles and latest news in the [brand-new blog section](/blog.html). Stay up-to-date with the latest ast-grep insights and learn from real-world examples. + +**Improved Sections & Navigation:** Finding what you need is now easier than ever with a reorganized and polished section and improved overall website navigation. + +**Website Stability & Polish:** We've squashed styling issues, resolved mobile responsiveness problems, fixed typing errors, and eliminated broken links to ensure a smooth and reliable browsing experience across all devices. + +### Interactive Example Catalog: Learn by Doing! + +The [example catalog](https://ast-grep.github.io/catalog) has received a major upgrade, transforming it into an interactive learning environment: + +**Interactive Rule Exploration:** Dive deep into rules with interactive features like Rule Display & Extraction, MetaVar Panel, Matched Labeling, Pattern Debugger, Selector Explorer, and Pattern Configuration & Icons. Dissect rules, understand their components, and visualize how they work – all in your browser! + +**Effortless Rule Discovery:** Finding the right rule is now a breeze with new filters for language and sorting options. + +**Enhanced Usability:** Small but mighty additions like Empty Filter and Rule Counting further enhance the catalog's ease of use. + +See [the youtube video](https://www.youtube.com/watch?v=oNbOoBhVL8o) for a live demo. + +### Playground Power-Ups: Your Online Rule Lab + +The online playground at [https://ast-grep.github.io/](https://ast-grep.github.io/) is now an even more powerful lab for experimenting and refining your rules: + +**Parser Version Visibility:** Small popups now display the tree-sitter version used in the playground, giving you valuable context for your rule testing. + +**Reset & Counter Enhancements:** Thanks to [@zhangmo8](https://github.com/zhangmo8), we've added a Reset Button and a match counter to further streamline your playground workflow. + +**CSS Support in Playground:** The online playground now speaks CSS! Test your ast-grep rules directly on CSS code snippets. + +## Performance Unleashed + +We're obsessed with speed and efficiency! Here are the performance enhancements we've delivered in the CLI: + +**Leaner Binaries, Faster Performance:** Optimized printer implementation has resulted in significant binary size reduction and improved overall performance. + +**Intelligent File Scanning:** ast-grep now only scans rule-sensitive files, dramatically improving performance for large projects. Less scanning, faster results! + +**`cargo binstall` for Instant Installs:** Faster installation is now a reality with `cargo binstall` support. Get pre-built binaries and get analyzing your code in record time. + +**Configurable Threads: Fine-Tune for Your Machine:** Fine-tune performance by configuring the number of threads ast-grep uses. Optimize ast-grep for your specific hardware and project needs. + +... and of course, numerous bug fixes under the hood to ensure a smoother, more reliable experience! + +## 🎉 Thank You - From the Bottom of Our Hearts! 🎉 + +Reaching over 8000 stars is an absolutely fantastic milestone, and it's all thanks to *you*, our incredible community! We are deeply grateful for your unwavering support, invaluable feedback, detailed bug reports, inspiring feature requests, and generous code contributions. You are the fuel that powers ast-grep's rocket! + +**Get Started & Get Involved Today!** + +* **Explore the Enhanced Website:** Dive into the wealth of resources at [https://ast-grep.github.io/](https://ast-grep.github.io/) +* **Star us on GitHub!** Show your support and help us reach the next milestone: [Star the GitHub Repo](https://github.com/ast-grep/ast-grep) +* **Try out the New Features & Give Feedback:** Join the conversation on [Discord](https://discord.com/invite/4YZjf6htSQ) and tell us what you think! +* **Contribute Rules to the Example Catalog:** Share your expertise and help others by [contributing rules](https://github.com/ast-grep/ast-grep.github.io/tree/main/website/catalog). +* **Report Bugs & Feature Requests:** Help us make ast-grep even better by reporting issues and suggesting new features on [GitHub Issues](https://github.com/ast-grep/ast-grep/issues) + +We're incredibly excited to continue this journey with you! Let's keep pushing the boundaries of code searching, linting, and rewriting, making it more powerful and accessible for everyone! 🚀 ✨ \ No newline at end of file diff --git a/website/blog/typed-napi.md b/website/blog/typed-napi.md index f78f0aca..6ee8e6f5 100644 --- a/website/blog/typed-napi.md +++ b/website/blog/typed-napi.md @@ -170,7 +170,7 @@ class SgNode = Kinds> { } ``` -It represents a node in a language with type map `M` that has a specific kind `K`. e.g. `SgNode` means a function declaration node in TypeScript. When used without a specific kind parameter, `SgNode` defaults to accepting any valid node kind in the language. +It represents a node in a language with type map `M` that has a specific kind `K`. E.g. `SgNode` means a function declaration node in TypeScript. When used without a specific kind parameter, `SgNode` defaults to accepting any valid node kind in the language. `SgNode` provides a **correct** AST interface in a specific language. While at the same time, it is still **robust** enough to not trigger compiler error when no type information is available. diff --git a/website/blog/yaml-vs-dsl.md b/website/blog/yaml-vs-dsl.md new file mode 100644 index 00000000..9a3b3187 --- /dev/null +++ b/website/blog/yaml-vs-dsl.md @@ -0,0 +1,223 @@ +--- +author: + - name: Herrington Darkholme +search: false +date: 2025-07-07 +head: + - - meta + - property: og:type + content: website + - - meta + - property: og:title + content: 'YAML vs DSL: comparison is subjective' + - - meta + - property: og:url + content: https://ast-grep.github.io/blog/yaml-vs-dsl.html + - - meta + - property: og:description + content: YAML and DSL are two different approaches to configure rule in structural search. The question "which is better" is largely subjective. + +--- + +# YAML vs DSL: comparison is subjective + +As stated in the [tool comparison](/advanced/tool-comparison.html#gritql), YAML configuration and DSL (Domain Specific Language) are two different approaches to configure rules in structural search. The question "which is better" is largely subjective. + +However, recently I have received some feedback that YAML is __objectively__ not as good as DSL, and I would like to clarify some points. + + +The original argument is quoted as follows: + +> While I see you're trying to dismiss it as a preference, I see it as a fundamental blocker. ast-grep has effectively built a DSL inside YAML. This becomes pretty apparent from your documentation, where you have to extensively explain how pattern syntax works, how metavariables work, etc.. You have to see that arguments such as "it's just YAML, no new syntax to learn" aren't entirely true either. Now IMO, if you're creating a DSL anyway, you're better off doing it properly than to go halfway. With GritQL we get syntax highlighting for all the aspects of the DSL, which I think is a significant boost. I think GritQL queries are significantly easier to read than ast-grep's mix of DSL of YAML. + +## Direct rebuttal to the argument + +### Abstraction does not necessitate DSL + +> effectively built a DSL inside YAML + +This is a misunderstanding of DSL and abstraction. To model Abstract Syntax Tree (AST) manipulation, you will have to have some form of concepts, such as pattern, metavariable, etc. This is true for both DSL and YAML. You cannot cut more concepts out of the tool even if you have [Occam's razor](https://en.wikipedia.org/wiki/Occam%27s_razor). + +ast-grep does support pattern. It is a concept to match a strcture that contains multiple AST nodes, which makes it easier to write a rule. You can use `kind`/`has`/`all` to simulate pattern matching. But it does not mean that ast-grep should cut the concept of pattern since it looks like a DSL. In fact, ast-grep's pattern is just one of its [atomic rules](/guide/rule-config/atomic-rule.html). It does not meant to be a special embedded DSL. + +### Pattern has its limitations + +> your documentation, where you have to extensively explain how pattern syntax works, how pattern syntax works, how metavariables work + +As stated before, pattern makes ast-grep users' life easier. Explaining how pattern works is necessary to help users understand how to write rules. This is not a sign of a DSL being necessary, but rather a sign of the limitation of pattern: it is not general enough to cover all cases, and you have to communicate to your users how pattern works in your system. For example, see this [tweet](https://x.com/hd_nvim/status/1941876968363798766) about how to write a pattern to match `function` declation in JavaScript. Another brain teaser, how to tell if `$a = $b` is an `assignment_expression` or `field_initializer`? + +(an [ad-hominen](https://en.wikipedia.org/wiki/Ad_hominem) note: it is ironic to see this argument from a tool without proper documentation. I cannot suspend my suspect whether the author has used pattern to write non-trivial rules at all.) + +### Slippery slope fallacy + +> if you're creating a DSL anyway, you're better off doing it properly than to go halfway + +This argument is a [slippery slope fallacy](https://en.wikipedia.org/wiki/Slippery_slope). Using pattern syntax does not mean that other rules should also be written in DSL. Again, pattern is just one of ast-grep's rules. ast-grep compose smaller rules to form more complex rules. ast-grep's rule system is not DSL based, but rather using YAML's key-value pair to represent rules. Using syntax in one rule does not imply that all rules should be combined in DSL. + +Using one concept in your library, framework or tool does not imply that you have to design a whole new syntax for it. The similar comparison will be frontend frameworks. Some frameworks like React and Vue use [hook](https://react.dev/reference/react/hooks) or [signals](https://dev.to/this-is-learning/the-evolution-of-signals-in-javascript-8ob) to represent state changes. But using these building blocks does not grant the verdict to design a new language for your frontend framework. Even the most avant-garde company only introduces [new syntax](https://flow.org/en/docs/react/hook-syntax/) in JavaScript, not inventing a new language. + + +### Subjective opinion is not objective fact + +> I think GritQL queries are significantly easier to read than ast-grep's mix of DSL of YAML. + +This is a subjective opinion, instead of an fundamental blocker. The author failed to capture the difference between _"pattern syntax"_ and _"rule system"_. ast-grep's rule system is YAML based, so it is easier to write a [well-formed](https://en.wikipedia.org/wiki/Well-formedness) rule. Instead, DSL based rule system using their own syntax and can be more difficult to write a valid rule, especially for beginners. + +We can also see using DSL is not subjectively better than YAML as well. + +## Subjective Comparison of DSL + +Let's review the DSL mentioned above. + +### Mix of several different paradigms + +Biome's DSL is a mix of several different paradigms: declarative, logic, and imperative. Let's see one example: + +```JavaScript +`$method($message)` where { + $method <: `console.log`, + if ($message <: r"Hello, .*!") { + $linter = "hello world" + } else { + $linter = "not hello" + }, + register_diagnostic( + span = $method, + message = $linter + ) +} +``` + +* `$method('$message')` is a declarative pattern matching syntax. +* `where` and `<:` are related to [logic programming](https://en.wikipedia.org/wiki/Logic_programming#:~:text=Logic%20programming%20is%20a%20programming,solve%20problems%20in%20the%20domain.) paradigm, say, [Prolog](https://en.wikipedia.org/wiki/Prolog) or SQL. +* `if` is a typical imperative programming paradigm + +The mixture of paradigms does not blend well. At least, in the eye of a programming language veteran, it is too messy for a DSL for linting or structural search. We are not designing a next-era programming language. + +### Easy to miss comma + +Did you notice there is two trailing commas in `$method <: console.log` and if block? + +```JavaScript{2,7} +`$method($message)` where { + $method <: `console.log`, // [!code focus] + if ($message <: r"Hello, .*!") { + $linter = "hello world" + } else { + $linter = "not hello" + }, // [!code focus] + register_diagnostic( + span = $method, + message = $linter + ) +} +``` + +Without them you will get a syntax error. This is a common problem for beginners to miss commas, a typical pitfall only in DSL. Alas, I can still remeber the old day when C compiler complained about missing semicolon. + +### Similar basic patterns have distinct syntax appearance + +There are several different basic patterns in the DSL. Though they are at the similar level of abstraction, their appearance is totally different. + +```JavaScript +`console.log($foo)` // pattern +augmented_assignment_expression(operator = $op, left = $x, right = $v) // syntax node +r"Hello, (.*)"($name) // regex +``` + +These patterns are corresponding to `pattern`, `kind` and `regex` in ast-grep. However, they look totally different. You need more learning to pick up these distinct syntax. + +### Similar syntax appearance have different meaning + +One common pitfall to design DSL is that similar syntax have different meaning. + +```JavaScript +// this is a syntax node call +augmented_assignment_expression(operator = $op) +pattern console_method_to_info($method) { + `console.$method($message)` => `console.info($message)` +} +// this is a pattern call +console_method_to_info(method = `log`) +predicate program_contains_logger() { + $program <: contains `logger` +} +// this is a predicate call +program_contains_logger() + +// define a lines function +function lines($string) { + return split($string, separator=`\n`) +} +// this is a function call +lines(string = $message) +``` + +They all look like function calls, but they are not. See explanation below for the differences. + +### Confusing Concepts of `pattern`, `predicate` and `function` + +These three concepts are very similar, but they have slightly different usage in the DSL. + +* `pattern` is used in `<:` or somewhere else, I dunno, the doc does not explain it well. +* `predicate` is used in `where` condition. +* `function` is used in `assignment`, `insertion` or `rewrite`. + +Example: + +```JavaScript +`console.log` => `logger.info` where { + $program <: contains_logger(), // pattern + program_contains_logger(), // equivalent predicate + $program => replace_logger(), // function +} +``` + +### Confusing Concepts of `condition`, `clause` and `modifier` + +The DSL also has three similar concepts: `condition`, `clause` and `modifier`. +Introduced in different places, [here](https://docs.grit.io/language/conditions) and [here](https://docs.grit.io/language/modifiers), without clear definition. + +### Similar patterns but applied in different places + +Tell the difference between [and](https://docs.grit.io/language/modifiers#and-clause), [any](https://docs.grit.io/language/modifiers#any-clause), [some](https://docs.grit.io/language/modifiers#some-clause) and [every](https://docs.grit.io/language/modifiers#every-clause). +Confusing? You should learn the difference between meta var in [list pattern](https://docs.grit.io/language/modifiers#list-patterns) and plain meta var. Also, don't confuse list meta var with [spread meta var](https://docs.grit.io/language/patterns#metavariables) + +### One more thing, variable scope. + +If you still have patience, you need one last thing to learn: variable scope. + +I have no better explanation for it since I don't understand it well, so I will quote the [official documentation](https://docs.grit.io/language/bubble): + +> Once a metavariable is bound to a value, it retains this value throughout the target code. Therefore, the scope of the metavariable spans the entire target file. + +To fully understand it, you also need to know `bubble`, `bubble($argument)` and pattern auto wrap. + +## What can go even more wrong? + +Integrating a custom linting rule from another parser ecosystem to your own has several more decisions to make. Making bad decisions can lead to even more confusion. + +* Your pattern syntax includes non standard syntax, like `$...`. You need to [change your parser](https://github.com/biomejs/biome/blob/31e439674493da76e0ce213e5660be3d903efbef/crates/biome_js_parser/src/syntax/jsx/mod.rs#L321) to support it. +* You need to make a decision if you want to support existing pattern libraries. But these patterns are built upon [tree-sitter](https://tree-sitter.github.io/tree-sitter/). So you have to [map tree-sitter AST to your own](https://github.com/biomejs/biome/blob/7bf9a608e1592fd595f658f5f800e12d51835d34/crates/biome_grit_patterns/src/grit_target_language/js_target_language.rs#L42-L55) +* Even worse, if you chose to support existing pattern libraries, you also need to work on a general algorithm to handle incompatibility between different ASTs. For example, different AST structures, different node names, different node properties, etc. +* If you only supports part of it, how can you teach your users what is supported and what is not, without [reading the source](https://github.com/biomejs/biome/blob/7bf9a608e1592fd595f658f5f800e12d51835d34/crates/biome_grit_patterns/src/grit_target_language/js_target_language.rs#L48-L50)? +* You also need to update your playground or editor plugins to support mapping between tree-sitter AST and your own AST. And teach users to use it. + +## Conclusion + +If you also feel confused, you are not alone. Again, the preference of DSL over YAMl is largely subjective. + +If you think DSL is better, you are right. [You are absolutely right](https://www.reddit.com/r/ClaudeAI/comments/152b51r/you_are_absolutely_right/). In fact, you are [not even wrong](https://en.wikipedia.org/wiki/Not_even_wrong). Since this is a subjective opinion, not an objective fact. + +If you are a library or framework author, you can make decision based on your own preference. However, mistakenly thinking your preference is objective will lead to confusion and misunderstanding. It may even reflect inferior tech taste and judgement. + +Consider these points when you want to have objective comparison: + +* Documentation? +* User Education? Howe you teach users to write your DSL? +* Tooling support like [playground](/playground.html). +* Editor support beyong syntax highlighting. Say LSP. +* Integration with API, how you bring type-safe DSL into your general purpose programming language, like [graphql](https://github.com/Quramy/ts-graphql-plugin) and [styled component](https://github.com/styled-components/typescript-styled-plugin). +* Broader ecosystem support, such as GitHub language detection, AI support, etc. + +If you are going to use native tooling in your JavaScript/TypeScript project, I recommend you to use [oxlint](https://oxc.rs/) and, if you need simple custom rules, [ast-grep](https://ast-grep.github.io/). diff --git a/website/catalog/go/match-package-import.md b/website/catalog/go/match-package-import.md new file mode 100644 index 00000000..7880709d --- /dev/null +++ b/website/catalog/go/match-package-import.md @@ -0,0 +1,54 @@ +## Match package import in Golang + +* [Playground Link](/playground.html#eyJtb2RlIjoiQ29uZmlnIiwibGFuZyI6ImdvIiwicXVlcnkiOiIiLCJyZXdyaXRlIjoiIiwic3RyaWN0bmVzcyI6InNtYXJ0Iiwic2VsZWN0b3IiOiIiLCJjb25maWciOiJpZDogbWF0Y2gtcGFja2FnZS1pbXBvcnRcbmxhbmd1YWdlOiBnb1xucnVsZTpcbiAga2luZDogaW1wb3J0X3NwZWNcbiAgaGFzOlxuICAgIHJlZ2V4OiBnaXRodWIuY29tL2dvbGFuZy1qd3Qvand0Iiwic291cmNlIjoicGFja2FnZSBtYWluXG5cbmltcG9ydCAoXG5cdFwiZm10XCJcblx0XCJnaXRodWIuY29tL2dvbGFuZy1qd3Qvand0XCIgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgQVNUIHJ1bGVcbilcblxuZnVuYyBtYWluKCkge1xuXHQvLyBDcmVhdGUgYSBuZXcgdG9rZW5cblx0dG9rZW4gOj0gand0Lk5ldyhqd3QuU2lnbmluZ01ldGhvZEhTMjU2KVxuXHRcblx0Ly8gQWRkIHNvbWUgY2xhaW1zXG5cdHRva2VuLkNsYWltcyA9IGp3dC5NYXBDbGFpbXN7XG5cdFx0XCJ1c2VyXCI6IFwiYWxpY2VcIixcblx0XHRcInJvbGVcIjogXCJhZG1pblwiLFxuXHR9XG5cdFxuXHQvLyBTaWduIHRoZSB0b2tlblxuXHR0b2tlblN0cmluZywgZXJyIDo9IHRva2VuLlNpZ25lZFN0cmluZyhbXWJ5dGUoXCJteS1zZWNyZXRcIikpXG5cdGlmIGVyciAhPSBuaWwge1xuXHRcdGZtdC5QcmludGYoXCJFcnJvciBzaWduaW5nIHRva2VuOiAldlxcblwiLCBlcnIpXG5cdFx0cmV0dXJuXG5cdH1cblx0XG5cdGZtdC5QcmludGYoXCJHZW5lcmF0ZWQgdG9rZW46ICVzXFxuXCIsIHRva2VuU3RyaW5nKVxufSJ9) + +### Description + +A generic rule template for detecting imports of specific packages in Go source code. This rule can be customized to match any package by modifying the regex pattern, making it useful for security auditing, dependency management, and compliance checking. + +This rule identifies Go import statements based on the configured regex pattern, including: + +Direct imports: `import "package/name"` +Versioned imports: `import "package/name/v4"` +Subpackage imports: `import "package/name/subpkg"` +Grouped imports within `import () blocks` + +### YAML + +```yaml +id: match-package-import +language: go +rule: + kind: import_spec + has: + regex: PACKAGE_PATTERN_HERE +``` + +### Example + +JWT Library Detection + +```go{5} +package main + +import ( + "fmt" + "github.com/golang-jwt/jwt" // This matches the AST rule +) + +func main() { + token := jwt.New(jwt.SigningMethodHS256) // Create a new token + // Add some claims + token.Claims = jwt.MapClaims{"user": "alice", "role": "admin"} + tokenString, err := token.SignedString([]byte("my-secret")) // Sign the token + if err != nil { + fmt.Printf("Error signing token: %v\n", err) + return + } + fmt.Printf("Generated token: %s\n", tokenString) +} +``` + +### Contributed by + +[Sudesh Gutta](https://github.com/sudeshgutta) diff --git a/website/catalog/index.md b/website/catalog/index.md index a1c3aa9d..938946ab 100644 --- a/website/catalog/index.md +++ b/website/catalog/index.md @@ -3,7 +3,7 @@ Get confused what ast-grep is? This is a list of rewriting rule to inspire you! Explore the power of ast-grep with these rewriting rules that can transform your code in seconds. -Feel free to join our [Discord](https://discord.gg/4YZjf6htSQ) channel and ask @ast-grep-bot to explain the rules for you line by line! +Feel free to join our [Discord](https://discord.gg/4YZjf6htSQ) channel or ask [Codemod AI](https://app.codemod.com/studio?ai_thread_id=new) to explain the rules for you line by line! + +## Atomic Rules Cheat Sheet + +These are your precision tools, matching individual AST nodes based on their inherent properties. + + + + + +```yaml +pattern: console.log($ARG) +``` + +🧩 Match a node by code structure. e.g. `console.log` call with a single `$ARG` + + + + + +```yaml +pattern: + context: '{ key: value }' + selector: pair +``` + +🧩 To parse ambiguous patterns, use `context` and specify `selector` AST to search. + + + + + +```yaml +kind: if_statement +``` +🏷️ Match an AST node by its `kind` name + + + + +```yaml +regex: ^regex.+$ +``` + +🔍 Matches node text content against a [Rust regular expression](https://docs.rs/regex/latest/regex/) + + + + + +```yaml +nthChild: 1 +``` + +🔢 Find a node by its **1-based index** among its _named siblings_ + + + + + +```yaml +nthChild: + position: 2 + reverse: true + ofRule: { kind: argument_list } +``` + +🔢 Advanced positional control: `position`, `reverse` (count from end), or filter siblings using `ofRule` + + + + + +```yaml +range: + start: { line: 0, column: 0 } + end: { line: 0, column: 13 } +``` + +🎯 Matches a node based on its character span: 0-based, inclusive start, exclusive end + + + + + +## Relational Rules Cheat Sheet + +These powerful rules define how nodes relate to each other structurally. Think of them as your AST GPS! + + + + + +```yaml +inside: + kind: function_declaration +``` + +🏠 Target node must appear **inside** its _parent/ancestor_ node matching the sub-rule + + + + + +```yaml +has: + kind: method_definition +``` + +🌳 Target node must **have** a _child/descendant_ node matching the sub-rule + + + + + +```yaml +has: + kind: statement_block + field: body +``` + +🌳 `field` makes `has`/`inside` match nodes by their [semantic role](/advanced/core-concepts.html#kind-vs-field) + + + + + +```yaml +precedes: + pattern: function $FUNC() { $$ } +``` + +◀️ Target node must appear _before_ another node matching the sub-rule + + + + + +```yaml +follows: + pattern: let x = 10; +``` + +▶️ Target node must appear _after_ another node matching the sub-rule. + + + + + +```yaml +inside: + kind: function_declaration + stopBy: end +``` + +🏠 `stopBy` makes relational rules search all the way to the end, not just immediate neighbors. + + + + + +## Composite Rules Cheat Sheet + +Combine multiple rules using Boolean logic. Crucially, these operations apply to a single target node! + + + + + +```yaml +all: + - pattern: const $VAR = $VALUE + - has: { kind: string_literal } +``` + +✅ Node must satisfy **ALL** the rules in the list. + + + + + +```yaml +any: + - pattern: let $X = $Y + - pattern: const $X = $Y +``` + +🧡 Node must satisfy **AT LEAST ONE** of the rules in the list. + + + + + +```yaml +not: + pattern: console.log($$) +``` + +🚫 Node must **NOT** satisfy the specified sub-rule. + + + + + +```yaml +matches: is-function-call +``` + +🔄 Matches the node if that utility rule matches it. Your gateway to modularity! + + + + + +## Utility Rules Cheat Sheet + +Define reusable rule definitions to cut down on duplication and build complex, maintainable rule sets. + + + + + +```yaml +rules: + - id: find-my-pattern + rule: + matches: my-local-check +utils: + my-local-check: + kind: identifier + regex: '^my' +``` + +🏡 Defined within the `utils` field of your current config file. Only accessible within that file. + + + + + +```yaml +# In utils/my-global-check.yml +id: my-global-check +language: javascript +rule: + kind: variable_declarator + has: + kind: number_literal +``` + +🌍 Defined in separate YAML files in global `utilsDirs` folders, accessible across your entire project. + + + + diff --git a/website/cheatsheet/yaml.md b/website/cheatsheet/yaml.md new file mode 100644 index 00000000..59403ddd --- /dev/null +++ b/website/cheatsheet/yaml.md @@ -0,0 +1,240 @@ +# Config Cheat Sheet + +This cheat sheet provides a concise overview of ast-grep's linter rule YAML configuration. It's designed as a handy reference for common usage. + + + + +## Basic Information + +Core details that identify and define your rule and miscellaneous keys for documentation and custom data. + + + + +```yaml +id: no-console-log +``` + +🆔 A unique, descriptive identifier for the rule. + + + + + +```yaml +language: JavaScript +``` + +🌐 The programming language the rule applies to. + + + + + + +```yaml +url: 'https://doc.link/' +``` +🔗 A URL to the rule's documentation. + + + + + + +```yaml +metadata: { author: 'John Doe' } +``` + +📓 metadata A dictionary for custom data related to the rule. + + + + + +## Finding + +Keys for specifying what code to search for. + + + + + +```yaml +rule: + pattern: 'console.log($$$ARGS)' +``` + +🎯 The core `rule` to find matching AST nodes. + + + + + +```yaml +constraints: + ARG: { kind: 'string' } } +``` + +⚙️ Additional `constraints` rules to filter meta-variable matches. + + + + + +```yaml +utils: + is-react: + kind: function_declaration + has: { kind: jsx_element } +``` + +🛠️ A dictionary of reusable utility rules. Use them in `matches` to modularize your rules. + + + + + + +## Patching + +Keys for defining how to automatically fix the found code. + + + + + + +```yaml +transform: + NEW_VAR: + substring: {endChar: 1, source: $V} +``` + +🎩 `transform` meta-variables before they are used in `fix`. + + + + + +```yaml +transform: + NEW_VAR: substring($V, endChar=1) +``` + +🎩 `transform` also accepts string form. + + + + + +```yaml +fix: "logger.log($$$ARGS)" +``` + +🔧 A `fix` string to auto-fix the matched code. + + + + + +```yaml +fix: + template: "logger.log($$$ARGS)" + expandEnd: rule +``` + +🔧 Fix also accepts `FixConfig` object. + + + + + +```yaml +rewriters: +- id: remove-quotes + rule: { pattern: "'$A'" } + fix: "$A" +``` + +✍️ A list of `rewriters` for complex transformations. + + + + + +## Linting + +Keys for configuring the messages and severity of reported issues. + + + + + +```yaml +severity: warning +``` + +⚠️ The `severity` level of the linting message. + + + + + +```yaml +message: "Avoid using $MATCH in production." +``` + +💬 A concise `message` explaining the rule. Matched $VAR can be used. + + + + + +```yaml +note: + Use a _logger_ instead of `console` +``` + +📌 More detailed `note`. It supports Markdown format. + + + + + +```yaml +labels: + ARG: + style: 'primary' + message: 'The argument to log' +``` + +🎨 Customized `labels` for highlighting parts of the matched code. + + + + + +```yaml +files: ['src/**/*.js'] +``` + +✅ Glob `files` patterns to include files for the rule. + + + + + +```yaml +ignores: ['test/**/*.js'] +``` + +❌ Glob patterns to exclude files from the rule. + + + + diff --git a/website/contributing/add-lang.md b/website/contributing/add-lang.md index 0a6ac8b7..2219d7dc 100644 --- a/website/contributing/add-lang.md +++ b/website/contributing/add-lang.md @@ -151,7 +151,7 @@ Then, in your parser repository, use this command to build a WASM file. ```bash tree-sitter generate # if grammar is not generated before -tree-sitter build-wasm +tree-sitter build --wasm ``` Note you may need to install [docker](https://www.docker.com/) when building WASM files. diff --git a/website/guide/api-usage/js-api.md b/website/guide/api-usage/js-api.md index 5a1f38f2..a2053ce0 100644 --- a/website/guide/api-usage/js-api.md +++ b/website/guide/api-usage/js-api.md @@ -85,7 +85,7 @@ It has several jQuery like methods for us to search, filter and inspect the AST ```js const log = root.find('console.log($A)') // search node const arg = log.getMatch('A') // get matched variable -log.text() // "hello world" +arg.text() // "hello world" ``` Let's see its details in the following sections! diff --git a/website/guide/introduction.md b/website/guide/introduction.md index 6e3549c0..7faece42 100644 --- a/website/guide/introduction.md +++ b/website/guide/introduction.md @@ -10,7 +10,7 @@ head: ## Introduction -ast-grep is a new AST based tool for managing your code, at massive scale. +ast-grep is a new AST based tool to manage your code, at massive scale. Using ast-grep can be as simple as running a single command in your terminal: @@ -24,12 +24,14 @@ The command above will replace `var` statement with `let` for all + \ No newline at end of file diff --git a/website/public/image/blog/gemini.jpeg b/website/public/image/blog/gemini.jpeg new file mode 100644 index 00000000..84227d7b Binary files /dev/null and b/website/public/image/blog/gemini.jpeg differ diff --git a/website/public/image/blog/labels-demo.png b/website/public/image/blog/labels-demo.png new file mode 100644 index 00000000..eff38451 Binary files /dev/null and b/website/public/image/blog/labels-demo.png differ diff --git a/website/public/image/blog/labels-vscode.jpeg b/website/public/image/blog/labels-vscode.jpeg new file mode 100644 index 00000000..5e625792 Binary files /dev/null and b/website/public/image/blog/labels-vscode.jpeg differ diff --git a/website/public/image/blog/stars-8k.jpeg b/website/public/image/blog/stars-8k.jpeg new file mode 100644 index 00000000..e2d4612a Binary files /dev/null and b/website/public/image/blog/stars-8k.jpeg differ diff --git a/website/public/langs/c.svg b/website/public/langs/c.svg index 8b90642e..707fefb1 100644 --- a/website/public/langs/c.svg +++ b/website/public/langs/c.svg @@ -1,4 +1,3 @@ - \ No newline at end of file + + + diff --git a/website/public/parsers/tree-sitter-c.wasm b/website/public/parsers/tree-sitter-c.wasm old mode 100755 new mode 100644 diff --git a/website/public/parsers/tree-sitter-css.wasm b/website/public/parsers/tree-sitter-css.wasm old mode 100755 new mode 100644 diff --git a/website/public/parsers/tree-sitter-elixir.wasm b/website/public/parsers/tree-sitter-elixir.wasm old mode 100755 new mode 100644 diff --git a/website/public/parsers/tree-sitter-go.wasm b/website/public/parsers/tree-sitter-go.wasm old mode 100755 new mode 100644 diff --git a/website/public/parsers/tree-sitter-json.wasm b/website/public/parsers/tree-sitter-json.wasm old mode 100755 new mode 100644 diff --git a/website/public/parsers/tree-sitter-rust.wasm b/website/public/parsers/tree-sitter-rust.wasm old mode 100755 new mode 100644 diff --git a/website/public/parsers/tree-sitter-scala.wasm b/website/public/parsers/tree-sitter-scala.wasm old mode 100755 new mode 100644 index 08eef2f5..6f76cbe0 Binary files a/website/public/parsers/tree-sitter-scala.wasm and b/website/public/parsers/tree-sitter-scala.wasm differ diff --git a/website/public/parsers/tree-sitter-swift.wasm b/website/public/parsers/tree-sitter-swift.wasm old mode 100755 new mode 100644 diff --git a/website/public/parsers/tree-sitter-tsx.wasm b/website/public/parsers/tree-sitter-tsx.wasm old mode 100755 new mode 100644 diff --git a/website/public/schema.json b/website/public/schema.json index 48d12e7e..534a4fed 100644 --- a/website/public/schema.json +++ b/website/public/schema.json @@ -560,6 +560,9 @@ "Transformation": { "description": "Represents a transformation that can be applied to a matched AST node. Available transformations are `substring`, `replace` and `convert`.", "oneOf": [ + { + "type": "string" + }, { "type": "object", "required": [ @@ -635,4 +638,4 @@ } } } -} \ No newline at end of file +} diff --git a/website/public/tree-sitter.wasm b/website/public/tree-sitter.wasm old mode 100755 new mode 100644 diff --git a/website/reference/api.md b/website/reference/api.md index 4606ae79..3eb0b8c4 100644 --- a/website/reference/api.md +++ b/website/reference/api.md @@ -14,7 +14,8 @@ https://github.com/ast-grep/ast-grep/blob/main/crates/napi/index.d.ts ### Supported Languages -`@ast-grep/napi` supports all builtin languages listed [here](/reference/languages.html). +`@ast-grep/napi` supports JS ecosystem languages by default. +More custom languages can be loaded via [`registerDynamicLanguage`](https://github.com/search?q=repo%3Aast-grep%2Flangs%20registerDynamicLanguage&type=code). #### Type @@ -25,26 +26,15 @@ export const enum Lang { Tsx = 'Tsx', Css = 'Css', TypeScript = 'TypeScript', - Bash = 'Bash', - C = 'C', - Cpp = 'Cpp', - CSharp = 'CSharp', - Go = 'Go', - Elixir = 'Elixir', - Haskell = 'Haskell', - Java = 'Java', - Json = 'Json', - Kotlin = 'Kotlin', - Lua = 'Lua', - Php = 'Php', - Python = 'Python', - Ruby = 'Ruby', - Rust = 'Rust', - Scala = 'Scala', - Swift = 'Swift' } + +// More custom languages can be loaded +// see https://github.com/ast-grep/langs +type CustomLang = string & {} ``` +`CustomLang` is not widely used now. If you have use case and needs support, please file an issue in the [@ast-grep/langs](https://github.com/ast-grep/langs?tab=readme-ov-file#packages) repository. + ### Main functions You can use `parse` to transform a string to ast-grep's main object `SgRoot`. @@ -166,7 +156,6 @@ interface NapiConfig { rule: object constraints?: object language?: FrontEndLanguage - // @experimental transform?: object utils?: object } @@ -203,12 +192,12 @@ interface Edit { * [Test Case Source](https://github.com/ast-grep/ast-grep/blob/main/crates/napi/__test__/index.spec.ts) for `@ast-grep/napi` * ast-grep usage in [vue-vine](https://github.com/vue-vine/vue-vine/blob/b661fd2dfb54f2945e7bf5f3691443e05a1ab8f8/packages/compiler/src/analyze.ts#L32) - ### Language Object (deprecated) +:::details language objects are deprecated + `ast-grep/napi` also has special language objects for `html`, `js` and `css`. They are deprecated and will be removed in the next version. -:::details A language object has following methods. ```ts diff --git a/website/reference/cli.md b/website/reference/cli.md index 8fefc589..5aaf9dfe 100644 --- a/website/reference/cli.md +++ b/website/reference/cli.md @@ -62,6 +62,7 @@ ast-grep scan [OPTIONS] [PATHS]... | -r | --rule ``| Scan the codebase with the single rule located at the path `RULE_FILE`.| | | --inline-rules `` | Scan the codebase with a rule defined by the provided `RULE_TEXT` | | | --filter `` |Scan the codebase with rules with ids matching `REGEX` | +| | --include-metadata | Include rule metadata in the json output | | -j | --threads `` | Set the approximate number of threads to use [default: heuristic] | -i | --interactive|Start interactive edit session.| | | --color ``|Controls output color [default: auto] [possible values: auto, always, ansi, never]| @@ -106,6 +107,7 @@ ast-grep test [OPTIONS] | | --skip-snapshot-tests |Only check if the test code is valid, without checking rule output. Turn it on when you want to ignore the output of rules| | -U| --update-all |Update the content of all snapshots that have changed in test.| | -f| --filter |Filter rule test cases to execute using a glob pattern.| +| | --include-off | Include `severity:off` rules in test | -i| --interactive |start an interactive review to update snapshots selectively.| | -h| --help |Print help.| diff --git a/website/reference/cli/run.md b/website/reference/cli/run.md index 5b250275..d89613c0 100644 --- a/website/reference/cli/run.md +++ b/website/reference/cli/run.md @@ -46,7 +46,7 @@ Possible values: - **cst**: Print the query in tree-sitter CST format, both named and unnamed nodes are shown - **sexp**: Print the query in S-expression format -#### `--selector ` +### `--selector ` AST kind to extract sub-part of pattern to match. diff --git a/website/reference/cli/scan.md b/website/reference/cli/scan.md index 3bc4c8ef..7bf892df 100644 --- a/website/reference/cli/scan.md +++ b/website/reference/cli/scan.md @@ -40,6 +40,12 @@ Scan the codebase with rules with ids matching REGEX. This flags conflicts with --rule. It is useful to scan with a subset of rules from a large set of rule definitions within a project. +### `--include-metadata` + +Include rule [metadata](/reference/yaml.html#metadata) in the json output. + +This flags requires --json mode. Default is false. + ## Input Options ### `--no-ignore ` diff --git a/website/reference/cli/test.md b/website/reference/cli/test.md index 2a859d2a..1a5ef16c 100644 --- a/website/reference/cli/test.md +++ b/website/reference/cli/test.md @@ -41,6 +41,11 @@ Start an interactive review to update snapshots selectively Filter rule test cases to execute using a glob pattern +### `--include-off` +Include `severity:off` rules in test + +ast-grep will not run rules with `severity: off` by default. This option will include those rules in the test. + ### `-h, --help` Print help \ No newline at end of file diff --git a/website/reference/rule.md b/website/reference/rule.md index 775b746a..e7dd1dbf 100644 --- a/website/reference/rule.md +++ b/website/reference/rule.md @@ -43,7 +43,7 @@ pattern: --- -You can also use `strictness` to change the matching algorithm of pattern. See the [deep div doc](/advanced/match-algorithm.html) for more detailed explanation for strictness. +You can also use `strictness` to change the matching algorithm of pattern. See the [deep dive doc](/advanced/match-algorithm.html) for more detailed explanation for strictness. **Example**: diff --git a/website/reference/sgconfig.md b/website/reference/sgconfig.md index b0d9ca46..890e31d5 100644 --- a/website/reference/sgconfig.md +++ b/website/reference/sgconfig.md @@ -52,7 +52,7 @@ A string specifies where to discover test cases for ast-grep. A string path relative to `testDir` that specifies where to store test snapshots for ast-grep. You can think it like `__snapshots___` in popular test framework like jest. -If this option is not specified, ast-grep will store the snapshot under the `__snapshots__` folder undert the `testDir`. +If this option is not specified, ast-grep will store the snapshot under the `__snapshots__` folder under the `testDir`. Example: @@ -94,17 +94,16 @@ languageGlobs: The above configuration tells ast-grep to treat the files with `.vue`, `.svelte`, and `.astro` extensions as HTML files, and the extension-less file `.eslintrc` as JSON files. It also overrides the default parser for C files and TS files. -:::tip Simliar languages +:::tip Similar languages This option can override the default language parser for a specific file extension, which is useful for rule reuse between similar languages like C/Cpp, or TS/TSX. ::: -## `customLanguages` +## `customLanguages` * type: `HashMap` * required: No -* status: **Experimental** -A dictionary of custom languages in the project. This is an experimental feature. +A dictionary of custom languages in the project. The key of the dictionary is the custom language name. The value of the dictionary is the custom language configuration object. @@ -113,10 +112,27 @@ Please see the [guide](/advanced/custom-language.html) for detailed instructions A custom language configuration object has the following options. ### `libraryPath` -* type: `String` +* type: `String` or `HashMap` * required: Yes -The path to the tree-sitter dynamic library of the language. +The path to the tree-sitter dynamic library of the language. The string field is interpreted as the dynamic library path relative to the sgconfig.yml. + +If `libraryPath` is a map, the key should be the [target triple](https://doc.rust-lang.org/rustc/platform-support.html) string and the value should be the dynamic library path. Projects supporting multiple host platforms can use object style configuration for different developers. + +**Example:** + +```yaml +# simple string is library path +libraryPath: my-lang-parser.so + +# object style config +libraryPath: + aarch64-apple-darwin: lang-parser-mac.so + x86_64-unknown-linux-gnu: lang-parser-linux.so +# target triple list can be found below +# https://doc.rust-lang.org/rustc/platform-support.html +``` + ### `extensions` diff --git a/website/reference/yaml.md b/website/reference/yaml.md index ef919310..0b4110f2 100644 --- a/website/reference/yaml.md +++ b/website/reference/yaml.md @@ -21,7 +21,7 @@ An ast-grep rule is a YAML object with the following keys: Unique, descriptive identifier, e.g., `no-unused-variable`. -Example: +**Example:** ```yaml id: no-console-log ``` @@ -31,11 +31,11 @@ id: no-console-log * type: `String` * required: true -Specify the language to parse and the file extension to includ in matching. +Specify the language to parse and the file extension to include in matching. Valid values are: `C`, `Cpp`, `CSharp`, `Css`, `Go`, `Html`, `Java`, `JavaScript`, `Kotlin`, `Lua`, `Python`, `Rust`, `Scala`, `Swift`, `Thrift`, `Tsx`, `TypeScript` -Example: +**Example:** ```yaml language: JavaScript ``` @@ -64,7 +64,7 @@ Additional meta variables pattern to filter matches. The key is matched meta var **Note, constraints only applies to the single meta variable like `$ARG`,** not multiple meta variable like `$$$ARGS`. So the key name must only refer to a single meta variable. -Example: +**Example:** ```yaml rule: @@ -91,7 +91,7 @@ A dictionary of utility rules that can be used in `matches` locally. The dictionary key is the utility rule id and the value is the rule object. See [utility rule guide](/guide/rule-config/utility-rule). -Example: +**Example:** ```yaml utils: @@ -110,11 +110,11 @@ utils: * required: false A dictionary to manipulate meta-variables. The dictionary key is the new variable name. -The dictionary value is a transformation object that specifies how meta var is processed. +The dictionary value is a transformation object or transformation string that specifies how meta var is processed. Please also see [transformation reference](/reference/yaml/transformation) for details. -Example: +**Example:** ```yaml transform: NEW_VAR_NAME: # new variable name @@ -122,6 +122,10 @@ transform: source: $ARGS replace: '^.+' by: ', ' + +# string style for ast-grep 0.38.3+ +transform: + NEW_VAR_NAME: replace($ARGS, replace='^.+', by=', ') ``` ### `fix` @@ -133,7 +137,8 @@ A pattern or a `FixConfig` object to auto fix the issue. See details in [fix obj It can reference meta variables that appeared in the rule. -Example: +**Example:** + ```yaml fix: logger.log($$$ARGS) @@ -141,7 +146,7 @@ fix: logger.log($$$ARGS) fix: "" ``` -### `rewriters` +### `rewriters` * type: `Array` * required: false @@ -151,7 +156,7 @@ A rewriter rule is similar to ordinary YAML rule, but it ony contains _finding_ Please also see [rewriter reference](/reference/yaml/rewriter.html) for details. -Example: +**Example:** ```yaml rewriters: - id: stringify @@ -172,7 +177,7 @@ Specify the level of matched result. Available choice: `hint`, `info`, `warning` When `severity` is `off`, ast-grep will disable the rule in scanning. -Example: +**Example:** ```yaml severity: warning ``` @@ -187,7 +192,7 @@ but specific enough to be understood without additional context. It can reference meta-variables that appeared in the rule. -Example: +**Example:** ```yaml message: "console.log should not be used in production code" ``` @@ -199,37 +204,74 @@ message: "console.log should not be used in production code" Additional notes to elaborate the message and provide potential fix to the issue. -Example: +`note` can contains markdown syntax, but it _cannot_ reference meta-variables. + +**Example:** ```yaml note: "Use a logger instead" ``` +### `labels` + +* type: `HashMap` +* required: false + +A dictionary of labels to customize highlighting. The dictionary key is the meta-variable name without `$`, defined in `rules` or `constraints`. The value is a label config object containing the following fields: +* `style`: (required) the style of the label. Available choice: `primary`, `secondary`. +* `message`: (optional) the message to be displayed in the editor extension. + +**Example:** +```yaml +labels: + ARG: + style: primary + message: "This is the argument" + FUNC: + style: secondary + message: "This is the function" +``` + +Please also see [label guide](/guide/project/lint-rule.html#customize-code-highlighting) for details. + ## Globbing ### `files` * type: `Array` * required: false -Glob patterns to specify that the rule only applies to matching files. It takes priority over `ignores`. +Glob patterns to specify that the rule only applies to matching files. It is tested if `ignores` does not exist or a file does not match any `ignores` glob. + +**Example:** -Example: ```yaml files: - src/**/*.js - src/**/*.ts ``` +:::warning Don't add `./` +Be sure to remove `./` to the beginning of your rules. ast-grep will not recognize the paths if you add `./`. +::: + + ### `ignores` * type: `Array` * required: false +**Example:** ```yaml ignores: - test/**/*.js - test/**/*.ts ``` -Glob patterns that exclude rules from applying to files. It is superseded by `files` if both are specified. +Glob patterns that exclude rules from applying to files. A file is tested against `ignores` list before matching `files`. + +A typical globing process works as follows: + +1. If `ignores` is configured, a file will be skipped if it matches any of the glob in the list(`files` will not be tested). +2. If `files` is configured, a file will be included if and only if it matches one of the glob in the list. +3. If neither `ignores`/`files` is configured, a file is included by default. :::warning `ignores` in YAML is different from `--no-ignore` in CLI ast-grep respects common ignore files like `.gitignore` and hidden files by default. @@ -237,10 +279,6 @@ To disable this behavior, use [`--no-ignore`](/reference/cli.html#scan) in CLI. `ignores` is a rule-wise configuration that only filters files that are not ignored by the CLI. ::: -:::warning Don't add `./` -Be sure to remove `./` to the beginning of your rules. ast-grep will not recognize the paths if you add `./`. -::: - ## Other @@ -251,7 +289,7 @@ Be sure to remove `./` to the beginning of your rules. ast-grep will not recogni Documentation link to this rule. It will be displayed in editor extension if supported. -Example: +**Example:** ```yaml url: 'https://ast-grep.github.io/catalog/python/#migrate-openai-sdk' @@ -261,11 +299,15 @@ url: 'https://ast-grep.github.io/catalog/python/#migrate-openai-sdk' * type: `HashMap` * required: false -Extra information for the rule. +Extra information for the rule. This section can include custom data for external program to consume. For example, CVE/OWASP information can be added here for security research. + +ast-grep will output `metadata` with matches in [`--json`](/reference/cli/scan.html#json-style) mode if [`--include-metadata`](/reference/cli/scan.html#include-metadata) is on. -Example: +**Example:** ```yaml metadata: extraField: 'Extra information for other usages' + complexData: + key: value ``` diff --git a/website/reference/yaml/transformation.md b/website/reference/yaml/transformation.md index 06d4f978..078918dc 100644 --- a/website/reference/yaml/transformation.md +++ b/website/reference/yaml/transformation.md @@ -49,6 +49,10 @@ transform: replace: regex by: replacement source: $VAR + +# string style for ast-grep 0.38.3+ +transform: + NEW_VAR: replace($VAR, replace=regex, by=replacement) ``` :::tip Pro tip @@ -93,6 +97,10 @@ transform: startChar: 1 endChar: -1 source: $VAR + +# string style for ast-grep 0.38.3+ +transform: + NEW_VAR: substring($VAR, startChar=1, endChar=-1) ``` :::tip Pro Tip @@ -189,6 +197,10 @@ transform: toCase: kebabCase separatedBy: [underscore] source: $VAR + +# string style for ast-grep 0.38.3+ +transform: + NEW_VAR: convert($VAR, toCase=kebabCase, separatedBy=[underscore]) ``` Suppose we have a string `ast_Grep` as the input `$VAR`, The example above will convert the string as following: @@ -198,7 +210,7 @@ Suppose we have a string `ast_Grep` as the input `$VAR`, The example above will Thank [Aarni Koskela](https://github.com/akx) for proposing and implementing the first version of this feature! -## `rewrite` +## `rewrite` `rewrite` is an experimental transformation that allows you to selectively transform a meta variable by `rewriter` rules. Instead of rewriting the single target node which matches the rule, `rewrite` can rewrite a subset of AST captured by a meta-variable. @@ -250,6 +262,10 @@ transform: source: $VAR rewriters: [rule1, rule2] joinBy: "\n" + +# string style for ast-grep 0.38.3+ +transform: + NEW_VAR: rewrite($VAR, rewriters=[rule1, rule2], joinBy='\n') ``` Thank [Eitan Mosenkis](https://github.com/emosenkis) for proposing this idea! \ No newline at end of file diff --git a/website/src/BlogIndex.vue b/website/src/BlogIndex.vue index 0604846b..0be52b89 100644 --- a/website/src/BlogIndex.vue +++ b/website/src/BlogIndex.vue @@ -17,6 +17,7 @@ function getDateTime(time: number) {

{{ post.title }}

+ {{post.description}} @@ -44,4 +45,12 @@ function getDateTime(time: number) { font-weight: 600; text-decoration: none; } +.description { + margin-top: -12px; + margin-bottom: 16px; + white-space: nowrap; + display: block; + overflow: hidden; + text-overflow: ellipsis; +} \ No newline at end of file diff --git a/website/src/catalog/RuleItem.vue b/website/src/catalog/RuleItem.vue index 00400380..36ab2a99 100644 --- a/website/src/catalog/RuleItem.vue +++ b/website/src/catalog/RuleItem.vue @@ -53,6 +53,7 @@ const moreFeatures = computed(() => sortedFeatures.value.slice(2))
\ No newline at end of file diff --git a/website/src/cheatsheet/SheetTable.vue b/website/src/cheatsheet/SheetTable.vue new file mode 100644 index 00000000..93268476 --- /dev/null +++ b/website/src/cheatsheet/SheetTable.vue @@ -0,0 +1,49 @@ + + + + + \ No newline at end of file diff --git a/website/src/components/EnvDisplay.vue b/website/src/components/EnvDisplay.vue index ee9ab4ad..fad08965 100644 --- a/website/src/components/EnvDisplay.vue +++ b/website/src/components/EnvDisplay.vue @@ -1,10 +1,13 @@ \ No newline at end of file diff --git a/website/src/components/Playground.vue b/website/src/components/Playground.vue index 3a3e4f61..80f65a8d 100644 --- a/website/src/components/Playground.vue +++ b/website/src/components/Playground.vue @@ -90,7 +90,7 @@ let codeMode = shallowRef('code') @@ -192,6 +192,17 @@ let codeMode = shallowRef('code') bottom: 50%; transform: translate(-100%, 50%); } + .playground [title-up]:before { + left: 50%; + top: -8px; + transform: translateX(-50%); + border-top-color: rgba(0, 0, 0, 0.5); + } + .playground [title-up]:after { + left: 50%; + top: -8px; + transform: translate(-50%, -100%); + } .dark .playground [data-title]::after { color: var(--vp-c-brand-1); diff --git a/website/src/components/QueryEditor.vue b/website/src/components/QueryEditor.vue index 04cde2d9..f9fd616e 100644 --- a/website/src/components/QueryEditor.vue +++ b/website/src/components/QueryEditor.vue @@ -27,9 +27,14 @@ watchEffect(() => { } }) +// this assumes the node can be tracked by range + kind +// it will break if multiple same-kind nodes have the same range const matchedIds = computed(() => { const matches = props.matches || [] - return new Set(matches.map(m => m.id)) + return new Set(matches.map(match => { + const [startRow, startCol, endRow, endCol] = match.range + return `${match.kind}-${startRow}-${startCol}-${endRow}-${endCol}` + })) }) let cursorPosition = shallowRef() diff --git a/website/src/components/ResetConfig.vue b/website/src/components/ResetConfig.vue index 7e713e3b..8b48d9b9 100644 --- a/website/src/components/ResetConfig.vue +++ b/website/src/components/ResetConfig.vue @@ -7,7 +7,7 @@ const emits = defineEmits<{ @@ -23,15 +23,8 @@ const emits = defineEmits<{ align-items: center; background: transparent; } -.reset[data-title]:before { - left: 50%; - top: -8px; - transform: translateX(-50%); - border-top-color: rgba(0, 0, 0, 0.5); -} -[data-title]:after { - left: 50%; - top: -8px; + +.reset[data-title]:after { transform: translate(-80%, -100%); } \ No newline at end of file diff --git a/website/src/components/SelectLang.vue b/website/src/components/SelectLang.vue index df464274..716ea77f 100644 --- a/website/src/components/SelectLang.vue +++ b/website/src/components/SelectLang.vue @@ -48,7 +48,8 @@ select { cursor: pointer; } .selector-option-text { - color: var(--vp-custom-selector-option-text); + color: var(--vp-c-text-1); + background-color: var(--vp-c-bg); } @media only screen and (max-width: 780px) { .selector { diff --git a/website/src/components/astGrep/index.ts b/website/src/components/astGrep/index.ts index ec73ea91..3c8a61e3 100644 --- a/website/src/components/astGrep/index.ts +++ b/website/src/components/astGrep/index.ts @@ -1,14 +1,14 @@ -import { shallowRef, watchEffect, inject, Ref } from 'vue' +import { inject, Ref, shallowRef, watchEffect } from 'vue' import { doFind, Match, useSetupParser } from './lang' -import { Mode, State, useSgState, astGrepStateKey } from './state' +import { astGrepStateKey, Mode, State, useSgState } from './state' -export type { SupportedLang, Match } from './lang' +export type { Match, SupportedLang } from './lang' export { initializeParser, langLoadedKey } from './lang' export { Mode } from './state' type YAML = typeof import('js-yaml') -const yamlImport = import('js-yaml') +export const yamlImport = import('js-yaml') function buildRules(yaml: YAML, state: State) { let json = [] @@ -60,13 +60,13 @@ function useDoFind(langLoaded: Ref, state: State) { onInvalidate(() => invalidated = true) try { const [matches, fixed] = await doFind(src, json) - if (invalidated) { return } + if (invalidated) return rewrittenCode.value = fixed matchedHighlights.value = matches matchedEnvs.value = matches.map(m => m.env) ruleErrors.value = undefined } catch (e: any) { - if (invalidated) { return } + if (invalidated) return console.error(e) ruleErrors.value = e.toString() matchedHighlights.value = [] @@ -108,4 +108,4 @@ export function usePattern() { selector, strictness, } -} \ No newline at end of file +} diff --git a/website/src/components/astGrep/lang.ts b/website/src/components/astGrep/lang.ts index 41fb2a38..f51b6d62 100644 --- a/website/src/components/astGrep/lang.ts +++ b/website/src/components/astGrep/lang.ts @@ -1,6 +1,6 @@ -import init, { setupParser, initializeTreeSitter, findNodes, fixErrors } from 'ast-grep-wasm' +import init, { findNodes, fixErrors, initializeTreeSitter, setupParser } from 'ast-grep-wasm' import type { InjectionKey, Ref } from 'vue' -import { shallowRef, watchEffect, provide } from 'vue' +import { provide, shallowRef, watchEffect } from 'vue' import { parserPaths } from '../../../_data/parsers' export type SupportedLang = keyof typeof parserPaths @@ -8,7 +8,7 @@ export type SupportedLang = keyof typeof parserPaths // monaco does not realize bash is shell but shell is not bash. // use this mapping to highlight bash const monacoLangMapping: Record = { - bash: 'shell' + bash: 'shell', } export function normalizeMonacoLang(lang: string) { return monacoLangMapping[lang] || lang @@ -50,18 +50,18 @@ async function setGlobalParser(lang: SupportedLang) { } export type Match = { - type: 'rule', - severity: string, - message: string, - rule: string, - env: any, - id: number, - range: [number, number, number, number], + type: 'rule' + severity: string + message: string + rule: string + env: any + kind: string + range: [number, number, number, number] } | { - type: 'simple', - env: any, - id: number, - range: [number, number, number, number], + type: 'simple' + env: any + kind: string + range: [number, number, number, number] } function shouldDisplayDiagnostic(rule: any) { @@ -72,16 +72,28 @@ function shouldDisplayDiagnostic(rule: any) { ) } +interface WasmNode { + text: string + range: [number, number, number, number] +} + +interface WasmMatch { + kind: string + node: WasmNode + env: Map + message: string +} + export async function doFind(src: string, json: any[]): Promise<[Match[], string]> { if (!src || !json) { return [[], src] } - const result = await findNodes(src, json) + const result: Map = await findNodes(src, json) let matches: Match[] = [] for (let [ruleId, nodes] of result.entries()) { for (let rule of json) { if (rule.id !== ruleId) { - continue; + continue } if (shouldDisplayDiagnostic(rule)) { for (let nm of nodes) { @@ -92,7 +104,7 @@ export async function doFind(src: string, json: any[]): Promise<[Match[], string message: nm.message, range: nm.node.range, env: nm.env, - id: nm.id, + kind: nm.kind, }) } } else { @@ -101,11 +113,11 @@ export async function doFind(src: string, json: any[]): Promise<[Match[], string type: 'simple', range: nm.node.range, env: nm.env, - id: nm.id, + kind: nm.kind, }) } } - break; + break } } const fixed = fixErrors(src, json) @@ -127,4 +139,4 @@ export function useSetupParser(lang: Ref) { }) provide(langLoadedKey, langLoaded) return langLoaded -} \ No newline at end of file +} diff --git a/website/src/components/astGrep/state.ts b/website/src/components/astGrep/state.ts index 445e7ce9..15b1a1f3 100644 --- a/website/src/components/astGrep/state.ts +++ b/website/src/components/astGrep/state.ts @@ -1,7 +1,7 @@ -import type { SupportedLang } from "./lang" -import { shallowReactive, toRefs, watch, provide } from 'vue' -import type { InjectionKey, ToRefs, ShallowReactive } from 'vue' -import { utoa, atou } from '../../utils' +import { provide, shallowReactive, toRefs, watch } from 'vue' +import type { InjectionKey, ShallowReactive, ToRefs } from 'vue' +import { atou, utoa } from '../../utils' +import type { SupportedLang } from './lang' export enum Mode { Patch = 'Patch', @@ -9,14 +9,14 @@ export enum Mode { } export type State = { - mode: Mode, - query: string, - rewrite: string, - config: string, - source: string, - strictness: string, - selector: string, - lang: SupportedLang, + mode: Mode + query: string + rewrite: string + config: string + source: string + strictness: string + selector: string + lang: SupportedLang } export function serialize(state: State): string { @@ -27,8 +27,7 @@ export function deserialize(str: string): State { return JSON.parse(atou(str)) } -const source = -`// console.log() will be matched by pattern! +const source = `// console.log() will be matched by pattern! // click diff tab to see rewrite. function tryAstGrep() { @@ -110,7 +109,9 @@ function resetState(state: ShallowReactive) { state.lang = 'javascript' } -export const astGrepStateKey = Symbol.for('ast-grep-state') as InjectionKey>> +export const astGrepStateKey = Symbol.for('ast-grep-state') as InjectionKey< + ToRefs> +> export function useSgState() { const state = shallowReactive(restoreState()) @@ -125,4 +126,4 @@ export function useSgState() { reset: () => resetState(state), ...refs, } -} \ No newline at end of file +} diff --git a/website/src/components/dump/TreeNode.vue b/website/src/components/dump/TreeNode.vue index 72a53c4c..8d2834b4 100644 --- a/website/src/components/dump/TreeNode.vue +++ b/website/src/components/dump/TreeNode.vue @@ -3,10 +3,11 @@ import { PropType } from 'vue' import { DumpNode, Pos, deepReactiveNode } from './dumpTree' import { showToast } from '../utils/Toast.vue' import GeneralNode from './GeneralNode.vue' +import { computed } from 'vue'; const props = defineProps({ matchedIds: { - type: Set as PropType>, + type: Set as PropType>, required: true, }, node: { @@ -21,7 +22,6 @@ const props = defineProps({ }) let { - id, field, kind, start, @@ -30,6 +30,15 @@ let { isNamed, } = deepReactiveNode(props) +// also see how matchedIds is computed +// track nodes by range + kind +const id = computed(() => { + const k = kind.value + const { row: startRow, column: startCol } = start.value + const { row: endRow, column: endCol } = end.value + return `${k}-${startRow}-${startCol}-${endRow}-${endCol}` +}) + function copyKind(kind: string) { navigator.clipboard.writeText(kind) showToast('Node kind copied!') diff --git a/website/src/components/dump/dumpTree.ts b/website/src/components/dump/dumpTree.ts index ed62e954..277ca088 100644 --- a/website/src/components/dump/dumpTree.ts +++ b/website/src/components/dump/dumpTree.ts @@ -1,4 +1,4 @@ -import type { InjectionKey, ComputedRef } from 'vue' +import type { ComputedRef, InjectionKey } from 'vue' import { computed } from 'vue' interface HighlightContext { @@ -16,7 +16,6 @@ export interface GeneralNode { start: Pos end: Pos children: this[] - id: number } /** stub wasm DumpNode */ @@ -38,8 +37,8 @@ type DestructedNode = { [K in keyof T]: ComputedRef } -export function deepReactiveNode(props: {node: T}): DestructedNode { +export function deepReactiveNode(props: { node: T }): DestructedNode { const keys = Object.keys(props.node) as (keyof T)[] const entries = keys.map(k => [k, computed(() => props.node[k])]) return Object.fromEntries(entries) -} \ No newline at end of file +} diff --git a/website/src/components/dump/highlightNode.ts b/website/src/components/dump/highlightNode.ts index 66a69a19..790c1c59 100644 --- a/website/src/components/dump/highlightNode.ts +++ b/website/src/components/dump/highlightNode.ts @@ -1,6 +1,5 @@ -import { ref, computed, inject, watchEffect } from 'vue' -import { highlightKey, Pos, GeneralNode } from './dumpTree' - +import { computed, inject, ref, watchEffect } from 'vue' +import { GeneralNode, highlightKey, Pos } from './dumpTree' interface Props { node: GeneralNode @@ -21,7 +20,7 @@ export function useHighlightNode(props: Props) { ]) } - function withinPos({start, end}: GeneralNode, pos?: Pos) { + function withinPos({ start, end }: GeneralNode, pos?: Pos) { if (!pos) { return false } @@ -38,9 +37,8 @@ export function useHighlightNode(props: Props) { if (!isWithin.value) { return false } - const {node, cursorPosition} = props - const isTarget = - !expanded.value || // children not expanded, current target is the target + const { node, cursorPosition } = props + const isTarget = !expanded.value || // children not expanded, current target is the target !node.children.some(n => withinPos(n, cursorPosition)) // no children within node return isTarget }) @@ -61,4 +59,4 @@ export function useHighlightNode(props: Props) { expanded, nodeRef, } -} \ No newline at end of file +} diff --git a/website/src/components/editors/EditorWithPanel.vue b/website/src/components/editors/EditorWithPanel.vue index a2722343..9e7ee070 100644 --- a/website/src/components/editors/EditorWithPanel.vue +++ b/website/src/components/editors/EditorWithPanel.vue @@ -1,6 +1,6 @@