diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..84a1f0c --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,41 @@ +name: CI + +on: [push, pull_request] + +jobs: + test: + name: Test Node.js ${{ matrix.node-version }} + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + node-version: + - 18 + - 20 + - 21 + - 22 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9.10.0 + run_install: false + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: "pnpm" + + - name: Install dependencies + run: pnpm install --frozen-lockfile --strict-peer-dependencies + + - name: Run test + run: pnpm test + + - name: Run build + run: pnpm build diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..5d814d3 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "singleQuote": false, + "jsxSingleQuote": false, + "semi": true, + "useTabs": false, + "tabWidth": 2, + "bracketSpacing": true, + "bracketSameLine": false, + "arrowParens": "always", + "trailingComma": "es5" +} diff --git a/README.md b/README.md index 859721f..325c1f5 100644 --- a/README.md +++ b/README.md @@ -6,23 +6,42 @@ $ pnpm bench ## Features -- Configurable dependency graph: graph shape, density, read rate are all adjustable. +- Configurable dependency graph: graph shape, density, read rate are all adjustable - Easily add new benchmarks and frameworks - Supports dynamic reactive nodes -- Framework agnostic. Simple API to test new reactive frameworks. -- Uses v8 intrinsics to warmup and cleanup -- Tracks garbage collection overhead per test -- Outputs a csv file for easy integration with other tools. - +- Framework agnostic. Simple API to test new reactive frameworks +- Forces garbage collection between each test +- Outputs a csv file for easy integration with other tools Current reactivity benchmarks ([S.js](https://github.com/adamhaile/S/blob/master/bench/bench.js), [CellX](https://github.com/Riim/cellx/blob/master/perf/perf.html)) are focused on creation time, and update time for a static graph. Additionally, existing benchmarks aren't very configurable, and don't test for dynamic dependencies. We've created a new benchmark that allows library authors to compare their frameworks against each other, and against the existing benchmarks, as well as against a new configurable benchmark with dynamically changing sources. We're also working on enabling consistent logging and efficient tracking of GC time across all benchmarks. -The frameworks are all plenty fast for typical applications. The charts report the run time of the test in milliseconds on an M1 laptop, and are made using [Tableau](https://public.tableau.com/). Typical applications will do much more work than a framework benchmark, and at these speeds the frameworks are unlikely to bottleneck overall performance. - -That said, there's learning here to improve performance of all the frameworks. - -![Performance Results](https://user-images.githubusercontent.com/14153763/221107379-51a93eab-95ac-4c89-9a74-7a1527fc4a03.png) - -![Raw](https://user-images.githubusercontent.com/14153763/222212050-5b651e4d-6e71-4667-94e7-eb94b7030bc1.png) +## Frameworks + +- [Angular Signals](https://angular.dev/guide/signals/) +- [Compostate](https://github.com/lxsmnsyc/compostate) +- [Kairo](https://github.com/3Shain/kairo) +- [MobX](https://mobx.js.org) +- [mol wire](https://www.npmjs.com/package/mol_wire_lib) +- [Oby](https://github.com/vobyjs/oby) +- [Preact Signals](https://github.com/preactjs/signals) +- [Reactively](https://github.com/milomg/reactively) +- [S.js](https://github.com/adamhaile/S) +- [Signia](https://github.com/tldraw/signia) +- [Solid](https://github.com/solidjs/solid) +- [Svelte v5](https://svelte.dev/blog/runes) +- [TC39 Signals Proposal](https://github.com/tc39/proposal-signals) [polyfill](https://github.com/proposal-signals/signal-polyfill) +- [uSignal](https://github.com/WebReflection/usignal) +- [Valtio](https://github.com/pmndrs/valtio) +- [Vue Reactivity](https://vuejs.org/guide/essentials/reactivity-fundamentals.html) +- [x-reactivity](https://www.npmjs.com/package/@solidjs/reactivity) + +## Results + +

+ Average benchmark results across frameworks + (lower times are better) +

+ +These results were last updated _September 2024_ on an M3 Macbook Pro using Node.js v22.4.1. diff --git a/package.json b/package.json index 6cba0c9..cbb44b6 100644 --- a/package.json +++ b/package.json @@ -4,38 +4,40 @@ "description": "", "main": "index.js", "scripts": { - "test": "vitest", - "bench": "esbuild src/index.ts --external:v8-natives --bundle --format=cjs --platform=node | node --allow-natives-syntax" + "test": "vitest run", + "build": "esbuild src/index.ts --bundle --format=cjs --platform=node --outdir=dist --sourcemap=external", + "run": "node --expose-gc dist/index.js", + "bench": "esbuild src/index.ts --bundle --format=cjs --platform=node | node --expose-gc" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { - "@angular/core": "17.0.0-rc.1", - "@preact/signals": "^1.2.1", + "@angular/core": "18.2.4", + "@preact/signals": "^1.3.0", "@reactively/core": "^0.0.8", "@solidjs/reactivity": "^0.0.9", - "@vue/reactivity": "^3.3.4", - "compostate": "^0.5.1", + "@vue/reactivity": "^3.5.6", + "compostate": "0.5.1", "kairo": "0.6.0-rc.0", - "mobx": "^6.10.0", - "mol_wire_lib": "^1.0.707", - "oby": "14.3.1", - "preact": "^10.17.1", + "mobx": "^6.13.2", + "mol_wire_lib": "^1.0.1158", + "oby": "15.1.2", + "preact": "^10.24.0", + "random": "^5.1.0", + "react": "^18.3.1", "s-js": "^0.4.9", - "solid-js": "^1.7.11", - "usignal": "^0.9.0" + "signal-polyfill": "^0.1.0", + "signia": "^0.1.5", + "solid-js": "^1.8.22", + "svelte": "5.0.0-next.249", + "usignal": "^0.9.0", + "valtio": "^2.0.0" }, "devDependencies": { - "@types/node": "^20.5.1", - "esbuild": "^0.19.2", - "rxjs": "^7.8.1", - "v8-natives": "^1.2.5", - "vitest": "^0.34.2" - }, - "pnpm": { - "patchedDependencies": { - "@angular/core@16.2.1": "patches/@angular__core@16.2.1.patch" - } + "@types/node": "^22.5.5", + "esbuild": "^0.23.1", + "prettier": "^3.3.3", + "vitest": "^2.1.1" } } diff --git a/patches/@angular__core@16.2.1.patch b/patches/@angular__core@16.2.1.patch deleted file mode 100644 index ff33acc..0000000 --- a/patches/@angular__core@16.2.1.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/fesm2022/core.mjs b/fesm2022/core.mjs -index 7a60a7e0e20934065cb8d111a3227839490311fc..095f634db9f00a08bdd90c26697227e3b563ff71 100755 ---- a/fesm2022/core.mjs -+++ b/fesm2022/core.mjs -@@ -12657,7 +12657,7 @@ function renderChildComponents(hostLView, components) { - /** - * Tracks all effects registered within a given application and runs them via `flush`. - */ --class EffectManager { -+export class EffectManager { - constructor() { - this.all = new Set(); - this.queue = new Map(); -diff --git a/index.d.ts b/index.d.ts -index 5ac045127388e0f8639d57b7d091a39af35bf719..1a06e59e552b61722ea0022b9b8e4e9de6594131 100755 ---- a/index.d.ts -+++ b/index.d.ts -@@ -3119,7 +3119,7 @@ declare type EffectCleanupRegisterFn = (cleanupFn: EffectCleanupFn) => void; - /** - * Tracks all effects registered within a given application and runs them via `flush`. - */ --declare class EffectManager { -+export declare class EffectManager { - private all; - private queue; - create(effectFn: (onCleanup: (cleanupFn: EffectCleanupFn) => void) => void, destroyRef: DestroyRef | null, allowSignalWrites: boolean): EffectRef; \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 802d91c..2ceb6a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,24 +1,19 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -patchedDependencies: - '@angular/core@16.2.1': - hash: cohf6jg3ccnbxneujnxfl4rlvu - path: patches/@angular__core@16.2.1.patch - importers: .: dependencies: '@angular/core': - specifier: 17.0.0-rc.1 - version: 17.0.0-rc.1(rxjs@7.8.1)(zone.js@0.14.1) + specifier: 18.2.4 + version: 18.2.4(rxjs@7.8.1)(zone.js@0.15.0) '@preact/signals': - specifier: ^1.2.1 - version: 1.2.1(preact@10.17.1) + specifier: ^1.3.0 + version: 1.3.0(preact@10.24.0) '@reactively/core': specifier: ^0.0.8 version: 0.0.8 @@ -26,51 +21,66 @@ importers: specifier: ^0.0.9 version: 0.0.9 '@vue/reactivity': - specifier: ^3.3.4 - version: 3.3.4 + specifier: ^3.5.6 + version: 3.5.6 compostate: - specifier: ^0.5.1 + specifier: 0.5.1 version: 0.5.1 kairo: specifier: 0.6.0-rc.0 version: 0.6.0-rc.0 mobx: - specifier: ^6.10.0 - version: 6.10.0 + specifier: ^6.13.2 + version: 6.13.2 mol_wire_lib: - specifier: ^1.0.707 - version: 1.0.707 + specifier: ^1.0.1158 + version: 1.0.1158 oby: - specifier: 14.3.1 - version: 14.3.1 + specifier: 15.1.2 + version: 15.1.2 preact: - specifier: ^10.17.1 - version: 10.17.1 + specifier: ^10.24.0 + version: 10.24.0 + random: + specifier: ^5.1.0 + version: 5.1.0 + react: + specifier: ^18.3.1 + version: 18.3.1 s-js: specifier: ^0.4.9 version: 0.4.9 + signal-polyfill: + specifier: ^0.1.0 + version: 0.1.2 + signia: + specifier: ^0.1.5 + version: 0.1.5 solid-js: - specifier: ^1.7.11 - version: 1.7.11 + specifier: ^1.8.22 + version: 1.8.22 + svelte: + specifier: 5.0.0-next.249 + version: 5.0.0-next.249 usignal: specifier: ^0.9.0 version: 0.9.0 + valtio: + specifier: ^2.0.0 + version: 2.0.0(react@18.3.1) devDependencies: '@types/node': - specifier: ^20.5.1 - version: 20.5.1 + specifier: ^22.5.5 + version: 22.5.5 esbuild: - specifier: ^0.19.2 - version: 0.19.2 - rxjs: - specifier: ^7.8.1 - version: 7.8.1 - v8-natives: - specifier: ^1.2.5 - version: 1.2.5 + specifier: ^0.23.1 + version: 0.23.1 + prettier: + specifier: ^3.3.3 + version: 3.3.3 vitest: - specifier: ^0.34.2 - version: 0.34.2 + specifier: ^2.1.1 + version: 2.1.1(@types/node@22.5.5) packages/bench: devDependencies: @@ -101,1389 +111,1018 @@ importers: packages: - /@angular/core@17.0.0-rc.1(rxjs@7.8.1)(zone.js@0.14.1): - resolution: {integrity: sha512-qz5Xjye2XkmBp+4vSxpPVM6yXs/36oXx/FUQa6PDP/DrW9wrCxSELf2g9PHT84xDgq6BhBqca0a4fq+QFURTqg==} - engines: {node: '>=18.13.0'} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@angular/core@18.2.4': + resolution: {integrity: sha512-ulYmYpI/ZVQ5BL38rBy4DS/9wgGWmVD9Uo6tcrLqCzt1G1G2nKwseZv009536pHfk6dj2HdPSkpcerhWh57DWw==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} peerDependencies: rxjs: ^6.5.3 || ^7.4.0 - zone.js: ~0.14.0 - dependencies: - rxjs: 7.8.1 - tslib: 2.6.2 - zone.js: 0.14.1 - dev: false + zone.js: ~0.14.10 + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - /@esbuild/android-arm64@0.16.17: + '@esbuild/android-arm64@0.16.17': resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.19.2: - resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.16.17: + '@esbuild/android-arm@0.16.17': resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.19.2: - resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.16.17: + '@esbuild/android-x64@0.16.17': resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.19.2: - resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.16.17: + '@esbuild/darwin-arm64@0.16.17': resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.19.2: - resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.16.17: + '@esbuild/darwin-x64@0.16.17': resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.19.2: - resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.16.17: + '@esbuild/freebsd-arm64@0.16.17': resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.19.2: - resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.16.17: + '@esbuild/freebsd-x64@0.16.17': resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.19.2: - resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.16.17: + '@esbuild/linux-arm64@0.16.17': resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.19.2: - resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.16.17: + '@esbuild/linux-arm@0.16.17': resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.19.2: - resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.16.17: + '@esbuild/linux-ia32@0.16.17': resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.19.2: - resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.16.17: + '@esbuild/linux-loong64@0.16.17': resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.19.2: - resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.16.17: + '@esbuild/linux-mips64el@0.16.17': resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.19.2: - resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.16.17: + '@esbuild/linux-ppc64@0.16.17': resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.19.2: - resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.16.17: + '@esbuild/linux-riscv64@0.16.17': resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.19.2: - resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.16.17: + '@esbuild/linux-s390x@0.16.17': resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.19.2: - resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.16.17: + '@esbuild/linux-x64@0.16.17': resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.19.2: - resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.16.17: + '@esbuild/netbsd-x64@0.16.17': resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.19.2: - resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.16.17: + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.16.17': resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.19.2: - resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.16.17: + '@esbuild/sunos-x64@0.16.17': resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.19.2: - resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.16.17: + '@esbuild/win32-arm64@0.16.17': resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.19.2: - resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.16.17: + '@esbuild/win32-ia32@0.16.17': resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.19.2: - resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.16.17: + '@esbuild/win32-x64@0.16.17': resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.2: - resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@jest/schemas@29.6.0: - resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} - /@preact/signals-core@1.4.0: - resolution: {integrity: sha512-5iYoZBhELLIhUQceZI7sDTQWPb+xcVSn2qk8T/aNl/VMh+A4AiPX9YRSh4XO7fZ6pncrVxl1Iln82poVqYVbbw==} - dev: false + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} - /@preact/signals@1.2.1(preact@10.17.1): - resolution: {integrity: sha512-hRPvp1C2ooDzOHqfnhdpHgoIFDbYFAXLhoid3+jSItuPPD/J0r/UsiWKv/8ZO/oEhjRaP0M5niuRYsWqmY2GEA==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@preact/signals-core@1.8.0': + resolution: {integrity: sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==} + + '@preact/signals@1.3.0': + resolution: {integrity: sha512-EOMeg42SlLS72dhoq6Vjq08havnLseWmPQ8A0YsgIAqMgWgx7V1a39+Pxo6i7SY5NwJtH4849JogFq3M67AzWg==} peerDependencies: preact: 10.x - dependencies: - '@preact/signals-core': 1.4.0 - preact: 10.17.1 - dev: false - /@reactively/core@0.0.8: + '@reactively/core@0.0.8': resolution: {integrity: sha512-5uAnNf2gQSm3gM7z6Lx079H1/MuDQQI+5aYfwyDFGR9nHZj8yblLY/6aOJVWp+NcBwXVBKuWQ28qWHD9F1qN1w==} - dev: false - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true + '@rollup/rollup-android-arm-eabi@4.21.3': + resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==} + cpu: [arm] + os: [android] - /@solidjs/reactivity@0.0.9: - resolution: {integrity: sha512-duaaHwXTTY/YF+H9AT4ZEiL6H9FwMxQOMrTIDpsRYLBkbl3Y/FKaeoYu7CK4Ontbra6/LAi0DZyb/M6vCcJoMw==} - dev: false + '@rollup/rollup-android-arm64@4.21.3': + resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==} + cpu: [arm64] + os: [android] - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} - dependencies: - '@types/chai': 4.3.5 - dev: true + '@rollup/rollup-darwin-arm64@4.21.3': + resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.21.3': + resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.21.3': + resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.21.3': + resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==} + cpu: [arm64] + os: [linux] - /@types/chai@4.3.5: - resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} - dev: true + '@rollup/rollup-linux-arm64-musl@4.21.3': + resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.21.3': + resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.21.3': + resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.21.3': + resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.21.3': + resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.21.3': + resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.21.3': + resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.21.3': + resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==} + cpu: [x64] + os: [win32] + + '@solidjs/reactivity@0.0.9': + resolution: {integrity: sha512-duaaHwXTTY/YF+H9AT4ZEiL6H9FwMxQOMrTIDpsRYLBkbl3Y/FKaeoYu7CK4Ontbra6/LAi0DZyb/M6vCcJoMw==} - /@types/node@18.14.0: + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/node@18.14.0': resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==} - dev: true - /@types/node@20.5.1: - resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} - dev: true + '@types/node@22.5.5': + resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} - /@vitest/expect@0.34.2: - resolution: {integrity: sha512-EZm2dMNlLyIfDMha17QHSQcg2KjeAZaXd65fpPzXY5bvnfx10Lcaz3N55uEe8PhF+w4pw+hmrlHLLlRn9vkBJg==} - dependencies: - '@vitest/spy': 0.34.2 - '@vitest/utils': 0.34.2 - chai: 4.3.7 - dev: true + '@vitest/expect@2.1.1': + resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} - /@vitest/runner@0.34.2: - resolution: {integrity: sha512-8ydGPACVX5tK3Dl0SUwxfdg02h+togDNeQX3iXVFYgzF5odxvaou7HnquALFZkyVuYskoaHUOqOyOLpOEj5XTA==} - dependencies: - '@vitest/utils': 0.34.2 - p-limit: 4.0.0 - pathe: 1.1.1 - dev: true + '@vitest/mocker@2.1.1': + resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} + peerDependencies: + '@vitest/spy': 2.1.1 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - /@vitest/snapshot@0.34.2: - resolution: {integrity: sha512-qhQ+xy3u4mwwLxltS4Pd4SR+XHv4EajiTPNY3jkIBLUApE6/ce72neJPSUQZ7bL3EBuKI+NhvzhGj3n5baRQUQ==} - dependencies: - magic-string: 0.30.2 - pathe: 1.1.1 - pretty-format: 29.6.2 - dev: true + '@vitest/pretty-format@2.1.1': + resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} - /@vitest/spy@0.34.2: - resolution: {integrity: sha512-yd4L9OhfH6l0Av7iK3sPb3MykhtcRN5c5K5vm1nTbuN7gYn+yvUVVsyvzpHrjqS7EWqn9WsPJb7+0c3iuY60tA==} - dependencies: - tinyspy: 2.1.1 - dev: true + '@vitest/runner@2.1.1': + resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} - /@vitest/utils@0.34.2: - resolution: {integrity: sha512-Lzw+kAsTPubhoQDp1uVAOP6DhNia1GMDsI9jgB0yMn+/nDaPieYQ88lKqz/gGjSHL4zwOItvpehec9OY+rS73w==} - dependencies: - diff-sequences: 29.4.3 - loupe: 2.3.6 - pretty-format: 29.6.2 - dev: true + '@vitest/snapshot@2.1.1': + resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} - /@vue/reactivity@3.3.4: - resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} - dependencies: - '@vue/shared': 3.3.4 - dev: false + '@vitest/spy@2.1.1': + resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} - /@vue/shared@3.3.4: - resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} - dev: false + '@vitest/utils@2.1.1': + resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true + '@vue/reactivity@3.5.6': + resolution: {integrity: sha512-shZ+KtBoHna5GyUxWfoFVBCVd7k56m6lGhk5e+J9AKjheHF6yob5eukssHRI+rzvHBiU1sWs/1ZhNbLExc5oYQ==} - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + '@vue/shared@3.5.6': + resolution: {integrity: sha512-eidH0HInnL39z6wAt6SFIwBrvGOpDWsDxlw3rCgo1B+CQ1781WzQUSU3YjxgdkcJo9Q8S6LmXTkvI+cLHGkQfA==} + + acorn-typescript@1.4.13: + resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} + peerDependencies: + acorn: '>=8.9.0' + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true - dev: true - /ansi-regex@4.1.1: + ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} - dev: true - /ansi-styles@3.2.1: + ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - /anymatch@3.1.3: + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + aria-query@5.3.1: + resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} + engines: {node: '>= 0.4'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} - /binary-extensions@2.2.0: + binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - dev: true - /braces@3.0.2: + braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - /cac@6.7.14: + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - dev: true - /camelcase@5.3.1: + camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - dev: true - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true - - /chokidar-cli@3.0.0: + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar-cli@3.0.0: resolution: {integrity: sha512-xVW+Qeh7z15uZRxHOkP93Ux8A0xbPzwK4GaqD8dQOYc34TlkqUhVSS59fK36DOp5WdJlrRzlYSy02Ht99FjZqQ==} engines: {node: '>= 8.10.0'} hasBin: true - dependencies: - chokidar: 3.5.3 - lodash.debounce: 4.0.8 - lodash.throttle: 4.1.1 - yargs: 13.3.2 - dev: true - /chokidar@3.5.3: + chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - /cliui@5.0.0: + cliui@5.0.0: resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} - dependencies: - string-width: 3.1.0 - strip-ansi: 5.2.0 - wrap-ansi: 5.1.0 - dev: true - /color-convert@1.9.3: + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - /color-name@1.1.3: + color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - /compostate@0.5.1: + compostate@0.5.1: resolution: {integrity: sha512-TriUixTf5T78fh1jZzTTPaj3TE2ARTbQd34x/v7ZUOd1IHoN1FkX/jGpfRDjEnZZ4jGaT2TxPWTquNAGdkmeLQ==} engines: {node: '>=10'} - dev: false - /csstype@3.1.1: + csstype@3.1.1: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} - dev: true - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - dev: false + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - dependencies: - ms: 2.1.2 - dev: true - /decamelize@1.2.0: + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - dev: true - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /diff-sequences@29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /emoji-regex@7.0.3: + emoji-regex@7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} - dev: true - /esbuild@0.16.17: + esbuild@0.16.17: resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.16.17 - '@esbuild/android-arm64': 0.16.17 - '@esbuild/android-x64': 0.16.17 - '@esbuild/darwin-arm64': 0.16.17 - '@esbuild/darwin-x64': 0.16.17 - '@esbuild/freebsd-arm64': 0.16.17 - '@esbuild/freebsd-x64': 0.16.17 - '@esbuild/linux-arm': 0.16.17 - '@esbuild/linux-arm64': 0.16.17 - '@esbuild/linux-ia32': 0.16.17 - '@esbuild/linux-loong64': 0.16.17 - '@esbuild/linux-mips64el': 0.16.17 - '@esbuild/linux-ppc64': 0.16.17 - '@esbuild/linux-riscv64': 0.16.17 - '@esbuild/linux-s390x': 0.16.17 - '@esbuild/linux-x64': 0.16.17 - '@esbuild/netbsd-x64': 0.16.17 - '@esbuild/openbsd-x64': 0.16.17 - '@esbuild/sunos-x64': 0.16.17 - '@esbuild/win32-arm64': 0.16.17 - '@esbuild/win32-ia32': 0.16.17 - '@esbuild/win32-x64': 0.16.17 - dev: true - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - dev: true - - /esbuild@0.19.2: - resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} - engines: {node: '>=12'} + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.19.2 - '@esbuild/android-arm64': 0.19.2 - '@esbuild/android-x64': 0.19.2 - '@esbuild/darwin-arm64': 0.19.2 - '@esbuild/darwin-x64': 0.19.2 - '@esbuild/freebsd-arm64': 0.19.2 - '@esbuild/freebsd-x64': 0.19.2 - '@esbuild/linux-arm': 0.19.2 - '@esbuild/linux-arm64': 0.19.2 - '@esbuild/linux-ia32': 0.19.2 - '@esbuild/linux-loong64': 0.19.2 - '@esbuild/linux-mips64el': 0.19.2 - '@esbuild/linux-ppc64': 0.19.2 - '@esbuild/linux-riscv64': 0.19.2 - '@esbuild/linux-s390x': 0.19.2 - '@esbuild/linux-x64': 0.19.2 - '@esbuild/netbsd-x64': 0.19.2 - '@esbuild/openbsd-x64': 0.19.2 - '@esbuild/sunos-x64': 0.19.2 - '@esbuild/win32-arm64': 0.19.2 - '@esbuild/win32-ia32': 0.19.2 - '@esbuild/win32-x64': 0.19.2 - dev: true - - /fill-range@7.0.1: + + esm-env@1.0.0: + resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + + esrap@1.2.2: + resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - /find-up@3.0.0: + find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} - dependencies: - locate-path: 3.0.0 - dev: true - /fsevents@2.3.2: + fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - requiresBuild: true - dev: true - optional: true - /fsevents@2.3.3: + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - requiresBuild: true - dev: true - optional: true - /get-caller-file@2.0.5: + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: true - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - /glob-parent@5.1.2: + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - /is-binary-path@2.1.0: + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - /is-extglob@2.1.1: + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - dev: true - /is-fullwidth-code-point@2.0.0: + is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} - dev: true - /is-glob@4.0.3: + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - /is-number@7.0.0: + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - dev: true - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /kairo@0.6.0-rc.0: + kairo@0.6.0-rc.0: resolution: {integrity: sha512-8yWTOujaeU5a6FtFCQnRhljxo8KaxQVDV6xJFxEpkCKd2azlMBmc5ARazaQUb/KJ2PWzsVdiXRbvFmreP6pbFA==} - dev: false - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - dev: true + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} - /locate-path@3.0.0: + locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - dev: true - /lodash.debounce@4.0.8: + lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: true - /lodash.throttle@4.1.1: + lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: true - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} - dependencies: - get-func-name: 2.0.0 - dev: true + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true - /magic-string@0.30.2: - resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} - /mlly@1.4.0: - resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} - dependencies: - acorn: 8.10.0 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.2.0 - dev: true + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} - /mobx@6.10.0: - resolution: {integrity: sha512-WMbVpCMFtolbB8swQ5E2YRrU+Yu8iLozCVx3CdGjbBKlP7dFiCSuiG06uea3JCFN5DnvtAX7+G5Bp82e2xu0ww==} - dev: false + mobx@6.13.2: + resolution: {integrity: sha512-GIubI2qf+P6lG6rSEG0T2pg3jV9/0+O0ncF09+0umRe75+Cbnh1KNLM1GvbTY9RSc7QuU+LcPNZfxDY8B+3XRg==} - /mol_wire_lib@1.0.488: - resolution: {integrity: sha512-AqGNHtM5HvxdYKXMt85ESXG+Owj/E6HEUM2a0SKoCpx+R4uHrqM3V8HABt13twXzMDDfjO713TRWQb7Qb4EQRA==} - dev: true + mol_wire_lib@1.0.1158: + resolution: {integrity: sha512-ZUsjaBJmxiRH9Lw/+J+sdMBMGHVx/jyZYtpJ/srf4IdsdIMzy8mRXENzjHsLfZw7O/e9RKRXGawRHOx3qT2IQA==} - /mol_wire_lib@1.0.707: - resolution: {integrity: sha512-Ggig8FLegQdcIqOVP4bgV2jsBoozd0ThqvBW7iEE5a+Ld/A1NfmgMlS8dyOSL+24ksM+NxkCGYJjU4SI3Llnfg==} - dev: false + mol_wire_lib@1.0.488: + resolution: {integrity: sha512-AqGNHtM5HvxdYKXMt85ESXG+Owj/E6HEUM2a0SKoCpx+R4uHrqM3V8HABt13twXzMDDfjO713TRWQb7Qb4EQRA==} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: true - /normalize-path@3.0.0: + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - dev: true - /oby@14.3.1: - resolution: {integrity: sha512-/5BvIarE2epsV2DDjcBf6R7DvcoUqtU62AOEEQyUqaKzwz0kdpB6huOG8anaqU0Asa9UGPFxdQWVbUPpEGLkuw==} - dev: false + oby@15.1.2: + resolution: {integrity: sha512-6QD9iEoPzV+pMDdcg3RtFWhgDX8pS5hZouVHvgXGDy3Q9RxFfnI3CYv9i62keeuX+qk6iN2z5E9FD3q3OckZ6A==} - /p-limit@2.3.0: + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - yocto-queue: 1.0.0 - dev: true - /p-locate@3.0.0: + p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} - dependencies: - p-limit: 2.3.0 - dev: true - /p-try@2.2.0: + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - dev: true - /path-exists@3.0.0: + path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} - dev: true - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: true + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} - /picomatch@2.3.1: + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - dev: true - - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.0 - pathe: 1.1.1 - dev: true - /postcss@8.4.28: - resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /preact@10.17.1: - resolution: {integrity: sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA==} - dev: false - - /pretty-format@29.6.2: - resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true + preact@10.24.0: + resolution: {integrity: sha512-aK8Cf+jkfyuZ0ZZRG9FbYqwmEiGQ4y/PUO4SuTWoyWL244nZZh7bd5h2APd4rSNDYTBNghg1L+5iJN3Skxtbsw==} + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + proxy-compare@3.0.0: + resolution: {integrity: sha512-y44MCkgtZUCT9tZGuE278fB7PWVf7fRYy0vbRXAts2o5F0EfC4fIQrvQQGBJo1WJbFcVLXzApOscyJuZqHQc1w==} + + random@5.1.0: + resolution: {integrity: sha512-0NGG4HMW9sTstLbignEDasSQJlCGkNQZICIWStZ+h4SzSJfZXpecGKV7qL0AOKcIT8XX9pJ49uZnvI0n/Y+vWA==} + engines: {node: '>=18'} + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} - /readdirp@3.6.0: + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - /require-directory@2.1.1: + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: true - /require-main-filename@2.0.0: + require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: true - /rollup@3.28.0: - resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} + rollup@4.21.3: + resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - optionalDependencies: - fsevents: 2.3.3 - dev: true - /rxjs@7.8.1: + rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.6.2 - /s-js@0.4.9: + s-js@0.4.9: resolution: {integrity: sha512-RtpOm+cM6O0sHg6IA70wH+UC3FZcND+rccBZpBAHzlUgNO2Bm5BN+FnM8+OBxzXdwpKWFwX11JGF0MFRkhSoIQ==} - dev: false - /seroval@0.5.1: - resolution: {integrity: sha512-ZfhQVB59hmIauJG5Ydynupy8KHyr5imGNtdDhbZG68Ufh1Ynkv9KOYOAABf71oVbQxJ8VkWnMHAjEHE7fWkH5g==} + seroval-plugins@1.1.1: + resolution: {integrity: sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.1.1: + resolution: {integrity: sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==} engines: {node: '>=10'} - dev: false - /set-blocking@2.0.0: + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true - /siginfo@2.0.0: + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - /solid-js@1.6.11: + signal-polyfill@0.1.2: + resolution: {integrity: sha512-HT9d+L9NMiTzMxb/tU2Baym6129ROyRETSjvchvSkQa7wN0+SrG/IUlsaBLqKn2c+4mlze6CgQBEvgBjxOpiaQ==} + + signia@0.1.5: + resolution: {integrity: sha512-ViJpywl7H1W6zRfqbu+86xpSCcuq6tpOen7I+gR8axaiyZP8txRNAoeCsL20UkuqzG/Ybtk0u4C2lawkiwPlnw==} + + solid-js@1.6.11: resolution: {integrity: sha512-JquQQHPArGq+i2PLURxJ99Pcz2/1docpbycSio/cKSA0SeI3z5zRjy0TNcH4NRYvbOLrcini+iovXwnexKabyw==} - dependencies: - csstype: 3.1.1 - dev: true - /solid-js@1.7.11: - resolution: {integrity: sha512-JkuvsHt8jqy7USsy9xJtT18aF9r2pFO+GB8JQ2XGTvtF49rGTObB46iebD25sE3qVNvIbwglXOXdALnJq9IHtQ==} - dependencies: - csstype: 3.1.2 - seroval: 0.5.1 - dev: false + solid-js@1.8.22: + resolution: {integrity: sha512-VBzN5j+9Y4rqIKEnK301aBk+S7fvFSTs9ljg+YEdFxjNjH0hkjXPiQRcws9tE5fUzMznSS6KToL5hwMfHDgpLA==} - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - dev: true - /stackback@0.0.2: + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - /std-env@3.4.0: - resolution: {integrity: sha512-YqHeQIIQ8r1VtUZOTOyjsAXAsjr369SplZ5rlQaiJTBsvodvPSCME7vuz8pnQltbQ0Cw0lyFo5Q8uyNwYQ58Xw==} - dev: true + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - /string-width@3.1.0: + string-width@3.1.0: resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} engines: {node: '>=6'} - dependencies: - emoji-regex: 7.0.3 - is-fullwidth-code-point: 2.0.0 - strip-ansi: 5.2.0 - dev: true - /strip-ansi@5.2.0: + strip-ansi@5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} - dependencies: - ansi-regex: 4.1.1 - dev: true - /strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} - dependencies: - acorn: 8.10.0 - dev: true + svelte@5.0.0-next.249: + resolution: {integrity: sha512-vbGir3ScQJjdKyWjhLi4aXc0DpilL4zVzC8UdEksoUhvP6OcaXrTC3aitHfSmdQ+FDntDLUWtytZMA01nRBs6Q==} + engines: {node: '>=18'} - /tinybench@2.5.0: - resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} - dev: true + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - /tinypool@0.7.0: - resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} - dev: true - /tinyspy@2.1.1: - resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - dev: true - /to-regex-range@5.0.1: + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /typescript@4.9.5: + typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true - dev: true - /ufo@1.2.0: - resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} - dev: true + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - /usignal@0.8.14: + usignal@0.8.14: resolution: {integrity: sha512-pPWOcODVi1bT11Mj1j4wfQkbHJA4uhvZrHuiQDs15J+mKy46WgeJhyYRGTGAa4Zox2cKjAmurDtJkoD9lURUnQ==} - dev: true - /usignal@0.9.0: + usignal@0.9.0: resolution: {integrity: sha512-/6/dn+4qKE9MN3k5W76VzMDr5cMPNLswvOR6lHFttTADvf6TB/uhGmSOQpFAxcugTzSwG4vX5NiNEqkiFfzDlg==} - dev: false - /v8-natives@1.2.5: + v8-natives@1.2.5: resolution: {integrity: sha512-CVNliz6KF2yet3HBIkbFJKZmjlt95C8dsNZDnwoS6X98+QJRpsSz9uxo3TziBqdyJQkWwfD3VG9lRzsQNvF24Q==} engines: {node: '>= 0.6.0'} - dev: true - /vite-node@0.34.2(@types/node@20.5.1): - resolution: {integrity: sha512-JtW249Zm3FB+F7pQfH56uWSdlltCo1IOkZW5oHBzeQo0iX4jtC7o1t9aILMGd9kVekXBP2lfJBEQt9rBh07ebA==} - engines: {node: '>=v14.18.0'} + valtio@2.0.0: + resolution: {integrity: sha512-SzUU5UUK/vBRfHWXihwkJE55YNj8zhOkzxPOexcz0xIIT6Oux5VLynCmzyME2bYuEWcktW2NTaaLbpUydEsHiw==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + react: '>=18.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + vite-node@2.1.1: + resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - mlly: 1.4.0 - pathe: 1.1.1 - picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.5.1) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /vite@4.4.9(@types/node@20.5.1): - resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} - engines: {node: ^14.18.0 || >=16.0.0} + vite@5.4.5: + resolution: {integrity: sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - '@types/node': '>= 14' + '@types/node': ^18.0.0 || >=20.0.0 less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -1496,37 +1135,31 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: optional: true terser: optional: true - dependencies: - '@types/node': 20.5.1 - esbuild: 0.18.20 - postcss: 8.4.28 - rollup: 3.28.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /vitest@0.34.2: - resolution: {integrity: sha512-WgaIvBbjsSYMq/oiMlXUI7KflELmzM43BEvkdC/8b5CAod4ryAiY2z8uR6Crbi5Pjnu5oOmhKa9sy7uk6paBxQ==} - engines: {node: '>=v14.18.0'} + vitest@2.1.1: + resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.1 + '@vitest/ui': 2.1.1 happy-dom: '*' jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/node': + optional: true '@vitest/browser': optional: true '@vitest/ui': @@ -1535,102 +1168,899 @@ packages: optional: true jsdom: optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.5 - '@types/chai-subset': 1.3.3 - '@types/node': 20.5.1 - '@vitest/expect': 0.34.2 - '@vitest/runner': 0.34.2 - '@vitest/snapshot': 0.34.2 - '@vitest/spy': 0.34.2 - '@vitest/utils': 0.34.2 - acorn: 8.10.0 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - debug: 4.3.4 - local-pkg: 0.4.3 - magic-string: 0.30.2 - pathe: 1.1.1 - picocolors: 1.0.0 - std-env: 3.4.0 - strip-literal: 1.3.0 - tinybench: 2.5.0 - tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.5.1) - vite-node: 0.34.2(@types/node@20.5.1) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /which-module@2.0.0: + which-module@2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} - dev: true - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - dev: true - /wrap-ansi@5.1.0: + wrap-ansi@5.1.0: resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} engines: {node: '>=6'} - dependencies: - ansi-styles: 3.2.1 - string-width: 3.1.0 - strip-ansi: 5.2.0 - dev: true - /y18n@4.0.3: + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: true - /yargs-parser@13.1.2: + yargs-parser@13.1.2: resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - dev: true - /yargs@13.3.2: + yargs@13.3.2: resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + + zone.js@0.15.0: + resolution: {integrity: sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==} + +snapshots: + + '@ampproject/remapping@2.3.0': dependencies: - cliui: 5.0.0 - find-up: 3.0.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 3.1.0 - which-module: 2.0.0 - y18n: 4.0.3 - yargs-parser: 13.1.2 - dev: true + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@angular/core@18.2.4(rxjs@7.8.1)(zone.js@0.15.0)': + dependencies: + rxjs: 7.8.1 + tslib: 2.7.0 + zone.js: 0.15.0 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.16.17': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.16.17': + optional: true - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.16.17': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.16.17': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.16.17': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.16.17': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.16.17': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.16.17': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.16.17': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.16.17': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.16.17': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.16.17': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.16.17': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.16.17': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.16.17': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.16.17': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.16.17': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.16.17': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.16.17': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.16.17': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.16.17': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.16.17': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true - /zone.js@0.14.1: - resolution: {integrity: sha512-R3t9Nwl/LJnnpmwx0+Q7YcHtE6xUObnowwNskWCiqEMQXYYlkZiOOhF+N2R18PMILv8+fbzCLKAJvpvyxzafpQ==} + '@jridgewell/gen-mapping@0.3.5': dependencies: - tslib: 2.6.2 - dev: false + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@preact/signals-core@1.8.0': {} + + '@preact/signals@1.3.0(preact@10.24.0)': + dependencies: + '@preact/signals-core': 1.8.0 + preact: 10.24.0 + + '@reactively/core@0.0.8': {} + + '@rollup/rollup-android-arm-eabi@4.21.3': + optional: true + + '@rollup/rollup-android-arm64@4.21.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.21.3': + optional: true + + '@rollup/rollup-darwin-x64@4.21.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.21.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.21.3': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.21.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.21.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.21.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.21.3': + optional: true + + '@solidjs/reactivity@0.0.9': {} + + '@types/estree@1.0.5': {} + + '@types/node@18.14.0': {} + + '@types/node@22.5.5': + dependencies: + undici-types: 6.19.8 + + '@vitest/expect@2.1.1': + dependencies: + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.5(@types/node@22.5.5))': + dependencies: + '@vitest/spy': 2.1.1 + estree-walker: 3.0.3 + magic-string: 0.30.11 + optionalDependencies: + vite: 5.4.5(@types/node@22.5.5) + + '@vitest/pretty-format@2.1.1': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.1': + dependencies: + '@vitest/utils': 2.1.1 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.1': + dependencies: + '@vitest/pretty-format': 2.1.1 + magic-string: 0.30.11 + pathe: 1.1.2 + + '@vitest/spy@2.1.1': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.1': + dependencies: + '@vitest/pretty-format': 2.1.1 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + + '@vue/reactivity@3.5.6': + dependencies: + '@vue/shared': 3.5.6 + + '@vue/shared@3.5.6': {} + + acorn-typescript@1.4.13(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + ansi-regex@4.1.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + aria-query@5.3.1: {} + + assertion-error@2.0.1: {} + + axobject-query@4.1.0: {} + + binary-extensions@2.2.0: {} + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + cac@6.7.14: {} + + camelcase@5.3.1: {} + + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + + check-error@2.1.1: {} + + chokidar-cli@3.0.0: + dependencies: + chokidar: 3.5.3 + lodash.debounce: 4.0.8 + lodash.throttle: 4.1.1 + yargs: 13.3.2 + + chokidar@3.5.3: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + + cliui@5.0.0: + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-name@1.1.3: {} + + compostate@0.5.1: {} + + csstype@3.1.1: {} + + csstype@3.1.3: {} + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + + deep-eql@5.0.2: {} + + emoji-regex@7.0.3: {} + + esbuild@0.16.17: + optionalDependencies: + '@esbuild/android-arm': 0.16.17 + '@esbuild/android-arm64': 0.16.17 + '@esbuild/android-x64': 0.16.17 + '@esbuild/darwin-arm64': 0.16.17 + '@esbuild/darwin-x64': 0.16.17 + '@esbuild/freebsd-arm64': 0.16.17 + '@esbuild/freebsd-x64': 0.16.17 + '@esbuild/linux-arm': 0.16.17 + '@esbuild/linux-arm64': 0.16.17 + '@esbuild/linux-ia32': 0.16.17 + '@esbuild/linux-loong64': 0.16.17 + '@esbuild/linux-mips64el': 0.16.17 + '@esbuild/linux-ppc64': 0.16.17 + '@esbuild/linux-riscv64': 0.16.17 + '@esbuild/linux-s390x': 0.16.17 + '@esbuild/linux-x64': 0.16.17 + '@esbuild/netbsd-x64': 0.16.17 + '@esbuild/openbsd-x64': 0.16.17 + '@esbuild/sunos-x64': 0.16.17 + '@esbuild/win32-arm64': 0.16.17 + '@esbuild/win32-ia32': 0.16.17 + '@esbuild/win32-x64': 0.16.17 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + esm-env@1.0.0: {} + + esrap@1.2.2: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.5 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + fsevents@2.3.2: + optional: true + + fsevents@2.3.3: + optional: true + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.2.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@2.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-reference@3.0.2: + dependencies: + '@types/estree': 1.0.5 + + js-tokens@4.0.0: {} + + kairo@0.6.0-rc.0: {} + + locate-character@3.0.0: {} + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + lodash.debounce@4.0.8: {} + + lodash.throttle@4.1.1: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + mobx@6.13.2: {} + + mol_wire_lib@1.0.1158: {} + + mol_wire_lib@1.0.488: {} + + ms@2.1.3: {} + + nanoid@3.3.7: {} + + normalize-path@3.0.0: {} + + oby@15.1.2: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-try@2.2.0: {} + + path-exists@3.0.0: {} + + pathe@1.1.2: {} + + pathval@2.0.0: {} + + picocolors@1.1.0: {} + + picomatch@2.3.1: {} + + postcss@8.4.47: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.1 + + preact@10.24.0: {} + + prettier@3.3.3: {} + + proxy-compare@3.0.0: {} + + random@5.1.0: {} + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + rollup@4.21.3: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.21.3 + '@rollup/rollup-android-arm64': 4.21.3 + '@rollup/rollup-darwin-arm64': 4.21.3 + '@rollup/rollup-darwin-x64': 4.21.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.3 + '@rollup/rollup-linux-arm-musleabihf': 4.21.3 + '@rollup/rollup-linux-arm64-gnu': 4.21.3 + '@rollup/rollup-linux-arm64-musl': 4.21.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3 + '@rollup/rollup-linux-riscv64-gnu': 4.21.3 + '@rollup/rollup-linux-s390x-gnu': 4.21.3 + '@rollup/rollup-linux-x64-gnu': 4.21.3 + '@rollup/rollup-linux-x64-musl': 4.21.3 + '@rollup/rollup-win32-arm64-msvc': 4.21.3 + '@rollup/rollup-win32-ia32-msvc': 4.21.3 + '@rollup/rollup-win32-x64-msvc': 4.21.3 + fsevents: 2.3.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.7.0 + + s-js@0.4.9: {} + + seroval-plugins@1.1.1(seroval@1.1.1): + dependencies: + seroval: 1.1.1 + + seroval@1.1.1: {} + + set-blocking@2.0.0: {} + + siginfo@2.0.0: {} + + signal-polyfill@0.1.2: {} + + signia@0.1.5: {} + + solid-js@1.6.11: + dependencies: + csstype: 3.1.1 + + solid-js@1.8.22: + dependencies: + csstype: 3.1.3 + seroval: 1.1.1 + seroval-plugins: 1.1.1(seroval@1.1.1) + + source-map-js@1.2.1: {} + + stackback@0.0.2: {} + + std-env@3.7.0: {} + + string-width@3.1.0: + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + + svelte@5.0.0-next.249: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.5 + acorn: 8.12.1 + acorn-typescript: 1.4.13(acorn@8.12.1) + aria-query: 5.3.1 + axobject-query: 4.1.0 + esm-env: 1.0.0 + esrap: 1.2.2 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.11 + zimmerframe: 1.1.2 + + tinybench@2.9.0: {} + + tinyexec@0.3.0: {} + + tinypool@1.0.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tslib@2.7.0: {} + + typescript@4.9.5: {} + + undici-types@6.19.8: {} + + usignal@0.8.14: {} + + usignal@0.9.0: {} + + v8-natives@1.2.5: {} + + valtio@2.0.0(react@18.3.1): + dependencies: + proxy-compare: 3.0.0 + optionalDependencies: + react: 18.3.1 + + vite-node@2.1.1(@types/node@22.5.5): + dependencies: + cac: 6.7.14 + debug: 4.3.7 + pathe: 1.1.2 + vite: 5.4.5(@types/node@22.5.5) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.5(@types/node@22.5.5): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.47 + rollup: 4.21.3 + optionalDependencies: + '@types/node': 22.5.5 + fsevents: 2.3.3 + + vitest@2.1.1(@types/node@22.5.5): + dependencies: + '@vitest/expect': 2.1.1 + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.5(@types/node@22.5.5)) + '@vitest/pretty-format': 2.1.1 + '@vitest/runner': 2.1.1 + '@vitest/snapshot': 2.1.1 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 + chai: 5.1.1 + debug: 4.3.7 + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinyexec: 0.3.0 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.4.5(@types/node@22.5.5) + vite-node: 2.1.1(@types/node@22.5.5) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.5.5 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + which-module@2.0.0: {} + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wrap-ansi@5.1.0: + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + + y18n@4.0.3: {} + + yargs-parser@13.1.2: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs@13.3.2: + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.0 + y18n: 4.0.3 + yargs-parser: 13.1.2 + + zimmerframe@1.1.2: {} + + zone.js@0.15.0: {} diff --git a/src/cellxBench.ts b/src/cellxBench.ts index cee1b17..4d175a5 100644 --- a/src/cellxBench.ts +++ b/src/cellxBench.ts @@ -84,23 +84,28 @@ const arraysEqual = (a: readonly number[], b: readonly number[]) => { type BenchmarkResults = [ readonly [number, number, number, number], - readonly [number, number, number, number] + readonly [number, number, number, number], ]; export const cellxbench = (framework: ReactiveFramework) => { + globalThis.gc?.(); + const expected: Record = { 1000: [ [-3, -6, -2, 2], [-2, -4, 2, 3], ], - 2500: [ - [-3, -6, -2, 2], - [-2, -4, 2, 3], - ], - 5000: [ - [2, 4, -1, -6], - [-2, 1, -4, -4], - ], + // TODO: https://github.com/milomg/js-reactivity-benchmark/pull/13#issuecomment-2395253701 + // @see https://github.com/mobxjs/mobx/issues/3926 + // @see https://github.com/sveltejs/svelte/discussions/13277 + // 2500: [ + // [-3, -6, -2, 2], + // [-2, -4, 2, 3], + // ], + // 5000: [ + // [2, 4, -1, -6], + // [-2, 1, -4, -4], + // ], }; const results: Record = {}; @@ -114,6 +119,7 @@ export const cellxbench = (framework: ReactiveFramework) => { total += elapsed; } + logPerfResult({ framework: framework.name, test: `cellx${layers}`, @@ -135,4 +141,6 @@ export const cellxbench = (framework: ReactiveFramework) => { `Expected last layer ${expectedAfter}, found last layer ${after}` ); } + + globalThis.gc?.(); }; diff --git a/src/config.ts b/src/config.ts index 0f857ef..d1b17cb 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,33 +1,46 @@ import { TestConfig, FrameworkInfo } from "./util/frameworkTypes"; import { angularFramework } from "./frameworks/angularSignals"; -import { compostateFramework } from "./frameworks/compostate"; -import { kairoFramework } from "./frameworks/kairo"; import { mobxFramework } from "./frameworks/mobx"; +import { tc39SignalsProposalStage0 } from "./frameworks/tc39-proposal-signals-stage-0"; import { molWireFramework } from "./frameworks/molWire"; import { obyFramework } from "./frameworks/oby"; import { preactSignalFramework } from "./frameworks/preactSignals"; import { reactivelyFramework } from "./frameworks/reactively"; -import { sFramework } from "./frameworks/s"; +import { signiaFramework } from "./frameworks/signia"; import { solidFramework } from "./frameworks/solid"; +import { sFramework } from "./frameworks/s"; import { usignalFramework } from "./frameworks/uSignal"; import { vueReactivityFramework } from "./frameworks/vueReactivity"; import { xReactivityFramework } from "./frameworks/xReactivity"; +import { svelteFramework } from "./frameworks/svelte"; +// import { compostateFramework } from "./frameworks/compostate"; +// import { valtioFramework } from "./frameworks/valtio"; export const frameworkInfo: FrameworkInfo[] = [ - { framework: angularFramework, testPullCounts: true }, - { framework: compostateFramework, testPullCounts: true }, - // { framework: kairoFramework, testPullCounts: true }, - // { framework: mobxFramework, testPullCounts: true }, - { framework: molWireFramework, testPullCounts: true }, - { framework: obyFramework, testPullCounts: true }, { framework: preactSignalFramework, testPullCounts: true }, + { framework: svelteFramework, testPullCounts: true }, + { framework: tc39SignalsProposalStage0, testPullCounts: true }, { framework: reactivelyFramework, testPullCounts: true }, { framework: sFramework }, - { framework: solidFramework }, // solid can't testPullCounts because batch executes all leaf nodes even if unread + { framework: angularFramework, testPullCounts: true }, + { framework: molWireFramework, testPullCounts: true }, + { framework: obyFramework, testPullCounts: true }, + { framework: signiaFramework, testPullCounts: true }, + { framework: solidFramework }, { framework: usignalFramework, testPullCounts: true }, - { framework: vueReactivityFramework, testPullCounts: true }, { framework: xReactivityFramework, testPullCounts: true }, + { framework: vueReactivityFramework, testPullCounts: true }, + // NOTE: MobX currently hangs on some of the `dynamic` tests and `cellx` tests, so disable it if you want to run them. (https://github.com/mobxjs/mobx/issues/3926) + { framework: mobxFramework, testPullCounts: false }, + + // --- Disabled frameworks --- + // NOTE: the compostate adapter is currently broken and unused. + // { framework: compostateFramework }, + // NOTE: the kairo adapter is currently broken and unused. + // { framework: kairoFramework, testPullCounts: true }, + // NOTE: Valtio currently hangs on some of the `dynamic` tests, so disable it if you want to run them. (https://github.com/pmndrs/valtio/discussions/949) + // { framework: valtioFramework }, ]; export const perfTests: TestConfig[] = [ @@ -40,8 +53,8 @@ export const perfTests: TestConfig[] = [ readFraction: 0.2, iterations: 600000, expected: { - sum: 19199968, - count: 3480000, + sum: 19199832, + count: 2640004, }, }, { @@ -53,8 +66,8 @@ export const perfTests: TestConfig[] = [ readFraction: 0.2, iterations: 15000, expected: { - sum: 302310782860, - count: 1155000, + sum: 302310477864, + count: 1125003, }, }, { @@ -67,7 +80,7 @@ export const perfTests: TestConfig[] = [ iterations: 7000, expected: { sum: 29355933696000, - count: 1463000, + count: 1473791, }, }, { @@ -80,7 +93,7 @@ export const perfTests: TestConfig[] = [ iterations: 3000, expected: { sum: 1171484375000, - count: 732000, + count: 735756, }, }, { @@ -93,20 +106,22 @@ export const perfTests: TestConfig[] = [ iterations: 500, expected: { sum: 3.0239642676898464e241, - count: 1246500, - }, - }, - { - name: "very dynamic", - width: 100, - totalLayers: 15, - staticFraction: 0.5, - nSources: 6, - readFraction: 1, - iterations: 2000, - expected: { - sum: 15664996402790400, - count: 1078000, + count: 1246502, }, }, + // Several frameworks hang on this test, so disabling it for now. + // @see https://github.com/vuejs/core/issues/11928 + // { + // name: "very dynamic", + // width: 100, + // totalLayers: 15, + // staticFraction: 0.5, + // nSources: 6, + // readFraction: 1, + // iterations: 2000, + // expected: { + // sum: 15664996402790400, + // count: 1078671, + // }, + // }, ]; diff --git a/src/dynamicBench.ts b/src/dynamicBench.ts index 4b43116..3a7c1ff 100644 --- a/src/dynamicBench.ts +++ b/src/dynamicBench.ts @@ -1,5 +1,4 @@ -import v8 from "v8-natives"; -import { makeGraph, runGraph } from "./util/dependencyGraph"; +import { Counter, makeGraph, runGraph } from "./util/dependencyGraph"; import { logPerfResult, perfRowStrings } from "./util/perfLogging"; import { verifyBenchResult } from "./util/perfTests"; import { FrameworkInfo } from "./util/frameworkTypes"; @@ -17,14 +16,23 @@ export async function dynamicBench( for (const config of perfTests) { const { iterations, readFraction } = config; - const { graph, counter } = makeGraph(framework, config); + let counter = new Counter(); function runOnce(): number { - return runGraph(graph, iterations, readFraction, framework); + // Create a new graph from scratch for each run to ensure they're independent + // from each other. + try { + const graph = makeGraph(framework, config, counter); + const res = runGraph(graph, iterations, readFraction, framework); + globalThis.gc?.(); + return res; + } catch (err: any) { + console.warn(`Error dynamicBench "${framework.name}":`, err); + return -1; + } } // warm up - v8.optimizeFunctionOnNextCall(runOnce); runOnce(); const timedResult = await fastestTest(testRepeats, () => { diff --git a/src/frameworks.test.ts b/src/frameworks.test.ts index d700982..afd94ac 100644 --- a/src/frameworks.test.ts +++ b/src/frameworks.test.ts @@ -1,5 +1,5 @@ -import { makeGraph, runGraph } from "./util/dependencyGraph"; -import { expect, test } from "vitest"; +import { Counter, makeGraph, runGraph } from "./util/dependencyGraph"; +import { expect, test, vi } from "vitest"; import { FrameworkInfo, TestConfig } from "./util/frameworkTypes"; import { frameworkInfo } from "./config"; @@ -23,42 +23,109 @@ function makeConfig(): TestConfig { function frameworkTests({ framework, testPullCounts }: FrameworkInfo) { const name = framework.name; test(`${name} | simple dependency executes`, () => { - const s = framework.signal(2); - const c = framework.computed(() => s.read() * 2); + framework.withBuild(() => { + const s = framework.signal(2); + const c = framework.computed(() => s.read() * 2); + + expect(c.read()).toEqual(4); + }); + }); - expect(c.read()).toEqual(4); + test(`${name} | simple write`, () => { + framework.withBuild(() => { + const s = framework.signal(2); + const c = framework.computed(() => s.read() * 2); + expect(s.read()).toEqual(2); + expect(c.read()).toEqual(4); + + s.write(3); + expect(s.read()).toEqual(3); + expect(c.read()).toEqual(6); + }); }); test(`${name} | static graph`, () => { const config = makeConfig(); - const { graph, counter } = makeGraph(framework, config); + const counter = new Counter(); + const graph = makeGraph(framework, config, counter); const sum = runGraph(graph, 2, 1, framework); expect(sum).toEqual(16); - expect(counter.count).toEqual(11); + if (testPullCounts) { + expect(counter.count).toEqual(11); + } else { + expect(counter.count).toBeGreaterThanOrEqual(11); + } }); test(`${name} | static graph, read 2/3 of leaves`, () => { - const config = makeConfig(); - config.readFraction = 2 / 3; - config.iterations = 10; - const { counter, graph } = makeGraph(framework, config); - const sum = runGraph(graph, 10, 2 / 3, framework); + framework.withBuild(() => { + const config = makeConfig(); + config.readFraction = 2 / 3; + config.iterations = 10; + const counter = new Counter(); + const graph = makeGraph(framework, config, counter); + const sum = runGraph(graph, 10, 2 / 3, framework); - expect(sum).toEqual(72); - if (testPullCounts) { - expect(counter.count).toEqual(41); - } + expect(sum).toEqual(73); + if (testPullCounts) { + expect(counter.count).toEqual(41); + } else { + expect(counter.count).toBeGreaterThanOrEqual(41); + } + }); }); test(`${name} | dynamic graph`, () => { - const config = makeConfig(); - config.staticFraction = 0.5; - config.width = 4; - config.totalLayers = 2; - const { graph, counter } = makeGraph(framework, config); - const sum = runGraph(graph, 10, 1, framework); - - expect(sum).toEqual(72); - expect(counter.count).toEqual(22); + framework.withBuild(() => { + const config = makeConfig(); + config.staticFraction = 0.5; + config.width = 4; + config.totalLayers = 2; + const counter = new Counter(); + const graph = makeGraph(framework, config, counter); + const sum = runGraph(graph, 10, 1, framework); + + expect(sum).toEqual(72); + if (testPullCounts) { + expect(counter.count).toEqual(22); + } else { + expect(counter.count).toBeGreaterThanOrEqual(22); + } + }); + }); + + test(`${name} | withBuild`, () => { + const r = framework.withBuild(() => { + const s = framework.signal(2); + const c = framework.computed(() => s.read() * 2); + + expect(c.read()).toEqual(4); + return c.read(); + }); + + expect(r).toEqual(4); + }); + + test(`${name} | effect`, () => { + const spy = vi.fn(); + + const s = framework.signal(2); + let c: any; + + framework.withBuild(() => { + c = framework.computed(() => s.read() * 2); + + framework.effect(() => { + spy(c.read()); + }); + }); + expect(spy.mock.calls.length).toBe(1); + + framework.withBatch(() => { + s.write(3); + }); + expect(s.read()).toEqual(3); + expect(c.read()).toEqual(6); + expect(spy.mock.calls.length).toBe(2); }); } diff --git a/src/frameworks/angularSignals.ts b/src/frameworks/angularSignals.ts index 76bcb98..e2b6af9 100644 --- a/src/frameworks/angularSignals.ts +++ b/src/frameworks/angularSignals.ts @@ -2,7 +2,6 @@ import { ReactiveFramework } from "../util/reactiveFramework"; import { signal, computed } from "@angular/core"; import { createWatch, Watch } from "@angular/core/primitives/signals"; - export const angularFramework: ReactiveFramework = { name: "@angular/signals", signal: (initialValue) => { @@ -26,19 +25,17 @@ export const angularFramework: ReactiveFramework = { withBuild: (fn) => fn(), }; - let queue = new Set(); /** - * Wrapper around Angular's core effect primitive `Watch`, decoupled from dependency injection, - * cleanup, and other unrelated concepts. + * Wrapper around Angular's core effect primitive `Watch`, decoupled from + * dependency injection, cleanup, and other unrelated concepts. */ -function effect(effectFn: () => void): - void { +function effect(effectFn: () => void): void { const w = createWatch(effectFn, queue.add.bind(queue), true); - // Effects start dirty. - w.notify(); + // Run effect immediately + w.run(); } function flushEffects(): void { diff --git a/src/frameworks/compostate.ts b/src/frameworks/compostate.ts index e28edfd..aafc899 100644 --- a/src/frameworks/compostate.ts +++ b/src/frameworks/compostate.ts @@ -1,6 +1,8 @@ import { signal, computed, syncEffect, batch, createRoot } from "compostate"; import { ReactiveFramework } from "../util/reactiveFramework"; +// NOTE: The compostate adapter is currently not working and unused. + export const compostateFramework: ReactiveFramework = { name: "Compostate", signal: (initialValue) => { diff --git a/src/frameworks/kairo.ts b/src/frameworks/kairo.ts index d78ef6c..bb89329 100644 --- a/src/frameworks/kairo.ts +++ b/src/frameworks/kairo.ts @@ -2,6 +2,8 @@ import { ReactiveFramework } from "../util/reactiveFramework"; import { batch, computed, effect, mutValue } from "kairo"; import { collectScope } from "kairo"; +// NOTE: The kairo adapter is currently not working and unused. + export const kairoFramework: ReactiveFramework = { name: "kairo", signal: (initialValue) => { diff --git a/src/frameworks/mobx.ts b/src/frameworks/mobx.ts index bc5ba8f..6d47bd0 100644 --- a/src/frameworks/mobx.ts +++ b/src/frameworks/mobx.ts @@ -1,13 +1,13 @@ -import { computed, observable, autorun, transaction, action } from "mobx"; +import { computed, observable, autorun, runInAction } from "mobx"; import { ReactiveFramework } from "../util/reactiveFramework"; export const mobxFramework: ReactiveFramework = { name: "MobX", signal(initial) { - const s = observable.box(initial); + const s = observable.box(initial, { deep: false }); return { read: () => s.get(), - write: action((x) => s.set(x)), + write: (x) => s.set(x), }; }, computed: (fn) => { @@ -17,6 +17,6 @@ export const mobxFramework: ReactiveFramework = { }; }, effect: (fn) => autorun(fn), - withBatch: (fn) => transaction(fn), + withBatch: (fn) => runInAction(fn), withBuild: (fn) => fn(), }; diff --git a/src/frameworks/molWire.ts b/src/frameworks/molWire.ts index 310eefa..4b44d06 100644 --- a/src/frameworks/molWire.ts +++ b/src/frameworks/molWire.ts @@ -4,7 +4,7 @@ import $ from "mol_wire_lib"; const Atom = $.$mol_wire_atom; // fix a bug in mol exports export const molWireFramework: ReactiveFramework = { - name: "$mol_wire_atom", + name: "$mol_wire", signal: (initialValue: T): Signal => { const atom = new Atom("", (next: T = initialValue) => next); return { diff --git a/src/frameworks/oby.ts b/src/frameworks/oby.ts index f45e6e6..574faa9 100644 --- a/src/frameworks/oby.ts +++ b/src/frameworks/oby.ts @@ -16,7 +16,10 @@ export const obyFramework: ReactiveFramework = { read: () => memo(), }; }, - effect: (fn) => $.effect(fn), + effect: (fn) => { + fn(); + return $.effect(fn); + }, withBatch: (fn) => { fn(); $.tick(); diff --git a/src/frameworks/reactively.ts b/src/frameworks/reactively.ts index 32e6452..c03a3bd 100644 --- a/src/frameworks/reactively.ts +++ b/src/frameworks/reactively.ts @@ -16,7 +16,10 @@ export const reactivelyFramework: ReactiveFramework = { read: () => r.get(), }; }, - effect: (fn) => new Reactive(fn, true), + effect: (fn) => { + fn(); + return new Reactive(fn, true); + }, withBatch: (fn) => { fn(); stabilize(); diff --git a/src/frameworks/signia.ts b/src/frameworks/signia.ts new file mode 100644 index 0000000..a47d5dd --- /dev/null +++ b/src/frameworks/signia.ts @@ -0,0 +1,22 @@ +import { ReactiveFramework } from "../util/reactiveFramework"; +import { atom, computed, react, transact } from "signia"; + +export const signiaFramework: ReactiveFramework = { + name: "Signia", + signal: (initialValue) => { + const s = atom("s", initialValue); + return { + write: (v) => s.set(v), + read: () => s.value, + }; + }, + computed: (fn) => { + const c = computed("c", fn); + return { + read: () => c.value, + }; + }, + effect: (fn) => react("r", fn), + withBatch: (fn) => transact(fn), + withBuild: (fn) => fn(), +}; diff --git a/src/frameworks/solid.ts b/src/frameworks/solid.ts index 68e516c..cf860a0 100644 --- a/src/frameworks/solid.ts +++ b/src/frameworks/solid.ts @@ -1,7 +1,7 @@ import { ReactiveFramework } from "../util/reactiveFramework"; import { batch, - createEffect, + createRenderEffect, createMemo, createRoot, createSignal, @@ -22,7 +22,7 @@ export const solidFramework: ReactiveFramework = { read: () => memo(), }; }, - effect: (fn) => createEffect(fn), + effect: (fn) => createRenderEffect(fn), withBatch: (fn) => batch(fn), withBuild: (fn) => createRoot(fn), }; diff --git a/src/frameworks/svelte.ts b/src/frameworks/svelte.ts new file mode 100644 index 0000000..5644f5b --- /dev/null +++ b/src/frameworks/svelte.ts @@ -0,0 +1,41 @@ +import { ReactiveFramework } from "../util/reactiveFramework"; +// @ts-ignore +import * as $ from "svelte/internal/client"; + +// NOTE: The svelte adapter uses private, internal APIs that are usually only +// used by the Svelte compiler and client runtime. The Svelte team has made the +// decision to not expose these APIs publicly / officially, because it gives +// them more freedom to experiment without making breaking changes, but given +// that Svelte's v5 reactivity API is one of the most actively developed and +// efficient TS implementations available, I wanted to include it in the +// benchmark suite regardless. + +export const svelteFramework: ReactiveFramework = { + name: "Svelte v5", + signal: (initialValue) => { + const s = $.state(initialValue); + return { + write: (v) => $.set(s, v), + read: () => $.get(s), + }; + }, + computed: (fn) => { + const c = $.derived(fn); + return { + read: () => $.get(c), + }; + }, + effect: (fn) => { + $.render_effect(fn); + }, + withBatch: (fn) => { + $.flush_sync(fn); + }, + withBuild: (fn: () => T): T => { + let res: T | undefined; + $.effect_root(() => { + res = fn(); + }); + return res!; + }, +}; diff --git a/src/frameworks/tc39-proposal-signals-stage-0.ts b/src/frameworks/tc39-proposal-signals-stage-0.ts new file mode 100644 index 0000000..4cd67bb --- /dev/null +++ b/src/frameworks/tc39-proposal-signals-stage-0.ts @@ -0,0 +1,65 @@ +import { ReactiveFramework } from "../util/reactiveFramework"; +import { Signal } from "signal-polyfill"; + +export const tc39SignalsProposalStage0: ReactiveFramework = { + name: "TC39 Signals Polyfill", + signal: (initialValue) => { + const s = new Signal.State(initialValue); + return { + write: (v) => s.set(v), + read: () => s.get(), + }; + }, + computed: (fn) => { + const c = new Signal.Computed(fn); + return { + read: () => c.get(), + }; + }, + effect: (fn) => effect(fn), + withBatch: (fn) => { + fn(); + processPending(); + }, + withBuild: (fn) => fn(), +}; + +let needsEnqueue = false; + +const w = new Signal.subtle.Watcher(() => { + if (needsEnqueue) { + needsEnqueue = false; + (async () => { + await Promise.resolve(); + // next micro queue + processPending(); + })(); + } +}); + +function processPending() { + needsEnqueue = true; + + for (const s of w.getPending()) { + s.get(); + } + + w.watch(); +} + +export function effect(callback: any) { + let cleanup: any; + + const computed = new Signal.Computed(() => { + typeof cleanup === "function" && cleanup(); + cleanup = callback(); + }); + + w.watch(computed); + computed.get(); + + return () => { + w.unwatch(computed); + typeof cleanup === "function" && cleanup(); + }; +} diff --git a/src/frameworks/valtio.ts b/src/frameworks/valtio.ts new file mode 100644 index 0000000..32e4c87 --- /dev/null +++ b/src/frameworks/valtio.ts @@ -0,0 +1,59 @@ +import { ReactiveFramework } from "../util/reactiveFramework"; +import { proxy } from "valtio/vanilla"; +import { watch } from "valtio/utils"; + +// The Valtio adapter is currently not working and unused: https://github.com/pmndrs/valtio/discussions/949 + +type WatchGet = (proxyObject: T) => T; + +// stack of watch getters because Valtio doesn't auto-track dependency reads +let watchGet: Array = []; + +export const valtioFramework: ReactiveFramework = { + name: "Valtio", + signal: (initialValue) => { + const s = proxy({ value: initialValue }); + return { + write: (v) => (s.value = v), + read: () => { + const get = watchGet.at(-1); + if (get) { + return get(s).value; + } else { + return s.value; + } + }, + }; + }, + computed: (fn) => { + const c = proxy({ + get value() { + return fn(); + }, + }); + return { + read: () => { + const get = watchGet.at(-1); + if (get) { + return get(c).value; + } else { + return c.value; + } + }, + }; + }, + effect: (fn) => { + return watch( + (get) => { + watchGet.push(get); + fn(); + watchGet.pop(); + }, + { + sync: true, + } + ); + }, + withBatch: (fn) => fn(), + withBuild: (fn) => fn(), +}; diff --git a/src/frameworks/vueReactivity.ts b/src/frameworks/vueReactivity.ts index c289509..34268d4 100644 --- a/src/frameworks/vueReactivity.ts +++ b/src/frameworks/vueReactivity.ts @@ -1,12 +1,19 @@ -import { computed, ref, effect, ReactiveEffect } from "@vue/reactivity"; +import { + computed, + effectScope, + shallowRef, + effect, + ReactiveEffect, +} from "@vue/reactivity"; import { ReactiveFramework } from "../util/reactiveFramework"; let scheduled = [] as ReactiveEffect[]; -let isBatching = false; +let batching = false; + export const vueReactivityFramework: ReactiveFramework = { - name: "Vue", + name: "@vue/reactivity", signal: (initial) => { - const data = ref(initial); + const data = shallowRef(initial); return { read: () => data.value as any, write: (v) => (data.value = v as any), @@ -18,24 +25,27 @@ export const vueReactivityFramework: ReactiveFramework = { read: () => c.value, }; }, - effect: function (fn) { + effect: (fn) => { let t = effect(() => fn(), { - lazy: false, - scheduler: (x) => { + scheduler: () => { scheduled.push(t.effect); }, }); }, - withBatch: function (fn) { - if (isBatching) { + withBatch: (fn) => { + if (batching) { fn(); + } else { + batching = true; + fn(); + while (scheduled.length) { + scheduled.pop()!.run(); + } + batching = false; } - isBatching = true; - fn(); - while (scheduled.length) { - scheduled.pop()!.run(); - } - isBatching = false; }, - withBuild: (fn) => fn(), + withBuild: (fn) => { + const e = effectScope(); + return e.run(fn)!; + }, }; diff --git a/src/index.ts b/src/index.ts index 956596a..d0542af 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,24 +9,18 @@ import { kairoBench } from "./kairoBench"; async function main() { logPerfResult(perfReportHeaders()); - for (const { framework } of frameworkInfo) { - await kairoBench(framework); - } + for (const frameworkTest of frameworkInfo) { + const { framework } = frameworkTest; - for (const { framework } of frameworkInfo) { + await kairoBench(framework); await molBench(framework); - } - - for (const { framework } of frameworkInfo) { sbench(framework); - } - for (const { framework } of frameworkInfo) { cellxbench(framework); - } - for (const frameworkTest of frameworkInfo) { await dynamicBench(frameworkTest); + + globalThis.gc?.(); } } diff --git a/src/kairo/deep.ts b/src/kairo/deep.ts index 534318c..eef6f8e 100644 --- a/src/kairo/deep.ts +++ b/src/kairo/deep.ts @@ -14,7 +14,7 @@ export function deepPropagation(bridge: ReactiveFramework) { } let callCounter = new Counter(); - const stop = bridge.effect(() => { + bridge.effect(() => { current.read(); callCounter.count++; }); diff --git a/src/kairo/unstable.ts b/src/kairo/unstable.ts index c520f9f..ca8982f 100644 --- a/src/kairo/unstable.ts +++ b/src/kairo/unstable.ts @@ -30,6 +30,7 @@ export function unstable(bridge: ReactiveFramework) { bridge.withBatch(() => { head.write(i); }); + // TODO: this assertion is failing for Preact Signals (and possibly other frameworks) // console.assert(current.read() === i % 2 ? i * 2 * 10 : i * -10); } console.assert(callCounter.count === atleast); diff --git a/src/kairoBench.ts b/src/kairoBench.ts index cae27f8..3730a45 100644 --- a/src/kairoBench.ts +++ b/src/kairoBench.ts @@ -1,4 +1,3 @@ -import v8 from "v8-natives"; import { avoidablePropagation } from "./kairo/avoidable"; import { broadPropagation } from "./kairo/broad"; import { deepPropagation } from "./kairo/deep"; @@ -29,7 +28,7 @@ export async function kairoBench(framework: ReactiveFramework) { return iter; }); - v8.optimizeFunctionOnNextCall(iter); + // warm up iter(); const { timing } = await fastestTest(10, () => { @@ -42,7 +41,6 @@ export async function kairoBench(framework: ReactiveFramework) { framework: framework.name, test: c.name, time: timing.time.toFixed(2), - gcTime: timing.gcTime?.toFixed(2), }); } } diff --git a/src/molBench.ts b/src/molBench.ts index e9d7c5c..dd209a6 100644 --- a/src/molBench.ts +++ b/src/molBench.ts @@ -1,4 +1,3 @@ -import v8 from "v8-natives"; import { fastestTest } from "./util/benchRepeat"; import { logPerfResult } from "./util/perfLogging"; import { ReactiveFramework } from "./util/reactiveFramework"; @@ -8,7 +7,7 @@ function fib(n: number): number { return fib(n - 1) + fib(n - 2); } -function hard(n: number, log: string) { +function hard(n: number, _log: string) { return n + fib(16); } @@ -30,9 +29,10 @@ export async function molBench(framework: ReactiveFramework) { const G = framework.computed( () => C.read() + (C.read() || E.read() % 2) + D.read()[4].x + F.read() ); - const H = framework.effect(() => res.push(hard(G.read(), "H"))); - const I = framework.effect(() => res.push(G.read())); - const J = framework.effect(() => res.push(hard(F.read(), "J"))); + + framework.effect(() => res.push(hard(G.read(), "H"))); + framework.effect(() => res.push(G.read())); + framework.effect(() => res.push(hard(F.read(), "J"))); return (i: number) => { res.length = 0; @@ -47,7 +47,6 @@ export async function molBench(framework: ReactiveFramework) { }; }); - v8.optimizeFunctionOnNextCall(iter); iter(1); const { timing } = await fastestTest(10, () => { @@ -60,6 +59,5 @@ export async function molBench(framework: ReactiveFramework) { framework: framework.name, test: "molBench", time: timing.time.toFixed(2), - gcTime: timing.gcTime?.toFixed(2), }); } diff --git a/src/sBench.ts b/src/sBench.ts index 5ca7fc3..99af087 100644 --- a/src/sBench.ts +++ b/src/sBench.ts @@ -1,5 +1,4 @@ // Inspired by https://github.com/solidjs/solid/blob/main/packages/solid/bench/bench.cjs -import v8 from "v8-natives"; import { logPerfResult } from "./util/perfLogging"; import { Computed, Signal, ReactiveFramework } from "./util/reactiveFramework"; @@ -55,7 +54,6 @@ export function sbench(framework: ReactiveFramework) { sources = createDataSignals(scount, []); fn(n / 100, sources); sources = createDataSignals(scount, []); - v8.optimizeFunctionOnNextCall(fn); fn(n / 100, sources); sources = createDataSignals(scount, []); for (let i = 0; i < scount; i++) { @@ -65,7 +63,7 @@ export function sbench(framework: ReactiveFramework) { } // start GC clean - v8.collectGarbage(); + globalThis.gc?.(); start = performance.now(); @@ -73,7 +71,7 @@ export function sbench(framework: ReactiveFramework) { // end GC clean sources = null; - v8.collectGarbage(); + globalThis.gc?.(); end = performance.now(); }); @@ -87,7 +85,7 @@ export function sbench(framework: ReactiveFramework) { return sources; } - function createComputations0to1(n: number, sources: Computed[]) { + function createComputations0to1(n: number, _sources: Computed[]) { for (let i = 0; i < n; i++) { createComputation0(i); } @@ -158,20 +156,20 @@ export function sbench(framework: ReactiveFramework) { } } - function createComputations8to1(n: number, sources: Computed[]) { - for (let i = 0; i < n; i++) { - createComputation8( - sources[i * 8].read, - sources[i * 8 + 1].read, - sources[i * 8 + 2].read, - sources[i * 8 + 3].read, - sources[i * 8 + 4].read, - sources[i * 8 + 5].read, - sources[i * 8 + 6].read, - sources[i * 8 + 7].read - ); - } - } + // function createComputations8to1(n: number, sources: Computed[]) { + // for (let i = 0; i < n; i++) { + // createComputation8( + // sources[i * 8].read, + // sources[i * 8 + 1].read, + // sources[i * 8 + 2].read, + // sources[i * 8 + 3].read, + // sources[i * 8 + 4].read, + // sources[i * 8 + 5].read, + // sources[i * 8 + 6].read, + // sources[i * 8 + 7].read + // ); + // } + // } // only create n / 100 computations, as otherwise takes too long function createComputations1000to1(n: number, sources: Computed[]) { @@ -195,20 +193,20 @@ export function sbench(framework: ReactiveFramework) { framework.computed(() => s1() + s2() + s3() + s4()); } - function createComputation8( - s1: Reader, - s2: Reader, - s3: Reader, - s4: Reader, - s5: Reader, - s6: Reader, - s7: Reader, - s8: Reader - ) { - framework.computed( - () => s1() + s2() + s3() + s4() + s5() + s6() + s7() + s8() - ); - } + // function createComputation8( + // s1: Reader, + // s2: Reader, + // s3: Reader, + // s4: Reader, + // s5: Reader, + // s6: Reader, + // s7: Reader, + // s8: Reader + // ) { + // framework.computed( + // () => s1() + s2() + s3() + s4() + s5() + s6() + s7() + s8() + // ); + // } function createComputation1000(ss: Computed[], offset: number) { framework.computed(() => { @@ -249,7 +247,7 @@ export function sbench(framework: ReactiveFramework) { } function updateComputations1000to1(n: number, sources: Signal[]) { - let { read: get1, write: set1 } = sources[0]; + let { read: _get1, write: set1 } = sources[0]; framework.computed(() => { let sum = 0; for (let i = 0; i < 1000; i++) { diff --git a/src/util/benchRepeat.ts b/src/util/benchRepeat.ts index 88e0d02..4bae639 100644 --- a/src/util/benchRepeat.ts +++ b/src/util/benchRepeat.ts @@ -1,5 +1,3 @@ -import v8 from "v8-natives"; -import { GarbageTrack } from "./garbageTracking"; import { TimingResult } from "./perfTests"; import { runTimed } from "./perfUtil"; @@ -9,10 +7,12 @@ export async function fastestTest( fn: () => T ): Promise> { const results: TimingResult[] = []; + for (let i = 0; i < times; i++) { const run = await runTracked(fn); results.push(run); } + const fastest = results.reduce((a, b) => a.timing.time < b.timing.time ? a : b ); @@ -22,11 +22,11 @@ export async function fastestTest( /** run a function, reporting the wall clock time and garbage collection time. */ async function runTracked(fn: () => T): Promise> { - v8.collectGarbage(); - const gcTrack = new GarbageTrack(); - const { result: wrappedResult, trackId } = gcTrack.watch(() => runTimed(fn)); - const gcTime = await gcTrack.gcDuration(trackId); - const { result, time } = wrappedResult; - gcTrack.destroy(); - return { result, timing: { time, gcTime } }; + globalThis.gc?.(); + + const { result, time } = runTimed(fn); + + globalThis.gc?.(); + + return { result, timing: { time } }; } diff --git a/src/util/dependencyGraph.ts b/src/util/dependencyGraph.ts index 7b02e40..eea0436 100644 --- a/src/util/dependencyGraph.ts +++ b/src/util/dependencyGraph.ts @@ -1,17 +1,12 @@ import { TestConfig } from "./frameworkTypes"; -import { pseudoRandom } from "./pseudoRandom"; import { Computed, ReactiveFramework, Signal } from "./reactiveFramework"; +import { Random } from "random"; export interface Graph { sources: Signal[]; layers: Computed[][]; } -export interface GraphAndCounter { - graph: Graph; - counter: Counter; -} - /** * Make a rectangular dependency graph, with an equal number of source elements * and computation elements at every layer. @@ -23,13 +18,13 @@ export interface GraphAndCounter { */ export function makeGraph( framework: ReactiveFramework, - config: TestConfig -): GraphAndCounter { + config: TestConfig, + counter: Counter +): Graph { const { width, totalLayers, staticFraction, nSources } = config; return framework.withBuild(() => { const sources = new Array(width).fill(0).map((_, i) => framework.signal(i)); - const counter = new Counter(); const rows = makeDependentRows( sources, totalLayers - 1, @@ -39,7 +34,7 @@ export function makeGraph( framework ); const graph = { sources, layers: rows }; - return { graph, counter }; + return graph; }); } @@ -54,30 +49,60 @@ export function runGraph( readFraction: number, framework: ReactiveFramework ): number { - const rand = pseudoRandom(); + const rand = new Random("seed"); const { sources, layers } = graph; const leaves = layers[layers.length - 1]; const skipCount = Math.round(leaves.length * (1 - readFraction)); const readLeaves = removeElems(leaves, skipCount, rand); + const frameworkName = framework.name.toLowerCase(); + // const start = Date.now(); + let sum = 0; + + if (frameworkName === "s-js" || frameworkName === "solidjs") { + // [S.js freeze](https://github.com/adamhaile/S#sdatavalue) doesn't allow different values to be set during a single batch, so special case it. + for (let i = 0; i < iterations; i++) { + framework.withBatch(() => { + const sourceDex = i % sources.length; + sources[sourceDex].write(i + sourceDex); + }); + + for (const leaf of readLeaves) { + leaf.read(); + } + } - for (let i = 0; i < iterations; i++) { + sum = readLeaves.reduce((total, leaf) => leaf.read() + total, 0); + } else { framework.withBatch(() => { - const sourceDex = i % sources.length; - sources[sourceDex].write(i + sourceDex); + for (let i = 0; i < iterations; i++) { + // Useful for debugging edge cases for some frameworks that experience + // dramatic slow downs for certain test configurations. These are generally + // due to `computed` effects not being cached efficiently, and as the number + // of layers increases, the uncached `computed` effects are re-evaluated in + // an `O(n^2)` manner where `n` is the number of layers. + // if (i % 100 === 0) { + // console.log("iteration:", i, "delta:", Date.now() - start); + // } + + const sourceDex = i % sources.length; + sources[sourceDex].write(i + sourceDex); + + for (const leaf of readLeaves) { + leaf.read(); + } + } + + sum = readLeaves.reduce((total, leaf) => leaf.read() + total, 0); }); - for (const leaf of readLeaves) { - leaf.read(); - } } - const sum = readLeaves.reduce((total, leaf) => leaf.read() + total, 0); return sum; } -function removeElems(src: T[], rmCount: number, rand: () => number): T[] { +function removeElems(src: T[], rmCount: number, rand: Random): T[] { const copy = src.slice(); for (let i = 0; i < rmCount; i++) { - const rmDex = Math.floor(rand() * copy.length); + const rmDex = rand.int(0, copy.length - 1); copy.splice(rmDex, 1); } return copy; @@ -96,7 +121,7 @@ function makeDependentRows( framework: ReactiveFramework ): Computed[][] { let prevRow = sources; - const random = pseudoRandom(); + const rand = new Random("seed"); const rows = []; for (let l = 0; l < numRows; l++) { const row = makeRow( @@ -106,7 +131,7 @@ function makeDependentRows( nSources, framework, l, - random + rand ); rows.push(row); prevRow = row; @@ -120,8 +145,8 @@ function makeRow( staticFraction: number, nSources: number, framework: ReactiveFramework, - layer: number, - random: () => number + _layer: number, + random: Random ): Computed[] { return sources.map((_, myDex) => { const mySources: Computed[] = []; @@ -129,7 +154,7 @@ function makeRow( mySources.push(sources[(myDex + sourceDex) % sources.length]); } - const staticNode = random() < staticFraction; + const staticNode = random.float() < staticFraction; if (staticNode) { // static node, always reference sources return framework.computed(() => { diff --git a/src/util/garbageTracking.ts b/src/util/garbageTracking.ts deleted file mode 100644 index 58fda34..0000000 --- a/src/util/garbageTracking.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { performance, PerformanceEntry, PerformanceObserver } from "perf_hooks"; -import { promiseDelay } from "./asyncUtil"; - -/** Track garbage collection via the PerformanceObserver api. - * Watch user provided benchmark functions, and report - * execution duration of gc events during the benchmarked function. - */ -export class GarbageTrack { - private trackId = 0; - private observer = new PerformanceObserver((list) => - this.perfEntries.push(...list.getEntries()) - ); - private perfEntries: PerformanceEntry[] = []; - private periods: WatchPeriod[] = []; - - /** look for gc events during the time this function is executing */ - watch(fn: () => T): { result: T; trackId: number } { - this.trackId++; - const start = performance.now(); - const result = fn(); - const end = performance.now(); - this.periods.push({ trackId: this.trackId, start, end }); - - return { result, trackId: this.trackId }; - } - - /** report total duration of gc events during one watched function */ - async gcDuration(trackId: number): Promise { - await promiseDelay(10); // wait one eventloop cycle until the perfEntries are populated - - const period = this.periods.find((period) => period.trackId === trackId); - if (!period) { - return Promise.reject("no period found"); - } - - const entries = this.perfEntries.filter( - (e) => e.startTime >= period.start && e.startTime < period.end - ); - const totalTime = entries.reduce((t, e) => e.duration + t, 0); - return totalTime; - } - - destroy() { - this.observer.disconnect(); - } - - constructor() { - this.observer.observe({ entryTypes: ["gc"] }); - } -} - -interface WatchPeriod { - trackId: number; - start: number; - end: number; -} diff --git a/src/util/perfLogging.ts b/src/util/perfLogging.ts index 4d7d1b3..6b1a41c 100644 --- a/src/util/perfLogging.ts +++ b/src/util/perfLogging.ts @@ -10,14 +10,12 @@ export interface PerfRowStrings { framework: string; test: string; time: string; - gcTime?: string; } const columnWidth = { - framework: 16, + framework: 22, test: 60, time: 8, - gcTime: 6, }; export function perfReportHeaders(): PerfRowStrings { @@ -38,7 +36,6 @@ export function perfRowStrings( framework: frameworkName, test: `${makeTitle(config)} (${config.name || ""})`, time: timing.time.toFixed(2), - gcTime: (timing.gcTime || 0).toFixed(2), }; } diff --git a/src/util/perfTests.ts b/src/util/perfTests.ts index df4d55a..9b37333 100644 --- a/src/util/perfTests.ts +++ b/src/util/perfTests.ts @@ -12,7 +12,6 @@ export interface TimingResult { export interface TestTiming { time: number; - gcTime?: number; } export function verifyBenchResult( @@ -30,7 +29,11 @@ export function verifyBenchResult( `sum ${framework.name} ${config.name} result:${result.sum} expected:${expected.sum}` ); } - if (expected.count && (config.readFraction === 1 || testPullCounts)) { + if ( + expected.count && + (config.readFraction === 1 || testPullCounts) && + testPullCounts !== false + ) { console.assert( result.count === expected.count, `count ${framework.name} ${config.name} result:${result.count} expected:${expected.count}` diff --git a/src/util/pseudoRandom.ts b/src/util/pseudoRandom.ts deleted file mode 100644 index 7d6a633..0000000 --- a/src/util/pseudoRandom.ts +++ /dev/null @@ -1,47 +0,0 @@ -export function pseudoRandom(seed = "seed"): () => number { - const hash = xmur3a(seed); - const rng = sfc32(hash(), hash(), hash(), hash()); - return rng; -} - -/* these are adapted from https://github.com/bryc/code/blob/master/jshash/PRNGs.md - * (License: Public domain) */ - -/** random number generator originally in PractRand */ -function sfc32(a: number, b: number, c: number, d: number): () => number { - return function () { - a >>>= 0; - b >>>= 0; - c >>>= 0; - d >>>= 0; - let t = (a + b) | 0; - a = b ^ (b >>> 9); - b = (c + (c << 3)) | 0; - c = (c << 21) | (c >>> 11); - d = (d + 1) | 0; - t = (t + d) | 0; - c = (c + t) | 0; - return (t >>> 0) / 4294967296; - }; -} - -/** MurmurHash3 */ -export function xmur3a(str: string): () => number { - let h = 2166136261 >>> 0; - for (let k: number, i = 0; i < str.length; i++) { - k = Math.imul(str.charCodeAt(i), 3432918353); - k = (k << 15) | (k >>> 17); - h ^= Math.imul(k, 461845907); - h = (h << 13) | (h >>> 19); - h = (Math.imul(h, 5) + 3864292196) | 0; - } - h ^= str.length; - return function () { - h ^= h >>> 16; - h = Math.imul(h, 2246822507); - h ^= h >>> 13; - h = Math.imul(h, 3266489909); - h ^= h >>> 16; - return h >>> 0; - }; -} diff --git a/src/v8-natives.d.ts b/src/v8-natives.d.ts deleted file mode 100644 index 96a7af2..0000000 --- a/src/v8-natives.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -declare module "v8-natives" { - export interface V8 { - isNative: () => boolean; - collectGarbage: () => void; - debugPrint: (data: any) => void; - optimizeFunctionOnNextCall: (fn: Function) => void; - getOptimizationStatus: (fn: Function) => number; - deoptimizeFunction: (fn: Function) => void; - deoptimizeNow: (fn: Function) => void; - ClearFunctionFeedback: (fn: Function) => void; - debugTrace: (fn: Function) => void; - getHeapUsage: (fn: Function) => void; - hasFastProperties: (fn: Function) => void; - hasFastPackedElements: (fn: Function) => void; - HasSmiElements: (fn: Function) => void; - hasDoubleElements: (fn: Function) => void; - hasDictionaryElements: (fn: Function) => void; - HasHoleyElements: (fn: Function) => void; - hasSmiOrObjectElements: (fn: Function) => void; - hasSloppyArgumentsElements: (fn: Function) => void; - haveSameMap: (fn: Function) => void; - getFunctionName: (fn: Function) => void; - functionGetName: (fn: Function) => void; - isSmi: (fn: Function) => void; - isValidSmi: (fn: Function) => void; - neverOptimizeFunction: (fn: Function) => void; - traceEnter: (fn: Function) => void; - traceExit: (fn: Function) => void; - CompileOptimized: (fn: Function) => void; - helpers: { - printStatus: (fn: Function) => void; - testOptimization: (fn: Function) => void; - benchmark: (fn: Function) => void; - }; - } - - const v8: V8; - export default v8; -}