From b78e3ca59a5535e1976f4063b186816e765953db Mon Sep 17 00:00:00 2001 From: litcc Date: Sun, 8 Feb 2026 19:44:41 +0800 Subject: [PATCH 1/3] feat: Multi-Editor Navigation Support - Multi-editor support (Architecture refactor: types, configManager, editorSelector, jumpHandlerFactory, jetbrainsHandler) - TreeView visual management panel (editorTreeView) - TreeView show/hide configuration - i18n internationalization (l10n + package.nls) - Dependency version upgrades --- package.json | 142 +++- pnpm-lock.yaml | 1062 ++++++++++++++++++++++-------- src/configManager.ts | 62 ++ src/editorSelector.ts | 32 + src/editorTreeView.ts | 289 ++++++++ src/extension.ts | 367 ++++++----- src/handlers/jetbrainsHandler.ts | 238 +++++++ src/jumpHandlerFactory.ts | 48 ++ src/test/extension.test.ts | 27 +- src/types.ts | 45 ++ 10 files changed, 1870 insertions(+), 442 deletions(-) create mode 100644 src/configManager.ts create mode 100644 src/editorSelector.ts create mode 100644 src/editorTreeView.ts create mode 100644 src/handlers/jetbrainsHandler.ts create mode 100644 src/jumpHandlerFactory.ts create mode 100644 src/types.ts diff --git a/package.json b/package.json index 99f0a16..5108897 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "switch2idea", "displayName": "Switch2IDEA", "description": "Quickly switch between VS Code and IntelliJ IDEA, open current file in IDEA with the same position", - "version": "1.0.3", + "version": "1.0.4", "publisher": "qczone", "license": "MIT", "repository": { @@ -27,16 +27,57 @@ "activationEvents": [ "onStartupFinished" ], + "l10n": "./l10n", "main": "./out/extension.js", "contributes": { + "views": { + "explorer": [ + { + "id": "switch2idea.editors", + "name": "%view.editors.name%", + "contextualTitle": "%view.editors.contextualTitle%", + "when": "switch2idea.showTreeView" + } + ] + }, "commands": [ { "command": "Switch2IDEA.openFileInIDEA", - "title": "Open File in IDEA" + "title": "%command.openFile%" }, { "command": "Switch2IDEA.openProjectInIDEA", - "title": "Open Project in IDEA" + "title": "%command.openProject%" + }, + { + "command": "switch2idea.addEditor", + "title": "%command.addEditor%", + "icon": "$(add)" + }, + { + "command": "switch2idea.editEditor", + "title": "%command.editEditor%", + "icon": "$(edit)" + }, + { + "command": "switch2idea.deleteEditor", + "title": "%command.deleteEditor%", + "icon": "$(trash)" + }, + { + "command": "switch2idea.openJsonConfig", + "title": "%command.openJsonConfig%", + "icon": "$(json)" + }, + { + "command": "switch2idea.refreshEditors", + "title": "%command.refreshEditors%", + "icon": "$(refresh)" + }, + { + "command": "switch2idea.jumpToEditor", + "title": "%command.jumpToEditor%", + "icon": "$(link-external)" } ], "keybindings": [ @@ -55,10 +96,51 @@ "configuration": { "title": "Switch2IDEA", "properties": { + "switch2idea.editors": { + "type": "array", + "default": [], + "description": "%config.editors.description%", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "%config.editors.items.name.description%" + }, + "type": { + "type": "string", + "enum": [ + "jetbrains", + "custom" + ], + "description": "%config.editors.items.type.description%" + }, + "path": { + "type": "string", + "description": "%config.editors.items.path.description%" + }, + "urlScheme": { + "type": "string", + "description": "%config.editors.items.urlScheme.description%" + } + }, + "required": [ + "name", + "type", + "path" + ] + } + }, + "switch2idea.showTreeView": { + "type": "boolean", + "default": true, + "description": "%config.showTreeView.description%" + }, "switch2idea.ideaPath": { "type": "string", "default": "", - "description": "IDEA executable path" + "description": "%config.ideaPath.description%", + "deprecationMessage": "%config.ideaPath.deprecationMessage%" } } }, @@ -78,6 +160,45 @@ "command": "Switch2IDEA.openProjectInIDEA", "group": "navigation" } + ], + "view/title": [ + { + "command": "switch2idea.addEditor", + "when": "view == switch2idea.editors", + "group": "navigation@1" + }, + { + "command": "switch2idea.openJsonConfig", + "when": "view == switch2idea.editors", + "group": "navigation@2" + }, + { + "command": "switch2idea.refreshEditors", + "when": "view == switch2idea.editors", + "group": "navigation@3" + } + ], + "view/item/context": [ + { + "command": "switch2idea.jumpToEditor", + "when": "view == switch2idea.editors && viewItem == editorItem", + "group": "inline@1" + }, + { + "command": "switch2idea.editEditor", + "when": "view == switch2idea.editors && viewItem == editorItem", + "group": "1_edit@1" + }, + { + "command": "switch2idea.deleteEditor", + "when": "view == switch2idea.editors && viewItem == editorItem", + "group": "1_edit@2" + }, + { + "command": "switch2idea.jumpToEditor", + "when": "view == switch2idea.editors && viewItem == editorItem", + "group": "2_jump@1" + } ] } }, @@ -93,15 +214,18 @@ }, "packageManager": "pnpm@9.6.0", "devDependencies": { - "@types/vscode": "^1.93.1", "@types/mocha": "^10.0.10", "@types/node": "20.x", + "@types/vscode": "^1.93.1", "@typescript-eslint/eslint-plugin": "^8.17.0", "@typescript-eslint/parser": "^8.17.0", - "eslint": "^9.16.0", - "typescript": "^5.7.2", - "@vscode/test-cli": "^0.0.10", + "@vscode/test-cli": "^0.0.12", "@vscode/test-electron": "^2.4.1", - "@vscode/vsce": "^3.2.1" + "@vscode/vsce": "^3.7.1", + "eslint": "^9.18.0", + "typescript": "^5.7.2" + }, + "dependencies": { + "@vscode/l10n": "^0.0.18" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 904866d..b88335d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,10 @@ settings: importers: .: + dependencies: + '@vscode/l10n': + specifier: ^0.0.18 + version: 0.0.18 devDependencies: '@types/mocha': specifier: ^10.0.10 @@ -19,28 +23,34 @@ importers: version: 1.96.0 '@typescript-eslint/eslint-plugin': specifier: ^8.17.0 - version: 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2) + version: 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.39.2)(typescript@5.7.2))(eslint@9.39.2)(typescript@5.7.2) '@typescript-eslint/parser': specifier: ^8.17.0 - version: 8.19.0(eslint@9.17.0)(typescript@5.7.2) + version: 8.19.0(eslint@9.39.2)(typescript@5.7.2) '@vscode/test-cli': - specifier: ^0.0.10 - version: 0.0.10 + specifier: ^0.0.12 + version: 0.0.12 '@vscode/test-electron': specifier: ^2.4.1 version: 2.4.1 '@vscode/vsce': - specifier: ^3.2.1 - version: 3.2.1 + specifier: ^3.7.1 + version: 3.7.1 eslint: - specifier: ^9.16.0 - version: 9.17.0 + specifier: ^9.18.0 + version: 9.39.2 typescript: specifier: ^5.7.2 version: 5.7.2 packages: + '@azu/format-text@1.0.2': + resolution: {integrity: sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==} + + '@azu/style-format@1.0.1': + resolution: {integrity: sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==} + '@azure/abort-controller@2.1.2': resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} engines: {node: '>=18.0.0'} @@ -85,8 +95,17 @@ packages: resolution: {integrity: sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==} engines: {node: '>=16'} - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@babel/code-frame@7.28.6': + resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} @@ -94,32 +113,42 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.1': - resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.9.1': - resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.17.0': - resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.5': - resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.4': - resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -138,8 +167,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} '@isaacs/cliui@8.0.2': @@ -176,6 +205,70 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@secretlint/config-creator@10.2.2': + resolution: {integrity: sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==} + engines: {node: '>=20.0.0'} + + '@secretlint/config-loader@10.2.2': + resolution: {integrity: sha512-ndjjQNgLg4DIcMJp4iaRD6xb9ijWQZVbd9694Ol2IszBIbGPPkwZHzJYKICbTBmh6AH/pLr0CiCaWdGJU7RbpQ==} + engines: {node: '>=20.0.0'} + + '@secretlint/core@10.2.2': + resolution: {integrity: sha512-6rdwBwLP9+TO3rRjMVW1tX+lQeo5gBbxl1I5F8nh8bgGtKwdlCMhMKsBWzWg1ostxx/tIG7OjZI0/BxsP8bUgw==} + engines: {node: '>=20.0.0'} + + '@secretlint/formatter@10.2.2': + resolution: {integrity: sha512-10f/eKV+8YdGKNQmoDUD1QnYL7TzhI2kzyx95vsJKbEa8akzLAR5ZrWIZ3LbcMmBLzxlSQMMccRmi05yDQ5YDA==} + engines: {node: '>=20.0.0'} + + '@secretlint/node@10.2.2': + resolution: {integrity: sha512-eZGJQgcg/3WRBwX1bRnss7RmHHK/YlP/l7zOQsrjexYt6l+JJa5YhUmHbuGXS94yW0++3YkEJp0kQGYhiw1DMQ==} + engines: {node: '>=20.0.0'} + + '@secretlint/profiler@10.2.2': + resolution: {integrity: sha512-qm9rWfkh/o8OvzMIfY8a5bCmgIniSpltbVlUVl983zDG1bUuQNd1/5lUEeWx5o/WJ99bXxS7yNI4/KIXfHexig==} + + '@secretlint/resolver@10.2.2': + resolution: {integrity: sha512-3md0cp12e+Ae5V+crPQYGd6aaO7ahw95s28OlULGyclyyUtf861UoRGS2prnUrKh7MZb23kdDOyGCYb9br5e4w==} + + '@secretlint/secretlint-formatter-sarif@10.2.2': + resolution: {integrity: sha512-ojiF9TGRKJJw308DnYBucHxkpNovDNu1XvPh7IfUp0A12gzTtxuWDqdpuVezL7/IP8Ua7mp5/VkDMN9OLp1doQ==} + + '@secretlint/secretlint-rule-no-dotenv@10.2.2': + resolution: {integrity: sha512-KJRbIShA9DVc5Va3yArtJ6QDzGjg3PRa1uYp9As4RsyKtKSSZjI64jVca57FZ8gbuk4em0/0Jq+uy6485wxIdg==} + engines: {node: '>=20.0.0'} + + '@secretlint/secretlint-rule-preset-recommend@10.2.2': + resolution: {integrity: sha512-K3jPqjva8bQndDKJqctnGfwuAxU2n9XNCPtbXVI5JvC7FnQiNg/yWlQPbMUlBXtBoBGFYp08A94m6fvtc9v+zA==} + engines: {node: '>=20.0.0'} + + '@secretlint/source-creator@10.2.2': + resolution: {integrity: sha512-h6I87xJfwfUTgQ7irWq7UTdq/Bm1RuQ/fYhA3dtTIAop5BwSFmZyrchph4WcoEvbN460BWKmk4RYSvPElIIvxw==} + engines: {node: '>=20.0.0'} + + '@secretlint/types@10.2.2': + resolution: {integrity: sha512-Nqc90v4lWCXyakD6xNyNACBJNJ0tNCwj2WNk/7ivyacYHxiITVgmLUFXTBOeCdy79iz6HtN9Y31uw/jbLrdOAg==} + engines: {node: '>=20.0.0'} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@textlint/ast-node-types@15.5.1': + resolution: {integrity: sha512-2ABQSaQoM9u9fycXLJKcCv4XQulJWTUSwjo6F0i/ujjqOH8/AZ2A0RDKKbAddqxDhuabVB20lYoEsZZgzehccg==} + + '@textlint/linter-formatter@15.5.1': + resolution: {integrity: sha512-7wfzpcQtk7TZ3UJO2deTI71mJCm4VvPGUmSwE4iuH6FoaxpdWpwSBiMLcZtjYrt/oIFOtNz0uf5rI+xJiHTFww==} + + '@textlint/module-interop@15.5.1': + resolution: {integrity: sha512-Y1jcFGCKNSmHxwsLO3mshOfLYX4Wavq2+w5BG6x5lGgZv0XrF1xxURRhbnhns4LzCu0fAcx6W+3V8/1bkyTZCw==} + + '@textlint/resolver@15.5.1': + resolution: {integrity: sha512-CVHxMIm8iNGccqM12CQ/ycvh+HjJId4RyC6as5ynCcp2E1Uy1TCe0jBWOpmLsbT4Nx15Ke29BmspyByawuIRyA==} + + '@textlint/types@15.5.1': + resolution: {integrity: sha512-IY1OVZZk8LOOrbapYCsaeH7XSJT89HVukixDT8CoiWMrKGCTCZ3/Kzoa3DtMMbY8jtY777QmPOVCNnR+8fF6YQ==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -191,6 +284,12 @@ packages: '@types/node@20.17.11': resolution: {integrity: sha512-Ept5glCK35R8yeyIeYlRIZtX6SLRyqMhOFTgj5SOkMpLTdw3SEHI9fHx60xaUZ+V1aJxQJODE+7/j5ocZydYTg==} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/sarif@2.1.7': + resolution: {integrity: sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==} + '@types/vscode@1.96.0': resolution: {integrity: sha512-qvZbSZo+K4ZYmmDuaodMbAa67Pl6VDQzLKFka6rq+3WUTY4Kro7Bwoi0CuZLO/wema0ygcmpwow7zZfPJTs5jg==} @@ -241,8 +340,11 @@ packages: resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vscode/test-cli@0.0.10': - resolution: {integrity: sha512-B0mMH4ia+MOOtwNiLi79XhA+MLmUItIC8FckEuKrVAVriIuSWjt7vv4+bF8qVFiNFe4QRfzPaIZk39FZGWEwHA==} + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + + '@vscode/test-cli@0.0.12': + resolution: {integrity: sha512-iYN0fDg29+a2Xelle/Y56Xvv7Nc8Thzq4VwpzAF/SIE6918rDicqfsQxV6w1ttr2+SOm+10laGuY9FG2ptEKsQ==} engines: {node: '>=18'} hasBin: true @@ -298,8 +400,8 @@ packages: '@vscode/vsce-sign@2.0.5': resolution: {integrity: sha512-GfYWrsT/vypTMDMgWDm75iDmAOMe7F71sZECJ+Ws6/xyIfmB3ELVnVN+LwMFAvmXY+e6eWhR2EzNGF/zAhWY3Q==} - '@vscode/vsce@3.2.1': - resolution: {integrity: sha512-AY9vBjwExakK1c0cI/3NN2Ey0EgiKLBye/fxl/ue+o4q6RZ7N+xzd1jAD6eI6eBeMVANi617+V2rxIAkDPco2Q==} + '@vscode/vsce@3.7.1': + resolution: {integrity: sha512-OTm2XdMt2YkpSn2Nx7z2EJtSuhRHsTPYsSK59hr3v8jRArK+2UEoju4Jumn1CmpgoBLGI6ReHLJ/czYltNUW3g==} engines: {node: '>= 20'} hasBin: true @@ -308,8 +410,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -320,9 +422,12 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-escapes@7.2.0: + resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} + engines: {node: '>=18'} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -332,10 +437,6 @@ packages: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -351,6 +452,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -367,6 +472,10 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + binaryextensions@6.11.0: + resolution: {integrity: sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==} + engines: {node: '>=4'} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -376,6 +485,9 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boundary@2.0.0: + resolution: {integrity: sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -401,10 +513,15 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - c8@9.1.0: - resolution: {integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==} - engines: {node: '>=14.14.0'} + c8@10.1.3: + resolution: {integrity: sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==} + engines: {node: '>=18'} hasBin: true + peerDependencies: + monocart-coverage-reports: ^2 + peerDependenciesMeta: + monocart-coverage-reports: + optional: true call-bind-apply-helpers@1.0.1: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} @@ -422,10 +539,6 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -445,6 +558,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -456,9 +573,6 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -467,16 +581,10 @@ packages: resolution: {integrity: sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==} engines: {node: '>=16'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -484,9 +592,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -517,6 +625,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@4.0.0: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} @@ -544,8 +661,8 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} dom-serializer@2.0.0: @@ -571,6 +688,10 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + editions@6.22.0: + resolution: {integrity: sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==} + engines: {ecmascript: '>= es5', node: '>=4'} + emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -586,14 +707,18 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.18.0: - resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -610,16 +735,12 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: @@ -630,8 +751,12 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.17.0: - resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -640,8 +765,8 @@ packages: jiti: optional: true - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.6.0: @@ -681,6 +806,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fastq@1.18.0: resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} @@ -721,8 +849,9 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -764,19 +893,14 @@ packages: engines: {node: 20 || >=22} hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -787,10 +911,6 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -811,6 +931,10 @@ packages: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -836,6 +960,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -847,9 +975,9 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + index-to-position@1.2.0: + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + engines: {node: '>=18'} inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -886,6 +1014,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} @@ -920,6 +1052,10 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} + istextorbinary@9.5.0: + resolution: {integrity: sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==} + engines: {node: '>=4'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -927,8 +1063,11 @@ packages: resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} engines: {node: 20 || >=22} - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true json-buffer@3.0.1: @@ -937,12 +1076,23 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -1010,6 +1160,12 @@ packages: lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} @@ -1080,10 +1236,6 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -1098,9 +1250,9 @@ packages: mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mocha@10.8.2: - resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} - engines: {node: '>= 14.0.0'} + mocha@11.7.5: + resolution: {integrity: sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true ms@2.1.3: @@ -1122,6 +1274,14 @@ packages: node-addon-api@4.3.0: resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + node-sarif-builder@3.4.0: + resolution: {integrity: sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==} + engines: {node: '>=20'} + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -1160,6 +1320,10 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + engines: {node: '>=18'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -1170,6 +1334,10 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + parse-semver@1.1.1: resolution: {integrity: sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==} @@ -1186,10 +1354,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1202,13 +1366,27 @@ packages: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + pluralize@2.0.0: + resolution: {integrity: sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + prebuild-install@7.1.2: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} @@ -1242,10 +1420,17 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + rc-config-loader@4.1.3: + resolution: {integrity: sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true + read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + read@1.0.7: resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} engines: {node: '>=0.8'} @@ -1261,10 +1446,18 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1292,6 +1485,11 @@ packages: sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + secretlint@10.2.2: + resolution: {integrity: sha512-xVpkeHV/aoWe4vP4TansF622nBEImzCY73y/0042DuJ29iKIaqgoJ8fGxre3rVSHHbxar4FdJobmTnLp9AU0eg==} + engines: {node: '>=20.0.0'} + hasBin: true + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -1344,6 +1542,26 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + stdin-discarder@0.1.0: resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1386,9 +1604,12 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + structured-source@4.0.0: + resolution: {integrity: sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==} + + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -1398,9 +1619,13 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} + supports-hyperlinks@3.2.0: + resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} + engines: {node: '>=14.18'} + + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} @@ -1413,9 +1638,20 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + terminal-link@4.0.0: + resolution: {integrity: sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==} + engines: {node: '>=18'} + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + textextensions@6.11.0: + resolution: {integrity: sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==} + engines: {node: '>=4'} tmp@0.2.3: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} @@ -1445,6 +1681,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + typed-rest-client@1.8.11: resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} @@ -1466,6 +1706,18 @@ packages: resolution: {integrity: sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==} engines: {node: '>=18.17'} + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1483,9 +1735,17 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + version-range@4.15.0: + resolution: {integrity: sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==} + engines: {node: '>=4'} + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} @@ -1500,8 +1760,8 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerpool@6.5.1: - resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + workerpool@9.3.4: + resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -1529,10 +1789,6 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -1541,10 +1797,6 @@ packages: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -1561,6 +1813,12 @@ packages: snapshots: + '@azu/format-text@1.0.2': {} + + '@azu/style-format@1.0.1': + dependencies: + '@azu/format-text': 1.0.2 + '@azure/abort-controller@2.1.2': dependencies: tslib: 2.8.1 @@ -1640,47 +1898,65 @@ snapshots: jsonwebtoken: 9.0.2 uuid: 8.3.2 - '@bcoe/v8-coverage@0.2.3': {} + '@babel/code-frame@7.28.6': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.28.5': {} + + '@bcoe/v8-coverage@1.0.2': {} + + '@eslint-community/eslint-utils@4.4.1(eslint@9.39.2)': + dependencies: + eslint: 9.39.2 + eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2)': dependencies: - eslint: 9.17.0 + eslint: 9.39.2 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.1': + '@eslint/config-array@0.21.1': dependencies: - '@eslint/object-schema': 2.1.5 + '@eslint/object-schema': 2.1.7 debug: 4.4.0(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.9.1': + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.3': dependencies: ajv: 6.12.6 debug: 4.4.0(supports-color@8.1.1) - espree: 10.3.0 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.17.0': {} + '@eslint/js@9.39.2': {} - '@eslint/object-schema@2.1.5': {} + '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.2.4': + '@eslint/plugin-kit@0.4.1': dependencies: + '@eslint/core': 0.17.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -1694,7 +1970,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.3': {} '@isaacs/cliui@8.0.2': dependencies: @@ -1731,6 +2007,111 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@secretlint/config-creator@10.2.2': + dependencies: + '@secretlint/types': 10.2.2 + + '@secretlint/config-loader@10.2.2': + dependencies: + '@secretlint/profiler': 10.2.2 + '@secretlint/resolver': 10.2.2 + '@secretlint/types': 10.2.2 + ajv: 8.17.1 + debug: 4.4.3 + rc-config-loader: 4.1.3 + transitivePeerDependencies: + - supports-color + + '@secretlint/core@10.2.2': + dependencies: + '@secretlint/profiler': 10.2.2 + '@secretlint/types': 10.2.2 + debug: 4.4.3 + structured-source: 4.0.0 + transitivePeerDependencies: + - supports-color + + '@secretlint/formatter@10.2.2': + dependencies: + '@secretlint/resolver': 10.2.2 + '@secretlint/types': 10.2.2 + '@textlint/linter-formatter': 15.5.1 + '@textlint/module-interop': 15.5.1 + '@textlint/types': 15.5.1 + chalk: 5.4.1 + debug: 4.4.3 + pluralize: 8.0.0 + strip-ansi: 7.1.0 + table: 6.9.0 + terminal-link: 4.0.0 + transitivePeerDependencies: + - supports-color + + '@secretlint/node@10.2.2': + dependencies: + '@secretlint/config-loader': 10.2.2 + '@secretlint/core': 10.2.2 + '@secretlint/formatter': 10.2.2 + '@secretlint/profiler': 10.2.2 + '@secretlint/source-creator': 10.2.2 + '@secretlint/types': 10.2.2 + debug: 4.4.3 + p-map: 7.0.4 + transitivePeerDependencies: + - supports-color + + '@secretlint/profiler@10.2.2': {} + + '@secretlint/resolver@10.2.2': {} + + '@secretlint/secretlint-formatter-sarif@10.2.2': + dependencies: + node-sarif-builder: 3.4.0 + + '@secretlint/secretlint-rule-no-dotenv@10.2.2': + dependencies: + '@secretlint/types': 10.2.2 + + '@secretlint/secretlint-rule-preset-recommend@10.2.2': {} + + '@secretlint/source-creator@10.2.2': + dependencies: + '@secretlint/types': 10.2.2 + istextorbinary: 9.5.0 + + '@secretlint/types@10.2.2': {} + + '@sindresorhus/merge-streams@2.3.0': {} + + '@textlint/ast-node-types@15.5.1': {} + + '@textlint/linter-formatter@15.5.1': + dependencies: + '@azu/format-text': 1.0.2 + '@azu/style-format': 1.0.1 + '@textlint/module-interop': 15.5.1 + '@textlint/resolver': 15.5.1 + '@textlint/types': 15.5.1 + chalk: 4.1.2 + debug: 4.4.3 + js-yaml: 4.1.1 + lodash: 4.17.23 + pluralize: 2.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + table: 6.9.0 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + '@textlint/module-interop@15.5.1': {} + + '@textlint/resolver@15.5.1': {} + + '@textlint/types@15.5.1': + dependencies: + '@textlint/ast-node-types': 15.5.1 + '@types/estree@1.0.6': {} '@types/istanbul-lib-coverage@2.0.6': {} @@ -1743,17 +2124,21 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/normalize-package-data@2.4.4': {} + + '@types/sarif@2.1.7': {} + '@types/vscode@1.96.0': {} - '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.39.2)(typescript@5.7.2))(eslint@9.39.2)(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.19.0(eslint@9.39.2)(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.19.0 - '@typescript-eslint/type-utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/type-utils': 8.19.0(eslint@9.39.2)(typescript@5.7.2) + '@typescript-eslint/utils': 8.19.0(eslint@9.39.2)(typescript@5.7.2) '@typescript-eslint/visitor-keys': 8.19.0 - eslint: 9.17.0 + eslint: 9.39.2 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -1762,14 +2147,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/parser@8.19.0(eslint@9.39.2)(typescript@5.7.2)': dependencies: '@typescript-eslint/scope-manager': 8.19.0 '@typescript-eslint/types': 8.19.0 '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) '@typescript-eslint/visitor-keys': 8.19.0 debug: 4.4.0(supports-color@8.1.1) - eslint: 9.17.0 + eslint: 9.39.2 typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -1779,12 +2164,12 @@ snapshots: '@typescript-eslint/types': 8.19.0 '@typescript-eslint/visitor-keys': 8.19.0 - '@typescript-eslint/type-utils@8.19.0(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.19.0(eslint@9.39.2)(typescript@5.7.2)': dependencies: '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.19.0(eslint@9.39.2)(typescript@5.7.2) debug: 4.4.0(supports-color@8.1.1) - eslint: 9.17.0 + eslint: 9.39.2 ts-api-utils: 1.4.3(typescript@5.7.2) typescript: 5.7.2 transitivePeerDependencies: @@ -1806,13 +2191,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.19.0(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/utils@8.19.0(eslint@9.39.2)(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.39.2) '@typescript-eslint/scope-manager': 8.19.0 '@typescript-eslint/types': 8.19.0 '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) - eslint: 9.17.0 + eslint: 9.39.2 typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -1822,17 +2207,21 @@ snapshots: '@typescript-eslint/types': 8.19.0 eslint-visitor-keys: 4.2.0 - '@vscode/test-cli@0.0.10': + '@vscode/l10n@0.0.18': {} + + '@vscode/test-cli@0.0.12': dependencies: '@types/mocha': 10.0.10 - c8: 9.1.0 + c8: 10.1.3 chokidar: 3.6.0 - enhanced-resolve: 5.18.0 + enhanced-resolve: 5.18.4 glob: 10.4.5 minimatch: 9.0.5 - mocha: 10.8.2 - supports-color: 9.4.0 + mocha: 11.7.5 + supports-color: 10.2.2 yargs: 17.7.2 + transitivePeerDependencies: + - monocart-coverage-reports '@vscode/test-electron@2.4.1': dependencies: @@ -1883,15 +2272,19 @@ snapshots: '@vscode/vsce-sign-win32-arm64': 2.0.2 '@vscode/vsce-sign-win32-x64': 2.0.2 - '@vscode/vsce@3.2.1': + '@vscode/vsce@3.7.1': dependencies: '@azure/identity': 4.5.0 + '@secretlint/node': 10.2.2 + '@secretlint/secretlint-formatter-sarif': 10.2.2 + '@secretlint/secretlint-rule-no-dotenv': 10.2.2 + '@secretlint/secretlint-rule-preset-recommend': 10.2.2 '@vscode/vsce-sign': 2.0.5 azure-devops-node-api: 12.5.0 - chalk: 2.4.2 + chalk: 4.1.2 cheerio: 1.0.0 cockatiel: 3.2.1 - commander: 6.2.1 + commander: 12.1.0 form-data: 4.0.1 glob: 11.0.0 hosted-git-info: 4.1.0 @@ -1902,6 +2295,7 @@ snapshots: minimatch: 3.1.2 parse-semver: 1.1.1 read: 1.0.7 + secretlint: 10.2.2 semver: 7.6.3 tmp: 0.2.3 typed-rest-client: 1.8.11 @@ -1914,11 +2308,11 @@ snapshots: transitivePeerDependencies: - supports-color - acorn-jsx@5.3.2(acorn@8.14.0): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.0 + acorn: 8.15.0 - acorn@8.14.0: {} + acorn@8.15.0: {} agent-base@7.1.3: {} @@ -1929,16 +2323,21 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-colors@4.1.3: {} + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-escapes@7.2.0: + dependencies: + environment: 1.1.0 ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -1952,6 +2351,8 @@ snapshots: argparse@2.0.1: {} + astral-regex@2.0.0: {} + asynckit@0.4.0: {} azure-devops-node-api@12.5.0: @@ -1965,6 +2366,10 @@ snapshots: binary-extensions@2.3.0: {} + binaryextensions@6.11.0: + dependencies: + editions: 6.22.0 + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -1980,6 +2385,8 @@ snapshots: boolbase@1.0.0: {} + boundary@2.0.0: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -2010,16 +2417,16 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - c8@9.1.0: + c8@10.1.3: dependencies: - '@bcoe/v8-coverage': 0.2.3 + '@bcoe/v8-coverage': 1.0.2 '@istanbuljs/schema': 0.1.3 find-up: 5.0.0 foreground-child: 3.3.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.1.7 - test-exclude: 6.0.0 + test-exclude: 7.0.1 v8-to-istanbul: 9.3.0 yargs: 17.7.2 yargs-parser: 21.1.1 @@ -2038,12 +2445,6 @@ snapshots: camelcase@6.3.0: {} - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -2086,6 +2487,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + chownr@1.1.4: optional: true @@ -2095,12 +2500,6 @@ snapshots: cli-spinners@2.9.2: {} - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -2109,23 +2508,17 @@ snapshots: cockatiel@3.2.1: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - commander@6.2.1: {} + commander@12.1.0: {} concat-map@0.0.1: {} @@ -2155,6 +2548,10 @@ snapshots: optionalDependencies: supports-color: 8.1.1 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decamelize@4.0.0: {} decompress-response@6.0.0: @@ -2174,7 +2571,7 @@ snapshots: detect-libc@2.0.3: optional: true - diff@5.2.0: {} + diff@7.0.0: {} dom-serializer@2.0.0: dependencies: @@ -2206,6 +2603,10 @@ snapshots: dependencies: safe-buffer: 5.2.1 + editions@6.22.0: + dependencies: + version-range: 4.15.0 + emoji-regex@10.4.0: {} emoji-regex@8.0.0: {} @@ -2222,13 +2623,15 @@ snapshots: once: 1.4.0 optional: true - enhanced-resolve@5.18.0: + enhanced-resolve@5.18.4: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 entities@4.5.0: {} + environment@1.1.0: {} + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -2239,11 +2642,9 @@ snapshots: escalade@3.2.0: {} - escape-string-regexp@1.0.5: {} - escape-string-regexp@4.0.0: {} - eslint-scope@8.2.0: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -2252,28 +2653,30 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.17.0: + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.2: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.1 - '@eslint/core': 0.9.1 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.17.0 - '@eslint/plugin-kit': 0.2.4 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 + '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.6 - '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.0(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -2291,11 +2694,11 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.3.0: + espree@10.4.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 4.2.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esquery@1.6.0: dependencies: @@ -2328,6 +2731,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-uri@3.1.0: {} + fastq@1.18.0: dependencies: reusify: 1.0.4 @@ -2372,7 +2777,11 @@ snapshots: fs-constants@1.0.0: optional: true - fs.realpath@1.0.0: {} + fs-extra@11.3.3: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 fsevents@2.3.3: optional: true @@ -2428,24 +2837,16 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.0 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + globals@14.0.0: {} - glob@8.1.0: + globby@14.1.0: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - globals@14.0.0: {} + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 gopd@1.2.0: {} @@ -2453,8 +2854,6 @@ snapshots: graphemer@1.4.0: {} - has-flag@3.0.0: {} - has-flag@4.0.0: {} has-symbols@1.1.0: {} @@ -2469,6 +2868,10 @@ snapshots: dependencies: lru-cache: 6.0.0 + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + html-escaper@2.0.2: {} htmlparser2@9.1.0: @@ -2500,6 +2903,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + immediate@3.0.6: {} import-fresh@3.3.0: @@ -2509,10 +2914,7 @@ snapshots: imurmurhash@0.1.4: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 + index-to-position@1.2.0: {} inherits@2.0.4: {} @@ -2537,6 +2939,8 @@ snapshots: is-number@7.0.0: {} + is-path-inside@3.0.3: {} + is-plain-obj@2.1.0: {} is-unicode-supported@0.1.0: {} @@ -2564,6 +2968,12 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + istextorbinary@9.5.0: + dependencies: + binaryextensions: 6.11.0 + editions: 6.22.0 + textextensions: 6.11.0 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -2574,7 +2984,9 @@ snapshots: dependencies: '@isaacs/cliui': 8.0.2 - js-yaml@4.1.0: + js-tokens@4.0.0: {} + + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -2582,10 +2994,20 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} + jsonc-parser@3.3.1: {} + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 @@ -2673,6 +3095,10 @@ snapshots: lodash.once@4.1.1: {} + lodash.truncate@4.4.2: {} + + lodash@4.17.23: {} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 @@ -2736,10 +3162,6 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -2752,27 +3174,28 @@ snapshots: mkdirp-classic@0.5.3: optional: true - mocha@10.8.2: + mocha@11.7.5: dependencies: - ansi-colors: 4.1.3 browser-stdout: 1.3.1 - chokidar: 3.6.0 + chokidar: 4.0.3 debug: 4.4.0(supports-color@8.1.1) - diff: 5.2.0 + diff: 7.0.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 - glob: 8.1.0 + glob: 10.4.5 he: 1.2.0 - js-yaml: 4.1.0 + is-path-inside: 3.0.3 + js-yaml: 4.1.1 log-symbols: 4.1.0 - minimatch: 5.1.6 + minimatch: 9.0.5 ms: 2.1.3 + picocolors: 1.1.1 serialize-javascript: 6.0.2 strip-json-comments: 3.1.1 supports-color: 8.1.1 - workerpool: 6.5.1 - yargs: 16.2.0 - yargs-parser: 20.2.9 + workerpool: 9.3.4 + yargs: 17.7.2 + yargs-parser: 21.1.1 yargs-unparser: 2.0.0 ms@2.1.3: {} @@ -2792,6 +3215,17 @@ snapshots: node-addon-api@4.3.0: optional: true + node-sarif-builder@3.4.0: + dependencies: + '@types/sarif': 2.1.7 + fs-extra: 11.3.3 + + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.6.3 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} nth-check@2.1.1: @@ -2803,6 +3237,7 @@ snapshots: once@1.4.0: dependencies: wrappy: 1.0.2 + optional: true onetime@5.1.2: dependencies: @@ -2843,6 +3278,8 @@ snapshots: dependencies: p-limit: 3.1.0 + p-map@7.0.4: {} + package-json-from-dist@1.0.1: {} pako@1.0.11: {} @@ -2851,6 +3288,12 @@ snapshots: dependencies: callsites: 3.1.0 + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.28.6 + index-to-position: 1.2.0 + type-fest: 4.41.0 + parse-semver@1.1.1: dependencies: semver: 5.7.2 @@ -2870,8 +3313,6 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-scurry@1.11.1: @@ -2884,10 +3325,18 @@ snapshots: lru-cache: 11.0.2 minipass: 7.1.2 + path-type@6.0.0: {} + pend@1.2.0: {} + picocolors@1.1.1: {} + picomatch@2.3.1: {} + pluralize@2.0.0: {} + + pluralize@8.0.0: {} + prebuild-install@7.1.2: dependencies: detect-libc: 2.0.3 @@ -2928,6 +3377,15 @@ snapshots: dependencies: safe-buffer: 5.2.1 + rc-config-loader@4.1.3: + dependencies: + debug: 4.4.3 + js-yaml: 4.1.1 + json5: 2.2.3 + require-from-string: 2.0.2 + transitivePeerDependencies: + - supports-color + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -2936,6 +3394,14 @@ snapshots: strip-json-comments: 2.0.1 optional: true + read-pkg@9.0.1: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 8.3.0 + type-fest: 4.41.0 + unicorn-magic: 0.1.0 + read@1.0.7: dependencies: mute-stream: 0.0.8 @@ -2960,8 +3426,12 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: {} + require-directory@2.1.1: {} + require-from-string@2.0.2: {} + resolve-from@4.0.0: {} restore-cursor@4.0.0: @@ -2983,6 +3453,18 @@ snapshots: sax@1.4.1: {} + secretlint@10.2.2: + dependencies: + '@secretlint/config-creator': 10.2.2 + '@secretlint/formatter': 10.2.2 + '@secretlint/node': 10.2.2 + '@secretlint/profiler': 10.2.2 + debug: 4.4.3 + globby: 14.1.0 + read-pkg: 9.0.1 + transitivePeerDependencies: + - supports-color + semver@5.7.2: {} semver@7.6.3: {} @@ -3041,6 +3523,28 @@ snapshots: simple-concat: 1.0.1 optional: true + slash@5.1.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.22 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + spdx-license-ids@3.0.22: {} + stdin-discarder@0.1.0: dependencies: bl: 5.1.0 @@ -3086,9 +3590,11 @@ snapshots: strip-json-comments@3.1.1: {} - supports-color@5.5.0: + structured-source@4.0.0: dependencies: - has-flag: 3.0.0 + boundary: 2.0.0 + + supports-color@10.2.2: {} supports-color@7.2.0: dependencies: @@ -3098,7 +3604,18 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@9.4.0: {} + supports-hyperlinks@3.2.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + table@6.9.0: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 tapable@2.2.1: {} @@ -3119,11 +3636,22 @@ snapshots: readable-stream: 3.6.2 optional: true - test-exclude@6.0.0: + terminal-link@4.0.0: + dependencies: + ansi-escapes: 7.2.0 + supports-hyperlinks: 3.2.0 + + test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 + glob: 10.4.5 + minimatch: 9.0.5 + + text-table@0.2.0: {} + + textextensions@6.11.0: + dependencies: + editions: 6.22.0 tmp@0.2.3: {} @@ -3148,6 +3676,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@4.41.0: {} + typed-rest-client@1.8.11: dependencies: qs: 6.13.1 @@ -3164,6 +3694,12 @@ snapshots: undici@6.21.0: {} + unicorn-magic@0.1.0: {} + + unicorn-magic@0.3.0: {} + + universalify@2.0.1: {} + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -3180,6 +3716,13 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + version-range@4.15.0: {} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 @@ -3192,7 +3735,7 @@ snapshots: word-wrap@1.2.5: {} - workerpool@6.5.1: {} + workerpool@9.3.4: {} wrap-ansi@7.0.0: dependencies: @@ -3206,7 +3749,8 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - wrappy@1.0.2: {} + wrappy@1.0.2: + optional: true xml2js@0.5.0: dependencies: @@ -3219,8 +3763,6 @@ snapshots: yallist@4.0.0: {} - yargs-parser@20.2.9: {} - yargs-parser@21.1.1: {} yargs-unparser@2.0.0: @@ -3230,16 +3772,6 @@ snapshots: flat: 5.0.2 is-plain-obj: 2.1.0 - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - yargs@17.7.2: dependencies: cliui: 8.0.1 diff --git a/src/configManager.ts b/src/configManager.ts new file mode 100644 index 0000000..bd43c60 --- /dev/null +++ b/src/configManager.ts @@ -0,0 +1,62 @@ +import * as vscode from 'vscode'; +import { EditorConfig } from './types'; + +/** + * 配置管理器 + * 负责读取和管理编辑器配置,支持向后兼容旧版配置 + */ +export class ConfigManager { + private static readonly CONFIG_KEY = 'switch2idea'; + private static readonly EDITORS_KEY = 'editors'; + private static readonly LEGACY_PATH_KEY = 'ideaPath'; + + /** + * 获取所有已配置的编辑器列表 + * 支持向后兼容旧版 ideaPath 配置 + * + * 优先级: + * 1. 新版 editors 配置(如果存在且非空) + * 2. 旧版 ideaPath 配置(向后兼容) + * 3. 默认配置(IntelliJ IDEA) + * + * @returns 编辑器配置数组 + */ + getEditors(): EditorConfig[] { + const config = vscode.workspace.getConfiguration(ConfigManager.CONFIG_KEY); + const editors = config.get(ConfigManager.EDITORS_KEY); + + // 优先使用新版 editors 配置 (需求 5.2) + if (editors && editors.length > 0) { + return editors; + } + + // 向后兼容:检查旧版配置 (需求 5.1) + const legacyPath = config.get(ConfigManager.LEGACY_PATH_KEY); + if (legacyPath) { + return [{ + name: 'IntelliJ IDEA', + type: 'jetbrains', + path: legacyPath, + urlScheme: 'idea' + }]; + } + + // 返回默认配置 (需求 1.4) + return this.getDefaultEditors(); + } + + /** + * 获取默认编辑器配置 + * 当用户未配置任何编辑器时,提供 IntelliJ IDEA 作为默认配置 + * + * @returns 默认编辑器配置数组 + */ + private getDefaultEditors(): EditorConfig[] { + return [{ + name: 'IntelliJ IDEA', + type: 'jetbrains', + path: '', // 空路径表示使用自动检测 + urlScheme: 'idea' + }]; + } +} diff --git a/src/editorSelector.ts b/src/editorSelector.ts new file mode 100644 index 0000000..353774b --- /dev/null +++ b/src/editorSelector.ts @@ -0,0 +1,32 @@ +import * as vscode from 'vscode'; +import * as l10n from '@vscode/l10n'; +import { EditorConfig } from './types'; + +/** + * 编辑器选择器 + * 负责显示 QuickPick 让用户选择目标编辑器 + */ +export class EditorSelector { + async selectEditor(editors: EditorConfig[]): Promise { + if (editors.length === 1) { + return editors[0]; + } + + const items: vscode.QuickPickItem[] = editors.map(editor => ({ + label: editor.name, + description: `(${editor.type})`, + detail: editor.path || l10n.t('Use default path') + })); + + const selected = await vscode.window.showQuickPick(items, { + placeHolder: l10n.t('Select editor to jump to'), + title: l10n.t('Jump to...') + }); + + if (!selected) { + return undefined; + } + + return editors.find(e => e.name === selected.label); + } +} diff --git a/src/editorTreeView.ts b/src/editorTreeView.ts new file mode 100644 index 0000000..8e566b4 --- /dev/null +++ b/src/editorTreeView.ts @@ -0,0 +1,289 @@ +import * as vscode from 'vscode'; +import * as l10n from '@vscode/l10n'; +import { EditorConfig, EditorType } from './types'; +import { ConfigManager } from './configManager'; + +/** + * JetBrains IDE 预设模板 + */ +export const JETBRAINS_PRESETS: Omit[] = [ + { name: 'IntelliJ IDEA', type: 'jetbrains', urlScheme: 'idea' }, + { name: 'WebStorm', type: 'jetbrains', urlScheme: 'webstorm' }, + { name: 'PyCharm', type: 'jetbrains', urlScheme: 'pycharm' }, + { name: 'RustRover', type: 'jetbrains', urlScheme: 'rustrover' }, + { name: 'GoLand', type: 'jetbrains', urlScheme: 'goland' }, + { name: 'CLion', type: 'jetbrains', urlScheme: 'clion' }, + { name: 'PhpStorm', type: 'jetbrains', urlScheme: 'phpstorm' }, + { name: 'Rider', type: 'jetbrains', urlScheme: 'rider' }, + { name: 'DataGrip', type: 'jetbrains', urlScheme: 'datagrip' }, + { name: 'Android Studio', type: 'jetbrains', urlScheme: 'studio' }, +]; + +/** + * 编辑器 TreeItem + */ +export class EditorTreeItem extends vscode.TreeItem { + constructor( + public readonly editor: EditorConfig, + public readonly index: number + ) { + super(editor.name, vscode.TreeItemCollapsibleState.None); + + this.description = `(${editor.type})`; + this.tooltip = new vscode.MarkdownString( + `**${editor.name}**\n\n` + + `- ${l10n.t('Type: {0}', editor.type)}\n` + + `- ${l10n.t('Path: {0}', editor.path || l10n.t('Auto detect'))}\n` + + `- ${l10n.t('URL Scheme: {0}', editor.urlScheme || l10n.t('None'))}` + ); + this.contextValue = 'editorItem'; + this.iconPath = new vscode.ThemeIcon( + editor.type === 'jetbrains' ? 'symbol-class' : 'symbol-misc' + ); + } +} + + +/** + * 添加编辑器占位项 + */ +export class AddEditorTreeItem extends vscode.TreeItem { + constructor() { + super(l10n.t('Add editor...'), vscode.TreeItemCollapsibleState.None); + this.iconPath = new vscode.ThemeIcon('add'); + this.command = { + command: 'switch2idea.addEditor', + title: l10n.t('Add Editor') + }; + this.contextValue = 'addEditor'; + } +} + +/** + * 编辑器 TreeView 数据提供器 + */ +export class EditorTreeDataProvider implements vscode.TreeDataProvider { + private _onDidChangeTreeData = new vscode.EventEmitter(); + readonly onDidChangeTreeData = this._onDidChangeTreeData.event; + + constructor(private configManager: ConfigManager) {} + + refresh(): void { + this._onDidChangeTreeData.fire(undefined); + } + + getTreeItem(element: vscode.TreeItem): vscode.TreeItem { + return element; + } + + getChildren(): vscode.TreeItem[] { + const editors = this.configManager.getEditors(); + const items: vscode.TreeItem[] = editors.map( + (editor, index) => new EditorTreeItem(editor, index) + ); + items.push(new AddEditorTreeItem()); + return items; + } +} + +/** + * 编辑器配置管理命令 + */ +export class EditorConfigCommands { + constructor( + private configManager: ConfigManager, + private treeDataProvider: EditorTreeDataProvider + ) {} + + async addEditor(): Promise { + const typeItems: vscode.QuickPickItem[] = [ + { + label: `$(symbol-class) ${l10n.t('JetBrains IDE')}`, + description: l10n.t('Select from preset list'), + detail: l10n.t('WebStorm, PyCharm, IDEA, RustRover, etc.') + }, + { + label: `$(symbol-misc) ${l10n.t('Custom Editor')}`, + description: l10n.t('Manual configuration'), + }, + ]; + + const typeChoice = await vscode.window.showQuickPick(typeItems, { + placeHolder: l10n.t('Select editor type'), + title: l10n.t('Add Editor ({0}/{1})', '1', '3') + }); + + if (!typeChoice) { return; } + + let editorConfig: EditorConfig; + + if (typeChoice.label.includes('JetBrains')) { + const presetItems = JETBRAINS_PRESETS.map(preset => ({ + label: preset.name, + description: preset.urlScheme, + preset + })); + + const presetChoice = await vscode.window.showQuickPick(presetItems, { + placeHolder: l10n.t('Select JetBrains IDE'), + title: l10n.t('Add Editor ({0}/{1})', '2', '3') + }); + + if (!presetChoice) { return; } + + const path = await this.selectEditorPath(presetChoice.preset.name); + if (!path) { return; } + + editorConfig = { ...presetChoice.preset, path }; + } else { + const name = await vscode.window.showInputBox({ + prompt: l10n.t('Enter editor name'), + placeHolder: l10n.t('e.g. Sublime Text'), + title: l10n.t('Add Editor ({0}/{1})', '2', '4') + }); + + if (!name) { return; } + + const path = await this.selectEditorPath(name); + if (!path) { return; } + + const urlScheme = await vscode.window.showInputBox({ + prompt: l10n.t('macOS URL Scheme (optional, leave empty to skip)'), + placeHolder: l10n.t('e.g. subl'), + title: l10n.t('Add Editor ({0}/{1})', '4', '4') + }); + + editorConfig = { + name, + type: 'custom' as EditorType, + path, + urlScheme: urlScheme || undefined + }; + } + + await this.saveEditor(editorConfig); + vscode.window.showInformationMessage(l10n.t('Editor added: {0}', editorConfig.name)); + } + + private async selectEditorPath(editorName: string): Promise { + const options: vscode.QuickPickItem[] = [ + { label: `$(folder-opened) ${l10n.t('Browse...')}`, description: l10n.t('Open file picker') }, + { label: `$(edit) ${l10n.t('Enter path manually')}`, description: l10n.t('Type path directly') }, + ]; + + const choice = await vscode.window.showQuickPick(options, { + placeHolder: l10n.t('Select {0} path', editorName), + title: l10n.t('Add Editor ({0}/{1})', '3', '3') + }); + + if (!choice) { return undefined; } + + if (choice.label.includes('$(folder-opened)')) { + const uris = await vscode.window.showOpenDialog({ + canSelectFiles: true, + canSelectFolders: true, + canSelectMany: false, + title: l10n.t('Select {0} path to open', editorName), + openLabel: l10n.t('Select') + }); + return uris?.[0]?.fsPath; + } else { + return vscode.window.showInputBox({ + prompt: l10n.t('Enter editor path'), + placeHolder: l10n.t('/Applications/WebStorm.app or C:\\Program Files\\...'), + title: l10n.t('Add Editor') + }); + } + } + + async editEditor(item: EditorTreeItem): Promise { + const editor = item.editor; + + const fieldItems: vscode.QuickPickItem[] = [ + { label: l10n.t('Name'), description: editor.name }, + { label: l10n.t('Path'), description: editor.path || l10n.t('Auto detect') }, + { label: l10n.t('URL Scheme'), description: editor.urlScheme || l10n.t('None') }, + ]; + + const fieldChoice = await vscode.window.showQuickPick(fieldItems, { + placeHolder: l10n.t('Select field to edit'), + title: l10n.t('Edit {0}', editor.name) + }); + + if (!fieldChoice) { return; } + + let newValue: string | undefined; + + switch (fieldChoice.label) { + case l10n.t('Name'): + newValue = await vscode.window.showInputBox({ + prompt: l10n.t('Enter new name'), + value: editor.name + }); + if (newValue) { editor.name = newValue; } + break; + + case l10n.t('Path'): + newValue = await this.selectEditorPath(editor.name); + if (newValue) { editor.path = newValue; } + break; + + case l10n.t('URL Scheme'): + newValue = await vscode.window.showInputBox({ + prompt: l10n.t('Enter URL Scheme (leave empty to clear)'), + value: editor.urlScheme || '' + }); + editor.urlScheme = newValue || undefined; + break; + } + + if (newValue !== undefined) { + await this.updateEditor(item.index, editor); + vscode.window.showInformationMessage(l10n.t('Editor updated: {0}', editor.name)); + } + } + + async deleteEditor(item: EditorTreeItem): Promise { + const confirm = await vscode.window.showWarningMessage( + l10n.t('Are you sure you want to delete "{0}"?', item.editor.name), + { modal: true }, + l10n.t('Delete') + ); + + if (confirm === l10n.t('Delete')) { + await this.removeEditor(item.index); + vscode.window.showInformationMessage(l10n.t('Editor deleted: {0}', item.editor.name)); + } + } + + async openJsonConfig(): Promise { + await vscode.commands.executeCommand( + 'workbench.action.openSettings', + 'switch2idea.editors' + ); + } + + private async saveEditor(editor: EditorConfig): Promise { + const config = vscode.workspace.getConfiguration('switch2idea'); + const editors = config.get('editors') || []; + editors.push(editor); + await config.update('editors', editors, vscode.ConfigurationTarget.Global); + this.treeDataProvider.refresh(); + } + + private async updateEditor(index: number, editor: EditorConfig): Promise { + const config = vscode.workspace.getConfiguration('switch2idea'); + const editors = config.get('editors') || []; + editors[index] = editor; + await config.update('editors', editors, vscode.ConfigurationTarget.Global); + this.treeDataProvider.refresh(); + } + + private async removeEditor(index: number): Promise { + const config = vscode.workspace.getConfiguration('switch2idea'); + const editors = config.get('editors') || []; + editors.splice(index, 1); + await config.update('editors', editors, vscode.ConfigurationTarget.Global); + this.treeDataProvider.refresh(); + } +} diff --git a/src/extension.ts b/src/extension.ts index 99734a2..13797c2 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,165 +1,218 @@ import * as vscode from 'vscode'; -import { exec } from 'child_process'; -import * as os from 'os'; -import * as fs from 'fs'; - -function getMacIdeaPath(): string { - const commonPaths = [ - '/Applications/IDEA.app', - '/Applications/IntelliJ IDEA.app', - '/Applications/IntelliJ IDEA CE.app', - '/Applications/IntelliJ IDEA Ultimate.app', - '/Applications/IntelliJ IDEA Community Edition.app', - `${os.homedir()}/Applications/IDEA.app`, - `${os.homedir()}/Applications/IntelliJ IDEA.app`, - `${os.homedir()}/Applications/IntelliJ IDEA CE.app`, - `${os.homedir()}/Applications/IntelliJ IDEA Ultimate.app`, - `${os.homedir()}/Applications/IntelliJ IDEA Community Edition.app`, - ]; - - // Iterate through all possible IDEA installation paths and return the first existing path - for (const path of commonPaths) { - if (fs.existsSync(path)) { - return path; - } - } - // If no paths exist, return the default APP name - return 'IntelliJ IDEA'; -} +import * as l10n from '@vscode/l10n'; +import { ConfigManager } from './configManager'; +import { JumpHandlerFactory } from './jumpHandlerFactory'; +import { EditorSelector } from './editorSelector'; +import { JumpContext, EditorConfig } from './types'; +import { + EditorTreeDataProvider, + EditorConfigCommands, + EditorTreeItem +} from './editorTreeView'; + +/** + * 错误消息定义 + */ +const errorMessages = { + noActiveEditor: () => l10n.t('No active file! Please open a file first.'), + noWorkspace: () => l10n.t('No workspace open! Please open a project folder first.'), +}; + +// 全局组件实例 +let configManager: ConfigManager; +let jumpHandlerFactory: JumpHandlerFactory; +let editorSelector: EditorSelector; +let treeDataProvider: EditorTreeDataProvider; +let editorConfigCommands: EditorConfigCommands; -function executeCommand(command: string): Promise { - return new Promise((resolve, reject) => { - const childProcess = exec(command, (error, stdout, stderr) => { - if (error) { - console.error('Error executing command:', error); - console.error('Stderr:', stderr); - reject(error); - return; - } - if (stdout) { - console.log('Command output:', stdout); - } - if (stderr) { - console.log('Command stderr:', stderr); - } - resolve(); - }); - - // Add error handling - childProcess.on('error', (error: NodeJS.ErrnoException) => { - if (error.code === 'EPIPE') { - console.log('Pipe communication disconnected, but this may not affect IDEA startup'); - resolve(); // Continue execution as IDEA may have started normally - } else { - reject(error); - } - }); - }); +export function activate(context: vscode.ExtensionContext) { + console.log('Switch2IDEA is now active!'); + + // 实例化所有组件 + configManager = new ConfigManager(); + jumpHandlerFactory = new JumpHandlerFactory(); + editorSelector = new EditorSelector(); + + // 初始化 TreeView + treeDataProvider = new EditorTreeDataProvider(configManager); + editorConfigCommands = new EditorConfigCommands(configManager, treeDataProvider); + + // 设置 TreeView 可见性 context key + const updateTreeViewVisibility = () => { + const showTreeView = vscode.workspace + .getConfiguration('switch2idea') + .get('showTreeView', true); + vscode.commands.executeCommand('setContext', 'switch2idea.showTreeView', showTreeView); + }; + updateTreeViewVisibility(); + + // 注册 TreeView + const treeView = vscode.window.createTreeView('switch2idea.editors', { + treeDataProvider, + showCollapseAll: false + }); + + // 监听配置变化,自动刷新 TreeView 和可见性 + vscode.workspace.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('switch2idea.editors')) { + treeDataProvider.refresh(); + } + if (e.affectsConfiguration('switch2idea.showTreeView')) { + updateTreeViewVisibility(); + } + }); + + // 注册 TreeView 相关命令 + context.subscriptions.push( + treeView, + vscode.commands.registerCommand('switch2idea.addEditor', () => + editorConfigCommands.addEditor() + ), + vscode.commands.registerCommand('switch2idea.editEditor', (item: EditorTreeItem) => + editorConfigCommands.editEditor(item) + ), + vscode.commands.registerCommand('switch2idea.deleteEditor', (item: EditorTreeItem) => + editorConfigCommands.deleteEditor(item) + ), + vscode.commands.registerCommand('switch2idea.openJsonConfig', () => + editorConfigCommands.openJsonConfig() + ), + vscode.commands.registerCommand('switch2idea.refreshEditors', () => + treeDataProvider.refresh() + ), + vscode.commands.registerCommand('switch2idea.jumpToEditor', async (item: EditorTreeItem) => { + const editor = vscode.window.activeTextEditor; + if (!editor) { + vscode.window.showErrorMessage(errorMessages.noActiveEditor()); + return; + } + + const jumpContext: JumpContext = { + filePath: editor.document.uri.fsPath, + line: editor.selection.active.line + 1, + column: editor.selection.active.character, + }; + + await executeJumpToEditor(item.editor, jumpContext); + }) + ); + + // 注册 openFileInIDEA 命令 + // 需求 4.1: 保留现有的快捷键绑定 (Alt+Shift+O) + let openFileDisposable = vscode.commands.registerCommand( + 'Switch2IDEA.openFileInIDEA', + async (uri?: vscode.Uri) => { + // 构建跳转上下文 + let filePath: string; + let line = 1; + let column = 0; + + if (uri) { + // 从右键菜单触发,使用传入的 URI + filePath = uri.fsPath; + const editor = vscode.window.activeTextEditor; + if (editor && editor.document.uri.fsPath === filePath) { + line = editor.selection.active.line + 1; // 转换为 1-based + column = editor.selection.active.character; // 0-based + } + } else { + // 从快捷键或命令面板触发 + const editor = vscode.window.activeTextEditor; + if (!editor) { + vscode.window.showErrorMessage(errorMessages.noActiveEditor()); + return; + } + filePath = editor.document.uri.fsPath; + line = editor.selection.active.line + 1; // 转换为 1-based + column = editor.selection.active.character; // 0-based + } + + const jumpContext: JumpContext = { + filePath, + line, + column, + }; + + await executeJump(jumpContext); + } + ); + + // 注册 openProjectInIDEA 命令 + // 需求 4.1: 保留现有的快捷键绑定 (Alt+Shift+P) + let openProjectDisposable = vscode.commands.registerCommand( + 'Switch2IDEA.openProjectInIDEA', + async () => { + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + vscode.window.showErrorMessage(errorMessages.noWorkspace()); + return; + } + + const projectPath = workspaceFolders[0].uri.fsPath; + + const jumpContext: JumpContext = { + projectPath, + }; + + await executeJump(jumpContext); + } + ); + + context.subscriptions.push(openFileDisposable); + context.subscriptions.push(openProjectDisposable); } -export function activate(context: vscode.ExtensionContext) { +/** + * 执行跳转操作 + * 新架构的核心流程: + * 1. 从 ConfigManager 获取编辑器列表 + * 2. 通过 EditorSelector 让用户选择编辑器(或自动选择) + * 3. 从 JumpHandlerFactory 获取对应的处理器 + * 4. 调用处理器执行跳转 + * + * @param context 跳转上下文 + */ +async function executeJump(context: JumpContext): Promise { + try { + // 1. 获取编辑器列表 + const editors = configManager.getEditors(); + + // 2. 让用户选择编辑器 + // 需求 4.2: 配置了多个编辑器时弹出 QuickPick 供用户选择 + // 需求 4.3: 只配置了一个编辑器时直接跳转 + const selectedEditor = await editorSelector.selectEditor(editors); + + // 用户取消选择 + if (!selectedEditor) { + return; + } + + // 3. 获取对应的跳转处理器 + const handler = jumpHandlerFactory.getHandler(selectedEditor.type); + + // 4. 执行跳转 + await handler.jump(selectedEditor, context); + } catch (error) { + const err = error as Error; + vscode.window.showErrorMessage(err.message); + } +} - console.log('Switch2IDEA is now active!'); - - let openFileDisposable = vscode.commands.registerCommand('Switch2IDEA.openFileInIDEA', async (uri?: vscode.Uri) => { - let filePath: string; - let line = 1; - let column = 1; - - if (uri) { - filePath = uri.fsPath; - const editor = vscode.window.activeTextEditor; - if (editor && editor.document.uri.fsPath === filePath) { - line = editor.selection.active.line + 1; - column = editor.selection.active.character; - } - } else { - const editor = vscode.window.activeTextEditor; - if (!editor) { - vscode.window.showErrorMessage('No active editor!'); - return; - } - filePath = editor.document.uri.fsPath; - line = editor.selection.active.line + 1; - column = editor.selection.active.character; - } - - const config = vscode.workspace.getConfiguration('switch2idea'); - let ideaPath = config.get('ideaPath'); - - if (!ideaPath) { - if (os.platform() === 'darwin') { - ideaPath = getMacIdeaPath(); - } else if (os.platform() === 'win32') { - ideaPath = 'C:\\Program Files\\JetBrains\\IntelliJ IDEA\\bin\\idea64.exe'; - } else { - ideaPath = 'idea'; - } - } - - let command: string; - if (os.platform() === 'darwin') { - const ideaUrl = `idea://open?file=${encodeURIComponent(filePath)}&line=${line}&column=${column}`; - // If IDEA is already open, using the 'idea' command will show two IDEA icons in the dock temporarily - // Using the 'open' command instead will prevent this issue - command = `open -a "${ideaPath}" "${ideaUrl}"`; - } else { - command = `"${ideaPath}" --line ${line} --column ${column} "${filePath}"`; - } - - console.log('Executing command:', command); - - try { - await executeCommand(command); - } catch (error) { - const err = error as Error; - vscode.window.showErrorMessage(`Failed to open IDEA: ${err.message}`); - } - }); - - let openProjectDisposable = vscode.commands.registerCommand('Switch2IDEA.openProjectInIDEA', async () => { - const workspaceFolders = vscode.workspace.workspaceFolders; - if (!workspaceFolders || workspaceFolders.length === 0) { - vscode.window.showErrorMessage('No workspace folder is opened!'); - return; - } - - const projectPath = workspaceFolders[0].uri.fsPath; - - const config = vscode.workspace.getConfiguration('switch2idea'); - let ideaPath = config.get('ideaPath'); - - if (!ideaPath) { - if (os.platform() === 'darwin') { - const macIdeaPath = getMacIdeaPath(); - ideaPath = macIdeaPath || 'IntelliJ IDEA'; - } else if (os.platform() === 'win32') { - ideaPath = 'C:\\Program Files\\JetBrains\\IntelliJ IDEA\\bin\\idea64.exe'; - } else { - ideaPath = 'idea'; - } - } - - let command: string; - if (os.platform() === 'darwin') { - const ideaUrl = `idea://open?file=${encodeURIComponent(projectPath)}`; - command = `open -a "${ideaPath}" "${ideaUrl}"`; - } else { - command = `"${ideaPath}" "${projectPath}"`; - } - - console.log('Executing command:', command); - - try { - await executeCommand(command); - } catch (error) { - const err = error as Error; - vscode.window.showErrorMessage(`Failed to open project in IDEA: ${err.message}`); - } - }); - - context.subscriptions.push(openFileDisposable); - context.subscriptions.push(openProjectDisposable); +/** + * 直接跳转到指定编辑器 + * 用于 TreeView 中的快速跳转 + * + * @param editor 目标编辑器配置 + * @param context 跳转上下文 + */ +async function executeJumpToEditor(editor: EditorConfig, context: JumpContext): Promise { + try { + const handler = jumpHandlerFactory.getHandler(editor.type); + await handler.jump(editor, context); + } catch (error) { + const err = error as Error; + vscode.window.showErrorMessage(err.message); + } } export function deactivate() {} diff --git a/src/handlers/jetbrainsHandler.ts b/src/handlers/jetbrainsHandler.ts new file mode 100644 index 0000000..120abac --- /dev/null +++ b/src/handlers/jetbrainsHandler.ts @@ -0,0 +1,238 @@ +import * as os from 'os'; +import { exec } from 'child_process'; +import * as vscode from 'vscode'; +import * as l10n from '@vscode/l10n'; +import { JumpHandler, EditorConfig, JumpContext } from '../types'; + +/** + * 错误消息定义 + */ +export const errorMessages = { + noFileOrProject: () => l10n.t('No file or project path provided!'), + editorNotFound: (name: string, path: string) => + l10n.t('Cannot launch {0}: "{1}" not found. Please check the editor path config.', name, path), + executionFailed: (name: string, error: string) => + l10n.t('Failed to launch {0}: {1}', name, error) +}; + +/** + * JetBrains 系列编辑器的跳转处理器 + * 支持 macOS 使用 URL scheme 方式,Windows/Linux 使用命令行参数方式 + */ +export class JetBrainsHandler implements JumpHandler { + /** + * 执行跳转操作 + * @param config 编辑器配置 + * @param context 跳转上下文 + */ + async jump(config: EditorConfig, context: JumpContext): Promise { + const command = this.buildCommand(config, context); + await this.executeCommand(command, config); + } + + /** + * 根据平台构建跳转命令 + * @param config 编辑器配置 + * @param context 跳转上下文 + * @returns 构建的命令字符串 + */ + buildCommand(config: EditorConfig, context: JumpContext): string { + const platform = os.platform(); + const path = config.path || this.getDefaultPath(platform, config.name); + + if (platform === 'darwin') { + return this.buildMacCommand(config, context, path); + } else { + return this.buildCliCommand(context, path); + } + } + + /** + * 构建 macOS 平台的 URL scheme 命令 + * @param config 编辑器配置 + * @param context 跳转上下文 + * @param appPath 应用路径 + * @returns macOS 命令字符串 + */ + buildMacCommand( + config: EditorConfig, + context: JumpContext, + appPath: string + ): string { + const scheme = config.urlScheme || 'idea'; + let url: string; + + if (context.filePath) { + url = `${scheme}://open?file=${encodeURIComponent(context.filePath)}`; + if (context.line) { + url += `&line=${context.line}`; + } + if (context.column !== undefined) { + url += `&column=${context.column}`; + } + } else if (context.projectPath) { + url = `${scheme}://open?file=${encodeURIComponent(context.projectPath)}`; + } else { + throw new Error(errorMessages.noFileOrProject()); + } + + return `open -a "${appPath}" "${url}"`; + } + + /** + * 构建 Windows/Linux 平台的命令行命令 + * @param context 跳转上下文 + * @param execPath 可执行文件路径 + * @returns 命令行命令字符串 + */ + buildCliCommand(context: JumpContext, execPath: string): string { + if (context.filePath) { + let cmd = `"${execPath}"`; + if (context.line) { + cmd += ` --line ${context.line}`; + } + if (context.column !== undefined) { + cmd += ` --column ${context.column}`; + } + cmd += ` "${context.filePath}"`; + return cmd; + } else if (context.projectPath) { + return `"${execPath}" "${context.projectPath}"`; + } + throw new Error(errorMessages.noFileOrProject()); + } + + /** + * 获取平台特定的默认编辑器路径 + * @param platform 操作系统平台 + * @param editorName 编辑器名称(用于匹配) + * @returns 默认路径 + */ + getDefaultPath(platform: string, editorName?: string): string { + const name = editorName?.toLowerCase() || 'intellij idea'; + + // JetBrains 编辑器名称到应用名称的映射 + const appNameMap: Record = { + 'intellij idea': { + mac: 'IntelliJ IDEA', + win: 'idea64.exe', + linux: 'idea.sh' + }, + 'webstorm': { + mac: 'WebStorm', + win: 'webstorm64.exe', + linux: 'webstorm.sh' + }, + 'pycharm': { + mac: 'PyCharm', + win: 'pycharm64.exe', + linux: 'pycharm.sh' + }, + 'goland': { + mac: 'GoLand', + win: 'goland64.exe', + linux: 'goland.sh' + }, + 'phpstorm': { + mac: 'PhpStorm', + win: 'phpstorm64.exe', + linux: 'phpstorm.sh' + }, + 'rider': { + mac: 'Rider', + win: 'rider64.exe', + linux: 'rider.sh' + }, + 'clion': { + mac: 'CLion', + win: 'clion64.exe', + linux: 'clion.sh' + }, + 'rubymine': { + mac: 'RubyMine', + win: 'rubymine64.exe', + linux: 'rubymine.sh' + }, + 'datagrip': { + mac: 'DataGrip', + win: 'datagrip64.exe', + linux: 'datagrip.sh' + }, + 'android studio': { + mac: 'Android Studio', + win: 'studio64.exe', + linux: 'studio.sh' + } + }; + + // 查找匹配的编辑器 + let appInfo = appNameMap['intellij idea']; // 默认使用 IDEA + for (const [key, value] of Object.entries(appNameMap)) { + if (name.includes(key)) { + appInfo = value; + break; + } + } + + switch (platform) { + case 'darwin': + // macOS: 返回应用名称,open -a 命令会自动查找 + return appInfo.mac; + + case 'win32': + // Windows: 尝试常见的安装路径 + // JetBrains Toolbox 安装路径(优先使用,因为更常用) + // 标准安装路径: C:\Program Files\JetBrains\{AppName}\bin\{exe} + return `${process.env.LOCALAPPDATA}\\JetBrains\\Toolbox\\scripts\\${appInfo.win.replace('64.exe', '')}`; + + case 'linux': + // Linux: 尝试常见的安装路径 + // JetBrains Toolbox 安装路径(优先使用) + // 其他可能路径: /snap/bin/{app} + return `${os.homedir()}/.local/share/JetBrains/Toolbox/scripts/${appInfo.linux.replace('.sh', '')}`; + + default: + // 未知平台,返回通用名称 + return appInfo.mac; + } + } + + /** + * 执行跳转命令 + * @param command 要执行的命令 + * @param config 编辑器配置(用于错误提示) + * @returns Promise,成功时 resolve,失败时 reject + */ + private executeCommand(command: string, config: EditorConfig): Promise { + return new Promise((resolve, reject) => { + exec(command, (error, _stdout, stderr) => { + if (error) { + // 判断错误类型,提供更友好的错误提示 + let errorMessage: string; + + // 检查是否是找不到编辑器的错误 + if (error.message.includes('ENOENT') || + error.message.includes('not found') || + error.message.includes('找不到') || + error.code === 127) { + const path = config.path || this.getDefaultPath(os.platform(), config.name); + errorMessage = errorMessages.editorNotFound(config.name, path); + } else { + errorMessage = errorMessages.executionFailed(config.name, error.message); + } + + vscode.window.showErrorMessage(errorMessage); + reject(new Error(errorMessage)); + return; + } + + // 如果有 stderr 输出但没有错误,可能是警告信息 + if (stderr && stderr.trim()) { + console.warn(`[JetBrainsHandler] stderr: ${stderr}`); + } + + resolve(); + }); + }); + } +} diff --git a/src/jumpHandlerFactory.ts b/src/jumpHandlerFactory.ts new file mode 100644 index 0000000..3776b12 --- /dev/null +++ b/src/jumpHandlerFactory.ts @@ -0,0 +1,48 @@ +import * as l10n from '@vscode/l10n'; +import { EditorType, JumpHandler } from './types'; +import { JetBrainsHandler } from './handlers/jetbrainsHandler'; + +/** + * 错误消息定义 + */ +export const errorMessages = { + unsupportedType: (type: string) => + l10n.t('Unsupported editor type: {0}. Currently supported types: jetbrains', type) +}; + +/** + * 跳转处理器工厂 + * 根据编辑器类型创建和管理对应的跳转处理器 + * 支持扩展机制,可以注册新的处理器类型 + */ +export class JumpHandlerFactory { + private handlers: Map = new Map(); + + constructor() { + // 默认注册 JetBrains 处理器 + this.handlers.set('jetbrains', new JetBrainsHandler()); + } + + /** + * 根据编辑器类型获取对应的跳转处理器 + * @param type 编辑器类型 + * @returns 对应的跳转处理器 + * @throws Error 如果类型不支持 + */ + getHandler(type: EditorType): JumpHandler { + const handler = this.handlers.get(type); + if (!handler) { + throw new Error(errorMessages.unsupportedType(type)); + } + return handler; + } + + /** + * 注册新的跳转处理器(用于扩展) + * @param type 编辑器类型 + * @param handler 跳转处理器实例 + */ + registerHandler(type: EditorType, handler: JumpHandler): void { + this.handlers.set(type, handler); + } +} diff --git a/src/test/extension.test.ts b/src/test/extension.test.ts index 9e7999e..dae6a1e 100644 --- a/src/test/extension.test.ts +++ b/src/test/extension.test.ts @@ -27,18 +27,23 @@ suite('Switch2IDEA Extension Test Suite', () => { assert.ok(extension.isActive, 'Extension should be activated'); }); - test('Should register open in IDEA command', () => { + test('Should register openFileInIDEA command', () => { const commands = vscode.commands.getCommands(true); return commands.then((cmds) => { - assert.ok(cmds.includes('Switch2IDEA.openInIDEA')); + assert.ok(cmds.includes('Switch2IDEA.openFileInIDEA'), 'openFileInIDEA command should be registered'); + }); + }); + + test('Should register openProjectInIDEA command', () => { + const commands = vscode.commands.getCommands(true); + return commands.then((cmds) => { + assert.ok(cmds.includes('Switch2IDEA.openProjectInIDEA'), 'openProjectInIDEA command should be registered'); }); }); test('Should have correct configuration', () => { const config = vscode.workspace.getConfiguration('switch2idea'); - assert.ok(config.has('ideaPath')); - assert.ok(config.has('keyboardShortcut')); - assert.strictEqual(config.get('keyboardShortcut'), 'alt+shift+o'); + assert.ok(config.has('ideaPath'), 'Configuration should have ideaPath setting'); }); test('Should handle file path with spaces and special characters', async () => { @@ -55,8 +60,8 @@ suite('Switch2IDEA Extension Test Suite', () => { const doc = await vscode.workspace.openTextDocument(testFilePath); const editor = await vscode.window.showTextDocument(doc); - // Execute command - await vscode.commands.executeCommand('Switch2IDEA.openInIDEA'); + // Execute command - use the correct command name + await vscode.commands.executeCommand('Switch2IDEA.openFileInIDEA'); // Verify command execution completed without errors // Note: We cannot verify if IDEA actually opened the file as it's an external process @@ -89,8 +94,8 @@ suite('Switch2IDEA Extension Test Suite', () => { const position = new vscode.Position(2, 1); editor.selection = new vscode.Selection(position, position); - // Execute command - await vscode.commands.executeCommand('Switch2IDEA.openInIDEA'); + // Execute command - use the correct command name + await vscode.commands.executeCommand('Switch2IDEA.openFileInIDEA'); // Verify command execution completed without errors assert.ok(true); @@ -112,8 +117,8 @@ suite('Switch2IDEA Extension Test Suite', () => { try { await config.update('ideaPath', 'non-existent-path', vscode.ConfigurationTarget.Global); - // Execute command - await vscode.commands.executeCommand('Switch2IDEA.openInIDEA'); + // Execute command - use the correct command name + await vscode.commands.executeCommand('Switch2IDEA.openFileInIDEA'); // Command should complete without crashing assert.ok(true); diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..61611b9 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,45 @@ +/** + * 编辑器类型枚举 + * 用于区分不同的跳转逻辑 + */ +export type EditorType = 'jetbrains' | 'custom'; + +/** + * 单个编辑器配置 + */ +export interface EditorConfig { + /** 显示名称,如 "WebStorm", "PyCharm" */ + name: string; + /** 编辑器类型,决定跳转逻辑 */ + type: EditorType; + /** 可执行文件路径或应用名称 */ + path: string; + /** macOS URL scheme,如 "webstorm", "pycharm",可选 */ + urlScheme?: string; +} + +/** + * 跳转上下文,包含跳转所需的所有信息 + */ +export interface JumpContext { + /** 文件绝对路径 */ + filePath?: string; + /** 项目根目录路径 */ + projectPath?: string; + /** 行号(1-based) */ + line?: number; + /** 列号(0-based) */ + column?: number; +} + +/** + * 跳转处理器接口 + */ +export interface JumpHandler { + /** + * 执行跳转操作 + * @param config 编辑器配置 + * @param context 跳转上下文 + */ + jump(config: EditorConfig, context: JumpContext): Promise; +} From 265cd449aefce63cc45d271d0a7e42c7cec6fc83 Mon Sep 17 00:00:00 2001 From: litcc Date: Sun, 8 Feb 2026 19:48:30 +0800 Subject: [PATCH 2/3] chore: Add localized strings for multi-editor support and i18n configuration --- l10n/bundle.l10n.json | 51 +++++++++++++++++++++++++++++++++++++ l10n/bundle.l10n.zh-cn.json | 51 +++++++++++++++++++++++++++++++++++++ package.nls.json | 20 +++++++++++++++ package.nls.zh-cn.json | 20 +++++++++++++++ 4 files changed, 142 insertions(+) create mode 100644 l10n/bundle.l10n.json create mode 100644 l10n/bundle.l10n.zh-cn.json create mode 100644 package.nls.json create mode 100644 package.nls.zh-cn.json diff --git a/l10n/bundle.l10n.json b/l10n/bundle.l10n.json new file mode 100644 index 0000000..4cfca64 --- /dev/null +++ b/l10n/bundle.l10n.json @@ -0,0 +1,51 @@ +{ + "No active file! Please open a file first.": "No active file! Please open a file first.", + "No workspace open! Please open a project folder first.": "No workspace open! Please open a project folder first.", + "No file or project path provided!": "No file or project path provided!", + "Cannot launch {0}: \"{1}\" not found. Please check the editor path config.": "Cannot launch {0}: \"{1}\" not found. Please check the editor path config.", + "Failed to launch {0}: {1}": "Failed to launch {0}: {1}", + "Unsupported editor type: {0}. Currently supported types: jetbrains": "Unsupported editor type: {0}. Currently supported types: jetbrains", + "Use default path": "Use default path", + "Select editor to jump to": "Select editor to jump to", + "Jump to...": "Jump to...", + "JetBrains IDE": "JetBrains IDE", + "Select from preset list": "Select from preset list", + "WebStorm, PyCharm, IDEA, RustRover, etc.": "WebStorm, PyCharm, IDEA, RustRover, etc.", + "Custom Editor": "Custom Editor", + "Manual configuration": "Manual configuration", + "Select editor type": "Select editor type", + "Add Editor ({0}/{1})": "Add Editor ({0}/{1})", + "Select JetBrains IDE": "Select JetBrains IDE", + "Enter editor name": "Enter editor name", + "e.g. Sublime Text": "e.g. Sublime Text", + "macOS URL Scheme (optional, leave empty to skip)": "macOS URL Scheme (optional, leave empty to skip)", + "e.g. subl": "e.g. subl", + "Browse...": "Browse...", + "Open file picker": "Open file picker", + "Enter path manually": "Enter path manually", + "Type path directly": "Type path directly", + "Select {0} path": "Select {0} path", + "Enter editor path": "Enter editor path", + "/Applications/WebStorm.app or C:\\Program Files\\...": "/Applications/WebStorm.app or C:\\Program Files\\...", + "Add Editor": "Add Editor", + "Select": "Select", + "Select {0} path to open": "Select {0} path to open", + "Editor added: {0}": "Editor added: {0}", + "Name": "Name", + "Path": "Path", + "URL Scheme": "URL Scheme", + "Auto detect": "Auto detect", + "None": "None", + "Select field to edit": "Select field to edit", + "Edit {0}": "Edit {0}", + "Enter new name": "Enter new name", + "Enter URL Scheme (leave empty to clear)": "Enter URL Scheme (leave empty to clear)", + "Editor updated: {0}": "Editor updated: {0}", + "Are you sure you want to delete \"{0}\"?": "Are you sure you want to delete \"{0}\"?", + "Delete": "Delete", + "Editor deleted: {0}": "Editor deleted: {0}", + "Add editor...": "Add editor...", + "Type: {0}": "Type: {0}", + "Path: {0}": "Path: {0}", + "URL Scheme: {0}": "URL Scheme: {0}" +} diff --git a/l10n/bundle.l10n.zh-cn.json b/l10n/bundle.l10n.zh-cn.json new file mode 100644 index 0000000..f39aec6 --- /dev/null +++ b/l10n/bundle.l10n.zh-cn.json @@ -0,0 +1,51 @@ +{ + "No active file! Please open a file first.": "没有打开的文件!请先打开一个文件。", + "No workspace open! Please open a project folder first.": "没有打开的工作区!请先打开一个项目文件夹。", + "No file or project path provided!": "没有提供文件或项目路径!", + "Cannot launch {0}: \"{1}\" not found. Please check the editor path config.": "无法启动 {0}:找不到 \"{1}\"。请检查编辑器路径配置。", + "Failed to launch {0}: {1}": "启动 {0} 失败:{1}", + "Unsupported editor type: {0}. Currently supported types: jetbrains": "不支持的编辑器类型:{0}。目前支持的类型:jetbrains", + "Use default path": "使用默认路径", + "Select editor to jump to": "选择要跳转的编辑器", + "Jump to...": "跳转至...", + "JetBrains IDE": "JetBrains IDE", + "Select from preset list": "从预设列表选择", + "WebStorm, PyCharm, IDEA, RustRover, etc.": "WebStorm, PyCharm, IDEA, RustRover 等", + "Custom Editor": "自定义编辑器", + "Manual configuration": "手动配置", + "Select editor type": "选择编辑器类型", + "Add Editor ({0}/{1})": "添加编辑器 ({0}/{1})", + "Select JetBrains IDE": "选择 JetBrains IDE", + "Enter editor name": "输入编辑器名称", + "e.g. Sublime Text": "例如: Sublime Text", + "macOS URL Scheme (optional, leave empty to skip)": "macOS URL Scheme(可选,留空跳过)", + "e.g. subl": "例如: subl", + "Browse...": "浏览选择...", + "Open file picker": "打开文件选择器", + "Enter path manually": "手动输入路径", + "Type path directly": "直接输入路径", + "Select {0} path": "选择 {0} 的路径", + "Enter editor path": "输入编辑器路径", + "/Applications/WebStorm.app or C:\\Program Files\\...": "/Applications/WebStorm.app 或 C:\\Program Files\\...", + "Add Editor": "添加编辑器", + "Select": "选择", + "Select {0} path to open": "选择 {0} 路径", + "Editor added: {0}": "已添加编辑器: {0}", + "Name": "名称", + "Path": "路径", + "URL Scheme": "URL Scheme", + "Auto detect": "自动检测", + "None": "无", + "Select field to edit": "选择要编辑的字段", + "Edit {0}": "编辑 {0}", + "Enter new name": "输入新名称", + "Enter URL Scheme (leave empty to clear)": "输入 URL Scheme(留空清除)", + "Editor updated: {0}": "已更新编辑器: {0}", + "Are you sure you want to delete \"{0}\"?": "确定要删除 \"{0}\" 吗?", + "Delete": "删除", + "Editor deleted: {0}": "已删除编辑器: {0}", + "Add editor...": "添加编辑器...", + "Type: {0}": "类型: {0}", + "Path: {0}": "路径: {0}", + "URL Scheme: {0}": "URL Scheme: {0}" +} diff --git a/package.nls.json b/package.nls.json new file mode 100644 index 0000000..f0af301 --- /dev/null +++ b/package.nls.json @@ -0,0 +1,20 @@ +{ + "command.openFile": "Jump to other editor...", + "command.openProject": "Open project in other editor...", + "command.addEditor": "Add Editor", + "command.editEditor": "Edit", + "command.deleteEditor": "Delete", + "command.openJsonConfig": "Edit JSON Config", + "command.refreshEditors": "Refresh", + "command.jumpToEditor": "Open current file in this editor", + "view.editors.name": "Switch2IDEA", + "view.editors.contextualTitle": "Editor List", + "config.editors.description": "Configured editor list", + "config.editors.items.name.description": "Editor display name", + "config.editors.items.type.description": "Editor type", + "config.editors.items.path.description": "Executable file path", + "config.editors.items.urlScheme.description": "macOS URL scheme (optional)", + "config.ideaPath.description": "IDEA executable path (deprecated, use editors config instead)", + "config.ideaPath.deprecationMessage": "This config is deprecated, use switch2idea.editors to configure multiple editors", + "config.showTreeView.description": "Show editor management panel in Explorer" +} diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json new file mode 100644 index 0000000..58cb89b --- /dev/null +++ b/package.nls.zh-cn.json @@ -0,0 +1,20 @@ +{ + "command.openFile": "跳转至其他编辑器...", + "command.openProject": "在其他编辑器中打开项目...", + "command.addEditor": "添加编辑器", + "command.editEditor": "编辑", + "command.deleteEditor": "删除", + "command.openJsonConfig": "编辑 JSON 配置", + "command.refreshEditors": "刷新", + "command.jumpToEditor": "在此编辑器中打开当前文件", + "view.editors.name": "Switch2IDEA", + "view.editors.contextualTitle": "编辑器列表", + "config.editors.description": "配置的编辑器列表", + "config.editors.items.name.description": "编辑器显示名称", + "config.editors.items.type.description": "编辑器类型", + "config.editors.items.path.description": "可执行文件路径", + "config.editors.items.urlScheme.description": "macOS URL scheme(可选)", + "config.ideaPath.description": "IDEA 可执行路径(已废弃,请使用 editors 配置)", + "config.ideaPath.deprecationMessage": "此配置已废弃,请使用 switch2idea.editors 配置多个编辑器", + "config.showTreeView.description": "是否在资源管理器中显示编辑器管理面板" +} From 33270808d45c4136de011ad4579b30ec51d784f2 Mon Sep 17 00:00:00 2001 From: litcc Date: Sun, 8 Feb 2026 21:12:44 +0800 Subject: [PATCH 3/3] fix: Resolved issue where i18n dependencies were not bundled after packaging - Integrated esbuild for packaging and updated build scripts - Added `.vscodeignore` to exclude build output - Updated devDependencies to include `esbuild` --- .vscodeignore | 18 ++++ esbuild.js | 53 ++++++++++ package.json | 14 +-- pnpm-lock.yaml | 278 ++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 352 insertions(+), 11 deletions(-) create mode 100644 .vscodeignore create mode 100644 esbuild.js diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..311bc66 --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,18 @@ +.vscode/** +.vscode-test/** +src/** +.gitignore +.yarnrc +esbuild.js +**/tsconfig.json +**/.eslintrc.json +eslint.config.mjs +**/*.map +**/*.ts +!l10n/** +node_modules/** +.kiro/** +*.patch +*.vsix +.DS_Store +.idea/** diff --git a/esbuild.js b/esbuild.js new file mode 100644 index 0000000..e190322 --- /dev/null +++ b/esbuild.js @@ -0,0 +1,53 @@ +const esbuild = require('esbuild'); + +const production = process.argv.includes('--production'); +const watch = process.argv.includes('--watch'); + +async function main() { + const ctx = await esbuild.context({ + entryPoints: ['src/extension.ts'], + bundle: true, + format: 'cjs', + minify: production, + sourcemap: !production, + sourcesContent: false, + platform: 'node', + outfile: 'out/extension.js', + external: ['vscode'], + logLevel: 'warning', + plugins: [ + esbuildProblemMatcherPlugin, + ], + }); + if (watch) { + await ctx.watch(); + } else { + await ctx.rebuild(); + await ctx.dispose(); + } +} + +/** + * @type {import('esbuild').Plugin} + */ +const esbuildProblemMatcherPlugin = { + name: 'esbuild-problem-matcher', + setup(build) { + build.onStart(() => { + console.log('[watch] build started'); + }); + build.onEnd((result) => { + result.errors.forEach(({ text, location }) => { + console.error(`✘ [ERROR] ${text}`); + if (location == null) return; + console.error(` ${location.file}:${location.line}:${location.column}:`); + }); + console.log('[watch] build finished'); + }); + }, +}; + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/package.json b/package.json index 5108897..3970c3f 100644 --- a/package.json +++ b/package.json @@ -204,13 +204,14 @@ }, "scripts": { "vscode:prepublish": "pnpm run compile", - "compile": "tsc -p ./", - "watch": "tsc -watch -p ./", + "compile": "pnpm run check-types && node esbuild.js --production", + "check-types": "tsc --noEmit", + "watch": "node esbuild.js --watch", "pretest": "pnpm run compile && pnpm run lint", "lint": "eslint src", "test": "vscode-test", - "package": "pnpm vsce package --no-dependencies", - "publish": "pnpm vsce publish --no-dependencies" + "package": "pnpm run compile && pnpm vsce package --no-dependencies", + "publish": "pnpm run compile && pnpm vsce publish --no-dependencies" }, "packageManager": "pnpm@9.6.0", "devDependencies": { @@ -219,13 +220,12 @@ "@types/vscode": "^1.93.1", "@typescript-eslint/eslint-plugin": "^8.17.0", "@typescript-eslint/parser": "^8.17.0", + "@vscode/l10n": "^0.0.18", "@vscode/test-cli": "^0.0.12", "@vscode/test-electron": "^2.4.1", "@vscode/vsce": "^3.7.1", + "esbuild": "^0.27.3", "eslint": "^9.18.0", "typescript": "^5.7.2" - }, - "dependencies": { - "@vscode/l10n": "^0.0.18" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b88335d..e645a81 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,10 +7,6 @@ settings: importers: .: - dependencies: - '@vscode/l10n': - specifier: ^0.0.18 - version: 0.0.18 devDependencies: '@types/mocha': specifier: ^10.0.10 @@ -27,6 +23,9 @@ importers: '@typescript-eslint/parser': specifier: ^8.17.0 version: 8.19.0(eslint@9.39.2)(typescript@5.7.2) + '@vscode/l10n': + specifier: ^0.0.18 + version: 0.0.18 '@vscode/test-cli': specifier: ^0.0.12 version: 0.0.12 @@ -36,6 +35,9 @@ importers: '@vscode/vsce': specifier: ^3.7.1 version: 3.7.1 + esbuild: + specifier: ^0.27.3 + version: 0.27.3 eslint: specifier: ^9.18.0 version: 9.39.2 @@ -107,6 +109,162 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -731,6 +889,11 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1908,6 +2071,84 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} + '@esbuild/aix-ppc64@0.27.3': + optional: true + + '@esbuild/android-arm64@0.27.3': + optional: true + + '@esbuild/android-arm@0.27.3': + optional: true + + '@esbuild/android-x64@0.27.3': + optional: true + + '@esbuild/darwin-arm64@0.27.3': + optional: true + + '@esbuild/darwin-x64@0.27.3': + optional: true + + '@esbuild/freebsd-arm64@0.27.3': + optional: true + + '@esbuild/freebsd-x64@0.27.3': + optional: true + + '@esbuild/linux-arm64@0.27.3': + optional: true + + '@esbuild/linux-arm@0.27.3': + optional: true + + '@esbuild/linux-ia32@0.27.3': + optional: true + + '@esbuild/linux-loong64@0.27.3': + optional: true + + '@esbuild/linux-mips64el@0.27.3': + optional: true + + '@esbuild/linux-ppc64@0.27.3': + optional: true + + '@esbuild/linux-riscv64@0.27.3': + optional: true + + '@esbuild/linux-s390x@0.27.3': + optional: true + + '@esbuild/linux-x64@0.27.3': + optional: true + + '@esbuild/netbsd-arm64@0.27.3': + optional: true + + '@esbuild/netbsd-x64@0.27.3': + optional: true + + '@esbuild/openbsd-arm64@0.27.3': + optional: true + + '@esbuild/openbsd-x64@0.27.3': + optional: true + + '@esbuild/openharmony-arm64@0.27.3': + optional: true + + '@esbuild/sunos-x64@0.27.3': + optional: true + + '@esbuild/win32-arm64@0.27.3': + optional: true + + '@esbuild/win32-ia32@0.27.3': + optional: true + + '@esbuild/win32-x64@0.27.3': + optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@9.39.2)': dependencies: eslint: 9.39.2 @@ -2640,6 +2881,35 @@ snapshots: dependencies: es-errors: 1.3.0 + esbuild@0.27.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 + escalade@3.2.0: {} escape-string-regexp@4.0.0: {}