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.
-
-
-
-
+## 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
+
+
+
+ (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;
-}