Procedurally generates a radio weather report

tests for voice

+33
.github/workflows/test.yml
··· 1 + name: NPM Audit Check 2 + 3 + on: 4 + push: 5 + branches: [ master ] 6 + pull_request: 7 + branches: [ master ] 8 + schedule: 9 + - cron: '15 16 * * 5' 10 + 11 + jobs: 12 + 13 + npm_audit: 14 + name: Check NPM audit 15 + runs-on: ubuntu-latest 16 + timeout-minutes: 20 17 + strategy: 18 + fail-fast: true 19 + permissions: 20 + contents: read 21 + 22 + steps: 23 + - name: Checkout repository 24 + uses: https://github.com/actions/checkout@v4 25 + 26 + - name: Setup nodejs 27 + uses: https://github.com/actions/setup-node@v4 28 + 29 + - name: Install dependencies 30 + run: npm ci 31 + 32 + - run: npm test 33 + name: Run tests
+1
.gitignore
··· 102 102 config/config.json5 103 103 distribution/ 104 104 .env 105 + test/*.js*
+1496 -1
package-lock.json
··· 14 14 }, 15 15 "devDependencies": { 16 16 "@types/node": "24.3.0", 17 - "typescript": "5.9.2" 17 + "typescript": "5.9.2", 18 + "vitest": "3.2.4" 19 + } 20 + }, 21 + "node_modules/@esbuild/aix-ppc64": { 22 + "version": "0.25.9", 23 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", 24 + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", 25 + "cpu": [ 26 + "ppc64" 27 + ], 28 + "dev": true, 29 + "license": "MIT", 30 + "optional": true, 31 + "os": [ 32 + "aix" 33 + ], 34 + "engines": { 35 + "node": ">=18" 36 + } 37 + }, 38 + "node_modules/@esbuild/android-arm": { 39 + "version": "0.25.9", 40 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", 41 + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", 42 + "cpu": [ 43 + "arm" 44 + ], 45 + "dev": true, 46 + "license": "MIT", 47 + "optional": true, 48 + "os": [ 49 + "android" 50 + ], 51 + "engines": { 52 + "node": ">=18" 53 + } 54 + }, 55 + "node_modules/@esbuild/android-arm64": { 56 + "version": "0.25.9", 57 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", 58 + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", 59 + "cpu": [ 60 + "arm64" 61 + ], 62 + "dev": true, 63 + "license": "MIT", 64 + "optional": true, 65 + "os": [ 66 + "android" 67 + ], 68 + "engines": { 69 + "node": ">=18" 70 + } 71 + }, 72 + "node_modules/@esbuild/android-x64": { 73 + "version": "0.25.9", 74 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", 75 + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", 76 + "cpu": [ 77 + "x64" 78 + ], 79 + "dev": true, 80 + "license": "MIT", 81 + "optional": true, 82 + "os": [ 83 + "android" 84 + ], 85 + "engines": { 86 + "node": ">=18" 87 + } 88 + }, 89 + "node_modules/@esbuild/darwin-arm64": { 90 + "version": "0.25.9", 91 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", 92 + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", 93 + "cpu": [ 94 + "arm64" 95 + ], 96 + "dev": true, 97 + "license": "MIT", 98 + "optional": true, 99 + "os": [ 100 + "darwin" 101 + ], 102 + "engines": { 103 + "node": ">=18" 104 + } 105 + }, 106 + "node_modules/@esbuild/darwin-x64": { 107 + "version": "0.25.9", 108 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", 109 + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", 110 + "cpu": [ 111 + "x64" 112 + ], 113 + "dev": true, 114 + "license": "MIT", 115 + "optional": true, 116 + "os": [ 117 + "darwin" 118 + ], 119 + "engines": { 120 + "node": ">=18" 121 + } 122 + }, 123 + "node_modules/@esbuild/freebsd-arm64": { 124 + "version": "0.25.9", 125 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", 126 + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", 127 + "cpu": [ 128 + "arm64" 129 + ], 130 + "dev": true, 131 + "license": "MIT", 132 + "optional": true, 133 + "os": [ 134 + "freebsd" 135 + ], 136 + "engines": { 137 + "node": ">=18" 138 + } 139 + }, 140 + "node_modules/@esbuild/freebsd-x64": { 141 + "version": "0.25.9", 142 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", 143 + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", 144 + "cpu": [ 145 + "x64" 146 + ], 147 + "dev": true, 148 + "license": "MIT", 149 + "optional": true, 150 + "os": [ 151 + "freebsd" 152 + ], 153 + "engines": { 154 + "node": ">=18" 155 + } 156 + }, 157 + "node_modules/@esbuild/linux-arm": { 158 + "version": "0.25.9", 159 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", 160 + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", 161 + "cpu": [ 162 + "arm" 163 + ], 164 + "dev": true, 165 + "license": "MIT", 166 + "optional": true, 167 + "os": [ 168 + "linux" 169 + ], 170 + "engines": { 171 + "node": ">=18" 172 + } 173 + }, 174 + "node_modules/@esbuild/linux-arm64": { 175 + "version": "0.25.9", 176 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", 177 + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", 178 + "cpu": [ 179 + "arm64" 180 + ], 181 + "dev": true, 182 + "license": "MIT", 183 + "optional": true, 184 + "os": [ 185 + "linux" 186 + ], 187 + "engines": { 188 + "node": ">=18" 189 + } 190 + }, 191 + "node_modules/@esbuild/linux-ia32": { 192 + "version": "0.25.9", 193 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", 194 + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", 195 + "cpu": [ 196 + "ia32" 197 + ], 198 + "dev": true, 199 + "license": "MIT", 200 + "optional": true, 201 + "os": [ 202 + "linux" 203 + ], 204 + "engines": { 205 + "node": ">=18" 206 + } 207 + }, 208 + "node_modules/@esbuild/linux-loong64": { 209 + "version": "0.25.9", 210 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", 211 + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", 212 + "cpu": [ 213 + "loong64" 214 + ], 215 + "dev": true, 216 + "license": "MIT", 217 + "optional": true, 218 + "os": [ 219 + "linux" 220 + ], 221 + "engines": { 222 + "node": ">=18" 223 + } 224 + }, 225 + "node_modules/@esbuild/linux-mips64el": { 226 + "version": "0.25.9", 227 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", 228 + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", 229 + "cpu": [ 230 + "mips64el" 231 + ], 232 + "dev": true, 233 + "license": "MIT", 234 + "optional": true, 235 + "os": [ 236 + "linux" 237 + ], 238 + "engines": { 239 + "node": ">=18" 240 + } 241 + }, 242 + "node_modules/@esbuild/linux-ppc64": { 243 + "version": "0.25.9", 244 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", 245 + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", 246 + "cpu": [ 247 + "ppc64" 248 + ], 249 + "dev": true, 250 + "license": "MIT", 251 + "optional": true, 252 + "os": [ 253 + "linux" 254 + ], 255 + "engines": { 256 + "node": ">=18" 257 + } 258 + }, 259 + "node_modules/@esbuild/linux-riscv64": { 260 + "version": "0.25.9", 261 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", 262 + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", 263 + "cpu": [ 264 + "riscv64" 265 + ], 266 + "dev": true, 267 + "license": "MIT", 268 + "optional": true, 269 + "os": [ 270 + "linux" 271 + ], 272 + "engines": { 273 + "node": ">=18" 274 + } 275 + }, 276 + "node_modules/@esbuild/linux-s390x": { 277 + "version": "0.25.9", 278 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", 279 + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", 280 + "cpu": [ 281 + "s390x" 282 + ], 283 + "dev": true, 284 + "license": "MIT", 285 + "optional": true, 286 + "os": [ 287 + "linux" 288 + ], 289 + "engines": { 290 + "node": ">=18" 291 + } 292 + }, 293 + "node_modules/@esbuild/linux-x64": { 294 + "version": "0.25.9", 295 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", 296 + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", 297 + "cpu": [ 298 + "x64" 299 + ], 300 + "dev": true, 301 + "license": "MIT", 302 + "optional": true, 303 + "os": [ 304 + "linux" 305 + ], 306 + "engines": { 307 + "node": ">=18" 308 + } 309 + }, 310 + "node_modules/@esbuild/netbsd-arm64": { 311 + "version": "0.25.9", 312 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", 313 + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", 314 + "cpu": [ 315 + "arm64" 316 + ], 317 + "dev": true, 318 + "license": "MIT", 319 + "optional": true, 320 + "os": [ 321 + "netbsd" 322 + ], 323 + "engines": { 324 + "node": ">=18" 325 + } 326 + }, 327 + "node_modules/@esbuild/netbsd-x64": { 328 + "version": "0.25.9", 329 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", 330 + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", 331 + "cpu": [ 332 + "x64" 333 + ], 334 + "dev": true, 335 + "license": "MIT", 336 + "optional": true, 337 + "os": [ 338 + "netbsd" 339 + ], 340 + "engines": { 341 + "node": ">=18" 342 + } 343 + }, 344 + "node_modules/@esbuild/openbsd-arm64": { 345 + "version": "0.25.9", 346 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", 347 + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", 348 + "cpu": [ 349 + "arm64" 350 + ], 351 + "dev": true, 352 + "license": "MIT", 353 + "optional": true, 354 + "os": [ 355 + "openbsd" 356 + ], 357 + "engines": { 358 + "node": ">=18" 359 + } 360 + }, 361 + "node_modules/@esbuild/openbsd-x64": { 362 + "version": "0.25.9", 363 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", 364 + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", 365 + "cpu": [ 366 + "x64" 367 + ], 368 + "dev": true, 369 + "license": "MIT", 370 + "optional": true, 371 + "os": [ 372 + "openbsd" 373 + ], 374 + "engines": { 375 + "node": ">=18" 376 + } 377 + }, 378 + "node_modules/@esbuild/openharmony-arm64": { 379 + "version": "0.25.9", 380 + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", 381 + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", 382 + "cpu": [ 383 + "arm64" 384 + ], 385 + "dev": true, 386 + "license": "MIT", 387 + "optional": true, 388 + "os": [ 389 + "openharmony" 390 + ], 391 + "engines": { 392 + "node": ">=18" 393 + } 394 + }, 395 + "node_modules/@esbuild/sunos-x64": { 396 + "version": "0.25.9", 397 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", 398 + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", 399 + "cpu": [ 400 + "x64" 401 + ], 402 + "dev": true, 403 + "license": "MIT", 404 + "optional": true, 405 + "os": [ 406 + "sunos" 407 + ], 408 + "engines": { 409 + "node": ">=18" 410 + } 411 + }, 412 + "node_modules/@esbuild/win32-arm64": { 413 + "version": "0.25.9", 414 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", 415 + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", 416 + "cpu": [ 417 + "arm64" 418 + ], 419 + "dev": true, 420 + "license": "MIT", 421 + "optional": true, 422 + "os": [ 423 + "win32" 424 + ], 425 + "engines": { 426 + "node": ">=18" 18 427 } 19 428 }, 429 + "node_modules/@esbuild/win32-ia32": { 430 + "version": "0.25.9", 431 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", 432 + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", 433 + "cpu": [ 434 + "ia32" 435 + ], 436 + "dev": true, 437 + "license": "MIT", 438 + "optional": true, 439 + "os": [ 440 + "win32" 441 + ], 442 + "engines": { 443 + "node": ">=18" 444 + } 445 + }, 446 + "node_modules/@esbuild/win32-x64": { 447 + "version": "0.25.9", 448 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", 449 + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", 450 + "cpu": [ 451 + "x64" 452 + ], 453 + "dev": true, 454 + "license": "MIT", 455 + "optional": true, 456 + "os": [ 457 + "win32" 458 + ], 459 + "engines": { 460 + "node": ">=18" 461 + } 462 + }, 463 + "node_modules/@jridgewell/sourcemap-codec": { 464 + "version": "1.5.5", 465 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", 466 + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", 467 + "dev": true, 468 + "license": "MIT" 469 + }, 470 + "node_modules/@rollup/rollup-android-arm-eabi": { 471 + "version": "4.48.0", 472 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.48.0.tgz", 473 + "integrity": "sha512-aVzKH922ogVAWkKiyKXorjYymz2084zrhrZRXtLrA5eEx5SO8Dj0c/4FpCHZyn7MKzhW2pW4tK28vVr+5oQ2xw==", 474 + "cpu": [ 475 + "arm" 476 + ], 477 + "dev": true, 478 + "license": "MIT", 479 + "optional": true, 480 + "os": [ 481 + "android" 482 + ] 483 + }, 484 + "node_modules/@rollup/rollup-android-arm64": { 485 + "version": "4.48.0", 486 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.48.0.tgz", 487 + "integrity": "sha512-diOdQuw43xTa1RddAFbhIA8toirSzFMcnIg8kvlzRbK26xqEnKJ/vqQnghTAajy2Dcy42v+GMPMo6jq67od+Dw==", 488 + "cpu": [ 489 + "arm64" 490 + ], 491 + "dev": true, 492 + "license": "MIT", 493 + "optional": true, 494 + "os": [ 495 + "android" 496 + ] 497 + }, 498 + "node_modules/@rollup/rollup-darwin-arm64": { 499 + "version": "4.48.0", 500 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.48.0.tgz", 501 + "integrity": "sha512-QhR2KA18fPlJWFefySJPDYZELaVqIUVnYgAOdtJ+B/uH96CFg2l1TQpX19XpUMWUqMyIiyY45wje8K6F4w4/CA==", 502 + "cpu": [ 503 + "arm64" 504 + ], 505 + "dev": true, 506 + "license": "MIT", 507 + "optional": true, 508 + "os": [ 509 + "darwin" 510 + ] 511 + }, 512 + "node_modules/@rollup/rollup-darwin-x64": { 513 + "version": "4.48.0", 514 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.48.0.tgz", 515 + "integrity": "sha512-Q9RMXnQVJ5S1SYpNSTwXDpoQLgJ/fbInWOyjbCnnqTElEyeNvLAB3QvG5xmMQMhFN74bB5ZZJYkKaFPcOG8sGg==", 516 + "cpu": [ 517 + "x64" 518 + ], 519 + "dev": true, 520 + "license": "MIT", 521 + "optional": true, 522 + "os": [ 523 + "darwin" 524 + ] 525 + }, 526 + "node_modules/@rollup/rollup-freebsd-arm64": { 527 + "version": "4.48.0", 528 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.48.0.tgz", 529 + "integrity": "sha512-3jzOhHWM8O8PSfyft+ghXZfBkZawQA0PUGtadKYxFqpcYlOYjTi06WsnYBsbMHLawr+4uWirLlbhcYLHDXR16w==", 530 + "cpu": [ 531 + "arm64" 532 + ], 533 + "dev": true, 534 + "license": "MIT", 535 + "optional": true, 536 + "os": [ 537 + "freebsd" 538 + ] 539 + }, 540 + "node_modules/@rollup/rollup-freebsd-x64": { 541 + "version": "4.48.0", 542 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.48.0.tgz", 543 + "integrity": "sha512-NcD5uVUmE73C/TPJqf78hInZmiSBsDpz3iD5MF/BuB+qzm4ooF2S1HfeTChj5K4AV3y19FFPgxonsxiEpy8v/A==", 544 + "cpu": [ 545 + "x64" 546 + ], 547 + "dev": true, 548 + "license": "MIT", 549 + "optional": true, 550 + "os": [ 551 + "freebsd" 552 + ] 553 + }, 554 + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 555 + "version": "4.48.0", 556 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.48.0.tgz", 557 + "integrity": "sha512-JWnrj8qZgLWRNHr7NbpdnrQ8kcg09EBBq8jVOjmtlB3c8C6IrynAJSMhMVGME4YfTJzIkJqvSUSVJRqkDnu/aA==", 558 + "cpu": [ 559 + "arm" 560 + ], 561 + "dev": true, 562 + "license": "MIT", 563 + "optional": true, 564 + "os": [ 565 + "linux" 566 + ] 567 + }, 568 + "node_modules/@rollup/rollup-linux-arm-musleabihf": { 569 + "version": "4.48.0", 570 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.48.0.tgz", 571 + "integrity": "sha512-9xu92F0TxuMH0tD6tG3+GtngwdgSf8Bnz+YcsPG91/r5Vgh5LNofO48jV55priA95p3c92FLmPM7CvsVlnSbGQ==", 572 + "cpu": [ 573 + "arm" 574 + ], 575 + "dev": true, 576 + "license": "MIT", 577 + "optional": true, 578 + "os": [ 579 + "linux" 580 + ] 581 + }, 582 + "node_modules/@rollup/rollup-linux-arm64-gnu": { 583 + "version": "4.48.0", 584 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.48.0.tgz", 585 + "integrity": "sha512-NLtvJB5YpWn7jlp1rJiY0s+G1Z1IVmkDuiywiqUhh96MIraC0n7XQc2SZ1CZz14shqkM+XN2UrfIo7JB6UufOA==", 586 + "cpu": [ 587 + "arm64" 588 + ], 589 + "dev": true, 590 + "license": "MIT", 591 + "optional": true, 592 + "os": [ 593 + "linux" 594 + ] 595 + }, 596 + "node_modules/@rollup/rollup-linux-arm64-musl": { 597 + "version": "4.48.0", 598 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.48.0.tgz", 599 + "integrity": "sha512-QJ4hCOnz2SXgCh+HmpvZkM+0NSGcZACyYS8DGbWn2PbmA0e5xUk4bIP8eqJyNXLtyB4gZ3/XyvKtQ1IFH671vQ==", 600 + "cpu": [ 601 + "arm64" 602 + ], 603 + "dev": true, 604 + "license": "MIT", 605 + "optional": true, 606 + "os": [ 607 + "linux" 608 + ] 609 + }, 610 + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 611 + "version": "4.48.0", 612 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.48.0.tgz", 613 + "integrity": "sha512-Pk0qlGJnhILdIC5zSKQnprFjrGmjfDM7TPZ0FKJxRkoo+kgMRAg4ps1VlTZf8u2vohSicLg7NP+cA5qE96PaFg==", 614 + "cpu": [ 615 + "loong64" 616 + ], 617 + "dev": true, 618 + "license": "MIT", 619 + "optional": true, 620 + "os": [ 621 + "linux" 622 + ] 623 + }, 624 + "node_modules/@rollup/rollup-linux-ppc64-gnu": { 625 + "version": "4.48.0", 626 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.48.0.tgz", 627 + "integrity": "sha512-/dNFc6rTpoOzgp5GKoYjT6uLo8okR/Chi2ECOmCZiS4oqh3mc95pThWma7Bgyk6/WTEvjDINpiBCuecPLOgBLQ==", 628 + "cpu": [ 629 + "ppc64" 630 + ], 631 + "dev": true, 632 + "license": "MIT", 633 + "optional": true, 634 + "os": [ 635 + "linux" 636 + ] 637 + }, 638 + "node_modules/@rollup/rollup-linux-riscv64-gnu": { 639 + "version": "4.48.0", 640 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.48.0.tgz", 641 + "integrity": "sha512-YBwXsvsFI8CVA4ej+bJF2d9uAeIiSkqKSPQNn0Wyh4eMDY4wxuSp71BauPjQNCKK2tD2/ksJ7uhJ8X/PVY9bHQ==", 642 + "cpu": [ 643 + "riscv64" 644 + ], 645 + "dev": true, 646 + "license": "MIT", 647 + "optional": true, 648 + "os": [ 649 + "linux" 650 + ] 651 + }, 652 + "node_modules/@rollup/rollup-linux-riscv64-musl": { 653 + "version": "4.48.0", 654 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.48.0.tgz", 655 + "integrity": "sha512-FI3Rr2aGAtl1aHzbkBIamsQyuauYtTF9SDUJ8n2wMXuuxwchC3QkumZa1TEXYIv/1AUp1a25Kwy6ONArvnyeVQ==", 656 + "cpu": [ 657 + "riscv64" 658 + ], 659 + "dev": true, 660 + "license": "MIT", 661 + "optional": true, 662 + "os": [ 663 + "linux" 664 + ] 665 + }, 666 + "node_modules/@rollup/rollup-linux-s390x-gnu": { 667 + "version": "4.48.0", 668 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.48.0.tgz", 669 + "integrity": "sha512-Dx7qH0/rvNNFmCcIRe1pyQ9/H0XO4v/f0SDoafwRYwc2J7bJZ5N4CHL/cdjamISZ5Cgnon6iazAVRFlxSoHQnQ==", 670 + "cpu": [ 671 + "s390x" 672 + ], 673 + "dev": true, 674 + "license": "MIT", 675 + "optional": true, 676 + "os": [ 677 + "linux" 678 + ] 679 + }, 680 + "node_modules/@rollup/rollup-linux-x64-gnu": { 681 + "version": "4.48.0", 682 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.48.0.tgz", 683 + "integrity": "sha512-GUdZKTeKBq9WmEBzvFYuC88yk26vT66lQV8D5+9TgkfbewhLaTHRNATyzpQwwbHIfJvDJ3N9WJ90wK/uR3cy3Q==", 684 + "cpu": [ 685 + "x64" 686 + ], 687 + "dev": true, 688 + "license": "MIT", 689 + "optional": true, 690 + "os": [ 691 + "linux" 692 + ] 693 + }, 694 + "node_modules/@rollup/rollup-linux-x64-musl": { 695 + "version": "4.48.0", 696 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.48.0.tgz", 697 + "integrity": "sha512-ao58Adz/v14MWpQgYAb4a4h3fdw73DrDGtaiF7Opds5wNyEQwtO6M9dBh89nke0yoZzzaegq6J/EXs7eBebG8A==", 698 + "cpu": [ 699 + "x64" 700 + ], 701 + "dev": true, 702 + "license": "MIT", 703 + "optional": true, 704 + "os": [ 705 + "linux" 706 + ] 707 + }, 708 + "node_modules/@rollup/rollup-win32-arm64-msvc": { 709 + "version": "4.48.0", 710 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.48.0.tgz", 711 + "integrity": "sha512-kpFno46bHtjZVdRIOxqaGeiABiToo2J+st7Yce+aiAoo1H0xPi2keyQIP04n2JjDVuxBN6bSz9R6RdTK5hIppw==", 712 + "cpu": [ 713 + "arm64" 714 + ], 715 + "dev": true, 716 + "license": "MIT", 717 + "optional": true, 718 + "os": [ 719 + "win32" 720 + ] 721 + }, 722 + "node_modules/@rollup/rollup-win32-ia32-msvc": { 723 + "version": "4.48.0", 724 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.48.0.tgz", 725 + "integrity": "sha512-rFYrk4lLk9YUTIeihnQMiwMr6gDhGGSbWThPEDfBoU/HdAtOzPXeexKi7yU8jO+LWRKnmqPN9NviHQf6GDwBcQ==", 726 + "cpu": [ 727 + "ia32" 728 + ], 729 + "dev": true, 730 + "license": "MIT", 731 + "optional": true, 732 + "os": [ 733 + "win32" 734 + ] 735 + }, 736 + "node_modules/@rollup/rollup-win32-x64-msvc": { 737 + "version": "4.48.0", 738 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.48.0.tgz", 739 + "integrity": "sha512-sq0hHLTgdtwOPDB5SJOuaoHyiP1qSwg+71TQWk8iDS04bW1wIE0oQ6otPiRj2ZvLYNASLMaTp8QRGUVZ+5OL5A==", 740 + "cpu": [ 741 + "x64" 742 + ], 743 + "dev": true, 744 + "license": "MIT", 745 + "optional": true, 746 + "os": [ 747 + "win32" 748 + ] 749 + }, 750 + "node_modules/@types/chai": { 751 + "version": "5.2.2", 752 + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", 753 + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", 754 + "dev": true, 755 + "license": "MIT", 756 + "dependencies": { 757 + "@types/deep-eql": "*" 758 + } 759 + }, 760 + "node_modules/@types/deep-eql": { 761 + "version": "4.0.2", 762 + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", 763 + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", 764 + "dev": true, 765 + "license": "MIT" 766 + }, 767 + "node_modules/@types/estree": { 768 + "version": "1.0.8", 769 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 770 + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 771 + "dev": true, 772 + "license": "MIT" 773 + }, 20 774 "node_modules/@types/node": { 21 775 "version": "24.3.0", 22 776 "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", ··· 27 781 "undici-types": "~7.10.0" 28 782 } 29 783 }, 784 + "node_modules/@vitest/expect": { 785 + "version": "3.2.4", 786 + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", 787 + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", 788 + "dev": true, 789 + "license": "MIT", 790 + "dependencies": { 791 + "@types/chai": "^5.2.2", 792 + "@vitest/spy": "3.2.4", 793 + "@vitest/utils": "3.2.4", 794 + "chai": "^5.2.0", 795 + "tinyrainbow": "^2.0.0" 796 + }, 797 + "funding": { 798 + "url": "https://opencollective.com/vitest" 799 + } 800 + }, 801 + "node_modules/@vitest/mocker": { 802 + "version": "3.2.4", 803 + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", 804 + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", 805 + "dev": true, 806 + "license": "MIT", 807 + "dependencies": { 808 + "@vitest/spy": "3.2.4", 809 + "estree-walker": "^3.0.3", 810 + "magic-string": "^0.30.17" 811 + }, 812 + "funding": { 813 + "url": "https://opencollective.com/vitest" 814 + }, 815 + "peerDependencies": { 816 + "msw": "^2.4.9", 817 + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" 818 + }, 819 + "peerDependenciesMeta": { 820 + "msw": { 821 + "optional": true 822 + }, 823 + "vite": { 824 + "optional": true 825 + } 826 + } 827 + }, 828 + "node_modules/@vitest/pretty-format": { 829 + "version": "3.2.4", 830 + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", 831 + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", 832 + "dev": true, 833 + "license": "MIT", 834 + "dependencies": { 835 + "tinyrainbow": "^2.0.0" 836 + }, 837 + "funding": { 838 + "url": "https://opencollective.com/vitest" 839 + } 840 + }, 841 + "node_modules/@vitest/runner": { 842 + "version": "3.2.4", 843 + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", 844 + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", 845 + "dev": true, 846 + "license": "MIT", 847 + "dependencies": { 848 + "@vitest/utils": "3.2.4", 849 + "pathe": "^2.0.3", 850 + "strip-literal": "^3.0.0" 851 + }, 852 + "funding": { 853 + "url": "https://opencollective.com/vitest" 854 + } 855 + }, 856 + "node_modules/@vitest/snapshot": { 857 + "version": "3.2.4", 858 + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", 859 + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", 860 + "dev": true, 861 + "license": "MIT", 862 + "dependencies": { 863 + "@vitest/pretty-format": "3.2.4", 864 + "magic-string": "^0.30.17", 865 + "pathe": "^2.0.3" 866 + }, 867 + "funding": { 868 + "url": "https://opencollective.com/vitest" 869 + } 870 + }, 871 + "node_modules/@vitest/spy": { 872 + "version": "3.2.4", 873 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", 874 + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", 875 + "dev": true, 876 + "license": "MIT", 877 + "dependencies": { 878 + "tinyspy": "^4.0.3" 879 + }, 880 + "funding": { 881 + "url": "https://opencollective.com/vitest" 882 + } 883 + }, 884 + "node_modules/@vitest/utils": { 885 + "version": "3.2.4", 886 + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", 887 + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", 888 + "dev": true, 889 + "license": "MIT", 890 + "dependencies": { 891 + "@vitest/pretty-format": "3.2.4", 892 + "loupe": "^3.1.4", 893 + "tinyrainbow": "^2.0.0" 894 + }, 895 + "funding": { 896 + "url": "https://opencollective.com/vitest" 897 + } 898 + }, 899 + "node_modules/assertion-error": { 900 + "version": "2.0.1", 901 + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", 902 + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", 903 + "dev": true, 904 + "license": "MIT", 905 + "engines": { 906 + "node": ">=12" 907 + } 908 + }, 909 + "node_modules/cac": { 910 + "version": "6.7.14", 911 + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 912 + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 913 + "dev": true, 914 + "license": "MIT", 915 + "engines": { 916 + "node": ">=8" 917 + } 918 + }, 919 + "node_modules/chai": { 920 + "version": "5.3.3", 921 + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", 922 + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", 923 + "dev": true, 924 + "license": "MIT", 925 + "dependencies": { 926 + "assertion-error": "^2.0.1", 927 + "check-error": "^2.1.1", 928 + "deep-eql": "^5.0.1", 929 + "loupe": "^3.1.0", 930 + "pathval": "^2.0.0" 931 + }, 932 + "engines": { 933 + "node": ">=18" 934 + } 935 + }, 936 + "node_modules/check-error": { 937 + "version": "2.1.1", 938 + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", 939 + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", 940 + "dev": true, 941 + "license": "MIT", 942 + "engines": { 943 + "node": ">= 16" 944 + } 945 + }, 946 + "node_modules/debug": { 947 + "version": "4.4.1", 948 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 949 + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 950 + "dev": true, 951 + "license": "MIT", 952 + "dependencies": { 953 + "ms": "^2.1.3" 954 + }, 955 + "engines": { 956 + "node": ">=6.0" 957 + }, 958 + "peerDependenciesMeta": { 959 + "supports-color": { 960 + "optional": true 961 + } 962 + } 963 + }, 964 + "node_modules/deep-eql": { 965 + "version": "5.0.2", 966 + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", 967 + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", 968 + "dev": true, 969 + "license": "MIT", 970 + "engines": { 971 + "node": ">=6" 972 + } 973 + }, 974 + "node_modules/es-module-lexer": { 975 + "version": "1.7.0", 976 + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", 977 + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", 978 + "dev": true, 979 + "license": "MIT" 980 + }, 981 + "node_modules/esbuild": { 982 + "version": "0.25.9", 983 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", 984 + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", 985 + "dev": true, 986 + "hasInstallScript": true, 987 + "license": "MIT", 988 + "bin": { 989 + "esbuild": "bin/esbuild" 990 + }, 991 + "engines": { 992 + "node": ">=18" 993 + }, 994 + "optionalDependencies": { 995 + "@esbuild/aix-ppc64": "0.25.9", 996 + "@esbuild/android-arm": "0.25.9", 997 + "@esbuild/android-arm64": "0.25.9", 998 + "@esbuild/android-x64": "0.25.9", 999 + "@esbuild/darwin-arm64": "0.25.9", 1000 + "@esbuild/darwin-x64": "0.25.9", 1001 + "@esbuild/freebsd-arm64": "0.25.9", 1002 + "@esbuild/freebsd-x64": "0.25.9", 1003 + "@esbuild/linux-arm": "0.25.9", 1004 + "@esbuild/linux-arm64": "0.25.9", 1005 + "@esbuild/linux-ia32": "0.25.9", 1006 + "@esbuild/linux-loong64": "0.25.9", 1007 + "@esbuild/linux-mips64el": "0.25.9", 1008 + "@esbuild/linux-ppc64": "0.25.9", 1009 + "@esbuild/linux-riscv64": "0.25.9", 1010 + "@esbuild/linux-s390x": "0.25.9", 1011 + "@esbuild/linux-x64": "0.25.9", 1012 + "@esbuild/netbsd-arm64": "0.25.9", 1013 + "@esbuild/netbsd-x64": "0.25.9", 1014 + "@esbuild/openbsd-arm64": "0.25.9", 1015 + "@esbuild/openbsd-x64": "0.25.9", 1016 + "@esbuild/openharmony-arm64": "0.25.9", 1017 + "@esbuild/sunos-x64": "0.25.9", 1018 + "@esbuild/win32-arm64": "0.25.9", 1019 + "@esbuild/win32-ia32": "0.25.9", 1020 + "@esbuild/win32-x64": "0.25.9" 1021 + } 1022 + }, 1023 + "node_modules/estree-walker": { 1024 + "version": "3.0.3", 1025 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 1026 + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 1027 + "dev": true, 1028 + "license": "MIT", 1029 + "dependencies": { 1030 + "@types/estree": "^1.0.0" 1031 + } 1032 + }, 1033 + "node_modules/expect-type": { 1034 + "version": "1.2.2", 1035 + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", 1036 + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", 1037 + "dev": true, 1038 + "license": "Apache-2.0", 1039 + "engines": { 1040 + "node": ">=12.0.0" 1041 + } 1042 + }, 1043 + "node_modules/fdir": { 1044 + "version": "6.5.0", 1045 + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", 1046 + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", 1047 + "dev": true, 1048 + "license": "MIT", 1049 + "engines": { 1050 + "node": ">=12.0.0" 1051 + }, 1052 + "peerDependencies": { 1053 + "picomatch": "^3 || ^4" 1054 + }, 1055 + "peerDependenciesMeta": { 1056 + "picomatch": { 1057 + "optional": true 1058 + } 1059 + } 1060 + }, 1061 + "node_modules/fsevents": { 1062 + "version": "2.3.3", 1063 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1064 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1065 + "dev": true, 1066 + "hasInstallScript": true, 1067 + "license": "MIT", 1068 + "optional": true, 1069 + "os": [ 1070 + "darwin" 1071 + ], 1072 + "engines": { 1073 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1074 + } 1075 + }, 1076 + "node_modules/js-tokens": { 1077 + "version": "9.0.1", 1078 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", 1079 + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", 1080 + "dev": true, 1081 + "license": "MIT" 1082 + }, 30 1083 "node_modules/json5": { 31 1084 "version": "2.2.3", 32 1085 "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", ··· 39 1092 "node": ">=6" 40 1093 } 41 1094 }, 1095 + "node_modules/loupe": { 1096 + "version": "3.2.1", 1097 + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", 1098 + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", 1099 + "dev": true, 1100 + "license": "MIT" 1101 + }, 1102 + "node_modules/magic-string": { 1103 + "version": "0.30.18", 1104 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", 1105 + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", 1106 + "dev": true, 1107 + "license": "MIT", 1108 + "dependencies": { 1109 + "@jridgewell/sourcemap-codec": "^1.5.5" 1110 + } 1111 + }, 1112 + "node_modules/ms": { 1113 + "version": "2.1.3", 1114 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1115 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1116 + "dev": true, 1117 + "license": "MIT" 1118 + }, 1119 + "node_modules/nanoid": { 1120 + "version": "3.3.11", 1121 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 1122 + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 1123 + "dev": true, 1124 + "funding": [ 1125 + { 1126 + "type": "github", 1127 + "url": "https://github.com/sponsors/ai" 1128 + } 1129 + ], 1130 + "license": "MIT", 1131 + "bin": { 1132 + "nanoid": "bin/nanoid.cjs" 1133 + }, 1134 + "engines": { 1135 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1136 + } 1137 + }, 42 1138 "node_modules/node-fetch": { 43 1139 "version": "2.7.0", 44 1140 "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", ··· 68 1164 "node-fetch": "^2.6.0" 69 1165 } 70 1166 }, 1167 + "node_modules/pathe": { 1168 + "version": "2.0.3", 1169 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 1170 + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 1171 + "dev": true, 1172 + "license": "MIT" 1173 + }, 1174 + "node_modules/pathval": { 1175 + "version": "2.0.1", 1176 + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", 1177 + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", 1178 + "dev": true, 1179 + "license": "MIT", 1180 + "engines": { 1181 + "node": ">= 14.16" 1182 + } 1183 + }, 1184 + "node_modules/picocolors": { 1185 + "version": "1.1.1", 1186 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1187 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1188 + "dev": true, 1189 + "license": "ISC" 1190 + }, 1191 + "node_modules/picomatch": { 1192 + "version": "4.0.3", 1193 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 1194 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 1195 + "dev": true, 1196 + "license": "MIT", 1197 + "engines": { 1198 + "node": ">=12" 1199 + }, 1200 + "funding": { 1201 + "url": "https://github.com/sponsors/jonschlinkert" 1202 + } 1203 + }, 1204 + "node_modules/postcss": { 1205 + "version": "8.5.6", 1206 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", 1207 + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", 1208 + "dev": true, 1209 + "funding": [ 1210 + { 1211 + "type": "opencollective", 1212 + "url": "https://opencollective.com/postcss/" 1213 + }, 1214 + { 1215 + "type": "tidelift", 1216 + "url": "https://tidelift.com/funding/github/npm/postcss" 1217 + }, 1218 + { 1219 + "type": "github", 1220 + "url": "https://github.com/sponsors/ai" 1221 + } 1222 + ], 1223 + "license": "MIT", 1224 + "dependencies": { 1225 + "nanoid": "^3.3.11", 1226 + "picocolors": "^1.1.1", 1227 + "source-map-js": "^1.2.1" 1228 + }, 1229 + "engines": { 1230 + "node": "^10 || ^12 || >=14" 1231 + } 1232 + }, 1233 + "node_modules/rollup": { 1234 + "version": "4.48.0", 1235 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.48.0.tgz", 1236 + "integrity": "sha512-BXHRqK1vyt9XVSEHZ9y7xdYtuYbwVod2mLwOMFP7t/Eqoc1pHRlG/WdV2qNeNvZHRQdLedaFycljaYYM96RqJQ==", 1237 + "dev": true, 1238 + "license": "MIT", 1239 + "dependencies": { 1240 + "@types/estree": "1.0.8" 1241 + }, 1242 + "bin": { 1243 + "rollup": "dist/bin/rollup" 1244 + }, 1245 + "engines": { 1246 + "node": ">=18.0.0", 1247 + "npm": ">=8.0.0" 1248 + }, 1249 + "optionalDependencies": { 1250 + "@rollup/rollup-android-arm-eabi": "4.48.0", 1251 + "@rollup/rollup-android-arm64": "4.48.0", 1252 + "@rollup/rollup-darwin-arm64": "4.48.0", 1253 + "@rollup/rollup-darwin-x64": "4.48.0", 1254 + "@rollup/rollup-freebsd-arm64": "4.48.0", 1255 + "@rollup/rollup-freebsd-x64": "4.48.0", 1256 + "@rollup/rollup-linux-arm-gnueabihf": "4.48.0", 1257 + "@rollup/rollup-linux-arm-musleabihf": "4.48.0", 1258 + "@rollup/rollup-linux-arm64-gnu": "4.48.0", 1259 + "@rollup/rollup-linux-arm64-musl": "4.48.0", 1260 + "@rollup/rollup-linux-loongarch64-gnu": "4.48.0", 1261 + "@rollup/rollup-linux-ppc64-gnu": "4.48.0", 1262 + "@rollup/rollup-linux-riscv64-gnu": "4.48.0", 1263 + "@rollup/rollup-linux-riscv64-musl": "4.48.0", 1264 + "@rollup/rollup-linux-s390x-gnu": "4.48.0", 1265 + "@rollup/rollup-linux-x64-gnu": "4.48.0", 1266 + "@rollup/rollup-linux-x64-musl": "4.48.0", 1267 + "@rollup/rollup-win32-arm64-msvc": "4.48.0", 1268 + "@rollup/rollup-win32-ia32-msvc": "4.48.0", 1269 + "@rollup/rollup-win32-x64-msvc": "4.48.0", 1270 + "fsevents": "~2.3.2" 1271 + } 1272 + }, 1273 + "node_modules/siginfo": { 1274 + "version": "2.0.0", 1275 + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 1276 + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 1277 + "dev": true, 1278 + "license": "ISC" 1279 + }, 1280 + "node_modules/source-map-js": { 1281 + "version": "1.2.1", 1282 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1283 + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1284 + "dev": true, 1285 + "license": "BSD-3-Clause", 1286 + "engines": { 1287 + "node": ">=0.10.0" 1288 + } 1289 + }, 1290 + "node_modules/stackback": { 1291 + "version": "0.0.2", 1292 + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 1293 + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 1294 + "dev": true, 1295 + "license": "MIT" 1296 + }, 1297 + "node_modules/std-env": { 1298 + "version": "3.9.0", 1299 + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", 1300 + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", 1301 + "dev": true, 1302 + "license": "MIT" 1303 + }, 1304 + "node_modules/strip-literal": { 1305 + "version": "3.0.0", 1306 + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", 1307 + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", 1308 + "dev": true, 1309 + "license": "MIT", 1310 + "dependencies": { 1311 + "js-tokens": "^9.0.1" 1312 + }, 1313 + "funding": { 1314 + "url": "https://github.com/sponsors/antfu" 1315 + } 1316 + }, 1317 + "node_modules/tinybench": { 1318 + "version": "2.9.0", 1319 + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", 1320 + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", 1321 + "dev": true, 1322 + "license": "MIT" 1323 + }, 1324 + "node_modules/tinyexec": { 1325 + "version": "0.3.2", 1326 + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", 1327 + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", 1328 + "dev": true, 1329 + "license": "MIT" 1330 + }, 1331 + "node_modules/tinyglobby": { 1332 + "version": "0.2.14", 1333 + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", 1334 + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", 1335 + "dev": true, 1336 + "license": "MIT", 1337 + "dependencies": { 1338 + "fdir": "^6.4.4", 1339 + "picomatch": "^4.0.2" 1340 + }, 1341 + "engines": { 1342 + "node": ">=12.0.0" 1343 + }, 1344 + "funding": { 1345 + "url": "https://github.com/sponsors/SuperchupuDev" 1346 + } 1347 + }, 1348 + "node_modules/tinypool": { 1349 + "version": "1.1.1", 1350 + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", 1351 + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", 1352 + "dev": true, 1353 + "license": "MIT", 1354 + "engines": { 1355 + "node": "^18.0.0 || >=20.0.0" 1356 + } 1357 + }, 1358 + "node_modules/tinyrainbow": { 1359 + "version": "2.0.0", 1360 + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", 1361 + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", 1362 + "dev": true, 1363 + "license": "MIT", 1364 + "engines": { 1365 + "node": ">=14.0.0" 1366 + } 1367 + }, 1368 + "node_modules/tinyspy": { 1369 + "version": "4.0.3", 1370 + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", 1371 + "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", 1372 + "dev": true, 1373 + "license": "MIT", 1374 + "engines": { 1375 + "node": ">=14.0.0" 1376 + } 1377 + }, 71 1378 "node_modules/tr46": { 72 1379 "version": "0.0.3", 73 1380 "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", ··· 95 1402 "dev": true, 96 1403 "license": "MIT" 97 1404 }, 1405 + "node_modules/vite": { 1406 + "version": "7.1.3", 1407 + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz", 1408 + "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==", 1409 + "dev": true, 1410 + "license": "MIT", 1411 + "dependencies": { 1412 + "esbuild": "^0.25.0", 1413 + "fdir": "^6.5.0", 1414 + "picomatch": "^4.0.3", 1415 + "postcss": "^8.5.6", 1416 + "rollup": "^4.43.0", 1417 + "tinyglobby": "^0.2.14" 1418 + }, 1419 + "bin": { 1420 + "vite": "bin/vite.js" 1421 + }, 1422 + "engines": { 1423 + "node": "^20.19.0 || >=22.12.0" 1424 + }, 1425 + "funding": { 1426 + "url": "https://github.com/vitejs/vite?sponsor=1" 1427 + }, 1428 + "optionalDependencies": { 1429 + "fsevents": "~2.3.3" 1430 + }, 1431 + "peerDependencies": { 1432 + "@types/node": "^20.19.0 || >=22.12.0", 1433 + "jiti": ">=1.21.0", 1434 + "less": "^4.0.0", 1435 + "lightningcss": "^1.21.0", 1436 + "sass": "^1.70.0", 1437 + "sass-embedded": "^1.70.0", 1438 + "stylus": ">=0.54.8", 1439 + "sugarss": "^5.0.0", 1440 + "terser": "^5.16.0", 1441 + "tsx": "^4.8.1", 1442 + "yaml": "^2.4.2" 1443 + }, 1444 + "peerDependenciesMeta": { 1445 + "@types/node": { 1446 + "optional": true 1447 + }, 1448 + "jiti": { 1449 + "optional": true 1450 + }, 1451 + "less": { 1452 + "optional": true 1453 + }, 1454 + "lightningcss": { 1455 + "optional": true 1456 + }, 1457 + "sass": { 1458 + "optional": true 1459 + }, 1460 + "sass-embedded": { 1461 + "optional": true 1462 + }, 1463 + "stylus": { 1464 + "optional": true 1465 + }, 1466 + "sugarss": { 1467 + "optional": true 1468 + }, 1469 + "terser": { 1470 + "optional": true 1471 + }, 1472 + "tsx": { 1473 + "optional": true 1474 + }, 1475 + "yaml": { 1476 + "optional": true 1477 + } 1478 + } 1479 + }, 1480 + "node_modules/vite-node": { 1481 + "version": "3.2.4", 1482 + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", 1483 + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", 1484 + "dev": true, 1485 + "license": "MIT", 1486 + "dependencies": { 1487 + "cac": "^6.7.14", 1488 + "debug": "^4.4.1", 1489 + "es-module-lexer": "^1.7.0", 1490 + "pathe": "^2.0.3", 1491 + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" 1492 + }, 1493 + "bin": { 1494 + "vite-node": "vite-node.mjs" 1495 + }, 1496 + "engines": { 1497 + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 1498 + }, 1499 + "funding": { 1500 + "url": "https://opencollective.com/vitest" 1501 + } 1502 + }, 1503 + "node_modules/vitest": { 1504 + "version": "3.2.4", 1505 + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", 1506 + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", 1507 + "dev": true, 1508 + "license": "MIT", 1509 + "dependencies": { 1510 + "@types/chai": "^5.2.2", 1511 + "@vitest/expect": "3.2.4", 1512 + "@vitest/mocker": "3.2.4", 1513 + "@vitest/pretty-format": "^3.2.4", 1514 + "@vitest/runner": "3.2.4", 1515 + "@vitest/snapshot": "3.2.4", 1516 + "@vitest/spy": "3.2.4", 1517 + "@vitest/utils": "3.2.4", 1518 + "chai": "^5.2.0", 1519 + "debug": "^4.4.1", 1520 + "expect-type": "^1.2.1", 1521 + "magic-string": "^0.30.17", 1522 + "pathe": "^2.0.3", 1523 + "picomatch": "^4.0.2", 1524 + "std-env": "^3.9.0", 1525 + "tinybench": "^2.9.0", 1526 + "tinyexec": "^0.3.2", 1527 + "tinyglobby": "^0.2.14", 1528 + "tinypool": "^1.1.1", 1529 + "tinyrainbow": "^2.0.0", 1530 + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", 1531 + "vite-node": "3.2.4", 1532 + "why-is-node-running": "^2.3.0" 1533 + }, 1534 + "bin": { 1535 + "vitest": "vitest.mjs" 1536 + }, 1537 + "engines": { 1538 + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 1539 + }, 1540 + "funding": { 1541 + "url": "https://opencollective.com/vitest" 1542 + }, 1543 + "peerDependencies": { 1544 + "@edge-runtime/vm": "*", 1545 + "@types/debug": "^4.1.12", 1546 + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 1547 + "@vitest/browser": "3.2.4", 1548 + "@vitest/ui": "3.2.4", 1549 + "happy-dom": "*", 1550 + "jsdom": "*" 1551 + }, 1552 + "peerDependenciesMeta": { 1553 + "@edge-runtime/vm": { 1554 + "optional": true 1555 + }, 1556 + "@types/debug": { 1557 + "optional": true 1558 + }, 1559 + "@types/node": { 1560 + "optional": true 1561 + }, 1562 + "@vitest/browser": { 1563 + "optional": true 1564 + }, 1565 + "@vitest/ui": { 1566 + "optional": true 1567 + }, 1568 + "happy-dom": { 1569 + "optional": true 1570 + }, 1571 + "jsdom": { 1572 + "optional": true 1573 + } 1574 + } 1575 + }, 98 1576 "node_modules/webidl-conversions": { 99 1577 "version": "3.0.1", 100 1578 "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", ··· 109 1587 "dependencies": { 110 1588 "tr46": "~0.0.3", 111 1589 "webidl-conversions": "^3.0.0" 1590 + } 1591 + }, 1592 + "node_modules/why-is-node-running": { 1593 + "version": "2.3.0", 1594 + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", 1595 + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", 1596 + "dev": true, 1597 + "license": "MIT", 1598 + "dependencies": { 1599 + "siginfo": "^2.0.0", 1600 + "stackback": "0.0.2" 1601 + }, 1602 + "bin": { 1603 + "why-is-node-running": "cli.js" 1604 + }, 1605 + "engines": { 1606 + "node": ">=8" 112 1607 } 113 1608 } 114 1609 }
+5 -3
package.json
··· 20 20 "type": "module", 21 21 "main": "distribution/index.js", 22 22 "scripts": { 23 - "build": "npx tsc", 24 - "start": "node distribution/index.js" 23 + "build": "tsc", 24 + "start": "node distribution/index.js", 25 + "test": "vitest" 25 26 }, 26 27 "dependencies": { 27 28 "json5": "2.2.3", ··· 29 30 }, 30 31 "devDependencies": { 31 32 "typescript": "5.9.2", 32 - "@types/node": "24.3.0" 33 + "@types/node": "24.3.0", 34 + "vitest": "3.2.4" 33 35 } 34 36 }
+2 -2
src/voice.ts
··· 165 165 tokens.push(LINES.POINT); 166 166 tokens.push(...digitByDigit(parts[1])); 167 167 } 168 - return tokens.map(l => path.join(voice.directory, `${l}.${voice.extension}`)); 168 + return tokens.map(l => path.join(voice.directory, `${l}${voice.extension.length > 0 && voice.extension.charAt(0) !== '.' ? '.' : ''}${voice.extension}`)); 169 169 } 170 170 171 171 export default voiceLines; 172 - export { voiceLines }; 172 + export { voiceLines, LINES }; 173 173 export type { Voice, Voices };
+116
test/voice.test.ts
··· 1 + import { assert, describe, expect, it } from 'vitest' 2 + import { voiceLines, LINES } from '../src/voice.js'; 3 + import type { Voice } from '../src/voice.js'; 4 + 5 + const dummyVoice: Voice = { 6 + 'directory': '', 7 + 'extension': '' 8 + }; 9 + 10 + describe('voiceLines', () => { 11 + it('handles integers', () => { 12 + expect(voiceLines(dummyVoice, 16549872)).to.include.ordered.members( 13 + [ 14 + LINES.SIX, LINES.TEEN, LINES.MILLION, LINES.FIVE, LINES.HUNDRED, LINES.FORTY, 15 + LINES.NINE, LINES.THOUSAND, LINES.EIGHT, LINES.HUNDRED, LINES.SEVENTY, LINES.TWO 16 + ] 17 + ); 18 + }); 19 + 20 + it('handles floating point', () => { 21 + expect(voiceLines(dummyVoice, 672.09435)).to.include.ordered.members( 22 + [ 23 + LINES.SIX, LINES.HUNDRED, LINES.SEVENTY, LINES.TWO, LINES.POINT, LINES.ZERO, 24 + LINES.NINE, LINES.FOUR, LINES.THREE, LINES.FIVE 25 + ] 26 + ); 27 + }); 28 + 29 + it('handles the negative', () => { 30 + expect(voiceLines(dummyVoice, -672.09435)).to.include.ordered.members( 31 + [ 32 + LINES.NEGATIVE, LINES.SIX, LINES.HUNDRED, LINES.SEVENTY, LINES.TWO, LINES.POINT, LINES.ZERO, 33 + LINES.NINE, LINES.FOUR, LINES.THREE, LINES.FIVE 34 + ] 35 + ); 36 + }); 37 + 38 + it('handles zero', () => { 39 + expect(voiceLines(dummyVoice, 0)).to.include.ordered.members( 40 + [ 41 + LINES.ZERO 42 + ] 43 + ); 44 + }); 45 + 46 + it('handles large numbers with many zeroes', () => { 47 + expect(voiceLines(dummyVoice, 700000000000001)).to.include.ordered.members( 48 + [ 49 + LINES.SEVEN, LINES.HUNDRED, LINES.TRILLION, LINES.ONE 50 + ] 51 + ); 52 + 53 + expect(voiceLines(dummyVoice, 1000001)).to.include.ordered.members( 54 + [ 55 + LINES.ONE, LINES.MILLION, LINES.ONE 56 + ] 57 + ); 58 + 59 + expect(voiceLines(dummyVoice, 9000000001000)).to.include.ordered.members( 60 + [ 61 + LINES.NINE, LINES.TRILLION, LINES.ONE, LINES.THOUSAND 62 + ] 63 + ); 64 + 65 + expect(voiceLines(dummyVoice, 60002000000000.12)).to.include.ordered.members( 66 + [ 67 + LINES.SIXTY, LINES.TRILLION, LINES.TWO, LINES.BILLION, LINES.POINT, LINES.ONE, LINES.TWO 68 + ] 69 + ); 70 + 71 + expect(voiceLines(dummyVoice, 100010001)).to.include.ordered.members( 72 + [ 73 + LINES.ONE, LINES.HUNDRED, LINES.MILLION, LINES.TEN, LINES.THOUSAND, LINES.ONE 74 + ] 75 + ); 76 + }); 77 + 78 + it('handles irregularly named numbers', () => { 79 + expect(voiceLines(dummyVoice, 210)).to.include.ordered.members( 80 + [ 81 + LINES.TWO, LINES.HUNDRED, LINES.TEN 82 + ] 83 + ); 84 + 85 + expect(voiceLines(dummyVoice, 311)).to.include.ordered.members( 86 + [ 87 + LINES.THREE, LINES.HUNDRED, LINES.ELEVEN 88 + ] 89 + ); 90 + 91 + expect(voiceLines(dummyVoice, 412)).to.include.ordered.members( 92 + [ 93 + LINES.FOUR, LINES.HUNDRED, LINES.TWELVE 94 + ] 95 + ); 96 + 97 + expect(voiceLines(dummyVoice, 513)).to.include.ordered.members( 98 + [ 99 + LINES.FIVE, LINES.HUNDRED, LINES.THIRTEEN 100 + ] 101 + ); 102 + 103 + expect(voiceLines(dummyVoice, 615)).to.include.ordered.members( 104 + [ 105 + LINES.SIX, LINES.HUNDRED, LINES.FIFTEEN 106 + ] 107 + ); 108 + }); 109 + 110 + it('returns empty array if value is unsupported', () => { 111 + expect(voiceLines(dummyVoice, Infinity)).length.to.be.empty; 112 + expect(voiceLines(dummyVoice, -Infinity)).length.to.be.empty; 113 + expect(voiceLines(dummyVoice, NaN)).length.to.be.empty; 114 + expect(voiceLines(dummyVoice, 1e21)).length.to.be.empty; 115 + }); 116 + });
+2 -2
tsconfig.json
··· 9 9 "moduleResolution": "node16", 10 10 "sourceMap": true, 11 11 "inlineSources": true, 12 - "rootDir": "./src", 12 + "rootDir": "./", 13 13 "outDir": "./distribution" 14 14 }, 15 - "include": ["src/**/*"], 15 + "include": ["src/**/*", "test/**/*"], 16 16 "exclude": ["**/*.spec.ts"] 17 17 }