diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 0ac19d0e..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,32 +0,0 @@ -module.exports = { - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "plugin:@typescript-eslint/strict", - ], - parser: "@typescript-eslint/parser", - parserOptions: { - ecmaVersion: 6, - sourceType: "module", - project: "tsconfig.json", - tsconfigRootDir: __dirname, - }, - plugins: ["@typescript-eslint"], - root: true, - rules: { - "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_.*" }], - "@typescript-eslint/naming-convention": "warn", - "@typescript-eslint/semi": "warn", - "@typescript-eslint/consistent-type-definitions": ["error", "type"], - "curly": "warn", - "eqeqeq": "warn", - "no-throw-literal": "warn", - "semi": "off", - "@typescript-eslint/explicit-function-return-type": "warn", - "no-duplicate-imports": "warn", - "sort-imports": "warn", - "no-trailing-spaces": "warn", - }, - ignorePatterns: ["webview-ui/**", ".eslintrc.js"], -}; diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..d921a30a --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,45 @@ +{ + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:@typescript-eslint/strict" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module", + "project": "tsconfig.json", + "tsconfigRootDir": "." + }, + "plugins": [ + "@typescript-eslint" + ], + "root": true, + "rules": { + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_.*" + } + ], + "@typescript-eslint/naming-convention": "warn", + "@typescript-eslint/semi": "warn", + "@typescript-eslint/consistent-type-definitions": [ + "error", + "type" + ], + "curly": "warn", + "eqeqeq": "warn", + "no-throw-literal": "warn", + "semi": "off", + "@typescript-eslint/explicit-function-return-type": "warn", + "no-duplicate-imports": "warn", + "sort-imports": "warn", + "no-trailing-spaces": "warn" + }, + "ignorePatterns": [ + "webview-ui/**", + ".eslintrc.js" + ] +} \ No newline at end of file diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index f562555b..effbe006 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -23,7 +23,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Install extension dependencies run: yarn run install:all - name: Build webview @@ -54,13 +54,13 @@ jobs: - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Install extension dependencies run: yarn run install:all - name: Build webview run: yarn run build:webview - name: Package extension - run: npx @vscode/vsce package --yarn --githubBranch ${{ github.ref_name }} + run: npx --yes @vscode/vsce package --yarn --githubBranch ${{ github.ref_name }} - name: Upload extension uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index c99d2b38..691748f5 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -22,7 +22,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Install extension dependencies run: yarn run install:all - name: Build webview @@ -50,9 +50,17 @@ jobs: - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Install asset generation dependencies - run: sudo apt install -y ffmpeg libnss3 xvfb + run: | + sudo mkdir -p /usr/local/bin + sudo ln -sf /bin/true /usr/local/bin/mandb # no-op to skip man-db triggers + sudo DEBIAN_FRONTEND=noninteractive apt update + sudo DEBIAN_FRONTEND=noninteractive \ + apt install -y --no-install-recommends \ + ffmpeg libnss3 xvfb \ + -o Dpkg::Options::="--path-exclude=/usr/share/man/*" \ + -o Dpkg::Options::="--path-exclude=/usr/share/doc/*" - name: Install extension dependencies run: yarn run install:all - name: Build webview @@ -75,7 +83,6 @@ jobs: package: name: Package extension - needs: examples runs-on: ubuntu-latest steps: - name: Checkout @@ -83,13 +90,13 @@ jobs: - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Install extension dependencies run: yarn run install:all - name: Build webview run: yarn run build:webview - name: Package extension - run: npx @vscode/vsce package --yarn --githubBranch ${{ env.BRANCH }} + run: npx --yes @vscode/vsce package --yarn --githubBranch ${{ env.BRANCH }} - name: Upload extension uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/update-assets.yml b/.github/workflows/update-assets.yml index 3de0f153..acc1fee6 100644 --- a/.github/workflows/update-assets.yml +++ b/.github/workflows/update-assets.yml @@ -20,9 +20,17 @@ jobs: - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Install asset generation dependencies - run: sudo apt install -y ffmpeg libnss3 xvfb + run: | + sudo mkdir -p /usr/local/bin + sudo ln -sf /bin/true /usr/local/bin/mandb # no-op to skip man-db triggers + sudo DEBIAN_FRONTEND=noninteractive apt update + sudo DEBIAN_FRONTEND=noninteractive \ + apt install -y --no-install-recommends \ + ffmpeg libnss3 xvfb \ + -o Dpkg::Options::="--path-exclude=/usr/share/man/*" \ + -o Dpkg::Options::="--path-exclude=/usr/share/doc/*" - name: Install extension dependencies run: yarn run install:all - name: Build webview diff --git a/.vscodeignore b/.vscodeignore index e132d362..68d19a62 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -7,8 +7,15 @@ !LICENSE !README.md !assets/extension-logo.png -!node_modules/tree-sitter +!out/extension.js +!webview-ui/public + +# keep only non-compiled dependency files !node_modules/node-gyp-build !node_modules/node-addon-api -!out/extension.js -!webview-ui/public \ No newline at end of file +!node_modules/tree-sitter/src +!node_modules/tree-sitter/vendor +!node_modules/tree-sitter/binding.gyp +!node_modules/tree-sitter/index.js +!node_modules/tree-sitter/package.json +!node_modules/tree-sitter/LICENSE diff --git a/CHANGELOG.md b/CHANGELOG.md index 3209b688..14e59e21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,34 @@ # Changelog -# [Unreleased] +# 0.8.0 + +## Added + +- Multi-cursor support in Block Mode, thanks [@CB2Moon](https://github.com/selfint/code-blocks/pull/188)! + + ![example](./assets/examples/Block_Mode_-_Move_-_Rust_-_Match_arms.gif) + +- `toml` and `xml` support, thanks [@sanarise](https://github.com/selfint/code-blocks/pull/186)! + +- `sql` and `latex` support using [@derekstride/tree-sitter-sql](https://github.com/DerekStride/tree-sitter-sql) and [@derekstride/tree-sitter-sql](https://github.com/latex-lsp/tree-sitter-latex). + +- ESM-based parser loading for parsers like CSS ([#191](https://github.com/selfint/code-blocks/issues/191)). + +- 'Remove' option to notification when parser fails to load ([#180](https://github.com/selfint/code-blocks/issues/180)). + +- More languages are now tested in advance: TOML, XML, CSS, Zig, Swift, SQL, LaTeX. ## Fixed -- Add 'Remove' option to notification if local parser installation fails to load. +- Parser build method ([[#193](https://github.com/selfint/code-blocks/issues/193)]), now uses `node-gyp` instead of `tree-sitter-cli`. + +## Deprecated + +- Support for `node` v18, it might still work, but the extension now requires `node` v20+. + +## Removed + +- `codeBlocks.treeSitterCliPath` configuration: The Extension now only requires `npm`. # 0.7.0 diff --git a/README.md b/README.md index 7d513de9..b188b4fb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

-logo +logo

@@ -24,14 +24,13 @@ Supercharge your editor with syntactically aware code navigation and manipulatio ### Block mode -Syntactically aware code selection (e.g. select scope), navigation (e.g. goto next function) -and manipulation (e.g. re-order function parameters), right inside your editor. +Syntactically aware code selection (e.g. select scope), navigation (e.g. goto next function) and manipulation (e.g. re-order function parameters), right inside your editor. ![rust_parameters_example](./assets/examples/Block_Mode_-_Move_-_Rust_-_Parameters.gif) ### Code Blocks Editor -Birds eye view over all your code blocks, with point and click refactoring. +Bird's-eye view over all your code blocks, with point and click refactoring. ![svelte-1](./assets/editor/Code%20Blocks%20Demo%20-%20Editor%20-%20svelte%201.gif) @@ -43,15 +42,7 @@ View your code's syntax tree directly ## Requirements -- `node` / `npm`: Used to download tree-sitter language parsers. Can be installed from [here](https://nodejs.org/en/download). - -- **OPTIONAL:** `tree-sitter`: Used to for tree-sitter language parsers that need to be locally built. - - After installing `npm`, can be installed by running: - `npm i -g tree-sitter-cli`. - - If you don't want to install `tree-sitter`, there's a good chance you don't - need it. Try the extension without it, it will notify you if it's required. +- `npm`: Used to download and build tree-sitter language parsers. Can be installed from [here](https://nodejs.org/en/download). Must be in `PATH`. ### Note @@ -101,30 +92,24 @@ These are the default key bindings, they are only active when "block mode" is ac ### Global -- `codeBlocks.treeSitterCliPath`: Path to the `tree-sitter` cli command. Defaults to `tree-sitter` (assumes command is in PATH). -- `codeBlocks.colors.enabled`: Whether Block Mode should color selections or not. Defaults to `false`. -- `codeBlocks.colors.sibling`: CSS string for sibling selection background color. Defaults to `var(--vscode-editor-selectionHighlightBackground)`. -- `codeBlocks.colors.parent`: CSS string for parent selection background color. Defaults to `var(--vscode-editor-linkedEditingBackground)`. -- `codeBlocks.ignoredLanguageIds`: Array of VScode [languageId](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers)s not to install/load parsers for. +- `codeBlocks.colors.enabled`: Whether Block Mode should color selections or not. Defaults to `false`. +- `codeBlocks.colors.sibling`: CSS string for sibling selection background color. Defaults to `var(--vscode-editor-selectionHighlightBackground)`. +- `codeBlocks.colors.parent`: CSS string for parent selection background color. Defaults to `var(--vscode-editor-linkedEditingBackground)`. +- `codeBlocks.ignoredLanguageIds`: Array of VScode [languageId](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers)s not to install/load parsers for. ### Language specific (advanced) These configurations are set at the [languageId](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers) level. -Most languages should just work™, if you find a language that requires manual configuration please [create an issue](https://github.com/selfint/code-blocks/issues). -Or [create a pull request](https://github.com/selfint/code-blocks/pulls) with your configuration added to the `configurationDefaults` section of the `package.json` file. +Most languages should just work™, if you find a language that requires manual configuration please [create an issue](https://github.com/selfint/code-blocks/issues). Or [create a pull request](https://github.com/selfint/code-blocks/pulls) with your configuration added to the `configurationDefaults` section of the `package.json` file. -- `codeBlocks.npmPackageName`: [NPM](https://www.npmjs.com/) package name of the `tree-sitter` parser to use for the - language. Defaults to `tree-sitter-`, change if the package name doesn't match the languageId. +- `codeBlocks.npmPackageName`: [NPM](https://www.npmjs.com/) package name of the `tree-sitter` parser to use for the language. Defaults to `tree-sitter-`, change if the package name doesn't match the languageId. -- `codeBlocks.parserName`: Filename of the WASM parser built by the `tree-sitter build --wasm` command, without the - `.wasm` extension. Defaults to `tree-sitter-`, change if the parser filename doesn't match the languageId. +- `codeBlocks.parserName`: Name to save parser as (defaults to `tree-sitter-`), change if the package name doesn't match the languageId (e.g., `tree-sitter-typescript` for `[typescriptreact]` languageId). -- `codeBlocks.subdirectory`: Directory inside the NPM package containing the `tree-sitter` grammar. Defaults to the - root directory of the package, change if the grammar isn't there. +- `codeBlocks.subdirectory`: Directory inside the NPM package containing the `tree-sitter` grammar. Defaults to the root directory of the package, change if the grammar isn't there. -- `codeBlocks.queries`: Tree-sitter [queries](https://tree-sitter.github.io/tree-sitter/using-parsers#query-syntax) - to generate blocks, must contain at least one `@capture`. The name of the capture doesn't matter, the entire match will be a block. +- `codeBlocks.queries`: Tree-sitter [queries](https://tree-sitter.github.io/tree-sitter/using-parsers#query-syntax) to generate blocks, must contain at least one `@capture`. The name of the capture doesn't matter, the entire match will be a block. Required by [Code Blocks Editor](#code-blocks-editor). @@ -136,8 +121,6 @@ Language ID: `typescriptreact` NPM package name: [tree-sitter-typescript](https://www.npmjs.com/package/tree-sitter-typescript) -WASM parser name: `tree-sitter-ts.wasm` - Desired blocks: JSX blocks, and documentation comments should be merged with documentees. ```jsonc @@ -166,11 +149,11 @@ Desired blocks: JSX blocks, and documentation comments should be merged with doc ### Custom editors -- Code Blocks Editor (viewType `codeBlocks.editor`): UI for moving code blocks inside a file. Useful when refactoring large blocks over long distances. +- Code Blocks Editor (viewType `codeBlocks.editor`): UI for moving code blocks inside a file. Useful when refactoring large blocks over long distances. ## Known Issues -- Out of bounds memory access ([#154](https://github.com/selfint/code-blocks/issues/154)): For now, reloading the editor fixes this. +No known issues as of November 1, 2025. ## License diff --git a/assets/examples/Block_Mode_-_Move_-_Rust_-_Functions.gif b/assets/examples/Block_Mode_-_Move_-_Rust_-_Functions.gif index 9f38d957..bde92b31 100644 Binary files a/assets/examples/Block_Mode_-_Move_-_Rust_-_Functions.gif and b/assets/examples/Block_Mode_-_Move_-_Rust_-_Functions.gif differ diff --git a/assets/examples/Block_Mode_-_Move_-_Rust_-_Match_arms.gif b/assets/examples/Block_Mode_-_Move_-_Rust_-_Match_arms.gif index 12bf0eee..f6e538f6 100644 Binary files a/assets/examples/Block_Mode_-_Move_-_Rust_-_Match_arms.gif and b/assets/examples/Block_Mode_-_Move_-_Rust_-_Match_arms.gif differ diff --git a/assets/examples/Block_Mode_-_Move_-_Rust_-_Parameters.gif b/assets/examples/Block_Mode_-_Move_-_Rust_-_Parameters.gif index 459dcfc6..05fa2b81 100644 Binary files a/assets/examples/Block_Mode_-_Move_-_Rust_-_Parameters.gif and b/assets/examples/Block_Mode_-_Move_-_Rust_-_Parameters.gif differ diff --git a/assets/examples/Block_Mode_-_Select_-_Rust.gif b/assets/examples/Block_Mode_-_Select_-_Rust.gif index 57a35e6a..d03c5686 100644 Binary files a/assets/examples/Block_Mode_-_Select_-_Rust.gif and b/assets/examples/Block_Mode_-_Select_-_Rust.gif differ diff --git a/assets/examples/Block_Mode_-_Select_-_TypeScript.gif b/assets/examples/Block_Mode_-_Select_-_TypeScript.gif index cb07900a..a56490b0 100644 Binary files a/assets/examples/Block_Mode_-_Select_-_TypeScript.gif and b/assets/examples/Block_Mode_-_Select_-_TypeScript.gif differ diff --git a/assets/examples/Block_Mode_-_Select_-_TypeScript_-_Selection_expands_to_block.gif b/assets/examples/Block_Mode_-_Select_-_TypeScript_-_Selection_expands_to_block.gif index 1e7a0c1c..629f52ff 100644 Binary files a/assets/examples/Block_Mode_-_Select_-_TypeScript_-_Selection_expands_to_block.gif and b/assets/examples/Block_Mode_-_Select_-_TypeScript_-_Selection_expands_to_block.gif differ diff --git a/assets/examples/Tree_Viewer.gif b/assets/examples/Tree_Viewer.gif index b401f7b3..0cbed331 100644 Binary files a/assets/examples/Tree_Viewer.gif and b/assets/examples/Tree_Viewer.gif differ diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..1c147d90 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,63 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import typescriptEslint from "@typescript-eslint/eslint-plugin"; +import tsParser from "@typescript-eslint/parser"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import js from "@eslint/js"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +export default defineConfig([ + globalIgnores(["webview-ui/**/*", "**/.eslintrc.js"]), + { + extends: compat.extends( + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:@typescript-eslint/strict" + ), + + plugins: { + "@typescript-eslint": typescriptEslint, + }, + + languageOptions: { + parser: tsParser, + ecmaVersion: 2022, + sourceType: "commonjs", + + parserOptions: { + project: "tsconfig.json", + tsconfigRootDir: __dirname, + }, + }, + + rules: { + "@typescript-eslint/no-unused-vars": [ + "error", + { + argsIgnorePattern: "^_.*", + varsIgnorePattern: "^_", + caughtErrorsIgnorePattern: "^_", + }, + ], + + "@typescript-eslint/naming-convention": "warn", + "@typescript-eslint/consistent-type-definitions": ["error", "type"], + "curly": "warn", + "eqeqeq": "warn", + "no-throw-literal": "warn", + "@typescript-eslint/explicit-function-return-type": "warn", + "no-duplicate-imports": "warn", + "sort-imports": "warn", + "no-trailing-spaces": "warn", + }, + }, +]); diff --git a/package.json b/package.json index 7874cf81..85288804 100644 --- a/package.json +++ b/package.json @@ -1,392 +1,394 @@ { - "name": "code-blocks", - "publisher": "selfint", - "displayName": "Code Blocks", - "description": "Move code blocks around", - "repository": { - "url": "https://github.com/selfint/code-blocks", - "type": "git" - }, - "bugs": { - "url": "https://github.com/selfint/code-blocks/issues", - "email": "selfint@gmail.com" - }, - "homepage": "https://github.com/selfint/code-blocks#readme", - "icon": "./assets/extension-logo.png", - "galleryBanner": { - "color": "#6295E3", - "theme": "dark" - }, - "version": "0.7.0", - "private": true, - "license": "MIT", - "engines": { - "vscode": "^1.79.0" - }, - "categories": [ - "Visualization", - "Other" - ], - "keywords": [ - "blocks", - "code-blocks", - "refactor", - "tree-sitter", - "treesitter", - "visualization" - ], - "preview": true, - "activationEvents": [ - "onLanguage" - ], - "main": "./out/extension.js", - "contributes": { - "customEditors": [ - { - "viewType": "codeBlocks.editor", - "displayName": "Code Blocks", - "selector": [ - { - "filenamePattern": "*" - } - ], - "priority": "option" - } + "name": "code-blocks", + "publisher": "selfint", + "displayName": "Code Blocks", + "description": "Move code blocks around", + "repository": { + "url": "https://github.com/selfint/code-blocks", + "type": "git" + }, + "bugs": { + "url": "https://github.com/selfint/code-blocks/issues", + "email": "selfint@gmail.com" + }, + "homepage": "https://github.com/selfint/code-blocks#readme", + "icon": "./assets/extension-logo.png", + "galleryBanner": { + "color": "#6295E3", + "theme": "dark" + }, + "version": "0.8.0", + "private": true, + "license": "MIT", + "engines": { + "vscode": "^1.105.0" + }, + "categories": [ + "Visualization", + "Other" ], - "commands": [ - { - "command": "codeBlocks.open", - "title": "Code Blocks: Open active file in Code Blocks editor" - }, - { - "command": "codeBlocks.openToTheSide", - "title": "Code Blocks: Open active file in Code Blocks editor to the side" - }, - { - "command": "codeBlocks.toggleActive", - "title": "Code Blocks: Toggle extension" - }, - { - "command": "codeBlocks.toggleBlockMode", - "title": "Code Blocks: Toggle block mode" - }, - { - "command": "codeBlocks.moveUp", - "title": "Code Blocks: Move selected block up" - }, - { - "command": "codeBlocks.moveDown", - "title": "Code Blocks: Move selected block down" - }, - { - "command": "codeBlocks.navigateUp", - "title": "Code Blocks: Navigate to previous block" - }, - { - "command": "codeBlocks.navigateDown", - "title": "Code Blocks: Navigate to next block" - }, - { - "command": "codeBlocks.navigateUpForce", - "title": "Code Blocks: Force navigate to previous block" - }, - { - "command": "codeBlocks.navigateDownForce", - "title": "Code Blocks: Force navigate to next block" - }, - { - "command": "codeBlocks.selectBlock", - "title": "Code Blocks: Select current block" - }, - { - "command": "codeBlocks.openTreeViewer", - "title": "Code Blocks: Open tree viewer" - }, - { - "command": "codeBlocks.selectParent", - "title": "Code Blocks: Scope selection - parent" - }, - { - "command": "codeBlocks.selectChild", - "title": "Code Blocks: Scope selection - child" - }, - { - "command": "codeBlocks.selectNext", - "title": "Code Blocks: Scope selection - next" - }, - { - "command": "codeBlocks.selectPrevious", - "title": "Code Blocks: Scope selection - previous" - }, - { - "command": "codeBlocks.toggleBlockModeColors", - "title": "Code Blocks: Toggle block mode colors" - } + "keywords": [ + "blocks", + "code-blocks", + "refactor", + "tree-sitter", + "treesitter", + "visualization" ], - "keybindings": [ - { - "command": "codeBlocks.moveUp", - "key": "alt+left", - "when": "editorTextFocus && codeBlocks.blockMode" - }, - { - "command": "codeBlocks.moveDown", - "key": "alt+right", - "when": "editorTextFocus && codeBlocks.blockMode" - }, - { - "command": "codeBlocks.navigateUp", - "key": "ctrl+left", - "mac": "cmd+left", - "when": "editorTextFocus && codeBlocks.blockMode" - }, - { - "command": "codeBlocks.navigateDown", - "key": "ctrl+right", - "mac": "cmd+right", - "when": "editorTextFocus && codeBlocks.blockMode" - }, - { - "command": "codeBlocks.navigateUpForce", - "key": "ctrl+up", - "mac": "cmd+up", - "when": "editorTextFocus && codeBlocks.blockMode" - }, - { - "command": "codeBlocks.navigateDownForce", - "key": "ctrl+down", - "mac": "cmd+down", - "when": "editorTextFocus && codeBlocks.blockMode" - }, - { - "command": "codeBlocks.selectNext", - "key": "shift+right", - "mac": "shift+right", - "when": "editorTextFocus && codeBlocks.blockMode" - }, - { - "command": "codeBlocks.selectPrevious", - "key": "shift+left", - "mac": "shift+left", - "when": "editorTextFocus && codeBlocks.blockMode" - }, - { - "command": "codeBlocks.selectParent", - "key": "shift+up", - "mac": "shift+up", - "when": "editorTextFocus && codeBlocks.blockMode" - }, - { - "command": "codeBlocks.selectChild", - "key": "shift+down", - "mac": "shift+down", - "when": "editorTextFocus && codeBlocks.blockMode" - } + "preview": true, + "activationEvents": [ + "onLanguage" ], - "configuration": { - "title": "CodeBlocks", - "properties": { - "codeBlocks.treeSitterCliPath": { - "type": "string", - "markdownDescription": "Path to the `tree-sitter` cli command, defaults to `tree-sitter`.", - "default": "tree-sitter" - }, - "codeBlocks.colors.enabled": { - "type": "boolean", - "description": "Whether block mode colors are enabled", - "default": false - }, - "codeBlocks.colors.sibling": { - "type": "string", - "description": "Background color of current block's siblings. Can be any valid css string.", - "default": "var(--vscode-editor-selectionHighlightBackground)" - }, - "codeBlocks.colors.parent": { - "type": "string", - "description": "Background color of current block's parent (only visible if there's no previous or next sibling). Can be any valid css string.", - "default": "var(--vscode-editor-linkedEditingBackground)" - }, - "codeBlocks.ignoredLanguageIds": { - "type": "array", - "markdownDescription": "Array of VScode [languageId](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers)s not to install/load parsers for.", - "default": [ - "plaintext", - "Log", - "ignore" - ] - }, - "codeBlocks.queries": { - "type": "array", - "markdownDescription": "Tree-sitter [queries](https://tree-sitter.github.io/tree-sitter/using-parsers#query-syntax) to generate blocks, must contain a `@capture` (note that the entire match will be a block, not just the capture). Specified per [language ID](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers), example: `\"[python]\": {\"codeBlocks.queries\": [ \"(class_definition) @item\", \"(function_definition) @item\", \"(decorated_definition) @item\" ]}`", - "editPresentation": "multilineText", - "scope": "language-overridable" - }, - "codeBlocks.npmPackageName": { - "markdownDescription": "NPM package name of the tree-sitter grammar to use (defaults to `tree-sitter-`). Specified per [language ID](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers), example: `\"[yaml]\": {\"codeBlocks.npmPackageName\": \"@tree-sitter-grammars/tree-sitter-yaml\"}`.", - "scope": "language-overridable", - "type": [ - "string", - "null" - ] - }, - "codeBlocks.parserName": { - "type": [ - "string", - "null" - ], - "markdownDescription": "Name to save parser as (defaults to `tree-sitter-`). Specified per [language ID](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers), example: `\"[typescriptreact]\": {\"codeBlocks.parserName\": \"tree-sitter-typescript\"}`.", - "scope": "language-overridable" + "main": "./out/extension.js", + "contributes": { + "customEditors": [ + { + "viewType": "codeBlocks.editor", + "displayName": "Code Blocks", + "selector": [ + { + "filenamePattern": "*" + } + ], + "priority": "option" + } + ], + "commands": [ + { + "command": "codeBlocks.open", + "title": "Code Blocks: Open active file in Code Blocks editor" + }, + { + "command": "codeBlocks.openToTheSide", + "title": "Code Blocks: Open active file in Code Blocks editor to the side" + }, + { + "command": "codeBlocks.toggleActive", + "title": "Code Blocks: Toggle extension" + }, + { + "command": "codeBlocks.toggleBlockMode", + "title": "Code Blocks: Toggle block mode" + }, + { + "command": "codeBlocks.moveUp", + "title": "Code Blocks: Move selected block up" + }, + { + "command": "codeBlocks.moveDown", + "title": "Code Blocks: Move selected block down" + }, + { + "command": "codeBlocks.navigateUp", + "title": "Code Blocks: Navigate to previous block" + }, + { + "command": "codeBlocks.navigateDown", + "title": "Code Blocks: Navigate to next block" + }, + { + "command": "codeBlocks.navigateUpForce", + "title": "Code Blocks: Force navigate to previous block" + }, + { + "command": "codeBlocks.navigateDownForce", + "title": "Code Blocks: Force navigate to next block" + }, + { + "command": "codeBlocks.selectBlock", + "title": "Code Blocks: Select current block" + }, + { + "command": "codeBlocks.openTreeViewer", + "title": "Code Blocks: Open tree viewer" + }, + { + "command": "codeBlocks.selectParent", + "title": "Code Blocks: Scope selection - parent" + }, + { + "command": "codeBlocks.selectChild", + "title": "Code Blocks: Scope selection - child" + }, + { + "command": "codeBlocks.selectNext", + "title": "Code Blocks: Scope selection - next" + }, + { + "command": "codeBlocks.selectPrevious", + "title": "Code Blocks: Scope selection - previous" + }, + { + "command": "codeBlocks.toggleBlockModeColors", + "title": "Code Blocks: Toggle block mode colors" + } + ], + "keybindings": [ + { + "command": "codeBlocks.moveUp", + "key": "alt+left", + "when": "editorTextFocus && codeBlocks.blockMode" + }, + { + "command": "codeBlocks.moveDown", + "key": "alt+right", + "when": "editorTextFocus && codeBlocks.blockMode" + }, + { + "command": "codeBlocks.navigateUp", + "key": "ctrl+left", + "mac": "cmd+left", + "when": "editorTextFocus && codeBlocks.blockMode" + }, + { + "command": "codeBlocks.navigateDown", + "key": "ctrl+right", + "mac": "cmd+right", + "when": "editorTextFocus && codeBlocks.blockMode" + }, + { + "command": "codeBlocks.navigateUpForce", + "key": "ctrl+up", + "mac": "cmd+up", + "when": "editorTextFocus && codeBlocks.blockMode" + }, + { + "command": "codeBlocks.navigateDownForce", + "key": "ctrl+down", + "mac": "cmd+down", + "when": "editorTextFocus && codeBlocks.blockMode" + }, + { + "command": "codeBlocks.selectNext", + "key": "shift+right", + "mac": "shift+right", + "when": "editorTextFocus && codeBlocks.blockMode" + }, + { + "command": "codeBlocks.selectPrevious", + "key": "shift+left", + "mac": "shift+left", + "when": "editorTextFocus && codeBlocks.blockMode" + }, + { + "command": "codeBlocks.selectParent", + "key": "shift+up", + "mac": "shift+up", + "when": "editorTextFocus && codeBlocks.blockMode" + }, + { + "command": "codeBlocks.selectChild", + "key": "shift+down", + "mac": "shift+down", + "when": "editorTextFocus && codeBlocks.blockMode" + } + ], + "configuration": { + "title": "CodeBlocks", + "properties": { + "codeBlocks.colors.enabled": { + "type": "boolean", + "description": "Whether block mode colors are enabled", + "default": false + }, + "codeBlocks.colors.sibling": { + "type": "string", + "description": "Background color of current block's siblings. Can be any valid css string.", + "default": "var(--vscode-editor-selectionHighlightBackground)" + }, + "codeBlocks.colors.parent": { + "type": "string", + "description": "Background color of current block's parent (only visible if there's no previous or next sibling). Can be any valid css string.", + "default": "var(--vscode-editor-linkedEditingBackground)" + }, + "codeBlocks.ignoredLanguageIds": { + "type": "array", + "markdownDescription": "Array of VScode [languageId](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers)s not to install/load parsers for.", + "default": [ + "plaintext", + "Log", + "ignore" + ] + }, + "codeBlocks.queries": { + "type": "array", + "markdownDescription": "Tree-sitter [queries](https://tree-sitter.github.io/tree-sitter/using-parsers#query-syntax) to generate blocks, must contain a `@capture` (note that the entire match will be a block, not just the capture). Specified per [language ID](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers), example: `\"[python]\": {\"codeBlocks.queries\": [ \"(class_definition) @item\", \"(function_definition) @item\", \"(decorated_definition) @item\" ]}`", + "editPresentation": "multilineText", + "scope": "language-overridable" + }, + "codeBlocks.npmPackageName": { + "markdownDescription": "NPM package name of the tree-sitter grammar to use (defaults to `tree-sitter-`). Specified per [language ID](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers), example: `\"[yaml]\": {\"codeBlocks.npmPackageName\": \"@tree-sitter-grammars/tree-sitter-yaml\"}`.", + "scope": "language-overridable", + "type": [ + "string", + "null" + ] + }, + "codeBlocks.parserName": { + "type": [ + "string", + "null" + ], + "markdownDescription": "Name to save parser as (defaults to `tree-sitter-`). Specified per [language ID](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers), example: `\"[typescriptreact]\": {\"codeBlocks.parserName\": \"tree-sitter-typescript\"}`.", + "scope": "language-overridable" + }, + "codeBlocks.subdirectory": { + "type": [ + "string", + "null" + ], + "markdownDescription": "Name of the subdirectory containing the tree-sitter grammar inside the npm package (leave empty to use the root directory). Use when an npm package contains multiple grammars. Specified per [language ID](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers), example: `\"[typescript]\": {\"codeBlocks.subdirectory\": \"typescript\"}`.", + "scope": "language-overridable" + } + } }, - "codeBlocks.subdirectory": { - "type": [ - "string", - "null" - ], - "markdownDescription": "Name of the subdirectory containing the tree-sitter grammar inside the npm package (leave empty to use the root directory). Use when an npm package contains multiple grammars. Specified per [language ID](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers), example: `\"[typescript]\": {\"codeBlocks.subdirectory\": \"typescript\"}`.", - "scope": "language-overridable" + "configurationDefaults": { + "[github-actions-workflow]": { + "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-yaml", + "codeBlocks.parserName": "tree-sitter-yaml" + }, + "[jsonc]": { + "codeBlocks.npmPackageName": "tree-sitter-json" + }, + "[zig]": { + "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-zig" + }, + "[kotlin]": { + "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-kotlin" + }, + "[yaml]": { + "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-yaml" + }, + "[toml]": { + "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-toml" + }, + "[xml]": { + "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-xml", + "codeBlocks.subdirectory": "xml" + }, + "[markdown]": { + "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-markdown" + }, + "[shellscript]": { + "codeBlocks.npmPackageName": "tree-sitter-bash", + "codeBlocks.parserName": "tree-sitter-bash" + }, + "[rust]": { + "codeBlocks.queries": [ + "(([ (attribute_item) (line_comment) ] @header . [ (attribute_item) (line_comment) ]* @header )? . (function_item) @item)", + "(([ (attribute_item) (line_comment) ] @header . [ (attribute_item) (line_comment) ]* @header )? . (mod_item) @item)", + "(([ (attribute_item) (line_comment) ] @header . [ (attribute_item) (line_comment) ]* @header )? . (struct_item) @item)", + "(([ (attribute_item) (line_comment) ] @header . [ (attribute_item) (line_comment) ]* @header )? . (impl_item) @item)", + "(([ (attribute_item) (line_comment) ] @header . [ (attribute_item) (line_comment) ]* @header )? . (enum_item) @item)", + "(([ (attribute_item) (line_comment) ] @header . [ (attribute_item) (line_comment) ]* @header )? . (field_declaration) @item)", + "(match_arm) @arm" + ] + }, + "[typescript]": { + "codeBlocks.subdirectory": "typescript", + "codeBlocks.queries": [ + "( (comment)* @header . (class_declaration) @item)", + "( (comment)* @header . (method_definition) @item)", + "( (comment)* @header . (function_declaration) @item)", + "( (comment)* @header . (export_statement) @item)" + ] + }, + "[typescriptreact]": { + "codeBlocks.npmPackageName": "tree-sitter-typescript", + "codeBlocks.parserName": "tree-sitter-typescript", + "codeBlocks.subdirectory": "tsx", + "codeBlocks.queries": [ + "( (comment)* @header . (class_declaration) @item)", + "( (comment)* @header . (method_definition) @item)", + "( (comment)* @header . (function_declaration) @item)", + "( (comment)* @header . (export_statement) @item)", + "(jsx_element) @item", + "(jsx_self_closing_element) @item" + ] + }, + "[javascriptreact]": { + "codeBlocks.npmPackageName": "tree-sitter-javascript", + "codeBlocks.parserName": "tree-sitter-javascript", + "codeBlocks.queries": [ + "( (comment)* @header . (class_declaration) @item)", + "( (comment)* @header . (method_definition) @item)", + "( (comment)* @header . (function_declaration) @item)", + "( (comment)* @header . (export_statement) @item)", + "(jsx_element) @item", + "(jsx_self_closing_element) @item" + ] + }, + "[svelte]": { + "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-svelte", + "codeBlocks.queries": [ + "( (comment)* @header . (element) @item)", + "( (comment)* @header . (each_statement) @item)", + "( (comment)* @header . (if_statement) @item)", + "( (comment)* @header . (style_element) @item)", + "( (comment)* @header . (script_element) @item)" + ] + }, + "[python]": { + "codeBlocks.queries": [ + "(class_definition) @item", + "(function_definition) @item", + "(decorated_definition) @item" + ] + }, + "[java]": { + "codeBlocks.queries": [ + "( (block_comment)* @header . (class_declaration) @item)", + "( (block_comment)* @header . (method_declaration) @item)" + ] + }, + "[csharp]": { + "codeBlocks.npmPackageName": "tree-sitter-c-sharp", + "codeBlocks.parserName": "tree-sitter-c_sharp" + }, + "[latex]": { + "codeBlocks.npmPackageName": "@pfoerster/tree-sitter-latex" + }, + "[sql]": { + "codeBlocks.npmPackageName": "@derekstride/tree-sitter-sql" + } } - } }, - "configurationDefaults": { - "[github-actions-workflow]": { - "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-yaml", - "codeBlocks.parserName": "tree-sitter-yaml" - }, - "[jsonc]": { - "codeBlocks.npmPackageName": "tree-sitter-json" - }, - "[zig]": { - "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-zig" - }, - "[kotlin]": { - "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-kotlin" - }, - "[yaml]": { - "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-yaml" - }, - "[toml]": { - "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-toml" - }, - "[xml]": { - "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-xml", - "codeBlocks.subdirectory": "xml" - }, - "[markdown]": { - "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-markdown" - }, - "[shellscript]": { - "codeBlocks.npmPackageName": "tree-sitter-bash", - "codeBlocks.parserName": "tree-sitter-bash" - }, - "[rust]": { - "codeBlocks.queries": [ - "(([ (attribute_item) (line_comment) ] @header . [ (attribute_item) (line_comment) ]* @header )? . (function_item) @item)", - "(([ (attribute_item) (line_comment) ] @header . [ (attribute_item) (line_comment) ]* @header )? . (mod_item) @item)", - "(([ (attribute_item) (line_comment) ] @header . [ (attribute_item) (line_comment) ]* @header )? . (struct_item) @item)", - "(([ (attribute_item) (line_comment) ] @header . [ (attribute_item) (line_comment) ]* @header )? . (impl_item) @item)", - "(([ (attribute_item) (line_comment) ] @header . [ (attribute_item) (line_comment) ]* @header )? . (enum_item) @item)", - "(([ (attribute_item) (line_comment) ] @header . [ (attribute_item) (line_comment) ]* @header )? . (field_declaration) @item)", - "(match_arm) @arm" - ] - }, - "[typescript]": { - "codeBlocks.subdirectory": "typescript", - "codeBlocks.queries": [ - "( (comment)* @header . (class_declaration) @item)", - "( (comment)* @header . (method_definition) @item)", - "( (comment)* @header . (function_declaration) @item)", - "( (comment)* @header . (export_statement) @item)" - ] - }, - "[typescriptreact]": { - "codeBlocks.npmPackageName": "tree-sitter-typescript", - "codeBlocks.parserName": "tree-sitter-typescript", - "codeBlocks.subdirectory": "tsx", - "codeBlocks.queries": [ - "( (comment)* @header . (class_declaration) @item)", - "( (comment)* @header . (method_definition) @item)", - "( (comment)* @header . (function_declaration) @item)", - "( (comment)* @header . (export_statement) @item)", - "(jsx_element) @item", - "(jsx_self_closing_element) @item" - ] - }, - "[javascriptreact]": { - "codeBlocks.npmPackageName": "tree-sitter-javascript", - "codeBlocks.parserName": "tree-sitter-javascript", - "codeBlocks.queries": [ - "( (comment)* @header . (class_declaration) @item)", - "( (comment)* @header . (method_definition) @item)", - "( (comment)* @header . (function_declaration) @item)", - "( (comment)* @header . (export_statement) @item)", - "(jsx_element) @item", - "(jsx_self_closing_element) @item" - ] - }, - "[svelte]": { - "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-svelte", - "codeBlocks.queries": [ - "( (comment)* @header . (element) @item)", - "( (comment)* @header . (each_statement) @item)", - "( (comment)* @header . (if_statement) @item)", - "( (comment)* @header . (style_element) @item)", - "( (comment)* @header . (script_element) @item)" - ] - }, - "[python]": { - "codeBlocks.queries": [ - "(class_definition) @item", - "(function_definition) @item", - "(decorated_definition) @item" - ] - }, - "[java]": { - "codeBlocks.queries": [ - "( (block_comment)* @header . (class_declaration) @item)", - "( (block_comment)* @header . (method_declaration) @item)" - ] - }, - "[csharp]": { - "codeBlocks.npmPackageName": "tree-sitter-c-sharp", - "codeBlocks.parserName": "tree-sitter-c_sharp" - } + "scripts": { + "install:all": "yarn install --frozen-lockfile && cd webview-ui && yarn install --frozen-lockfile", + "start:webview": "cd webview-ui && yarn run dev", + "build:webview": "cd webview-ui && yarn run build && yarn run check", + "vscode:prepublish": "yarn run esbuild-base --minify", + "compile": "tsc -p ./", + "watch": "tsc -watch -p ./", + "pretest": "yarn run compile && yarn run lint", + "test": "node ./out/test/runTest.js", + "esbuild-base": "esbuild ./src/extension.ts --bundle --outfile=out/extension.js --external:vscode --external:tree-sitter --format=cjs --platform=node", + "esbuild": "yarn run esbuild-base --sourcemap", + "esbuild-watch": "yarn run esbuild-base --sourcemap --watch", + "lint": "tsc --noEmit && eslint src --ext ts" + }, + "devDependencies": { + "@types/chai": "5.2.3", + "@types/glob": "8.1.0", + "@types/mocha": "10.0.10", + "@types/node": "24.9.2", + "@types/tar": "6.1.13", + "@types/vscode": "1.105.0", + "@types/which": "3.0.4", + "@typescript-eslint/eslint-plugin": "8.46.2", + "@typescript-eslint/parser": "8.46.2", + "@vscode/test-electron": "2.5.2", + "chai": "6.2.0", + "esbuild": "0.25.11", + "eslint": "9.38.0", + "glob": "11.0.3", + "mocha": "11.7.4", + "typescript": "5.9.3", + "typescript-eslint": "8.46.2" + }, + "dependencies": { + "tar": "7.5.2", + "tree-sitter": "0.25.0", + "which": "5.0.0" } - }, - "scripts": { - "install:all": "yarn install --frozen-lockfile && cd webview-ui && yarn install --frozen-lockfile", - "start:webview": "cd webview-ui && yarn run dev", - "build:webview": "cd webview-ui && yarn run build && yarn run check", - "vscode:prepublish": "yarn run esbuild-base --minify", - "compile": "tsc -p ./", - "watch": "tsc -watch -p ./", - "pretest": "yarn run compile && yarn run lint", - "test": "node ./out/test/runTest.js", - "esbuild-base": "esbuild ./src/extension.ts --bundle --outfile=out/extension.js --external:vscode --external:tree-sitter --format=cjs --platform=node", - "esbuild": "yarn run esbuild-base --sourcemap", - "esbuild-watch": "yarn run esbuild-base --sourcemap --watch", - "lint": "tsc --noEmit && eslint src --ext ts" - }, - "devDependencies": { - "@types/chai": "5.2.3", - "@types/glob": "8.0.1", - "@types/mocha": "10.0.10", - "@types/node": "24.9.2", - "@types/tar": "6.1.13", - "@types/vscode": "1.105.0", - "@types/which": "3.0.4", - "@typescript-eslint/eslint-plugin": "^5.49.0", - "@typescript-eslint/parser": "^5.49.0", - "@vscode/test-electron": "2.5.2", - "chai": "6.2.0", - "esbuild": "0.25.11", - "eslint": "^8.44.0", - "glob": "8.1.0", - "mocha": "11.7.4", - "typescript": "5.9.3" - }, - "dependencies": { - "tar": "7.5.2", - "tree-sitter": "0.25.0", - "which": "5.0.0" - } } diff --git a/src/BlockMode.ts b/src/BlockMode.ts index 7d7b545e..37521bf1 100644 --- a/src/BlockMode.ts +++ b/src/BlockMode.ts @@ -390,7 +390,12 @@ export function activate(): vscode.Disposable[] { await vscode.commands.executeCommand("setContext", "codeBlocks.blockMode", active); }), blockModeActive.onDidChange((active) => { - active ? statusBar.show() : statusBar.hide(); + if (active) { + statusBar.show(); + } else { + statusBar.hide(); + } + resetDecorations(); if (vscode.window.activeTextEditor !== undefined) { diff --git a/src/FileTree.ts b/src/FileTree.ts index b65e0912..648bbb6c 100644 --- a/src/FileTree.ts +++ b/src/FileTree.ts @@ -1,10 +1,9 @@ import * as vscode from "vscode"; import { Block, getQueryBlocks } from "./BlockTree"; -import Parser, { Query, SyntaxNode, Tree } from "tree-sitter"; +import Parser, { type Language, Query, SyntaxNode, Tree } from "tree-sitter"; import { Result, err, ok } from "./result"; -import { Language } from "./Installer"; import { Selection } from "./Selection"; import { getLanguageConfig } from "./configuration"; import { getLogger } from "./outputChannel"; @@ -78,7 +77,6 @@ export class FileTree implements vscode.Disposable { logger.log( `Setting language for parser, language !== undefined = ${JSON.stringify( // sanity check - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition language !== undefined )}` ); diff --git a/src/Installer.ts b/src/Installer.ts index 13d14cb0..9f8bfd0b 100644 --- a/src/Installer.ts +++ b/src/Installer.ts @@ -5,47 +5,40 @@ import * as vscode from "vscode"; import { ExecException, ExecOptions, exec } from "child_process"; import { Result, err, ok } from "./result"; import { existsSync, rmSync } from "fs"; -import Parser from "tree-sitter"; +import type { Language } from "tree-sitter"; import { getLogger } from "./outputChannel"; import { mkdir } from "fs/promises"; +import { pathToFileURL } from "node:url"; import which from "which"; const NPM_INSTALL_URL = "https://nodejs.org/en/download"; -export type Language = Parser.Language; - export function getAbsoluteParserDir(parsersDir: string, parserName: string): string { return path.resolve(path.join(parsersDir, parserName)); } -export function getAbsoluteBindingsDir(parsersDir: string, parserName: string): string { +export function getAbsoluteBindingsPath(parsersDir: string, parserName: string): string { return path.resolve(path.join(parsersDir, parserName, "bindings", "node", "index.js")); } -export function loadParser( +export async function loadParser( parsersDir: string, parserName: string, subdirectory?: string -): Result { +): Promise> { const logger = getLogger(); - const bindingsDir = getAbsoluteBindingsDir(parsersDir, parserName); - if (!existsSync(bindingsDir)) { - const msg = `Expected parser directory doesn't exist: ${bindingsDir}`; + const bindingsPath = getAbsoluteBindingsPath(parsersDir, parserName); + if (!existsSync(bindingsPath)) { + const msg = `Expected parser bindings don't exist: ${bindingsPath}`; logger.log(msg); return err(msg); } try { - logger.log(`Loading parser from ${bindingsDir}`); - - // using dynamic import causes issues on windows - // make sure to test well on windows before changing this - // TODO(02/11/24): change to dynamic import - // let { default: language } = (await import(bindingsDir)) as { default: Language }; + logger.log(`Loading parser from ${bindingsPath}`); - // eslint-disable-next-line @typescript-eslint/no-var-requires - let language = require(bindingsDir) as Language; + let language = ((await import(pathToFileURL(bindingsPath).href)) as { default: Language }).default; logger.log(`Got language: ${JSON.stringify(Object.keys(language))}`); @@ -58,9 +51,11 @@ export function loadParser( } return ok(language); - } catch (error) { - logger.log(`Failed to load ${bindingsDir} > ${JSON.stringify(error)}`); - return err(`Failed to load ${bindingsDir} > ${JSON.stringify(error)}`); + } catch (error: unknown) { + const msg = error instanceof Error ? `${error.name}: ${error.message}` : JSON.stringify(error); + + logger.log(`Failed to load ${bindingsPath} > ${msg}`); + return err(`Failed to load ${bindingsPath} > ${msg}`); } } @@ -69,7 +64,7 @@ export async function downloadAndBuildParser( parserNpmPackage: string, parserName: string, npm: string, - treeSitterCli: string, + rebuild: boolean = false, onData?: (data: string) => void ): Promise> { const logger = getLogger(); @@ -118,31 +113,24 @@ export async function downloadAndBuildParser( } // try to load parser optimistically - const loadResult = loadParser(parsersDir, parserName); - if (loadResult.status === "ok") { - return ok(undefined); - } - - logger.log(`Optimistic load failed, trying to build parser ${parserName}`); - const treeSitterCliOk = await runCmd(`${treeSitterCli} --version`); - if (treeSitterCliOk.status === "err") { - const msg = - `Parser ${parserName} requires local build, but - tree-sitter cli command '${treeSitterCli}' failed: - ${treeSitterCliOk.result[0].name} ${treeSitterCliOk.result[0].message.replace(/\n/g, " > ")}.` + - (treeSitterCliOk.result[1].length > 1 ? ` Logs: ${treeSitterCliOk.result[1].join(">")}` : ""); - - logger.log(msg); - return err(msg); + if (!rebuild) { + const loadResult = await loadParser(parsersDir, parserName); + if (loadResult.status === "ok") { + return ok(undefined); + } + logger.log(`Optimistic load failed for parser ${parserName}`); } // if it fails, try to build it - const buildResult = await runCmd(`${treeSitterCli} generate`, { cwd: parserDir }, (d) => - onData?.(d.toString()) + logger.log(`Building parser ${parserName}`); + const buildResult = await runCmd( + `${npm} exec --yes --loglevel silly --prefix ${parsersDir} node-gyp rebuild --target=${process.versions.electron} --dist-url=https://electronjs.org/headers --runtime=electron`, + { cwd: parserDir }, + (d) => onData?.(d.toString()) ); if (buildResult.status === "err") { const msg = - "Failed to build parser using tree-sitter cli > " + + "Failed to build parser > " + buildResult.result[0].name + ": " + buildResult.result[0].message.replace(/\n/g, " > ") + @@ -192,7 +180,8 @@ export type GetLanguageError = { export async function getLanguage( parsersDir: string, languageId: string, - autoInstall = false + autoInstall = false, + rebuild = false ): Promise> { const logger = getLogger(); @@ -206,7 +195,6 @@ export async function getLanguage( const parserPackagePath = getAbsoluteParserDir(parsersDir, parserName); const npm = "npm"; - const treeSitterCli = configuration.getTreeSitterCliPath(); if (!existsSync(parserPackagePath)) { const doInstall = autoInstall @@ -246,7 +234,6 @@ export async function getLanguage( return ok(undefined); } - let number = 0; const downloadResult = await vscode.window.withProgress( { location: vscode.ProgressLocation.Notification, @@ -259,8 +246,8 @@ export async function getLanguage( npmPackageName, parserName, npm, - treeSitterCli, - (data) => progress.report({ message: data, increment: number++ }) + rebuild, + (data) => progress.report({ message: data }) ); } ); @@ -273,7 +260,7 @@ export async function getLanguage( } } - const loadResult = loadParser(parsersDir, parserName, subdirectory); + const loadResult = await loadParser(parsersDir, parserName, subdirectory); if (loadResult.status === "err") { const msg = `Failed to load parser for language ${languageId} > ${loadResult.result}`; diff --git a/src/configuration.ts b/src/configuration.ts index 291566d4..977d11ed 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -57,11 +57,3 @@ export function getColorConfig(): ColorConfig { parentColor: colorConfig?.parentColor ?? defaultParentColor, }; } - -export function getTreeSitterCliPath(): string { - const treeSitterCliPath = vscode.workspace - .getConfiguration("codeBlocks") - .get("treeSitterCliPath"); - - return treeSitterCliPath ?? "tree-sitter"; -} diff --git a/src/examples/exampleUtils.ts b/src/examples/exampleUtils.ts index 6de95fbd..b5c89552 100644 --- a/src/examples/exampleUtils.ts +++ b/src/examples/exampleUtils.ts @@ -2,25 +2,18 @@ import * as vscode from "vscode"; import { BlockMode, active, activeFileTree } from "../extension"; import { FileTree } from "../FileTree"; import { expect } from "chai"; -import { join } from "path"; - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import settings from "./examples-editor/.vscode/settings.json"; const TEST_START_SIGNAL = "@"; export async function initExample(): Promise { - const exampleEditorPath = join(__dirname, "examples-editor"); await cmd("workbench.action.toggleLightDarkThemes"); - await cmd("vscode.openFolder", vscode.Uri.file(exampleEditorPath), { - forceNewWindow: false, - }); + await cmd("workbench.action.toggleAuxiliaryBar"); await cmd("notifications.clearAll"); await sleep(100); await cmd("notifications.clearAll"); } export async function cmd(c: string, ...args: unknown[]): Promise { - await vscode.commands.executeCommand(c, ...args); + return await vscode.commands.executeCommand(c, ...args); } export function zoomOut(): void { @@ -42,14 +35,23 @@ export async function type( ): Promise { const chars = text.split(""); const document = editor.document; + let target = position; let offset = document.offsetAt(position); for (const char of chars) { const edit = new vscode.WorkspaceEdit(); edit.insert(document.uri, target, char); + editor.selection = new vscode.Selection(target, target); await vscode.workspace.applyEdit(edit); - const noise = Math.random() * (delay / 2) - delay / 4; + + let noise = Math.random() * (delay / 2) - delay / 4; + if (char === " ") { + noise += delay; + } else if ("()[]{}:\"'".includes(char)) { + noise += delay * 1.5; + } + await sleep(delay + noise); offset++; target = document.positionAt(offset); @@ -83,7 +85,11 @@ export async function openDocument({ content, maximize = true, cursor = undefined, -}: OpenDocumentParams): Promise<{ activeEditor: vscode.TextEditor; fileTree: FileTree; realContent: string }> { +}: OpenDocumentParams): Promise<{ + activeEditor: vscode.TextEditor; + fileTree: FileTree; + realContent: string; +}> { if (!active.get()) { active.set(true); } @@ -92,12 +98,14 @@ export async function openDocument({ BlockMode.toggleBlockMode(); } - let cursorIndex = -1; + const selections = []; if (cursor !== undefined) { - cursorIndex = content.indexOf(cursor); - expect(cursorIndex).not.to.equal(-1, `failed to find cursor '${cursor}' in content:\n${content}`); - - content = content.replace(cursor, ""); + let cursorIndex = content.indexOf(cursor); + while (cursorIndex > -1) { + content = content.replace(cursor, ""); + selections.push(cursorIndex); + cursorIndex = content.indexOf(cursor); + } } const activeEditor = await vscode.window.showTextDocument( @@ -107,15 +115,19 @@ export async function openDocument({ }) ); - if (cursorIndex !== -1) { - activeEditor.selection = new vscode.Selection( - activeEditor.document.positionAt(cursorIndex), - activeEditor.document.positionAt(cursorIndex) + if (selections.length > 0) { + activeEditor.selections = selections.map( + (cursorIndex) => + new vscode.Selection( + activeEditor.document.positionAt(cursorIndex), + activeEditor.document.positionAt(cursorIndex) + ) ); } if (maximize) { - await vscode.commands.executeCommand("workbench.action.maximizeEditor"); + await cmd("workbench.action.minimizeOtherEditors"); + await cmd("workbench.action.closeSidebar"); } let fileTree = activeFileTree.get(); @@ -144,7 +156,7 @@ export type TestSelectionCommandsParams = { content: string; cursor: string; selectionCommands: SelectionCommand[]; - expectedSelectionContent: string; + expectedSelectionContent: string | string[]; pause: number; }; @@ -156,6 +168,10 @@ export async function selectionExample({ language, pause, }: TestSelectionCommandsParams): Promise { + if (typeof expectedSelectionContent === "string") { + expectedSelectionContent = [expectedSelectionContent]; + } + await initExample(); const { activeEditor } = await openDocument({ @@ -176,18 +192,19 @@ export async function selectionExample({ await sleep(pause); } - const selectionContent = activeEditor.document.getText(activeEditor.selection); + const selectionContent = activeEditor.selections + .map((s) => activeEditor.document.getText(s)) + .join("\n--\n"); + expect(selectionContent).to.equal( - expectedSelectionContent, + expectedSelectionContent.join("\n--\n"), "selection commands didn't produce desired selection" ); return activeEditor; } -export type MoveCommand = - | "codeBlocks.moveDown" - | "codeBlocks.moveUp"; +export type MoveCommand = "codeBlocks.moveDown" | "codeBlocks.moveUp"; export type TestMoveCommandsParams = { language: SupportedTestLanguages; @@ -196,7 +213,7 @@ export type TestMoveCommandsParams = { selectionCommands: SelectionCommand[]; selectionMessage: string; moveCommands: MoveCommand[]; - expectedSelectionContent: string; + expectedSelectionContent: string | string[]; expectedContent: string; pause: number; }; @@ -211,6 +228,10 @@ export async function moveExample({ expectedContent, pause, }: TestMoveCommandsParams): Promise { + if (typeof expectedSelectionContent === "string") { + expectedSelectionContent = [expectedSelectionContent]; + } + await initExample(); const { activeEditor } = await openDocument({ @@ -234,9 +255,12 @@ export async function moveExample({ await sleep(pause); - const selectionContent = activeEditor.document.getText(activeEditor.selection); + const selectionContent = activeEditor.selections + .map((s) => activeEditor.document.getText(s)) + .join("\n--\n"); + expect(selectionContent).to.equal( - expectedSelectionContent, + expectedSelectionContent.join("\n--\n"), "selection commands didn't produce desired selection" ); @@ -248,11 +272,13 @@ export async function moveExample({ } const newContent = activeEditor.document.getText(); - const newSelectionContent = activeEditor.document.getText(activeEditor.selection); + const newSelectionContent = activeEditor.selections + .map((s) => activeEditor.document.getText(s)) + .join("\n--\n"); expect(newContent).to.equal(expectedContent, "move command didn't produce desired content"); expect(newSelectionContent).to.equal( - expectedSelectionContent, + expectedSelectionContent.join("\n--\n"), "move command didn't preserve selection content" ); } @@ -293,13 +319,15 @@ export async function testNavigateCommands({ expect(newCursorIndex).to.equal( expectedNavigationDestinationIndex, "navigation commands didn't arrive to expected destination" + - `\n\tactual: ${cleanContent.substring(0, newCursorIndex) + - targetCursor + - cleanContent.substring(newCursorIndex) - }` + - `\n\texpect: ${cleanContent.substring(0, expectedNavigationDestinationIndex) + - targetCursor + - cleanContent.substring(expectedNavigationDestinationIndex) - }\n` + `\n\tactual: ${ + cleanContent.substring(0, newCursorIndex) + + targetCursor + + cleanContent.substring(newCursorIndex) + }` + + `\n\texpect: ${ + cleanContent.substring(0, expectedNavigationDestinationIndex) + + targetCursor + + cleanContent.substring(expectedNavigationDestinationIndex) + }\n` ); } diff --git a/src/examples/runExample.ts b/src/examples/runExample.ts index 42172940..6ee7ed24 100644 --- a/src/examples/runExample.ts +++ b/src/examples/runExample.ts @@ -2,6 +2,10 @@ import * as path from "path"; import { runTests } from "@vscode/test-electron"; +// ensure settings.json gets copied to build directory +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import settings from "./examples-editor/.vscode/settings.json"; + async function main(): Promise { try { // The folder containing the Extension Manifest package.json @@ -13,7 +17,11 @@ async function main(): Promise { const extensionTestsPath = path.resolve(__dirname, `./suite/index`); // Download VS Code, unzip it and run the integration test - await runTests({ extensionDevelopmentPath, extensionTestsPath }); + await runTests({ + extensionDevelopmentPath, + extensionTestsPath, + launchArgs: [path.resolve(__dirname, "examples-editor")], + }); } catch (err) { console.error("Failed to run tests", err); process.exit(1); diff --git a/src/examples/suite/Block_Mode_-_Move_-_Rust_-_Match_arms.example.ts b/src/examples/suite/Block_Mode_-_Move_-_Rust_-_Match_arms.example.ts index 64e5bd02..832b9aa0 100644 --- a/src/examples/suite/Block_Mode_-_Move_-_Rust_-_Match_arms.example.ts +++ b/src/examples/suite/Block_Mode_-_Move_-_Rust_-_Match_arms.example.ts @@ -4,12 +4,17 @@ const TIMEOUT = process.env.EXAMPLE_TIMEOUT ?? "2m"; test("Block mode 2", async function () { await moveExample({ language: "rust", - content: `fn main() { - match rand::thread_rng().gen_range(0..=3) { + content: `\ +fn main() { + match rand::thread_rng().gen_range(0..=7) { 0 => println!("hi"), 1 => println!("he@llo"), 2 => println!("howdy"), - _ => println!("salutations"), + 3 => println!("hey"), + 4 => println!("hiya"), + 5 => println!("he@llo there"), + 6 => println!("salutations"), + _ => println!("general kenobi"), } }`, cursor: "@", @@ -17,18 +22,28 @@ test("Block mode 2", async function () { "codeBlocks.selectParent", "codeBlocks.selectParent", "codeBlocks.selectParent", + "codeBlocks.selectParent", "codeBlocks.selectPrevious", ], selectionMessage: "Select match arms", moveCommands: ["codeBlocks.moveDown", "codeBlocks.moveDown", "codeBlocks.moveUp"], - expectedSelectionContent: `0 => println!("hi"), + expectedSelectionContent: [ + `0 => println!("hi"), 1 => println!("hello"),`, - expectedContent: `fn main() { - match rand::thread_rng().gen_range(0..=3) { + `4 => println!("hiya"), + 5 => println!("hello there"),`, + ], + expectedContent: `\ +fn main() { + match rand::thread_rng().gen_range(0..=7) { 2 => println!("howdy"), 0 => println!("hi"), 1 => println!("hello"), - _ => println!("salutations"), + 3 => println!("hey"), + 6 => println!("salutations"), + 4 => println!("hiya"), + 5 => println!("hello there"), + _ => println!("general kenobi"), } }`, pause: 1000, diff --git a/src/examples/suite/Tree_Viewer.example.ts b/src/examples/suite/Tree_Viewer.example.ts index 5125a615..24a52ee2 100644 --- a/src/examples/suite/Tree_Viewer.example.ts +++ b/src/examples/suite/Tree_Viewer.example.ts @@ -44,7 +44,9 @@ source_file [1:0 - 10:0] struct_item [2:0 - 5:1] type_identifier [2:7 - 2:8] field_declaration_list [2:9 - 5:1] - line_comment [3:4 - 3:18] + line_comment [3:4 - 4:0] + outer_doc_comment_marker [3:6 - 3:7] + doc_comment [3:7 - 4:0] field_declaration [4:4 - 4:10] field_identifier [4:4 - 4:5] primitive_type [4:7 - 4:10] @@ -60,10 +62,12 @@ source_file [1:0 - 10:0] await sleep(1500); const didChange = new Promise((r) => { - const disposable = vscode.workspace.onDidChangeTextDocument(event => { + const disposable = vscode.workspace.onDidChangeTextDocument((event) => { if (event.document.uri.toString() === treeViewerDocument.uri.toString()) { - if (event.document.getText() !== TreeViewer.placeholder && - !event.document.getText().startsWith("source_file")) { + if ( + event.document.getText() !== TreeViewer.placeholder && + !event.document.getText().startsWith("source_file") + ) { r(disposable); } } diff --git a/src/examples/suite/example.example.ts b/src/examples/suite/example.example.ts index a8a042d3..96936f20 100644 --- a/src/examples/suite/example.example.ts +++ b/src/examples/suite/example.example.ts @@ -1,19 +1,20 @@ import * as vscode from "vscode"; -import { initExample, openDocument, sleep, startRecording } from "../exampleUtils"; +// import { initExample, openDocument, sleep, startRecording } from "../exampleUtils"; +import { initExample, sleep } from "../exampleUtils"; const TIMEOUT = process.env.EXAMPLE_TIMEOUT ?? "20s"; test("Example", async function () { await initExample(); - startRecording(); + // startRecording(); void vscode.window.showInformationMessage("Hello world"); await sleep(1500); - await openDocument({ - language: "rust", - content: `// hello world -`, - maximize: true, - }); + // await openDocument({ + // language: "rust", + // content: `// hello world + // `, + // maximize: true, + // }); - await sleep(1500); + // await sleep(1500); }).timeout(TIMEOUT); diff --git a/src/examples/suite/index.ts b/src/examples/suite/index.ts index 393c55f4..fcabcb41 100644 --- a/src/examples/suite/index.ts +++ b/src/examples/suite/index.ts @@ -1,48 +1,39 @@ import * as path from "path"; import Mocha from "mocha"; -import glob from "glob"; +import { glob } from "glob"; -export function run(): Promise { - if (process.env.EXAMPLE === undefined) { +export async function run(): Promise { + let example = process.env.EXAMPLE; + if (example === undefined) { console.log("@".repeat(1000)); console.error("No example file specified, set EXAMPLE environ found"); process.exit(1); } // change extension to .js - let example = process.env.EXAMPLE; - example = example.substring(0, example.length - 2) + "js"; - - // Create the mocha test - const mocha = new Mocha({ - ui: "tdd", - color: true, - }); + example = example.slice(0, -2) + "js"; + const mocha = new Mocha({ ui: "tdd", color: true }); const testsRoot = path.resolve(__dirname, ".."); - return new Promise((c, e) => { - glob(`suite/${example}`, { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); - } + try { + const files = await glob(`suite/${example}`, { cwd: testsRoot }); - // Add files to the test suite - files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); + // Add files to the test suite + files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); - try { - // Run the mocha test - mocha.run((failures) => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - console.error(err); - e(err); - } + await new Promise((resolve, reject) => { + // Run the mocha test + mocha.run((failures) => { + if (failures > 0) { + reject(new Error(`${failures} tests failed.`)); + } else { + resolve(); + } + }); }); - }); + } catch (err) { + console.error(err); + throw err; + } } diff --git a/src/test/suite/Installer.test.ts b/src/test/suite/Installer.test.ts index 0b688c22..00c2ed94 100644 --- a/src/test/suite/Installer.test.ts +++ b/src/test/suite/Installer.test.ts @@ -4,10 +4,12 @@ import * as vscode from "vscode"; import Parser from "tree-sitter"; import { TreeViewer } from "../../TreeViewer"; import { openDocument } from "./testUtils"; +import path from "path"; export async function testParser(language: string, content?: string): Promise { // fail the test if the parser could not be installed - const result = await Installer.getLanguage("test-parsers", language, true); + const testParsersDir = path.resolve(__dirname, "..", "..", "..", "test-parsers"); + const result = await Installer.getLanguage(testParsersDir, language, true, true); if (result.status === "err") { throw new Error(`Failed to install language: ${JSON.stringify(result.result)}`); } @@ -25,8 +27,8 @@ export async function testParser(language: string, content?: string): Promise"], - // ["CSS", "css", "body { color: red; }"], + ["CSS", "css", "body { color: red; }"], ["YAML", "yaml", "key: value"], ["JSON", "json", '{ "key": "value" }'], ["XML", "xml"], ["Markdown", "markdown", "# Title"], - // ["LaTeX", "latex"], + ["LaTeX", "latex"], ["Bash", "shellscript", "echo 'Hello, World!'"], ["TOML", "toml"], - // ["Swift", "swift"], + ["Swift", "swift"], ["Kotlin", "kotlin", "fun main() { }"], ["Zig", "zig", 'const std = @import("std");\n\npub fn main() void { }'], ]; diff --git a/src/test/suite/Selection.test.ts b/src/test/suite/Selection.test.ts index df477b8a..760c74c0 100644 --- a/src/test/suite/Selection.test.ts +++ b/src/test/suite/Selection.test.ts @@ -32,7 +32,7 @@ suite("Selection", function () { suite(".update", function () { test("Select source_file node is undefined", async () => { - expect(await selectionAt("rust", "fn main() { }@")).to.be.undefined; + expect(await selectionAt("rust", "fn main() { }@")).to.equal(undefined); }); test("Update selection parent/child", async () => { @@ -59,7 +59,7 @@ suite("Selection", function () { }); test("Select source_file node is undefined", async () => { - expect(await selectionAt("typescriptreact", "function main() { }@")).to.be.undefined; + expect(await selectionAt("typescriptreact", "function main() { }@")).to.equal(undefined); }); test("Update selection parent/child", async () => { diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts index e18f884d..7b591fab 100644 --- a/src/test/suite/index.ts +++ b/src/test/suite/index.ts @@ -1,41 +1,28 @@ import * as path from "path"; import Mocha from "mocha"; -import glob from "glob"; +import { glob } from "glob"; export async function run(): Promise { - // Create the mocha test - const mocha = new Mocha({ - ui: "tdd", - color: true, - bail: false, - }); - + const mocha = new Mocha({ ui: "tdd", color: true, bail: false }); const testsRoot = path.resolve(__dirname, ".."); - return new Promise((c, e) => { - glob.glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); - } + try { + const files = await glob("**/**.test.js", { cwd: testsRoot }); - // Add files to the test suite - files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); + files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); - try { - // Run the mocha test - mocha.run((failures) => { - if (failures > 0) { - // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - console.error(err); - e(err); - } + await new Promise((resolve, reject) => { + mocha.run((failures) => { + if (failures > 0) { + reject(new Error(`${failures} tests failed.`)); + } else { + resolve(); + } + }); }); - }); + } catch (err) { + console.error(err); + throw err; + } } diff --git a/tsconfig.json b/tsconfig.json index 8867d3a9..e189d3e6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,8 @@ { "compilerOptions": { - "module": "commonjs", - "target": "ES2022", + "module": "nodenext", + "moduleResolution": "nodenext", + "target": "ES2020", "outDir": "out", "lib": [ "ES2022", diff --git a/yarn.lock b/yarn.lock index 55f048d5..c3390ed7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -132,56 +132,115 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz#5ecda6f3fe138b7e456f4e429edde33c823f392f" integrity sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA== -"@eslint-community/eslint-utils@^4.2.0": +"@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0": version "4.9.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": version "4.12.2" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== +"@eslint/config-array@^0.21.1": + version "0.21.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.1.tgz#7d1b0060fea407f8301e932492ba8c18aff29713" + integrity sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA== + dependencies: + "@eslint/object-schema" "^2.1.7" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/config-helpers@^0.4.1": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda" + integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== + dependencies: + "@eslint/core" "^0.17.0" + +"@eslint/core@^0.16.0": + version "0.16.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.16.0.tgz#490254f275ba9667ddbab344f4f0a6b7a7bd7209" + integrity sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/core@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c" + integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" + integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" + espree "^10.0.1" + globals "^14.0.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.1": - version "8.57.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" - integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== +"@eslint/js@9.38.0": + version "9.38.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.38.0.tgz#f7aa9c7577577f53302c1d795643589d7709ebd1" + integrity sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A== -"@humanwhocodes/config-array@^0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" - integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== +"@eslint/object-schema@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" + integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== + +"@eslint/plugin-kit@^0.4.0": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2" + integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== dependencies: - "@humanwhocodes/object-schema" "^2.0.3" - debug "^4.3.1" - minimatch "^3.0.5" + "@eslint/core" "^0.17.0" + levn "^0.4.1" + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.7.tgz#822cb7b3a12c5a240a24f621b5a2413e27a45f26" + integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.4.0" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== + +"@isaacs/balanced-match@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" + integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== + +"@isaacs/brace-expansion@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3" + integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA== + dependencies: + "@isaacs/balanced-match" "^4.0.1" "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -215,7 +274,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.walk@^1.2.3": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -241,15 +300,20 @@ resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== -"@types/glob@8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.0.1.tgz#6e3041640148b7764adf21ce5c7138ad454725b0" - integrity sha512-8bVUjXZvJacUFkJXHdyZ9iH1Eaj5V7I8c4NdH5sQJsdXkqT4CA5Dhb4yb4VE/3asyx4L9ayZr1NIhTsWHczmMw== +"@types/estree@^1.0.6": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +"@types/glob@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" + integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== dependencies: "@types/minimatch" "^5.1.2" "@types/node" "*" -"@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.15": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -271,11 +335,6 @@ dependencies: undici-types "~7.16.0" -"@types/semver@^7.3.12": - version "7.7.1" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.1.tgz#3ce3af1a5524ef327d2da9e4fd8b6d95c8d70528" - integrity sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA== - "@types/tar@6.1.13": version "6.1.13" resolved "https://registry.yarnpkg.com/@types/tar/-/tar-6.1.13.tgz#9b5801c02175344101b4b91086ab2bbc8e93a9b6" @@ -294,94 +353,103 @@ resolved "https://registry.yarnpkg.com/@types/which/-/which-3.0.4.tgz#2c3a89be70c56a84a6957a7264639f39ae4340a1" integrity sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w== -"@typescript-eslint/eslint-plugin@^5.49.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== +"@typescript-eslint/eslint-plugin@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz#dc4ab93ee3d7e6c8e38820a0d6c7c93c7183e2dc" + integrity sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w== dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.46.2" + "@typescript-eslint/type-utils" "8.46.2" + "@typescript-eslint/utils" "8.46.2" + "@typescript-eslint/visitor-keys" "8.46.2" graphemer "^1.4.0" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.49.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== - dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - debug "^4.3.4" + ignore "^7.0.0" + natural-compare "^1.4.0" + ts-api-utils "^2.1.0" -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== +"@typescript-eslint/parser@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.46.2.tgz#dd938d45d581ac8ffa9d8a418a50282b306f7ebf" + integrity sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g== dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/scope-manager" "8.46.2" + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/typescript-estree" "8.46.2" + "@typescript-eslint/visitor-keys" "8.46.2" + debug "^4.3.4" -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== +"@typescript-eslint/project-service@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.46.2.tgz#ab2f02a0de4da6a7eeb885af5e059be57819d608" + integrity sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg== dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" + "@typescript-eslint/tsconfig-utils" "^8.46.2" + "@typescript-eslint/types" "^8.46.2" debug "^4.3.4" - tsutils "^3.21.0" -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/scope-manager@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz#7d37df2493c404450589acb3b5d0c69cc0670a88" + integrity sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA== + dependencies: + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/visitor-keys" "8.46.2" + +"@typescript-eslint/tsconfig-utils@8.46.2", "@typescript-eslint/tsconfig-utils@^8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz#d110451cb93bbd189865206ea37ef677c196828c" + integrity sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag== -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== +"@typescript-eslint/type-utils@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz#802d027864e6fb752e65425ed09f3e089fb4d384" + integrity sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA== dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/typescript-estree" "8.46.2" + "@typescript-eslint/utils" "8.46.2" debug "^4.3.4" - globby "^11.1.0" + ts-api-utils "^2.1.0" + +"@typescript-eslint/types@8.46.2", "@typescript-eslint/types@^8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.46.2.tgz#2bad7348511b31e6e42579820e62b73145635763" + integrity sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ== + +"@typescript-eslint/typescript-estree@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz#ab547a27e4222bb6a3281cb7e98705272e2c7d08" + integrity sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ== + dependencies: + "@typescript-eslint/project-service" "8.46.2" + "@typescript-eslint/tsconfig-utils" "8.46.2" + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/visitor-keys" "8.46.2" + debug "^4.3.4" + fast-glob "^3.3.2" is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - -"@ungap/structured-clone@^1.2.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" - integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.1.0" + +"@typescript-eslint/utils@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.46.2.tgz#b313d33d67f9918583af205bd7bcebf20f231732" + integrity sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg== + dependencies: + "@eslint-community/eslint-utils" "^4.7.0" + "@typescript-eslint/scope-manager" "8.46.2" + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/typescript-estree" "8.46.2" + +"@typescript-eslint/visitor-keys@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz#803fa298948c39acf810af21bdce6f8babfa9738" + integrity sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w== + dependencies: + "@typescript-eslint/types" "8.46.2" + eslint-visitor-keys "^4.2.1" "@vscode/test-electron@2.5.2": version "2.5.2" @@ -399,7 +467,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.9.0: +acorn@^8.15.0: version "8.15.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== @@ -446,11 +514,6 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - assertion-error@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" @@ -571,7 +634,7 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cross-spawn@^7.0.2, cross-spawn@^7.0.6: +cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -602,20 +665,6 @@ diff@^7.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -678,81 +727,74 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== +eslint-scope@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" + integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.44.0: - version "8.57.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" - integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.1" - "@humanwhocodes/config-array" "^0.13.0" +eslint-visitor-keys@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" + integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== + +eslint@9.38.0: + version "9.38.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.38.0.tgz#3957d2af804e5cf6cc503c618f60acc71acb2e7e" + integrity sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw== + dependencies: + "@eslint-community/eslint-utils" "^4.8.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.21.1" + "@eslint/config-helpers" "^0.4.1" + "@eslint/core" "^0.16.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "9.38.0" + "@eslint/plugin-kit" "^0.4.0" + "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" ajv "^6.12.4" chalk "^4.0.0" - cross-spawn "^7.0.2" + cross-spawn "^7.0.6" debug "^4.3.2" - doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" + eslint-scope "^8.4.0" + eslint-visitor-keys "^4.2.1" + espree "^10.4.0" + esquery "^1.5.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" + file-entry-cache "^8.0.0" find-up "^5.0.0" glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== +espree@^10.0.1, espree@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== dependencies: - acorn "^8.9.0" + acorn "^8.15.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" + eslint-visitor-keys "^4.2.1" -esquery@^1.4.2: +esquery@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== @@ -766,11 +808,6 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" @@ -786,7 +823,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.9: +fast-glob@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== @@ -814,12 +851,12 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: - flat-cache "^3.0.4" + flat-cache "^4.0.0" fill-range@^7.1.1: version "7.1.1" @@ -836,14 +873,13 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" + keyv "^4.5.4" flat@^5.0.2: version "5.0.2" @@ -855,7 +891,7 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== -foreground-child@^3.1.0: +foreground-child@^3.1.0, foreground-child@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== @@ -863,11 +899,6 @@ foreground-child@^3.1.0: cross-spawn "^7.0.6" signal-exit "^4.0.1" -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -892,16 +923,17 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== +glob@11.0.3: + version "11.0.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.3.tgz#9d8087e6d72ddb3c4707b1d2778f80ea3eaefcd6" + integrity sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" + foreground-child "^3.3.1" + jackspeak "^4.1.1" + minimatch "^10.0.3" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^2.0.0" glob@^10.4.5: version "10.4.5" @@ -915,36 +947,10 @@ glob@^10.4.5: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== graphemer@^1.4.0: version "1.4.0" @@ -982,6 +988,11 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== +ignore@^7.0.0: + version "7.0.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -1000,15 +1011,7 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@~2.0.3: +inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1089,6 +1092,13 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jackspeak@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.1.tgz#96876030f450502047fc7e8c7fcf8ce8124e43ae" + integrity sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -1121,7 +1131,7 @@ jszip@^3.10.1: readable-stream "~2.3.6" setimmediate "^1.0.5" -keyv@^4.5.3: +keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -1176,7 +1186,12 @@ lru-cache@^10.2.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== -merge2@^1.3.0, merge2@^1.4.1: +lru-cache@^11.0.0: + version "11.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.2.tgz#40fd37edffcfae4b2940379c0722dc6eeaa75f24" + integrity sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg== + +merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -1194,20 +1209,20 @@ mimic-function@^5.0.0: resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^10.0.3: + version "10.1.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.1.tgz#e6e61b9b0c1dcab116b5a7d1458e8b6ae9e73a55" + integrity sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ== + dependencies: + "@isaacs/brace-expansion" "^5.0.0" + +minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - minimatch@^9.0.4, minimatch@^9.0.5: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" @@ -1264,11 +1279,6 @@ ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -1284,13 +1294,6 @@ node-gyp-build@^4.8.4: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - onetime@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" @@ -1361,11 +1364,6 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -1379,10 +1377,13 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +path-scurry@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" + integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" picocolors@^1.1.1: version "1.1.1" @@ -1462,13 +1463,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -1486,7 +1480,7 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -semver@^7.3.7, semver@^7.6.2: +semver@^7.6.0, semver@^7.6.2: version "7.7.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== @@ -1520,11 +1514,6 @@ signal-exit@^4.0.1, signal-exit@^4.1.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - stdin-discarder@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.2.2.tgz#390037f44c4ae1a1ae535c5fe38dc3aba8d997be" @@ -1624,11 +1613,6 @@ tar@7.5.2: minizlib "^3.1.0" yallist "^5.0.0" -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -1644,17 +1628,10 @@ tree-sitter@0.25.0: node-addon-api "^8.3.0" node-gyp-build "^4.8.4" -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" +ts-api-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" + integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -1663,10 +1640,15 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +typescript-eslint@8.46.2: + version "8.46.2" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.46.2.tgz#da1adec683ba93a1b6c3850a4efb0922ffbc627d" + integrity sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg== + dependencies: + "@typescript-eslint/eslint-plugin" "8.46.2" + "@typescript-eslint/parser" "8.46.2" + "@typescript-eslint/typescript-estree" "8.46.2" + "@typescript-eslint/utils" "8.46.2" typescript@5.9.3: version "5.9.3" @@ -1741,11 +1723,6 @@ wrap-ansi@^8.1.0: string-width "^5.0.1" strip-ansi "^7.0.1" -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"