├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .github └── workflows │ ├── deploy.yml │ └── test.yml ├── .gitignore ├── .husky ├── .gitignore └── pre-commit ├── .prettierignore ├── .prettierrc.yaml ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── icon └── css-modules.png ├── package.json ├── src ├── CompletionProvider.ts ├── DefinitionProvider.ts ├── constants.ts ├── extension.ts ├── options.ts ├── path-alias.ts ├── test │ ├── constant.ts │ ├── fixtures │ │ ├── jumpDef.css │ │ ├── jumpDef.jsx │ │ ├── sample.astro │ │ ├── sample.css │ │ ├── sample.js │ │ ├── sample.jsx │ │ ├── sample.ts │ │ ├── sample.tsx │ │ ├── spread-syntax │ │ │ ├── bar.js │ │ │ └── index.js │ │ ├── stylus.jsx │ │ ├── stylus.styl │ │ └── stylus.stylus │ ├── runTest.ts │ ├── suite │ │ ├── CompletionProvider.test.ts │ │ ├── DefinitionProvider.test.ts │ │ ├── index.ts │ │ └── ts-alias.test.ts │ └── utils.ts └── utils │ ├── index.ts │ ├── path.ts │ └── ts-alias.ts ├── tools └── checkTS ├── tsconfig.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | trim_trailing_whitespace = true 8 | indent_style = tab 9 | max_line_length = 80 10 | indent_style = space 11 | indent_size = 4 12 | 13 | [*.md] 14 | max_line_length = 0 15 | trim_trailing_whitespace = false 16 | 17 | [COMMIT_EDITMSG] 18 | max_line_length = 0 19 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | fixtures/ 2 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // eslint-disable 2 | 3 | module.exports = { 4 | root: true, 5 | env: { 6 | node: true, 7 | }, 8 | parser: "@typescript-eslint/parser", 9 | plugins: ["@typescript-eslint"], 10 | extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"], 11 | rules: { 12 | "@typescript-eslint/no-empty-function": 0, 13 | "@typescript-eslint/no-explicit-any": 0, 14 | "@typescript-eslint/no-unused-vars": 0, 15 | } 16 | }; 17 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Extension 2 | 3 | on: 4 | push: 5 | tags: 6 | - "v*.*.*" 7 | 8 | jobs: 9 | deploy_vscode_market: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | with: 14 | fetch-depth: 2 15 | - uses: actions/setup-node@v2 16 | with: 17 | node-version: '18' 18 | - run: yarn install 19 | - name: Publish to Visual Studio Marketplace 20 | uses: HaaLeo/publish-vscode-extension@v1 21 | with: 22 | pat: ${{ secrets.VS_MARKETPLACE_TOKEN }} 23 | registryUrl: https://marketplace.visualstudio.com 24 | yarn: true 25 | deploy_open_vsx: 26 | runs-on: ubuntu-latest 27 | steps: 28 | - uses: actions/checkout@v2 29 | with: 30 | fetch-depth: 2 31 | - uses: actions/setup-node@v2 32 | with: 33 | node-version: '18' 34 | - run: yarn install 35 | - name: Publish to Open VSX Registry 36 | uses: HaaLeo/publish-vscode-extension@v1 37 | with: 38 | pat: ${{ secrets.OPEN_VSX_TOKEN }} 39 | yarn: true 40 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | # Github actions workflow name 2 | name: VSCode Test 3 | 4 | # Triggers the workflow on push or pull request events 5 | on: 6 | push: 7 | branches: [main, master] 8 | pull_request: 9 | branches: [main, master] 10 | 11 | jobs: 12 | VSCode-Test: 13 | name: 'CI on ${{matrix.os}} with nodejs' 14 | strategy: 15 | matrix: 16 | os: [macos-latest, windows-latest] 17 | runs-on: ${{ matrix.os }} 18 | steps: 19 | - uses: actions/checkout@v3 20 | with: 21 | fetch-depth: 2 22 | - uses: actions/setup-node@v3 23 | with: 24 | node-version: '18' 25 | cache: 'yarn' 26 | - run: yarn install 27 | - run: yarn test 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules 3 | .vscode-test 4 | *.vsix 5 | .eslintcache 6 | -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | fixtures/ 2 | -------------------------------------------------------------------------------- /.prettierrc.yaml: -------------------------------------------------------------------------------- 1 | semi: true 2 | singleQuote: false 3 | useTabs: false 4 | tabWidth: 2 5 | trailingComma: es5 6 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Run Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "args": [ 13 | "--disable-extensions", 14 | "--extensionDevelopmentPath=${workspaceFolder}" 15 | ], 16 | "outFiles": ["${workspaceFolder}/out/**/*.js"], 17 | "preLaunchTask": "npm" 18 | }, 19 | { 20 | "name": "Extension Tests", 21 | "type": "extensionHost", 22 | "request": "launch", 23 | "args": [ 24 | "--disable-extensions", 25 | "--extensionDevelopmentPath=${workspaceFolder}", 26 | "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" 27 | ], 28 | "outFiles": ["${workspaceFolder}/out/test/**/*.js"], 29 | "preLaunchTask": "npm" 30 | } 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true // set this to false to include "out" folder in search results 8 | }, 9 | "typescript.tsdk": "./node_modules/typescript/lib" // we want to use the TS server from our node_modules folder to control its version 10 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // Available variables which can be used inside of strings. 2 | // ${workspaceRoot}: the root folder of the team 3 | // ${file}: the current opened file 4 | // ${fileBasename}: the current opened file's basename 5 | // ${fileDirname}: the current opened file's dirname 6 | // ${fileExtname}: the current opened file's extension 7 | // ${cwd}: the current working directory of the spawned process 8 | 9 | // A task runner that calls a custom npm script that compiles the extension. 10 | { 11 | "version": "2.0.0", 12 | "tasks": [ 13 | { 14 | "label": "npm", 15 | "type": "shell", 16 | "command": "npm", 17 | "args": [ 18 | "run", 19 | "compile", 20 | "--loglevel", 21 | "silent" 22 | ], 23 | "isBackground": true, 24 | "problemMatcher": "$tsc-watch", 25 | "group": "build" 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | 5 | src/** 6 | .gitignore 7 | .yarnrc 8 | **/tsconfig.json 9 | **/.eslintrc.json 10 | **/*.map 11 | **/*.ts 12 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.5.4 2 | 3 | - Implement support for bracket syntax. [#92](https://github.com/clinyong/vscode-css-modules/pull/92) for detail. 4 | 5 | ## 0.5.3 6 | 7 | - Add support for Astro files. [#98](https://github.com/clinyong/vscode-css-modules/pull/98) for detail. 8 | 9 | ## 0.5.1 10 | 11 | - Active the extension for typescript files. [#85](https://github.com/clinyong/vscode-css-modules/pull/85) for detail. 12 | 13 | ## 0.4.2 14 | 15 | - Fix spread operator incorrect definition. [#69](https://github.com/clinyong/vscode-css-modules/pull/69) for detail. 16 | 17 | ## 0.4.1 18 | 19 | - Fix unable to resolve alias path on Windows. [#53](https://github.com/clinyong/vscode-css-modules/issues/53) for detail. 20 | 21 | ## 0.4.0 22 | 23 | - Experimental stylus support. 24 | 25 | ## 0.3.2 26 | 27 | - Support bracket notation completion. 28 | 29 | ## 0.3.1 30 | 31 | - Optimize regular expression matches. 32 | 33 | ## 0.3.0 34 | 35 | - Support path alias. Big thanks to [@iChenLei](https://github.com/iChenLei). 36 | 37 | ## 0.2.3 38 | 39 | - Add support for javascript file. 40 | 41 | ## 0.2.2 42 | 43 | - Improvement to go to definition for camelCase. 44 | 45 | ## 0.2.1 46 | 47 | - Improvement to autocomplete for camelCase. Thanks [@kumarharsh](https://github.com/kumarharsh). More detail at [#3](https://github.com/clinyong/vscode-css-modules/issues/3). 48 | 49 | ## 0.2.0 50 | 51 | - Support ES6 style import. 52 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 clinyong 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VSCode CSS Modules 2 | 3 | [![Github Actions](https://github.com/clinyong/vscode-css-modules/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/clinyong/vscode-css-modules/actions) 4 | [![VSCode Marketplace Version](https://img.shields.io/visual-studio-marketplace/v/clinyong.vscode-css-modules)](https://marketplace.visualstudio.com/items?itemName=clinyong.vscode-css-modules) 5 | [![VSCode Marketplace Downloads](https://img.shields.io/visual-studio-marketplace/i/clinyong.vscode-css-modules)](https://marketplace.visualstudio.com/items?itemName=clinyong.vscode-css-modules) 6 | [![VSCode Marketplace Stars](https://img.shields.io/visual-studio-marketplace/r/clinyong.vscode-css-modules)](https://marketplace.visualstudio.com/items?itemName=clinyong.vscode-css-modules) 7 | 8 | Extension for [CSS Modules](https://github.com/css-modules/css-modules), which supports 9 | 10 | - Autocomplete 11 | - Go to definition 12 | 13 | ## Demo 14 | 15 | ![](https://i.giphy.com/l0EwY2Mk4IBgIholi.gif) 16 | 17 | ## Installation 18 | 19 | Search `css modules` on the [VS Code Marketplace](https://code.visualstudio.com/Docs/editor/extension-gallery#_browse-and-install-extensions-in-vs-code). 20 | 21 | ## Usage 22 | 23 | Currently, this extension only support React project. 24 | 25 | ## Settings 26 | 27 | ### CamelCase for autocomplete 28 | 29 | If you write `kebab-case` classes in css files, but want to get `camelCase` complete items, set following to true. 30 | 31 | ```json 32 | { 33 | "cssModules.camelCase": true 34 | } 35 | ``` 36 | 37 | ### Path Alias 38 | 39 | Create aliases to import or require modules. (In combination with webpack resolve options.) 40 | 41 | ```json 42 | { 43 | "cssModules.pathAlias": { 44 | "@styles1": "${workspaceFolder}/src/styles1", 45 | "styles2": "${workspaceFolder}/src/styles2" 46 | } 47 | } 48 | ``` 49 | 50 | If there is a jsconfig or tsconfig in your project, the `compilerOptions.paths` will become aliases. For example 51 | 52 | ```json 53 | { 54 | "baseUrl": "./src", 55 | "paths": { 56 | "@styles1/*": "styles1/*" 57 | } 58 | } 59 | ``` 60 | 61 | would allow to type 62 | 63 | ```js 64 | import * as styles1 from "@styles1/demo.css"; 65 | ``` 66 | 67 | ## Feedback 68 | 69 | Feel free to submit any issues or pull request. 70 | 71 | ## License 72 | 73 | ``` 74 | _________________ 75 | < The MIT License > 76 | ----------------- 77 | \ ^__^ 78 | \ (oo)\_______ 79 | (__)\ )\/\ 80 | ||----w | 81 | || || 82 | ``` 83 | -------------------------------------------------------------------------------- /icon/css-modules.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clinyong/vscode-css-modules/1cc4002adecb0778f33bf0e1655517db59b3a7ec/icon/css-modules.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vscode-css-modules", 3 | "displayName": "CSS Modules", 4 | "description": "Visual Studio Code extension for CSS Modules", 5 | "version": "0.5.4", 6 | "publisher": "clinyong", 7 | "engines": { 8 | "vscode": "^1.56.0" 9 | }, 10 | "categories": [ 11 | "Other" 12 | ], 13 | "homepage": "https://github.com/clinyong/vscode-css-modules", 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/clinyong/vscode-css-modules" 17 | }, 18 | "activationEvents": [ 19 | "onLanguage:typescriptreact", 20 | "onLanguage:javascriptreact", 21 | "onLanguage:javascript", 22 | "onLanguage:typescript", 23 | "onLanguage:astro" 24 | ], 25 | "contributes": { 26 | "configuration": { 27 | "type": "object", 28 | "title": "CSS Modules Configuration", 29 | "properties": { 30 | "cssModules.camelCase": { 31 | "type": [ 32 | "boolean", 33 | "string" 34 | ], 35 | "default": false, 36 | "description": "Transform classnames in autocomplete suggestions." 37 | }, 38 | "cssModules.pathAlias": { 39 | "type": "object", 40 | "default": {}, 41 | "description": "Path alias for import module." 42 | } 43 | } 44 | } 45 | }, 46 | "main": "./out/extension.js", 47 | "scripts": { 48 | "vscode:prepublish": "yarn run compile", 49 | "compile": "tsc -p ./", 50 | "watch": "tsc -watch -p ./", 51 | "pretest": "yarn run compile && yarn run lint", 52 | "lint": "eslint src --ext ts", 53 | "test": "node ./out/test/runTest.js", 54 | "prepare": "husky install" 55 | }, 56 | "devDependencies": { 57 | "@types/fs-extra": "^9.0.11", 58 | "@types/glob": "^7.1.3", 59 | "@types/mocha": "^8.2.2", 60 | "@types/node": "14.x", 61 | "@types/vscode": "^1.56.0", 62 | "@typescript-eslint/eslint-plugin": "^4.26.0", 63 | "@typescript-eslint/parser": "^4.26.0", 64 | "@vscode/test-electron": "^2.3.0", 65 | "eslint": "^7.27.0", 66 | "glob": "^7.1.7", 67 | "husky": ">=6", 68 | "lint-staged": ">=10", 69 | "mocha": "^8.4.0", 70 | "prettier": "^2.3.2", 71 | "typescript": "^4.3.2" 72 | }, 73 | "dependencies": { 74 | "fs-extra": "^10.0.0", 75 | "json5": "^2.2.0", 76 | "lodash": "^4.17.4" 77 | }, 78 | "icon": "icon/css-modules.png", 79 | "lint-staged": { 80 | "*.ts": "eslint --cache --fix", 81 | "*.{js,css,md}": "prettier --write" 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/CompletionProvider.ts: -------------------------------------------------------------------------------- 1 | import { 2 | CompletionItemProvider, 3 | TextDocument, 4 | Position, 5 | CompletionItem, 6 | CompletionItemKind, 7 | } from "vscode"; 8 | import * as path from "path"; 9 | import * as _ from "lodash"; 10 | import { 11 | getAllClassNames, 12 | getCurrentLine, 13 | dashesCamelCase, 14 | isKebabCaseClassName, 15 | createBracketCompletionItem, 16 | } from "./utils"; 17 | import { findImportModule, resolveImportPath } from "./utils/path"; 18 | import { AliasFromUserOptions, ExtensionOptions } from "./options"; 19 | import { getRealPathAlias } from "./path-alias"; 20 | 21 | // check if current character or last character is . 22 | // or if current character is " or ' after a [ 23 | function isTrigger(line: string, position: Position): boolean { 24 | const i = position.character - 1; 25 | const isDotSyntax = line[i] === "." || (i > 1 && line[i - 1] === "."); 26 | if (isDotSyntax) { 27 | return true; 28 | } 29 | 30 | const isBracketSyntax = 31 | line[i - 1] === "[" && (line[i] === '"' || line[i] === "'"); 32 | if (isBracketSyntax) { 33 | return true; 34 | } 35 | 36 | return false; 37 | } 38 | 39 | function getWords(line: string, position: Position): string { 40 | const text = line.slice(0, position.character); 41 | // support optional chain https://github.com/tc39/proposal-optional-chaining 42 | // covert ?. to . 43 | const convertText = text.replace(/(\?\.)/g, "."); 44 | const index = convertText.search(/[a-zA-Z0-9._["']*$/); 45 | if (index === -1) { 46 | return ""; 47 | } 48 | 49 | return convertText.slice(index); 50 | } 51 | 52 | export class CSSModuleCompletionProvider implements CompletionItemProvider { 53 | _classTransformer = null; 54 | pathAliasOptions: AliasFromUserOptions; 55 | 56 | constructor(options: ExtensionOptions) { 57 | switch (options.camelCase) { 58 | case true: 59 | this._classTransformer = _.camelCase; 60 | break; 61 | case "dashes": 62 | this._classTransformer = dashesCamelCase; 63 | break; 64 | default: 65 | break; 66 | } 67 | 68 | this.pathAliasOptions = options.pathAlias; 69 | } 70 | 71 | async provideCompletionItems( 72 | document: TextDocument, 73 | position: Position 74 | ): Promise { 75 | const currentLine = getCurrentLine(document, position); 76 | const currentDir = path.dirname(document.uri.fsPath); 77 | 78 | if (!isTrigger(currentLine, position)) { 79 | return Promise.resolve([]); 80 | } 81 | 82 | const splitRegex = /\.|\["|\['/; 83 | const words = getWords(currentLine, position); 84 | if (words === "" || !splitRegex.test(words)) { 85 | return Promise.resolve([]); 86 | } 87 | 88 | const [obj, field] = words.split(splitRegex); 89 | 90 | const importModule = findImportModule(document.getText(), obj); 91 | const importPath = await resolveImportPath( 92 | importModule, 93 | currentDir, 94 | await getRealPathAlias(this.pathAliasOptions, document) 95 | ); 96 | if (importPath === "") { 97 | return Promise.resolve([]); 98 | } 99 | 100 | const classNames = await getAllClassNames(importPath, field); 101 | 102 | return Promise.resolve( 103 | classNames.map((_class) => { 104 | let name = _class; 105 | if (this._classTransformer) { 106 | name = this._classTransformer(name); 107 | } 108 | if (isKebabCaseClassName(name)) { 109 | return createBracketCompletionItem(name, position); 110 | } 111 | return new CompletionItem(name, CompletionItemKind.Variable); 112 | }) 113 | ); 114 | } 115 | } 116 | 117 | export default CSSModuleCompletionProvider; 118 | -------------------------------------------------------------------------------- /src/DefinitionProvider.ts: -------------------------------------------------------------------------------- 1 | import { 2 | DefinitionProvider, 3 | TextDocument, 4 | Position, 5 | CancellationToken, 6 | Location, 7 | Uri, 8 | } from "vscode"; 9 | import { getCurrentLine, dashesCamelCase } from "./utils"; 10 | import { 11 | findImportModule, 12 | genImportRegExp, 13 | resolveImportPath, 14 | } from "./utils/path"; 15 | import { 16 | AliasFromUserOptions, 17 | CamelCaseValues, 18 | ExtensionOptions, 19 | } from "./options"; 20 | import * as path from "path"; 21 | import * as fs from "fs"; 22 | import * as _ from "lodash"; 23 | import { getRealPathAlias } from "./path-alias"; 24 | 25 | type ClassTransformer = (cls: string) => string; 26 | 27 | interface ClickInfo { 28 | importModule: string; 29 | targetClass: string; 30 | } 31 | 32 | interface Keyword { 33 | obj: string; 34 | field: string; 35 | } 36 | 37 | function getWords(line: string, position: Position): string { 38 | const splitRegex = /\.|\["|\['/; 39 | 40 | const headText = line.slice(0, position.character); 41 | const startIndex = headText.search(/[a-zA-Z0-9._["']*$/); 42 | // not found or not clicking object field 43 | if (startIndex === -1 || !splitRegex.test(headText.slice(startIndex))) { 44 | return ""; 45 | } 46 | 47 | const match = /^([a-zA-Z0-9._["']*)/.exec(line.slice(startIndex)); 48 | if (match === null) { 49 | return ""; 50 | } 51 | 52 | if (match[1].includes('["') || match[1].includes("['")) { 53 | // Remove " or ' from end 54 | return match[1].slice(0, -1); 55 | } 56 | 57 | return match[1]; 58 | } 59 | 60 | function getTransformer( 61 | camelCaseConfig: CamelCaseValues 62 | ): ClassTransformer | null { 63 | switch (camelCaseConfig) { 64 | case true: 65 | return _.camelCase; 66 | case "dashes": 67 | return dashesCamelCase; 68 | default: 69 | return null; 70 | } 71 | } 72 | 73 | function getPosition( 74 | filePath: string, 75 | className: string, 76 | camelCaseConfig: CamelCaseValues 77 | ): Position { 78 | const content = fs.readFileSync(filePath, { encoding: "utf8" }); 79 | const lines = content.split("\n"); 80 | 81 | let lineNumber = -1; 82 | let character = -1; 83 | let keyWord = className; 84 | const classTransformer = getTransformer(camelCaseConfig); 85 | if (camelCaseConfig !== true) { 86 | // is false or 'dashes' 87 | keyWord = `.${className}`; 88 | } 89 | 90 | /** 91 | * This is a simple solution for definition match. 92 | * Only guarantee keyword not follow normal characters 93 | * 94 | * if we want match [.main] classname 95 | * escaped dot char first and then use RegExp to match 96 | * more detail -> https://github.com/clinyong/vscode-css-modules/pull/41#discussion_r696247941 97 | * 98 | * 1. .main, // valid 99 | * 2. .main // valid 100 | * 101 | * 3. .main-sub // invalid 102 | * 4. .main09 // invalid 103 | * 5. .main_bem // invalid 104 | * 6. .mainsuffix // invalid 105 | * 106 | * @TODO Refact by new tokenizer later 107 | */ 108 | const keyWordMatchReg = new RegExp( 109 | `${keyWord.replace(/^\./, "\\.")}(?![_0-9a-zA-Z-])` 110 | ); 111 | 112 | for (let i = 0; i < lines.length; i++) { 113 | const originalLine = lines[i]; 114 | /** 115 | * The only way to guarantee that a position will be returned for a camelized class 116 | * is to check after camelizing the source line. 117 | * Doing the opposite -- uncamelizing the used classname -- would not always give 118 | * correct result, as camelization is lossy. 119 | * i.e. `.button--disabled`, `.button-disabled` both give same 120 | * final class: `css.buttonDisabled`, and going back from this to that is not possble. 121 | * 122 | * But this has a drawback - camelization of a line may change the final 123 | * positions of classes. But as of now, I don't see a better way, and getting this 124 | * working is more important, also putting this functionality out there would help 125 | * get more eyeballs and hopefully a better way. 126 | */ 127 | const line = !classTransformer 128 | ? originalLine 129 | : classTransformer(originalLine); 130 | 131 | /** 132 | * @isMatchChar for match check 133 | * @character for position 134 | */ 135 | let isMatchChar = keyWordMatchReg.test(line); 136 | character = line.indexOf(keyWord); 137 | if (!isMatchChar && !!classTransformer) { 138 | // if camelized match fails, and transformer is there 139 | // try matching the un-camelized classnames too! 140 | character = originalLine.indexOf(keyWord); 141 | isMatchChar = keyWordMatchReg.test(originalLine); 142 | } 143 | 144 | if (isMatchChar) { 145 | lineNumber = i; 146 | break; 147 | } 148 | } 149 | 150 | if (lineNumber === -1) { 151 | return null; 152 | } else { 153 | return new Position(lineNumber, character + 1); 154 | } 155 | } 156 | 157 | function isImportLineMatch( 158 | line: string, 159 | matches: RegExpExecArray, 160 | current: number 161 | ): boolean { 162 | if (matches === null) { 163 | return false; 164 | } 165 | 166 | const start1 = line.indexOf(matches[1]) + 1; 167 | const start2 = line.indexOf(matches[2]) + 1; 168 | 169 | // check current character is between match words 170 | return ( 171 | (current > start2 && current < start2 + matches[2].length) || 172 | (current > start1 && current < start1 + matches[1].length) 173 | ); 174 | } 175 | 176 | function getKeyword(currentLine: string, position: Position): Keyword | null { 177 | const splitRegex = /\.|\["|\['/; 178 | 179 | const words = getWords(currentLine, position); 180 | if (words === "" || !splitRegex.test(words)) { 181 | return null; 182 | } 183 | 184 | const [obj, field] = words.split(splitRegex); 185 | if (!obj || !field) { 186 | // probably a spread operator 187 | return null; 188 | } 189 | 190 | return { obj, field }; 191 | } 192 | 193 | function getClickInfoByKeyword( 194 | document: TextDocument, 195 | currentLine: string, 196 | position: Position 197 | ): ClickInfo | null { 198 | const keyword = getKeyword(currentLine, position); 199 | if (!keyword) { 200 | return null; 201 | } 202 | 203 | const importModule = findImportModule(document.getText(), keyword.obj); 204 | const targetClass = keyword.field; 205 | return { 206 | importModule, 207 | targetClass, 208 | }; 209 | } 210 | 211 | function getClickInfo( 212 | document: TextDocument, 213 | currentLine: string, 214 | position: Position 215 | ): ClickInfo | null { 216 | const matches = genImportRegExp("(\\S+)").exec(currentLine); 217 | if (isImportLineMatch(currentLine, matches, position.character)) { 218 | return { 219 | importModule: matches[2], 220 | targetClass: "", 221 | }; 222 | } 223 | 224 | return getClickInfoByKeyword(document, currentLine, position); 225 | } 226 | 227 | export class CSSModuleDefinitionProvider implements DefinitionProvider { 228 | _camelCaseConfig: CamelCaseValues = false; 229 | pathAliasOptions: AliasFromUserOptions; 230 | 231 | constructor(options: ExtensionOptions) { 232 | this._camelCaseConfig = options.camelCase; 233 | this.pathAliasOptions = options.pathAlias; 234 | } 235 | 236 | public async provideDefinition( 237 | document: TextDocument, 238 | position: Position, 239 | token: CancellationToken 240 | ): Promise { 241 | const currentDir = path.dirname(document.uri.fsPath); 242 | const currentLine = getCurrentLine(document, position); 243 | 244 | const clickInfo = getClickInfo(document, currentLine, position); 245 | if (!clickInfo) { 246 | return Promise.resolve(null); 247 | } 248 | 249 | const importPath = await resolveImportPath( 250 | clickInfo.importModule, 251 | currentDir, 252 | await getRealPathAlias(this.pathAliasOptions, document) 253 | ); 254 | if (importPath === "") { 255 | return Promise.resolve(null); 256 | } 257 | 258 | let targetPosition: Position | null = null; 259 | if (clickInfo.targetClass) { 260 | targetPosition = getPosition( 261 | importPath, 262 | clickInfo.targetClass, 263 | this._camelCaseConfig 264 | ); 265 | } else { 266 | targetPosition = new Position(0, 0); 267 | } 268 | 269 | if (targetPosition === null) { 270 | return Promise.resolve(null); 271 | } else { 272 | return Promise.resolve( 273 | new Location(Uri.file(importPath), targetPosition) 274 | ); 275 | } 276 | } 277 | } 278 | 279 | export default CSSModuleDefinitionProvider; 280 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | export const EXT_NAME = "cssModules"; 2 | 3 | export const WORKSPACE_FOLDER_VARIABLE = "${workspaceFolder}"; 4 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | import { DocumentFilter, ExtensionContext, languages } from "vscode"; 3 | import { CSSModuleCompletionProvider } from "./CompletionProvider"; 4 | import { CSSModuleDefinitionProvider } from "./DefinitionProvider"; 5 | import { readOptions } from "./options"; 6 | import { subscribeToTsConfigChanges } from "./utils/ts-alias"; 7 | 8 | export function activate(context: ExtensionContext): void { 9 | const mode: DocumentFilter[] = [ 10 | { language: "typescriptreact", scheme: "file" }, 11 | { language: "javascriptreact", scheme: "file" }, 12 | { language: "javascript", scheme: "file" }, 13 | { language: "typescript", scheme: "file" }, 14 | { language: "astro", scheme: "file" }, 15 | ]; 16 | const options = readOptions(); 17 | context.subscriptions.push( 18 | languages.registerCompletionItemProvider( 19 | mode, 20 | new CSSModuleCompletionProvider(options), 21 | ".", 22 | "\"", 23 | "'" 24 | ) 25 | ); 26 | context.subscriptions.push( 27 | languages.registerDefinitionProvider( 28 | mode, 29 | new CSSModuleDefinitionProvider(options) 30 | ) 31 | ); 32 | 33 | /** 34 | * Subscribe to the ts config changes 35 | */ 36 | context.subscriptions.push(...subscribeToTsConfigChanges()); 37 | } 38 | 39 | export function deactivate(): void {} 40 | -------------------------------------------------------------------------------- /src/options.ts: -------------------------------------------------------------------------------- 1 | import { workspace } from "vscode"; 2 | import { EXT_NAME } from "./constants"; 3 | 4 | export type CamelCaseValues = false | true | "dashes"; 5 | export type AliasFromUserOptions = Record; 6 | export type AliasFromTsConfig = Record; 7 | export type PathAlias = AliasFromUserOptions | AliasFromTsConfig; 8 | 9 | export interface ExtensionOptions { 10 | camelCase: CamelCaseValues; 11 | pathAlias: AliasFromUserOptions; 12 | } 13 | 14 | export function readOptions(): ExtensionOptions { 15 | const configuration = workspace.getConfiguration(EXT_NAME); 16 | const camelCase = configuration.get("camelCase", false); 17 | const pathAlias = configuration.get("pathAlias", {}); 18 | 19 | return { 20 | camelCase, 21 | pathAlias, 22 | }; 23 | } 24 | -------------------------------------------------------------------------------- /src/path-alias.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | import { WORKSPACE_FOLDER_VARIABLE } from "./constants"; 3 | import { AliasFromUserOptions, PathAlias } from "./options"; 4 | import { getTsAlias } from "./utils/ts-alias"; 5 | 6 | function valueContainsWorkspaceFolder(value: string): boolean { 7 | return value.indexOf(WORKSPACE_FOLDER_VARIABLE) >= 0; 8 | } 9 | 10 | function filterWorkspaceFolderAlias(pathAlias: AliasFromUserOptions): AliasFromUserOptions { 11 | const newAlias: AliasFromUserOptions = {}; 12 | for (const key in pathAlias) { 13 | if (!valueContainsWorkspaceFolder(pathAlias[key])) { 14 | newAlias[key] = pathAlias[key]; 15 | } 16 | } 17 | return newAlias; 18 | } 19 | 20 | function replaceWorkspaceFolderWithRootPath( 21 | pathAlias: PathAlias, 22 | rootPath: string 23 | ): PathAlias { 24 | function replaceAlias(alias: string) { 25 | return alias.replace(WORKSPACE_FOLDER_VARIABLE, rootPath); 26 | } 27 | 28 | const newAlias: PathAlias = {}; 29 | for (const key in pathAlias) { 30 | const aliasValue = pathAlias[key]; 31 | newAlias[key] = Array.isArray(aliasValue) 32 | ? aliasValue.map(replaceAlias) 33 | : replaceAlias(aliasValue); 34 | } 35 | 36 | return newAlias; 37 | } 38 | 39 | export async function getRealPathAlias( 40 | pathAliasOptions: AliasFromUserOptions, 41 | doc: vscode.TextDocument 42 | ): Promise { 43 | const workspaceFolder = vscode.workspace.getWorkspaceFolder(doc.uri); 44 | if (workspaceFolder) { 45 | const tsAlias = await getTsAlias(workspaceFolder); 46 | // Alias from extension option has higher priority. 47 | const alias: PathAlias = Object.assign({}, tsAlias, pathAliasOptions); 48 | 49 | return replaceWorkspaceFolderWithRootPath(alias, workspaceFolder.uri.fsPath); 50 | } else { 51 | return filterWorkspaceFolderAlias(pathAliasOptions); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/test/constant.ts: -------------------------------------------------------------------------------- 1 | import * as path from "path"; 2 | 3 | export const ROOT_PATH = path.join(__dirname, "..", ".."); 4 | export const FIXTURES_PATH = path.join(ROOT_PATH, "src", "test", "fixtures"); 5 | 6 | export const SAMPLE_JSX_FILE = path.join(FIXTURES_PATH, "sample.jsx"); 7 | export const SAMPLE_JS_FILE = path.join(FIXTURES_PATH, "sample.js"); 8 | export const SAMPLE_TSX_FILE = path.join(FIXTURES_PATH, "sample.tsx"); 9 | export const SAMPLE_TS_FILE = path.join(FIXTURES_PATH, "sample.ts"); 10 | export const SAMPLE_ASTRO_FILE = path.join(FIXTURES_PATH, "sample.astro"); 11 | export const STYLUS_JSX_FILE = path.join(FIXTURES_PATH, "stylus.jsx"); 12 | export const JUMP_PRECISE_DEF_FILE = path.join(FIXTURES_PATH, "jumpDef.jsx"); 13 | export const SPREAD_SYNTAX_FILE = path.join(FIXTURES_PATH, "spread-syntax", "index.js"); 14 | -------------------------------------------------------------------------------- /src/test/fixtures/jumpDef.css: -------------------------------------------------------------------------------- 1 | .classnameSuffixOne { 2 | color: red; 3 | } 4 | .classnameSuffixTwo { 5 | color: black; 6 | } 7 | /** jump to here case-1 **/ 8 | .classname { 9 | color: yellow; 10 | } 11 | .left-case, 12 | .left_case, 13 | .leftA, 14 | .leftZ, 15 | .lefta, 16 | .leftz, 17 | .left0, 18 | .left9, 19 | /** jump to here case-2 **/ 20 | .left, 21 | .right { 22 | display: flex; 23 | align-items: center; 24 | } 25 | .classnameSuffix { 26 | color: yellow; 27 | } 28 | .class { 29 | color: beige; 30 | } 31 | -------------------------------------------------------------------------------- /src/test/fixtures/jumpDef.jsx: -------------------------------------------------------------------------------- 1 | import styles1 from "./jumpDef.css"; 2 | const styles2 = require("./jumpDef.css"); 3 | 4 | const Component = () => ( 5 |
6 | {data}@ 7 | 1 8 | 2 9 |
10 | ); 11 | 12 | export default Component; 13 | -------------------------------------------------------------------------------- /src/test/fixtures/sample.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import styles from './sample.css' 3 | 4 | interface ITheme { 5 | backgroundTheme: string; 6 | } 7 | 8 | const myTheme: ITheme = { 9 | backgroundTheme: styles.container 10 | } 11 | --- 12 | -------------------------------------------------------------------------------- /src/test/fixtures/sample.css: -------------------------------------------------------------------------------- 1 | .container {} 2 | .header {} 3 | .body {} 4 | .footer {} 5 | .sidebar_without-header { 6 | /** 7 | * Don't match .25rem as classname 8 | * this is a bad case more detail: 9 | * https://github.com/clinyong/vscode-css-modules/pull/46#issuecomment-903465231 10 | */ 11 | box-shadow: 0 0.06rem 0.25rem 0 rgba(0, 0, 0, 0.18); 12 | } 13 | -------------------------------------------------------------------------------- /src/test/fixtures/sample.js: -------------------------------------------------------------------------------- 1 | import styles from './sample.css' 2 | 3 | const myTheme = { 4 | backgroundTheme: styles.container 5 | } 6 | -------------------------------------------------------------------------------- /src/test/fixtures/sample.jsx: -------------------------------------------------------------------------------- 1 | import styles1 from "./sample.css"; 2 | const styles2 = require("./sample.css"); 3 | 4 | console.log(styles1.body); 5 | console.log(styles2.body); 6 | console.log(styles1.side); 7 | console.log(styles1.sidebarWithoutHeader); 8 | console.log(styles1.sidebar_withoutHeader); 9 | 10 | // issue-#22 11 | const v = {a: {}}; 12 | v?.a; // don't match anything 13 | styles1?. // support optional chain 14 | const es1 = {}; 15 | es1. // don't match styles1 16 | 17 | // Support autocompletion with bracket notation 18 | styles1[" 19 | styles1[' 20 | styles1[""] 21 | styles1[''] 22 | 23 | // issue-#70 24 | console.log(styles1["body"]); 25 | console.log(styles1['body']); 26 | -------------------------------------------------------------------------------- /src/test/fixtures/sample.ts: -------------------------------------------------------------------------------- 1 | import styles from './sample.css' 2 | 3 | interface ITheme { 4 | backgroundTheme: string; 5 | } 6 | 7 | const myTheme: ITheme = { 8 | backgroundTheme: styles.container 9 | } 10 | -------------------------------------------------------------------------------- /src/test/fixtures/sample.tsx: -------------------------------------------------------------------------------- 1 | import styles from './sample.css' 2 | 3 | interface ITheme { 4 | backgroundTheme: string; 5 | } 6 | 7 | const myTheme: ITheme = { 8 | backgroundTheme: styles.container 9 | } 10 | -------------------------------------------------------------------------------- /src/test/fixtures/spread-syntax/bar.js: -------------------------------------------------------------------------------- 1 | export function bar() { 2 | return { a: 1 } 3 | } 4 | -------------------------------------------------------------------------------- /src/test/fixtures/spread-syntax/index.js: -------------------------------------------------------------------------------- 1 | import { bar } from './bar' 2 | 3 | export function a() { 4 | return {...bar()}; 5 | } 6 | -------------------------------------------------------------------------------- /src/test/fixtures/stylus.jsx: -------------------------------------------------------------------------------- 1 | import styles1 from "./stylus.styl"; 2 | const styles2 = require("./stylus.stylus"); 3 | 4 | const Component = () => ( 5 |
6 | 1 7 | 1 8 | 2 9 | 2 10 | 2 11 |
12 | ); 13 | 14 | export default Component; 15 | -------------------------------------------------------------------------------- /src/test/fixtures/stylus.styl: -------------------------------------------------------------------------------- 1 | $nprogressColor ?= $accentColor 2 | 3 | #nprogress 4 | pointer-events none 5 | .bar 6 | background $nprogressColor 7 | position fixed 8 | z-index 1031 9 | 10 | // mix non-indent grammer 11 | .app { color: red; } 12 | 13 | // raw css 14 | @css { 15 | .main { 16 | color: blue; 17 | height: .5rem; 18 | width: 0.8rem; 19 | color: rgba(1,1,0, 0.34); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/test/fixtures/stylus.stylus: -------------------------------------------------------------------------------- 1 | .custom-block 2 | .custom-block-title 3 | font-weight 600 4 | margin-bottom -0.4rem 5 | &.tip, &.warning, &.danger 6 | padding .1rem 1.5rem 7 | border-left-width .5rem 8 | border-left-style solid 9 | margin 1rem 0 10 | -------------------------------------------------------------------------------- /src/test/runTest.ts: -------------------------------------------------------------------------------- 1 | import * as path from "path"; 2 | 3 | import { runTests } from "@vscode/test-electron"; 4 | 5 | async function main() { 6 | try { 7 | // The folder containing the Extension Manifest package.json 8 | // Passed to `--extensionDevelopmentPath` 9 | const extensionDevelopmentPath = path.resolve(__dirname, "../../"); 10 | 11 | // The path to test runner 12 | // Passed to --extensionTestsPath 13 | const extensionTestsPath = path.resolve(__dirname, "./suite/index"); 14 | 15 | // Download VS Code, unzip it and run the integration test 16 | await runTests({ extensionDevelopmentPath, extensionTestsPath }); 17 | } catch (err) { 18 | console.error("Failed to run tests"); 19 | process.exit(1); 20 | } 21 | } 22 | 23 | main(); 24 | -------------------------------------------------------------------------------- /src/test/suite/CompletionProvider.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from "assert"; 2 | import * as vscode from "vscode"; 3 | 4 | import { CSSModuleCompletionProvider } from "../../CompletionProvider"; 5 | import { CamelCaseValues } from "../../options"; 6 | import { 7 | SAMPLE_ASTRO_FILE, 8 | SAMPLE_JSX_FILE, 9 | SAMPLE_JS_FILE, 10 | SAMPLE_TSX_FILE, 11 | SAMPLE_TS_FILE, 12 | STYLUS_JSX_FILE, 13 | } from "../constant"; 14 | import { readOptions } from "../utils"; 15 | 16 | const uri = vscode.Uri.file(SAMPLE_JSX_FILE); 17 | const uri2 = vscode.Uri.file(STYLUS_JSX_FILE); 18 | const uri3 = vscode.Uri.file(SAMPLE_JS_FILE); 19 | const uri4 = vscode.Uri.file(SAMPLE_TSX_FILE); 20 | const uri5 = vscode.Uri.file(SAMPLE_TS_FILE); 21 | const uri6 = vscode.Uri.file(SAMPLE_ASTRO_FILE); 22 | 23 | function testCompletion( 24 | position: vscode.Position, 25 | itemCount: number, 26 | fixtureFile?: vscode.Uri 27 | ) { 28 | return vscode.workspace.openTextDocument(fixtureFile || uri).then((text) => { 29 | const provider = new CSSModuleCompletionProvider(readOptions()); 30 | return provider.provideCompletionItems(text, position).then((items) => { 31 | assert.strictEqual(itemCount, items.length); 32 | }); 33 | }); 34 | } 35 | 36 | function testCompletionWithCase( 37 | position: vscode.Position, 38 | camelCaseConfig: CamelCaseValues, 39 | assertions: Array 40 | ) { 41 | return vscode.workspace.openTextDocument(uri).then((text) => { 42 | const provider = new CSSModuleCompletionProvider( 43 | readOptions({ 44 | camelCase: camelCaseConfig, 45 | }) 46 | ); 47 | return provider.provideCompletionItems(text, position).then((items) => { 48 | assertions.map((assertion) => assertion(items)); 49 | }); 50 | }); 51 | } 52 | 53 | test("test es6 style completion", () => { 54 | const position = new vscode.Position(3, 20); 55 | return Promise.resolve(testCompletion(position, 5)).catch((err) => { 56 | assert.ok(false, `error in OpenTextDocument ${err}`); 57 | }); 58 | }); 59 | 60 | test("test commonJS style completion", () => { 61 | const position = new vscode.Position(4, 20); 62 | return Promise.resolve(testCompletion(position, 5)).catch((err) => { 63 | assert.ok(false, `error in OpenTextDocument ${err}`); 64 | }); 65 | }); 66 | 67 | test("test optional chain invalid match to fix issue #22", () => { 68 | const position = new vscode.Position(11, 4); 69 | return Promise.resolve(testCompletion(position, 0)).catch((err) => { 70 | assert.ok(false, `error in OpenTextDocument ${err}`); 71 | }); 72 | }); 73 | 74 | test("test optional chain valid match", () => { 75 | const position = new vscode.Position(12, 9); 76 | return Promise.resolve(testCompletion(position, 5)).catch((err) => { 77 | assert.ok(false, `error in OpenTextDocument ${err}`); 78 | }); 79 | }); 80 | 81 | test("test bracket notation with double quotes and no closing quote valid match", () => { 82 | const position = new vscode.Position(17, 9); 83 | return Promise.resolve(testCompletion(position, 5)).catch((err) => { 84 | assert.ok(false, `error in OpenTextDocument ${err}`); 85 | }); 86 | }); 87 | 88 | test("test bracket notation with single quotes and no closing quote valid match", () => { 89 | const position = new vscode.Position(18, 9); 90 | return Promise.resolve(testCompletion(position, 5)).catch((err) => { 91 | assert.ok(false, `error in OpenTextDocument ${err}`); 92 | }); 93 | }); 94 | 95 | test("test bracket notation with double quotes and closing quote valid match", () => { 96 | const position = new vscode.Position(19, 9); 97 | return Promise.resolve(testCompletion(position, 5)).catch((err) => { 98 | assert.ok(false, `error in OpenTextDocument ${err}`); 99 | }); 100 | }); 101 | 102 | test("test bracket notation with single quotes and closing quote valid match", () => { 103 | const position = new vscode.Position(20, 9); 104 | return Promise.resolve(testCompletion(position, 5)).catch((err) => { 105 | assert.ok(false, `error in OpenTextDocument ${err}`); 106 | }); 107 | }); 108 | 109 | test("test exact Match", () => { 110 | const position = new vscode.Position(14, 4); 111 | return Promise.resolve(testCompletion(position, 0)).catch((err) => { 112 | assert.ok(false, `error in OpenTextDocument ${err}`); 113 | }); 114 | }); 115 | 116 | test("test mix code style .styl completion", () => { 117 | const position = new vscode.Position(6, 29); 118 | return Promise.resolve(testCompletion(position, 3, uri2)).catch((err) => { 119 | assert.ok(false, `error in OpenTextDocument ${err}`); 120 | }); 121 | }); 122 | 123 | test("test .stylus extname stylus completion", () => { 124 | const position = new vscode.Position(8, 29); 125 | return Promise.resolve(testCompletion(position, 5, uri2)).catch((err) => { 126 | assert.ok(false, `error in OpenTextDocument ${err}`); 127 | }); 128 | }); 129 | 130 | test("test camelCase:false style completion", () => { 131 | const position = new vscode.Position(5, 21); 132 | return Promise.resolve( 133 | testCompletionWithCase(position, false, [ 134 | (items) => assert.strictEqual(1, items.length), 135 | (items) => assert.strictEqual("sidebar_without-header", items[0].label), 136 | ]) 137 | ).catch((err) => { 138 | assert.ok(false, `error in OpenTextDocument ${err}`); 139 | }); 140 | }); 141 | 142 | test("test camelCase:false style and kebab-case completion", () => { 143 | const position = new vscode.Position(5, 21); 144 | return Promise.resolve( 145 | testCompletionWithCase(position, false, [ 146 | (items) => assert.strictEqual(1, items.length), 147 | (items) => 148 | assert.strictEqual(`['sidebar_without-header']`, items[0].insertText), 149 | ]) 150 | ).catch((err) => { 151 | assert.ok(false, `error in OpenTextDocument ${err}`); 152 | }); 153 | }); 154 | 155 | test("test camelCase:true style completion", () => { 156 | const position = new vscode.Position(5, 21); 157 | return Promise.resolve( 158 | testCompletionWithCase(position, true, [ 159 | (items) => assert.strictEqual(1, items.length), 160 | (items) => assert.strictEqual("sidebarWithoutHeader", items[0].label), 161 | ]) 162 | ).catch((err) => { 163 | assert.ok(false, `error in OpenTextDocument ${err}`); 164 | }); 165 | }); 166 | 167 | test("test camelCase:dashes style completion", () => { 168 | const position = new vscode.Position(5, 21); 169 | return Promise.resolve( 170 | testCompletionWithCase(position, "dashes", [ 171 | (items) => assert.strictEqual(1, items.length), 172 | (items) => assert.strictEqual("sidebar_withoutHeader", items[0].label), 173 | ]) 174 | ).catch((err) => { 175 | assert.ok(false, `error in OpenTextDocument ${err}`); 176 | }); 177 | }); 178 | 179 | test("support jsx", () => { 180 | const position = new vscode.Position(3, 20); 181 | return Promise.resolve(testCompletion(position, 5, uri)).catch((err) => { 182 | assert.ok(false, `error in OpenTextDocument ${err}`); 183 | }); 184 | }); 185 | 186 | test("support js", () => { 187 | const position = new vscode.Position(3, 28); 188 | return Promise.resolve(testCompletion(position, 5, uri3)).catch((err) => { 189 | assert.ok(false, `error in OpenTextDocument ${err}`); 190 | }); 191 | }); 192 | 193 | test("support tsx", () => { 194 | const position = new vscode.Position(7, 28); 195 | return Promise.resolve(testCompletion(position, 5, uri4)).catch((err) => { 196 | assert.ok(false, `error in OpenTextDocument ${err}`); 197 | }); 198 | }); 199 | 200 | test("support ts", () => { 201 | const position = new vscode.Position(7, 28); 202 | return Promise.resolve(testCompletion(position, 5, uri5)).catch((err) => { 203 | assert.ok(false, `error in OpenTextDocument ${err}`); 204 | }); 205 | }); 206 | 207 | test("support astro", () => { 208 | const position = new vscode.Position(8, 28); 209 | return Promise.resolve(testCompletion(position, 5, uri6)).catch((err) => { 210 | assert.ok(false, `error in OpenTextDocument ${err}`); 211 | }); 212 | }); 213 | -------------------------------------------------------------------------------- /src/test/suite/DefinitionProvider.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from "assert"; 2 | import * as vscode from "vscode"; 3 | 4 | import { CSSModuleDefinitionProvider } from "../../DefinitionProvider"; 5 | import { CamelCaseValues } from "../../options"; 6 | import { 7 | JUMP_PRECISE_DEF_FILE, 8 | SAMPLE_JSX_FILE, 9 | SPREAD_SYNTAX_FILE, 10 | STYLUS_JSX_FILE, 11 | } from "../constant"; 12 | import { readOptions } from "../utils"; 13 | 14 | const uri = vscode.Uri.file(SAMPLE_JSX_FILE); 15 | const uri2 = vscode.Uri.file(JUMP_PRECISE_DEF_FILE); 16 | const uri3 = vscode.Uri.file(STYLUS_JSX_FILE); 17 | 18 | function getDefinitionLineAndChar( 19 | position: vscode.Position, 20 | fixtureFile?: vscode.Uri 21 | ) { 22 | return vscode.workspace.openTextDocument(fixtureFile || uri).then((text) => { 23 | const provider = new CSSModuleDefinitionProvider(readOptions()); 24 | return provider 25 | .provideDefinition(text, position, undefined) 26 | .then((location) => { 27 | if (!location) return null; 28 | 29 | const { line, character } = location.range.start; 30 | return { 31 | line, 32 | character, 33 | }; 34 | }); 35 | }); 36 | } 37 | 38 | async function testDefinition( 39 | position: vscode.Position, 40 | lineNum: number, 41 | characterNum: number, 42 | fixtureFile?: vscode.Uri 43 | ) { 44 | const result = await getDefinitionLineAndChar(position, fixtureFile); 45 | assert.strictEqual( 46 | true, 47 | result.line === lineNum && result.character === characterNum 48 | ); 49 | } 50 | 51 | function testDefinitionWithCase( 52 | position: vscode.Position, 53 | camelCaseConfig: CamelCaseValues, 54 | assertions: Array 55 | ) { 56 | return vscode.workspace.openTextDocument(uri).then((text) => { 57 | const provider = new CSSModuleDefinitionProvider( 58 | readOptions({ 59 | camelCase: camelCaseConfig, 60 | }) 61 | ); 62 | return provider 63 | .provideDefinition(text, position, undefined) 64 | .then((location) => { 65 | const position = location ? location.range.start : null; 66 | assertions.map((assertion) => assertion(position)); 67 | }); 68 | }); 69 | } 70 | 71 | test("testing es6 style definition", () => { 72 | const position = new vscode.Position(3, 21); 73 | return Promise.resolve(testDefinition(position, 2, 1)).catch((err) => 74 | assert.ok(true, `error in OpenTextDocument ${err}`) 75 | ); 76 | }); 77 | 78 | test("testing commonJS style definition", () => { 79 | const position = new vscode.Position(4, 21); 80 | return Promise.resolve(testDefinition(position, 2, 1)).catch((err) => 81 | assert.ok(false, `error in OpenTextDocument ${err}`) 82 | ); 83 | }); 84 | 85 | test("testing es6 style jump to precise definition", () => { 86 | const position = new vscode.Position(4, 31); 87 | return Promise.resolve(testDefinition(position, 7, 1, uri2)).catch((err) => 88 | assert.ok(false, `error in OpenTextDocument ${err}`) 89 | ); 90 | }); 91 | 92 | test("testing commonJS style jump to precise definition", () => { 93 | const position = new vscode.Position(5, 36); 94 | return Promise.resolve(testDefinition(position, 7, 1, uri2)).catch((err) => 95 | assert.ok(false, `error in OpenTextDocument ${err}`) 96 | ); 97 | }); 98 | 99 | test("testing es6 style jump to precise definition case2", () => { 100 | const position = new vscode.Position(6, 32); 101 | return Promise.resolve(testDefinition(position, 19, 1, uri2)).catch((err) => 102 | assert.ok(false, `error in OpenTextDocument ${err}`) 103 | ); 104 | }); 105 | 106 | test("testing commonJS style jump to precise definition case2", () => { 107 | const position = new vscode.Position(7, 32); 108 | return Promise.resolve(testDefinition(position, 19, 1, uri2)).catch((err) => 109 | assert.ok(false, `error in OpenTextDocument ${err}`) 110 | ); 111 | }); 112 | 113 | test("testing stylus @css jump to definition", () => { 114 | const position = new vscode.Position(5, 31); 115 | return Promise.resolve(testDefinition(position, 14, 3, uri3)).catch((err) => 116 | assert.ok(false, `error in OpenTextDocument ${err}`) 117 | ); 118 | }); 119 | 120 | test("testing stylus indent classname jump to definition", () => { 121 | const position = new vscode.Position(6, 31); 122 | return Promise.resolve(testDefinition(position, 4, 3, uri3)).catch((err) => 123 | assert.ok(false, `error in OpenTextDocument ${err}`) 124 | ); 125 | }); 126 | 127 | test("testing stylus CSS-like syntax classname jump to definition", () => { 128 | const position = new vscode.Position(4, 29); 129 | return Promise.resolve(testDefinition(position, 10, 1, uri3)).catch((err) => 130 | assert.ok(false, `error in OpenTextDocument ${err}`) 131 | ); 132 | }); 133 | 134 | test("testing stylus nest classname jump to definition", () => { 135 | const position = new vscode.Position(7, 31); 136 | return Promise.resolve(testDefinition(position, 4, 4, uri3)).catch((err) => 137 | assert.ok(false, `error in OpenTextDocument ${err}`) 138 | ); 139 | }); 140 | 141 | test("test camelCase:false style definition", () => { 142 | const position = new vscode.Position(6, 21); 143 | return Promise.resolve( 144 | testDefinitionWithCase(position, false, [ 145 | (position?: vscode.Position) => assert.equal(true, position === null), 146 | ]) 147 | ).catch((err) => assert.ok(false, `error in OpenTextDocument ${err}`)); 148 | }); 149 | 150 | test("test camelCase:true style completion", () => { 151 | const position = new vscode.Position(6, 21); 152 | return Promise.resolve( 153 | testDefinitionWithCase(position, true, [ 154 | (position?: vscode.Position) => 155 | assert.strictEqual( 156 | true, 157 | position.line === 4 && position.character === 1 158 | ), 159 | ]) 160 | ).catch((err) => assert.ok(false, `error in OpenTextDocument ${err}`)); 161 | }); 162 | 163 | test("test camelCase:dashes style completion", () => { 164 | const position = new vscode.Position(7, 21); 165 | return Promise.resolve( 166 | testDefinitionWithCase(position, "dashes", [ 167 | (position?: vscode.Position) => 168 | assert.strictEqual( 169 | true, 170 | position.line === 4 && position.character === 1 171 | ), 172 | ]) 173 | ).catch((err) => assert.ok(false, `error in OpenTextDocument ${err}`)); 174 | }); 175 | 176 | test("ignore spread syntax", async () => { 177 | const position = new vscode.Position(3, 15); 178 | const result = await getDefinitionLineAndChar( 179 | position, 180 | vscode.Uri.file(SPREAD_SYNTAX_FILE) 181 | ); 182 | assert.deepStrictEqual(result, null); 183 | }); 184 | 185 | test("test bracket definition with double quotes jump to definition", () => { 186 | const position = new vscode.Position(23, 22); 187 | return Promise.resolve(testDefinition(position, 2, 1)).catch((err) => 188 | assert.ok(false, `error in OpenTextDocument ${err}`) 189 | ); 190 | }); 191 | 192 | test("test bracket definition with single quotes jump to definition", () => { 193 | const position = new vscode.Position(24, 22); 194 | return Promise.resolve(testDefinition(position, 2, 1)).catch((err) => 195 | assert.ok(false, `error in OpenTextDocument ${err}`) 196 | ); 197 | }); 198 | -------------------------------------------------------------------------------- /src/test/suite/index.ts: -------------------------------------------------------------------------------- 1 | import * as path from "path"; 2 | import * as Mocha from "mocha"; 3 | import * as glob from "glob"; 4 | 5 | export function run(): Promise { 6 | // Create the mocha test 7 | const mocha = new Mocha({ 8 | ui: "tdd", 9 | color: true, 10 | }); 11 | 12 | const testsRoot = path.resolve(__dirname, ".."); 13 | 14 | return new Promise((c, e) => { 15 | glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { 16 | if (err) { 17 | return e(err); 18 | } 19 | 20 | // Add files to the test suite 21 | files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); 22 | 23 | try { 24 | // Run the mocha test 25 | mocha.run((failures) => { 26 | if (failures > 0) { 27 | e(new Error(`${failures} tests failed.`)); 28 | } else { 29 | c(); 30 | } 31 | }); 32 | } catch (err) { 33 | console.error(err); 34 | e(err); 35 | } 36 | }); 37 | }); 38 | } 39 | -------------------------------------------------------------------------------- /src/test/suite/ts-alias.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from "assert"; 2 | import { WORKSPACE_FOLDER_VARIABLE } from "../../constants"; 3 | import { 4 | _removePathsSign, 5 | _getAliasFromTsConfigPaths, 6 | } from "../../utils/ts-alias"; 7 | import * as path from "path"; 8 | 9 | test("_removePathsSign: only key has sign", () => { 10 | assert.deepStrictEqual( 11 | _removePathsSign({ 12 | "styles/*": ["styles"], 13 | }), 14 | { 15 | "styles/": ["styles"], 16 | } 17 | ); 18 | }); 19 | 20 | test("_removePathsSign: only value has sign", () => { 21 | console.log("ok...."); 22 | 23 | assert.deepStrictEqual( 24 | _removePathsSign({ 25 | styles: ["styles/*"], 26 | }), 27 | { 28 | styles: ["styles/"], 29 | } 30 | ); 31 | }); 32 | 33 | test("_removePathsSign: Both has sign", () => { 34 | assert.deepStrictEqual( 35 | _removePathsSign({ 36 | "styles/*": ["styles/*"], 37 | }), 38 | { 39 | "styles/": ["styles/"], 40 | } 41 | ); 42 | }); 43 | 44 | test("_getAliasFromTsConfigPaths: baseUrl is workspace root", () => { 45 | assert.deepStrictEqual( 46 | _getAliasFromTsConfigPaths({ 47 | compilerOptions: { 48 | baseUrl: ".", 49 | paths: { 50 | styles: ["styles"], 51 | }, 52 | }, 53 | }), 54 | { 55 | styles: [path.join(WORKSPACE_FOLDER_VARIABLE, "styles")], 56 | } 57 | ); 58 | }); 59 | 60 | test("_getAliasFromTsConfigPaths: baseUrl is sub folder", () => { 61 | assert.deepStrictEqual( 62 | _getAliasFromTsConfigPaths({ 63 | compilerOptions: { 64 | baseUrl: "src", 65 | paths: { 66 | styles: ["styles"], 67 | }, 68 | }, 69 | }), 70 | { 71 | styles: [path.join(WORKSPACE_FOLDER_VARIABLE, "src", "styles")], 72 | } 73 | ); 74 | }); 75 | 76 | test("_getAliasFromTsConfigPaths: baseUrl is sub folder with prefix", () => { 77 | assert.deepStrictEqual( 78 | _getAliasFromTsConfigPaths({ 79 | compilerOptions: { 80 | baseUrl: "./src", 81 | paths: { 82 | styles: ["styles"], 83 | }, 84 | }, 85 | }), 86 | { 87 | styles: [path.join(WORKSPACE_FOLDER_VARIABLE, "src", "styles")], 88 | } 89 | ); 90 | }); 91 | 92 | test("_getAliasFromTsConfigPaths: only baseUrl is empty", () => { 93 | assert.deepStrictEqual( 94 | _getAliasFromTsConfigPaths({ 95 | compilerOptions: { 96 | paths: { 97 | styles: ["styles"], 98 | }, 99 | } as any, 100 | }), 101 | null 102 | ); 103 | }); 104 | 105 | test("_getAliasFromTsConfigPaths: only paths is empty", () => { 106 | assert.deepStrictEqual( 107 | _getAliasFromTsConfigPaths({ 108 | compilerOptions: { 109 | baseUrl: "./src", 110 | } as any, 111 | }), 112 | null 113 | ); 114 | }); 115 | 116 | test("_getAliasFromTsConfigPaths: both baseUrl and paths are empty", () => { 117 | assert.deepStrictEqual( 118 | _getAliasFromTsConfigPaths({ 119 | compilerOptions: {} as any, 120 | }), 121 | null 122 | ); 123 | }); 124 | 125 | test("_getAliasFromTsConfigPaths: path has trailing slash", () => { 126 | assert.deepStrictEqual( 127 | _getAliasFromTsConfigPaths({ 128 | compilerOptions: { 129 | baseUrl: ".", 130 | paths: { 131 | styles: ["styles/*"], 132 | }, 133 | }, 134 | }), 135 | { 136 | styles: [path.join(WORKSPACE_FOLDER_VARIABLE, "styles")], 137 | } 138 | ); 139 | }); 140 | 141 | test("_getAliasFromTsConfigPaths: path without slash", () => { 142 | assert.deepStrictEqual( 143 | _getAliasFromTsConfigPaths({ 144 | compilerOptions: { 145 | baseUrl: ".", 146 | paths: { 147 | styles: ["styles"], 148 | }, 149 | }, 150 | }), 151 | { 152 | styles: [path.join(WORKSPACE_FOLDER_VARIABLE, "styles")], 153 | } 154 | ); 155 | }); 156 | -------------------------------------------------------------------------------- /src/test/utils.ts: -------------------------------------------------------------------------------- 1 | import { ExtensionOptions } from "../options"; 2 | 3 | export function readOptions( 4 | overrides: Partial = {} 5 | ): ExtensionOptions { 6 | return Object.assign( 7 | {}, 8 | { 9 | camelCase: false, 10 | pathAlias: {}, 11 | }, 12 | overrides 13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | import { Position, TextDocument, CompletionItem, CompletionItemKind, TextEdit, Range } from "vscode"; 2 | import * as fse from "fs-extra"; 3 | import * as _ from "lodash"; 4 | 5 | export function getCurrentLine( 6 | document: TextDocument, 7 | position: Position 8 | ): string { 9 | return document.getText(document.lineAt(position).range); 10 | } 11 | 12 | /** 13 | * @TODO Refact by new Tokenizer 14 | */ 15 | export async function getAllClassNames(filePath: string, keyword: string): Promise { 16 | // check file exists, if not just return [] 17 | const filePathStat = await fse.stat(filePath); 18 | if (!filePathStat.isFile()) { 19 | return []; 20 | } 21 | 22 | const content = await fse.readFile(filePath, { encoding: "utf8" }); 23 | let matchLineRegexp = /.*[,{]/g; 24 | 25 | // experimental stylus support 26 | if (filePath.endsWith(".styl") ||filePath.endsWith(".stylus")) { 27 | matchLineRegexp = /\..*/g 28 | } 29 | const lines = content.match(matchLineRegexp); 30 | if (lines === null) { 31 | return []; 32 | } 33 | 34 | const classNames = lines.join(" ").match(/\.[_A-Za-z0-9-]+/g); 35 | if (classNames === null) { 36 | return []; 37 | } 38 | 39 | const uniqNames = _.uniq(classNames).map((item) => item.slice(1)).filter((item) => !/^[0-9]/.test(item)); 40 | return keyword !== "" 41 | ? uniqNames.filter((item) => item.indexOf(keyword) !== -1) 42 | : uniqNames; 43 | } 44 | 45 | // from css-loader's implementation 46 | // source: https://github.com/webpack-contrib/css-loader/blob/22f6621a175e858bb604f5ea19f9860982305f16/lib/compile-exports.js 47 | export function dashesCamelCase(str: string): string { 48 | return str.replace(/-(\w)/g, function (match, firstLetter) { 49 | return firstLetter.toUpperCase(); 50 | }); 51 | } 52 | 53 | /** 54 | * check kebab-case classname 55 | */ 56 | export function isKebabCaseClassName (className: string): boolean { 57 | return className?.includes('-'); 58 | } 59 | 60 | /** 61 | * BracketCompletionItem Factory 62 | */ 63 | export function createBracketCompletionItem (className: string, position: Position): CompletionItem { 64 | const completionItem = new CompletionItem(className, CompletionItemKind.Variable); 65 | completionItem.detail = `['${className}']`; 66 | completionItem.documentation = "kebab-casing may cause unexpected behavior when trying to access style.class-name as a dot notation. You can still work around kebab-case with bracket notation (eg. style['class-name']) but style.className is cleaner."; 67 | completionItem.insertText = `['${className}']`; 68 | completionItem.additionalTextEdits = [new TextEdit(new Range(new Position(position.line, position.character - 1), 69 | new Position(position.line, position.character)), '')]; 70 | return completionItem; 71 | } 72 | -------------------------------------------------------------------------------- /src/utils/path.ts: -------------------------------------------------------------------------------- 1 | import * as path from "path"; 2 | import * as fse from "fs-extra"; 3 | import { PathAlias } from "../options"; 4 | 5 | function isPathExist(p: string): Promise { 6 | return ( 7 | fse 8 | .pathExists(p) 9 | // ignore error 10 | .catch(() => false) 11 | ); 12 | } 13 | 14 | export function genImportRegExp(key: string): RegExp { 15 | const file = "(.+\\.(\\S{1,2}ss|stylus|styl))"; 16 | const fromOrRequire = "(?:from\\s+|=\\s+require(?:)?\\()"; 17 | const requireEndOptional = "\\)?"; 18 | const pattern = `\\s${key}\\s+${fromOrRequire}["']${file}["']${requireEndOptional}`; 19 | return new RegExp(pattern); 20 | } 21 | 22 | async function resolveAliasPath( 23 | moduleName: string, 24 | aliasPrefix: string, 25 | aliasPath: string | string[] 26 | ): Promise { 27 | const prefix = aliasPrefix.endsWith("/") ? aliasPrefix : aliasPrefix + "/"; 28 | const replacedModuleName = moduleName.replace(prefix, ""); 29 | 30 | const paths = typeof aliasPath === "string" ? [aliasPath] : aliasPath; 31 | for (let i = 0; i < paths.length; i++) { 32 | const targetPath = path.resolve(paths[i], replacedModuleName); 33 | if (await isPathExist(targetPath)) { 34 | return targetPath; 35 | } 36 | } 37 | 38 | return ""; 39 | } 40 | 41 | export async function resolveImportPath( 42 | moduleName: string, 43 | currentDirPath: string, 44 | pathAlias: PathAlias 45 | ): Promise { 46 | const realPath = path.resolve(currentDirPath, moduleName); 47 | if (await isPathExist(realPath)) { 48 | return realPath; 49 | } 50 | 51 | const aliasPrefix = Object.keys(pathAlias).find((prefix) => 52 | moduleName.startsWith(prefix) 53 | ); 54 | if (aliasPrefix) { 55 | const aliasPath = pathAlias[aliasPrefix]; 56 | return resolveAliasPath(moduleName, aliasPrefix, aliasPath); 57 | } 58 | 59 | return ""; 60 | } 61 | 62 | export function findImportModule(text: string, key: string): string { 63 | const re = genImportRegExp(key); 64 | const results = re.exec(text); 65 | if (!!results && results.length > 0) { 66 | return results[1]; 67 | } else { 68 | return ""; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/utils/ts-alias.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | import * as path from "path"; 3 | import * as JSON5 from "json5"; 4 | import * as _ from "lodash"; 5 | import * as fse from "fs-extra"; 6 | import { AliasFromTsConfig } from "../options"; 7 | import { WORKSPACE_FOLDER_VARIABLE } from "../constants"; 8 | 9 | type TsConfigPaths = Record; 10 | const cachedMappings = new Map(); 11 | 12 | function memoize( 13 | fn: (workfolder: vscode.WorkspaceFolder) => Promise 14 | ) { 15 | async function cachedFunction( 16 | workfolder?: vscode.WorkspaceFolder 17 | ): Promise { 18 | if (!workfolder) { 19 | return Promise.resolve({}); 20 | } 21 | 22 | const key = workfolder.name; 23 | const cachedMapping = cachedMappings.get(key); 24 | 25 | if (cachedMapping) { 26 | return cachedMapping; 27 | } else { 28 | const result = await fn(workfolder); 29 | cachedMappings.set(key, result); 30 | return result; 31 | } 32 | } 33 | 34 | return cachedFunction; 35 | } 36 | 37 | function invalidateCache(workfolder: vscode.WorkspaceFolder) { 38 | cachedMappings.delete(workfolder.name); 39 | } 40 | 41 | export function _removePathsSign(paths: TsConfigPaths): TsConfigPaths { 42 | const formatPaths: TsConfigPaths = {}; 43 | function removeEndSign(str: string) { 44 | return str.endsWith("*") ? str.slice(0, str.length - 1) : str; 45 | } 46 | 47 | Object.keys(paths).forEach((k) => { 48 | formatPaths[removeEndSign(k)] = paths[k].map(removeEndSign); 49 | }); 50 | 51 | return formatPaths; 52 | } 53 | 54 | export function _getAliasFromTsConfigPaths(tsconfig: { 55 | compilerOptions: { 56 | baseUrl: string; 57 | paths: TsConfigPaths; 58 | }; 59 | }): AliasFromTsConfig | null { 60 | function removeTrailingSlash(str: string) { 61 | return str.endsWith("/") ? str.slice(0, str.length - 1) : str; 62 | } 63 | function joinPath(p: string) { 64 | return path.join(WORKSPACE_FOLDER_VARIABLE, baseUrl, removeTrailingSlash(p)); 65 | } 66 | 67 | let paths = tsconfig?.compilerOptions?.paths; 68 | const baseUrl = tsconfig?.compilerOptions?.baseUrl; 69 | if (!baseUrl || _.isEmpty(paths)) { 70 | return null; 71 | } 72 | 73 | paths = _removePathsSign(paths); 74 | const pathAlias: AliasFromTsConfig = {}; 75 | Object.keys(paths).forEach((k) => { 76 | pathAlias[removeTrailingSlash(k)] = paths[k].map(joinPath); 77 | }); 78 | 79 | return pathAlias; 80 | } 81 | 82 | export const getTsAlias = memoize(async function ( 83 | workfolder: vscode.WorkspaceFolder 84 | ): Promise { 85 | const include = new vscode.RelativePattern(workfolder, "[tj]sconfig.json"); 86 | const exclude = new vscode.RelativePattern(workfolder, "**/node_modules/**"); 87 | const files = await vscode.workspace.findFiles(include, exclude); 88 | 89 | let mapping: AliasFromTsConfig = {}; 90 | for (let i = 0; i < files.length; i++) { 91 | try { 92 | const fileContent = await fse.readFile(files[i].fsPath, "utf8"); 93 | const configFile = JSON5.parse(fileContent); 94 | const aliasFromPaths = _getAliasFromTsConfigPaths(configFile); 95 | if (aliasFromPaths) { 96 | mapping = Object.assign({}, mapping, aliasFromPaths); 97 | } 98 | } catch (e) { 99 | console.error(e); 100 | } 101 | } 102 | 103 | return mapping; 104 | }); 105 | 106 | export function subscribeToTsConfigChanges(): vscode.Disposable[] { 107 | const disposables: vscode.Disposable[] = []; 108 | for (const workfolder of vscode.workspace.workspaceFolders || []) { 109 | const pattern = new vscode.RelativePattern(workfolder, "[tj]sconfig.json"); 110 | const fileWatcher = vscode.workspace.createFileSystemWatcher(pattern); 111 | fileWatcher.onDidChange(() => invalidateCache(workfolder)); 112 | disposables.push(fileWatcher); 113 | } 114 | return disposables; 115 | } 116 | -------------------------------------------------------------------------------- /tools/checkTS: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | files=$(git diff --cached --name-only --diff-filter=ACM | grep -E "\.tsx?$") 4 | if [ "$files" = "" ]; then 5 | exit 0 6 | fi 7 | 8 | pass=true 9 | 10 | for file in ${files}; do 11 | result=$(./node_modules/.bin/tslint ${file}) 12 | if [[ $result != "" ]]; then 13 | pass=false 14 | echo $result 15 | fi 16 | done 17 | 18 | if ! $pass; then 19 | echo "\033[91mCOMMIT FAILED:\033[0m Your commit contains files that should pass TSLint but do not. Please fix the TSLint errors and try again." 20 | exit 1 21 | fi 22 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "lib": [ 7 | "es6" 8 | ], 9 | "sourceMap": true, 10 | "rootDir": "src", 11 | "strict": false /* enable all strict type-checking options */ 12 | /* Additional Checks */ 13 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 14 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 15 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 16 | }, 17 | "exclude": [ 18 | "node_modules", 19 | ".vscode-test", 20 | "out", 21 | "src/test/fixtures" // #85 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@7.12.11": 6 | version "7.12.11" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" 8 | integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== 9 | dependencies: 10 | "@babel/highlight" "^7.10.4" 11 | 12 | "@babel/helper-validator-identifier@^7.25.9": 13 | version "7.25.9" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" 15 | integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== 16 | 17 | "@babel/highlight@^7.10.4": 18 | version "7.25.9" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.9.tgz#8141ce68fc73757946f983b343f1231f4691acc6" 20 | integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.25.9" 23 | chalk "^2.4.2" 24 | js-tokens "^4.0.0" 25 | picocolors "^1.0.0" 26 | 27 | "@eslint/eslintrc@^0.4.3": 28 | version "0.4.3" 29 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" 30 | integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== 31 | dependencies: 32 | ajv "^6.12.4" 33 | debug "^4.1.1" 34 | espree "^7.3.0" 35 | globals "^13.9.0" 36 | ignore "^4.0.6" 37 | import-fresh "^3.2.1" 38 | js-yaml "^3.13.1" 39 | minimatch "^3.0.4" 40 | strip-json-comments "^3.1.1" 41 | 42 | "@humanwhocodes/config-array@^0.5.0": 43 | version "0.5.0" 44 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" 45 | integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== 46 | dependencies: 47 | "@humanwhocodes/object-schema" "^1.2.0" 48 | debug "^4.1.1" 49 | minimatch "^3.0.4" 50 | 51 | "@humanwhocodes/object-schema@^1.2.0": 52 | version "1.2.1" 53 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 54 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 55 | 56 | "@nodelib/fs.scandir@2.1.5": 57 | version "2.1.5" 58 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 59 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 60 | dependencies: 61 | "@nodelib/fs.stat" "2.0.5" 62 | run-parallel "^1.1.9" 63 | 64 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 65 | version "2.0.5" 66 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 67 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 68 | 69 | "@nodelib/fs.walk@^1.2.3": 70 | version "1.2.8" 71 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 72 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 73 | dependencies: 74 | "@nodelib/fs.scandir" "2.1.5" 75 | fastq "^1.6.0" 76 | 77 | "@types/fs-extra@^9.0.11": 78 | version "9.0.13" 79 | resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" 80 | integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== 81 | dependencies: 82 | "@types/node" "*" 83 | 84 | "@types/glob@^7.1.3": 85 | version "7.2.0" 86 | resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" 87 | integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== 88 | dependencies: 89 | "@types/minimatch" "*" 90 | "@types/node" "*" 91 | 92 | "@types/json-schema@^7.0.7": 93 | version "7.0.15" 94 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" 95 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== 96 | 97 | "@types/minimatch@*": 98 | version "5.1.2" 99 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" 100 | integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== 101 | 102 | "@types/mocha@^8.2.2": 103 | version "8.2.3" 104 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" 105 | integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== 106 | 107 | "@types/node@*": 108 | version "22.10.2" 109 | resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9" 110 | integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== 111 | dependencies: 112 | undici-types "~6.20.0" 113 | 114 | "@types/node@14.x": 115 | version "14.18.63" 116 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.63.tgz#1788fa8da838dbb5f9ea994b834278205db6ca2b" 117 | integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ== 118 | 119 | "@types/vscode@^1.56.0": 120 | version "1.96.0" 121 | resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.96.0.tgz#3181004bf25d71677ae4aacdd7605a3fd7edf08e" 122 | integrity sha512-qvZbSZo+K4ZYmmDuaodMbAa67Pl6VDQzLKFka6rq+3WUTY4Kro7Bwoi0CuZLO/wema0ygcmpwow7zZfPJTs5jg== 123 | 124 | "@typescript-eslint/eslint-plugin@^4.26.0": 125 | version "4.33.0" 126 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" 127 | integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== 128 | dependencies: 129 | "@typescript-eslint/experimental-utils" "4.33.0" 130 | "@typescript-eslint/scope-manager" "4.33.0" 131 | debug "^4.3.1" 132 | functional-red-black-tree "^1.0.1" 133 | ignore "^5.1.8" 134 | regexpp "^3.1.0" 135 | semver "^7.3.5" 136 | tsutils "^3.21.0" 137 | 138 | "@typescript-eslint/experimental-utils@4.33.0": 139 | version "4.33.0" 140 | resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" 141 | integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== 142 | dependencies: 143 | "@types/json-schema" "^7.0.7" 144 | "@typescript-eslint/scope-manager" "4.33.0" 145 | "@typescript-eslint/types" "4.33.0" 146 | "@typescript-eslint/typescript-estree" "4.33.0" 147 | eslint-scope "^5.1.1" 148 | eslint-utils "^3.0.0" 149 | 150 | "@typescript-eslint/parser@^4.26.0": 151 | version "4.33.0" 152 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" 153 | integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== 154 | dependencies: 155 | "@typescript-eslint/scope-manager" "4.33.0" 156 | "@typescript-eslint/types" "4.33.0" 157 | "@typescript-eslint/typescript-estree" "4.33.0" 158 | debug "^4.3.1" 159 | 160 | "@typescript-eslint/scope-manager@4.33.0": 161 | version "4.33.0" 162 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" 163 | integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== 164 | dependencies: 165 | "@typescript-eslint/types" "4.33.0" 166 | "@typescript-eslint/visitor-keys" "4.33.0" 167 | 168 | "@typescript-eslint/types@4.33.0": 169 | version "4.33.0" 170 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" 171 | integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== 172 | 173 | "@typescript-eslint/typescript-estree@4.33.0": 174 | version "4.33.0" 175 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" 176 | integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== 177 | dependencies: 178 | "@typescript-eslint/types" "4.33.0" 179 | "@typescript-eslint/visitor-keys" "4.33.0" 180 | debug "^4.3.1" 181 | globby "^11.0.3" 182 | is-glob "^4.0.1" 183 | semver "^7.3.5" 184 | tsutils "^3.21.0" 185 | 186 | "@typescript-eslint/visitor-keys@4.33.0": 187 | version "4.33.0" 188 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" 189 | integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== 190 | dependencies: 191 | "@typescript-eslint/types" "4.33.0" 192 | eslint-visitor-keys "^2.0.0" 193 | 194 | "@ungap/promise-all-settled@1.1.2": 195 | version "1.1.2" 196 | resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" 197 | integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== 198 | 199 | "@vscode/test-electron@^2.3.0": 200 | version "2.4.1" 201 | resolved "https://registry.yarnpkg.com/@vscode/test-electron/-/test-electron-2.4.1.tgz#5c2760640bf692efbdaa18bafcd35fb519688941" 202 | integrity sha512-Gc6EdaLANdktQ1t+zozoBVRynfIsMKMc94Svu1QreOBC8y76x4tvaK32TljrLi1LI2+PK58sDVbL7ALdqf3VRQ== 203 | dependencies: 204 | http-proxy-agent "^7.0.2" 205 | https-proxy-agent "^7.0.5" 206 | jszip "^3.10.1" 207 | ora "^7.0.1" 208 | semver "^7.6.2" 209 | 210 | acorn-jsx@^5.3.1: 211 | version "5.3.2" 212 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 213 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 214 | 215 | acorn@^7.4.0: 216 | version "7.4.1" 217 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 218 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 219 | 220 | agent-base@^7.1.0, agent-base@^7.1.2: 221 | version "7.1.3" 222 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" 223 | integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== 224 | 225 | ajv@^6.10.0, ajv@^6.12.4: 226 | version "6.12.6" 227 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 228 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 229 | dependencies: 230 | fast-deep-equal "^3.1.1" 231 | fast-json-stable-stringify "^2.0.0" 232 | json-schema-traverse "^0.4.1" 233 | uri-js "^4.2.2" 234 | 235 | ajv@^8.0.1: 236 | version "8.17.1" 237 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" 238 | integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== 239 | dependencies: 240 | fast-deep-equal "^3.1.3" 241 | fast-uri "^3.0.1" 242 | json-schema-traverse "^1.0.0" 243 | require-from-string "^2.0.2" 244 | 245 | ansi-colors@4.1.1: 246 | version "4.1.1" 247 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 248 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 249 | 250 | ansi-colors@^4.1.1: 251 | version "4.1.3" 252 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" 253 | integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== 254 | 255 | ansi-escapes@^7.0.0: 256 | version "7.0.0" 257 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" 258 | integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== 259 | dependencies: 260 | environment "^1.0.0" 261 | 262 | ansi-regex@^3.0.0: 263 | version "3.0.1" 264 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" 265 | integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== 266 | 267 | ansi-regex@^5.0.1: 268 | version "5.0.1" 269 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 270 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 271 | 272 | ansi-regex@^6.0.1: 273 | version "6.1.0" 274 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" 275 | integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== 276 | 277 | ansi-styles@^3.2.1: 278 | version "3.2.1" 279 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 280 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 281 | dependencies: 282 | color-convert "^1.9.0" 283 | 284 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 285 | version "4.3.0" 286 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 287 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 288 | dependencies: 289 | color-convert "^2.0.1" 290 | 291 | ansi-styles@^6.0.0, ansi-styles@^6.2.1: 292 | version "6.2.1" 293 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" 294 | integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== 295 | 296 | anymatch@~3.1.1: 297 | version "3.1.3" 298 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 299 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 300 | dependencies: 301 | normalize-path "^3.0.0" 302 | picomatch "^2.0.4" 303 | 304 | argparse@^1.0.7: 305 | version "1.0.10" 306 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 307 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 308 | dependencies: 309 | sprintf-js "~1.0.2" 310 | 311 | argparse@^2.0.1: 312 | version "2.0.1" 313 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 314 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 315 | 316 | array-union@^2.1.0: 317 | version "2.1.0" 318 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 319 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 320 | 321 | astral-regex@^2.0.0: 322 | version "2.0.0" 323 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" 324 | integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== 325 | 326 | balanced-match@^1.0.0: 327 | version "1.0.2" 328 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 329 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 330 | 331 | base64-js@^1.3.1: 332 | version "1.5.1" 333 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 334 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 335 | 336 | binary-extensions@^2.0.0: 337 | version "2.3.0" 338 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" 339 | integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== 340 | 341 | bl@^5.0.0: 342 | version "5.1.0" 343 | resolved "https://registry.yarnpkg.com/bl/-/bl-5.1.0.tgz#183715f678c7188ecef9fe475d90209400624273" 344 | integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== 345 | dependencies: 346 | buffer "^6.0.3" 347 | inherits "^2.0.4" 348 | readable-stream "^3.4.0" 349 | 350 | brace-expansion@^1.1.7: 351 | version "1.1.11" 352 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 353 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 354 | dependencies: 355 | balanced-match "^1.0.0" 356 | concat-map "0.0.1" 357 | 358 | braces@^3.0.3, braces@~3.0.2: 359 | version "3.0.3" 360 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 361 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 362 | dependencies: 363 | fill-range "^7.1.1" 364 | 365 | browser-stdout@1.3.1: 366 | version "1.3.1" 367 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 368 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 369 | 370 | buffer@^6.0.3: 371 | version "6.0.3" 372 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" 373 | integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== 374 | dependencies: 375 | base64-js "^1.3.1" 376 | ieee754 "^1.2.1" 377 | 378 | callsites@^3.0.0: 379 | version "3.1.0" 380 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 381 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 382 | 383 | camelcase@^6.0.0: 384 | version "6.3.0" 385 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 386 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 387 | 388 | chalk@^2.4.2: 389 | version "2.4.2" 390 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 391 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 392 | dependencies: 393 | ansi-styles "^3.2.1" 394 | escape-string-regexp "^1.0.5" 395 | supports-color "^5.3.0" 396 | 397 | chalk@^4.0.0: 398 | version "4.1.2" 399 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 400 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 401 | dependencies: 402 | ansi-styles "^4.1.0" 403 | supports-color "^7.1.0" 404 | 405 | chalk@^5.0.0, chalk@^5.3.0: 406 | version "5.4.1" 407 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" 408 | integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== 409 | 410 | chalk@~5.3.0: 411 | version "5.3.0" 412 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" 413 | integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== 414 | 415 | chokidar@3.5.1: 416 | version "3.5.1" 417 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" 418 | integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== 419 | dependencies: 420 | anymatch "~3.1.1" 421 | braces "~3.0.2" 422 | glob-parent "~5.1.0" 423 | is-binary-path "~2.1.0" 424 | is-glob "~4.0.1" 425 | normalize-path "~3.0.0" 426 | readdirp "~3.5.0" 427 | optionalDependencies: 428 | fsevents "~2.3.1" 429 | 430 | cli-cursor@^4.0.0: 431 | version "4.0.0" 432 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" 433 | integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== 434 | dependencies: 435 | restore-cursor "^4.0.0" 436 | 437 | cli-cursor@^5.0.0: 438 | version "5.0.0" 439 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" 440 | integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== 441 | dependencies: 442 | restore-cursor "^5.0.0" 443 | 444 | cli-spinners@^2.9.0: 445 | version "2.9.2" 446 | resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" 447 | integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== 448 | 449 | cli-truncate@^4.0.0: 450 | version "4.0.0" 451 | resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" 452 | integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== 453 | dependencies: 454 | slice-ansi "^5.0.0" 455 | string-width "^7.0.0" 456 | 457 | cliui@^7.0.2: 458 | version "7.0.4" 459 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 460 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 461 | dependencies: 462 | string-width "^4.2.0" 463 | strip-ansi "^6.0.0" 464 | wrap-ansi "^7.0.0" 465 | 466 | color-convert@^1.9.0: 467 | version "1.9.3" 468 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 469 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 470 | dependencies: 471 | color-name "1.1.3" 472 | 473 | color-convert@^2.0.1: 474 | version "2.0.1" 475 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 476 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 477 | dependencies: 478 | color-name "~1.1.4" 479 | 480 | color-name@1.1.3: 481 | version "1.1.3" 482 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 483 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 484 | 485 | color-name@~1.1.4: 486 | version "1.1.4" 487 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 488 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 489 | 490 | colorette@^2.0.20: 491 | version "2.0.20" 492 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" 493 | integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== 494 | 495 | commander@~12.1.0: 496 | version "12.1.0" 497 | resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" 498 | integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== 499 | 500 | concat-map@0.0.1: 501 | version "0.0.1" 502 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 503 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 504 | 505 | core-util-is@~1.0.0: 506 | version "1.0.3" 507 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 508 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 509 | 510 | cross-spawn@^7.0.2, cross-spawn@^7.0.3: 511 | version "7.0.6" 512 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 513 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 514 | dependencies: 515 | path-key "^3.1.0" 516 | shebang-command "^2.0.0" 517 | which "^2.0.1" 518 | 519 | debug@4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@~4.4.0: 520 | version "4.4.0" 521 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" 522 | integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== 523 | dependencies: 524 | ms "^2.1.3" 525 | 526 | debug@4.3.1: 527 | version "4.3.1" 528 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 529 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 530 | dependencies: 531 | ms "2.1.2" 532 | 533 | decamelize@^4.0.0: 534 | version "4.0.0" 535 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 536 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 537 | 538 | deep-is@^0.1.3: 539 | version "0.1.4" 540 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 541 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 542 | 543 | diff@5.0.0: 544 | version "5.0.0" 545 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 546 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 547 | 548 | dir-glob@^3.0.1: 549 | version "3.0.1" 550 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 551 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 552 | dependencies: 553 | path-type "^4.0.0" 554 | 555 | doctrine@^3.0.0: 556 | version "3.0.0" 557 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 558 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 559 | dependencies: 560 | esutils "^2.0.2" 561 | 562 | eastasianwidth@^0.2.0: 563 | version "0.2.0" 564 | resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" 565 | integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== 566 | 567 | emoji-regex@^10.2.1, emoji-regex@^10.3.0: 568 | version "10.4.0" 569 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" 570 | integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== 571 | 572 | emoji-regex@^8.0.0: 573 | version "8.0.0" 574 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 575 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 576 | 577 | enquirer@^2.3.5: 578 | version "2.4.1" 579 | resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" 580 | integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== 581 | dependencies: 582 | ansi-colors "^4.1.1" 583 | strip-ansi "^6.0.1" 584 | 585 | environment@^1.0.0: 586 | version "1.1.0" 587 | resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" 588 | integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== 589 | 590 | escalade@^3.1.1: 591 | version "3.2.0" 592 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" 593 | integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 594 | 595 | escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: 596 | version "4.0.0" 597 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 598 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 599 | 600 | escape-string-regexp@^1.0.5: 601 | version "1.0.5" 602 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 603 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 604 | 605 | eslint-scope@^5.1.1: 606 | version "5.1.1" 607 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 608 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 609 | dependencies: 610 | esrecurse "^4.3.0" 611 | estraverse "^4.1.1" 612 | 613 | eslint-utils@^2.1.0: 614 | version "2.1.0" 615 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" 616 | integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== 617 | dependencies: 618 | eslint-visitor-keys "^1.1.0" 619 | 620 | eslint-utils@^3.0.0: 621 | version "3.0.0" 622 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" 623 | integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== 624 | dependencies: 625 | eslint-visitor-keys "^2.0.0" 626 | 627 | eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: 628 | version "1.3.0" 629 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" 630 | integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== 631 | 632 | eslint-visitor-keys@^2.0.0: 633 | version "2.1.0" 634 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" 635 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 636 | 637 | eslint@^7.27.0: 638 | version "7.32.0" 639 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" 640 | integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== 641 | dependencies: 642 | "@babel/code-frame" "7.12.11" 643 | "@eslint/eslintrc" "^0.4.3" 644 | "@humanwhocodes/config-array" "^0.5.0" 645 | ajv "^6.10.0" 646 | chalk "^4.0.0" 647 | cross-spawn "^7.0.2" 648 | debug "^4.0.1" 649 | doctrine "^3.0.0" 650 | enquirer "^2.3.5" 651 | escape-string-regexp "^4.0.0" 652 | eslint-scope "^5.1.1" 653 | eslint-utils "^2.1.0" 654 | eslint-visitor-keys "^2.0.0" 655 | espree "^7.3.1" 656 | esquery "^1.4.0" 657 | esutils "^2.0.2" 658 | fast-deep-equal "^3.1.3" 659 | file-entry-cache "^6.0.1" 660 | functional-red-black-tree "^1.0.1" 661 | glob-parent "^5.1.2" 662 | globals "^13.6.0" 663 | ignore "^4.0.6" 664 | import-fresh "^3.0.0" 665 | imurmurhash "^0.1.4" 666 | is-glob "^4.0.0" 667 | js-yaml "^3.13.1" 668 | json-stable-stringify-without-jsonify "^1.0.1" 669 | levn "^0.4.1" 670 | lodash.merge "^4.6.2" 671 | minimatch "^3.0.4" 672 | natural-compare "^1.4.0" 673 | optionator "^0.9.1" 674 | progress "^2.0.0" 675 | regexpp "^3.1.0" 676 | semver "^7.2.1" 677 | strip-ansi "^6.0.0" 678 | strip-json-comments "^3.1.0" 679 | table "^6.0.9" 680 | text-table "^0.2.0" 681 | v8-compile-cache "^2.0.3" 682 | 683 | espree@^7.3.0, espree@^7.3.1: 684 | version "7.3.1" 685 | resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" 686 | integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== 687 | dependencies: 688 | acorn "^7.4.0" 689 | acorn-jsx "^5.3.1" 690 | eslint-visitor-keys "^1.3.0" 691 | 692 | esprima@^4.0.0: 693 | version "4.0.1" 694 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 695 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 696 | 697 | esquery@^1.4.0: 698 | version "1.6.0" 699 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" 700 | integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== 701 | dependencies: 702 | estraverse "^5.1.0" 703 | 704 | esrecurse@^4.3.0: 705 | version "4.3.0" 706 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 707 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 708 | dependencies: 709 | estraverse "^5.2.0" 710 | 711 | estraverse@^4.1.1: 712 | version "4.3.0" 713 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 714 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 715 | 716 | estraverse@^5.1.0, estraverse@^5.2.0: 717 | version "5.3.0" 718 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 719 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 720 | 721 | esutils@^2.0.2: 722 | version "2.0.3" 723 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 724 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 725 | 726 | eventemitter3@^5.0.1: 727 | version "5.0.1" 728 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" 729 | integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== 730 | 731 | execa@~8.0.1: 732 | version "8.0.1" 733 | resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" 734 | integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== 735 | dependencies: 736 | cross-spawn "^7.0.3" 737 | get-stream "^8.0.1" 738 | human-signals "^5.0.0" 739 | is-stream "^3.0.0" 740 | merge-stream "^2.0.0" 741 | npm-run-path "^5.1.0" 742 | onetime "^6.0.0" 743 | signal-exit "^4.1.0" 744 | strip-final-newline "^3.0.0" 745 | 746 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 747 | version "3.1.3" 748 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 749 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 750 | 751 | fast-glob@^3.2.9: 752 | version "3.3.2" 753 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" 754 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 755 | dependencies: 756 | "@nodelib/fs.stat" "^2.0.2" 757 | "@nodelib/fs.walk" "^1.2.3" 758 | glob-parent "^5.1.2" 759 | merge2 "^1.3.0" 760 | micromatch "^4.0.4" 761 | 762 | fast-json-stable-stringify@^2.0.0: 763 | version "2.1.0" 764 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 765 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 766 | 767 | fast-levenshtein@^2.0.6: 768 | version "2.0.6" 769 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 770 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 771 | 772 | fast-uri@^3.0.1: 773 | version "3.0.3" 774 | resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" 775 | integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== 776 | 777 | fastq@^1.6.0: 778 | version "1.18.0" 779 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" 780 | integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== 781 | dependencies: 782 | reusify "^1.0.4" 783 | 784 | file-entry-cache@^6.0.1: 785 | version "6.0.1" 786 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 787 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 788 | dependencies: 789 | flat-cache "^3.0.4" 790 | 791 | fill-range@^7.1.1: 792 | version "7.1.1" 793 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 794 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 795 | dependencies: 796 | to-regex-range "^5.0.1" 797 | 798 | find-up@5.0.0: 799 | version "5.0.0" 800 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 801 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 802 | dependencies: 803 | locate-path "^6.0.0" 804 | path-exists "^4.0.0" 805 | 806 | flat-cache@^3.0.4: 807 | version "3.2.0" 808 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" 809 | integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== 810 | dependencies: 811 | flatted "^3.2.9" 812 | keyv "^4.5.3" 813 | rimraf "^3.0.2" 814 | 815 | flat@^5.0.2: 816 | version "5.0.2" 817 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 818 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 819 | 820 | flatted@^3.2.9: 821 | version "3.3.2" 822 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" 823 | integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== 824 | 825 | fs-extra@^10.0.0: 826 | version "10.1.0" 827 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" 828 | integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== 829 | dependencies: 830 | graceful-fs "^4.2.0" 831 | jsonfile "^6.0.1" 832 | universalify "^2.0.0" 833 | 834 | fs.realpath@^1.0.0: 835 | version "1.0.0" 836 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 837 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 838 | 839 | fsevents@~2.3.1: 840 | version "2.3.3" 841 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 842 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 843 | 844 | functional-red-black-tree@^1.0.1: 845 | version "1.0.1" 846 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 847 | integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== 848 | 849 | get-caller-file@^2.0.5: 850 | version "2.0.5" 851 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 852 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 853 | 854 | get-east-asian-width@^1.0.0: 855 | version "1.3.0" 856 | resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" 857 | integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== 858 | 859 | get-stream@^8.0.1: 860 | version "8.0.1" 861 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" 862 | integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== 863 | 864 | glob-parent@^5.1.2, glob-parent@~5.1.0: 865 | version "5.1.2" 866 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 867 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 868 | dependencies: 869 | is-glob "^4.0.1" 870 | 871 | glob@7.1.6: 872 | version "7.1.6" 873 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 874 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 875 | dependencies: 876 | fs.realpath "^1.0.0" 877 | inflight "^1.0.4" 878 | inherits "2" 879 | minimatch "^3.0.4" 880 | once "^1.3.0" 881 | path-is-absolute "^1.0.0" 882 | 883 | glob@^7.1.3, glob@^7.1.7: 884 | version "7.2.3" 885 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 886 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 887 | dependencies: 888 | fs.realpath "^1.0.0" 889 | inflight "^1.0.4" 890 | inherits "2" 891 | minimatch "^3.1.1" 892 | once "^1.3.0" 893 | path-is-absolute "^1.0.0" 894 | 895 | globals@^13.6.0, globals@^13.9.0: 896 | version "13.24.0" 897 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" 898 | integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== 899 | dependencies: 900 | type-fest "^0.20.2" 901 | 902 | globby@^11.0.3: 903 | version "11.1.0" 904 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 905 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 906 | dependencies: 907 | array-union "^2.1.0" 908 | dir-glob "^3.0.1" 909 | fast-glob "^3.2.9" 910 | ignore "^5.2.0" 911 | merge2 "^1.4.1" 912 | slash "^3.0.0" 913 | 914 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 915 | version "4.2.11" 916 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 917 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 918 | 919 | growl@1.10.5: 920 | version "1.10.5" 921 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 922 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 923 | 924 | has-flag@^3.0.0: 925 | version "3.0.0" 926 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 927 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 928 | 929 | has-flag@^4.0.0: 930 | version "4.0.0" 931 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 932 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 933 | 934 | he@1.2.0: 935 | version "1.2.0" 936 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 937 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 938 | 939 | http-proxy-agent@^7.0.2: 940 | version "7.0.2" 941 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" 942 | integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== 943 | dependencies: 944 | agent-base "^7.1.0" 945 | debug "^4.3.4" 946 | 947 | https-proxy-agent@^7.0.5: 948 | version "7.0.6" 949 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" 950 | integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== 951 | dependencies: 952 | agent-base "^7.1.2" 953 | debug "4" 954 | 955 | human-signals@^5.0.0: 956 | version "5.0.0" 957 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" 958 | integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== 959 | 960 | husky@>=6: 961 | version "9.1.7" 962 | resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" 963 | integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== 964 | 965 | ieee754@^1.2.1: 966 | version "1.2.1" 967 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 968 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 969 | 970 | ignore@^4.0.6: 971 | version "4.0.6" 972 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 973 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 974 | 975 | ignore@^5.1.8, ignore@^5.2.0: 976 | version "5.3.2" 977 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" 978 | integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== 979 | 980 | immediate@~3.0.5: 981 | version "3.0.6" 982 | resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" 983 | integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== 984 | 985 | import-fresh@^3.0.0, import-fresh@^3.2.1: 986 | version "3.3.0" 987 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 988 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 989 | dependencies: 990 | parent-module "^1.0.0" 991 | resolve-from "^4.0.0" 992 | 993 | imurmurhash@^0.1.4: 994 | version "0.1.4" 995 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 996 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 997 | 998 | inflight@^1.0.4: 999 | version "1.0.6" 1000 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1001 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1002 | dependencies: 1003 | once "^1.3.0" 1004 | wrappy "1" 1005 | 1006 | inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: 1007 | version "2.0.4" 1008 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1009 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1010 | 1011 | is-binary-path@~2.1.0: 1012 | version "2.1.0" 1013 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1014 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1015 | dependencies: 1016 | binary-extensions "^2.0.0" 1017 | 1018 | is-extglob@^2.1.1: 1019 | version "2.1.1" 1020 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1021 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1022 | 1023 | is-fullwidth-code-point@^2.0.0: 1024 | version "2.0.0" 1025 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1026 | integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== 1027 | 1028 | is-fullwidth-code-point@^3.0.0: 1029 | version "3.0.0" 1030 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1031 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1032 | 1033 | is-fullwidth-code-point@^4.0.0: 1034 | version "4.0.0" 1035 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" 1036 | integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== 1037 | 1038 | is-fullwidth-code-point@^5.0.0: 1039 | version "5.0.0" 1040 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" 1041 | integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== 1042 | dependencies: 1043 | get-east-asian-width "^1.0.0" 1044 | 1045 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: 1046 | version "4.0.3" 1047 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1048 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1049 | dependencies: 1050 | is-extglob "^2.1.1" 1051 | 1052 | is-interactive@^2.0.0: 1053 | version "2.0.0" 1054 | resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" 1055 | integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== 1056 | 1057 | is-number@^7.0.0: 1058 | version "7.0.0" 1059 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1060 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1061 | 1062 | is-plain-obj@^2.1.0: 1063 | version "2.1.0" 1064 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 1065 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 1066 | 1067 | is-stream@^3.0.0: 1068 | version "3.0.0" 1069 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" 1070 | integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== 1071 | 1072 | is-unicode-supported@^1.1.0, is-unicode-supported@^1.3.0: 1073 | version "1.3.0" 1074 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" 1075 | integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== 1076 | 1077 | isarray@~1.0.0: 1078 | version "1.0.0" 1079 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1080 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 1081 | 1082 | isexe@^2.0.0: 1083 | version "2.0.0" 1084 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1085 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1086 | 1087 | js-tokens@^4.0.0: 1088 | version "4.0.0" 1089 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1090 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1091 | 1092 | js-yaml@4.0.0: 1093 | version "4.0.0" 1094 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" 1095 | integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== 1096 | dependencies: 1097 | argparse "^2.0.1" 1098 | 1099 | js-yaml@^3.13.1: 1100 | version "3.14.1" 1101 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" 1102 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 1103 | dependencies: 1104 | argparse "^1.0.7" 1105 | esprima "^4.0.0" 1106 | 1107 | json-buffer@3.0.1: 1108 | version "3.0.1" 1109 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 1110 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 1111 | 1112 | json-schema-traverse@^0.4.1: 1113 | version "0.4.1" 1114 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1115 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1116 | 1117 | json-schema-traverse@^1.0.0: 1118 | version "1.0.0" 1119 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 1120 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 1121 | 1122 | json-stable-stringify-without-jsonify@^1.0.1: 1123 | version "1.0.1" 1124 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1125 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1126 | 1127 | json5@^2.2.0: 1128 | version "2.2.3" 1129 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" 1130 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 1131 | 1132 | jsonfile@^6.0.1: 1133 | version "6.1.0" 1134 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 1135 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 1136 | dependencies: 1137 | universalify "^2.0.0" 1138 | optionalDependencies: 1139 | graceful-fs "^4.1.6" 1140 | 1141 | jszip@^3.10.1: 1142 | version "3.10.1" 1143 | resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" 1144 | integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== 1145 | dependencies: 1146 | lie "~3.3.0" 1147 | pako "~1.0.2" 1148 | readable-stream "~2.3.6" 1149 | setimmediate "^1.0.5" 1150 | 1151 | keyv@^4.5.3: 1152 | version "4.5.4" 1153 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 1154 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 1155 | dependencies: 1156 | json-buffer "3.0.1" 1157 | 1158 | levn@^0.4.1: 1159 | version "0.4.1" 1160 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1161 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1162 | dependencies: 1163 | prelude-ls "^1.2.1" 1164 | type-check "~0.4.0" 1165 | 1166 | lie@~3.3.0: 1167 | version "3.3.0" 1168 | resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" 1169 | integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== 1170 | dependencies: 1171 | immediate "~3.0.5" 1172 | 1173 | lilconfig@~3.1.3: 1174 | version "3.1.3" 1175 | resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" 1176 | integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== 1177 | 1178 | lint-staged@>=10: 1179 | version "15.2.11" 1180 | resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.11.tgz#e88440982f4a4c1d55a9a7a839259ec3806bd81b" 1181 | integrity sha512-Ev6ivCTYRTGs9ychvpVw35m/bcNDuBN+mnTeObCL5h+boS5WzBEC6LHI4I9F/++sZm1m+J2LEiy0gxL/R9TBqQ== 1182 | dependencies: 1183 | chalk "~5.3.0" 1184 | commander "~12.1.0" 1185 | debug "~4.4.0" 1186 | execa "~8.0.1" 1187 | lilconfig "~3.1.3" 1188 | listr2 "~8.2.5" 1189 | micromatch "~4.0.8" 1190 | pidtree "~0.6.0" 1191 | string-argv "~0.3.2" 1192 | yaml "~2.6.1" 1193 | 1194 | listr2@~8.2.5: 1195 | version "8.2.5" 1196 | resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.5.tgz#5c9db996e1afeb05db0448196d3d5f64fec2593d" 1197 | integrity sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ== 1198 | dependencies: 1199 | cli-truncate "^4.0.0" 1200 | colorette "^2.0.20" 1201 | eventemitter3 "^5.0.1" 1202 | log-update "^6.1.0" 1203 | rfdc "^1.4.1" 1204 | wrap-ansi "^9.0.0" 1205 | 1206 | locate-path@^6.0.0: 1207 | version "6.0.0" 1208 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1209 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1210 | dependencies: 1211 | p-locate "^5.0.0" 1212 | 1213 | lodash.merge@^4.6.2: 1214 | version "4.6.2" 1215 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1216 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1217 | 1218 | lodash.truncate@^4.4.2: 1219 | version "4.4.2" 1220 | resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" 1221 | integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== 1222 | 1223 | lodash@^4.17.4: 1224 | version "4.17.21" 1225 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1226 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1227 | 1228 | log-symbols@4.0.0: 1229 | version "4.0.0" 1230 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" 1231 | integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== 1232 | dependencies: 1233 | chalk "^4.0.0" 1234 | 1235 | log-symbols@^5.1.0: 1236 | version "5.1.0" 1237 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" 1238 | integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== 1239 | dependencies: 1240 | chalk "^5.0.0" 1241 | is-unicode-supported "^1.1.0" 1242 | 1243 | log-update@^6.1.0: 1244 | version "6.1.0" 1245 | resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" 1246 | integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== 1247 | dependencies: 1248 | ansi-escapes "^7.0.0" 1249 | cli-cursor "^5.0.0" 1250 | slice-ansi "^7.1.0" 1251 | strip-ansi "^7.1.0" 1252 | wrap-ansi "^9.0.0" 1253 | 1254 | merge-stream@^2.0.0: 1255 | version "2.0.0" 1256 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1257 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1258 | 1259 | merge2@^1.3.0, merge2@^1.4.1: 1260 | version "1.4.1" 1261 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1262 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1263 | 1264 | micromatch@^4.0.4, micromatch@~4.0.8: 1265 | version "4.0.8" 1266 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" 1267 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 1268 | dependencies: 1269 | braces "^3.0.3" 1270 | picomatch "^2.3.1" 1271 | 1272 | mimic-fn@^2.1.0: 1273 | version "2.1.0" 1274 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1275 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1276 | 1277 | mimic-fn@^4.0.0: 1278 | version "4.0.0" 1279 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" 1280 | integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== 1281 | 1282 | mimic-function@^5.0.0: 1283 | version "5.0.1" 1284 | resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" 1285 | integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== 1286 | 1287 | minimatch@3.0.4: 1288 | version "3.0.4" 1289 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1290 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1291 | dependencies: 1292 | brace-expansion "^1.1.7" 1293 | 1294 | minimatch@^3.0.4, minimatch@^3.1.1: 1295 | version "3.1.2" 1296 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1297 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1298 | dependencies: 1299 | brace-expansion "^1.1.7" 1300 | 1301 | mocha@^8.4.0: 1302 | version "8.4.0" 1303 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" 1304 | integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== 1305 | dependencies: 1306 | "@ungap/promise-all-settled" "1.1.2" 1307 | ansi-colors "4.1.1" 1308 | browser-stdout "1.3.1" 1309 | chokidar "3.5.1" 1310 | debug "4.3.1" 1311 | diff "5.0.0" 1312 | escape-string-regexp "4.0.0" 1313 | find-up "5.0.0" 1314 | glob "7.1.6" 1315 | growl "1.10.5" 1316 | he "1.2.0" 1317 | js-yaml "4.0.0" 1318 | log-symbols "4.0.0" 1319 | minimatch "3.0.4" 1320 | ms "2.1.3" 1321 | nanoid "3.1.20" 1322 | serialize-javascript "5.0.1" 1323 | strip-json-comments "3.1.1" 1324 | supports-color "8.1.1" 1325 | which "2.0.2" 1326 | wide-align "1.1.3" 1327 | workerpool "6.1.0" 1328 | yargs "16.2.0" 1329 | yargs-parser "20.2.4" 1330 | yargs-unparser "2.0.0" 1331 | 1332 | ms@2.1.2: 1333 | version "2.1.2" 1334 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1335 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1336 | 1337 | ms@2.1.3, ms@^2.1.3: 1338 | version "2.1.3" 1339 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1340 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1341 | 1342 | nanoid@3.1.20: 1343 | version "3.1.20" 1344 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" 1345 | integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== 1346 | 1347 | natural-compare@^1.4.0: 1348 | version "1.4.0" 1349 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1350 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1351 | 1352 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1353 | version "3.0.0" 1354 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1355 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1356 | 1357 | npm-run-path@^5.1.0: 1358 | version "5.3.0" 1359 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" 1360 | integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== 1361 | dependencies: 1362 | path-key "^4.0.0" 1363 | 1364 | once@^1.3.0: 1365 | version "1.4.0" 1366 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1367 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1368 | dependencies: 1369 | wrappy "1" 1370 | 1371 | onetime@^5.1.0: 1372 | version "5.1.2" 1373 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 1374 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 1375 | dependencies: 1376 | mimic-fn "^2.1.0" 1377 | 1378 | onetime@^6.0.0: 1379 | version "6.0.0" 1380 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" 1381 | integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== 1382 | dependencies: 1383 | mimic-fn "^4.0.0" 1384 | 1385 | onetime@^7.0.0: 1386 | version "7.0.0" 1387 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" 1388 | integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== 1389 | dependencies: 1390 | mimic-function "^5.0.0" 1391 | 1392 | optionator@^0.9.1: 1393 | version "0.9.4" 1394 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" 1395 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 1396 | dependencies: 1397 | deep-is "^0.1.3" 1398 | fast-levenshtein "^2.0.6" 1399 | levn "^0.4.1" 1400 | prelude-ls "^1.2.1" 1401 | type-check "^0.4.0" 1402 | word-wrap "^1.2.5" 1403 | 1404 | ora@^7.0.1: 1405 | version "7.0.1" 1406 | resolved "https://registry.yarnpkg.com/ora/-/ora-7.0.1.tgz#cdd530ecd865fe39e451a0e7697865669cb11930" 1407 | integrity sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw== 1408 | dependencies: 1409 | chalk "^5.3.0" 1410 | cli-cursor "^4.0.0" 1411 | cli-spinners "^2.9.0" 1412 | is-interactive "^2.0.0" 1413 | is-unicode-supported "^1.3.0" 1414 | log-symbols "^5.1.0" 1415 | stdin-discarder "^0.1.0" 1416 | string-width "^6.1.0" 1417 | strip-ansi "^7.1.0" 1418 | 1419 | p-limit@^3.0.2: 1420 | version "3.1.0" 1421 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1422 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1423 | dependencies: 1424 | yocto-queue "^0.1.0" 1425 | 1426 | p-locate@^5.0.0: 1427 | version "5.0.0" 1428 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1429 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1430 | dependencies: 1431 | p-limit "^3.0.2" 1432 | 1433 | pako@~1.0.2: 1434 | version "1.0.11" 1435 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 1436 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 1437 | 1438 | parent-module@^1.0.0: 1439 | version "1.0.1" 1440 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1441 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1442 | dependencies: 1443 | callsites "^3.0.0" 1444 | 1445 | path-exists@^4.0.0: 1446 | version "4.0.0" 1447 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1448 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1449 | 1450 | path-is-absolute@^1.0.0: 1451 | version "1.0.1" 1452 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1453 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1454 | 1455 | path-key@^3.1.0: 1456 | version "3.1.1" 1457 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1458 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1459 | 1460 | path-key@^4.0.0: 1461 | version "4.0.0" 1462 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" 1463 | integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== 1464 | 1465 | path-type@^4.0.0: 1466 | version "4.0.0" 1467 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1468 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1469 | 1470 | picocolors@^1.0.0: 1471 | version "1.1.1" 1472 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" 1473 | integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 1474 | 1475 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 1476 | version "2.3.1" 1477 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1478 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1479 | 1480 | pidtree@~0.6.0: 1481 | version "0.6.0" 1482 | resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" 1483 | integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== 1484 | 1485 | prelude-ls@^1.2.1: 1486 | version "1.2.1" 1487 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1488 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1489 | 1490 | prettier@^2.3.2: 1491 | version "2.8.8" 1492 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" 1493 | integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== 1494 | 1495 | process-nextick-args@~2.0.0: 1496 | version "2.0.1" 1497 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1498 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1499 | 1500 | progress@^2.0.0: 1501 | version "2.0.3" 1502 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 1503 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1504 | 1505 | punycode@^2.1.0: 1506 | version "2.3.1" 1507 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 1508 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1509 | 1510 | queue-microtask@^1.2.2: 1511 | version "1.2.3" 1512 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1513 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1514 | 1515 | randombytes@^2.1.0: 1516 | version "2.1.0" 1517 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1518 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1519 | dependencies: 1520 | safe-buffer "^5.1.0" 1521 | 1522 | readable-stream@^3.4.0: 1523 | version "3.6.2" 1524 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" 1525 | integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== 1526 | dependencies: 1527 | inherits "^2.0.3" 1528 | string_decoder "^1.1.1" 1529 | util-deprecate "^1.0.1" 1530 | 1531 | readable-stream@~2.3.6: 1532 | version "2.3.8" 1533 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" 1534 | integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== 1535 | dependencies: 1536 | core-util-is "~1.0.0" 1537 | inherits "~2.0.3" 1538 | isarray "~1.0.0" 1539 | process-nextick-args "~2.0.0" 1540 | safe-buffer "~5.1.1" 1541 | string_decoder "~1.1.1" 1542 | util-deprecate "~1.0.1" 1543 | 1544 | readdirp@~3.5.0: 1545 | version "3.5.0" 1546 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" 1547 | integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== 1548 | dependencies: 1549 | picomatch "^2.2.1" 1550 | 1551 | regexpp@^3.1.0: 1552 | version "3.2.0" 1553 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 1554 | integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== 1555 | 1556 | require-directory@^2.1.1: 1557 | version "2.1.1" 1558 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1559 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 1560 | 1561 | require-from-string@^2.0.2: 1562 | version "2.0.2" 1563 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 1564 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 1565 | 1566 | resolve-from@^4.0.0: 1567 | version "4.0.0" 1568 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1569 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1570 | 1571 | restore-cursor@^4.0.0: 1572 | version "4.0.0" 1573 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" 1574 | integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== 1575 | dependencies: 1576 | onetime "^5.1.0" 1577 | signal-exit "^3.0.2" 1578 | 1579 | restore-cursor@^5.0.0: 1580 | version "5.1.0" 1581 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" 1582 | integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== 1583 | dependencies: 1584 | onetime "^7.0.0" 1585 | signal-exit "^4.1.0" 1586 | 1587 | reusify@^1.0.4: 1588 | version "1.0.4" 1589 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1590 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1591 | 1592 | rfdc@^1.4.1: 1593 | version "1.4.1" 1594 | resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" 1595 | integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== 1596 | 1597 | rimraf@^3.0.2: 1598 | version "3.0.2" 1599 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1600 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1601 | dependencies: 1602 | glob "^7.1.3" 1603 | 1604 | run-parallel@^1.1.9: 1605 | version "1.2.0" 1606 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1607 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1608 | dependencies: 1609 | queue-microtask "^1.2.2" 1610 | 1611 | safe-buffer@^5.1.0, safe-buffer@~5.2.0: 1612 | version "5.2.1" 1613 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1614 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1615 | 1616 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1617 | version "5.1.2" 1618 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1619 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1620 | 1621 | semver@^7.2.1, semver@^7.3.5, semver@^7.6.2: 1622 | version "7.6.3" 1623 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 1624 | integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 1625 | 1626 | serialize-javascript@5.0.1: 1627 | version "5.0.1" 1628 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" 1629 | integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== 1630 | dependencies: 1631 | randombytes "^2.1.0" 1632 | 1633 | setimmediate@^1.0.5: 1634 | version "1.0.5" 1635 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1636 | integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== 1637 | 1638 | shebang-command@^2.0.0: 1639 | version "2.0.0" 1640 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1641 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1642 | dependencies: 1643 | shebang-regex "^3.0.0" 1644 | 1645 | shebang-regex@^3.0.0: 1646 | version "3.0.0" 1647 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1648 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1649 | 1650 | signal-exit@^3.0.2: 1651 | version "3.0.7" 1652 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 1653 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 1654 | 1655 | signal-exit@^4.1.0: 1656 | version "4.1.0" 1657 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" 1658 | integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== 1659 | 1660 | slash@^3.0.0: 1661 | version "3.0.0" 1662 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1663 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1664 | 1665 | slice-ansi@^4.0.0: 1666 | version "4.0.0" 1667 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" 1668 | integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== 1669 | dependencies: 1670 | ansi-styles "^4.0.0" 1671 | astral-regex "^2.0.0" 1672 | is-fullwidth-code-point "^3.0.0" 1673 | 1674 | slice-ansi@^5.0.0: 1675 | version "5.0.0" 1676 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" 1677 | integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== 1678 | dependencies: 1679 | ansi-styles "^6.0.0" 1680 | is-fullwidth-code-point "^4.0.0" 1681 | 1682 | slice-ansi@^7.1.0: 1683 | version "7.1.0" 1684 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" 1685 | integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== 1686 | dependencies: 1687 | ansi-styles "^6.2.1" 1688 | is-fullwidth-code-point "^5.0.0" 1689 | 1690 | sprintf-js@~1.0.2: 1691 | version "1.0.3" 1692 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1693 | integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== 1694 | 1695 | stdin-discarder@^0.1.0: 1696 | version "0.1.0" 1697 | resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" 1698 | integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ== 1699 | dependencies: 1700 | bl "^5.0.0" 1701 | 1702 | string-argv@~0.3.2: 1703 | version "0.3.2" 1704 | resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" 1705 | integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== 1706 | 1707 | "string-width@^1.0.2 || 2": 1708 | version "2.1.1" 1709 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1710 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1711 | dependencies: 1712 | is-fullwidth-code-point "^2.0.0" 1713 | strip-ansi "^4.0.0" 1714 | 1715 | string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 1716 | version "4.2.3" 1717 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1718 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1719 | dependencies: 1720 | emoji-regex "^8.0.0" 1721 | is-fullwidth-code-point "^3.0.0" 1722 | strip-ansi "^6.0.1" 1723 | 1724 | string-width@^6.1.0: 1725 | version "6.1.0" 1726 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-6.1.0.tgz#96488d6ed23f9ad5d82d13522af9e4c4c3fd7518" 1727 | integrity sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ== 1728 | dependencies: 1729 | eastasianwidth "^0.2.0" 1730 | emoji-regex "^10.2.1" 1731 | strip-ansi "^7.0.1" 1732 | 1733 | string-width@^7.0.0: 1734 | version "7.2.0" 1735 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" 1736 | integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== 1737 | dependencies: 1738 | emoji-regex "^10.3.0" 1739 | get-east-asian-width "^1.0.0" 1740 | strip-ansi "^7.1.0" 1741 | 1742 | string_decoder@^1.1.1: 1743 | version "1.3.0" 1744 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1745 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1746 | dependencies: 1747 | safe-buffer "~5.2.0" 1748 | 1749 | string_decoder@~1.1.1: 1750 | version "1.1.1" 1751 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1752 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1753 | dependencies: 1754 | safe-buffer "~5.1.0" 1755 | 1756 | strip-ansi@^4.0.0: 1757 | version "4.0.0" 1758 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1759 | integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== 1760 | dependencies: 1761 | ansi-regex "^3.0.0" 1762 | 1763 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1764 | version "6.0.1" 1765 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1766 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1767 | dependencies: 1768 | ansi-regex "^5.0.1" 1769 | 1770 | strip-ansi@^7.0.1, strip-ansi@^7.1.0: 1771 | version "7.1.0" 1772 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" 1773 | integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== 1774 | dependencies: 1775 | ansi-regex "^6.0.1" 1776 | 1777 | strip-final-newline@^3.0.0: 1778 | version "3.0.0" 1779 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" 1780 | integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== 1781 | 1782 | strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 1783 | version "3.1.1" 1784 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1785 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1786 | 1787 | supports-color@8.1.1: 1788 | version "8.1.1" 1789 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1790 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1791 | dependencies: 1792 | has-flag "^4.0.0" 1793 | 1794 | supports-color@^5.3.0: 1795 | version "5.5.0" 1796 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1797 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1798 | dependencies: 1799 | has-flag "^3.0.0" 1800 | 1801 | supports-color@^7.1.0: 1802 | version "7.2.0" 1803 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1804 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1805 | dependencies: 1806 | has-flag "^4.0.0" 1807 | 1808 | table@^6.0.9: 1809 | version "6.9.0" 1810 | resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5" 1811 | integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== 1812 | dependencies: 1813 | ajv "^8.0.1" 1814 | lodash.truncate "^4.4.2" 1815 | slice-ansi "^4.0.0" 1816 | string-width "^4.2.3" 1817 | strip-ansi "^6.0.1" 1818 | 1819 | text-table@^0.2.0: 1820 | version "0.2.0" 1821 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1822 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 1823 | 1824 | to-regex-range@^5.0.1: 1825 | version "5.0.1" 1826 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1827 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1828 | dependencies: 1829 | is-number "^7.0.0" 1830 | 1831 | tslib@^1.8.1: 1832 | version "1.14.1" 1833 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 1834 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1835 | 1836 | tsutils@^3.21.0: 1837 | version "3.21.0" 1838 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 1839 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 1840 | dependencies: 1841 | tslib "^1.8.1" 1842 | 1843 | type-check@^0.4.0, type-check@~0.4.0: 1844 | version "0.4.0" 1845 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1846 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1847 | dependencies: 1848 | prelude-ls "^1.2.1" 1849 | 1850 | type-fest@^0.20.2: 1851 | version "0.20.2" 1852 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1853 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1854 | 1855 | typescript@^4.3.2: 1856 | version "4.9.5" 1857 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" 1858 | integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== 1859 | 1860 | undici-types@~6.20.0: 1861 | version "6.20.0" 1862 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" 1863 | integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== 1864 | 1865 | universalify@^2.0.0: 1866 | version "2.0.1" 1867 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" 1868 | integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== 1869 | 1870 | uri-js@^4.2.2: 1871 | version "4.4.1" 1872 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1873 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1874 | dependencies: 1875 | punycode "^2.1.0" 1876 | 1877 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 1878 | version "1.0.2" 1879 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1880 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1881 | 1882 | v8-compile-cache@^2.0.3: 1883 | version "2.4.0" 1884 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" 1885 | integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== 1886 | 1887 | which@2.0.2, which@^2.0.1: 1888 | version "2.0.2" 1889 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1890 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1891 | dependencies: 1892 | isexe "^2.0.0" 1893 | 1894 | wide-align@1.1.3: 1895 | version "1.1.3" 1896 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1897 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1898 | dependencies: 1899 | string-width "^1.0.2 || 2" 1900 | 1901 | word-wrap@^1.2.5: 1902 | version "1.2.5" 1903 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" 1904 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 1905 | 1906 | workerpool@6.1.0: 1907 | version "6.1.0" 1908 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" 1909 | integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== 1910 | 1911 | wrap-ansi@^7.0.0: 1912 | version "7.0.0" 1913 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1914 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1915 | dependencies: 1916 | ansi-styles "^4.0.0" 1917 | string-width "^4.1.0" 1918 | strip-ansi "^6.0.0" 1919 | 1920 | wrap-ansi@^9.0.0: 1921 | version "9.0.0" 1922 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" 1923 | integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== 1924 | dependencies: 1925 | ansi-styles "^6.2.1" 1926 | string-width "^7.0.0" 1927 | strip-ansi "^7.1.0" 1928 | 1929 | wrappy@1: 1930 | version "1.0.2" 1931 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1932 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1933 | 1934 | y18n@^5.0.5: 1935 | version "5.0.8" 1936 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1937 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1938 | 1939 | yaml@~2.6.1: 1940 | version "2.6.1" 1941 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773" 1942 | integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg== 1943 | 1944 | yargs-parser@20.2.4: 1945 | version "20.2.4" 1946 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1947 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1948 | 1949 | yargs-parser@^20.2.2: 1950 | version "20.2.9" 1951 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1952 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1953 | 1954 | yargs-unparser@2.0.0: 1955 | version "2.0.0" 1956 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1957 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1958 | dependencies: 1959 | camelcase "^6.0.0" 1960 | decamelize "^4.0.0" 1961 | flat "^5.0.2" 1962 | is-plain-obj "^2.1.0" 1963 | 1964 | yargs@16.2.0: 1965 | version "16.2.0" 1966 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1967 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1968 | dependencies: 1969 | cliui "^7.0.2" 1970 | escalade "^3.1.1" 1971 | get-caller-file "^2.0.5" 1972 | require-directory "^2.1.1" 1973 | string-width "^4.2.0" 1974 | y18n "^5.0.5" 1975 | yargs-parser "^20.2.2" 1976 | 1977 | yocto-queue@^0.1.0: 1978 | version "0.1.0" 1979 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1980 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1981 | --------------------------------------------------------------------------------