WIP: Node.js isolation primitive to run asynchronous worker-like operations without leaking async IO

fix: [init] (#1)

* Add missing toJSON

* Fix init event and rename to _onInit

* Fix typo preventing root fiber node from becoming active again

* Add simple tests

* Add changeset

authored by kitten.sh and committed by GitHub de9dbd1c 7243c8d3

+5
.changeset/six-chicken-float.md
··· 1 + --- 2 + 'fiber-dev': patch 3 + --- 4 + 5 + Prevent typos causing accidental state tracking issues
+3
.github/workflows/ci.yml
··· 35 35 - name: Install Dependencies 36 36 run: pnpm install --frozen-lockfile --prefer-offline 37 37 38 + - name: Unit Tests 39 + run: pnpm run test 40 + 38 41 - name: Type checks 39 42 run: pnpm run check 40 43
-1
.gitignore
··· 1 1 node_modules 2 2 dist 3 - test
+12 -2
package.json
··· 14 14 "dist/" 15 15 ], 16 16 "scripts": { 17 + "test": "vitest run", 17 18 "build": "rollup -c ./scripts/rollup.config.mjs", 18 19 "postbuild": "tsc --noEmit ./dist/fiber-dev.d.ts", 19 20 "check": "tsc --noEmit", 20 21 "clean": "rimraf dist node_modules/.cache", 21 - "prepublishOnly": "run-s clean build check", 22 + "prepublishOnly": "run-s clean build check test", 22 23 "prepare": "node ./scripts/prepare.js || true", 23 24 "changeset:version": "changeset version && pnpm install --lockfile-only", 24 25 "changeset:publish": "changeset publish" ··· 64 65 "rollup": "^4.32.1", 65 66 "rollup-plugin-cjs-check": "^1.0.3", 66 67 "rollup-plugin-dts": "^6.1.1", 67 - "typescript": "^5.7.3" 68 + "typescript": "^5.7.3", 69 + "vitest": "^3.0.8" 68 70 }, 69 71 "publishConfig": { 70 72 "access": "public", 71 73 "provenance": true 74 + }, 75 + "pnpm": { 76 + "ignoredBuiltDependencies": [ 77 + "esbuild" 78 + ], 79 + "onlyBuiltDependencies": [ 80 + "esbuild" 81 + ] 72 82 } 73 83 }
+619
pnpm-lock.yaml
··· 62 62 typescript: 63 63 specifier: ^5.7.3 64 64 version: 5.7.3 65 + vitest: 66 + specifier: ^3.0.8 67 + version: 3.0.8(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0) 65 68 66 69 packages: 67 70 ··· 244 247 '@changesets/write@0.4.0': 245 248 resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} 246 249 250 + '@esbuild/aix-ppc64@0.25.1': 251 + resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} 252 + engines: {node: '>=18'} 253 + cpu: [ppc64] 254 + os: [aix] 255 + 256 + '@esbuild/android-arm64@0.25.1': 257 + resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} 258 + engines: {node: '>=18'} 259 + cpu: [arm64] 260 + os: [android] 261 + 262 + '@esbuild/android-arm@0.25.1': 263 + resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} 264 + engines: {node: '>=18'} 265 + cpu: [arm] 266 + os: [android] 267 + 268 + '@esbuild/android-x64@0.25.1': 269 + resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} 270 + engines: {node: '>=18'} 271 + cpu: [x64] 272 + os: [android] 273 + 274 + '@esbuild/darwin-arm64@0.25.1': 275 + resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} 276 + engines: {node: '>=18'} 277 + cpu: [arm64] 278 + os: [darwin] 279 + 280 + '@esbuild/darwin-x64@0.25.1': 281 + resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} 282 + engines: {node: '>=18'} 283 + cpu: [x64] 284 + os: [darwin] 285 + 286 + '@esbuild/freebsd-arm64@0.25.1': 287 + resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} 288 + engines: {node: '>=18'} 289 + cpu: [arm64] 290 + os: [freebsd] 291 + 292 + '@esbuild/freebsd-x64@0.25.1': 293 + resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} 294 + engines: {node: '>=18'} 295 + cpu: [x64] 296 + os: [freebsd] 297 + 298 + '@esbuild/linux-arm64@0.25.1': 299 + resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} 300 + engines: {node: '>=18'} 301 + cpu: [arm64] 302 + os: [linux] 303 + 304 + '@esbuild/linux-arm@0.25.1': 305 + resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} 306 + engines: {node: '>=18'} 307 + cpu: [arm] 308 + os: [linux] 309 + 310 + '@esbuild/linux-ia32@0.25.1': 311 + resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} 312 + engines: {node: '>=18'} 313 + cpu: [ia32] 314 + os: [linux] 315 + 316 + '@esbuild/linux-loong64@0.25.1': 317 + resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} 318 + engines: {node: '>=18'} 319 + cpu: [loong64] 320 + os: [linux] 321 + 322 + '@esbuild/linux-mips64el@0.25.1': 323 + resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} 324 + engines: {node: '>=18'} 325 + cpu: [mips64el] 326 + os: [linux] 327 + 328 + '@esbuild/linux-ppc64@0.25.1': 329 + resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} 330 + engines: {node: '>=18'} 331 + cpu: [ppc64] 332 + os: [linux] 333 + 334 + '@esbuild/linux-riscv64@0.25.1': 335 + resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} 336 + engines: {node: '>=18'} 337 + cpu: [riscv64] 338 + os: [linux] 339 + 340 + '@esbuild/linux-s390x@0.25.1': 341 + resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} 342 + engines: {node: '>=18'} 343 + cpu: [s390x] 344 + os: [linux] 345 + 346 + '@esbuild/linux-x64@0.25.1': 347 + resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} 348 + engines: {node: '>=18'} 349 + cpu: [x64] 350 + os: [linux] 351 + 352 + '@esbuild/netbsd-arm64@0.25.1': 353 + resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} 354 + engines: {node: '>=18'} 355 + cpu: [arm64] 356 + os: [netbsd] 357 + 358 + '@esbuild/netbsd-x64@0.25.1': 359 + resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} 360 + engines: {node: '>=18'} 361 + cpu: [x64] 362 + os: [netbsd] 363 + 364 + '@esbuild/openbsd-arm64@0.25.1': 365 + resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} 366 + engines: {node: '>=18'} 367 + cpu: [arm64] 368 + os: [openbsd] 369 + 370 + '@esbuild/openbsd-x64@0.25.1': 371 + resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} 372 + engines: {node: '>=18'} 373 + cpu: [x64] 374 + os: [openbsd] 375 + 376 + '@esbuild/sunos-x64@0.25.1': 377 + resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} 378 + engines: {node: '>=18'} 379 + cpu: [x64] 380 + os: [sunos] 381 + 382 + '@esbuild/win32-arm64@0.25.1': 383 + resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} 384 + engines: {node: '>=18'} 385 + cpu: [arm64] 386 + os: [win32] 387 + 388 + '@esbuild/win32-ia32@0.25.1': 389 + resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} 390 + engines: {node: '>=18'} 391 + cpu: [ia32] 392 + os: [win32] 393 + 394 + '@esbuild/win32-x64@0.25.1': 395 + resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} 396 + engines: {node: '>=18'} 397 + cpu: [x64] 398 + os: [win32] 399 + 247 400 '@isaacs/cliui@8.0.2': 248 401 resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 249 402 engines: {node: '>=12'} ··· 443 596 '@types/resolve@1.20.2': 444 597 resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} 445 598 599 + '@vitest/expect@3.0.8': 600 + resolution: {integrity: sha512-Xu6TTIavTvSSS6LZaA3EebWFr6tsoXPetOWNMOlc7LO88QVVBwq2oQWBoDiLCN6YTvNYsGSjqOO8CAdjom5DCQ==} 601 + 602 + '@vitest/mocker@3.0.8': 603 + resolution: {integrity: sha512-n3LjS7fcW1BCoF+zWZxG7/5XvuYH+lsFg+BDwwAz0arIwHQJFUEsKBQ0BLU49fCxuM/2HSeBPHQD8WjgrxMfow==} 604 + peerDependencies: 605 + msw: ^2.4.9 606 + vite: ^5.0.0 || ^6.0.0 607 + peerDependenciesMeta: 608 + msw: 609 + optional: true 610 + vite: 611 + optional: true 612 + 613 + '@vitest/pretty-format@3.0.8': 614 + resolution: {integrity: sha512-BNqwbEyitFhzYMYHUVbIvepOyeQOSFA/NeJMIP9enMntkkxLgOcgABH6fjyXG85ipTgvero6noreavGIqfJcIg==} 615 + 616 + '@vitest/runner@3.0.8': 617 + resolution: {integrity: sha512-c7UUw6gEcOzI8fih+uaAXS5DwjlBaCJUo7KJ4VvJcjL95+DSR1kova2hFuRt3w41KZEFcOEiq098KkyrjXeM5w==} 618 + 619 + '@vitest/snapshot@3.0.8': 620 + resolution: {integrity: sha512-x8IlMGSEMugakInj44nUrLSILh/zy1f2/BgH0UeHpNyOocG18M9CWVIFBaXPt8TrqVZWmcPjwfG/ht5tnpba8A==} 621 + 622 + '@vitest/spy@3.0.8': 623 + resolution: {integrity: sha512-MR+PzJa+22vFKYb934CejhR4BeRpMSoxkvNoDit68GQxRLSf11aT6CTj3XaqUU9rxgWJFnqicN/wxw6yBRkI1Q==} 624 + 625 + '@vitest/utils@3.0.8': 626 + resolution: {integrity: sha512-nkBC3aEhfX2PdtQI/QwAWp8qZWwzASsU4Npbcd5RdMPBSSLCpkZp52P3xku3s3uA0HIEhGvEcF8rNkBsz9dQ4Q==} 627 + 446 628 acorn@8.14.1: 447 629 resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 448 630 engines: {node: '>=0.4.0'} ··· 491 673 resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 492 674 engines: {node: '>= 0.4'} 493 675 676 + assertion-error@2.0.1: 677 + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 678 + engines: {node: '>=12'} 679 + 494 680 async-function@1.0.0: 495 681 resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 496 682 engines: {node: '>= 0.4'} ··· 524 710 buffer-from@1.1.2: 525 711 resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 526 712 713 + cac@6.7.14: 714 + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 715 + engines: {node: '>=8'} 716 + 527 717 call-bind-apply-helpers@1.0.2: 528 718 resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 529 719 engines: {node: '>= 0.4'} ··· 538 728 539 729 caniuse-lite@1.0.30001703: 540 730 resolution: {integrity: sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==} 731 + 732 + chai@5.2.0: 733 + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} 734 + engines: {node: '>=12'} 541 735 542 736 chalk@2.4.2: 543 737 resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} ··· 550 744 chardet@0.7.0: 551 745 resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 552 746 747 + check-error@2.1.1: 748 + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 749 + engines: {node: '>= 16'} 750 + 553 751 ci-info@3.9.0: 554 752 resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 555 753 engines: {node: '>=8'} ··· 629 827 supports-color: 630 828 optional: true 631 829 830 + deep-eql@5.0.2: 831 + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 832 + engines: {node: '>=6'} 833 + 632 834 deepmerge@4.3.1: 633 835 resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 634 836 engines: {node: '>=0.10.0'} ··· 695 897 resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 696 898 engines: {node: '>= 0.4'} 697 899 900 + es-module-lexer@1.6.0: 901 + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 902 + 698 903 es-object-atoms@1.1.1: 699 904 resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 700 905 engines: {node: '>= 0.4'} ··· 707 912 resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} 708 913 engines: {node: '>= 0.4'} 709 914 915 + esbuild@0.25.1: 916 + resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} 917 + engines: {node: '>=18'} 918 + hasBin: true 919 + 710 920 escalade@3.2.0: 711 921 resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 712 922 engines: {node: '>=6'} ··· 723 933 estree-walker@2.0.2: 724 934 resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 725 935 936 + estree-walker@3.0.3: 937 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 938 + 726 939 eventemitter3@5.0.1: 727 940 resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} 728 941 ··· 730 943 resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} 731 944 engines: {node: '>=16.17'} 732 945 946 + expect-type@1.2.0: 947 + resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} 948 + engines: {node: '>=12.0.0'} 949 + 733 950 extendable-error@0.1.7: 734 951 resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} 735 952 ··· 1083 1300 resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} 1084 1301 engines: {node: '>=18'} 1085 1302 1303 + loupe@3.1.3: 1304 + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 1305 + 1086 1306 lru-cache@11.0.2: 1087 1307 resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} 1088 1308 engines: {node: 20 || >=22} ··· 1137 1357 1138 1358 ms@2.1.3: 1139 1359 resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1360 + 1361 + nanoid@3.3.9: 1362 + resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} 1363 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1364 + hasBin: true 1140 1365 1141 1366 nice-try@1.0.5: 1142 1367 resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} ··· 1257 1482 resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1258 1483 engines: {node: '>=8'} 1259 1484 1485 + pathe@2.0.3: 1486 + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1487 + 1488 + pathval@2.0.0: 1489 + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 1490 + engines: {node: '>= 14.16'} 1491 + 1260 1492 picocolors@1.1.1: 1261 1493 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1262 1494 ··· 1290 1522 resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} 1291 1523 engines: {node: '>= 0.4'} 1292 1524 1525 + postcss@8.5.3: 1526 + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 1527 + engines: {node: ^10 || ^12 || >=14} 1528 + 1293 1529 prettier@2.8.8: 1294 1530 resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 1295 1531 engines: {node: '>=10.13.0'} ··· 1456 1692 resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1457 1693 engines: {node: '>= 0.4'} 1458 1694 1695 + siginfo@2.0.0: 1696 + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1697 + 1459 1698 signal-exit@4.1.0: 1460 1699 resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1461 1700 engines: {node: '>=14'} ··· 1474 1713 1475 1714 smob@1.5.0: 1476 1715 resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} 1716 + 1717 + source-map-js@1.2.1: 1718 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1719 + engines: {node: '>=0.10.0'} 1477 1720 1478 1721 source-map-support@0.5.21: 1479 1722 resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} ··· 1499 1742 1500 1743 sprintf-js@1.0.3: 1501 1744 resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1745 + 1746 + stackback@0.0.2: 1747 + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1748 + 1749 + std-env@3.8.1: 1750 + resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} 1502 1751 1503 1752 string-argv@0.3.2: 1504 1753 resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} ··· 1565 1814 engines: {node: '>=10'} 1566 1815 hasBin: true 1567 1816 1817 + tinybench@2.9.0: 1818 + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1819 + 1820 + tinyexec@0.3.2: 1821 + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1822 + 1823 + tinypool@1.0.2: 1824 + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 1825 + engines: {node: ^18.0.0 || >=20.0.0} 1826 + 1827 + tinyrainbow@2.0.0: 1828 + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 1829 + engines: {node: '>=14.0.0'} 1830 + 1831 + tinyspy@3.0.2: 1832 + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 1833 + engines: {node: '>=14.0.0'} 1834 + 1568 1835 tmp@0.0.33: 1569 1836 resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 1570 1837 engines: {node: '>=0.6.0'} ··· 1617 1884 validate-npm-package-license@3.0.4: 1618 1885 resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1619 1886 1887 + vite-node@3.0.8: 1888 + resolution: {integrity: sha512-6PhR4H9VGlcwXZ+KWCdMqbtG649xCPZqfI9j2PsK1FcXgEzro5bGHcVKFCTqPLaNKZES8Evqv4LwvZARsq5qlg==} 1889 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1890 + hasBin: true 1891 + 1892 + vite@6.2.1: 1893 + resolution: {integrity: sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==} 1894 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1895 + hasBin: true 1896 + peerDependencies: 1897 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1898 + jiti: '>=1.21.0' 1899 + less: '*' 1900 + lightningcss: ^1.21.0 1901 + sass: '*' 1902 + sass-embedded: '*' 1903 + stylus: '*' 1904 + sugarss: '*' 1905 + terser: ^5.16.0 1906 + tsx: ^4.8.1 1907 + yaml: ^2.4.2 1908 + peerDependenciesMeta: 1909 + '@types/node': 1910 + optional: true 1911 + jiti: 1912 + optional: true 1913 + less: 1914 + optional: true 1915 + lightningcss: 1916 + optional: true 1917 + sass: 1918 + optional: true 1919 + sass-embedded: 1920 + optional: true 1921 + stylus: 1922 + optional: true 1923 + sugarss: 1924 + optional: true 1925 + terser: 1926 + optional: true 1927 + tsx: 1928 + optional: true 1929 + yaml: 1930 + optional: true 1931 + 1932 + vitest@3.0.8: 1933 + resolution: {integrity: sha512-dfqAsNqRGUc8hB9OVR2P0w8PZPEckti2+5rdZip0WIz9WW0MnImJ8XiR61QhqLa92EQzKP2uPkzenKOAHyEIbA==} 1934 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1935 + hasBin: true 1936 + peerDependencies: 1937 + '@edge-runtime/vm': '*' 1938 + '@types/debug': ^4.1.12 1939 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1940 + '@vitest/browser': 3.0.8 1941 + '@vitest/ui': 3.0.8 1942 + happy-dom: '*' 1943 + jsdom: '*' 1944 + peerDependenciesMeta: 1945 + '@edge-runtime/vm': 1946 + optional: true 1947 + '@types/debug': 1948 + optional: true 1949 + '@types/node': 1950 + optional: true 1951 + '@vitest/browser': 1952 + optional: true 1953 + '@vitest/ui': 1954 + optional: true 1955 + happy-dom: 1956 + optional: true 1957 + jsdom: 1958 + optional: true 1959 + 1620 1960 webidl-conversions@3.0.1: 1621 1961 resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 1622 1962 ··· 1646 1986 which@2.0.2: 1647 1987 resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1648 1988 engines: {node: '>= 8'} 1989 + hasBin: true 1990 + 1991 + why-is-node-running@2.3.0: 1992 + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1993 + engines: {node: '>=8'} 1649 1994 hasBin: true 1650 1995 1651 1996 wrap-ansi@7.0.0: ··· 1993 2338 human-id: 4.1.1 1994 2339 prettier: 2.8.8 1995 2340 2341 + '@esbuild/aix-ppc64@0.25.1': 2342 + optional: true 2343 + 2344 + '@esbuild/android-arm64@0.25.1': 2345 + optional: true 2346 + 2347 + '@esbuild/android-arm@0.25.1': 2348 + optional: true 2349 + 2350 + '@esbuild/android-x64@0.25.1': 2351 + optional: true 2352 + 2353 + '@esbuild/darwin-arm64@0.25.1': 2354 + optional: true 2355 + 2356 + '@esbuild/darwin-x64@0.25.1': 2357 + optional: true 2358 + 2359 + '@esbuild/freebsd-arm64@0.25.1': 2360 + optional: true 2361 + 2362 + '@esbuild/freebsd-x64@0.25.1': 2363 + optional: true 2364 + 2365 + '@esbuild/linux-arm64@0.25.1': 2366 + optional: true 2367 + 2368 + '@esbuild/linux-arm@0.25.1': 2369 + optional: true 2370 + 2371 + '@esbuild/linux-ia32@0.25.1': 2372 + optional: true 2373 + 2374 + '@esbuild/linux-loong64@0.25.1': 2375 + optional: true 2376 + 2377 + '@esbuild/linux-mips64el@0.25.1': 2378 + optional: true 2379 + 2380 + '@esbuild/linux-ppc64@0.25.1': 2381 + optional: true 2382 + 2383 + '@esbuild/linux-riscv64@0.25.1': 2384 + optional: true 2385 + 2386 + '@esbuild/linux-s390x@0.25.1': 2387 + optional: true 2388 + 2389 + '@esbuild/linux-x64@0.25.1': 2390 + optional: true 2391 + 2392 + '@esbuild/netbsd-arm64@0.25.1': 2393 + optional: true 2394 + 2395 + '@esbuild/netbsd-x64@0.25.1': 2396 + optional: true 2397 + 2398 + '@esbuild/openbsd-arm64@0.25.1': 2399 + optional: true 2400 + 2401 + '@esbuild/openbsd-x64@0.25.1': 2402 + optional: true 2403 + 2404 + '@esbuild/sunos-x64@0.25.1': 2405 + optional: true 2406 + 2407 + '@esbuild/win32-arm64@0.25.1': 2408 + optional: true 2409 + 2410 + '@esbuild/win32-ia32@0.25.1': 2411 + optional: true 2412 + 2413 + '@esbuild/win32-x64@0.25.1': 2414 + optional: true 2415 + 1996 2416 '@isaacs/cliui@8.0.2': 1997 2417 dependencies: 1998 2418 string-width: 5.1.2 ··· 2167 2587 2168 2588 '@types/resolve@1.20.2': {} 2169 2589 2590 + '@vitest/expect@3.0.8': 2591 + dependencies: 2592 + '@vitest/spy': 3.0.8 2593 + '@vitest/utils': 3.0.8 2594 + chai: 5.2.0 2595 + tinyrainbow: 2.0.0 2596 + 2597 + '@vitest/mocker@3.0.8(vite@6.2.1(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0))': 2598 + dependencies: 2599 + '@vitest/spy': 3.0.8 2600 + estree-walker: 3.0.3 2601 + magic-string: 0.30.17 2602 + optionalDependencies: 2603 + vite: 6.2.1(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0) 2604 + 2605 + '@vitest/pretty-format@3.0.8': 2606 + dependencies: 2607 + tinyrainbow: 2.0.0 2608 + 2609 + '@vitest/runner@3.0.8': 2610 + dependencies: 2611 + '@vitest/utils': 3.0.8 2612 + pathe: 2.0.3 2613 + 2614 + '@vitest/snapshot@3.0.8': 2615 + dependencies: 2616 + '@vitest/pretty-format': 3.0.8 2617 + magic-string: 0.30.17 2618 + pathe: 2.0.3 2619 + 2620 + '@vitest/spy@3.0.8': 2621 + dependencies: 2622 + tinyspy: 3.0.2 2623 + 2624 + '@vitest/utils@3.0.8': 2625 + dependencies: 2626 + '@vitest/pretty-format': 3.0.8 2627 + loupe: 3.1.3 2628 + tinyrainbow: 2.0.0 2629 + 2170 2630 acorn@8.14.1: {} 2171 2631 2172 2632 ansi-colors@4.1.3: {} ··· 2210 2670 get-intrinsic: 1.3.0 2211 2671 is-array-buffer: 3.0.5 2212 2672 2673 + assertion-error@2.0.1: {} 2674 + 2213 2675 async-function@1.0.0: {} 2214 2676 2215 2677 available-typed-arrays@1.0.7: ··· 2244 2706 2245 2707 buffer-from@1.1.2: {} 2246 2708 2709 + cac@6.7.14: {} 2710 + 2247 2711 call-bind-apply-helpers@1.0.2: 2248 2712 dependencies: 2249 2713 es-errors: 1.3.0 ··· 2263 2727 2264 2728 caniuse-lite@1.0.30001703: {} 2265 2729 2730 + chai@5.2.0: 2731 + dependencies: 2732 + assertion-error: 2.0.1 2733 + check-error: 2.1.1 2734 + deep-eql: 5.0.2 2735 + loupe: 3.1.3 2736 + pathval: 2.0.0 2737 + 2266 2738 chalk@2.4.2: 2267 2739 dependencies: 2268 2740 ansi-styles: 3.2.1 ··· 2272 2744 chalk@5.4.1: {} 2273 2745 2274 2746 chardet@0.7.0: {} 2747 + 2748 + check-error@2.1.1: {} 2275 2749 2276 2750 ci-info@3.9.0: {} 2277 2751 ··· 2348 2822 dependencies: 2349 2823 ms: 2.1.3 2350 2824 2825 + deep-eql@5.0.2: {} 2826 + 2351 2827 deepmerge@4.3.1: {} 2352 2828 2353 2829 define-data-property@1.1.4: ··· 2455 2931 2456 2932 es-errors@1.3.0: {} 2457 2933 2934 + es-module-lexer@1.6.0: {} 2935 + 2458 2936 es-object-atoms@1.1.1: 2459 2937 dependencies: 2460 2938 es-errors: 1.3.0 ··· 2472 2950 is-date-object: 1.1.0 2473 2951 is-symbol: 1.1.1 2474 2952 2953 + esbuild@0.25.1: 2954 + optionalDependencies: 2955 + '@esbuild/aix-ppc64': 0.25.1 2956 + '@esbuild/android-arm': 0.25.1 2957 + '@esbuild/android-arm64': 0.25.1 2958 + '@esbuild/android-x64': 0.25.1 2959 + '@esbuild/darwin-arm64': 0.25.1 2960 + '@esbuild/darwin-x64': 0.25.1 2961 + '@esbuild/freebsd-arm64': 0.25.1 2962 + '@esbuild/freebsd-x64': 0.25.1 2963 + '@esbuild/linux-arm': 0.25.1 2964 + '@esbuild/linux-arm64': 0.25.1 2965 + '@esbuild/linux-ia32': 0.25.1 2966 + '@esbuild/linux-loong64': 0.25.1 2967 + '@esbuild/linux-mips64el': 0.25.1 2968 + '@esbuild/linux-ppc64': 0.25.1 2969 + '@esbuild/linux-riscv64': 0.25.1 2970 + '@esbuild/linux-s390x': 0.25.1 2971 + '@esbuild/linux-x64': 0.25.1 2972 + '@esbuild/netbsd-arm64': 0.25.1 2973 + '@esbuild/netbsd-x64': 0.25.1 2974 + '@esbuild/openbsd-arm64': 0.25.1 2975 + '@esbuild/openbsd-x64': 0.25.1 2976 + '@esbuild/sunos-x64': 0.25.1 2977 + '@esbuild/win32-arm64': 0.25.1 2978 + '@esbuild/win32-ia32': 0.25.1 2979 + '@esbuild/win32-x64': 0.25.1 2980 + 2475 2981 escalade@3.2.0: {} 2476 2982 2477 2983 escape-string-regexp@1.0.5: {} ··· 2480 2986 2481 2987 estree-walker@2.0.2: {} 2482 2988 2989 + estree-walker@3.0.3: 2990 + dependencies: 2991 + '@types/estree': 1.0.6 2992 + 2483 2993 eventemitter3@5.0.1: {} 2484 2994 2485 2995 execa@8.0.1: ··· 2493 3003 onetime: 6.0.0 2494 3004 signal-exit: 4.1.0 2495 3005 strip-final-newline: 3.0.0 3006 + 3007 + expect-type@1.2.0: {} 2496 3008 2497 3009 extendable-error@0.1.7: {} 2498 3010 ··· 2868 3380 strip-ansi: 7.1.0 2869 3381 wrap-ansi: 9.0.0 2870 3382 3383 + loupe@3.1.3: {} 3384 + 2871 3385 lru-cache@11.0.2: {} 2872 3386 2873 3387 lru-cache@5.1.1: ··· 2908 3422 mri@1.2.0: {} 2909 3423 2910 3424 ms@2.1.3: {} 3425 + 3426 + nanoid@3.3.9: {} 2911 3427 2912 3428 nice-try@1.0.5: {} 2913 3429 ··· 3019 3535 3020 3536 path-type@4.0.0: {} 3021 3537 3538 + pathe@2.0.3: {} 3539 + 3540 + pathval@2.0.0: {} 3541 + 3022 3542 picocolors@1.1.1: {} 3023 3543 3024 3544 picomatch@2.3.1: {} ··· 3035 3555 3036 3556 possible-typed-array-names@1.1.0: {} 3037 3557 3558 + postcss@8.5.3: 3559 + dependencies: 3560 + nanoid: 3.3.9 3561 + picocolors: 1.1.1 3562 + source-map-js: 1.2.1 3563 + 3038 3564 prettier@2.8.8: {} 3039 3565 3040 3566 prettier@3.5.3: {} ··· 3244 3770 side-channel-map: 1.0.1 3245 3771 side-channel-weakmap: 1.0.2 3246 3772 3773 + siginfo@2.0.0: {} 3774 + 3247 3775 signal-exit@4.1.0: {} 3248 3776 3249 3777 slash@3.0.0: {} ··· 3259 3787 is-fullwidth-code-point: 5.0.0 3260 3788 3261 3789 smob@1.5.0: {} 3790 + 3791 + source-map-js@1.2.1: {} 3262 3792 3263 3793 source-map-support@0.5.21: 3264 3794 dependencies: ··· 3287 3817 spdx-license-ids@3.0.21: {} 3288 3818 3289 3819 sprintf-js@1.0.3: {} 3820 + 3821 + stackback@0.0.2: {} 3822 + 3823 + std-env@3.8.1: {} 3290 3824 3291 3825 string-argv@0.3.2: {} 3292 3826 ··· 3365 3899 commander: 2.20.3 3366 3900 source-map-support: 0.5.21 3367 3901 3902 + tinybench@2.9.0: {} 3903 + 3904 + tinyexec@0.3.2: {} 3905 + 3906 + tinypool@1.0.2: {} 3907 + 3908 + tinyrainbow@2.0.0: {} 3909 + 3910 + tinyspy@3.0.2: {} 3911 + 3368 3912 tmp@0.0.33: 3369 3913 dependencies: 3370 3914 os-tmpdir: 1.0.2 ··· 3432 3976 spdx-correct: 3.2.0 3433 3977 spdx-expression-parse: 3.0.1 3434 3978 3979 + vite-node@3.0.8(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0): 3980 + dependencies: 3981 + cac: 6.7.14 3982 + debug: 4.4.0 3983 + es-module-lexer: 1.6.0 3984 + pathe: 2.0.3 3985 + vite: 6.2.1(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0) 3986 + transitivePeerDependencies: 3987 + - '@types/node' 3988 + - jiti 3989 + - less 3990 + - lightningcss 3991 + - sass 3992 + - sass-embedded 3993 + - stylus 3994 + - sugarss 3995 + - supports-color 3996 + - terser 3997 + - tsx 3998 + - yaml 3999 + 4000 + vite@6.2.1(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0): 4001 + dependencies: 4002 + esbuild: 0.25.1 4003 + postcss: 8.5.3 4004 + rollup: 4.34.9 4005 + optionalDependencies: 4006 + '@types/node': 18.19.76 4007 + fsevents: 2.3.3 4008 + terser: 5.39.0 4009 + yaml: 2.7.0 4010 + 4011 + vitest@3.0.8(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0): 4012 + dependencies: 4013 + '@vitest/expect': 3.0.8 4014 + '@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0)) 4015 + '@vitest/pretty-format': 3.0.8 4016 + '@vitest/runner': 3.0.8 4017 + '@vitest/snapshot': 3.0.8 4018 + '@vitest/spy': 3.0.8 4019 + '@vitest/utils': 3.0.8 4020 + chai: 5.2.0 4021 + debug: 4.4.0 4022 + expect-type: 1.2.0 4023 + magic-string: 0.30.17 4024 + pathe: 2.0.3 4025 + std-env: 3.8.1 4026 + tinybench: 2.9.0 4027 + tinyexec: 0.3.2 4028 + tinypool: 1.0.2 4029 + tinyrainbow: 2.0.0 4030 + vite: 6.2.1(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0) 4031 + vite-node: 3.0.8(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0) 4032 + why-is-node-running: 2.3.0 4033 + optionalDependencies: 4034 + '@types/node': 18.19.76 4035 + transitivePeerDependencies: 4036 + - jiti 4037 + - less 4038 + - lightningcss 4039 + - msw 4040 + - sass 4041 + - sass-embedded 4042 + - stylus 4043 + - sugarss 4044 + - supports-color 4045 + - terser 4046 + - tsx 4047 + - yaml 4048 + 3435 4049 webidl-conversions@3.0.1: {} 3436 4050 3437 4051 whatwg-url@5.0.0: ··· 3487 4101 which@2.0.2: 3488 4102 dependencies: 3489 4103 isexe: 2.0.0 4104 + 4105 + why-is-node-running@2.3.0: 4106 + dependencies: 4107 + siginfo: 2.0.0 4108 + stackback: 0.0.2 3490 4109 3491 4110 wrap-ansi@7.0.0: 3492 4111 dependencies:
+8 -5
src/asyncResourceGraph.ts
··· 35 35 this.callback = callback; 36 36 } 37 37 38 - _onExecute(executionNode: AsyncResourceNode, node: AsyncResourceNode) { 39 - this.callback(AsyncResourceFlags.INIT, executionNode); 38 + _onInit(node: AsyncResourceNode) { 39 + this.callback(AsyncResourceFlags.INIT, node); 40 40 if (node.fiberId === this.fiberId) { 41 41 this.observe(node); 42 42 } ··· 247 247 triggerNode.triggerTargets.set(asyncId, node); 248 248 } 249 249 if (this.notifyObserver) { 250 - this.notifyObserver._onExecute(this, node); 250 + this.notifyObserver._onInit(node); 251 251 } 252 252 } 253 253 ··· 273 273 } 274 274 275 275 toString() { 276 - return `[async ${this.type || `Fiber: ${this.fiberId}`}]`; 276 + const name = this.type 277 + ? `${this.type}(${this.asyncId})` 278 + : `Fiber: ${this.fiberId}`; 279 + return `[async ${name}]`; 277 280 } 278 281 } 279 282 ··· 513 516 514 517 return watchdogResult.promise; 515 518 } finally { 516 - fiber.root.active = false; 519 + fiber.root.active = true; 517 520 } 518 521 } 519 522
+4
src/errors.ts
··· 89 89 toString() { 90 90 return `${this.message.trim()}\n\n${this.trace}`; 91 91 } 92 + 93 + toJSON() { 94 + return this.toString(); 95 + } 92 96 }
+101
test/isolation.spec.ts
··· 1 + import { beforeAll, afterAll, it, expect } from 'vitest'; 2 + import { enable, disable, fiber } from '../src/index'; 3 + 4 + beforeAll(() => { 5 + enable(); 6 + }); 7 + 8 + afterAll(() => { 9 + disable(); 10 + }); 11 + 12 + it('prevents async resources from being shared into a fiber (sync)', async () => { 13 + const shared = new Promise(resolve => { 14 + setImmediate(resolve); 15 + }); 16 + 17 + await expect(() => { 18 + return fiber(async () => { 19 + await shared; 20 + }).return; 21 + }).rejects.toMatchObject({ 22 + code: 'PARENT_ASYNC_TRIGGER', 23 + }); 24 + }); 25 + 26 + it('prevents async resources from being shared into a fiber (async)', async () => { 27 + const shared = new Promise(resolve => { 28 + setImmediate(resolve); 29 + }); 30 + 31 + await expect(() => { 32 + return fiber(async () => { 33 + await Promise.resolve(); 34 + await shared; 35 + }).return; 36 + }).rejects.toMatchObject({ 37 + code: 'PARENT_ASYNC_TRIGGER', 38 + }); 39 + }); 40 + 41 + it('prevents async resources from being shared across fibers (sync)', async () => { 42 + let shared: Promise<unknown>; 43 + 44 + fiber(async () => { 45 + shared = new Promise(resolve => { 46 + setImmediate(resolve); 47 + }); 48 + }); 49 + 50 + await expect(() => { 51 + return fiber(async () => { 52 + await shared; 53 + }).return; 54 + }).rejects.toMatchObject({ 55 + code: 'FOREIGN_ASYNC_TRIGGER', 56 + }); 57 + }); 58 + 59 + it('prevents async resources from being shared across fibers (async)', async () => { 60 + let shared: Promise<unknown>; 61 + 62 + fiber(async () => { 63 + shared = new Promise(resolve => { 64 + setImmediate(resolve); 65 + }); 66 + }); 67 + 68 + await expect(() => { 69 + return fiber(async () => { 70 + await Promise.resolve(); 71 + await shared; 72 + }).return; 73 + }).rejects.toMatchObject({ 74 + code: 'FOREIGN_ASYNC_TRIGGER', 75 + }); 76 + }); 77 + 78 + it('prevents `new Promise` stalls from waiting indefinitely (sync)', async () => { 79 + await expect(() => { 80 + return fiber(async () => { 81 + await new Promise(() => { 82 + /*noop*/ 83 + }); 84 + }).return; 85 + }).rejects.toMatchObject({ 86 + code: 'FIBER_STALL', 87 + }); 88 + }); 89 + 90 + it('prevents `new Promise` stalls from waiting indefinitely (async)', async () => { 91 + await expect(() => { 92 + return fiber(async () => { 93 + await Promise.resolve(); 94 + await new Promise(() => { 95 + /*noop*/ 96 + }); 97 + }).return; 98 + }).rejects.toMatchObject({ 99 + code: 'FIBER_STALL', 100 + }); 101 + });