├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .husky ├── pre-commit └── pre-push ├── .nvmrc ├── LICENSE ├── README.md ├── eslint.config.mjs ├── example ├── config.json └── output.ts ├── package.json ├── pnpm-lock.yaml ├── src ├── config │ ├── getConfig.ts │ ├── schema.json │ ├── types.ts │ └── validateConfig.ts ├── convertSchemaToType.ts ├── fetchData.ts ├── generateTypes.ts ├── index.ts ├── inferJsonSchema.test.ts ├── inferJsonSchema.ts ├── mergeJsonSchema.test.ts ├── mergeJsonSchema.ts └── saveTypesToFile.ts ├── tsconfig.json └── tsup.config.ts /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI Checks 2 | 3 | on: 4 | pull_request: 5 | types: [opened, reopened, synchronize] 6 | push: 7 | branches: 8 | - main 9 | 10 | jobs: 11 | ci: 12 | name: CI Pipeline 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v4 17 | 18 | - name: Install pnpm 19 | uses: pnpm/action-setup@v4 20 | with: 21 | version: 8 22 | 23 | - name: Setup Node 24 | uses: actions/setup-node@v4 25 | with: 26 | node-version-file: ".nvmrc" 27 | cache: "pnpm" 28 | 29 | - name: Install dependencies 30 | shell: bash 31 | run: pnpm install 32 | 33 | - name: Build 34 | shell: bash 35 | run: pnpm build 36 | 37 | - name: Lint 38 | run: pnpm lint 39 | 40 | - name: Test 41 | run: pnpm test 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules/ 3 | .env -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | pnpm lint -------------------------------------------------------------------------------- /.husky/pre-push: -------------------------------------------------------------------------------- 1 | pnpm build 2 | pnpm test 3 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v20.4.0 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Gateweaver 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # API Typegen 2 | 3 | A TypeScript type generator that creates type definitions from API endpoint responses. Ideal for APIs that don't provide OpenAPI (Swagger) specifications. 4 | 5 | ## Example 6 | 7 | Input (`config.json`): 8 | 9 | ```json 10 | { 11 | "endpoints": [ 12 | { 13 | "typeName": "Todo", 14 | "url": "https://jsonplaceholder.typicode.com/todos/1", 15 | "method": "GET" 16 | }, 17 | { 18 | "typeName": "Posts", 19 | "url": "https://jsonplaceholder.typicode.com/posts", 20 | "method": "GET" 21 | }, 22 | { 23 | "typeName": "User", 24 | "url": "https://jsonplaceholder.typicode.com/users", 25 | "method": "POST", 26 | "headers": { 27 | "Content-Type": "application/json" 28 | }, 29 | "body": { 30 | "name": "John Doe", 31 | "email": "johndoe@example.com" 32 | } 33 | } 34 | ] 35 | } 36 | ``` 37 | 38 | Output (`types.ts`): 39 | 40 | ```typescript 41 | export interface Todo { 42 | userId?: number; 43 | id?: number; 44 | title?: string; 45 | completed?: boolean; 46 | } 47 | 48 | export interface PostsItem { 49 | userId?: number; 50 | id?: number; 51 | title?: string; 52 | body?: string; 53 | } 54 | export type Posts = PostsItem[]; 55 | 56 | export interface User { 57 | name?: string; 58 | email?: string; 59 | id?: number; 60 | } 61 | ``` 62 | 63 | ## Installation 64 | 65 | ```bash 66 | npm install api-typegen 67 | ``` 68 | 69 | ## Usage 70 | 71 | ### CLI 72 | 73 | You can use API Typegen directly from the command line: 74 | 75 | ```bash 76 | npx api-typegen --config path/to/config.json --output types.ts 77 | ``` 78 | 79 | ### Programmatic Usage 80 | 81 | You can also use API Typegen programmatically: 82 | 83 | ```typescript 84 | import fs from "fs"; 85 | import { generateTypes, type Endpoint } from "api-typegen"; 86 | 87 | const main = async () => { 88 | const endpoints: Endpoint[] = [ 89 | { 90 | typeName: "Todo", 91 | url: "https://jsonplaceholder.typicode.com/todos/1", 92 | method: "GET", 93 | }, 94 | { 95 | typeName: "Posts", 96 | url: "https://jsonplaceholder.typicode.com/posts", 97 | method: "GET", 98 | }, 99 | { 100 | typeName: "User", 101 | url: "https://jsonplaceholder.typicode.com/users", 102 | method: "POST", 103 | headers: { 104 | "Content-Type": "application/json", 105 | }, 106 | body: { 107 | name: "John Doe", 108 | email: "johndoe@example.com", 109 | }, 110 | }, 111 | ]; 112 | 113 | const types = await generateTypes(endpoints); 114 | fs.writeFileSync("exampleTypes.ts", types); 115 | }; 116 | 117 | main(); 118 | ``` 119 | 120 | ## Configuration 121 | 122 | Each endpoint in the configuration can have the following properties: 123 | 124 | - `typeName` (required): The name of the generated TypeScript type. 125 | 126 | - `url` (required): The URL of the API endpoint. 127 | 128 | - `method` (required): The HTTP method (GET, POST, PUT, DELETE, PATCH). 129 | 130 | - `headers` (optional): An object of custom headers to send with the request. 131 | 132 | - `queryParams` (optional): An object of query parameters to append to the URL. 133 | 134 | - `body` (optional): The request body for POST, PUT, or PATCH requests. 135 | 136 | - `override` (optional): A JSON Schema object to override the inferred schema. 137 | 138 | ### Schema Override 139 | 140 | You can override a type by providing a JSON Schema object in the `override` property. This allows you to customize the generated types to better suit your needs. For example, the following configuration makes all the properties in `Todo` no longer optional and the `completed` property nullable: 141 | 142 | ```json 143 | { 144 | "endpoints": [ 145 | { 146 | "typeName": "Todo", 147 | "url": "https://jsonplaceholder.typicode.com/todos/1", 148 | "method": "GET", 149 | "override": { 150 | "properties": { 151 | "completed": { "type": ["boolean", "null"] } 152 | }, 153 | "required": ["userId", "id", "title", "completed"] 154 | } 155 | } 156 | ] 157 | } 158 | ``` 159 | 160 | Output: 161 | 162 | ```typescript 163 | export interface Todo { 164 | userId: number; 165 | id: number; 166 | title: string; 167 | completed: boolean | null; 168 | } 169 | ``` 170 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | import eslint from "@eslint/js"; 4 | import tseslint from "typescript-eslint"; 5 | 6 | export default tseslint.config( 7 | eslint.configs.recommended, 8 | ...tseslint.configs.recommended, 9 | { 10 | ignores: ["dist"], 11 | } 12 | ); 13 | -------------------------------------------------------------------------------- /example/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "endpoints": [ 3 | { 4 | "typeName": "Todo", 5 | "url": "https://jsonplaceholder.typicode.com/todos/1", 6 | "method": "GET" 7 | }, 8 | { 9 | "typeName": "Posts", 10 | "url": "https://jsonplaceholder.typicode.com/posts", 11 | "method": "GET" 12 | }, 13 | { 14 | "typeName": "User", 15 | "url": "https://jsonplaceholder.typicode.com/users", 16 | "method": "POST", 17 | "headers": { 18 | "Content-Type": "application/json" 19 | }, 20 | "body": { 21 | "name": "John Doe", 22 | "email": "johndoe@example.com" 23 | } 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /example/output.ts: -------------------------------------------------------------------------------- 1 | export interface Todo { 2 | userId?: number; 3 | id?: number; 4 | title?: string; 5 | completed?: boolean; 6 | } 7 | 8 | export interface PostsItem { 9 | userId?: number; 10 | id?: number; 11 | title?: string; 12 | body?: string; 13 | } 14 | export type Posts = PostsItem[]; 15 | 16 | export interface User { 17 | name?: string; 18 | email?: string; 19 | id?: number; 20 | } 21 | 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api-typegen", 3 | "version": "0.1.0", 4 | "description": "", 5 | "main": "./dist/index.js", 6 | "module": "./dist/index.mjs", 7 | "types": "./dist/index.d.ts", 8 | "bin": { 9 | "api-typegen": "./dist/index.js" 10 | }, 11 | "scripts": { 12 | "build": "tsup", 13 | "build:watch": "tsup --watch", 14 | "generate": "node dist/index.js -c ./example/config.json -o ./example/output.ts", 15 | "test": "vitest run", 16 | "test:watch": "vitest watch", 17 | "lint": "eslint .", 18 | "clean": "rm -rf dist", 19 | "prepare": "husky" 20 | }, 21 | "keywords": [], 22 | "author": "", 23 | "license": "MIT", 24 | "repository": { 25 | "type": "git", 26 | "url": "https://github.com/gladwindos/api-typegen.git" 27 | }, 28 | "devDependencies": { 29 | "@eslint/js": "^9.7.0", 30 | "@types/eslint__js": "^8.42.3", 31 | "@types/node": "^20.14.2", 32 | "eslint": "^9.7.0", 33 | "husky": "^9.1.2", 34 | "tsup": "^8.1.0", 35 | "typescript": "^5.4.5", 36 | "typescript-eslint": "^7.17.0", 37 | "vitest": "^2.0.4" 38 | }, 39 | "dependencies": { 40 | "ajv": "^8.17.1", 41 | "commander": "^12.1.0", 42 | "generate-schema": "^2.6.0", 43 | "json-schema-to-typescript": "^14.0.5" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | ajv: 12 | specifier: ^8.17.1 13 | version: 8.17.1 14 | commander: 15 | specifier: ^12.1.0 16 | version: 12.1.0 17 | generate-schema: 18 | specifier: ^2.6.0 19 | version: 2.6.0 20 | json-schema-to-typescript: 21 | specifier: ^14.0.5 22 | version: 14.0.5 23 | devDependencies: 24 | '@eslint/js': 25 | specifier: ^9.7.0 26 | version: 9.7.0 27 | '@types/eslint__js': 28 | specifier: ^8.42.3 29 | version: 8.42.3 30 | '@types/node': 31 | specifier: ^20.14.2 32 | version: 20.14.2 33 | eslint: 34 | specifier: ^9.7.0 35 | version: 9.7.0 36 | husky: 37 | specifier: ^9.1.2 38 | version: 9.1.2 39 | tsup: 40 | specifier: ^8.1.0 41 | version: 8.1.0(postcss@8.5.1)(typescript@5.4.5) 42 | typescript: 43 | specifier: ^5.4.5 44 | version: 5.4.5 45 | typescript-eslint: 46 | specifier: ^7.17.0 47 | version: 7.17.0(eslint@9.7.0)(typescript@5.4.5) 48 | vitest: 49 | specifier: ^2.0.4 50 | version: 2.1.9(@types/node@20.14.2) 51 | 52 | packages: 53 | 54 | '@apidevtools/json-schema-ref-parser@11.6.4': 55 | resolution: {integrity: sha512-9K6xOqeevacvweLGik6LnZCb1fBtCOSIWQs8d096XGeqoLKC33UVMGz9+77Gw44KvbH4pKcQPWo4ZpxkXYj05w==} 56 | engines: {node: '>= 16'} 57 | 58 | '@esbuild/aix-ppc64@0.21.5': 59 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 60 | engines: {node: '>=12'} 61 | cpu: [ppc64] 62 | os: [aix] 63 | 64 | '@esbuild/android-arm64@0.21.5': 65 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 66 | engines: {node: '>=12'} 67 | cpu: [arm64] 68 | os: [android] 69 | 70 | '@esbuild/android-arm@0.21.5': 71 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 72 | engines: {node: '>=12'} 73 | cpu: [arm] 74 | os: [android] 75 | 76 | '@esbuild/android-x64@0.21.5': 77 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 78 | engines: {node: '>=12'} 79 | cpu: [x64] 80 | os: [android] 81 | 82 | '@esbuild/darwin-arm64@0.21.5': 83 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 84 | engines: {node: '>=12'} 85 | cpu: [arm64] 86 | os: [darwin] 87 | 88 | '@esbuild/darwin-x64@0.21.5': 89 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 90 | engines: {node: '>=12'} 91 | cpu: [x64] 92 | os: [darwin] 93 | 94 | '@esbuild/freebsd-arm64@0.21.5': 95 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 96 | engines: {node: '>=12'} 97 | cpu: [arm64] 98 | os: [freebsd] 99 | 100 | '@esbuild/freebsd-x64@0.21.5': 101 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 102 | engines: {node: '>=12'} 103 | cpu: [x64] 104 | os: [freebsd] 105 | 106 | '@esbuild/linux-arm64@0.21.5': 107 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 108 | engines: {node: '>=12'} 109 | cpu: [arm64] 110 | os: [linux] 111 | 112 | '@esbuild/linux-arm@0.21.5': 113 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 114 | engines: {node: '>=12'} 115 | cpu: [arm] 116 | os: [linux] 117 | 118 | '@esbuild/linux-ia32@0.21.5': 119 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 120 | engines: {node: '>=12'} 121 | cpu: [ia32] 122 | os: [linux] 123 | 124 | '@esbuild/linux-loong64@0.21.5': 125 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 126 | engines: {node: '>=12'} 127 | cpu: [loong64] 128 | os: [linux] 129 | 130 | '@esbuild/linux-mips64el@0.21.5': 131 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 132 | engines: {node: '>=12'} 133 | cpu: [mips64el] 134 | os: [linux] 135 | 136 | '@esbuild/linux-ppc64@0.21.5': 137 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 138 | engines: {node: '>=12'} 139 | cpu: [ppc64] 140 | os: [linux] 141 | 142 | '@esbuild/linux-riscv64@0.21.5': 143 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 144 | engines: {node: '>=12'} 145 | cpu: [riscv64] 146 | os: [linux] 147 | 148 | '@esbuild/linux-s390x@0.21.5': 149 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 150 | engines: {node: '>=12'} 151 | cpu: [s390x] 152 | os: [linux] 153 | 154 | '@esbuild/linux-x64@0.21.5': 155 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 156 | engines: {node: '>=12'} 157 | cpu: [x64] 158 | os: [linux] 159 | 160 | '@esbuild/netbsd-x64@0.21.5': 161 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 162 | engines: {node: '>=12'} 163 | cpu: [x64] 164 | os: [netbsd] 165 | 166 | '@esbuild/openbsd-x64@0.21.5': 167 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 168 | engines: {node: '>=12'} 169 | cpu: [x64] 170 | os: [openbsd] 171 | 172 | '@esbuild/sunos-x64@0.21.5': 173 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 174 | engines: {node: '>=12'} 175 | cpu: [x64] 176 | os: [sunos] 177 | 178 | '@esbuild/win32-arm64@0.21.5': 179 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 180 | engines: {node: '>=12'} 181 | cpu: [arm64] 182 | os: [win32] 183 | 184 | '@esbuild/win32-ia32@0.21.5': 185 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 186 | engines: {node: '>=12'} 187 | cpu: [ia32] 188 | os: [win32] 189 | 190 | '@esbuild/win32-x64@0.21.5': 191 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 192 | engines: {node: '>=12'} 193 | cpu: [x64] 194 | os: [win32] 195 | 196 | '@eslint-community/eslint-utils@4.4.0': 197 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 198 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 199 | peerDependencies: 200 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 201 | 202 | '@eslint-community/regexpp@4.11.0': 203 | resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} 204 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 205 | 206 | '@eslint/config-array@0.17.1': 207 | resolution: {integrity: sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==} 208 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 209 | 210 | '@eslint/eslintrc@3.1.0': 211 | resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} 212 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 213 | 214 | '@eslint/js@9.7.0': 215 | resolution: {integrity: sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==} 216 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 217 | 218 | '@eslint/object-schema@2.1.4': 219 | resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} 220 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 221 | 222 | '@humanwhocodes/module-importer@1.0.1': 223 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 224 | engines: {node: '>=12.22'} 225 | 226 | '@humanwhocodes/retry@0.3.0': 227 | resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} 228 | engines: {node: '>=18.18'} 229 | 230 | '@isaacs/cliui@8.0.2': 231 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 232 | engines: {node: '>=12'} 233 | 234 | '@jridgewell/gen-mapping@0.3.5': 235 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 236 | engines: {node: '>=6.0.0'} 237 | 238 | '@jridgewell/resolve-uri@3.1.2': 239 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 240 | engines: {node: '>=6.0.0'} 241 | 242 | '@jridgewell/set-array@1.2.1': 243 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 244 | engines: {node: '>=6.0.0'} 245 | 246 | '@jridgewell/sourcemap-codec@1.5.0': 247 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 248 | 249 | '@jridgewell/trace-mapping@0.3.25': 250 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 251 | 252 | '@jsdevtools/ono@7.1.3': 253 | resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} 254 | 255 | '@nodelib/fs.scandir@2.1.5': 256 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 257 | engines: {node: '>= 8'} 258 | 259 | '@nodelib/fs.stat@2.0.5': 260 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 261 | engines: {node: '>= 8'} 262 | 263 | '@nodelib/fs.walk@1.2.8': 264 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 265 | engines: {node: '>= 8'} 266 | 267 | '@pkgjs/parseargs@0.11.0': 268 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 269 | engines: {node: '>=14'} 270 | 271 | '@rollup/rollup-android-arm-eabi@4.18.1': 272 | resolution: {integrity: sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==} 273 | cpu: [arm] 274 | os: [android] 275 | 276 | '@rollup/rollup-android-arm-eabi@4.34.2': 277 | resolution: {integrity: sha512-6Fyg9yQbwJR+ykVdT9sid1oc2ewejS6h4wzQltmJfSW53N60G/ah9pngXGANdy9/aaE/TcUFpWosdm7JXS1WTQ==} 278 | cpu: [arm] 279 | os: [android] 280 | 281 | '@rollup/rollup-android-arm64@4.18.1': 282 | resolution: {integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==} 283 | cpu: [arm64] 284 | os: [android] 285 | 286 | '@rollup/rollup-android-arm64@4.34.2': 287 | resolution: {integrity: sha512-K5GfWe+vtQ3kyEbihrimM38UgX57UqHp+oME7X/EX9Im6suwZfa7Hsr8AtzbJvukTpwMGs+4s29YMSO3rwWtsw==} 288 | cpu: [arm64] 289 | os: [android] 290 | 291 | '@rollup/rollup-darwin-arm64@4.18.1': 292 | resolution: {integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==} 293 | cpu: [arm64] 294 | os: [darwin] 295 | 296 | '@rollup/rollup-darwin-arm64@4.34.2': 297 | resolution: {integrity: sha512-PSN58XG/V/tzqDb9kDGutUruycgylMlUE59f40ny6QIRNsTEIZsrNQTJKUN2keMMSmlzgunMFqyaGLmly39sug==} 298 | cpu: [arm64] 299 | os: [darwin] 300 | 301 | '@rollup/rollup-darwin-x64@4.18.1': 302 | resolution: {integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==} 303 | cpu: [x64] 304 | os: [darwin] 305 | 306 | '@rollup/rollup-darwin-x64@4.34.2': 307 | resolution: {integrity: sha512-gQhK788rQJm9pzmXyfBB84VHViDERhAhzGafw+E5mUpnGKuxZGkMVDa3wgDFKT6ukLC5V7QTifzsUKdNVxp5qQ==} 308 | cpu: [x64] 309 | os: [darwin] 310 | 311 | '@rollup/rollup-freebsd-arm64@4.34.2': 312 | resolution: {integrity: sha512-eiaHgQwGPpxLC3+zTAcdKl4VsBl3r0AiJOd1Um/ArEzAjN/dbPK1nROHrVkdnoE6p7Svvn04w3f/jEZSTVHunA==} 313 | cpu: [arm64] 314 | os: [freebsd] 315 | 316 | '@rollup/rollup-freebsd-x64@4.34.2': 317 | resolution: {integrity: sha512-lhdiwQ+jf8pewYOTG4bag0Qd68Jn1v2gO1i0mTuiD+Qkt5vNfHVK/jrT7uVvycV8ZchlzXp5HDVmhpzjC6mh0g==} 318 | cpu: [x64] 319 | os: [freebsd] 320 | 321 | '@rollup/rollup-linux-arm-gnueabihf@4.18.1': 322 | resolution: {integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==} 323 | cpu: [arm] 324 | os: [linux] 325 | 326 | '@rollup/rollup-linux-arm-gnueabihf@4.34.2': 327 | resolution: {integrity: sha512-lfqTpWjSvbgQP1vqGTXdv+/kxIznKXZlI109WkIFPbud41bjigjNmOAAKoazmRGx+k9e3rtIdbq2pQZPV1pMig==} 328 | cpu: [arm] 329 | os: [linux] 330 | 331 | '@rollup/rollup-linux-arm-musleabihf@4.18.1': 332 | resolution: {integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==} 333 | cpu: [arm] 334 | os: [linux] 335 | 336 | '@rollup/rollup-linux-arm-musleabihf@4.34.2': 337 | resolution: {integrity: sha512-RGjqULqIurqqv+NJTyuPgdZhka8ImMLB32YwUle2BPTDqDoXNgwFjdjQC59FbSk08z0IqlRJjrJ0AvDQ5W5lpw==} 338 | cpu: [arm] 339 | os: [linux] 340 | 341 | '@rollup/rollup-linux-arm64-gnu@4.18.1': 342 | resolution: {integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==} 343 | cpu: [arm64] 344 | os: [linux] 345 | 346 | '@rollup/rollup-linux-arm64-gnu@4.34.2': 347 | resolution: {integrity: sha512-ZvkPiheyXtXlFqHpsdgscx+tZ7hoR59vOettvArinEspq5fxSDSgfF+L5wqqJ9R4t+n53nyn0sKxeXlik7AY9Q==} 348 | cpu: [arm64] 349 | os: [linux] 350 | 351 | '@rollup/rollup-linux-arm64-musl@4.18.1': 352 | resolution: {integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==} 353 | cpu: [arm64] 354 | os: [linux] 355 | 356 | '@rollup/rollup-linux-arm64-musl@4.34.2': 357 | resolution: {integrity: sha512-UlFk+E46TZEoxD9ufLKDBzfSG7Ki03fo6hsNRRRHF+KuvNZ5vd1RRVQm8YZlGsjcJG8R252XFK0xNPay+4WV7w==} 358 | cpu: [arm64] 359 | os: [linux] 360 | 361 | '@rollup/rollup-linux-loongarch64-gnu@4.34.2': 362 | resolution: {integrity: sha512-hJhfsD9ykx59jZuuoQgYT1GEcNNi3RCoEmbo5OGfG8RlHOiVS7iVNev9rhLKh7UBYq409f4uEw0cclTXx8nh8Q==} 363 | cpu: [loong64] 364 | os: [linux] 365 | 366 | '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': 367 | resolution: {integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==} 368 | cpu: [ppc64] 369 | os: [linux] 370 | 371 | '@rollup/rollup-linux-powerpc64le-gnu@4.34.2': 372 | resolution: {integrity: sha512-g/O5IpgtrQqPegvqopvmdCF9vneLE7eqYfdPWW8yjPS8f63DNam3U4ARL1PNNB64XHZDHKpvO2Giftf43puB8Q==} 373 | cpu: [ppc64] 374 | os: [linux] 375 | 376 | '@rollup/rollup-linux-riscv64-gnu@4.18.1': 377 | resolution: {integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==} 378 | cpu: [riscv64] 379 | os: [linux] 380 | 381 | '@rollup/rollup-linux-riscv64-gnu@4.34.2': 382 | resolution: {integrity: sha512-bSQijDC96M6PuooOuXHpvXUYiIwsnDmqGU8+br2U7iPoykNi9JtMUpN7K6xml29e0evK0/g0D1qbAUzWZFHY5Q==} 383 | cpu: [riscv64] 384 | os: [linux] 385 | 386 | '@rollup/rollup-linux-s390x-gnu@4.18.1': 387 | resolution: {integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==} 388 | cpu: [s390x] 389 | os: [linux] 390 | 391 | '@rollup/rollup-linux-s390x-gnu@4.34.2': 392 | resolution: {integrity: sha512-49TtdeVAsdRuiUHXPrFVucaP4SivazetGUVH8CIxVsNsaPHV4PFkpLmH9LeqU/R4Nbgky9lzX5Xe1NrzLyraVA==} 393 | cpu: [s390x] 394 | os: [linux] 395 | 396 | '@rollup/rollup-linux-x64-gnu@4.18.1': 397 | resolution: {integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==} 398 | cpu: [x64] 399 | os: [linux] 400 | 401 | '@rollup/rollup-linux-x64-gnu@4.34.2': 402 | resolution: {integrity: sha512-j+jFdfOycLIQ7FWKka9Zd3qvsIyugg5LeZuHF6kFlXo6MSOc6R1w37YUVy8VpAKd81LMWGi5g9J25P09M0SSIw==} 403 | cpu: [x64] 404 | os: [linux] 405 | 406 | '@rollup/rollup-linux-x64-musl@4.18.1': 407 | resolution: {integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==} 408 | cpu: [x64] 409 | os: [linux] 410 | 411 | '@rollup/rollup-linux-x64-musl@4.34.2': 412 | resolution: {integrity: sha512-aDPHyM/D2SpXfSNCVWCxyHmOqN9qb7SWkY1+vaXqMNMXslZYnwh9V/UCudl6psyG0v6Ukj7pXanIpfZwCOEMUg==} 413 | cpu: [x64] 414 | os: [linux] 415 | 416 | '@rollup/rollup-win32-arm64-msvc@4.18.1': 417 | resolution: {integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==} 418 | cpu: [arm64] 419 | os: [win32] 420 | 421 | '@rollup/rollup-win32-arm64-msvc@4.34.2': 422 | resolution: {integrity: sha512-LQRkCyUBnAo7r8dbEdtNU08EKLCJMgAk2oP5H3R7BnUlKLqgR3dUjrLBVirmc1RK6U6qhtDw29Dimeer8d5hzQ==} 423 | cpu: [arm64] 424 | os: [win32] 425 | 426 | '@rollup/rollup-win32-ia32-msvc@4.18.1': 427 | resolution: {integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==} 428 | cpu: [ia32] 429 | os: [win32] 430 | 431 | '@rollup/rollup-win32-ia32-msvc@4.34.2': 432 | resolution: {integrity: sha512-wt8OhpQUi6JuPFkm1wbVi1BByeag87LDFzeKSXzIdGcX4bMLqORTtKxLoCbV57BHYNSUSOKlSL4BYYUghainYA==} 433 | cpu: [ia32] 434 | os: [win32] 435 | 436 | '@rollup/rollup-win32-x64-msvc@4.18.1': 437 | resolution: {integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==} 438 | cpu: [x64] 439 | os: [win32] 440 | 441 | '@rollup/rollup-win32-x64-msvc@4.34.2': 442 | resolution: {integrity: sha512-rUrqINax0TvrPBXrFKg0YbQx18NpPN3NNrgmaao9xRNbTwek7lOXObhx8tQy8gelmQ/gLaGy1WptpU2eKJZImg==} 443 | cpu: [x64] 444 | os: [win32] 445 | 446 | '@types/eslint@9.6.0': 447 | resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} 448 | 449 | '@types/eslint__js@8.42.3': 450 | resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} 451 | 452 | '@types/estree@1.0.5': 453 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 454 | 455 | '@types/estree@1.0.6': 456 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 457 | 458 | '@types/json-schema@7.0.15': 459 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 460 | 461 | '@types/lodash@4.17.5': 462 | resolution: {integrity: sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==} 463 | 464 | '@types/node@20.14.2': 465 | resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==} 466 | 467 | '@typescript-eslint/eslint-plugin@7.17.0': 468 | resolution: {integrity: sha512-pyiDhEuLM3PuANxH7uNYan1AaFs5XE0zw1hq69JBvGvE7gSuEoQl1ydtEe/XQeoC3GQxLXyOVa5kNOATgM638A==} 469 | engines: {node: ^18.18.0 || >=20.0.0} 470 | peerDependencies: 471 | '@typescript-eslint/parser': ^7.0.0 472 | eslint: ^8.56.0 473 | typescript: '*' 474 | peerDependenciesMeta: 475 | typescript: 476 | optional: true 477 | 478 | '@typescript-eslint/parser@7.17.0': 479 | resolution: {integrity: sha512-puiYfGeg5Ydop8eusb/Hy1k7QmOU6X3nvsqCgzrB2K4qMavK//21+PzNE8qeECgNOIoertJPUC1SpegHDI515A==} 480 | engines: {node: ^18.18.0 || >=20.0.0} 481 | peerDependencies: 482 | eslint: ^8.56.0 483 | typescript: '*' 484 | peerDependenciesMeta: 485 | typescript: 486 | optional: true 487 | 488 | '@typescript-eslint/scope-manager@7.17.0': 489 | resolution: {integrity: sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==} 490 | engines: {node: ^18.18.0 || >=20.0.0} 491 | 492 | '@typescript-eslint/type-utils@7.17.0': 493 | resolution: {integrity: sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA==} 494 | engines: {node: ^18.18.0 || >=20.0.0} 495 | peerDependencies: 496 | eslint: ^8.56.0 497 | typescript: '*' 498 | peerDependenciesMeta: 499 | typescript: 500 | optional: true 501 | 502 | '@typescript-eslint/types@7.17.0': 503 | resolution: {integrity: sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==} 504 | engines: {node: ^18.18.0 || >=20.0.0} 505 | 506 | '@typescript-eslint/typescript-estree@7.17.0': 507 | resolution: {integrity: sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==} 508 | engines: {node: ^18.18.0 || >=20.0.0} 509 | peerDependencies: 510 | typescript: '*' 511 | peerDependenciesMeta: 512 | typescript: 513 | optional: true 514 | 515 | '@typescript-eslint/utils@7.17.0': 516 | resolution: {integrity: sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==} 517 | engines: {node: ^18.18.0 || >=20.0.0} 518 | peerDependencies: 519 | eslint: ^8.56.0 520 | 521 | '@typescript-eslint/visitor-keys@7.17.0': 522 | resolution: {integrity: sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==} 523 | engines: {node: ^18.18.0 || >=20.0.0} 524 | 525 | '@vitest/expect@2.1.9': 526 | resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} 527 | 528 | '@vitest/mocker@2.1.9': 529 | resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} 530 | peerDependencies: 531 | msw: ^2.4.9 532 | vite: ^5.0.0 533 | peerDependenciesMeta: 534 | msw: 535 | optional: true 536 | vite: 537 | optional: true 538 | 539 | '@vitest/pretty-format@2.1.9': 540 | resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} 541 | 542 | '@vitest/runner@2.1.9': 543 | resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} 544 | 545 | '@vitest/snapshot@2.1.9': 546 | resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} 547 | 548 | '@vitest/spy@2.1.9': 549 | resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} 550 | 551 | '@vitest/utils@2.1.9': 552 | resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} 553 | 554 | acorn-jsx@5.3.2: 555 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 556 | peerDependencies: 557 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 558 | 559 | acorn@8.12.1: 560 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 561 | engines: {node: '>=0.4.0'} 562 | hasBin: true 563 | 564 | ajv@6.12.6: 565 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 566 | 567 | ajv@8.17.1: 568 | resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 569 | 570 | ansi-regex@5.0.1: 571 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 572 | engines: {node: '>=8'} 573 | 574 | ansi-regex@6.0.1: 575 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 576 | engines: {node: '>=12'} 577 | 578 | ansi-styles@4.3.0: 579 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 580 | engines: {node: '>=8'} 581 | 582 | ansi-styles@6.2.1: 583 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 584 | engines: {node: '>=12'} 585 | 586 | any-promise@1.3.0: 587 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 588 | 589 | anymatch@3.1.3: 590 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 591 | engines: {node: '>= 8'} 592 | 593 | argparse@2.0.1: 594 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 595 | 596 | array-union@2.1.0: 597 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 598 | engines: {node: '>=8'} 599 | 600 | assertion-error@2.0.1: 601 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 602 | engines: {node: '>=12'} 603 | 604 | balanced-match@1.0.2: 605 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 606 | 607 | binary-extensions@2.3.0: 608 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 609 | engines: {node: '>=8'} 610 | 611 | brace-expansion@1.1.11: 612 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 613 | 614 | brace-expansion@2.0.1: 615 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 616 | 617 | braces@3.0.3: 618 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 619 | engines: {node: '>=8'} 620 | 621 | bundle-require@4.2.1: 622 | resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} 623 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 624 | peerDependencies: 625 | esbuild: '>=0.17' 626 | 627 | cac@6.7.14: 628 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 629 | engines: {node: '>=8'} 630 | 631 | callsites@3.1.0: 632 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 633 | engines: {node: '>=6'} 634 | 635 | chai@5.1.2: 636 | resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} 637 | engines: {node: '>=12'} 638 | 639 | chalk@4.1.2: 640 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 641 | engines: {node: '>=10'} 642 | 643 | check-error@2.1.1: 644 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 645 | engines: {node: '>= 16'} 646 | 647 | chokidar@3.6.0: 648 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 649 | engines: {node: '>= 8.10.0'} 650 | 651 | cli-color@2.0.4: 652 | resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} 653 | engines: {node: '>=0.10'} 654 | 655 | color-convert@2.0.1: 656 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 657 | engines: {node: '>=7.0.0'} 658 | 659 | color-name@1.1.4: 660 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 661 | 662 | commander@12.1.0: 663 | resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} 664 | engines: {node: '>=18'} 665 | 666 | commander@2.20.3: 667 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 668 | 669 | commander@4.1.1: 670 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 671 | engines: {node: '>= 6'} 672 | 673 | concat-map@0.0.1: 674 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 675 | 676 | cross-spawn@7.0.3: 677 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 678 | engines: {node: '>= 8'} 679 | 680 | d@1.0.2: 681 | resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} 682 | engines: {node: '>=0.12'} 683 | 684 | data-uri-to-buffer@4.0.1: 685 | resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 686 | engines: {node: '>= 12'} 687 | 688 | debug@4.3.5: 689 | resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} 690 | engines: {node: '>=6.0'} 691 | peerDependencies: 692 | supports-color: '*' 693 | peerDependenciesMeta: 694 | supports-color: 695 | optional: true 696 | 697 | debug@4.4.0: 698 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 699 | engines: {node: '>=6.0'} 700 | peerDependencies: 701 | supports-color: '*' 702 | peerDependenciesMeta: 703 | supports-color: 704 | optional: true 705 | 706 | deep-eql@5.0.2: 707 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 708 | engines: {node: '>=6'} 709 | 710 | deep-is@0.1.4: 711 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 712 | 713 | dir-glob@3.0.1: 714 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 715 | engines: {node: '>=8'} 716 | 717 | eastasianwidth@0.2.0: 718 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 719 | 720 | emoji-regex@8.0.0: 721 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 722 | 723 | emoji-regex@9.2.2: 724 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 725 | 726 | es-module-lexer@1.6.0: 727 | resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 728 | 729 | es5-ext@0.10.64: 730 | resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} 731 | engines: {node: '>=0.10'} 732 | 733 | es6-iterator@2.0.3: 734 | resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} 735 | 736 | es6-symbol@3.1.4: 737 | resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} 738 | engines: {node: '>=0.12'} 739 | 740 | es6-weak-map@2.0.3: 741 | resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} 742 | 743 | esbuild@0.21.5: 744 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 745 | engines: {node: '>=12'} 746 | hasBin: true 747 | 748 | escape-string-regexp@4.0.0: 749 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 750 | engines: {node: '>=10'} 751 | 752 | eslint-scope@8.0.2: 753 | resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} 754 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 755 | 756 | eslint-visitor-keys@3.4.3: 757 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 758 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 759 | 760 | eslint-visitor-keys@4.0.0: 761 | resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} 762 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 763 | 764 | eslint@9.7.0: 765 | resolution: {integrity: sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==} 766 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 767 | hasBin: true 768 | 769 | esniff@2.0.1: 770 | resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} 771 | engines: {node: '>=0.10'} 772 | 773 | espree@10.1.0: 774 | resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} 775 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 776 | 777 | esquery@1.6.0: 778 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 779 | engines: {node: '>=0.10'} 780 | 781 | esrecurse@4.3.0: 782 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 783 | engines: {node: '>=4.0'} 784 | 785 | estraverse@5.3.0: 786 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 787 | engines: {node: '>=4.0'} 788 | 789 | estree-walker@3.0.3: 790 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 791 | 792 | esutils@2.0.3: 793 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 794 | engines: {node: '>=0.10.0'} 795 | 796 | event-emitter@0.3.5: 797 | resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} 798 | 799 | execa@5.1.1: 800 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 801 | engines: {node: '>=10'} 802 | 803 | expect-type@1.1.0: 804 | resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} 805 | engines: {node: '>=12.0.0'} 806 | 807 | ext@1.7.0: 808 | resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} 809 | 810 | fast-deep-equal@3.1.3: 811 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 812 | 813 | fast-glob@3.3.2: 814 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 815 | engines: {node: '>=8.6.0'} 816 | 817 | fast-json-stable-stringify@2.1.0: 818 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 819 | 820 | fast-levenshtein@2.0.6: 821 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 822 | 823 | fast-uri@3.0.1: 824 | resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} 825 | 826 | fastq@1.17.1: 827 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 828 | 829 | fetch-blob@3.2.0: 830 | resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} 831 | engines: {node: ^12.20 || >= 14.13} 832 | 833 | file-entry-cache@8.0.0: 834 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 835 | engines: {node: '>=16.0.0'} 836 | 837 | fill-range@7.1.1: 838 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 839 | engines: {node: '>=8'} 840 | 841 | find-up@5.0.0: 842 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 843 | engines: {node: '>=10'} 844 | 845 | flat-cache@4.0.1: 846 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 847 | engines: {node: '>=16'} 848 | 849 | flatted@3.3.1: 850 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 851 | 852 | foreground-child@3.1.1: 853 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 854 | engines: {node: '>=14'} 855 | 856 | formdata-polyfill@4.0.10: 857 | resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} 858 | engines: {node: '>=12.20.0'} 859 | 860 | fsevents@2.3.3: 861 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 862 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 863 | os: [darwin] 864 | 865 | generate-schema@2.6.0: 866 | resolution: {integrity: sha512-EUBKfJNzT8f91xUk5X5gKtnbdejZeE065UAJ3BCzE8VEbvwKI9Pm5jaWmqVeK1MYc1g5weAVFDTSJzN7ymtTqA==} 867 | hasBin: true 868 | 869 | get-stream@6.0.1: 870 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 871 | engines: {node: '>=10'} 872 | 873 | glob-parent@5.1.2: 874 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 875 | engines: {node: '>= 6'} 876 | 877 | glob-parent@6.0.2: 878 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 879 | engines: {node: '>=10.13.0'} 880 | 881 | glob@10.4.1: 882 | resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} 883 | engines: {node: '>=16 || 14 >=14.18'} 884 | hasBin: true 885 | 886 | globals@14.0.0: 887 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 888 | engines: {node: '>=18'} 889 | 890 | globby@11.1.0: 891 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 892 | engines: {node: '>=10'} 893 | 894 | graphemer@1.4.0: 895 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 896 | 897 | has-flag@4.0.0: 898 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 899 | engines: {node: '>=8'} 900 | 901 | human-signals@2.1.0: 902 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 903 | engines: {node: '>=10.17.0'} 904 | 905 | husky@9.1.2: 906 | resolution: {integrity: sha512-1/aDMXZdhr1VdJJTLt6e7BipM0Jd9qkpubPiIplon1WmCeOy3nnzsCMeBqS9AsL5ioonl8F8y/F2CLOmk19/Pw==} 907 | engines: {node: '>=18'} 908 | hasBin: true 909 | 910 | ignore@5.3.1: 911 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 912 | engines: {node: '>= 4'} 913 | 914 | import-fresh@3.3.0: 915 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 916 | engines: {node: '>=6'} 917 | 918 | imurmurhash@0.1.4: 919 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 920 | engines: {node: '>=0.8.19'} 921 | 922 | is-binary-path@2.1.0: 923 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 924 | engines: {node: '>=8'} 925 | 926 | is-extglob@2.1.1: 927 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 928 | engines: {node: '>=0.10.0'} 929 | 930 | is-fullwidth-code-point@3.0.0: 931 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 932 | engines: {node: '>=8'} 933 | 934 | is-glob@4.0.3: 935 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 936 | engines: {node: '>=0.10.0'} 937 | 938 | is-number@7.0.0: 939 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 940 | engines: {node: '>=0.12.0'} 941 | 942 | is-path-inside@3.0.3: 943 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 944 | engines: {node: '>=8'} 945 | 946 | is-promise@2.2.2: 947 | resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} 948 | 949 | is-stream@2.0.1: 950 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 951 | engines: {node: '>=8'} 952 | 953 | isexe@2.0.0: 954 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 955 | 956 | jackspeak@3.4.0: 957 | resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} 958 | engines: {node: '>=14'} 959 | 960 | joycon@3.1.1: 961 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 962 | engines: {node: '>=10'} 963 | 964 | js-yaml@4.1.0: 965 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 966 | hasBin: true 967 | 968 | json-buffer@3.0.1: 969 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 970 | 971 | json-schema-to-typescript@14.0.5: 972 | resolution: {integrity: sha512-JmHsbgY0KKo8Pw0HRXpGzAlZYxlu+M5kFhSzhNkUSrVJ4sCXPdAGIdSpzva5ev2/Kybz10S6AfnNdF4o3Pzt3A==} 973 | engines: {node: '>=16.0.0'} 974 | hasBin: true 975 | 976 | json-schema-traverse@0.4.1: 977 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 978 | 979 | json-schema-traverse@1.0.0: 980 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 981 | 982 | json-stable-stringify-without-jsonify@1.0.1: 983 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 984 | 985 | keyv@4.5.4: 986 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 987 | 988 | levn@0.4.1: 989 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 990 | engines: {node: '>= 0.8.0'} 991 | 992 | lilconfig@3.1.2: 993 | resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} 994 | engines: {node: '>=14'} 995 | 996 | lines-and-columns@1.2.4: 997 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 998 | 999 | load-tsconfig@0.2.5: 1000 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 1001 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1002 | 1003 | locate-path@6.0.0: 1004 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1005 | engines: {node: '>=10'} 1006 | 1007 | lodash.merge@4.6.2: 1008 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1009 | 1010 | lodash.sortby@4.7.0: 1011 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 1012 | 1013 | lodash@4.17.21: 1014 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1015 | 1016 | loupe@3.1.3: 1017 | resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 1018 | 1019 | lru-cache@10.2.2: 1020 | resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} 1021 | engines: {node: 14 || >=16.14} 1022 | 1023 | lru-queue@0.1.0: 1024 | resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} 1025 | 1026 | magic-string@0.30.17: 1027 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 1028 | 1029 | memoizee@0.4.17: 1030 | resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} 1031 | engines: {node: '>=0.12'} 1032 | 1033 | merge-stream@2.0.0: 1034 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1035 | 1036 | merge2@1.4.1: 1037 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1038 | engines: {node: '>= 8'} 1039 | 1040 | micromatch@4.0.7: 1041 | resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} 1042 | engines: {node: '>=8.6'} 1043 | 1044 | mimic-fn@2.1.0: 1045 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1046 | engines: {node: '>=6'} 1047 | 1048 | minimatch@3.1.2: 1049 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1050 | 1051 | minimatch@9.0.4: 1052 | resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} 1053 | engines: {node: '>=16 || 14 >=14.17'} 1054 | 1055 | minimist@1.2.8: 1056 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1057 | 1058 | minipass@7.1.2: 1059 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1060 | engines: {node: '>=16 || 14 >=14.17'} 1061 | 1062 | mkdirp@3.0.1: 1063 | resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} 1064 | engines: {node: '>=10'} 1065 | hasBin: true 1066 | 1067 | ms@2.1.2: 1068 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1069 | 1070 | ms@2.1.3: 1071 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1072 | 1073 | mz@2.7.0: 1074 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1075 | 1076 | nanoid@3.3.8: 1077 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 1078 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1079 | hasBin: true 1080 | 1081 | natural-compare@1.4.0: 1082 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1083 | 1084 | next-tick@1.1.0: 1085 | resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} 1086 | 1087 | node-domexception@1.0.0: 1088 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 1089 | engines: {node: '>=10.5.0'} 1090 | 1091 | node-fetch@3.3.2: 1092 | resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} 1093 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1094 | 1095 | normalize-path@3.0.0: 1096 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1097 | engines: {node: '>=0.10.0'} 1098 | 1099 | npm-run-path@4.0.1: 1100 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1101 | engines: {node: '>=8'} 1102 | 1103 | object-assign@4.1.1: 1104 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1105 | engines: {node: '>=0.10.0'} 1106 | 1107 | onetime@5.1.2: 1108 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1109 | engines: {node: '>=6'} 1110 | 1111 | optionator@0.9.4: 1112 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1113 | engines: {node: '>= 0.8.0'} 1114 | 1115 | p-limit@3.1.0: 1116 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1117 | engines: {node: '>=10'} 1118 | 1119 | p-locate@5.0.0: 1120 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1121 | engines: {node: '>=10'} 1122 | 1123 | parent-module@1.0.1: 1124 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1125 | engines: {node: '>=6'} 1126 | 1127 | path-exists@4.0.0: 1128 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1129 | engines: {node: '>=8'} 1130 | 1131 | path-key@3.1.1: 1132 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1133 | engines: {node: '>=8'} 1134 | 1135 | path-scurry@1.11.1: 1136 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1137 | engines: {node: '>=16 || 14 >=14.18'} 1138 | 1139 | path-type@4.0.0: 1140 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1141 | engines: {node: '>=8'} 1142 | 1143 | pathe@1.1.2: 1144 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 1145 | 1146 | pathval@2.0.0: 1147 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 1148 | engines: {node: '>= 14.16'} 1149 | 1150 | picocolors@1.1.1: 1151 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1152 | 1153 | picomatch@2.3.1: 1154 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1155 | engines: {node: '>=8.6'} 1156 | 1157 | pirates@4.0.6: 1158 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1159 | engines: {node: '>= 6'} 1160 | 1161 | postcss-load-config@4.0.2: 1162 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 1163 | engines: {node: '>= 14'} 1164 | peerDependencies: 1165 | postcss: '>=8.0.9' 1166 | ts-node: '>=9.0.0' 1167 | peerDependenciesMeta: 1168 | postcss: 1169 | optional: true 1170 | ts-node: 1171 | optional: true 1172 | 1173 | postcss@8.5.1: 1174 | resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} 1175 | engines: {node: ^10 || ^12 || >=14} 1176 | 1177 | prelude-ls@1.2.1: 1178 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1179 | engines: {node: '>= 0.8.0'} 1180 | 1181 | prettier@3.3.1: 1182 | resolution: {integrity: sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg==} 1183 | engines: {node: '>=14'} 1184 | hasBin: true 1185 | 1186 | punycode@2.3.1: 1187 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1188 | engines: {node: '>=6'} 1189 | 1190 | queue-microtask@1.2.3: 1191 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1192 | 1193 | readdirp@3.6.0: 1194 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1195 | engines: {node: '>=8.10.0'} 1196 | 1197 | require-from-string@2.0.2: 1198 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 1199 | engines: {node: '>=0.10.0'} 1200 | 1201 | resolve-from@4.0.0: 1202 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1203 | engines: {node: '>=4'} 1204 | 1205 | resolve-from@5.0.0: 1206 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1207 | engines: {node: '>=8'} 1208 | 1209 | reusify@1.0.4: 1210 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1211 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1212 | 1213 | rollup@4.18.1: 1214 | resolution: {integrity: sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==} 1215 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1216 | hasBin: true 1217 | 1218 | rollup@4.34.2: 1219 | resolution: {integrity: sha512-sBDUoxZEaqLu9QeNalL8v3jw6WjPku4wfZGyTU7l7m1oC+rpRihXc/n/H+4148ZkGz5Xli8CHMns//fFGKvpIQ==} 1220 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1221 | hasBin: true 1222 | 1223 | run-parallel@1.2.0: 1224 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1225 | 1226 | semver@7.6.3: 1227 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1228 | engines: {node: '>=10'} 1229 | hasBin: true 1230 | 1231 | shebang-command@2.0.0: 1232 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1233 | engines: {node: '>=8'} 1234 | 1235 | shebang-regex@3.0.0: 1236 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1237 | engines: {node: '>=8'} 1238 | 1239 | siginfo@2.0.0: 1240 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1241 | 1242 | signal-exit@3.0.7: 1243 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1244 | 1245 | signal-exit@4.1.0: 1246 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1247 | engines: {node: '>=14'} 1248 | 1249 | slash@3.0.0: 1250 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1251 | engines: {node: '>=8'} 1252 | 1253 | source-map-js@1.2.1: 1254 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1255 | engines: {node: '>=0.10.0'} 1256 | 1257 | source-map@0.8.0-beta.0: 1258 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1259 | engines: {node: '>= 8'} 1260 | 1261 | stackback@0.0.2: 1262 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1263 | 1264 | std-env@3.8.0: 1265 | resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} 1266 | 1267 | string-width@4.2.3: 1268 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1269 | engines: {node: '>=8'} 1270 | 1271 | string-width@5.1.2: 1272 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1273 | engines: {node: '>=12'} 1274 | 1275 | strip-ansi@6.0.1: 1276 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1277 | engines: {node: '>=8'} 1278 | 1279 | strip-ansi@7.1.0: 1280 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1281 | engines: {node: '>=12'} 1282 | 1283 | strip-final-newline@2.0.0: 1284 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1285 | engines: {node: '>=6'} 1286 | 1287 | strip-json-comments@3.1.1: 1288 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1289 | engines: {node: '>=8'} 1290 | 1291 | sucrase@3.35.0: 1292 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1293 | engines: {node: '>=16 || 14 >=14.17'} 1294 | hasBin: true 1295 | 1296 | supports-color@7.2.0: 1297 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1298 | engines: {node: '>=8'} 1299 | 1300 | text-table@0.2.0: 1301 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1302 | 1303 | thenify-all@1.6.0: 1304 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1305 | engines: {node: '>=0.8'} 1306 | 1307 | thenify@3.3.1: 1308 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1309 | 1310 | timers-ext@0.1.8: 1311 | resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} 1312 | engines: {node: '>=0.12'} 1313 | 1314 | tinybench@2.9.0: 1315 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1316 | 1317 | tinyexec@0.3.2: 1318 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1319 | 1320 | tinypool@1.0.2: 1321 | resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 1322 | engines: {node: ^18.0.0 || >=20.0.0} 1323 | 1324 | tinyrainbow@1.2.0: 1325 | resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} 1326 | engines: {node: '>=14.0.0'} 1327 | 1328 | tinyspy@3.0.2: 1329 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 1330 | engines: {node: '>=14.0.0'} 1331 | 1332 | to-regex-range@5.0.1: 1333 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1334 | engines: {node: '>=8.0'} 1335 | 1336 | tr46@1.0.1: 1337 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1338 | 1339 | tree-kill@1.2.2: 1340 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1341 | hasBin: true 1342 | 1343 | ts-api-utils@1.3.0: 1344 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} 1345 | engines: {node: '>=16'} 1346 | peerDependencies: 1347 | typescript: '>=4.2.0' 1348 | 1349 | ts-interface-checker@0.1.13: 1350 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1351 | 1352 | tsup@8.1.0: 1353 | resolution: {integrity: sha512-UFdfCAXukax+U6KzeTNO2kAARHcWxmKsnvSPXUcfA1D+kU05XDccCrkffCQpFaWDsZfV0jMyTsxU39VfCp6EOg==} 1354 | engines: {node: '>=18'} 1355 | hasBin: true 1356 | peerDependencies: 1357 | '@microsoft/api-extractor': ^7.36.0 1358 | '@swc/core': ^1 1359 | postcss: ^8.4.12 1360 | typescript: '>=4.5.0' 1361 | peerDependenciesMeta: 1362 | '@microsoft/api-extractor': 1363 | optional: true 1364 | '@swc/core': 1365 | optional: true 1366 | postcss: 1367 | optional: true 1368 | typescript: 1369 | optional: true 1370 | 1371 | type-check@0.4.0: 1372 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1373 | engines: {node: '>= 0.8.0'} 1374 | 1375 | type-of-is@3.5.1: 1376 | resolution: {integrity: sha512-SOnx8xygcAh8lvDU2exnK2bomASfNjzB3Qz71s2tw9QnX8fkAo7aC+D0H7FV0HjRKj94CKV2Hi71kVkkO6nOxg==} 1377 | engines: {node: '>=0.10.5'} 1378 | 1379 | type@2.7.3: 1380 | resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} 1381 | 1382 | typescript-eslint@7.17.0: 1383 | resolution: {integrity: sha512-spQxsQvPguduCUfyUvLItvKqK3l8KJ/kqs5Pb/URtzQ5AC53Z6us32St37rpmlt2uESG23lOFpV4UErrmy4dZQ==} 1384 | engines: {node: ^18.18.0 || >=20.0.0} 1385 | peerDependencies: 1386 | eslint: ^8.56.0 1387 | typescript: '*' 1388 | peerDependenciesMeta: 1389 | typescript: 1390 | optional: true 1391 | 1392 | typescript@5.4.5: 1393 | resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} 1394 | engines: {node: '>=14.17'} 1395 | hasBin: true 1396 | 1397 | undici-types@5.26.5: 1398 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1399 | 1400 | uri-js@4.4.1: 1401 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1402 | 1403 | vite-node@2.1.9: 1404 | resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} 1405 | engines: {node: ^18.0.0 || >=20.0.0} 1406 | hasBin: true 1407 | 1408 | vite@5.4.14: 1409 | resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} 1410 | engines: {node: ^18.0.0 || >=20.0.0} 1411 | hasBin: true 1412 | peerDependencies: 1413 | '@types/node': ^18.0.0 || >=20.0.0 1414 | less: '*' 1415 | lightningcss: ^1.21.0 1416 | sass: '*' 1417 | sass-embedded: '*' 1418 | stylus: '*' 1419 | sugarss: '*' 1420 | terser: ^5.4.0 1421 | peerDependenciesMeta: 1422 | '@types/node': 1423 | optional: true 1424 | less: 1425 | optional: true 1426 | lightningcss: 1427 | optional: true 1428 | sass: 1429 | optional: true 1430 | sass-embedded: 1431 | optional: true 1432 | stylus: 1433 | optional: true 1434 | sugarss: 1435 | optional: true 1436 | terser: 1437 | optional: true 1438 | 1439 | vitest@2.1.9: 1440 | resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} 1441 | engines: {node: ^18.0.0 || >=20.0.0} 1442 | hasBin: true 1443 | peerDependencies: 1444 | '@edge-runtime/vm': '*' 1445 | '@types/node': ^18.0.0 || >=20.0.0 1446 | '@vitest/browser': 2.1.9 1447 | '@vitest/ui': 2.1.9 1448 | happy-dom: '*' 1449 | jsdom: '*' 1450 | peerDependenciesMeta: 1451 | '@edge-runtime/vm': 1452 | optional: true 1453 | '@types/node': 1454 | optional: true 1455 | '@vitest/browser': 1456 | optional: true 1457 | '@vitest/ui': 1458 | optional: true 1459 | happy-dom: 1460 | optional: true 1461 | jsdom: 1462 | optional: true 1463 | 1464 | web-streams-polyfill@3.3.3: 1465 | resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} 1466 | engines: {node: '>= 8'} 1467 | 1468 | webidl-conversions@4.0.2: 1469 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 1470 | 1471 | whatwg-url@7.1.0: 1472 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 1473 | 1474 | which@2.0.2: 1475 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1476 | engines: {node: '>= 8'} 1477 | hasBin: true 1478 | 1479 | why-is-node-running@2.3.0: 1480 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1481 | engines: {node: '>=8'} 1482 | hasBin: true 1483 | 1484 | word-wrap@1.2.5: 1485 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1486 | engines: {node: '>=0.10.0'} 1487 | 1488 | wrap-ansi@7.0.0: 1489 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1490 | engines: {node: '>=10'} 1491 | 1492 | wrap-ansi@8.1.0: 1493 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1494 | engines: {node: '>=12'} 1495 | 1496 | yaml@2.4.5: 1497 | resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} 1498 | engines: {node: '>= 14'} 1499 | hasBin: true 1500 | 1501 | yocto-queue@0.1.0: 1502 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1503 | engines: {node: '>=10'} 1504 | 1505 | snapshots: 1506 | 1507 | '@apidevtools/json-schema-ref-parser@11.6.4': 1508 | dependencies: 1509 | '@jsdevtools/ono': 7.1.3 1510 | '@types/json-schema': 7.0.15 1511 | js-yaml: 4.1.0 1512 | 1513 | '@esbuild/aix-ppc64@0.21.5': 1514 | optional: true 1515 | 1516 | '@esbuild/android-arm64@0.21.5': 1517 | optional: true 1518 | 1519 | '@esbuild/android-arm@0.21.5': 1520 | optional: true 1521 | 1522 | '@esbuild/android-x64@0.21.5': 1523 | optional: true 1524 | 1525 | '@esbuild/darwin-arm64@0.21.5': 1526 | optional: true 1527 | 1528 | '@esbuild/darwin-x64@0.21.5': 1529 | optional: true 1530 | 1531 | '@esbuild/freebsd-arm64@0.21.5': 1532 | optional: true 1533 | 1534 | '@esbuild/freebsd-x64@0.21.5': 1535 | optional: true 1536 | 1537 | '@esbuild/linux-arm64@0.21.5': 1538 | optional: true 1539 | 1540 | '@esbuild/linux-arm@0.21.5': 1541 | optional: true 1542 | 1543 | '@esbuild/linux-ia32@0.21.5': 1544 | optional: true 1545 | 1546 | '@esbuild/linux-loong64@0.21.5': 1547 | optional: true 1548 | 1549 | '@esbuild/linux-mips64el@0.21.5': 1550 | optional: true 1551 | 1552 | '@esbuild/linux-ppc64@0.21.5': 1553 | optional: true 1554 | 1555 | '@esbuild/linux-riscv64@0.21.5': 1556 | optional: true 1557 | 1558 | '@esbuild/linux-s390x@0.21.5': 1559 | optional: true 1560 | 1561 | '@esbuild/linux-x64@0.21.5': 1562 | optional: true 1563 | 1564 | '@esbuild/netbsd-x64@0.21.5': 1565 | optional: true 1566 | 1567 | '@esbuild/openbsd-x64@0.21.5': 1568 | optional: true 1569 | 1570 | '@esbuild/sunos-x64@0.21.5': 1571 | optional: true 1572 | 1573 | '@esbuild/win32-arm64@0.21.5': 1574 | optional: true 1575 | 1576 | '@esbuild/win32-ia32@0.21.5': 1577 | optional: true 1578 | 1579 | '@esbuild/win32-x64@0.21.5': 1580 | optional: true 1581 | 1582 | '@eslint-community/eslint-utils@4.4.0(eslint@9.7.0)': 1583 | dependencies: 1584 | eslint: 9.7.0 1585 | eslint-visitor-keys: 3.4.3 1586 | 1587 | '@eslint-community/regexpp@4.11.0': {} 1588 | 1589 | '@eslint/config-array@0.17.1': 1590 | dependencies: 1591 | '@eslint/object-schema': 2.1.4 1592 | debug: 4.3.5 1593 | minimatch: 3.1.2 1594 | transitivePeerDependencies: 1595 | - supports-color 1596 | 1597 | '@eslint/eslintrc@3.1.0': 1598 | dependencies: 1599 | ajv: 6.12.6 1600 | debug: 4.3.5 1601 | espree: 10.1.0 1602 | globals: 14.0.0 1603 | ignore: 5.3.1 1604 | import-fresh: 3.3.0 1605 | js-yaml: 4.1.0 1606 | minimatch: 3.1.2 1607 | strip-json-comments: 3.1.1 1608 | transitivePeerDependencies: 1609 | - supports-color 1610 | 1611 | '@eslint/js@9.7.0': {} 1612 | 1613 | '@eslint/object-schema@2.1.4': {} 1614 | 1615 | '@humanwhocodes/module-importer@1.0.1': {} 1616 | 1617 | '@humanwhocodes/retry@0.3.0': {} 1618 | 1619 | '@isaacs/cliui@8.0.2': 1620 | dependencies: 1621 | string-width: 5.1.2 1622 | string-width-cjs: string-width@4.2.3 1623 | strip-ansi: 7.1.0 1624 | strip-ansi-cjs: strip-ansi@6.0.1 1625 | wrap-ansi: 8.1.0 1626 | wrap-ansi-cjs: wrap-ansi@7.0.0 1627 | 1628 | '@jridgewell/gen-mapping@0.3.5': 1629 | dependencies: 1630 | '@jridgewell/set-array': 1.2.1 1631 | '@jridgewell/sourcemap-codec': 1.5.0 1632 | '@jridgewell/trace-mapping': 0.3.25 1633 | 1634 | '@jridgewell/resolve-uri@3.1.2': {} 1635 | 1636 | '@jridgewell/set-array@1.2.1': {} 1637 | 1638 | '@jridgewell/sourcemap-codec@1.5.0': {} 1639 | 1640 | '@jridgewell/trace-mapping@0.3.25': 1641 | dependencies: 1642 | '@jridgewell/resolve-uri': 3.1.2 1643 | '@jridgewell/sourcemap-codec': 1.5.0 1644 | 1645 | '@jsdevtools/ono@7.1.3': {} 1646 | 1647 | '@nodelib/fs.scandir@2.1.5': 1648 | dependencies: 1649 | '@nodelib/fs.stat': 2.0.5 1650 | run-parallel: 1.2.0 1651 | 1652 | '@nodelib/fs.stat@2.0.5': {} 1653 | 1654 | '@nodelib/fs.walk@1.2.8': 1655 | dependencies: 1656 | '@nodelib/fs.scandir': 2.1.5 1657 | fastq: 1.17.1 1658 | 1659 | '@pkgjs/parseargs@0.11.0': 1660 | optional: true 1661 | 1662 | '@rollup/rollup-android-arm-eabi@4.18.1': 1663 | optional: true 1664 | 1665 | '@rollup/rollup-android-arm-eabi@4.34.2': 1666 | optional: true 1667 | 1668 | '@rollup/rollup-android-arm64@4.18.1': 1669 | optional: true 1670 | 1671 | '@rollup/rollup-android-arm64@4.34.2': 1672 | optional: true 1673 | 1674 | '@rollup/rollup-darwin-arm64@4.18.1': 1675 | optional: true 1676 | 1677 | '@rollup/rollup-darwin-arm64@4.34.2': 1678 | optional: true 1679 | 1680 | '@rollup/rollup-darwin-x64@4.18.1': 1681 | optional: true 1682 | 1683 | '@rollup/rollup-darwin-x64@4.34.2': 1684 | optional: true 1685 | 1686 | '@rollup/rollup-freebsd-arm64@4.34.2': 1687 | optional: true 1688 | 1689 | '@rollup/rollup-freebsd-x64@4.34.2': 1690 | optional: true 1691 | 1692 | '@rollup/rollup-linux-arm-gnueabihf@4.18.1': 1693 | optional: true 1694 | 1695 | '@rollup/rollup-linux-arm-gnueabihf@4.34.2': 1696 | optional: true 1697 | 1698 | '@rollup/rollup-linux-arm-musleabihf@4.18.1': 1699 | optional: true 1700 | 1701 | '@rollup/rollup-linux-arm-musleabihf@4.34.2': 1702 | optional: true 1703 | 1704 | '@rollup/rollup-linux-arm64-gnu@4.18.1': 1705 | optional: true 1706 | 1707 | '@rollup/rollup-linux-arm64-gnu@4.34.2': 1708 | optional: true 1709 | 1710 | '@rollup/rollup-linux-arm64-musl@4.18.1': 1711 | optional: true 1712 | 1713 | '@rollup/rollup-linux-arm64-musl@4.34.2': 1714 | optional: true 1715 | 1716 | '@rollup/rollup-linux-loongarch64-gnu@4.34.2': 1717 | optional: true 1718 | 1719 | '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': 1720 | optional: true 1721 | 1722 | '@rollup/rollup-linux-powerpc64le-gnu@4.34.2': 1723 | optional: true 1724 | 1725 | '@rollup/rollup-linux-riscv64-gnu@4.18.1': 1726 | optional: true 1727 | 1728 | '@rollup/rollup-linux-riscv64-gnu@4.34.2': 1729 | optional: true 1730 | 1731 | '@rollup/rollup-linux-s390x-gnu@4.18.1': 1732 | optional: true 1733 | 1734 | '@rollup/rollup-linux-s390x-gnu@4.34.2': 1735 | optional: true 1736 | 1737 | '@rollup/rollup-linux-x64-gnu@4.18.1': 1738 | optional: true 1739 | 1740 | '@rollup/rollup-linux-x64-gnu@4.34.2': 1741 | optional: true 1742 | 1743 | '@rollup/rollup-linux-x64-musl@4.18.1': 1744 | optional: true 1745 | 1746 | '@rollup/rollup-linux-x64-musl@4.34.2': 1747 | optional: true 1748 | 1749 | '@rollup/rollup-win32-arm64-msvc@4.18.1': 1750 | optional: true 1751 | 1752 | '@rollup/rollup-win32-arm64-msvc@4.34.2': 1753 | optional: true 1754 | 1755 | '@rollup/rollup-win32-ia32-msvc@4.18.1': 1756 | optional: true 1757 | 1758 | '@rollup/rollup-win32-ia32-msvc@4.34.2': 1759 | optional: true 1760 | 1761 | '@rollup/rollup-win32-x64-msvc@4.18.1': 1762 | optional: true 1763 | 1764 | '@rollup/rollup-win32-x64-msvc@4.34.2': 1765 | optional: true 1766 | 1767 | '@types/eslint@9.6.0': 1768 | dependencies: 1769 | '@types/estree': 1.0.5 1770 | '@types/json-schema': 7.0.15 1771 | 1772 | '@types/eslint__js@8.42.3': 1773 | dependencies: 1774 | '@types/eslint': 9.6.0 1775 | 1776 | '@types/estree@1.0.5': {} 1777 | 1778 | '@types/estree@1.0.6': {} 1779 | 1780 | '@types/json-schema@7.0.15': {} 1781 | 1782 | '@types/lodash@4.17.5': {} 1783 | 1784 | '@types/node@20.14.2': 1785 | dependencies: 1786 | undici-types: 5.26.5 1787 | 1788 | '@typescript-eslint/eslint-plugin@7.17.0(@typescript-eslint/parser@7.17.0(eslint@9.7.0)(typescript@5.4.5))(eslint@9.7.0)(typescript@5.4.5)': 1789 | dependencies: 1790 | '@eslint-community/regexpp': 4.11.0 1791 | '@typescript-eslint/parser': 7.17.0(eslint@9.7.0)(typescript@5.4.5) 1792 | '@typescript-eslint/scope-manager': 7.17.0 1793 | '@typescript-eslint/type-utils': 7.17.0(eslint@9.7.0)(typescript@5.4.5) 1794 | '@typescript-eslint/utils': 7.17.0(eslint@9.7.0)(typescript@5.4.5) 1795 | '@typescript-eslint/visitor-keys': 7.17.0 1796 | eslint: 9.7.0 1797 | graphemer: 1.4.0 1798 | ignore: 5.3.1 1799 | natural-compare: 1.4.0 1800 | ts-api-utils: 1.3.0(typescript@5.4.5) 1801 | optionalDependencies: 1802 | typescript: 5.4.5 1803 | transitivePeerDependencies: 1804 | - supports-color 1805 | 1806 | '@typescript-eslint/parser@7.17.0(eslint@9.7.0)(typescript@5.4.5)': 1807 | dependencies: 1808 | '@typescript-eslint/scope-manager': 7.17.0 1809 | '@typescript-eslint/types': 7.17.0 1810 | '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.4.5) 1811 | '@typescript-eslint/visitor-keys': 7.17.0 1812 | debug: 4.4.0 1813 | eslint: 9.7.0 1814 | optionalDependencies: 1815 | typescript: 5.4.5 1816 | transitivePeerDependencies: 1817 | - supports-color 1818 | 1819 | '@typescript-eslint/scope-manager@7.17.0': 1820 | dependencies: 1821 | '@typescript-eslint/types': 7.17.0 1822 | '@typescript-eslint/visitor-keys': 7.17.0 1823 | 1824 | '@typescript-eslint/type-utils@7.17.0(eslint@9.7.0)(typescript@5.4.5)': 1825 | dependencies: 1826 | '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.4.5) 1827 | '@typescript-eslint/utils': 7.17.0(eslint@9.7.0)(typescript@5.4.5) 1828 | debug: 4.4.0 1829 | eslint: 9.7.0 1830 | ts-api-utils: 1.3.0(typescript@5.4.5) 1831 | optionalDependencies: 1832 | typescript: 5.4.5 1833 | transitivePeerDependencies: 1834 | - supports-color 1835 | 1836 | '@typescript-eslint/types@7.17.0': {} 1837 | 1838 | '@typescript-eslint/typescript-estree@7.17.0(typescript@5.4.5)': 1839 | dependencies: 1840 | '@typescript-eslint/types': 7.17.0 1841 | '@typescript-eslint/visitor-keys': 7.17.0 1842 | debug: 4.4.0 1843 | globby: 11.1.0 1844 | is-glob: 4.0.3 1845 | minimatch: 9.0.4 1846 | semver: 7.6.3 1847 | ts-api-utils: 1.3.0(typescript@5.4.5) 1848 | optionalDependencies: 1849 | typescript: 5.4.5 1850 | transitivePeerDependencies: 1851 | - supports-color 1852 | 1853 | '@typescript-eslint/utils@7.17.0(eslint@9.7.0)(typescript@5.4.5)': 1854 | dependencies: 1855 | '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) 1856 | '@typescript-eslint/scope-manager': 7.17.0 1857 | '@typescript-eslint/types': 7.17.0 1858 | '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.4.5) 1859 | eslint: 9.7.0 1860 | transitivePeerDependencies: 1861 | - supports-color 1862 | - typescript 1863 | 1864 | '@typescript-eslint/visitor-keys@7.17.0': 1865 | dependencies: 1866 | '@typescript-eslint/types': 7.17.0 1867 | eslint-visitor-keys: 3.4.3 1868 | 1869 | '@vitest/expect@2.1.9': 1870 | dependencies: 1871 | '@vitest/spy': 2.1.9 1872 | '@vitest/utils': 2.1.9 1873 | chai: 5.1.2 1874 | tinyrainbow: 1.2.0 1875 | 1876 | '@vitest/mocker@2.1.9(vite@5.4.14(@types/node@20.14.2))': 1877 | dependencies: 1878 | '@vitest/spy': 2.1.9 1879 | estree-walker: 3.0.3 1880 | magic-string: 0.30.17 1881 | optionalDependencies: 1882 | vite: 5.4.14(@types/node@20.14.2) 1883 | 1884 | '@vitest/pretty-format@2.1.9': 1885 | dependencies: 1886 | tinyrainbow: 1.2.0 1887 | 1888 | '@vitest/runner@2.1.9': 1889 | dependencies: 1890 | '@vitest/utils': 2.1.9 1891 | pathe: 1.1.2 1892 | 1893 | '@vitest/snapshot@2.1.9': 1894 | dependencies: 1895 | '@vitest/pretty-format': 2.1.9 1896 | magic-string: 0.30.17 1897 | pathe: 1.1.2 1898 | 1899 | '@vitest/spy@2.1.9': 1900 | dependencies: 1901 | tinyspy: 3.0.2 1902 | 1903 | '@vitest/utils@2.1.9': 1904 | dependencies: 1905 | '@vitest/pretty-format': 2.1.9 1906 | loupe: 3.1.3 1907 | tinyrainbow: 1.2.0 1908 | 1909 | acorn-jsx@5.3.2(acorn@8.12.1): 1910 | dependencies: 1911 | acorn: 8.12.1 1912 | 1913 | acorn@8.12.1: {} 1914 | 1915 | ajv@6.12.6: 1916 | dependencies: 1917 | fast-deep-equal: 3.1.3 1918 | fast-json-stable-stringify: 2.1.0 1919 | json-schema-traverse: 0.4.1 1920 | uri-js: 4.4.1 1921 | 1922 | ajv@8.17.1: 1923 | dependencies: 1924 | fast-deep-equal: 3.1.3 1925 | fast-uri: 3.0.1 1926 | json-schema-traverse: 1.0.0 1927 | require-from-string: 2.0.2 1928 | 1929 | ansi-regex@5.0.1: {} 1930 | 1931 | ansi-regex@6.0.1: {} 1932 | 1933 | ansi-styles@4.3.0: 1934 | dependencies: 1935 | color-convert: 2.0.1 1936 | 1937 | ansi-styles@6.2.1: {} 1938 | 1939 | any-promise@1.3.0: {} 1940 | 1941 | anymatch@3.1.3: 1942 | dependencies: 1943 | normalize-path: 3.0.0 1944 | picomatch: 2.3.1 1945 | 1946 | argparse@2.0.1: {} 1947 | 1948 | array-union@2.1.0: {} 1949 | 1950 | assertion-error@2.0.1: {} 1951 | 1952 | balanced-match@1.0.2: {} 1953 | 1954 | binary-extensions@2.3.0: {} 1955 | 1956 | brace-expansion@1.1.11: 1957 | dependencies: 1958 | balanced-match: 1.0.2 1959 | concat-map: 0.0.1 1960 | 1961 | brace-expansion@2.0.1: 1962 | dependencies: 1963 | balanced-match: 1.0.2 1964 | 1965 | braces@3.0.3: 1966 | dependencies: 1967 | fill-range: 7.1.1 1968 | 1969 | bundle-require@4.2.1(esbuild@0.21.5): 1970 | dependencies: 1971 | esbuild: 0.21.5 1972 | load-tsconfig: 0.2.5 1973 | 1974 | cac@6.7.14: {} 1975 | 1976 | callsites@3.1.0: {} 1977 | 1978 | chai@5.1.2: 1979 | dependencies: 1980 | assertion-error: 2.0.1 1981 | check-error: 2.1.1 1982 | deep-eql: 5.0.2 1983 | loupe: 3.1.3 1984 | pathval: 2.0.0 1985 | 1986 | chalk@4.1.2: 1987 | dependencies: 1988 | ansi-styles: 4.3.0 1989 | supports-color: 7.2.0 1990 | 1991 | check-error@2.1.1: {} 1992 | 1993 | chokidar@3.6.0: 1994 | dependencies: 1995 | anymatch: 3.1.3 1996 | braces: 3.0.3 1997 | glob-parent: 5.1.2 1998 | is-binary-path: 2.1.0 1999 | is-glob: 4.0.3 2000 | normalize-path: 3.0.0 2001 | readdirp: 3.6.0 2002 | optionalDependencies: 2003 | fsevents: 2.3.3 2004 | 2005 | cli-color@2.0.4: 2006 | dependencies: 2007 | d: 1.0.2 2008 | es5-ext: 0.10.64 2009 | es6-iterator: 2.0.3 2010 | memoizee: 0.4.17 2011 | timers-ext: 0.1.8 2012 | 2013 | color-convert@2.0.1: 2014 | dependencies: 2015 | color-name: 1.1.4 2016 | 2017 | color-name@1.1.4: {} 2018 | 2019 | commander@12.1.0: {} 2020 | 2021 | commander@2.20.3: {} 2022 | 2023 | commander@4.1.1: {} 2024 | 2025 | concat-map@0.0.1: {} 2026 | 2027 | cross-spawn@7.0.3: 2028 | dependencies: 2029 | path-key: 3.1.1 2030 | shebang-command: 2.0.0 2031 | which: 2.0.2 2032 | 2033 | d@1.0.2: 2034 | dependencies: 2035 | es5-ext: 0.10.64 2036 | type: 2.7.3 2037 | 2038 | data-uri-to-buffer@4.0.1: {} 2039 | 2040 | debug@4.3.5: 2041 | dependencies: 2042 | ms: 2.1.2 2043 | 2044 | debug@4.4.0: 2045 | dependencies: 2046 | ms: 2.1.3 2047 | 2048 | deep-eql@5.0.2: {} 2049 | 2050 | deep-is@0.1.4: {} 2051 | 2052 | dir-glob@3.0.1: 2053 | dependencies: 2054 | path-type: 4.0.0 2055 | 2056 | eastasianwidth@0.2.0: {} 2057 | 2058 | emoji-regex@8.0.0: {} 2059 | 2060 | emoji-regex@9.2.2: {} 2061 | 2062 | es-module-lexer@1.6.0: {} 2063 | 2064 | es5-ext@0.10.64: 2065 | dependencies: 2066 | es6-iterator: 2.0.3 2067 | es6-symbol: 3.1.4 2068 | esniff: 2.0.1 2069 | next-tick: 1.1.0 2070 | 2071 | es6-iterator@2.0.3: 2072 | dependencies: 2073 | d: 1.0.2 2074 | es5-ext: 0.10.64 2075 | es6-symbol: 3.1.4 2076 | 2077 | es6-symbol@3.1.4: 2078 | dependencies: 2079 | d: 1.0.2 2080 | ext: 1.7.0 2081 | 2082 | es6-weak-map@2.0.3: 2083 | dependencies: 2084 | d: 1.0.2 2085 | es5-ext: 0.10.64 2086 | es6-iterator: 2.0.3 2087 | es6-symbol: 3.1.4 2088 | 2089 | esbuild@0.21.5: 2090 | optionalDependencies: 2091 | '@esbuild/aix-ppc64': 0.21.5 2092 | '@esbuild/android-arm': 0.21.5 2093 | '@esbuild/android-arm64': 0.21.5 2094 | '@esbuild/android-x64': 0.21.5 2095 | '@esbuild/darwin-arm64': 0.21.5 2096 | '@esbuild/darwin-x64': 0.21.5 2097 | '@esbuild/freebsd-arm64': 0.21.5 2098 | '@esbuild/freebsd-x64': 0.21.5 2099 | '@esbuild/linux-arm': 0.21.5 2100 | '@esbuild/linux-arm64': 0.21.5 2101 | '@esbuild/linux-ia32': 0.21.5 2102 | '@esbuild/linux-loong64': 0.21.5 2103 | '@esbuild/linux-mips64el': 0.21.5 2104 | '@esbuild/linux-ppc64': 0.21.5 2105 | '@esbuild/linux-riscv64': 0.21.5 2106 | '@esbuild/linux-s390x': 0.21.5 2107 | '@esbuild/linux-x64': 0.21.5 2108 | '@esbuild/netbsd-x64': 0.21.5 2109 | '@esbuild/openbsd-x64': 0.21.5 2110 | '@esbuild/sunos-x64': 0.21.5 2111 | '@esbuild/win32-arm64': 0.21.5 2112 | '@esbuild/win32-ia32': 0.21.5 2113 | '@esbuild/win32-x64': 0.21.5 2114 | 2115 | escape-string-regexp@4.0.0: {} 2116 | 2117 | eslint-scope@8.0.2: 2118 | dependencies: 2119 | esrecurse: 4.3.0 2120 | estraverse: 5.3.0 2121 | 2122 | eslint-visitor-keys@3.4.3: {} 2123 | 2124 | eslint-visitor-keys@4.0.0: {} 2125 | 2126 | eslint@9.7.0: 2127 | dependencies: 2128 | '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) 2129 | '@eslint-community/regexpp': 4.11.0 2130 | '@eslint/config-array': 0.17.1 2131 | '@eslint/eslintrc': 3.1.0 2132 | '@eslint/js': 9.7.0 2133 | '@humanwhocodes/module-importer': 1.0.1 2134 | '@humanwhocodes/retry': 0.3.0 2135 | '@nodelib/fs.walk': 1.2.8 2136 | ajv: 6.12.6 2137 | chalk: 4.1.2 2138 | cross-spawn: 7.0.3 2139 | debug: 4.3.5 2140 | escape-string-regexp: 4.0.0 2141 | eslint-scope: 8.0.2 2142 | eslint-visitor-keys: 4.0.0 2143 | espree: 10.1.0 2144 | esquery: 1.6.0 2145 | esutils: 2.0.3 2146 | fast-deep-equal: 3.1.3 2147 | file-entry-cache: 8.0.0 2148 | find-up: 5.0.0 2149 | glob-parent: 6.0.2 2150 | ignore: 5.3.1 2151 | imurmurhash: 0.1.4 2152 | is-glob: 4.0.3 2153 | is-path-inside: 3.0.3 2154 | json-stable-stringify-without-jsonify: 1.0.1 2155 | levn: 0.4.1 2156 | lodash.merge: 4.6.2 2157 | minimatch: 3.1.2 2158 | natural-compare: 1.4.0 2159 | optionator: 0.9.4 2160 | strip-ansi: 6.0.1 2161 | text-table: 0.2.0 2162 | transitivePeerDependencies: 2163 | - supports-color 2164 | 2165 | esniff@2.0.1: 2166 | dependencies: 2167 | d: 1.0.2 2168 | es5-ext: 0.10.64 2169 | event-emitter: 0.3.5 2170 | type: 2.7.3 2171 | 2172 | espree@10.1.0: 2173 | dependencies: 2174 | acorn: 8.12.1 2175 | acorn-jsx: 5.3.2(acorn@8.12.1) 2176 | eslint-visitor-keys: 4.0.0 2177 | 2178 | esquery@1.6.0: 2179 | dependencies: 2180 | estraverse: 5.3.0 2181 | 2182 | esrecurse@4.3.0: 2183 | dependencies: 2184 | estraverse: 5.3.0 2185 | 2186 | estraverse@5.3.0: {} 2187 | 2188 | estree-walker@3.0.3: 2189 | dependencies: 2190 | '@types/estree': 1.0.6 2191 | 2192 | esutils@2.0.3: {} 2193 | 2194 | event-emitter@0.3.5: 2195 | dependencies: 2196 | d: 1.0.2 2197 | es5-ext: 0.10.64 2198 | 2199 | execa@5.1.1: 2200 | dependencies: 2201 | cross-spawn: 7.0.3 2202 | get-stream: 6.0.1 2203 | human-signals: 2.1.0 2204 | is-stream: 2.0.1 2205 | merge-stream: 2.0.0 2206 | npm-run-path: 4.0.1 2207 | onetime: 5.1.2 2208 | signal-exit: 3.0.7 2209 | strip-final-newline: 2.0.0 2210 | 2211 | expect-type@1.1.0: {} 2212 | 2213 | ext@1.7.0: 2214 | dependencies: 2215 | type: 2.7.3 2216 | 2217 | fast-deep-equal@3.1.3: {} 2218 | 2219 | fast-glob@3.3.2: 2220 | dependencies: 2221 | '@nodelib/fs.stat': 2.0.5 2222 | '@nodelib/fs.walk': 1.2.8 2223 | glob-parent: 5.1.2 2224 | merge2: 1.4.1 2225 | micromatch: 4.0.7 2226 | 2227 | fast-json-stable-stringify@2.1.0: {} 2228 | 2229 | fast-levenshtein@2.0.6: {} 2230 | 2231 | fast-uri@3.0.1: {} 2232 | 2233 | fastq@1.17.1: 2234 | dependencies: 2235 | reusify: 1.0.4 2236 | 2237 | fetch-blob@3.2.0: 2238 | dependencies: 2239 | node-domexception: 1.0.0 2240 | web-streams-polyfill: 3.3.3 2241 | 2242 | file-entry-cache@8.0.0: 2243 | dependencies: 2244 | flat-cache: 4.0.1 2245 | 2246 | fill-range@7.1.1: 2247 | dependencies: 2248 | to-regex-range: 5.0.1 2249 | 2250 | find-up@5.0.0: 2251 | dependencies: 2252 | locate-path: 6.0.0 2253 | path-exists: 4.0.0 2254 | 2255 | flat-cache@4.0.1: 2256 | dependencies: 2257 | flatted: 3.3.1 2258 | keyv: 4.5.4 2259 | 2260 | flatted@3.3.1: {} 2261 | 2262 | foreground-child@3.1.1: 2263 | dependencies: 2264 | cross-spawn: 7.0.3 2265 | signal-exit: 4.1.0 2266 | 2267 | formdata-polyfill@4.0.10: 2268 | dependencies: 2269 | fetch-blob: 3.2.0 2270 | 2271 | fsevents@2.3.3: 2272 | optional: true 2273 | 2274 | generate-schema@2.6.0: 2275 | dependencies: 2276 | commander: 2.20.3 2277 | type-of-is: 3.5.1 2278 | 2279 | get-stream@6.0.1: {} 2280 | 2281 | glob-parent@5.1.2: 2282 | dependencies: 2283 | is-glob: 4.0.3 2284 | 2285 | glob-parent@6.0.2: 2286 | dependencies: 2287 | is-glob: 4.0.3 2288 | 2289 | glob@10.4.1: 2290 | dependencies: 2291 | foreground-child: 3.1.1 2292 | jackspeak: 3.4.0 2293 | minimatch: 9.0.4 2294 | minipass: 7.1.2 2295 | path-scurry: 1.11.1 2296 | 2297 | globals@14.0.0: {} 2298 | 2299 | globby@11.1.0: 2300 | dependencies: 2301 | array-union: 2.1.0 2302 | dir-glob: 3.0.1 2303 | fast-glob: 3.3.2 2304 | ignore: 5.3.1 2305 | merge2: 1.4.1 2306 | slash: 3.0.0 2307 | 2308 | graphemer@1.4.0: {} 2309 | 2310 | has-flag@4.0.0: {} 2311 | 2312 | human-signals@2.1.0: {} 2313 | 2314 | husky@9.1.2: {} 2315 | 2316 | ignore@5.3.1: {} 2317 | 2318 | import-fresh@3.3.0: 2319 | dependencies: 2320 | parent-module: 1.0.1 2321 | resolve-from: 4.0.0 2322 | 2323 | imurmurhash@0.1.4: {} 2324 | 2325 | is-binary-path@2.1.0: 2326 | dependencies: 2327 | binary-extensions: 2.3.0 2328 | 2329 | is-extglob@2.1.1: {} 2330 | 2331 | is-fullwidth-code-point@3.0.0: {} 2332 | 2333 | is-glob@4.0.3: 2334 | dependencies: 2335 | is-extglob: 2.1.1 2336 | 2337 | is-number@7.0.0: {} 2338 | 2339 | is-path-inside@3.0.3: {} 2340 | 2341 | is-promise@2.2.2: {} 2342 | 2343 | is-stream@2.0.1: {} 2344 | 2345 | isexe@2.0.0: {} 2346 | 2347 | jackspeak@3.4.0: 2348 | dependencies: 2349 | '@isaacs/cliui': 8.0.2 2350 | optionalDependencies: 2351 | '@pkgjs/parseargs': 0.11.0 2352 | 2353 | joycon@3.1.1: {} 2354 | 2355 | js-yaml@4.1.0: 2356 | dependencies: 2357 | argparse: 2.0.1 2358 | 2359 | json-buffer@3.0.1: {} 2360 | 2361 | json-schema-to-typescript@14.0.5: 2362 | dependencies: 2363 | '@apidevtools/json-schema-ref-parser': 11.6.4 2364 | '@types/json-schema': 7.0.15 2365 | '@types/lodash': 4.17.5 2366 | cli-color: 2.0.4 2367 | glob: 10.4.1 2368 | is-glob: 4.0.3 2369 | js-yaml: 4.1.0 2370 | lodash: 4.17.21 2371 | minimist: 1.2.8 2372 | mkdirp: 3.0.1 2373 | mz: 2.7.0 2374 | node-fetch: 3.3.2 2375 | prettier: 3.3.1 2376 | 2377 | json-schema-traverse@0.4.1: {} 2378 | 2379 | json-schema-traverse@1.0.0: {} 2380 | 2381 | json-stable-stringify-without-jsonify@1.0.1: {} 2382 | 2383 | keyv@4.5.4: 2384 | dependencies: 2385 | json-buffer: 3.0.1 2386 | 2387 | levn@0.4.1: 2388 | dependencies: 2389 | prelude-ls: 1.2.1 2390 | type-check: 0.4.0 2391 | 2392 | lilconfig@3.1.2: {} 2393 | 2394 | lines-and-columns@1.2.4: {} 2395 | 2396 | load-tsconfig@0.2.5: {} 2397 | 2398 | locate-path@6.0.0: 2399 | dependencies: 2400 | p-locate: 5.0.0 2401 | 2402 | lodash.merge@4.6.2: {} 2403 | 2404 | lodash.sortby@4.7.0: {} 2405 | 2406 | lodash@4.17.21: {} 2407 | 2408 | loupe@3.1.3: {} 2409 | 2410 | lru-cache@10.2.2: {} 2411 | 2412 | lru-queue@0.1.0: 2413 | dependencies: 2414 | es5-ext: 0.10.64 2415 | 2416 | magic-string@0.30.17: 2417 | dependencies: 2418 | '@jridgewell/sourcemap-codec': 1.5.0 2419 | 2420 | memoizee@0.4.17: 2421 | dependencies: 2422 | d: 1.0.2 2423 | es5-ext: 0.10.64 2424 | es6-weak-map: 2.0.3 2425 | event-emitter: 0.3.5 2426 | is-promise: 2.2.2 2427 | lru-queue: 0.1.0 2428 | next-tick: 1.1.0 2429 | timers-ext: 0.1.8 2430 | 2431 | merge-stream@2.0.0: {} 2432 | 2433 | merge2@1.4.1: {} 2434 | 2435 | micromatch@4.0.7: 2436 | dependencies: 2437 | braces: 3.0.3 2438 | picomatch: 2.3.1 2439 | 2440 | mimic-fn@2.1.0: {} 2441 | 2442 | minimatch@3.1.2: 2443 | dependencies: 2444 | brace-expansion: 1.1.11 2445 | 2446 | minimatch@9.0.4: 2447 | dependencies: 2448 | brace-expansion: 2.0.1 2449 | 2450 | minimist@1.2.8: {} 2451 | 2452 | minipass@7.1.2: {} 2453 | 2454 | mkdirp@3.0.1: {} 2455 | 2456 | ms@2.1.2: {} 2457 | 2458 | ms@2.1.3: {} 2459 | 2460 | mz@2.7.0: 2461 | dependencies: 2462 | any-promise: 1.3.0 2463 | object-assign: 4.1.1 2464 | thenify-all: 1.6.0 2465 | 2466 | nanoid@3.3.8: {} 2467 | 2468 | natural-compare@1.4.0: {} 2469 | 2470 | next-tick@1.1.0: {} 2471 | 2472 | node-domexception@1.0.0: {} 2473 | 2474 | node-fetch@3.3.2: 2475 | dependencies: 2476 | data-uri-to-buffer: 4.0.1 2477 | fetch-blob: 3.2.0 2478 | formdata-polyfill: 4.0.10 2479 | 2480 | normalize-path@3.0.0: {} 2481 | 2482 | npm-run-path@4.0.1: 2483 | dependencies: 2484 | path-key: 3.1.1 2485 | 2486 | object-assign@4.1.1: {} 2487 | 2488 | onetime@5.1.2: 2489 | dependencies: 2490 | mimic-fn: 2.1.0 2491 | 2492 | optionator@0.9.4: 2493 | dependencies: 2494 | deep-is: 0.1.4 2495 | fast-levenshtein: 2.0.6 2496 | levn: 0.4.1 2497 | prelude-ls: 1.2.1 2498 | type-check: 0.4.0 2499 | word-wrap: 1.2.5 2500 | 2501 | p-limit@3.1.0: 2502 | dependencies: 2503 | yocto-queue: 0.1.0 2504 | 2505 | p-locate@5.0.0: 2506 | dependencies: 2507 | p-limit: 3.1.0 2508 | 2509 | parent-module@1.0.1: 2510 | dependencies: 2511 | callsites: 3.1.0 2512 | 2513 | path-exists@4.0.0: {} 2514 | 2515 | path-key@3.1.1: {} 2516 | 2517 | path-scurry@1.11.1: 2518 | dependencies: 2519 | lru-cache: 10.2.2 2520 | minipass: 7.1.2 2521 | 2522 | path-type@4.0.0: {} 2523 | 2524 | pathe@1.1.2: {} 2525 | 2526 | pathval@2.0.0: {} 2527 | 2528 | picocolors@1.1.1: {} 2529 | 2530 | picomatch@2.3.1: {} 2531 | 2532 | pirates@4.0.6: {} 2533 | 2534 | postcss-load-config@4.0.2(postcss@8.5.1): 2535 | dependencies: 2536 | lilconfig: 3.1.2 2537 | yaml: 2.4.5 2538 | optionalDependencies: 2539 | postcss: 8.5.1 2540 | 2541 | postcss@8.5.1: 2542 | dependencies: 2543 | nanoid: 3.3.8 2544 | picocolors: 1.1.1 2545 | source-map-js: 1.2.1 2546 | 2547 | prelude-ls@1.2.1: {} 2548 | 2549 | prettier@3.3.1: {} 2550 | 2551 | punycode@2.3.1: {} 2552 | 2553 | queue-microtask@1.2.3: {} 2554 | 2555 | readdirp@3.6.0: 2556 | dependencies: 2557 | picomatch: 2.3.1 2558 | 2559 | require-from-string@2.0.2: {} 2560 | 2561 | resolve-from@4.0.0: {} 2562 | 2563 | resolve-from@5.0.0: {} 2564 | 2565 | reusify@1.0.4: {} 2566 | 2567 | rollup@4.18.1: 2568 | dependencies: 2569 | '@types/estree': 1.0.5 2570 | optionalDependencies: 2571 | '@rollup/rollup-android-arm-eabi': 4.18.1 2572 | '@rollup/rollup-android-arm64': 4.18.1 2573 | '@rollup/rollup-darwin-arm64': 4.18.1 2574 | '@rollup/rollup-darwin-x64': 4.18.1 2575 | '@rollup/rollup-linux-arm-gnueabihf': 4.18.1 2576 | '@rollup/rollup-linux-arm-musleabihf': 4.18.1 2577 | '@rollup/rollup-linux-arm64-gnu': 4.18.1 2578 | '@rollup/rollup-linux-arm64-musl': 4.18.1 2579 | '@rollup/rollup-linux-powerpc64le-gnu': 4.18.1 2580 | '@rollup/rollup-linux-riscv64-gnu': 4.18.1 2581 | '@rollup/rollup-linux-s390x-gnu': 4.18.1 2582 | '@rollup/rollup-linux-x64-gnu': 4.18.1 2583 | '@rollup/rollup-linux-x64-musl': 4.18.1 2584 | '@rollup/rollup-win32-arm64-msvc': 4.18.1 2585 | '@rollup/rollup-win32-ia32-msvc': 4.18.1 2586 | '@rollup/rollup-win32-x64-msvc': 4.18.1 2587 | fsevents: 2.3.3 2588 | 2589 | rollup@4.34.2: 2590 | dependencies: 2591 | '@types/estree': 1.0.6 2592 | optionalDependencies: 2593 | '@rollup/rollup-android-arm-eabi': 4.34.2 2594 | '@rollup/rollup-android-arm64': 4.34.2 2595 | '@rollup/rollup-darwin-arm64': 4.34.2 2596 | '@rollup/rollup-darwin-x64': 4.34.2 2597 | '@rollup/rollup-freebsd-arm64': 4.34.2 2598 | '@rollup/rollup-freebsd-x64': 4.34.2 2599 | '@rollup/rollup-linux-arm-gnueabihf': 4.34.2 2600 | '@rollup/rollup-linux-arm-musleabihf': 4.34.2 2601 | '@rollup/rollup-linux-arm64-gnu': 4.34.2 2602 | '@rollup/rollup-linux-arm64-musl': 4.34.2 2603 | '@rollup/rollup-linux-loongarch64-gnu': 4.34.2 2604 | '@rollup/rollup-linux-powerpc64le-gnu': 4.34.2 2605 | '@rollup/rollup-linux-riscv64-gnu': 4.34.2 2606 | '@rollup/rollup-linux-s390x-gnu': 4.34.2 2607 | '@rollup/rollup-linux-x64-gnu': 4.34.2 2608 | '@rollup/rollup-linux-x64-musl': 4.34.2 2609 | '@rollup/rollup-win32-arm64-msvc': 4.34.2 2610 | '@rollup/rollup-win32-ia32-msvc': 4.34.2 2611 | '@rollup/rollup-win32-x64-msvc': 4.34.2 2612 | fsevents: 2.3.3 2613 | 2614 | run-parallel@1.2.0: 2615 | dependencies: 2616 | queue-microtask: 1.2.3 2617 | 2618 | semver@7.6.3: {} 2619 | 2620 | shebang-command@2.0.0: 2621 | dependencies: 2622 | shebang-regex: 3.0.0 2623 | 2624 | shebang-regex@3.0.0: {} 2625 | 2626 | siginfo@2.0.0: {} 2627 | 2628 | signal-exit@3.0.7: {} 2629 | 2630 | signal-exit@4.1.0: {} 2631 | 2632 | slash@3.0.0: {} 2633 | 2634 | source-map-js@1.2.1: {} 2635 | 2636 | source-map@0.8.0-beta.0: 2637 | dependencies: 2638 | whatwg-url: 7.1.0 2639 | 2640 | stackback@0.0.2: {} 2641 | 2642 | std-env@3.8.0: {} 2643 | 2644 | string-width@4.2.3: 2645 | dependencies: 2646 | emoji-regex: 8.0.0 2647 | is-fullwidth-code-point: 3.0.0 2648 | strip-ansi: 6.0.1 2649 | 2650 | string-width@5.1.2: 2651 | dependencies: 2652 | eastasianwidth: 0.2.0 2653 | emoji-regex: 9.2.2 2654 | strip-ansi: 7.1.0 2655 | 2656 | strip-ansi@6.0.1: 2657 | dependencies: 2658 | ansi-regex: 5.0.1 2659 | 2660 | strip-ansi@7.1.0: 2661 | dependencies: 2662 | ansi-regex: 6.0.1 2663 | 2664 | strip-final-newline@2.0.0: {} 2665 | 2666 | strip-json-comments@3.1.1: {} 2667 | 2668 | sucrase@3.35.0: 2669 | dependencies: 2670 | '@jridgewell/gen-mapping': 0.3.5 2671 | commander: 4.1.1 2672 | glob: 10.4.1 2673 | lines-and-columns: 1.2.4 2674 | mz: 2.7.0 2675 | pirates: 4.0.6 2676 | ts-interface-checker: 0.1.13 2677 | 2678 | supports-color@7.2.0: 2679 | dependencies: 2680 | has-flag: 4.0.0 2681 | 2682 | text-table@0.2.0: {} 2683 | 2684 | thenify-all@1.6.0: 2685 | dependencies: 2686 | thenify: 3.3.1 2687 | 2688 | thenify@3.3.1: 2689 | dependencies: 2690 | any-promise: 1.3.0 2691 | 2692 | timers-ext@0.1.8: 2693 | dependencies: 2694 | es5-ext: 0.10.64 2695 | next-tick: 1.1.0 2696 | 2697 | tinybench@2.9.0: {} 2698 | 2699 | tinyexec@0.3.2: {} 2700 | 2701 | tinypool@1.0.2: {} 2702 | 2703 | tinyrainbow@1.2.0: {} 2704 | 2705 | tinyspy@3.0.2: {} 2706 | 2707 | to-regex-range@5.0.1: 2708 | dependencies: 2709 | is-number: 7.0.0 2710 | 2711 | tr46@1.0.1: 2712 | dependencies: 2713 | punycode: 2.3.1 2714 | 2715 | tree-kill@1.2.2: {} 2716 | 2717 | ts-api-utils@1.3.0(typescript@5.4.5): 2718 | dependencies: 2719 | typescript: 5.4.5 2720 | 2721 | ts-interface-checker@0.1.13: {} 2722 | 2723 | tsup@8.1.0(postcss@8.5.1)(typescript@5.4.5): 2724 | dependencies: 2725 | bundle-require: 4.2.1(esbuild@0.21.5) 2726 | cac: 6.7.14 2727 | chokidar: 3.6.0 2728 | debug: 4.3.5 2729 | esbuild: 0.21.5 2730 | execa: 5.1.1 2731 | globby: 11.1.0 2732 | joycon: 3.1.1 2733 | postcss-load-config: 4.0.2(postcss@8.5.1) 2734 | resolve-from: 5.0.0 2735 | rollup: 4.18.1 2736 | source-map: 0.8.0-beta.0 2737 | sucrase: 3.35.0 2738 | tree-kill: 1.2.2 2739 | optionalDependencies: 2740 | postcss: 8.5.1 2741 | typescript: 5.4.5 2742 | transitivePeerDependencies: 2743 | - supports-color 2744 | - ts-node 2745 | 2746 | type-check@0.4.0: 2747 | dependencies: 2748 | prelude-ls: 1.2.1 2749 | 2750 | type-of-is@3.5.1: {} 2751 | 2752 | type@2.7.3: {} 2753 | 2754 | typescript-eslint@7.17.0(eslint@9.7.0)(typescript@5.4.5): 2755 | dependencies: 2756 | '@typescript-eslint/eslint-plugin': 7.17.0(@typescript-eslint/parser@7.17.0(eslint@9.7.0)(typescript@5.4.5))(eslint@9.7.0)(typescript@5.4.5) 2757 | '@typescript-eslint/parser': 7.17.0(eslint@9.7.0)(typescript@5.4.5) 2758 | '@typescript-eslint/utils': 7.17.0(eslint@9.7.0)(typescript@5.4.5) 2759 | eslint: 9.7.0 2760 | optionalDependencies: 2761 | typescript: 5.4.5 2762 | transitivePeerDependencies: 2763 | - supports-color 2764 | 2765 | typescript@5.4.5: {} 2766 | 2767 | undici-types@5.26.5: {} 2768 | 2769 | uri-js@4.4.1: 2770 | dependencies: 2771 | punycode: 2.3.1 2772 | 2773 | vite-node@2.1.9(@types/node@20.14.2): 2774 | dependencies: 2775 | cac: 6.7.14 2776 | debug: 4.4.0 2777 | es-module-lexer: 1.6.0 2778 | pathe: 1.1.2 2779 | vite: 5.4.14(@types/node@20.14.2) 2780 | transitivePeerDependencies: 2781 | - '@types/node' 2782 | - less 2783 | - lightningcss 2784 | - sass 2785 | - sass-embedded 2786 | - stylus 2787 | - sugarss 2788 | - supports-color 2789 | - terser 2790 | 2791 | vite@5.4.14(@types/node@20.14.2): 2792 | dependencies: 2793 | esbuild: 0.21.5 2794 | postcss: 8.5.1 2795 | rollup: 4.34.2 2796 | optionalDependencies: 2797 | '@types/node': 20.14.2 2798 | fsevents: 2.3.3 2799 | 2800 | vitest@2.1.9(@types/node@20.14.2): 2801 | dependencies: 2802 | '@vitest/expect': 2.1.9 2803 | '@vitest/mocker': 2.1.9(vite@5.4.14(@types/node@20.14.2)) 2804 | '@vitest/pretty-format': 2.1.9 2805 | '@vitest/runner': 2.1.9 2806 | '@vitest/snapshot': 2.1.9 2807 | '@vitest/spy': 2.1.9 2808 | '@vitest/utils': 2.1.9 2809 | chai: 5.1.2 2810 | debug: 4.4.0 2811 | expect-type: 1.1.0 2812 | magic-string: 0.30.17 2813 | pathe: 1.1.2 2814 | std-env: 3.8.0 2815 | tinybench: 2.9.0 2816 | tinyexec: 0.3.2 2817 | tinypool: 1.0.2 2818 | tinyrainbow: 1.2.0 2819 | vite: 5.4.14(@types/node@20.14.2) 2820 | vite-node: 2.1.9(@types/node@20.14.2) 2821 | why-is-node-running: 2.3.0 2822 | optionalDependencies: 2823 | '@types/node': 20.14.2 2824 | transitivePeerDependencies: 2825 | - less 2826 | - lightningcss 2827 | - msw 2828 | - sass 2829 | - sass-embedded 2830 | - stylus 2831 | - sugarss 2832 | - supports-color 2833 | - terser 2834 | 2835 | web-streams-polyfill@3.3.3: {} 2836 | 2837 | webidl-conversions@4.0.2: {} 2838 | 2839 | whatwg-url@7.1.0: 2840 | dependencies: 2841 | lodash.sortby: 4.7.0 2842 | tr46: 1.0.1 2843 | webidl-conversions: 4.0.2 2844 | 2845 | which@2.0.2: 2846 | dependencies: 2847 | isexe: 2.0.0 2848 | 2849 | why-is-node-running@2.3.0: 2850 | dependencies: 2851 | siginfo: 2.0.0 2852 | stackback: 0.0.2 2853 | 2854 | word-wrap@1.2.5: {} 2855 | 2856 | wrap-ansi@7.0.0: 2857 | dependencies: 2858 | ansi-styles: 4.3.0 2859 | string-width: 4.2.3 2860 | strip-ansi: 6.0.1 2861 | 2862 | wrap-ansi@8.1.0: 2863 | dependencies: 2864 | ansi-styles: 6.2.1 2865 | string-width: 5.1.2 2866 | strip-ansi: 7.1.0 2867 | 2868 | yaml@2.4.5: {} 2869 | 2870 | yocto-queue@0.1.0: {} 2871 | -------------------------------------------------------------------------------- /src/config/getConfig.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import type { JSONSchema } from "json-schema-to-typescript"; 3 | import type { Config } from "./types"; 4 | import { validateConfig } from "./validateConfig"; 5 | import configSchema from "./schema.json"; 6 | 7 | export const getConfig = (filePath: string): Config => { 8 | try { 9 | const configData = fs.readFileSync(filePath, "utf8"); 10 | 11 | const config = JSON.parse(configData); 12 | 13 | const schema: JSONSchema = JSON.parse(JSON.stringify(configSchema)); 14 | 15 | validateConfig(config, schema); 16 | return config; 17 | } catch (error) { 18 | console.error("Error getting config:", error); 19 | process.exit(1); 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /src/config/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$ref": "#/definitions/Config", 3 | "$schema": "http://json-schema.org/draft-07/schema#", 4 | "definitions": { 5 | "Config": { 6 | "additionalProperties": false, 7 | "properties": { 8 | "endpoints": { 9 | "items": { 10 | "$ref": "#/definitions/Endpoint" 11 | }, 12 | "type": "array" 13 | } 14 | }, 15 | "required": [ 16 | "endpoints" 17 | ], 18 | "type": "object" 19 | }, 20 | "Endpoint": { 21 | "additionalProperties": false, 22 | "properties": { 23 | "body": { 24 | "$ref": "#/definitions/EndpointBody" 25 | }, 26 | "headers": { 27 | "additionalProperties": { 28 | "type": "string" 29 | }, 30 | "type": "object" 31 | }, 32 | "method": { 33 | "enum": [ 34 | "GET", 35 | "POST", 36 | "PUT", 37 | "DELETE", 38 | "PATCH" 39 | ], 40 | "type": "string" 41 | }, 42 | "override": { 43 | "$ref": "#/definitions/JSONSchema" 44 | }, 45 | "queryParams": { 46 | "additionalProperties": { 47 | "type": "string" 48 | }, 49 | "type": "object" 50 | }, 51 | "typeName": { 52 | "type": "string" 53 | }, 54 | "url": { 55 | "type": "string" 56 | } 57 | }, 58 | "required": [ 59 | "typeName", 60 | "url", 61 | "method" 62 | ], 63 | "type": "object" 64 | }, 65 | "EndpointBody": { 66 | "anyOf": [ 67 | { 68 | "$ref": "#/definitions/JsonObject" 69 | }, 70 | { 71 | "$ref": "#/definitions/JsonArray" 72 | }, 73 | { 74 | "type": "string" 75 | } 76 | ] 77 | }, 78 | "JSONSchema": { 79 | "properties": { 80 | "$ref": { 81 | "type": "string" 82 | }, 83 | "$schema": { 84 | "$ref": "#/definitions/JSONSchema4Version" 85 | }, 86 | "additionalItems": { 87 | "anyOf": [ 88 | { 89 | "type": "boolean" 90 | }, 91 | { 92 | "$ref": "#/definitions/JSONSchema4" 93 | } 94 | ], 95 | "description": "May only be defined when \"items\" is defined, and is a tuple of JSONSchemas.\n\nThis provides a definition for additional items in an array instance when tuple definitions of the items is provided. This can be false to indicate additional items in the array are not allowed, or it can be a schema that defines the schema of the additional items." 96 | }, 97 | "additionalProperties": { 98 | "anyOf": [ 99 | { 100 | "type": "boolean" 101 | }, 102 | { 103 | "$ref": "#/definitions/JSONSchema4" 104 | } 105 | ], 106 | "description": "This attribute defines a schema for all properties that are not explicitly defined in an object type definition. If specified, the value MUST be a schema or a boolean. If false is provided, no additional properties are allowed beyond the properties defined in the schema. The default value is an empty schema which allows any value for additional properties." 107 | }, 108 | "allOf": { 109 | "items": { 110 | "$ref": "#/definitions/JSONSchema4" 111 | }, 112 | "type": "array" 113 | }, 114 | "anyOf": { 115 | "items": { 116 | "$ref": "#/definitions/JSONSchema4" 117 | }, 118 | "type": "array" 119 | }, 120 | "default": { 121 | "$ref": "#/definitions/JSONSchema4Type" 122 | }, 123 | "definitions": { 124 | "additionalProperties": { 125 | "$ref": "#/definitions/JSONSchema4" 126 | }, 127 | "type": "object" 128 | }, 129 | "dependencies": { 130 | "additionalProperties": { 131 | "anyOf": [ 132 | { 133 | "$ref": "#/definitions/JSONSchema4" 134 | }, 135 | { 136 | "items": { 137 | "type": "string" 138 | }, 139 | "type": "array" 140 | } 141 | ] 142 | }, 143 | "type": "object" 144 | }, 145 | "deprecated": { 146 | "description": "property exists at least in https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.3", 147 | "type": "boolean" 148 | }, 149 | "description": { 150 | "description": "This attribute is a string that provides a full description of the of purpose the instance property.", 151 | "type": "string" 152 | }, 153 | "enum": { 154 | "description": "This provides an enumeration of all possible values that are valid for the instance property. This MUST be an array, and each item in the array represents a possible value for the instance value. If this attribute is defined, the instance value MUST be one of the values in the array in order for the schema to be valid.", 155 | "items": { 156 | "$ref": "#/definitions/JSONSchema4Type" 157 | }, 158 | "type": "array" 159 | }, 160 | "exclusiveMaximum": { 161 | "type": "boolean" 162 | }, 163 | "exclusiveMinimum": { 164 | "type": "boolean" 165 | }, 166 | "extends": { 167 | "anyOf": [ 168 | { 169 | "type": "string" 170 | }, 171 | { 172 | "items": { 173 | "type": "string" 174 | }, 175 | "type": "array" 176 | } 177 | ], 178 | "description": "The value of this property MUST be another schema which will provide a base schema which the current schema will inherit from. The inheritance rules are such that any instance that is valid according to the current schema MUST be valid according to the referenced schema. This MAY also be an array, in which case, the instance MUST be valid for all the schemas in the array. A schema that extends another schema MAY define additional attributes, constrain existing attributes, or add other constraints.\n\nConceptually, the behavior of extends can be seen as validating an instance against all constraints in the extending schema as well as the extended schema(s)." 179 | }, 180 | "format": { 181 | "type": "string" 182 | }, 183 | "id": { 184 | "type": "string" 185 | }, 186 | "items": { 187 | "anyOf": [ 188 | { 189 | "$ref": "#/definitions/JSONSchema4" 190 | }, 191 | { 192 | "items": { 193 | "$ref": "#/definitions/JSONSchema4" 194 | }, 195 | "type": "array" 196 | } 197 | ], 198 | "description": "This attribute defines the allowed items in an instance array, and MUST be a schema or an array of schemas. The default value is an empty schema which allows any value for items in the instance array.\n\nWhen this attribute value is a schema and the instance value is an array, then all the items in the array MUST be valid according to the schema.\n\nWhen this attribute value is an array of schemas and the instance value is an array, each position in the instance array MUST conform to the schema in the corresponding position for this array. This called tuple typing. When tuple typing is used, additional items are allowed, disallowed, or constrained by the \"additionalItems\" (Section 5.6) attribute using the same rules as \"additionalProperties\" (Section 5.4) for objects." 199 | }, 200 | "maxItems": { 201 | "type": "number" 202 | }, 203 | "maxLength": { 204 | "type": "number" 205 | }, 206 | "maxProperties": { 207 | "type": "number" 208 | }, 209 | "maximum": { 210 | "type": "number" 211 | }, 212 | "minItems": { 213 | "type": "number" 214 | }, 215 | "minLength": { 216 | "type": "number" 217 | }, 218 | "minProperties": { 219 | "type": "number" 220 | }, 221 | "minimum": { 222 | "type": "number" 223 | }, 224 | "multipleOf": { 225 | "type": "number" 226 | }, 227 | "not": { 228 | "$ref": "#/definitions/JSONSchema4" 229 | }, 230 | "oneOf": { 231 | "items": { 232 | "$ref": "#/definitions/JSONSchema4" 233 | }, 234 | "type": "array" 235 | }, 236 | "pattern": { 237 | "type": "string" 238 | }, 239 | "patternProperties": { 240 | "additionalProperties": { 241 | "$ref": "#/definitions/JSONSchema4" 242 | }, 243 | "description": "This attribute is an object that defines the schema for a set of property names of an object instance. The name of each property of this attribute's object is a regular expression pattern in the ECMA 262/Perl 5 format, while the value is a schema. If the pattern matches the name of a property on the instance object, the value of the instance's property MUST be valid against the pattern name's schema value.", 244 | "type": "object" 245 | }, 246 | "properties": { 247 | "additionalProperties": { 248 | "$ref": "#/definitions/JSONSchema4" 249 | }, 250 | "description": "This attribute is an object with property definitions that define the valid values of instance object property values. When the instance value is an object, the property values of the instance object MUST conform to the property definitions in this object. In this object, each property definition's value MUST be a schema, and the property's name MUST be the name of the instance property that it defines. The instance property value MUST be valid according to the schema from the property definition. Properties are considered unordered, the order of the instance properties MAY be in any order.", 251 | "type": "object" 252 | }, 253 | "required": { 254 | "anyOf": [ 255 | { 256 | "type": "boolean" 257 | }, 258 | { 259 | "items": { 260 | "type": "string" 261 | }, 262 | "type": "array" 263 | } 264 | ], 265 | "description": "This attribute indicates if the instance must have a value, and not be undefined. This is false by default, making the instance optional." 266 | }, 267 | "title": { 268 | "description": "This attribute is a string that provides a short description of the instance property.", 269 | "type": "string" 270 | }, 271 | "tsEnumNames": { 272 | "description": "schema extension to support numeric enums", 273 | "items": { 274 | "type": "string" 275 | }, 276 | "type": "array" 277 | }, 278 | "tsType": { 279 | "description": "schema extension to support custom types", 280 | "type": "string" 281 | }, 282 | "type": { 283 | "anyOf": [ 284 | { 285 | "$ref": "#/definitions/JSONSchema4TypeName" 286 | }, 287 | { 288 | "items": { 289 | "$ref": "#/definitions/JSONSchema4TypeName" 290 | }, 291 | "type": "array" 292 | } 293 | ], 294 | "description": "A single type, or a union of simple types" 295 | }, 296 | "uniqueItems": { 297 | "type": "boolean" 298 | } 299 | }, 300 | "type": "object" 301 | }, 302 | "JSONSchema4": { 303 | "description": "JSON Schema V4", 304 | "properties": { 305 | "$ref": { 306 | "type": "string" 307 | }, 308 | "$schema": { 309 | "$ref": "#/definitions/JSONSchema4Version" 310 | }, 311 | "additionalItems": { 312 | "anyOf": [ 313 | { 314 | "type": "boolean" 315 | }, 316 | { 317 | "$ref": "#/definitions/JSONSchema4" 318 | } 319 | ], 320 | "description": "May only be defined when \"items\" is defined, and is a tuple of JSONSchemas.\n\nThis provides a definition for additional items in an array instance when tuple definitions of the items is provided. This can be false to indicate additional items in the array are not allowed, or it can be a schema that defines the schema of the additional items." 321 | }, 322 | "additionalProperties": { 323 | "anyOf": [ 324 | { 325 | "type": "boolean" 326 | }, 327 | { 328 | "$ref": "#/definitions/JSONSchema4" 329 | } 330 | ], 331 | "description": "This attribute defines a schema for all properties that are not explicitly defined in an object type definition. If specified, the value MUST be a schema or a boolean. If false is provided, no additional properties are allowed beyond the properties defined in the schema. The default value is an empty schema which allows any value for additional properties." 332 | }, 333 | "allOf": { 334 | "items": { 335 | "$ref": "#/definitions/JSONSchema4" 336 | }, 337 | "type": "array" 338 | }, 339 | "anyOf": { 340 | "items": { 341 | "$ref": "#/definitions/JSONSchema4" 342 | }, 343 | "type": "array" 344 | }, 345 | "default": { 346 | "$ref": "#/definitions/JSONSchema4Type" 347 | }, 348 | "definitions": { 349 | "additionalProperties": { 350 | "$ref": "#/definitions/JSONSchema4" 351 | }, 352 | "type": "object" 353 | }, 354 | "dependencies": { 355 | "additionalProperties": { 356 | "anyOf": [ 357 | { 358 | "$ref": "#/definitions/JSONSchema4" 359 | }, 360 | { 361 | "items": { 362 | "type": "string" 363 | }, 364 | "type": "array" 365 | } 366 | ] 367 | }, 368 | "type": "object" 369 | }, 370 | "description": { 371 | "description": "This attribute is a string that provides a full description of the of purpose the instance property.", 372 | "type": "string" 373 | }, 374 | "enum": { 375 | "description": "This provides an enumeration of all possible values that are valid for the instance property. This MUST be an array, and each item in the array represents a possible value for the instance value. If this attribute is defined, the instance value MUST be one of the values in the array in order for the schema to be valid.", 376 | "items": { 377 | "$ref": "#/definitions/JSONSchema4Type" 378 | }, 379 | "type": "array" 380 | }, 381 | "exclusiveMaximum": { 382 | "type": "boolean" 383 | }, 384 | "exclusiveMinimum": { 385 | "type": "boolean" 386 | }, 387 | "extends": { 388 | "anyOf": [ 389 | { 390 | "type": "string" 391 | }, 392 | { 393 | "items": { 394 | "type": "string" 395 | }, 396 | "type": "array" 397 | } 398 | ], 399 | "description": "The value of this property MUST be another schema which will provide a base schema which the current schema will inherit from. The inheritance rules are such that any instance that is valid according to the current schema MUST be valid according to the referenced schema. This MAY also be an array, in which case, the instance MUST be valid for all the schemas in the array. A schema that extends another schema MAY define additional attributes, constrain existing attributes, or add other constraints.\n\nConceptually, the behavior of extends can be seen as validating an instance against all constraints in the extending schema as well as the extended schema(s)." 400 | }, 401 | "format": { 402 | "type": "string" 403 | }, 404 | "id": { 405 | "type": "string" 406 | }, 407 | "items": { 408 | "anyOf": [ 409 | { 410 | "$ref": "#/definitions/JSONSchema4" 411 | }, 412 | { 413 | "items": { 414 | "$ref": "#/definitions/JSONSchema4" 415 | }, 416 | "type": "array" 417 | } 418 | ], 419 | "description": "This attribute defines the allowed items in an instance array, and MUST be a schema or an array of schemas. The default value is an empty schema which allows any value for items in the instance array.\n\nWhen this attribute value is a schema and the instance value is an array, then all the items in the array MUST be valid according to the schema.\n\nWhen this attribute value is an array of schemas and the instance value is an array, each position in the instance array MUST conform to the schema in the corresponding position for this array. This called tuple typing. When tuple typing is used, additional items are allowed, disallowed, or constrained by the \"additionalItems\" (Section 5.6) attribute using the same rules as \"additionalProperties\" (Section 5.4) for objects." 420 | }, 421 | "maxItems": { 422 | "type": "number" 423 | }, 424 | "maxLength": { 425 | "type": "number" 426 | }, 427 | "maxProperties": { 428 | "type": "number" 429 | }, 430 | "maximum": { 431 | "type": "number" 432 | }, 433 | "minItems": { 434 | "type": "number" 435 | }, 436 | "minLength": { 437 | "type": "number" 438 | }, 439 | "minProperties": { 440 | "type": "number" 441 | }, 442 | "minimum": { 443 | "type": "number" 444 | }, 445 | "multipleOf": { 446 | "type": "number" 447 | }, 448 | "not": { 449 | "$ref": "#/definitions/JSONSchema4" 450 | }, 451 | "oneOf": { 452 | "items": { 453 | "$ref": "#/definitions/JSONSchema4" 454 | }, 455 | "type": "array" 456 | }, 457 | "pattern": { 458 | "type": "string" 459 | }, 460 | "patternProperties": { 461 | "additionalProperties": { 462 | "$ref": "#/definitions/JSONSchema4" 463 | }, 464 | "description": "This attribute is an object that defines the schema for a set of property names of an object instance. The name of each property of this attribute's object is a regular expression pattern in the ECMA 262/Perl 5 format, while the value is a schema. If the pattern matches the name of a property on the instance object, the value of the instance's property MUST be valid against the pattern name's schema value.", 465 | "type": "object" 466 | }, 467 | "properties": { 468 | "additionalProperties": { 469 | "$ref": "#/definitions/JSONSchema4" 470 | }, 471 | "description": "This attribute is an object with property definitions that define the valid values of instance object property values. When the instance value is an object, the property values of the instance object MUST conform to the property definitions in this object. In this object, each property definition's value MUST be a schema, and the property's name MUST be the name of the instance property that it defines. The instance property value MUST be valid according to the schema from the property definition. Properties are considered unordered, the order of the instance properties MAY be in any order.", 472 | "type": "object" 473 | }, 474 | "required": { 475 | "anyOf": [ 476 | { 477 | "type": "boolean" 478 | }, 479 | { 480 | "items": { 481 | "type": "string" 482 | }, 483 | "type": "array" 484 | } 485 | ], 486 | "description": "This attribute indicates if the instance must have a value, and not be undefined. This is false by default, making the instance optional." 487 | }, 488 | "title": { 489 | "description": "This attribute is a string that provides a short description of the instance property.", 490 | "type": "string" 491 | }, 492 | "type": { 493 | "anyOf": [ 494 | { 495 | "$ref": "#/definitions/JSONSchema4TypeName" 496 | }, 497 | { 498 | "items": { 499 | "$ref": "#/definitions/JSONSchema4TypeName" 500 | }, 501 | "type": "array" 502 | } 503 | ], 504 | "description": "A single type, or a union of simple types" 505 | }, 506 | "uniqueItems": { 507 | "type": "boolean" 508 | } 509 | }, 510 | "type": "object" 511 | }, 512 | "JSONSchema4Array": { 513 | "items": { 514 | "$ref": "#/definitions/JSONSchema4Type" 515 | }, 516 | "type": "array" 517 | }, 518 | "JSONSchema4Object": { 519 | "additionalProperties": { 520 | "$ref": "#/definitions/JSONSchema4Type" 521 | }, 522 | "type": "object" 523 | }, 524 | "JSONSchema4Type": { 525 | "anyOf": [ 526 | { 527 | "type": "string" 528 | }, 529 | { 530 | "type": "number" 531 | }, 532 | { 533 | "type": "boolean" 534 | }, 535 | { 536 | "$ref": "#/definitions/JSONSchema4Object" 537 | }, 538 | { 539 | "$ref": "#/definitions/JSONSchema4Array" 540 | }, 541 | { 542 | "type": "null" 543 | } 544 | ] 545 | }, 546 | "JSONSchema4TypeName": { 547 | "enum": [ 548 | "string", 549 | "number", 550 | "integer", 551 | "boolean", 552 | "object", 553 | "array", 554 | "null", 555 | "any" 556 | ], 557 | "type": "string" 558 | }, 559 | "JSONSchema4Version": { 560 | "description": "Meta schema\n\nRecommended values:\n- 'http://json-schema.org/schema#'\n- 'http://json-schema.org/hyper-schema#'\n- 'http://json-schema.org/draft-04/schema#'\n- 'http://json-schema.org/draft-04/hyper-schema#'\n- 'http://json-schema.org/draft-03/schema#'\n- 'http://json-schema.org/draft-03/hyper-schema#'", 561 | "type": "string" 562 | }, 563 | "JsonArray": { 564 | "items": { 565 | "$ref": "#/definitions/JsonValue" 566 | }, 567 | "type": "array" 568 | }, 569 | "JsonObject": { 570 | "additionalProperties": { 571 | "$ref": "#/definitions/JsonValue" 572 | }, 573 | "type": "object" 574 | }, 575 | "JsonPrimitive": { 576 | "type": [ 577 | "string", 578 | "number", 579 | "boolean", 580 | "null" 581 | ] 582 | }, 583 | "JsonValue": { 584 | "anyOf": [ 585 | { 586 | "$ref": "#/definitions/JsonPrimitive" 587 | }, 588 | { 589 | "$ref": "#/definitions/JsonObject" 590 | }, 591 | { 592 | "$ref": "#/definitions/JsonArray" 593 | } 594 | ] 595 | } 596 | } 597 | } -------------------------------------------------------------------------------- /src/config/types.ts: -------------------------------------------------------------------------------- 1 | import { type JSONSchema } from "json-schema-to-typescript"; 2 | 3 | export type JsonPrimitive = string | number | boolean | null; 4 | export type JsonArray = JsonValue[]; 5 | export type JsonObject = { [key: string]: JsonValue }; 6 | export type JsonValue = JsonPrimitive | JsonObject | JsonArray; 7 | 8 | export type EndpointBody = JsonObject | JsonArray | string; 9 | 10 | export interface Endpoint { 11 | typeName: string; 12 | url: string; 13 | method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH"; 14 | headers?: Record; 15 | queryParams?: Record; 16 | body?: EndpointBody; 17 | override?: JSONSchema; 18 | } 19 | 20 | // This type is used to generate the schema.json using https://github.com/vega/ts-json-schema-generator 21 | export interface Config { 22 | endpoints: Endpoint[]; 23 | } 24 | -------------------------------------------------------------------------------- /src/config/validateConfig.ts: -------------------------------------------------------------------------------- 1 | import Ajv from "ajv"; 2 | import { type JSONSchema } from "json-schema-to-typescript"; 3 | 4 | export const validateConfig = (config: unknown, schema: JSONSchema): void => { 5 | const ajv = new Ajv({ allErrors: true, allowUnionTypes: true }); 6 | const validate = ajv.compile(schema); 7 | const valid = validate(config); 8 | 9 | if (!valid) { 10 | console.error("Invalid configuration:"); 11 | validate.errors?.forEach((error) => { 12 | console.error(error); 13 | }); 14 | process.exit(1); 15 | } 16 | }; 17 | -------------------------------------------------------------------------------- /src/convertSchemaToType.ts: -------------------------------------------------------------------------------- 1 | import { type JSONSchema, compile } from "json-schema-to-typescript"; 2 | 3 | export const convertSchemaToType = async ( 4 | schema: JSONSchema, 5 | typeName: string 6 | ): Promise => { 7 | try { 8 | if (schema.type === "array" && schema.items) { 9 | const itemTypeName = `${typeName}Item`; 10 | const itemSchema = schema.items; 11 | 12 | const itemType = await compile(itemSchema, itemTypeName, { 13 | bannerComment: "", 14 | }); 15 | 16 | const arrayType = `export type ${typeName} = ${itemTypeName}[];\n`; 17 | 18 | return itemType + arrayType; 19 | } else { 20 | const type = await compile(schema, typeName, { 21 | bannerComment: "", 22 | }); 23 | return type; 24 | } 25 | } catch (error) { 26 | console.error(`Error converting schema to type for ${typeName}:`, error); 27 | process.exit(1); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /src/fetchData.ts: -------------------------------------------------------------------------------- 1 | import { Endpoint } from "./config/types"; 2 | 3 | export const fetchData = async (endpoint: Endpoint): Promise => { 4 | try { 5 | const { url, method, headers = {}, queryParams = {}, body } = endpoint; 6 | 7 | const urlObj = new URL(url); 8 | Object.entries(queryParams).forEach(([key, value]) => { 9 | urlObj.searchParams.append(key, value); 10 | }); 11 | 12 | const response = await fetch(urlObj.toString(), { 13 | method, 14 | headers, 15 | body: body ? JSON.stringify(body) : undefined, 16 | }); 17 | 18 | if (!response.ok) { 19 | const message = `Failed to fetch data from ${url}. Status: ${response.status}`; 20 | throw new Error(message); 21 | } 22 | const data = await response.json(); 23 | return data; 24 | } catch (error) { 25 | console.error("Error fetching data:", error); 26 | process.exit(1); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /src/generateTypes.ts: -------------------------------------------------------------------------------- 1 | import { Endpoint } from "./config/types"; 2 | import { convertSchemaToType } from "./convertSchemaToType"; 3 | import { fetchData } from "./fetchData"; 4 | import { inferJsonSchema } from "./inferJsonSchema"; 5 | import { mergeWithJsonSchema } from "./mergeJsonSchema"; 6 | 7 | export const generateTypes = async (endpoints: Endpoint[]): Promise => { 8 | let allTypes = ""; 9 | 10 | for (const endpoint of endpoints) { 11 | const data = await fetchData(endpoint); 12 | 13 | let schema = inferJsonSchema(data); 14 | 15 | if (endpoint.override) { 16 | schema = mergeWithJsonSchema(schema, endpoint.override); 17 | } 18 | 19 | const type = await convertSchemaToType(schema, endpoint.typeName); 20 | 21 | allTypes += type + "\n"; 22 | } 23 | 24 | return allTypes; 25 | }; 26 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | import { Command } from "commander"; 3 | import { getConfig } from "./config/getConfig"; 4 | import { generateTypes } from "./generateTypes"; 5 | import { saveTypesToFile } from "./saveTypesToFile"; 6 | 7 | export { generateTypes }; 8 | export { type Endpoint } from "./config/types"; 9 | 10 | const main = async ( 11 | configPath: string = "./config.json", 12 | outputPath: string = "./apiTypegen.ts" 13 | ) => { 14 | const config = getConfig(configPath); 15 | 16 | const types = await generateTypes(config.endpoints); 17 | 18 | saveTypesToFile(types, outputPath); 19 | }; 20 | 21 | const setupCli = async () => { 22 | const program = new Command(); 23 | 24 | const packageJson = await import("../package.json", { 25 | assert: { type: "json" }, 26 | }); 27 | 28 | program 29 | .version(packageJson.default.version) 30 | .description( 31 | "A TypeScript type generator that creates type definitions from API endpoint responses." 32 | ) 33 | .requiredOption("-c, --config ", "Path to the configuration file") 34 | .option("-o, --output ", "Path to the output file") 35 | .parse(process.argv); 36 | 37 | const options = program.opts(); 38 | 39 | main(options.config, options.output); 40 | }; 41 | 42 | if (require.main === module) { 43 | setupCli(); 44 | } 45 | -------------------------------------------------------------------------------- /src/inferJsonSchema.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from "vitest"; 2 | import type { JSONSchema } from "json-schema-to-typescript"; 3 | import { inferJsonSchema } from "./inferJsonSchema"; 4 | 5 | describe("inferJsonSchema", () => { 6 | it("should infer schema for primitive types", () => { 7 | expect(inferJsonSchema("string")).toEqual({ type: "string" }); 8 | expect(inferJsonSchema(123)).toEqual({ type: "number" }); 9 | expect(inferJsonSchema(true)).toEqual({ type: "boolean" }); 10 | expect(inferJsonSchema(null)).toEqual({ type: "null" }); 11 | }); 12 | 13 | it("should infer schema for simple objects", () => { 14 | const data = { name: "John", age: 30 }; 15 | const expectedSchema: JSONSchema = { 16 | type: "object", 17 | properties: { 18 | name: { type: "string" }, 19 | age: { type: "number" }, 20 | }, 21 | additionalProperties: false, 22 | }; 23 | expect(inferJsonSchema(data)).toEqual(expectedSchema); 24 | }); 25 | 26 | it("should infer schema for arrays", () => { 27 | const data = [1, 2, 3]; 28 | const expectedSchema: JSONSchema = { 29 | type: "array", 30 | items: { type: "number" }, 31 | }; 32 | expect(inferJsonSchema(data)).toEqual(expectedSchema); 33 | }); 34 | 35 | it("should infer schema for nested objects", () => { 36 | const data = { 37 | person: { 38 | name: "John", 39 | address: { 40 | city: "London", 41 | country: "UK", 42 | }, 43 | }, 44 | }; 45 | 46 | const expectedSchema: JSONSchema = { 47 | type: "object", 48 | properties: { 49 | person: { 50 | type: "object", 51 | properties: { 52 | name: { type: "string" }, 53 | address: { 54 | type: "object", 55 | properties: { 56 | city: { type: "string" }, 57 | country: { type: "string" }, 58 | }, 59 | additionalProperties: false, 60 | }, 61 | }, 62 | additionalProperties: false, 63 | }, 64 | }, 65 | additionalProperties: false, 66 | }; 67 | expect(inferJsonSchema(data)).toEqual(expectedSchema); 68 | }); 69 | 70 | it("should infer schema for arrays of objects", () => { 71 | const data = [ 72 | { id: 1, name: "John" }, 73 | { id: 2, name: "Jane" }, 74 | ]; 75 | const expectedSchema: JSONSchema = { 76 | type: "array", 77 | items: { 78 | type: "object", 79 | properties: { 80 | id: { type: "number" }, 81 | name: { type: "string" }, 82 | }, 83 | additionalProperties: false, 84 | }, 85 | }; 86 | expect(inferJsonSchema(data)).toEqual(expectedSchema); 87 | }); 88 | 89 | it("should handle empty objects with additionalProperties true", () => { 90 | const data = {}; 91 | const expectedSchema: JSONSchema = { 92 | type: "object", 93 | properties: {}, 94 | additionalProperties: true, 95 | }; 96 | expect(inferJsonSchema(data)).toEqual(expectedSchema); 97 | }); 98 | 99 | it("should handle non-empty objects with additionalProperties false", () => { 100 | const data = { key: "value" }; 101 | const expectedSchema: JSONSchema = { 102 | type: "object", 103 | properties: { 104 | key: { type: "string" }, 105 | }, 106 | additionalProperties: false, 107 | }; 108 | expect(inferJsonSchema(data)).toEqual(expectedSchema); 109 | }); 110 | 111 | it("should handle empty arrays", () => { 112 | const data = []; 113 | const expectedSchema: JSONSchema = { 114 | type: "array", 115 | items: {}, 116 | }; 117 | expect(inferJsonSchema(data)).toEqual(expectedSchema); 118 | }); 119 | }); 120 | -------------------------------------------------------------------------------- /src/inferJsonSchema.ts: -------------------------------------------------------------------------------- 1 | import { type JSONSchema } from "json-schema-to-typescript"; 2 | 3 | export const inferJsonSchema = (data: unknown): JSONSchema => { 4 | if (Array.isArray(data)) { 5 | return { 6 | type: "array", 7 | items: data.length > 0 ? inferJsonSchema(data[0]) : {}, 8 | }; 9 | } else if (typeof data === "object" && data !== null) { 10 | const additionalProperties = Object.keys(data).length === 0; 11 | 12 | const schema: JSONSchema = { 13 | type: "object", 14 | properties: {}, 15 | additionalProperties, 16 | }; 17 | 18 | for (const [key, value] of Object.entries(data)) { 19 | (schema.properties as Record)[key] = 20 | inferJsonSchema(value); 21 | } 22 | 23 | return schema; 24 | } else if (data === null) { 25 | return { 26 | type: "null", 27 | }; 28 | } else { 29 | return { 30 | type: typeof data as JSONSchema["type"], 31 | }; 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /src/mergeJsonSchema.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from "vitest"; 2 | import { mergeWithJsonSchema, mergeProperties } from "./mergeJsonSchema"; 3 | import type { JSONSchema } from "json-schema-to-typescript"; 4 | 5 | describe("mergeProperties", () => { 6 | it("should merge non-conflicting properties", () => { 7 | const generated: JSONSchema = { name: { type: "string" } }; 8 | const override: JSONSchema = { age: { type: "number" } }; 9 | const expected = { name: { type: "string" }, age: { type: "number" } }; 10 | expect(mergeProperties(generated, override)).toEqual(expected); 11 | }); 12 | 13 | it("should override existing properties", () => { 14 | const generated: JSONSchema = { name: { type: "string" } }; 15 | const override: JSONSchema = { name: { type: "number" } }; 16 | const expected = { name: { type: "number" } }; 17 | expect(mergeProperties(generated, override)).toEqual(expected); 18 | }); 19 | 20 | it("should deep merge nested properties", () => { 21 | const generated: JSONSchema = { 22 | user: { type: "object", properties: { name: { type: "string" } } }, 23 | }; 24 | const override: JSONSchema = { 25 | user: { properties: { age: { type: "number" } } }, 26 | }; 27 | const expected = { 28 | user: { 29 | type: "object", 30 | properties: { name: { type: "string" }, age: { type: "number" } }, 31 | }, 32 | }; 33 | expect(mergeProperties(generated, override)).toEqual(expected); 34 | }); 35 | 36 | it("should handle empty override", () => { 37 | const generated: JSONSchema = { name: { type: "string" } }; 38 | const override: JSONSchema = {}; 39 | expect(mergeProperties(generated, override)).toEqual(generated); 40 | }); 41 | 42 | it("should handle empty generated", () => { 43 | const generated: JSONSchema = {}; 44 | const override: JSONSchema = { name: { type: "string" } }; 45 | expect(mergeProperties(generated, override)).toEqual(override); 46 | }); 47 | 48 | it("should merge complex nested structures", () => { 49 | const generated: JSONSchema = { 50 | user: { 51 | type: "object", 52 | properties: { 53 | name: { type: "string" }, 54 | address: { type: "object", properties: { city: { type: "string" } } }, 55 | }, 56 | }, 57 | }; 58 | const override: JSONSchema = { 59 | user: { 60 | properties: { 61 | age: { type: "number" }, 62 | address: { properties: { country: { type: "string" } } }, 63 | }, 64 | }, 65 | }; 66 | const expected = { 67 | user: { 68 | type: "object", 69 | properties: { 70 | name: { type: "string" }, 71 | age: { type: "number" }, 72 | address: { 73 | type: "object", 74 | properties: { 75 | city: { type: "string" }, 76 | country: { type: "string" }, 77 | }, 78 | }, 79 | }, 80 | }, 81 | }; 82 | expect(mergeProperties(generated, override)).toEqual(expected); 83 | }); 84 | }); 85 | 86 | describe("mergeWithJsonSchema", () => { 87 | it("should merge basic properties", () => { 88 | const generated: JSONSchema = { 89 | type: "object", 90 | properties: { name: { type: "string" } }, 91 | }; 92 | const override: JSONSchema = { properties: { age: { type: "number" } } }; 93 | const expected: JSONSchema = { 94 | type: "object", 95 | properties: { name: { type: "string" }, age: { type: "number" } }, 96 | }; 97 | expect(mergeWithJsonSchema(generated, override)).toEqual(expected); 98 | }); 99 | 100 | it("should override existing properties", () => { 101 | const generated: JSONSchema = { 102 | type: "object", 103 | properties: { name: { type: "string" } }, 104 | }; 105 | const override: JSONSchema = { properties: { name: { type: "number" } } }; 106 | const expected: JSONSchema = { 107 | type: "object", 108 | properties: { name: { type: "number" } }, 109 | }; 110 | expect(mergeWithJsonSchema(generated, override)).toEqual(expected); 111 | }); 112 | 113 | it("should merge array items", () => { 114 | const generated: JSONSchema = { type: "array", items: { type: "string" } }; 115 | const override: JSONSchema = { items: { minLength: 5 } }; 116 | const expected: JSONSchema = { 117 | type: "array", 118 | items: { type: "string", minLength: 5 }, 119 | }; 120 | expect(mergeWithJsonSchema(generated, override)).toEqual(expected); 121 | }); 122 | 123 | it("should merge required fields", () => { 124 | const generated: JSONSchema = { type: "object", required: ["name"] }; 125 | const override: JSONSchema = { required: ["age"] }; 126 | const expected: JSONSchema = { type: "object", required: ["name", "age"] }; 127 | expect(mergeWithJsonSchema(generated, override)).toEqual(expected); 128 | }); 129 | 130 | it("should handle deep merging", () => { 131 | const generated: JSONSchema = { 132 | type: "object", 133 | properties: { 134 | user: { type: "object", properties: { name: { type: "string" } } }, 135 | }, 136 | }; 137 | const override: JSONSchema = { 138 | properties: { 139 | user: { properties: { age: { type: "number" } } }, 140 | }, 141 | }; 142 | const expected: JSONSchema = { 143 | type: "object", 144 | properties: { 145 | user: { 146 | type: "object", 147 | properties: { name: { type: "string" }, age: { type: "number" } }, 148 | }, 149 | }, 150 | }; 151 | expect(mergeWithJsonSchema(generated, override)).toEqual(expected); 152 | }); 153 | }); 154 | -------------------------------------------------------------------------------- /src/mergeJsonSchema.ts: -------------------------------------------------------------------------------- 1 | import { type JSONSchema } from "json-schema-to-typescript"; 2 | 3 | export const mergeProperties = ( 4 | generatedProperties: Record, 5 | overrideProperties: Record 6 | ): Record => { 7 | const mergedProperties: Record = { 8 | ...generatedProperties, 9 | }; 10 | 11 | for (const key in overrideProperties) { 12 | if (mergedProperties[key]) { 13 | mergedProperties[key] = mergeWithJsonSchema( 14 | mergedProperties[key], 15 | overrideProperties[key] 16 | ); 17 | } else { 18 | mergedProperties[key] = overrideProperties[key]; 19 | } 20 | } 21 | 22 | return mergedProperties; 23 | }; 24 | 25 | export const mergeWithJsonSchema = ( 26 | generatedSchema: JSONSchema, 27 | override: JSONSchema 28 | ): JSONSchema => { 29 | const mergedSchema: JSONSchema = { ...generatedSchema }; 30 | 31 | for (const key in override) { 32 | if ( 33 | key === "properties" && 34 | override.properties && 35 | mergedSchema.properties 36 | ) { 37 | mergedSchema.properties = mergeProperties( 38 | mergedSchema.properties, 39 | override.properties 40 | ); 41 | } else if (key === "items" && override.items && mergedSchema.items) { 42 | mergedSchema.items = mergeWithJsonSchema( 43 | mergedSchema.items, 44 | override.items 45 | ); 46 | } else if (key === "required") { 47 | if ( 48 | Array.isArray(override.required) && 49 | Array.isArray(mergedSchema.required) 50 | ) { 51 | mergedSchema.required = Array.from( 52 | new Set([...mergedSchema.required, ...override.required]) 53 | ); 54 | } else { 55 | mergedSchema.required = override.required; 56 | } 57 | } else { 58 | mergedSchema[key] = override[key]; 59 | } 60 | } 61 | 62 | return mergedSchema; 63 | }; 64 | -------------------------------------------------------------------------------- /src/saveTypesToFile.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | 3 | export const saveTypesToFile = (types: string, filePath: string): void => { 4 | fs.writeFileSync(filePath, types); 5 | console.log("Types saved to:", filePath); 6 | }; 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "NodeNext", 5 | "outDir": "./dist", 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "strict": true, 9 | "skipLibCheck": true, 10 | "resolveJsonModule": true 11 | }, 12 | "exclude": ["**/*.test.ts"] 13 | } 14 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup"; 2 | 3 | export default defineConfig({ 4 | entry: ["src/index.ts"], 5 | format: ["cjs", "esm"], 6 | dts: true, 7 | clean: true, 8 | }); 9 | --------------------------------------------------------------------------------