├── demo ├── target │ ├── sampleFile.json │ └── sampleDir │ │ └── myFile.txt ├── demoTs.ts └── demoJs.js ├── .gitignore ├── docs ├── demo-rename.gif ├── demo-inlining.gif ├── demo-extraction.gif ├── demo-goToDefinition.gif └── demo-path-autocompletion.gif ├── .prettierrc.json ├── vscode-extension ├── docs │ └── logo.drawio.png ├── tsconfig.json ├── rollup.config.mjs ├── LICENSE ├── src │ ├── createTsLspCustomServiceClient.ts │ └── index.ts ├── package.json └── README.md ├── .vscode ├── settings.json └── launch.json ├── vitest.config.js ├── package.json ├── SUPPORT.md ├── language-service-plugin ├── rollup.config.mjs ├── tsconfig.json ├── package.json ├── src │ ├── index.ts │ ├── rpc │ │ ├── service.ts │ │ └── registerCustomService.ts │ ├── api.ts │ ├── impl │ │ ├── ParsedPath.ts │ │ ├── ParsedJsString.ts │ │ ├── createServiceImpl.ts │ │ └── AstMatchers.ts │ └── utils │ │ ├── offsetRange.ts │ │ └── edit.ts └── test │ ├── utils.ts │ └── tests.test.ts ├── CODE_OF_CONDUCT.md ├── .github └── workflows │ └── build.yml ├── .azure-pipelines └── publish-extension.yml ├── LICENSE ├── SECURITY.md ├── README.md └── yarn.lock /demo/target/sampleFile.json: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /demo/target/sampleDir/myFile.txt: -------------------------------------------------------------------------------- 1 | loreum ipsum est dolor sit amet -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules 3 | .vscode-test/ 4 | *.vsix 5 | dist 6 | -------------------------------------------------------------------------------- /docs/demo-rename.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/vscode-ts-file-path-support/HEAD/docs/demo-rename.gif -------------------------------------------------------------------------------- /docs/demo-inlining.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/vscode-ts-file-path-support/HEAD/docs/demo-inlining.gif -------------------------------------------------------------------------------- /docs/demo-extraction.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/vscode-ts-file-path-support/HEAD/docs/demo-extraction.gif -------------------------------------------------------------------------------- /docs/demo-goToDefinition.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/vscode-ts-file-path-support/HEAD/docs/demo-goToDefinition.gif -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 4, 4 | "printWidth": 120, 5 | "semi": true, 6 | "useTabs": true 7 | } 8 | -------------------------------------------------------------------------------- /docs/demo-path-autocompletion.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/vscode-ts-file-path-support/HEAD/docs/demo-path-autocompletion.gif -------------------------------------------------------------------------------- /vscode-extension/docs/logo.drawio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/vscode-ts-file-path-support/HEAD/vscode-extension/docs/logo.drawio.png -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "git.branchProtection": ["main"], 4 | "git.branchProtectionPrompt": "alwaysCommitToNewBranch" 5 | } 6 | -------------------------------------------------------------------------------- /vitest.config.js: -------------------------------------------------------------------------------- 1 | /// 2 | import { defineConfig } from "vite"; 3 | 4 | export default defineConfig({ 5 | test: { 6 | //exclude: [], 7 | }, 8 | }); 9 | -------------------------------------------------------------------------------- /demo/demoTs.ts: -------------------------------------------------------------------------------- 1 | import { join } from "path"; 2 | type RelativeFilePath = string & { baseDir?: T }; 3 | 4 | function myPathFn(path: RelativeFilePath<'$dir/target'>): string { 5 | return join(__dirname, 'target', path); 6 | } 7 | 8 | myPathFn("sampleDir/foobar123.txt"); 9 | -------------------------------------------------------------------------------- /vscode-extension/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "moduleResolution": "Bundler", 5 | "target": "es6", 6 | "outDir": "dist", 7 | "lib": ["es6"], 8 | "sourceMap": true, 9 | "rootDir": "src", 10 | "strict": true 11 | }, 12 | "include": ["./src/**/*", "test/**/*"] 13 | } 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "workspaces": [ 4 | "language-service-plugin", 5 | "ts-api-extras", 6 | "vscode-extension" 7 | ], 8 | "devDependencies": { 9 | "vitest": "^1.6.0" 10 | }, 11 | "scripts": { 12 | "build": "yarn workspace @vscode/ts-plugin-file-path-support build && yarn workspace ts-file-path-support build", 13 | "test": "yarn workspace @vscode/ts-plugin-file-path-support test" 14 | } 15 | } -------------------------------------------------------------------------------- /SUPPORT.md: -------------------------------------------------------------------------------- 1 | # Support 2 | 3 | ## How to file issues and get help 4 | 5 | This project uses GitHub Issues to track bugs and feature requests. Please search the existing 6 | issues before filing new issues to avoid duplicates. For new issues, file your bug or 7 | feature request as a new Issue. 8 | 9 | ## Microsoft Support Policy 10 | 11 | Support for this **PROJECT or PRODUCT** is limited to the resources listed above. 12 | -------------------------------------------------------------------------------- /language-service-plugin/rollup.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "rollup"; 2 | import typescript from "@rollup/plugin-typescript"; 3 | import del from "rollup-plugin-delete"; 4 | 5 | export default defineConfig({ 6 | input: "src/index.ts", 7 | output: { 8 | format: "commonjs", 9 | name: "index", 10 | file: "dist/index.js", 11 | sourcemap: true, 12 | }, 13 | plugins: [typescript(), del({ targets: "dist/**/*" })], 14 | }); 15 | -------------------------------------------------------------------------------- /language-service-plugin/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "moduleResolution": "Bundler", 5 | "target": "es6", 6 | "outDir": "dist", 7 | "lib": ["es6"], 8 | "sourceMap": true, 9 | "rootDir": "./src", 10 | "strict": true, 11 | "declaration": true, 12 | "declarationMap": true, 13 | "experimentalDecorators": true, 14 | "skipLibCheck": true 15 | }, 16 | "include": ["./src/**/*"] 17 | } 18 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Run Extension", 6 | "type": "extensionHost", 7 | "request": "launch", 8 | "runtimeExecutable": "${execPath}", 9 | "args": [ 10 | "--extensionDevelopmentPath=${workspaceFolder}/vscode-extension", 11 | "${workspaceFolder}/demo", 12 | "--profile Empty" 13 | ], 14 | "outFiles": ["${workspaceFolder}/vscode-extension/dist/**/*.js"] 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Microsoft Open Source Code of Conduct 2 | 3 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 4 | 5 | Resources: 6 | 7 | - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) 8 | - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) 9 | - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns 10 | -------------------------------------------------------------------------------- /demo/demoJs.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @typedef {string & { foo?: TBaseDir }} RelativeFilePath 3 | * @template TBaseDir 4 | */ 5 | 6 | /** 7 | * @param {RelativeFilePath<'$dir/target'>} path 8 | */ 9 | function myFilePathFn(path) { } 10 | 11 | export const data1 = { 12 | filePath: myFilePathFn("sampleDir/myFile.txt"), 13 | }; 14 | 15 | export const data2 = { 16 | fileName: "sampleDir/test2.txt", 17 | fileContents: "some sample\ntext here", 18 | }; 19 | 20 | const data3 = { 21 | fileName: "foo.txt", 22 | fileContents: ["line1\\n", "line2\\n", "line3"], 23 | }; -------------------------------------------------------------------------------- /language-service-plugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@vscode/ts-plugin-file-path-support", 3 | "private": true, 4 | "version": "0.0.1", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "license": "MIT", 8 | "scripts": { 9 | "dev": "rollup -c rollup.config.mjs --watch", 10 | "build": "rollup -c rollup.config.mjs", 11 | "test": "vitest run" 12 | }, 13 | "dependencies": {}, 14 | "devDependencies": { 15 | "typescript": "^5.5.2", 16 | "vitest": "^1.6.0", 17 | "@types/node": "^20.14.9", 18 | "rollup": "4.22.4", 19 | "@rollup/plugin-typescript": "11.1.6", 20 | "rollup-plugin-delete": "2.0.0" 21 | } 22 | } -------------------------------------------------------------------------------- /language-service-plugin/src/index.ts: -------------------------------------------------------------------------------- 1 | import type * as ts from "typescript/lib/tsserverlibrary"; 2 | import { registerCustomService } from "./rpc/registerCustomService"; 3 | import { createServiceImpl } from "./impl/createServiceImpl"; 4 | import { RelativeFilePathServiceId } from "./api"; 5 | 6 | export default function init(modules: { typescript: typeof ts }) { 7 | return { 8 | create(info: ts.server.PluginCreateInfo): ts.LanguageService { 9 | const id: RelativeFilePathServiceId = "tsRelativeFilePath"; 10 | registerCustomService(id, info, createServiceImpl(modules.typescript, info.languageService)); 11 | return info.languageService; 12 | }, 13 | }; 14 | }; 15 | -------------------------------------------------------------------------------- /language-service-plugin/src/rpc/service.ts: -------------------------------------------------------------------------------- 1 | export type ServiceDescription = Record; 2 | 3 | export type CreateServicesDescription = T; 4 | 5 | export type ServiceToSyncObj = 6 | { [K in keyof T]: { (args: T[K]['request'] & TContext): T[K]['response'] } }; 7 | 8 | export type ServiceToAsyncObj = 9 | { [K in keyof T]: { (args: T[K]['request'] & TContext): Promise } }; 10 | 11 | export interface IRequestMessage { 12 | method: string; 13 | args: {}; 14 | } 15 | 16 | export interface IResponseMessage { 17 | result: any; 18 | error: any; 19 | } 20 | -------------------------------------------------------------------------------- /vscode-extension/rollup.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "rollup"; 2 | import typescript from "@rollup/plugin-typescript"; 3 | import copy from "rollup-plugin-copy"; 4 | import del from "rollup-plugin-delete"; 5 | 6 | export default defineConfig({ 7 | input: "src/index.ts", 8 | output: { 9 | format: "commonjs", 10 | name: "index", 11 | file: "dist/index.js", 12 | sourcemap: true, 13 | }, 14 | plugins: [ 15 | typescript(), 16 | copy({ 17 | targets: [ 18 | { 19 | src: ["../language-service-plugin/dist/**/*.js", "../language-service-plugin/package.json"], 20 | dest: "./node_modules/@vscode/ts-plugin-file-path-support", 21 | }, 22 | ], 23 | }), 24 | del({ targets: "dist/**/*" }), 25 | del({ targets: "node_modules/ts-plugin-file-path-support/**/*" }), 26 | ], 27 | }); 28 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build Extension 2 | on: 3 | push: 4 | branches: 5 | - main 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout 12 | uses: actions/checkout@v4 13 | 14 | - uses: actions/setup-node@v4 15 | with: 16 | node-version: 20 17 | 18 | - name: yarn install 19 | run: yarn install --frozen-lockfile 20 | 21 | - name: Build 22 | run: yarn run build 23 | 24 | - name: Test 25 | run: yarn run test 26 | 27 | - name: Upload artifacts 28 | uses: actions/upload-artifact@v4 29 | with: 30 | name: artifacts 31 | path: | 32 | vscode-extension/extension.vsix 33 | -------------------------------------------------------------------------------- /.azure-pipelines/publish-extension.yml: -------------------------------------------------------------------------------- 1 | trigger: 2 | branches: 3 | include: 4 | - main 5 | pr: none 6 | 7 | resources: 8 | repositories: 9 | - repository: templates 10 | type: github 11 | name: microsoft/vscode-engineering 12 | ref: main 13 | endpoint: Monaco 14 | 15 | parameters: 16 | - name: publishExtension 17 | displayName: 🚀 Publish Extension 18 | type: boolean 19 | default: false 20 | 21 | extends: 22 | template: azure-pipelines/extension/stable.yml@templates 23 | parameters: 24 | publishExtension: ${{ parameters.publishExtension }} 25 | workingDirectory: $(Build.SourcesDirectory)/vscode-extension 26 | vscePackageArgs: --yarn 27 | 28 | buildSteps: 29 | - script: yarn install --frozen-lockfile 30 | displayName: Install dependencies 31 | 32 | - script: yarn run build 33 | displayName: Build 34 | 35 | - script: yarn run test 36 | displayName: Test 37 | 38 | tsa: 39 | config: 40 | areaPath: 'Visual Studio Code Miscellaneous Extensions' 41 | serviceTreeID: 'c8cb03c6-176e-40dd-90a5-518de08666dc' 42 | enabled: true 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /vscode-extension/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /vscode-extension/src/createTsLspCustomServiceClient.ts: -------------------------------------------------------------------------------- 1 | import { Uri, Position, commands } from "vscode"; 2 | import type { ServiceDescription, ServiceToAsyncObj, IRequestMessage } from "@vscode/ts-plugin-file-path-support/src/rpc/service"; 3 | 4 | export function createTsLspCustomServiceClient(id: string): ServiceToAsyncObj { 5 | const tsCommandId = '_handleRpc' + id; 6 | 7 | return new Proxy({}, { 8 | get: (target, prop, receiver) => { 9 | return async (args: { uri: Uri; position: Position; }) => { 10 | const request: IRequestMessage & { file: any; position: { line: number, char: number }; } = { 11 | method: prop.toString(), 12 | args: args, 13 | file: args.uri, 14 | position: { line: args.position.line, char: args.position.character }, 15 | }; 16 | const result: { body: { result: unknown } } = await commands.executeCommand( 17 | 'typescript.tsserverRequest', 18 | tsCommandId, 19 | request 20 | ); 21 | return result.body.result; 22 | }; 23 | } 24 | }) as any; 25 | } 26 | -------------------------------------------------------------------------------- /language-service-plugin/src/api.ts: -------------------------------------------------------------------------------- 1 | import { CreateServicesDescription } from "./rpc/service"; 2 | 3 | export type RelativeFilePathServiceId = "tsRelativeFilePath"; 4 | 5 | export type RelativeFilePathService = CreateServicesDescription<{ 6 | findRelativeFileNodeAt: { 7 | request: { 8 | // uses position and filename 9 | }; 10 | response: { 11 | stringValueRange: [start: number, endEx: number]; 12 | cursorSegmentRange: [start: number, endEx: number]; 13 | relativePath: string; 14 | baseDir: string; 15 | relativePathBeforeCursor: string; 16 | } | undefined; 17 | }; 18 | 19 | findFilePathObjAt: { 20 | request: { 21 | // uses position and filename 22 | }; 23 | response: { 24 | isMultiLine: boolean; 25 | replaceRange: [start: number, endEx: number]; 26 | baseDir: string; 27 | relativePath: string; 28 | } | undefined; 29 | } 30 | 31 | findFileNameFileContentObjAt: { 32 | request: { 33 | // uses position and filename 34 | }; 35 | response: { 36 | isMultiLine: boolean; 37 | replaceRange: [start: number, endEx: number]; 38 | fileContents: string; 39 | fileName: string; 40 | 41 | relativeFilePathFnName: string; 42 | relativeFilePathBaseDir: string; 43 | } | undefined; 44 | } 45 | }>; 46 | -------------------------------------------------------------------------------- /language-service-plugin/src/rpc/registerCustomService.ts: -------------------------------------------------------------------------------- 1 | import type * as ts from "typescript/lib/tsserverlibrary"; 2 | import { IRequestMessage, IResponseMessage, ServiceDescription, ServiceToSyncObj } from "./service"; 3 | 4 | export function createCustomService( 5 | customService: ServiceToSyncObj): ServiceToSyncObj { 6 | return customService; 7 | } 8 | 9 | export function registerCustomService( 10 | id: string, 11 | info: ts.server.PluginCreateInfo, 12 | customService: ServiceToSyncObj 13 | ): void { 14 | const tsCommandId = '_handleRpc' + id; 15 | info.session?.addProtocolHandler(tsCommandId, (request) => { 16 | const msg = request.arguments as IRequestMessage & { file: string; position: { line: number, char: number } }; 17 | 18 | if (!customService[msg.method]) { 19 | throw new Error(`Method ${msg.method} not found in custom service`); 20 | } 21 | 22 | const pos = msg.position; 23 | const src = info.languageService.getProgram()?.getSourceFile(msg.file); 24 | const p = src?.getPositionOfLineAndCharacter(pos.line, pos.char); 25 | if (p === undefined) { 26 | throw new Error(`Position ${pos.line}:${pos.char} not found in file ${msg.file}`); 27 | } 28 | 29 | const result = customService[msg.method]({ ...msg.args, fileName: msg.file, position: p }); 30 | const response: IResponseMessage = { 31 | result: result, 32 | error: undefined 33 | }; 34 | return { 35 | response: response 36 | }; 37 | }); 38 | } 39 | -------------------------------------------------------------------------------- /language-service-plugin/src/impl/ParsedPath.ts: -------------------------------------------------------------------------------- 1 | import { OffsetRange } from "../utils/offsetRange"; 2 | 3 | type ParsedPathSegment = { type: "literal" | "pathSeparator"; value: string; range: OffsetRange; }; 4 | 5 | export class ParsedPath { 6 | public static parse(value: string): ParsedPath { 7 | if (value.length === 0) { 8 | return new ParsedPath([{ type: "literal", value: "", range: new OffsetRange(0, 0) }]); 9 | } 10 | const segments: ParsedPathSegment[] = []; 11 | function pushLatestLiteralValue() { 12 | if (segments.length > 0 && segments[segments.length - 1].type === "pathSeparator") { 13 | segments.push({ type: "literal", value: "", range: OffsetRange.emptyAt(segments[segments.length - 1].range.endExclusive) }); 14 | } 15 | } 16 | let i = 0; 17 | while (i < value.length) { 18 | if (value[i] === "/" || value[i] === "\\") { 19 | pushLatestLiteralValue(); 20 | segments.push({ type: "pathSeparator", value: value[i], range: new OffsetRange(i, i + 1) }); 21 | i++; 22 | } else { 23 | let len = 1; 24 | while (value[i + len] && value[i + len] !== "/" && value[i + len] !== "\\") { 25 | len++; 26 | } 27 | segments.push({ type: "literal", value: value.slice(i, i + len), range: new OffsetRange(i, i + len) }); 28 | i += len; 29 | } 30 | } 31 | pushLatestLiteralValue(); 32 | return new ParsedPath(segments); 33 | } 34 | 35 | constructor(public readonly segments: readonly ParsedPathSegment[]) { } 36 | 37 | public getLiteralSegmentTouchingPos(pos: number): ParsedPathSegment | undefined { 38 | return this.segments.find(s => s.type === "literal" && (s.range.deltaEnd(1).contains(pos))); 39 | } 40 | 41 | public getSubPath(idxEndEx: number): string { 42 | return this.segments.slice(0, idxEndEx).map(s => s.value).join(""); 43 | } 44 | 45 | public get text(): string { 46 | return this.segments.map(s => s.value).join(""); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /vscode-extension/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-file-path-support", 3 | "private": true, 4 | "displayName": "TS/JS Relative File Path Support", 5 | "description": "Provides support for relative file paths in TypeScript and JavaScript. This includes auto-complete, go to definition, rename and inlining/extraction.", 6 | "version": "1.0.0", 7 | "icon": "docs/logo.drawio.png", 8 | "keywords": [ 9 | "typescript", 10 | "javascript", 11 | "relative", 12 | "file", 13 | "path" 14 | ], 15 | "license": "MIT", 16 | "engines": { 17 | "vscode": "^1.90.0" 18 | }, 19 | "files": [ 20 | "dist/**/*", 21 | "package.json", 22 | "node_modules/@vscode/ts-plugin-file-path-support/**/*", 23 | "docs/logo.drawio.png", 24 | "LICENSE" 25 | ], 26 | "publisher": "ms-vscode", 27 | "readme": "./README.md", 28 | "repository": { 29 | "url": "https://github.com/microsoft/vscode-ts-file-path-support.git" 30 | }, 31 | "categories": [ 32 | "Programming Languages" 33 | ], 34 | "activationEvents": [ 35 | "onLanguage:typescript", 36 | "onLanguage:typescriptreact", 37 | "onLanguage:javascript", 38 | "onLanguage:javascriptreact" 39 | ], 40 | "main": "dist/index", 41 | "contributes": { 42 | "typescriptServerPlugins": [ 43 | { 44 | "name": "@vscode/ts-plugin-file-path-support", 45 | "enableForWorkspaceTypeScriptVersions": true 46 | } 47 | ] 48 | }, 49 | "scripts": { 50 | "build": "yarn build-src && yarn build-package", 51 | "build-src": "rollup -c rollup.config.mjs", 52 | "build-package": "vsce package --out extension.vsix", 53 | "dev": "rollup -c rollup.config.mjs --watch" 54 | }, 55 | "dependencies": { 56 | "@vscode/ts-plugin-file-path-support": "*" 57 | }, 58 | "devDependencies": { 59 | "@rollup/plugin-typescript": "11.1.6", 60 | "@types/node": "^20.14.9", 61 | "@types/vscode": "^1.90.0", 62 | "@vscode/vsce": "^3.2.2", 63 | "rollup": "4.22.4", 64 | "rollup-plugin-copy": "3.5.0", 65 | "rollup-plugin-delete": "2.0.0", 66 | "typescript": "^5.5.2" 67 | }, 68 | "vsce": { 69 | "baseImagesUrl": "https://github.com/microsoft/vscode-ts-file-path-support/raw/main/vscode-extension", 70 | "baseContentUrl": "https://github.com/microsoft/vscode-ts-file-path-support/raw/main/vscode-extension", 71 | "yarn": true 72 | } 73 | } -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet) and [Xamarin](https://github.com/xamarin). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/security.md/definition), please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/security.md/msrc/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/security.md/msrc/pgp). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/security.md/msrc/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/security.md/cvd). 40 | 41 | 42 | -------------------------------------------------------------------------------- /language-service-plugin/test/utils.ts: -------------------------------------------------------------------------------- 1 | import * as ts from "typescript"; 2 | 3 | export function withLanguageService( 4 | content: string | Record, 5 | testFn: (tsApi: typeof ts, languageService: ts.LanguageService, sf: ts.SourceFile, markers: number[]) => void, 6 | ): void { 7 | if (typeof content === "string") { 8 | content = { "root/main.ts": content }; 9 | } 10 | 11 | const files = new Map( 12 | Object.entries(content).map(([key, value]) => [key, stripMarkers(value).stripped]) 13 | ); 14 | const serviceHost = new VirtualLanguageServiceHost(files, {}); 15 | const baseService = ts.createLanguageService( 16 | serviceHost, 17 | ts.createDocumentRegistry() 18 | ); 19 | 20 | testFn(ts, baseService, baseService.getProgram()!.getSourceFile(Object.keys(content)[0])!, stripMarkers(Object.values(content)[0]).markers); 21 | } 22 | 23 | export class VirtualLanguageServiceHost implements ts.LanguageServiceHost { 24 | constructor( 25 | private readonly files: Map, 26 | private readonly compilationSettings: ts.CompilerOptions 27 | ) { } 28 | 29 | public getScriptFileNames(): string[] { 30 | return [...this.files.keys()]; 31 | } 32 | 33 | public getScriptVersion(fileName: string): string { 34 | return "1.0"; // our files don't change 35 | } 36 | 37 | public getScriptSnapshot(fileName: string): ts.IScriptSnapshot | undefined { 38 | const content = this.files.get(fileName); 39 | if (!content) { 40 | return undefined; 41 | } 42 | return { 43 | dispose() { }, 44 | getChangeRange: () => undefined, 45 | getLength: () => content.length, 46 | getText: (start, end) => content.substr(start, end - start), 47 | }; 48 | } 49 | 50 | public getCompilationSettings(): ts.CompilerOptions { 51 | return this.compilationSettings; 52 | } 53 | 54 | public getCurrentDirectory(): string { 55 | return "/"; 56 | } 57 | 58 | public getDefaultLibFileName(options: ts.CompilerOptions): string { 59 | return ts.getDefaultLibFileName(options); 60 | } 61 | 62 | public readFile(path: string, encoding?: string): string | undefined { 63 | return this.files.get(path); 64 | } 65 | 66 | public fileExists(path: string): boolean { 67 | return this.files.has(path); 68 | } 69 | } 70 | 71 | function stripMarkers(src: string): { stripped: string; markers: number[] } { 72 | let stripped = ""; 73 | const markers = new Array(); 74 | let i = 0; 75 | let first = true; 76 | for (const part of src.split("|")) { 77 | if (first) { 78 | first = false; 79 | } else { 80 | markers.push(i); 81 | } 82 | stripped += part; 83 | i += part.length; 84 | } 85 | return { 86 | stripped, 87 | markers, 88 | }; 89 | } 90 | -------------------------------------------------------------------------------- /language-service-plugin/src/impl/ParsedJsString.ts: -------------------------------------------------------------------------------- 1 | import { OffsetRange } from "../utils/offsetRange"; 2 | 3 | type ParsedStringPart = { type: "escapeSequence" | "literalValue" | "meta"; range: OffsetRange; value: string; }; 4 | 5 | export class ParsedJsString { 6 | public static parse(source: string): ParsedJsString { 7 | const result: ParsedStringPart[] = []; 8 | let i = 0; 9 | while (i < source.length) { 10 | const c = source[i]; 11 | if (c === "\\") { 12 | const next = source[i + 1]; 13 | if (next === "n") { 14 | result.push({ type: "escapeSequence", range: new OffsetRange(i, i + 2), value: "\n" }); 15 | } else if (next === "r") { 16 | result.push({ type: "escapeSequence", range: new OffsetRange(i, i + 2), value: "\r" }); 17 | } else if (next === "t") { 18 | result.push({ type: "escapeSequence", range: new OffsetRange(i, i + 2), value: "\t" }); 19 | } else { 20 | result.push({ type: "escapeSequence", range: new OffsetRange(i, i + 2), value: next }); 21 | } 22 | i += 2; 23 | } else if (c === "\'" || c === "\"") { 24 | result.push({ type: "meta", range: new OffsetRange(i, i + 1), value: '' }); 25 | i += 1; 26 | } else { 27 | let len = 1; 28 | while (source[i + len] && source[i + len] !== "\\" && source[i + len] !== "\"" && source[i + len] !== "'") { 29 | len++; 30 | } 31 | result.push({ type: "literalValue", range: new OffsetRange(i, i + len), value: source.slice(i, i + len) }); 32 | i += len; 33 | } 34 | } 35 | return new ParsedJsString(result, source); 36 | } 37 | 38 | constructor( 39 | public readonly parts: readonly ParsedStringPart[], 40 | public readonly source: string 41 | ) { } 42 | 43 | get value() { 44 | return this.parts.map(p => p.value).join(""); 45 | } 46 | 47 | posInSourceToValue(pos: number): number { 48 | let valueLengthBefore = 0; 49 | for (const p of this.parts) { 50 | if (p.range.contains(pos)) { 51 | return valueLengthBefore + pos - p.range.start; 52 | } 53 | valueLengthBefore += p.value.length; 54 | } 55 | return this.value.length; 56 | } 57 | 58 | posInValueToSource(pos: number): number { 59 | let valueLengthBefore = 0; 60 | for (const p of this.parts) { 61 | if (valueLengthBefore + p.value.length >= pos) { 62 | if (p.type === "escapeSequence" || p.type === "meta") { 63 | return p.range.endExclusive; 64 | } 65 | return p.range.start + pos - valueLengthBefore; 66 | } 67 | valueLengthBefore += p.value.length; 68 | } 69 | 70 | return this.source.length; 71 | } 72 | 73 | getRangeWithoutQuotes(): OffsetRange { 74 | const firstMeta = this.parts.find(p => p.type === "meta"); 75 | const lastMeta = this.parts.slice().reverse().find(p => p.type === "meta"); 76 | if (!firstMeta || !lastMeta) { 77 | return new OffsetRange(0, this.source.length); 78 | } 79 | if (firstMeta === lastMeta) { 80 | return new OffsetRange(firstMeta.range.endExclusive, firstMeta.range.endExclusive); 81 | } 82 | return new OffsetRange(firstMeta.range.endExclusive, lastMeta.range.start); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /language-service-plugin/src/impl/createServiceImpl.ts: -------------------------------------------------------------------------------- 1 | import type * as ts from "typescript"; 2 | import { createCustomService } from "../rpc/registerCustomService"; 3 | import { RelativeFilePathService } from "../api"; 4 | import { AstMatchers } from "./AstMatchers"; 5 | 6 | export function createServiceImpl(typescript: typeof ts, languageService: ts.LanguageService) { 7 | return createCustomService({ 8 | findRelativeFileNodeAt({ fileName, position }) { 9 | const program = languageService.getProgram(); 10 | if (!program) { return undefined; } 11 | const utils = new AstMatchers(typescript); 12 | const nodeAtCursor = utils.findNodeAt(program, fileName, position); 13 | if (!nodeAtCursor) { return undefined; } 14 | const result = utils.findNodeOrAncestor(nodeAtCursor, n => utils.parseFilePathCallExpression(program, n)); 15 | if (!result) { return undefined; } 16 | 17 | // Only trigger when cursor is on the string literal 18 | if (result.relativePathNode !== nodeAtCursor) { return undefined; } 19 | 20 | const cursorInfo = result.getCursorInfo(position); 21 | return { 22 | baseDir: result.baseDir, 23 | relativePath: result.relativePath, 24 | relativePathBeforeCursor: cursorInfo.relativePathBeforeCursorSegment, 25 | stringValueRange: [result.relativePathValueRange.start, result.relativePathValueRange.endExclusive], 26 | cursorSegmentRange: [cursorInfo.cursorSegmentRange.start, cursorInfo.cursorSegmentRange.endExclusive], 27 | }; 28 | }, 29 | 30 | findFileNameFileContentObjAt({ fileName, position }) { 31 | const program = languageService.getProgram(); 32 | if (!program) { return undefined; } 33 | const utils = new AstMatchers(typescript); 34 | const nodeAtCursor = utils.findNodeAt(program, fileName, position); 35 | if (!nodeAtCursor) { return undefined; } 36 | const result = utils.findNodeOrAncestor(nodeAtCursor, n => utils.parseFileNameFileContentObj(program, n)); 37 | if (!result) { return undefined; } 38 | 39 | const fns = utils.findFilePathFns(program, result.node); 40 | if (fns.length === 0) { return undefined; } 41 | 42 | return { 43 | isMultiLine: true, 44 | fileContents: result.fileContents, 45 | fileName: result.fileName, 46 | relativeFilePathBaseDir: fns[0].resolvedBasePath, 47 | relativeFilePathFnName: fns[0].fnName, 48 | replaceRange: [result.replaceRange.start, result.replaceRange.endExclusive], 49 | }; 50 | }, 51 | 52 | findFilePathObjAt({ fileName, position }) { 53 | const program = languageService.getProgram(); 54 | if (!program) { return undefined; } 55 | const utils = new AstMatchers(typescript); 56 | const nodeAtCursor = utils.findNodeAt(program, fileName, position); 57 | if (!nodeAtCursor) { return undefined; } 58 | const result = utils.findNodeOrAncestor(nodeAtCursor, n => utils.parseFilePathObj(program, n)); 59 | if (!result) { return undefined; } 60 | 61 | return { 62 | isMultiLine: true, 63 | baseDir: result.filePathInfo.baseDir, 64 | relativePath: result.filePathInfo.relativePathParsed.value, 65 | replaceRange: [result.replaceRange.start, result.replaceRange.endExclusive], 66 | }; 67 | } 68 | }); 69 | } 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TypeScript Relative File Path Support 2 | 3 | ## Setup 4 | 5 | * Install this extension 6 | 7 | * For TypeScript: 8 | * Declare a type of name `RelativeFilePath` with one type parameter: 9 | ```ts 10 | type RelativeFilePath = string & { baseDir?: T }; 11 | ``` 12 | * Declare a function that uses this type (the name of the function is arbitrary): 13 | ```ts 14 | function myFn(path: RelativeFilePath<'$dir/mySubDir'>) { 15 | // The implementation is up to you. 16 | } 17 | ``` 18 | * For JavaScript (use JS Docs to specify the types): 19 | ```js 20 | /** 21 | * @typedef {string & { foo?: TBaseDir }} RelativeFilePath 22 | * @template TBaseDir 23 | */ 24 | 25 | /** 26 | * @param {RelativeFilePath<'$dir/mySubDir'>} path 27 | */ 28 | function myFn(path) { ... } 29 | ``` 30 | 31 | 32 | * Use `$dir` to reference the full directory path to the file that defines the function. 33 | * The first overloading of this function must have exactly one parameter which has to be of the mentioned type. 34 | * Now you get editor support for file paths in `myFn` call expressions! 35 | ```ts 36 | // Relative to `mySubDir` in the directory of the source file that defines `myFn` 37 | myFn('myDir/myFile.txt'); 38 | ``` 39 | 40 | 41 | ## Features 42 | 43 | ### Go-To-Definition 44 | 45 | Opens the referenced file in a new editor. 46 | 47 | ![go-to-definition-demo](docs/demo-goToDefinition.gif) 48 | 49 | ### Path-Completion 50 | 51 | Provides auto-completion for file-paths (relative to the specified base directory). 52 | 53 | ![path-autocompletion-demo](docs/demo-path-autocompletion.gif) 54 | 55 | ### Renaming 56 | 57 | Renames the referenced file and updates the file path. 58 | 59 | ![rename-demo](docs/demo-rename.gif) 60 | 61 | 62 | ### Inlining 63 | 64 | Inlining deletes the referenced file on disk and inlines its content as `fileContents` property. 65 | Only works on objects that have the shape `{ filePath: myPathFn("myRelativePathStr"), ...additionalProperties }`. 66 | 67 | ![inlining-demo](docs/demo-inlining.gif) 68 | 69 | ### Extraction 70 | 71 | Extraction is the opposit of inlining: This action creates a file on disk with the specified content and references this file by a file path function in scope (which means it has to be in the same file or imported). 72 | Only works on objects that have the shape `{ fileName: "myRelativeFileName", fileContents: "myFileContent", ...additionalProperties }`. 73 | 74 | ![extraction-demo](docs/demo-extraction.gif) 75 | 76 | ## Contributing 77 | 78 | This project welcomes contributions and suggestions. Most contributions require you to agree to a 79 | Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us 80 | the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. 81 | 82 | When you submit a pull request, a CLA bot will automatically determine whether you need to provide 83 | a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions 84 | provided by the bot. You will only need to do this once across all repos using our CLA. 85 | 86 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 87 | For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or 88 | contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. 89 | 90 | ## Trademarks 91 | 92 | This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft 93 | trademarks or logos is subject to and must follow 94 | [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). 95 | Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. 96 | Any use of third-party trademarks or logos are subject to those third-party's policies. 97 | -------------------------------------------------------------------------------- /vscode-extension/README.md: -------------------------------------------------------------------------------- 1 | # TypeScript/JavaScript Relative File Path Support 2 | 3 | An extension that provides support for dealing with (relative) file paths in TypeScript/JavaScript. 4 | 5 | ## Setup 6 | 7 | * Install this extension 8 | 9 | * For TypeScript: 10 | * Declare a type of name `RelativeFilePath` with one type parameter: 11 | ```ts 12 | type RelativeFilePath = string & { baseDir?: T }; 13 | ``` 14 | * Declare a function that uses this type (the name of the function is arbitrary): 15 | ```ts 16 | function myFn(path: RelativeFilePath<'$dir/mySubDir'>) { 17 | // The implementation is up to you. 18 | } 19 | ``` 20 | * For JavaScript (use JS Docs to specify the types): 21 | ```js 22 | /** 23 | * @typedef {string & { foo?: TBaseDir }} RelativeFilePath 24 | * @template TBaseDir 25 | */ 26 | 27 | /** 28 | * @param {RelativeFilePath<'$dir/mySubDir'>} path 29 | */ 30 | function myFn(path) { ... } 31 | ``` 32 | 33 | 34 | * Use `$dir` to reference the full directory path to the file that defines the function. 35 | * The first overloading of this function must have exactly one parameter which has to be of the mentioned type. 36 | * Now you get editor support for file paths in `myFn` call expressions! 37 | ```ts 38 | // Relative to `mySubDir` in the directory of the source file that defines `myFn` 39 | myFn('myDir/myFile.txt'); 40 | ``` 41 | 42 | 43 | ## Features 44 | 45 | ### Go-To-Definition 46 | 47 | Opens the referenced file in a new editor. 48 | 49 | ![go-to-definition-demo](./docs/demo-goToDefinition.gif) 50 | 51 | ### Path-Completion 52 | 53 | Provides auto-completion for file-paths (relative to the specified base directory). 54 | 55 | ![path-autocompletion-demo](./docs/demo-path-autocompletion.gif) 56 | 57 | ### Renaming 58 | 59 | Renames the referenced file and updates the file path. 60 | 61 | ![rename-demo](./docs/demo-rename.gif) 62 | 63 | 64 | ### Inlining 65 | 66 | Inlining deletes the referenced file on disk and inlines its content as `fileContents` property. 67 | Only works on objects that have the shape `{ filePath: myPathFn("myRelativePathStr"), ...additionalProperties }`. 68 | 69 | ![inlining-demo](./docs/demo-inlining.gif) 70 | 71 | ### Extraction 72 | 73 | Extraction is the opposit of inlining: This action creates a file on disk with the specified content and references this file by a file path function in scope (which means it has to be in the same file or imported). 74 | Only works on objects that have the shape `{ fileName: "myRelativeFileName", fileContents: "myFileContent", ...additionalProperties }`. 75 | 76 | ![extraction-demo](./docs/demo-extraction.gif) 77 | 78 | ## Contributing 79 | 80 | This project welcomes contributions and suggestions. Most contributions require you to agree to a 81 | Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us 82 | the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. 83 | 84 | When you submit a pull request, a CLA bot will automatically determine whether you need to provide 85 | a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions 86 | provided by the bot. You will only need to do this once across all repos using our CLA. 87 | 88 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 89 | For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or 90 | contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. 91 | 92 | ## Trademarks 93 | 94 | This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft 95 | trademarks or logos is subject to and must follow 96 | [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). 97 | Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. 98 | Any use of third-party trademarks or logos are subject to those third-party's policies. 99 | -------------------------------------------------------------------------------- /vscode-extension/src/index.ts: -------------------------------------------------------------------------------- 1 | import { promises as fs } from "fs"; 2 | import { join } from "path"; 3 | import type { RelativeFilePathService, RelativeFilePathServiceId } from "@vscode/ts-plugin-file-path-support/src/api"; 4 | import { CompletionItem, CompletionItemKind, ExtensionContext, languages, Range, LocationLink, WorkspaceEdit, Uri, CodeAction, CodeActionKind, DocumentSelector } from "vscode"; 5 | import { createTsLspCustomServiceClient } from "./createTsLspCustomServiceClient"; 6 | 7 | export class Extension { 8 | constructor() { 9 | const id: RelativeFilePathServiceId = "tsRelativeFilePath"; 10 | const client = createTsLspCustomServiceClient(id); 11 | 12 | const selector: DocumentSelector = [ 13 | { language: "typescript", }, 14 | { language: "typescriptreact", }, 15 | { language: "javascript", }, 16 | { language: "javascriptreact", } 17 | ]; 18 | 19 | languages.registerCompletionItemProvider(selector, { 20 | async provideCompletionItems(document, position, token, context) { 21 | const result = await client.findRelativeFileNodeAt({ uri: document.uri, position: position }); 22 | if (!result) { return undefined; } 23 | 24 | const curDir = join(result.baseDir, result.relativePathBeforeCursor); 25 | 26 | const filesInDir = await fs.readdir(curDir); 27 | const items = await Promise.all(filesInDir.map(async f => ({ 28 | name: f, 29 | isDir: (await fs.lstat(join(curDir, f))).isDirectory(), 30 | }))); 31 | 32 | items.unshift({ name: ".", isDir: true }); 33 | items.unshift({ name: "..", isDir: true }); 34 | 35 | const replaceRange = result.cursorSegmentRange; 36 | const range = new Range(document.positionAt(replaceRange[0]), document.positionAt(replaceRange[1])); 37 | 38 | return items.map(({ name, isDir }) => { 39 | return { 40 | range, 41 | label: name, 42 | kind: isDir ? CompletionItemKind.Folder : CompletionItemKind.File, 43 | insertText: isDir ? name + '/' : name, 44 | command: isDir ? { 45 | command: 'editor.action.triggerSuggest', 46 | title: '', 47 | } : undefined, 48 | }; 49 | }); 50 | }, 51 | }, '/', '.'); 52 | 53 | languages.registerDefinitionProvider(selector, { 54 | async provideDefinition(document, position, token): Promise { 55 | const result = await client.findRelativeFileNodeAt({ uri: document.uri, position: position }); 56 | if (!result) { return undefined; } 57 | const range = new Range(document.positionAt(result.stringValueRange[0]), document.positionAt(result.stringValueRange[1])); 58 | return [{ 59 | targetUri: Uri.file(join(result.baseDir, result.relativePath)), 60 | targetRange: new Range(0, 0, 0, 0), 61 | originSelectionRange: range, 62 | }]; 63 | }, 64 | }); 65 | 66 | languages.registerRenameProvider(selector, { 67 | async prepareRename(document, position, token) { 68 | const result = await client.findRelativeFileNodeAt({ uri: document.uri, position: position }); 69 | if (!result) { return undefined; } 70 | const range = new Range(document.positionAt(result.stringValueRange[0]), document.positionAt(result.stringValueRange[1])); 71 | return { 72 | range, 73 | placeholder: result.relativePath, 74 | } 75 | }, 76 | async provideRenameEdits(document, position, newName, token): Promise { 77 | const result = await client.findRelativeFileNodeAt({ uri: document.uri, position: position }); 78 | if (!result) { return undefined; } 79 | 80 | const edit = new WorkspaceEdit(); 81 | const oldPath = join(result.baseDir, result.relativePath); 82 | const newPath = join(result.baseDir, newName); 83 | edit.renameFile(Uri.file(oldPath), Uri.file(newPath), { overwrite: false, ignoreIfExists: false }); 84 | edit.replace(document.uri, new Range(document.positionAt(result.stringValueRange[0]), document.positionAt(result.stringValueRange[1])), newName); 85 | return edit; 86 | }, 87 | }); 88 | 89 | languages.registerCodeActionsProvider(selector, { 90 | async provideCodeActions(document, range, context, token) { 91 | if (context.only && (!context.only.value.startsWith('refactor.extract') || !context.only.value.includes('refactor.inline'))) { 92 | return; 93 | } 94 | 95 | const result: CodeAction[] = []; 96 | 97 | const filePathObjInfo = await client.findFilePathObjAt({ uri: document.uri, position: range.start }); 98 | if (filePathObjInfo) { 99 | const fullPath = join(filePathObjInfo.baseDir, filePathObjInfo.relativePath); 100 | const fileContents = await fs.readFile(fullPath, { encoding: 'utf8' }); 101 | const range = new Range(document.positionAt(filePathObjInfo.replaceRange[0]), document.positionAt(filePathObjInfo.replaceRange[1])); 102 | const line = document.lineAt(range.start.line); 103 | const indentation = line.text.substring(0, line.firstNonWhitespaceCharacterIndex); 104 | const newText = `fileName: ${JSON.stringify(filePathObjInfo.relativePath)},\n${indentation}fileContents: ${JSON.stringify(fileContents)}`; 105 | 106 | const editInlineAndDelete = new WorkspaceEdit(); 107 | editInlineAndDelete.replace(document.uri, range, newText); 108 | editInlineAndDelete.deleteFile(Uri.file(fullPath)); 109 | result.push({ 110 | title: "Inline And Delete File", 111 | isPreferred: true, 112 | kind: CodeActionKind.RefactorInline, 113 | edit: editInlineAndDelete, 114 | }); 115 | 116 | const editInline = new WorkspaceEdit(); 117 | editInline.replace(document.uri, range, newText); 118 | editInline.deleteFile(Uri.file(fullPath)); 119 | result.push({ 120 | title: "Inline File", 121 | kind: CodeActionKind.RefactorInline, 122 | edit: editInline, 123 | }); 124 | } 125 | 126 | const fileNameFileContentObjInfo = await client.findFileNameFileContentObjAt({ uri: document.uri, position: range.start }); 127 | if (fileNameFileContentObjInfo) { 128 | const range = new Range(document.positionAt(fileNameFileContentObjInfo.replaceRange[0]), document.positionAt(fileNameFileContentObjInfo.replaceRange[1])); 129 | const newText = `filePath: ${fileNameFileContentObjInfo.relativeFilePathFnName}(${JSON.stringify(fileNameFileContentObjInfo.fileName)})`; 130 | 131 | const editExtract = new WorkspaceEdit(); 132 | editExtract.replace(document.uri, range, newText); 133 | const newUri = Uri.file(join(fileNameFileContentObjInfo.relativeFilePathBaseDir, fileNameFileContentObjInfo.fileName)); 134 | editExtract.createFile(newUri, { ignoreIfExists: false, overwrite: false }); 135 | editExtract.replace(newUri, new Range(0, 0, 0, 0), fileNameFileContentObjInfo.fileContents); 136 | result.push({ 137 | title: "Extract File", 138 | kind: CodeActionKind.RefactorExtract, 139 | edit: editExtract, 140 | }); 141 | } 142 | 143 | return result; 144 | }, 145 | }); 146 | 147 | // TODO diagnostics provider 148 | } 149 | 150 | dispose(): void { 151 | } 152 | } 153 | 154 | export function activate(context: ExtensionContext) { 155 | context.subscriptions.push(new Extension()); 156 | } 157 | 158 | export function deactivate() { } 159 | -------------------------------------------------------------------------------- /language-service-plugin/src/utils/offsetRange.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | *--------------------------------------------------------------------------------------------*/ 5 | 6 | export interface IOffsetRange { 7 | readonly start: number; 8 | readonly endExclusive: number; 9 | } 10 | 11 | /** 12 | * A range of offsets (0-based). 13 | */ 14 | export class OffsetRange implements IOffsetRange { 15 | public static emptyAt(offset: number): OffsetRange { 16 | return new OffsetRange(offset, offset); 17 | } 18 | 19 | public static addRange(range: OffsetRange, sortedRanges: OffsetRange[]): void { 20 | let i = 0; 21 | while (i < sortedRanges.length && sortedRanges[i].endExclusive < range.start) { 22 | i++; 23 | } 24 | let j = i; 25 | while (j < sortedRanges.length && sortedRanges[j].start <= range.endExclusive) { 26 | j++; 27 | } 28 | if (i === j) { 29 | sortedRanges.splice(i, 0, range); 30 | } else { 31 | const start = Math.min(range.start, sortedRanges[i].start); 32 | const end = Math.max(range.endExclusive, sortedRanges[j - 1].endExclusive); 33 | sortedRanges.splice(i, j - i, new OffsetRange(start, end)); 34 | } 35 | } 36 | 37 | public static tryCreate(start: number, endExclusive: number): OffsetRange | undefined { 38 | if (start > endExclusive) { 39 | return undefined; 40 | } 41 | return new OffsetRange(start, endExclusive); 42 | } 43 | 44 | public static ofLength(length: number): OffsetRange { 45 | return new OffsetRange(0, length); 46 | } 47 | 48 | public static ofStartAndLength(start: number, length: number): OffsetRange { 49 | return new OffsetRange(start, start + length); 50 | } 51 | 52 | constructor(public readonly start: number, public readonly endExclusive: number) { 53 | if (start > endExclusive) { 54 | throw new Error(`Invalid range: ${this.toString()}`); 55 | } 56 | } 57 | 58 | get isEmpty(): boolean { 59 | return this.start === this.endExclusive; 60 | } 61 | 62 | public delta(offset: number): OffsetRange { 63 | return new OffsetRange(this.start + offset, this.endExclusive + offset); 64 | } 65 | 66 | public deltaStart(offset: number): OffsetRange { 67 | return new OffsetRange(this.start + offset, this.endExclusive); 68 | } 69 | 70 | public deltaEnd(offset: number): OffsetRange { 71 | return new OffsetRange(this.start, this.endExclusive + offset); 72 | } 73 | 74 | public get length(): number { 75 | return this.endExclusive - this.start; 76 | } 77 | 78 | public toString() { 79 | return `[${this.start}, ${this.endExclusive})`; 80 | } 81 | 82 | public equals(other: OffsetRange): boolean { 83 | return this.start === other.start && this.endExclusive === other.endExclusive; 84 | } 85 | 86 | public containsRange(other: OffsetRange): boolean { 87 | return this.start <= other.start && other.endExclusive <= this.endExclusive; 88 | } 89 | 90 | public contains(offset: number): boolean { 91 | return this.start <= offset && offset < this.endExclusive; 92 | } 93 | 94 | /** 95 | * for all numbers n: range1.contains(n) or range2.contains(n) => range1.join(range2).contains(n) 96 | * The joined range is the smallest range that contains both ranges. 97 | */ 98 | public join(other: OffsetRange): OffsetRange { 99 | return new OffsetRange(Math.min(this.start, other.start), Math.max(this.endExclusive, other.endExclusive)); 100 | } 101 | 102 | /** 103 | * for all numbers n: range1.contains(n) and range2.contains(n) <=> range1.intersect(range2).contains(n) 104 | * 105 | * The resulting range is empty if the ranges do not intersect, but touch. 106 | * If the ranges don't even touch, the result is undefined. 107 | */ 108 | public intersect(other: OffsetRange): OffsetRange | undefined { 109 | const start = Math.max(this.start, other.start); 110 | const end = Math.min(this.endExclusive, other.endExclusive); 111 | if (start <= end) { 112 | return new OffsetRange(start, end); 113 | } 114 | return undefined; 115 | } 116 | 117 | public intersects(other: OffsetRange): boolean { 118 | const start = Math.max(this.start, other.start); 119 | const end = Math.min(this.endExclusive, other.endExclusive); 120 | return start < end; 121 | } 122 | 123 | public intersectsOrTouches(other: OffsetRange): boolean { 124 | const start = Math.max(this.start, other.start); 125 | const end = Math.min(this.endExclusive, other.endExclusive); 126 | return start <= end; 127 | } 128 | 129 | public isBefore(other: OffsetRange): boolean { 130 | return this.endExclusive <= other.start; 131 | } 132 | 133 | public isAfter(other: OffsetRange): boolean { 134 | return this.start >= other.endExclusive; 135 | } 136 | 137 | public slice(arr: T[]): T[] { 138 | return arr.slice(this.start, this.endExclusive); 139 | } 140 | 141 | public substring(str: string): string { 142 | return str.substring(this.start, this.endExclusive); 143 | } 144 | 145 | /** 146 | * Returns the given value if it is contained in this instance, otherwise the closest value that is contained. 147 | * The range must not be empty. 148 | */ 149 | public clip(value: number): number { 150 | if (this.isEmpty) { 151 | throw new Error(`Invalid clipping range: ${this.toString()}`); 152 | } 153 | return Math.max(this.start, Math.min(this.endExclusive - 1, value)); 154 | } 155 | 156 | /** 157 | * Returns `r := value + k * length` such that `r` is contained in this range. 158 | * The range must not be empty. 159 | * 160 | * E.g. `[5, 10).clipCyclic(10) === 5`, `[5, 10).clipCyclic(11) === 6` and `[5, 10).clipCyclic(4) === 9`. 161 | */ 162 | public clipCyclic(value: number): number { 163 | if (this.isEmpty) { 164 | throw new Error(`Invalid clipping range: ${this.toString()}`); 165 | } 166 | if (value < this.start) { 167 | return this.endExclusive - ((this.start - value) % this.length); 168 | } 169 | if (value >= this.endExclusive) { 170 | return this.start + ((value - this.start) % this.length); 171 | } 172 | return value; 173 | } 174 | 175 | public map(f: (offset: number) => T): T[] { 176 | const result: T[] = []; 177 | for (let i = this.start; i < this.endExclusive; i++) { 178 | result.push(f(i)); 179 | } 180 | return result; 181 | } 182 | 183 | public mapBounds(f: (offset: number) => number): OffsetRange { 184 | return new OffsetRange(f(this.start), f(this.endExclusive)); 185 | } 186 | 187 | public forEach(f: (offset: number) => void): void { 188 | for (let i = this.start; i < this.endExclusive; i++) { 189 | f(i); 190 | } 191 | } 192 | } 193 | 194 | export class OffsetRangeSet { 195 | private readonly _sortedRanges: OffsetRange[] = []; 196 | 197 | public addRange(range: OffsetRange): void { 198 | let i = 0; 199 | while (i < this._sortedRanges.length && this._sortedRanges[i].endExclusive < range.start) { 200 | i++; 201 | } 202 | let j = i; 203 | while (j < this._sortedRanges.length && this._sortedRanges[j].start <= range.endExclusive) { 204 | j++; 205 | } 206 | if (i === j) { 207 | this._sortedRanges.splice(i, 0, range); 208 | } else { 209 | const start = Math.min(range.start, this._sortedRanges[i].start); 210 | const end = Math.max(range.endExclusive, this._sortedRanges[j - 1].endExclusive); 211 | this._sortedRanges.splice(i, j - i, new OffsetRange(start, end)); 212 | } 213 | } 214 | 215 | public toString(): string { 216 | return this._sortedRanges.map(r => r.toString()).join(', '); 217 | } 218 | 219 | /** 220 | * Returns of there is a value that is contained in this instance and the given range. 221 | */ 222 | public intersectsStrict(other: OffsetRange): boolean { 223 | // TODO use binary search 224 | let i = 0; 225 | while (i < this._sortedRanges.length && this._sortedRanges[i].endExclusive <= other.start) { 226 | i++; 227 | } 228 | return i < this._sortedRanges.length && this._sortedRanges[i].start < other.endExclusive; 229 | } 230 | 231 | public intersectWithRange(other: OffsetRange): OffsetRangeSet { 232 | // TODO use binary search + slice 233 | const result = new OffsetRangeSet(); 234 | for (const range of this._sortedRanges) { 235 | const intersection = range.intersect(other); 236 | if (intersection) { 237 | result.addRange(intersection); 238 | } 239 | } 240 | return result; 241 | } 242 | 243 | public intersectWithRangeLength(other: OffsetRange): number { 244 | return this.intersectWithRange(other).length; 245 | } 246 | 247 | public get length(): number { 248 | return this._sortedRanges.reduce((prev, cur) => prev + cur.length, 0); 249 | } 250 | } 251 | -------------------------------------------------------------------------------- /language-service-plugin/src/utils/edit.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | *--------------------------------------------------------------------------------------------*/ 5 | 6 | import type * as vscode from 'vscode'; 7 | import { OffsetRange } from './offsetRange'; 8 | 9 | export class OffsetEdit { 10 | public static readonly empty = new OffsetEdit([]); 11 | 12 | public static fromJson(data: IOffsetEdit): OffsetEdit { 13 | return new OffsetEdit(data.map(SingleOffsetEdit.fromJson)); 14 | } 15 | 16 | public static from(contentChanges: readonly vscode.TextDocumentContentChangeEvent[]) { 17 | const editsArr = contentChanges.map(c => new SingleOffsetEdit(OffsetRange.ofStartAndLength(c.rangeOffset, c.rangeLength), c.text)); 18 | editsArr.reverse(); 19 | const edits = new OffsetEdit(editsArr); 20 | return edits; 21 | } 22 | 23 | public static single( 24 | range: OffsetRange, 25 | newText: string, 26 | ): OffsetEdit { 27 | return new OffsetEdit([new SingleOffsetEdit(range, newText)]); 28 | } 29 | 30 | constructor( 31 | public readonly edits: readonly SingleOffsetEdit[], 32 | ) { 33 | let lastEndEx = -1; 34 | for (const edit of edits) { 35 | if (!(edit.replaceRange.start >= lastEndEx)) { 36 | throw new Error(`Edits must be disjoint and sorted. Found ${edit} after ${lastEndEx}`); 37 | } 38 | lastEndEx = edit.replaceRange.endExclusive; 39 | } 40 | } 41 | 42 | normalize(): OffsetEdit { 43 | const edits: SingleOffsetEdit[] = []; 44 | let lastEdit: SingleOffsetEdit | undefined; 45 | for (const edit of this.edits) { 46 | if (edit.newText.length === 0 && edit.replaceRange.length === 0) { 47 | continue; 48 | } 49 | if (lastEdit && lastEdit.replaceRange.endExclusive === edit.replaceRange.start) { 50 | lastEdit = new SingleOffsetEdit( 51 | lastEdit.replaceRange.join(edit.replaceRange), 52 | lastEdit.newText + edit.newText, 53 | ); 54 | } else { 55 | if (lastEdit) { 56 | edits.push(lastEdit); 57 | } 58 | lastEdit = edit; 59 | } 60 | } 61 | if (lastEdit) { 62 | edits.push(lastEdit); 63 | } 64 | return new OffsetEdit(edits); 65 | } 66 | 67 | toString() { 68 | const edits = this.edits.map(e => e.toString()).join(', '); 69 | return `[${edits}]`; 70 | } 71 | 72 | apply(str: string): string { 73 | const resultText: string[] = []; 74 | let pos = 0; 75 | for (const edit of this.edits) { 76 | resultText.push(str.substring(pos, edit.replaceRange.start)); 77 | resultText.push(edit.newText); 78 | pos = edit.replaceRange.endExclusive; 79 | } 80 | resultText.push(str.substring(pos)); 81 | return resultText.join(''); 82 | } 83 | 84 | compose(other: OffsetEdit): OffsetEdit { 85 | return joinEdits(this, other); 86 | } 87 | 88 | /** 89 | * Creates an edit that reverts this edit. 90 | */ 91 | inverse(originalStr: string): OffsetEdit { 92 | const edits: SingleOffsetEdit[] = []; 93 | let offset = 0; 94 | for (const e of this.edits) { 95 | edits.push(new SingleOffsetEdit( 96 | OffsetRange.ofStartAndLength(e.replaceRange.start + offset, e.newText.length), 97 | originalStr.substring(e.replaceRange.start, e.replaceRange.endExclusive), 98 | )); 99 | offset += e.newText.length - e.replaceRange.length; 100 | } 101 | return new OffsetEdit(edits); 102 | } 103 | 104 | getNewTextRanges(): OffsetRange[] { 105 | const ranges: OffsetRange[] = []; 106 | let offset = 0; 107 | for (const e of this.edits) { 108 | ranges.push(OffsetRange.ofStartAndLength(e.replaceRange.start + offset, e.newText.length),); 109 | offset += e.newText.length - e.replaceRange.length; 110 | } 111 | return ranges; 112 | } 113 | 114 | get isEmpty(): boolean { 115 | return this.edits.length === 0; 116 | } 117 | 118 | applyToOffset(originalOffset: number): number { 119 | let accumulatedDelta = 0; 120 | for (const edit of this.edits) { 121 | if (edit.replaceRange.start <= originalOffset) { 122 | if (originalOffset < edit.replaceRange.endExclusive) { 123 | // the offset is in the replaced range 124 | return edit.replaceRange.start + accumulatedDelta; 125 | } 126 | accumulatedDelta += edit.newText.length - edit.replaceRange.length; 127 | } else { 128 | break; 129 | } 130 | } 131 | return originalOffset + accumulatedDelta; 132 | } 133 | 134 | applyToOffsetRange(originalRange: OffsetRange): OffsetRange { 135 | return new OffsetRange( 136 | this.applyToOffset(originalRange.start), 137 | this.applyToOffset(originalRange.endExclusive) 138 | ); 139 | } 140 | 141 | applyInverseToOffset(postEditsOffset: number): number { 142 | let accumulatedDelta = 0; 143 | for (const edit of this.edits) { 144 | const editLength = edit.newText.length; 145 | if (edit.replaceRange.start <= postEditsOffset - accumulatedDelta) { 146 | if (postEditsOffset - accumulatedDelta < edit.replaceRange.start + editLength) { 147 | // the offset is in the replaced range 148 | return edit.replaceRange.start; 149 | } 150 | accumulatedDelta += editLength - edit.replaceRange.length; 151 | } else { 152 | break; 153 | } 154 | } 155 | return postEditsOffset - accumulatedDelta; 156 | } 157 | } 158 | 159 | export type IOffsetEdit = ISingleOffsetEdit[]; 160 | 161 | export interface ISingleOffsetEdit { 162 | txt: string; 163 | pos: number; 164 | len: number; 165 | } 166 | 167 | export class SingleOffsetEdit { 168 | public static fromJson(data: ISingleOffsetEdit): SingleOffsetEdit { 169 | return new SingleOffsetEdit( 170 | OffsetRange.ofStartAndLength(data.pos, data.len), 171 | data.txt, 172 | ); 173 | } 174 | 175 | constructor( 176 | public readonly replaceRange: OffsetRange, 177 | public readonly newText: string, 178 | ) { } 179 | 180 | toString(): string { 181 | return `${this.replaceRange} -> "${this.newText}"`; 182 | } 183 | 184 | get isEmpty() { 185 | return this.newText.length === 0 && this.replaceRange.length === 0; 186 | } 187 | } 188 | 189 | /** 190 | * Invariant: 191 | * ``` 192 | * edits2.apply(edits1.apply(str)) = join(edits1, edits2).apply(str) 193 | * ``` 194 | */ 195 | function joinEdits(edits1: OffsetEdit, edits2: OffsetEdit): OffsetEdit { 196 | edits1 = edits1.normalize(); 197 | edits2 = edits2.normalize(); 198 | 199 | if (edits1.isEmpty) { return edits2; } 200 | if (edits2.isEmpty) { return edits1; } 201 | 202 | const edit1Queue = [...edits1.edits]; 203 | const result: SingleOffsetEdit[] = []; 204 | 205 | let edit1ToEdit2 = 0; 206 | 207 | for (const edit2 of edits2.edits) { 208 | // Copy over edit1 unmodified until it touches edit2. 209 | while (true) { 210 | const edit1 = edit1Queue[0]!; 211 | if (!edit1 || edit1.replaceRange.start + edit1ToEdit2 + edit1.newText.length >= edit2.replaceRange.start) { 212 | break; 213 | } 214 | edit1Queue.shift(); 215 | 216 | result.push(edit1); 217 | edit1ToEdit2 += edit1.newText.length - edit1.replaceRange.length; 218 | } 219 | 220 | const firstEdit1ToEdit2 = edit1ToEdit2; 221 | let firstIntersecting: SingleOffsetEdit | undefined; // or touching 222 | let lastIntersecting: SingleOffsetEdit | undefined; // or touching 223 | 224 | while (true) { 225 | const edit1 = edit1Queue[0]; 226 | if (!edit1 || edit1.replaceRange.start + edit1ToEdit2 > edit2.replaceRange.endExclusive) { 227 | break; 228 | } 229 | // else we intersect, because the new end of edit1 is after or equal to our start 230 | 231 | if (!firstIntersecting) { 232 | firstIntersecting = edit1; 233 | } 234 | lastIntersecting = edit1; 235 | edit1Queue.shift(); 236 | 237 | edit1ToEdit2 += edit1.newText.length - edit1.replaceRange.length; 238 | } 239 | 240 | if (!firstIntersecting) { 241 | result.push(new SingleOffsetEdit(edit2.replaceRange.delta(-edit1ToEdit2), edit2.newText)); 242 | } else { 243 | let prefix = ''; 244 | const prefixLength = edit2.replaceRange.start - (firstIntersecting.replaceRange.start + firstEdit1ToEdit2); 245 | if (prefixLength > 0) { 246 | prefix = firstIntersecting.newText.slice(0, prefixLength); 247 | } 248 | const suffixLength = (lastIntersecting!.replaceRange.endExclusive + edit1ToEdit2) - edit2.replaceRange.endExclusive; 249 | if (suffixLength > 0) { 250 | const e = new SingleOffsetEdit(OffsetRange.ofStartAndLength(lastIntersecting!.replaceRange.endExclusive, 0), lastIntersecting!.newText.slice(-suffixLength)); 251 | edit1Queue.unshift(e); 252 | edit1ToEdit2 -= e.newText.length - e.replaceRange.length; 253 | } 254 | const newText = prefix + edit2.newText; 255 | 256 | const newReplaceRange = new OffsetRange( 257 | Math.min(firstIntersecting.replaceRange.start, edit2.replaceRange.start - firstEdit1ToEdit2), 258 | edit2.replaceRange.endExclusive - edit1ToEdit2 259 | ); 260 | result.push(new SingleOffsetEdit(newReplaceRange, newText)); 261 | } 262 | } 263 | 264 | while (true) { 265 | const item = edit1Queue.shift(); 266 | if (!item) { break; } 267 | result.push(item); 268 | } 269 | 270 | return new OffsetEdit(result).normalize(); 271 | } 272 | -------------------------------------------------------------------------------- /language-service-plugin/src/impl/AstMatchers.ts: -------------------------------------------------------------------------------- 1 | import type * as ts from "typescript"; 2 | import { OffsetRange } from "../utils/offsetRange"; 3 | import { dirname } from "path"; 4 | import { ParsedPath } from "./ParsedPath"; 5 | import { ParsedJsString } from "./ParsedJsString"; 6 | 7 | export class AstMatchers { 8 | constructor( 9 | private readonly _ts: typeof ts, 10 | ) { } 11 | 12 | public findNodeAt(program: ts.Program, fileName: string, position: number): ts.Node | undefined { 13 | const sf = program.getSourceFile(fileName); 14 | if (!sf) { return undefined; } 15 | return this.findSmallestNodeAt(sf, position); 16 | } 17 | 18 | public findFilePathCallExpression(program: ts.Program, fileName: string, position: number): FilePathCallExpression | undefined { 19 | const nodeAtCursor = this.findNodeAt(program, fileName, position); 20 | if (!nodeAtCursor) { return undefined; } 21 | const data = this.findNodeOrAncestor(nodeAtCursor, n => this.parseFilePathCallExpression(program, n)); 22 | return data; 23 | } 24 | 25 | public parseFilePathObj(program: ts.Program, node: ts.Node): { obj: ts.ObjectLiteralExpression, filePathInfo: FilePathCallExpression, replaceRange: OffsetRange } | undefined { 26 | // { filePath: fixturesFilePath('foobar/test2.txt' }; 27 | 28 | const match = this.matchesObj(node, { 29 | filePath: (n) => this.parseFilePathCallExpression(program, n), 30 | }); 31 | if (!match) { return undefined; } 32 | 33 | return { 34 | obj: match.node, 35 | replaceRange: createOffsetRange(match.result.filePath.property), 36 | filePathInfo: match.result.filePath.result, 37 | }; 38 | } 39 | 40 | public parseFileNameFileContentObj(program: ts.Program, node: ts.Node): { node: ts.ObjectLiteralExpression, fileName: string, fileContents: string, replaceRange: OffsetRange } | undefined { 41 | // { fileName: 'foobar/test2.txt', fileContents: 'foobar' }; 42 | 43 | const parseStringOrStringArray = (node: ts.Node): string | undefined => { 44 | if (this._ts.isStringLiteral(node)) { 45 | return node.text; 46 | } 47 | if (this._ts.isArrayLiteralExpression(node)) { 48 | const result: string[] = []; 49 | for (const entry of node.elements) { 50 | if (this._ts.isStringLiteral(entry)) { 51 | result.push(entry.text); 52 | } else { 53 | return undefined; 54 | } 55 | } 56 | return result.join(''); 57 | } 58 | return undefined; 59 | } 60 | 61 | 62 | const match = this.matchesObj(node, { 63 | fileName: (n) => this._ts.isStringLiteral(n) ? n : undefined, 64 | fileContents: parseStringOrStringArray 65 | }); 66 | 67 | if (!match) { return undefined; } 68 | 69 | return { 70 | node: match.node, 71 | fileName: match.result.fileName.result.text, 72 | fileContents: match.result.fileContents.result, 73 | replaceRange: createOffsetRange(match.result.fileName.property).join(createOffsetRange(match.result.fileContents.property)), 74 | }; 75 | } 76 | 77 | private matchesObj (unknown | undefined)>>(node: ts.Node, parsers: TParsers): { 78 | node: ts.ObjectLiteralExpression, result: { [K in keyof TParsers]: 79 | { property: ts.PropertyAssignment, identifier: ts.Identifier, result: ReturnType extends infer R ? R extends undefined ? never : R : never } } 80 | } | undefined { 81 | if (!this._ts.isObjectLiteralExpression(node)) { return undefined; } 82 | 83 | const result: any = {}; 84 | for (const [key, parser] of Object.entries(parsers)) { 85 | const prop = node.properties.find(p => this._ts.isPropertyAssignment(p) && this._ts.isIdentifier(p.name) && p.name.text === key); 86 | if (!prop) { return undefined; } 87 | const prop2 = prop as ts.PropertyAssignment; 88 | const value = parser(prop2.initializer); 89 | if (value === undefined) { return undefined; } 90 | result[key] = { identifier: prop2.name, result: value, property: prop2 }; 91 | } 92 | return { 93 | node, 94 | result, 95 | }; 96 | } 97 | 98 | public parseFilePathCallExpression(program: ts.Program, node: ts.Node): FilePathCallExpression | undefined { 99 | if (!this._ts.isCallExpression(node)) { return undefined; } 100 | if (!this._ts.isIdentifier(node.expression)) { return undefined; } 101 | if (node.arguments.length !== 1) { return undefined; } 102 | if (!this._ts.isStringLiteral(node.arguments[0])) { return undefined; } 103 | 104 | const identifierText = node.expression.text; 105 | const result = this.parseFilePathFn(program, identifierText, () => { 106 | const checker = program.getTypeChecker(); 107 | const fnType = checker.getTypeAtLocation(node.expression); 108 | return fnType; 109 | }); 110 | 111 | if (!result) { return undefined; } 112 | return new FilePathCallExpression(node, node.arguments[0] as ts.StringLiteral, result.basePath, result.declaringSourceFile); 113 | } 114 | 115 | public parseFilePathFn(program: ts.Program, fnName: string, getType: () => ts.Type): { fnName: string, basePath: string, declaringSourceFile: ts.SourceFile } | undefined { 116 | const fnType = getType(); 117 | const checker = program.getTypeChecker(); 118 | 119 | const callSignatures = fnType.getCallSignatures(); 120 | if (callSignatures.length === 0) { return undefined; } 121 | const parameters = callSignatures[0].parameters; 122 | if (parameters.length !== 1) { return undefined; } 123 | 124 | const pathSymbol = parameters[0]; 125 | const pathType = checker.getTypeOfSymbol(pathSymbol); 126 | if (pathType.aliasSymbol?.name !== 'RelativeFilePath') { return undefined; } 127 | const baseDirType = pathType.aliasTypeArguments?.[0]; 128 | if (!baseDirType) { return undefined; } 129 | const baseDir = (baseDirType as any).value as string; 130 | 131 | const fnDeclaration = fnType.symbol.declarations?.[0]; 132 | if (!fnDeclaration) { return undefined; } 133 | 134 | const declaringSourceFile = fnDeclaration.getSourceFile(); 135 | return { 136 | fnName, 137 | basePath: baseDir, 138 | declaringSourceFile, 139 | }; 140 | } 141 | 142 | public findFilePathFns(program: ts.Program, node: ts.Node): { fnName: string, resolvedBasePath: string }[] { 143 | const checker = program.getTypeChecker(); 144 | const symbols = checker.getSymbolsInScope(node, this._ts.SymbolFlags.Function | this._ts.SymbolFlags.Alias); 145 | 146 | const filteredSymbols = symbols 147 | .map(s => this.parseFilePathFn(program, s.name, () => checker.getTypeOfSymbol(s))) 148 | .filter(i => !!i); 149 | 150 | return filteredSymbols.map(s => ({ 151 | fnName: s.fnName, 152 | resolvedBasePath: s.basePath.replace('$dir', dirname(s.declaringSourceFile.fileName)), 153 | })); 154 | } 155 | 156 | public findNodeOrAncestor(node: ts.Node, predicate: (node: ts.Node) => T | undefined): T | undefined { 157 | while (node) { 158 | const result = predicate(node); 159 | if (result) { return result; } 160 | node = node.parent; 161 | } 162 | return undefined; 163 | } 164 | 165 | public findSmallestNodeAt( 166 | node: ts.Node, 167 | position: number 168 | ): ts.Node | undefined { 169 | if (!(node.getStart() <= position && position <= node.getEnd())) { 170 | return undefined; 171 | } 172 | let result: ts.Node = node; 173 | node.forEachChild( 174 | node => { 175 | const c = this.findSmallestNodeAt(node, position); 176 | if (c) { 177 | result = c; 178 | } 179 | }, 180 | arr => { 181 | for (const item of arr) { 182 | const c = this.findSmallestNodeAt(item, position); 183 | if (c) { 184 | result = c; 185 | } 186 | } 187 | } 188 | ); 189 | 190 | return result; 191 | } 192 | } 193 | 194 | 195 | export class FilePathCallExpression { 196 | public readonly baseDir = this.baseDirUnresolved.replace('$dir', dirname(this.basePathSourceFileNode.fileName)); 197 | 198 | public readonly relativePathParsed = ParsedJsString.parse(this.relativePathNode.getSourceFile().text.substring(this.relativePathNode.getStart(), this.relativePathNode.getEnd())); 199 | public readonly relativePathSegments = ParsedPath.parse(this.relativePathParsed.value); 200 | 201 | public readonly relativePath = this.relativePathSegments.text; 202 | 203 | public readonly relativePathValueRange = 204 | OffsetRange.ofLength(this.relativePathParsed.value.length) 205 | .mapBounds(o => this.relativePathParsed.posInValueToSource(o)) 206 | .delta(this.relativePathNode.getStart()); 207 | 208 | constructor( 209 | public readonly callExpressionNode: ts.CallExpression, 210 | public readonly relativePathNode: ts.StringLiteral, 211 | public readonly baseDirUnresolved: string, 212 | public readonly basePathSourceFileNode: ts.SourceFile, 213 | ) { } 214 | 215 | getCursorInfo(position: number) { 216 | const curPathSegment = this.relativePathSegments.getLiteralSegmentTouchingPos(this.relativePathParsed.posInSourceToValue(position - this.relativePathNode.getStart()))!; 217 | const curPathSegmentIdx = this.relativePathSegments.segments.indexOf(curPathSegment); 218 | const relativePathBeforeCursorSegment = this.relativePathSegments.getSubPath(curPathSegmentIdx); 219 | 220 | return { 221 | cursorSegmentRange: new OffsetRange( 222 | this.relativePathParsed.posInValueToSource(curPathSegment.range.start), 223 | this.relativePathParsed.posInValueToSource(curPathSegment.range.endExclusive) 224 | ).delta(this.relativePathNode.getStart()), 225 | relativePathBeforeCursorSegment, 226 | }; 227 | } 228 | } 229 | 230 | function createOffsetRange(node: ts.Node): OffsetRange { 231 | return new OffsetRange(node.getStart(), node.getEnd()); 232 | } 233 | -------------------------------------------------------------------------------- /language-service-plugin/test/tests.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test } from 'vitest'; 2 | import { withLanguageService } from "./utils"; 3 | import { ParsedJsString } from "../src/impl/ParsedJsString"; 4 | import { ParsedPath } from "../src/impl/ParsedPath"; 5 | import { OffsetEdit, SingleOffsetEdit } from "../src/utils/edit"; 6 | import { OffsetRange } from "../src/utils/offsetRange"; 7 | import { createServiceImpl } from "../src/impl/createServiceImpl"; 8 | 9 | describe("Service", () => { 10 | test('Basic', () => withLanguageService( 11 | ` 12 | type RelativeFilePath = string & { baseDir?: TBaseDir }; 13 | function fixturesFilePath(path: RelativeFilePath<'$dir/target'>) { } 14 | 15 | const data1 = { 16 | fileP|ath: fixturesFilePath('foo.txt'), 17 | }; 18 | 19 | const data2 = { 20 | fileName: "foo.txt", 21 | fileC|ontents: "bar", 22 | }; 23 | 24 | const data3 = { 25 | fileName: "foo.txt", 26 | fileC|ontents: [ "line1\\n", "line2\\n", "line3" ], 27 | }; 28 | `, 29 | (ts, languageService, sf, m) => { 30 | const impl = createServiceImpl(ts, languageService); 31 | expect(impl.findFilePathObjAt({ fileName: sf.fileName, position: m[0] })).toMatchInlineSnapshot(` 32 | { 33 | "baseDir": "root/target", 34 | "isMultiLine": true, 35 | "relativePath": "foo.txt", 36 | "replaceRange": [ 37 | 182, 38 | 219, 39 | ], 40 | } 41 | `); 42 | expect(impl.findFileNameFileContentObjAt({ fileName: sf.fileName, position: m[1] })).toMatchInlineSnapshot(` 43 | { 44 | "fileContents": "bar", 45 | "fileName": "foo.txt", 46 | "isMultiLine": true, 47 | "relativeFilePathBaseDir": "root/target", 48 | "relativeFilePathFnName": "fixturesFilePath", 49 | "replaceRange": [ 50 | 251, 51 | 295, 52 | ], 53 | } 54 | `); 55 | expect(impl.findFileNameFileContentObjAt({ fileName: sf.fileName, position: m[2] })).toMatchInlineSnapshot(` 56 | { 57 | "fileContents": "line1 58 | line2 59 | line3", 60 | "fileName": "foo.txt", 61 | "isMultiLine": true, 62 | "relativeFilePathBaseDir": "root/target", 63 | "relativeFilePathFnName": "fixturesFilePath", 64 | "replaceRange": [ 65 | 327, 66 | 399, 67 | ], 68 | } 69 | `); 70 | } 71 | )); 72 | 73 | test('Invalid Type Name', () => withLanguageService( 74 | ` 75 | type RelativeFilePathX = string & { baseDir?: TBaseDir }; 76 | function fixturesFilePath(path: RelativeFilePathX<'$dir/target'>) { } 77 | 78 | const data1 = { 79 | filePath: fixturesFilePath('f|oo.txt'), 80 | }; 81 | `, 82 | (ts, languageService, sf, m) => { 83 | const impl = createServiceImpl(ts, languageService); 84 | expect(impl.findFilePathObjAt({ fileName: sf.fileName, position: m[0] })).toMatchInlineSnapshot(` 85 | undefined 86 | `); 87 | expect(impl.findFileNameFileContentObjAt({ fileName: sf.fileName, position: m[1] })).toMatchInlineSnapshot(`undefined`); 88 | } 89 | )); 90 | 91 | test('Supports Overloading', () => withLanguageService( 92 | ` 93 | type RelativeFilePath = string & { baseDir?: T }; 94 | 95 | function resolveFilePath(path: RelativeFilePath<'$dir/target'>); 96 | function resolveFilePath(path: {}, foo: string); 97 | function resolveFilePath(...args: any[]) { } 98 | 99 | export const data1 = { 100 | filePath: resolveFilePath("samp|leDir/test1.txt") 101 | }; 102 | `, 103 | (ts, languageService, sf, m) => { 104 | const impl = createServiceImpl(ts, languageService); 105 | expect(impl.findFilePathObjAt({ fileName: sf.fileName, position: m[0] })).toMatchInlineSnapshot(` 106 | { 107 | "baseDir": "root/target", 108 | "isMultiLine": true, 109 | "relativePath": "sampleDir/test1.txt", 110 | "replaceRange": [ 111 | 272, 112 | 320, 113 | ], 114 | } 115 | `); 116 | } 117 | )); 118 | 119 | test('Supports Other Names', () => withLanguageService( 120 | ` 121 | type RelativeFilePath = string & { baseDir?: T }; 122 | 123 | function fromFixture(path: RelativeFilePath<'$dir/target'>); 124 | function fromFixture(path: {}, foo: string); 125 | function fromFixture(...args: any[]) { } 126 | 127 | export const data1 = { 128 | filePath: fromFixture("samp|leDir/test1.txt") 129 | }; 130 | `, 131 | (ts, languageService, sf, m) => { 132 | const impl = createServiceImpl(ts, languageService); 133 | expect(impl.findFilePathObjAt({ fileName: sf.fileName, position: m[0] })).toMatchInlineSnapshot(` 134 | { 135 | "baseDir": "root/target", 136 | "isMultiLine": true, 137 | "relativePath": "sampleDir/test1.txt", 138 | "replaceRange": [ 139 | 260, 140 | 304, 141 | ], 142 | } 143 | `); 144 | } 145 | )); 146 | 147 | test('Multi File 1', () => withLanguageService( 148 | { 149 | "/root/main.ts": ` 150 | import { fromFixture } from "./lib"; 151 | 152 | export const data1 = { 153 | filePath: fromFixture("samp|leDir/test1.txt") 154 | }; 155 | `, 156 | "/root/lib.ts": ` 157 | type RelativeFilePath = string & { baseDir?: T }; 158 | export function fromFixture(path: RelativeFilePath<'$dir/target'>) { return path; } 159 | ` 160 | }, 161 | 162 | (ts, languageService, sf, m) => { 163 | const impl = createServiceImpl(ts, languageService); 164 | expect(languageService.getProgram()!.getSemanticDiagnostics()).toMatchInlineSnapshot(`[]`); 165 | 166 | expect(impl.findFilePathObjAt({ fileName: sf.fileName, position: m[0] })).toMatchInlineSnapshot(` 167 | { 168 | "baseDir": "/root/target", 169 | "isMultiLine": true, 170 | "relativePath": "sampleDir/test1.txt", 171 | "replaceRange": [ 172 | 75, 173 | 119, 174 | ], 175 | } 176 | `); 177 | } 178 | )); 179 | 180 | test('Multi File 2', () => withLanguageService( 181 | { 182 | "/main.ts": ` 183 | import { fromFixture } from "./lib"; 184 | 185 | export const data1 = { 186 | fileN|ame: 'hello world', 187 | fileContents: 'foo bar', 188 | }; 189 | `, 190 | "/lib.ts": ` 191 | type RelativeFilePath = string & { baseDir?: T }; 192 | export function fromFixture(path: RelativeFilePath<'$dir/target'>) { return path; } 193 | ` 194 | }, 195 | 196 | (ts, languageService, sf, m) => { 197 | const impl = createServiceImpl(ts, languageService); 198 | expect(languageService.getProgram()!.getSemanticDiagnostics()).toMatchInlineSnapshot(`[]`); 199 | 200 | expect(impl.findFileNameFileContentObjAt({ fileName: sf.fileName, position: m[0] })).toMatchInlineSnapshot(` 201 | { 202 | "fileContents": "foo bar", 203 | "fileName": "hello world", 204 | "isMultiLine": true, 205 | "relativeFilePathBaseDir": "//target", 206 | "relativeFilePathFnName": "fromFixture", 207 | "replaceRange": [ 208 | 75, 209 | 128, 210 | ], 211 | } 212 | `); 213 | } 214 | )); 215 | }); 216 | 217 | describe("ParsedJsString", () => { 218 | test("value", () => { 219 | const str = ParsedJsString.parse(`"te\tst"`); 220 | expect(str.value).toBe("te\tst"); 221 | }); 222 | 223 | describe("srcToVal", () => { 224 | test("1", () => { 225 | const str = ParsedJsString.parse(`"te\\\\st"`); 226 | const segments = [] as string[]; 227 | for (let srcIdx = 0; srcIdx <= str.source.length; srcIdx++) { 228 | const valueIdx = str.posInSourceToValue(srcIdx); 229 | const editSrc = OffsetEdit.single(OffsetRange.emptyAt(srcIdx), "|"); 230 | const editVal = OffsetEdit.single(OffsetRange.emptyAt(valueIdx), "|"); 231 | const val = `${editSrc.apply(str.source)} -> ${editVal.apply(str.value)}` 232 | .replace(/"/g, "'") 233 | .replace(/\\/g, "/"); 234 | 235 | segments.push(val); 236 | } 237 | 238 | expect(segments).toMatchInlineSnapshot(` 239 | [ 240 | "|'te//st' -> |te/st", 241 | "'|te//st' -> |te/st", 242 | "'t|e//st' -> t|e/st", 243 | "'te|//st' -> te|/st", 244 | "'te/|/st' -> te/|st", 245 | "'te//|st' -> te/|st", 246 | "'te//s|t' -> te/s|t", 247 | "'te//st|' -> te/st|", 248 | "'te//st'| -> te/st|", 249 | ] 250 | `); 251 | }); 252 | }); 253 | 254 | describe("valToSrc", () => { 255 | test("1", () => { 256 | const str = ParsedJsString.parse(`"te\\\\st"`); 257 | const segments = [] as string[]; 258 | for (let valueIdx = 0; valueIdx <= str.value.length; valueIdx++) { 259 | const srcIdx = str.posInValueToSource(valueIdx); 260 | const editSrc = OffsetEdit.single(OffsetRange.emptyAt(srcIdx), "|"); 261 | const editVal = OffsetEdit.single(OffsetRange.emptyAt(valueIdx), "|"); 262 | const val = `${editVal.apply(str.value)} -> ${editSrc.apply(str.source)}` 263 | .replace(/"/g, "'") 264 | .replace(/\\/g, "/"); 265 | 266 | segments.push(val); 267 | } 268 | 269 | expect(segments).toMatchInlineSnapshot(` 270 | [ 271 | "|te/st -> '|te//st'", 272 | "t|e/st -> 't|e//st'", 273 | "te|/st -> 'te|//st'", 274 | "te/|st -> 'te//|st'", 275 | "te/s|t -> 'te//s|t'", 276 | "te/st| -> 'te//st|'", 277 | ] 278 | `); 279 | }); 280 | }); 281 | }); 282 | 283 | describe("ParsedPath", () => { 284 | describe("getLiteralSegmentTouchingPos", () => { 285 | function getSegments(p: ParsedPath) { 286 | const segments = [] as string[]; 287 | for (let i = 0; i <= p.text.length; i++) { 288 | const r = p.getLiteralSegmentTouchingPos(i)!; 289 | 290 | const edits = new OffsetEdit([ 291 | new SingleOffsetEdit(OffsetRange.emptyAt(r.range.start), "["), 292 | new SingleOffsetEdit(OffsetRange.emptyAt(i), "|"), 293 | new SingleOffsetEdit(OffsetRange.emptyAt(r.range.endExclusive), "]"), 294 | ]); 295 | 296 | const part = edits.apply(p.text); 297 | segments.push(`${part}`); 298 | } 299 | return segments; 300 | } 301 | 302 | test("1", () => { 303 | const segments = getSegments(ParsedPath.parse("foo/a/baz.txt")); 304 | expect(segments).toMatchInlineSnapshot(` 305 | [ 306 | "[|foo]/a/baz.txt", 307 | "[f|oo]/a/baz.txt", 308 | "[fo|o]/a/baz.txt", 309 | "[foo|]/a/baz.txt", 310 | "foo/[|a]/baz.txt", 311 | "foo/[a|]/baz.txt", 312 | "foo/a/[|baz.txt]", 313 | "foo/a/[b|az.txt]", 314 | "foo/a/[ba|z.txt]", 315 | "foo/a/[baz|.txt]", 316 | "foo/a/[baz.|txt]", 317 | "foo/a/[baz.t|xt]", 318 | "foo/a/[baz.tx|t]", 319 | "foo/a/[baz.txt|]", 320 | ] 321 | `); 322 | }); 323 | 324 | test("2", () => { 325 | const segments = getSegments(ParsedPath.parse("")); 326 | expect(segments).toMatchInlineSnapshot(` 327 | [ 328 | "[|]", 329 | ] 330 | `); 331 | }); 332 | 333 | }); 334 | 335 | test("subPath", () => { 336 | const p = ParsedPath.parse("foo/a/baz.txt"); 337 | 338 | const subPaths = [] as string[]; 339 | for (let i = 0; i <= p.segments.length; i++) { 340 | const subPath = p.getSubPath(i); 341 | subPaths.push(subPath); 342 | } 343 | 344 | expect(subPaths).toMatchInlineSnapshot(` 345 | [ 346 | "", 347 | "foo", 348 | "foo/", 349 | "foo/a", 350 | "foo/a/", 351 | "foo/a/baz.txt", 352 | ] 353 | `); 354 | }); 355 | }); -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@azure/abort-controller@^2.0.0": 6 | version "2.1.2" 7 | resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-2.1.2.tgz#42fe0ccab23841d9905812c58f1082d27784566d" 8 | integrity sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA== 9 | dependencies: 10 | tslib "^2.6.2" 11 | 12 | "@azure/core-auth@^1.4.0", "@azure/core-auth@^1.8.0", "@azure/core-auth@^1.9.0": 13 | version "1.9.0" 14 | resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.9.0.tgz#ac725b03fabe3c892371065ee9e2041bee0fd1ac" 15 | integrity sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw== 16 | dependencies: 17 | "@azure/abort-controller" "^2.0.0" 18 | "@azure/core-util" "^1.11.0" 19 | tslib "^2.6.2" 20 | 21 | "@azure/core-client@^1.9.2": 22 | version "1.9.2" 23 | resolved "https://registry.yarnpkg.com/@azure/core-client/-/core-client-1.9.2.tgz#6fc69cee2816883ab6c5cdd653ee4f2ff9774f74" 24 | integrity sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w== 25 | dependencies: 26 | "@azure/abort-controller" "^2.0.0" 27 | "@azure/core-auth" "^1.4.0" 28 | "@azure/core-rest-pipeline" "^1.9.1" 29 | "@azure/core-tracing" "^1.0.0" 30 | "@azure/core-util" "^1.6.1" 31 | "@azure/logger" "^1.0.0" 32 | tslib "^2.6.2" 33 | 34 | "@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.9.1": 35 | version "1.19.0" 36 | resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.19.0.tgz#4cc60d3f2ee68cf0ef379851b4ed175f7932c8c5" 37 | integrity sha512-bM3308LRyg5g7r3Twprtqww0R/r7+GyVxj4BafcmVPo4WQoGt5JXuaqxHEFjw2o3rvFZcUPiqJMg6WuvEEeVUA== 38 | dependencies: 39 | "@azure/abort-controller" "^2.0.0" 40 | "@azure/core-auth" "^1.8.0" 41 | "@azure/core-tracing" "^1.0.1" 42 | "@azure/core-util" "^1.11.0" 43 | "@azure/logger" "^1.0.0" 44 | http-proxy-agent "^7.0.0" 45 | https-proxy-agent "^7.0.0" 46 | tslib "^2.6.2" 47 | 48 | "@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.0.1": 49 | version "1.2.0" 50 | resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.2.0.tgz#7be5d53c3522d639cf19042cbcdb19f71bc35ab2" 51 | integrity sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg== 52 | dependencies: 53 | tslib "^2.6.2" 54 | 55 | "@azure/core-util@^1.11.0", "@azure/core-util@^1.6.1": 56 | version "1.11.0" 57 | resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.11.0.tgz#f530fc67e738aea872fbdd1cc8416e70219fada7" 58 | integrity sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g== 59 | dependencies: 60 | "@azure/abort-controller" "^2.0.0" 61 | tslib "^2.6.2" 62 | 63 | "@azure/identity@^4.1.0": 64 | version "4.7.0" 65 | resolved "https://registry.yarnpkg.com/@azure/identity/-/identity-4.7.0.tgz#b3bc57aec40432899108fd41177e8168e7bb6223" 66 | integrity sha512-6z/S2KorkbKaZ0DgZFVRdu7RCuATmMSTjKpuhj7YpjxkJ0vnJ7kTM3cpNgzFgk9OPYfZ31wrBEtC/iwAS4jQDA== 67 | dependencies: 68 | "@azure/abort-controller" "^2.0.0" 69 | "@azure/core-auth" "^1.9.0" 70 | "@azure/core-client" "^1.9.2" 71 | "@azure/core-rest-pipeline" "^1.17.0" 72 | "@azure/core-tracing" "^1.0.0" 73 | "@azure/core-util" "^1.11.0" 74 | "@azure/logger" "^1.0.0" 75 | "@azure/msal-browser" "^4.2.0" 76 | "@azure/msal-node" "^3.2.1" 77 | events "^3.0.0" 78 | jws "^4.0.0" 79 | open "^10.1.0" 80 | stoppable "^1.1.0" 81 | tslib "^2.2.0" 82 | 83 | "@azure/logger@^1.0.0": 84 | version "1.1.4" 85 | resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.1.4.tgz#223cbf2b424dfa66478ce9a4f575f59c6f379768" 86 | integrity sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ== 87 | dependencies: 88 | tslib "^2.6.2" 89 | 90 | "@azure/msal-browser@^4.2.0": 91 | version "4.3.0" 92 | resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-4.3.0.tgz#982156c9e923d82b1eab508edbd8e146f2602c9f" 93 | integrity sha512-A8NjaeaS1cmhzhXQs4Y2jtHYnq9IeC3i7iKaRQgfgWAvFhl1UAf9NqcDrsqNcafVpcwLWnObrtOs7mIyRjhj2A== 94 | dependencies: 95 | "@azure/msal-common" "15.2.0" 96 | 97 | "@azure/msal-common@15.2.0": 98 | version "15.2.0" 99 | resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-15.2.0.tgz#f4e38ba85c0a32208b7046e011c21ff627b6755c" 100 | integrity sha512-HiYfGAKthisUYqHG1nImCf/uzcyS31wng3o+CycWLIM9chnYJ9Lk6jZ30Y6YiYYpTQ9+z/FGUpiKKekd3Arc0A== 101 | 102 | "@azure/msal-node@^3.2.1": 103 | version "3.2.3" 104 | resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-3.2.3.tgz#c742d66d3a9183c1dfa4160632d8891c69af7bcc" 105 | integrity sha512-0eaPqBIWEAizeYiXdeHb09Iq0tvHJ17ztvNEaLdr/KcJJhJxbpkkEQf09DB+vKlFE0tzYi7j4rYLTXtES/InEQ== 106 | dependencies: 107 | "@azure/msal-common" "15.2.0" 108 | jsonwebtoken "^9.0.0" 109 | uuid "^8.3.0" 110 | 111 | "@esbuild/aix-ppc64@0.21.5": 112 | version "0.21.5" 113 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" 114 | integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== 115 | 116 | "@esbuild/android-arm64@0.21.5": 117 | version "0.21.5" 118 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" 119 | integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== 120 | 121 | "@esbuild/android-arm@0.21.5": 122 | version "0.21.5" 123 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" 124 | integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== 125 | 126 | "@esbuild/android-x64@0.21.5": 127 | version "0.21.5" 128 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" 129 | integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== 130 | 131 | "@esbuild/darwin-arm64@0.21.5": 132 | version "0.21.5" 133 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" 134 | integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== 135 | 136 | "@esbuild/darwin-x64@0.21.5": 137 | version "0.21.5" 138 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" 139 | integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== 140 | 141 | "@esbuild/freebsd-arm64@0.21.5": 142 | version "0.21.5" 143 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" 144 | integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== 145 | 146 | "@esbuild/freebsd-x64@0.21.5": 147 | version "0.21.5" 148 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" 149 | integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== 150 | 151 | "@esbuild/linux-arm64@0.21.5": 152 | version "0.21.5" 153 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" 154 | integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== 155 | 156 | "@esbuild/linux-arm@0.21.5": 157 | version "0.21.5" 158 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" 159 | integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== 160 | 161 | "@esbuild/linux-ia32@0.21.5": 162 | version "0.21.5" 163 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" 164 | integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== 165 | 166 | "@esbuild/linux-loong64@0.21.5": 167 | version "0.21.5" 168 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" 169 | integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== 170 | 171 | "@esbuild/linux-mips64el@0.21.5": 172 | version "0.21.5" 173 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" 174 | integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== 175 | 176 | "@esbuild/linux-ppc64@0.21.5": 177 | version "0.21.5" 178 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" 179 | integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== 180 | 181 | "@esbuild/linux-riscv64@0.21.5": 182 | version "0.21.5" 183 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" 184 | integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== 185 | 186 | "@esbuild/linux-s390x@0.21.5": 187 | version "0.21.5" 188 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" 189 | integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== 190 | 191 | "@esbuild/linux-x64@0.21.5": 192 | version "0.21.5" 193 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" 194 | integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== 195 | 196 | "@esbuild/netbsd-x64@0.21.5": 197 | version "0.21.5" 198 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" 199 | integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== 200 | 201 | "@esbuild/openbsd-x64@0.21.5": 202 | version "0.21.5" 203 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" 204 | integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== 205 | 206 | "@esbuild/sunos-x64@0.21.5": 207 | version "0.21.5" 208 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" 209 | integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== 210 | 211 | "@esbuild/win32-arm64@0.21.5": 212 | version "0.21.5" 213 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" 214 | integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== 215 | 216 | "@esbuild/win32-ia32@0.21.5": 217 | version "0.21.5" 218 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" 219 | integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== 220 | 221 | "@esbuild/win32-x64@0.21.5": 222 | version "0.21.5" 223 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" 224 | integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== 225 | 226 | "@isaacs/cliui@^8.0.2": 227 | version "8.0.2" 228 | resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" 229 | integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== 230 | dependencies: 231 | string-width "^5.1.2" 232 | string-width-cjs "npm:string-width@^4.2.0" 233 | strip-ansi "^7.0.1" 234 | strip-ansi-cjs "npm:strip-ansi@^6.0.1" 235 | wrap-ansi "^8.1.0" 236 | wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" 237 | 238 | "@jest/schemas@^29.6.3": 239 | version "29.6.3" 240 | resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" 241 | integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== 242 | dependencies: 243 | "@sinclair/typebox" "^0.27.8" 244 | 245 | "@jridgewell/sourcemap-codec@^1.5.0": 246 | version "1.5.0" 247 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" 248 | integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== 249 | 250 | "@nodelib/fs.scandir@2.1.5": 251 | version "2.1.5" 252 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 253 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 254 | dependencies: 255 | "@nodelib/fs.stat" "2.0.5" 256 | run-parallel "^1.1.9" 257 | 258 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 259 | version "2.0.5" 260 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 261 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 262 | 263 | "@nodelib/fs.walk@^1.2.3": 264 | version "1.2.8" 265 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 266 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 267 | dependencies: 268 | "@nodelib/fs.scandir" "2.1.5" 269 | fastq "^1.6.0" 270 | 271 | "@rollup/plugin-typescript@11.1.6": 272 | version "11.1.6" 273 | resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz#724237d5ec12609ec01429f619d2a3e7d4d1b22b" 274 | integrity sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA== 275 | dependencies: 276 | "@rollup/pluginutils" "^5.1.0" 277 | resolve "^1.22.1" 278 | 279 | "@rollup/pluginutils@^5.1.0": 280 | version "5.1.4" 281 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a" 282 | integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ== 283 | dependencies: 284 | "@types/estree" "^1.0.0" 285 | estree-walker "^2.0.2" 286 | picomatch "^4.0.2" 287 | 288 | "@rollup/rollup-android-arm-eabi@4.22.4": 289 | version "4.22.4" 290 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz#8b613b9725e8f9479d142970b106b6ae878610d5" 291 | integrity sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w== 292 | 293 | "@rollup/rollup-android-arm-eabi@4.34.8": 294 | version "4.34.8" 295 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz#731df27dfdb77189547bcef96ada7bf166bbb2fb" 296 | integrity sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw== 297 | 298 | "@rollup/rollup-android-arm64@4.22.4": 299 | version "4.22.4" 300 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz#654ca1049189132ff602bfcf8df14c18da1f15fb" 301 | integrity sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA== 302 | 303 | "@rollup/rollup-android-arm64@4.34.8": 304 | version "4.34.8" 305 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz#4bea6db78e1f6927405df7fe0faf2f5095e01343" 306 | integrity sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q== 307 | 308 | "@rollup/rollup-darwin-arm64@4.22.4": 309 | version "4.22.4" 310 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz#6d241d099d1518ef0c2205d96b3fa52e0fe1954b" 311 | integrity sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q== 312 | 313 | "@rollup/rollup-darwin-arm64@4.34.8": 314 | version "4.34.8" 315 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz#a7aab77d44be3c44a20f946e10160f84e5450e7f" 316 | integrity sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q== 317 | 318 | "@rollup/rollup-darwin-x64@4.22.4": 319 | version "4.22.4" 320 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz#42bd19d292a57ee11734c980c4650de26b457791" 321 | integrity sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw== 322 | 323 | "@rollup/rollup-darwin-x64@4.34.8": 324 | version "4.34.8" 325 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz#c572c024b57ee8ddd1b0851703ace9eb6cc0dd82" 326 | integrity sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw== 327 | 328 | "@rollup/rollup-freebsd-arm64@4.34.8": 329 | version "4.34.8" 330 | resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz#cf74f8113b5a83098a5c026c165742277cbfb88b" 331 | integrity sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA== 332 | 333 | "@rollup/rollup-freebsd-x64@4.34.8": 334 | version "4.34.8" 335 | resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz#39561f3a2f201a4ad6a01425b1ff5928154ecd7c" 336 | integrity sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q== 337 | 338 | "@rollup/rollup-linux-arm-gnueabihf@4.22.4": 339 | version "4.22.4" 340 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz#f23555ee3d8fe941c5c5fd458cd22b65eb1c2232" 341 | integrity sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ== 342 | 343 | "@rollup/rollup-linux-arm-gnueabihf@4.34.8": 344 | version "4.34.8" 345 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz#980d6061e373bfdaeb67925c46d2f8f9b3de537f" 346 | integrity sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g== 347 | 348 | "@rollup/rollup-linux-arm-musleabihf@4.22.4": 349 | version "4.22.4" 350 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz#f3bbd1ae2420f5539d40ac1fde2b38da67779baa" 351 | integrity sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg== 352 | 353 | "@rollup/rollup-linux-arm-musleabihf@4.34.8": 354 | version "4.34.8" 355 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz#f91a90f30dc00d5a64ac2d9bbedc829cd3cfaa78" 356 | integrity sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA== 357 | 358 | "@rollup/rollup-linux-arm64-gnu@4.22.4": 359 | version "4.22.4" 360 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz#7abe900120113e08a1f90afb84c7c28774054d15" 361 | integrity sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw== 362 | 363 | "@rollup/rollup-linux-arm64-gnu@4.34.8": 364 | version "4.34.8" 365 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz#fac700fa5c38bc13a0d5d34463133093da4c92a0" 366 | integrity sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A== 367 | 368 | "@rollup/rollup-linux-arm64-musl@4.22.4": 369 | version "4.22.4" 370 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz#9e655285c8175cd44f57d6a1e8e5dedfbba1d820" 371 | integrity sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA== 372 | 373 | "@rollup/rollup-linux-arm64-musl@4.34.8": 374 | version "4.34.8" 375 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz#f50ecccf8c78841ff6df1706bc4782d7f62bf9c3" 376 | integrity sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q== 377 | 378 | "@rollup/rollup-linux-loongarch64-gnu@4.34.8": 379 | version "4.34.8" 380 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz#5869dc0b28242da6553e2b52af41374f4038cd6e" 381 | integrity sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ== 382 | 383 | "@rollup/rollup-linux-powerpc64le-gnu@4.22.4": 384 | version "4.22.4" 385 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz#9a79ae6c9e9d8fe83d49e2712ecf4302db5bef5e" 386 | integrity sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg== 387 | 388 | "@rollup/rollup-linux-powerpc64le-gnu@4.34.8": 389 | version "4.34.8" 390 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz#5cdd9f851ce1bea33d6844a69f9574de335f20b1" 391 | integrity sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw== 392 | 393 | "@rollup/rollup-linux-riscv64-gnu@4.22.4": 394 | version "4.22.4" 395 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz#67ac70eca4ace8e2942fabca95164e8874ab8128" 396 | integrity sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA== 397 | 398 | "@rollup/rollup-linux-riscv64-gnu@4.34.8": 399 | version "4.34.8" 400 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz#ef5dc37f4388f5253f0def43e1440ec012af204d" 401 | integrity sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw== 402 | 403 | "@rollup/rollup-linux-s390x-gnu@4.22.4": 404 | version "4.22.4" 405 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz#9f883a7440f51a22ed7f99e1d070bd84ea5005fc" 406 | integrity sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q== 407 | 408 | "@rollup/rollup-linux-s390x-gnu@4.34.8": 409 | version "4.34.8" 410 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz#7dbc3ccbcbcfb3e65be74538dfb6e8dd16178fde" 411 | integrity sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA== 412 | 413 | "@rollup/rollup-linux-x64-gnu@4.22.4": 414 | version "4.22.4" 415 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz#70116ae6c577fe367f58559e2cffb5641a1dd9d0" 416 | integrity sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg== 417 | 418 | "@rollup/rollup-linux-x64-gnu@4.34.8": 419 | version "4.34.8" 420 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz#5783fc0adcab7dc069692056e8ca8d83709855ce" 421 | integrity sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA== 422 | 423 | "@rollup/rollup-linux-x64-musl@4.22.4": 424 | version "4.22.4" 425 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz#f473f88219feb07b0b98b53a7923be716d1d182f" 426 | integrity sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g== 427 | 428 | "@rollup/rollup-linux-x64-musl@4.34.8": 429 | version "4.34.8" 430 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz#00b6c29b298197a384e3c659910b47943003a678" 431 | integrity sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ== 432 | 433 | "@rollup/rollup-win32-arm64-msvc@4.22.4": 434 | version "4.22.4" 435 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz#4349482d17f5d1c58604d1c8900540d676f420e0" 436 | integrity sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw== 437 | 438 | "@rollup/rollup-win32-arm64-msvc@4.34.8": 439 | version "4.34.8" 440 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz#cbfee01f1fe73791c35191a05397838520ca3cdd" 441 | integrity sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ== 442 | 443 | "@rollup/rollup-win32-ia32-msvc@4.22.4": 444 | version "4.22.4" 445 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz#a6fc39a15db618040ec3c2a24c1e26cb5f4d7422" 446 | integrity sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g== 447 | 448 | "@rollup/rollup-win32-ia32-msvc@4.34.8": 449 | version "4.34.8" 450 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz#95cdbdff48fe6c948abcf6a1d500b2bd5ce33f62" 451 | integrity sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w== 452 | 453 | "@rollup/rollup-win32-x64-msvc@4.22.4": 454 | version "4.22.4" 455 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz#3dd5d53e900df2a40841882c02e56f866c04d202" 456 | integrity sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q== 457 | 458 | "@rollup/rollup-win32-x64-msvc@4.34.8": 459 | version "4.34.8" 460 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz#4cdb2cfae69cdb7b1a3cc58778e820408075e928" 461 | integrity sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g== 462 | 463 | "@sinclair/typebox@^0.27.8": 464 | version "0.27.8" 465 | resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" 466 | integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== 467 | 468 | "@types/estree@1.0.5": 469 | version "1.0.5" 470 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" 471 | integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== 472 | 473 | "@types/estree@1.0.6", "@types/estree@^1.0.0": 474 | version "1.0.6" 475 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" 476 | integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== 477 | 478 | "@types/fs-extra@^8.0.1": 479 | version "8.1.5" 480 | resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.5.tgz#33aae2962d3b3ec9219b5aca2555ee00274f5927" 481 | integrity sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ== 482 | dependencies: 483 | "@types/node" "*" 484 | 485 | "@types/glob@^7.1.1": 486 | version "7.2.0" 487 | resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" 488 | integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== 489 | dependencies: 490 | "@types/minimatch" "*" 491 | "@types/node" "*" 492 | 493 | "@types/minimatch@*": 494 | version "5.1.2" 495 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" 496 | integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== 497 | 498 | "@types/node@*": 499 | version "22.13.4" 500 | resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.4.tgz#3fe454d77cd4a2d73c214008b3e331bfaaf5038a" 501 | integrity sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg== 502 | dependencies: 503 | undici-types "~6.20.0" 504 | 505 | "@types/node@^20.14.9": 506 | version "20.17.19" 507 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.19.tgz#0f2869555719bef266ca6e1827fcdca903c1a697" 508 | integrity sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A== 509 | dependencies: 510 | undici-types "~6.19.2" 511 | 512 | "@types/vscode@^1.90.0": 513 | version "1.97.0" 514 | resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.97.0.tgz#62ce3a32243019aaa4fc20cee2a3de06bc71af4f" 515 | integrity sha512-ueE73loeOTe7olaVyqP9mrRI54kVPJifUPjblZo9fYcv1CuVLPOEKEkqW0GkqPC454+nCEoigLWnC2Pp7prZ9w== 516 | 517 | "@vitest/expect@1.6.1": 518 | version "1.6.1" 519 | resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.6.1.tgz#b90c213f587514a99ac0bf84f88cff9042b0f14d" 520 | integrity sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog== 521 | dependencies: 522 | "@vitest/spy" "1.6.1" 523 | "@vitest/utils" "1.6.1" 524 | chai "^4.3.10" 525 | 526 | "@vitest/runner@1.6.1": 527 | version "1.6.1" 528 | resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.6.1.tgz#10f5857c3e376218d58c2bfacfea1161e27e117f" 529 | integrity sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA== 530 | dependencies: 531 | "@vitest/utils" "1.6.1" 532 | p-limit "^5.0.0" 533 | pathe "^1.1.1" 534 | 535 | "@vitest/snapshot@1.6.1": 536 | version "1.6.1" 537 | resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.6.1.tgz#90414451a634bb36cd539ccb29ae0d048a8c0479" 538 | integrity sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ== 539 | dependencies: 540 | magic-string "^0.30.5" 541 | pathe "^1.1.1" 542 | pretty-format "^29.7.0" 543 | 544 | "@vitest/spy@1.6.1": 545 | version "1.6.1" 546 | resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.6.1.tgz#33376be38a5ed1ecd829eb986edaecc3e798c95d" 547 | integrity sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw== 548 | dependencies: 549 | tinyspy "^2.2.0" 550 | 551 | "@vitest/utils@1.6.1": 552 | version "1.6.1" 553 | resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.6.1.tgz#6d2f36cb6d866f2bbf59da854a324d6bf8040f17" 554 | integrity sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g== 555 | dependencies: 556 | diff-sequences "^29.6.3" 557 | estree-walker "^3.0.3" 558 | loupe "^2.3.7" 559 | pretty-format "^29.7.0" 560 | 561 | "@vscode/vsce-sign-alpine-arm64@2.0.2": 562 | version "2.0.2" 563 | resolved "https://registry.yarnpkg.com/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.2.tgz#4accc485e55aa6ff04b195b47f722ead57daa58e" 564 | integrity sha512-E80YvqhtZCLUv3YAf9+tIbbqoinWLCO/B3j03yQPbjT3ZIHCliKZlsy1peNc4XNZ5uIb87Jn0HWx/ZbPXviuAQ== 565 | 566 | "@vscode/vsce-sign-alpine-x64@2.0.2": 567 | version "2.0.2" 568 | resolved "https://registry.yarnpkg.com/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.2.tgz#4a4b7b505b4cc0f58596394897c49a0bce0e540c" 569 | integrity sha512-n1WC15MSMvTaeJ5KjWCzo0nzjydwxLyoHiMJHu1Ov0VWTZiddasmOQHekA47tFRycnt4FsQrlkSCTdgHppn6bw== 570 | 571 | "@vscode/vsce-sign-darwin-arm64@2.0.2": 572 | version "2.0.2" 573 | resolved "https://registry.yarnpkg.com/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.2.tgz#10aa69feb7f81a3dc68c242038ca03eaff19c12e" 574 | integrity sha512-rz8F4pMcxPj8fjKAJIfkUT8ycG9CjIp888VY/6pq6cuI2qEzQ0+b5p3xb74CJnBbSC0p2eRVoe+WgNCAxCLtzQ== 575 | 576 | "@vscode/vsce-sign-darwin-x64@2.0.2": 577 | version "2.0.2" 578 | resolved "https://registry.yarnpkg.com/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.2.tgz#3315528f3ea1007a648b3320bff36a33a9e07aa5" 579 | integrity sha512-MCjPrQ5MY/QVoZ6n0D92jcRb7eYvxAujG/AH2yM6lI0BspvJQxp0o9s5oiAM9r32r9tkLpiy5s2icsbwefAQIw== 580 | 581 | "@vscode/vsce-sign-linux-arm64@2.0.2": 582 | version "2.0.2" 583 | resolved "https://registry.yarnpkg.com/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.2.tgz#ce5c5cfc99e3454b4fb770405812b46bd6dca870" 584 | integrity sha512-Ybeu7cA6+/koxszsORXX0OJk9N0GgfHq70Wqi4vv2iJCZvBrOWwcIrxKjvFtwyDgdeQzgPheH5nhLVl5eQy7WA== 585 | 586 | "@vscode/vsce-sign-linux-arm@2.0.2": 587 | version "2.0.2" 588 | resolved "https://registry.yarnpkg.com/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.2.tgz#4142fda83e7130b31aedd8aa81e4daa6334323c2" 589 | integrity sha512-Fkb5jpbfhZKVw3xwR6t7WYfwKZktVGNXdg1m08uEx1anO0oUPUkoQRsNm4QniL3hmfw0ijg00YA6TrxCRkPVOQ== 590 | 591 | "@vscode/vsce-sign-linux-x64@2.0.2": 592 | version "2.0.2" 593 | resolved "https://registry.yarnpkg.com/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.2.tgz#59ab93f322efb3cf49166d4e2e812789c3117428" 594 | integrity sha512-NsPPFVtLaTlVJKOiTnO8Cl78LZNWy0Q8iAg+LlBiCDEgC12Gt4WXOSs2pmcIjDYzj2kY4NwdeN1mBTaujYZaPg== 595 | 596 | "@vscode/vsce-sign-win32-arm64@2.0.2": 597 | version "2.0.2" 598 | resolved "https://registry.yarnpkg.com/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.2.tgz#d095704a14b0404c0b6f696e9889e9a51b31a86c" 599 | integrity sha512-wPs848ymZ3Ny+Y1Qlyi7mcT6VSigG89FWQnp2qRYCyMhdJxOpA4lDwxzlpL8fG6xC8GjQjGDkwbkWUcCobvksQ== 600 | 601 | "@vscode/vsce-sign-win32-x64@2.0.2": 602 | version "2.0.2" 603 | resolved "https://registry.yarnpkg.com/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.2.tgz#294ea72b44fedd694d49f5cef4c55bf3876dc257" 604 | integrity sha512-pAiRN6qSAhDM5SVOIxgx+2xnoVUePHbRNC7OD2aOR3WltTKxxF25OfpK8h8UQ7A0BuRkSgREbB59DBlFk4iAeg== 605 | 606 | "@vscode/vsce-sign@^2.0.0": 607 | version "2.0.5" 608 | resolved "https://registry.yarnpkg.com/@vscode/vsce-sign/-/vsce-sign-2.0.5.tgz#8850036476dc0d4e080d9c2d8325e3e97eff5193" 609 | integrity sha512-GfYWrsT/vypTMDMgWDm75iDmAOMe7F71sZECJ+Ws6/xyIfmB3ELVnVN+LwMFAvmXY+e6eWhR2EzNGF/zAhWY3Q== 610 | optionalDependencies: 611 | "@vscode/vsce-sign-alpine-arm64" "2.0.2" 612 | "@vscode/vsce-sign-alpine-x64" "2.0.2" 613 | "@vscode/vsce-sign-darwin-arm64" "2.0.2" 614 | "@vscode/vsce-sign-darwin-x64" "2.0.2" 615 | "@vscode/vsce-sign-linux-arm" "2.0.2" 616 | "@vscode/vsce-sign-linux-arm64" "2.0.2" 617 | "@vscode/vsce-sign-linux-x64" "2.0.2" 618 | "@vscode/vsce-sign-win32-arm64" "2.0.2" 619 | "@vscode/vsce-sign-win32-x64" "2.0.2" 620 | 621 | "@vscode/vsce@^3.2.2": 622 | version "3.2.2" 623 | resolved "https://registry.yarnpkg.com/@vscode/vsce/-/vsce-3.2.2.tgz#cf65068e3dd51b74756670f231aa9ad2bbeef0de" 624 | integrity sha512-4TqdUq/yKlQTHcQMk/DamR632bq/+IJDomSbexOMee/UAYWqYm0XHWA6scGslsCpzY+sCWEhhl0nqdOB0XW1kw== 625 | dependencies: 626 | "@azure/identity" "^4.1.0" 627 | "@vscode/vsce-sign" "^2.0.0" 628 | azure-devops-node-api "^12.5.0" 629 | chalk "^2.4.2" 630 | cheerio "^1.0.0-rc.9" 631 | cockatiel "^3.1.2" 632 | commander "^12.1.0" 633 | form-data "^4.0.0" 634 | glob "^11.0.0" 635 | hosted-git-info "^4.0.2" 636 | jsonc-parser "^3.2.0" 637 | leven "^3.1.0" 638 | markdown-it "^14.1.0" 639 | mime "^1.3.4" 640 | minimatch "^3.0.3" 641 | parse-semver "^1.1.1" 642 | read "^1.0.7" 643 | semver "^7.5.2" 644 | tmp "^0.2.3" 645 | typed-rest-client "^1.8.4" 646 | url-join "^4.0.1" 647 | xml2js "^0.5.0" 648 | yauzl "^2.3.1" 649 | yazl "^2.2.2" 650 | optionalDependencies: 651 | keytar "^7.7.0" 652 | 653 | acorn-walk@^8.3.2: 654 | version "8.3.4" 655 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" 656 | integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== 657 | dependencies: 658 | acorn "^8.11.0" 659 | 660 | acorn@^8.11.0, acorn@^8.14.0: 661 | version "8.14.0" 662 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" 663 | integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== 664 | 665 | agent-base@^7.1.0, agent-base@^7.1.2: 666 | version "7.1.3" 667 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" 668 | integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== 669 | 670 | aggregate-error@^3.0.0: 671 | version "3.1.0" 672 | resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" 673 | integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== 674 | dependencies: 675 | clean-stack "^2.0.0" 676 | indent-string "^4.0.0" 677 | 678 | ansi-regex@^5.0.1: 679 | version "5.0.1" 680 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 681 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 682 | 683 | ansi-regex@^6.0.1: 684 | version "6.1.0" 685 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" 686 | integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== 687 | 688 | ansi-styles@^3.2.1: 689 | version "3.2.1" 690 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 691 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 692 | dependencies: 693 | color-convert "^1.9.0" 694 | 695 | ansi-styles@^4.0.0: 696 | version "4.3.0" 697 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 698 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 699 | dependencies: 700 | color-convert "^2.0.1" 701 | 702 | ansi-styles@^5.0.0: 703 | version "5.2.0" 704 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" 705 | integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== 706 | 707 | ansi-styles@^6.1.0: 708 | version "6.2.1" 709 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" 710 | integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== 711 | 712 | argparse@^2.0.1: 713 | version "2.0.1" 714 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 715 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 716 | 717 | array-union@^2.1.0: 718 | version "2.1.0" 719 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 720 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 721 | 722 | assertion-error@^1.1.0: 723 | version "1.1.0" 724 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 725 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 726 | 727 | asynckit@^0.4.0: 728 | version "0.4.0" 729 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 730 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 731 | 732 | azure-devops-node-api@^12.5.0: 733 | version "12.5.0" 734 | resolved "https://registry.yarnpkg.com/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz#38b9efd7c5ac74354fe4e8dbe42697db0b8e85a5" 735 | integrity sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og== 736 | dependencies: 737 | tunnel "0.0.6" 738 | typed-rest-client "^1.8.4" 739 | 740 | balanced-match@^1.0.0: 741 | version "1.0.2" 742 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 743 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 744 | 745 | base64-js@^1.3.1: 746 | version "1.5.1" 747 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 748 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 749 | 750 | bl@^4.0.3: 751 | version "4.1.0" 752 | resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" 753 | integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== 754 | dependencies: 755 | buffer "^5.5.0" 756 | inherits "^2.0.4" 757 | readable-stream "^3.4.0" 758 | 759 | boolbase@^1.0.0: 760 | version "1.0.0" 761 | resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 762 | integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== 763 | 764 | brace-expansion@^1.1.7: 765 | version "1.1.12" 766 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" 767 | integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== 768 | dependencies: 769 | balanced-match "^1.0.0" 770 | concat-map "0.0.1" 771 | 772 | brace-expansion@^2.0.1: 773 | version "2.0.2" 774 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" 775 | integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== 776 | dependencies: 777 | balanced-match "^1.0.0" 778 | 779 | braces@^3.0.3: 780 | version "3.0.3" 781 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 782 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 783 | dependencies: 784 | fill-range "^7.1.1" 785 | 786 | buffer-crc32@~0.2.3: 787 | version "0.2.13" 788 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 789 | integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== 790 | 791 | buffer-equal-constant-time@1.0.1: 792 | version "1.0.1" 793 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 794 | integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== 795 | 796 | buffer@^5.5.0: 797 | version "5.7.1" 798 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 799 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 800 | dependencies: 801 | base64-js "^1.3.1" 802 | ieee754 "^1.1.13" 803 | 804 | bundle-name@^4.1.0: 805 | version "4.1.0" 806 | resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" 807 | integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== 808 | dependencies: 809 | run-applescript "^7.0.0" 810 | 811 | cac@^6.7.14: 812 | version "6.7.14" 813 | resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" 814 | integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== 815 | 816 | call-bind-apply-helpers@^1.0.1: 817 | version "1.0.2" 818 | resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" 819 | integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== 820 | dependencies: 821 | es-errors "^1.3.0" 822 | function-bind "^1.1.2" 823 | 824 | call-bound@^1.0.2: 825 | version "1.0.3" 826 | resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" 827 | integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== 828 | dependencies: 829 | call-bind-apply-helpers "^1.0.1" 830 | get-intrinsic "^1.2.6" 831 | 832 | chai@^4.3.10: 833 | version "4.5.0" 834 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" 835 | integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== 836 | dependencies: 837 | assertion-error "^1.1.0" 838 | check-error "^1.0.3" 839 | deep-eql "^4.1.3" 840 | get-func-name "^2.0.2" 841 | loupe "^2.3.6" 842 | pathval "^1.1.1" 843 | type-detect "^4.1.0" 844 | 845 | chalk@^2.4.2: 846 | version "2.4.2" 847 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 848 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 849 | dependencies: 850 | ansi-styles "^3.2.1" 851 | escape-string-regexp "^1.0.5" 852 | supports-color "^5.3.0" 853 | 854 | check-error@^1.0.3: 855 | version "1.0.3" 856 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" 857 | integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== 858 | dependencies: 859 | get-func-name "^2.0.2" 860 | 861 | cheerio-select@^2.1.0: 862 | version "2.1.0" 863 | resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" 864 | integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== 865 | dependencies: 866 | boolbase "^1.0.0" 867 | css-select "^5.1.0" 868 | css-what "^6.1.0" 869 | domelementtype "^2.3.0" 870 | domhandler "^5.0.3" 871 | domutils "^3.0.1" 872 | 873 | cheerio@^1.0.0-rc.9: 874 | version "1.0.0" 875 | resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0.tgz#1ede4895a82f26e8af71009f961a9b8cb60d6a81" 876 | integrity sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww== 877 | dependencies: 878 | cheerio-select "^2.1.0" 879 | dom-serializer "^2.0.0" 880 | domhandler "^5.0.3" 881 | domutils "^3.1.0" 882 | encoding-sniffer "^0.2.0" 883 | htmlparser2 "^9.1.0" 884 | parse5 "^7.1.2" 885 | parse5-htmlparser2-tree-adapter "^7.0.0" 886 | parse5-parser-stream "^7.1.2" 887 | undici "^6.19.5" 888 | whatwg-mimetype "^4.0.0" 889 | 890 | chownr@^1.1.1: 891 | version "1.1.4" 892 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 893 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 894 | 895 | clean-stack@^2.0.0: 896 | version "2.2.0" 897 | resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" 898 | integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== 899 | 900 | cockatiel@^3.1.2: 901 | version "3.2.1" 902 | resolved "https://registry.yarnpkg.com/cockatiel/-/cockatiel-3.2.1.tgz#575f937bc4040a20ae27352a6d07c9c5a741981f" 903 | integrity sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q== 904 | 905 | color-convert@^1.9.0: 906 | version "1.9.3" 907 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 908 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 909 | dependencies: 910 | color-name "1.1.3" 911 | 912 | color-convert@^2.0.1: 913 | version "2.0.1" 914 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 915 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 916 | dependencies: 917 | color-name "~1.1.4" 918 | 919 | color-name@1.1.3: 920 | version "1.1.3" 921 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 922 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 923 | 924 | color-name@~1.1.4: 925 | version "1.1.4" 926 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 927 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 928 | 929 | colorette@^1.1.0: 930 | version "1.4.0" 931 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" 932 | integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== 933 | 934 | combined-stream@^1.0.8: 935 | version "1.0.8" 936 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 937 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 938 | dependencies: 939 | delayed-stream "~1.0.0" 940 | 941 | commander@^12.1.0: 942 | version "12.1.0" 943 | resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" 944 | integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== 945 | 946 | concat-map@0.0.1: 947 | version "0.0.1" 948 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 949 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 950 | 951 | confbox@^0.1.8: 952 | version "0.1.8" 953 | resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" 954 | integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== 955 | 956 | cross-spawn@^7.0.0, cross-spawn@^7.0.3: 957 | version "7.0.6" 958 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 959 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 960 | dependencies: 961 | path-key "^3.1.0" 962 | shebang-command "^2.0.0" 963 | which "^2.0.1" 964 | 965 | css-select@^5.1.0: 966 | version "5.1.0" 967 | resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" 968 | integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== 969 | dependencies: 970 | boolbase "^1.0.0" 971 | css-what "^6.1.0" 972 | domhandler "^5.0.2" 973 | domutils "^3.0.1" 974 | nth-check "^2.0.1" 975 | 976 | css-what@^6.1.0: 977 | version "6.1.0" 978 | resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" 979 | integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== 980 | 981 | debug@4, debug@^4.3.4: 982 | version "4.4.0" 983 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" 984 | integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== 985 | dependencies: 986 | ms "^2.1.3" 987 | 988 | decompress-response@^6.0.0: 989 | version "6.0.0" 990 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" 991 | integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== 992 | dependencies: 993 | mimic-response "^3.1.0" 994 | 995 | deep-eql@^4.1.3: 996 | version "4.1.4" 997 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" 998 | integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== 999 | dependencies: 1000 | type-detect "^4.0.0" 1001 | 1002 | deep-extend@^0.6.0: 1003 | version "0.6.0" 1004 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 1005 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 1006 | 1007 | default-browser-id@^5.0.0: 1008 | version "5.0.0" 1009 | resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" 1010 | integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== 1011 | 1012 | default-browser@^5.2.1: 1013 | version "5.2.1" 1014 | resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" 1015 | integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== 1016 | dependencies: 1017 | bundle-name "^4.1.0" 1018 | default-browser-id "^5.0.0" 1019 | 1020 | define-lazy-prop@^3.0.0: 1021 | version "3.0.0" 1022 | resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" 1023 | integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== 1024 | 1025 | del@^5.1.0: 1026 | version "5.1.0" 1027 | resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" 1028 | integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== 1029 | dependencies: 1030 | globby "^10.0.1" 1031 | graceful-fs "^4.2.2" 1032 | is-glob "^4.0.1" 1033 | is-path-cwd "^2.2.0" 1034 | is-path-inside "^3.0.1" 1035 | p-map "^3.0.0" 1036 | rimraf "^3.0.0" 1037 | slash "^3.0.0" 1038 | 1039 | delayed-stream@~1.0.0: 1040 | version "1.0.0" 1041 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 1042 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 1043 | 1044 | detect-libc@^2.0.0: 1045 | version "2.0.3" 1046 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" 1047 | integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== 1048 | 1049 | diff-sequences@^29.6.3: 1050 | version "29.6.3" 1051 | resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" 1052 | integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== 1053 | 1054 | dir-glob@^3.0.1: 1055 | version "3.0.1" 1056 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 1057 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 1058 | dependencies: 1059 | path-type "^4.0.0" 1060 | 1061 | dom-serializer@^2.0.0: 1062 | version "2.0.0" 1063 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" 1064 | integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== 1065 | dependencies: 1066 | domelementtype "^2.3.0" 1067 | domhandler "^5.0.2" 1068 | entities "^4.2.0" 1069 | 1070 | domelementtype@^2.3.0: 1071 | version "2.3.0" 1072 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" 1073 | integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== 1074 | 1075 | domhandler@^5.0.2, domhandler@^5.0.3: 1076 | version "5.0.3" 1077 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" 1078 | integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== 1079 | dependencies: 1080 | domelementtype "^2.3.0" 1081 | 1082 | domutils@^3.0.1, domutils@^3.1.0: 1083 | version "3.2.2" 1084 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" 1085 | integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== 1086 | dependencies: 1087 | dom-serializer "^2.0.0" 1088 | domelementtype "^2.3.0" 1089 | domhandler "^5.0.3" 1090 | 1091 | dunder-proto@^1.0.1: 1092 | version "1.0.1" 1093 | resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" 1094 | integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== 1095 | dependencies: 1096 | call-bind-apply-helpers "^1.0.1" 1097 | es-errors "^1.3.0" 1098 | gopd "^1.2.0" 1099 | 1100 | eastasianwidth@^0.2.0: 1101 | version "0.2.0" 1102 | resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" 1103 | integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== 1104 | 1105 | ecdsa-sig-formatter@1.0.11: 1106 | version "1.0.11" 1107 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 1108 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 1109 | dependencies: 1110 | safe-buffer "^5.0.1" 1111 | 1112 | emoji-regex@^8.0.0: 1113 | version "8.0.0" 1114 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 1115 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 1116 | 1117 | emoji-regex@^9.2.2: 1118 | version "9.2.2" 1119 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" 1120 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== 1121 | 1122 | encoding-sniffer@^0.2.0: 1123 | version "0.2.0" 1124 | resolved "https://registry.yarnpkg.com/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz#799569d66d443babe82af18c9f403498365ef1d5" 1125 | integrity sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg== 1126 | dependencies: 1127 | iconv-lite "^0.6.3" 1128 | whatwg-encoding "^3.1.1" 1129 | 1130 | end-of-stream@^1.1.0, end-of-stream@^1.4.1: 1131 | version "1.4.4" 1132 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 1133 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 1134 | dependencies: 1135 | once "^1.4.0" 1136 | 1137 | entities@^4.2.0, entities@^4.4.0, entities@^4.5.0: 1138 | version "4.5.0" 1139 | resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" 1140 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 1141 | 1142 | es-define-property@^1.0.1: 1143 | version "1.0.1" 1144 | resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" 1145 | integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== 1146 | 1147 | es-errors@^1.3.0: 1148 | version "1.3.0" 1149 | resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" 1150 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 1151 | 1152 | es-object-atoms@^1.0.0: 1153 | version "1.1.1" 1154 | resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" 1155 | integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== 1156 | dependencies: 1157 | es-errors "^1.3.0" 1158 | 1159 | es-set-tostringtag@^2.1.0: 1160 | version "2.1.0" 1161 | resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" 1162 | integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== 1163 | dependencies: 1164 | es-errors "^1.3.0" 1165 | get-intrinsic "^1.2.6" 1166 | has-tostringtag "^1.0.2" 1167 | hasown "^2.0.2" 1168 | 1169 | esbuild@^0.21.3: 1170 | version "0.21.5" 1171 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" 1172 | integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== 1173 | optionalDependencies: 1174 | "@esbuild/aix-ppc64" "0.21.5" 1175 | "@esbuild/android-arm" "0.21.5" 1176 | "@esbuild/android-arm64" "0.21.5" 1177 | "@esbuild/android-x64" "0.21.5" 1178 | "@esbuild/darwin-arm64" "0.21.5" 1179 | "@esbuild/darwin-x64" "0.21.5" 1180 | "@esbuild/freebsd-arm64" "0.21.5" 1181 | "@esbuild/freebsd-x64" "0.21.5" 1182 | "@esbuild/linux-arm" "0.21.5" 1183 | "@esbuild/linux-arm64" "0.21.5" 1184 | "@esbuild/linux-ia32" "0.21.5" 1185 | "@esbuild/linux-loong64" "0.21.5" 1186 | "@esbuild/linux-mips64el" "0.21.5" 1187 | "@esbuild/linux-ppc64" "0.21.5" 1188 | "@esbuild/linux-riscv64" "0.21.5" 1189 | "@esbuild/linux-s390x" "0.21.5" 1190 | "@esbuild/linux-x64" "0.21.5" 1191 | "@esbuild/netbsd-x64" "0.21.5" 1192 | "@esbuild/openbsd-x64" "0.21.5" 1193 | "@esbuild/sunos-x64" "0.21.5" 1194 | "@esbuild/win32-arm64" "0.21.5" 1195 | "@esbuild/win32-ia32" "0.21.5" 1196 | "@esbuild/win32-x64" "0.21.5" 1197 | 1198 | escape-string-regexp@^1.0.5: 1199 | version "1.0.5" 1200 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 1201 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 1202 | 1203 | estree-walker@^2.0.2: 1204 | version "2.0.2" 1205 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 1206 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 1207 | 1208 | estree-walker@^3.0.3: 1209 | version "3.0.3" 1210 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" 1211 | integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== 1212 | dependencies: 1213 | "@types/estree" "^1.0.0" 1214 | 1215 | events@^3.0.0: 1216 | version "3.3.0" 1217 | resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" 1218 | integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== 1219 | 1220 | execa@^8.0.1: 1221 | version "8.0.1" 1222 | resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" 1223 | integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== 1224 | dependencies: 1225 | cross-spawn "^7.0.3" 1226 | get-stream "^8.0.1" 1227 | human-signals "^5.0.0" 1228 | is-stream "^3.0.0" 1229 | merge-stream "^2.0.0" 1230 | npm-run-path "^5.1.0" 1231 | onetime "^6.0.0" 1232 | signal-exit "^4.1.0" 1233 | strip-final-newline "^3.0.0" 1234 | 1235 | expand-template@^2.0.3: 1236 | version "2.0.3" 1237 | resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" 1238 | integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== 1239 | 1240 | fast-glob@^3.0.3: 1241 | version "3.3.3" 1242 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" 1243 | integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== 1244 | dependencies: 1245 | "@nodelib/fs.stat" "^2.0.2" 1246 | "@nodelib/fs.walk" "^1.2.3" 1247 | glob-parent "^5.1.2" 1248 | merge2 "^1.3.0" 1249 | micromatch "^4.0.8" 1250 | 1251 | fastq@^1.6.0: 1252 | version "1.19.0" 1253 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.0.tgz#a82c6b7c2bb4e44766d865f07997785fecfdcb89" 1254 | integrity sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA== 1255 | dependencies: 1256 | reusify "^1.0.4" 1257 | 1258 | fd-slicer@~1.1.0: 1259 | version "1.1.0" 1260 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" 1261 | integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== 1262 | dependencies: 1263 | pend "~1.2.0" 1264 | 1265 | fill-range@^7.1.1: 1266 | version "7.1.1" 1267 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 1268 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 1269 | dependencies: 1270 | to-regex-range "^5.0.1" 1271 | 1272 | foreground-child@^3.1.0: 1273 | version "3.3.0" 1274 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" 1275 | integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== 1276 | dependencies: 1277 | cross-spawn "^7.0.0" 1278 | signal-exit "^4.0.1" 1279 | 1280 | form-data@^4.0.0: 1281 | version "4.0.4" 1282 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" 1283 | integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== 1284 | dependencies: 1285 | asynckit "^0.4.0" 1286 | combined-stream "^1.0.8" 1287 | es-set-tostringtag "^2.1.0" 1288 | hasown "^2.0.2" 1289 | mime-types "^2.1.12" 1290 | 1291 | fs-constants@^1.0.0: 1292 | version "1.0.0" 1293 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 1294 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 1295 | 1296 | fs-extra@^8.1.0: 1297 | version "8.1.0" 1298 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 1299 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 1300 | dependencies: 1301 | graceful-fs "^4.2.0" 1302 | jsonfile "^4.0.0" 1303 | universalify "^0.1.0" 1304 | 1305 | fs.realpath@^1.0.0: 1306 | version "1.0.0" 1307 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1308 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 1309 | 1310 | fsevents@~2.3.2, fsevents@~2.3.3: 1311 | version "2.3.3" 1312 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 1313 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 1314 | 1315 | function-bind@^1.1.2: 1316 | version "1.1.2" 1317 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 1318 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 1319 | 1320 | get-func-name@^2.0.1, get-func-name@^2.0.2: 1321 | version "2.0.2" 1322 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" 1323 | integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== 1324 | 1325 | get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: 1326 | version "1.2.7" 1327 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.7.tgz#dcfcb33d3272e15f445d15124bc0a216189b9044" 1328 | integrity sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA== 1329 | dependencies: 1330 | call-bind-apply-helpers "^1.0.1" 1331 | es-define-property "^1.0.1" 1332 | es-errors "^1.3.0" 1333 | es-object-atoms "^1.0.0" 1334 | function-bind "^1.1.2" 1335 | get-proto "^1.0.0" 1336 | gopd "^1.2.0" 1337 | has-symbols "^1.1.0" 1338 | hasown "^2.0.2" 1339 | math-intrinsics "^1.1.0" 1340 | 1341 | get-proto@^1.0.0: 1342 | version "1.0.1" 1343 | resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" 1344 | integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== 1345 | dependencies: 1346 | dunder-proto "^1.0.1" 1347 | es-object-atoms "^1.0.0" 1348 | 1349 | get-stream@^8.0.1: 1350 | version "8.0.1" 1351 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" 1352 | integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== 1353 | 1354 | github-from-package@0.0.0: 1355 | version "0.0.0" 1356 | resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" 1357 | integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== 1358 | 1359 | glob-parent@^5.1.2: 1360 | version "5.1.2" 1361 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1362 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1363 | dependencies: 1364 | is-glob "^4.0.1" 1365 | 1366 | glob@^11.0.0: 1367 | version "11.0.1" 1368 | resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.1.tgz#1c3aef9a59d680e611b53dcd24bb8639cef064d9" 1369 | integrity sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw== 1370 | dependencies: 1371 | foreground-child "^3.1.0" 1372 | jackspeak "^4.0.1" 1373 | minimatch "^10.0.0" 1374 | minipass "^7.1.2" 1375 | package-json-from-dist "^1.0.0" 1376 | path-scurry "^2.0.0" 1377 | 1378 | glob@^7.1.3: 1379 | version "7.2.3" 1380 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 1381 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 1382 | dependencies: 1383 | fs.realpath "^1.0.0" 1384 | inflight "^1.0.4" 1385 | inherits "2" 1386 | minimatch "^3.1.1" 1387 | once "^1.3.0" 1388 | path-is-absolute "^1.0.0" 1389 | 1390 | globby@10.0.1: 1391 | version "10.0.1" 1392 | resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" 1393 | integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== 1394 | dependencies: 1395 | "@types/glob" "^7.1.1" 1396 | array-union "^2.1.0" 1397 | dir-glob "^3.0.1" 1398 | fast-glob "^3.0.3" 1399 | glob "^7.1.3" 1400 | ignore "^5.1.1" 1401 | merge2 "^1.2.3" 1402 | slash "^3.0.0" 1403 | 1404 | globby@^10.0.1: 1405 | version "10.0.2" 1406 | resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" 1407 | integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== 1408 | dependencies: 1409 | "@types/glob" "^7.1.1" 1410 | array-union "^2.1.0" 1411 | dir-glob "^3.0.1" 1412 | fast-glob "^3.0.3" 1413 | glob "^7.1.3" 1414 | ignore "^5.1.1" 1415 | merge2 "^1.2.3" 1416 | slash "^3.0.0" 1417 | 1418 | gopd@^1.2.0: 1419 | version "1.2.0" 1420 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" 1421 | integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== 1422 | 1423 | graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: 1424 | version "4.2.11" 1425 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 1426 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 1427 | 1428 | has-flag@^3.0.0: 1429 | version "3.0.0" 1430 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1431 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 1432 | 1433 | has-symbols@^1.0.3, has-symbols@^1.1.0: 1434 | version "1.1.0" 1435 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" 1436 | integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== 1437 | 1438 | has-tostringtag@^1.0.2: 1439 | version "1.0.2" 1440 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" 1441 | integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== 1442 | dependencies: 1443 | has-symbols "^1.0.3" 1444 | 1445 | hasown@^2.0.2: 1446 | version "2.0.2" 1447 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 1448 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 1449 | dependencies: 1450 | function-bind "^1.1.2" 1451 | 1452 | hosted-git-info@^4.0.2: 1453 | version "4.1.0" 1454 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" 1455 | integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== 1456 | dependencies: 1457 | lru-cache "^6.0.0" 1458 | 1459 | htmlparser2@^9.1.0: 1460 | version "9.1.0" 1461 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-9.1.0.tgz#cdb498d8a75a51f739b61d3f718136c369bc8c23" 1462 | integrity sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ== 1463 | dependencies: 1464 | domelementtype "^2.3.0" 1465 | domhandler "^5.0.3" 1466 | domutils "^3.1.0" 1467 | entities "^4.5.0" 1468 | 1469 | http-proxy-agent@^7.0.0: 1470 | version "7.0.2" 1471 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" 1472 | integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== 1473 | dependencies: 1474 | agent-base "^7.1.0" 1475 | debug "^4.3.4" 1476 | 1477 | https-proxy-agent@^7.0.0: 1478 | version "7.0.6" 1479 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" 1480 | integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== 1481 | dependencies: 1482 | agent-base "^7.1.2" 1483 | debug "4" 1484 | 1485 | human-signals@^5.0.0: 1486 | version "5.0.0" 1487 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" 1488 | integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== 1489 | 1490 | iconv-lite@0.6.3, iconv-lite@^0.6.3: 1491 | version "0.6.3" 1492 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" 1493 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 1494 | dependencies: 1495 | safer-buffer ">= 2.1.2 < 3.0.0" 1496 | 1497 | ieee754@^1.1.13: 1498 | version "1.2.1" 1499 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 1500 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 1501 | 1502 | ignore@^5.1.1: 1503 | version "5.3.2" 1504 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" 1505 | integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== 1506 | 1507 | indent-string@^4.0.0: 1508 | version "4.0.0" 1509 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" 1510 | integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== 1511 | 1512 | inflight@^1.0.4: 1513 | version "1.0.6" 1514 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1515 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1516 | dependencies: 1517 | once "^1.3.0" 1518 | wrappy "1" 1519 | 1520 | inherits@2, inherits@^2.0.3, inherits@^2.0.4: 1521 | version "2.0.4" 1522 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1523 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1524 | 1525 | ini@~1.3.0: 1526 | version "1.3.8" 1527 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 1528 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 1529 | 1530 | is-core-module@^2.16.0: 1531 | version "2.16.1" 1532 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" 1533 | integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== 1534 | dependencies: 1535 | hasown "^2.0.2" 1536 | 1537 | is-docker@^3.0.0: 1538 | version "3.0.0" 1539 | resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" 1540 | integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== 1541 | 1542 | is-extglob@^2.1.1: 1543 | version "2.1.1" 1544 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1545 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1546 | 1547 | is-fullwidth-code-point@^3.0.0: 1548 | version "3.0.0" 1549 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1550 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1551 | 1552 | is-glob@^4.0.1: 1553 | version "4.0.3" 1554 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1555 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1556 | dependencies: 1557 | is-extglob "^2.1.1" 1558 | 1559 | is-inside-container@^1.0.0: 1560 | version "1.0.0" 1561 | resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" 1562 | integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== 1563 | dependencies: 1564 | is-docker "^3.0.0" 1565 | 1566 | is-number@^7.0.0: 1567 | version "7.0.0" 1568 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1569 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1570 | 1571 | is-path-cwd@^2.2.0: 1572 | version "2.2.0" 1573 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" 1574 | integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== 1575 | 1576 | is-path-inside@^3.0.1: 1577 | version "3.0.3" 1578 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1579 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1580 | 1581 | is-plain-object@^3.0.0: 1582 | version "3.0.1" 1583 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b" 1584 | integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== 1585 | 1586 | is-stream@^3.0.0: 1587 | version "3.0.0" 1588 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" 1589 | integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== 1590 | 1591 | is-wsl@^3.1.0: 1592 | version "3.1.0" 1593 | resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" 1594 | integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== 1595 | dependencies: 1596 | is-inside-container "^1.0.0" 1597 | 1598 | isexe@^2.0.0: 1599 | version "2.0.0" 1600 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1601 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1602 | 1603 | jackspeak@^4.0.1: 1604 | version "4.0.3" 1605 | resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.0.3.tgz#8a21082b8c019e7a0a8187ad8b736609bc85ab18" 1606 | integrity sha512-oSwM7q8PTHQWuZAlp995iPpPJ4Vkl7qT0ZRD+9duL9j2oBy6KcTfyxc8mEuHJYC+z/kbps80aJLkaNzTOrf/kw== 1607 | dependencies: 1608 | "@isaacs/cliui" "^8.0.2" 1609 | 1610 | js-tokens@^9.0.1: 1611 | version "9.0.1" 1612 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" 1613 | integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== 1614 | 1615 | jsonc-parser@^3.2.0: 1616 | version "3.3.1" 1617 | resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" 1618 | integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== 1619 | 1620 | jsonfile@^4.0.0: 1621 | version "4.0.0" 1622 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1623 | integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== 1624 | optionalDependencies: 1625 | graceful-fs "^4.1.6" 1626 | 1627 | jsonwebtoken@^9.0.0: 1628 | version "9.0.2" 1629 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" 1630 | integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== 1631 | dependencies: 1632 | jws "^3.2.2" 1633 | lodash.includes "^4.3.0" 1634 | lodash.isboolean "^3.0.3" 1635 | lodash.isinteger "^4.0.4" 1636 | lodash.isnumber "^3.0.3" 1637 | lodash.isplainobject "^4.0.6" 1638 | lodash.isstring "^4.0.1" 1639 | lodash.once "^4.0.0" 1640 | ms "^2.1.1" 1641 | semver "^7.5.4" 1642 | 1643 | jwa@^1.4.1: 1644 | version "1.4.1" 1645 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 1646 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 1647 | dependencies: 1648 | buffer-equal-constant-time "1.0.1" 1649 | ecdsa-sig-formatter "1.0.11" 1650 | safe-buffer "^5.0.1" 1651 | 1652 | jwa@^2.0.0: 1653 | version "2.0.0" 1654 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" 1655 | integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== 1656 | dependencies: 1657 | buffer-equal-constant-time "1.0.1" 1658 | ecdsa-sig-formatter "1.0.11" 1659 | safe-buffer "^5.0.1" 1660 | 1661 | jws@^3.2.2: 1662 | version "3.2.2" 1663 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 1664 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 1665 | dependencies: 1666 | jwa "^1.4.1" 1667 | safe-buffer "^5.0.1" 1668 | 1669 | jws@^4.0.0: 1670 | version "4.0.0" 1671 | resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" 1672 | integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== 1673 | dependencies: 1674 | jwa "^2.0.0" 1675 | safe-buffer "^5.0.1" 1676 | 1677 | keytar@^7.7.0: 1678 | version "7.9.0" 1679 | resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.9.0.tgz#4c6225708f51b50cbf77c5aae81721964c2918cb" 1680 | integrity sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ== 1681 | dependencies: 1682 | node-addon-api "^4.3.0" 1683 | prebuild-install "^7.0.1" 1684 | 1685 | leven@^3.1.0: 1686 | version "3.1.0" 1687 | resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" 1688 | integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== 1689 | 1690 | linkify-it@^5.0.0: 1691 | version "5.0.0" 1692 | resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" 1693 | integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== 1694 | dependencies: 1695 | uc.micro "^2.0.0" 1696 | 1697 | local-pkg@^0.5.0: 1698 | version "0.5.1" 1699 | resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.1.tgz#69658638d2a95287534d4c2fff757980100dbb6d" 1700 | integrity sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ== 1701 | dependencies: 1702 | mlly "^1.7.3" 1703 | pkg-types "^1.2.1" 1704 | 1705 | lodash.includes@^4.3.0: 1706 | version "4.3.0" 1707 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 1708 | integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== 1709 | 1710 | lodash.isboolean@^3.0.3: 1711 | version "3.0.3" 1712 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 1713 | integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== 1714 | 1715 | lodash.isinteger@^4.0.4: 1716 | version "4.0.4" 1717 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 1718 | integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== 1719 | 1720 | lodash.isnumber@^3.0.3: 1721 | version "3.0.3" 1722 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 1723 | integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== 1724 | 1725 | lodash.isplainobject@^4.0.6: 1726 | version "4.0.6" 1727 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 1728 | integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== 1729 | 1730 | lodash.isstring@^4.0.1: 1731 | version "4.0.1" 1732 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 1733 | integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== 1734 | 1735 | lodash.once@^4.0.0: 1736 | version "4.1.1" 1737 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 1738 | integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== 1739 | 1740 | loupe@^2.3.6, loupe@^2.3.7: 1741 | version "2.3.7" 1742 | resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" 1743 | integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== 1744 | dependencies: 1745 | get-func-name "^2.0.1" 1746 | 1747 | lru-cache@^11.0.0: 1748 | version "11.0.2" 1749 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39" 1750 | integrity sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA== 1751 | 1752 | lru-cache@^6.0.0: 1753 | version "6.0.0" 1754 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1755 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1756 | dependencies: 1757 | yallist "^4.0.0" 1758 | 1759 | magic-string@^0.30.5: 1760 | version "0.30.17" 1761 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" 1762 | integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== 1763 | dependencies: 1764 | "@jridgewell/sourcemap-codec" "^1.5.0" 1765 | 1766 | markdown-it@^14.1.0: 1767 | version "14.1.0" 1768 | resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" 1769 | integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== 1770 | dependencies: 1771 | argparse "^2.0.1" 1772 | entities "^4.4.0" 1773 | linkify-it "^5.0.0" 1774 | mdurl "^2.0.0" 1775 | punycode.js "^2.3.1" 1776 | uc.micro "^2.1.0" 1777 | 1778 | math-intrinsics@^1.1.0: 1779 | version "1.1.0" 1780 | resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" 1781 | integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== 1782 | 1783 | mdurl@^2.0.0: 1784 | version "2.0.0" 1785 | resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" 1786 | integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== 1787 | 1788 | merge-stream@^2.0.0: 1789 | version "2.0.0" 1790 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1791 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1792 | 1793 | merge2@^1.2.3, merge2@^1.3.0: 1794 | version "1.4.1" 1795 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1796 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1797 | 1798 | micromatch@^4.0.8: 1799 | version "4.0.8" 1800 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" 1801 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 1802 | dependencies: 1803 | braces "^3.0.3" 1804 | picomatch "^2.3.1" 1805 | 1806 | mime-db@1.52.0: 1807 | version "1.52.0" 1808 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1809 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1810 | 1811 | mime-types@^2.1.12: 1812 | version "2.1.35" 1813 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1814 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1815 | dependencies: 1816 | mime-db "1.52.0" 1817 | 1818 | mime@^1.3.4: 1819 | version "1.6.0" 1820 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1821 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1822 | 1823 | mimic-fn@^4.0.0: 1824 | version "4.0.0" 1825 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" 1826 | integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== 1827 | 1828 | mimic-response@^3.1.0: 1829 | version "3.1.0" 1830 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" 1831 | integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== 1832 | 1833 | minimatch@^10.0.0: 1834 | version "10.0.1" 1835 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" 1836 | integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== 1837 | dependencies: 1838 | brace-expansion "^2.0.1" 1839 | 1840 | minimatch@^3.0.3, minimatch@^3.1.1: 1841 | version "3.1.2" 1842 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1843 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1844 | dependencies: 1845 | brace-expansion "^1.1.7" 1846 | 1847 | minimist@^1.2.0, minimist@^1.2.3: 1848 | version "1.2.8" 1849 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 1850 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 1851 | 1852 | minipass@^7.1.2: 1853 | version "7.1.2" 1854 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" 1855 | integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== 1856 | 1857 | mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: 1858 | version "0.5.3" 1859 | resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" 1860 | integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== 1861 | 1862 | mlly@^1.7.3, mlly@^1.7.4: 1863 | version "1.7.4" 1864 | resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f" 1865 | integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw== 1866 | dependencies: 1867 | acorn "^8.14.0" 1868 | pathe "^2.0.1" 1869 | pkg-types "^1.3.0" 1870 | ufo "^1.5.4" 1871 | 1872 | ms@^2.1.1, ms@^2.1.3: 1873 | version "2.1.3" 1874 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1875 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1876 | 1877 | mute-stream@~0.0.4: 1878 | version "0.0.8" 1879 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 1880 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 1881 | 1882 | nanoid@^3.3.8: 1883 | version "3.3.8" 1884 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" 1885 | integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== 1886 | 1887 | napi-build-utils@^2.0.0: 1888 | version "2.0.0" 1889 | resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" 1890 | integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== 1891 | 1892 | node-abi@^3.3.0: 1893 | version "3.74.0" 1894 | resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0" 1895 | integrity sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w== 1896 | dependencies: 1897 | semver "^7.3.5" 1898 | 1899 | node-addon-api@^4.3.0: 1900 | version "4.3.0" 1901 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" 1902 | integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== 1903 | 1904 | npm-run-path@^5.1.0: 1905 | version "5.3.0" 1906 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" 1907 | integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== 1908 | dependencies: 1909 | path-key "^4.0.0" 1910 | 1911 | nth-check@^2.0.1: 1912 | version "2.1.1" 1913 | resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" 1914 | integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== 1915 | dependencies: 1916 | boolbase "^1.0.0" 1917 | 1918 | object-inspect@^1.13.3: 1919 | version "1.13.4" 1920 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" 1921 | integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== 1922 | 1923 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1924 | version "1.4.0" 1925 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1926 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1927 | dependencies: 1928 | wrappy "1" 1929 | 1930 | onetime@^6.0.0: 1931 | version "6.0.0" 1932 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" 1933 | integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== 1934 | dependencies: 1935 | mimic-fn "^4.0.0" 1936 | 1937 | open@^10.1.0: 1938 | version "10.1.0" 1939 | resolved "https://registry.yarnpkg.com/open/-/open-10.1.0.tgz#a7795e6e5d519abe4286d9937bb24b51122598e1" 1940 | integrity sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw== 1941 | dependencies: 1942 | default-browser "^5.2.1" 1943 | define-lazy-prop "^3.0.0" 1944 | is-inside-container "^1.0.0" 1945 | is-wsl "^3.1.0" 1946 | 1947 | p-limit@^5.0.0: 1948 | version "5.0.0" 1949 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" 1950 | integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== 1951 | dependencies: 1952 | yocto-queue "^1.0.0" 1953 | 1954 | p-map@^3.0.0: 1955 | version "3.0.0" 1956 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" 1957 | integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== 1958 | dependencies: 1959 | aggregate-error "^3.0.0" 1960 | 1961 | package-json-from-dist@^1.0.0: 1962 | version "1.0.1" 1963 | resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" 1964 | integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== 1965 | 1966 | parse-semver@^1.1.1: 1967 | version "1.1.1" 1968 | resolved "https://registry.yarnpkg.com/parse-semver/-/parse-semver-1.1.1.tgz#9a4afd6df063dc4826f93fba4a99cf223f666cb8" 1969 | integrity sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ== 1970 | dependencies: 1971 | semver "^5.1.0" 1972 | 1973 | parse5-htmlparser2-tree-adapter@^7.0.0: 1974 | version "7.1.0" 1975 | resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz#b5a806548ed893a43e24ccb42fbb78069311e81b" 1976 | integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g== 1977 | dependencies: 1978 | domhandler "^5.0.3" 1979 | parse5 "^7.0.0" 1980 | 1981 | parse5-parser-stream@^7.1.2: 1982 | version "7.1.2" 1983 | resolved "https://registry.yarnpkg.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz#d7c20eadc37968d272e2c02660fff92dd27e60e1" 1984 | integrity sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow== 1985 | dependencies: 1986 | parse5 "^7.0.0" 1987 | 1988 | parse5@^7.0.0, parse5@^7.1.2: 1989 | version "7.2.1" 1990 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" 1991 | integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== 1992 | dependencies: 1993 | entities "^4.5.0" 1994 | 1995 | path-is-absolute@^1.0.0: 1996 | version "1.0.1" 1997 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1998 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1999 | 2000 | path-key@^3.1.0: 2001 | version "3.1.1" 2002 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 2003 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 2004 | 2005 | path-key@^4.0.0: 2006 | version "4.0.0" 2007 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" 2008 | integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== 2009 | 2010 | path-parse@^1.0.7: 2011 | version "1.0.7" 2012 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 2013 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 2014 | 2015 | path-scurry@^2.0.0: 2016 | version "2.0.0" 2017 | resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" 2018 | integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== 2019 | dependencies: 2020 | lru-cache "^11.0.0" 2021 | minipass "^7.1.2" 2022 | 2023 | path-type@^4.0.0: 2024 | version "4.0.0" 2025 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 2026 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 2027 | 2028 | pathe@^1.1.1: 2029 | version "1.1.2" 2030 | resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" 2031 | integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== 2032 | 2033 | pathe@^2.0.1: 2034 | version "2.0.3" 2035 | resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" 2036 | integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== 2037 | 2038 | pathval@^1.1.1: 2039 | version "1.1.1" 2040 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 2041 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 2042 | 2043 | pend@~1.2.0: 2044 | version "1.2.0" 2045 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 2046 | integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== 2047 | 2048 | picocolors@^1.0.0, picocolors@^1.1.1: 2049 | version "1.1.1" 2050 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" 2051 | integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 2052 | 2053 | picomatch@^2.3.1: 2054 | version "2.3.1" 2055 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 2056 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 2057 | 2058 | picomatch@^4.0.2: 2059 | version "4.0.2" 2060 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" 2061 | integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== 2062 | 2063 | pkg-types@^1.2.1, pkg-types@^1.3.0: 2064 | version "1.3.1" 2065 | resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" 2066 | integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== 2067 | dependencies: 2068 | confbox "^0.1.8" 2069 | mlly "^1.7.4" 2070 | pathe "^2.0.1" 2071 | 2072 | postcss@^8.4.43: 2073 | version "8.5.2" 2074 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.2.tgz#e7b99cb9d2ec3e8dd424002e7c16517cb2b846bd" 2075 | integrity sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA== 2076 | dependencies: 2077 | nanoid "^3.3.8" 2078 | picocolors "^1.1.1" 2079 | source-map-js "^1.2.1" 2080 | 2081 | prebuild-install@^7.0.1: 2082 | version "7.1.3" 2083 | resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" 2084 | integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== 2085 | dependencies: 2086 | detect-libc "^2.0.0" 2087 | expand-template "^2.0.3" 2088 | github-from-package "0.0.0" 2089 | minimist "^1.2.3" 2090 | mkdirp-classic "^0.5.3" 2091 | napi-build-utils "^2.0.0" 2092 | node-abi "^3.3.0" 2093 | pump "^3.0.0" 2094 | rc "^1.2.7" 2095 | simple-get "^4.0.0" 2096 | tar-fs "^2.0.0" 2097 | tunnel-agent "^0.6.0" 2098 | 2099 | pretty-format@^29.7.0: 2100 | version "29.7.0" 2101 | resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" 2102 | integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== 2103 | dependencies: 2104 | "@jest/schemas" "^29.6.3" 2105 | ansi-styles "^5.0.0" 2106 | react-is "^18.0.0" 2107 | 2108 | pump@^3.0.0: 2109 | version "3.0.2" 2110 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" 2111 | integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== 2112 | dependencies: 2113 | end-of-stream "^1.1.0" 2114 | once "^1.3.1" 2115 | 2116 | punycode.js@^2.3.1: 2117 | version "2.3.1" 2118 | resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" 2119 | integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== 2120 | 2121 | qs@^6.9.1: 2122 | version "6.14.0" 2123 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" 2124 | integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== 2125 | dependencies: 2126 | side-channel "^1.1.0" 2127 | 2128 | queue-microtask@^1.2.2: 2129 | version "1.2.3" 2130 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 2131 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 2132 | 2133 | rc@^1.2.7: 2134 | version "1.2.8" 2135 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 2136 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 2137 | dependencies: 2138 | deep-extend "^0.6.0" 2139 | ini "~1.3.0" 2140 | minimist "^1.2.0" 2141 | strip-json-comments "~2.0.1" 2142 | 2143 | react-is@^18.0.0: 2144 | version "18.3.1" 2145 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" 2146 | integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== 2147 | 2148 | read@^1.0.7: 2149 | version "1.0.7" 2150 | resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" 2151 | integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== 2152 | dependencies: 2153 | mute-stream "~0.0.4" 2154 | 2155 | readable-stream@^3.1.1, readable-stream@^3.4.0: 2156 | version "3.6.2" 2157 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" 2158 | integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== 2159 | dependencies: 2160 | inherits "^2.0.3" 2161 | string_decoder "^1.1.1" 2162 | util-deprecate "^1.0.1" 2163 | 2164 | resolve@^1.22.1: 2165 | version "1.22.10" 2166 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" 2167 | integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== 2168 | dependencies: 2169 | is-core-module "^2.16.0" 2170 | path-parse "^1.0.7" 2171 | supports-preserve-symlinks-flag "^1.0.0" 2172 | 2173 | reusify@^1.0.4: 2174 | version "1.0.4" 2175 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 2176 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 2177 | 2178 | rimraf@^3.0.0: 2179 | version "3.0.2" 2180 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 2181 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 2182 | dependencies: 2183 | glob "^7.1.3" 2184 | 2185 | rollup-plugin-copy@3.5.0: 2186 | version "3.5.0" 2187 | resolved "https://registry.yarnpkg.com/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz#7ffa2a7a8303e143876fa64fb5eed9022d304eeb" 2188 | integrity sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA== 2189 | dependencies: 2190 | "@types/fs-extra" "^8.0.1" 2191 | colorette "^1.1.0" 2192 | fs-extra "^8.1.0" 2193 | globby "10.0.1" 2194 | is-plain-object "^3.0.0" 2195 | 2196 | rollup-plugin-delete@2.0.0: 2197 | version "2.0.0" 2198 | resolved "https://registry.yarnpkg.com/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz#262acf80660d48c3b167fb0baabd0c3ab985c153" 2199 | integrity sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA== 2200 | dependencies: 2201 | del "^5.1.0" 2202 | 2203 | rollup@4.22.4: 2204 | version "4.22.4" 2205 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.22.4.tgz#4135a6446671cd2a2453e1ad42a45d5973ec3a0f" 2206 | integrity sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A== 2207 | dependencies: 2208 | "@types/estree" "1.0.5" 2209 | optionalDependencies: 2210 | "@rollup/rollup-android-arm-eabi" "4.22.4" 2211 | "@rollup/rollup-android-arm64" "4.22.4" 2212 | "@rollup/rollup-darwin-arm64" "4.22.4" 2213 | "@rollup/rollup-darwin-x64" "4.22.4" 2214 | "@rollup/rollup-linux-arm-gnueabihf" "4.22.4" 2215 | "@rollup/rollup-linux-arm-musleabihf" "4.22.4" 2216 | "@rollup/rollup-linux-arm64-gnu" "4.22.4" 2217 | "@rollup/rollup-linux-arm64-musl" "4.22.4" 2218 | "@rollup/rollup-linux-powerpc64le-gnu" "4.22.4" 2219 | "@rollup/rollup-linux-riscv64-gnu" "4.22.4" 2220 | "@rollup/rollup-linux-s390x-gnu" "4.22.4" 2221 | "@rollup/rollup-linux-x64-gnu" "4.22.4" 2222 | "@rollup/rollup-linux-x64-musl" "4.22.4" 2223 | "@rollup/rollup-win32-arm64-msvc" "4.22.4" 2224 | "@rollup/rollup-win32-ia32-msvc" "4.22.4" 2225 | "@rollup/rollup-win32-x64-msvc" "4.22.4" 2226 | fsevents "~2.3.2" 2227 | 2228 | rollup@^4.20.0: 2229 | version "4.34.8" 2230 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.34.8.tgz#e859c1a51d899aba9bcf451d4eed1d11fb8e2a6e" 2231 | integrity sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ== 2232 | dependencies: 2233 | "@types/estree" "1.0.6" 2234 | optionalDependencies: 2235 | "@rollup/rollup-android-arm-eabi" "4.34.8" 2236 | "@rollup/rollup-android-arm64" "4.34.8" 2237 | "@rollup/rollup-darwin-arm64" "4.34.8" 2238 | "@rollup/rollup-darwin-x64" "4.34.8" 2239 | "@rollup/rollup-freebsd-arm64" "4.34.8" 2240 | "@rollup/rollup-freebsd-x64" "4.34.8" 2241 | "@rollup/rollup-linux-arm-gnueabihf" "4.34.8" 2242 | "@rollup/rollup-linux-arm-musleabihf" "4.34.8" 2243 | "@rollup/rollup-linux-arm64-gnu" "4.34.8" 2244 | "@rollup/rollup-linux-arm64-musl" "4.34.8" 2245 | "@rollup/rollup-linux-loongarch64-gnu" "4.34.8" 2246 | "@rollup/rollup-linux-powerpc64le-gnu" "4.34.8" 2247 | "@rollup/rollup-linux-riscv64-gnu" "4.34.8" 2248 | "@rollup/rollup-linux-s390x-gnu" "4.34.8" 2249 | "@rollup/rollup-linux-x64-gnu" "4.34.8" 2250 | "@rollup/rollup-linux-x64-musl" "4.34.8" 2251 | "@rollup/rollup-win32-arm64-msvc" "4.34.8" 2252 | "@rollup/rollup-win32-ia32-msvc" "4.34.8" 2253 | "@rollup/rollup-win32-x64-msvc" "4.34.8" 2254 | fsevents "~2.3.2" 2255 | 2256 | run-applescript@^7.0.0: 2257 | version "7.0.0" 2258 | resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" 2259 | integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== 2260 | 2261 | run-parallel@^1.1.9: 2262 | version "1.2.0" 2263 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 2264 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 2265 | dependencies: 2266 | queue-microtask "^1.2.2" 2267 | 2268 | safe-buffer@^5.0.1, safe-buffer@~5.2.0: 2269 | version "5.2.1" 2270 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 2271 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 2272 | 2273 | "safer-buffer@>= 2.1.2 < 3.0.0": 2274 | version "2.1.2" 2275 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 2276 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 2277 | 2278 | sax@>=0.6.0: 2279 | version "1.4.1" 2280 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" 2281 | integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== 2282 | 2283 | semver@^5.1.0: 2284 | version "5.7.2" 2285 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" 2286 | integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== 2287 | 2288 | semver@^7.3.5, semver@^7.5.2, semver@^7.5.4: 2289 | version "7.7.1" 2290 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" 2291 | integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== 2292 | 2293 | shebang-command@^2.0.0: 2294 | version "2.0.0" 2295 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 2296 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 2297 | dependencies: 2298 | shebang-regex "^3.0.0" 2299 | 2300 | shebang-regex@^3.0.0: 2301 | version "3.0.0" 2302 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 2303 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 2304 | 2305 | side-channel-list@^1.0.0: 2306 | version "1.0.0" 2307 | resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" 2308 | integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== 2309 | dependencies: 2310 | es-errors "^1.3.0" 2311 | object-inspect "^1.13.3" 2312 | 2313 | side-channel-map@^1.0.1: 2314 | version "1.0.1" 2315 | resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" 2316 | integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== 2317 | dependencies: 2318 | call-bound "^1.0.2" 2319 | es-errors "^1.3.0" 2320 | get-intrinsic "^1.2.5" 2321 | object-inspect "^1.13.3" 2322 | 2323 | side-channel-weakmap@^1.0.2: 2324 | version "1.0.2" 2325 | resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" 2326 | integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== 2327 | dependencies: 2328 | call-bound "^1.0.2" 2329 | es-errors "^1.3.0" 2330 | get-intrinsic "^1.2.5" 2331 | object-inspect "^1.13.3" 2332 | side-channel-map "^1.0.1" 2333 | 2334 | side-channel@^1.1.0: 2335 | version "1.1.0" 2336 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" 2337 | integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== 2338 | dependencies: 2339 | es-errors "^1.3.0" 2340 | object-inspect "^1.13.3" 2341 | side-channel-list "^1.0.0" 2342 | side-channel-map "^1.0.1" 2343 | side-channel-weakmap "^1.0.2" 2344 | 2345 | siginfo@^2.0.0: 2346 | version "2.0.0" 2347 | resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" 2348 | integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== 2349 | 2350 | signal-exit@^4.0.1, signal-exit@^4.1.0: 2351 | version "4.1.0" 2352 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" 2353 | integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== 2354 | 2355 | simple-concat@^1.0.0: 2356 | version "1.0.1" 2357 | resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" 2358 | integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== 2359 | 2360 | simple-get@^4.0.0: 2361 | version "4.0.1" 2362 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" 2363 | integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== 2364 | dependencies: 2365 | decompress-response "^6.0.0" 2366 | once "^1.3.1" 2367 | simple-concat "^1.0.0" 2368 | 2369 | slash@^3.0.0: 2370 | version "3.0.0" 2371 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 2372 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 2373 | 2374 | source-map-js@^1.2.1: 2375 | version "1.2.1" 2376 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" 2377 | integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== 2378 | 2379 | stackback@0.0.2: 2380 | version "0.0.2" 2381 | resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" 2382 | integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== 2383 | 2384 | std-env@^3.5.0: 2385 | version "3.8.0" 2386 | resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.8.0.tgz#b56ffc1baf1a29dcc80a3bdf11d7fca7c315e7d5" 2387 | integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w== 2388 | 2389 | stoppable@^1.1.0: 2390 | version "1.1.0" 2391 | resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b" 2392 | integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw== 2393 | 2394 | "string-width-cjs@npm:string-width@^4.2.0": 2395 | version "4.2.3" 2396 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 2397 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 2398 | dependencies: 2399 | emoji-regex "^8.0.0" 2400 | is-fullwidth-code-point "^3.0.0" 2401 | strip-ansi "^6.0.1" 2402 | 2403 | string-width@^4.1.0: 2404 | version "4.2.3" 2405 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 2406 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 2407 | dependencies: 2408 | emoji-regex "^8.0.0" 2409 | is-fullwidth-code-point "^3.0.0" 2410 | strip-ansi "^6.0.1" 2411 | 2412 | string-width@^5.0.1, string-width@^5.1.2: 2413 | version "5.1.2" 2414 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" 2415 | integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== 2416 | dependencies: 2417 | eastasianwidth "^0.2.0" 2418 | emoji-regex "^9.2.2" 2419 | strip-ansi "^7.0.1" 2420 | 2421 | string_decoder@^1.1.1: 2422 | version "1.3.0" 2423 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 2424 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 2425 | dependencies: 2426 | safe-buffer "~5.2.0" 2427 | 2428 | "strip-ansi-cjs@npm:strip-ansi@^6.0.1": 2429 | version "6.0.1" 2430 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2431 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2432 | dependencies: 2433 | ansi-regex "^5.0.1" 2434 | 2435 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 2436 | version "6.0.1" 2437 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2438 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2439 | dependencies: 2440 | ansi-regex "^5.0.1" 2441 | 2442 | strip-ansi@^7.0.1: 2443 | version "7.1.0" 2444 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" 2445 | integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== 2446 | dependencies: 2447 | ansi-regex "^6.0.1" 2448 | 2449 | strip-final-newline@^3.0.0: 2450 | version "3.0.0" 2451 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" 2452 | integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== 2453 | 2454 | strip-json-comments@~2.0.1: 2455 | version "2.0.1" 2456 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2457 | integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== 2458 | 2459 | strip-literal@^2.0.0: 2460 | version "2.1.1" 2461 | resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.1.tgz#26906e65f606d49f748454a08084e94190c2e5ad" 2462 | integrity sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q== 2463 | dependencies: 2464 | js-tokens "^9.0.1" 2465 | 2466 | supports-color@^5.3.0: 2467 | version "5.5.0" 2468 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2469 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2470 | dependencies: 2471 | has-flag "^3.0.0" 2472 | 2473 | supports-preserve-symlinks-flag@^1.0.0: 2474 | version "1.0.0" 2475 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 2476 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 2477 | 2478 | tar-fs@^2.0.0: 2479 | version "2.1.4" 2480 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.4.tgz#800824dbf4ef06ded9afea4acafe71c67c76b930" 2481 | integrity sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ== 2482 | dependencies: 2483 | chownr "^1.1.1" 2484 | mkdirp-classic "^0.5.2" 2485 | pump "^3.0.0" 2486 | tar-stream "^2.1.4" 2487 | 2488 | tar-stream@^2.1.4: 2489 | version "2.2.0" 2490 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" 2491 | integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== 2492 | dependencies: 2493 | bl "^4.0.3" 2494 | end-of-stream "^1.4.1" 2495 | fs-constants "^1.0.0" 2496 | inherits "^2.0.3" 2497 | readable-stream "^3.1.1" 2498 | 2499 | tinybench@^2.5.1: 2500 | version "2.9.0" 2501 | resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" 2502 | integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== 2503 | 2504 | tinypool@^0.8.3: 2505 | version "0.8.4" 2506 | resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.4.tgz#e217fe1270d941b39e98c625dcecebb1408c9aa8" 2507 | integrity sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ== 2508 | 2509 | tinyspy@^2.2.0: 2510 | version "2.2.1" 2511 | resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" 2512 | integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== 2513 | 2514 | tmp@^0.2.3: 2515 | version "0.2.5" 2516 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" 2517 | integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== 2518 | 2519 | to-regex-range@^5.0.1: 2520 | version "5.0.1" 2521 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2522 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2523 | dependencies: 2524 | is-number "^7.0.0" 2525 | 2526 | tslib@^2.2.0, tslib@^2.6.2: 2527 | version "2.8.1" 2528 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" 2529 | integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== 2530 | 2531 | tunnel-agent@^0.6.0: 2532 | version "0.6.0" 2533 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2534 | integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== 2535 | dependencies: 2536 | safe-buffer "^5.0.1" 2537 | 2538 | tunnel@0.0.6: 2539 | version "0.0.6" 2540 | resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" 2541 | integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== 2542 | 2543 | type-detect@^4.0.0, type-detect@^4.1.0: 2544 | version "4.1.0" 2545 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" 2546 | integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== 2547 | 2548 | typed-rest-client@^1.8.4: 2549 | version "1.8.11" 2550 | resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.8.11.tgz#6906f02e3c91e8d851579f255abf0fd60800a04d" 2551 | integrity sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA== 2552 | dependencies: 2553 | qs "^6.9.1" 2554 | tunnel "0.0.6" 2555 | underscore "^1.12.1" 2556 | 2557 | typescript@^5.5.2: 2558 | version "5.7.3" 2559 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" 2560 | integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== 2561 | 2562 | uc.micro@^2.0.0, uc.micro@^2.1.0: 2563 | version "2.1.0" 2564 | resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" 2565 | integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== 2566 | 2567 | ufo@^1.5.4: 2568 | version "1.5.4" 2569 | resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" 2570 | integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== 2571 | 2572 | underscore@^1.12.1: 2573 | version "1.13.7" 2574 | resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" 2575 | integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== 2576 | 2577 | undici-types@~6.19.2: 2578 | version "6.19.8" 2579 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" 2580 | integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== 2581 | 2582 | undici-types@~6.20.0: 2583 | version "6.20.0" 2584 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" 2585 | integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== 2586 | 2587 | undici@^6.19.5: 2588 | version "6.21.1" 2589 | resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.1.tgz#336025a14162e6837e44ad7b819b35b6c6af0e05" 2590 | integrity sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ== 2591 | 2592 | universalify@^0.1.0: 2593 | version "0.1.2" 2594 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 2595 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 2596 | 2597 | url-join@^4.0.1: 2598 | version "4.0.1" 2599 | resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" 2600 | integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== 2601 | 2602 | util-deprecate@^1.0.1: 2603 | version "1.0.2" 2604 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2605 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 2606 | 2607 | uuid@^8.3.0: 2608 | version "8.3.2" 2609 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 2610 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 2611 | 2612 | vite-node@1.6.1: 2613 | version "1.6.1" 2614 | resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.1.tgz#fff3ef309296ea03ceaa6ca4bb660922f5416c57" 2615 | integrity sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA== 2616 | dependencies: 2617 | cac "^6.7.14" 2618 | debug "^4.3.4" 2619 | pathe "^1.1.1" 2620 | picocolors "^1.0.0" 2621 | vite "^5.0.0" 2622 | 2623 | vite@^5.0.0: 2624 | version "5.4.21" 2625 | resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027" 2626 | integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw== 2627 | dependencies: 2628 | esbuild "^0.21.3" 2629 | postcss "^8.4.43" 2630 | rollup "^4.20.0" 2631 | optionalDependencies: 2632 | fsevents "~2.3.3" 2633 | 2634 | vitest@^1.6.0: 2635 | version "1.6.1" 2636 | resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.6.1.tgz#b4a3097adf8f79ac18bc2e2e0024c534a7a78d2f" 2637 | integrity sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag== 2638 | dependencies: 2639 | "@vitest/expect" "1.6.1" 2640 | "@vitest/runner" "1.6.1" 2641 | "@vitest/snapshot" "1.6.1" 2642 | "@vitest/spy" "1.6.1" 2643 | "@vitest/utils" "1.6.1" 2644 | acorn-walk "^8.3.2" 2645 | chai "^4.3.10" 2646 | debug "^4.3.4" 2647 | execa "^8.0.1" 2648 | local-pkg "^0.5.0" 2649 | magic-string "^0.30.5" 2650 | pathe "^1.1.1" 2651 | picocolors "^1.0.0" 2652 | std-env "^3.5.0" 2653 | strip-literal "^2.0.0" 2654 | tinybench "^2.5.1" 2655 | tinypool "^0.8.3" 2656 | vite "^5.0.0" 2657 | vite-node "1.6.1" 2658 | why-is-node-running "^2.2.2" 2659 | 2660 | whatwg-encoding@^3.1.1: 2661 | version "3.1.1" 2662 | resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5" 2663 | integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== 2664 | dependencies: 2665 | iconv-lite "0.6.3" 2666 | 2667 | whatwg-mimetype@^4.0.0: 2668 | version "4.0.0" 2669 | resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" 2670 | integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== 2671 | 2672 | which@^2.0.1: 2673 | version "2.0.2" 2674 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2675 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2676 | dependencies: 2677 | isexe "^2.0.0" 2678 | 2679 | why-is-node-running@^2.2.2: 2680 | version "2.3.0" 2681 | resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" 2682 | integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== 2683 | dependencies: 2684 | siginfo "^2.0.0" 2685 | stackback "0.0.2" 2686 | 2687 | "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 2688 | version "7.0.0" 2689 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2690 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2691 | dependencies: 2692 | ansi-styles "^4.0.0" 2693 | string-width "^4.1.0" 2694 | strip-ansi "^6.0.0" 2695 | 2696 | wrap-ansi@^8.1.0: 2697 | version "8.1.0" 2698 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" 2699 | integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== 2700 | dependencies: 2701 | ansi-styles "^6.1.0" 2702 | string-width "^5.0.1" 2703 | strip-ansi "^7.0.1" 2704 | 2705 | wrappy@1: 2706 | version "1.0.2" 2707 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2708 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 2709 | 2710 | xml2js@^0.5.0: 2711 | version "0.5.0" 2712 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" 2713 | integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== 2714 | dependencies: 2715 | sax ">=0.6.0" 2716 | xmlbuilder "~11.0.0" 2717 | 2718 | xmlbuilder@~11.0.0: 2719 | version "11.0.1" 2720 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" 2721 | integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== 2722 | 2723 | yallist@^4.0.0: 2724 | version "4.0.0" 2725 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2726 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2727 | 2728 | yauzl@^2.3.1: 2729 | version "2.10.0" 2730 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" 2731 | integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== 2732 | dependencies: 2733 | buffer-crc32 "~0.2.3" 2734 | fd-slicer "~1.1.0" 2735 | 2736 | yazl@^2.2.2: 2737 | version "2.5.1" 2738 | resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35" 2739 | integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw== 2740 | dependencies: 2741 | buffer-crc32 "~0.2.3" 2742 | 2743 | yocto-queue@^1.0.0: 2744 | version "1.1.1" 2745 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" 2746 | integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== 2747 | --------------------------------------------------------------------------------