├── .cursorrules ├── .gitignore ├── .vscode └── settings.json ├── README.md ├── docs └── rules │ └── enforce-angular-signal-call.md ├── eslint.config.mjs ├── package-lock.json ├── package.json ├── src ├── index.ts └── rules │ ├── enforce-angular-signal-call.test.ts │ └── enforce-angular-signal-call.ts ├── tsconfig.json └── vitest.config.ts /.cursorrules: -------------------------------------------------------------------------------- 1 | You are an expert at writing eslint rules and typescript. You write the cleanest code with the strictest typescript rules and make use of typescript features to their fullest. 2 | You are not using "any" or type assertions. You are using typescript types correctly. 3 | 4 | You are following the angular documentation and best practices. 5 | 6 | You are following the eslint rules and best practices. 7 | 8 | You are following the typescript rules and best practices. 9 | 10 | You are following the angular rules and best practices. 11 | 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /lib 3 | /.idea 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "conventionalCommits.scopes": [ 3 | "cursor" 4 | ] 5 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `enforce-angular-signal-call` 2 | 3 | An eslint plugin which enforces that Angular signals are called with the getter. 4 | 5 | ## Rules 6 | 7 | 8 | 9 | | Name | Description | 10 | | :----------------------------------------------------------------------- | :------------------------------------------------------ | 11 | | [enforce-angular-signal-call](docs/rules/enforce-angular-signal-call.md) | Enforce that Angular signals are called with the getter | 12 | 13 | 14 | 15 | 16 | ## Example 17 | 18 | ```ts 19 | 20 | const mySignal = signal(false); 21 | 22 | console.log(mySignal); // ❌ 23 | 24 | console.log(mySignal()); // ✅ 25 | 26 | if (mySignal) { // ❌ 27 | console.log('mySignal is truthy'); 28 | } 29 | 30 | if (mySignal()) { // ✅ 31 | console.log('mySignal() is truthy'); 32 | } 33 | ``` 34 | 35 | 36 | ## Installation 37 | 38 | ```npm install --save-dev eslint-plugin-angular-signal-call``` 39 | 40 | ## Usage 41 | 42 | Add `angular-signal-call` to the plugins section of your `.eslintrc` configuration file. You can omit the `eslint-plugin-` prefix: 43 | 44 | ```json 45 | { 46 | "plugins": [ 47 | "enforce-angular-signal-call" 48 | ] 49 | } 50 | ``` 51 | 52 | Then configure the rules you want to use under the rules section. 53 | 54 | ```json 55 | { 56 | "rules": { 57 | "enforce-angular-signal-call/enforce-angular-signal-call": "warn" 58 | } 59 | } 60 | ``` 61 | -------------------------------------------------------------------------------- /docs/rules/enforce-angular-signal-call.md: -------------------------------------------------------------------------------- 1 | # Enforce that Angular signals are called with the getter (`yourplugin/enforce-angular-signal-call`) 2 | 3 | 4 | 5 | This rule enforces that Angular signals are called with the getter. 6 | 7 | ## Valid 8 | 9 | ```ts 10 | const x = this.mySignal(); 11 | ``` 12 | 13 | ```ts 14 | const x = computed(() => this.mySignal()); 15 | ``` 16 | 17 | ## Invalid 18 | 19 | ```ts 20 | const x = this.mySignal; 21 | ``` 22 | 23 | ```ts 24 | const x = computed(() => this.mySignal); 25 | ``` 26 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import pluginJs from "@eslint/js"; 2 | import tseslint from "typescript-eslint"; 3 | 4 | 5 | export default [ 6 | {files: ["**/*.{js,mjs,cjs,ts}"]}, 7 | {ignores: ["lib"]}, 8 | pluginJs.configs.recommended, 9 | ...tseslint.configs.recommended, 10 | { 11 | languageOptions: { 12 | parserOptions: { 13 | projectService: { 14 | allowDefaultProject: ["*.config.*"], 15 | defaultProject: "tsconfig.json" 16 | }, 17 | tsconfigRootDir: import.meta.dirname, 18 | }, 19 | }, 20 | }, 21 | ]; 22 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint-plugin-yourplugin", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "eslint-plugin-yourplugin", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@typescript-eslint/utils": "^8.7.0" 13 | }, 14 | "devDependencies": { 15 | "@eslint/js": "^9.11.1", 16 | "@types/eslint": "^9.6.1", 17 | "@types/eslint__js": "^8.42.3", 18 | "@types/node": "^22.0.2", 19 | "@typescript-eslint/rule-tester": "^8.7.0", 20 | "eslint": "^8.57.1", 21 | "globals": "^15.9.0", 22 | "typescript": "^5.6.2", 23 | "typescript-eslint": "^8.7.0", 24 | "vitest": "^2.1.1" 25 | } 26 | }, 27 | "node_modules/@esbuild/aix-ppc64": { 28 | "version": "0.21.5", 29 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 30 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 31 | "cpu": [ 32 | "ppc64" 33 | ], 34 | "dev": true, 35 | "license": "MIT", 36 | "optional": true, 37 | "os": [ 38 | "aix" 39 | ], 40 | "engines": { 41 | "node": ">=12" 42 | } 43 | }, 44 | "node_modules/@esbuild/android-arm": { 45 | "version": "0.21.5", 46 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 47 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 48 | "cpu": [ 49 | "arm" 50 | ], 51 | "dev": true, 52 | "license": "MIT", 53 | "optional": true, 54 | "os": [ 55 | "android" 56 | ], 57 | "engines": { 58 | "node": ">=12" 59 | } 60 | }, 61 | "node_modules/@esbuild/android-arm64": { 62 | "version": "0.21.5", 63 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 64 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 65 | "cpu": [ 66 | "arm64" 67 | ], 68 | "dev": true, 69 | "license": "MIT", 70 | "optional": true, 71 | "os": [ 72 | "android" 73 | ], 74 | "engines": { 75 | "node": ">=12" 76 | } 77 | }, 78 | "node_modules/@esbuild/android-x64": { 79 | "version": "0.21.5", 80 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 81 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 82 | "cpu": [ 83 | "x64" 84 | ], 85 | "dev": true, 86 | "license": "MIT", 87 | "optional": true, 88 | "os": [ 89 | "android" 90 | ], 91 | "engines": { 92 | "node": ">=12" 93 | } 94 | }, 95 | "node_modules/@esbuild/darwin-arm64": { 96 | "version": "0.21.5", 97 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 98 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 99 | "cpu": [ 100 | "arm64" 101 | ], 102 | "dev": true, 103 | "license": "MIT", 104 | "optional": true, 105 | "os": [ 106 | "darwin" 107 | ], 108 | "engines": { 109 | "node": ">=12" 110 | } 111 | }, 112 | "node_modules/@esbuild/darwin-x64": { 113 | "version": "0.21.5", 114 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 115 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 116 | "cpu": [ 117 | "x64" 118 | ], 119 | "dev": true, 120 | "license": "MIT", 121 | "optional": true, 122 | "os": [ 123 | "darwin" 124 | ], 125 | "engines": { 126 | "node": ">=12" 127 | } 128 | }, 129 | "node_modules/@esbuild/freebsd-arm64": { 130 | "version": "0.21.5", 131 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 132 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 133 | "cpu": [ 134 | "arm64" 135 | ], 136 | "dev": true, 137 | "license": "MIT", 138 | "optional": true, 139 | "os": [ 140 | "freebsd" 141 | ], 142 | "engines": { 143 | "node": ">=12" 144 | } 145 | }, 146 | "node_modules/@esbuild/freebsd-x64": { 147 | "version": "0.21.5", 148 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 149 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 150 | "cpu": [ 151 | "x64" 152 | ], 153 | "dev": true, 154 | "license": "MIT", 155 | "optional": true, 156 | "os": [ 157 | "freebsd" 158 | ], 159 | "engines": { 160 | "node": ">=12" 161 | } 162 | }, 163 | "node_modules/@esbuild/linux-arm": { 164 | "version": "0.21.5", 165 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 166 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 167 | "cpu": [ 168 | "arm" 169 | ], 170 | "dev": true, 171 | "license": "MIT", 172 | "optional": true, 173 | "os": [ 174 | "linux" 175 | ], 176 | "engines": { 177 | "node": ">=12" 178 | } 179 | }, 180 | "node_modules/@esbuild/linux-arm64": { 181 | "version": "0.21.5", 182 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 183 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 184 | "cpu": [ 185 | "arm64" 186 | ], 187 | "dev": true, 188 | "license": "MIT", 189 | "optional": true, 190 | "os": [ 191 | "linux" 192 | ], 193 | "engines": { 194 | "node": ">=12" 195 | } 196 | }, 197 | "node_modules/@esbuild/linux-ia32": { 198 | "version": "0.21.5", 199 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 200 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 201 | "cpu": [ 202 | "ia32" 203 | ], 204 | "dev": true, 205 | "license": "MIT", 206 | "optional": true, 207 | "os": [ 208 | "linux" 209 | ], 210 | "engines": { 211 | "node": ">=12" 212 | } 213 | }, 214 | "node_modules/@esbuild/linux-loong64": { 215 | "version": "0.21.5", 216 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 217 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 218 | "cpu": [ 219 | "loong64" 220 | ], 221 | "dev": true, 222 | "license": "MIT", 223 | "optional": true, 224 | "os": [ 225 | "linux" 226 | ], 227 | "engines": { 228 | "node": ">=12" 229 | } 230 | }, 231 | "node_modules/@esbuild/linux-mips64el": { 232 | "version": "0.21.5", 233 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 234 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 235 | "cpu": [ 236 | "mips64el" 237 | ], 238 | "dev": true, 239 | "license": "MIT", 240 | "optional": true, 241 | "os": [ 242 | "linux" 243 | ], 244 | "engines": { 245 | "node": ">=12" 246 | } 247 | }, 248 | "node_modules/@esbuild/linux-ppc64": { 249 | "version": "0.21.5", 250 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 251 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 252 | "cpu": [ 253 | "ppc64" 254 | ], 255 | "dev": true, 256 | "license": "MIT", 257 | "optional": true, 258 | "os": [ 259 | "linux" 260 | ], 261 | "engines": { 262 | "node": ">=12" 263 | } 264 | }, 265 | "node_modules/@esbuild/linux-riscv64": { 266 | "version": "0.21.5", 267 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 268 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 269 | "cpu": [ 270 | "riscv64" 271 | ], 272 | "dev": true, 273 | "license": "MIT", 274 | "optional": true, 275 | "os": [ 276 | "linux" 277 | ], 278 | "engines": { 279 | "node": ">=12" 280 | } 281 | }, 282 | "node_modules/@esbuild/linux-s390x": { 283 | "version": "0.21.5", 284 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 285 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 286 | "cpu": [ 287 | "s390x" 288 | ], 289 | "dev": true, 290 | "license": "MIT", 291 | "optional": true, 292 | "os": [ 293 | "linux" 294 | ], 295 | "engines": { 296 | "node": ">=12" 297 | } 298 | }, 299 | "node_modules/@esbuild/linux-x64": { 300 | "version": "0.21.5", 301 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 302 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 303 | "cpu": [ 304 | "x64" 305 | ], 306 | "dev": true, 307 | "license": "MIT", 308 | "optional": true, 309 | "os": [ 310 | "linux" 311 | ], 312 | "engines": { 313 | "node": ">=12" 314 | } 315 | }, 316 | "node_modules/@esbuild/netbsd-x64": { 317 | "version": "0.21.5", 318 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 319 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 320 | "cpu": [ 321 | "x64" 322 | ], 323 | "dev": true, 324 | "license": "MIT", 325 | "optional": true, 326 | "os": [ 327 | "netbsd" 328 | ], 329 | "engines": { 330 | "node": ">=12" 331 | } 332 | }, 333 | "node_modules/@esbuild/openbsd-x64": { 334 | "version": "0.21.5", 335 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 336 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 337 | "cpu": [ 338 | "x64" 339 | ], 340 | "dev": true, 341 | "license": "MIT", 342 | "optional": true, 343 | "os": [ 344 | "openbsd" 345 | ], 346 | "engines": { 347 | "node": ">=12" 348 | } 349 | }, 350 | "node_modules/@esbuild/sunos-x64": { 351 | "version": "0.21.5", 352 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 353 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 354 | "cpu": [ 355 | "x64" 356 | ], 357 | "dev": true, 358 | "license": "MIT", 359 | "optional": true, 360 | "os": [ 361 | "sunos" 362 | ], 363 | "engines": { 364 | "node": ">=12" 365 | } 366 | }, 367 | "node_modules/@esbuild/win32-arm64": { 368 | "version": "0.21.5", 369 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 370 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 371 | "cpu": [ 372 | "arm64" 373 | ], 374 | "dev": true, 375 | "license": "MIT", 376 | "optional": true, 377 | "os": [ 378 | "win32" 379 | ], 380 | "engines": { 381 | "node": ">=12" 382 | } 383 | }, 384 | "node_modules/@esbuild/win32-ia32": { 385 | "version": "0.21.5", 386 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 387 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 388 | "cpu": [ 389 | "ia32" 390 | ], 391 | "dev": true, 392 | "license": "MIT", 393 | "optional": true, 394 | "os": [ 395 | "win32" 396 | ], 397 | "engines": { 398 | "node": ">=12" 399 | } 400 | }, 401 | "node_modules/@esbuild/win32-x64": { 402 | "version": "0.21.5", 403 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 404 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 405 | "cpu": [ 406 | "x64" 407 | ], 408 | "dev": true, 409 | "license": "MIT", 410 | "optional": true, 411 | "os": [ 412 | "win32" 413 | ], 414 | "engines": { 415 | "node": ">=12" 416 | } 417 | }, 418 | "node_modules/@eslint-community/eslint-utils": { 419 | "version": "4.4.0", 420 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 421 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 422 | "license": "MIT", 423 | "dependencies": { 424 | "eslint-visitor-keys": "^3.3.0" 425 | }, 426 | "engines": { 427 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 428 | }, 429 | "peerDependencies": { 430 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 431 | } 432 | }, 433 | "node_modules/@eslint-community/regexpp": { 434 | "version": "4.11.1", 435 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", 436 | "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", 437 | "license": "MIT", 438 | "engines": { 439 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 440 | } 441 | }, 442 | "node_modules/@eslint/eslintrc": { 443 | "version": "2.1.4", 444 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", 445 | "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", 446 | "license": "MIT", 447 | "dependencies": { 448 | "ajv": "^6.12.4", 449 | "debug": "^4.3.2", 450 | "espree": "^9.6.0", 451 | "globals": "^13.19.0", 452 | "ignore": "^5.2.0", 453 | "import-fresh": "^3.2.1", 454 | "js-yaml": "^4.1.0", 455 | "minimatch": "^3.1.2", 456 | "strip-json-comments": "^3.1.1" 457 | }, 458 | "engines": { 459 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 460 | }, 461 | "funding": { 462 | "url": "https://opencollective.com/eslint" 463 | } 464 | }, 465 | "node_modules/@eslint/eslintrc/node_modules/globals": { 466 | "version": "13.24.0", 467 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", 468 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", 469 | "license": "MIT", 470 | "dependencies": { 471 | "type-fest": "^0.20.2" 472 | }, 473 | "engines": { 474 | "node": ">=8" 475 | }, 476 | "funding": { 477 | "url": "https://github.com/sponsors/sindresorhus" 478 | } 479 | }, 480 | "node_modules/@eslint/js": { 481 | "version": "9.11.1", 482 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz", 483 | "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==", 484 | "dev": true, 485 | "license": "MIT", 486 | "engines": { 487 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 488 | } 489 | }, 490 | "node_modules/@humanwhocodes/config-array": { 491 | "version": "0.13.0", 492 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", 493 | "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", 494 | "deprecated": "Use @eslint/config-array instead", 495 | "license": "Apache-2.0", 496 | "dependencies": { 497 | "@humanwhocodes/object-schema": "^2.0.3", 498 | "debug": "^4.3.1", 499 | "minimatch": "^3.0.5" 500 | }, 501 | "engines": { 502 | "node": ">=10.10.0" 503 | } 504 | }, 505 | "node_modules/@humanwhocodes/module-importer": { 506 | "version": "1.0.1", 507 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 508 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 509 | "license": "Apache-2.0", 510 | "engines": { 511 | "node": ">=12.22" 512 | }, 513 | "funding": { 514 | "type": "github", 515 | "url": "https://github.com/sponsors/nzakas" 516 | } 517 | }, 518 | "node_modules/@humanwhocodes/object-schema": { 519 | "version": "2.0.3", 520 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", 521 | "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", 522 | "deprecated": "Use @eslint/object-schema instead", 523 | "license": "BSD-3-Clause" 524 | }, 525 | "node_modules/@jridgewell/sourcemap-codec": { 526 | "version": "1.5.0", 527 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 528 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 529 | "dev": true, 530 | "license": "MIT" 531 | }, 532 | "node_modules/@nodelib/fs.scandir": { 533 | "version": "2.1.5", 534 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 535 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 536 | "license": "MIT", 537 | "dependencies": { 538 | "@nodelib/fs.stat": "2.0.5", 539 | "run-parallel": "^1.1.9" 540 | }, 541 | "engines": { 542 | "node": ">= 8" 543 | } 544 | }, 545 | "node_modules/@nodelib/fs.stat": { 546 | "version": "2.0.5", 547 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 548 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 549 | "license": "MIT", 550 | "engines": { 551 | "node": ">= 8" 552 | } 553 | }, 554 | "node_modules/@nodelib/fs.walk": { 555 | "version": "1.2.8", 556 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 557 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 558 | "license": "MIT", 559 | "dependencies": { 560 | "@nodelib/fs.scandir": "2.1.5", 561 | "fastq": "^1.6.0" 562 | }, 563 | "engines": { 564 | "node": ">= 8" 565 | } 566 | }, 567 | "node_modules/@rollup/rollup-android-arm-eabi": { 568 | "version": "4.22.4", 569 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", 570 | "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", 571 | "cpu": [ 572 | "arm" 573 | ], 574 | "dev": true, 575 | "license": "MIT", 576 | "optional": true, 577 | "os": [ 578 | "android" 579 | ] 580 | }, 581 | "node_modules/@rollup/rollup-android-arm64": { 582 | "version": "4.22.4", 583 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", 584 | "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", 585 | "cpu": [ 586 | "arm64" 587 | ], 588 | "dev": true, 589 | "license": "MIT", 590 | "optional": true, 591 | "os": [ 592 | "android" 593 | ] 594 | }, 595 | "node_modules/@rollup/rollup-darwin-arm64": { 596 | "version": "4.22.4", 597 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", 598 | "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", 599 | "cpu": [ 600 | "arm64" 601 | ], 602 | "dev": true, 603 | "license": "MIT", 604 | "optional": true, 605 | "os": [ 606 | "darwin" 607 | ] 608 | }, 609 | "node_modules/@rollup/rollup-darwin-x64": { 610 | "version": "4.22.4", 611 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", 612 | "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", 613 | "cpu": [ 614 | "x64" 615 | ], 616 | "dev": true, 617 | "license": "MIT", 618 | "optional": true, 619 | "os": [ 620 | "darwin" 621 | ] 622 | }, 623 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 624 | "version": "4.22.4", 625 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", 626 | "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", 627 | "cpu": [ 628 | "arm" 629 | ], 630 | "dev": true, 631 | "license": "MIT", 632 | "optional": true, 633 | "os": [ 634 | "linux" 635 | ] 636 | }, 637 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 638 | "version": "4.22.4", 639 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", 640 | "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", 641 | "cpu": [ 642 | "arm" 643 | ], 644 | "dev": true, 645 | "license": "MIT", 646 | "optional": true, 647 | "os": [ 648 | "linux" 649 | ] 650 | }, 651 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 652 | "version": "4.22.4", 653 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", 654 | "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", 655 | "cpu": [ 656 | "arm64" 657 | ], 658 | "dev": true, 659 | "license": "MIT", 660 | "optional": true, 661 | "os": [ 662 | "linux" 663 | ] 664 | }, 665 | "node_modules/@rollup/rollup-linux-arm64-musl": { 666 | "version": "4.22.4", 667 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", 668 | "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", 669 | "cpu": [ 670 | "arm64" 671 | ], 672 | "dev": true, 673 | "license": "MIT", 674 | "optional": true, 675 | "os": [ 676 | "linux" 677 | ] 678 | }, 679 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 680 | "version": "4.22.4", 681 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", 682 | "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", 683 | "cpu": [ 684 | "ppc64" 685 | ], 686 | "dev": true, 687 | "license": "MIT", 688 | "optional": true, 689 | "os": [ 690 | "linux" 691 | ] 692 | }, 693 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 694 | "version": "4.22.4", 695 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", 696 | "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", 697 | "cpu": [ 698 | "riscv64" 699 | ], 700 | "dev": true, 701 | "license": "MIT", 702 | "optional": true, 703 | "os": [ 704 | "linux" 705 | ] 706 | }, 707 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 708 | "version": "4.22.4", 709 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", 710 | "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", 711 | "cpu": [ 712 | "s390x" 713 | ], 714 | "dev": true, 715 | "license": "MIT", 716 | "optional": true, 717 | "os": [ 718 | "linux" 719 | ] 720 | }, 721 | "node_modules/@rollup/rollup-linux-x64-gnu": { 722 | "version": "4.22.4", 723 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", 724 | "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", 725 | "cpu": [ 726 | "x64" 727 | ], 728 | "dev": true, 729 | "license": "MIT", 730 | "optional": true, 731 | "os": [ 732 | "linux" 733 | ] 734 | }, 735 | "node_modules/@rollup/rollup-linux-x64-musl": { 736 | "version": "4.22.4", 737 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", 738 | "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", 739 | "cpu": [ 740 | "x64" 741 | ], 742 | "dev": true, 743 | "license": "MIT", 744 | "optional": true, 745 | "os": [ 746 | "linux" 747 | ] 748 | }, 749 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 750 | "version": "4.22.4", 751 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", 752 | "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", 753 | "cpu": [ 754 | "arm64" 755 | ], 756 | "dev": true, 757 | "license": "MIT", 758 | "optional": true, 759 | "os": [ 760 | "win32" 761 | ] 762 | }, 763 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 764 | "version": "4.22.4", 765 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", 766 | "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", 767 | "cpu": [ 768 | "ia32" 769 | ], 770 | "dev": true, 771 | "license": "MIT", 772 | "optional": true, 773 | "os": [ 774 | "win32" 775 | ] 776 | }, 777 | "node_modules/@rollup/rollup-win32-x64-msvc": { 778 | "version": "4.22.4", 779 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", 780 | "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", 781 | "cpu": [ 782 | "x64" 783 | ], 784 | "dev": true, 785 | "license": "MIT", 786 | "optional": true, 787 | "os": [ 788 | "win32" 789 | ] 790 | }, 791 | "node_modules/@types/eslint": { 792 | "version": "9.6.1", 793 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", 794 | "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", 795 | "dev": true, 796 | "license": "MIT", 797 | "dependencies": { 798 | "@types/estree": "*", 799 | "@types/json-schema": "*" 800 | } 801 | }, 802 | "node_modules/@types/eslint__js": { 803 | "version": "8.42.3", 804 | "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz", 805 | "integrity": "sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==", 806 | "dev": true, 807 | "license": "MIT", 808 | "dependencies": { 809 | "@types/eslint": "*" 810 | } 811 | }, 812 | "node_modules/@types/estree": { 813 | "version": "1.0.6", 814 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 815 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 816 | "dev": true, 817 | "license": "MIT" 818 | }, 819 | "node_modules/@types/json-schema": { 820 | "version": "7.0.15", 821 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 822 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 823 | "dev": true, 824 | "license": "MIT" 825 | }, 826 | "node_modules/@types/node": { 827 | "version": "22.7.1", 828 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.1.tgz", 829 | "integrity": "sha512-adOMRLVmleuWs/5V/w5/l7o0chDK/az+5ncCsIapTKogsu/3MVWvSgP58qVTXi5IwpfGt8pMobNq9rOWtJyu5Q==", 830 | "dev": true, 831 | "license": "MIT", 832 | "dependencies": { 833 | "undici-types": "~6.19.2" 834 | } 835 | }, 836 | "node_modules/@typescript-eslint/eslint-plugin": { 837 | "version": "8.7.0", 838 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.7.0.tgz", 839 | "integrity": "sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==", 840 | "dev": true, 841 | "license": "MIT", 842 | "dependencies": { 843 | "@eslint-community/regexpp": "^4.10.0", 844 | "@typescript-eslint/scope-manager": "8.7.0", 845 | "@typescript-eslint/type-utils": "8.7.0", 846 | "@typescript-eslint/utils": "8.7.0", 847 | "@typescript-eslint/visitor-keys": "8.7.0", 848 | "graphemer": "^1.4.0", 849 | "ignore": "^5.3.1", 850 | "natural-compare": "^1.4.0", 851 | "ts-api-utils": "^1.3.0" 852 | }, 853 | "engines": { 854 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 855 | }, 856 | "funding": { 857 | "type": "opencollective", 858 | "url": "https://opencollective.com/typescript-eslint" 859 | }, 860 | "peerDependencies": { 861 | "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", 862 | "eslint": "^8.57.0 || ^9.0.0" 863 | }, 864 | "peerDependenciesMeta": { 865 | "typescript": { 866 | "optional": true 867 | } 868 | } 869 | }, 870 | "node_modules/@typescript-eslint/parser": { 871 | "version": "8.7.0", 872 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.7.0.tgz", 873 | "integrity": "sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==", 874 | "dev": true, 875 | "license": "BSD-2-Clause", 876 | "dependencies": { 877 | "@typescript-eslint/scope-manager": "8.7.0", 878 | "@typescript-eslint/types": "8.7.0", 879 | "@typescript-eslint/typescript-estree": "8.7.0", 880 | "@typescript-eslint/visitor-keys": "8.7.0", 881 | "debug": "^4.3.4" 882 | }, 883 | "engines": { 884 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 885 | }, 886 | "funding": { 887 | "type": "opencollective", 888 | "url": "https://opencollective.com/typescript-eslint" 889 | }, 890 | "peerDependencies": { 891 | "eslint": "^8.57.0 || ^9.0.0" 892 | }, 893 | "peerDependenciesMeta": { 894 | "typescript": { 895 | "optional": true 896 | } 897 | } 898 | }, 899 | "node_modules/@typescript-eslint/rule-tester": { 900 | "version": "8.7.0", 901 | "resolved": "https://registry.npmjs.org/@typescript-eslint/rule-tester/-/rule-tester-8.7.0.tgz", 902 | "integrity": "sha512-lOtbAGTWX04l0mQZV+7LqBRYDHn30XafV5DeFabUYFy69/7QztJGojexn6DILvKcRNl+vGY4Ps76D4+1/qXk/g==", 903 | "dev": true, 904 | "license": "MIT", 905 | "dependencies": { 906 | "@typescript-eslint/typescript-estree": "8.7.0", 907 | "@typescript-eslint/utils": "8.7.0", 908 | "ajv": "^6.12.6", 909 | "json-stable-stringify-without-jsonify": "^1.0.1", 910 | "lodash.merge": "4.6.2", 911 | "semver": "^7.6.0" 912 | }, 913 | "engines": { 914 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 915 | }, 916 | "funding": { 917 | "type": "opencollective", 918 | "url": "https://opencollective.com/typescript-eslint" 919 | }, 920 | "peerDependencies": { 921 | "eslint": "^8.57.0 || ^9.0.0" 922 | } 923 | }, 924 | "node_modules/@typescript-eslint/scope-manager": { 925 | "version": "8.7.0", 926 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz", 927 | "integrity": "sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==", 928 | "license": "MIT", 929 | "dependencies": { 930 | "@typescript-eslint/types": "8.7.0", 931 | "@typescript-eslint/visitor-keys": "8.7.0" 932 | }, 933 | "engines": { 934 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 935 | }, 936 | "funding": { 937 | "type": "opencollective", 938 | "url": "https://opencollective.com/typescript-eslint" 939 | } 940 | }, 941 | "node_modules/@typescript-eslint/type-utils": { 942 | "version": "8.7.0", 943 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.7.0.tgz", 944 | "integrity": "sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==", 945 | "dev": true, 946 | "license": "MIT", 947 | "dependencies": { 948 | "@typescript-eslint/typescript-estree": "8.7.0", 949 | "@typescript-eslint/utils": "8.7.0", 950 | "debug": "^4.3.4", 951 | "ts-api-utils": "^1.3.0" 952 | }, 953 | "engines": { 954 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 955 | }, 956 | "funding": { 957 | "type": "opencollective", 958 | "url": "https://opencollective.com/typescript-eslint" 959 | }, 960 | "peerDependenciesMeta": { 961 | "typescript": { 962 | "optional": true 963 | } 964 | } 965 | }, 966 | "node_modules/@typescript-eslint/types": { 967 | "version": "8.7.0", 968 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz", 969 | "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==", 970 | "license": "MIT", 971 | "engines": { 972 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 973 | }, 974 | "funding": { 975 | "type": "opencollective", 976 | "url": "https://opencollective.com/typescript-eslint" 977 | } 978 | }, 979 | "node_modules/@typescript-eslint/typescript-estree": { 980 | "version": "8.7.0", 981 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz", 982 | "integrity": "sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==", 983 | "license": "BSD-2-Clause", 984 | "dependencies": { 985 | "@typescript-eslint/types": "8.7.0", 986 | "@typescript-eslint/visitor-keys": "8.7.0", 987 | "debug": "^4.3.4", 988 | "fast-glob": "^3.3.2", 989 | "is-glob": "^4.0.3", 990 | "minimatch": "^9.0.4", 991 | "semver": "^7.6.0", 992 | "ts-api-utils": "^1.3.0" 993 | }, 994 | "engines": { 995 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 996 | }, 997 | "funding": { 998 | "type": "opencollective", 999 | "url": "https://opencollective.com/typescript-eslint" 1000 | }, 1001 | "peerDependenciesMeta": { 1002 | "typescript": { 1003 | "optional": true 1004 | } 1005 | } 1006 | }, 1007 | "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { 1008 | "version": "2.0.1", 1009 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1010 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1011 | "license": "MIT", 1012 | "dependencies": { 1013 | "balanced-match": "^1.0.0" 1014 | } 1015 | }, 1016 | "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 1017 | "version": "9.0.5", 1018 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1019 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1020 | "license": "ISC", 1021 | "dependencies": { 1022 | "brace-expansion": "^2.0.1" 1023 | }, 1024 | "engines": { 1025 | "node": ">=16 || 14 >=14.17" 1026 | }, 1027 | "funding": { 1028 | "url": "https://github.com/sponsors/isaacs" 1029 | } 1030 | }, 1031 | "node_modules/@typescript-eslint/utils": { 1032 | "version": "8.7.0", 1033 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.7.0.tgz", 1034 | "integrity": "sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==", 1035 | "license": "MIT", 1036 | "dependencies": { 1037 | "@eslint-community/eslint-utils": "^4.4.0", 1038 | "@typescript-eslint/scope-manager": "8.7.0", 1039 | "@typescript-eslint/types": "8.7.0", 1040 | "@typescript-eslint/typescript-estree": "8.7.0" 1041 | }, 1042 | "engines": { 1043 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1044 | }, 1045 | "funding": { 1046 | "type": "opencollective", 1047 | "url": "https://opencollective.com/typescript-eslint" 1048 | }, 1049 | "peerDependencies": { 1050 | "eslint": "^8.57.0 || ^9.0.0" 1051 | } 1052 | }, 1053 | "node_modules/@typescript-eslint/visitor-keys": { 1054 | "version": "8.7.0", 1055 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz", 1056 | "integrity": "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==", 1057 | "license": "MIT", 1058 | "dependencies": { 1059 | "@typescript-eslint/types": "8.7.0", 1060 | "eslint-visitor-keys": "^3.4.3" 1061 | }, 1062 | "engines": { 1063 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1064 | }, 1065 | "funding": { 1066 | "type": "opencollective", 1067 | "url": "https://opencollective.com/typescript-eslint" 1068 | } 1069 | }, 1070 | "node_modules/@ungap/structured-clone": { 1071 | "version": "1.2.0", 1072 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", 1073 | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", 1074 | "license": "ISC" 1075 | }, 1076 | "node_modules/@vitest/expect": { 1077 | "version": "2.1.1", 1078 | "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.1.tgz", 1079 | "integrity": "sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==", 1080 | "dev": true, 1081 | "license": "MIT", 1082 | "dependencies": { 1083 | "@vitest/spy": "2.1.1", 1084 | "@vitest/utils": "2.1.1", 1085 | "chai": "^5.1.1", 1086 | "tinyrainbow": "^1.2.0" 1087 | }, 1088 | "funding": { 1089 | "url": "https://opencollective.com/vitest" 1090 | } 1091 | }, 1092 | "node_modules/@vitest/mocker": { 1093 | "version": "2.1.1", 1094 | "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.1.tgz", 1095 | "integrity": "sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==", 1096 | "dev": true, 1097 | "license": "MIT", 1098 | "dependencies": { 1099 | "@vitest/spy": "^2.1.0-beta.1", 1100 | "estree-walker": "^3.0.3", 1101 | "magic-string": "^0.30.11" 1102 | }, 1103 | "funding": { 1104 | "url": "https://opencollective.com/vitest" 1105 | }, 1106 | "peerDependencies": { 1107 | "@vitest/spy": "2.1.1", 1108 | "msw": "^2.3.5", 1109 | "vite": "^5.0.0" 1110 | }, 1111 | "peerDependenciesMeta": { 1112 | "msw": { 1113 | "optional": true 1114 | }, 1115 | "vite": { 1116 | "optional": true 1117 | } 1118 | } 1119 | }, 1120 | "node_modules/@vitest/pretty-format": { 1121 | "version": "2.1.1", 1122 | "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz", 1123 | "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==", 1124 | "dev": true, 1125 | "license": "MIT", 1126 | "dependencies": { 1127 | "tinyrainbow": "^1.2.0" 1128 | }, 1129 | "funding": { 1130 | "url": "https://opencollective.com/vitest" 1131 | } 1132 | }, 1133 | "node_modules/@vitest/runner": { 1134 | "version": "2.1.1", 1135 | "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.1.tgz", 1136 | "integrity": "sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==", 1137 | "dev": true, 1138 | "license": "MIT", 1139 | "dependencies": { 1140 | "@vitest/utils": "2.1.1", 1141 | "pathe": "^1.1.2" 1142 | }, 1143 | "funding": { 1144 | "url": "https://opencollective.com/vitest" 1145 | } 1146 | }, 1147 | "node_modules/@vitest/snapshot": { 1148 | "version": "2.1.1", 1149 | "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.1.tgz", 1150 | "integrity": "sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==", 1151 | "dev": true, 1152 | "license": "MIT", 1153 | "dependencies": { 1154 | "@vitest/pretty-format": "2.1.1", 1155 | "magic-string": "^0.30.11", 1156 | "pathe": "^1.1.2" 1157 | }, 1158 | "funding": { 1159 | "url": "https://opencollective.com/vitest" 1160 | } 1161 | }, 1162 | "node_modules/@vitest/spy": { 1163 | "version": "2.1.1", 1164 | "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.1.tgz", 1165 | "integrity": "sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==", 1166 | "dev": true, 1167 | "license": "MIT", 1168 | "dependencies": { 1169 | "tinyspy": "^3.0.0" 1170 | }, 1171 | "funding": { 1172 | "url": "https://opencollective.com/vitest" 1173 | } 1174 | }, 1175 | "node_modules/@vitest/utils": { 1176 | "version": "2.1.1", 1177 | "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz", 1178 | "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==", 1179 | "dev": true, 1180 | "license": "MIT", 1181 | "dependencies": { 1182 | "@vitest/pretty-format": "2.1.1", 1183 | "loupe": "^3.1.1", 1184 | "tinyrainbow": "^1.2.0" 1185 | }, 1186 | "funding": { 1187 | "url": "https://opencollective.com/vitest" 1188 | } 1189 | }, 1190 | "node_modules/acorn": { 1191 | "version": "8.12.1", 1192 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", 1193 | "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", 1194 | "license": "MIT", 1195 | "bin": { 1196 | "acorn": "bin/acorn" 1197 | }, 1198 | "engines": { 1199 | "node": ">=0.4.0" 1200 | } 1201 | }, 1202 | "node_modules/acorn-jsx": { 1203 | "version": "5.3.2", 1204 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1205 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1206 | "license": "MIT", 1207 | "peerDependencies": { 1208 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1209 | } 1210 | }, 1211 | "node_modules/ajv": { 1212 | "version": "6.12.6", 1213 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1214 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1215 | "license": "MIT", 1216 | "dependencies": { 1217 | "fast-deep-equal": "^3.1.1", 1218 | "fast-json-stable-stringify": "^2.0.0", 1219 | "json-schema-traverse": "^0.4.1", 1220 | "uri-js": "^4.2.2" 1221 | }, 1222 | "funding": { 1223 | "type": "github", 1224 | "url": "https://github.com/sponsors/epoberezkin" 1225 | } 1226 | }, 1227 | "node_modules/ansi-regex": { 1228 | "version": "5.0.1", 1229 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1230 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1231 | "license": "MIT", 1232 | "engines": { 1233 | "node": ">=8" 1234 | } 1235 | }, 1236 | "node_modules/ansi-styles": { 1237 | "version": "4.3.0", 1238 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1239 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1240 | "license": "MIT", 1241 | "dependencies": { 1242 | "color-convert": "^2.0.1" 1243 | }, 1244 | "engines": { 1245 | "node": ">=8" 1246 | }, 1247 | "funding": { 1248 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1249 | } 1250 | }, 1251 | "node_modules/argparse": { 1252 | "version": "2.0.1", 1253 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1254 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1255 | "license": "Python-2.0" 1256 | }, 1257 | "node_modules/assertion-error": { 1258 | "version": "2.0.1", 1259 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", 1260 | "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", 1261 | "dev": true, 1262 | "license": "MIT", 1263 | "engines": { 1264 | "node": ">=12" 1265 | } 1266 | }, 1267 | "node_modules/balanced-match": { 1268 | "version": "1.0.2", 1269 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1270 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1271 | "license": "MIT" 1272 | }, 1273 | "node_modules/brace-expansion": { 1274 | "version": "1.1.11", 1275 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1276 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1277 | "license": "MIT", 1278 | "dependencies": { 1279 | "balanced-match": "^1.0.0", 1280 | "concat-map": "0.0.1" 1281 | } 1282 | }, 1283 | "node_modules/braces": { 1284 | "version": "3.0.3", 1285 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1286 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1287 | "license": "MIT", 1288 | "dependencies": { 1289 | "fill-range": "^7.1.1" 1290 | }, 1291 | "engines": { 1292 | "node": ">=8" 1293 | } 1294 | }, 1295 | "node_modules/cac": { 1296 | "version": "6.7.14", 1297 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 1298 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 1299 | "dev": true, 1300 | "license": "MIT", 1301 | "engines": { 1302 | "node": ">=8" 1303 | } 1304 | }, 1305 | "node_modules/callsites": { 1306 | "version": "3.1.0", 1307 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1308 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1309 | "license": "MIT", 1310 | "engines": { 1311 | "node": ">=6" 1312 | } 1313 | }, 1314 | "node_modules/chai": { 1315 | "version": "5.1.1", 1316 | "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", 1317 | "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", 1318 | "dev": true, 1319 | "license": "MIT", 1320 | "dependencies": { 1321 | "assertion-error": "^2.0.1", 1322 | "check-error": "^2.1.1", 1323 | "deep-eql": "^5.0.1", 1324 | "loupe": "^3.1.0", 1325 | "pathval": "^2.0.0" 1326 | }, 1327 | "engines": { 1328 | "node": ">=12" 1329 | } 1330 | }, 1331 | "node_modules/chalk": { 1332 | "version": "4.1.2", 1333 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1334 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1335 | "license": "MIT", 1336 | "dependencies": { 1337 | "ansi-styles": "^4.1.0", 1338 | "supports-color": "^7.1.0" 1339 | }, 1340 | "engines": { 1341 | "node": ">=10" 1342 | }, 1343 | "funding": { 1344 | "url": "https://github.com/chalk/chalk?sponsor=1" 1345 | } 1346 | }, 1347 | "node_modules/check-error": { 1348 | "version": "2.1.1", 1349 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", 1350 | "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", 1351 | "dev": true, 1352 | "license": "MIT", 1353 | "engines": { 1354 | "node": ">= 16" 1355 | } 1356 | }, 1357 | "node_modules/color-convert": { 1358 | "version": "2.0.1", 1359 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1360 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1361 | "license": "MIT", 1362 | "dependencies": { 1363 | "color-name": "~1.1.4" 1364 | }, 1365 | "engines": { 1366 | "node": ">=7.0.0" 1367 | } 1368 | }, 1369 | "node_modules/color-name": { 1370 | "version": "1.1.4", 1371 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1372 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1373 | "license": "MIT" 1374 | }, 1375 | "node_modules/concat-map": { 1376 | "version": "0.0.1", 1377 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1378 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1379 | "license": "MIT" 1380 | }, 1381 | "node_modules/cross-spawn": { 1382 | "version": "7.0.3", 1383 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1384 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1385 | "license": "MIT", 1386 | "dependencies": { 1387 | "path-key": "^3.1.0", 1388 | "shebang-command": "^2.0.0", 1389 | "which": "^2.0.1" 1390 | }, 1391 | "engines": { 1392 | "node": ">= 8" 1393 | } 1394 | }, 1395 | "node_modules/debug": { 1396 | "version": "4.3.7", 1397 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1398 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1399 | "license": "MIT", 1400 | "dependencies": { 1401 | "ms": "^2.1.3" 1402 | }, 1403 | "engines": { 1404 | "node": ">=6.0" 1405 | }, 1406 | "peerDependenciesMeta": { 1407 | "supports-color": { 1408 | "optional": true 1409 | } 1410 | } 1411 | }, 1412 | "node_modules/deep-eql": { 1413 | "version": "5.0.2", 1414 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", 1415 | "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", 1416 | "dev": true, 1417 | "license": "MIT", 1418 | "engines": { 1419 | "node": ">=6" 1420 | } 1421 | }, 1422 | "node_modules/deep-is": { 1423 | "version": "0.1.4", 1424 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1425 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1426 | "license": "MIT" 1427 | }, 1428 | "node_modules/doctrine": { 1429 | "version": "3.0.0", 1430 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1431 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1432 | "license": "Apache-2.0", 1433 | "dependencies": { 1434 | "esutils": "^2.0.2" 1435 | }, 1436 | "engines": { 1437 | "node": ">=6.0.0" 1438 | } 1439 | }, 1440 | "node_modules/esbuild": { 1441 | "version": "0.21.5", 1442 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 1443 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 1444 | "dev": true, 1445 | "hasInstallScript": true, 1446 | "license": "MIT", 1447 | "bin": { 1448 | "esbuild": "bin/esbuild" 1449 | }, 1450 | "engines": { 1451 | "node": ">=12" 1452 | }, 1453 | "optionalDependencies": { 1454 | "@esbuild/aix-ppc64": "0.21.5", 1455 | "@esbuild/android-arm": "0.21.5", 1456 | "@esbuild/android-arm64": "0.21.5", 1457 | "@esbuild/android-x64": "0.21.5", 1458 | "@esbuild/darwin-arm64": "0.21.5", 1459 | "@esbuild/darwin-x64": "0.21.5", 1460 | "@esbuild/freebsd-arm64": "0.21.5", 1461 | "@esbuild/freebsd-x64": "0.21.5", 1462 | "@esbuild/linux-arm": "0.21.5", 1463 | "@esbuild/linux-arm64": "0.21.5", 1464 | "@esbuild/linux-ia32": "0.21.5", 1465 | "@esbuild/linux-loong64": "0.21.5", 1466 | "@esbuild/linux-mips64el": "0.21.5", 1467 | "@esbuild/linux-ppc64": "0.21.5", 1468 | "@esbuild/linux-riscv64": "0.21.5", 1469 | "@esbuild/linux-s390x": "0.21.5", 1470 | "@esbuild/linux-x64": "0.21.5", 1471 | "@esbuild/netbsd-x64": "0.21.5", 1472 | "@esbuild/openbsd-x64": "0.21.5", 1473 | "@esbuild/sunos-x64": "0.21.5", 1474 | "@esbuild/win32-arm64": "0.21.5", 1475 | "@esbuild/win32-ia32": "0.21.5", 1476 | "@esbuild/win32-x64": "0.21.5" 1477 | } 1478 | }, 1479 | "node_modules/escape-string-regexp": { 1480 | "version": "4.0.0", 1481 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1482 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1483 | "license": "MIT", 1484 | "engines": { 1485 | "node": ">=10" 1486 | }, 1487 | "funding": { 1488 | "url": "https://github.com/sponsors/sindresorhus" 1489 | } 1490 | }, 1491 | "node_modules/eslint": { 1492 | "version": "8.57.1", 1493 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", 1494 | "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", 1495 | "license": "MIT", 1496 | "dependencies": { 1497 | "@eslint-community/eslint-utils": "^4.2.0", 1498 | "@eslint-community/regexpp": "^4.6.1", 1499 | "@eslint/eslintrc": "^2.1.4", 1500 | "@eslint/js": "8.57.1", 1501 | "@humanwhocodes/config-array": "^0.13.0", 1502 | "@humanwhocodes/module-importer": "^1.0.1", 1503 | "@nodelib/fs.walk": "^1.2.8", 1504 | "@ungap/structured-clone": "^1.2.0", 1505 | "ajv": "^6.12.4", 1506 | "chalk": "^4.0.0", 1507 | "cross-spawn": "^7.0.2", 1508 | "debug": "^4.3.2", 1509 | "doctrine": "^3.0.0", 1510 | "escape-string-regexp": "^4.0.0", 1511 | "eslint-scope": "^7.2.2", 1512 | "eslint-visitor-keys": "^3.4.3", 1513 | "espree": "^9.6.1", 1514 | "esquery": "^1.4.2", 1515 | "esutils": "^2.0.2", 1516 | "fast-deep-equal": "^3.1.3", 1517 | "file-entry-cache": "^6.0.1", 1518 | "find-up": "^5.0.0", 1519 | "glob-parent": "^6.0.2", 1520 | "globals": "^13.19.0", 1521 | "graphemer": "^1.4.0", 1522 | "ignore": "^5.2.0", 1523 | "imurmurhash": "^0.1.4", 1524 | "is-glob": "^4.0.0", 1525 | "is-path-inside": "^3.0.3", 1526 | "js-yaml": "^4.1.0", 1527 | "json-stable-stringify-without-jsonify": "^1.0.1", 1528 | "levn": "^0.4.1", 1529 | "lodash.merge": "^4.6.2", 1530 | "minimatch": "^3.1.2", 1531 | "natural-compare": "^1.4.0", 1532 | "optionator": "^0.9.3", 1533 | "strip-ansi": "^6.0.1", 1534 | "text-table": "^0.2.0" 1535 | }, 1536 | "bin": { 1537 | "eslint": "bin/eslint.js" 1538 | }, 1539 | "engines": { 1540 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1541 | }, 1542 | "funding": { 1543 | "url": "https://opencollective.com/eslint" 1544 | } 1545 | }, 1546 | "node_modules/eslint-visitor-keys": { 1547 | "version": "3.4.3", 1548 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 1549 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 1550 | "license": "Apache-2.0", 1551 | "engines": { 1552 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1553 | }, 1554 | "funding": { 1555 | "url": "https://opencollective.com/eslint" 1556 | } 1557 | }, 1558 | "node_modules/eslint/node_modules/@eslint/js": { 1559 | "version": "8.57.1", 1560 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", 1561 | "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", 1562 | "license": "MIT", 1563 | "engines": { 1564 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1565 | } 1566 | }, 1567 | "node_modules/eslint/node_modules/eslint-scope": { 1568 | "version": "7.2.2", 1569 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 1570 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 1571 | "license": "BSD-2-Clause", 1572 | "dependencies": { 1573 | "esrecurse": "^4.3.0", 1574 | "estraverse": "^5.2.0" 1575 | }, 1576 | "engines": { 1577 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1578 | }, 1579 | "funding": { 1580 | "url": "https://opencollective.com/eslint" 1581 | } 1582 | }, 1583 | "node_modules/eslint/node_modules/estraverse": { 1584 | "version": "5.3.0", 1585 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1586 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1587 | "license": "BSD-2-Clause", 1588 | "engines": { 1589 | "node": ">=4.0" 1590 | } 1591 | }, 1592 | "node_modules/eslint/node_modules/globals": { 1593 | "version": "13.24.0", 1594 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", 1595 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", 1596 | "license": "MIT", 1597 | "dependencies": { 1598 | "type-fest": "^0.20.2" 1599 | }, 1600 | "engines": { 1601 | "node": ">=8" 1602 | }, 1603 | "funding": { 1604 | "url": "https://github.com/sponsors/sindresorhus" 1605 | } 1606 | }, 1607 | "node_modules/espree": { 1608 | "version": "9.6.1", 1609 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 1610 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 1611 | "license": "BSD-2-Clause", 1612 | "dependencies": { 1613 | "acorn": "^8.9.0", 1614 | "acorn-jsx": "^5.3.2", 1615 | "eslint-visitor-keys": "^3.4.1" 1616 | }, 1617 | "engines": { 1618 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1619 | }, 1620 | "funding": { 1621 | "url": "https://opencollective.com/eslint" 1622 | } 1623 | }, 1624 | "node_modules/esquery": { 1625 | "version": "1.6.0", 1626 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 1627 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 1628 | "license": "BSD-3-Clause", 1629 | "dependencies": { 1630 | "estraverse": "^5.1.0" 1631 | }, 1632 | "engines": { 1633 | "node": ">=0.10" 1634 | } 1635 | }, 1636 | "node_modules/esquery/node_modules/estraverse": { 1637 | "version": "5.3.0", 1638 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1639 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1640 | "license": "BSD-2-Clause", 1641 | "engines": { 1642 | "node": ">=4.0" 1643 | } 1644 | }, 1645 | "node_modules/esrecurse": { 1646 | "version": "4.3.0", 1647 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1648 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1649 | "license": "BSD-2-Clause", 1650 | "dependencies": { 1651 | "estraverse": "^5.2.0" 1652 | }, 1653 | "engines": { 1654 | "node": ">=4.0" 1655 | } 1656 | }, 1657 | "node_modules/esrecurse/node_modules/estraverse": { 1658 | "version": "5.3.0", 1659 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1660 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1661 | "license": "BSD-2-Clause", 1662 | "engines": { 1663 | "node": ">=4.0" 1664 | } 1665 | }, 1666 | "node_modules/estree-walker": { 1667 | "version": "3.0.3", 1668 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 1669 | "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 1670 | "dev": true, 1671 | "license": "MIT", 1672 | "dependencies": { 1673 | "@types/estree": "^1.0.0" 1674 | } 1675 | }, 1676 | "node_modules/esutils": { 1677 | "version": "2.0.3", 1678 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1679 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1680 | "license": "BSD-2-Clause", 1681 | "engines": { 1682 | "node": ">=0.10.0" 1683 | } 1684 | }, 1685 | "node_modules/fast-deep-equal": { 1686 | "version": "3.1.3", 1687 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1688 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1689 | "license": "MIT" 1690 | }, 1691 | "node_modules/fast-glob": { 1692 | "version": "3.3.2", 1693 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 1694 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 1695 | "license": "MIT", 1696 | "dependencies": { 1697 | "@nodelib/fs.stat": "^2.0.2", 1698 | "@nodelib/fs.walk": "^1.2.3", 1699 | "glob-parent": "^5.1.2", 1700 | "merge2": "^1.3.0", 1701 | "micromatch": "^4.0.4" 1702 | }, 1703 | "engines": { 1704 | "node": ">=8.6.0" 1705 | } 1706 | }, 1707 | "node_modules/fast-glob/node_modules/glob-parent": { 1708 | "version": "5.1.2", 1709 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1710 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1711 | "license": "ISC", 1712 | "dependencies": { 1713 | "is-glob": "^4.0.1" 1714 | }, 1715 | "engines": { 1716 | "node": ">= 6" 1717 | } 1718 | }, 1719 | "node_modules/fast-json-stable-stringify": { 1720 | "version": "2.1.0", 1721 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1722 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1723 | "license": "MIT" 1724 | }, 1725 | "node_modules/fast-levenshtein": { 1726 | "version": "2.0.6", 1727 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1728 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1729 | "license": "MIT" 1730 | }, 1731 | "node_modules/fastq": { 1732 | "version": "1.17.1", 1733 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 1734 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 1735 | "license": "ISC", 1736 | "dependencies": { 1737 | "reusify": "^1.0.4" 1738 | } 1739 | }, 1740 | "node_modules/file-entry-cache": { 1741 | "version": "6.0.1", 1742 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1743 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1744 | "license": "MIT", 1745 | "dependencies": { 1746 | "flat-cache": "^3.0.4" 1747 | }, 1748 | "engines": { 1749 | "node": "^10.12.0 || >=12.0.0" 1750 | } 1751 | }, 1752 | "node_modules/fill-range": { 1753 | "version": "7.1.1", 1754 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1755 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1756 | "license": "MIT", 1757 | "dependencies": { 1758 | "to-regex-range": "^5.0.1" 1759 | }, 1760 | "engines": { 1761 | "node": ">=8" 1762 | } 1763 | }, 1764 | "node_modules/find-up": { 1765 | "version": "5.0.0", 1766 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1767 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1768 | "license": "MIT", 1769 | "dependencies": { 1770 | "locate-path": "^6.0.0", 1771 | "path-exists": "^4.0.0" 1772 | }, 1773 | "engines": { 1774 | "node": ">=10" 1775 | }, 1776 | "funding": { 1777 | "url": "https://github.com/sponsors/sindresorhus" 1778 | } 1779 | }, 1780 | "node_modules/flat-cache": { 1781 | "version": "3.2.0", 1782 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", 1783 | "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", 1784 | "license": "MIT", 1785 | "dependencies": { 1786 | "flatted": "^3.2.9", 1787 | "keyv": "^4.5.3", 1788 | "rimraf": "^3.0.2" 1789 | }, 1790 | "engines": { 1791 | "node": "^10.12.0 || >=12.0.0" 1792 | } 1793 | }, 1794 | "node_modules/flatted": { 1795 | "version": "3.3.1", 1796 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", 1797 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", 1798 | "license": "ISC" 1799 | }, 1800 | "node_modules/fs.realpath": { 1801 | "version": "1.0.0", 1802 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1803 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1804 | "license": "ISC" 1805 | }, 1806 | "node_modules/fsevents": { 1807 | "version": "2.3.3", 1808 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1809 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1810 | "dev": true, 1811 | "hasInstallScript": true, 1812 | "license": "MIT", 1813 | "optional": true, 1814 | "os": [ 1815 | "darwin" 1816 | ], 1817 | "engines": { 1818 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1819 | } 1820 | }, 1821 | "node_modules/get-func-name": { 1822 | "version": "2.0.2", 1823 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", 1824 | "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", 1825 | "dev": true, 1826 | "license": "MIT", 1827 | "engines": { 1828 | "node": "*" 1829 | } 1830 | }, 1831 | "node_modules/glob": { 1832 | "version": "7.2.3", 1833 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1834 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1835 | "deprecated": "Glob versions prior to v9 are no longer supported", 1836 | "license": "ISC", 1837 | "dependencies": { 1838 | "fs.realpath": "^1.0.0", 1839 | "inflight": "^1.0.4", 1840 | "inherits": "2", 1841 | "minimatch": "^3.1.1", 1842 | "once": "^1.3.0", 1843 | "path-is-absolute": "^1.0.0" 1844 | }, 1845 | "engines": { 1846 | "node": "*" 1847 | }, 1848 | "funding": { 1849 | "url": "https://github.com/sponsors/isaacs" 1850 | } 1851 | }, 1852 | "node_modules/glob-parent": { 1853 | "version": "6.0.2", 1854 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1855 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1856 | "license": "ISC", 1857 | "dependencies": { 1858 | "is-glob": "^4.0.3" 1859 | }, 1860 | "engines": { 1861 | "node": ">=10.13.0" 1862 | } 1863 | }, 1864 | "node_modules/globals": { 1865 | "version": "15.9.0", 1866 | "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", 1867 | "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", 1868 | "dev": true, 1869 | "license": "MIT", 1870 | "engines": { 1871 | "node": ">=18" 1872 | }, 1873 | "funding": { 1874 | "url": "https://github.com/sponsors/sindresorhus" 1875 | } 1876 | }, 1877 | "node_modules/graphemer": { 1878 | "version": "1.4.0", 1879 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 1880 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 1881 | "license": "MIT" 1882 | }, 1883 | "node_modules/has-flag": { 1884 | "version": "4.0.0", 1885 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1886 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1887 | "license": "MIT", 1888 | "engines": { 1889 | "node": ">=8" 1890 | } 1891 | }, 1892 | "node_modules/ignore": { 1893 | "version": "5.3.2", 1894 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 1895 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 1896 | "license": "MIT", 1897 | "engines": { 1898 | "node": ">= 4" 1899 | } 1900 | }, 1901 | "node_modules/import-fresh": { 1902 | "version": "3.3.0", 1903 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1904 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1905 | "license": "MIT", 1906 | "dependencies": { 1907 | "parent-module": "^1.0.0", 1908 | "resolve-from": "^4.0.0" 1909 | }, 1910 | "engines": { 1911 | "node": ">=6" 1912 | }, 1913 | "funding": { 1914 | "url": "https://github.com/sponsors/sindresorhus" 1915 | } 1916 | }, 1917 | "node_modules/imurmurhash": { 1918 | "version": "0.1.4", 1919 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1920 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1921 | "license": "MIT", 1922 | "engines": { 1923 | "node": ">=0.8.19" 1924 | } 1925 | }, 1926 | "node_modules/inflight": { 1927 | "version": "1.0.6", 1928 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1929 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1930 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 1931 | "license": "ISC", 1932 | "dependencies": { 1933 | "once": "^1.3.0", 1934 | "wrappy": "1" 1935 | } 1936 | }, 1937 | "node_modules/inherits": { 1938 | "version": "2.0.4", 1939 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1940 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1941 | "license": "ISC" 1942 | }, 1943 | "node_modules/is-extglob": { 1944 | "version": "2.1.1", 1945 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1946 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1947 | "license": "MIT", 1948 | "engines": { 1949 | "node": ">=0.10.0" 1950 | } 1951 | }, 1952 | "node_modules/is-glob": { 1953 | "version": "4.0.3", 1954 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1955 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1956 | "license": "MIT", 1957 | "dependencies": { 1958 | "is-extglob": "^2.1.1" 1959 | }, 1960 | "engines": { 1961 | "node": ">=0.10.0" 1962 | } 1963 | }, 1964 | "node_modules/is-number": { 1965 | "version": "7.0.0", 1966 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1967 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1968 | "license": "MIT", 1969 | "engines": { 1970 | "node": ">=0.12.0" 1971 | } 1972 | }, 1973 | "node_modules/is-path-inside": { 1974 | "version": "3.0.3", 1975 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1976 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1977 | "license": "MIT", 1978 | "engines": { 1979 | "node": ">=8" 1980 | } 1981 | }, 1982 | "node_modules/isexe": { 1983 | "version": "2.0.0", 1984 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1985 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1986 | "license": "ISC" 1987 | }, 1988 | "node_modules/js-yaml": { 1989 | "version": "4.1.0", 1990 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1991 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1992 | "license": "MIT", 1993 | "dependencies": { 1994 | "argparse": "^2.0.1" 1995 | }, 1996 | "bin": { 1997 | "js-yaml": "bin/js-yaml.js" 1998 | } 1999 | }, 2000 | "node_modules/json-buffer": { 2001 | "version": "3.0.1", 2002 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 2003 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 2004 | "license": "MIT" 2005 | }, 2006 | "node_modules/json-schema-traverse": { 2007 | "version": "0.4.1", 2008 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2009 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2010 | "license": "MIT" 2011 | }, 2012 | "node_modules/json-stable-stringify-without-jsonify": { 2013 | "version": "1.0.1", 2014 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2015 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2016 | "license": "MIT" 2017 | }, 2018 | "node_modules/keyv": { 2019 | "version": "4.5.4", 2020 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 2021 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 2022 | "license": "MIT", 2023 | "dependencies": { 2024 | "json-buffer": "3.0.1" 2025 | } 2026 | }, 2027 | "node_modules/levn": { 2028 | "version": "0.4.1", 2029 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2030 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2031 | "license": "MIT", 2032 | "dependencies": { 2033 | "prelude-ls": "^1.2.1", 2034 | "type-check": "~0.4.0" 2035 | }, 2036 | "engines": { 2037 | "node": ">= 0.8.0" 2038 | } 2039 | }, 2040 | "node_modules/locate-path": { 2041 | "version": "6.0.0", 2042 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2043 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2044 | "license": "MIT", 2045 | "dependencies": { 2046 | "p-locate": "^5.0.0" 2047 | }, 2048 | "engines": { 2049 | "node": ">=10" 2050 | }, 2051 | "funding": { 2052 | "url": "https://github.com/sponsors/sindresorhus" 2053 | } 2054 | }, 2055 | "node_modules/lodash.merge": { 2056 | "version": "4.6.2", 2057 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2058 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2059 | "license": "MIT" 2060 | }, 2061 | "node_modules/loupe": { 2062 | "version": "3.1.1", 2063 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", 2064 | "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", 2065 | "dev": true, 2066 | "license": "MIT", 2067 | "dependencies": { 2068 | "get-func-name": "^2.0.1" 2069 | } 2070 | }, 2071 | "node_modules/magic-string": { 2072 | "version": "0.30.11", 2073 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", 2074 | "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", 2075 | "dev": true, 2076 | "license": "MIT", 2077 | "dependencies": { 2078 | "@jridgewell/sourcemap-codec": "^1.5.0" 2079 | } 2080 | }, 2081 | "node_modules/merge2": { 2082 | "version": "1.4.1", 2083 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2084 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2085 | "license": "MIT", 2086 | "engines": { 2087 | "node": ">= 8" 2088 | } 2089 | }, 2090 | "node_modules/micromatch": { 2091 | "version": "4.0.8", 2092 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 2093 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 2094 | "license": "MIT", 2095 | "dependencies": { 2096 | "braces": "^3.0.3", 2097 | "picomatch": "^2.3.1" 2098 | }, 2099 | "engines": { 2100 | "node": ">=8.6" 2101 | } 2102 | }, 2103 | "node_modules/minimatch": { 2104 | "version": "3.1.2", 2105 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2106 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2107 | "license": "ISC", 2108 | "dependencies": { 2109 | "brace-expansion": "^1.1.7" 2110 | }, 2111 | "engines": { 2112 | "node": "*" 2113 | } 2114 | }, 2115 | "node_modules/ms": { 2116 | "version": "2.1.3", 2117 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2118 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2119 | "license": "MIT" 2120 | }, 2121 | "node_modules/nanoid": { 2122 | "version": "3.3.7", 2123 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 2124 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 2125 | "dev": true, 2126 | "funding": [ 2127 | { 2128 | "type": "github", 2129 | "url": "https://github.com/sponsors/ai" 2130 | } 2131 | ], 2132 | "license": "MIT", 2133 | "bin": { 2134 | "nanoid": "bin/nanoid.cjs" 2135 | }, 2136 | "engines": { 2137 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2138 | } 2139 | }, 2140 | "node_modules/natural-compare": { 2141 | "version": "1.4.0", 2142 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2143 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2144 | "license": "MIT" 2145 | }, 2146 | "node_modules/once": { 2147 | "version": "1.4.0", 2148 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2149 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2150 | "license": "ISC", 2151 | "dependencies": { 2152 | "wrappy": "1" 2153 | } 2154 | }, 2155 | "node_modules/optionator": { 2156 | "version": "0.9.4", 2157 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 2158 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 2159 | "license": "MIT", 2160 | "dependencies": { 2161 | "deep-is": "^0.1.3", 2162 | "fast-levenshtein": "^2.0.6", 2163 | "levn": "^0.4.1", 2164 | "prelude-ls": "^1.2.1", 2165 | "type-check": "^0.4.0", 2166 | "word-wrap": "^1.2.5" 2167 | }, 2168 | "engines": { 2169 | "node": ">= 0.8.0" 2170 | } 2171 | }, 2172 | "node_modules/p-limit": { 2173 | "version": "3.1.0", 2174 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2175 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2176 | "license": "MIT", 2177 | "dependencies": { 2178 | "yocto-queue": "^0.1.0" 2179 | }, 2180 | "engines": { 2181 | "node": ">=10" 2182 | }, 2183 | "funding": { 2184 | "url": "https://github.com/sponsors/sindresorhus" 2185 | } 2186 | }, 2187 | "node_modules/p-locate": { 2188 | "version": "5.0.0", 2189 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2190 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2191 | "license": "MIT", 2192 | "dependencies": { 2193 | "p-limit": "^3.0.2" 2194 | }, 2195 | "engines": { 2196 | "node": ">=10" 2197 | }, 2198 | "funding": { 2199 | "url": "https://github.com/sponsors/sindresorhus" 2200 | } 2201 | }, 2202 | "node_modules/parent-module": { 2203 | "version": "1.0.1", 2204 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2205 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2206 | "license": "MIT", 2207 | "dependencies": { 2208 | "callsites": "^3.0.0" 2209 | }, 2210 | "engines": { 2211 | "node": ">=6" 2212 | } 2213 | }, 2214 | "node_modules/path-exists": { 2215 | "version": "4.0.0", 2216 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2217 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2218 | "license": "MIT", 2219 | "engines": { 2220 | "node": ">=8" 2221 | } 2222 | }, 2223 | "node_modules/path-is-absolute": { 2224 | "version": "1.0.1", 2225 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2226 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2227 | "license": "MIT", 2228 | "engines": { 2229 | "node": ">=0.10.0" 2230 | } 2231 | }, 2232 | "node_modules/path-key": { 2233 | "version": "3.1.1", 2234 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2235 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2236 | "license": "MIT", 2237 | "engines": { 2238 | "node": ">=8" 2239 | } 2240 | }, 2241 | "node_modules/pathe": { 2242 | "version": "1.1.2", 2243 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", 2244 | "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", 2245 | "dev": true, 2246 | "license": "MIT" 2247 | }, 2248 | "node_modules/pathval": { 2249 | "version": "2.0.0", 2250 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", 2251 | "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", 2252 | "dev": true, 2253 | "license": "MIT", 2254 | "engines": { 2255 | "node": ">= 14.16" 2256 | } 2257 | }, 2258 | "node_modules/picocolors": { 2259 | "version": "1.1.0", 2260 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", 2261 | "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", 2262 | "dev": true, 2263 | "license": "ISC" 2264 | }, 2265 | "node_modules/picomatch": { 2266 | "version": "2.3.1", 2267 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2268 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2269 | "license": "MIT", 2270 | "engines": { 2271 | "node": ">=8.6" 2272 | }, 2273 | "funding": { 2274 | "url": "https://github.com/sponsors/jonschlinkert" 2275 | } 2276 | }, 2277 | "node_modules/postcss": { 2278 | "version": "8.4.47", 2279 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", 2280 | "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", 2281 | "dev": true, 2282 | "funding": [ 2283 | { 2284 | "type": "opencollective", 2285 | "url": "https://opencollective.com/postcss/" 2286 | }, 2287 | { 2288 | "type": "tidelift", 2289 | "url": "https://tidelift.com/funding/github/npm/postcss" 2290 | }, 2291 | { 2292 | "type": "github", 2293 | "url": "https://github.com/sponsors/ai" 2294 | } 2295 | ], 2296 | "license": "MIT", 2297 | "dependencies": { 2298 | "nanoid": "^3.3.7", 2299 | "picocolors": "^1.1.0", 2300 | "source-map-js": "^1.2.1" 2301 | }, 2302 | "engines": { 2303 | "node": "^10 || ^12 || >=14" 2304 | } 2305 | }, 2306 | "node_modules/prelude-ls": { 2307 | "version": "1.2.1", 2308 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2309 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2310 | "license": "MIT", 2311 | "engines": { 2312 | "node": ">= 0.8.0" 2313 | } 2314 | }, 2315 | "node_modules/punycode": { 2316 | "version": "2.3.1", 2317 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2318 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2319 | "license": "MIT", 2320 | "engines": { 2321 | "node": ">=6" 2322 | } 2323 | }, 2324 | "node_modules/queue-microtask": { 2325 | "version": "1.2.3", 2326 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2327 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2328 | "funding": [ 2329 | { 2330 | "type": "github", 2331 | "url": "https://github.com/sponsors/feross" 2332 | }, 2333 | { 2334 | "type": "patreon", 2335 | "url": "https://www.patreon.com/feross" 2336 | }, 2337 | { 2338 | "type": "consulting", 2339 | "url": "https://feross.org/support" 2340 | } 2341 | ], 2342 | "license": "MIT" 2343 | }, 2344 | "node_modules/resolve-from": { 2345 | "version": "4.0.0", 2346 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2347 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2348 | "license": "MIT", 2349 | "engines": { 2350 | "node": ">=4" 2351 | } 2352 | }, 2353 | "node_modules/reusify": { 2354 | "version": "1.0.4", 2355 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2356 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2357 | "license": "MIT", 2358 | "engines": { 2359 | "iojs": ">=1.0.0", 2360 | "node": ">=0.10.0" 2361 | } 2362 | }, 2363 | "node_modules/rimraf": { 2364 | "version": "3.0.2", 2365 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2366 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2367 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 2368 | "license": "ISC", 2369 | "dependencies": { 2370 | "glob": "^7.1.3" 2371 | }, 2372 | "bin": { 2373 | "rimraf": "bin.js" 2374 | }, 2375 | "funding": { 2376 | "url": "https://github.com/sponsors/isaacs" 2377 | } 2378 | }, 2379 | "node_modules/rollup": { 2380 | "version": "4.22.4", 2381 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", 2382 | "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", 2383 | "dev": true, 2384 | "license": "MIT", 2385 | "dependencies": { 2386 | "@types/estree": "1.0.5" 2387 | }, 2388 | "bin": { 2389 | "rollup": "dist/bin/rollup" 2390 | }, 2391 | "engines": { 2392 | "node": ">=18.0.0", 2393 | "npm": ">=8.0.0" 2394 | }, 2395 | "optionalDependencies": { 2396 | "@rollup/rollup-android-arm-eabi": "4.22.4", 2397 | "@rollup/rollup-android-arm64": "4.22.4", 2398 | "@rollup/rollup-darwin-arm64": "4.22.4", 2399 | "@rollup/rollup-darwin-x64": "4.22.4", 2400 | "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", 2401 | "@rollup/rollup-linux-arm-musleabihf": "4.22.4", 2402 | "@rollup/rollup-linux-arm64-gnu": "4.22.4", 2403 | "@rollup/rollup-linux-arm64-musl": "4.22.4", 2404 | "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", 2405 | "@rollup/rollup-linux-riscv64-gnu": "4.22.4", 2406 | "@rollup/rollup-linux-s390x-gnu": "4.22.4", 2407 | "@rollup/rollup-linux-x64-gnu": "4.22.4", 2408 | "@rollup/rollup-linux-x64-musl": "4.22.4", 2409 | "@rollup/rollup-win32-arm64-msvc": "4.22.4", 2410 | "@rollup/rollup-win32-ia32-msvc": "4.22.4", 2411 | "@rollup/rollup-win32-x64-msvc": "4.22.4", 2412 | "fsevents": "~2.3.2" 2413 | } 2414 | }, 2415 | "node_modules/rollup/node_modules/@types/estree": { 2416 | "version": "1.0.5", 2417 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 2418 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 2419 | "dev": true, 2420 | "license": "MIT" 2421 | }, 2422 | "node_modules/run-parallel": { 2423 | "version": "1.2.0", 2424 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2425 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2426 | "funding": [ 2427 | { 2428 | "type": "github", 2429 | "url": "https://github.com/sponsors/feross" 2430 | }, 2431 | { 2432 | "type": "patreon", 2433 | "url": "https://www.patreon.com/feross" 2434 | }, 2435 | { 2436 | "type": "consulting", 2437 | "url": "https://feross.org/support" 2438 | } 2439 | ], 2440 | "license": "MIT", 2441 | "dependencies": { 2442 | "queue-microtask": "^1.2.2" 2443 | } 2444 | }, 2445 | "node_modules/semver": { 2446 | "version": "7.6.3", 2447 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 2448 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 2449 | "license": "ISC", 2450 | "bin": { 2451 | "semver": "bin/semver.js" 2452 | }, 2453 | "engines": { 2454 | "node": ">=10" 2455 | } 2456 | }, 2457 | "node_modules/shebang-command": { 2458 | "version": "2.0.0", 2459 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2460 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2461 | "license": "MIT", 2462 | "dependencies": { 2463 | "shebang-regex": "^3.0.0" 2464 | }, 2465 | "engines": { 2466 | "node": ">=8" 2467 | } 2468 | }, 2469 | "node_modules/shebang-regex": { 2470 | "version": "3.0.0", 2471 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2472 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2473 | "license": "MIT", 2474 | "engines": { 2475 | "node": ">=8" 2476 | } 2477 | }, 2478 | "node_modules/siginfo": { 2479 | "version": "2.0.0", 2480 | "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 2481 | "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 2482 | "dev": true, 2483 | "license": "ISC" 2484 | }, 2485 | "node_modules/source-map-js": { 2486 | "version": "1.2.1", 2487 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2488 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2489 | "dev": true, 2490 | "license": "BSD-3-Clause", 2491 | "engines": { 2492 | "node": ">=0.10.0" 2493 | } 2494 | }, 2495 | "node_modules/stackback": { 2496 | "version": "0.0.2", 2497 | "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 2498 | "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 2499 | "dev": true, 2500 | "license": "MIT" 2501 | }, 2502 | "node_modules/std-env": { 2503 | "version": "3.7.0", 2504 | "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", 2505 | "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", 2506 | "dev": true, 2507 | "license": "MIT" 2508 | }, 2509 | "node_modules/strip-ansi": { 2510 | "version": "6.0.1", 2511 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2512 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2513 | "license": "MIT", 2514 | "dependencies": { 2515 | "ansi-regex": "^5.0.1" 2516 | }, 2517 | "engines": { 2518 | "node": ">=8" 2519 | } 2520 | }, 2521 | "node_modules/strip-json-comments": { 2522 | "version": "3.1.1", 2523 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2524 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2525 | "license": "MIT", 2526 | "engines": { 2527 | "node": ">=8" 2528 | }, 2529 | "funding": { 2530 | "url": "https://github.com/sponsors/sindresorhus" 2531 | } 2532 | }, 2533 | "node_modules/supports-color": { 2534 | "version": "7.2.0", 2535 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2536 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2537 | "license": "MIT", 2538 | "dependencies": { 2539 | "has-flag": "^4.0.0" 2540 | }, 2541 | "engines": { 2542 | "node": ">=8" 2543 | } 2544 | }, 2545 | "node_modules/text-table": { 2546 | "version": "0.2.0", 2547 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2548 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 2549 | "license": "MIT" 2550 | }, 2551 | "node_modules/tinybench": { 2552 | "version": "2.9.0", 2553 | "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", 2554 | "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", 2555 | "dev": true, 2556 | "license": "MIT" 2557 | }, 2558 | "node_modules/tinyexec": { 2559 | "version": "0.3.0", 2560 | "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", 2561 | "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", 2562 | "dev": true, 2563 | "license": "MIT" 2564 | }, 2565 | "node_modules/tinypool": { 2566 | "version": "1.0.1", 2567 | "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", 2568 | "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", 2569 | "dev": true, 2570 | "license": "MIT", 2571 | "engines": { 2572 | "node": "^18.0.0 || >=20.0.0" 2573 | } 2574 | }, 2575 | "node_modules/tinyrainbow": { 2576 | "version": "1.2.0", 2577 | "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", 2578 | "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", 2579 | "dev": true, 2580 | "license": "MIT", 2581 | "engines": { 2582 | "node": ">=14.0.0" 2583 | } 2584 | }, 2585 | "node_modules/tinyspy": { 2586 | "version": "3.0.2", 2587 | "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", 2588 | "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", 2589 | "dev": true, 2590 | "license": "MIT", 2591 | "engines": { 2592 | "node": ">=14.0.0" 2593 | } 2594 | }, 2595 | "node_modules/to-regex-range": { 2596 | "version": "5.0.1", 2597 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2598 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2599 | "license": "MIT", 2600 | "dependencies": { 2601 | "is-number": "^7.0.0" 2602 | }, 2603 | "engines": { 2604 | "node": ">=8.0" 2605 | } 2606 | }, 2607 | "node_modules/ts-api-utils": { 2608 | "version": "1.3.0", 2609 | "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", 2610 | "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", 2611 | "license": "MIT", 2612 | "engines": { 2613 | "node": ">=16" 2614 | }, 2615 | "peerDependencies": { 2616 | "typescript": ">=4.2.0" 2617 | } 2618 | }, 2619 | "node_modules/type-check": { 2620 | "version": "0.4.0", 2621 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2622 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2623 | "license": "MIT", 2624 | "dependencies": { 2625 | "prelude-ls": "^1.2.1" 2626 | }, 2627 | "engines": { 2628 | "node": ">= 0.8.0" 2629 | } 2630 | }, 2631 | "node_modules/type-fest": { 2632 | "version": "0.20.2", 2633 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 2634 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 2635 | "license": "(MIT OR CC0-1.0)", 2636 | "engines": { 2637 | "node": ">=10" 2638 | }, 2639 | "funding": { 2640 | "url": "https://github.com/sponsors/sindresorhus" 2641 | } 2642 | }, 2643 | "node_modules/typescript": { 2644 | "version": "5.6.2", 2645 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", 2646 | "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", 2647 | "license": "Apache-2.0", 2648 | "bin": { 2649 | "tsc": "bin/tsc", 2650 | "tsserver": "bin/tsserver" 2651 | }, 2652 | "engines": { 2653 | "node": ">=14.17" 2654 | } 2655 | }, 2656 | "node_modules/typescript-eslint": { 2657 | "version": "8.7.0", 2658 | "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.7.0.tgz", 2659 | "integrity": "sha512-nEHbEYJyHwsuf7c3V3RS7Saq+1+la3i0ieR3qP0yjqWSzVmh8Drp47uOl9LjbPANac4S7EFSqvcYIKXUUwIfIQ==", 2660 | "dev": true, 2661 | "license": "MIT", 2662 | "dependencies": { 2663 | "@typescript-eslint/eslint-plugin": "8.7.0", 2664 | "@typescript-eslint/parser": "8.7.0", 2665 | "@typescript-eslint/utils": "8.7.0" 2666 | }, 2667 | "engines": { 2668 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2669 | }, 2670 | "funding": { 2671 | "type": "opencollective", 2672 | "url": "https://opencollective.com/typescript-eslint" 2673 | }, 2674 | "peerDependenciesMeta": { 2675 | "typescript": { 2676 | "optional": true 2677 | } 2678 | } 2679 | }, 2680 | "node_modules/undici-types": { 2681 | "version": "6.19.8", 2682 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 2683 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 2684 | "dev": true, 2685 | "license": "MIT" 2686 | }, 2687 | "node_modules/uri-js": { 2688 | "version": "4.4.1", 2689 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2690 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2691 | "license": "BSD-2-Clause", 2692 | "dependencies": { 2693 | "punycode": "^2.1.0" 2694 | } 2695 | }, 2696 | "node_modules/vite": { 2697 | "version": "5.4.8", 2698 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", 2699 | "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", 2700 | "dev": true, 2701 | "license": "MIT", 2702 | "dependencies": { 2703 | "esbuild": "^0.21.3", 2704 | "postcss": "^8.4.43", 2705 | "rollup": "^4.20.0" 2706 | }, 2707 | "bin": { 2708 | "vite": "bin/vite.js" 2709 | }, 2710 | "engines": { 2711 | "node": "^18.0.0 || >=20.0.0" 2712 | }, 2713 | "funding": { 2714 | "url": "https://github.com/vitejs/vite?sponsor=1" 2715 | }, 2716 | "optionalDependencies": { 2717 | "fsevents": "~2.3.3" 2718 | }, 2719 | "peerDependencies": { 2720 | "@types/node": "^18.0.0 || >=20.0.0", 2721 | "less": "*", 2722 | "lightningcss": "^1.21.0", 2723 | "sass": "*", 2724 | "sass-embedded": "*", 2725 | "stylus": "*", 2726 | "sugarss": "*", 2727 | "terser": "^5.4.0" 2728 | }, 2729 | "peerDependenciesMeta": { 2730 | "@types/node": { 2731 | "optional": true 2732 | }, 2733 | "less": { 2734 | "optional": true 2735 | }, 2736 | "lightningcss": { 2737 | "optional": true 2738 | }, 2739 | "sass": { 2740 | "optional": true 2741 | }, 2742 | "sass-embedded": { 2743 | "optional": true 2744 | }, 2745 | "stylus": { 2746 | "optional": true 2747 | }, 2748 | "sugarss": { 2749 | "optional": true 2750 | }, 2751 | "terser": { 2752 | "optional": true 2753 | } 2754 | } 2755 | }, 2756 | "node_modules/vite-node": { 2757 | "version": "2.1.1", 2758 | "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.1.tgz", 2759 | "integrity": "sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==", 2760 | "dev": true, 2761 | "license": "MIT", 2762 | "dependencies": { 2763 | "cac": "^6.7.14", 2764 | "debug": "^4.3.6", 2765 | "pathe": "^1.1.2", 2766 | "vite": "^5.0.0" 2767 | }, 2768 | "bin": { 2769 | "vite-node": "vite-node.mjs" 2770 | }, 2771 | "engines": { 2772 | "node": "^18.0.0 || >=20.0.0" 2773 | }, 2774 | "funding": { 2775 | "url": "https://opencollective.com/vitest" 2776 | } 2777 | }, 2778 | "node_modules/vitest": { 2779 | "version": "2.1.1", 2780 | "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz", 2781 | "integrity": "sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==", 2782 | "dev": true, 2783 | "license": "MIT", 2784 | "dependencies": { 2785 | "@vitest/expect": "2.1.1", 2786 | "@vitest/mocker": "2.1.1", 2787 | "@vitest/pretty-format": "^2.1.1", 2788 | "@vitest/runner": "2.1.1", 2789 | "@vitest/snapshot": "2.1.1", 2790 | "@vitest/spy": "2.1.1", 2791 | "@vitest/utils": "2.1.1", 2792 | "chai": "^5.1.1", 2793 | "debug": "^4.3.6", 2794 | "magic-string": "^0.30.11", 2795 | "pathe": "^1.1.2", 2796 | "std-env": "^3.7.0", 2797 | "tinybench": "^2.9.0", 2798 | "tinyexec": "^0.3.0", 2799 | "tinypool": "^1.0.0", 2800 | "tinyrainbow": "^1.2.0", 2801 | "vite": "^5.0.0", 2802 | "vite-node": "2.1.1", 2803 | "why-is-node-running": "^2.3.0" 2804 | }, 2805 | "bin": { 2806 | "vitest": "vitest.mjs" 2807 | }, 2808 | "engines": { 2809 | "node": "^18.0.0 || >=20.0.0" 2810 | }, 2811 | "funding": { 2812 | "url": "https://opencollective.com/vitest" 2813 | }, 2814 | "peerDependencies": { 2815 | "@edge-runtime/vm": "*", 2816 | "@types/node": "^18.0.0 || >=20.0.0", 2817 | "@vitest/browser": "2.1.1", 2818 | "@vitest/ui": "2.1.1", 2819 | "happy-dom": "*", 2820 | "jsdom": "*" 2821 | }, 2822 | "peerDependenciesMeta": { 2823 | "@edge-runtime/vm": { 2824 | "optional": true 2825 | }, 2826 | "@types/node": { 2827 | "optional": true 2828 | }, 2829 | "@vitest/browser": { 2830 | "optional": true 2831 | }, 2832 | "@vitest/ui": { 2833 | "optional": true 2834 | }, 2835 | "happy-dom": { 2836 | "optional": true 2837 | }, 2838 | "jsdom": { 2839 | "optional": true 2840 | } 2841 | } 2842 | }, 2843 | "node_modules/which": { 2844 | "version": "2.0.2", 2845 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2846 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2847 | "license": "ISC", 2848 | "dependencies": { 2849 | "isexe": "^2.0.0" 2850 | }, 2851 | "bin": { 2852 | "node-which": "bin/node-which" 2853 | }, 2854 | "engines": { 2855 | "node": ">= 8" 2856 | } 2857 | }, 2858 | "node_modules/why-is-node-running": { 2859 | "version": "2.3.0", 2860 | "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", 2861 | "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", 2862 | "dev": true, 2863 | "license": "MIT", 2864 | "dependencies": { 2865 | "siginfo": "^2.0.0", 2866 | "stackback": "0.0.2" 2867 | }, 2868 | "bin": { 2869 | "why-is-node-running": "cli.js" 2870 | }, 2871 | "engines": { 2872 | "node": ">=8" 2873 | } 2874 | }, 2875 | "node_modules/word-wrap": { 2876 | "version": "1.2.5", 2877 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 2878 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 2879 | "license": "MIT", 2880 | "engines": { 2881 | "node": ">=0.10.0" 2882 | } 2883 | }, 2884 | "node_modules/wrappy": { 2885 | "version": "1.0.2", 2886 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2887 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2888 | "license": "ISC" 2889 | }, 2890 | "node_modules/yocto-queue": { 2891 | "version": "0.1.0", 2892 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2893 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2894 | "license": "MIT", 2895 | "engines": { 2896 | "node": ">=10" 2897 | }, 2898 | "funding": { 2899 | "url": "https://github.com/sponsors/sindresorhus" 2900 | } 2901 | } 2902 | } 2903 | } 2904 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint-plugin-enforce-angular-signal-call", 3 | "version": "1.0.9", 4 | "scripts": { 5 | "test": "vitest", 6 | "build": "tsc", 7 | "update:eslint-docs": "npm run build && npx eslint-doc-generator", 8 | "deploy": "npm run build && npm publish" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "MIT", 13 | "description": "An eslint plugin that enforces Angular signals to be called via their getter", 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/HaasStefan/eslint-plugin-enforce-angular-signal-call.git" 17 | }, 18 | "dependencies": { 19 | }, 20 | "peerDependencies": { 21 | "@typescript-eslint/utils": "^8.7.0", 22 | "eslint": "^8.57.1", 23 | "typescript-eslint": "^8.7.0" 24 | }, 25 | "exports": { 26 | ".": { 27 | "types": "./lib/index.d.ts", 28 | "default": "./lib/index.js" 29 | } 30 | }, 31 | "main": "lib/index.js", 32 | "devDependencies": { 33 | "@eslint/js": "^9.11.1", 34 | "@types/eslint": "^9.6.1", 35 | "@types/eslint__js": "^8.42.3", 36 | "@types/node": "^22.0.2", 37 | "@typescript-eslint/rule-tester": "^8.7.0", 38 | "@typescript-eslint/utils": "^8.7.0", 39 | "eslint": "^8.57.1", 40 | "globals": "^15.9.0", 41 | "typescript": "^5.6.2", 42 | "typescript-eslint": "^8.7.0", 43 | "vitest": "^2.1.1" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { enforceAngularSignalCallRule } from "./rules/enforce-angular-signal-call"; 2 | 3 | export const rules = { 4 | "enforce-angular-signal-call": enforceAngularSignalCallRule, 5 | }; 6 | -------------------------------------------------------------------------------- /src/rules/enforce-angular-signal-call.test.ts: -------------------------------------------------------------------------------- 1 | import {RuleTester} from "@typescript-eslint/rule-tester"; 2 | import {enforceAngularSignalCallRule} from "./enforce-angular-signal-call"; 3 | import * as vitest from "vitest"; 4 | import path from "node:path"; 5 | import tseslint from "typescript-eslint"; 6 | 7 | RuleTester.afterAll = vitest.afterAll; 8 | RuleTester.it = vitest.it; 9 | RuleTester.itOnly = vitest.it.only; 10 | RuleTester.describe = vitest.describe; 11 | 12 | const ruleTester = new RuleTester({ 13 | languageOptions: { 14 | parser: tseslint.parser, 15 | parserOptions: { 16 | projectService: { 17 | allowDefaultProject: ["*.ts*"], 18 | defaultProject: "tsconfig.json", 19 | }, 20 | tsconfigRootDir: path.join(__dirname, "../.."), 21 | }, 22 | }, 23 | }); 24 | 25 | ruleTester.run("enforce-angular-signal-call", enforceAngularSignalCallRule, { 26 | valid: [ 27 | { 28 | code: ` 29 | import {WritableSignal, signal} from "@angular/core"; 30 | 31 | let x: WritableSignal = signal("init"); 32 | 33 | x.set("hello"); 34 | ` 35 | }, 36 | { 37 | code: ` 38 | import {WritableSignal, signal} from "@angular/core"; 39 | 40 | let x: WritableSignal = signal("init"); 41 | 42 | x.update("hello"); 43 | ` 44 | }, 45 | { 46 | code: ` 47 | import {WritableSignal, signal} from "@angular/core"; 48 | 49 | class HelloWorld { 50 | x: WritableSignal = signal("init"); 51 | 52 | constructor() { 53 | this.x.set("hello"); 54 | } 55 | } 56 | ` 57 | }, 58 | { 59 | code: ` 60 | import {WritableSignal, signal} from "@angular/core"; 61 | 62 | class HelloWorld { 63 | x: { y: WritableSignal } = { y: signal("init") }; 64 | 65 | constructor() { 66 | this.x.y.set("hello"); 67 | } 68 | } 69 | ` 70 | }, 71 | { 72 | code: ` 73 | import {WritableSignal, signal, effect, untracked} from "@angular/core"; 74 | 75 | class HelloWorld { 76 | x: WritableSignal = signal("init"); 77 | 78 | constructor() { 79 | effect(() => { 80 | console.log(untracked(this.x)); 81 | }); 82 | } 83 | } 84 | ` 85 | }, 86 | { 87 | code: ` 88 | import {WritableSignal, signal, computed} from "@angular/core"; 89 | 90 | class Progress { 91 | readonly mode: WritableSignal = signal(null); 92 | readonly isBusy = computed(() => this.mode() !== null); 93 | } 94 | ` 95 | }, 96 | { 97 | code: ` 98 | import {WritableSignal, signal} from "@angular/core"; 99 | 100 | class Test { 101 | private readonly x: WritableSignal = signal("init"); 102 | 103 | readonly y = this.x; 104 | } 105 | ` 106 | }, 107 | { 108 | code: ` 109 | import {WritableSignal, signal} from "@angular/core"; 110 | 111 | const x: WritableSignal = signal("init"); 112 | const y: { z: WritableSignal } = { z: x }; 113 | ` 114 | }, 115 | { 116 | code: ` 117 | import {WritableSignal, signal} from "@angular/core"; 118 | class Test { 119 | readonly x: WritableSignal = signal("init"); 120 | readonly y: { z: WritableSignal } = { z: this.x }; 121 | } 122 | ` 123 | }, 124 | { 125 | code: ` 126 | import {WritableSignal, signal} from "@angular/core"; 127 | 128 | function foo(x: WritableSignal) { 129 | console.log(x()); 130 | } 131 | 132 | class Test { 133 | y: WritableSignal = signal("init"); 134 | 135 | 136 | constructor() { 137 | foo(this.y); 138 | } 139 | } 140 | ` 141 | }, 142 | { 143 | code: ` 144 | import {WritableSignal, signal} from "@angular/core"; 145 | 146 | function foo(x: WritableSignal) { 147 | console.log(x()); 148 | } 149 | 150 | let y: WritableSignal = signal("init"); 151 | 152 | foo(y); 153 | ` 154 | }, 155 | { 156 | code: ` 157 | 158 | import {WritableSignal, signal} from "@angular/core"; 159 | 160 | class Test { 161 | something: WritableSignal; 162 | 163 | constructor() { 164 | this.something = signal(undefined); 165 | } 166 | 167 | } 168 | ` 169 | }, 170 | { 171 | code: ` 172 | import {WritableSignal, signal} from "@angular/core"; 173 | 174 | let x: { y: WritableSignal } = { }; 175 | 176 | x.y = signal("init"); 177 | x.y.set("hello"); 178 | ` 179 | } 180 | 181 | ], 182 | invalid: [ 183 | { 184 | name: 'x = "hello"', 185 | code: ` 186 | import {WritableSignal, signal} from "@angular/core"; 187 | 188 | let x: WritableSignal = signal("init"); 189 | x = "hello"; 190 | `, // Invalid case where signal is accessed but not called 191 | errors: [{messageId: 'enforceAngularSignalCall'}], 192 | }, 193 | { 194 | name: 'class console.log(this.x)', 195 | code: ` 196 | import {WritableSignal, signal} from "@angular/core"; 197 | 198 | class Test { 199 | x: WritableSignal = signal("init"); 200 | 201 | constructor() { 202 | console.log(this.x); 203 | } 204 | } 205 | `, // Invalid case where signal is accessed but not called 206 | errors: [{messageId: 'enforceAngularSignalCall'}], 207 | }, 208 | { 209 | name: 'console.log(x)', 210 | code: ` 211 | import {WritableSignal, signal} from "@angular/core"; 212 | 213 | let x: WritableSignal = signal("init"); 214 | 215 | console.log(x); 216 | `, // Invalid case where signal is accessed but not called 217 | errors: [{messageId: 'enforceAngularSignalCall'}], 218 | }, 219 | { 220 | name: 'let y = computed(() => x)', 221 | code: ` 222 | import {WritableSignal, signal, computed} from "@angular/core"; 223 | 224 | let x: WritableSignal = signal("init"); 225 | let y = computed(() => x); 226 | `, // Invalid case where signal is accessed but not called 227 | errors: [{messageId: 'enforceAngularSignalCall'}], 228 | }, 229 | { 230 | name: 'const y = mySignal', 231 | code: ` 232 | import {WritableSignal, signal} from "@angular/core"; 233 | 234 | let x: WritableSignal = signal("init"); 235 | 236 | (() => { 237 | const y = x; 238 | })(); 239 | `, // Invalid case where signal is accessed but not called 240 | errors: [{messageId: 'enforceAngularSignalCall'}], 241 | }, 242 | { 243 | name: 'foo(x)', 244 | code: ` 245 | import {WritableSignal, signal} from "@angular/core"; 246 | 247 | function foo(x: string) { 248 | console.log(x()); 249 | } 250 | 251 | let x: WritableSignal = signal("init"); 252 | 253 | foo(x); 254 | `, 255 | errors: [{messageId: 'enforceAngularSignalCall'}], 256 | }, 257 | ], 258 | }); 259 | -------------------------------------------------------------------------------- /src/rules/enforce-angular-signal-call.ts: -------------------------------------------------------------------------------- 1 | import { ESLintUtils, TSESTree } from '@typescript-eslint/utils'; 2 | 3 | const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/HaasStefan/eslint-plugin-enforce-angular-signal-call/tree/master/docs/rules/${name}.md`); 4 | 5 | export const enforceAngularSignalCallRule = createRule({ 6 | name: 'enforce-angular-signal-call', 7 | meta: { 8 | type: 'suggestion', 9 | docs: { 10 | description: 'Enforce that Angular signals are called with the getter', 11 | }, 12 | messages: { 13 | enforceAngularSignalCall: 'An Angular signal should be called with its getter method', 14 | }, 15 | schema: [], // No options 16 | }, 17 | defaultOptions: [], 18 | create(context) { 19 | const { sourceCode } = context; 20 | const services = sourceCode.parserServices; 21 | 22 | if (!services || !services.program || !services.esTreeNodeToTSNodeMap) { 23 | return {}; 24 | } 25 | 26 | const checker = services.program.getTypeChecker(); 27 | 28 | return { 29 | Identifier(node: TSESTree.Identifier) { 30 | const variableNode = services.esTreeNodeToTSNodeMap?.get(node); 31 | 32 | if (variableNode) { 33 | const type = checker.getTypeAtLocation(variableNode); 34 | const typeName = checker.typeToString(type); 35 | 36 | if (isSignal(typeName)) { 37 | handleSignalNode(node, context, services, checker); 38 | } 39 | } 40 | } 41 | }; 42 | }, 43 | }); 44 | 45 | type Signal = `Signal<${string}>` | `WritableSignal<${string}>` | `InputSignal<${string}>`; 46 | 47 | function isSignal(type: string): type is Signal { 48 | const withoutGeneric = type.split('<')[0]; 49 | return !!withoutGeneric && ["Signal", "WritableSignal", "InputSignal"].includes(withoutGeneric); 50 | } 51 | 52 | function handleSignalNode( 53 | node: TSESTree.Identifier, 54 | context: any, 55 | services: any, 56 | checker: any 57 | ) { 58 | const parent = node.parent; 59 | 60 | if (parent.type === 'AssignmentExpression') { 61 | reportSignalCall(context, node); 62 | } else if (parent.type === 'MemberExpression') { 63 | handleMemberExpression(node, context, services, checker); 64 | } else if (parent.type === 'CallExpression' && !(parent.callee.type === 'Identifier' && parent.callee.name === node.name)) { 65 | checkCallExpression(parent, context, services, checker, node); 66 | } else if (parent.type === 'ArrowFunctionExpression' || (parent.type === 'VariableDeclarator' && parent.init && parent.init.type === 'Identifier' && parent.init.name === node.name)) { 67 | reportSignalCall(context, node); 68 | } 69 | } 70 | 71 | function handleMemberExpression( 72 | node: TSESTree.Identifier, 73 | context: any, 74 | services: any, 75 | checker: any 76 | ) { 77 | const outerParent = visitAllMemberExpressionsAndGetParent(node); 78 | 79 | if (outerParent.type === 'PropertyDefinition') return; 80 | 81 | if (outerParent.type === 'AssignmentExpression' && outerParent.right.type === 'CallExpression' && isSignalAssignment(outerParent.right)) return; 82 | 83 | if (outerParent.type === 'Property') { 84 | const keyNode = outerParent.key; 85 | if (keyNode.type === 'Identifier') { 86 | const keyTsNode = services.esTreeNodeToTSNodeMap?.get(keyNode); 87 | if (keyTsNode) { 88 | const keyType = checker.getTypeAtLocation(keyTsNode); 89 | if (isSignal(checker.typeToString(keyType))) { 90 | return; 91 | } 92 | } 93 | } 94 | return; 95 | } 96 | 97 | if (outerParent.type === 'CallExpression') { 98 | checkCallExpression(outerParent, context, services, checker, node); 99 | } else { 100 | reportSignalCall(context, node); 101 | } 102 | } 103 | 104 | function checkCallExpression( 105 | parent: TSESTree.Node, 106 | context: any, 107 | services: any, 108 | checker: any, 109 | node: TSESTree.Identifier 110 | ) { 111 | if (parent.type !== 'CallExpression') return; 112 | 113 | if (parent.callee.type === 'Identifier' && parent.callee.name === 'untracked') { 114 | return; 115 | } 116 | 117 | if (parent.callee.type === 'Identifier' || parent.callee.type === 'MemberExpression') { 118 | const calleeTsNode = services.esTreeNodeToTSNodeMap?.get(parent.callee); 119 | 120 | if (calleeTsNode) { 121 | const calleeType = checker.getTypeAtLocation(calleeTsNode); 122 | const signatures = calleeType.getCallSignatures(); 123 | 124 | if (signatures.length > 0) { 125 | const signature = signatures[0]; 126 | 127 | if (signature.parameters.length > 0 && parent.arguments.length > 0) { 128 | for (let i = 0; i < Math.min(signature.parameters.length, parent.arguments.length); i++) { 129 | const paramSymbol = signature.parameters[i]; 130 | const arg = parent.arguments[i]; 131 | const argTsNode = services.esTreeNodeToTSNodeMap?.get(arg); 132 | 133 | if (argTsNode) { 134 | const argType = checker.getTypeAtLocation(argTsNode); 135 | const paramType = checker.getTypeOfSymbolAtLocation(paramSymbol, calleeTsNode); 136 | const paramTypeName = checker.typeToString(paramType); 137 | 138 | if (!isSignal(paramTypeName) && isSignal(checker.typeToString(argType))) { 139 | reportSignalCall(context, node); 140 | return; 141 | } 142 | } 143 | } 144 | } 145 | } 146 | } 147 | } 148 | } 149 | 150 | function reportSignalCall(context: any, node: TSESTree.Identifier) { 151 | context.report({ 152 | node: node, 153 | messageId: 'enforceAngularSignalCall', 154 | }); 155 | } 156 | 157 | function visitAllMemberExpressionsAndGetParent(node: TSESTree.Identifier) { 158 | let parent = node.parent; 159 | while (parent.type === 'MemberExpression') { 160 | parent = parent.parent; 161 | } 162 | return parent; 163 | } 164 | 165 | function isSignalAssignment(node: TSESTree.CallExpression) { 166 | return node.callee.type === 'Identifier' && node.callee.name === 'signal'; 167 | } 168 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "es2016" 15 | /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, 16 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 17 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 18 | // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ 19 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 20 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 21 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 22 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 23 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 24 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 25 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 26 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 27 | 28 | /* Modules */ 29 | "module": "NodeNext" 30 | /* Specify what module code is generated. */, 31 | // "rootDir": "./", /* Specify the root folder within your source files. */ 32 | // "moduleResolution": "", 33 | /* Specify how TypeScript looks up a file from a given module specifier. */ 34 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 35 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 36 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 37 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 38 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 39 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 40 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 41 | // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ 42 | // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ 43 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ 44 | // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ 45 | // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ 46 | // "resolveJsonModule": true, /* Enable importing .json files. */ 47 | // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ 48 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 49 | 50 | /* JavaScript Support */ 51 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 52 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 53 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 54 | 55 | /* Emit */ 56 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 57 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 58 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 59 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 60 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 61 | // "noEmit": true, /* Disable emitting files from a compilation. */ 62 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 63 | "outDir": "lib" 64 | /* Specify an output folder for all emitted files. */, 65 | // "removeComments": true, /* Disable emitting comments. */ 66 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 67 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 68 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 69 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 70 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 71 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 72 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 73 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 74 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 75 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 76 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 77 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 78 | 79 | /* Interop Constraints */ 80 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 81 | // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ 82 | // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ 83 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 84 | "esModuleInterop": true 85 | /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, 86 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 87 | "forceConsistentCasingInFileNames": true 88 | /* Ensure that casing is correct in imports. */, 89 | /* Type Checking */ 90 | "strict": true 91 | /* Enable all strict type-checking options. */, 92 | "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 93 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 94 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 95 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 96 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 97 | // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ 98 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 99 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 100 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 101 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 102 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 103 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 104 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 105 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 106 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 107 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 108 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 109 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 110 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 111 | 112 | /* Completeness */ 113 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 114 | "skipLibCheck": true, 115 | /* Skip type checking all .d.ts files. */ 116 | 117 | "types": ["vitest/globals"] 118 | 119 | }, 120 | "include": [ 121 | "src/**/*.ts" 122 | ], 123 | "exclude": [ 124 | "node_modules", 125 | "lib" 126 | ] 127 | } 128 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vitest/config"; 2 | 3 | export default defineConfig({ 4 | test: { 5 | include: ["src/**/*.test.ts"], 6 | exclude: ["lib"], 7 | globals: true 8 | }, 9 | }); 10 | --------------------------------------------------------------------------------