├── .github └── workflows │ └── release-on-version-bump.yml ├── .gitignore ├── .nvmrc ├── README.md ├── docs └── rules │ ├── might-throw.md │ ├── no-unhandled.md │ └── use-error-cause.md ├── eslint.config.js ├── eslint.config.test.js ├── package.json ├── src ├── index.ts ├── rules │ ├── create-rule.ts │ ├── index.ts │ ├── might-throw │ │ ├── index.ts │ │ ├── might-throw.spec.ts │ │ ├── might-throw.ts │ │ └── tests │ │ │ ├── basic-err.ts │ │ │ ├── basic-ok.ts │ │ │ ├── generic-impt-ok.ts │ │ │ ├── generic-ok.ts │ │ │ ├── import-err.ts │ │ │ ├── import-ok.ts │ │ │ ├── native-funcs-err-2.ts │ │ │ ├── native-funcs-err.ts │ │ │ ├── native-modules-err.ts │ │ │ ├── native-modules-ok.ts │ │ │ ├── private-identifier-err.ts │ │ │ ├── private-identifier-ok.ts │ │ │ ├── throwing-func.ts │ │ │ └── tsx-ok.tsx │ ├── no-unhandled │ │ ├── index.ts │ │ ├── no-unhandled.spec.ts │ │ ├── no-unhandled.ts │ │ └── tests │ │ │ ├── alias-err.ts │ │ │ ├── alias-ok.ts │ │ │ ├── array-destructuring-ok.ts │ │ │ ├── basic-err-2.ts │ │ │ ├── basic-err-3.ts │ │ │ ├── basic-err-4.ts │ │ │ ├── basic-err.ts │ │ │ ├── basic-ok-2.ts │ │ │ ├── basic-ok.ts │ │ │ ├── import-err.ts │ │ │ ├── import-ok-2.ts │ │ │ ├── import-ok.ts │ │ │ ├── module-ok.ts │ │ │ ├── native-modules-err.ts │ │ │ ├── native-modules-ok.ts │ │ │ ├── private-identifier-err.ts │ │ │ ├── private-identifier-ok.ts │ │ │ ├── recursive-err.ts │ │ │ ├── recursive-ok.ts │ │ │ └── throwing-func.ts │ └── use-error-cause │ │ ├── index.ts │ │ ├── tests │ │ ├── basic-err.ts │ │ ├── basic-ok.ts │ │ ├── import-err.ts │ │ ├── import-ok.ts │ │ └── throwing-func.ts │ │ ├── use-error-cause.spec.ts │ │ └── use-error-cause.ts └── utils │ ├── ast-guards.ts │ ├── can-func-throw.ts │ ├── explore-children.ts │ ├── find-identifier-in-parents.ts │ ├── find-identifiers-in-children.ts │ ├── find-in-children-all.ts │ ├── find-in-children.ts │ ├── find-in-parent.ts │ ├── get-call-expr-id.ts │ ├── get-function-id.ts │ ├── get-import-declaration.ts │ ├── index.ts │ ├── infer-guard-type.ts │ ├── native-throwing.ts │ ├── parse.ts │ ├── resolve-class.ts │ ├── resolve-func.ts │ ├── resolve-id.ts │ ├── resolve-imported-id.ts │ └── test-file.ts ├── tsconfig.json ├── vitest.config.js └── yarn.lock /.github/workflows/release-on-version-bump.yml: -------------------------------------------------------------------------------- 1 | name: Release & publish on `package.json#version` bump 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | publish-on-release: 10 | runs-on: ubuntu-latest 11 | permissions: write-all 12 | steps: 13 | - uses: actions/checkout@v4 14 | - uses: actions/setup-node@v4 15 | with: 16 | node-version-file: ".nvmrc" 17 | registry-url: "https://registry.npmjs.org" 18 | - run: yarn 19 | - run: yarn test 20 | - run: yarn build 21 | - run: yarn publish 22 | env: 23 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 24 | - uses: Makepad-fr/auto-release-on-version-bump-action@0.0.2 25 | with: 26 | token: ${{ secrets.GITHUB_TOKEN }} 27 | name: "$newVersion" 28 | body: "✨ New release $newVersion" 29 | draft: "false" 30 | pre-release: "auto" 31 | generate-release-note: "true" 32 | tag-name: "$newVersion" 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/node,yarn,windows,macos,linux 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=node,yarn,windows,macos,linux 3 | 4 | test 5 | 6 | ### Linux ### 7 | *~ 8 | 9 | # temporary files which can be created if a process still has a handle open of a deleted file 10 | .fuse_hidden* 11 | 12 | # KDE directory preferences 13 | .directory 14 | 15 | # Linux trash folder which might appear on any partition or disk 16 | .Trash-* 17 | 18 | # .nfs files are created when an open file is removed but is still being accessed 19 | .nfs* 20 | 21 | ### macOS ### 22 | # General 23 | .DS_Store 24 | .AppleDouble 25 | .LSOverride 26 | 27 | # Icon must end with two \r 28 | Icon 29 | 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear in the root of a volume 35 | .DocumentRevisions-V100 36 | .fseventsd 37 | .Spotlight-V100 38 | .TemporaryItems 39 | .Trashes 40 | .VolumeIcon.icns 41 | .com.apple.timemachine.donotpresent 42 | 43 | # Directories potentially created on remote AFP share 44 | .AppleDB 45 | .AppleDesktop 46 | Network Trash Folder 47 | Temporary Items 48 | .apdisk 49 | 50 | ### macOS Patch ### 51 | # iCloud generated files 52 | *.icloud 53 | 54 | ### Node ### 55 | # Logs 56 | logs 57 | *.log 58 | npm-debug.log* 59 | yarn-debug.log* 60 | yarn-error.log* 61 | lerna-debug.log* 62 | .pnpm-debug.log* 63 | 64 | # Diagnostic reports (https://nodejs.org/api/report.html) 65 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 66 | 67 | # Runtime data 68 | pids 69 | *.pid 70 | *.seed 71 | *.pid.lock 72 | 73 | # Directory for instrumented libs generated by jscoverage/JSCover 74 | lib-cov 75 | 76 | # Coverage directory used by tools like istanbul 77 | coverage 78 | *.lcov 79 | 80 | # nyc test coverage 81 | .nyc_output 82 | 83 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 84 | .grunt 85 | 86 | # Bower dependency directory (https://bower.io/) 87 | bower_components 88 | 89 | # node-waf configuration 90 | .lock-wscript 91 | 92 | # Compiled binary addons (https://nodejs.org/api/addons.html) 93 | build/Release 94 | 95 | # Dependency directories 96 | node_modules/ 97 | jspm_packages/ 98 | 99 | # Snowpack dependency directory (https://snowpack.dev/) 100 | web_modules/ 101 | 102 | # TypeScript cache 103 | *.tsbuildinfo 104 | 105 | # Optional npm cache directory 106 | .npm 107 | 108 | # Optional eslint cache 109 | .eslintcache 110 | 111 | # Optional stylelint cache 112 | .stylelintcache 113 | 114 | # Microbundle cache 115 | .rpt2_cache/ 116 | .rts2_cache_cjs/ 117 | .rts2_cache_es/ 118 | .rts2_cache_umd/ 119 | 120 | # Optional REPL history 121 | .node_repl_history 122 | 123 | # Output of 'npm pack' 124 | *.tgz 125 | 126 | # Yarn Integrity file 127 | .yarn-integrity 128 | 129 | # dotenv environment variable files 130 | .env 131 | .env.development.local 132 | .env.test.local 133 | .env.production.local 134 | .env.local 135 | 136 | # parcel-bundler cache (https://parceljs.org/) 137 | .cache 138 | .parcel-cache 139 | 140 | # Next.js build output 141 | .next 142 | out 143 | 144 | # Nuxt.js build / generate output 145 | .nuxt 146 | dist 147 | 148 | # Gatsby files 149 | .cache/ 150 | # Comment in the public line in if your project uses Gatsby and not Next.js 151 | # https://nextjs.org/blog/next-9-1#public-directory-support 152 | # public 153 | 154 | # vuepress build output 155 | .vuepress/dist 156 | 157 | # vuepress v2.x temp and cache directory 158 | .temp 159 | 160 | # Docusaurus cache and generated files 161 | .docusaurus 162 | 163 | # Serverless directories 164 | .serverless/ 165 | 166 | # FuseBox cache 167 | .fusebox/ 168 | 169 | # DynamoDB Local files 170 | .dynamodb/ 171 | 172 | # TernJS port file 173 | .tern-port 174 | 175 | # Stores VSCode versions used for testing VSCode extensions 176 | .vscode-test 177 | 178 | # yarn v2 179 | .yarn/cache 180 | .yarn/unplugged 181 | .yarn/build-state.yml 182 | .yarn/install-state.gz 183 | .pnp.* 184 | 185 | ### Node Patch ### 186 | # Serverless Webpack directories 187 | .webpack/ 188 | 189 | # Optional stylelint cache 190 | 191 | # SvelteKit build / generate output 192 | .svelte-kit 193 | 194 | ### Windows ### 195 | # Windows thumbnail cache files 196 | Thumbs.db 197 | Thumbs.db:encryptable 198 | ehthumbs.db 199 | ehthumbs_vista.db 200 | 201 | # Dump file 202 | *.stackdump 203 | 204 | # Folder config file 205 | [Dd]esktop.ini 206 | 207 | # Recycle Bin used on file shares 208 | $RECYCLE.BIN/ 209 | 210 | # Windows Installer files 211 | *.cab 212 | *.msi 213 | *.msix 214 | *.msm 215 | *.msp 216 | 217 | # Windows shortcuts 218 | *.lnk 219 | 220 | ### yarn ### 221 | # https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored 222 | 223 | .yarn/* 224 | !.yarn/releases 225 | !.yarn/patches 226 | !.yarn/plugins 227 | !.yarn/sdks 228 | !.yarn/versions 229 | 230 | # if you are NOT using Zero-installs, then: 231 | # comment the following lines 232 | !.yarn/cache 233 | 234 | # and uncomment the following lines 235 | # .pnp.* 236 | 237 | # End of https://www.toptal.com/developers/gitignore/api/node,yarn,windows,macos,linux -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v20.11.1 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 |

5 | eslint-plugin-exception-handling 6 |
7 |

8 | 💣 Lints unhandled functions that might throw errors & ensure best practices. For JavaScript/TypeScript eslint. 9 |

10 |
11 |

12 | 13 |

14 | 15 | 16 | ![image](https://github.com/Akronae/eslint-plugin-exception-handling/assets/17302866/f77dd81a-09c5-4f41-a3f1-d017df1bb1b9) 17 | 18 | | no-unhandled | might-throw | use-error-cause | 19 | | --------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | 20 | | ![no-unhandled](https://github.com/Akronae/eslint-plugin-exception-handling/assets/17302866/a5a1e70a-15f6-4e2b-b585-54846e9dc3ef) | ![might-throw](https://github.com/Akronae/eslint-plugin-exception-handling/assets/17302866/26ee8fb8-bd0e-4b72-bb3f-624635db9b0d) | ![cause](https://github.com/Akronae/eslint-plugin-exception-handling/assets/17302866/f813c112-2f6a-49e7-954c-cace2819d5e8) | 21 | 22 | # Installation 23 | 24 | ```bash 25 | yarn add -D eslint-plugin-exception-handling 26 | ``` 27 | 28 | ```bash 29 | npm i -D eslint-plugin-exception-handling 30 | ``` 31 | 32 | ```bash 33 | pnpm add -D eslint-plugin-exception-handling 34 | ``` 35 | 36 | # Usage 37 | 38 | Sample `eslint.config.js`: 39 | 40 | For TypeScript: 41 | 42 | ```js 43 | // @ts-check 44 | 45 | import eslint from "@eslint/js"; 46 | import tseslint from "typescript-eslint"; 47 | import { plugin as ex } from "eslint-plugin-exception-handling"; 48 | 49 | export default tseslint.config( 50 | eslint.configs.recommended, 51 | ...tseslint.configs.recommended, 52 | { plugins: { ex }, rules: { "ex/no-unhandled": "error" } } 53 | ); 54 | ``` 55 | 56 | For JavaScript: 57 | 58 | ```js 59 | import globals from "globals"; 60 | import pluginJs from "@eslint/js"; 61 | import { plugin as ex } from "eslint-plugin-exception-handling"; 62 | 63 | export default [ 64 | { files: ["**/*.js"], languageOptions: { sourceType: "commonjs" } }, 65 | { languageOptions: { globals: globals.browser } }, 66 | pluginJs.configs.recommended, 67 | { plugins: { ex } }, 68 | { rules: { "ex/no-unhandled": "error" } }, 69 | ]; 70 | ``` 71 | 72 | # Limitations & Caveats 73 | 74 | - This plugin only checks for functions that might throw exceptions. It does not check for functions that might return a rejected promise. 75 | - Currently, only user-defined functions are checked. This means that built-in functions that might throw exceptions are not yet linted. I'm working on a feature for that, but it's quite a grind to list all the built-in functions that might throw exceptions. If you want to help feel free to open a PR. 76 | 77 | # Rules 78 | 79 | 80 | 81 | | Name            | Description | 82 | | :----------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | 83 | | [might-throw](docs/rules/might-throw.md) | Warns about function calls that might throw exceptions. | 84 | | [no-unhandled](docs/rules/no-unhandled.md) | Warns about function calls that might throw exceptions and are not handled at all further up the stack. | 85 | | [use-error-cause](docs/rules/use-error-cause.md) | On `Error` re-thrown, forces the use of `cause` property in order to preserve stack traces. See: [Error: cause](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause) | 86 | 87 | 88 | -------------------------------------------------------------------------------- /docs/rules/might-throw.md: -------------------------------------------------------------------------------- 1 | # Warns about function calls that might throw exceptions (`exception-handling/might-throw`) 2 | 3 | 4 | 5 | ![might-throw](https://github.com/Akronae/eslint-plugin-exception-handling/assets/17302866/26ee8fb8-bd0e-4b72-bb3f-624635db9b0d) 6 | -------------------------------------------------------------------------------- /docs/rules/no-unhandled.md: -------------------------------------------------------------------------------- 1 | # Warns about function calls that might throw exceptions and are not handled at all further up the stack (`exception-handling/no-unhandled`) 2 | 3 | 4 | 5 | ![no-unhandled](https://github.com/Akronae/eslint-plugin-exception-handling/assets/17302866/a5a1e70a-15f6-4e2b-b585-54846e9dc3ef) 6 | -------------------------------------------------------------------------------- /docs/rules/use-error-cause.md: -------------------------------------------------------------------------------- 1 | # On `Error` re-thrown, forces the use of `cause` property in order to preserve stack traces (`exception-handling/use-error-cause`) 2 | 3 | 4 | 5 | ![cause](https://github.com/Akronae/eslint-plugin-exception-handling/assets/17302866/f813c112-2f6a-49e7-954c-cace2819d5e8) 6 | 7 | [See `ErrorOptions.cause` on MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause) 8 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | import tseslint from "typescript-eslint"; 4 | 5 | const ignores = [ 6 | "node_modules", 7 | "dist", 8 | "docs", 9 | "**/*.d.ts", 10 | "**/*.spec.ts", 11 | "**/*.test.ts", 12 | "**/tests/**", 13 | "eslint.config.js", 14 | "eslint.config.test.js", 15 | "vitest.config.js", 16 | ]; 17 | 18 | export default tseslint.config( 19 | ...tseslint.configs.recommended.map((x) => ({ ...x, ignores })), 20 | { 21 | languageOptions: { 22 | parserOptions: { 23 | parser: "@typescript-eslint/parser", 24 | project: "./tsconfig.json", 25 | tsconfigRootDir: "./", 26 | }, 27 | }, 28 | files: ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"], 29 | ignores, 30 | rules: { 31 | "@typescript-eslint/no-unused-vars": [ 32 | "error", 33 | { argsIgnorePattern: "_" }, 34 | ], 35 | "@typescript-eslint/no-floating-promises": ["error"], 36 | "@typescript-eslint/no-unused-expressions": "error", 37 | "@typescript-eslint/no-explicit-any": "off", 38 | }, 39 | } 40 | ); 41 | -------------------------------------------------------------------------------- /eslint.config.test.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | import tseslint from "typescript-eslint"; 4 | import { plugin as ex } from "./dist/src/index.js"; 5 | import config from "./eslint.config.js"; 6 | 7 | const ignores = [ 8 | "node_modules", 9 | "dist", 10 | "docs", 11 | "**/*.d.ts", 12 | "eslint.config.js", 13 | "vitest.config.js", 14 | ]; 15 | 16 | export default tseslint.config(...config.map((x) => ({ ...x, ignores })), { 17 | plugins: { ex }, 18 | rules: { 19 | "ex/no-unhandled": "error", 20 | "ex/might-throw": "warn", 21 | "ex/use-error-cause": "warn", 22 | }, 23 | }); 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint-plugin-exception-handling", 3 | "version": "1.5.6", 4 | "description": "💣 Lints unhandled functions that might throw errors. For JavaScript/TypeScript eslint.", 5 | "author": { 6 | "email": "alexandre@daubricourt.com", 7 | "name": "Alexandre Daubricourt" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/Akronae/eslint-plugin-exception-handling.git" 12 | }, 13 | "keywords": [ 14 | "eslint", 15 | "plugin", 16 | "exception", 17 | "handling", 18 | "error", 19 | "throw", 20 | "try", 21 | "catch" 22 | ], 23 | "license": "MIT", 24 | "type": "module", 25 | "main": "./dist/src/index.js", 26 | "module": "./dist/src/index.js", 27 | "types": "./dist/src/index.d.ts", 28 | "files": [ 29 | "dist/src" 30 | ], 31 | "scripts": { 32 | "build": "yarn rimraf dist && tsc && tsc-alias", 33 | "test": "yarn build && vitest run --reporter verbose", 34 | "docs": "yarn build && eslint-doc-generator && eslint-doc-generator --init-rule-docs && eslint-doc-generator", 35 | "v:major": "npm version major -m \"chore: bump major to %s\"", 36 | "v:minor": "npm version minor -m \"chore: bump minor to %s\"", 37 | "v:patch": "npm version patch -m \"chore: bump patch to %s\"" 38 | }, 39 | "dependencies": { 40 | "eslint": "^9.3.0" 41 | }, 42 | "devDependencies": { 43 | "@types/eslint": "^9.6.1", 44 | "@types/espree": "^10.1.0", 45 | "@types/node": "^20.12.12", 46 | "@types/react": "^18.3.12", 47 | "@typescript-eslint/parser": "^7.9.0", 48 | "@typescript-eslint/rule-tester": "^7.9.0", 49 | "@typescript-eslint/types": "^7.9.0", 50 | "@typescript-eslint/utils": "^7.9.0", 51 | "eslint-doc-generator": "^1.7.1", 52 | "espree": "^10.1.0", 53 | "rimraf": "^6.0.1", 54 | "tsc": "^2.0.4", 55 | "tsc-alias": "^1.8.10", 56 | "typescript": "^5.4.5", 57 | "typescript-eslint": "^7.9.0", 58 | "vite-tsconfig-paths": "^4.3.2", 59 | "vitest": "^1.6.0" 60 | }, 61 | "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610" 62 | } 63 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { RuleModule } from "@typescript-eslint/utils/ts-eslint"; 2 | import { ESLint } from "eslint"; 3 | import { rules } from "./rules"; 4 | import noUnhandled from "./rules/no-unhandled/no-unhandled"; 5 | import mightThrow from "./rules/might-throw/might-throw"; 6 | import useErrorCause from "./rules/use-error-cause/use-error-cause"; 7 | 8 | type RuleKey = keyof typeof rules; 9 | 10 | interface Plugin extends Omit { 11 | rules: Record>; 12 | } 13 | 14 | export const name = "eslint-plugin-exception-handling"; 15 | export const plugin: Plugin = { 16 | meta: { 17 | name, 18 | version: "1.0.0", 19 | }, 20 | configs: { 21 | recommended: { 22 | plugins: [name], 23 | rules: { 24 | [`${name}/${noUnhandled.name}`]: "error", 25 | [`${name}/${mightThrow.name}`]: "off", 26 | [`${name}/${useErrorCause.name}`]: "warn", 27 | }, 28 | }, 29 | }, 30 | rules, 31 | }; 32 | 33 | export { rules }; 34 | -------------------------------------------------------------------------------- /src/rules/create-rule.ts: -------------------------------------------------------------------------------- 1 | import { ESLintUtils } from "@typescript-eslint/utils"; 2 | 3 | const website = 4 | "https://github.com/Akronae/eslint-plugin-exception-handling/tree/main/docs/rules"; 5 | 6 | export const createRule = ESLintUtils.RuleCreator( 7 | (name) => `${website}/${name}.md` 8 | ); 9 | -------------------------------------------------------------------------------- /src/rules/index.ts: -------------------------------------------------------------------------------- 1 | import mightThrow from "./might-throw/might-throw"; 2 | import noUnhandled from "./no-unhandled/no-unhandled"; 3 | import useErrorCause from "./use-error-cause/use-error-cause"; 4 | 5 | export const rules = { 6 | [noUnhandled.name]: noUnhandled.rule, 7 | [mightThrow.name]: mightThrow.rule, 8 | [useErrorCause.name]: useErrorCause.rule, 9 | }; 10 | -------------------------------------------------------------------------------- /src/rules/might-throw/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./might-throw"; 2 | -------------------------------------------------------------------------------- /src/rules/might-throw/might-throw.spec.ts: -------------------------------------------------------------------------------- 1 | import { testFile } from "@/src/utils/test-file"; 2 | import rule from "./might-throw"; 3 | 4 | await testFile( 5 | "src/rules/might-throw/tests/basic-err.ts", 6 | [rule.name], 7 | [ 8 | { 9 | messageId: "mightThrow", 10 | line: 12, 11 | }, 12 | ] 13 | ); 14 | await testFile("src/rules/might-throw/tests/basic-ok.ts", [rule.name], []); 15 | 16 | await testFile( 17 | "src/rules/might-throw/tests/import-err.ts", 18 | [rule.name], 19 | [ 20 | { 21 | messageId: "mightThrow", 22 | line: 10, 23 | }, 24 | ] 25 | ); 26 | 27 | await testFile("src/rules/might-throw/tests/import-ok.ts", [rule.name], []); 28 | await testFile( 29 | "src/rules/might-throw/tests/private-identifier-err.ts", 30 | [rule.name], 31 | [ 32 | { 33 | messageId: "mightThrow", 34 | line: 9, 35 | }, 36 | ] 37 | ); 38 | await testFile( 39 | "src/rules/might-throw/tests/private-identifier-ok.ts", 40 | [rule.name], 41 | [] 42 | ); 43 | await testFile( 44 | "src/rules/might-throw/tests/native-modules-err.ts", 45 | [rule.name], 46 | [ 47 | { 48 | messageId: "mightThrow", 49 | line: 3, 50 | }, 51 | ] 52 | ); 53 | await testFile( 54 | "src/rules/might-throw/tests/native-modules-ok.ts", 55 | [rule.name], 56 | [] 57 | ); 58 | await testFile("src/rules/might-throw/tests/generic-ok.ts", [rule.name], []); 59 | await testFile("src/rules/might-throw/tests/tsx-ok.tsx", [rule.name], []); 60 | await testFile( 61 | "src/rules/might-throw/tests/native-funcs-err.ts", 62 | [rule.name], 63 | [ 64 | { 65 | messageId: "mightThrow", 66 | line: 4, 67 | }, 68 | ] 69 | ); 70 | await testFile( 71 | "src/rules/might-throw/tests/native-funcs-err-2.ts", 72 | [rule.name], 73 | [ 74 | { 75 | messageId: "mightThrow", 76 | line: 4, 77 | }, 78 | ] 79 | ); 80 | -------------------------------------------------------------------------------- /src/rules/might-throw/might-throw.ts: -------------------------------------------------------------------------------- 1 | import { createRule } from "@/src/rules/create-rule"; 2 | import { findInParent, isFunctionDeclaration } from "@/src/utils"; 3 | import { canFuncThrow, canFuncThrowClear } from "@/src/utils/can-func-throw"; 4 | import { getCallExprId } from "@/src/utils/get-call-expr-id"; 5 | import { getFunctionId } from "@/src/utils/get-function-id"; 6 | 7 | const name = "might-throw"; 8 | const rule = createRule({ 9 | name, 10 | meta: { 11 | docs: { 12 | description: "Warns about function calls that might throw exceptions.", 13 | }, 14 | type: "suggestion", 15 | messages: { 16 | mightThrow: "'{{name}}' might throw an exception.", 17 | }, 18 | schema: [], 19 | }, 20 | defaultOptions: [], 21 | create: (context) => { 22 | canFuncThrowClear(); 23 | const throwFunctions = new Set(); 24 | 25 | return { 26 | FunctionDeclaration(node) { 27 | if (node.id) { 28 | throwFunctions.delete(getFunctionId(context, node.id)); 29 | } 30 | }, 31 | ThrowStatement(node) { 32 | const parentFunc = findInParent(node, isFunctionDeclaration); 33 | if (parentFunc?.id) { 34 | throwFunctions.add(getFunctionId(context, parentFunc.id)); 35 | } 36 | }, 37 | CallExpression(node) { 38 | const id = getCallExprId(node); 39 | if (!id) return; 40 | const throwing = canFuncThrow(id, context); 41 | if (!throwing) return; 42 | 43 | context.report({ 44 | node, 45 | messageId: "mightThrow", 46 | data: { 47 | name: id.name, 48 | }, 49 | }); 50 | }, 51 | }; 52 | }, 53 | }); 54 | 55 | export default { name, rule }; 56 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/basic-err.ts: -------------------------------------------------------------------------------- 1 | function throwingFunction() { 2 | throw new Error("This is an error"); 3 | } 4 | 5 | try { 6 | throwingFunction(); 7 | } catch (e) { 8 | console.error(e); 9 | } 10 | 11 | function a() { 12 | throwingFunction(); 13 | } 14 | 15 | try { 16 | a(); 17 | } catch (e) { 18 | console.error(e); 19 | } 20 | 21 | function b() { 22 | try { 23 | throwingFunction(); 24 | } catch (e) { 25 | console.error(e); 26 | } 27 | } 28 | 29 | b(); 30 | 31 | export {}; 32 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/basic-ok.ts: -------------------------------------------------------------------------------- 1 | function throwingFunction() { 2 | throw new Error("This is an error"); 3 | } 4 | 5 | try { 6 | throwingFunction(); 7 | } catch (e) { 8 | console.error(e); 9 | } 10 | 11 | function a() { 12 | try { 13 | throwingFunction(); 14 | } catch (e) { 15 | console.error(e); 16 | } 17 | } 18 | 19 | a(); 20 | 21 | function b() { 22 | try { 23 | throwingFunction(); 24 | } catch (e) { 25 | console.error(e); 26 | } 27 | } 28 | 29 | b(); 30 | 31 | export {}; 32 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/generic-impt-ok.ts: -------------------------------------------------------------------------------- 1 | import { genericFunc } from "./generic-ok"; 2 | 3 | export const imptGenericFunc = () => { 4 | return genericFunc([false]); 5 | }; 6 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/generic-ok.ts: -------------------------------------------------------------------------------- 1 | export const genericFunc = (val: Array) => { 2 | return val; 3 | }; 4 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/import-err.ts: -------------------------------------------------------------------------------- 1 | import { throwingFunc } from "./throwing-func"; 2 | 3 | try { 4 | throwingFunc(); 5 | } catch (e) { 6 | console.error(e); 7 | } 8 | 9 | function a() { 10 | throwingFunc(); 11 | } 12 | 13 | try { 14 | a(); 15 | } catch (e) { 16 | console.error(e); 17 | } 18 | 19 | function b() { 20 | try { 21 | throwingFunc(); 22 | } catch (e) { 23 | console.error(e); 24 | } 25 | } 26 | 27 | b(); 28 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/import-ok.ts: -------------------------------------------------------------------------------- 1 | import { throwingFunc } from "./throwing-func"; 2 | 3 | try { 4 | throwingFunc(); 5 | } catch (e) { 6 | console.error(e); 7 | } 8 | 9 | function a() { 10 | try { 11 | throwingFunc(); 12 | } catch (e) { 13 | console.error(e); 14 | } 15 | } 16 | 17 | a(); 18 | 19 | function b() { 20 | try { 21 | throwingFunc(); 22 | } catch (e) { 23 | console.error(e); 24 | } 25 | } 26 | 27 | b(); 28 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/native-funcs-err-2.ts: -------------------------------------------------------------------------------- 1 | import { createHash } from "node:crypto"; 2 | 3 | function hashFile(filePath: string, outputFile?: string) { 4 | const hash = createHash("sha256"); 5 | const digest = hash.digest("hex"); 6 | console.log(digest); 7 | } 8 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/native-funcs-err.ts: -------------------------------------------------------------------------------- 1 | import { existsSync } from "fs"; 2 | 3 | export function hashFile() { 4 | if (!existsSync("fullPath")) { 5 | console.error(`File not found: ${"fullPath"}`); 6 | process.exit(1); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/native-modules-err.ts: -------------------------------------------------------------------------------- 1 | import { readFileSync } from "fs"; 2 | 3 | const content = readFileSync("this file does not exist", "utf-8"); 4 | console.log({ content }); 5 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/native-modules-ok.ts: -------------------------------------------------------------------------------- 1 | import { readFileSync } from "fs"; 2 | 3 | try { 4 | const content = readFileSync("this file does not exist", "utf-8"); 5 | console.log({ content }); 6 | } catch (e) { 7 | console.error(e); 8 | } 9 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/private-identifier-err.ts: -------------------------------------------------------------------------------- 1 | import { throwingFunc } from "./throwing-func"; 2 | 3 | export class Test { 4 | public constructor() { 5 | this.#privateMethod(); 6 | } 7 | 8 | #privateMethod() { 9 | throwingFunc(); 10 | } 11 | } 12 | 13 | new Test(); 14 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/private-identifier-ok.ts: -------------------------------------------------------------------------------- 1 | export class Test { 2 | public constructor() { 3 | this.#privateMethod(); 4 | } 5 | 6 | #privateMethod() { 7 | console.log("Hello"); 8 | } 9 | } 10 | 11 | new Test(); 12 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/throwing-func.ts: -------------------------------------------------------------------------------- 1 | export function throwingFunc() { 2 | throw new Error("heyyyy!"); 3 | } 4 | -------------------------------------------------------------------------------- /src/rules/might-throw/tests/tsx-ok.tsx: -------------------------------------------------------------------------------- 1 | import { imptGenericFunc } from "./generic-impt-ok"; 2 | import { genericFunc } from "./generic-ok"; 3 | 4 | export function MyComp() { 5 | genericFunc([false]); 6 | imptGenericFunc(); 7 | return
Hello World
; 8 | } 9 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./no-unhandled"; 2 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/no-unhandled.spec.ts: -------------------------------------------------------------------------------- 1 | import { testFile } from "@/src/utils/test-file"; 2 | import rule from "./no-unhandled"; 3 | 4 | await testFile( 5 | "src/rules/no-unhandled/tests/import-err.ts", 6 | [rule.name], 7 | [ 8 | { 9 | messageId: "noUnhandled", 10 | }, 11 | ] 12 | ); 13 | await testFile("src/rules/no-unhandled/tests/import-ok.ts", [rule.name], []); 14 | await testFile("src/rules/no-unhandled/tests/import-ok-2.ts", [rule.name], []); 15 | await testFile("src/rules/no-unhandled/tests/basic-ok.ts", [rule.name], []); 16 | await testFile("src/rules/no-unhandled/tests/basic-ok-2.ts", [rule.name], []); 17 | await testFile( 18 | "src/rules/no-unhandled/tests/basic-err.ts", 19 | [rule.name], 20 | [ 21 | { 22 | messageId: "noUnhandled", 23 | }, 24 | ] 25 | ); 26 | await testFile( 27 | "src/rules/no-unhandled/tests/basic-err-2.ts", 28 | [rule.name], 29 | [ 30 | { 31 | messageId: "noUnhandled", 32 | }, 33 | { 34 | messageId: "noUnhandled", 35 | }, 36 | { 37 | messageId: "noUnhandled", 38 | }, 39 | ] 40 | ); 41 | await testFile( 42 | "src/rules/no-unhandled/tests/basic-err-3.ts", 43 | [rule.name], 44 | [ 45 | { 46 | messageId: "noUnhandled", 47 | }, 48 | { 49 | messageId: "noUnhandled", 50 | }, 51 | ] 52 | ); 53 | await testFile( 54 | "src/rules/no-unhandled/tests/basic-err-4.ts", 55 | [rule.name], 56 | [ 57 | { 58 | messageId: "noUnhandled", 59 | }, 60 | ] 61 | ); 62 | await testFile("src/rules/no-unhandled/tests/module-ok.ts", [rule.name], []); 63 | await testFile( 64 | "src/rules/no-unhandled/tests/private-identifier-ok.ts", 65 | [rule.name], 66 | [] 67 | ); 68 | await testFile( 69 | "src/rules/no-unhandled/tests/private-identifier-err.ts", 70 | [rule.name], 71 | [] 72 | ); 73 | await testFile("src/rules/no-unhandled/tests/recursive-ok.ts", [rule.name], []); 74 | await testFile( 75 | "src/rules/no-unhandled/tests/recursive-err.ts", 76 | [rule.name], 77 | [ 78 | { 79 | messageId: "noUnhandled", 80 | line: 15, 81 | }, 82 | { 83 | messageId: "noUnhandled", 84 | line: 16, 85 | }, 86 | ] 87 | ); 88 | await testFile( 89 | "src/rules/no-unhandled/tests/native-modules-err.ts", 90 | [rule.name], 91 | [ 92 | { 93 | messageId: "noUnhandled", 94 | line: 3, 95 | }, 96 | ] 97 | ); 98 | await testFile( 99 | "src/rules/no-unhandled/tests/native-modules-ok.ts", 100 | [rule.name], 101 | [] 102 | ); 103 | await testFile( 104 | "src/rules/no-unhandled/tests/alias-err.ts", 105 | [rule.name], 106 | [ 107 | { 108 | messageId: "noUnhandled", 109 | line: 54, 110 | }, 111 | ] 112 | ); 113 | await testFile("src/rules/no-unhandled/tests/alias-ok.ts", [rule.name], []); 114 | await testFile( 115 | "src/rules/no-unhandled/tests/array-destructuring-ok.ts", 116 | [rule.name], 117 | [] 118 | ); 119 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/no-unhandled.ts: -------------------------------------------------------------------------------- 1 | import { createRule } from "@/src/rules/create-rule"; 2 | import { 3 | findInChildren, 4 | findInParent, 5 | getCallExprId, 6 | isFunctionDeclaration, 7 | isMethodDefinition, 8 | } from "@/src/utils"; 9 | import { canFuncThrow, canFuncThrowClear } from "@/src/utils/can-func-throw"; 10 | import { isIdentifier } from "@typescript-eslint/utils/ast-utils"; 11 | 12 | const name = "no-unhandled"; 13 | const rule = createRule({ 14 | name, 15 | meta: { 16 | docs: { 17 | description: 18 | "Warns about function calls that might throw exceptions and are not handled at all further up the stack.", 19 | }, 20 | type: "suggestion", 21 | messages: { 22 | noUnhandled: "'{{name}}' might throw an exception and is not handled.", 23 | }, 24 | schema: [], 25 | }, 26 | defaultOptions: [], 27 | create: (context) => { 28 | canFuncThrowClear(); 29 | 30 | return { 31 | CallExpression(called) { 32 | const id = getCallExprId(called); 33 | if (!id) return; 34 | const throws = canFuncThrow(id, context); 35 | 36 | if (throws) { 37 | const parentFunction = findInParent(called, isFunctionDeclaration); 38 | const parentMethod = findInParent(called, isMethodDefinition); 39 | const id = findInChildren(called, isIdentifier); 40 | if (!parentFunction?.id && !parentMethod?.key) { 41 | context.report({ 42 | node: called, 43 | messageId: "noUnhandled", 44 | data: { 45 | name: id?.name, 46 | }, 47 | }); 48 | } 49 | } 50 | }, 51 | }; 52 | }, 53 | }); 54 | 55 | export default { name, rule }; 56 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/alias-err.ts: -------------------------------------------------------------------------------- 1 | import { throwingFunc } from "@/src/rules/no-unhandled/tests/throwing-func"; 2 | 3 | const x = 5; 4 | let y = "abc123"; 5 | function myFunction() {} 6 | myFunction(); 7 | const myErr = new Error(); 8 | throw new Error("heyyyy!"); 9 | function c() { 10 | a(); 11 | } 12 | function a() { 13 | throw new Error("heyyyy!"); 14 | } 15 | function b() { 16 | c(); 17 | } 18 | 19 | try { 20 | b(); 21 | } catch (e) { 22 | console.error(e); 23 | } 24 | 25 | function d() { 26 | a(); 27 | } 28 | function e() { 29 | throw new Error("heyyyy!"); 30 | } 31 | function f() { 32 | try { 33 | c(); 34 | } catch (e) { 35 | console.error(e); 36 | } 37 | } 38 | function g() { 39 | d(); 40 | } 41 | 42 | f(); 43 | 44 | try { 45 | e(); 46 | } catch (e) { 47 | console.error(e); 48 | } 49 | 50 | function h() { 51 | throwingFunc(); 52 | } 53 | 54 | throwingFunc(); 55 | 56 | export {}; 57 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/alias-ok.ts: -------------------------------------------------------------------------------- 1 | import { throwingFunc } from "@/src/rules/no-unhandled/tests/throwing-func"; 2 | 3 | const x = 5; 4 | let y = "abc123"; 5 | function myFunction() {} 6 | myFunction(); 7 | const myErr = new Error(); 8 | throw new Error("heyyyy!"); 9 | function c() { 10 | a(); 11 | } 12 | function a() { 13 | throw new Error("heyyyy!"); 14 | } 15 | function b() { 16 | c(); 17 | } 18 | 19 | try { 20 | b(); 21 | } catch (e) { 22 | console.error(e); 23 | } 24 | 25 | function d() { 26 | a(); 27 | } 28 | function e() { 29 | throw new Error("heyyyy!"); 30 | } 31 | function f() { 32 | try { 33 | c(); 34 | } catch (e) { 35 | console.error(e); 36 | } 37 | } 38 | function g() { 39 | d(); 40 | } 41 | 42 | f(); 43 | 44 | try { 45 | e(); 46 | } catch (e) { 47 | console.error(e); 48 | } 49 | 50 | function h() { 51 | try { 52 | throwingFunc(); 53 | } catch (e) { 54 | console.error(e); 55 | } 56 | } 57 | 58 | h(); 59 | 60 | try { 61 | throwingFunc(); 62 | h(); 63 | } catch (e) { 64 | console.error(e); 65 | } 66 | 67 | export {}; 68 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/array-destructuring-ok.ts: -------------------------------------------------------------------------------- 1 | const pairs = new Map([ 2 | ["foo", 1], 3 | ["bar", 2], 4 | ]); 5 | 6 | Array.from(pairs.entries()) 7 | .filter(([, count]) => count > 1) 8 | .forEach(([identifier]) => { 9 | console.log(identifier); 10 | }); 11 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/basic-err-2.ts: -------------------------------------------------------------------------------- 1 | function c() { 2 | a(); 3 | } 4 | function a() { 5 | throw new Error("heyyyy!"); 6 | } 7 | try { 8 | c(); 9 | } catch (e) { 10 | console.error(e); 11 | } 12 | c(); 13 | c(); 14 | 15 | function f() { 16 | try { 17 | c(); 18 | } catch (e) { 19 | console.error(e); 20 | throw e; 21 | } 22 | 23 | try { 24 | throw new Error("heyyyy!"); 25 | } catch (e) { 26 | console.error(e); 27 | } 28 | } 29 | 30 | f(); 31 | 32 | export {}; 33 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/basic-err-3.ts: -------------------------------------------------------------------------------- 1 | function c() { 2 | a(); 3 | } 4 | function a() { 5 | throw new Error("heyyyy!"); 6 | } 7 | try { 8 | c(); 9 | } catch (e) { 10 | console.error(e); 11 | } 12 | c(); 13 | c(); 14 | 15 | function f() { 16 | try { 17 | c(); 18 | } catch (e) { 19 | console.error(e); 20 | } 21 | } 22 | 23 | f(); 24 | 25 | export {}; 26 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/basic-err-4.ts: -------------------------------------------------------------------------------- 1 | function abcd() { 2 | throw new Error("heyyyy!"); 3 | } 4 | 5 | abcd(); 6 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/basic-err.ts: -------------------------------------------------------------------------------- 1 | function c() { 2 | a(); 3 | } 4 | function a() { 5 | throw new Error("heyyyy!"); 6 | } 7 | function b() { 8 | c(); 9 | } 10 | b(); 11 | 12 | export {}; 13 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/basic-ok-2.ts: -------------------------------------------------------------------------------- 1 | function abc() { 2 | throw new Error("heyyyy!"); 3 | } 4 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/basic-ok.ts: -------------------------------------------------------------------------------- 1 | import { throwingFunc } from "./throwing-func"; 2 | 3 | const x = 5; 4 | let y = "abc123"; 5 | function myFunction() {} 6 | myFunction(); 7 | const myErr = new Error(); 8 | throw new Error("heyyyy!"); 9 | function c() { 10 | a(); 11 | } 12 | function a() { 13 | throw new Error("heyyyy!"); 14 | } 15 | function b() { 16 | c(); 17 | } 18 | 19 | try { 20 | b(); 21 | } catch (e) { 22 | console.error(e); 23 | } 24 | 25 | function d() { 26 | a(); 27 | } 28 | function e() { 29 | throw new Error("heyyyy!"); 30 | } 31 | function f() { 32 | try { 33 | c(); 34 | } catch (e) { 35 | console.error(e); 36 | } 37 | } 38 | function g() { 39 | d(); 40 | } 41 | 42 | f(); 43 | 44 | try { 45 | e(); 46 | } catch (e) { 47 | console.error(e); 48 | } 49 | 50 | function h() { 51 | throwingFunc(); 52 | } 53 | 54 | export {}; 55 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/import-err.ts: -------------------------------------------------------------------------------- 1 | import { throwingFunc } from "./throwing-func"; 2 | 3 | function c() { 4 | d(); 5 | } 6 | 7 | function a() { 8 | b(); 9 | } 10 | 11 | function b() { 12 | c(); 13 | } 14 | 15 | function d() { 16 | try { 17 | console.log("hey!"); 18 | } catch (e) { 19 | console.error(e); 20 | } 21 | 22 | throwingFunc(); 23 | } 24 | 25 | a(); 26 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/import-ok-2.ts: -------------------------------------------------------------------------------- 1 | import { throwingFunc } from "./throwing-func"; 2 | 3 | function a() { 4 | b(); 5 | } 6 | 7 | function b() { 8 | try { 9 | c(); 10 | } catch (e) { 11 | console.error(e); 12 | } 13 | } 14 | 15 | function c() { 16 | d(); 17 | } 18 | 19 | function d() { 20 | throwingFunc(); 21 | } 22 | 23 | a(); 24 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/import-ok.ts: -------------------------------------------------------------------------------- 1 | import { throwingFunc } from "./throwing-func"; 2 | 3 | function a() { 4 | b(); 5 | } 6 | 7 | function b() { 8 | c(); 9 | } 10 | 11 | function c() { 12 | d(); 13 | } 14 | 15 | function d() { 16 | throwingFunc(); 17 | } 18 | 19 | try { 20 | a(); 21 | } catch (e) { 22 | console.error(e); 23 | } 24 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/module-ok.ts: -------------------------------------------------------------------------------- 1 | import { readFile } from "fs/promises"; 2 | 3 | async function a() { 4 | await readFile("./test.txt", "utf-8"); 5 | } 6 | 7 | a(); 8 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/native-modules-err.ts: -------------------------------------------------------------------------------- 1 | import { readFileSync } from "fs"; 2 | 3 | const content = readFileSync("this file does not exist", "utf-8"); 4 | console.log({ content }); 5 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/native-modules-ok.ts: -------------------------------------------------------------------------------- 1 | import { readFileSync } from "fs"; 2 | 3 | try { 4 | const content = readFileSync("this file does not exist", "utf-8"); 5 | console.log({ content }); 6 | } catch (e) { 7 | console.error(e); 8 | } 9 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/private-identifier-err.ts: -------------------------------------------------------------------------------- 1 | import { throwingFunc } from "./throwing-func"; 2 | 3 | class Test { 4 | public constructor() { 5 | this.#privateMethod(); 6 | } 7 | 8 | #privateMethod() { 9 | throwingFunc(); 10 | } 11 | } 12 | 13 | new Test(); 14 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/private-identifier-ok.ts: -------------------------------------------------------------------------------- 1 | import { throwingFunc } from "./throwing-func"; 2 | 3 | class Test { 4 | public constructor() { 5 | this.#privateMethod(); 6 | } 7 | 8 | #privateMethod() { 9 | console.log("Hello"); 10 | } 11 | } 12 | 13 | new Test(); 14 | 15 | class Test2 { 16 | public constructor() { 17 | this.#privateMethod(); 18 | } 19 | 20 | #privateMethod() { 21 | throwingFunc(); 22 | } 23 | } 24 | 25 | try { 26 | new Test2(); 27 | } catch (e) { 28 | console.error(e); 29 | } 30 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/recursive-err.ts: -------------------------------------------------------------------------------- 1 | function a() { 2 | a(); 3 | throw new Error("error"); 4 | } 5 | 6 | function b() { 7 | c(); 8 | throw new Error("error"); 9 | } 10 | 11 | function c() { 12 | b(); 13 | } 14 | 15 | a(); 16 | b(); 17 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/recursive-ok.ts: -------------------------------------------------------------------------------- 1 | function a() { 2 | a(); 3 | } 4 | 5 | function b() { 6 | c(); 7 | } 8 | 9 | function c() { 10 | b(); 11 | } 12 | 13 | a(); 14 | b(); 15 | 16 | export {}; 17 | -------------------------------------------------------------------------------- /src/rules/no-unhandled/tests/throwing-func.ts: -------------------------------------------------------------------------------- 1 | export function throwingFunc() { 2 | try { 3 | throw new Error("heyyyy!"); 4 | } catch (e) { 5 | console.error(e); 6 | } 7 | 8 | throw new Error("heyyyy!"); 9 | } 10 | -------------------------------------------------------------------------------- /src/rules/use-error-cause/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./use-error-cause"; 2 | -------------------------------------------------------------------------------- /src/rules/use-error-cause/tests/basic-err.ts: -------------------------------------------------------------------------------- 1 | function throwingFunction() { 2 | throw new Error("This is an error"); 3 | } 4 | 5 | function a() { 6 | throwingFunction(); 7 | } 8 | 9 | function b() { 10 | try { 11 | a(); 12 | } catch (e) { 13 | console.error(e); 14 | } 15 | } 16 | 17 | function c() { 18 | b(); 19 | } 20 | 21 | function d() { 22 | try { 23 | a(); 24 | } catch (e) { 25 | console.error(e); 26 | throw e; 27 | } 28 | } 29 | 30 | function e() { 31 | try { 32 | a(); 33 | } catch (e) { 34 | console.error(e); 35 | throw new Error("This is another error"); 36 | } 37 | } 38 | 39 | export {}; 40 | -------------------------------------------------------------------------------- /src/rules/use-error-cause/tests/basic-ok.ts: -------------------------------------------------------------------------------- 1 | function throwingFunction() { 2 | throw new Error("This is an error"); 3 | } 4 | 5 | function a() { 6 | throwingFunction(); 7 | } 8 | 9 | function b() { 10 | try { 11 | a(); 12 | } catch (e) { 13 | console.error(e); 14 | } 15 | } 16 | 17 | function c() { 18 | b(); 19 | } 20 | 21 | function d() { 22 | try { 23 | a(); 24 | } catch (e) { 25 | console.error(e); 26 | throw e; 27 | } 28 | } 29 | 30 | function e() { 31 | try { 32 | a(); 33 | } catch (e) { 34 | console.error(e); 35 | throw new Error("This is another error", { cause: e }); 36 | } 37 | } 38 | 39 | export {}; 40 | -------------------------------------------------------------------------------- /src/rules/use-error-cause/tests/import-err.ts: -------------------------------------------------------------------------------- 1 | import { throwingFunc } from "./throwing-func"; 2 | 3 | function a() { 4 | throwingFunc(); 5 | } 6 | 7 | function b() { 8 | try { 9 | a(); 10 | } catch (e) { 11 | console.error(e); 12 | } 13 | } 14 | 15 | function c() { 16 | b(); 17 | } 18 | 19 | function d() { 20 | try { 21 | a(); 22 | } catch (e) { 23 | console.error(e); 24 | throw e; 25 | } 26 | } 27 | 28 | function e() { 29 | try { 30 | a(); 31 | } catch (e) { 32 | console.error(e); 33 | throw new Error("This is another error"); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/rules/use-error-cause/tests/import-ok.ts: -------------------------------------------------------------------------------- 1 | import { throwingFunc } from "./throwing-func"; 2 | 3 | function a() { 4 | throwingFunc(); 5 | } 6 | 7 | function b() { 8 | try { 9 | a(); 10 | } catch (e) { 11 | console.error(e); 12 | } 13 | } 14 | 15 | function c() { 16 | b(); 17 | } 18 | 19 | function d() { 20 | try { 21 | a(); 22 | } catch (e) { 23 | console.error(e); 24 | throw e; 25 | } 26 | } 27 | 28 | function e() { 29 | try { 30 | a(); 31 | } catch (e) { 32 | console.error(e); 33 | throw new Error("This is another error", { cause: e }); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/rules/use-error-cause/tests/throwing-func.ts: -------------------------------------------------------------------------------- 1 | export function throwingFunc() { 2 | throw new Error("heyyyy!"); 3 | } 4 | -------------------------------------------------------------------------------- /src/rules/use-error-cause/use-error-cause.spec.ts: -------------------------------------------------------------------------------- 1 | import { testFile } from "@/src/utils/test-file"; 2 | import rule from "./use-error-cause"; 3 | 4 | await testFile("src/rules/use-error-cause/tests/basic-ok.ts", [rule.name], []); 5 | await testFile( 6 | "src/rules/use-error-cause/tests/basic-err.ts", 7 | [rule.name], 8 | [ 9 | { 10 | messageId: "noCause", 11 | line: 35, 12 | }, 13 | ] 14 | ); 15 | 16 | await testFile("src/rules/use-error-cause/tests/import-ok.ts", [rule.name], []); 17 | await testFile( 18 | "src/rules/use-error-cause/tests/import-err.ts", 19 | [rule.name], 20 | [ 21 | { 22 | messageId: "noCause", 23 | line: 33, 24 | }, 25 | ] 26 | ); 27 | -------------------------------------------------------------------------------- /src/rules/use-error-cause/use-error-cause.ts: -------------------------------------------------------------------------------- 1 | import { ESLintUtils, TSESTree } from "@typescript-eslint/utils"; 2 | import { 3 | findInParent, 4 | isCatchClause, 5 | isIdentifier, 6 | isNewExpression, 7 | isObjectExpression, 8 | isProperty, 9 | } from "@/src/utils"; 10 | import { createRule } from "../create-rule"; 11 | 12 | const name = "use-error-cause"; 13 | const rule = createRule({ 14 | name, 15 | meta: { 16 | docs: { 17 | description: 18 | "On `Error` re-thrown, forces the use of `cause` property in order to preserve stack traces.", 19 | }, 20 | type: "suggestion", 21 | messages: { 22 | noCause: 23 | "Use `cause` property when re-throwing, `Error(message, { cause: {{name}} })`.", 24 | }, 25 | schema: [], 26 | }, 27 | defaultOptions: [], 28 | create: (context) => { 29 | return { 30 | ThrowStatement(node) { 31 | const catch_ = findInParent(node, isCatchClause); 32 | if (!catch_) return; 33 | if (!isIdentifier(catch_.param)) return; 34 | if (!isNewExpression(node.argument)) return; 35 | const arg = node.argument as TSESTree.NewExpression; 36 | if (isObjectExpression(arg.arguments[1])) { 37 | const hasCauseProp = arg.arguments[1].properties.some( 38 | (p) => 39 | isProperty(p) && isIdentifier(p.key) && p.key.name === "cause" 40 | ); 41 | if (hasCauseProp) { 42 | return; 43 | } 44 | } 45 | context.report({ 46 | node, 47 | messageId: "noCause", 48 | data: { 49 | name: catch_.param.name, 50 | }, 51 | }); 52 | }, 53 | }; 54 | }, 55 | }); 56 | 57 | export default { name, rule }; 58 | -------------------------------------------------------------------------------- /src/utils/ast-guards.ts: -------------------------------------------------------------------------------- 1 | import { AST_NODE_TYPES, TSESTree } from "@typescript-eslint/types"; 2 | 3 | type Typed = TSESTree.Node | null | undefined; 4 | 5 | export function isFunctionDeclaration( 6 | node: Typed 7 | ): node is TSESTree.FunctionDeclaration { 8 | return node != null && node.type === AST_NODE_TYPES.FunctionDeclaration; 9 | } 10 | 11 | export function isMethodDefinition( 12 | node: Typed 13 | ): node is TSESTree.MethodDefinition { 14 | return node != null && node.type === AST_NODE_TYPES.MethodDefinition; 15 | } 16 | 17 | export function isMemberExpression( 18 | node: Typed 19 | ): node is TSESTree.MemberExpression { 20 | return node != null && node.type === AST_NODE_TYPES.MemberExpression; 21 | } 22 | 23 | export function isTryStatement(node: Typed): node is TSESTree.TryStatement { 24 | return node != null && node.type === AST_NODE_TYPES.TryStatement; 25 | } 26 | 27 | export function isImportDeclaration( 28 | node: Typed 29 | ): node is TSESTree.ImportDeclaration { 30 | return node != null && node.type === AST_NODE_TYPES.ImportDeclaration; 31 | } 32 | 33 | export function isImportSpecifier( 34 | node: Typed 35 | ): node is TSESTree.ImportSpecifier { 36 | return node != null && node.type === AST_NODE_TYPES.ImportSpecifier; 37 | } 38 | 39 | export function isVariableDeclaration( 40 | node: Typed 41 | ): node is TSESTree.VariableDeclaration { 42 | return node != null && node.type === AST_NODE_TYPES.VariableDeclaration; 43 | } 44 | 45 | export function isVariableDeclarator( 46 | node: Typed 47 | ): node is TSESTree.VariableDeclarator { 48 | return node != null && node.type === AST_NODE_TYPES.VariableDeclarator; 49 | } 50 | 51 | export function isBlockStatement(node: Typed): node is TSESTree.BlockStatement { 52 | return node != null && node.type === AST_NODE_TYPES.BlockStatement; 53 | } 54 | 55 | export function isProgram(node: Typed): node is TSESTree.Program { 56 | return node != null && node.type === AST_NODE_TYPES.Program; 57 | } 58 | 59 | export function isExportNamedDeclaration( 60 | node: Typed 61 | ): node is TSESTree.ExportNamedDeclaration { 62 | return node != null && node.type === AST_NODE_TYPES.ExportNamedDeclaration; 63 | } 64 | 65 | export function isThrowStatement(node: Typed): node is TSESTree.ThrowStatement { 66 | return node != null && node.type === AST_NODE_TYPES.ThrowStatement; 67 | } 68 | 69 | export function isCallExpression(node: Typed): node is TSESTree.CallExpression { 70 | return node != null && node.type === AST_NODE_TYPES.CallExpression; 71 | } 72 | 73 | export function isIdentifier(node: Typed): node is TSESTree.Identifier { 74 | return node != null && node.type === AST_NODE_TYPES.Identifier; 75 | } 76 | 77 | export function isPrivateIdentifier( 78 | node: Typed 79 | ): node is TSESTree.PrivateIdentifier { 80 | return node != null && node.type === AST_NODE_TYPES.PrivateIdentifier; 81 | } 82 | 83 | export function isCatchClause(node: Typed): node is TSESTree.CatchClause { 84 | return node != null && node.type === AST_NODE_TYPES.CatchClause; 85 | } 86 | 87 | export function isNewExpression(node: Typed): node is TSESTree.NewExpression { 88 | return node != null && node.type === AST_NODE_TYPES.NewExpression; 89 | } 90 | 91 | export function isObjectExpression( 92 | node: Typed 93 | ): node is TSESTree.ObjectExpression { 94 | return node != null && node.type === AST_NODE_TYPES.ObjectExpression; 95 | } 96 | 97 | export function isProperty(node: Typed): node is TSESTree.Property { 98 | return node != null && node.type === AST_NODE_TYPES.Property; 99 | } 100 | 101 | export function isClassDeclaration( 102 | node: Typed 103 | ): node is TSESTree.ClassDeclaration { 104 | return node != null && node.type === AST_NODE_TYPES.ClassDeclaration; 105 | } 106 | 107 | export function isArrowFunctionExpression( 108 | node: Typed 109 | ): node is TSESTree.ArrowFunctionExpression { 110 | return node != null && node.type === AST_NODE_TYPES.ArrowFunctionExpression; 111 | } 112 | 113 | export function isExpressionStatement( 114 | node: Typed 115 | ): node is TSESTree.ExpressionStatement { 116 | return node != null && node.type === AST_NODE_TYPES.ExpressionStatement; 117 | } 118 | -------------------------------------------------------------------------------- /src/utils/can-func-throw.ts: -------------------------------------------------------------------------------- 1 | import { 2 | exploreChildren, 3 | findInChildren, 4 | findInParent, 5 | getFunctionId, 6 | isCallExpression, 7 | isCatchClause, 8 | isThrowStatement, 9 | isTryStatement, 10 | resolveFunc, 11 | } from "@/src/utils"; 12 | import { nativeThrowing } from "@/src/utils/native-throwing"; 13 | import { TSESTree } from "@typescript-eslint/utils"; 14 | import { isIdentifier } from "@typescript-eslint/utils/ast-utils"; 15 | import { RuleContext } from "@typescript-eslint/utils/ts-eslint"; 16 | 17 | const throwFunctions = new Set(); 18 | const scannedFunctions = new Set(); 19 | 20 | const getNodeId = ( 21 | node: TSESTree.Node, 22 | context: RuleContext 23 | ) => 24 | [ 25 | node.type, 26 | (node as any).name, 27 | (node as any).id?.name, 28 | node.loc?.start.line, 29 | node.loc?.end.line, 30 | node.loc?.start.column, 31 | node.loc?.end.column, 32 | context.filename, 33 | ].join(" "); 34 | 35 | export function canFuncThrowClear() { 36 | throwFunctions.clear(); 37 | scannedFunctions.clear(); 38 | } 39 | 40 | const checked: Record = {}; 41 | 42 | export function canFuncThrow( 43 | node: TSESTree.Identifier | TSESTree.PrivateIdentifier, 44 | context: RuleContext 45 | ): boolean { 46 | const nodeId = getNodeId(node, context); 47 | if (checked[nodeId] != undefined) return checked[nodeId]; 48 | const try_ = findInParent(node, isTryStatement); 49 | if (try_) { 50 | checked[nodeId] = false; 51 | return false; 52 | } 53 | 54 | const res = resolveFunc(node, context); 55 | if (res?.module) { 56 | const found = nativeThrowing.some( 57 | (x) => x.module === res.module && x.method === res.func.id?.name 58 | ); 59 | if (found) { 60 | checked[nodeId] = true; 61 | return true; 62 | } 63 | } 64 | if (!res?.func) { 65 | checked[nodeId] = false; 66 | return false; 67 | } 68 | 69 | if (checked[nodeId] != true) checked[nodeId] = false; 70 | const scanRes = scanfunc(res.func, res.context); 71 | checked[nodeId] = scanRes; 72 | return scanRes; 73 | } 74 | 75 | function scanfunc( 76 | node: TSESTree.FunctionDeclaration, 77 | context: RuleContext 78 | ): boolean { 79 | const throws = exploreChildren(node, (child, parent_, resolve) => { 80 | const try_ = findInParent(child, isTryStatement); 81 | if (try_) { 82 | const catch_ = findInChildren(try_.parent, isCatchClause); 83 | const throw_ = catch_ && findInChildren(catch_, isThrowStatement); 84 | if (throw_) { 85 | resolve(true); 86 | } 87 | return; 88 | } 89 | 90 | if (isCallExpression(child) && isIdentifier(child.callee)) { 91 | let throws = false; 92 | 93 | if (scannedFunctions.has(getFunctionId(context, child.callee))) { 94 | throws = throwFunctions.has(getFunctionId(context, child.callee)); 95 | 96 | if (throws) resolve(throws); 97 | return; 98 | } 99 | 100 | throws = canFuncThrow(child.callee, context); 101 | if (throws) { 102 | if (node.id) throwFunctions.add(getFunctionId(context, node.id)); 103 | resolve(true); 104 | } 105 | } else if (isThrowStatement(child) && node.id) { 106 | throwFunctions.add(getFunctionId(context, node.id)); 107 | resolve(true); 108 | } 109 | }); 110 | 111 | if (node.id) { 112 | scannedFunctions.add(getFunctionId(context, node.id)); 113 | if (throws) { 114 | throwFunctions.add(getFunctionId(context, node.id)); 115 | } 116 | } 117 | 118 | return !!throws; 119 | } 120 | -------------------------------------------------------------------------------- /src/utils/explore-children.ts: -------------------------------------------------------------------------------- 1 | import { TSESTree } from "@typescript-eslint/types"; 2 | 3 | export function exploreChildren( 4 | node: TSESTree.Node, 5 | predicate: ( 6 | _node: TSESTree.Node, 7 | _parent: TSESTree.Node | undefined, 8 | _resolve: (_args: T) => void 9 | ) => void 10 | ): T | undefined { 11 | const explored = new Set(); 12 | 13 | const explore = ( 14 | node: TSESTree.Node, 15 | parent?: TSESTree.Node 16 | ): T | undefined => { 17 | let rtrn = null; 18 | predicate(node, parent, (args) => { 19 | rtrn = args; 20 | }); 21 | if (rtrn) return rtrn; 22 | for (const key in node) { 23 | if (key === "parent") continue; 24 | const val = node[key as keyof TSESTree.Node] as 25 | | TSESTree.Node 26 | | TSESTree.Node[] 27 | | undefined; 28 | 29 | if (val && typeof val === "object") { 30 | if (Array.isArray(val)) { 31 | for (const v of val) { 32 | if (v?.type) { 33 | if (explored.has(v)) continue; 34 | explored.add(v); 35 | const res = explore(v, node); 36 | if (res) return res; 37 | } 38 | } 39 | } else if (val.type) { 40 | if (explored.has(val)) continue; 41 | explored.add(val); 42 | const res = explore(val, node); 43 | if (res) return res; 44 | } 45 | } 46 | } 47 | }; 48 | return explore(node, node.parent); 49 | } 50 | 51 | // [ 52 | // "body", 53 | // "params", 54 | // "callee", 55 | // "expression", 56 | // "arguments", 57 | // "block", 58 | // "handler", 59 | // "finalizer", 60 | // "specifiers", 61 | // "assertions", 62 | // "argument", 63 | // "property", 64 | // "id", 65 | // "object", 66 | // "attributes", 67 | // "declaration", 68 | // ]; 69 | -------------------------------------------------------------------------------- /src/utils/find-identifier-in-parents.ts: -------------------------------------------------------------------------------- 1 | import { TSESTree } from "@typescript-eslint/utils"; 2 | import { findIdentifiersInChildren } from "./find-identifiers-in-children"; 3 | 4 | export const findIdentifierInParents = ( 5 | name: string, 6 | node: TSESTree.Node 7 | ): TSESTree.Identifier | null => { 8 | if (!node.parent) return null; 9 | const ids = findIdentifiersInChildren(name, [node.parent]).filter( 10 | (x) => x != node 11 | ); 12 | if (ids.length) { 13 | return ids[0]; 14 | } 15 | return findIdentifierInParents(name, node.parent); 16 | }; 17 | -------------------------------------------------------------------------------- /src/utils/find-identifiers-in-children.ts: -------------------------------------------------------------------------------- 1 | import { 2 | isArrowFunctionExpression, 3 | isBlockStatement, 4 | isCallExpression, 5 | isExportNamedDeclaration, 6 | isExpressionStatement, 7 | isFunctionDeclaration, 8 | isImportDeclaration, 9 | isImportSpecifier, 10 | isMemberExpression, 11 | isProgram, 12 | isVariableDeclaration, 13 | isVariableDeclarator, 14 | } from "@/src/utils/ast-guards"; 15 | import { TSESTree } from "@typescript-eslint/utils"; 16 | import { isIdentifier } from "@typescript-eslint/utils/ast-utils"; 17 | 18 | export const findIdentifiersInChildren = ( 19 | name: string, 20 | nodes: TSESTree.Node[] 21 | ): TSESTree.Identifier[] => { 22 | const identifiers: TSESTree.Identifier[] = []; 23 | for (const node of nodes) { 24 | if (isProgram(node)) { 25 | identifiers.push(...findIdentifiersInChildren(name, node.body)); 26 | } else if (isIdentifier(node)) { 27 | if (node.name === name) { 28 | identifiers.push(node); 29 | } 30 | } else if (isFunctionDeclaration(node)) { 31 | if (node.id) { 32 | identifiers.push(...findIdentifiersInChildren(name, [node.id])); 33 | } 34 | identifiers.push(...findIdentifiersInChildren(name, node.body.body)); 35 | } else if (isImportDeclaration(node)) { 36 | identifiers.push(...findIdentifiersInChildren(name, node.specifiers)); 37 | } else if (isImportSpecifier(node)) { 38 | identifiers.push(...findIdentifiersInChildren(name, [node.local])); 39 | } else if (isVariableDeclaration(node)) { 40 | identifiers.push(...findIdentifiersInChildren(name, node.declarations)); 41 | } else if (isVariableDeclarator(node)) { 42 | identifiers.push(...findIdentifiersInChildren(name, [node.id])); 43 | } else if (isBlockStatement(node)) { 44 | identifiers.push(...findIdentifiersInChildren(name, node.body)); 45 | } else if (isExportNamedDeclaration(node) && node.declaration) { 46 | identifiers.push(...findIdentifiersInChildren(name, [node.declaration])); 47 | } else if (isArrowFunctionExpression(node)) { 48 | identifiers.push(...findIdentifiersInChildren(name, [node.body])); 49 | } else if (isExpressionStatement(node)) { 50 | identifiers.push(...findIdentifiersInChildren(name, [node.expression])); 51 | } else if (isCallExpression(node)) { 52 | identifiers.push(...findIdentifiersInChildren(name, [...node.arguments])); 53 | } else if (isMemberExpression(node)) { 54 | identifiers.push( 55 | ...findIdentifiersInChildren(name, [node.property, node.object]) 56 | ); 57 | } 58 | } 59 | 60 | return identifiers; 61 | }; 62 | -------------------------------------------------------------------------------- /src/utils/find-in-children-all.ts: -------------------------------------------------------------------------------- 1 | import { TSESTree } from "@typescript-eslint/types"; 2 | import { exploreChildren } from "./explore-children"; 3 | import { InferGuardType } from "./infer-guard-type"; 4 | 5 | export function findInChildrenAll< 6 | T extends TSESTree.Node, 7 | F extends (x: TSESTree.Node) => x is T 8 | >( 9 | node: TSESTree.Node, 10 | predicate: F, 11 | filter?: (node: InferGuardType) => boolean 12 | ) { 13 | const result: InferGuardType[] = []; 14 | exploreChildren(node, (child) => { 15 | if (predicate(child) && (!filter || filter(child as InferGuardType))) { 16 | result.push(child as InferGuardType); 17 | } 18 | }); 19 | return result; 20 | } 21 | -------------------------------------------------------------------------------- /src/utils/find-in-children.ts: -------------------------------------------------------------------------------- 1 | import { TSESTree } from "@typescript-eslint/types"; 2 | import { InferGuardType } from "./infer-guard-type"; 3 | import { exploreChildren } from "./explore-children"; 4 | 5 | export function findInChildren< 6 | T extends TSESTree.Node, 7 | F extends (x: TSESTree.Node) => x is T 8 | >( 9 | node: TSESTree.Node, 10 | predicate: F, 11 | filter?: (node: InferGuardType) => boolean 12 | ): InferGuardType | undefined { 13 | return exploreChildren(node, (child, _parent, resolve) => { 14 | if (predicate(child) && (!filter || filter(child as InferGuardType))) { 15 | resolve(child as InferGuardType); 16 | } 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /src/utils/find-in-parent.ts: -------------------------------------------------------------------------------- 1 | import { TSESTree } from "@typescript-eslint/types"; 2 | import { findInChildren } from "./find-in-children"; 3 | import { InferGuardType } from "./infer-guard-type"; 4 | 5 | export function findInParent< 6 | T extends TSESTree.Node, 7 | F extends (x: TSESTree.Node) => x is T 8 | >( 9 | node: TSESTree.Node, 10 | predicate: F, 11 | filter?: (node: InferGuardType) => boolean 12 | ): InferGuardType | undefined { 13 | let parent: TSESTree.Node | undefined = node.parent; 14 | while (parent) { 15 | const found = findInChildren(parent, predicate, (x) => { 16 | return ( 17 | x.range[0] < node.range[0] && 18 | x.range[1] > node.range[1] && 19 | (!filter || filter(x as InferGuardType)) 20 | ); 21 | }); 22 | if (found) { 23 | return found; 24 | } 25 | parent = parent.parent; 26 | } 27 | return undefined; 28 | } 29 | -------------------------------------------------------------------------------- /src/utils/get-call-expr-id.ts: -------------------------------------------------------------------------------- 1 | import { TSESTree } from "@typescript-eslint/utils"; 2 | import { 3 | isIdentifier, 4 | isMemberExpression, 5 | isPrivateIdentifier, 6 | } from "@/src/utils/ast-guards"; 7 | 8 | export function getCallExprId(called: TSESTree.CallExpression) { 9 | if (isIdentifier(called.callee)) { 10 | return called.callee; 11 | } else if (isMemberExpression(called.callee)) { 12 | if ( 13 | isIdentifier(called.callee.property) || 14 | isPrivateIdentifier(called.callee.property) 15 | ) { 16 | return called.callee.property; 17 | } else { 18 | throw new Error( 19 | `Cannot handle non-identifier member expression property ${called.callee.property}` 20 | ); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/utils/get-function-id.ts: -------------------------------------------------------------------------------- 1 | import { TSESTree } from "@typescript-eslint/types"; 2 | import { RuleContext } from "@typescript-eslint/utils/ts-eslint"; 3 | import { isImportDeclaration, isImportSpecifier } from "./ast-guards"; 4 | import { getImportDeclaration } from "./get-import-declaration"; 5 | 6 | export function getFunctionId( 7 | context: RuleContext, 8 | node: TSESTree.Identifier | TSESTree.ImportDeclaration 9 | ) { 10 | if (isImportDeclaration(node)) { 11 | const name = node.specifiers.find(isImportSpecifier)?.local.name; 12 | const fileName = getImportDeclaration(context, node); 13 | return `${fileName.path}#${name}`; 14 | } 15 | return `${context.physicalFilename}#${node.name}`; 16 | } 17 | -------------------------------------------------------------------------------- /src/utils/get-import-declaration.ts: -------------------------------------------------------------------------------- 1 | import { TSESTree } from "@typescript-eslint/utils"; 2 | import { RuleContext } from "@typescript-eslint/utils/ts-eslint"; 3 | import { existsSync, lstatSync, readFileSync } from "fs"; 4 | import path, { dirname, join } from "path"; 5 | 6 | function cleanTsConfig(content: string) { 7 | return ( 8 | content 9 | // Remove comments 10 | .replace( 11 | /(?:\r\n|\n|^)(?:[^'"])*?(?:'(?:[^\r\n\\']|\\'|[\\]{2})*'|"(?:[^\r\n\\"]|\\"|[\\]{2})*")*?(?:[^'"])*?(\/\*(?:[\s\S]*?)\*\/|\/\/.*)/g, 12 | "" 13 | ) 14 | // Remove trailing commas 15 | .replace(/,(\s+\])/gm, "$1") 16 | .replace(/,(\s+\})/gm, "$1") 17 | ); 18 | } 19 | 20 | function resolveTSAlias(tsconfigpath: string, to: string, cwd: string) { 21 | const tsconfig = readFileSync(tsconfigpath, "utf-8"); 22 | const aliases = (JSON.parse(cleanTsConfig(tsconfig)).compilerOptions?.paths ?? 23 | {}) as Record; 24 | 25 | const res = Object.entries(aliases) 26 | // sorting by longest - most qualified - alias 27 | .sort((a, b) => b[0].length - a[0].length) 28 | .find( 29 | ([key]) => to.startsWith(key) || to.startsWith(key.replace(/\*$/, "")) 30 | ); 31 | 32 | if (res) { 33 | // eslint-disable-next-line prefer-const 34 | let [key, val] = res; 35 | key = key.replace(/\*$/, ""); 36 | const firstVal = val[0].replace(/\*$/, ""); 37 | to = to.replace(key, firstVal); 38 | to = path.resolve(cwd, to); 39 | } 40 | 41 | return to; 42 | } 43 | 44 | const codeExt = [".ts", ".js", ".tsx", ".jsx"]; 45 | 46 | function endsWithAny(str: string, arr: string[]) { 47 | return arr.some((ext) => str.endsWith(ext)); 48 | } 49 | 50 | export function getImportDeclaration( 51 | context: RuleContext, 52 | impt: TSESTree.ImportDeclaration 53 | ) { 54 | const from = context.physicalFilename; 55 | let to = impt.source.value; 56 | 57 | let res: string | null = null; 58 | 59 | if (!to.startsWith(".")) { 60 | let { project, tsconfigRootDir } = context.parserOptions; 61 | if (project || tsconfigRootDir) { 62 | if (project === true || !project) project = "./tsconfig.json"; 63 | if (Array.isArray(project)) project = project[0]; 64 | if (!tsconfigRootDir) tsconfigRootDir = context.cwd; 65 | if (!lstatSync(tsconfigRootDir).isDirectory()) { 66 | tsconfigRootDir = dirname(tsconfigRootDir); 67 | } 68 | 69 | to = resolveTSAlias(join(tsconfigRootDir, project), to, context.cwd); 70 | res = to; 71 | } 72 | 73 | if (!to.startsWith(".") && !to.startsWith("/")) { 74 | const split = to.split(":"); 75 | if (!existsSync(to)) { 76 | return { module: split.at(-1), protocol: split.at(-2) }; 77 | } 78 | // no relative path and no TS alias, 79 | // considering it as a node_module 80 | return { path: `./node_modules/${to}`, module: to }; 81 | } 82 | } else if (!to.startsWith("/")) { 83 | res = path.resolve(path.dirname(from), to); 84 | } 85 | 86 | if (!res) throw new Error(`Import path '${to}' could not resolved`); 87 | 88 | if (!endsWithAny(res, codeExt)) { 89 | res += path.extname(from); 90 | } 91 | 92 | if (!existsSync(res)) { 93 | if (res.endsWith(".js")) { 94 | res = findFileExtension(res.replace(".js", ""), [".jsx", ".ts", ".tsx"]); 95 | } else if (res.endsWith(".jsx")) { 96 | res = findFileExtension(res.replace(".jsx", ""), [".js", ".tsx", ".ts"]); 97 | } else if (res.endsWith(".ts")) { 98 | res = findFileExtension(res.replace(".ts", ""), [".tsx", ".js", ".jsx"]); 99 | } else if (res.endsWith(".tsx")) { 100 | res = findFileExtension(res.replace(".tsx", ""), [".ts", ".jsx", ".js"]); 101 | } 102 | } 103 | 104 | return { path: res, module: to }; 105 | } 106 | 107 | function findFileExtension(extless: string, tries: string[]) { 108 | for (const ext of tries) { 109 | if (existsSync(extless + ext)) { 110 | return extless + ext; 111 | } 112 | } 113 | return null; 114 | } 115 | -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./ast-guards"; 2 | export * from "./explore-children"; 3 | export * from "./find-identifier-in-parents"; 4 | export * from "./find-identifiers-in-children"; 5 | export * from "./find-in-children"; 6 | export * from "./find-in-parent"; 7 | export * from "./get-call-expr-id"; 8 | export * from "./get-function-id"; 9 | export * from "./get-import-declaration"; 10 | export * from "./infer-guard-type"; 11 | export * from "./parse"; 12 | export * from "./resolve-func"; 13 | -------------------------------------------------------------------------------- /src/utils/infer-guard-type.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 2 | export type InferGuardType = T extends (x: any) => x is infer G ? G : never; 3 | -------------------------------------------------------------------------------- /src/utils/native-throwing.ts: -------------------------------------------------------------------------------- 1 | export const nativeThrowing = [ 2 | // File System operations 3 | { 4 | protocol: "node", 5 | module: "fs", 6 | method: "readFileSync", 7 | }, 8 | { 9 | protocol: "node", 10 | module: "fs", 11 | method: "writeFileSync", 12 | }, 13 | { 14 | protocol: "node", 15 | module: "fs", 16 | method: "appendFileSync", 17 | }, 18 | { 19 | protocol: "node", 20 | module: "fs", 21 | method: "copyFileSync", 22 | }, 23 | { 24 | protocol: "node", 25 | module: "fs", 26 | method: "openSync", 27 | }, 28 | { 29 | protocol: "node", 30 | module: "fs", 31 | method: "closeSync", 32 | }, 33 | { 34 | protocol: "node", 35 | module: "fs", 36 | method: "readSync", 37 | }, 38 | { 39 | protocol: "node", 40 | module: "fs", 41 | method: "writeSync", 42 | }, 43 | { 44 | protocol: "node", 45 | module: "fs", 46 | method: "statSync", 47 | }, 48 | { 49 | protocol: "node", 50 | module: "fs", 51 | method: "lstatSync", 52 | }, 53 | { 54 | protocol: "node", 55 | module: "fs", 56 | method: "fstatSync", 57 | }, 58 | { 59 | protocol: "node", 60 | module: "fs", 61 | method: "readdirSync", 62 | }, 63 | { 64 | protocol: "node", 65 | module: "fs", 66 | method: "mkdirSync", 67 | }, 68 | { 69 | protocol: "node", 70 | module: "fs", 71 | method: "rmdirSync", 72 | }, 73 | { 74 | protocol: "node", 75 | module: "fs", 76 | method: "unlinkSync", 77 | }, 78 | { 79 | protocol: "node", 80 | module: "fs", 81 | method: "rmSync", 82 | }, 83 | { 84 | protocol: "node", 85 | module: "fs", 86 | method: "renameSync", 87 | }, 88 | { 89 | protocol: "node", 90 | module: "fs", 91 | method: "chmodSync", 92 | }, 93 | { 94 | protocol: "node", 95 | module: "fs", 96 | method: "chownSync", 97 | }, 98 | { 99 | protocol: "node", 100 | module: "fs", 101 | method: "linkSync", 102 | }, 103 | { 104 | protocol: "node", 105 | module: "fs", 106 | method: "symlinkSync", 107 | }, 108 | { 109 | protocol: "node", 110 | module: "fs", 111 | method: "readlinkSync", 112 | }, 113 | { 114 | protocol: "node", 115 | module: "fs", 116 | method: "realpathSync", 117 | }, 118 | { 119 | protocol: "node", 120 | module: "fs", 121 | method: "accessSync", 122 | }, 123 | { 124 | protocol: "node", 125 | module: "fs", 126 | method: "truncateSync", 127 | }, 128 | { 129 | protocol: "node", 130 | module: "fs", 131 | method: "ftruncateSync", 132 | }, 133 | { 134 | protocol: "node", 135 | module: "fs", 136 | method: "fsyncSync", 137 | }, 138 | { 139 | protocol: "node", 140 | module: "fs", 141 | method: "fdatasyncSync", 142 | }, 143 | { 144 | protocol: "node", 145 | module: "fs", 146 | method: "utimesSync", 147 | }, 148 | { 149 | protocol: "node", 150 | module: "fs", 151 | method: "futimesSync", 152 | }, 153 | { 154 | protocol: "node", 155 | module: "fs", 156 | method: "existsSync", 157 | }, 158 | { 159 | protocol: "node", 160 | module: "fs", 161 | method: "constants", 162 | }, 163 | 164 | // Path operations 165 | { 166 | protocol: "node", 167 | module: "path", 168 | method: "resolve", 169 | }, 170 | { 171 | protocol: "node", 172 | module: "path", 173 | method: "normalize", 174 | }, 175 | 176 | // URL operations 177 | { 178 | protocol: "node", 179 | module: "url", 180 | method: "URL", 181 | }, 182 | { 183 | protocol: "node", 184 | module: "url", 185 | method: "URLSearchParams", 186 | }, 187 | { 188 | protocol: "node", 189 | module: "url", 190 | method: "parse", 191 | }, 192 | 193 | // Buffer operations 194 | { 195 | protocol: "node", 196 | module: "buffer", 197 | method: "Buffer.from", 198 | }, 199 | { 200 | protocol: "node", 201 | module: "buffer", 202 | method: "Buffer.alloc", 203 | }, 204 | { 205 | protocol: "node", 206 | module: "buffer", 207 | method: "Buffer.allocUnsafe", 208 | }, 209 | { 210 | protocol: "node", 211 | module: "buffer", 212 | method: "Buffer.allocUnsafeSlow", 213 | }, 214 | { 215 | protocol: "node", 216 | module: "buffer", 217 | method: "Buffer.concat", 218 | }, 219 | { 220 | protocol: "node", 221 | module: "buffer", 222 | method: "Buffer.compare", 223 | }, 224 | 225 | // Crypto operations 226 | { 227 | protocol: "node", 228 | module: "crypto", 229 | method: "createHash", 230 | }, 231 | { 232 | protocol: "node", 233 | module: "crypto", 234 | method: "createHmac", 235 | }, 236 | { 237 | protocol: "node", 238 | module: "crypto", 239 | method: "createCipher", 240 | }, 241 | { 242 | protocol: "node", 243 | module: "crypto", 244 | method: "createDecipher", 245 | }, 246 | { 247 | protocol: "node", 248 | module: "crypto", 249 | method: "createCipheriv", 250 | }, 251 | { 252 | protocol: "node", 253 | module: "crypto", 254 | method: "createDecipheriv", 255 | }, 256 | { 257 | protocol: "node", 258 | module: "crypto", 259 | method: "createSign", 260 | }, 261 | { 262 | protocol: "node", 263 | module: "crypto", 264 | method: "createVerify", 265 | }, 266 | { 267 | protocol: "node", 268 | module: "crypto", 269 | method: "createDiffieHellman", 270 | }, 271 | { 272 | protocol: "node", 273 | module: "crypto", 274 | method: "getDiffieHellman", 275 | }, 276 | { 277 | protocol: "node", 278 | module: "crypto", 279 | method: "pbkdf2Sync", 280 | }, 281 | { 282 | protocol: "node", 283 | module: "crypto", 284 | method: "scryptSync", 285 | }, 286 | { 287 | protocol: "node", 288 | module: "crypto", 289 | method: "randomBytes", 290 | }, 291 | { 292 | protocol: "node", 293 | module: "crypto", 294 | method: "randomFillSync", 295 | }, 296 | { 297 | protocol: "node", 298 | module: "crypto", 299 | method: "generateKeyPairSync", 300 | }, 301 | { 302 | protocol: "node", 303 | module: "crypto", 304 | method: "randomUUID", 305 | }, 306 | { 307 | protocol: "node", 308 | module: "crypto", 309 | method: "sign", 310 | }, 311 | { 312 | protocol: "node", 313 | module: "crypto", 314 | method: "verify", 315 | }, 316 | { 317 | protocol: "node", 318 | module: "crypto", 319 | method: "constants", 320 | }, 321 | 322 | // Child process operations 323 | { 324 | protocol: "node", 325 | module: "child_process", 326 | method: "execSync", 327 | }, 328 | { 329 | protocol: "node", 330 | module: "child_process", 331 | method: "execFileSync", 332 | }, 333 | { 334 | protocol: "node", 335 | module: "child_process", 336 | method: "spawnSync", 337 | }, 338 | 339 | // Process operations 340 | { 341 | protocol: "node", 342 | module: "process", 343 | method: "chdir", 344 | }, 345 | { 346 | protocol: "node", 347 | module: "process", 348 | method: "kill", 349 | }, 350 | { 351 | protocol: "node", 352 | module: "process", 353 | method: "setuid", 354 | }, 355 | { 356 | protocol: "node", 357 | module: "process", 358 | method: "setgid", 359 | }, 360 | { 361 | protocol: "node", 362 | module: "process", 363 | method: "setgroups", 364 | }, 365 | { 366 | protocol: "node", 367 | module: "process", 368 | method: "umask", 369 | }, 370 | 371 | // OS operations 372 | { 373 | protocol: "node", 374 | module: "os", 375 | method: "userInfo", 376 | }, 377 | { 378 | protocol: "node", 379 | module: "os", 380 | method: "setPriority", 381 | }, 382 | 383 | // DNS operations 384 | { 385 | protocol: "node", 386 | module: "dns", 387 | method: "lookup", 388 | }, 389 | { 390 | protocol: "node", 391 | module: "dns", 392 | method: "lookupService", 393 | }, 394 | { 395 | protocol: "node", 396 | module: "dns", 397 | method: "resolve", 398 | }, 399 | { 400 | protocol: "node", 401 | module: "dns", 402 | method: "resolve4", 403 | }, 404 | { 405 | protocol: "node", 406 | module: "dns", 407 | method: "resolve6", 408 | }, 409 | { 410 | protocol: "node", 411 | module: "dns", 412 | method: "resolveMx", 413 | }, 414 | { 415 | protocol: "node", 416 | module: "dns", 417 | method: "resolveTxt", 418 | }, 419 | { 420 | protocol: "node", 421 | module: "dns", 422 | method: "resolveSrv", 423 | }, 424 | { 425 | protocol: "node", 426 | module: "dns", 427 | method: "resolvePtr", 428 | }, 429 | { 430 | protocol: "node", 431 | module: "dns", 432 | method: "resolveCname", 433 | }, 434 | { 435 | protocol: "node", 436 | module: "dns", 437 | method: "resolveNs", 438 | }, 439 | { 440 | protocol: "node", 441 | module: "dns", 442 | method: "resolveSoa", 443 | }, 444 | { 445 | protocol: "node", 446 | module: "dns", 447 | method: "reverse", 448 | }, 449 | 450 | // Utilities 451 | { 452 | protocol: "node", 453 | module: "util", 454 | method: "deprecate", 455 | }, 456 | { 457 | protocol: "node", 458 | module: "util", 459 | method: "promisify", 460 | }, 461 | 462 | // V8 operations 463 | { 464 | protocol: "node", 465 | module: "v8", 466 | method: "serialize", 467 | }, 468 | { 469 | protocol: "node", 470 | module: "v8", 471 | method: "deserialize", 472 | }, 473 | { 474 | protocol: "node", 475 | module: "v8", 476 | method: "writeHeapSnapshot", 477 | }, 478 | 479 | // Worker threads 480 | { 481 | protocol: "node", 482 | module: "worker_threads", 483 | method: "Worker", 484 | }, 485 | 486 | // Cluster operations 487 | { 488 | protocol: "node", 489 | module: "cluster", 490 | method: "setupMaster", 491 | }, 492 | { 493 | protocol: "node", 494 | module: "cluster", 495 | method: "fork", 496 | }, 497 | 498 | // Net operations 499 | { 500 | protocol: "node", 501 | module: "net", 502 | method: "createServer", 503 | }, 504 | { 505 | protocol: "node", 506 | module: "net", 507 | method: "createConnection", 508 | }, 509 | { 510 | protocol: "node", 511 | module: "net", 512 | method: "connect", 513 | }, 514 | 515 | // HTTP operations 516 | { 517 | protocol: "node", 518 | module: "http", 519 | method: "createServer", 520 | }, 521 | { 522 | protocol: "node", 523 | module: "http", 524 | method: "request", 525 | }, 526 | { 527 | protocol: "node", 528 | module: "http", 529 | method: "get", 530 | }, 531 | 532 | // HTTPS operations 533 | { 534 | protocol: "node", 535 | module: "https", 536 | method: "createServer", 537 | }, 538 | { 539 | protocol: "node", 540 | module: "https", 541 | method: "request", 542 | }, 543 | { 544 | protocol: "node", 545 | module: "https", 546 | method: "get", 547 | }, 548 | 549 | // TLS operations 550 | { 551 | protocol: "node", 552 | module: "tls", 553 | method: "createServer", 554 | }, 555 | { 556 | protocol: "node", 557 | module: "tls", 558 | method: "connect", 559 | }, 560 | { 561 | protocol: "node", 562 | module: "tls", 563 | method: "createSecureContext", 564 | }, 565 | 566 | // Zlib operations 567 | { 568 | protocol: "node", 569 | module: "zlib", 570 | method: "deflateSync", 571 | }, 572 | { 573 | protocol: "node", 574 | module: "zlib", 575 | method: "inflateSync", 576 | }, 577 | { 578 | protocol: "node", 579 | module: "zlib", 580 | method: "gzipSync", 581 | }, 582 | { 583 | protocol: "node", 584 | module: "zlib", 585 | method: "gunzipSync", 586 | }, 587 | { 588 | protocol: "node", 589 | module: "zlib", 590 | method: "deflateRawSync", 591 | }, 592 | { 593 | protocol: "node", 594 | module: "zlib", 595 | method: "inflateRawSync", 596 | }, 597 | { 598 | protocol: "node", 599 | module: "zlib", 600 | method: "brotliCompressSync", 601 | }, 602 | { 603 | protocol: "node", 604 | module: "zlib", 605 | method: "brotliDecompressSync", 606 | }, 607 | 608 | // Readline operations 609 | { 610 | protocol: "node", 611 | module: "readline", 612 | method: "createInterface", 613 | }, 614 | 615 | // REPL operations 616 | { 617 | protocol: "node", 618 | module: "repl", 619 | method: "start", 620 | }, 621 | 622 | // Module operations 623 | { 624 | protocol: "node", 625 | module: "module", 626 | method: "require", 627 | }, 628 | { 629 | protocol: "node", 630 | module: "module", 631 | method: "createRequire", 632 | }, 633 | 634 | // Global functions 635 | { 636 | protocol: "node", 637 | module: "global", 638 | method: "require", 639 | }, 640 | { 641 | protocol: "node", 642 | module: "global", 643 | method: "JSON.parse", 644 | }, 645 | { 646 | protocol: "node", 647 | module: "global", 648 | method: "JSON.stringify", 649 | }, 650 | { 651 | protocol: "node", 652 | module: "global", 653 | method: "parseInt", 654 | }, 655 | { 656 | protocol: "node", 657 | module: "global", 658 | method: "parseFloat", 659 | }, 660 | { 661 | protocol: "node", 662 | module: "global", 663 | method: "decodeURI", 664 | }, 665 | { 666 | protocol: "node", 667 | module: "global", 668 | method: "decodeURIComponent", 669 | }, 670 | { 671 | protocol: "node", 672 | module: "global", 673 | method: "encodeURI", 674 | }, 675 | { 676 | protocol: "node", 677 | module: "global", 678 | method: "encodeURIComponent", 679 | }, 680 | ]; 681 | -------------------------------------------------------------------------------- /src/utils/parse.ts: -------------------------------------------------------------------------------- 1 | import { RuleContext, SourceCode } from "@typescript-eslint/utils/ts-eslint"; 2 | import { exploreChildren } from "./explore-children"; 3 | import { SourceFile } from "typescript"; 4 | 5 | function omitNullish(obj: T): T { 6 | return Object.fromEntries( 7 | Object.entries(obj).filter(([, value]) => value != null) 8 | ) as T; 9 | } 10 | 11 | export function parse( 12 | source: SourceFile, 13 | context: RuleContext 14 | ): SourceCode.Program { 15 | const opts = context.languageOptions; 16 | const parsed = (opts.parser as any).parseForESLint( 17 | source.text, 18 | omitNullish({ 19 | parser: opts.parserOptions, 20 | filePath: source.fileName, 21 | loc: true, 22 | range: true, 23 | tokens: true, 24 | comment: true, 25 | }) 26 | ); 27 | 28 | const ast: SourceCode.Program = parsed.ast; 29 | 30 | exploreChildren(ast, (node, parent) => { 31 | node.parent = parent; 32 | }); 33 | 34 | return ast; 35 | } 36 | -------------------------------------------------------------------------------- /src/utils/resolve-class.ts: -------------------------------------------------------------------------------- 1 | import { TSESTree } from "@typescript-eslint/utils"; 2 | import { isClassDeclaration } from "@/src/utils/ast-guards"; 3 | import { RuleContext } from "@typescript-eslint/utils/ts-eslint"; 4 | import { resolveId } from "./resolve-id"; 5 | import { findInParent } from "./find-in-parent"; 6 | 7 | export function resolveClass( 8 | id: TSESTree.Identifier | TSESTree.PrivateIdentifier, 9 | context: RuleContext 10 | ) { 11 | const resolved = resolveId(id, context); 12 | if (!resolved?.id) return; 13 | const class_ = findInParent(resolved.id, isClassDeclaration); 14 | if (!class_) return; 15 | return { class: class_, context: resolved.context }; 16 | } 17 | -------------------------------------------------------------------------------- /src/utils/resolve-func.ts: -------------------------------------------------------------------------------- 1 | import { isFunctionDeclaration } from "@/src/utils/ast-guards"; 2 | import { TSESTree } from "@typescript-eslint/utils"; 3 | import { RuleContext } from "@typescript-eslint/utils/ts-eslint"; 4 | import { findInParent } from "./find-in-parent"; 5 | import { resolveId } from "./resolve-id"; 6 | 7 | export function resolveFunc( 8 | id: TSESTree.Identifier | TSESTree.PrivateIdentifier, 9 | context: RuleContext 10 | ) { 11 | const resolved = resolveId(id, context); 12 | if (!resolved?.id) return; 13 | const func = findInParent( 14 | resolved.id, 15 | isFunctionDeclaration, 16 | (x) => x.id?.name === id.name 17 | ); 18 | if (!func) return; 19 | return { 20 | func, 21 | module: resolved.module, 22 | protocol: resolved.protocol, 23 | context: resolved.context, 24 | }; 25 | } 26 | -------------------------------------------------------------------------------- /src/utils/resolve-id.ts: -------------------------------------------------------------------------------- 1 | import { isImportDeclaration } from "@/src/utils/ast-guards"; 2 | import { findIdentifierInParents } from "@/src/utils/find-identifier-in-parents"; 3 | import { TSESTree } from "@typescript-eslint/utils"; 4 | import { RuleContext } from "@typescript-eslint/utils/ts-eslint"; 5 | import { resolveImportedId } from "./resolve-imported-id"; 6 | 7 | export function resolveId( 8 | id: TSESTree.Identifier | TSESTree.PrivateIdentifier, 9 | context: RuleContext 10 | ) { 11 | const identifier = findIdentifierInParents(id.name, id); 12 | if (!identifier) return; 13 | if (isImportDeclaration(identifier?.parent?.parent)) { 14 | const idInParsed = resolveImportedId(context, identifier.parent.parent); 15 | if (!idInParsed?.id) return; 16 | 17 | return idInParsed; 18 | } 19 | return { id: identifier, module: null, protocol: null, context }; 20 | } 21 | -------------------------------------------------------------------------------- /src/utils/resolve-imported-id.ts: -------------------------------------------------------------------------------- 1 | import { isExportNamedDeclaration, isIdentifier } from "@/src/utils/ast-guards"; 2 | import { findIdentifiersInChildren } from "@/src/utils/find-identifiers-in-children"; 3 | import { getImportDeclaration } from "@/src/utils/get-import-declaration"; 4 | import { parse } from "@/src/utils/parse"; 5 | import { TSESTree } from "@typescript-eslint/utils"; 6 | import { RuleContext, SourceCode } from "@typescript-eslint/utils/ts-eslint"; 7 | import { readFileSync } from "fs"; 8 | import ts from "typescript"; 9 | import { findInChildren } from "./find-in-children"; 10 | const { createSourceFile, ScriptTarget } = ts; 11 | 12 | export function resolveImportedId( 13 | context: RuleContext, 14 | impt: TSESTree.ImportDeclaration 15 | ) { 16 | const imp = getImportDeclaration(context, impt); 17 | if (!imp.path || imp.path.startsWith("./node_modules")) { 18 | const id = impt.specifiers[0].local; 19 | 20 | return { 21 | id: findInChildren( 22 | parse( 23 | createSourceFile( 24 | "untitled.js", 25 | `export function ${id.name}() {}`, 26 | ScriptTarget.Latest 27 | ), 28 | context 29 | ), 30 | isIdentifier 31 | ), 32 | module: imp.module, 33 | protocol: imp.protocol, 34 | context, 35 | }; 36 | } 37 | let content = ""; 38 | try { 39 | content = readFileSync(imp.path, "utf-8"); 40 | } catch (e) { 41 | console.error(`Could not read file ${imp}`); 42 | console.error(e); 43 | return; 44 | } 45 | const parsed = parse( 46 | createSourceFile(imp.path, content, ScriptTarget.Latest), 47 | context 48 | ); 49 | const identifierInParsed = findIdentifiersInChildren( 50 | impt.specifiers[0].local.name, 51 | parsed.body 52 | ).find((x) => isExportNamedDeclaration(x.parent?.parent)); 53 | if (!identifierInParsed) return; 54 | 55 | const ctxParsed = { 56 | ...context, 57 | physicalFilename: imp.path, 58 | sourceCode: new SourceCode(content, parsed), 59 | parser: (context as any).parser, 60 | parserOptions: context.parserOptions, 61 | cwd: context.cwd, 62 | id: context.id, 63 | languageOptions: context.languageOptions, 64 | parserPath: context.parserPath, 65 | report: context.report, 66 | settings: context.settings, 67 | }; 68 | 69 | return { 70 | id: identifierInParsed, 71 | module: imp.module, 72 | protocol: imp.protocol, 73 | context: ctxParsed, 74 | }; 75 | } 76 | -------------------------------------------------------------------------------- /src/utils/test-file.ts: -------------------------------------------------------------------------------- 1 | import { ESLint, Linter } from "eslint"; 2 | import { describe, expect, it } from "vitest"; 3 | 4 | export function testFile( 5 | filename: string, 6 | rules: string[], 7 | errors: Partial[] 8 | ) { 9 | const lint = new ESLint({ overrideConfigFile: "eslint.config.test.js" }); 10 | 11 | const expectLints = errors.reduce((acc, error) => { 12 | if (!error.messageId) return acc; 13 | if (!acc[error.messageId]) acc[error.messageId] = 0; 14 | acc[error.messageId]++; 15 | return acc; 16 | }, {} as Record); 17 | 18 | const expectedLintsString = 19 | Object.entries(expectLints) 20 | .map(([k, v]) => `${v} '${k}'`) 21 | .join(", ") || "no error"; 22 | 23 | describe(filename, () => { 24 | it(`should lint ${expectedLintsString}`, async () => { 25 | const res = await lint.lintFiles([filename]); 26 | const messages = res[0].messages.filter( 27 | (m) => m.ruleId && rules.includes(m.ruleId.split("/").at(-1) as string) 28 | ); 29 | 30 | expect(messages).toEqual( 31 | errors.map((lint) => { 32 | return expect.objectContaining(lint); 33 | }) 34 | ); 35 | if (errors.length === 0) { 36 | expect(messages).toStrictEqual([]); 37 | } 38 | }); 39 | }); 40 | } 41 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "moduleResolution": "Bundler", 5 | "target": "ESNext", 6 | "lib": ["ESNext", "DOM"], 7 | "esModuleInterop": true, 8 | "declaration": true, 9 | "outDir": "./dist", 10 | "allowJs": false, 11 | "jsx": "preserve", 12 | "strict": true, 13 | "baseUrl": "./", 14 | "rootDir": "./", 15 | "paths": { 16 | "@/*": ["./*"] 17 | } 18 | }, 19 | "include": ["src/**/*", "scripts/**/*"], 20 | "exclude": ["node_modules", "dist"], 21 | "tsc-alias": { 22 | "resolveFullPaths": true 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /vitest.config.js: -------------------------------------------------------------------------------- 1 | import { configDefaults, defineConfig } from "vitest/config"; 2 | import tsconfigPaths from "vite-tsconfig-paths"; 3 | 4 | export default defineConfig({ 5 | plugins: [tsconfigPaths()], 6 | test: { 7 | exclude: [...configDefaults.exclude, "**/*.test.ts"], 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /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.0.0": 6 | version "7.24.2" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" 8 | integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== 9 | dependencies: 10 | "@babel/highlight" "^7.24.2" 11 | picocolors "^1.0.0" 12 | 13 | "@babel/helper-validator-identifier@^7.24.5": 14 | version "7.24.5" 15 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" 16 | integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== 17 | 18 | "@babel/highlight@^7.24.2": 19 | version "7.24.5" 20 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" 21 | integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== 22 | dependencies: 23 | "@babel/helper-validator-identifier" "^7.24.5" 24 | chalk "^2.4.2" 25 | js-tokens "^4.0.0" 26 | picocolors "^1.0.0" 27 | 28 | "@esbuild/aix-ppc64@0.20.2": 29 | version "0.20.2" 30 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" 31 | integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== 32 | 33 | "@esbuild/android-arm64@0.20.2": 34 | version "0.20.2" 35 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" 36 | integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== 37 | 38 | "@esbuild/android-arm@0.20.2": 39 | version "0.20.2" 40 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" 41 | integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== 42 | 43 | "@esbuild/android-x64@0.20.2": 44 | version "0.20.2" 45 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" 46 | integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== 47 | 48 | "@esbuild/darwin-arm64@0.20.2": 49 | version "0.20.2" 50 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" 51 | integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== 52 | 53 | "@esbuild/darwin-x64@0.20.2": 54 | version "0.20.2" 55 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" 56 | integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== 57 | 58 | "@esbuild/freebsd-arm64@0.20.2": 59 | version "0.20.2" 60 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" 61 | integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== 62 | 63 | "@esbuild/freebsd-x64@0.20.2": 64 | version "0.20.2" 65 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" 66 | integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== 67 | 68 | "@esbuild/linux-arm64@0.20.2": 69 | version "0.20.2" 70 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" 71 | integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== 72 | 73 | "@esbuild/linux-arm@0.20.2": 74 | version "0.20.2" 75 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" 76 | integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== 77 | 78 | "@esbuild/linux-ia32@0.20.2": 79 | version "0.20.2" 80 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" 81 | integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== 82 | 83 | "@esbuild/linux-loong64@0.20.2": 84 | version "0.20.2" 85 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" 86 | integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== 87 | 88 | "@esbuild/linux-mips64el@0.20.2": 89 | version "0.20.2" 90 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" 91 | integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== 92 | 93 | "@esbuild/linux-ppc64@0.20.2": 94 | version "0.20.2" 95 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" 96 | integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== 97 | 98 | "@esbuild/linux-riscv64@0.20.2": 99 | version "0.20.2" 100 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" 101 | integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== 102 | 103 | "@esbuild/linux-s390x@0.20.2": 104 | version "0.20.2" 105 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" 106 | integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== 107 | 108 | "@esbuild/linux-x64@0.20.2": 109 | version "0.20.2" 110 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" 111 | integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== 112 | 113 | "@esbuild/netbsd-x64@0.20.2": 114 | version "0.20.2" 115 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" 116 | integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== 117 | 118 | "@esbuild/openbsd-x64@0.20.2": 119 | version "0.20.2" 120 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" 121 | integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== 122 | 123 | "@esbuild/sunos-x64@0.20.2": 124 | version "0.20.2" 125 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" 126 | integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== 127 | 128 | "@esbuild/win32-arm64@0.20.2": 129 | version "0.20.2" 130 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" 131 | integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== 132 | 133 | "@esbuild/win32-ia32@0.20.2": 134 | version "0.20.2" 135 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" 136 | integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== 137 | 138 | "@esbuild/win32-x64@0.20.2": 139 | version "0.20.2" 140 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" 141 | integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== 142 | 143 | "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": 144 | version "4.4.0" 145 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" 146 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 147 | dependencies: 148 | eslint-visitor-keys "^3.3.0" 149 | 150 | "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": 151 | version "4.10.0" 152 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" 153 | integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== 154 | 155 | "@eslint/eslintrc@^3.1.0": 156 | version "3.1.0" 157 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" 158 | integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== 159 | dependencies: 160 | ajv "^6.12.4" 161 | debug "^4.3.2" 162 | espree "^10.0.1" 163 | globals "^14.0.0" 164 | ignore "^5.2.0" 165 | import-fresh "^3.2.1" 166 | js-yaml "^4.1.0" 167 | minimatch "^3.1.2" 168 | strip-json-comments "^3.1.1" 169 | 170 | "@eslint/js@9.3.0": 171 | version "9.3.0" 172 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.3.0.tgz#2e8f65c9c55227abc4845b1513c69c32c679d8fe" 173 | integrity sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw== 174 | 175 | "@humanwhocodes/config-array@^0.13.0": 176 | version "0.13.0" 177 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" 178 | integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== 179 | dependencies: 180 | "@humanwhocodes/object-schema" "^2.0.3" 181 | debug "^4.3.1" 182 | minimatch "^3.0.5" 183 | 184 | "@humanwhocodes/module-importer@^1.0.1": 185 | version "1.0.1" 186 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 187 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 188 | 189 | "@humanwhocodes/object-schema@^2.0.3": 190 | version "2.0.3" 191 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" 192 | integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== 193 | 194 | "@humanwhocodes/retry@^0.3.0": 195 | version "0.3.0" 196 | resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" 197 | integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== 198 | 199 | "@isaacs/cliui@^8.0.2": 200 | version "8.0.2" 201 | resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" 202 | integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== 203 | dependencies: 204 | string-width "^5.1.2" 205 | string-width-cjs "npm:string-width@^4.2.0" 206 | strip-ansi "^7.0.1" 207 | strip-ansi-cjs "npm:strip-ansi@^6.0.1" 208 | wrap-ansi "^8.1.0" 209 | wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" 210 | 211 | "@jest/schemas@^29.6.3": 212 | version "29.6.3" 213 | resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" 214 | integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== 215 | dependencies: 216 | "@sinclair/typebox" "^0.27.8" 217 | 218 | "@jridgewell/sourcemap-codec@^1.4.15": 219 | version "1.4.15" 220 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 221 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 222 | 223 | "@nodelib/fs.scandir@2.1.5": 224 | version "2.1.5" 225 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 226 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 227 | dependencies: 228 | "@nodelib/fs.stat" "2.0.5" 229 | run-parallel "^1.1.9" 230 | 231 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 232 | version "2.0.5" 233 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 234 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 235 | 236 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 237 | version "1.2.8" 238 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 239 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 240 | dependencies: 241 | "@nodelib/fs.scandir" "2.1.5" 242 | fastq "^1.6.0" 243 | 244 | "@pkgjs/parseargs@^0.11.0": 245 | version "0.11.0" 246 | resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" 247 | integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== 248 | 249 | "@rollup/rollup-android-arm-eabi@4.17.2": 250 | version "4.17.2" 251 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz#1a32112822660ee104c5dd3a7c595e26100d4c2d" 252 | integrity sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ== 253 | 254 | "@rollup/rollup-android-arm64@4.17.2": 255 | version "4.17.2" 256 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz#5aeef206d65ff4db423f3a93f71af91b28662c5b" 257 | integrity sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw== 258 | 259 | "@rollup/rollup-darwin-arm64@4.17.2": 260 | version "4.17.2" 261 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz#6b66aaf003c70454c292cd5f0236ebdc6ffbdf1a" 262 | integrity sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw== 263 | 264 | "@rollup/rollup-darwin-x64@4.17.2": 265 | version "4.17.2" 266 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz#f64fc51ed12b19f883131ccbcea59fc68cbd6c0b" 267 | integrity sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ== 268 | 269 | "@rollup/rollup-linux-arm-gnueabihf@4.17.2": 270 | version "4.17.2" 271 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz#1a7641111be67c10111f7122d1e375d1226cbf14" 272 | integrity sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A== 273 | 274 | "@rollup/rollup-linux-arm-musleabihf@4.17.2": 275 | version "4.17.2" 276 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz#c93fd632923e0fee25aacd2ae414288d0b7455bb" 277 | integrity sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg== 278 | 279 | "@rollup/rollup-linux-arm64-gnu@4.17.2": 280 | version "4.17.2" 281 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz#fa531425dd21d058a630947527b4612d9d0b4a4a" 282 | integrity sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A== 283 | 284 | "@rollup/rollup-linux-arm64-musl@4.17.2": 285 | version "4.17.2" 286 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz#8acc16f095ceea5854caf7b07e73f7d1802ac5af" 287 | integrity sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA== 288 | 289 | "@rollup/rollup-linux-powerpc64le-gnu@4.17.2": 290 | version "4.17.2" 291 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz#94e69a8499b5cf368911b83a44bb230782aeb571" 292 | integrity sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ== 293 | 294 | "@rollup/rollup-linux-riscv64-gnu@4.17.2": 295 | version "4.17.2" 296 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz#7ef1c781c7e59e85a6ce261cc95d7f1e0b56db0f" 297 | integrity sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg== 298 | 299 | "@rollup/rollup-linux-s390x-gnu@4.17.2": 300 | version "4.17.2" 301 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz#f15775841c3232fca9b78cd25a7a0512c694b354" 302 | integrity sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g== 303 | 304 | "@rollup/rollup-linux-x64-gnu@4.17.2": 305 | version "4.17.2" 306 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz#b521d271798d037ad70c9f85dd97d25f8a52e811" 307 | integrity sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ== 308 | 309 | "@rollup/rollup-linux-x64-musl@4.17.2": 310 | version "4.17.2" 311 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz#9254019cc4baac35800991315d133cc9fd1bf385" 312 | integrity sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q== 313 | 314 | "@rollup/rollup-win32-arm64-msvc@4.17.2": 315 | version "4.17.2" 316 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz#27f65a89f6f52ee9426ec11e3571038e4671790f" 317 | integrity sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA== 318 | 319 | "@rollup/rollup-win32-ia32-msvc@4.17.2": 320 | version "4.17.2" 321 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz#a2fbf8246ed0bb014f078ca34ae6b377a90cb411" 322 | integrity sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ== 323 | 324 | "@rollup/rollup-win32-x64-msvc@4.17.2": 325 | version "4.17.2" 326 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz#5a2d08b81e8064b34242d5cc9973ef8dd1e60503" 327 | integrity sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w== 328 | 329 | "@sinclair/typebox@^0.27.8": 330 | version "0.27.8" 331 | resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" 332 | integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== 333 | 334 | "@types/eslint@^9.6.1": 335 | version "9.6.1" 336 | resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" 337 | integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== 338 | dependencies: 339 | "@types/estree" "*" 340 | "@types/json-schema" "*" 341 | 342 | "@types/espree@^10.1.0": 343 | version "10.1.0" 344 | resolved "https://registry.yarnpkg.com/@types/espree/-/espree-10.1.0.tgz#812ceee20384c4d9ea42f1445e4764a647431f17" 345 | integrity sha512-uPQZdoUWWMuO6WS8/dwX1stZH/vOBa/wAniGnYEFI0IuU9RmLx6PLmo+VGfNOlbRc5I7hBsQc8H0zcdVI37kxg== 346 | dependencies: 347 | acorn "^8.12.0" 348 | eslint-visitor-keys "^4.0.0" 349 | 350 | "@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.0": 351 | version "1.0.5" 352 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" 353 | integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== 354 | 355 | "@types/json-schema@*", "@types/json-schema@^7.0.9": 356 | version "7.0.15" 357 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" 358 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== 359 | 360 | "@types/node@^20.12.12": 361 | version "20.12.12" 362 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" 363 | integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== 364 | dependencies: 365 | undici-types "~5.26.4" 366 | 367 | "@types/prop-types@*": 368 | version "15.7.13" 369 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" 370 | integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== 371 | 372 | "@types/react@^18.3.12": 373 | version "18.3.12" 374 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60" 375 | integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== 376 | dependencies: 377 | "@types/prop-types" "*" 378 | csstype "^3.0.2" 379 | 380 | "@types/semver@^7.3.12": 381 | version "7.5.8" 382 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" 383 | integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== 384 | 385 | "@typescript-eslint/eslint-plugin@7.9.0": 386 | version "7.9.0" 387 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz#093b96fc4e342226e65d5f18f9c87081e0b04a31" 388 | integrity sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA== 389 | dependencies: 390 | "@eslint-community/regexpp" "^4.10.0" 391 | "@typescript-eslint/scope-manager" "7.9.0" 392 | "@typescript-eslint/type-utils" "7.9.0" 393 | "@typescript-eslint/utils" "7.9.0" 394 | "@typescript-eslint/visitor-keys" "7.9.0" 395 | graphemer "^1.4.0" 396 | ignore "^5.3.1" 397 | natural-compare "^1.4.0" 398 | ts-api-utils "^1.3.0" 399 | 400 | "@typescript-eslint/parser@7.9.0", "@typescript-eslint/parser@^7.9.0": 401 | version "7.9.0" 402 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.9.0.tgz#fb3ba01b75e0e65cb78037a360961b00301f6c70" 403 | integrity sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ== 404 | dependencies: 405 | "@typescript-eslint/scope-manager" "7.9.0" 406 | "@typescript-eslint/types" "7.9.0" 407 | "@typescript-eslint/typescript-estree" "7.9.0" 408 | "@typescript-eslint/visitor-keys" "7.9.0" 409 | debug "^4.3.4" 410 | 411 | "@typescript-eslint/rule-tester@^7.9.0": 412 | version "7.9.0" 413 | resolved "https://registry.yarnpkg.com/@typescript-eslint/rule-tester/-/rule-tester-7.9.0.tgz#cc00d93cdb4ac14a9d57c1826eb4eb2002cd58b1" 414 | integrity sha512-Oz5IB1kCUToVS0Nvkpgx5Vb89J+7iSsBAWKvfxQFWmcYpiqdStO6eRI2cAuRNrqo6uGh2sNsAji9hcv/KrHwMQ== 415 | dependencies: 416 | "@typescript-eslint/typescript-estree" "7.9.0" 417 | "@typescript-eslint/utils" "7.9.0" 418 | ajv "^6.12.6" 419 | lodash.merge "4.6.2" 420 | semver "^7.6.0" 421 | 422 | "@typescript-eslint/scope-manager@5.62.0": 423 | version "5.62.0" 424 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" 425 | integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== 426 | dependencies: 427 | "@typescript-eslint/types" "5.62.0" 428 | "@typescript-eslint/visitor-keys" "5.62.0" 429 | 430 | "@typescript-eslint/scope-manager@7.9.0": 431 | version "7.9.0" 432 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz#1dd3e63a4411db356a9d040e75864851b5f2619b" 433 | integrity sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ== 434 | dependencies: 435 | "@typescript-eslint/types" "7.9.0" 436 | "@typescript-eslint/visitor-keys" "7.9.0" 437 | 438 | "@typescript-eslint/type-utils@7.9.0": 439 | version "7.9.0" 440 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz#f523262e1b66ca65540b7a65a1222db52e0a90c9" 441 | integrity sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA== 442 | dependencies: 443 | "@typescript-eslint/typescript-estree" "7.9.0" 444 | "@typescript-eslint/utils" "7.9.0" 445 | debug "^4.3.4" 446 | ts-api-utils "^1.3.0" 447 | 448 | "@typescript-eslint/types@5.62.0": 449 | version "5.62.0" 450 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" 451 | integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== 452 | 453 | "@typescript-eslint/types@7.9.0", "@typescript-eslint/types@^7.9.0": 454 | version "7.9.0" 455 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.9.0.tgz#b58e485e4bfba055659c7e683ad4f5f0821ae2ec" 456 | integrity sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w== 457 | 458 | "@typescript-eslint/typescript-estree@5.62.0": 459 | version "5.62.0" 460 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" 461 | integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== 462 | dependencies: 463 | "@typescript-eslint/types" "5.62.0" 464 | "@typescript-eslint/visitor-keys" "5.62.0" 465 | debug "^4.3.4" 466 | globby "^11.1.0" 467 | is-glob "^4.0.3" 468 | semver "^7.3.7" 469 | tsutils "^3.21.0" 470 | 471 | "@typescript-eslint/typescript-estree@7.9.0": 472 | version "7.9.0" 473 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz#3395e27656060dc313a6b406c3a298b729685e07" 474 | integrity sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg== 475 | dependencies: 476 | "@typescript-eslint/types" "7.9.0" 477 | "@typescript-eslint/visitor-keys" "7.9.0" 478 | debug "^4.3.4" 479 | globby "^11.1.0" 480 | is-glob "^4.0.3" 481 | minimatch "^9.0.4" 482 | semver "^7.6.0" 483 | ts-api-utils "^1.3.0" 484 | 485 | "@typescript-eslint/utils@7.9.0", "@typescript-eslint/utils@^7.9.0": 486 | version "7.9.0" 487 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.9.0.tgz#1b96a34eefdca1c820cb1bbc2751d848b4540899" 488 | integrity sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA== 489 | dependencies: 490 | "@eslint-community/eslint-utils" "^4.4.0" 491 | "@typescript-eslint/scope-manager" "7.9.0" 492 | "@typescript-eslint/types" "7.9.0" 493 | "@typescript-eslint/typescript-estree" "7.9.0" 494 | 495 | "@typescript-eslint/utils@^5.38.1": 496 | version "5.62.0" 497 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" 498 | integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== 499 | dependencies: 500 | "@eslint-community/eslint-utils" "^4.2.0" 501 | "@types/json-schema" "^7.0.9" 502 | "@types/semver" "^7.3.12" 503 | "@typescript-eslint/scope-manager" "5.62.0" 504 | "@typescript-eslint/types" "5.62.0" 505 | "@typescript-eslint/typescript-estree" "5.62.0" 506 | eslint-scope "^5.1.1" 507 | semver "^7.3.7" 508 | 509 | "@typescript-eslint/visitor-keys@5.62.0": 510 | version "5.62.0" 511 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" 512 | integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== 513 | dependencies: 514 | "@typescript-eslint/types" "5.62.0" 515 | eslint-visitor-keys "^3.3.0" 516 | 517 | "@typescript-eslint/visitor-keys@7.9.0": 518 | version "7.9.0" 519 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz#82162656e339c3def02895f5c8546f6888d9b9ea" 520 | integrity sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ== 521 | dependencies: 522 | "@typescript-eslint/types" "7.9.0" 523 | eslint-visitor-keys "^3.4.3" 524 | 525 | "@vitest/expect@1.6.0": 526 | version "1.6.0" 527 | resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.6.0.tgz#0b3ba0914f738508464983f4d811bc122b51fb30" 528 | integrity sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ== 529 | dependencies: 530 | "@vitest/spy" "1.6.0" 531 | "@vitest/utils" "1.6.0" 532 | chai "^4.3.10" 533 | 534 | "@vitest/runner@1.6.0": 535 | version "1.6.0" 536 | resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.6.0.tgz#a6de49a96cb33b0e3ba0d9064a3e8d6ce2f08825" 537 | integrity sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg== 538 | dependencies: 539 | "@vitest/utils" "1.6.0" 540 | p-limit "^5.0.0" 541 | pathe "^1.1.1" 542 | 543 | "@vitest/snapshot@1.6.0": 544 | version "1.6.0" 545 | resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.6.0.tgz#deb7e4498a5299c1198136f56e6e0f692e6af470" 546 | integrity sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ== 547 | dependencies: 548 | magic-string "^0.30.5" 549 | pathe "^1.1.1" 550 | pretty-format "^29.7.0" 551 | 552 | "@vitest/spy@1.6.0": 553 | version "1.6.0" 554 | resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.6.0.tgz#362cbd42ccdb03f1613798fde99799649516906d" 555 | integrity sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw== 556 | dependencies: 557 | tinyspy "^2.2.0" 558 | 559 | "@vitest/utils@1.6.0": 560 | version "1.6.0" 561 | resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.6.0.tgz#5c5675ca7d6f546a7b4337de9ae882e6c57896a1" 562 | integrity sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw== 563 | dependencies: 564 | diff-sequences "^29.6.3" 565 | estree-walker "^3.0.3" 566 | loupe "^2.3.7" 567 | pretty-format "^29.7.0" 568 | 569 | acorn-jsx@^5.3.2: 570 | version "5.3.2" 571 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 572 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 573 | 574 | acorn-walk@^8.3.2: 575 | version "8.3.2" 576 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" 577 | integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== 578 | 579 | acorn@^8.11.3: 580 | version "8.11.3" 581 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" 582 | integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== 583 | 584 | acorn@^8.12.0: 585 | version "8.12.1" 586 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" 587 | integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== 588 | 589 | ajv@^6.12.4, ajv@^6.12.6: 590 | version "6.12.6" 591 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 592 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 593 | dependencies: 594 | fast-deep-equal "^3.1.1" 595 | fast-json-stable-stringify "^2.0.0" 596 | json-schema-traverse "^0.4.1" 597 | uri-js "^4.2.2" 598 | 599 | ajv@^8.11.2: 600 | version "8.13.0" 601 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" 602 | integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== 603 | dependencies: 604 | fast-deep-equal "^3.1.3" 605 | json-schema-traverse "^1.0.0" 606 | require-from-string "^2.0.2" 607 | uri-js "^4.4.1" 608 | 609 | ansi-regex@^5.0.1: 610 | version "5.0.1" 611 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 612 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 613 | 614 | ansi-regex@^6.0.1: 615 | version "6.1.0" 616 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" 617 | integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== 618 | 619 | ansi-styles@^3.2.1: 620 | version "3.2.1" 621 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 622 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 623 | dependencies: 624 | color-convert "^1.9.0" 625 | 626 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 627 | version "4.3.0" 628 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 629 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 630 | dependencies: 631 | color-convert "^2.0.1" 632 | 633 | ansi-styles@^5.0.0: 634 | version "5.2.0" 635 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" 636 | integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== 637 | 638 | ansi-styles@^6.1.0: 639 | version "6.2.1" 640 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" 641 | integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== 642 | 643 | anymatch@~3.1.2: 644 | version "3.1.3" 645 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 646 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 647 | dependencies: 648 | normalize-path "^3.0.0" 649 | picomatch "^2.0.4" 650 | 651 | argparse@^2.0.1: 652 | version "2.0.1" 653 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 654 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 655 | 656 | array-union@^2.1.0: 657 | version "2.1.0" 658 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 659 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 660 | 661 | assertion-error@^1.1.0: 662 | version "1.1.0" 663 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 664 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 665 | 666 | balanced-match@^1.0.0: 667 | version "1.0.2" 668 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 669 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 670 | 671 | binary-extensions@^2.0.0: 672 | version "2.3.0" 673 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" 674 | integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== 675 | 676 | boolean@^3.2.0: 677 | version "3.2.0" 678 | resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" 679 | integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== 680 | 681 | brace-expansion@^1.1.7: 682 | version "1.1.11" 683 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 684 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 685 | dependencies: 686 | balanced-match "^1.0.0" 687 | concat-map "0.0.1" 688 | 689 | brace-expansion@^2.0.1: 690 | version "2.0.1" 691 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 692 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 693 | dependencies: 694 | balanced-match "^1.0.0" 695 | 696 | braces@^3.0.2: 697 | version "3.0.2" 698 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 699 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 700 | dependencies: 701 | fill-range "^7.0.1" 702 | 703 | braces@~3.0.2: 704 | version "3.0.3" 705 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 706 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 707 | dependencies: 708 | fill-range "^7.1.1" 709 | 710 | cac@^6.7.14: 711 | version "6.7.14" 712 | resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" 713 | integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== 714 | 715 | callsites@^3.0.0: 716 | version "3.1.0" 717 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 718 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 719 | 720 | chai@^4.3.10: 721 | version "4.4.1" 722 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" 723 | integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== 724 | dependencies: 725 | assertion-error "^1.1.0" 726 | check-error "^1.0.3" 727 | deep-eql "^4.1.3" 728 | get-func-name "^2.0.2" 729 | loupe "^2.3.6" 730 | pathval "^1.1.1" 731 | type-detect "^4.0.8" 732 | 733 | chalk@^2.4.2: 734 | version "2.4.2" 735 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 736 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 737 | dependencies: 738 | ansi-styles "^3.2.1" 739 | escape-string-regexp "^1.0.5" 740 | supports-color "^5.3.0" 741 | 742 | chalk@^4.0.0: 743 | version "4.1.2" 744 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 745 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 746 | dependencies: 747 | ansi-styles "^4.1.0" 748 | supports-color "^7.1.0" 749 | 750 | check-error@^1.0.3: 751 | version "1.0.3" 752 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" 753 | integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== 754 | dependencies: 755 | get-func-name "^2.0.2" 756 | 757 | chokidar@^3.5.3: 758 | version "3.6.0" 759 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" 760 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== 761 | dependencies: 762 | anymatch "~3.1.2" 763 | braces "~3.0.2" 764 | glob-parent "~5.1.2" 765 | is-binary-path "~2.1.0" 766 | is-glob "~4.0.1" 767 | normalize-path "~3.0.0" 768 | readdirp "~3.6.0" 769 | optionalDependencies: 770 | fsevents "~2.3.2" 771 | 772 | color-convert@^1.9.0: 773 | version "1.9.3" 774 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 775 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 776 | dependencies: 777 | color-name "1.1.3" 778 | 779 | color-convert@^2.0.1: 780 | version "2.0.1" 781 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 782 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 783 | dependencies: 784 | color-name "~1.1.4" 785 | 786 | color-name@1.1.3: 787 | version "1.1.3" 788 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 789 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 790 | 791 | color-name@~1.1.4: 792 | version "1.1.4" 793 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 794 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 795 | 796 | commander@^10.0.0: 797 | version "10.0.1" 798 | resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" 799 | integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== 800 | 801 | commander@^9.0.0: 802 | version "9.5.0" 803 | resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" 804 | integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== 805 | 806 | concat-map@0.0.1: 807 | version "0.0.1" 808 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 809 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 810 | 811 | confbox@^0.1.7: 812 | version "0.1.7" 813 | resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.7.tgz#ccfc0a2bcae36a84838e83a3b7f770fb17d6c579" 814 | integrity sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA== 815 | 816 | cosmiconfig@^8.0.0: 817 | version "8.3.6" 818 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" 819 | integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== 820 | dependencies: 821 | import-fresh "^3.3.0" 822 | js-yaml "^4.1.0" 823 | parse-json "^5.2.0" 824 | path-type "^4.0.0" 825 | 826 | cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: 827 | version "7.0.3" 828 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 829 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 830 | dependencies: 831 | path-key "^3.1.0" 832 | shebang-command "^2.0.0" 833 | which "^2.0.1" 834 | 835 | csstype@^3.0.2: 836 | version "3.1.3" 837 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" 838 | integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== 839 | 840 | debug@^4.1.1: 841 | version "4.3.5" 842 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" 843 | integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== 844 | dependencies: 845 | ms "2.1.2" 846 | 847 | debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: 848 | version "4.3.4" 849 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 850 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 851 | dependencies: 852 | ms "2.1.2" 853 | 854 | deep-eql@^4.1.3: 855 | version "4.1.3" 856 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" 857 | integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== 858 | dependencies: 859 | type-detect "^4.0.0" 860 | 861 | deep-is@^0.1.3: 862 | version "0.1.4" 863 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 864 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 865 | 866 | deepmerge@^4.2.2: 867 | version "4.3.1" 868 | resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" 869 | integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== 870 | 871 | diff-sequences@^29.6.3: 872 | version "29.6.3" 873 | resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" 874 | integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== 875 | 876 | dir-glob@^3.0.1: 877 | version "3.0.1" 878 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 879 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 880 | dependencies: 881 | path-type "^4.0.0" 882 | 883 | dot-prop@^7.2.0: 884 | version "7.2.0" 885 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-7.2.0.tgz#468172a3529779814d21a779c1ba2f6d76609809" 886 | integrity sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA== 887 | dependencies: 888 | type-fest "^2.11.2" 889 | 890 | eastasianwidth@^0.2.0: 891 | version "0.2.0" 892 | resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" 893 | integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== 894 | 895 | emoji-regex@^8.0.0: 896 | version "8.0.0" 897 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 898 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 899 | 900 | emoji-regex@^9.2.2: 901 | version "9.2.2" 902 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" 903 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== 904 | 905 | error-ex@^1.3.1: 906 | version "1.3.2" 907 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 908 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 909 | dependencies: 910 | is-arrayish "^0.2.1" 911 | 912 | esbuild@^0.20.1: 913 | version "0.20.2" 914 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" 915 | integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== 916 | optionalDependencies: 917 | "@esbuild/aix-ppc64" "0.20.2" 918 | "@esbuild/android-arm" "0.20.2" 919 | "@esbuild/android-arm64" "0.20.2" 920 | "@esbuild/android-x64" "0.20.2" 921 | "@esbuild/darwin-arm64" "0.20.2" 922 | "@esbuild/darwin-x64" "0.20.2" 923 | "@esbuild/freebsd-arm64" "0.20.2" 924 | "@esbuild/freebsd-x64" "0.20.2" 925 | "@esbuild/linux-arm" "0.20.2" 926 | "@esbuild/linux-arm64" "0.20.2" 927 | "@esbuild/linux-ia32" "0.20.2" 928 | "@esbuild/linux-loong64" "0.20.2" 929 | "@esbuild/linux-mips64el" "0.20.2" 930 | "@esbuild/linux-ppc64" "0.20.2" 931 | "@esbuild/linux-riscv64" "0.20.2" 932 | "@esbuild/linux-s390x" "0.20.2" 933 | "@esbuild/linux-x64" "0.20.2" 934 | "@esbuild/netbsd-x64" "0.20.2" 935 | "@esbuild/openbsd-x64" "0.20.2" 936 | "@esbuild/sunos-x64" "0.20.2" 937 | "@esbuild/win32-arm64" "0.20.2" 938 | "@esbuild/win32-ia32" "0.20.2" 939 | "@esbuild/win32-x64" "0.20.2" 940 | 941 | escape-string-regexp@^1.0.5: 942 | version "1.0.5" 943 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 944 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 945 | 946 | escape-string-regexp@^4.0.0: 947 | version "4.0.0" 948 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 949 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 950 | 951 | eslint-doc-generator@^1.7.1: 952 | version "1.7.1" 953 | resolved "https://registry.yarnpkg.com/eslint-doc-generator/-/eslint-doc-generator-1.7.1.tgz#c758c802a23f9a21b2134d9c3f57d5e5c13c3aea" 954 | integrity sha512-i1Zjl+Xcy712SZhbceCeMVaIdhbFqY27i8d7f9gyb9P/6AQNnPA0VCWynAFVGYa0hpeR5kwUI09+GBELgC2nnA== 955 | dependencies: 956 | "@typescript-eslint/utils" "^5.38.1" 957 | ajv "^8.11.2" 958 | boolean "^3.2.0" 959 | commander "^10.0.0" 960 | cosmiconfig "^8.0.0" 961 | deepmerge "^4.2.2" 962 | dot-prop "^7.2.0" 963 | jest-diff "^29.2.1" 964 | json-schema-traverse "^1.0.0" 965 | markdown-table "^3.0.3" 966 | no-case "^3.0.4" 967 | type-fest "^3.0.0" 968 | 969 | eslint-scope@^5.1.1: 970 | version "5.1.1" 971 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 972 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 973 | dependencies: 974 | esrecurse "^4.3.0" 975 | estraverse "^4.1.1" 976 | 977 | eslint-scope@^8.0.1: 978 | version "8.0.1" 979 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.1.tgz#a9601e4b81a0b9171657c343fb13111688963cfc" 980 | integrity sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og== 981 | dependencies: 982 | esrecurse "^4.3.0" 983 | estraverse "^5.2.0" 984 | 985 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: 986 | version "3.4.3" 987 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 988 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 989 | 990 | eslint-visitor-keys@^4.0.0: 991 | version "4.0.0" 992 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" 993 | integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== 994 | 995 | eslint@^9.3.0: 996 | version "9.3.0" 997 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.3.0.tgz#36a96db84592618d6ed9074d677e92f4e58c08b9" 998 | integrity sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ== 999 | dependencies: 1000 | "@eslint-community/eslint-utils" "^4.2.0" 1001 | "@eslint-community/regexpp" "^4.6.1" 1002 | "@eslint/eslintrc" "^3.1.0" 1003 | "@eslint/js" "9.3.0" 1004 | "@humanwhocodes/config-array" "^0.13.0" 1005 | "@humanwhocodes/module-importer" "^1.0.1" 1006 | "@humanwhocodes/retry" "^0.3.0" 1007 | "@nodelib/fs.walk" "^1.2.8" 1008 | ajv "^6.12.4" 1009 | chalk "^4.0.0" 1010 | cross-spawn "^7.0.2" 1011 | debug "^4.3.2" 1012 | escape-string-regexp "^4.0.0" 1013 | eslint-scope "^8.0.1" 1014 | eslint-visitor-keys "^4.0.0" 1015 | espree "^10.0.1" 1016 | esquery "^1.4.2" 1017 | esutils "^2.0.2" 1018 | fast-deep-equal "^3.1.3" 1019 | file-entry-cache "^8.0.0" 1020 | find-up "^5.0.0" 1021 | glob-parent "^6.0.2" 1022 | ignore "^5.2.0" 1023 | imurmurhash "^0.1.4" 1024 | is-glob "^4.0.0" 1025 | is-path-inside "^3.0.3" 1026 | json-stable-stringify-without-jsonify "^1.0.1" 1027 | levn "^0.4.1" 1028 | lodash.merge "^4.6.2" 1029 | minimatch "^3.1.2" 1030 | natural-compare "^1.4.0" 1031 | optionator "^0.9.3" 1032 | strip-ansi "^6.0.1" 1033 | text-table "^0.2.0" 1034 | 1035 | espree@^10.0.1: 1036 | version "10.0.1" 1037 | resolved "https://registry.yarnpkg.com/espree/-/espree-10.0.1.tgz#600e60404157412751ba4a6f3a2ee1a42433139f" 1038 | integrity sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww== 1039 | dependencies: 1040 | acorn "^8.11.3" 1041 | acorn-jsx "^5.3.2" 1042 | eslint-visitor-keys "^4.0.0" 1043 | 1044 | espree@^10.1.0: 1045 | version "10.1.0" 1046 | resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" 1047 | integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== 1048 | dependencies: 1049 | acorn "^8.12.0" 1050 | acorn-jsx "^5.3.2" 1051 | eslint-visitor-keys "^4.0.0" 1052 | 1053 | esquery@^1.4.2: 1054 | version "1.5.0" 1055 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" 1056 | integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== 1057 | dependencies: 1058 | estraverse "^5.1.0" 1059 | 1060 | esrecurse@^4.3.0: 1061 | version "4.3.0" 1062 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 1063 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 1064 | dependencies: 1065 | estraverse "^5.2.0" 1066 | 1067 | estraverse@^4.1.1: 1068 | version "4.3.0" 1069 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 1070 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 1071 | 1072 | estraverse@^5.1.0, estraverse@^5.2.0: 1073 | version "5.3.0" 1074 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 1075 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 1076 | 1077 | estree-walker@^3.0.3: 1078 | version "3.0.3" 1079 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" 1080 | integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== 1081 | dependencies: 1082 | "@types/estree" "^1.0.0" 1083 | 1084 | esutils@^2.0.2: 1085 | version "2.0.3" 1086 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 1087 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 1088 | 1089 | execa@^8.0.1: 1090 | version "8.0.1" 1091 | resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" 1092 | integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== 1093 | dependencies: 1094 | cross-spawn "^7.0.3" 1095 | get-stream "^8.0.1" 1096 | human-signals "^5.0.0" 1097 | is-stream "^3.0.0" 1098 | merge-stream "^2.0.0" 1099 | npm-run-path "^5.1.0" 1100 | onetime "^6.0.0" 1101 | signal-exit "^4.1.0" 1102 | strip-final-newline "^3.0.0" 1103 | 1104 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 1105 | version "3.1.3" 1106 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 1107 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1108 | 1109 | fast-glob@^3.2.9: 1110 | version "3.3.2" 1111 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" 1112 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 1113 | dependencies: 1114 | "@nodelib/fs.stat" "^2.0.2" 1115 | "@nodelib/fs.walk" "^1.2.3" 1116 | glob-parent "^5.1.2" 1117 | merge2 "^1.3.0" 1118 | micromatch "^4.0.4" 1119 | 1120 | fast-json-stable-stringify@^2.0.0: 1121 | version "2.1.0" 1122 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1123 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1124 | 1125 | fast-levenshtein@^2.0.6: 1126 | version "2.0.6" 1127 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1128 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 1129 | 1130 | fastq@^1.6.0: 1131 | version "1.17.1" 1132 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" 1133 | integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== 1134 | dependencies: 1135 | reusify "^1.0.4" 1136 | 1137 | file-entry-cache@^8.0.0: 1138 | version "8.0.0" 1139 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" 1140 | integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== 1141 | dependencies: 1142 | flat-cache "^4.0.0" 1143 | 1144 | fill-range@^7.0.1: 1145 | version "7.0.1" 1146 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 1147 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 1148 | dependencies: 1149 | to-regex-range "^5.0.1" 1150 | 1151 | fill-range@^7.1.1: 1152 | version "7.1.1" 1153 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 1154 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 1155 | dependencies: 1156 | to-regex-range "^5.0.1" 1157 | 1158 | find-up@^5.0.0: 1159 | version "5.0.0" 1160 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 1161 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 1162 | dependencies: 1163 | locate-path "^6.0.0" 1164 | path-exists "^4.0.0" 1165 | 1166 | flat-cache@^4.0.0: 1167 | version "4.0.1" 1168 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" 1169 | integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== 1170 | dependencies: 1171 | flatted "^3.2.9" 1172 | keyv "^4.5.4" 1173 | 1174 | flatted@^3.2.9: 1175 | version "3.3.1" 1176 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" 1177 | integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== 1178 | 1179 | foreground-child@^3.1.0: 1180 | version "3.3.0" 1181 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" 1182 | integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== 1183 | dependencies: 1184 | cross-spawn "^7.0.0" 1185 | signal-exit "^4.0.1" 1186 | 1187 | fsevents@~2.3.2, fsevents@~2.3.3: 1188 | version "2.3.3" 1189 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 1190 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 1191 | 1192 | get-func-name@^2.0.1, get-func-name@^2.0.2: 1193 | version "2.0.2" 1194 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" 1195 | integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== 1196 | 1197 | get-stream@^8.0.1: 1198 | version "8.0.1" 1199 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" 1200 | integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== 1201 | 1202 | glob-parent@^5.1.2, glob-parent@~5.1.2: 1203 | version "5.1.2" 1204 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1205 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1206 | dependencies: 1207 | is-glob "^4.0.1" 1208 | 1209 | glob-parent@^6.0.2: 1210 | version "6.0.2" 1211 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 1212 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 1213 | dependencies: 1214 | is-glob "^4.0.3" 1215 | 1216 | glob@^11.0.0: 1217 | version "11.0.0" 1218 | resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.0.tgz#6031df0d7b65eaa1ccb9b29b5ced16cea658e77e" 1219 | integrity sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g== 1220 | dependencies: 1221 | foreground-child "^3.1.0" 1222 | jackspeak "^4.0.1" 1223 | minimatch "^10.0.0" 1224 | minipass "^7.1.2" 1225 | package-json-from-dist "^1.0.0" 1226 | path-scurry "^2.0.0" 1227 | 1228 | globals@^14.0.0: 1229 | version "14.0.0" 1230 | resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" 1231 | integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== 1232 | 1233 | globby@^11.0.4, globby@^11.1.0: 1234 | version "11.1.0" 1235 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 1236 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 1237 | dependencies: 1238 | array-union "^2.1.0" 1239 | dir-glob "^3.0.1" 1240 | fast-glob "^3.2.9" 1241 | ignore "^5.2.0" 1242 | merge2 "^1.4.1" 1243 | slash "^3.0.0" 1244 | 1245 | globrex@^0.1.2: 1246 | version "0.1.2" 1247 | resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" 1248 | integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== 1249 | 1250 | graphemer@^1.4.0: 1251 | version "1.4.0" 1252 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 1253 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 1254 | 1255 | has-flag@^3.0.0: 1256 | version "3.0.0" 1257 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1258 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 1259 | 1260 | has-flag@^4.0.0: 1261 | version "4.0.0" 1262 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1263 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1264 | 1265 | human-signals@^5.0.0: 1266 | version "5.0.0" 1267 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" 1268 | integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== 1269 | 1270 | ignore@^5.2.0, ignore@^5.3.1: 1271 | version "5.3.1" 1272 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" 1273 | integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== 1274 | 1275 | import-fresh@^3.2.1, import-fresh@^3.3.0: 1276 | version "3.3.0" 1277 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1278 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1279 | dependencies: 1280 | parent-module "^1.0.0" 1281 | resolve-from "^4.0.0" 1282 | 1283 | imurmurhash@^0.1.4: 1284 | version "0.1.4" 1285 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1286 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1287 | 1288 | is-arrayish@^0.2.1: 1289 | version "0.2.1" 1290 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1291 | integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== 1292 | 1293 | is-binary-path@~2.1.0: 1294 | version "2.1.0" 1295 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1296 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1297 | dependencies: 1298 | binary-extensions "^2.0.0" 1299 | 1300 | is-extglob@^2.1.1: 1301 | version "2.1.1" 1302 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1303 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1304 | 1305 | is-fullwidth-code-point@^3.0.0: 1306 | version "3.0.0" 1307 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1308 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1309 | 1310 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: 1311 | version "4.0.3" 1312 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1313 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1314 | dependencies: 1315 | is-extglob "^2.1.1" 1316 | 1317 | is-number@^7.0.0: 1318 | version "7.0.0" 1319 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1320 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1321 | 1322 | is-path-inside@^3.0.3: 1323 | version "3.0.3" 1324 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1325 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1326 | 1327 | is-stream@^3.0.0: 1328 | version "3.0.0" 1329 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" 1330 | integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== 1331 | 1332 | isexe@^2.0.0: 1333 | version "2.0.0" 1334 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1335 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1336 | 1337 | jackspeak@^4.0.1: 1338 | version "4.0.1" 1339 | resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.0.1.tgz#9fca4ce961af6083e259c376e9e3541431f5287b" 1340 | integrity sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog== 1341 | dependencies: 1342 | "@isaacs/cliui" "^8.0.2" 1343 | optionalDependencies: 1344 | "@pkgjs/parseargs" "^0.11.0" 1345 | 1346 | jest-diff@^29.2.1: 1347 | version "29.7.0" 1348 | resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" 1349 | integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== 1350 | dependencies: 1351 | chalk "^4.0.0" 1352 | diff-sequences "^29.6.3" 1353 | jest-get-type "^29.6.3" 1354 | pretty-format "^29.7.0" 1355 | 1356 | jest-get-type@^29.6.3: 1357 | version "29.6.3" 1358 | resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" 1359 | integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== 1360 | 1361 | js-tokens@^4.0.0: 1362 | version "4.0.0" 1363 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1364 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1365 | 1366 | js-tokens@^9.0.0: 1367 | version "9.0.0" 1368 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.0.tgz#0f893996d6f3ed46df7f0a3b12a03f5fd84223c1" 1369 | integrity sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ== 1370 | 1371 | js-yaml@^4.1.0: 1372 | version "4.1.0" 1373 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1374 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1375 | dependencies: 1376 | argparse "^2.0.1" 1377 | 1378 | json-buffer@3.0.1: 1379 | version "3.0.1" 1380 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 1381 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 1382 | 1383 | json-parse-even-better-errors@^2.3.0: 1384 | version "2.3.1" 1385 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" 1386 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== 1387 | 1388 | json-schema-traverse@^0.4.1: 1389 | version "0.4.1" 1390 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1391 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1392 | 1393 | json-schema-traverse@^1.0.0: 1394 | version "1.0.0" 1395 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 1396 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 1397 | 1398 | json-stable-stringify-without-jsonify@^1.0.1: 1399 | version "1.0.1" 1400 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1401 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1402 | 1403 | keyv@^4.5.4: 1404 | version "4.5.4" 1405 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 1406 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 1407 | dependencies: 1408 | json-buffer "3.0.1" 1409 | 1410 | levn@^0.4.1: 1411 | version "0.4.1" 1412 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1413 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1414 | dependencies: 1415 | prelude-ls "^1.2.1" 1416 | type-check "~0.4.0" 1417 | 1418 | lines-and-columns@^1.1.6: 1419 | version "1.2.4" 1420 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" 1421 | integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== 1422 | 1423 | local-pkg@^0.5.0: 1424 | version "0.5.0" 1425 | resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c" 1426 | integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== 1427 | dependencies: 1428 | mlly "^1.4.2" 1429 | pkg-types "^1.0.3" 1430 | 1431 | locate-path@^6.0.0: 1432 | version "6.0.0" 1433 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1434 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1435 | dependencies: 1436 | p-locate "^5.0.0" 1437 | 1438 | lodash.merge@4.6.2, lodash.merge@^4.6.2: 1439 | version "4.6.2" 1440 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1441 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1442 | 1443 | loupe@^2.3.6, loupe@^2.3.7: 1444 | version "2.3.7" 1445 | resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" 1446 | integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== 1447 | dependencies: 1448 | get-func-name "^2.0.1" 1449 | 1450 | lower-case@^2.0.2: 1451 | version "2.0.2" 1452 | resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" 1453 | integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== 1454 | dependencies: 1455 | tslib "^2.0.3" 1456 | 1457 | lru-cache@^11.0.0: 1458 | version "11.0.1" 1459 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.1.tgz#3a732fbfedb82c5ba7bca6564ad3f42afcb6e147" 1460 | integrity sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ== 1461 | 1462 | magic-string@^0.30.5: 1463 | version "0.30.10" 1464 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" 1465 | integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== 1466 | dependencies: 1467 | "@jridgewell/sourcemap-codec" "^1.4.15" 1468 | 1469 | markdown-table@^3.0.3: 1470 | version "3.0.3" 1471 | resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" 1472 | integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== 1473 | 1474 | merge-stream@^2.0.0: 1475 | version "2.0.0" 1476 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1477 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1478 | 1479 | merge2@^1.3.0, merge2@^1.4.1: 1480 | version "1.4.1" 1481 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1482 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1483 | 1484 | micromatch@^4.0.4: 1485 | version "4.0.5" 1486 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1487 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1488 | dependencies: 1489 | braces "^3.0.2" 1490 | picomatch "^2.3.1" 1491 | 1492 | mimic-fn@^4.0.0: 1493 | version "4.0.0" 1494 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" 1495 | integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== 1496 | 1497 | minimatch@^10.0.0: 1498 | version "10.0.1" 1499 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" 1500 | integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== 1501 | dependencies: 1502 | brace-expansion "^2.0.1" 1503 | 1504 | minimatch@^3.0.5, minimatch@^3.1.2: 1505 | version "3.1.2" 1506 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1507 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1508 | dependencies: 1509 | brace-expansion "^1.1.7" 1510 | 1511 | minimatch@^9.0.4: 1512 | version "9.0.4" 1513 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" 1514 | integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== 1515 | dependencies: 1516 | brace-expansion "^2.0.1" 1517 | 1518 | minipass@^7.1.2: 1519 | version "7.1.2" 1520 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" 1521 | integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== 1522 | 1523 | mlly@^1.4.2, mlly@^1.7.0: 1524 | version "1.7.0" 1525 | resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.0.tgz#587383ae40dda23cadb11c3c3cc972b277724271" 1526 | integrity sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ== 1527 | dependencies: 1528 | acorn "^8.11.3" 1529 | pathe "^1.1.2" 1530 | pkg-types "^1.1.0" 1531 | ufo "^1.5.3" 1532 | 1533 | ms@2.1.2: 1534 | version "2.1.2" 1535 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1536 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1537 | 1538 | mylas@^2.1.9: 1539 | version "2.1.13" 1540 | resolved "https://registry.yarnpkg.com/mylas/-/mylas-2.1.13.tgz#1e23b37d58fdcc76e15d8a5ed23f9ae9fc0cbdf4" 1541 | integrity sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg== 1542 | 1543 | nanoid@^3.3.7: 1544 | version "3.3.7" 1545 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" 1546 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 1547 | 1548 | natural-compare@^1.4.0: 1549 | version "1.4.0" 1550 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1551 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1552 | 1553 | no-case@^3.0.4: 1554 | version "3.0.4" 1555 | resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" 1556 | integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== 1557 | dependencies: 1558 | lower-case "^2.0.2" 1559 | tslib "^2.0.3" 1560 | 1561 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1562 | version "3.0.0" 1563 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1564 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1565 | 1566 | npm-run-path@^5.1.0: 1567 | version "5.3.0" 1568 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" 1569 | integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== 1570 | dependencies: 1571 | path-key "^4.0.0" 1572 | 1573 | onetime@^6.0.0: 1574 | version "6.0.0" 1575 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" 1576 | integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== 1577 | dependencies: 1578 | mimic-fn "^4.0.0" 1579 | 1580 | optionator@^0.9.3: 1581 | version "0.9.4" 1582 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" 1583 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 1584 | dependencies: 1585 | deep-is "^0.1.3" 1586 | fast-levenshtein "^2.0.6" 1587 | levn "^0.4.1" 1588 | prelude-ls "^1.2.1" 1589 | type-check "^0.4.0" 1590 | word-wrap "^1.2.5" 1591 | 1592 | p-limit@^3.0.2: 1593 | version "3.1.0" 1594 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1595 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1596 | dependencies: 1597 | yocto-queue "^0.1.0" 1598 | 1599 | p-limit@^5.0.0: 1600 | version "5.0.0" 1601 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" 1602 | integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== 1603 | dependencies: 1604 | yocto-queue "^1.0.0" 1605 | 1606 | p-locate@^5.0.0: 1607 | version "5.0.0" 1608 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1609 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1610 | dependencies: 1611 | p-limit "^3.0.2" 1612 | 1613 | package-json-from-dist@^1.0.0: 1614 | version "1.0.0" 1615 | resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" 1616 | integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== 1617 | 1618 | parent-module@^1.0.0: 1619 | version "1.0.1" 1620 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1621 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1622 | dependencies: 1623 | callsites "^3.0.0" 1624 | 1625 | parse-json@^5.2.0: 1626 | version "5.2.0" 1627 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" 1628 | integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== 1629 | dependencies: 1630 | "@babel/code-frame" "^7.0.0" 1631 | error-ex "^1.3.1" 1632 | json-parse-even-better-errors "^2.3.0" 1633 | lines-and-columns "^1.1.6" 1634 | 1635 | path-exists@^4.0.0: 1636 | version "4.0.0" 1637 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1638 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1639 | 1640 | path-key@^3.1.0: 1641 | version "3.1.1" 1642 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1643 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1644 | 1645 | path-key@^4.0.0: 1646 | version "4.0.0" 1647 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" 1648 | integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== 1649 | 1650 | path-scurry@^2.0.0: 1651 | version "2.0.0" 1652 | resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" 1653 | integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== 1654 | dependencies: 1655 | lru-cache "^11.0.0" 1656 | minipass "^7.1.2" 1657 | 1658 | path-type@^4.0.0: 1659 | version "4.0.0" 1660 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1661 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1662 | 1663 | pathe@^1.1.1, pathe@^1.1.2: 1664 | version "1.1.2" 1665 | resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" 1666 | integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== 1667 | 1668 | pathval@^1.1.1: 1669 | version "1.1.1" 1670 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 1671 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 1672 | 1673 | picocolors@^1.0.0: 1674 | version "1.0.1" 1675 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" 1676 | integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== 1677 | 1678 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 1679 | version "2.3.1" 1680 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1681 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1682 | 1683 | pkg-types@^1.0.3, pkg-types@^1.1.0: 1684 | version "1.1.1" 1685 | resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.1.1.tgz#07b626880749beb607b0c817af63aac1845a73f2" 1686 | integrity sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ== 1687 | dependencies: 1688 | confbox "^0.1.7" 1689 | mlly "^1.7.0" 1690 | pathe "^1.1.2" 1691 | 1692 | plimit-lit@^1.2.6: 1693 | version "1.6.1" 1694 | resolved "https://registry.yarnpkg.com/plimit-lit/-/plimit-lit-1.6.1.tgz#a34594671b31ee8e93c72d505dfb6852eb72374a" 1695 | integrity sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA== 1696 | dependencies: 1697 | queue-lit "^1.5.1" 1698 | 1699 | postcss@^8.4.38: 1700 | version "8.4.38" 1701 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" 1702 | integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== 1703 | dependencies: 1704 | nanoid "^3.3.7" 1705 | picocolors "^1.0.0" 1706 | source-map-js "^1.2.0" 1707 | 1708 | prelude-ls@^1.2.1: 1709 | version "1.2.1" 1710 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1711 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1712 | 1713 | pretty-format@^29.7.0: 1714 | version "29.7.0" 1715 | resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" 1716 | integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== 1717 | dependencies: 1718 | "@jest/schemas" "^29.6.3" 1719 | ansi-styles "^5.0.0" 1720 | react-is "^18.0.0" 1721 | 1722 | punycode@^2.1.0: 1723 | version "2.3.1" 1724 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 1725 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1726 | 1727 | queue-lit@^1.5.1: 1728 | version "1.5.2" 1729 | resolved "https://registry.yarnpkg.com/queue-lit/-/queue-lit-1.5.2.tgz#83c24d4f4764802377b05a6e5c73017caf3f8747" 1730 | integrity sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw== 1731 | 1732 | queue-microtask@^1.2.2: 1733 | version "1.2.3" 1734 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1735 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1736 | 1737 | react-is@^18.0.0: 1738 | version "18.3.1" 1739 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" 1740 | integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== 1741 | 1742 | readdirp@~3.6.0: 1743 | version "3.6.0" 1744 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1745 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1746 | dependencies: 1747 | picomatch "^2.2.1" 1748 | 1749 | require-from-string@^2.0.2: 1750 | version "2.0.2" 1751 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 1752 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 1753 | 1754 | resolve-from@^4.0.0: 1755 | version "4.0.0" 1756 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1757 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1758 | 1759 | reusify@^1.0.4: 1760 | version "1.0.4" 1761 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1762 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1763 | 1764 | rimraf@^6.0.1: 1765 | version "6.0.1" 1766 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.0.1.tgz#ffb8ad8844dd60332ab15f52bc104bc3ed71ea4e" 1767 | integrity sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A== 1768 | dependencies: 1769 | glob "^11.0.0" 1770 | package-json-from-dist "^1.0.0" 1771 | 1772 | rollup@^4.13.0: 1773 | version "4.17.2" 1774 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.17.2.tgz#26d1785d0144122277fdb20ab3a24729ae68301f" 1775 | integrity sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ== 1776 | dependencies: 1777 | "@types/estree" "1.0.5" 1778 | optionalDependencies: 1779 | "@rollup/rollup-android-arm-eabi" "4.17.2" 1780 | "@rollup/rollup-android-arm64" "4.17.2" 1781 | "@rollup/rollup-darwin-arm64" "4.17.2" 1782 | "@rollup/rollup-darwin-x64" "4.17.2" 1783 | "@rollup/rollup-linux-arm-gnueabihf" "4.17.2" 1784 | "@rollup/rollup-linux-arm-musleabihf" "4.17.2" 1785 | "@rollup/rollup-linux-arm64-gnu" "4.17.2" 1786 | "@rollup/rollup-linux-arm64-musl" "4.17.2" 1787 | "@rollup/rollup-linux-powerpc64le-gnu" "4.17.2" 1788 | "@rollup/rollup-linux-riscv64-gnu" "4.17.2" 1789 | "@rollup/rollup-linux-s390x-gnu" "4.17.2" 1790 | "@rollup/rollup-linux-x64-gnu" "4.17.2" 1791 | "@rollup/rollup-linux-x64-musl" "4.17.2" 1792 | "@rollup/rollup-win32-arm64-msvc" "4.17.2" 1793 | "@rollup/rollup-win32-ia32-msvc" "4.17.2" 1794 | "@rollup/rollup-win32-x64-msvc" "4.17.2" 1795 | fsevents "~2.3.2" 1796 | 1797 | run-parallel@^1.1.9: 1798 | version "1.2.0" 1799 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1800 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1801 | dependencies: 1802 | queue-microtask "^1.2.2" 1803 | 1804 | semver@^7.3.7, semver@^7.6.0: 1805 | version "7.6.2" 1806 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" 1807 | integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== 1808 | 1809 | shebang-command@^2.0.0: 1810 | version "2.0.0" 1811 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1812 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1813 | dependencies: 1814 | shebang-regex "^3.0.0" 1815 | 1816 | shebang-regex@^3.0.0: 1817 | version "3.0.0" 1818 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1819 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1820 | 1821 | siginfo@^2.0.0: 1822 | version "2.0.0" 1823 | resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" 1824 | integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== 1825 | 1826 | signal-exit@^4.0.1, signal-exit@^4.1.0: 1827 | version "4.1.0" 1828 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" 1829 | integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== 1830 | 1831 | slash@^3.0.0: 1832 | version "3.0.0" 1833 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1834 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1835 | 1836 | source-map-js@^1.2.0: 1837 | version "1.2.0" 1838 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" 1839 | integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== 1840 | 1841 | stackback@0.0.2: 1842 | version "0.0.2" 1843 | resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" 1844 | integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== 1845 | 1846 | std-env@^3.5.0: 1847 | version "3.7.0" 1848 | resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" 1849 | integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== 1850 | 1851 | "string-width-cjs@npm:string-width@^4.2.0": 1852 | version "4.2.3" 1853 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1854 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1855 | dependencies: 1856 | emoji-regex "^8.0.0" 1857 | is-fullwidth-code-point "^3.0.0" 1858 | strip-ansi "^6.0.1" 1859 | 1860 | string-width@^4.1.0: 1861 | version "4.2.3" 1862 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1863 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1864 | dependencies: 1865 | emoji-regex "^8.0.0" 1866 | is-fullwidth-code-point "^3.0.0" 1867 | strip-ansi "^6.0.1" 1868 | 1869 | string-width@^5.0.1, string-width@^5.1.2: 1870 | version "5.1.2" 1871 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" 1872 | integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== 1873 | dependencies: 1874 | eastasianwidth "^0.2.0" 1875 | emoji-regex "^9.2.2" 1876 | strip-ansi "^7.0.1" 1877 | 1878 | "strip-ansi-cjs@npm:strip-ansi@^6.0.1": 1879 | version "6.0.1" 1880 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1881 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1882 | dependencies: 1883 | ansi-regex "^5.0.1" 1884 | 1885 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1886 | version "6.0.1" 1887 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1888 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1889 | dependencies: 1890 | ansi-regex "^5.0.1" 1891 | 1892 | strip-ansi@^7.0.1: 1893 | version "7.1.0" 1894 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" 1895 | integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== 1896 | dependencies: 1897 | ansi-regex "^6.0.1" 1898 | 1899 | strip-final-newline@^3.0.0: 1900 | version "3.0.0" 1901 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" 1902 | integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== 1903 | 1904 | strip-json-comments@^3.1.1: 1905 | version "3.1.1" 1906 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1907 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1908 | 1909 | strip-literal@^2.0.0: 1910 | version "2.1.0" 1911 | resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.0.tgz#6d82ade5e2e74f5c7e8739b6c84692bd65f0bd2a" 1912 | integrity sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw== 1913 | dependencies: 1914 | js-tokens "^9.0.0" 1915 | 1916 | supports-color@^5.3.0: 1917 | version "5.5.0" 1918 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1919 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1920 | dependencies: 1921 | has-flag "^3.0.0" 1922 | 1923 | supports-color@^7.1.0: 1924 | version "7.2.0" 1925 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1926 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1927 | dependencies: 1928 | has-flag "^4.0.0" 1929 | 1930 | text-table@^0.2.0: 1931 | version "0.2.0" 1932 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1933 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 1934 | 1935 | tinybench@^2.5.1: 1936 | version "2.8.0" 1937 | resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.8.0.tgz#30e19ae3a27508ee18273ffed9ac7018949acd7b" 1938 | integrity sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== 1939 | 1940 | tinypool@^0.8.3: 1941 | version "0.8.4" 1942 | resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.4.tgz#e217fe1270d941b39e98c625dcecebb1408c9aa8" 1943 | integrity sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ== 1944 | 1945 | tinyspy@^2.2.0: 1946 | version "2.2.1" 1947 | resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" 1948 | integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== 1949 | 1950 | to-regex-range@^5.0.1: 1951 | version "5.0.1" 1952 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1953 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1954 | dependencies: 1955 | is-number "^7.0.0" 1956 | 1957 | ts-api-utils@^1.3.0: 1958 | version "1.3.0" 1959 | resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" 1960 | integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== 1961 | 1962 | tsc-alias@^1.8.10: 1963 | version "1.8.10" 1964 | resolved "https://registry.yarnpkg.com/tsc-alias/-/tsc-alias-1.8.10.tgz#279f9bf0dd8bc10fb27820393d4881db5a303938" 1965 | integrity sha512-Ibv4KAWfFkFdKJxnWfVtdOmB0Zi1RJVxcbPGiCDsFpCQSsmpWyuzHG3rQyI5YkobWwxFPEyQfu1hdo4qLG2zPw== 1966 | dependencies: 1967 | chokidar "^3.5.3" 1968 | commander "^9.0.0" 1969 | globby "^11.0.4" 1970 | mylas "^2.1.9" 1971 | normalize-path "^3.0.0" 1972 | plimit-lit "^1.2.6" 1973 | 1974 | tsc@^2.0.4: 1975 | version "2.0.4" 1976 | resolved "https://registry.yarnpkg.com/tsc/-/tsc-2.0.4.tgz#5f6499146abea5dca4420b451fa4f2f9345238f5" 1977 | integrity sha512-fzoSieZI5KKJVBYGvwbVZs/J5za84f2lSTLPYf6AGiIf43tZ3GNrI1QzTLcjtyDDP4aLxd46RTZq1nQxe7+k5Q== 1978 | 1979 | tsconfck@^3.0.3: 1980 | version "3.1.0" 1981 | resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.1.0.tgz#30c63b15972b591adb41dc9a339a02743d090c81" 1982 | integrity sha512-CMjc5zMnyAjcS9sPLytrbFmj89st2g+JYtY/c02ug4Q+CZaAtCgbyviI0n1YvjZE/pzoc6FbNsINS13DOL1B9w== 1983 | 1984 | tslib@^1.8.1: 1985 | version "1.14.1" 1986 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 1987 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1988 | 1989 | tslib@^2.0.3: 1990 | version "2.6.2" 1991 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" 1992 | integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== 1993 | 1994 | tsutils@^3.21.0: 1995 | version "3.21.0" 1996 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 1997 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 1998 | dependencies: 1999 | tslib "^1.8.1" 2000 | 2001 | type-check@^0.4.0, type-check@~0.4.0: 2002 | version "0.4.0" 2003 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 2004 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 2005 | dependencies: 2006 | prelude-ls "^1.2.1" 2007 | 2008 | type-detect@^4.0.0, type-detect@^4.0.8: 2009 | version "4.0.8" 2010 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 2011 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 2012 | 2013 | type-fest@^2.11.2: 2014 | version "2.19.0" 2015 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" 2016 | integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== 2017 | 2018 | type-fest@^3.0.0: 2019 | version "3.13.1" 2020 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" 2021 | integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== 2022 | 2023 | typescript-eslint@^7.9.0: 2024 | version "7.9.0" 2025 | resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.9.0.tgz#353312f356ef4ba20105a4e2e736aa8c68f096a2" 2026 | integrity sha512-7iTn9c10teHHCys5Ud/yaJntXZrjt3h2mrx3feJGBOLgQkF3TB1X89Xs3aVQ/GgdXRAXpk2bPTdpRwHP4YkUow== 2027 | dependencies: 2028 | "@typescript-eslint/eslint-plugin" "7.9.0" 2029 | "@typescript-eslint/parser" "7.9.0" 2030 | "@typescript-eslint/utils" "7.9.0" 2031 | 2032 | typescript@^5.4.5: 2033 | version "5.4.5" 2034 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" 2035 | integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== 2036 | 2037 | ufo@^1.5.3: 2038 | version "1.5.3" 2039 | resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.3.tgz#3325bd3c977b6c6cd3160bf4ff52989adc9d3344" 2040 | integrity sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw== 2041 | 2042 | undici-types@~5.26.4: 2043 | version "5.26.5" 2044 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" 2045 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 2046 | 2047 | uri-js@^4.2.2, uri-js@^4.4.1: 2048 | version "4.4.1" 2049 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2050 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2051 | dependencies: 2052 | punycode "^2.1.0" 2053 | 2054 | vite-node@1.6.0: 2055 | version "1.6.0" 2056 | resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.0.tgz#2c7e61129bfecc759478fa592754fd9704aaba7f" 2057 | integrity sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw== 2058 | dependencies: 2059 | cac "^6.7.14" 2060 | debug "^4.3.4" 2061 | pathe "^1.1.1" 2062 | picocolors "^1.0.0" 2063 | vite "^5.0.0" 2064 | 2065 | vite-tsconfig-paths@^4.3.2: 2066 | version "4.3.2" 2067 | resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz#321f02e4b736a90ff62f9086467faf4e2da857a9" 2068 | integrity sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA== 2069 | dependencies: 2070 | debug "^4.1.1" 2071 | globrex "^0.1.2" 2072 | tsconfck "^3.0.3" 2073 | 2074 | vite@^5.0.0: 2075 | version "5.2.11" 2076 | resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.11.tgz#726ec05555431735853417c3c0bfb36003ca0cbd" 2077 | integrity sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ== 2078 | dependencies: 2079 | esbuild "^0.20.1" 2080 | postcss "^8.4.38" 2081 | rollup "^4.13.0" 2082 | optionalDependencies: 2083 | fsevents "~2.3.3" 2084 | 2085 | vitest@^1.6.0: 2086 | version "1.6.0" 2087 | resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.6.0.tgz#9d5ad4752a3c451be919e412c597126cffb9892f" 2088 | integrity sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA== 2089 | dependencies: 2090 | "@vitest/expect" "1.6.0" 2091 | "@vitest/runner" "1.6.0" 2092 | "@vitest/snapshot" "1.6.0" 2093 | "@vitest/spy" "1.6.0" 2094 | "@vitest/utils" "1.6.0" 2095 | acorn-walk "^8.3.2" 2096 | chai "^4.3.10" 2097 | debug "^4.3.4" 2098 | execa "^8.0.1" 2099 | local-pkg "^0.5.0" 2100 | magic-string "^0.30.5" 2101 | pathe "^1.1.1" 2102 | picocolors "^1.0.0" 2103 | std-env "^3.5.0" 2104 | strip-literal "^2.0.0" 2105 | tinybench "^2.5.1" 2106 | tinypool "^0.8.3" 2107 | vite "^5.0.0" 2108 | vite-node "1.6.0" 2109 | why-is-node-running "^2.2.2" 2110 | 2111 | which@^2.0.1: 2112 | version "2.0.2" 2113 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2114 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2115 | dependencies: 2116 | isexe "^2.0.0" 2117 | 2118 | why-is-node-running@^2.2.2: 2119 | version "2.2.2" 2120 | resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" 2121 | integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== 2122 | dependencies: 2123 | siginfo "^2.0.0" 2124 | stackback "0.0.2" 2125 | 2126 | word-wrap@^1.2.5: 2127 | version "1.2.5" 2128 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" 2129 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 2130 | 2131 | "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 2132 | version "7.0.0" 2133 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2134 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2135 | dependencies: 2136 | ansi-styles "^4.0.0" 2137 | string-width "^4.1.0" 2138 | strip-ansi "^6.0.0" 2139 | 2140 | wrap-ansi@^8.1.0: 2141 | version "8.1.0" 2142 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" 2143 | integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== 2144 | dependencies: 2145 | ansi-styles "^6.1.0" 2146 | string-width "^5.0.1" 2147 | strip-ansi "^7.0.1" 2148 | 2149 | yocto-queue@^0.1.0: 2150 | version "0.1.0" 2151 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 2152 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 2153 | 2154 | yocto-queue@^1.0.0: 2155 | version "1.0.0" 2156 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" 2157 | integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== 2158 | --------------------------------------------------------------------------------