├── .prettierignore ├── .npmrc ├── .gitignore ├── .gitattributes ├── .editorconfig ├── images ├── japanese-word-handler.gif └── japanese-word-handler-vanilla.gif ├── .vscodeignore ├── .vscode ├── extensions.json ├── settings.json ├── launch.json └── tasks.json ├── .pre-commit-config.yaml ├── src └── web │ ├── test │ └── suite │ │ ├── mochaTestRunner.ts │ │ └── extension.test.ts │ └── extension.ts ├── tsconfig.json ├── eslint.config.mjs ├── LICENSE ├── .github └── workflows │ └── ci.yml ├── esbuild.js ├── CHANGELOG.md ├── README.md ├── DESIGN_NOTES.md ├── package.json └── pnpm-lock.yaml /.prettierignore: -------------------------------------------------------------------------------- 1 | pnpm-lock.yaml 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | enable-pre-post-scripts = true 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | dist 3 | node_modules 4 | .vscode-test-web/ 5 | *.vsix 6 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | package.json text eol=lf 2 | package-lock.json text eol=lf 3 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | insert_final_newline = true 7 | -------------------------------------------------------------------------------- /images/japanese-word-handler.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sgryjp/japanese-word-handler/HEAD/images/japanese-word-handler.gif -------------------------------------------------------------------------------- /images/japanese-word-handler-vanilla.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sgryjp/japanese-word-handler/HEAD/images/japanese-word-handler-vanilla.gif -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test-web/** 3 | src/** 4 | out/** 5 | node_modules/** 6 | dist/test/** 7 | .gitignore 8 | vsc-extension-quickstart.md 9 | webpack.config.js 10 | esbuild.js 11 | .yarnrc 12 | **/tsconfig.json 13 | **/eslint.config.mjs 14 | **/*.map 15 | **/*.ts 16 | **/.vscode-test.* 17 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "dbaeumer.vscode-eslint", 6 | "connor4312.esbuild-problem-matchers", 7 | "ms-vscode.extension-test-runner" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "dist": false // set this to true to hide the "dist" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "dist": true // set this to false to include "dist" folder in search results 8 | }, 9 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts 10 | "typescript.tsc.autoDetect": "off" 11 | } 12 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | # See https://pre-commit.com for more information 2 | # See https://pre-commit.com/hooks.html for more hooks 3 | repos: 4 | - repo: https://github.com/pre-commit/pre-commit-hooks 5 | rev: v5.0.0 6 | hooks: 7 | - id: trailing-whitespace 8 | - id: end-of-file-fixer 9 | - id: check-yaml 10 | - id: check-added-large-files 11 | 12 | - repo: https://github.com/pre-commit/mirrors-prettier 13 | rev: v3.1.0 14 | hooks: 15 | - id: prettier 16 | -------------------------------------------------------------------------------- /src/web/test/suite/mochaTestRunner.ts: -------------------------------------------------------------------------------- 1 | // Imports mocha for the browser, defining the `mocha` global. 2 | import "mocha/mocha"; 3 | 4 | mocha.setup({ 5 | ui: "tdd", 6 | reporter: undefined, 7 | }); 8 | 9 | export function run(): Promise { 10 | return new Promise((c, e) => { 11 | try { 12 | // Run the mocha test 13 | mocha.run((failures) => { 14 | if (failures > 0) { 15 | e(new Error(`${failures} tests failed.`)); 16 | } else { 17 | c(); 18 | } 19 | }); 20 | } catch (err) { 21 | console.error(err); 22 | e(err); 23 | } 24 | }); 25 | } 26 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "Node16", 4 | "target": "ES2020", 5 | "outDir": "dist", 6 | "lib": ["ES2020", "WebWorker"], 7 | "sourceMap": true, 8 | "rootDir": "src", 9 | "strict": true /* enable all strict type-checking options */ 10 | /* Additional Checks */ 11 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 12 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 13 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import typescriptEslint from "@typescript-eslint/eslint-plugin"; 2 | import tsParser from "@typescript-eslint/parser"; 3 | 4 | export default [ 5 | { 6 | files: ["**/*.ts"], 7 | }, 8 | { 9 | plugins: { 10 | "@typescript-eslint": typescriptEslint, 11 | }, 12 | 13 | languageOptions: { 14 | parser: tsParser, 15 | ecmaVersion: 2022, 16 | sourceType: "module", 17 | }, 18 | 19 | rules: { 20 | "@typescript-eslint/naming-convention": [ 21 | "warn", 22 | { 23 | selector: "import", 24 | format: ["camelCase", "PascalCase"], 25 | }, 26 | ], 27 | 28 | curly: "warn", 29 | eqeqeq: "warn", 30 | "no-throw-literal": "warn", 31 | semi: "warn", 32 | }, 33 | }, 34 | ]; 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | zlib License 2 | 3 | Copyright (c) 2021 Suguru Yamamoto 4 | 5 | This software is provided 'as-is', without any express or implied warranty. 6 | In no event will the authors be held liable for any damages arising from the 7 | use of this software. 8 | 9 | Permission is granted to anyone to use this software for any purpose, including 10 | commercial applications, and to alter it and redistribute it freely, subject to 11 | the following restrictions: 12 | 13 | 1. The origin of this software must not be misrepresented; you must not 14 | claim that you wrote the original software. If you use this software in 15 | a product, an acknowledgment in the product documentation would be 16 | appreciated but is not required. 17 | 18 | 2. Altered source versions must be plainly marked as such, and must not be 19 | misrepresented as being the original software. 20 | 21 | 3. This notice may not be removed or altered from any source distribution. 22 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | pull_request: 6 | branches: 7 | - master 8 | 9 | jobs: 10 | test: 11 | runs-on: windows-latest 12 | steps: 13 | - uses: actions/checkout@v3 14 | 15 | - name: Setup Node.js 16 | uses: actions/setup-node@v4 17 | with: 18 | node-version: "lts/*" 19 | 20 | - uses: pnpm/action-setup@v4 21 | name: Install pnpm 22 | with: 23 | version: latest 24 | run_install: true 25 | 26 | - run: pnpm exec playwright install 27 | 28 | - run: pnpm install-test 29 | 30 | package: 31 | runs-on: windows-latest 32 | needs: test 33 | steps: 34 | - uses: actions/checkout@v3 35 | 36 | - name: Setup Node.js 37 | uses: actions/setup-node@v3 38 | with: 39 | node-version: "lts/*" 40 | 41 | - uses: pnpm/action-setup@v4 42 | name: Install pnpm 43 | with: 44 | version: latest 45 | run_install: true 46 | 47 | - run: npm install --global @vscode/vsce 48 | - run: vsce package 49 | - uses: actions/upload-artifact@v4 50 | with: 51 | name: "VSIX file" 52 | path: | 53 | japanese-word-handler-*.vsix 54 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Run Web Extension ", 10 | "type": "extensionHost", 11 | "debugWebWorkerHost": true, 12 | "request": "launch", 13 | "args": [ 14 | "--extensionDevelopmentPath=${workspaceFolder}", 15 | "--extensionDevelopmentKind=web" 16 | ], 17 | "outFiles": ["${workspaceFolder}/dist/web/**/*.js"], 18 | "preLaunchTask": "${defaultBuildTask}" 19 | }, 20 | { 21 | "name": "Extension Tests", 22 | "type": "extensionHost", 23 | "debugWebWorkerHost": true, 24 | "request": "launch", 25 | "args": [ 26 | "--extensionDevelopmentPath=${workspaceFolder}", 27 | "--extensionDevelopmentKind=web", 28 | "--extensionTestsPath=${workspaceFolder}/dist/web/test/suite/extensionTests" 29 | ], 30 | "outFiles": ["${workspaceFolder}/dist/web/**/*.js"], 31 | "preLaunchTask": "${defaultBuildTask}" 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "watch-web", 8 | "dependsOn": ["npm: watch-web:tsc", "npm: watch-web:esbuild"], 9 | "presentation": { 10 | "reveal": "never" 11 | }, 12 | "group": { 13 | "kind": "build", 14 | "isDefault": true 15 | } 16 | }, 17 | { 18 | "type": "npm", 19 | "script": "watch-web:esbuild", 20 | "group": "build", 21 | "problemMatcher": "$esbuild-watch", 22 | "isBackground": true, 23 | "label": "npm: watch-web:esbuild", 24 | "presentation": { 25 | "group": "watch", 26 | "reveal": "never" 27 | } 28 | }, 29 | { 30 | "type": "npm", 31 | "script": "watch-web:tsc", 32 | "group": "build", 33 | "problemMatcher": "$tsc-watch", 34 | "isBackground": true, 35 | "label": "npm: watch-web:tsc", 36 | "presentation": { 37 | "group": "watch", 38 | "reveal": "never" 39 | } 40 | }, 41 | { 42 | "label": "compile", 43 | "type": "npm", 44 | "script": "compile-web", 45 | "problemMatcher": ["$tsc", "$esbuild"] 46 | } 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /esbuild.js: -------------------------------------------------------------------------------- 1 | const esbuild = require("esbuild"); 2 | const glob = require("glob"); 3 | const path = require("path"); 4 | const polyfill = require("@esbuild-plugins/node-globals-polyfill"); 5 | 6 | const production = process.argv.includes("--production"); 7 | const watch = process.argv.includes("--watch"); 8 | 9 | /** 10 | * This plugin hooks into the build process to print errors in a format that the problem matcher in 11 | * Visual Studio Code can understand. 12 | * @type {import('esbuild').Plugin} 13 | */ 14 | const esbuildProblemMatcherPlugin = { 15 | name: "esbuild-problem-matcher", 16 | 17 | setup(build) { 18 | build.onStart(() => { 19 | console.log("[watch] build started"); 20 | }); 21 | build.onEnd((result) => { 22 | result.errors.forEach(({ text, location }) => { 23 | console.error(`✘ [ERROR] ${text}`); 24 | console.error( 25 | ` ${location.file}:${location.line}:${location.column}:`, 26 | ); 27 | }); 28 | console.log("[watch] build finished"); 29 | }); 30 | }, 31 | }; 32 | 33 | /** 34 | * For web extension, all tests, including the test runner, need to be bundled into 35 | * a single module that has a exported `run` function . 36 | * This plugin bundles implements a virtual file extensionTests.ts that bundles all these together. 37 | * @type {import('esbuild').Plugin} 38 | */ 39 | const testBundlePlugin = { 40 | name: "testBundlePlugin", 41 | setup(build) { 42 | build.onResolve({ filter: /[\/\\]extensionTests\.ts$/ }, (args) => { 43 | if (args.kind === "entry-point") { 44 | return { path: path.resolve(args.path) }; 45 | } 46 | }); 47 | build.onLoad({ filter: /[\/\\]extensionTests\.ts$/ }, async (args) => { 48 | const testsRoot = path.join(__dirname, "src/web/test/suite"); 49 | const files = await glob.glob("*.test.{ts,tsx}", { 50 | cwd: testsRoot, 51 | posix: true, 52 | }); 53 | return { 54 | contents: 55 | `export { run } from './mochaTestRunner.ts';` + 56 | files.map((f) => `import('./${f}');`).join(""), 57 | watchDirs: files.map((f) => path.dirname(path.resolve(testsRoot, f))), 58 | watchFiles: files.map((f) => path.resolve(testsRoot, f)), 59 | }; 60 | }); 61 | }, 62 | }; 63 | 64 | async function main() { 65 | const ctx = await esbuild.context({ 66 | entryPoints: [ 67 | "src/web/extension.ts", 68 | "src/web/test/suite/extensionTests.ts", 69 | ], 70 | bundle: true, 71 | format: "cjs", 72 | minify: production, 73 | sourcemap: !production, 74 | sourcesContent: false, 75 | platform: "browser", 76 | outdir: "dist/web", 77 | external: ["vscode"], 78 | logLevel: "silent", 79 | // Node.js global to browser globalThis 80 | define: { 81 | global: "globalThis", 82 | }, 83 | 84 | plugins: [ 85 | polyfill.NodeGlobalsPolyfillPlugin({ 86 | process: true, 87 | buffer: true, 88 | }), 89 | testBundlePlugin, 90 | esbuildProblemMatcherPlugin /* add to the end of plugins array */, 91 | ], 92 | }); 93 | if (watch) { 94 | await ctx.watch(); 95 | } else { 96 | await ctx.rebuild(); 97 | await ctx.dispose(); 98 | } 99 | } 100 | 101 | main().catch((e) => { 102 | console.error(e); 103 | process.exit(1); 104 | }); 105 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to the "japanese-word-handler" extension will be 4 | documented in this file. 5 | 6 | The format is based on 7 | [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) this project adheres 8 | to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). 9 | 10 | 11 | 12 | ## [Unreleased] 13 | 14 | ## [1.4.1] - 2021-11-06 15 | 16 | ### Fixed 17 | 18 | - Now japanese-word-handler works on on desktop environments too 19 | (v1.4.0 works only on web environment) (#16) 20 | 21 | ## [1.4.0] - 2021-11-05 22 | 23 | ### Feature 24 | 25 | - Now japanese-word-handler is a web extension so it can be used on `vscode.dev` 26 | 27 | ## [1.3.0] - 2021-10-02 28 | 29 | ### Feature 30 | 31 | - Untrusted workspaces support 32 | 33 | ## [1.2.3] - 2021-08-15 34 | 35 | ### Fixed 36 | 37 | - Now the extension can be used on non-desktop host (#11) 38 | 39 | ## [1.2.2] - 2020-11-06 40 | 41 | ### Fixed 42 | 43 | - Update dependencies to suppress vulnerability warnings (affects developer only) 44 | 45 | ## [1.2.1] - 2020-04-29 46 | 47 | ### Fixed 48 | 49 | - Now word deletion won't be triggered when user does not focus file editing window 50 | ([Issue #5](https://github.com/sgryjp/japanese-word-handler/issues/5)) 51 | 52 | ## [1.2.0] - 2019-08-15 53 | 54 | ### Added 55 | 56 | - New command `japaneseWordHandler.cursorWordEndLeft` 57 | - New command `japaneseWordHandler.cursorWordEndLeftSelect` 58 | - New command `japaneseWordHandler.cursorWordStartRight` 59 | - New command `japaneseWordHandler.cursorWordStartRightSelect` 60 | - New command `japaneseWordHandler.deleteWordEndLeft` 61 | - New command `japaneseWordHandler.deleteWordStartRight` 62 | 63 | ### Change 64 | 65 | - Change command names to match built-in commands (old names can be used for compatibility but will be removed in future): 66 | 67 | | Old Command Names | New Command Names | 68 | | --------------------------------------- | ----------------------------------------------- | 69 | | `extension.cursorNextWordEndJa` | `japaneseWordHandler.cursorWordEndRight` | 70 | | `extension.cursorNextWordEndSelectJa` | `japaneseWordHandler.cursorWordEndRightSelect` | 71 | | `extension.cursorPrevWordStartJa` | `japaneseWordHandler.cursorWordStartLeft` | 72 | | `extension.cursorPrevWordStartSelectJa` | `japaneseWordHandler.cursorWordStartLeftSelect` | 73 | | `extension.deleteWordRight` | `japaneseWordHandler.deleteWordEndRight` | 74 | | `extension.deleteWordLeft` | `japaneseWordHandler.deleteWordStartLeft` | 75 | 76 | ## [1.1.1] - 2018-10-17 77 | 78 | ### Fixed 79 | 80 | - Now scrolls the window so that the cursor is always visible except when there are multiple cursors 81 | 82 | ## [1.1.0] - 2018-09-24 83 | 84 | ### Added 85 | 86 | - Multi-cursor support 87 | - New command `extension.deleteWordRight` with keyboard shortcut Ctrl+Delete 88 | - New command `extension.deleteWordLeft` with keyboard shortcut Ctrl+Backspace 89 | 90 | ## [1.0.0] - 2018-05-21 91 | 92 | ### Added 93 | 94 | - Now respects VSCode's `editor.wordSeparators` configuration 95 | ([PR #2](https://github.com/sgryjp/japanese-word-handler/pull/2), contribution 96 | by [@tekezo](https://github.com/tekezo)) 97 | 98 | ### Fixed 99 | 100 | - Moving cursor with Ctrl+Left over whitespaces at start of a document fails 101 | ([Issue #3](https://github.com/sgryjp/japanese-word-handler/issues/3)) 102 | 103 | ## [0.5.1] - 2018-04-19 104 | 105 | ### Fixed 106 | 107 | - Doesn't work on macOS because of incorrect keybinding settings 108 | 109 | ## [0.5.0] - 2017-05-01 110 | 111 | - Initial release 112 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Japanese Word Handler 4 | 5 | [![Version (VS Marketplace)](https://vsmarketplacebadge.apphb.com/version-short/sgryjp.japanese-word-handler.svg)](https://marketplace.visualstudio.com/items?itemName=sgryjp.japanese-word-handler) 6 | ![Rating (VS Marketplace)](https://vsmarketplacebadge.apphb.com/rating-star/sgryjp.japanese-word-handler.svg) 7 | ![Installs (VS Marketplace)](https://vsmarketplacebadge.apphb.com/installs-short/sgryjp.japanese-word-handler.svg) 8 |   9 | [![CI status](https://github.com/sgryjp/japanese-word-handler/actions/workflows/ci.yml/badge.svg)](https://github.com/sgryjp/japanese-word-handler/actions/workflows/ci.yml) 10 | [![zlib license](https://img.shields.io/badge/license-zlib-lightgray.svg?longCache=true&style=popout)](https://github.com/sgryjp/japanese-word-handler/blob/master/LICENSE) 11 | 12 | Better cursor movement in Japanese text for [VS Code](https://code.visualstudio.com). 13 | 14 | ## How to activate the logic? 15 | 16 | Just install the extension. Doing so changes the action for the keybindings 17 | below (on macOS, use ⌥Option instead of Ctrl): 18 | 19 | - Ctrl+Right 20 | - Ctrl+Left 21 | - Ctrl+Shift+Right 22 | - Ctrl+Shift+Left 23 | - Ctrl+Delete 24 | - Ctrl+Backspace 25 | 26 | Although not visible in command platte, these actions are implemented as 27 | commands so that you can reassign any key combinations to them. 28 | The table below shows all available commands and their default keybindings: 29 | 30 | | Command | Default Keybinding (except macOS) | Default keybinding (for macOS) | 31 | | ------------------------------------------------ | ------------------------------------------------- | --------------------------------------------------- | 32 | | `japaneseWordHandler.cursorWordEndLeft` | [*1] | [*1] | 33 | | `japaneseWordHandler.cursorWordEndLeftSelect` | [*1] | [*1] | 34 | | `japaneseWordHandler.cursorWordEndRight` | Ctrl+Right | Option+Right | 35 | | `japaneseWordHandler.cursorWordEndRightSelect` | Ctrl+Shift+Right | Option+Shift+Right | 36 | | `japaneseWordHandler.cursorWordStartLeft` | Ctrl+Left | Option+Left | 37 | | `japaneseWordHandler.cursorWordStartLeftSelect` | Ctrl+Shift+Left | Option+Shift+Left | 38 | | `japaneseWordHandler.cursorWordStartRight` | [*1] | [*1] | 39 | | `japaneseWordHandler.cursorWordStartRightSelect` | [*1] | [*1] | 40 | | `japaneseWordHandler.deleteWordEndLeft` | [*1] | [*1] | 41 | | `japaneseWordHandler.deleteWordEndRight` | Ctrl+Delete | Option+Delete | 42 | | `japaneseWordHandler.deleteWordStartLeft` | Ctrl+Backspace | Option+Backspace | 43 | | `japaneseWordHandler.deleteWordStartRight` | [*1] | [*1] | 44 | 45 | - [*1] Ctrl+Alt+Shift+9 is assigned 46 | for those commands so that they will appear in the Keyboard Shortcuts 47 | editor of VSCode. If you want to use those commands, please reassign 48 | other keybinding to them. 49 | 50 | ## What's the difference from the original? 51 | 52 | With the original logic, pressing Ctrl+Right while the 53 | cursor is at the beginning of a chunk of Japanese characters will move the 54 | cursor to the end of it. 55 | 56 | ![Original cursor movement](images/japanese-word-handler-vanilla.gif) 57 | 58 | With this extension, on the other hand, the cursor will stop at each place 59 | where the Japanese character type (Hiragana, Katakana, ...) changes. 60 | 61 | ![Improved cursor movement](images/japanese-word-handler.gif) 62 | 63 | ## Known limitations 64 | 65 | As of VSCode 1.37.0, extension cannot override word related actions below: 66 | 67 | - Word selection on double click 68 | - Automatic highlight of a word at where the cursor is 69 | - 'Match Whole Word' option of text search 70 | 71 | ## Issue report 72 | 73 | Please visit the 74 | [project's GitHub page](https://github.com/sgryjp/japanese-word-handler) 75 | and report it. 76 | 77 | **Enjoy!** 78 | -------------------------------------------------------------------------------- /DESIGN_NOTES.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Design Notes 4 | 5 | This is a personal memo. 6 | 7 | Note: Some not-so-popular Unicode characters are used. Recommended fonts to see 8 | this document are: 9 | 10 | - [Hack][hack] 11 | - [Fira Code][fira-code] 12 | - [Cascadia Code][cascadia-code] 13 | 14 | ## Symbols Used in This Document 15 | 16 | Through out this document, I use these symbols: 17 | 18 | | Symbol | Meaning | 19 | | ------ | -------------------------- | 20 | | `▮` | EOF | 21 | | `A` | Alphabets and numbers | 22 | | `.` | One of the "wordSeparator" | 23 | | `␣` | Whitespace | 24 | | `⏎` | End of line | 25 | 26 | Additionally, location of the cursor after executing a command is expressed by 27 | vertical bar (`|`) symbol in a sequence of symbols. For example, `A|.` means 28 | that assuming there is a sequence consisted with alphabets and numbers at the 29 | cursor location, and nothing follow the sequence (EOF), then a command which 30 | we are discussing moves the cursor just after the sequence. 31 | 32 | ## Japanese-Word-Handler 33 | 34 | - `cursorWordRight` 35 | 36 | - Procedure 37 | 1. If the cursor is at an end-of-document, return original position. 38 | 2. If the cursor is at an end-of-line, return position of the next line. 39 | 3. If the cursor is at WSP character(s), skip the WSP(s) starting with it. 40 | 4. If no characters exist after the WSPs, return the position. 41 | 5. If there is a non-WSP character after the WSPs, return end position of 42 | a non-WSP character sequence which starts with it. 43 | - Illustration: 44 | ```text 45 | |▮ A|▮ .|▮ ␣|▮ ⏎|▮ 46 | .|A ␣A|▮ ⏎|A 47 | ␣A|. 48 | ␣A|␣ 49 | ␣A|⏎ 50 | A|. ␣|. ⏎|. 51 | A|␣ .|␣ ⏎|␣ 52 | A|⏎ .|⏎ ␣|⏎ ⏎|⏎ 53 | ``` 54 | 55 | - `cursorWordStartRight` 56 | 57 | - Procedure 58 | 1. If the cursor is at an end-of-document, return original position. 59 | 2. If the cursor is at an end-of-line, return position of the next line. 60 | 3. Find ending position of a sequence starting with the character at 61 | cursor. Then, return position of where WSPs following the sequence end. 62 | - Illustration: 63 | ```text 64 | |▮ A|▮ .|▮ ␣|▮ ⏎|▮ 65 | .|A ␣|A ⏎|A 66 | A|. ␣|. ⏎|. 67 | A␣|▮ .␣|▮ ⏎|␣ 68 | A␣|A .␣|A 69 | A␣|. .␣|. 70 | A␣|⏎ .␣|⏎ 71 | A|⏎ .|⏎ ␣|⏎ ⏎|⏎ 72 | ``` 73 | 74 | - `cursorWordEndLeft` 75 | 76 | - Procedure: 77 | 1. If the cursor is at an start-of-document, return original position. 78 | 2. If the cursor is at an start-of-line, return end position of the 79 | previous line. 80 | 3. Find starting position of a sequence which ends at the cursor position. 81 | Then, return position of where WSPs preceding it starts. 82 | - Illustration: 83 | ```text 84 | ▮| ▮|A ▮|. ▮|␣ ▮|⏎ 85 | A|. A|␣ A|⏎ 86 | .|A .|␣ .|⏎ 87 | ▮|␣A ▮|␣. ␣|⏎ 88 | A|␣A A|␣. 89 | .|␣A .|␣. 90 | ⏎|␣A ⏎|␣. 91 | ⏎|A ⏎|. ⏎|␣ ⏎|⏎ 92 | ``` 93 | 94 | There logic can be implemented as finite state automaton but I feel doing so is 95 | "overkill". So, I implemented these in a form of imperative procedures. 96 | 97 | # Anatomy of Cursor Movement in Other Text Editors 98 | 99 | ## Visual Studio Code (v1.37.0) 100 | 101 | VSCode has two set of word by word cursor movement logics. First one is the 102 | logic used in most cases except for "word part" related actions. Another one is 103 | the logic for "word part" related actions. 104 | 105 | Commands of the second version have "part" in their name (e.g.: 106 | `cursorWordPartRight`) and they can recognize words inside a camelCasedWords 107 | or a sname_case_words. It seems that commands of this version are not affected 108 | by "wordSeparator" configuration. 109 | 110 | ### Non "word part" version 111 | 112 | - `cursorWordEndRight` 113 | 114 | ```text 115 | |▮ ⏎|▮ 116 | A|▮ ⏎A|▮ 117 | A|. ⏎A|. 118 | A|␣ ⏎A|␣ 119 | A|⏎ ⏎A|⏎ 120 | .|▮ ⏎.|▮ 121 | .|A ⏎.|A 122 | .|␣ ⏎.|␣ 123 | .|⏎ ⏎.|⏎ 124 | ␣|▮ ⏎␣|▮ 125 | ␣A|▮ ⏎␣A|▮ 126 | ␣A|. ⏎␣A|. 127 | ␣A|␣ ⏎␣A|␣ 128 | ␣A|⏎ ⏎␣A|⏎ 129 | ␣.|▮ ⏎␣.|▮ 130 | ␣.|A ⏎␣.|A 131 | ␣.|␣ ⏎␣.|␣ 132 | ␣.|⏎ ⏎␣.|⏎ 133 | ␣|⏎ ⏎␣|⏎ 134 | ⏎|⏎ 135 | ``` 136 | 137 | - `cursorWordStartRight` 138 | ```text 139 | |▮ A|▮ .|▮ ⏎|▮ 140 | .|A ⏎|A 141 | A|. ⏎|. 142 | A␣|▮ .␣|▮ ␣|▮ ⏎␣|▮ 143 | A␣|A .␣|A ␣|A ⏎␣|A 144 | A␣|. .␣|. ␣|. ⏎␣|. 145 | A␣|⏎ .␣|⏎ ␣|⏎ ⏎␣|⏎ 146 | A|⏎ .|⏎ ⏎|⏎ 147 | ``` 148 | 149 | ### Word part version 150 | 151 | Essentially the difference from this version of commands and default ones is 152 | that these can stop inside a sequence of alphabets if condition met. 153 | The conditions are: 154 | 155 | 1. Previous character is an underscore and the next is not an underscore 156 | (for snake_cased_words) 157 | 2. Previous character is a lower cased alphabet and the next is an uppercased 158 | alphabet (for camelCasedWords or PascalCasedWords) 159 | 3. Previous character is an upper cased alphabet, the next is an uppercased 160 | alphabet and the character next of the next is a lowercased alphabet 161 | (for all capital words inside a camelCASEDWords or a PascalCASEDWords) 162 | 163 | ## Vim (v8.1.1843) 164 | 165 | Vim separates words by character classification. 166 | 167 | On classifying a character, Vim firstly checks whether it is less than 0xFF 168 | or not. If so, it will be classified into a white space, punctuation, or 169 | "word character" which is specified by the configuration `iskeyword` 170 | (wordSeparator in VSCode.) If the character is greater than 0xFF, Vim 171 | classifies it under the basic rule as: white spaces are 0, punctuations are 1, 172 | emojis are 3, and others are equals to or greater than 2 (but not 3). 173 | Punctuation characters in various languages and known character set are defined 174 | in a table and resolved as 1 or code point value of the first character in the 175 | set. 176 | 177 | For example, unique class values are assigned for both Hiraganas and Katakanas 178 | so those are always separated from other character types. 179 | 180 | ### Reference 181 | 182 | - src/search.c 183 | - [`fwd_word()`](https://github.com/vim/vim/blob/v8.1.1843/src/search.c#L3050) 184 | - src/mbyte.c 185 | - [`utf_class()`](https://github.com/vim/vim/blob/v8.1.1843/src/mbyte.c#L2764) 186 | 187 | [hack]: https://sourcefoundry.org/hack/ 188 | [fira-code]: https://github.com/tonsky/FiraCode 189 | [cascadia-code]: https://github.com/microsoft/cascadia-code 190 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "japanese-word-handler", 3 | "displayName": "Japanese Word Handler", 4 | "description": "Better Japanese word handling on cursor movement", 5 | "version": "1.4.1", 6 | "publisher": "sgryjp", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/sgryjp/japanese-word-handler.git" 10 | }, 11 | "engines": { 12 | "vscode": "^1.94.0" 13 | }, 14 | "categories": [ 15 | "Other" 16 | ], 17 | "extensionKind": [ 18 | "ui", 19 | "workspace" 20 | ], 21 | "capabilities": { 22 | "untrustedWorkspaces": { 23 | "supported": true 24 | }, 25 | "virtualWorkspaces": true 26 | }, 27 | "license": "Zlib", 28 | "badges": [ 29 | { 30 | "url": "https://vsmarketplacebadge.apphb.com/rating-short/sgryjp.japanese-word-handler.svg", 31 | "href": "https://marketplace.visualstudio.com/items?itemName=sgryjp.japanese-word-handler", 32 | "description": "Rating (VS Marketplace)" 33 | }, 34 | { 35 | "url": "https://vsmarketplacebadge.apphb.com/installs-short/sgryjp.japanese-word-handler.svg", 36 | "href": "https://marketplace.visualstudio.com/items?itemName=sgryjp.japanese-word-handler", 37 | "description": "Number of installations (VS Marketplace)" 38 | }, 39 | { 40 | "url": "https://github.com/sgryjp/japanese-word-handler/actions/workflows/ci.yml/badge.svg", 41 | "href": "https://github.com/sgryjp/japanese-word-handler/actions/workflows/ci.yml", 42 | "description": "CI status" 43 | }, 44 | { 45 | "url": "https://img.shields.io/badge/license-zlib-lightgrey.svg?longCache=true&style=popout", 46 | "href": "https://github.com/sgryjp/japanese-word-handler/blob/master/LICENSE", 47 | "description": "zlib License" 48 | } 49 | ], 50 | "activationEvents": [ 51 | "onCommand:japaneseWordHandler.cursorWordEndLeft", 52 | "onCommand:japaneseWordHandler.cursorWordEndLeftSelect", 53 | "onCommand:japaneseWordHandler.cursorWordEndRight", 54 | "onCommand:japaneseWordHandler.cursorWordEndRightSelect", 55 | "onCommand:japaneseWordHandler.cursorWordStartLeft", 56 | "onCommand:japaneseWordHandler.cursorWordStartLeftSelect", 57 | "onCommand:japaneseWordHandler.cursorWordStartRight", 58 | "onCommand:japaneseWordHandler.cursorWordStartRightSelect", 59 | "onCommand:japaneseWordHandler.deleteWordEndLeft", 60 | "onCommand:japaneseWordHandler.deleteWordEndRight", 61 | "onCommand:japaneseWordHandler.deleteWordStartLeft", 62 | "onCommand:japaneseWordHandler.deleteWordStartRight", 63 | "onCommand:extension.cursorNextWordEndJa", 64 | "onCommand:extension.cursorNextWordEndSelectJa", 65 | "onCommand:extension.cursorPrevWordStartJa", 66 | "onCommand:extension.cursorPrevWordStartSelectJa", 67 | "onCommand:extension.deleteWordEndRight", 68 | "onCommand:extension.deleteWordStartLeft" 69 | ], 70 | "main": "./dist/web/extension.js", 71 | "browser": "./dist/web/extension.js", 72 | "contributes": { 73 | "keybindings": [ 74 | { 75 | "command": "japaneseWordHandler.cursorWordEndLeft", 76 | "key": "ctrl+alt+shift+9", 77 | "when": "editorTextFocus" 78 | }, 79 | { 80 | "command": "japaneseWordHandler.cursorWordEndLeftSelect", 81 | "key": "ctrl+alt+shift+9", 82 | "when": "editorTextFocus" 83 | }, 84 | { 85 | "command": "japaneseWordHandler.cursorWordEndRight", 86 | "key": "ctrl+right", 87 | "mac": "alt+right", 88 | "when": "editorTextFocus" 89 | }, 90 | { 91 | "command": "japaneseWordHandler.cursorWordEndRightSelect", 92 | "key": "ctrl+shift+right", 93 | "mac": "alt+shift+right", 94 | "when": "editorTextFocus" 95 | }, 96 | { 97 | "command": "japaneseWordHandler.cursorWordStartLeft", 98 | "key": "ctrl+left", 99 | "mac": "alt+left", 100 | "when": "editorTextFocus" 101 | }, 102 | { 103 | "command": "japaneseWordHandler.cursorWordStartLeftSelect", 104 | "key": "ctrl+shift+left", 105 | "mac": "alt+shift+left", 106 | "when": "editorTextFocus" 107 | }, 108 | { 109 | "command": "japaneseWordHandler.cursorWordStartRight", 110 | "key": "ctrl+alt+shift+9", 111 | "when": "editorTextFocus" 112 | }, 113 | { 114 | "command": "japaneseWordHandler.cursorWordStartRightSelect", 115 | "key": "ctrl+alt+shift+9", 116 | "when": "editorTextFocus" 117 | }, 118 | { 119 | "command": "japaneseWordHandler.deleteWordEndLeft", 120 | "key": "ctrl+alt+shift+9", 121 | "when": "editorTextFocus && !editorReadonly" 122 | }, 123 | { 124 | "command": "japaneseWordHandler.deleteWordEndRight", 125 | "key": "ctrl+delete", 126 | "mac": "alt+delete", 127 | "when": "editorTextFocus && !editorReadonly" 128 | }, 129 | { 130 | "command": "japaneseWordHandler.deleteWordStartLeft", 131 | "key": "ctrl+backspace", 132 | "mac": "alt+backspace", 133 | "when": "editorTextFocus && !editorReadonly" 134 | }, 135 | { 136 | "command": "japaneseWordHandler.deleteWordStartRight", 137 | "key": "ctrl+alt+shift+9", 138 | "when": "editorTextFocus && !editorReadonly" 139 | } 140 | ] 141 | }, 142 | "scripts": { 143 | "check-types": "tsc --noEmit", 144 | "compile-web": "pnpm run check-types && pnpm run lint && node esbuild.js", 145 | "lint": "eslint src", 146 | "package-web": "pnpm run check-types && pnpm run lint && node esbuild.js --production", 147 | "pretest": "pnpm run compile-web", 148 | "run-in-browser": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. .", 149 | "test": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. --extensionTestsPath=dist/web/test/suite/extensionTests.js", 150 | "vscode:prepublish": "pnpm run package-web", 151 | "watch-web:esbuild": "node esbuild.js --watch", 152 | "watch-web:tsc": "tsc --noEmit --watch --project tsconfig.json", 153 | "watch-web": "npm-run-all -p watch-web:*" 154 | }, 155 | "devDependencies": { 156 | "@esbuild-plugins/node-globals-polyfill": "^0.2.3", 157 | "@types/assert": "^1.5.10", 158 | "@types/mocha": "^10.0.8", 159 | "@types/vscode": "^1.94.0", 160 | "@typescript-eslint/eslint-plugin": "^8.7.0", 161 | "@typescript-eslint/parser": "^8.7.0", 162 | "@vscode/test-web": "^0.0.61", 163 | "assert": "^2.1.0", 164 | "esbuild": "^0.24.0", 165 | "eslint": "^9.11.1", 166 | "glob": "^11.0.0", 167 | "mocha": "^10.7.3", 168 | "npm-run-all": "^4.1.5", 169 | "playwright": "^1.51.1", 170 | "process": "^0.11.10", 171 | "typescript": "^5.6.2" 172 | }, 173 | "pnpm": { 174 | "overrides": { 175 | "cross-spawn@<6.0.6": ">=6.0.6", 176 | "cross-spawn@>=7.0.0 <7.0.5": ">=7.0.5", 177 | "@eslint/plugin-kit@<0.2.3": ">=0.2.3", 178 | "koa@>=2.0.0 <2.15.4": ">=2.15.4", 179 | "esbuild@<=0.24.2": ">=0.25.0", 180 | "tar-fs@>=3.0.0 <3.0.7": ">=3.0.8", 181 | "koa@<2.16.1": ">=2.16.1", 182 | "tar-fs@>=3.0.0 <3.0.9": ">=3.0.9", 183 | "brace-expansion@>=1.0.0 <=1.1.11": ">=1.1.12", 184 | "brace-expansion@>=2.0.0 <=2.0.1": ">=2.0.2", 185 | "@eslint/plugin-kit@<0.3.4": ">=0.3.4", 186 | "koa@>=2.0.0 <2.16.2": ">=2.16.2", 187 | "on-headers@<1.1.0": ">=1.1.0" 188 | } 189 | } 190 | } 191 | -------------------------------------------------------------------------------- /src/web/extension.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | import * as vscode from "vscode"; 4 | import { Position, Range, Selection, TextDocument, TextEditor } from "vscode"; 5 | 6 | //----------------------------------------------------------------------------- 7 | export function activate(context: vscode.ExtensionContext) { 8 | function registerCommand(name: string, logic: Function) { 9 | let command = vscode.commands.registerCommand(name, () => { 10 | let editor = vscode.window.activeTextEditor!; 11 | let wordSeparators = vscode.workspace 12 | .getConfiguration("editor", editor.document.uri) 13 | .get("wordSeparators"); 14 | logic(editor, wordSeparators); 15 | }); 16 | context.subscriptions.push(command); 17 | } 18 | 19 | // Register commands 20 | registerCommand("japaneseWordHandler.cursorWordEndLeft", cursorWordEndLeft); 21 | registerCommand( 22 | "japaneseWordHandler.cursorWordEndLeftSelect", 23 | cursorWordEndLeftSelect, 24 | ); 25 | registerCommand("japaneseWordHandler.cursorWordEndRight", cursorWordEndRight); 26 | registerCommand( 27 | "japaneseWordHandler.cursorWordEndRightSelect", 28 | cursorWordEndRightSelect, 29 | ); 30 | registerCommand( 31 | "japaneseWordHandler.cursorWordStartLeft", 32 | cursorWordStartLeft, 33 | ); 34 | registerCommand( 35 | "japaneseWordHandler.cursorWordStartLeftSelect", 36 | cursorWordStartLeftSelect, 37 | ); 38 | registerCommand( 39 | "japaneseWordHandler.cursorWordStartRight", 40 | cursorWordStartRight, 41 | ); 42 | registerCommand( 43 | "japaneseWordHandler.cursorWordStartRightSelect", 44 | cursorWordStartRightSelect, 45 | ); 46 | registerCommand("japaneseWordHandler.deleteWordEndLeft", deleteWordEndLeft); 47 | registerCommand("japaneseWordHandler.deleteWordEndRight", deleteWordEndRight); 48 | registerCommand( 49 | "japaneseWordHandler.deleteWordStartLeft", 50 | deleteWordStartLeft, 51 | ); 52 | registerCommand( 53 | "japaneseWordHandler.deleteWordStartRight", 54 | deleteWordStartRight, 55 | ); 56 | 57 | // Register legacy commands for compatibility 58 | registerCommand("extension.cursorWordEndRight", cursorWordEndRight); 59 | registerCommand( 60 | "extension.cursorWordEndRightSelect", 61 | cursorWordEndRightSelect, 62 | ); 63 | registerCommand("extension.cursorWordStartLeft", cursorWordStartLeft); 64 | registerCommand( 65 | "extension.cursorWordStartLeftSelect", 66 | cursorWordStartLeftSelect, 67 | ); 68 | registerCommand("extension.deleteWordRight", deleteWordEndRight); 69 | registerCommand("extension.deleteWordLeft", deleteWordStartLeft); 70 | } 71 | 72 | //----------------------------------------------------------------------------- 73 | function _move(editor: TextEditor, wordSeparators: string, find: Function) { 74 | const document = editor.document; 75 | editor.selections = editor.selections 76 | .map((s) => find(document, s.active, wordSeparators)) 77 | .map((p) => new Selection(p, p)); 78 | if (editor.selections.length === 1) { 79 | editor.revealRange(editor.selection); 80 | } 81 | } 82 | 83 | function _select(editor: TextEditor, wordSeparators: string, find: Function) { 84 | editor.selections = editor.selections.map( 85 | (s) => 86 | new Selection(s.anchor, find(editor.document, s.active, wordSeparators)), 87 | ); 88 | if (editor.selections.length === 1) { 89 | editor.revealRange(editor.selection); 90 | } 91 | } 92 | 93 | function _delete(editor: TextEditor, wordSeparators: string, find: Function) { 94 | return editor 95 | .edit((e) => { 96 | const document = editor.document; 97 | let selections = editor.selections.map( 98 | (s) => 99 | new Selection(s.anchor, find(document, s.active, wordSeparators)), 100 | ); 101 | for (let selection of selections) { 102 | e.delete(selection); 103 | } 104 | }) 105 | .then(() => { 106 | if (editor.selections.length === 1) { 107 | editor.revealRange(editor.selection); 108 | } 109 | }); 110 | } 111 | 112 | export function cursorWordEndLeft(editor: TextEditor, wordSeparators: string) { 113 | _move(editor, wordSeparators, findPreviousWordEnd); 114 | } 115 | 116 | export function cursorWordEndLeftSelect( 117 | editor: TextEditor, 118 | wordSeparators: string, 119 | ) { 120 | _select(editor, wordSeparators, findPreviousWordEnd); 121 | } 122 | 123 | export function cursorWordEndRight(editor: TextEditor, wordSeparators: string) { 124 | _move(editor, wordSeparators, findNextWordEnd); 125 | } 126 | 127 | export function cursorWordEndRightSelect( 128 | editor: TextEditor, 129 | wordSeparators: string, 130 | ) { 131 | _select(editor, wordSeparators, findNextWordEnd); 132 | } 133 | 134 | export function cursorWordStartLeft( 135 | editor: TextEditor, 136 | wordSeparators: string, 137 | ) { 138 | _move(editor, wordSeparators, findPreviousWordStart); 139 | } 140 | 141 | export function cursorWordStartLeftSelect( 142 | editor: TextEditor, 143 | wordSeparators: string, 144 | ) { 145 | _select(editor, wordSeparators, findPreviousWordStart); 146 | } 147 | 148 | export function cursorWordStartRight( 149 | editor: TextEditor, 150 | wordSeparators: string, 151 | ) { 152 | _move(editor, wordSeparators, findNextWordStart); 153 | } 154 | 155 | export function cursorWordStartRightSelect( 156 | editor: TextEditor, 157 | wordSeparators: string, 158 | ) { 159 | _select(editor, wordSeparators, findNextWordStart); 160 | } 161 | 162 | export function deleteWordEndLeft(editor: TextEditor, wordSeparators: string) { 163 | return _delete(editor, wordSeparators, findPreviousWordEnd); 164 | } 165 | 166 | export function deleteWordEndRight(editor: TextEditor, wordSeparators: string) { 167 | return _delete(editor, wordSeparators, findNextWordEnd); 168 | } 169 | 170 | export function deleteWordStartLeft( 171 | editor: TextEditor, 172 | wordSeparators: string, 173 | ) { 174 | return _delete(editor, wordSeparators, findPreviousWordStart); 175 | } 176 | 177 | export function deleteWordStartRight( 178 | editor: TextEditor, 179 | wordSeparators: string, 180 | ) { 181 | return _delete(editor, wordSeparators, findNextWordStart); 182 | } 183 | 184 | //----------------------------------------------------------------------------- 185 | enum CharClass { 186 | Alnum, 187 | Whitespace, 188 | Punctuation, 189 | Hiragana, 190 | Katakana, 191 | Other, 192 | Separator, 193 | Invalid, 194 | } 195 | 196 | /** 197 | * Gets position of the start of a word after specified position. 198 | */ 199 | function findNextWordStart( 200 | doc: TextDocument, 201 | caretPos: Position, 202 | wordSeparators: string, 203 | ): Position { 204 | // If the cursor is at an end-of-document, return original position. 205 | // If the cursor is at an end-of-line, return position of the next line. 206 | // Find ending position of a sequence starting with the character at 207 | // cursor. Then, return position of where WSPs following the sequence end. 208 | 209 | const classify = makeClassifier(wordSeparators); 210 | 211 | // Check if it's already at end-of-line or end-of-document 212 | let klass = classify(doc, caretPos.line, caretPos.character); 213 | if (klass === CharClass.Invalid) { 214 | const nextLine = caretPos.line + 1; 215 | return nextLine < doc.lineCount 216 | ? new Position(nextLine, 0) // end-of-line 217 | : caretPos; // end-of-document 218 | } 219 | 220 | // Seek until character type changes, unless already reached EOL/EOD 221 | let pos = caretPos; 222 | klass = classify(doc, pos.line, pos.character); 223 | if (classify(doc, pos.line, pos.character) !== CharClass.Invalid) { 224 | do { 225 | pos = new Position(pos.line, pos.character + 1); 226 | } while (klass === classify(doc, pos.line, pos.character)); 227 | } 228 | 229 | // Skip a series of whitespaces 230 | while (classify(doc, pos.line, pos.character) === CharClass.Whitespace) { 231 | pos = new Position(pos.line, pos.character + 1); 232 | } 233 | 234 | return pos; 235 | } 236 | 237 | /** 238 | * Gets position of the end of a word after specified position. 239 | */ 240 | function findNextWordEnd( 241 | doc: TextDocument, 242 | caretPos: Position, 243 | wordSeparators: string, 244 | ): Position { 245 | // If the cursor is at an end-of-document, return original position. 246 | // If the cursor is at an end-of-line, return position of the next line. 247 | // If the cursor is at WSP character(s), skip the WSP(s) starting with it. 248 | // If no characters exist after the WSPs, return the position. 249 | // If there is a non-WSP character after the WSPs, return end position of 250 | // a non-WSP character sequence which starts with it. 251 | 252 | const classify = makeClassifier(wordSeparators); 253 | 254 | // Check if it's already at end-of-line or end-of-document 255 | let klass = classify(doc, caretPos.line, caretPos.character); 256 | if (klass === CharClass.Invalid) { 257 | const nextLine = caretPos.line + 1; 258 | return nextLine < doc.lineCount 259 | ? new Position(nextLine, 0) // end-of-line 260 | : caretPos; // end-of-document 261 | } 262 | 263 | // Skip a series of whitespaces 264 | let pos = caretPos; 265 | if (klass === CharClass.Whitespace) { 266 | do { 267 | pos = new Position(pos.line, pos.character + 1); 268 | } while (classify(doc, pos.line, pos.character) === CharClass.Whitespace); 269 | } 270 | 271 | // Seek until character type changes, unless already reached EOL/EOD 272 | klass = classify(doc, pos.line, pos.character); 273 | if (classify(doc, pos.line, pos.character) !== CharClass.Invalid) { 274 | do { 275 | pos = new Position(pos.line, pos.character + 1); 276 | } while (klass === classify(doc, pos.line, pos.character)); 277 | } 278 | 279 | return pos; 280 | } 281 | 282 | /** 283 | * Gets position of the word before specified position. 284 | */ 285 | function findPreviousWordStart( 286 | doc: TextDocument, 287 | caretPos: Position, 288 | wordSeparators: string, 289 | ) { 290 | // Brief spec of this function: 291 | // - Firstly, skips a sequence of WSPs, if there is. 292 | // - If reached start of a line, quit there. 293 | // - Secondly, seek backward until: 294 | // 1. character type changes, or 295 | // 2. reaches start of a line. 296 | 297 | const classify = makeClassifier(wordSeparators); 298 | 299 | // Firstly skip whitespaces, excluding EOL codes. 300 | function prevCharIsWhitespace() { 301 | let prevPos = doc.positionAt(doc.offsetAt(pos) - 1); 302 | return ( 303 | classify(doc, prevPos.line, prevPos.character) === CharClass.Whitespace 304 | ); 305 | } 306 | let pos = caretPos; 307 | while (prevCharIsWhitespace()) { 308 | // Intentionally avoiding to use doc.positionAt(doc.offsetAt()) 309 | // so that the seek stops at the EOL. 310 | if (pos.character <= 0) { 311 | return doc.positionAt(doc.offsetAt(pos) - 1); 312 | } 313 | pos = new Position(pos.line, pos.character - 1); 314 | } 315 | 316 | // Then, seek until the character type changes. 317 | pos = doc.positionAt(doc.offsetAt(pos) - 1); 318 | const initKlass = classify(doc, pos.line, pos.character); 319 | let prevPos = doc.positionAt(doc.offsetAt(pos) - 1); 320 | while (prevPos.isBefore(pos)) { 321 | if (initKlass !== classify(doc, prevPos.line, prevPos.character)) { 322 | break; 323 | } 324 | 325 | pos = prevPos; 326 | prevPos = doc.positionAt(doc.offsetAt(pos) - 1); 327 | } 328 | 329 | return pos; 330 | } 331 | 332 | /** 333 | * Gets position of where a word before specified position ends. 334 | */ 335 | function findPreviousWordEnd( 336 | doc: TextDocument, 337 | caretPos: Position, 338 | wordSeparators: string, 339 | ) { 340 | const classify = makeClassifier(wordSeparators); 341 | 342 | let pos = caretPos; 343 | if (pos.character === 0) { 344 | if (pos.line === 0) { 345 | return pos; // start of document 346 | } else { 347 | return doc.positionAt(doc.offsetAt(pos) - 1); // start of a line 348 | } 349 | } 350 | //assert 0 < pos.character 351 | 352 | // Seek until character type changes, unless already reached EOL/EOD 353 | let klass: CharClass; 354 | let initKlass = classify(doc, pos.line, pos.character - 1); 355 | do { 356 | pos = new Position(pos.line, pos.character - 1); 357 | klass = classify(doc, pos.line, pos.character - 1); 358 | } while (klass === initKlass); 359 | 360 | if (klass === CharClass.Whitespace) { 361 | do { 362 | pos = new Position(pos.line, pos.character - 1); 363 | klass = classify(doc, pos.line, pos.character - 1); 364 | } while (klass === CharClass.Whitespace); 365 | } 366 | 367 | return pos; 368 | } 369 | 370 | /** 371 | * Compose a character classifier function. 372 | * @param wordSeparators A string containing characters to separate words 373 | * (mostly used in English-like language context.) 374 | */ 375 | function makeClassifier(wordSeparators: string) { 376 | return function classifyChar( 377 | doc: TextDocument, 378 | line: number, 379 | character: number, 380 | ) { 381 | if (line < 0 || character < 0) { 382 | return CharClass.Invalid; 383 | } 384 | 385 | const range = new Range(line, character, line, character + 1); 386 | const text = doc.getText(range); 387 | if (text.length === 0) { 388 | return CharClass.Invalid; // end-of-line or end-of-document 389 | } 390 | const ch = text.charCodeAt(0); 391 | 392 | if (wordSeparators.indexOf(text) !== -1) { 393 | return CharClass.Separator; 394 | } 395 | 396 | if ((0x09 <= ch && ch <= 0x0d) || ch === 0x20 || ch === 0x3000) { 397 | return CharClass.Whitespace; 398 | } 399 | 400 | if ( 401 | (0x30 <= ch && ch <= 0x39) || // halfwidth digit 402 | (0xff10 <= ch && ch <= 0xff19) || // fullwidth digit 403 | (0x41 <= ch && ch <= 0x5a) || // halfwidth alphabet, upper case 404 | ch === 0x5f || // underscore 405 | (0x61 <= ch && ch <= 0x7a) || // halfwidth alphabet, lower case 406 | (0xc0 <= ch && 407 | ch <= 0xff && // latin character 408 | ch !== 0xd7 && 409 | ch !== 0xf7) || // (excluding multiplication/division sign) 410 | (0xff21 <= ch && ch <= 0xff3a) || // fullwidth alphabet, upper case 411 | ch === 0xff3f || // fullwidth underscore 412 | (0xff41 <= ch && ch <= 0xff5a) 413 | ) { 414 | // fullwidth alphabet, lower case 415 | return CharClass.Alnum; 416 | } 417 | 418 | if ( 419 | (0x21 <= ch && ch <= 0x2f) || 420 | (0x3a <= ch && ch <= 0x40) || 421 | (0x5b <= ch && ch <= 0x60) || 422 | (0x7b <= ch && ch <= 0x7f) || 423 | (0x3001 <= ch && ch <= 0x303f && ch !== 0x3005) || // CJK punctuation marks except Ideographic iteration mark 424 | ch === 0x30fb || // Katakana middle dot 425 | (0xff01 <= ch && ch <= 0xff0f) || // "Full width" forms (1) 426 | (0xff1a <= ch && ch <= 0xff20) || // "Full width" forms (2) 427 | (0xff3b <= ch && ch <= 0xff40) || // "Full width" forms (3) 428 | (0xff5b <= ch && ch <= 0xff65) || // "Full width" forms (4) 429 | (0xffe0 <= ch && ch <= 0xffee) 430 | ) { 431 | // "Full width" forms (5) 432 | return CharClass.Punctuation; 433 | } 434 | 435 | if ( 436 | 0x30a0 <= ch && 437 | ch <= 0x30ff && // fullwidth katakana 438 | ch !== 0x30fb 439 | ) { 440 | // excluding katakana middle dot 441 | return CharClass.Katakana; 442 | } 443 | 444 | if (0x3041 <= ch && ch <= 0x309f) { 445 | // fullwidth hiragana 446 | return CharClass.Hiragana; 447 | } 448 | 449 | if (0xff66 <= ch && ch <= 0xff9d) { 450 | // halfwidth katakana 451 | return CharClass.Katakana; 452 | } 453 | 454 | return CharClass.Other; 455 | }; 456 | } 457 | -------------------------------------------------------------------------------- /src/web/test/suite/extension.test.ts: -------------------------------------------------------------------------------- 1 | // Note: This test is leveraging the Mocha test framework (https://mochajs.org/) 2 | 3 | import * as assert from "assert"; 4 | 5 | // You can import and use all API from the 'vscode' module 6 | // as well as import your extension to test it 7 | import * as vscode from "vscode"; 8 | import { 9 | EndOfLine, 10 | Position, 11 | Range, 12 | Selection, 13 | TextEditor, 14 | TextEditorEdit, 15 | } from "vscode"; 16 | 17 | import * as myExtension from "../../extension"; 18 | 19 | suite("japanese-word-handler", function () { 20 | this.timeout(10000); // Increase timeout 21 | 22 | // Prepare utility functions and constants 23 | const setText = async function (editor: TextEditor, text: string) { 24 | return editor.edit((editBuilder: TextEditorEdit) => { 25 | const doc = editor.document; 26 | const startPos = new Position(0, 0); 27 | const lastLine = doc.lineAt(doc.lineCount - 1); 28 | const endPos = lastLine.range.end; 29 | const entireRange = new Range(startPos, endPos); 30 | editBuilder.replace(entireRange, text); 31 | editBuilder.setEndOfLine(EndOfLine.LF); 32 | }); 33 | }; 34 | 35 | suiteSetup(async () => { 36 | const doc = await vscode.workspace.openTextDocument({ 37 | language: "Plain Text", 38 | content: "", 39 | }); 40 | await vscode.window.showTextDocument(doc); 41 | }); 42 | 43 | suiteTeardown(async () => { 44 | const commandName = "workbench.action.closeAllEditors"; 45 | await vscode.commands.executeCommand(commandName); 46 | }); 47 | 48 | suite("cursorWordEndLeft", () => { 49 | const doMine = async function ( 50 | editor: TextEditor, 51 | wordSeparators: string, 52 | content: string, 53 | ) { 54 | await setText(editor, content); 55 | const initPos = editor.document.positionAt(content.length); 56 | editor.selections = [new Selection(initPos, initPos)]; 57 | await myExtension.cursorWordEndLeft(editor, wordSeparators); 58 | return editor.document.offsetAt(editor.selection.start); 59 | }; 60 | 61 | const doTheirs = async function (editor: TextEditor, content: string) { 62 | await setText(editor, content); 63 | const initPos = editor.document.positionAt(content.length); 64 | editor.selections = [new Selection(initPos, initPos)]; 65 | await vscode.commands.executeCommand("cursorWordEndLeft"); 66 | return editor.document.offsetAt(editor.selection.start); 67 | }; 68 | 69 | [ 70 | { name: " .", input: "", expected: 0, compatible: true }, 71 | 72 | { name: " .A", input: "aa", expected: 0, compatible: true }, 73 | { name: " HA", input: "あaa", expected: 1, compatible: false }, 74 | { name: " KA", input: "アaa", expected: 1, compatible: false }, 75 | { name: " JA", input: "亜aa", expected: 1, compatible: false }, 76 | { name: ".SA", input: " aa", expected: 0, compatible: true }, 77 | { name: "ASA", input: "a aa", expected: 1, compatible: true }, 78 | { name: "HSA", input: "あ aa", expected: 1, compatible: true }, 79 | { name: "LSA", input: "\n aa", expected: 1, compatible: true }, 80 | { name: " LA", input: "\naa", expected: 1, compatible: true }, 81 | 82 | { name: " .H", input: "ああ", expected: 0, compatible: true }, 83 | { name: " AH", input: "aああ", expected: 1, compatible: false }, 84 | { name: " KH", input: "アああ", expected: 1, compatible: false }, 85 | { name: " JH", input: "亜ああ", expected: 1, compatible: false }, 86 | { name: ".SH", input: " ああ", expected: 0, compatible: true }, 87 | { name: "ASH", input: "a ああ", expected: 1, compatible: true }, 88 | { name: "HSH", input: "あ ああ", expected: 1, compatible: true }, 89 | { name: "LSH", input: "\n ああ", expected: 1, compatible: true }, 90 | { name: " LH", input: "\nああ", expected: 1, compatible: true }, 91 | 92 | { name: " .K", input: "アア", expected: 0, compatible: true }, 93 | { name: " AK", input: "aアア", expected: 1, compatible: false }, 94 | { name: " HK", input: "あアア", expected: 1, compatible: false }, 95 | { name: " JK", input: "亜アア", expected: 1, compatible: false }, 96 | { name: ".SK", input: " アア", expected: 0, compatible: true }, 97 | { name: "ASK", input: "a アア", expected: 1, compatible: true }, 98 | { name: "HSK", input: "あ アア", expected: 1, compatible: true }, 99 | { name: "LSK", input: "\n アア", expected: 1, compatible: true }, 100 | { name: " LK", input: "\nアア", expected: 1, compatible: true }, 101 | 102 | { name: " .J", input: "亜亜", expected: 0, compatible: true }, 103 | { name: " AJ", input: "a亜亜", expected: 1, compatible: false }, 104 | { name: " HJ", input: "あ亜亜", expected: 1, compatible: false }, 105 | { name: " KJ", input: "ア亜亜", expected: 1, compatible: false }, 106 | { name: ".SJ", input: " 亜亜", expected: 0, compatible: true }, 107 | { name: "ASJ", input: "a 亜亜", expected: 1, compatible: true }, 108 | { name: "HSJ", input: "あ 亜亜", expected: 1, compatible: true }, 109 | { name: "LSJ", input: "\n 亜亜", expected: 1, compatible: true }, 110 | { name: " LJ", input: "\n亜亜", expected: 1, compatible: true }, 111 | 112 | { name: ".S", input: " ", expected: 0, compatible: true }, 113 | { name: "AS", input: "aa ", expected: 2, compatible: true }, 114 | { name: "HS", input: "ああ ", expected: 2, compatible: true }, 115 | { name: "KS", input: "アア ", expected: 2, compatible: true }, 116 | { name: "JS", input: "亜亜 ", expected: 2, compatible: true }, 117 | { name: "LS", input: "\n ", expected: 1, compatible: true }, 118 | 119 | { name: ".L", input: "\n", expected: 0, compatible: true }, 120 | { name: "AL", input: "a\n", expected: 1, compatible: false }, //TODO: should be compatible 121 | { name: "HL", input: "あ\n", expected: 1, compatible: false }, 122 | { name: "KL", input: "ア\n", expected: 1, compatible: false }, 123 | { name: "JL", input: "亜\n", expected: 1, compatible: false }, 124 | { name: "SL", input: " \n", expected: 1, compatible: false }, //TODO: should be compatible 125 | { name: "LL", input: "\n\n", expected: 1, compatible: true }, 126 | ].forEach((t) => { 127 | test(t.name, async () => { 128 | const editor = vscode.window.activeTextEditor!; 129 | const mine = await doMine(editor, "", t.input); 130 | if (mine !== t.expected) { 131 | assert.fail( 132 | "Unexpected result: {" + 133 | escape`input: "${t.input}", ` + 134 | escape`expected: "${t.expected}", ` + 135 | escape`got: "${mine}"}`, 136 | ); 137 | } 138 | if (t.compatible) { 139 | const theirs = await doTheirs(editor, t.input); 140 | if (mine !== theirs) { 141 | assert.fail( 142 | "Incompatible behavior: {" + 143 | escape`input: "${t.input}", ` + 144 | escape`mine: "${mine}", ` + 145 | escape`theirs: "${theirs}"}`, 146 | ); 147 | } 148 | } 149 | }); 150 | }); 151 | }); 152 | 153 | suite("cursorWordEndRight", () => { 154 | const testSingleCursorMotion = async function ( 155 | editor: TextEditor, 156 | wordSeparators: string, 157 | content: string, 158 | ) { 159 | await setText(editor, content); 160 | const initPos = new Position(0, 0); 161 | editor.selections = [new Selection(initPos, initPos)]; 162 | myExtension.cursorWordEndRight(editor, wordSeparators); 163 | return editor.selection.active; 164 | }; 165 | 166 | test("motion: starting from end-of-document", async () => { 167 | const editor = vscode.window.activeTextEditor!; 168 | const cursorPos = await testSingleCursorMotion(editor, "", ""); 169 | assert.equal(cursorPos.line, 0); 170 | assert.equal(cursorPos.character, 0); 171 | }); 172 | 173 | test("motion: starting from end-of-line", async () => { 174 | const editor = vscode.window.activeTextEditor!; 175 | const cursorPos = await testSingleCursorMotion(editor, "", "\n"); 176 | assert.equal(cursorPos.line, 1); 177 | assert.equal(cursorPos.character, 0); 178 | }); 179 | 180 | test("motion: should skip a WSP at cursor", async () => { 181 | const editor = vscode.window.activeTextEditor!; 182 | const cursorPos = await testSingleCursorMotion(editor, "", " Foo"); 183 | assert.equal(cursorPos.line, 0); 184 | assert.equal(cursorPos.character, 4); 185 | }); 186 | 187 | test("motion: should skip multiple WSPs at cursor", async () => { 188 | const editor = vscode.window.activeTextEditor!; 189 | const cursorPos = await testSingleCursorMotion(editor, "", " \t Foo"); 190 | assert.equal(cursorPos.line, 0); 191 | assert.equal(cursorPos.character, 6); 192 | }); 193 | 194 | test("motion: should stop at end-of-document after skipping WSPs", async () => { 195 | const editor = vscode.window.activeTextEditor!; 196 | const cursorPos = await testSingleCursorMotion(editor, "", " "); 197 | assert.equal(cursorPos.line, 0); 198 | assert.equal(cursorPos.character, 1); 199 | }); 200 | 201 | test("motion: should stop at beginning of a line just after an EOL", async () => { 202 | const editor = vscode.window.activeTextEditor!; 203 | const cursorPos = await testSingleCursorMotion(editor, "", "\norange"); 204 | assert.equal(cursorPos.line, 1); 205 | assert.equal(cursorPos.character, 0); 206 | }); 207 | 208 | test("motion: should skip only the first EOL in a series of EOLs", async () => { 209 | const editor = vscode.window.activeTextEditor!; 210 | const cursorPos = await testSingleCursorMotion(editor, "", "\n\norange"); 211 | assert.equal(cursorPos.line, 1); 212 | assert.equal(cursorPos.character, 0); 213 | }); 214 | 215 | test("motion: should stop on char-class change (alnum -> punctuation)", async () => { 216 | const editor = vscode.window.activeTextEditor!; 217 | const cursorPos = await testSingleCursorMotion(editor, "", "HbA1c。"); 218 | assert.equal(cursorPos.line, 0); 219 | assert.equal(cursorPos.character, 5); 220 | }); 221 | 222 | test("motion: should stop on char-class change (alnum -> hiragana)", async () => { 223 | const editor = vscode.window.activeTextEditor!; 224 | const cursorPos = await testSingleCursorMotion(editor, "", "HbA1cかな"); 225 | assert.equal(cursorPos.line, 0); 226 | assert.equal(cursorPos.character, 5); 227 | }); 228 | 229 | test("motion: should stop on char-class change (hiragana -> katakana)", async () => { 230 | const editor = vscode.window.activeTextEditor!; 231 | const cursorPos = await testSingleCursorMotion(editor, "", "かなカナ"); 232 | assert.equal(cursorPos.line, 0); 233 | assert.equal(cursorPos.character, 2); 234 | }); 235 | 236 | test("motion: should stop on char-class change (katakana -> other)", async () => { 237 | const editor = vscode.window.activeTextEditor!; 238 | const cursorPos = await testSingleCursorMotion(editor, "", "カナ漢字"); 239 | assert.equal(cursorPos.line, 0); 240 | assert.equal(cursorPos.character, 2); 241 | }); 242 | 243 | test("motion: should stop on char-class change (other -> WSP)", async () => { 244 | const editor = vscode.window.activeTextEditor!; 245 | const cursorPos = await testSingleCursorMotion(editor, "", "漢字\t "); 246 | assert.equal(cursorPos.line, 0); 247 | assert.equal(cursorPos.character, 2); 248 | }); 249 | 250 | test("motion: should stop at end-of-line", async () => { 251 | const editor = vscode.window.activeTextEditor!; 252 | const cursorPos = await testSingleCursorMotion( 253 | editor, 254 | "", 255 | "apple\norange", 256 | ); 257 | assert.equal(cursorPos.line, 0); 258 | assert.equal(cursorPos.character, 5); 259 | }); 260 | 261 | test("motion: should stop at end-of-document", async () => { 262 | const editor = vscode.window.activeTextEditor!; 263 | const cursorPos = await testSingleCursorMotion(editor, "", "apple"); 264 | assert.equal(cursorPos.line, 0); 265 | assert.equal(cursorPos.character, 5); 266 | }); 267 | }); 268 | 269 | suite("cursorWordStartLeft", () => { 270 | const testSingleCursorMotion = async function ( 271 | editor: TextEditor, 272 | wordSeparators: string, 273 | content: string, 274 | ) { 275 | await setText(editor, content); 276 | const initPos = editor.document.positionAt(content.length * 2); // LFs may become CRLFs 277 | editor.selections = [new Selection(initPos, initPos)]; 278 | myExtension.cursorWordStartLeft(editor, wordSeparators); 279 | return editor.selection.active; 280 | }; 281 | 282 | test("motion: starting from start-of-document", async () => { 283 | const editor = vscode.window.activeTextEditor!; 284 | const cursorPos = await testSingleCursorMotion(editor, "", ""); 285 | assert.equal(cursorPos.line, 0); 286 | assert.equal(cursorPos.character, 0); 287 | }); 288 | 289 | test("motion: starting from start-of-line", async () => { 290 | const editor = vscode.window.activeTextEditor!; 291 | const cursorPos = await testSingleCursorMotion(editor, "", "\n"); 292 | assert.equal(cursorPos.line, 0); 293 | assert.equal(cursorPos.character, 0); 294 | }); 295 | 296 | test("motion: should skips a WSP", async () => { 297 | const editor = vscode.window.activeTextEditor!; 298 | const cursorPos = await testSingleCursorMotion(editor, "", "Foo "); 299 | assert.equal(cursorPos.line, 0); 300 | assert.equal(cursorPos.character, 0); 301 | }); 302 | 303 | test("motion: should skip multiple WSPs", async () => { 304 | const editor = vscode.window.activeTextEditor!; 305 | const cursorPos = await testSingleCursorMotion(editor, "", "Foo \t"); 306 | assert.equal(cursorPos.line, 0); 307 | assert.equal(cursorPos.character, 0); 308 | }); 309 | 310 | test("motion: should stop at start-of-document after skipping WSPs", async () => { 311 | const editor = vscode.window.activeTextEditor!; 312 | const cursorPos = await testSingleCursorMotion(editor, "", " "); 313 | assert.equal(cursorPos.line, 0); 314 | assert.equal(cursorPos.character, 0); 315 | }); 316 | 317 | test("motion: should not go over an EOL if not from start of the line", async () => { 318 | const editor = vscode.window.activeTextEditor!; 319 | const cursorPos = await testSingleCursorMotion(editor, "", "\nFoo"); 320 | assert.equal(cursorPos.line, 1); 321 | assert.equal(cursorPos.character, 0); 322 | }); 323 | 324 | test("motion: should go over an EOL from start of the line", async () => { 325 | const editor = vscode.window.activeTextEditor!; 326 | const cursorPos = await testSingleCursorMotion(editor, "", "Foo\n"); 327 | assert.equal(cursorPos.line, 0); 328 | assert.equal(cursorPos.character, 3); 329 | }); 330 | 331 | test("motion: should stop on char-class change (alnum -> punctuation)", async () => { 332 | const editor = vscode.window.activeTextEditor!; 333 | const cursorPos = await testSingleCursorMotion(editor, "", "!HbA1c"); 334 | assert.equal(cursorPos.line, 0); 335 | assert.equal(cursorPos.character, 1); 336 | }); 337 | 338 | test("motion: should stop on char-class change (alnum -> hiragana)", async () => { 339 | const editor = vscode.window.activeTextEditor!; 340 | const cursorPos = await testSingleCursorMotion(editor, "", "かなHbA1c"); 341 | assert.equal(cursorPos.line, 0); 342 | assert.equal(cursorPos.character, 2); 343 | }); 344 | 345 | test("motion: should stop on char-class change (hiragana -> katakana)", async () => { 346 | const editor = vscode.window.activeTextEditor!; 347 | const cursorPos = await testSingleCursorMotion(editor, "", "カナかな"); 348 | assert.equal(cursorPos.line, 0); 349 | assert.equal(cursorPos.character, 2); 350 | }); 351 | 352 | test("motion: should stop on char-class change (katakana -> other)", async () => { 353 | const editor = vscode.window.activeTextEditor!; 354 | const cursorPos = await testSingleCursorMotion(editor, "", "漢字カナ"); 355 | assert.equal(cursorPos.line, 0); 356 | assert.equal(cursorPos.character, 2); 357 | }); 358 | 359 | test("motion: should stop on char-class change (other -> WSP)", async () => { 360 | const editor = vscode.window.activeTextEditor!; 361 | const cursorPos = await testSingleCursorMotion(editor, "", "\t 漢字"); 362 | assert.equal(cursorPos.line, 0); 363 | assert.equal(cursorPos.character, 2); 364 | }); 365 | 366 | test("motion: should stop at start-of-line", async () => { 367 | const editor = vscode.window.activeTextEditor!; 368 | const cursorPos = await testSingleCursorMotion(editor, "", "Foo\nBar"); 369 | assert.equal(cursorPos.line, 1); 370 | assert.equal(cursorPos.character, 0); 371 | }); 372 | 373 | test("motion: should stop at start-of-document", async () => { 374 | const editor = vscode.window.activeTextEditor!; 375 | const cursorPos = await testSingleCursorMotion(editor, "", "Foo"); 376 | assert.equal(cursorPos.line, 0); 377 | assert.equal(cursorPos.character, 0); 378 | }); 379 | }); 380 | 381 | suite("cursorWordStartRight", () => { 382 | const doMine = async function ( 383 | editor: TextEditor, 384 | wordSeparators: string, 385 | content: string, 386 | ) { 387 | await setText(editor, content); 388 | const initPos = new Position(0, 0); 389 | editor.selections = [new Selection(initPos, initPos)]; 390 | await myExtension.cursorWordStartRight(editor, wordSeparators); 391 | return editor.document.offsetAt(editor.selection.start); 392 | }; 393 | 394 | const doTheirs = async function (editor: TextEditor, content: string) { 395 | await setText(editor, content); 396 | const initPos = new Position(0, 0); 397 | editor.selections = [new Selection(initPos, initPos)]; 398 | await vscode.commands.executeCommand("cursorWordStartRight"); 399 | return editor.document.offsetAt(editor.selection.start); 400 | }; 401 | 402 | [ 403 | { name: ".", input: "", expected: 0, compatible: true }, 404 | 405 | { name: "A.", input: "aa", expected: 2, compatible: true }, 406 | { name: "AH", input: "aaあ", expected: 2, compatible: false }, 407 | { name: "AK", input: "aaア", expected: 2, compatible: false }, 408 | { name: "AJ", input: "aa亜", expected: 2, compatible: false }, 409 | { name: "AS.", input: "aa ", expected: 3, compatible: true }, 410 | { name: "ASA", input: "aa a", expected: 3, compatible: true }, 411 | { name: "ASH", input: "aa あ", expected: 3, compatible: true }, 412 | { name: "ASL", input: "aa \n", expected: 3, compatible: true }, 413 | { name: "AL", input: "aa\n", expected: 2, compatible: true }, 414 | 415 | { name: "H.", input: "ああ", expected: 2, compatible: true }, 416 | { name: "HA", input: "ああa", expected: 2, compatible: false }, 417 | { name: "HK", input: "ああア", expected: 2, compatible: false }, 418 | { name: "HJ", input: "ああ亜", expected: 2, compatible: false }, 419 | { name: "HS.", input: "ああ ", expected: 3, compatible: true }, 420 | { name: "HSA", input: "ああ a", expected: 3, compatible: true }, 421 | { name: "HSH", input: "ああ あ", expected: 3, compatible: true }, 422 | { name: "HSL", input: "ああ \n", expected: 3, compatible: true }, 423 | { name: "HL", input: "ああ\n", expected: 2, compatible: true }, 424 | 425 | { name: "K.", input: "アア", expected: 2, compatible: true }, 426 | { name: "KA", input: "アアa", expected: 2, compatible: false }, 427 | { name: "KH", input: "アアあ", expected: 2, compatible: false }, 428 | { name: "KJ", input: "アア亜", expected: 2, compatible: false }, 429 | { name: "KS.", input: "アア ", expected: 3, compatible: true }, 430 | { name: "KSA", input: "アア a", expected: 3, compatible: true }, 431 | { name: "KSH", input: "アア あ", expected: 3, compatible: true }, 432 | { name: "KSL", input: "アア \n", expected: 3, compatible: true }, 433 | { name: "KL", input: "アア\n", expected: 2, compatible: true }, 434 | 435 | { name: "J.", input: "亜亜", expected: 2, compatible: true }, 436 | { name: "JA", input: "亜亜a", expected: 2, compatible: false }, 437 | { name: "JH", input: "亜亜あ", expected: 2, compatible: false }, 438 | { name: "JK", input: "亜亜ア", expected: 2, compatible: false }, 439 | { name: "JS.", input: "亜亜 ", expected: 3, compatible: true }, 440 | { name: "JSA", input: "亜亜 a", expected: 3, compatible: true }, 441 | { name: "JSH", input: "亜亜 あ", expected: 3, compatible: true }, 442 | { name: "JSL", input: "亜亜 \n", expected: 3, compatible: true }, 443 | { name: "JL", input: "亜亜\n", expected: 2, compatible: true }, 444 | 445 | { name: "S.", input: " ", expected: 2, compatible: true }, 446 | { name: "SA", input: " aa", expected: 2, compatible: true }, 447 | { name: "SH", input: " ああ", expected: 2, compatible: true }, 448 | { name: "SK", input: " アア", expected: 2, compatible: true }, 449 | { name: "SJ", input: " 亜亜", expected: 2, compatible: true }, 450 | { name: "SL", input: " \n", expected: 2, compatible: true }, 451 | 452 | { name: "L.", input: "\n", expected: 1, compatible: true }, 453 | { name: "LA", input: "\na", expected: 1, compatible: true }, 454 | { name: "LH", input: "\nあ", expected: 1, compatible: false }, 455 | { name: "LK", input: "\nア", expected: 1, compatible: false }, 456 | { name: "LJ", input: "\n亜", expected: 1, compatible: false }, 457 | { name: "LS", input: "\n ", expected: 1, compatible: false }, //TODO: should be compatible 458 | { name: "LL", input: "\n\n", expected: 1, compatible: true }, 459 | ].forEach((t) => { 460 | test("cursorWordStartRight: " + t.name, async () => { 461 | const editor = vscode.window.activeTextEditor!; 462 | const mine = await doMine(editor, "", t.input); 463 | if (mine !== t.expected) { 464 | assert.fail( 465 | "Unexpected result: {" + 466 | escape`input: "${t.input}", ` + 467 | escape`expected: "${t.expected}", ` + 468 | escape`got: "${mine}"}`, 469 | ); 470 | } 471 | if (t.compatible) { 472 | const theirs = await doTheirs(editor, t.input); 473 | if (mine !== theirs) { 474 | assert.fail( 475 | "Incompatible behavior: {" + 476 | escape`input: "${t.input}", ` + 477 | escape`mine: "${mine}", ` + 478 | escape`theirs: "${theirs}"}`, 479 | ); 480 | } 481 | } 482 | }); 483 | }); 484 | }); 485 | 486 | suite("deleteWordEndRight", () => { 487 | const doMine = async function ( 488 | editor: TextEditor, 489 | wordSeparators: string, 490 | content: string, 491 | ) { 492 | await setText(editor, content); 493 | const initPos = new Position(0, 0); 494 | editor.selections = [new Selection(initPos, initPos)]; 495 | await myExtension.deleteWordEndRight(editor, wordSeparators); 496 | return editor.document.getText(); 497 | }; 498 | 499 | const doTheirs = async function ( 500 | editor: TextEditor, 501 | command: string, 502 | content: string, 503 | ) { 504 | await setText(editor, content); 505 | const initPos = new Position(0, 0); 506 | editor.selections = [new Selection(initPos, initPos)]; 507 | await vscode.commands.executeCommand(command); 508 | return editor.document.getText(); 509 | }; 510 | 511 | // Range 512 | [ 513 | { name: ".", input: "", expected: "", compatible: true }, 514 | 515 | { name: "A.", input: "aa", expected: "", compatible: true }, 516 | { name: "AH", input: "aaあ", expected: "あ", compatible: false }, 517 | { name: "AK", input: "aaア", expected: "ア", compatible: false }, 518 | { name: "AJ", input: "aa亜", expected: "亜", compatible: false }, 519 | { name: "AL", input: "aa\n", expected: "\n", compatible: true }, 520 | { name: "AS", input: "aa ", expected: " ", compatible: true }, 521 | 522 | { name: "H.", input: "ああ", expected: "", compatible: true }, 523 | { name: "HA", input: "ああa", expected: "a", compatible: false }, 524 | { name: "HK", input: "ああア", expected: "ア", compatible: false }, 525 | { name: "HJ", input: "ああ亜", expected: "亜", compatible: false }, 526 | { name: "HL", input: "ああ\n", expected: "\n", compatible: true }, 527 | { name: "HS", input: "ああ ", expected: " ", compatible: true }, 528 | 529 | { name: "K.", input: "アア", expected: "", compatible: true }, 530 | { name: "KA", input: "アアa", expected: "a", compatible: false }, 531 | { name: "KH", input: "アアあ", expected: "あ", compatible: false }, 532 | { name: "KJ", input: "アア亜", expected: "亜", compatible: false }, 533 | { name: "KL", input: "アア\n", expected: "\n", compatible: true }, 534 | { name: "KS", input: "アア ", expected: " ", compatible: true }, 535 | 536 | { name: "J.", input: "亜亜", expected: "", compatible: true }, 537 | { name: "JA", input: "亜亜a", expected: "a", compatible: false }, 538 | { name: "JH", input: "亜亜あ", expected: "あ", compatible: false }, 539 | { name: "JK", input: "亜亜ア", expected: "ア", compatible: false }, 540 | { name: "JL", input: "亜亜\n", expected: "\n", compatible: true }, 541 | { name: "JS", input: "亜亜 ", expected: " ", compatible: true }, 542 | 543 | { name: "L.", input: "\n", expected: "", compatible: true }, 544 | { name: "LA", input: "\na", expected: "a", compatible: true }, 545 | { name: "LH", input: "\nあ", expected: "あ", compatible: false }, 546 | { name: "LK", input: "\nア", expected: "ア", compatible: false }, 547 | { name: "LJ", input: "\n亜", expected: "亜", compatible: false }, 548 | { name: "LL", input: "\n\n", expected: "\n", compatible: true }, 549 | { name: "LS.", input: "\n ", expected: " ", compatible: false }, //TODO: should be compatible 550 | 551 | { name: "S.", input: " ", expected: "", compatible: true }, 552 | { name: "SA.", input: " aa", expected: "", compatible: true }, 553 | { name: "SAL", input: " aa\n", expected: "\n", compatible: true }, 554 | { name: "SAS", input: " aa ", expected: " ", compatible: true }, 555 | { name: "SH.", input: " ああ", expected: "", compatible: true }, 556 | { name: "SHL", input: " ああ\n", expected: "\n", compatible: true }, 557 | { name: "SHS", input: " ああ ", expected: " ", compatible: true }, 558 | { name: "SK.", input: " アア", expected: "", compatible: true }, 559 | { name: "SKL", input: " アア\n", expected: "\n", compatible: true }, 560 | { name: "SKS", input: " アア ", expected: " ", compatible: true }, 561 | { name: "SJ.", input: " 亜亜", expected: "", compatible: true }, 562 | { name: "SJL", input: " 亜亜\n", expected: "\n", compatible: true }, 563 | { name: "SJS", input: " 亜亜 ", expected: " ", compatible: true }, 564 | { name: "SL", input: " \n", expected: "\n", compatible: true }, 565 | { name: "SS.", input: " ", expected: "", compatible: true }, 566 | { name: "SSA.", input: " aa", expected: "", compatible: false }, 567 | { name: "SSL", input: " \n", expected: "\n", compatible: true }, 568 | ].forEach((t) => { 569 | test("range: " + t.name, async () => { 570 | const editor = vscode.window.activeTextEditor!; 571 | const mine = await doMine(editor, "", t.input); 572 | if (mine !== t.expected) { 573 | assert.fail( 574 | "Unexpected result: {" + 575 | escape`input: "${t.input}", ` + 576 | escape`expected: "${t.expected}", ` + 577 | escape`got: "${mine}"}`, 578 | ); 579 | } 580 | if (t.compatible) { 581 | const cmd = "deleteWordEndRight"; 582 | const theirs = await doTheirs(editor, cmd, t.input); 583 | if (mine !== theirs) { 584 | assert.fail( 585 | "Incompatible behavior: {" + 586 | escape`input: "${t.input}", ` + 587 | escape`mine: "${mine}", ` + 588 | escape`theirs: "${theirs}"}`, 589 | ); 590 | } 591 | } 592 | }); 593 | }); 594 | 595 | test("undo", async () => { 596 | const editor = vscode.window.activeTextEditor!; 597 | 598 | // Execute my command 599 | const mine = await doMine(editor, "", "abc"); 600 | assert.equal(mine, ""); 601 | 602 | // Undo and check the result 603 | await vscode.commands.executeCommand("undo"); 604 | const text = await editor.document.getText(); 605 | assert.equal(text, "abc"); 606 | }); 607 | }); 608 | 609 | suite("deleteWordStartLeft", () => { 610 | const doMine = async function ( 611 | editor: TextEditor, 612 | wordSeparators: string, 613 | content: string, 614 | ) { 615 | await setText(editor, content); 616 | const initPos = editor.document.positionAt(content.length * 2); // LFs may become CRLFs 617 | editor.selections = [new Selection(initPos, initPos)]; 618 | await myExtension.deleteWordStartLeft(editor, wordSeparators); 619 | return editor.document.getText(); 620 | }; 621 | 622 | const doTheirs = async function (editor: TextEditor, content: string) { 623 | await setText(editor, content); 624 | const initPos = editor.document.positionAt(content.length * 2); // LFs may become CRLFs 625 | editor.selections = [new Selection(initPos, initPos)]; 626 | await vscode.commands.executeCommand("deleteWordStartLeft"); 627 | return editor.document.getText(); 628 | }; 629 | 630 | // Range 631 | [ 632 | { name: ".", input: "", expected: "", compatible: true }, 633 | 634 | { name: "A.", input: "aa", expected: "", compatible: true }, 635 | { name: "AH", input: "あaa", expected: "あ", compatible: false }, 636 | { name: "AK", input: "アaa", expected: "ア", compatible: false }, 637 | { name: "AJ", input: "亜aa", expected: "亜", compatible: false }, 638 | { name: "AL", input: "\naa", expected: "\n", compatible: true }, 639 | { name: "AS", input: " aa", expected: " ", compatible: true }, 640 | 641 | { name: "H.", input: "ああ", expected: "", compatible: true }, 642 | { name: "HA", input: "aああ", expected: "a", compatible: false }, 643 | { name: "HK", input: "アああ", expected: "ア", compatible: false }, 644 | { name: "HJ", input: "亜ああ", expected: "亜", compatible: false }, 645 | { name: "HL", input: "\nああ", expected: "\n", compatible: true }, 646 | { name: "HS", input: " ああ", expected: " ", compatible: true }, 647 | 648 | { name: "K.", input: "アア", expected: "", compatible: true }, 649 | { name: "KA", input: "aアア", expected: "a", compatible: false }, 650 | { name: "KH", input: "あアア", expected: "あ", compatible: false }, 651 | { name: "KJ", input: "亜アア", expected: "亜", compatible: false }, 652 | { name: "KL", input: "\nアア", expected: "\n", compatible: true }, 653 | { name: "KS", input: " アア", expected: " ", compatible: true }, 654 | 655 | { name: "J.", input: "亜亜", expected: "", compatible: true }, 656 | { name: "JA", input: "a亜亜", expected: "a", compatible: false }, 657 | { name: "JH", input: "あ亜亜", expected: "あ", compatible: false }, 658 | { name: "JK", input: "ア亜亜", expected: "ア", compatible: false }, 659 | { name: "JL", input: "\n亜亜", expected: "\n", compatible: true }, 660 | { name: "JS", input: " 亜亜", expected: " ", compatible: true }, 661 | 662 | { name: "L.", input: "\n", expected: "", compatible: true }, 663 | { name: "LA", input: "a\n", expected: "a", compatible: true }, 664 | { name: "LH", input: "あ\n", expected: "あ", compatible: false }, 665 | { name: "LK", input: "ア\n", expected: "ア", compatible: false }, 666 | { name: "LJ", input: "亜\n", expected: "亜", compatible: false }, 667 | //BUG//{ name: "LL", input: "\n\n", expected: "\n", compatible: true }, //TODO: fix this 668 | { name: "LS.", input: " \n", expected: " ", compatible: false }, //TODO: should be compatible 669 | 670 | { name: "S.", input: " ", expected: "", compatible: true }, 671 | { name: "SA.", input: "aa ", expected: "", compatible: true }, 672 | { name: "SAL", input: "\naa ", expected: "\n", compatible: true }, 673 | { name: "SAS", input: " aa ", expected: " ", compatible: true }, 674 | { name: "SH.", input: "ああ ", expected: "", compatible: true }, 675 | { name: "SHL", input: "\nああ ", expected: "\n", compatible: true }, 676 | { name: "SHS", input: " ああ ", expected: " ", compatible: true }, 677 | { name: "SK.", input: "アア ", expected: "", compatible: true }, 678 | { name: "SKL", input: "\nアア ", expected: "\n", compatible: true }, 679 | { name: "SKS", input: " アア ", expected: " ", compatible: true }, 680 | { name: "SJ.", input: "亜亜 ", expected: "", compatible: true }, 681 | { name: "SJL", input: "\n亜亜 ", expected: "\n", compatible: true }, 682 | { name: "SJS", input: " 亜亜 ", expected: " ", compatible: true }, 683 | //BUG//{ name: "SL", input: "\n ", expected: "\n", compatible: true }, //TODO: fix this 684 | { name: "SS.", input: " ", expected: "", compatible: true }, 685 | { name: "SSA.", input: "aa ", expected: "", compatible: false }, 686 | //BUG//{ name: "SSL", input: "\n ", expected: "\n", compatible: true }, //TODO: fix this 687 | ].forEach((t) => { 688 | test("range: " + t.name, async () => { 689 | const editor = vscode.window.activeTextEditor!; 690 | const mine = await doMine(editor, "", t.input); 691 | if (mine !== t.expected) { 692 | assert.fail( 693 | "Unexpected result: {" + 694 | escape`input: "${t.input}", ` + 695 | escape`expected: "${t.expected}", ` + 696 | escape`got: "${mine}"}`, 697 | ); 698 | } 699 | if (t.compatible) { 700 | const theirs = await doTheirs(editor, t.input); 701 | if (mine !== theirs) { 702 | assert.fail( 703 | "Incompatible behavior: {" + 704 | escape`input: "${t.input}", ` + 705 | escape`mine: "${mine}", ` + 706 | escape`theirs: "${theirs}"}`, 707 | ); 708 | } 709 | } 710 | }); 711 | }); 712 | 713 | test("undo", async () => { 714 | const editor = vscode.window.activeTextEditor!; 715 | 716 | // Execute my command 717 | const mine = await doMine(editor, "", "abc"); 718 | assert.equal(mine, ""); 719 | 720 | // Undo and check the result 721 | await vscode.commands.executeCommand("undo"); 722 | const text = await editor.document.getText(); 723 | assert.equal(text, "abc"); 724 | }); 725 | }); 726 | }); 727 | 728 | function escape( 729 | template: TemplateStringsArray, 730 | ...substitutions: any[] 731 | ): string { 732 | return String.raw(template, substitutions).replace(/\n/g, "\\n"); 733 | } 734 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | overrides: 8 | cross-spawn@<6.0.6: '>=6.0.6' 9 | cross-spawn@>=7.0.0 <7.0.5: '>=7.0.5' 10 | '@eslint/plugin-kit@<0.2.3': '>=0.2.3' 11 | koa@>=2.0.0 <2.15.4: '>=2.15.4' 12 | esbuild@<=0.24.2: '>=0.25.0' 13 | tar-fs@>=3.0.0 <3.0.7: '>=3.0.8' 14 | koa@<2.16.1: '>=2.16.1' 15 | tar-fs@>=3.0.0 <3.0.9: '>=3.0.9' 16 | brace-expansion@>=1.0.0 <=1.1.11: '>=1.1.12' 17 | brace-expansion@>=2.0.0 <=2.0.1: '>=2.0.2' 18 | '@eslint/plugin-kit@<0.3.4': '>=0.3.4' 19 | koa@>=2.0.0 <2.16.2: '>=2.16.2' 20 | on-headers@<1.1.0: '>=1.1.0' 21 | 22 | importers: 23 | 24 | .: 25 | devDependencies: 26 | '@esbuild-plugins/node-globals-polyfill': 27 | specifier: ^0.2.3 28 | version: 0.2.3(esbuild@0.25.1) 29 | '@types/assert': 30 | specifier: ^1.5.10 31 | version: 1.5.10 32 | '@types/mocha': 33 | specifier: ^10.0.8 34 | version: 10.0.9 35 | '@types/vscode': 36 | specifier: ^1.94.0 37 | version: 1.94.0 38 | '@typescript-eslint/eslint-plugin': 39 | specifier: ^8.7.0 40 | version: 8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3) 41 | '@typescript-eslint/parser': 42 | specifier: ^8.7.0 43 | version: 8.8.1(eslint@9.12.0)(typescript@5.6.3) 44 | '@vscode/test-web': 45 | specifier: ^0.0.61 46 | version: 0.0.61 47 | assert: 48 | specifier: ^2.1.0 49 | version: 2.1.0 50 | esbuild: 51 | specifier: '>=0.25.0' 52 | version: 0.25.1 53 | eslint: 54 | specifier: ^9.11.1 55 | version: 9.12.0 56 | glob: 57 | specifier: ^11.0.0 58 | version: 11.0.0 59 | mocha: 60 | specifier: ^10.7.3 61 | version: 10.7.3 62 | npm-run-all: 63 | specifier: ^4.1.5 64 | version: 4.1.5 65 | playwright: 66 | specifier: ^1.51.1 67 | version: 1.51.1 68 | process: 69 | specifier: ^0.11.10 70 | version: 0.11.10 71 | typescript: 72 | specifier: ^5.6.2 73 | version: 5.6.3 74 | 75 | packages: 76 | 77 | '@esbuild-plugins/node-globals-polyfill@0.2.3': 78 | resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} 79 | peerDependencies: 80 | esbuild: '>=0.25.0' 81 | 82 | '@esbuild/aix-ppc64@0.25.1': 83 | resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} 84 | engines: {node: '>=18'} 85 | cpu: [ppc64] 86 | os: [aix] 87 | 88 | '@esbuild/android-arm64@0.25.1': 89 | resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} 90 | engines: {node: '>=18'} 91 | cpu: [arm64] 92 | os: [android] 93 | 94 | '@esbuild/android-arm@0.25.1': 95 | resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} 96 | engines: {node: '>=18'} 97 | cpu: [arm] 98 | os: [android] 99 | 100 | '@esbuild/android-x64@0.25.1': 101 | resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} 102 | engines: {node: '>=18'} 103 | cpu: [x64] 104 | os: [android] 105 | 106 | '@esbuild/darwin-arm64@0.25.1': 107 | resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} 108 | engines: {node: '>=18'} 109 | cpu: [arm64] 110 | os: [darwin] 111 | 112 | '@esbuild/darwin-x64@0.25.1': 113 | resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} 114 | engines: {node: '>=18'} 115 | cpu: [x64] 116 | os: [darwin] 117 | 118 | '@esbuild/freebsd-arm64@0.25.1': 119 | resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} 120 | engines: {node: '>=18'} 121 | cpu: [arm64] 122 | os: [freebsd] 123 | 124 | '@esbuild/freebsd-x64@0.25.1': 125 | resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} 126 | engines: {node: '>=18'} 127 | cpu: [x64] 128 | os: [freebsd] 129 | 130 | '@esbuild/linux-arm64@0.25.1': 131 | resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} 132 | engines: {node: '>=18'} 133 | cpu: [arm64] 134 | os: [linux] 135 | 136 | '@esbuild/linux-arm@0.25.1': 137 | resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} 138 | engines: {node: '>=18'} 139 | cpu: [arm] 140 | os: [linux] 141 | 142 | '@esbuild/linux-ia32@0.25.1': 143 | resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} 144 | engines: {node: '>=18'} 145 | cpu: [ia32] 146 | os: [linux] 147 | 148 | '@esbuild/linux-loong64@0.25.1': 149 | resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} 150 | engines: {node: '>=18'} 151 | cpu: [loong64] 152 | os: [linux] 153 | 154 | '@esbuild/linux-mips64el@0.25.1': 155 | resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} 156 | engines: {node: '>=18'} 157 | cpu: [mips64el] 158 | os: [linux] 159 | 160 | '@esbuild/linux-ppc64@0.25.1': 161 | resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} 162 | engines: {node: '>=18'} 163 | cpu: [ppc64] 164 | os: [linux] 165 | 166 | '@esbuild/linux-riscv64@0.25.1': 167 | resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} 168 | engines: {node: '>=18'} 169 | cpu: [riscv64] 170 | os: [linux] 171 | 172 | '@esbuild/linux-s390x@0.25.1': 173 | resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} 174 | engines: {node: '>=18'} 175 | cpu: [s390x] 176 | os: [linux] 177 | 178 | '@esbuild/linux-x64@0.25.1': 179 | resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} 180 | engines: {node: '>=18'} 181 | cpu: [x64] 182 | os: [linux] 183 | 184 | '@esbuild/netbsd-arm64@0.25.1': 185 | resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} 186 | engines: {node: '>=18'} 187 | cpu: [arm64] 188 | os: [netbsd] 189 | 190 | '@esbuild/netbsd-x64@0.25.1': 191 | resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} 192 | engines: {node: '>=18'} 193 | cpu: [x64] 194 | os: [netbsd] 195 | 196 | '@esbuild/openbsd-arm64@0.25.1': 197 | resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} 198 | engines: {node: '>=18'} 199 | cpu: [arm64] 200 | os: [openbsd] 201 | 202 | '@esbuild/openbsd-x64@0.25.1': 203 | resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} 204 | engines: {node: '>=18'} 205 | cpu: [x64] 206 | os: [openbsd] 207 | 208 | '@esbuild/sunos-x64@0.25.1': 209 | resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} 210 | engines: {node: '>=18'} 211 | cpu: [x64] 212 | os: [sunos] 213 | 214 | '@esbuild/win32-arm64@0.25.1': 215 | resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} 216 | engines: {node: '>=18'} 217 | cpu: [arm64] 218 | os: [win32] 219 | 220 | '@esbuild/win32-ia32@0.25.1': 221 | resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} 222 | engines: {node: '>=18'} 223 | cpu: [ia32] 224 | os: [win32] 225 | 226 | '@esbuild/win32-x64@0.25.1': 227 | resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} 228 | engines: {node: '>=18'} 229 | cpu: [x64] 230 | os: [win32] 231 | 232 | '@eslint-community/eslint-utils@4.4.0': 233 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 234 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 235 | peerDependencies: 236 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 237 | 238 | '@eslint-community/regexpp@4.11.1': 239 | resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} 240 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 241 | 242 | '@eslint/config-array@0.18.0': 243 | resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} 244 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 245 | 246 | '@eslint/core@0.15.1': 247 | resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} 248 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 249 | 250 | '@eslint/core@0.6.0': 251 | resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} 252 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 253 | 254 | '@eslint/eslintrc@3.1.0': 255 | resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} 256 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 257 | 258 | '@eslint/js@9.12.0': 259 | resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} 260 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 261 | 262 | '@eslint/object-schema@2.1.4': 263 | resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} 264 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 265 | 266 | '@eslint/plugin-kit@0.3.4': 267 | resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} 268 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 269 | 270 | '@humanfs/core@0.19.0': 271 | resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} 272 | engines: {node: '>=18.18.0'} 273 | 274 | '@humanfs/node@0.16.5': 275 | resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} 276 | engines: {node: '>=18.18.0'} 277 | 278 | '@humanwhocodes/module-importer@1.0.1': 279 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 280 | engines: {node: '>=12.22'} 281 | 282 | '@humanwhocodes/retry@0.3.1': 283 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 284 | engines: {node: '>=18.18'} 285 | 286 | '@isaacs/cliui@8.0.2': 287 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 288 | engines: {node: '>=12'} 289 | 290 | '@koa/cors@5.0.0': 291 | resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} 292 | engines: {node: '>= 14.0.0'} 293 | 294 | '@koa/router@13.1.0': 295 | resolution: {integrity: sha512-mNVu1nvkpSd8Q8gMebGbCkDWJ51ODetrFvLKYusej+V0ByD4btqHYnPIzTBLXnQMVUlm/oxVwqmWBY3zQfZilw==} 296 | engines: {node: '>= 18'} 297 | 298 | '@nodelib/fs.scandir@2.1.5': 299 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 300 | engines: {node: '>= 8'} 301 | 302 | '@nodelib/fs.stat@2.0.5': 303 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 304 | engines: {node: '>= 8'} 305 | 306 | '@nodelib/fs.walk@1.2.8': 307 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 308 | engines: {node: '>= 8'} 309 | 310 | '@playwright/browser-chromium@1.48.0': 311 | resolution: {integrity: sha512-933FDk719os4Z6iUoXaoO/mxTGSnaXCXHqLgttfGFmNElB+7LVO4jhJ/gnRnQFjhrB3YKFXP86pnMepjaEykcw==} 312 | engines: {node: '>=18'} 313 | 314 | '@types/assert@1.5.10': 315 | resolution: {integrity: sha512-qEO+AUgYab7GVbeDDgUNCU3o0aZUoIMpNAe+w5LDbRxfxQX7vQAdDgwj1AroX+i8KaV56FWg0srXlSZROnsrIQ==} 316 | 317 | '@types/estree@1.0.6': 318 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 319 | 320 | '@types/json-schema@7.0.15': 321 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 322 | 323 | '@types/mocha@10.0.9': 324 | resolution: {integrity: sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==} 325 | 326 | '@types/vscode@1.94.0': 327 | resolution: {integrity: sha512-UyQOIUT0pb14XSqJskYnRwD2aG0QrPVefIfrW1djR+/J4KeFQ0i1+hjZoaAmeNf3Z2jleK+R2hv+EboG/m8ruw==} 328 | 329 | '@typescript-eslint/eslint-plugin@8.8.1': 330 | resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} 331 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 332 | peerDependencies: 333 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 334 | eslint: ^8.57.0 || ^9.0.0 335 | typescript: '*' 336 | peerDependenciesMeta: 337 | typescript: 338 | optional: true 339 | 340 | '@typescript-eslint/parser@8.8.1': 341 | resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==} 342 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 343 | peerDependencies: 344 | eslint: ^8.57.0 || ^9.0.0 345 | typescript: '*' 346 | peerDependenciesMeta: 347 | typescript: 348 | optional: true 349 | 350 | '@typescript-eslint/scope-manager@8.8.1': 351 | resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} 352 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 353 | 354 | '@typescript-eslint/type-utils@8.8.1': 355 | resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==} 356 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 357 | peerDependencies: 358 | typescript: '*' 359 | peerDependenciesMeta: 360 | typescript: 361 | optional: true 362 | 363 | '@typescript-eslint/types@8.8.1': 364 | resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} 365 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 366 | 367 | '@typescript-eslint/typescript-estree@8.8.1': 368 | resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} 369 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 370 | peerDependencies: 371 | typescript: '*' 372 | peerDependenciesMeta: 373 | typescript: 374 | optional: true 375 | 376 | '@typescript-eslint/utils@8.8.1': 377 | resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} 378 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 379 | peerDependencies: 380 | eslint: ^8.57.0 || ^9.0.0 381 | 382 | '@typescript-eslint/visitor-keys@8.8.1': 383 | resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} 384 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 385 | 386 | '@vscode/test-web@0.0.61': 387 | resolution: {integrity: sha512-633yh0WuhUkmY+LEjzDdhEhMgUN+nXJRJbVy8iDiT/IzPsDx7ihEIOnnPPnHKpVyErOIYquNTG8n51dYtaxdbQ==} 388 | engines: {node: '>=16'} 389 | hasBin: true 390 | 391 | accepts@1.3.8: 392 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 393 | engines: {node: '>= 0.6'} 394 | 395 | acorn-jsx@5.3.2: 396 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 397 | peerDependencies: 398 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 399 | 400 | acorn@8.12.1: 401 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 402 | engines: {node: '>=0.4.0'} 403 | hasBin: true 404 | 405 | agent-base@7.1.1: 406 | resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} 407 | engines: {node: '>= 14'} 408 | 409 | ajv@6.12.6: 410 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 411 | 412 | ansi-colors@4.1.3: 413 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 414 | engines: {node: '>=6'} 415 | 416 | ansi-regex@5.0.1: 417 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 418 | engines: {node: '>=8'} 419 | 420 | ansi-regex@6.1.0: 421 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 422 | engines: {node: '>=12'} 423 | 424 | ansi-styles@3.2.1: 425 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 426 | engines: {node: '>=4'} 427 | 428 | ansi-styles@4.3.0: 429 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 430 | engines: {node: '>=8'} 431 | 432 | ansi-styles@6.2.1: 433 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 434 | engines: {node: '>=12'} 435 | 436 | anymatch@3.1.3: 437 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 438 | engines: {node: '>= 8'} 439 | 440 | argparse@2.0.1: 441 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 442 | 443 | array-buffer-byte-length@1.0.1: 444 | resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} 445 | engines: {node: '>= 0.4'} 446 | 447 | arraybuffer.prototype.slice@1.0.3: 448 | resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} 449 | engines: {node: '>= 0.4'} 450 | 451 | assert@2.1.0: 452 | resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} 453 | 454 | available-typed-arrays@1.0.7: 455 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 456 | engines: {node: '>= 0.4'} 457 | 458 | b4a@1.6.7: 459 | resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} 460 | 461 | balanced-match@3.0.1: 462 | resolution: {integrity: sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==} 463 | engines: {node: '>= 16'} 464 | 465 | bare-events@2.5.4: 466 | resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} 467 | 468 | bare-fs@4.1.2: 469 | resolution: {integrity: sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==} 470 | engines: {bare: '>=1.16.0'} 471 | peerDependencies: 472 | bare-buffer: '*' 473 | peerDependenciesMeta: 474 | bare-buffer: 475 | optional: true 476 | 477 | bare-os@3.6.1: 478 | resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==} 479 | engines: {bare: '>=1.14.0'} 480 | 481 | bare-path@3.0.0: 482 | resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} 483 | 484 | bare-stream@2.6.5: 485 | resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} 486 | peerDependencies: 487 | bare-buffer: '*' 488 | bare-events: '*' 489 | peerDependenciesMeta: 490 | bare-buffer: 491 | optional: true 492 | bare-events: 493 | optional: true 494 | 495 | basic-auth@2.0.1: 496 | resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} 497 | engines: {node: '>= 0.8'} 498 | 499 | binary-extensions@2.3.0: 500 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 501 | engines: {node: '>=8'} 502 | 503 | brace-expansion@4.0.1: 504 | resolution: {integrity: sha512-YClrbvTCXGe70pU2JiEiPLYXO9gQkyxYeKpJIQHVS/gOs6EWMQP2RYBwjFLNT322Ji8TOC3IMPfsYCedNpzKfA==} 505 | engines: {node: '>= 18'} 506 | 507 | braces@3.0.3: 508 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 509 | engines: {node: '>=8'} 510 | 511 | browser-stdout@1.3.1: 512 | resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} 513 | 514 | browserify-zlib@0.1.4: 515 | resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} 516 | 517 | buffer-from@1.1.2: 518 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 519 | 520 | call-bind@1.0.7: 521 | resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} 522 | engines: {node: '>= 0.4'} 523 | 524 | callsites@3.1.0: 525 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 526 | engines: {node: '>=6'} 527 | 528 | camelcase@6.3.0: 529 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 530 | engines: {node: '>=10'} 531 | 532 | chalk@2.4.2: 533 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 534 | engines: {node: '>=4'} 535 | 536 | chalk@4.1.2: 537 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 538 | engines: {node: '>=10'} 539 | 540 | chokidar@3.6.0: 541 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 542 | engines: {node: '>= 8.10.0'} 543 | 544 | cliui@7.0.4: 545 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 546 | 547 | color-convert@1.9.3: 548 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 549 | 550 | color-convert@2.0.1: 551 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 552 | engines: {node: '>=7.0.0'} 553 | 554 | color-name@1.1.3: 555 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 556 | 557 | color-name@1.1.4: 558 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 559 | 560 | content-disposition@0.5.4: 561 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 562 | engines: {node: '>= 0.6'} 563 | 564 | content-type@1.0.5: 565 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 566 | engines: {node: '>= 0.6'} 567 | 568 | cookies@0.9.1: 569 | resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} 570 | engines: {node: '>= 0.8'} 571 | 572 | core-util-is@1.0.3: 573 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 574 | 575 | cross-spawn@7.0.3: 576 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 577 | engines: {node: '>= 8'} 578 | 579 | cross-spawn@7.0.6: 580 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 581 | engines: {node: '>= 8'} 582 | 583 | data-view-buffer@1.0.1: 584 | resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} 585 | engines: {node: '>= 0.4'} 586 | 587 | data-view-byte-length@1.0.1: 588 | resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} 589 | engines: {node: '>= 0.4'} 590 | 591 | data-view-byte-offset@1.0.0: 592 | resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} 593 | engines: {node: '>= 0.4'} 594 | 595 | debug@2.6.9: 596 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 597 | peerDependencies: 598 | supports-color: '*' 599 | peerDependenciesMeta: 600 | supports-color: 601 | optional: true 602 | 603 | debug@3.2.7: 604 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 605 | peerDependencies: 606 | supports-color: '*' 607 | peerDependenciesMeta: 608 | supports-color: 609 | optional: true 610 | 611 | debug@4.3.7: 612 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 613 | engines: {node: '>=6.0'} 614 | peerDependencies: 615 | supports-color: '*' 616 | peerDependenciesMeta: 617 | supports-color: 618 | optional: true 619 | 620 | decamelize@4.0.0: 621 | resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} 622 | engines: {node: '>=10'} 623 | 624 | deep-equal@1.0.1: 625 | resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} 626 | 627 | deep-is@0.1.4: 628 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 629 | 630 | define-data-property@1.1.4: 631 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 632 | engines: {node: '>= 0.4'} 633 | 634 | define-properties@1.2.1: 635 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 636 | engines: {node: '>= 0.4'} 637 | 638 | delegates@1.0.0: 639 | resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} 640 | 641 | depd@1.1.2: 642 | resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} 643 | engines: {node: '>= 0.6'} 644 | 645 | depd@2.0.0: 646 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 647 | engines: {node: '>= 0.8'} 648 | 649 | destroy@1.2.0: 650 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 651 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 652 | 653 | diff@5.2.0: 654 | resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} 655 | engines: {node: '>=0.3.1'} 656 | 657 | duplexify@3.7.1: 658 | resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} 659 | 660 | eastasianwidth@0.2.0: 661 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 662 | 663 | ee-first@1.1.1: 664 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 665 | 666 | emoji-regex@8.0.0: 667 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 668 | 669 | emoji-regex@9.2.2: 670 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 671 | 672 | encodeurl@2.0.0: 673 | resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} 674 | engines: {node: '>= 0.8'} 675 | 676 | end-of-stream@1.4.4: 677 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 678 | 679 | error-ex@1.3.2: 680 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 681 | 682 | es-abstract@1.23.3: 683 | resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} 684 | engines: {node: '>= 0.4'} 685 | 686 | es-define-property@1.0.0: 687 | resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} 688 | engines: {node: '>= 0.4'} 689 | 690 | es-errors@1.3.0: 691 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 692 | engines: {node: '>= 0.4'} 693 | 694 | es-object-atoms@1.0.0: 695 | resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} 696 | engines: {node: '>= 0.4'} 697 | 698 | es-set-tostringtag@2.0.3: 699 | resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} 700 | engines: {node: '>= 0.4'} 701 | 702 | es-to-primitive@1.2.1: 703 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 704 | engines: {node: '>= 0.4'} 705 | 706 | esbuild@0.25.1: 707 | resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} 708 | engines: {node: '>=18'} 709 | hasBin: true 710 | 711 | escalade@3.2.0: 712 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 713 | engines: {node: '>=6'} 714 | 715 | escape-html@1.0.3: 716 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 717 | 718 | escape-string-regexp@1.0.5: 719 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 720 | engines: {node: '>=0.8.0'} 721 | 722 | escape-string-regexp@4.0.0: 723 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 724 | engines: {node: '>=10'} 725 | 726 | eslint-scope@8.1.0: 727 | resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} 728 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 729 | 730 | eslint-visitor-keys@3.4.3: 731 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 732 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 733 | 734 | eslint-visitor-keys@4.1.0: 735 | resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} 736 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 737 | 738 | eslint@9.12.0: 739 | resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} 740 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 741 | hasBin: true 742 | peerDependencies: 743 | jiti: '*' 744 | peerDependenciesMeta: 745 | jiti: 746 | optional: true 747 | 748 | espree@10.2.0: 749 | resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} 750 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 751 | 752 | esquery@1.6.0: 753 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 754 | engines: {node: '>=0.10'} 755 | 756 | esrecurse@4.3.0: 757 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 758 | engines: {node: '>=4.0'} 759 | 760 | estraverse@5.3.0: 761 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 762 | engines: {node: '>=4.0'} 763 | 764 | esutils@2.0.3: 765 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 766 | engines: {node: '>=0.10.0'} 767 | 768 | fast-deep-equal@3.1.3: 769 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 770 | 771 | fast-fifo@1.3.2: 772 | resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} 773 | 774 | fast-glob@3.3.2: 775 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 776 | engines: {node: '>=8.6.0'} 777 | 778 | fast-json-stable-stringify@2.1.0: 779 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 780 | 781 | fast-levenshtein@2.0.6: 782 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 783 | 784 | fastq@1.17.1: 785 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 786 | 787 | file-entry-cache@8.0.0: 788 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 789 | engines: {node: '>=16.0.0'} 790 | 791 | fill-range@7.1.1: 792 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 793 | engines: {node: '>=8'} 794 | 795 | find-up@5.0.0: 796 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 797 | engines: {node: '>=10'} 798 | 799 | flat-cache@4.0.1: 800 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 801 | engines: {node: '>=16'} 802 | 803 | flat@5.0.2: 804 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 805 | hasBin: true 806 | 807 | flatted@3.3.1: 808 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 809 | 810 | for-each@0.3.3: 811 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 812 | 813 | foreground-child@3.3.0: 814 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 815 | engines: {node: '>=14'} 816 | 817 | fresh@0.5.2: 818 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 819 | engines: {node: '>= 0.6'} 820 | 821 | fs.realpath@1.0.0: 822 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 823 | 824 | fsevents@2.3.2: 825 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 826 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 827 | os: [darwin] 828 | 829 | fsevents@2.3.3: 830 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 831 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 832 | os: [darwin] 833 | 834 | function-bind@1.1.2: 835 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 836 | 837 | function.prototype.name@1.1.6: 838 | resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} 839 | engines: {node: '>= 0.4'} 840 | 841 | functions-have-names@1.2.3: 842 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 843 | 844 | get-caller-file@2.0.5: 845 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 846 | engines: {node: 6.* || 8.* || >= 10.*} 847 | 848 | get-intrinsic@1.2.4: 849 | resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} 850 | engines: {node: '>= 0.4'} 851 | 852 | get-symbol-description@1.0.2: 853 | resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} 854 | engines: {node: '>= 0.4'} 855 | 856 | glob-parent@5.1.2: 857 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 858 | engines: {node: '>= 6'} 859 | 860 | glob-parent@6.0.2: 861 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 862 | engines: {node: '>=10.13.0'} 863 | 864 | glob@11.0.0: 865 | resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} 866 | engines: {node: 20 || >=22} 867 | hasBin: true 868 | 869 | glob@8.1.0: 870 | resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} 871 | engines: {node: '>=12'} 872 | deprecated: Glob versions prior to v9 are no longer supported 873 | 874 | globals@14.0.0: 875 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 876 | engines: {node: '>=18'} 877 | 878 | globalthis@1.0.4: 879 | resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} 880 | engines: {node: '>= 0.4'} 881 | 882 | gopd@1.0.1: 883 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 884 | 885 | graceful-fs@4.2.11: 886 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 887 | 888 | graphemer@1.4.0: 889 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 890 | 891 | gunzip-maybe@1.4.2: 892 | resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} 893 | hasBin: true 894 | 895 | has-bigints@1.0.2: 896 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 897 | 898 | has-flag@3.0.0: 899 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 900 | engines: {node: '>=4'} 901 | 902 | has-flag@4.0.0: 903 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 904 | engines: {node: '>=8'} 905 | 906 | has-property-descriptors@1.0.2: 907 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 908 | 909 | has-proto@1.0.3: 910 | resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} 911 | engines: {node: '>= 0.4'} 912 | 913 | has-symbols@1.0.3: 914 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 915 | engines: {node: '>= 0.4'} 916 | 917 | has-tostringtag@1.0.2: 918 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 919 | engines: {node: '>= 0.4'} 920 | 921 | hasown@2.0.2: 922 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 923 | engines: {node: '>= 0.4'} 924 | 925 | he@1.2.0: 926 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 927 | hasBin: true 928 | 929 | hosted-git-info@2.8.9: 930 | resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 931 | 932 | http-assert@1.5.0: 933 | resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} 934 | engines: {node: '>= 0.8'} 935 | 936 | http-errors@1.6.3: 937 | resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} 938 | engines: {node: '>= 0.6'} 939 | 940 | http-errors@1.8.1: 941 | resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} 942 | engines: {node: '>= 0.6'} 943 | 944 | http-errors@2.0.0: 945 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 946 | engines: {node: '>= 0.8'} 947 | 948 | http-proxy-agent@7.0.2: 949 | resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} 950 | engines: {node: '>= 14'} 951 | 952 | https-proxy-agent@7.0.5: 953 | resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} 954 | engines: {node: '>= 14'} 955 | 956 | ignore@5.3.2: 957 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 958 | engines: {node: '>= 4'} 959 | 960 | import-fresh@3.3.0: 961 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 962 | engines: {node: '>=6'} 963 | 964 | imurmurhash@0.1.4: 965 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 966 | engines: {node: '>=0.8.19'} 967 | 968 | inflight@1.0.6: 969 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 970 | 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. 971 | 972 | inherits@2.0.3: 973 | resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} 974 | 975 | inherits@2.0.4: 976 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 977 | 978 | internal-slot@1.0.7: 979 | resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} 980 | engines: {node: '>= 0.4'} 981 | 982 | is-arguments@1.1.1: 983 | resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} 984 | engines: {node: '>= 0.4'} 985 | 986 | is-array-buffer@3.0.4: 987 | resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} 988 | engines: {node: '>= 0.4'} 989 | 990 | is-arrayish@0.2.1: 991 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 992 | 993 | is-bigint@1.0.4: 994 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 995 | 996 | is-binary-path@2.1.0: 997 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 998 | engines: {node: '>=8'} 999 | 1000 | is-boolean-object@1.1.2: 1001 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 1002 | engines: {node: '>= 0.4'} 1003 | 1004 | is-callable@1.2.7: 1005 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1006 | engines: {node: '>= 0.4'} 1007 | 1008 | is-core-module@2.15.1: 1009 | resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} 1010 | engines: {node: '>= 0.4'} 1011 | 1012 | is-data-view@1.0.1: 1013 | resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} 1014 | engines: {node: '>= 0.4'} 1015 | 1016 | is-date-object@1.0.5: 1017 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 1018 | engines: {node: '>= 0.4'} 1019 | 1020 | is-deflate@1.0.0: 1021 | resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} 1022 | 1023 | is-extglob@2.1.1: 1024 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1025 | engines: {node: '>=0.10.0'} 1026 | 1027 | is-fullwidth-code-point@3.0.0: 1028 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1029 | engines: {node: '>=8'} 1030 | 1031 | is-generator-function@1.0.10: 1032 | resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} 1033 | engines: {node: '>= 0.4'} 1034 | 1035 | is-glob@4.0.3: 1036 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1037 | engines: {node: '>=0.10.0'} 1038 | 1039 | is-gzip@1.0.0: 1040 | resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} 1041 | engines: {node: '>=0.10.0'} 1042 | 1043 | is-nan@1.3.2: 1044 | resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} 1045 | engines: {node: '>= 0.4'} 1046 | 1047 | is-negative-zero@2.0.3: 1048 | resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} 1049 | engines: {node: '>= 0.4'} 1050 | 1051 | is-number-object@1.0.7: 1052 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 1053 | engines: {node: '>= 0.4'} 1054 | 1055 | is-number@7.0.0: 1056 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1057 | engines: {node: '>=0.12.0'} 1058 | 1059 | is-plain-obj@2.1.0: 1060 | resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} 1061 | engines: {node: '>=8'} 1062 | 1063 | is-regex@1.1.4: 1064 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 1065 | engines: {node: '>= 0.4'} 1066 | 1067 | is-shared-array-buffer@1.0.3: 1068 | resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} 1069 | engines: {node: '>= 0.4'} 1070 | 1071 | is-string@1.0.7: 1072 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 1073 | engines: {node: '>= 0.4'} 1074 | 1075 | is-symbol@1.0.4: 1076 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1077 | engines: {node: '>= 0.4'} 1078 | 1079 | is-typed-array@1.1.13: 1080 | resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} 1081 | engines: {node: '>= 0.4'} 1082 | 1083 | is-unicode-supported@0.1.0: 1084 | resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 1085 | engines: {node: '>=10'} 1086 | 1087 | is-weakref@1.0.2: 1088 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 1089 | 1090 | isarray@1.0.0: 1091 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 1092 | 1093 | isarray@2.0.5: 1094 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1095 | 1096 | isexe@2.0.0: 1097 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1098 | 1099 | jackspeak@4.0.2: 1100 | resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} 1101 | engines: {node: 20 || >=22} 1102 | 1103 | js-yaml@4.1.0: 1104 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1105 | hasBin: true 1106 | 1107 | json-buffer@3.0.1: 1108 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1109 | 1110 | json-parse-better-errors@1.0.2: 1111 | resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} 1112 | 1113 | json-schema-traverse@0.4.1: 1114 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1115 | 1116 | json-stable-stringify-without-jsonify@1.0.1: 1117 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1118 | 1119 | keygrip@1.1.0: 1120 | resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} 1121 | engines: {node: '>= 0.6'} 1122 | 1123 | keyv@4.5.4: 1124 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1125 | 1126 | koa-compose@4.1.0: 1127 | resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} 1128 | 1129 | koa-morgan@1.0.1: 1130 | resolution: {integrity: sha512-JOUdCNlc21G50afBXfErUrr1RKymbgzlrO5KURY+wmDG1Uvd2jmxUJcHgylb/mYXy2SjiNZyYim/ptUBGsIi3A==} 1131 | 1132 | koa-mount@4.0.0: 1133 | resolution: {integrity: sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ==} 1134 | engines: {node: '>= 7.6.0'} 1135 | 1136 | koa-send@5.0.1: 1137 | resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} 1138 | engines: {node: '>= 8'} 1139 | 1140 | koa-static@5.0.0: 1141 | resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} 1142 | engines: {node: '>= 7.6.0'} 1143 | 1144 | koa@3.0.1: 1145 | resolution: {integrity: sha512-oDxVkRwPOHhGlxKIDiDB2h+/l05QPtefD7nSqRgDfZt8P+QVYFWjfeK8jANf5O2YXjk8egd7KntvXKYx82wOag==} 1146 | engines: {node: '>= 18'} 1147 | 1148 | levn@0.4.1: 1149 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1150 | engines: {node: '>= 0.8.0'} 1151 | 1152 | load-json-file@4.0.0: 1153 | resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} 1154 | engines: {node: '>=4'} 1155 | 1156 | locate-path@6.0.0: 1157 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1158 | engines: {node: '>=10'} 1159 | 1160 | lodash.merge@4.6.2: 1161 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1162 | 1163 | log-symbols@4.1.0: 1164 | resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 1165 | engines: {node: '>=10'} 1166 | 1167 | lru-cache@11.0.1: 1168 | resolution: {integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==} 1169 | engines: {node: 20 || >=22} 1170 | 1171 | media-typer@1.1.0: 1172 | resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 1173 | engines: {node: '>= 0.8'} 1174 | 1175 | memorystream@0.3.1: 1176 | resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} 1177 | engines: {node: '>= 0.10.0'} 1178 | 1179 | merge2@1.4.1: 1180 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1181 | engines: {node: '>= 8'} 1182 | 1183 | micromatch@4.0.8: 1184 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1185 | engines: {node: '>=8.6'} 1186 | 1187 | mime-db@1.52.0: 1188 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1189 | engines: {node: '>= 0.6'} 1190 | 1191 | mime-db@1.54.0: 1192 | resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} 1193 | engines: {node: '>= 0.6'} 1194 | 1195 | mime-types@2.1.35: 1196 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1197 | engines: {node: '>= 0.6'} 1198 | 1199 | mime-types@3.0.1: 1200 | resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} 1201 | engines: {node: '>= 0.6'} 1202 | 1203 | minimatch@10.0.1: 1204 | resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} 1205 | engines: {node: 20 || >=22} 1206 | 1207 | minimatch@3.1.2: 1208 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1209 | 1210 | minimatch@5.1.6: 1211 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 1212 | engines: {node: '>=10'} 1213 | 1214 | minimatch@9.0.5: 1215 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1216 | engines: {node: '>=16 || 14 >=14.17'} 1217 | 1218 | minimist@1.2.8: 1219 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1220 | 1221 | minipass@7.1.2: 1222 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1223 | engines: {node: '>=16 || 14 >=14.17'} 1224 | 1225 | mocha@10.7.3: 1226 | resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} 1227 | engines: {node: '>= 14.0.0'} 1228 | hasBin: true 1229 | 1230 | morgan@1.10.0: 1231 | resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} 1232 | engines: {node: '>= 0.8.0'} 1233 | 1234 | ms@2.0.0: 1235 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 1236 | 1237 | ms@2.1.3: 1238 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1239 | 1240 | natural-compare@1.4.0: 1241 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1242 | 1243 | negotiator@0.6.3: 1244 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 1245 | engines: {node: '>= 0.6'} 1246 | 1247 | normalize-package-data@2.5.0: 1248 | resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 1249 | 1250 | normalize-path@3.0.0: 1251 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1252 | engines: {node: '>=0.10.0'} 1253 | 1254 | npm-run-all@4.1.5: 1255 | resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} 1256 | engines: {node: '>= 4'} 1257 | hasBin: true 1258 | 1259 | object-inspect@1.13.2: 1260 | resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} 1261 | engines: {node: '>= 0.4'} 1262 | 1263 | object-is@1.1.6: 1264 | resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} 1265 | engines: {node: '>= 0.4'} 1266 | 1267 | object-keys@1.1.1: 1268 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1269 | engines: {node: '>= 0.4'} 1270 | 1271 | object.assign@4.1.5: 1272 | resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} 1273 | engines: {node: '>= 0.4'} 1274 | 1275 | on-finished@2.3.0: 1276 | resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} 1277 | engines: {node: '>= 0.8'} 1278 | 1279 | on-finished@2.4.1: 1280 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 1281 | engines: {node: '>= 0.8'} 1282 | 1283 | on-headers@1.1.0: 1284 | resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} 1285 | engines: {node: '>= 0.8'} 1286 | 1287 | once@1.4.0: 1288 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1289 | 1290 | optionator@0.9.4: 1291 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1292 | engines: {node: '>= 0.8.0'} 1293 | 1294 | p-limit@3.1.0: 1295 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1296 | engines: {node: '>=10'} 1297 | 1298 | p-locate@5.0.0: 1299 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1300 | engines: {node: '>=10'} 1301 | 1302 | package-json-from-dist@1.0.1: 1303 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1304 | 1305 | pako@0.2.9: 1306 | resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} 1307 | 1308 | parent-module@1.0.1: 1309 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1310 | engines: {node: '>=6'} 1311 | 1312 | parse-json@4.0.0: 1313 | resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} 1314 | engines: {node: '>=4'} 1315 | 1316 | parseurl@1.3.3: 1317 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1318 | engines: {node: '>= 0.8'} 1319 | 1320 | path-exists@4.0.0: 1321 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1322 | engines: {node: '>=8'} 1323 | 1324 | path-is-absolute@1.0.1: 1325 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1326 | engines: {node: '>=0.10.0'} 1327 | 1328 | path-key@3.1.1: 1329 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1330 | engines: {node: '>=8'} 1331 | 1332 | path-parse@1.0.7: 1333 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1334 | 1335 | path-scurry@2.0.0: 1336 | resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} 1337 | engines: {node: 20 || >=22} 1338 | 1339 | path-to-regexp@6.3.0: 1340 | resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} 1341 | 1342 | path-type@3.0.0: 1343 | resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} 1344 | engines: {node: '>=4'} 1345 | 1346 | peek-stream@1.1.3: 1347 | resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} 1348 | 1349 | picomatch@2.3.1: 1350 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1351 | engines: {node: '>=8.6'} 1352 | 1353 | pidtree@0.3.1: 1354 | resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} 1355 | engines: {node: '>=0.10'} 1356 | hasBin: true 1357 | 1358 | pify@3.0.0: 1359 | resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} 1360 | engines: {node: '>=4'} 1361 | 1362 | playwright-core@1.48.0: 1363 | resolution: {integrity: sha512-RBvzjM9rdpP7UUFrQzRwR8L/xR4HyC1QXMzGYTbf1vjw25/ya9NRAVnXi/0fvFopjebvyPzsmoK58xxeEOaVvA==} 1364 | engines: {node: '>=18'} 1365 | hasBin: true 1366 | 1367 | playwright-core@1.51.1: 1368 | resolution: {integrity: sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==} 1369 | engines: {node: '>=18'} 1370 | hasBin: true 1371 | 1372 | playwright@1.51.1: 1373 | resolution: {integrity: sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==} 1374 | engines: {node: '>=18'} 1375 | hasBin: true 1376 | 1377 | possible-typed-array-names@1.0.0: 1378 | resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} 1379 | engines: {node: '>= 0.4'} 1380 | 1381 | prelude-ls@1.2.1: 1382 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1383 | engines: {node: '>= 0.8.0'} 1384 | 1385 | process-nextick-args@2.0.1: 1386 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1387 | 1388 | process@0.11.10: 1389 | resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 1390 | engines: {node: '>= 0.6.0'} 1391 | 1392 | pump@2.0.1: 1393 | resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} 1394 | 1395 | pump@3.0.2: 1396 | resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} 1397 | 1398 | pumpify@1.5.1: 1399 | resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} 1400 | 1401 | punycode@2.3.1: 1402 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1403 | engines: {node: '>=6'} 1404 | 1405 | queue-microtask@1.2.3: 1406 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1407 | 1408 | randombytes@2.1.0: 1409 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 1410 | 1411 | read-pkg@3.0.0: 1412 | resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} 1413 | engines: {node: '>=4'} 1414 | 1415 | readable-stream@2.3.8: 1416 | resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} 1417 | 1418 | readdirp@3.6.0: 1419 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1420 | engines: {node: '>=8.10.0'} 1421 | 1422 | regexp.prototype.flags@1.5.3: 1423 | resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} 1424 | engines: {node: '>= 0.4'} 1425 | 1426 | require-directory@2.1.1: 1427 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1428 | engines: {node: '>=0.10.0'} 1429 | 1430 | resolve-from@4.0.0: 1431 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1432 | engines: {node: '>=4'} 1433 | 1434 | resolve-path@1.4.0: 1435 | resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} 1436 | engines: {node: '>= 0.8'} 1437 | 1438 | resolve@1.22.8: 1439 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1440 | hasBin: true 1441 | 1442 | reusify@1.0.4: 1443 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1444 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1445 | 1446 | run-parallel@1.2.0: 1447 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1448 | 1449 | safe-array-concat@1.1.2: 1450 | resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} 1451 | engines: {node: '>=0.4'} 1452 | 1453 | safe-buffer@5.1.2: 1454 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1455 | 1456 | safe-buffer@5.2.1: 1457 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1458 | 1459 | safe-regex-test@1.0.3: 1460 | resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} 1461 | engines: {node: '>= 0.4'} 1462 | 1463 | semver@5.7.2: 1464 | resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 1465 | hasBin: true 1466 | 1467 | semver@7.6.3: 1468 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1469 | engines: {node: '>=10'} 1470 | hasBin: true 1471 | 1472 | serialize-javascript@6.0.2: 1473 | resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 1474 | 1475 | set-function-length@1.2.2: 1476 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 1477 | engines: {node: '>= 0.4'} 1478 | 1479 | set-function-name@2.0.2: 1480 | resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 1481 | engines: {node: '>= 0.4'} 1482 | 1483 | setprototypeof@1.1.0: 1484 | resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} 1485 | 1486 | setprototypeof@1.2.0: 1487 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1488 | 1489 | shebang-command@2.0.0: 1490 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1491 | engines: {node: '>=8'} 1492 | 1493 | shebang-regex@3.0.0: 1494 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1495 | engines: {node: '>=8'} 1496 | 1497 | shell-quote@1.8.1: 1498 | resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} 1499 | 1500 | side-channel@1.0.6: 1501 | resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} 1502 | engines: {node: '>= 0.4'} 1503 | 1504 | signal-exit@4.1.0: 1505 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1506 | engines: {node: '>=14'} 1507 | 1508 | spdx-correct@3.2.0: 1509 | resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} 1510 | 1511 | spdx-exceptions@2.5.0: 1512 | resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} 1513 | 1514 | spdx-expression-parse@3.0.1: 1515 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1516 | 1517 | spdx-license-ids@3.0.20: 1518 | resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} 1519 | 1520 | statuses@1.5.0: 1521 | resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} 1522 | engines: {node: '>= 0.6'} 1523 | 1524 | statuses@2.0.1: 1525 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 1526 | engines: {node: '>= 0.8'} 1527 | 1528 | stream-shift@1.0.3: 1529 | resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} 1530 | 1531 | streamx@2.22.0: 1532 | resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} 1533 | 1534 | string-width@4.2.3: 1535 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1536 | engines: {node: '>=8'} 1537 | 1538 | string-width@5.1.2: 1539 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1540 | engines: {node: '>=12'} 1541 | 1542 | string.prototype.padend@3.1.6: 1543 | resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} 1544 | engines: {node: '>= 0.4'} 1545 | 1546 | string.prototype.trim@1.2.9: 1547 | resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} 1548 | engines: {node: '>= 0.4'} 1549 | 1550 | string.prototype.trimend@1.0.8: 1551 | resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} 1552 | 1553 | string.prototype.trimstart@1.0.8: 1554 | resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} 1555 | engines: {node: '>= 0.4'} 1556 | 1557 | string_decoder@1.1.1: 1558 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1559 | 1560 | strip-ansi@6.0.1: 1561 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1562 | engines: {node: '>=8'} 1563 | 1564 | strip-ansi@7.1.0: 1565 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1566 | engines: {node: '>=12'} 1567 | 1568 | strip-bom@3.0.0: 1569 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1570 | engines: {node: '>=4'} 1571 | 1572 | strip-json-comments@3.1.1: 1573 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1574 | engines: {node: '>=8'} 1575 | 1576 | supports-color@5.5.0: 1577 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1578 | engines: {node: '>=4'} 1579 | 1580 | supports-color@7.2.0: 1581 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1582 | engines: {node: '>=8'} 1583 | 1584 | supports-color@8.1.1: 1585 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1586 | engines: {node: '>=10'} 1587 | 1588 | supports-preserve-symlinks-flag@1.0.0: 1589 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1590 | engines: {node: '>= 0.4'} 1591 | 1592 | tar-fs@3.0.9: 1593 | resolution: {integrity: sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==} 1594 | 1595 | tar-stream@3.1.7: 1596 | resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} 1597 | 1598 | text-decoder@1.2.0: 1599 | resolution: {integrity: sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==} 1600 | 1601 | text-table@0.2.0: 1602 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1603 | 1604 | through2@2.0.5: 1605 | resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} 1606 | 1607 | to-regex-range@5.0.1: 1608 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1609 | engines: {node: '>=8.0'} 1610 | 1611 | toidentifier@1.0.1: 1612 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1613 | engines: {node: '>=0.6'} 1614 | 1615 | ts-api-utils@1.3.0: 1616 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} 1617 | engines: {node: '>=16'} 1618 | peerDependencies: 1619 | typescript: '>=4.2.0' 1620 | 1621 | tsscmp@1.0.6: 1622 | resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} 1623 | engines: {node: '>=0.6.x'} 1624 | 1625 | type-check@0.4.0: 1626 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1627 | engines: {node: '>= 0.8.0'} 1628 | 1629 | type-is@2.0.1: 1630 | resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} 1631 | engines: {node: '>= 0.6'} 1632 | 1633 | typed-array-buffer@1.0.2: 1634 | resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} 1635 | engines: {node: '>= 0.4'} 1636 | 1637 | typed-array-byte-length@1.0.1: 1638 | resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} 1639 | engines: {node: '>= 0.4'} 1640 | 1641 | typed-array-byte-offset@1.0.2: 1642 | resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} 1643 | engines: {node: '>= 0.4'} 1644 | 1645 | typed-array-length@1.0.6: 1646 | resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} 1647 | engines: {node: '>= 0.4'} 1648 | 1649 | typescript@5.6.3: 1650 | resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} 1651 | engines: {node: '>=14.17'} 1652 | hasBin: true 1653 | 1654 | unbox-primitive@1.0.2: 1655 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 1656 | 1657 | uri-js@4.4.1: 1658 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1659 | 1660 | util-deprecate@1.0.2: 1661 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1662 | 1663 | util@0.12.5: 1664 | resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} 1665 | 1666 | validate-npm-package-license@3.0.4: 1667 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1668 | 1669 | vary@1.1.2: 1670 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1671 | engines: {node: '>= 0.8'} 1672 | 1673 | vscode-uri@3.0.8: 1674 | resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} 1675 | 1676 | which-boxed-primitive@1.0.2: 1677 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 1678 | 1679 | which-typed-array@1.1.15: 1680 | resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} 1681 | engines: {node: '>= 0.4'} 1682 | 1683 | which@2.0.2: 1684 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1685 | engines: {node: '>= 8'} 1686 | hasBin: true 1687 | 1688 | word-wrap@1.2.5: 1689 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1690 | engines: {node: '>=0.10.0'} 1691 | 1692 | workerpool@6.5.1: 1693 | resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} 1694 | 1695 | wrap-ansi@7.0.0: 1696 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1697 | engines: {node: '>=10'} 1698 | 1699 | wrap-ansi@8.1.0: 1700 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1701 | engines: {node: '>=12'} 1702 | 1703 | wrappy@1.0.2: 1704 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1705 | 1706 | xtend@4.0.2: 1707 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 1708 | engines: {node: '>=0.4'} 1709 | 1710 | y18n@5.0.8: 1711 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1712 | engines: {node: '>=10'} 1713 | 1714 | yargs-parser@20.2.9: 1715 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 1716 | engines: {node: '>=10'} 1717 | 1718 | yargs-unparser@2.0.0: 1719 | resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} 1720 | engines: {node: '>=10'} 1721 | 1722 | yargs@16.2.0: 1723 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 1724 | engines: {node: '>=10'} 1725 | 1726 | yocto-queue@0.1.0: 1727 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1728 | engines: {node: '>=10'} 1729 | 1730 | snapshots: 1731 | 1732 | '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.25.1)': 1733 | dependencies: 1734 | esbuild: 0.25.1 1735 | 1736 | '@esbuild/aix-ppc64@0.25.1': 1737 | optional: true 1738 | 1739 | '@esbuild/android-arm64@0.25.1': 1740 | optional: true 1741 | 1742 | '@esbuild/android-arm@0.25.1': 1743 | optional: true 1744 | 1745 | '@esbuild/android-x64@0.25.1': 1746 | optional: true 1747 | 1748 | '@esbuild/darwin-arm64@0.25.1': 1749 | optional: true 1750 | 1751 | '@esbuild/darwin-x64@0.25.1': 1752 | optional: true 1753 | 1754 | '@esbuild/freebsd-arm64@0.25.1': 1755 | optional: true 1756 | 1757 | '@esbuild/freebsd-x64@0.25.1': 1758 | optional: true 1759 | 1760 | '@esbuild/linux-arm64@0.25.1': 1761 | optional: true 1762 | 1763 | '@esbuild/linux-arm@0.25.1': 1764 | optional: true 1765 | 1766 | '@esbuild/linux-ia32@0.25.1': 1767 | optional: true 1768 | 1769 | '@esbuild/linux-loong64@0.25.1': 1770 | optional: true 1771 | 1772 | '@esbuild/linux-mips64el@0.25.1': 1773 | optional: true 1774 | 1775 | '@esbuild/linux-ppc64@0.25.1': 1776 | optional: true 1777 | 1778 | '@esbuild/linux-riscv64@0.25.1': 1779 | optional: true 1780 | 1781 | '@esbuild/linux-s390x@0.25.1': 1782 | optional: true 1783 | 1784 | '@esbuild/linux-x64@0.25.1': 1785 | optional: true 1786 | 1787 | '@esbuild/netbsd-arm64@0.25.1': 1788 | optional: true 1789 | 1790 | '@esbuild/netbsd-x64@0.25.1': 1791 | optional: true 1792 | 1793 | '@esbuild/openbsd-arm64@0.25.1': 1794 | optional: true 1795 | 1796 | '@esbuild/openbsd-x64@0.25.1': 1797 | optional: true 1798 | 1799 | '@esbuild/sunos-x64@0.25.1': 1800 | optional: true 1801 | 1802 | '@esbuild/win32-arm64@0.25.1': 1803 | optional: true 1804 | 1805 | '@esbuild/win32-ia32@0.25.1': 1806 | optional: true 1807 | 1808 | '@esbuild/win32-x64@0.25.1': 1809 | optional: true 1810 | 1811 | '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0)': 1812 | dependencies: 1813 | eslint: 9.12.0 1814 | eslint-visitor-keys: 3.4.3 1815 | 1816 | '@eslint-community/regexpp@4.11.1': {} 1817 | 1818 | '@eslint/config-array@0.18.0': 1819 | dependencies: 1820 | '@eslint/object-schema': 2.1.4 1821 | debug: 4.3.7(supports-color@8.1.1) 1822 | minimatch: 3.1.2 1823 | transitivePeerDependencies: 1824 | - supports-color 1825 | 1826 | '@eslint/core@0.15.1': 1827 | dependencies: 1828 | '@types/json-schema': 7.0.15 1829 | 1830 | '@eslint/core@0.6.0': {} 1831 | 1832 | '@eslint/eslintrc@3.1.0': 1833 | dependencies: 1834 | ajv: 6.12.6 1835 | debug: 4.3.7(supports-color@8.1.1) 1836 | espree: 10.2.0 1837 | globals: 14.0.0 1838 | ignore: 5.3.2 1839 | import-fresh: 3.3.0 1840 | js-yaml: 4.1.0 1841 | minimatch: 3.1.2 1842 | strip-json-comments: 3.1.1 1843 | transitivePeerDependencies: 1844 | - supports-color 1845 | 1846 | '@eslint/js@9.12.0': {} 1847 | 1848 | '@eslint/object-schema@2.1.4': {} 1849 | 1850 | '@eslint/plugin-kit@0.3.4': 1851 | dependencies: 1852 | '@eslint/core': 0.15.1 1853 | levn: 0.4.1 1854 | 1855 | '@humanfs/core@0.19.0': {} 1856 | 1857 | '@humanfs/node@0.16.5': 1858 | dependencies: 1859 | '@humanfs/core': 0.19.0 1860 | '@humanwhocodes/retry': 0.3.1 1861 | 1862 | '@humanwhocodes/module-importer@1.0.1': {} 1863 | 1864 | '@humanwhocodes/retry@0.3.1': {} 1865 | 1866 | '@isaacs/cliui@8.0.2': 1867 | dependencies: 1868 | string-width: 5.1.2 1869 | string-width-cjs: string-width@4.2.3 1870 | strip-ansi: 7.1.0 1871 | strip-ansi-cjs: strip-ansi@6.0.1 1872 | wrap-ansi: 8.1.0 1873 | wrap-ansi-cjs: wrap-ansi@7.0.0 1874 | 1875 | '@koa/cors@5.0.0': 1876 | dependencies: 1877 | vary: 1.1.2 1878 | 1879 | '@koa/router@13.1.0': 1880 | dependencies: 1881 | http-errors: 2.0.0 1882 | koa-compose: 4.1.0 1883 | path-to-regexp: 6.3.0 1884 | 1885 | '@nodelib/fs.scandir@2.1.5': 1886 | dependencies: 1887 | '@nodelib/fs.stat': 2.0.5 1888 | run-parallel: 1.2.0 1889 | 1890 | '@nodelib/fs.stat@2.0.5': {} 1891 | 1892 | '@nodelib/fs.walk@1.2.8': 1893 | dependencies: 1894 | '@nodelib/fs.scandir': 2.1.5 1895 | fastq: 1.17.1 1896 | 1897 | '@playwright/browser-chromium@1.48.0': 1898 | dependencies: 1899 | playwright-core: 1.48.0 1900 | 1901 | '@types/assert@1.5.10': {} 1902 | 1903 | '@types/estree@1.0.6': {} 1904 | 1905 | '@types/json-schema@7.0.15': {} 1906 | 1907 | '@types/mocha@10.0.9': {} 1908 | 1909 | '@types/vscode@1.94.0': {} 1910 | 1911 | '@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3)': 1912 | dependencies: 1913 | '@eslint-community/regexpp': 4.11.1 1914 | '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) 1915 | '@typescript-eslint/scope-manager': 8.8.1 1916 | '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) 1917 | '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) 1918 | '@typescript-eslint/visitor-keys': 8.8.1 1919 | eslint: 9.12.0 1920 | graphemer: 1.4.0 1921 | ignore: 5.3.2 1922 | natural-compare: 1.4.0 1923 | ts-api-utils: 1.3.0(typescript@5.6.3) 1924 | optionalDependencies: 1925 | typescript: 5.6.3 1926 | transitivePeerDependencies: 1927 | - supports-color 1928 | 1929 | '@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3)': 1930 | dependencies: 1931 | '@typescript-eslint/scope-manager': 8.8.1 1932 | '@typescript-eslint/types': 8.8.1 1933 | '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) 1934 | '@typescript-eslint/visitor-keys': 8.8.1 1935 | debug: 4.3.7(supports-color@8.1.1) 1936 | eslint: 9.12.0 1937 | optionalDependencies: 1938 | typescript: 5.6.3 1939 | transitivePeerDependencies: 1940 | - supports-color 1941 | 1942 | '@typescript-eslint/scope-manager@8.8.1': 1943 | dependencies: 1944 | '@typescript-eslint/types': 8.8.1 1945 | '@typescript-eslint/visitor-keys': 8.8.1 1946 | 1947 | '@typescript-eslint/type-utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)': 1948 | dependencies: 1949 | '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) 1950 | '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) 1951 | debug: 4.3.7(supports-color@8.1.1) 1952 | ts-api-utils: 1.3.0(typescript@5.6.3) 1953 | optionalDependencies: 1954 | typescript: 5.6.3 1955 | transitivePeerDependencies: 1956 | - eslint 1957 | - supports-color 1958 | 1959 | '@typescript-eslint/types@8.8.1': {} 1960 | 1961 | '@typescript-eslint/typescript-estree@8.8.1(typescript@5.6.3)': 1962 | dependencies: 1963 | '@typescript-eslint/types': 8.8.1 1964 | '@typescript-eslint/visitor-keys': 8.8.1 1965 | debug: 4.3.7(supports-color@8.1.1) 1966 | fast-glob: 3.3.2 1967 | is-glob: 4.0.3 1968 | minimatch: 9.0.5 1969 | semver: 7.6.3 1970 | ts-api-utils: 1.3.0(typescript@5.6.3) 1971 | optionalDependencies: 1972 | typescript: 5.6.3 1973 | transitivePeerDependencies: 1974 | - supports-color 1975 | 1976 | '@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)': 1977 | dependencies: 1978 | '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) 1979 | '@typescript-eslint/scope-manager': 8.8.1 1980 | '@typescript-eslint/types': 8.8.1 1981 | '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) 1982 | eslint: 9.12.0 1983 | transitivePeerDependencies: 1984 | - supports-color 1985 | - typescript 1986 | 1987 | '@typescript-eslint/visitor-keys@8.8.1': 1988 | dependencies: 1989 | '@typescript-eslint/types': 8.8.1 1990 | eslint-visitor-keys: 3.4.3 1991 | 1992 | '@vscode/test-web@0.0.61': 1993 | dependencies: 1994 | '@koa/cors': 5.0.0 1995 | '@koa/router': 13.1.0 1996 | '@playwright/browser-chromium': 1.48.0 1997 | glob: 11.0.0 1998 | gunzip-maybe: 1.4.2 1999 | http-proxy-agent: 7.0.2 2000 | https-proxy-agent: 7.0.5 2001 | koa: 3.0.1 2002 | koa-morgan: 1.0.1 2003 | koa-mount: 4.0.0 2004 | koa-static: 5.0.0 2005 | minimist: 1.2.8 2006 | playwright: 1.51.1 2007 | tar-fs: 3.0.9 2008 | vscode-uri: 3.0.8 2009 | transitivePeerDependencies: 2010 | - bare-buffer 2011 | - supports-color 2012 | 2013 | accepts@1.3.8: 2014 | dependencies: 2015 | mime-types: 2.1.35 2016 | negotiator: 0.6.3 2017 | 2018 | acorn-jsx@5.3.2(acorn@8.12.1): 2019 | dependencies: 2020 | acorn: 8.12.1 2021 | 2022 | acorn@8.12.1: {} 2023 | 2024 | agent-base@7.1.1: 2025 | dependencies: 2026 | debug: 4.3.7(supports-color@8.1.1) 2027 | transitivePeerDependencies: 2028 | - supports-color 2029 | 2030 | ajv@6.12.6: 2031 | dependencies: 2032 | fast-deep-equal: 3.1.3 2033 | fast-json-stable-stringify: 2.1.0 2034 | json-schema-traverse: 0.4.1 2035 | uri-js: 4.4.1 2036 | 2037 | ansi-colors@4.1.3: {} 2038 | 2039 | ansi-regex@5.0.1: {} 2040 | 2041 | ansi-regex@6.1.0: {} 2042 | 2043 | ansi-styles@3.2.1: 2044 | dependencies: 2045 | color-convert: 1.9.3 2046 | 2047 | ansi-styles@4.3.0: 2048 | dependencies: 2049 | color-convert: 2.0.1 2050 | 2051 | ansi-styles@6.2.1: {} 2052 | 2053 | anymatch@3.1.3: 2054 | dependencies: 2055 | normalize-path: 3.0.0 2056 | picomatch: 2.3.1 2057 | 2058 | argparse@2.0.1: {} 2059 | 2060 | array-buffer-byte-length@1.0.1: 2061 | dependencies: 2062 | call-bind: 1.0.7 2063 | is-array-buffer: 3.0.4 2064 | 2065 | arraybuffer.prototype.slice@1.0.3: 2066 | dependencies: 2067 | array-buffer-byte-length: 1.0.1 2068 | call-bind: 1.0.7 2069 | define-properties: 1.2.1 2070 | es-abstract: 1.23.3 2071 | es-errors: 1.3.0 2072 | get-intrinsic: 1.2.4 2073 | is-array-buffer: 3.0.4 2074 | is-shared-array-buffer: 1.0.3 2075 | 2076 | assert@2.1.0: 2077 | dependencies: 2078 | call-bind: 1.0.7 2079 | is-nan: 1.3.2 2080 | object-is: 1.1.6 2081 | object.assign: 4.1.5 2082 | util: 0.12.5 2083 | 2084 | available-typed-arrays@1.0.7: 2085 | dependencies: 2086 | possible-typed-array-names: 1.0.0 2087 | 2088 | b4a@1.6.7: {} 2089 | 2090 | balanced-match@3.0.1: {} 2091 | 2092 | bare-events@2.5.4: 2093 | optional: true 2094 | 2095 | bare-fs@4.1.2: 2096 | dependencies: 2097 | bare-events: 2.5.4 2098 | bare-path: 3.0.0 2099 | bare-stream: 2.6.5(bare-events@2.5.4) 2100 | optional: true 2101 | 2102 | bare-os@3.6.1: 2103 | optional: true 2104 | 2105 | bare-path@3.0.0: 2106 | dependencies: 2107 | bare-os: 3.6.1 2108 | optional: true 2109 | 2110 | bare-stream@2.6.5(bare-events@2.5.4): 2111 | dependencies: 2112 | streamx: 2.22.0 2113 | optionalDependencies: 2114 | bare-events: 2.5.4 2115 | optional: true 2116 | 2117 | basic-auth@2.0.1: 2118 | dependencies: 2119 | safe-buffer: 5.1.2 2120 | 2121 | binary-extensions@2.3.0: {} 2122 | 2123 | brace-expansion@4.0.1: 2124 | dependencies: 2125 | balanced-match: 3.0.1 2126 | 2127 | braces@3.0.3: 2128 | dependencies: 2129 | fill-range: 7.1.1 2130 | 2131 | browser-stdout@1.3.1: {} 2132 | 2133 | browserify-zlib@0.1.4: 2134 | dependencies: 2135 | pako: 0.2.9 2136 | 2137 | buffer-from@1.1.2: {} 2138 | 2139 | call-bind@1.0.7: 2140 | dependencies: 2141 | es-define-property: 1.0.0 2142 | es-errors: 1.3.0 2143 | function-bind: 1.1.2 2144 | get-intrinsic: 1.2.4 2145 | set-function-length: 1.2.2 2146 | 2147 | callsites@3.1.0: {} 2148 | 2149 | camelcase@6.3.0: {} 2150 | 2151 | chalk@2.4.2: 2152 | dependencies: 2153 | ansi-styles: 3.2.1 2154 | escape-string-regexp: 1.0.5 2155 | supports-color: 5.5.0 2156 | 2157 | chalk@4.1.2: 2158 | dependencies: 2159 | ansi-styles: 4.3.0 2160 | supports-color: 7.2.0 2161 | 2162 | chokidar@3.6.0: 2163 | dependencies: 2164 | anymatch: 3.1.3 2165 | braces: 3.0.3 2166 | glob-parent: 5.1.2 2167 | is-binary-path: 2.1.0 2168 | is-glob: 4.0.3 2169 | normalize-path: 3.0.0 2170 | readdirp: 3.6.0 2171 | optionalDependencies: 2172 | fsevents: 2.3.3 2173 | 2174 | cliui@7.0.4: 2175 | dependencies: 2176 | string-width: 4.2.3 2177 | strip-ansi: 6.0.1 2178 | wrap-ansi: 7.0.0 2179 | 2180 | color-convert@1.9.3: 2181 | dependencies: 2182 | color-name: 1.1.3 2183 | 2184 | color-convert@2.0.1: 2185 | dependencies: 2186 | color-name: 1.1.4 2187 | 2188 | color-name@1.1.3: {} 2189 | 2190 | color-name@1.1.4: {} 2191 | 2192 | content-disposition@0.5.4: 2193 | dependencies: 2194 | safe-buffer: 5.2.1 2195 | 2196 | content-type@1.0.5: {} 2197 | 2198 | cookies@0.9.1: 2199 | dependencies: 2200 | depd: 2.0.0 2201 | keygrip: 1.1.0 2202 | 2203 | core-util-is@1.0.3: {} 2204 | 2205 | cross-spawn@7.0.3: 2206 | dependencies: 2207 | path-key: 3.1.1 2208 | shebang-command: 2.0.0 2209 | which: 2.0.2 2210 | 2211 | cross-spawn@7.0.6: 2212 | dependencies: 2213 | path-key: 3.1.1 2214 | shebang-command: 2.0.0 2215 | which: 2.0.2 2216 | 2217 | data-view-buffer@1.0.1: 2218 | dependencies: 2219 | call-bind: 1.0.7 2220 | es-errors: 1.3.0 2221 | is-data-view: 1.0.1 2222 | 2223 | data-view-byte-length@1.0.1: 2224 | dependencies: 2225 | call-bind: 1.0.7 2226 | es-errors: 1.3.0 2227 | is-data-view: 1.0.1 2228 | 2229 | data-view-byte-offset@1.0.0: 2230 | dependencies: 2231 | call-bind: 1.0.7 2232 | es-errors: 1.3.0 2233 | is-data-view: 1.0.1 2234 | 2235 | debug@2.6.9: 2236 | dependencies: 2237 | ms: 2.0.0 2238 | 2239 | debug@3.2.7: 2240 | dependencies: 2241 | ms: 2.1.3 2242 | 2243 | debug@4.3.7(supports-color@8.1.1): 2244 | dependencies: 2245 | ms: 2.1.3 2246 | optionalDependencies: 2247 | supports-color: 8.1.1 2248 | 2249 | decamelize@4.0.0: {} 2250 | 2251 | deep-equal@1.0.1: {} 2252 | 2253 | deep-is@0.1.4: {} 2254 | 2255 | define-data-property@1.1.4: 2256 | dependencies: 2257 | es-define-property: 1.0.0 2258 | es-errors: 1.3.0 2259 | gopd: 1.0.1 2260 | 2261 | define-properties@1.2.1: 2262 | dependencies: 2263 | define-data-property: 1.1.4 2264 | has-property-descriptors: 1.0.2 2265 | object-keys: 1.1.1 2266 | 2267 | delegates@1.0.0: {} 2268 | 2269 | depd@1.1.2: {} 2270 | 2271 | depd@2.0.0: {} 2272 | 2273 | destroy@1.2.0: {} 2274 | 2275 | diff@5.2.0: {} 2276 | 2277 | duplexify@3.7.1: 2278 | dependencies: 2279 | end-of-stream: 1.4.4 2280 | inherits: 2.0.4 2281 | readable-stream: 2.3.8 2282 | stream-shift: 1.0.3 2283 | 2284 | eastasianwidth@0.2.0: {} 2285 | 2286 | ee-first@1.1.1: {} 2287 | 2288 | emoji-regex@8.0.0: {} 2289 | 2290 | emoji-regex@9.2.2: {} 2291 | 2292 | encodeurl@2.0.0: {} 2293 | 2294 | end-of-stream@1.4.4: 2295 | dependencies: 2296 | once: 1.4.0 2297 | 2298 | error-ex@1.3.2: 2299 | dependencies: 2300 | is-arrayish: 0.2.1 2301 | 2302 | es-abstract@1.23.3: 2303 | dependencies: 2304 | array-buffer-byte-length: 1.0.1 2305 | arraybuffer.prototype.slice: 1.0.3 2306 | available-typed-arrays: 1.0.7 2307 | call-bind: 1.0.7 2308 | data-view-buffer: 1.0.1 2309 | data-view-byte-length: 1.0.1 2310 | data-view-byte-offset: 1.0.0 2311 | es-define-property: 1.0.0 2312 | es-errors: 1.3.0 2313 | es-object-atoms: 1.0.0 2314 | es-set-tostringtag: 2.0.3 2315 | es-to-primitive: 1.2.1 2316 | function.prototype.name: 1.1.6 2317 | get-intrinsic: 1.2.4 2318 | get-symbol-description: 1.0.2 2319 | globalthis: 1.0.4 2320 | gopd: 1.0.1 2321 | has-property-descriptors: 1.0.2 2322 | has-proto: 1.0.3 2323 | has-symbols: 1.0.3 2324 | hasown: 2.0.2 2325 | internal-slot: 1.0.7 2326 | is-array-buffer: 3.0.4 2327 | is-callable: 1.2.7 2328 | is-data-view: 1.0.1 2329 | is-negative-zero: 2.0.3 2330 | is-regex: 1.1.4 2331 | is-shared-array-buffer: 1.0.3 2332 | is-string: 1.0.7 2333 | is-typed-array: 1.1.13 2334 | is-weakref: 1.0.2 2335 | object-inspect: 1.13.2 2336 | object-keys: 1.1.1 2337 | object.assign: 4.1.5 2338 | regexp.prototype.flags: 1.5.3 2339 | safe-array-concat: 1.1.2 2340 | safe-regex-test: 1.0.3 2341 | string.prototype.trim: 1.2.9 2342 | string.prototype.trimend: 1.0.8 2343 | string.prototype.trimstart: 1.0.8 2344 | typed-array-buffer: 1.0.2 2345 | typed-array-byte-length: 1.0.1 2346 | typed-array-byte-offset: 1.0.2 2347 | typed-array-length: 1.0.6 2348 | unbox-primitive: 1.0.2 2349 | which-typed-array: 1.1.15 2350 | 2351 | es-define-property@1.0.0: 2352 | dependencies: 2353 | get-intrinsic: 1.2.4 2354 | 2355 | es-errors@1.3.0: {} 2356 | 2357 | es-object-atoms@1.0.0: 2358 | dependencies: 2359 | es-errors: 1.3.0 2360 | 2361 | es-set-tostringtag@2.0.3: 2362 | dependencies: 2363 | get-intrinsic: 1.2.4 2364 | has-tostringtag: 1.0.2 2365 | hasown: 2.0.2 2366 | 2367 | es-to-primitive@1.2.1: 2368 | dependencies: 2369 | is-callable: 1.2.7 2370 | is-date-object: 1.0.5 2371 | is-symbol: 1.0.4 2372 | 2373 | esbuild@0.25.1: 2374 | optionalDependencies: 2375 | '@esbuild/aix-ppc64': 0.25.1 2376 | '@esbuild/android-arm': 0.25.1 2377 | '@esbuild/android-arm64': 0.25.1 2378 | '@esbuild/android-x64': 0.25.1 2379 | '@esbuild/darwin-arm64': 0.25.1 2380 | '@esbuild/darwin-x64': 0.25.1 2381 | '@esbuild/freebsd-arm64': 0.25.1 2382 | '@esbuild/freebsd-x64': 0.25.1 2383 | '@esbuild/linux-arm': 0.25.1 2384 | '@esbuild/linux-arm64': 0.25.1 2385 | '@esbuild/linux-ia32': 0.25.1 2386 | '@esbuild/linux-loong64': 0.25.1 2387 | '@esbuild/linux-mips64el': 0.25.1 2388 | '@esbuild/linux-ppc64': 0.25.1 2389 | '@esbuild/linux-riscv64': 0.25.1 2390 | '@esbuild/linux-s390x': 0.25.1 2391 | '@esbuild/linux-x64': 0.25.1 2392 | '@esbuild/netbsd-arm64': 0.25.1 2393 | '@esbuild/netbsd-x64': 0.25.1 2394 | '@esbuild/openbsd-arm64': 0.25.1 2395 | '@esbuild/openbsd-x64': 0.25.1 2396 | '@esbuild/sunos-x64': 0.25.1 2397 | '@esbuild/win32-arm64': 0.25.1 2398 | '@esbuild/win32-ia32': 0.25.1 2399 | '@esbuild/win32-x64': 0.25.1 2400 | 2401 | escalade@3.2.0: {} 2402 | 2403 | escape-html@1.0.3: {} 2404 | 2405 | escape-string-regexp@1.0.5: {} 2406 | 2407 | escape-string-regexp@4.0.0: {} 2408 | 2409 | eslint-scope@8.1.0: 2410 | dependencies: 2411 | esrecurse: 4.3.0 2412 | estraverse: 5.3.0 2413 | 2414 | eslint-visitor-keys@3.4.3: {} 2415 | 2416 | eslint-visitor-keys@4.1.0: {} 2417 | 2418 | eslint@9.12.0: 2419 | dependencies: 2420 | '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) 2421 | '@eslint-community/regexpp': 4.11.1 2422 | '@eslint/config-array': 0.18.0 2423 | '@eslint/core': 0.6.0 2424 | '@eslint/eslintrc': 3.1.0 2425 | '@eslint/js': 9.12.0 2426 | '@eslint/plugin-kit': 0.3.4 2427 | '@humanfs/node': 0.16.5 2428 | '@humanwhocodes/module-importer': 1.0.1 2429 | '@humanwhocodes/retry': 0.3.1 2430 | '@types/estree': 1.0.6 2431 | '@types/json-schema': 7.0.15 2432 | ajv: 6.12.6 2433 | chalk: 4.1.2 2434 | cross-spawn: 7.0.6 2435 | debug: 4.3.7(supports-color@8.1.1) 2436 | escape-string-regexp: 4.0.0 2437 | eslint-scope: 8.1.0 2438 | eslint-visitor-keys: 4.1.0 2439 | espree: 10.2.0 2440 | esquery: 1.6.0 2441 | esutils: 2.0.3 2442 | fast-deep-equal: 3.1.3 2443 | file-entry-cache: 8.0.0 2444 | find-up: 5.0.0 2445 | glob-parent: 6.0.2 2446 | ignore: 5.3.2 2447 | imurmurhash: 0.1.4 2448 | is-glob: 4.0.3 2449 | json-stable-stringify-without-jsonify: 1.0.1 2450 | lodash.merge: 4.6.2 2451 | minimatch: 3.1.2 2452 | natural-compare: 1.4.0 2453 | optionator: 0.9.4 2454 | text-table: 0.2.0 2455 | transitivePeerDependencies: 2456 | - supports-color 2457 | 2458 | espree@10.2.0: 2459 | dependencies: 2460 | acorn: 8.12.1 2461 | acorn-jsx: 5.3.2(acorn@8.12.1) 2462 | eslint-visitor-keys: 4.1.0 2463 | 2464 | esquery@1.6.0: 2465 | dependencies: 2466 | estraverse: 5.3.0 2467 | 2468 | esrecurse@4.3.0: 2469 | dependencies: 2470 | estraverse: 5.3.0 2471 | 2472 | estraverse@5.3.0: {} 2473 | 2474 | esutils@2.0.3: {} 2475 | 2476 | fast-deep-equal@3.1.3: {} 2477 | 2478 | fast-fifo@1.3.2: {} 2479 | 2480 | fast-glob@3.3.2: 2481 | dependencies: 2482 | '@nodelib/fs.stat': 2.0.5 2483 | '@nodelib/fs.walk': 1.2.8 2484 | glob-parent: 5.1.2 2485 | merge2: 1.4.1 2486 | micromatch: 4.0.8 2487 | 2488 | fast-json-stable-stringify@2.1.0: {} 2489 | 2490 | fast-levenshtein@2.0.6: {} 2491 | 2492 | fastq@1.17.1: 2493 | dependencies: 2494 | reusify: 1.0.4 2495 | 2496 | file-entry-cache@8.0.0: 2497 | dependencies: 2498 | flat-cache: 4.0.1 2499 | 2500 | fill-range@7.1.1: 2501 | dependencies: 2502 | to-regex-range: 5.0.1 2503 | 2504 | find-up@5.0.0: 2505 | dependencies: 2506 | locate-path: 6.0.0 2507 | path-exists: 4.0.0 2508 | 2509 | flat-cache@4.0.1: 2510 | dependencies: 2511 | flatted: 3.3.1 2512 | keyv: 4.5.4 2513 | 2514 | flat@5.0.2: {} 2515 | 2516 | flatted@3.3.1: {} 2517 | 2518 | for-each@0.3.3: 2519 | dependencies: 2520 | is-callable: 1.2.7 2521 | 2522 | foreground-child@3.3.0: 2523 | dependencies: 2524 | cross-spawn: 7.0.6 2525 | signal-exit: 4.1.0 2526 | 2527 | fresh@0.5.2: {} 2528 | 2529 | fs.realpath@1.0.0: {} 2530 | 2531 | fsevents@2.3.2: 2532 | optional: true 2533 | 2534 | fsevents@2.3.3: 2535 | optional: true 2536 | 2537 | function-bind@1.1.2: {} 2538 | 2539 | function.prototype.name@1.1.6: 2540 | dependencies: 2541 | call-bind: 1.0.7 2542 | define-properties: 1.2.1 2543 | es-abstract: 1.23.3 2544 | functions-have-names: 1.2.3 2545 | 2546 | functions-have-names@1.2.3: {} 2547 | 2548 | get-caller-file@2.0.5: {} 2549 | 2550 | get-intrinsic@1.2.4: 2551 | dependencies: 2552 | es-errors: 1.3.0 2553 | function-bind: 1.1.2 2554 | has-proto: 1.0.3 2555 | has-symbols: 1.0.3 2556 | hasown: 2.0.2 2557 | 2558 | get-symbol-description@1.0.2: 2559 | dependencies: 2560 | call-bind: 1.0.7 2561 | es-errors: 1.3.0 2562 | get-intrinsic: 1.2.4 2563 | 2564 | glob-parent@5.1.2: 2565 | dependencies: 2566 | is-glob: 4.0.3 2567 | 2568 | glob-parent@6.0.2: 2569 | dependencies: 2570 | is-glob: 4.0.3 2571 | 2572 | glob@11.0.0: 2573 | dependencies: 2574 | foreground-child: 3.3.0 2575 | jackspeak: 4.0.2 2576 | minimatch: 10.0.1 2577 | minipass: 7.1.2 2578 | package-json-from-dist: 1.0.1 2579 | path-scurry: 2.0.0 2580 | 2581 | glob@8.1.0: 2582 | dependencies: 2583 | fs.realpath: 1.0.0 2584 | inflight: 1.0.6 2585 | inherits: 2.0.4 2586 | minimatch: 5.1.6 2587 | once: 1.4.0 2588 | 2589 | globals@14.0.0: {} 2590 | 2591 | globalthis@1.0.4: 2592 | dependencies: 2593 | define-properties: 1.2.1 2594 | gopd: 1.0.1 2595 | 2596 | gopd@1.0.1: 2597 | dependencies: 2598 | get-intrinsic: 1.2.4 2599 | 2600 | graceful-fs@4.2.11: {} 2601 | 2602 | graphemer@1.4.0: {} 2603 | 2604 | gunzip-maybe@1.4.2: 2605 | dependencies: 2606 | browserify-zlib: 0.1.4 2607 | is-deflate: 1.0.0 2608 | is-gzip: 1.0.0 2609 | peek-stream: 1.1.3 2610 | pumpify: 1.5.1 2611 | through2: 2.0.5 2612 | 2613 | has-bigints@1.0.2: {} 2614 | 2615 | has-flag@3.0.0: {} 2616 | 2617 | has-flag@4.0.0: {} 2618 | 2619 | has-property-descriptors@1.0.2: 2620 | dependencies: 2621 | es-define-property: 1.0.0 2622 | 2623 | has-proto@1.0.3: {} 2624 | 2625 | has-symbols@1.0.3: {} 2626 | 2627 | has-tostringtag@1.0.2: 2628 | dependencies: 2629 | has-symbols: 1.0.3 2630 | 2631 | hasown@2.0.2: 2632 | dependencies: 2633 | function-bind: 1.1.2 2634 | 2635 | he@1.2.0: {} 2636 | 2637 | hosted-git-info@2.8.9: {} 2638 | 2639 | http-assert@1.5.0: 2640 | dependencies: 2641 | deep-equal: 1.0.1 2642 | http-errors: 1.8.1 2643 | 2644 | http-errors@1.6.3: 2645 | dependencies: 2646 | depd: 1.1.2 2647 | inherits: 2.0.3 2648 | setprototypeof: 1.1.0 2649 | statuses: 1.5.0 2650 | 2651 | http-errors@1.8.1: 2652 | dependencies: 2653 | depd: 1.1.2 2654 | inherits: 2.0.4 2655 | setprototypeof: 1.2.0 2656 | statuses: 1.5.0 2657 | toidentifier: 1.0.1 2658 | 2659 | http-errors@2.0.0: 2660 | dependencies: 2661 | depd: 2.0.0 2662 | inherits: 2.0.4 2663 | setprototypeof: 1.2.0 2664 | statuses: 2.0.1 2665 | toidentifier: 1.0.1 2666 | 2667 | http-proxy-agent@7.0.2: 2668 | dependencies: 2669 | agent-base: 7.1.1 2670 | debug: 4.3.7(supports-color@8.1.1) 2671 | transitivePeerDependencies: 2672 | - supports-color 2673 | 2674 | https-proxy-agent@7.0.5: 2675 | dependencies: 2676 | agent-base: 7.1.1 2677 | debug: 4.3.7(supports-color@8.1.1) 2678 | transitivePeerDependencies: 2679 | - supports-color 2680 | 2681 | ignore@5.3.2: {} 2682 | 2683 | import-fresh@3.3.0: 2684 | dependencies: 2685 | parent-module: 1.0.1 2686 | resolve-from: 4.0.0 2687 | 2688 | imurmurhash@0.1.4: {} 2689 | 2690 | inflight@1.0.6: 2691 | dependencies: 2692 | once: 1.4.0 2693 | wrappy: 1.0.2 2694 | 2695 | inherits@2.0.3: {} 2696 | 2697 | inherits@2.0.4: {} 2698 | 2699 | internal-slot@1.0.7: 2700 | dependencies: 2701 | es-errors: 1.3.0 2702 | hasown: 2.0.2 2703 | side-channel: 1.0.6 2704 | 2705 | is-arguments@1.1.1: 2706 | dependencies: 2707 | call-bind: 1.0.7 2708 | has-tostringtag: 1.0.2 2709 | 2710 | is-array-buffer@3.0.4: 2711 | dependencies: 2712 | call-bind: 1.0.7 2713 | get-intrinsic: 1.2.4 2714 | 2715 | is-arrayish@0.2.1: {} 2716 | 2717 | is-bigint@1.0.4: 2718 | dependencies: 2719 | has-bigints: 1.0.2 2720 | 2721 | is-binary-path@2.1.0: 2722 | dependencies: 2723 | binary-extensions: 2.3.0 2724 | 2725 | is-boolean-object@1.1.2: 2726 | dependencies: 2727 | call-bind: 1.0.7 2728 | has-tostringtag: 1.0.2 2729 | 2730 | is-callable@1.2.7: {} 2731 | 2732 | is-core-module@2.15.1: 2733 | dependencies: 2734 | hasown: 2.0.2 2735 | 2736 | is-data-view@1.0.1: 2737 | dependencies: 2738 | is-typed-array: 1.1.13 2739 | 2740 | is-date-object@1.0.5: 2741 | dependencies: 2742 | has-tostringtag: 1.0.2 2743 | 2744 | is-deflate@1.0.0: {} 2745 | 2746 | is-extglob@2.1.1: {} 2747 | 2748 | is-fullwidth-code-point@3.0.0: {} 2749 | 2750 | is-generator-function@1.0.10: 2751 | dependencies: 2752 | has-tostringtag: 1.0.2 2753 | 2754 | is-glob@4.0.3: 2755 | dependencies: 2756 | is-extglob: 2.1.1 2757 | 2758 | is-gzip@1.0.0: {} 2759 | 2760 | is-nan@1.3.2: 2761 | dependencies: 2762 | call-bind: 1.0.7 2763 | define-properties: 1.2.1 2764 | 2765 | is-negative-zero@2.0.3: {} 2766 | 2767 | is-number-object@1.0.7: 2768 | dependencies: 2769 | has-tostringtag: 1.0.2 2770 | 2771 | is-number@7.0.0: {} 2772 | 2773 | is-plain-obj@2.1.0: {} 2774 | 2775 | is-regex@1.1.4: 2776 | dependencies: 2777 | call-bind: 1.0.7 2778 | has-tostringtag: 1.0.2 2779 | 2780 | is-shared-array-buffer@1.0.3: 2781 | dependencies: 2782 | call-bind: 1.0.7 2783 | 2784 | is-string@1.0.7: 2785 | dependencies: 2786 | has-tostringtag: 1.0.2 2787 | 2788 | is-symbol@1.0.4: 2789 | dependencies: 2790 | has-symbols: 1.0.3 2791 | 2792 | is-typed-array@1.1.13: 2793 | dependencies: 2794 | which-typed-array: 1.1.15 2795 | 2796 | is-unicode-supported@0.1.0: {} 2797 | 2798 | is-weakref@1.0.2: 2799 | dependencies: 2800 | call-bind: 1.0.7 2801 | 2802 | isarray@1.0.0: {} 2803 | 2804 | isarray@2.0.5: {} 2805 | 2806 | isexe@2.0.0: {} 2807 | 2808 | jackspeak@4.0.2: 2809 | dependencies: 2810 | '@isaacs/cliui': 8.0.2 2811 | 2812 | js-yaml@4.1.0: 2813 | dependencies: 2814 | argparse: 2.0.1 2815 | 2816 | json-buffer@3.0.1: {} 2817 | 2818 | json-parse-better-errors@1.0.2: {} 2819 | 2820 | json-schema-traverse@0.4.1: {} 2821 | 2822 | json-stable-stringify-without-jsonify@1.0.1: {} 2823 | 2824 | keygrip@1.1.0: 2825 | dependencies: 2826 | tsscmp: 1.0.6 2827 | 2828 | keyv@4.5.4: 2829 | dependencies: 2830 | json-buffer: 3.0.1 2831 | 2832 | koa-compose@4.1.0: {} 2833 | 2834 | koa-morgan@1.0.1: 2835 | dependencies: 2836 | morgan: 1.10.0 2837 | transitivePeerDependencies: 2838 | - supports-color 2839 | 2840 | koa-mount@4.0.0: 2841 | dependencies: 2842 | debug: 4.3.7(supports-color@8.1.1) 2843 | koa-compose: 4.1.0 2844 | transitivePeerDependencies: 2845 | - supports-color 2846 | 2847 | koa-send@5.0.1: 2848 | dependencies: 2849 | debug: 4.3.7(supports-color@8.1.1) 2850 | http-errors: 1.8.1 2851 | resolve-path: 1.4.0 2852 | transitivePeerDependencies: 2853 | - supports-color 2854 | 2855 | koa-static@5.0.0: 2856 | dependencies: 2857 | debug: 3.2.7 2858 | koa-send: 5.0.1 2859 | transitivePeerDependencies: 2860 | - supports-color 2861 | 2862 | koa@3.0.1: 2863 | dependencies: 2864 | accepts: 1.3.8 2865 | content-disposition: 0.5.4 2866 | content-type: 1.0.5 2867 | cookies: 0.9.1 2868 | delegates: 1.0.0 2869 | destroy: 1.2.0 2870 | encodeurl: 2.0.0 2871 | escape-html: 1.0.3 2872 | fresh: 0.5.2 2873 | http-assert: 1.5.0 2874 | http-errors: 2.0.0 2875 | koa-compose: 4.1.0 2876 | mime-types: 3.0.1 2877 | on-finished: 2.4.1 2878 | parseurl: 1.3.3 2879 | statuses: 2.0.1 2880 | type-is: 2.0.1 2881 | vary: 1.1.2 2882 | 2883 | levn@0.4.1: 2884 | dependencies: 2885 | prelude-ls: 1.2.1 2886 | type-check: 0.4.0 2887 | 2888 | load-json-file@4.0.0: 2889 | dependencies: 2890 | graceful-fs: 4.2.11 2891 | parse-json: 4.0.0 2892 | pify: 3.0.0 2893 | strip-bom: 3.0.0 2894 | 2895 | locate-path@6.0.0: 2896 | dependencies: 2897 | p-locate: 5.0.0 2898 | 2899 | lodash.merge@4.6.2: {} 2900 | 2901 | log-symbols@4.1.0: 2902 | dependencies: 2903 | chalk: 4.1.2 2904 | is-unicode-supported: 0.1.0 2905 | 2906 | lru-cache@11.0.1: {} 2907 | 2908 | media-typer@1.1.0: {} 2909 | 2910 | memorystream@0.3.1: {} 2911 | 2912 | merge2@1.4.1: {} 2913 | 2914 | micromatch@4.0.8: 2915 | dependencies: 2916 | braces: 3.0.3 2917 | picomatch: 2.3.1 2918 | 2919 | mime-db@1.52.0: {} 2920 | 2921 | mime-db@1.54.0: {} 2922 | 2923 | mime-types@2.1.35: 2924 | dependencies: 2925 | mime-db: 1.52.0 2926 | 2927 | mime-types@3.0.1: 2928 | dependencies: 2929 | mime-db: 1.54.0 2930 | 2931 | minimatch@10.0.1: 2932 | dependencies: 2933 | brace-expansion: 4.0.1 2934 | 2935 | minimatch@3.1.2: 2936 | dependencies: 2937 | brace-expansion: 4.0.1 2938 | 2939 | minimatch@5.1.6: 2940 | dependencies: 2941 | brace-expansion: 4.0.1 2942 | 2943 | minimatch@9.0.5: 2944 | dependencies: 2945 | brace-expansion: 4.0.1 2946 | 2947 | minimist@1.2.8: {} 2948 | 2949 | minipass@7.1.2: {} 2950 | 2951 | mocha@10.7.3: 2952 | dependencies: 2953 | ansi-colors: 4.1.3 2954 | browser-stdout: 1.3.1 2955 | chokidar: 3.6.0 2956 | debug: 4.3.7(supports-color@8.1.1) 2957 | diff: 5.2.0 2958 | escape-string-regexp: 4.0.0 2959 | find-up: 5.0.0 2960 | glob: 8.1.0 2961 | he: 1.2.0 2962 | js-yaml: 4.1.0 2963 | log-symbols: 4.1.0 2964 | minimatch: 5.1.6 2965 | ms: 2.1.3 2966 | serialize-javascript: 6.0.2 2967 | strip-json-comments: 3.1.1 2968 | supports-color: 8.1.1 2969 | workerpool: 6.5.1 2970 | yargs: 16.2.0 2971 | yargs-parser: 20.2.9 2972 | yargs-unparser: 2.0.0 2973 | 2974 | morgan@1.10.0: 2975 | dependencies: 2976 | basic-auth: 2.0.1 2977 | debug: 2.6.9 2978 | depd: 2.0.0 2979 | on-finished: 2.3.0 2980 | on-headers: 1.1.0 2981 | transitivePeerDependencies: 2982 | - supports-color 2983 | 2984 | ms@2.0.0: {} 2985 | 2986 | ms@2.1.3: {} 2987 | 2988 | natural-compare@1.4.0: {} 2989 | 2990 | negotiator@0.6.3: {} 2991 | 2992 | normalize-package-data@2.5.0: 2993 | dependencies: 2994 | hosted-git-info: 2.8.9 2995 | resolve: 1.22.8 2996 | semver: 5.7.2 2997 | validate-npm-package-license: 3.0.4 2998 | 2999 | normalize-path@3.0.0: {} 3000 | 3001 | npm-run-all@4.1.5: 3002 | dependencies: 3003 | ansi-styles: 3.2.1 3004 | chalk: 2.4.2 3005 | cross-spawn: 7.0.3 3006 | memorystream: 0.3.1 3007 | minimatch: 3.1.2 3008 | pidtree: 0.3.1 3009 | read-pkg: 3.0.0 3010 | shell-quote: 1.8.1 3011 | string.prototype.padend: 3.1.6 3012 | 3013 | object-inspect@1.13.2: {} 3014 | 3015 | object-is@1.1.6: 3016 | dependencies: 3017 | call-bind: 1.0.7 3018 | define-properties: 1.2.1 3019 | 3020 | object-keys@1.1.1: {} 3021 | 3022 | object.assign@4.1.5: 3023 | dependencies: 3024 | call-bind: 1.0.7 3025 | define-properties: 1.2.1 3026 | has-symbols: 1.0.3 3027 | object-keys: 1.1.1 3028 | 3029 | on-finished@2.3.0: 3030 | dependencies: 3031 | ee-first: 1.1.1 3032 | 3033 | on-finished@2.4.1: 3034 | dependencies: 3035 | ee-first: 1.1.1 3036 | 3037 | on-headers@1.1.0: {} 3038 | 3039 | once@1.4.0: 3040 | dependencies: 3041 | wrappy: 1.0.2 3042 | 3043 | optionator@0.9.4: 3044 | dependencies: 3045 | deep-is: 0.1.4 3046 | fast-levenshtein: 2.0.6 3047 | levn: 0.4.1 3048 | prelude-ls: 1.2.1 3049 | type-check: 0.4.0 3050 | word-wrap: 1.2.5 3051 | 3052 | p-limit@3.1.0: 3053 | dependencies: 3054 | yocto-queue: 0.1.0 3055 | 3056 | p-locate@5.0.0: 3057 | dependencies: 3058 | p-limit: 3.1.0 3059 | 3060 | package-json-from-dist@1.0.1: {} 3061 | 3062 | pako@0.2.9: {} 3063 | 3064 | parent-module@1.0.1: 3065 | dependencies: 3066 | callsites: 3.1.0 3067 | 3068 | parse-json@4.0.0: 3069 | dependencies: 3070 | error-ex: 1.3.2 3071 | json-parse-better-errors: 1.0.2 3072 | 3073 | parseurl@1.3.3: {} 3074 | 3075 | path-exists@4.0.0: {} 3076 | 3077 | path-is-absolute@1.0.1: {} 3078 | 3079 | path-key@3.1.1: {} 3080 | 3081 | path-parse@1.0.7: {} 3082 | 3083 | path-scurry@2.0.0: 3084 | dependencies: 3085 | lru-cache: 11.0.1 3086 | minipass: 7.1.2 3087 | 3088 | path-to-regexp@6.3.0: {} 3089 | 3090 | path-type@3.0.0: 3091 | dependencies: 3092 | pify: 3.0.0 3093 | 3094 | peek-stream@1.1.3: 3095 | dependencies: 3096 | buffer-from: 1.1.2 3097 | duplexify: 3.7.1 3098 | through2: 2.0.5 3099 | 3100 | picomatch@2.3.1: {} 3101 | 3102 | pidtree@0.3.1: {} 3103 | 3104 | pify@3.0.0: {} 3105 | 3106 | playwright-core@1.48.0: {} 3107 | 3108 | playwright-core@1.51.1: {} 3109 | 3110 | playwright@1.51.1: 3111 | dependencies: 3112 | playwright-core: 1.51.1 3113 | optionalDependencies: 3114 | fsevents: 2.3.2 3115 | 3116 | possible-typed-array-names@1.0.0: {} 3117 | 3118 | prelude-ls@1.2.1: {} 3119 | 3120 | process-nextick-args@2.0.1: {} 3121 | 3122 | process@0.11.10: {} 3123 | 3124 | pump@2.0.1: 3125 | dependencies: 3126 | end-of-stream: 1.4.4 3127 | once: 1.4.0 3128 | 3129 | pump@3.0.2: 3130 | dependencies: 3131 | end-of-stream: 1.4.4 3132 | once: 1.4.0 3133 | 3134 | pumpify@1.5.1: 3135 | dependencies: 3136 | duplexify: 3.7.1 3137 | inherits: 2.0.4 3138 | pump: 2.0.1 3139 | 3140 | punycode@2.3.1: {} 3141 | 3142 | queue-microtask@1.2.3: {} 3143 | 3144 | randombytes@2.1.0: 3145 | dependencies: 3146 | safe-buffer: 5.2.1 3147 | 3148 | read-pkg@3.0.0: 3149 | dependencies: 3150 | load-json-file: 4.0.0 3151 | normalize-package-data: 2.5.0 3152 | path-type: 3.0.0 3153 | 3154 | readable-stream@2.3.8: 3155 | dependencies: 3156 | core-util-is: 1.0.3 3157 | inherits: 2.0.4 3158 | isarray: 1.0.0 3159 | process-nextick-args: 2.0.1 3160 | safe-buffer: 5.1.2 3161 | string_decoder: 1.1.1 3162 | util-deprecate: 1.0.2 3163 | 3164 | readdirp@3.6.0: 3165 | dependencies: 3166 | picomatch: 2.3.1 3167 | 3168 | regexp.prototype.flags@1.5.3: 3169 | dependencies: 3170 | call-bind: 1.0.7 3171 | define-properties: 1.2.1 3172 | es-errors: 1.3.0 3173 | set-function-name: 2.0.2 3174 | 3175 | require-directory@2.1.1: {} 3176 | 3177 | resolve-from@4.0.0: {} 3178 | 3179 | resolve-path@1.4.0: 3180 | dependencies: 3181 | http-errors: 1.6.3 3182 | path-is-absolute: 1.0.1 3183 | 3184 | resolve@1.22.8: 3185 | dependencies: 3186 | is-core-module: 2.15.1 3187 | path-parse: 1.0.7 3188 | supports-preserve-symlinks-flag: 1.0.0 3189 | 3190 | reusify@1.0.4: {} 3191 | 3192 | run-parallel@1.2.0: 3193 | dependencies: 3194 | queue-microtask: 1.2.3 3195 | 3196 | safe-array-concat@1.1.2: 3197 | dependencies: 3198 | call-bind: 1.0.7 3199 | get-intrinsic: 1.2.4 3200 | has-symbols: 1.0.3 3201 | isarray: 2.0.5 3202 | 3203 | safe-buffer@5.1.2: {} 3204 | 3205 | safe-buffer@5.2.1: {} 3206 | 3207 | safe-regex-test@1.0.3: 3208 | dependencies: 3209 | call-bind: 1.0.7 3210 | es-errors: 1.3.0 3211 | is-regex: 1.1.4 3212 | 3213 | semver@5.7.2: {} 3214 | 3215 | semver@7.6.3: {} 3216 | 3217 | serialize-javascript@6.0.2: 3218 | dependencies: 3219 | randombytes: 2.1.0 3220 | 3221 | set-function-length@1.2.2: 3222 | dependencies: 3223 | define-data-property: 1.1.4 3224 | es-errors: 1.3.0 3225 | function-bind: 1.1.2 3226 | get-intrinsic: 1.2.4 3227 | gopd: 1.0.1 3228 | has-property-descriptors: 1.0.2 3229 | 3230 | set-function-name@2.0.2: 3231 | dependencies: 3232 | define-data-property: 1.1.4 3233 | es-errors: 1.3.0 3234 | functions-have-names: 1.2.3 3235 | has-property-descriptors: 1.0.2 3236 | 3237 | setprototypeof@1.1.0: {} 3238 | 3239 | setprototypeof@1.2.0: {} 3240 | 3241 | shebang-command@2.0.0: 3242 | dependencies: 3243 | shebang-regex: 3.0.0 3244 | 3245 | shebang-regex@3.0.0: {} 3246 | 3247 | shell-quote@1.8.1: {} 3248 | 3249 | side-channel@1.0.6: 3250 | dependencies: 3251 | call-bind: 1.0.7 3252 | es-errors: 1.3.0 3253 | get-intrinsic: 1.2.4 3254 | object-inspect: 1.13.2 3255 | 3256 | signal-exit@4.1.0: {} 3257 | 3258 | spdx-correct@3.2.0: 3259 | dependencies: 3260 | spdx-expression-parse: 3.0.1 3261 | spdx-license-ids: 3.0.20 3262 | 3263 | spdx-exceptions@2.5.0: {} 3264 | 3265 | spdx-expression-parse@3.0.1: 3266 | dependencies: 3267 | spdx-exceptions: 2.5.0 3268 | spdx-license-ids: 3.0.20 3269 | 3270 | spdx-license-ids@3.0.20: {} 3271 | 3272 | statuses@1.5.0: {} 3273 | 3274 | statuses@2.0.1: {} 3275 | 3276 | stream-shift@1.0.3: {} 3277 | 3278 | streamx@2.22.0: 3279 | dependencies: 3280 | fast-fifo: 1.3.2 3281 | text-decoder: 1.2.0 3282 | optionalDependencies: 3283 | bare-events: 2.5.4 3284 | 3285 | string-width@4.2.3: 3286 | dependencies: 3287 | emoji-regex: 8.0.0 3288 | is-fullwidth-code-point: 3.0.0 3289 | strip-ansi: 6.0.1 3290 | 3291 | string-width@5.1.2: 3292 | dependencies: 3293 | eastasianwidth: 0.2.0 3294 | emoji-regex: 9.2.2 3295 | strip-ansi: 7.1.0 3296 | 3297 | string.prototype.padend@3.1.6: 3298 | dependencies: 3299 | call-bind: 1.0.7 3300 | define-properties: 1.2.1 3301 | es-abstract: 1.23.3 3302 | es-object-atoms: 1.0.0 3303 | 3304 | string.prototype.trim@1.2.9: 3305 | dependencies: 3306 | call-bind: 1.0.7 3307 | define-properties: 1.2.1 3308 | es-abstract: 1.23.3 3309 | es-object-atoms: 1.0.0 3310 | 3311 | string.prototype.trimend@1.0.8: 3312 | dependencies: 3313 | call-bind: 1.0.7 3314 | define-properties: 1.2.1 3315 | es-object-atoms: 1.0.0 3316 | 3317 | string.prototype.trimstart@1.0.8: 3318 | dependencies: 3319 | call-bind: 1.0.7 3320 | define-properties: 1.2.1 3321 | es-object-atoms: 1.0.0 3322 | 3323 | string_decoder@1.1.1: 3324 | dependencies: 3325 | safe-buffer: 5.1.2 3326 | 3327 | strip-ansi@6.0.1: 3328 | dependencies: 3329 | ansi-regex: 5.0.1 3330 | 3331 | strip-ansi@7.1.0: 3332 | dependencies: 3333 | ansi-regex: 6.1.0 3334 | 3335 | strip-bom@3.0.0: {} 3336 | 3337 | strip-json-comments@3.1.1: {} 3338 | 3339 | supports-color@5.5.0: 3340 | dependencies: 3341 | has-flag: 3.0.0 3342 | 3343 | supports-color@7.2.0: 3344 | dependencies: 3345 | has-flag: 4.0.0 3346 | 3347 | supports-color@8.1.1: 3348 | dependencies: 3349 | has-flag: 4.0.0 3350 | 3351 | supports-preserve-symlinks-flag@1.0.0: {} 3352 | 3353 | tar-fs@3.0.9: 3354 | dependencies: 3355 | pump: 3.0.2 3356 | tar-stream: 3.1.7 3357 | optionalDependencies: 3358 | bare-fs: 4.1.2 3359 | bare-path: 3.0.0 3360 | transitivePeerDependencies: 3361 | - bare-buffer 3362 | 3363 | tar-stream@3.1.7: 3364 | dependencies: 3365 | b4a: 1.6.7 3366 | fast-fifo: 1.3.2 3367 | streamx: 2.22.0 3368 | 3369 | text-decoder@1.2.0: 3370 | dependencies: 3371 | b4a: 1.6.7 3372 | 3373 | text-table@0.2.0: {} 3374 | 3375 | through2@2.0.5: 3376 | dependencies: 3377 | readable-stream: 2.3.8 3378 | xtend: 4.0.2 3379 | 3380 | to-regex-range@5.0.1: 3381 | dependencies: 3382 | is-number: 7.0.0 3383 | 3384 | toidentifier@1.0.1: {} 3385 | 3386 | ts-api-utils@1.3.0(typescript@5.6.3): 3387 | dependencies: 3388 | typescript: 5.6.3 3389 | 3390 | tsscmp@1.0.6: {} 3391 | 3392 | type-check@0.4.0: 3393 | dependencies: 3394 | prelude-ls: 1.2.1 3395 | 3396 | type-is@2.0.1: 3397 | dependencies: 3398 | content-type: 1.0.5 3399 | media-typer: 1.1.0 3400 | mime-types: 3.0.1 3401 | 3402 | typed-array-buffer@1.0.2: 3403 | dependencies: 3404 | call-bind: 1.0.7 3405 | es-errors: 1.3.0 3406 | is-typed-array: 1.1.13 3407 | 3408 | typed-array-byte-length@1.0.1: 3409 | dependencies: 3410 | call-bind: 1.0.7 3411 | for-each: 0.3.3 3412 | gopd: 1.0.1 3413 | has-proto: 1.0.3 3414 | is-typed-array: 1.1.13 3415 | 3416 | typed-array-byte-offset@1.0.2: 3417 | dependencies: 3418 | available-typed-arrays: 1.0.7 3419 | call-bind: 1.0.7 3420 | for-each: 0.3.3 3421 | gopd: 1.0.1 3422 | has-proto: 1.0.3 3423 | is-typed-array: 1.1.13 3424 | 3425 | typed-array-length@1.0.6: 3426 | dependencies: 3427 | call-bind: 1.0.7 3428 | for-each: 0.3.3 3429 | gopd: 1.0.1 3430 | has-proto: 1.0.3 3431 | is-typed-array: 1.1.13 3432 | possible-typed-array-names: 1.0.0 3433 | 3434 | typescript@5.6.3: {} 3435 | 3436 | unbox-primitive@1.0.2: 3437 | dependencies: 3438 | call-bind: 1.0.7 3439 | has-bigints: 1.0.2 3440 | has-symbols: 1.0.3 3441 | which-boxed-primitive: 1.0.2 3442 | 3443 | uri-js@4.4.1: 3444 | dependencies: 3445 | punycode: 2.3.1 3446 | 3447 | util-deprecate@1.0.2: {} 3448 | 3449 | util@0.12.5: 3450 | dependencies: 3451 | inherits: 2.0.4 3452 | is-arguments: 1.1.1 3453 | is-generator-function: 1.0.10 3454 | is-typed-array: 1.1.13 3455 | which-typed-array: 1.1.15 3456 | 3457 | validate-npm-package-license@3.0.4: 3458 | dependencies: 3459 | spdx-correct: 3.2.0 3460 | spdx-expression-parse: 3.0.1 3461 | 3462 | vary@1.1.2: {} 3463 | 3464 | vscode-uri@3.0.8: {} 3465 | 3466 | which-boxed-primitive@1.0.2: 3467 | dependencies: 3468 | is-bigint: 1.0.4 3469 | is-boolean-object: 1.1.2 3470 | is-number-object: 1.0.7 3471 | is-string: 1.0.7 3472 | is-symbol: 1.0.4 3473 | 3474 | which-typed-array@1.1.15: 3475 | dependencies: 3476 | available-typed-arrays: 1.0.7 3477 | call-bind: 1.0.7 3478 | for-each: 0.3.3 3479 | gopd: 1.0.1 3480 | has-tostringtag: 1.0.2 3481 | 3482 | which@2.0.2: 3483 | dependencies: 3484 | isexe: 2.0.0 3485 | 3486 | word-wrap@1.2.5: {} 3487 | 3488 | workerpool@6.5.1: {} 3489 | 3490 | wrap-ansi@7.0.0: 3491 | dependencies: 3492 | ansi-styles: 4.3.0 3493 | string-width: 4.2.3 3494 | strip-ansi: 6.0.1 3495 | 3496 | wrap-ansi@8.1.0: 3497 | dependencies: 3498 | ansi-styles: 6.2.1 3499 | string-width: 5.1.2 3500 | strip-ansi: 7.1.0 3501 | 3502 | wrappy@1.0.2: {} 3503 | 3504 | xtend@4.0.2: {} 3505 | 3506 | y18n@5.0.8: {} 3507 | 3508 | yargs-parser@20.2.9: {} 3509 | 3510 | yargs-unparser@2.0.0: 3511 | dependencies: 3512 | camelcase: 6.3.0 3513 | decamelize: 4.0.0 3514 | flat: 5.0.2 3515 | is-plain-obj: 2.1.0 3516 | 3517 | yargs@16.2.0: 3518 | dependencies: 3519 | cliui: 7.0.4 3520 | escalade: 3.2.0 3521 | get-caller-file: 2.0.5 3522 | require-directory: 2.1.1 3523 | string-width: 4.2.3 3524 | y18n: 5.0.8 3525 | yargs-parser: 20.2.9 3526 | 3527 | yocto-queue@0.1.0: {} 3528 | --------------------------------------------------------------------------------