From 506225094f37157cffd244160e78190aa6b26e2d Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Mon, 1 Apr 2024 22:39:33 -0400 Subject: [PATCH 01/45] Add tc39 stage 0 proposal --- package.json | 1 + pnpm-lock.yaml | 7 +++ src/config.ts | 2 + .../tc39-proposal-signals-stage-0.ts | 62 +++++++++++++++++++ 4 files changed, 72 insertions(+) create mode 100644 src/frameworks/tc39-proposal-signals-stage-0.ts diff --git a/package.json b/package.json index 6cba0c9..e469405 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "oby": "14.3.1", "preact": "^10.17.1", "s-js": "^0.4.9", + "signal-polyfill": "^0.1.0", "solid-js": "^1.7.11", "usignal": "^0.9.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 802d91c..18d45a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,6 +49,9 @@ importers: s-js: specifier: ^0.4.9 version: 0.4.9 + signal-polyfill: + specifier: ^0.1.0 + version: 0.1.0 solid-js: specifier: ^1.7.11 version: 1.7.11 @@ -1353,6 +1356,10 @@ packages: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} dev: true + /signal-polyfill@0.1.0: + resolution: {integrity: sha512-RMyLaEor0noasIsXmvLfRNf/QeF3eND6A1WErMqJ5ZLc3dpI7aifcZMwwpLafJkGnyLSWraK8gcXaAqxCtxxeg==} + dev: false + /solid-js@1.6.11: resolution: {integrity: sha512-JquQQHPArGq+i2PLURxJ99Pcz2/1docpbycSio/cKSA0SeI3z5zRjy0TNcH4NRYvbOLrcini+iovXwnexKabyw==} dependencies: diff --git a/src/config.ts b/src/config.ts index 0f857ef..b0ab801 100644 --- a/src/config.ts +++ b/src/config.ts @@ -4,6 +4,7 @@ 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"; @@ -17,6 +18,7 @@ import { xReactivityFramework } from "./frameworks/xReactivity"; export const frameworkInfo: FrameworkInfo[] = [ { framework: angularFramework, testPullCounts: true }, { framework: compostateFramework, testPullCounts: true }, + { framework: tc39SignalsProposalStage0, testPullCounts: true }, // { framework: kairoFramework, testPullCounts: true }, // { framework: mobxFramework, testPullCounts: true }, { framework: molWireFramework, testPullCounts: true }, 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..72c3f94 --- /dev/null +++ b/src/frameworks/tc39-proposal-signals-stage-0.ts @@ -0,0 +1,62 @@ +import { ReactiveFramework } from "../util/reactiveFramework"; +import { Signal } from "signal-polyfill"; + + +export const tc39SignalsProposalStage0: ReactiveFramework = { + name: "@angular/signals", + signal: (initialValue) => { + const s = new Signal.State(initialValue); + return { + write: s.set, + 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; + queueMicrotask.enqueue(processPending); + } +}); + +function processPending() { + needsEnqueue = true; + + for (const s of w.getPending()) { + s.get(); + } + + w.watch(); +} + +export function effect(callback) { + let cleanup; + + const computed = new Signal.Computed(() => { + typeof cleanup === "function" && cleanup(); + cleanup = callback(); + }); + + w.watch(computed); + computed.get(); + + return () => { + w.unwatch(computed); + typeof cleanup === "function" && cleanup(); + }; +} From 3176a26f6df5ceabe35fe75cb5d6e6bc82e3d9cb Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Mon, 1 Apr 2024 22:55:14 -0400 Subject: [PATCH 02/45] Update name/impl --- src/frameworks/tc39-proposal-signals-stage-0.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/frameworks/tc39-proposal-signals-stage-0.ts b/src/frameworks/tc39-proposal-signals-stage-0.ts index 72c3f94..6f7956d 100644 --- a/src/frameworks/tc39-proposal-signals-stage-0.ts +++ b/src/frameworks/tc39-proposal-signals-stage-0.ts @@ -3,18 +3,18 @@ import { Signal } from "signal-polyfill"; export const tc39SignalsProposalStage0: ReactiveFramework = { - name: "@angular/signals", + name: "TC39 Signals Proposal: Stage 0", signal: (initialValue) => { const s = new Signal.State(initialValue); return { - write: s.set, - read: s.get, + write: (v) => s.set(v), + read: () => s.get(), }; }, computed: (fn) => { const c = new Signal.Computed(fn); return { - read: c.get, + read: () => c.get(), }; }, effect: (fn) => effect(fn), @@ -30,7 +30,11 @@ let needsEnqueue = false; const w = new Signal.subtle.Watcher(() => { if (needsEnqueue) { needsEnqueue = false; - queueMicrotask.enqueue(processPending); + (async () => { + await Promise.resolve(); + // next micro queue + processPending(); + })(); } }); From 36c7b9a39bdc015953ad5fd7d2dd4b55f6b63186 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Thu, 12 Sep 2024 23:22:45 -0500 Subject: [PATCH 03/45] feat: add prettier --- .prettierrc | 11 + package.json | 1 + pnpm-lock.yaml | 1759 ++++++++++++++++++++++++++---------------------- 3 files changed, 961 insertions(+), 810 deletions(-) create mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..af07fd2 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "singleQuote": true, + "jsxSingleQuote": true, + "semi": false, + "useTabs": false, + "tabWidth": 2, + "bracketSpacing": true, + "bracketSameLine": false, + "arrowParens": "always", + "trailingComma": "none" +} diff --git a/package.json b/package.json index e469405..4daa78c 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "devDependencies": { "@types/node": "^20.5.1", "esbuild": "^0.19.2", + "prettier": "^3.3.3", "rxjs": "^7.8.1", "v8-natives": "^1.2.5", "vitest": "^0.34.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18d45a1..4e6e415 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -51,7 +51,7 @@ importers: version: 0.4.9 signal-polyfill: specifier: ^0.1.0 - version: 0.1.0 + version: 0.1.2 solid-js: specifier: ^1.7.11 version: 1.7.11 @@ -65,6 +65,9 @@ importers: esbuild: specifier: ^0.19.2 version: 0.19.2 + prettier: + specifier: ^3.3.3 + version: 3.3.3 rxjs: specifier: ^7.8.1 version: 7.8.1 @@ -104,851 +107,546 @@ importers: packages: - /@angular/core@17.0.0-rc.1(rxjs@7.8.1)(zone.js@0.14.1): + '@angular/core@17.0.0-rc.1': resolution: {integrity: sha512-qz5Xjye2XkmBp+4vSxpPVM6yXs/36oXx/FUQa6PDP/DrW9wrCxSELf2g9PHT84xDgq6BhBqca0a4fq+QFURTqg==} engines: {node: '>=18.13.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 - /@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: + '@esbuild/android-arm64@0.18.20': resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.19.2: + '@esbuild/android-arm64@0.19.2': resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} engines: {node: '>=12'} 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: + '@esbuild/android-arm@0.18.20': resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.19.2: + '@esbuild/android-arm@0.19.2': resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} engines: {node: '>=12'} 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: + '@esbuild/android-x64@0.18.20': resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.19.2: + '@esbuild/android-x64@0.19.2': resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} engines: {node: '>=12'} 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: + '@esbuild/darwin-arm64@0.18.20': resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.19.2: + '@esbuild/darwin-arm64@0.19.2': resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} engines: {node: '>=12'} 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: + '@esbuild/darwin-x64@0.18.20': resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.19.2: + '@esbuild/darwin-x64@0.19.2': resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} engines: {node: '>=12'} 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: + '@esbuild/freebsd-arm64@0.18.20': resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.19.2: + '@esbuild/freebsd-arm64@0.19.2': resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} engines: {node: '>=12'} 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: + '@esbuild/freebsd-x64@0.18.20': resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.19.2: + '@esbuild/freebsd-x64@0.19.2': resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} engines: {node: '>=12'} 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: + '@esbuild/linux-arm64@0.18.20': resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.19.2: + '@esbuild/linux-arm64@0.19.2': resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} engines: {node: '>=12'} 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: + '@esbuild/linux-arm@0.18.20': resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.19.2: + '@esbuild/linux-arm@0.19.2': resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} engines: {node: '>=12'} 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: + '@esbuild/linux-ia32@0.18.20': resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.19.2: + '@esbuild/linux-ia32@0.19.2': resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} engines: {node: '>=12'} 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: + '@esbuild/linux-loong64@0.18.20': resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.19.2: + '@esbuild/linux-loong64@0.19.2': resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} engines: {node: '>=12'} 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: + '@esbuild/linux-mips64el@0.18.20': resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.19.2: + '@esbuild/linux-mips64el@0.19.2': resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} engines: {node: '>=12'} 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: + '@esbuild/linux-ppc64@0.18.20': resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.19.2: + '@esbuild/linux-ppc64@0.19.2': resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} engines: {node: '>=12'} 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: + '@esbuild/linux-riscv64@0.18.20': resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.19.2: + '@esbuild/linux-riscv64@0.19.2': resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} engines: {node: '>=12'} 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: + '@esbuild/linux-s390x@0.18.20': resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.19.2: + '@esbuild/linux-s390x@0.19.2': resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} engines: {node: '>=12'} 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: + '@esbuild/linux-x64@0.18.20': resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.19.2: + '@esbuild/linux-x64@0.19.2': resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} engines: {node: '>=12'} 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: + '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.19.2: + '@esbuild/netbsd-x64@0.19.2': resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.16.17: + '@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: + '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.19.2: + '@esbuild/openbsd-x64@0.19.2': resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} engines: {node: '>=12'} 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: + '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.19.2: + '@esbuild/sunos-x64@0.19.2': resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} engines: {node: '>=12'} 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: + '@esbuild/win32-arm64@0.18.20': resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.19.2: + '@esbuild/win32-arm64@0.19.2': resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} engines: {node: '>=12'} 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: + '@esbuild/win32-ia32@0.18.20': resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.19.2: + '@esbuild/win32-ia32@0.19.2': resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} engines: {node: '>=12'} 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: + '@esbuild/win32-x64@0.18.20': resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.2: + '@esbuild/win32-x64@0.19.2': resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@jest/schemas@29.6.0: + '@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/sourcemap-codec@1.4.15: + '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - /@preact/signals-core@1.4.0: + '@preact/signals-core@1.4.0': resolution: {integrity: sha512-5iYoZBhELLIhUQceZI7sDTQWPb+xcVSn2qk8T/aNl/VMh+A4AiPX9YRSh4XO7fZ6pncrVxl1Iln82poVqYVbbw==} - dev: false - /@preact/signals@1.2.1(preact@10.17.1): + '@preact/signals@1.2.1': resolution: {integrity: sha512-hRPvp1C2ooDzOHqfnhdpHgoIFDbYFAXLhoid3+jSItuPPD/J0r/UsiWKv/8ZO/oEhjRaP0M5niuRYsWqmY2GEA==} 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: + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - /@solidjs/reactivity@0.0.9: + '@solidjs/reactivity@0.0.9': resolution: {integrity: sha512-duaaHwXTTY/YF+H9AT4ZEiL6H9FwMxQOMrTIDpsRYLBkbl3Y/FKaeoYu7CK4Ontbra6/LAi0DZyb/M6vCcJoMw==} - dev: false - /@types/chai-subset@1.3.3: + '@types/chai-subset@1.3.3': resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} - dependencies: - '@types/chai': 4.3.5 - dev: true - /@types/chai@4.3.5: + '@types/chai@4.3.5': resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} - dev: true - /@types/node@18.14.0: + '@types/node@18.14.0': resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==} - dev: true - /@types/node@20.5.1: + '@types/node@20.5.1': resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} - dev: true - /@vitest/expect@0.34.2: + '@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/runner@0.34.2: + '@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/snapshot@0.34.2: + '@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/spy@0.34.2: + '@vitest/spy@0.34.2': resolution: {integrity: sha512-yd4L9OhfH6l0Av7iK3sPb3MykhtcRN5c5K5vm1nTbuN7gYn+yvUVVsyvzpHrjqS7EWqn9WsPJb7+0c3iuY60tA==} - dependencies: - tinyspy: 2.1.1 - dev: true - /@vitest/utils@0.34.2: + '@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 - /@vue/reactivity@3.3.4: + '@vue/reactivity@3.3.4': resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} - dependencies: - '@vue/shared': 3.3.4 - dev: false - /@vue/shared@3.3.4: + '@vue/shared@3.3.4': resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} - dev: false - /acorn-walk@8.2.0: + acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} - dev: true - /acorn@8.10.0: + acorn@8.10.0: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 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: + 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: + assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - /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: + 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: + check-error@1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true - /chokidar-cli@3.0.0: + 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: + csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - dev: false - /debug@4.3.4: + debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -956,533 +654,303 @@ packages: 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: + deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - /diff-sequences@29.4.3: + 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: + esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 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: + esbuild@0.19.2: resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} engines: {node: '>=12'} 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: + 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: + get-func-name@2.0.0: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true - /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: + jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - /kairo@0.6.0-rc.0: + kairo@0.6.0-rc.0: resolution: {integrity: sha512-8yWTOujaeU5a6FtFCQnRhljxo8KaxQVDV6xJFxEpkCKd2azlMBmc5ARazaQUb/KJ2PWzsVdiXRbvFmreP6pbFA==} - dev: false - /local-pkg@0.4.3: + local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} - dev: true - /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: + loupe@2.3.6: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} - dependencies: - get-func-name: 2.0.0 - dev: true - /magic-string@0.30.2: + 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 - /mlly@1.4.0: + 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 - /mobx@6.10.0: + mobx@6.10.0: resolution: {integrity: sha512-WMbVpCMFtolbB8swQ5E2YRrU+Yu8iLozCVx3CdGjbBKlP7dFiCSuiG06uea3JCFN5DnvtAX7+G5Bp82e2xu0ww==} - dev: false - /mol_wire_lib@1.0.488: + mol_wire_lib@1.0.488: resolution: {integrity: sha512-AqGNHtM5HvxdYKXMt85ESXG+Owj/E6HEUM2a0SKoCpx+R4uHrqM3V8HABt13twXzMDDfjO713TRWQb7Qb4EQRA==} - dev: true - /mol_wire_lib@1.0.707: + mol_wire_lib@1.0.707: resolution: {integrity: sha512-Ggig8FLegQdcIqOVP4bgV2jsBoozd0ThqvBW7iEE5a+Ld/A1NfmgMlS8dyOSL+24ksM+NxkCGYJjU4SI3Llnfg==} - dev: false - /ms@2.1.2: + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - /nanoid@3.3.6: + nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 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: + oby@14.3.1: resolution: {integrity: sha512-/5BvIarE2epsV2DDjcBf6R7DvcoUqtU62AOEEQyUqaKzwz0kdpB6huOG8anaqU0Asa9UGPFxdQWVbUPpEGLkuw==} - dev: false - /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: + 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: + pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: true - /pathval@1.1.1: + pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - /picocolors@1.0.0: + picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - /picomatch@2.3.1: + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - dev: true - /pkg-types@1.0.3: + 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: + postcss@8.4.28: resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} 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: + preact@10.17.1: resolution: {integrity: sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA==} - dev: false - /pretty-format@29.6.2: + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + 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: + react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - /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: + rollup@3.28.0: resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} engines: {node: '>=14.18.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: + seroval@0.5.1: resolution: {integrity: sha512-ZfhQVB59hmIauJG5Ydynupy8KHyr5imGNtdDhbZG68Ufh1Ynkv9KOYOAABf71oVbQxJ8VkWnMHAjEHE7fWkH5g==} 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 - /signal-polyfill@0.1.0: - resolution: {integrity: sha512-RMyLaEor0noasIsXmvLfRNf/QeF3eND6A1WErMqJ5ZLc3dpI7aifcZMwwpLafJkGnyLSWraK8gcXaAqxCtxxeg==} - dev: false + signal-polyfill@0.1.2: + resolution: {integrity: sha512-HT9d+L9NMiTzMxb/tU2Baym6129ROyRETSjvchvSkQa7wN0+SrG/IUlsaBLqKn2c+4mlze6CgQBEvgBjxOpiaQ==} - /solid-js@1.6.11: + 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: + solid-js@1.7.11: resolution: {integrity: sha512-JkuvsHt8jqy7USsy9xJtT18aF9r2pFO+GB8JQ2XGTvtF49rGTObB46iebD25sE3qVNvIbwglXOXdALnJq9IHtQ==} - dependencies: - csstype: 3.1.2 - seroval: 0.5.1 - dev: false - /source-map-js@1.0.2: + source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 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: + std-env@3.4.0: resolution: {integrity: sha512-YqHeQIIQ8r1VtUZOTOyjsAXAsjr369SplZ5rlQaiJTBsvodvPSCME7vuz8pnQltbQ0Cw0lyFo5Q8uyNwYQ58Xw==} - dev: true - /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: + strip-literal@1.3.0: resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} - dependencies: - acorn: 8.10.0 - dev: true - /tinybench@2.5.0: + tinybench@2.5.0: resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} - dev: true - /tinypool@0.7.0: + tinypool@0.7.0: resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} engines: {node: '>=14.0.0'} - dev: true - /tinyspy@2.1.1: + tinyspy@2.1.1: resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} 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: + tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /type-detect@4.0.8: + 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: + ufo@1.2.0: resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} - dev: true - /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): + vite-node@0.34.2: resolution: {integrity: sha512-JtW249Zm3FB+F7pQfH56uWSdlltCo1IOkZW5oHBzeQo0iX4jtC7o1t9aILMGd9kVekXBP2lfJBEQt9rBh07ebA==} engines: {node: '>=v14.18.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): + vite@4.4.9: resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -1509,16 +977,8 @@ packages: 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: + vitest@0.34.2: resolution: {integrity: sha512-WgaIvBbjsSYMq/oiMlXUI7KflELmzM43BEvkdC/8b5CAod4ryAiY2z8uR6Crbi5Pjnu5oOmhKa9sy7uk6paBxQ==} engines: {node: '>=v14.18.0'} hasBin: true @@ -1548,96 +1008,775 @@ packages: 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: + why-is-node-running@2.2.2: resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} 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==} - 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 - /yocto-queue@1.0.0: + yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} - dev: true - /zone.js@0.14.1: + zone.js@0.14.1: resolution: {integrity: sha512-R3t9Nwl/LJnnpmwx0+Q7YcHtE6xUObnowwNskWCiqEMQXYYlkZiOOhF+N2R18PMILv8+fbzCLKAJvpvyxzafpQ==} + +snapshots: + + '@angular/core@17.0.0-rc.1(rxjs@7.8.1)(zone.js@0.14.1)': + dependencies: + rxjs: 7.8.1 + tslib: 2.6.2 + zone.js: 0.14.1 + + '@esbuild/android-arm64@0.16.17': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.2': + optional: true + + '@esbuild/android-arm@0.16.17': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.2': + optional: true + + '@esbuild/android-x64@0.16.17': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.2': + optional: true + + '@esbuild/darwin-arm64@0.16.17': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.19.2': + optional: true + + '@esbuild/darwin-x64@0.16.17': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.19.2': + optional: true + + '@esbuild/freebsd-arm64@0.16.17': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.19.2': + optional: true + + '@esbuild/freebsd-x64@0.16.17': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.19.2': + optional: true + + '@esbuild/linux-arm64@0.16.17': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.19.2': + optional: true + + '@esbuild/linux-arm@0.16.17': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.19.2': + optional: true + + '@esbuild/linux-ia32@0.16.17': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.19.2': + optional: true + + '@esbuild/linux-loong64@0.16.17': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.2': + optional: true + + '@esbuild/linux-mips64el@0.16.17': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.19.2': + optional: true + + '@esbuild/linux-ppc64@0.16.17': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.19.2': + optional: true + + '@esbuild/linux-riscv64@0.16.17': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.19.2': + optional: true + + '@esbuild/linux-s390x@0.16.17': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.19.2': + optional: true + + '@esbuild/linux-x64@0.16.17': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.19.2': + optional: true + + '@esbuild/netbsd-x64@0.16.17': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.19.2': + optional: true + + '@esbuild/openbsd-x64@0.16.17': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.19.2': + optional: true + + '@esbuild/sunos-x64@0.16.17': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.19.2': + optional: true + + '@esbuild/win32-arm64@0.16.17': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.19.2': + optional: true + + '@esbuild/win32-ia32@0.16.17': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.19.2': + optional: true + + '@esbuild/win32-x64@0.16.17': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.19.2': + optional: true + + '@jest/schemas@29.6.0': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@preact/signals-core@1.4.0': {} + + '@preact/signals@1.2.1(preact@10.17.1)': + dependencies: + '@preact/signals-core': 1.4.0 + preact: 10.17.1 + + '@reactively/core@0.0.8': {} + + '@sinclair/typebox@0.27.8': {} + + '@solidjs/reactivity@0.0.9': {} + + '@types/chai-subset@1.3.3': + dependencies: + '@types/chai': 4.3.5 + + '@types/chai@4.3.5': {} + + '@types/node@18.14.0': {} + + '@types/node@20.5.1': {} + + '@vitest/expect@0.34.2': + dependencies: + '@vitest/spy': 0.34.2 + '@vitest/utils': 0.34.2 + chai: 4.3.7 + + '@vitest/runner@0.34.2': + dependencies: + '@vitest/utils': 0.34.2 + p-limit: 4.0.0 + pathe: 1.1.1 + + '@vitest/snapshot@0.34.2': + dependencies: + magic-string: 0.30.2 + pathe: 1.1.1 + pretty-format: 29.6.2 + + '@vitest/spy@0.34.2': + dependencies: + tinyspy: 2.1.1 + + '@vitest/utils@0.34.2': + dependencies: + diff-sequences: 29.4.3 + loupe: 2.3.6 + pretty-format: 29.6.2 + + '@vue/reactivity@3.3.4': + dependencies: + '@vue/shared': 3.3.4 + + '@vue/shared@3.3.4': {} + + acorn-walk@8.2.0: {} + + acorn@8.10.0: {} + + ansi-regex@4.1.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@5.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + assertion-error@1.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@4.3.7: + 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 + + check-error@1.0.2: {} + + 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.2: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + decamelize@1.2.0: {} + + deep-eql@4.1.3: + dependencies: + type-detect: 4.0.8 + + diff-sequences@29.4.3: {} + + 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.18.20: + 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 + + esbuild@0.19.2: + 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 + + 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.0: {} + + 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: {} + + jsonc-parser@3.2.0: {} + + kairo@0.6.0-rc.0: {} + + local-pkg@0.4.3: {} + + 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: {} + + loupe@2.3.6: + dependencies: + get-func-name: 2.0.0 + + magic-string@0.30.2: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + mlly@1.4.0: + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.2.0 + + mobx@6.10.0: {} + + mol_wire_lib@1.0.488: {} + + mol_wire_lib@1.0.707: {} + + ms@2.1.2: {} + + nanoid@3.3.6: {} + + normalize-path@3.0.0: {} + + oby@14.3.1: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.0.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.1: {} + + pathval@1.1.1: {} + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pkg-types@1.0.3: + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.0 + pathe: 1.1.1 + + postcss@8.4.28: + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + preact@10.17.1: {} + + prettier@3.3.3: {} + + pretty-format@29.6.2: + dependencies: + '@jest/schemas': 29.6.0 + ansi-styles: 5.2.0 + react-is: 18.2.0 + + react-is@18.2.0: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + rollup@3.28.0: + optionalDependencies: + fsevents: 2.3.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.6.2 + + s-js@0.4.9: {} + + seroval@0.5.1: {} + + set-blocking@2.0.0: {} + + siginfo@2.0.0: {} + + signal-polyfill@0.1.2: {} + + solid-js@1.6.11: + dependencies: + csstype: 3.1.1 + + solid-js@1.7.11: + dependencies: + csstype: 3.1.2 + seroval: 0.5.1 + + source-map-js@1.0.2: {} + + stackback@0.0.2: {} + + std-env@3.4.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 + + strip-literal@1.3.0: + dependencies: + acorn: 8.10.0 + + tinybench@2.5.0: {} + + tinypool@0.7.0: {} + + tinyspy@2.1.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tslib@2.6.2: {} + + type-detect@4.0.8: {} + + typescript@4.9.5: {} + + ufo@1.2.0: {} + + usignal@0.8.14: {} + + usignal@0.9.0: {} + + v8-natives@1.2.5: {} + + vite-node@0.34.2(@types/node@20.5.1): + 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 + + vite@4.4.9(@types/node@20.5.1): + dependencies: + esbuild: 0.18.20 + postcss: 8.4.28 + rollup: 3.28.0 + optionalDependencies: + '@types/node': 20.5.1 + fsevents: 2.3.3 + + vitest@0.34.2: + 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 + + which-module@2.0.0: {} + + why-is-node-running@2.2.2: + 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 + + yocto-queue@1.0.0: {} + + zone.js@0.14.1: dependencies: tslib: 2.6.2 - dev: false From 8267754c159cbf33455219118bd9dced07f2dd79 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Thu, 12 Sep 2024 23:31:29 -0500 Subject: [PATCH 04/45] feat: update reactivity lib deps --- package.json | 29 +- patches/@angular__core@16.2.1.patch | 26 - pnpm-lock.yaml | 1246 +++++++++++++++------------ 3 files changed, 689 insertions(+), 612 deletions(-) delete mode 100644 patches/@angular__core@16.2.1.patch diff --git a/package.json b/package.json index 4daa78c..c1dc6c1 100644 --- a/package.json +++ b/package.json @@ -11,33 +11,28 @@ "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.4", + "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.1155", + "oby": "15.1.2", + "preact": "^10.23.2", "s-js": "^0.4.9", "signal-polyfill": "^0.1.0", - "solid-js": "^1.7.11", + "solid-js": "^1.8.22", "usignal": "^0.9.0" }, "devDependencies": { - "@types/node": "^20.5.1", - "esbuild": "^0.19.2", + "@types/node": "^22.5.4", + "esbuild": "^0.23.1", "prettier": "^3.3.3", "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" - } + "vitest": "^2.1.0" } } 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 4e6e415..b34e367 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,21 +4,16 @@ 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.23.2) '@reactively/core': specifier: ^0.0.8 version: 0.0.8 @@ -26,26 +21,26 @@ importers: specifier: ^0.0.9 version: 0.0.9 '@vue/reactivity': - specifier: ^3.3.4 - version: 3.3.4 + specifier: ^3.5.4 + version: 3.5.4 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.1155 + version: 1.0.1155 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.23.2 + version: 10.23.2 s-js: specifier: ^0.4.9 version: 0.4.9 @@ -53,18 +48,18 @@ importers: specifier: ^0.1.0 version: 0.1.2 solid-js: - specifier: ^1.7.11 - version: 1.7.11 + specifier: ^1.8.22 + version: 1.8.22 usignal: specifier: ^0.9.0 version: 0.9.0 devDependencies: '@types/node': - specifier: ^20.5.1 - version: 20.5.1 + specifier: ^22.5.4 + version: 22.5.4 esbuild: - specifier: ^0.19.2 - version: 0.19.2 + specifier: ^0.23.1 + version: 0.23.1 prettier: specifier: ^3.3.3 version: 3.3.3 @@ -75,8 +70,8 @@ importers: specifier: ^1.2.5 version: 1.2.5 vitest: - specifier: ^0.34.2 - version: 0.34.2 + specifier: ^2.1.0 + version: 2.1.0(@types/node@22.5.4) packages/bench: devDependencies: @@ -107,12 +102,24 @@ importers: packages: - '@angular/core@17.0.0-rc.1': - resolution: {integrity: sha512-qz5Xjye2XkmBp+4vSxpPVM6yXs/36oXx/FUQa6PDP/DrW9wrCxSELf2g9PHT84xDgq6BhBqca0a4fq+QFURTqg==} - engines: {node: '>=18.13.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 + 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': resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} @@ -120,15 +127,15 @@ packages: cpu: [arm64] os: [android] - '@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] - '@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] @@ -138,15 +145,15 @@ packages: cpu: [arm] os: [android] - '@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] - '@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] @@ -156,15 +163,15 @@ packages: cpu: [x64] os: [android] - '@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] - '@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] @@ -174,15 +181,15 @@ packages: cpu: [arm64] os: [darwin] - '@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] - '@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] @@ -192,15 +199,15 @@ packages: cpu: [x64] os: [darwin] - '@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] - '@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] @@ -210,15 +217,15 @@ packages: cpu: [arm64] os: [freebsd] - '@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] - '@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] @@ -228,15 +235,15 @@ packages: cpu: [x64] os: [freebsd] - '@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] - '@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] @@ -246,15 +253,15 @@ packages: cpu: [arm64] os: [linux] - '@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] - '@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] @@ -264,15 +271,15 @@ packages: cpu: [arm] os: [linux] - '@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] - '@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] @@ -282,15 +289,15 @@ packages: cpu: [ia32] os: [linux] - '@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] - '@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] @@ -300,15 +307,15 @@ packages: cpu: [loong64] os: [linux] - '@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] - '@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] @@ -318,15 +325,15 @@ packages: cpu: [mips64el] os: [linux] - '@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] - '@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] @@ -336,15 +343,15 @@ packages: cpu: [ppc64] os: [linux] - '@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] - '@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] @@ -354,15 +361,15 @@ packages: cpu: [riscv64] os: [linux] - '@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] - '@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] @@ -372,15 +379,15 @@ packages: cpu: [s390x] os: [linux] - '@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] - '@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] @@ -390,15 +397,15 @@ packages: cpu: [x64] os: [linux] - '@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] - '@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] @@ -408,33 +415,39 @@ packages: cpu: [x64] os: [netbsd] - '@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] - '@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] + '@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] - '@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] - '@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] @@ -444,15 +457,15 @@ packages: cpu: [x64] os: [sunos] - '@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] - '@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] @@ -462,15 +475,15 @@ packages: cpu: [arm64] os: [win32] - '@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] - '@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] @@ -480,15 +493,15 @@ packages: cpu: [ia32] os: [win32] - '@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] - '@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] @@ -498,83 +511,159 @@ packages: cpu: [x64] os: [win32] - '@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] - '@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] - '@jest/schemas@29.6.0': - resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@preact/signals-core@1.4.0': - resolution: {integrity: sha512-5iYoZBhELLIhUQceZI7sDTQWPb+xcVSn2qk8T/aNl/VMh+A4AiPX9YRSh4XO7fZ6pncrVxl1Iln82poVqYVbbw==} + '@preact/signals-core@1.8.0': + resolution: {integrity: sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==} - '@preact/signals@1.2.1': - resolution: {integrity: sha512-hRPvp1C2ooDzOHqfnhdpHgoIFDbYFAXLhoid3+jSItuPPD/J0r/UsiWKv/8ZO/oEhjRaP0M5niuRYsWqmY2GEA==} + '@preact/signals@1.3.0': + resolution: {integrity: sha512-EOMeg42SlLS72dhoq6Vjq08havnLseWmPQ8A0YsgIAqMgWgx7V1a39+Pxo6i7SY5NwJtH4849JogFq3M67AzWg==} peerDependencies: preact: 10.x '@reactively/core@0.0.8': resolution: {integrity: sha512-5uAnNf2gQSm3gM7z6Lx079H1/MuDQQI+5aYfwyDFGR9nHZj8yblLY/6aOJVWp+NcBwXVBKuWQ28qWHD9F1qN1w==} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@rollup/rollup-android-arm-eabi@4.21.3': + resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.21.3': + resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==} + cpu: [arm64] + os: [android] + + '@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] + + '@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/chai-subset@1.3.3': - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} - - '@types/chai@4.3.5': - resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + '@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==} - '@types/node@20.5.1': - resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} + '@types/node@22.5.4': + resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} - '@vitest/expect@0.34.2': - resolution: {integrity: sha512-EZm2dMNlLyIfDMha17QHSQcg2KjeAZaXd65fpPzXY5bvnfx10Lcaz3N55uEe8PhF+w4pw+hmrlHLLlRn9vkBJg==} + '@vitest/expect@2.1.0': + resolution: {integrity: sha512-N3/xR4fSu0+6sVZETEtPT1orUs2+Y477JOXTcU3xKuu3uBlsgbD7/7Mz2LZ1Jr1XjwilEWlrIgSCj4N1+5ZmsQ==} - '@vitest/runner@0.34.2': - resolution: {integrity: sha512-8ydGPACVX5tK3Dl0SUwxfdg02h+togDNeQX3iXVFYgzF5odxvaou7HnquALFZkyVuYskoaHUOqOyOLpOEj5XTA==} + '@vitest/mocker@2.1.0': + resolution: {integrity: sha512-ZxENovUqhzl+QiOFpagiHUNUuZ1qPd5yYTCYHomGIZOFArzn4mgX2oxZmiAItJWAaXHG6bbpb/DpSPhlk5DgtA==} + peerDependencies: + '@vitest/spy': 2.1.0 + 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==} + '@vitest/pretty-format@2.1.0': + resolution: {integrity: sha512-7sxf2F3DNYatgmzXXcTh6cq+/fxwB47RIQqZJFoSH883wnVAoccSRT6g+dTKemUBo8Q5N4OYYj1EBXLuRKvp3Q==} - '@vitest/spy@0.34.2': - resolution: {integrity: sha512-yd4L9OhfH6l0Av7iK3sPb3MykhtcRN5c5K5vm1nTbuN7gYn+yvUVVsyvzpHrjqS7EWqn9WsPJb7+0c3iuY60tA==} + '@vitest/runner@2.1.0': + resolution: {integrity: sha512-D9+ZiB8MbMt7qWDRJc4CRNNUlne/8E1X7dcKhZVAbcOKG58MGGYVDqAq19xlhNfMFZsW0bpVKgztBwks38Ko0w==} - '@vitest/utils@0.34.2': - resolution: {integrity: sha512-Lzw+kAsTPubhoQDp1uVAOP6DhNia1GMDsI9jgB0yMn+/nDaPieYQ88lKqz/gGjSHL4zwOItvpehec9OY+rS73w==} + '@vitest/snapshot@2.1.0': + resolution: {integrity: sha512-x69CygGMzt9VCO283K2/FYQ+nBrOj66OTKpsPykjCR4Ac3lLV+m85hj9reaIGmjBSsKzVvbxWmjWE3kF5ha3uQ==} - '@vue/reactivity@3.3.4': - resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + '@vitest/spy@2.1.0': + resolution: {integrity: sha512-IXX5NkbdgTYTog3F14i2LgnBc+20YmkXMx0IWai84mcxySUDRgm0ihbOfR4L0EVRBDFG85GjmQQEZNNKVVpkZw==} - '@vue/shared@3.3.4': - resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + '@vitest/utils@2.1.0': + resolution: {integrity: sha512-rreyfVe0PuNqJfKYUwfPDfi6rrp0VSu0Wgvp5WBqJonP+4NvXHk48X6oBam1Lj47Hy6jbJtnMj3OcRdrkTP0tA==} - acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} + '@vue/reactivity@3.5.4': + resolution: {integrity: sha512-HKKbEuP7tYSGCq4e4nK6ZW6l5hyG66OUetefBp4budUyjvAYsnQDf+bgFzg2RAgnH0CInyqXwD9y47jwJEHrQw==} - acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true + '@vue/shared@3.5.4': + resolution: {integrity: sha512-L2MCDD8l7yC62Te5UUyPVpmexhL9ipVnYRw9CsWfm/BGRL5FwDX4a25bcJ/OJSD3+Hx+k/a8LDKcG2AFdJV3BA==} ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} @@ -584,16 +673,13 @@ packages: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} @@ -611,12 +697,13 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} - check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} chokidar-cli@3.0.0: resolution: {integrity: sha512-xVW+Qeh7z15uZRxHOkP93Ux8A0xbPzwK4GaqD8dQOYc34TlkqUhVSS59fK36DOp5WdJlrRzlYSy02Ht99FjZqQ==} @@ -643,11 +730,11 @@ packages: csstype@3.1.1: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} - csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + 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: '*' @@ -659,14 +746,10 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - 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'} - diff-sequences@29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - emoji-regex@7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} @@ -675,16 +758,19 @@ packages: engines: {node: '>=12'} hasBin: 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 - 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 + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -707,8 +793,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -734,16 +820,9 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - kairo@0.6.0-rc.0: resolution: {integrity: sha512-8yWTOujaeU5a6FtFCQnRhljxo8KaxQVDV6xJFxEpkCKd2azlMBmc5ARazaQUb/KJ2PWzsVdiXRbvFmreP6pbFA==} - local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -754,30 +833,26 @@ packages: lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} - magic-string@0.30.2: - resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} - engines: {node: '>=12'} + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} - mlly@1.4.0: - resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + mobx@6.13.2: + resolution: {integrity: sha512-GIubI2qf+P6lG6rSEG0T2pg3jV9/0+O0ncF09+0umRe75+Cbnh1KNLM1GvbTY9RSc7QuU+LcPNZfxDY8B+3XRg==} - mobx@6.10.0: - resolution: {integrity: sha512-WMbVpCMFtolbB8swQ5E2YRrU+Yu8iLozCVx3CdGjbBKlP7dFiCSuiG06uea3JCFN5DnvtAX7+G5Bp82e2xu0ww==} + mol_wire_lib@1.0.1155: + resolution: {integrity: sha512-q5r5/615KmV5dvM13zak0mYBi5c0Na6RGDRgunZRmezkiIdu4YyVtjPL9syUGpNib8KLzj5acTTWm2BXNC7MHw==} mol_wire_lib@1.0.488: resolution: {integrity: sha512-AqGNHtM5HvxdYKXMt85ESXG+Owj/E6HEUM2a0SKoCpx+R4uHrqM3V8HABt13twXzMDDfjO713TRWQb7Qb4EQRA==} - mol_wire_lib@1.0.707: - resolution: {integrity: sha512-Ggig8FLegQdcIqOVP4bgV2jsBoozd0ThqvBW7iEE5a+Ld/A1NfmgMlS8dyOSL+24ksM+NxkCGYJjU4SI3Llnfg==} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + 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 @@ -785,17 +860,13 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - oby@14.3.1: - resolution: {integrity: sha512-/5BvIarE2epsV2DDjcBf6R7DvcoUqtU62AOEEQyUqaKzwz0kdpB6huOG8anaqU0Asa9UGPFxdQWVbUPpEGLkuw==} + oby@15.1.2: + resolution: {integrity: sha512-6QD9iEoPzV+pMDdcg3RtFWhgDX8pS5hZouVHvgXGDy3Q9RxFfnI3CYv9i62keeuX+qk6iN2z5E9FD3q3OckZ6A==} p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -808,41 +879,32 @@ packages: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} - pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - - postcss@8.4.28: - resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} + postcss@8.4.45: + resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} engines: {node: ^10 || ^12 || >=14} - preact@10.17.1: - resolution: {integrity: sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA==} + preact@10.23.2: + resolution: {integrity: sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==} prettier@3.3.3: resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true - pretty-format@29.6.2: - resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -854,9 +916,9 @@ packages: require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - 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 rxjs@7.8.1: @@ -865,8 +927,14 @@ packages: s-js@0.4.9: resolution: {integrity: sha512-RtpOm+cM6O0sHg6IA70wH+UC3FZcND+rccBZpBAHzlUgNO2Bm5BN+FnM8+OBxzXdwpKWFwX11JGF0MFRkhSoIQ==} - 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'} set-blocking@2.0.0: @@ -881,18 +949,18 @@ packages: solid-js@1.6.11: resolution: {integrity: sha512-JquQQHPArGq+i2PLURxJ99Pcz2/1docpbycSio/cKSA0SeI3z5zRjy0TNcH4NRYvbOLrcini+iovXwnexKabyw==} - solid-js@1.7.11: - resolution: {integrity: sha512-JkuvsHt8jqy7USsy9xJtT18aF9r2pFO+GB8JQ2XGTvtF49rGTObB46iebD25sE3qVNvIbwglXOXdALnJq9IHtQ==} + 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'} stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.4.0: - resolution: {integrity: sha512-YqHeQIIQ8r1VtUZOTOyjsAXAsjr369SplZ5rlQaiJTBsvodvPSCME7vuz8pnQltbQ0Cw0lyFo5Q8uyNwYQ58Xw==} + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} string-width@3.1.0: resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} @@ -902,18 +970,22 @@ packages: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} - strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinybench@2.5.0: - resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} - tinypool@0.7.0: - resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} + 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'} - 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'} to-regex-range@5.0.1: @@ -923,17 +995,16 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true - ufo@1.2.0: - resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} usignal@0.8.14: resolution: {integrity: sha512-pPWOcODVi1bT11Mj1j4wfQkbHJA4uhvZrHuiQDs15J+mKy46WgeJhyYRGTGAa4Zox2cKjAmurDtJkoD9lURUnQ==} @@ -945,20 +1016,21 @@ packages: resolution: {integrity: sha512-CVNliz6KF2yet3HBIkbFJKZmjlt95C8dsNZDnwoS6X98+QJRpsSz9uxo3TziBqdyJQkWwfD3VG9lRzsQNvF24Q==} engines: {node: '>= 0.6.0'} - vite-node@0.34.2: - resolution: {integrity: sha512-JtW249Zm3FB+F7pQfH56uWSdlltCo1IOkZW5oHBzeQo0iX4jtC7o1t9aILMGd9kVekXBP2lfJBEQt9rBh07ebA==} - engines: {node: '>=v14.18.0'} + vite-node@2.1.0: + resolution: {integrity: sha512-+ybYqBVUjYyIscoLzMWodus2enQDZOpGhcU6HdOVD6n8WZdk12w1GFL3mbnxLs7hPtRtqs1Wo5YF6/Tsr6fmhg==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@4.4.9: - resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} - engines: {node: ^14.18.0 || >=16.0.0} + vite@5.4.4: + resolution: {integrity: sha512-RHFCkULitycHVTtelJ6jQLd+KSAAzOgEYorV32R2q++M6COBjKJR6BxqClwp5sf0XaBDjVMuJ9wnNfyAJwjMkA==} + 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 @@ -971,6 +1043,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -978,22 +1052,22 @@ packages: terser: optional: true - vitest@0.34.2: - resolution: {integrity: sha512-WgaIvBbjsSYMq/oiMlXUI7KflELmzM43BEvkdC/8b5CAod4ryAiY2z8uR6Crbi5Pjnu5oOmhKa9sy7uk6paBxQ==} - engines: {node: '>=v14.18.0'} + vitest@2.1.0: + resolution: {integrity: sha512-XuuEeyNkqbfr0FtAvd9vFbInSSNY1ykCQTYQ0sj9wPy4hx+1gR7gqVNdW0AX2wrrM1wWlN5fnJDjF9xG6mYRSQ==} + 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.0 + '@vitest/ui': 2.1.0 happy-dom: '*' jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/node': + optional: true '@vitest/browser': optional: true '@vitest/ui': @@ -1002,18 +1076,12 @@ packages: optional: true jsdom: optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true which-module@2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} - 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 @@ -1030,285 +1098,338 @@ packages: yargs@13.3.2: resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - - zone.js@0.14.1: - resolution: {integrity: sha512-R3t9Nwl/LJnnpmwx0+Q7YcHtE6xUObnowwNskWCiqEMQXYYlkZiOOhF+N2R18PMILv8+fbzCLKAJvpvyxzafpQ==} + zone.js@0.15.0: + resolution: {integrity: sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==} snapshots: - '@angular/core@17.0.0-rc.1(rxjs@7.8.1)(zone.js@0.14.1)': + '@angular/core@18.2.4(rxjs@7.8.1)(zone.js@0.15.0)': dependencies: rxjs: 7.8.1 - tslib: 2.6.2 - zone.js: 0.14.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.18.20': + '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.19.2': + '@esbuild/android-arm64@0.23.1': optional: true '@esbuild/android-arm@0.16.17': optional: true - '@esbuild/android-arm@0.18.20': + '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.19.2': + '@esbuild/android-arm@0.23.1': optional: true '@esbuild/android-x64@0.16.17': optional: true - '@esbuild/android-x64@0.18.20': + '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.19.2': + '@esbuild/android-x64@0.23.1': optional: true '@esbuild/darwin-arm64@0.16.17': optional: true - '@esbuild/darwin-arm64@0.18.20': + '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.19.2': + '@esbuild/darwin-arm64@0.23.1': optional: true '@esbuild/darwin-x64@0.16.17': optional: true - '@esbuild/darwin-x64@0.18.20': + '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.19.2': + '@esbuild/darwin-x64@0.23.1': optional: true '@esbuild/freebsd-arm64@0.16.17': optional: true - '@esbuild/freebsd-arm64@0.18.20': + '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.19.2': + '@esbuild/freebsd-arm64@0.23.1': optional: true '@esbuild/freebsd-x64@0.16.17': optional: true - '@esbuild/freebsd-x64@0.18.20': + '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.19.2': + '@esbuild/freebsd-x64@0.23.1': optional: true '@esbuild/linux-arm64@0.16.17': optional: true - '@esbuild/linux-arm64@0.18.20': + '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.19.2': + '@esbuild/linux-arm64@0.23.1': optional: true '@esbuild/linux-arm@0.16.17': optional: true - '@esbuild/linux-arm@0.18.20': + '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.19.2': + '@esbuild/linux-arm@0.23.1': optional: true '@esbuild/linux-ia32@0.16.17': optional: true - '@esbuild/linux-ia32@0.18.20': + '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.19.2': + '@esbuild/linux-ia32@0.23.1': optional: true '@esbuild/linux-loong64@0.16.17': optional: true - '@esbuild/linux-loong64@0.18.20': + '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.19.2': + '@esbuild/linux-loong64@0.23.1': optional: true '@esbuild/linux-mips64el@0.16.17': optional: true - '@esbuild/linux-mips64el@0.18.20': + '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.19.2': + '@esbuild/linux-mips64el@0.23.1': optional: true '@esbuild/linux-ppc64@0.16.17': optional: true - '@esbuild/linux-ppc64@0.18.20': + '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.19.2': + '@esbuild/linux-ppc64@0.23.1': optional: true '@esbuild/linux-riscv64@0.16.17': optional: true - '@esbuild/linux-riscv64@0.18.20': + '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.19.2': + '@esbuild/linux-riscv64@0.23.1': optional: true '@esbuild/linux-s390x@0.16.17': optional: true - '@esbuild/linux-s390x@0.18.20': + '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.19.2': + '@esbuild/linux-s390x@0.23.1': optional: true '@esbuild/linux-x64@0.16.17': optional: true - '@esbuild/linux-x64@0.18.20': + '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.19.2': + '@esbuild/linux-x64@0.23.1': optional: true '@esbuild/netbsd-x64@0.16.17': optional: true - '@esbuild/netbsd-x64@0.18.20': + '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.19.2': + '@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.18.20': + '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.19.2': + '@esbuild/openbsd-x64@0.23.1': optional: true '@esbuild/sunos-x64@0.16.17': optional: true - '@esbuild/sunos-x64@0.18.20': + '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.19.2': + '@esbuild/sunos-x64@0.23.1': optional: true '@esbuild/win32-arm64@0.16.17': optional: true - '@esbuild/win32-arm64@0.18.20': + '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.19.2': + '@esbuild/win32-arm64@0.23.1': optional: true '@esbuild/win32-ia32@0.16.17': optional: true - '@esbuild/win32-ia32@0.18.20': + '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.19.2': + '@esbuild/win32-ia32@0.23.1': optional: true '@esbuild/win32-x64@0.16.17': optional: true - '@esbuild/win32-x64@0.18.20': + '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.19.2': + '@esbuild/win32-x64@0.23.1': optional: true - '@jest/schemas@29.6.0': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} - '@preact/signals-core@1.4.0': {} + '@preact/signals-core@1.8.0': {} - '@preact/signals@1.2.1(preact@10.17.1)': + '@preact/signals@1.3.0(preact@10.23.2)': dependencies: - '@preact/signals-core': 1.4.0 - preact: 10.17.1 + '@preact/signals-core': 1.8.0 + preact: 10.23.2 '@reactively/core@0.0.8': {} - '@sinclair/typebox@0.27.8': {} + '@rollup/rollup-android-arm-eabi@4.21.3': + optional: true - '@solidjs/reactivity@0.0.9': {} + '@rollup/rollup-android-arm64@4.21.3': + optional: true - '@types/chai-subset@1.3.3': - dependencies: - '@types/chai': 4.3.5 + '@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 - '@types/chai@4.3.5': {} + '@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@20.5.1': {} + '@types/node@22.5.4': + dependencies: + undici-types: 6.19.8 - '@vitest/expect@0.34.2': + '@vitest/expect@2.1.0': dependencies: - '@vitest/spy': 0.34.2 - '@vitest/utils': 0.34.2 - chai: 4.3.7 + '@vitest/spy': 2.1.0 + '@vitest/utils': 2.1.0 + chai: 5.1.1 + tinyrainbow: 1.2.0 - '@vitest/runner@0.34.2': + '@vitest/mocker@2.1.0(@vitest/spy@2.1.0)(vite@5.4.4(@types/node@22.5.4))': dependencies: - '@vitest/utils': 0.34.2 - p-limit: 4.0.0 - pathe: 1.1.1 + '@vitest/spy': 2.1.0 + estree-walker: 3.0.3 + magic-string: 0.30.11 + optionalDependencies: + vite: 5.4.4(@types/node@22.5.4) - '@vitest/snapshot@0.34.2': + '@vitest/pretty-format@2.1.0': dependencies: - magic-string: 0.30.2 - pathe: 1.1.1 - pretty-format: 29.6.2 + tinyrainbow: 1.2.0 - '@vitest/spy@0.34.2': + '@vitest/runner@2.1.0': dependencies: - tinyspy: 2.1.1 + '@vitest/utils': 2.1.0 + pathe: 1.1.2 - '@vitest/utils@0.34.2': + '@vitest/snapshot@2.1.0': dependencies: - diff-sequences: 29.4.3 - loupe: 2.3.6 - pretty-format: 29.6.2 + '@vitest/pretty-format': 2.1.0 + magic-string: 0.30.11 + pathe: 1.1.2 - '@vue/reactivity@3.3.4': + '@vitest/spy@2.1.0': dependencies: - '@vue/shared': 3.3.4 + tinyspy: 3.0.2 - '@vue/shared@3.3.4': {} + '@vitest/utils@2.1.0': + dependencies: + '@vitest/pretty-format': 2.1.0 + loupe: 3.1.1 + tinyrainbow: 1.2.0 - acorn-walk@8.2.0: {} + '@vue/reactivity@3.5.4': + dependencies: + '@vue/shared': 3.5.4 - acorn@8.10.0: {} + '@vue/shared@3.5.4': {} ansi-regex@4.1.1: {} @@ -1316,14 +1437,12 @@ snapshots: dependencies: color-convert: 1.9.3 - ansi-styles@5.2.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - assertion-error@1.1.0: {} + assertion-error@2.0.1: {} binary-extensions@2.2.0: {} @@ -1335,17 +1454,15 @@ snapshots: camelcase@5.3.1: {} - chai@4.3.7: + chai@5.1.1: 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 + 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@1.0.2: {} + check-error@2.1.1: {} chokidar-cli@3.0.0: dependencies: @@ -1382,19 +1499,15 @@ snapshots: csstype@3.1.1: {} - csstype@3.1.2: {} + csstype@3.1.3: {} - debug@4.3.4: + debug@4.3.7: dependencies: - ms: 2.1.2 + ms: 2.1.3 decamelize@1.2.0: {} - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - diff-sequences@29.4.3: {} + deep-eql@5.0.2: {} emoji-regex@7.0.3: {} @@ -1423,55 +1536,62 @@ snapshots: '@esbuild/win32-ia32': 0.16.17 '@esbuild/win32-x64': 0.16.17 - esbuild@0.18.20: + esbuild@0.21.5: 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 - - esbuild@0.19.2: + '@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/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 + '@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 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 fill-range@7.0.1: dependencies: @@ -1489,7 +1609,7 @@ snapshots: get-caller-file@2.0.5: {} - get-func-name@2.0.0: {} + get-func-name@2.0.2: {} glob-parent@5.1.2: dependencies: @@ -1509,12 +1629,8 @@ snapshots: is-number@7.0.0: {} - jsonc-parser@3.2.0: {} - kairo@0.6.0-rc.0: {} - local-pkg@0.4.3: {} - locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -1524,43 +1640,32 @@ snapshots: lodash.throttle@4.1.1: {} - loupe@2.3.6: + loupe@3.1.1: dependencies: - get-func-name: 2.0.0 + get-func-name: 2.0.2 - magic-string@0.30.2: + magic-string@0.30.11: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 - mlly@1.4.0: - dependencies: - acorn: 8.10.0 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.2.0 + mobx@6.13.2: {} - mobx@6.10.0: {} + mol_wire_lib@1.0.1155: {} mol_wire_lib@1.0.488: {} - mol_wire_lib@1.0.707: {} - - ms@2.1.2: {} + ms@2.1.3: {} - nanoid@3.3.6: {} + nanoid@3.3.7: {} normalize-path@3.0.0: {} - oby@14.3.1: {} + oby@15.1.2: {} p-limit@2.3.0: dependencies: p-try: 2.2.0 - p-limit@4.0.0: - dependencies: - yocto-queue: 1.0.0 - p-locate@3.0.0: dependencies: p-limit: 2.3.0 @@ -1569,38 +1674,24 @@ snapshots: path-exists@3.0.0: {} - pathe@1.1.1: {} + pathe@1.1.2: {} - pathval@1.1.1: {} + pathval@2.0.0: {} - picocolors@1.0.0: {} + picocolors@1.1.0: {} picomatch@2.3.1: {} - pkg-types@1.0.3: - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.0 - pathe: 1.1.1 - - postcss@8.4.28: + postcss@8.4.45: dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.1 - preact@10.17.1: {} + preact@10.23.2: {} prettier@3.3.3: {} - pretty-format@29.6.2: - dependencies: - '@jest/schemas': 29.6.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - - react-is@18.2.0: {} - readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -1609,8 +1700,26 @@ snapshots: require-main-filename@2.0.0: {} - rollup@3.28.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: @@ -1619,7 +1728,11 @@ snapshots: s-js@0.4.9: {} - seroval@0.5.1: {} + seroval-plugins@1.1.1(seroval@1.1.1): + dependencies: + seroval: 1.1.1 + + seroval@1.1.1: {} set-blocking@2.0.0: {} @@ -1631,16 +1744,17 @@ snapshots: dependencies: csstype: 3.1.1 - solid-js@1.7.11: + solid-js@1.8.22: dependencies: - csstype: 3.1.2 - seroval: 0.5.1 + csstype: 3.1.3 + seroval: 1.1.1 + seroval-plugins: 1.1.1(seroval@1.1.1) - source-map-js@1.0.2: {} + source-map-js@1.2.1: {} stackback@0.0.2: {} - std-env@3.4.0: {} + std-env@3.7.0: {} string-width@3.1.0: dependencies: @@ -1652,15 +1766,15 @@ snapshots: dependencies: ansi-regex: 4.1.1 - strip-literal@1.3.0: - dependencies: - acorn: 8.10.0 + tinybench@2.9.0: {} + + tinyexec@0.3.0: {} - tinybench@2.5.0: {} + tinypool@1.0.1: {} - tinypool@0.7.0: {} + tinyrainbow@1.2.0: {} - tinyspy@2.1.1: {} + tinyspy@3.0.2: {} to-regex-range@5.0.1: dependencies: @@ -1668,11 +1782,11 @@ snapshots: tslib@2.6.2: {} - type-detect@4.0.8: {} + tslib@2.7.0: {} typescript@4.9.5: {} - ufo@1.2.0: {} + undici-types@6.19.8: {} usignal@0.8.14: {} @@ -1680,63 +1794,61 @@ snapshots: v8-natives@1.2.5: {} - vite-node@0.34.2(@types/node@20.5.1): + vite-node@2.1.0(@types/node@22.5.4): 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) + debug: 4.3.7 + pathe: 1.1.2 + vite: 5.4.4(@types/node@22.5.4) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vite@4.4.9(@types/node@20.5.1): + vite@5.4.4(@types/node@22.5.4): dependencies: - esbuild: 0.18.20 - postcss: 8.4.28 - rollup: 3.28.0 + esbuild: 0.21.5 + postcss: 8.4.45 + rollup: 4.21.3 optionalDependencies: - '@types/node': 20.5.1 + '@types/node': 22.5.4 fsevents: 2.3.3 - vitest@0.34.2: + vitest@2.1.0(@types/node@22.5.4): 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 + '@vitest/expect': 2.1.0 + '@vitest/mocker': 2.1.0(@vitest/spy@2.1.0)(vite@5.4.4(@types/node@22.5.4)) + '@vitest/pretty-format': 2.1.0 + '@vitest/runner': 2.1.0 + '@vitest/snapshot': 2.1.0 + '@vitest/spy': 2.1.0 + '@vitest/utils': 2.1.0 + 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.4(@types/node@22.5.4) + vite-node: 2.1.0(@types/node@22.5.4) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.5.4 transitivePeerDependencies: - less - lightningcss + - msw - sass + - sass-embedded - stylus - sugarss - supports-color @@ -1744,7 +1856,7 @@ snapshots: which-module@2.0.0: {} - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 @@ -1775,8 +1887,4 @@ snapshots: y18n: 4.0.3 yargs-parser: 13.1.2 - yocto-queue@1.0.0: {} - - zone.js@0.14.1: - dependencies: - tslib: 2.6.2 + zone.js@0.15.0: {} From beb49a0b07cfcbfaed224e2be071b3d4f6caae89 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 13 Sep 2024 04:39:50 -0500 Subject: [PATCH 05/45] feat: add more unit tests and fix several bugs --- .prettierrc | 8 +-- package.json | 2 +- src/cellxBench.ts | 6 +- src/config.ts | 32 ++++----- src/frameworks.test.ts | 68 +++++++++++++++++-- src/frameworks/angularSignals.ts | 13 ++-- src/frameworks/mobx.ts | 2 +- src/frameworks/oby.ts | 5 +- src/frameworks/reactively.ts | 5 +- src/frameworks/solid.ts | 4 +- .../tc39-proposal-signals-stage-0.ts | 5 +- src/frameworks/vueReactivity.ts | 46 ++++++++----- src/index.ts | 9 +-- 13 files changed, 141 insertions(+), 64 deletions(-) diff --git a/.prettierrc b/.prettierrc index af07fd2..5d814d3 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,11 +1,11 @@ { - "singleQuote": true, - "jsxSingleQuote": true, - "semi": false, + "singleQuote": false, + "jsxSingleQuote": false, + "semi": true, "useTabs": false, "tabWidth": 2, "bracketSpacing": true, "bracketSameLine": false, "arrowParens": "always", - "trailingComma": "none" + "trailingComma": "es5" } diff --git a/package.json b/package.json index c1dc6c1..494b967 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "", "main": "index.js", "scripts": { - "test": "vitest", + "test": "vitest run", "bench": "esbuild src/index.ts --external:v8-natives --bundle --format=cjs --platform=node | node --allow-natives-syntax" }, "keywords": [], diff --git a/src/cellxBench.ts b/src/cellxBench.ts index cee1b17..a2bd379 100644 --- a/src/cellxBench.ts +++ b/src/cellxBench.ts @@ -52,10 +52,13 @@ const cellx = (framework: ReactiveFramework, layers: number) => { ] as const; framework.withBatch(() => { + // console.log(framework.name, 'batch', 0) start.prop1.write(4); + // console.log(framework.name, 'batch', 1) start.prop2.write(3); start.prop3.write(2); start.prop4.write(1); + // console.log(framework.name, 'batch', 2) }); const after = [ @@ -65,6 +68,7 @@ const cellx = (framework: ReactiveFramework, layers: number) => { end.prop4.read(), ] as const; + // console.log(framework.name, 4) const endTime = performance.now(); const elapsedTime = endTime - startTime; @@ -84,7 +88,7 @@ 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) => { diff --git a/src/config.ts b/src/config.ts index b0ab801..277b884 100644 --- a/src/config.ts +++ b/src/config.ts @@ -4,7 +4,7 @@ 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 { tc39SignalsProposalStage0 } from "./frameworks/tc39-proposal-signals-stage-0"; import { molWireFramework } from "./frameworks/molWire"; import { obyFramework } from "./frameworks/oby"; import { preactSignalFramework } from "./frameworks/preactSignals"; @@ -16,11 +16,12 @@ import { vueReactivityFramework } from "./frameworks/vueReactivity"; import { xReactivityFramework } from "./frameworks/xReactivity"; export const frameworkInfo: FrameworkInfo[] = [ + { framework: vueReactivityFramework, testPullCounts: true }, { framework: angularFramework, testPullCounts: true }, { framework: compostateFramework, testPullCounts: true }, + { framework: mobxFramework }, { framework: tc39SignalsProposalStage0, testPullCounts: true }, // { framework: kairoFramework, testPullCounts: true }, - // { framework: mobxFramework, testPullCounts: true }, { framework: molWireFramework, testPullCounts: true }, { framework: obyFramework, testPullCounts: true }, { framework: preactSignalFramework, testPullCounts: true }, @@ -28,7 +29,6 @@ export const frameworkInfo: FrameworkInfo[] = [ { framework: sFramework }, { framework: solidFramework }, // solid can't testPullCounts because batch executes all leaf nodes even if unread { framework: usignalFramework, testPullCounts: true }, - { framework: vueReactivityFramework, testPullCounts: true }, { framework: xReactivityFramework, testPullCounts: true }, ]; @@ -98,17 +98,17 @@ export const perfTests: TestConfig[] = [ count: 1246500, }, }, - { - name: "very dynamic", - width: 100, - totalLayers: 15, - staticFraction: 0.5, - nSources: 6, - readFraction: 1, - iterations: 2000, - expected: { - sum: 15664996402790400, - count: 1078000, - }, - }, + // { + // name: 'very dynamic', + // width: 100, + // totalLayers: 15, + // staticFraction: 0.5, + // nSources: 6, + // readFraction: 1, + // iterations: 2000, + // expected: { + // sum: 15664996402790400, + // count: 1078000 + // } + // } ]; diff --git a/src/frameworks.test.ts b/src/frameworks.test.ts index d700982..8903cc8 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 { expect, test, vi } from "vitest"; import { FrameworkInfo, TestConfig } from "./util/frameworkTypes"; import { frameworkInfo } from "./config"; @@ -23,10 +23,25 @@ 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`, () => { @@ -34,7 +49,11 @@ function frameworkTests({ framework, testPullCounts }: FrameworkInfo) { const { graph, counter } = makeGraph(framework, config); 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`, () => { @@ -47,6 +66,8 @@ function frameworkTests({ framework, testPullCounts }: FrameworkInfo) { expect(sum).toEqual(72); if (testPullCounts) { expect(counter.count).toEqual(41); + } else { + expect(counter.count).toBeGreaterThanOrEqual(41); } }); @@ -59,6 +80,41 @@ function frameworkTests({ framework, testPullCounts }: FrameworkInfo) { const sum = runGraph(graph, 10, 1, framework); expect(sum).toEqual(72); - expect(counter.count).toEqual(22); + 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(); + + framework.withBuild(() => { + const s = framework.signal(2); + const c = framework.computed(() => s.read() * 2); + + framework.effect(() => spy(c.read())); + 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/mobx.ts b/src/frameworks/mobx.ts index bc5ba8f..d757e1b 100644 --- a/src/frameworks/mobx.ts +++ b/src/frameworks/mobx.ts @@ -4,7 +4,7 @@ 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)), 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/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/tc39-proposal-signals-stage-0.ts b/src/frameworks/tc39-proposal-signals-stage-0.ts index 6f7956d..c0bd2d1 100644 --- a/src/frameworks/tc39-proposal-signals-stage-0.ts +++ b/src/frameworks/tc39-proposal-signals-stage-0.ts @@ -1,7 +1,6 @@ import { ReactiveFramework } from "../util/reactiveFramework"; import { Signal } from "signal-polyfill"; - export const tc39SignalsProposalStage0: ReactiveFramework = { name: "TC39 Signals Proposal: Stage 0", signal: (initialValue) => { @@ -48,8 +47,8 @@ function processPending() { w.watch(); } -export function effect(callback) { - let cleanup; +export function effect(callback: any) { + let cleanup: any; const computed = new Signal.Computed(() => { typeof cleanup === "function" && cleanup(); diff --git a/src/frameworks/vueReactivity.ts b/src/frameworks/vueReactivity.ts index c289509..d379a6e 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", 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,31 @@ export const vueReactivityFramework: ReactiveFramework = { read: () => c.value, }; }, - effect: function (fn) { - let t = effect(() => fn(), { - lazy: false, - scheduler: (x) => { + effect: (fn) => { + let t = effect(fn, { + scheduler: () => { scheduled.push(t.effect); }, }); }, - withBatch: function (fn) { - if (isBatching) { + // withBatch: (fn) => fn(), + 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) => fn() + withBuild: (fn) => { + const e = effectScope(); + const r = e.run(fn)!; + e.stop(); + return r; + }, }; diff --git a/src/index.ts b/src/index.ts index 956596a..d097651 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import { dynamicBench } from "./dynamicBench"; -import { cellxbench } from "./cellxBench"; +// import { cellxbench } from "./cellxBench"; import { sbench } from "./sBench"; import { frameworkInfo } from "./config"; import { logPerfResult, perfReportHeaders } from "./util/perfLogging"; @@ -8,6 +8,7 @@ import { kairoBench } from "./kairoBench"; async function main() { logPerfResult(perfReportHeaders()); + // (globalThis as any).__DEV__ = true; for (const { framework } of frameworkInfo) { await kairoBench(framework); @@ -21,9 +22,9 @@ async function main() { sbench(framework); } - for (const { framework } of frameworkInfo) { - cellxbench(framework); - } + // for (const { framework } of frameworkInfo) { + // cellxbench(framework); + // } for (const frameworkTest of frameworkInfo) { await dynamicBench(frameworkTest); From fb86baa6fea45f2943dd5ed76553ceef2a336b5d Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 13 Sep 2024 04:41:46 -0500 Subject: [PATCH 06/45] feat: add comments explaining removed tests --- src/config.ts | 3 ++- src/index.ts | 1 + src/util/dependencyGraph.ts | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/config.ts b/src/config.ts index 277b884..2170792 100644 --- a/src/config.ts +++ b/src/config.ts @@ -2,7 +2,7 @@ import { TestConfig, FrameworkInfo } from "./util/frameworkTypes"; import { angularFramework } from "./frameworks/angularSignals"; import { compostateFramework } from "./frameworks/compostate"; -import { kairoFramework } from "./frameworks/kairo"; +// import { kairoFramework } from "./frameworks/kairo"; import { mobxFramework } from "./frameworks/mobx"; import { tc39SignalsProposalStage0 } from "./frameworks/tc39-proposal-signals-stage-0"; import { molWireFramework } from "./frameworks/molWire"; @@ -98,6 +98,7 @@ export const perfTests: TestConfig[] = [ count: 1246500, }, }, + // NOTE: Several of the frameworks hang on this test, so disabling it for now. // { // name: 'very dynamic', // width: 100, diff --git a/src/index.ts b/src/index.ts index d097651..95dd42d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -22,6 +22,7 @@ async function main() { sbench(framework); } + // NOTE: Several of the frameworks hang on this benchmark, so disabling it for now. // for (const { framework } of frameworkInfo) { // cellxbench(framework); // } diff --git a/src/util/dependencyGraph.ts b/src/util/dependencyGraph.ts index 7b02e40..a704642 100644 --- a/src/util/dependencyGraph.ts +++ b/src/util/dependencyGraph.ts @@ -120,7 +120,7 @@ function makeRow( staticFraction: number, nSources: number, framework: ReactiveFramework, - layer: number, + _layer: number, random: () => number ): Computed[] { return sources.map((_, myDex) => { From 2db02d8aa469b5cfd6f83c257f9d55bd7cc2296b Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 13 Sep 2024 04:49:18 -0500 Subject: [PATCH 07/45] feat: add signia framework --- package.json | 1 + pnpm-lock.yaml | 8 ++++++++ src/config.ts | 4 +++- src/frameworks/signia.ts | 22 ++++++++++++++++++++++ src/index.ts | 2 +- 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 src/frameworks/signia.ts diff --git a/package.json b/package.json index 494b967..168c225 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "preact": "^10.23.2", "s-js": "^0.4.9", "signal-polyfill": "^0.1.0", + "signia": "^0.1.5", "solid-js": "^1.8.22", "usignal": "^0.9.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b34e367..4ea53f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,6 +47,9 @@ importers: signal-polyfill: specifier: ^0.1.0 version: 0.1.2 + signia: + specifier: ^0.1.5 + version: 0.1.5 solid-js: specifier: ^1.8.22 version: 1.8.22 @@ -946,6 +949,9 @@ packages: 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==} @@ -1740,6 +1746,8 @@ snapshots: signal-polyfill@0.1.2: {} + signia@0.1.5: {} + solid-js@1.6.11: dependencies: csstype: 3.1.1 diff --git a/src/config.ts b/src/config.ts index 2170792..275e0df 100644 --- a/src/config.ts +++ b/src/config.ts @@ -14,9 +14,9 @@ import { solidFramework } from "./frameworks/solid"; import { usignalFramework } from "./frameworks/uSignal"; import { vueReactivityFramework } from "./frameworks/vueReactivity"; import { xReactivityFramework } from "./frameworks/xReactivity"; +import { signiaFramework } from "./frameworks/signia"; export const frameworkInfo: FrameworkInfo[] = [ - { framework: vueReactivityFramework, testPullCounts: true }, { framework: angularFramework, testPullCounts: true }, { framework: compostateFramework, testPullCounts: true }, { framework: mobxFramework }, @@ -26,9 +26,11 @@ export const frameworkInfo: FrameworkInfo[] = [ { framework: obyFramework, testPullCounts: true }, { framework: preactSignalFramework, testPullCounts: true }, { framework: reactivelyFramework, testPullCounts: true }, + { framework: signiaFramework, testPullCounts: true }, { framework: sFramework }, { framework: solidFramework }, // solid can't testPullCounts because batch executes all leaf nodes even if unread { framework: usignalFramework, testPullCounts: true }, + { framework: vueReactivityFramework, testPullCounts: true }, { framework: xReactivityFramework, testPullCounts: true }, ]; 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/index.ts b/src/index.ts index 95dd42d..248b812 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import { dynamicBench } from "./dynamicBench"; -// import { cellxbench } from "./cellxBench"; +import { cellxbench } from "./cellxBench"; import { sbench } from "./sBench"; import { frameworkInfo } from "./config"; import { logPerfResult, perfReportHeaders } from "./util/perfLogging"; From c8b55cb986fd96d3b33d07ce67a24f2f6712cbde Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 13 Sep 2024 05:39:17 -0500 Subject: [PATCH 08/45] docs: update results in readme --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 859721f..038239b 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,6 @@ $ pnpm bench - Tracks garbage collection overhead per 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. @@ -23,6 +22,18 @@ The frameworks are all plenty fast for typical applications. The charts report t That said, there's learning here to improve performance of all the frameworks. +[!Average Results](https://github.com/user-attachments/assets/4621879c-fb20-4056-8fd8-f7daa31a07e3)[^mobx] + +[Raw results CSV](https://github.com/user-attachments/files/16992605/reactivity-bench.csv) + + + +Old results + ![Performance Results](https://user-images.githubusercontent.com/14153763/221107379-51a93eab-95ac-4c89-9a74-7a1527fc4a03.png) ![Raw](https://user-images.githubusercontent.com/14153763/222212050-5b651e4d-6e71-4667-94e7-eb94b7030bc1.png) + + + +[^mobx]: [MobX](https://mobx.js.org) is not included in the average benchmark results because it fails to run some of the deeper, dynamic benchmarks. From d85303f65278c06fa012930b12fe220d696dddf4 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 13 Sep 2024 05:42:50 -0500 Subject: [PATCH 09/45] docs: update results in readme --- README.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 038239b..4c06e2a 100644 --- a/README.md +++ b/README.md @@ -18,22 +18,24 @@ Current reactivity benchmarks ([S.js](https://github.com/adamhaile/S/blob/master 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. - -[!Average Results](https://github.com/user-attachments/assets/4621879c-fb20-4056-8fd8-f7daa31a07e3)[^mobx] - -[Raw results CSV](https://github.com/user-attachments/files/16992605/reactivity-bench.csv) +

+ Framework average benchmark results + Raw results CSV +

Old results + +The frameworks are all plenty fast for typical applications. The charts report the run time of the test in milliseconds on an M1 laptop, and are made using [Tableau](https://public.tableau.com/). Typical applications will do much more work than a framework benchmark, and at these speeds the frameworks are unlikely to bottleneck overall performance. + +That said, there's learning here to improve performance of all the frameworks. + ![Performance Results](https://user-images.githubusercontent.com/14153763/221107379-51a93eab-95ac-4c89-9a74-7a1527fc4a03.png) ![Raw](https://user-images.githubusercontent.com/14153763/222212050-5b651e4d-6e71-4667-94e7-eb94b7030bc1.png) - + [^mobx]: [MobX](https://mobx.js.org) is not included in the average benchmark results because it fails to run some of the deeper, dynamic benchmarks. From 5ca140cf0a50f10f230a61262653e439fdf341ab Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 13 Sep 2024 05:43:35 -0500 Subject: [PATCH 10/45] docs: update results in readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4c06e2a..5f167c7 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ We're also working on enabling consistent logging and efficient tracking of GC t Raw results CSV

- +
Old results @@ -36,6 +36,6 @@ That said, there's learning here to improve performance of all the frameworks. ![Raw](https://user-images.githubusercontent.com/14153763/222212050-5b651e4d-6e71-4667-94e7-eb94b7030bc1.png) - +
[^mobx]: [MobX](https://mobx.js.org) is not included in the average benchmark results because it fails to run some of the deeper, dynamic benchmarks. From 74d62c80cc3f17c489664bfe881ae2ff88c5d18f Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 13 Sep 2024 05:45:26 -0500 Subject: [PATCH 11/45] docs: update results in readme --- src/frameworks/tc39-proposal-signals-stage-0.ts | 2 +- src/util/perfLogging.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frameworks/tc39-proposal-signals-stage-0.ts b/src/frameworks/tc39-proposal-signals-stage-0.ts index c0bd2d1..4cd67bb 100644 --- a/src/frameworks/tc39-proposal-signals-stage-0.ts +++ b/src/frameworks/tc39-proposal-signals-stage-0.ts @@ -2,7 +2,7 @@ import { ReactiveFramework } from "../util/reactiveFramework"; import { Signal } from "signal-polyfill"; export const tc39SignalsProposalStage0: ReactiveFramework = { - name: "TC39 Signals Proposal: Stage 0", + name: "TC39 Signals Polyfill", signal: (initialValue) => { const s = new Signal.State(initialValue); return { diff --git a/src/util/perfLogging.ts b/src/util/perfLogging.ts index 4d7d1b3..df8db2d 100644 --- a/src/util/perfLogging.ts +++ b/src/util/perfLogging.ts @@ -14,7 +14,7 @@ export interface PerfRowStrings { } const columnWidth = { - framework: 16, + framework: 22, test: 60, time: 8, gcTime: 6, From 6ccdeef54702dfe8398e9bf3447a5215d9b430a4 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 13 Sep 2024 05:53:33 -0500 Subject: [PATCH 12/45] docs: update results in readme --- README.md | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5f167c7..94802bd 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,26 @@ Current reactivity benchmarks ([S.js](https://github.com/adamhaile/S/blob/master We're also working on enabling consistent logging and efficient tracking of GC time across all benchmarks. +## Frameworks + +- [Angular Signals](https://angular.dev/guide/signals/) +- [Compostate](https://github.com/lxsmnsyc/compostate) +- [Kairo]() +- [MobX](https://mobx.js.org) is not included in the average benchmark results because it fails to run some of the deeper, dynamic benchmarks. +- [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) +- [TC39 Signals Proposal](https://github.com/tc39/proposal-signals) [polyfill](https://github.com/proposal-signals/signal-polyfill) +- [uSignal](https://github.com/WebReflection/usignal) +- [Vue Reactivity](https://vuejs.org/guide/essentials/reactivity-fundamentals.html) +- [x-reactivity](https://www.npmjs.com/package/@solidjs/reactivity) + +## Results +

Framework average benchmark results Raw results CSV @@ -37,5 +57,3 @@ That said, there's learning here to improve performance of all the frameworks. ![Raw](https://user-images.githubusercontent.com/14153763/222212050-5b651e4d-6e71-4667-94e7-eb94b7030bc1.png) - -[^mobx]: [MobX](https://mobx.js.org) is not included in the average benchmark results because it fails to run some of the deeper, dynamic benchmarks. From 1daae2a8c3c420ce6aad0fcdf8c69559cfc0d186 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 13 Sep 2024 05:54:41 -0500 Subject: [PATCH 13/45] docs: update results in readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 94802bd..1862d30 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,8 @@ We're also working on enabling consistent logging and efficient tracking of GC t - [Angular Signals](https://angular.dev/guide/signals/) - [Compostate](https://github.com/lxsmnsyc/compostate) -- [Kairo]() -- [MobX](https://mobx.js.org) is not included in the average benchmark results because it fails to run some of the deeper, dynamic benchmarks. +- [Kairo](https://github.com/3Shain/kairo) +- [MobX](https://mobx.js.org) (not included in the average benchmark results because it fails to run some tests) - [mol wire](https://www.npmjs.com/package/mol_wire_lib) - [Oby](https://github.com/vobyjs/oby) - [Preact Signals](https://github.com/preactjs/signals) From e7b3872a3e4df94b5d04afcdf094c91e2d21507e Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 13 Sep 2024 05:56:43 -0500 Subject: [PATCH 14/45] docs: update results in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1862d30..4dea72a 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ We're also working on enabling consistent logging and efficient tracking of GC t

Framework average benchmark results - Raw results CSV + Raw results CSV (last updated September 2024 on a M3 Macbook Pro)

From 165cac808d7482b59d326d050b002b0e132f03ff Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 13 Sep 2024 05:57:09 -0500 Subject: [PATCH 15/45] docs: update results in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4dea72a..d7f013e 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ We're also working on enabling consistent logging and efficient tracking of GC t

Framework average benchmark results - Raw results CSV (last updated September 2024 on a M3 Macbook Pro) + Raw results CSV (last updated September 2024 on a M3 Macbook Pro)

From f898c3a9013f55ef6bc8b32a2b6d2a02b79467d4 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 13 Sep 2024 05:57:20 -0500 Subject: [PATCH 16/45] docs: update results in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d7f013e..4603fba 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ We're also working on enabling consistent logging and efficient tracking of GC t

Framework average benchmark results - Raw results CSV (last updated September 2024 on a M3 Macbook Pro) + Raw results CSV (last updated September 2024 on an M3 Macbook Pro)

From c931f71116315a9fe7276b91ee9504993f67e974 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 13 Sep 2024 06:09:09 -0500 Subject: [PATCH 17/45] chore: remove extra debug logs --- src/cellxBench.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/cellxBench.ts b/src/cellxBench.ts index a2bd379..b6a8631 100644 --- a/src/cellxBench.ts +++ b/src/cellxBench.ts @@ -52,13 +52,10 @@ const cellx = (framework: ReactiveFramework, layers: number) => { ] as const; framework.withBatch(() => { - // console.log(framework.name, 'batch', 0) start.prop1.write(4); - // console.log(framework.name, 'batch', 1) start.prop2.write(3); start.prop3.write(2); start.prop4.write(1); - // console.log(framework.name, 'batch', 2) }); const after = [ @@ -68,7 +65,6 @@ const cellx = (framework: ReactiveFramework, layers: number) => { end.prop4.read(), ] as const; - // console.log(framework.name, 4) const endTime = performance.now(); const elapsedTime = endTime - startTime; From c5ff95a8a9ad367e9336cdd184e44c3f9d82987f Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sat, 14 Sep 2024 19:50:26 -0500 Subject: [PATCH 18/45] feat: add valtio framework --- README.md | 7 ++++- package.json | 4 ++- pnpm-lock.yaml | 50 +++++++++++++++++++++++++++++++++++ src/config.ts | 7 ++++- src/frameworks/valtio.ts | 57 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 src/frameworks/valtio.ts diff --git a/README.md b/README.md index 4603fba..81b7843 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ We're also working on enabling consistent logging and efficient tracking of GC t - [Solid](https://github.com/solidjs/solid) - [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) @@ -40,9 +41,13 @@ We're also working on enabling consistent logging and efficient tracking of GC t

Framework average benchmark results - Raw results CSV (last updated September 2024 on an M3 Macbook Pro) + Raw results CSV (lower times are better)

+Note that MobX and Valtio are not included in the average results summary because they fail to run some of the benchmark tests. + +These results were last updated _September 2024_ on an M3 Macbook Pro. +
Old results diff --git a/package.json b/package.json index 168c225..58bda74 100644 --- a/package.json +++ b/package.json @@ -22,11 +22,13 @@ "mol_wire_lib": "^1.0.1155", "oby": "15.1.2", "preact": "^10.23.2", + "react": "^18.3.1", "s-js": "^0.4.9", "signal-polyfill": "^0.1.0", "signia": "^0.1.5", "solid-js": "^1.8.22", - "usignal": "^0.9.0" + "usignal": "^0.9.0", + "valtio": "^2.0.0" }, "devDependencies": { "@types/node": "^22.5.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4ea53f3..0763e56 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,9 @@ importers: preact: specifier: ^10.23.2 version: 10.23.2 + react: + specifier: ^18.3.1 + version: 18.3.1 s-js: specifier: ^0.4.9 version: 0.4.9 @@ -56,6 +59,9 @@ importers: 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: ^22.5.4 @@ -823,6 +829,9 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + kairo@0.6.0-rc.0: resolution: {integrity: sha512-8yWTOujaeU5a6FtFCQnRhljxo8KaxQVDV6xJFxEpkCKd2azlMBmc5ARazaQUb/KJ2PWzsVdiXRbvFmreP6pbFA==} @@ -836,6 +845,10 @@ packages: lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} @@ -908,6 +921,13 @@ packages: engines: {node: '>=14'} hasBin: true + proxy-compare@3.0.0: + resolution: {integrity: sha512-y44MCkgtZUCT9tZGuE278fB7PWVf7fRYy0vbRXAts2o5F0EfC4fIQrvQQGBJo1WJbFcVLXzApOscyJuZqHQc1w==} + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -1022,6 +1042,18 @@ packages: resolution: {integrity: sha512-CVNliz6KF2yet3HBIkbFJKZmjlt95C8dsNZDnwoS6X98+QJRpsSz9uxo3TziBqdyJQkWwfD3VG9lRzsQNvF24Q==} engines: {node: '>= 0.6.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.0: resolution: {integrity: sha512-+ybYqBVUjYyIscoLzMWodus2enQDZOpGhcU6HdOVD6n8WZdk12w1GFL3mbnxLs7hPtRtqs1Wo5YF6/Tsr6fmhg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -1635,6 +1667,8 @@ snapshots: is-number@7.0.0: {} + js-tokens@4.0.0: {} + kairo@0.6.0-rc.0: {} locate-path@3.0.0: @@ -1646,6 +1680,10 @@ snapshots: 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 @@ -1698,6 +1736,12 @@ snapshots: prettier@3.3.3: {} + proxy-compare@3.0.0: {} + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -1802,6 +1846,12 @@ snapshots: 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.0(@types/node@22.5.4): dependencies: cac: 6.7.14 diff --git a/src/config.ts b/src/config.ts index 275e0df..0f485de 100644 --- a/src/config.ts +++ b/src/config.ts @@ -15,10 +15,12 @@ import { usignalFramework } from "./frameworks/uSignal"; import { vueReactivityFramework } from "./frameworks/vueReactivity"; import { xReactivityFramework } from "./frameworks/xReactivity"; import { signiaFramework } from "./frameworks/signia"; +import { valtioFramework } from "./frameworks/valtio"; export const frameworkInfo: FrameworkInfo[] = [ { framework: angularFramework, testPullCounts: true }, { framework: compostateFramework, testPullCounts: true }, + // NOTE: MobX currently hangs on some of the dynamic tests, so disable it if you want to run them. { framework: mobxFramework }, { framework: tc39SignalsProposalStage0, testPullCounts: true }, // { framework: kairoFramework, testPullCounts: true }, @@ -28,8 +30,11 @@ export const frameworkInfo: FrameworkInfo[] = [ { framework: reactivelyFramework, testPullCounts: true }, { framework: signiaFramework, testPullCounts: true }, { framework: sFramework }, - { framework: solidFramework }, // solid can't testPullCounts because batch executes all leaf nodes even if unread + // Solid can't testPullCounts because batch executes all leaf nodes even if unread + { framework: solidFramework }, { framework: usignalFramework, testPullCounts: true }, + // NOTE: Valtio currently hangs on some of the dynamic tests, so disable it if you want to run them. + { framework: valtioFramework }, { framework: vueReactivityFramework, testPullCounts: true }, { framework: xReactivityFramework, testPullCounts: true }, ]; diff --git a/src/frameworks/valtio.ts b/src/frameworks/valtio.ts new file mode 100644 index 0000000..0cc8e63 --- /dev/null +++ b/src/frameworks/valtio.ts @@ -0,0 +1,57 @@ +import { ReactiveFramework } from "../util/reactiveFramework"; +import { proxy } from "valtio/vanilla"; +import { watch } from "valtio/utils"; + +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(), +}; From 9197a2f57670be1ba2e45d59262a9e99a712e7d7 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 15 Sep 2024 02:05:37 -0500 Subject: [PATCH 19/45] feat: remove v8 native code to further simplify repro cases --- package.json | 14 ++- pnpm-lock.yaml | 183 +++++++++++++++++------------------- src/config.ts | 46 +++++---- src/dynamicBench.ts | 2 - src/util/benchRepeat.ts | 18 ++-- src/util/garbageTracking.ts | 56 ----------- src/util/perfLogging.ts | 3 - src/util/perfTests.ts | 1 - src/v8-natives.d.ts | 39 -------- 9 files changed, 123 insertions(+), 239 deletions(-) delete mode 100644 src/util/garbageTracking.ts delete mode 100644 src/v8-natives.d.ts diff --git a/package.json b/package.json index 58bda74..084d0c5 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "test": "vitest run", - "bench": "esbuild src/index.ts --external:v8-natives --bundle --format=cjs --platform=node | node --allow-natives-syntax" + "bench": "esbuild src/index.ts --bundle --format=cjs --platform=node | node --expose-gc" }, "keywords": [], "author": "", @@ -15,13 +15,13 @@ "@preact/signals": "^1.3.0", "@reactively/core": "^0.0.8", "@solidjs/reactivity": "^0.0.9", - "@vue/reactivity": "^3.5.4", + "@vue/reactivity": "^3.5.5", "compostate": "0.5.1", "kairo": "0.6.0-rc.0", "mobx": "^6.13.2", - "mol_wire_lib": "^1.0.1155", + "mol_wire_lib": "^1.0.1158", "oby": "15.1.2", - "preact": "^10.23.2", + "preact": "^10.24.0", "react": "^18.3.1", "s-js": "^0.4.9", "signal-polyfill": "^0.1.0", @@ -31,11 +31,9 @@ "valtio": "^2.0.0" }, "devDependencies": { - "@types/node": "^22.5.4", + "@types/node": "^22.5.5", "esbuild": "^0.23.1", "prettier": "^3.3.3", - "rxjs": "^7.8.1", - "v8-natives": "^1.2.5", - "vitest": "^2.1.0" + "vitest": "^2.1.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0763e56..f11ad7c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 18.2.4(rxjs@7.8.1)(zone.js@0.15.0) '@preact/signals': specifier: ^1.3.0 - version: 1.3.0(preact@10.23.2) + version: 1.3.0(preact@10.24.0) '@reactively/core': specifier: ^0.0.8 version: 0.0.8 @@ -21,8 +21,8 @@ importers: specifier: ^0.0.9 version: 0.0.9 '@vue/reactivity': - specifier: ^3.5.4 - version: 3.5.4 + specifier: ^3.5.5 + version: 3.5.5 compostate: specifier: 0.5.1 version: 0.5.1 @@ -33,14 +33,14 @@ importers: specifier: ^6.13.2 version: 6.13.2 mol_wire_lib: - specifier: ^1.0.1155 - version: 1.0.1155 + specifier: ^1.0.1158 + version: 1.0.1158 oby: specifier: 15.1.2 version: 15.1.2 preact: - specifier: ^10.23.2 - version: 10.23.2 + specifier: ^10.24.0 + version: 10.24.0 react: specifier: ^18.3.1 version: 18.3.1 @@ -64,23 +64,17 @@ importers: version: 2.0.0(react@18.3.1) devDependencies: '@types/node': - specifier: ^22.5.4 - version: 22.5.4 + specifier: ^22.5.5 + version: 22.5.5 esbuild: specifier: ^0.23.1 version: 0.23.1 prettier: specifier: ^3.3.3 version: 3.3.3 - rxjs: - specifier: ^7.8.1 - version: 7.8.1 - v8-natives: - specifier: ^1.2.5 - version: 1.2.5 vitest: - specifier: ^2.1.0 - version: 2.1.0(@types/node@22.5.4) + specifier: ^2.1.1 + version: 2.1.1(@types/node@22.5.5) packages/bench: devDependencies: @@ -635,16 +629,16 @@ packages: '@types/node@18.14.0': resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==} - '@types/node@22.5.4': - resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} + '@types/node@22.5.5': + resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} - '@vitest/expect@2.1.0': - resolution: {integrity: sha512-N3/xR4fSu0+6sVZETEtPT1orUs2+Y477JOXTcU3xKuu3uBlsgbD7/7Mz2LZ1Jr1XjwilEWlrIgSCj4N1+5ZmsQ==} + '@vitest/expect@2.1.1': + resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} - '@vitest/mocker@2.1.0': - resolution: {integrity: sha512-ZxENovUqhzl+QiOFpagiHUNUuZ1qPd5yYTCYHomGIZOFArzn4mgX2oxZmiAItJWAaXHG6bbpb/DpSPhlk5DgtA==} + '@vitest/mocker@2.1.1': + resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} peerDependencies: - '@vitest/spy': 2.1.0 + '@vitest/spy': 2.1.1 msw: ^2.3.5 vite: ^5.0.0 peerDependenciesMeta: @@ -653,26 +647,26 @@ packages: vite: optional: true - '@vitest/pretty-format@2.1.0': - resolution: {integrity: sha512-7sxf2F3DNYatgmzXXcTh6cq+/fxwB47RIQqZJFoSH883wnVAoccSRT6g+dTKemUBo8Q5N4OYYj1EBXLuRKvp3Q==} + '@vitest/pretty-format@2.1.1': + resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} - '@vitest/runner@2.1.0': - resolution: {integrity: sha512-D9+ZiB8MbMt7qWDRJc4CRNNUlne/8E1X7dcKhZVAbcOKG58MGGYVDqAq19xlhNfMFZsW0bpVKgztBwks38Ko0w==} + '@vitest/runner@2.1.1': + resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} - '@vitest/snapshot@2.1.0': - resolution: {integrity: sha512-x69CygGMzt9VCO283K2/FYQ+nBrOj66OTKpsPykjCR4Ac3lLV+m85hj9reaIGmjBSsKzVvbxWmjWE3kF5ha3uQ==} + '@vitest/snapshot@2.1.1': + resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} - '@vitest/spy@2.1.0': - resolution: {integrity: sha512-IXX5NkbdgTYTog3F14i2LgnBc+20YmkXMx0IWai84mcxySUDRgm0ihbOfR4L0EVRBDFG85GjmQQEZNNKVVpkZw==} + '@vitest/spy@2.1.1': + resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} - '@vitest/utils@2.1.0': - resolution: {integrity: sha512-rreyfVe0PuNqJfKYUwfPDfi6rrp0VSu0Wgvp5WBqJonP+4NvXHk48X6oBam1Lj47Hy6jbJtnMj3OcRdrkTP0tA==} + '@vitest/utils@2.1.1': + resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} - '@vue/reactivity@3.5.4': - resolution: {integrity: sha512-HKKbEuP7tYSGCq4e4nK6ZW6l5hyG66OUetefBp4budUyjvAYsnQDf+bgFzg2RAgnH0CInyqXwD9y47jwJEHrQw==} + '@vue/reactivity@3.5.5': + resolution: {integrity: sha512-V4tTWElZQhT73PSK3Wnax9R9m4qvMX+LeKHnfylZc6SLh4Jc5/BPakp6e3zEhKWi5AN8TDzRkGnLkp8OqycYng==} - '@vue/shared@3.5.4': - resolution: {integrity: sha512-L2MCDD8l7yC62Te5UUyPVpmexhL9ipVnYRw9CsWfm/BGRL5FwDX4a25bcJ/OJSD3+Hx+k/a8LDKcG2AFdJV3BA==} + '@vue/shared@3.5.5': + resolution: {integrity: sha512-0KyMXyEgnmFAs6rNUL+6eUHtUCqCaNrVd+AW3MX3LyA0Yry5SA0Km03CDKiOua1x1WWnIr+W9+S0GMFoSDWERQ==} ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} @@ -858,8 +852,8 @@ packages: mobx@6.13.2: resolution: {integrity: sha512-GIubI2qf+P6lG6rSEG0T2pg3jV9/0+O0ncF09+0umRe75+Cbnh1KNLM1GvbTY9RSc7QuU+LcPNZfxDY8B+3XRg==} - mol_wire_lib@1.0.1155: - resolution: {integrity: sha512-q5r5/615KmV5dvM13zak0mYBi5c0Na6RGDRgunZRmezkiIdu4YyVtjPL9syUGpNib8KLzj5acTTWm2BXNC7MHw==} + mol_wire_lib@1.0.1158: + resolution: {integrity: sha512-ZUsjaBJmxiRH9Lw/+J+sdMBMGHVx/jyZYtpJ/srf4IdsdIMzy8mRXENzjHsLfZw7O/e9RKRXGawRHOx3qT2IQA==} mol_wire_lib@1.0.488: resolution: {integrity: sha512-AqGNHtM5HvxdYKXMt85ESXG+Owj/E6HEUM2a0SKoCpx+R4uHrqM3V8HABt13twXzMDDfjO713TRWQb7Qb4EQRA==} @@ -909,12 +903,12 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - postcss@8.4.45: - resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} - preact@10.23.2: - resolution: {integrity: sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==} + preact@10.24.0: + resolution: {integrity: sha512-aK8Cf+jkfyuZ0ZZRG9FbYqwmEiGQ4y/PUO4SuTWoyWL244nZZh7bd5h2APd4rSNDYTBNghg1L+5iJN3Skxtbsw==} prettier@3.3.3: resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} @@ -1018,9 +1012,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} @@ -1054,13 +1045,13 @@ packages: react: optional: true - vite-node@2.1.0: - resolution: {integrity: sha512-+ybYqBVUjYyIscoLzMWodus2enQDZOpGhcU6HdOVD6n8WZdk12w1GFL3mbnxLs7hPtRtqs1Wo5YF6/Tsr6fmhg==} + vite-node@2.1.1: + resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.4.4: - resolution: {integrity: sha512-RHFCkULitycHVTtelJ6jQLd+KSAAzOgEYorV32R2q++M6COBjKJR6BxqClwp5sf0XaBDjVMuJ9wnNfyAJwjMkA==} + vite@5.4.5: + resolution: {integrity: sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -1090,15 +1081,15 @@ packages: terser: optional: true - vitest@2.1.0: - resolution: {integrity: sha512-XuuEeyNkqbfr0FtAvd9vFbInSSNY1ykCQTYQ0sj9wPy4hx+1gR7gqVNdW0AX2wrrM1wWlN5fnJDjF9xG6mYRSQ==} + vitest@2.1.1: + resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.0 - '@vitest/ui': 2.1.0 + '@vitest/browser': 2.1.1 + '@vitest/ui': 2.1.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -1358,10 +1349,10 @@ snapshots: '@preact/signals-core@1.8.0': {} - '@preact/signals@1.3.0(preact@10.23.2)': + '@preact/signals@1.3.0(preact@10.24.0)': dependencies: '@preact/signals-core': 1.8.0 - preact: 10.23.2 + preact: 10.24.0 '@reactively/core@0.0.8': {} @@ -1419,55 +1410,55 @@ snapshots: '@types/node@18.14.0': {} - '@types/node@22.5.4': + '@types/node@22.5.5': dependencies: undici-types: 6.19.8 - '@vitest/expect@2.1.0': + '@vitest/expect@2.1.1': dependencies: - '@vitest/spy': 2.1.0 - '@vitest/utils': 2.1.0 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.0(@vitest/spy@2.1.0)(vite@5.4.4(@types/node@22.5.4))': + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.5(@types/node@22.5.5))': dependencies: - '@vitest/spy': 2.1.0 + '@vitest/spy': 2.1.1 estree-walker: 3.0.3 magic-string: 0.30.11 optionalDependencies: - vite: 5.4.4(@types/node@22.5.4) + vite: 5.4.5(@types/node@22.5.5) - '@vitest/pretty-format@2.1.0': + '@vitest/pretty-format@2.1.1': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.1.0': + '@vitest/runner@2.1.1': dependencies: - '@vitest/utils': 2.1.0 + '@vitest/utils': 2.1.1 pathe: 1.1.2 - '@vitest/snapshot@2.1.0': + '@vitest/snapshot@2.1.1': dependencies: - '@vitest/pretty-format': 2.1.0 + '@vitest/pretty-format': 2.1.1 magic-string: 0.30.11 pathe: 1.1.2 - '@vitest/spy@2.1.0': + '@vitest/spy@2.1.1': dependencies: tinyspy: 3.0.2 - '@vitest/utils@2.1.0': + '@vitest/utils@2.1.1': dependencies: - '@vitest/pretty-format': 2.1.0 + '@vitest/pretty-format': 2.1.1 loupe: 3.1.1 tinyrainbow: 1.2.0 - '@vue/reactivity@3.5.4': + '@vue/reactivity@3.5.5': dependencies: - '@vue/shared': 3.5.4 + '@vue/shared': 3.5.5 - '@vue/shared@3.5.4': {} + '@vue/shared@3.5.5': {} ansi-regex@4.1.1: {} @@ -1694,7 +1685,7 @@ snapshots: mobx@6.13.2: {} - mol_wire_lib@1.0.1155: {} + mol_wire_lib@1.0.1158: {} mol_wire_lib@1.0.488: {} @@ -1726,13 +1717,13 @@ snapshots: picomatch@2.3.1: {} - postcss@8.4.45: + postcss@8.4.47: dependencies: nanoid: 3.3.7 picocolors: 1.1.0 source-map-js: 1.2.1 - preact@10.23.2: {} + preact@10.24.0: {} prettier@3.3.3: {} @@ -1774,7 +1765,7 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.2 + tslib: 2.7.0 s-js@0.4.9: {} @@ -1832,8 +1823,6 @@ snapshots: dependencies: is-number: 7.0.0 - tslib@2.6.2: {} - tslib@2.7.0: {} typescript@4.9.5: {} @@ -1852,12 +1841,12 @@ snapshots: optionalDependencies: react: 18.3.1 - vite-node@2.1.0(@types/node@22.5.4): + 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.4(@types/node@22.5.4) + vite: 5.4.5(@types/node@22.5.5) transitivePeerDependencies: - '@types/node' - less @@ -1869,24 +1858,24 @@ snapshots: - supports-color - terser - vite@5.4.4(@types/node@22.5.4): + vite@5.4.5(@types/node@22.5.5): dependencies: esbuild: 0.21.5 - postcss: 8.4.45 + postcss: 8.4.47 rollup: 4.21.3 optionalDependencies: - '@types/node': 22.5.4 + '@types/node': 22.5.5 fsevents: 2.3.3 - vitest@2.1.0(@types/node@22.5.4): + vitest@2.1.1(@types/node@22.5.5): dependencies: - '@vitest/expect': 2.1.0 - '@vitest/mocker': 2.1.0(@vitest/spy@2.1.0)(vite@5.4.4(@types/node@22.5.4)) - '@vitest/pretty-format': 2.1.0 - '@vitest/runner': 2.1.0 - '@vitest/snapshot': 2.1.0 - '@vitest/spy': 2.1.0 - '@vitest/utils': 2.1.0 + '@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 @@ -1896,11 +1885,11 @@ snapshots: tinyexec: 0.3.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.4(@types/node@22.5.4) - vite-node: 2.1.0(@types/node@22.5.4) + 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.4 + '@types/node': 22.5.5 transitivePeerDependencies: - less - lightningcss diff --git a/src/config.ts b/src/config.ts index 0f485de..bc5e289 100644 --- a/src/config.ts +++ b/src/config.ts @@ -2,39 +2,38 @@ 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 { signiaFramework } from "./frameworks/signia"; -import { valtioFramework } from "./frameworks/valtio"; +// import { valtioFramework } from "./frameworks/valtio"; export const frameworkInfo: FrameworkInfo[] = [ { framework: angularFramework, testPullCounts: true }, { framework: compostateFramework, testPullCounts: true }, - // NOTE: MobX currently hangs on some of the dynamic tests, so disable it if you want to run them. - { framework: mobxFramework }, - { framework: tc39SignalsProposalStage0, testPullCounts: true }, // { framework: kairoFramework, testPullCounts: true }, + // NOTE: MobX currently hangs on some of the dynamic tests, so disable it if you want to run them. (https://github.com/mobxjs/mobx/issues/3926) + { framework: mobxFramework }, { framework: molWireFramework, testPullCounts: true }, { framework: obyFramework, testPullCounts: true }, { framework: preactSignalFramework, testPullCounts: true }, { framework: reactivelyFramework, testPullCounts: true }, { framework: signiaFramework, testPullCounts: true }, - { framework: sFramework }, // Solid can't testPullCounts because batch executes all leaf nodes even if unread { framework: solidFramework }, + { framework: sFramework }, + { framework: tc39SignalsProposalStage0, testPullCounts: true }, { framework: usignalFramework, testPullCounts: true }, - // NOTE: Valtio currently hangs on some of the dynamic tests, so disable it if you want to run them. - { framework: valtioFramework }, + // 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) + // ramework: valtioFramework }, { framework: vueReactivityFramework, testPullCounts: true }, { framework: xReactivityFramework, testPullCounts: true }, ]; @@ -105,18 +104,17 @@ export const perfTests: TestConfig[] = [ count: 1246500, }, }, - // NOTE: Several of the frameworks hang on this test, so disabling it for now. - // { - // name: 'very dynamic', - // width: 100, - // totalLayers: 15, - // staticFraction: 0.5, - // nSources: 6, - // readFraction: 1, - // iterations: 2000, - // expected: { - // sum: 15664996402790400, - // count: 1078000 - // } - // } + { + name: "very dynamic", + width: 100, + totalLayers: 15, + staticFraction: 0.5, + nSources: 6, + readFraction: 1, + iterations: 2000, + expected: { + sum: 15664996402790400, + count: 1078000, + }, + }, ]; diff --git a/src/dynamicBench.ts b/src/dynamicBench.ts index 4b43116..a69cab2 100644 --- a/src/dynamicBench.ts +++ b/src/dynamicBench.ts @@ -1,4 +1,3 @@ -import v8 from "v8-natives"; import { makeGraph, runGraph } from "./util/dependencyGraph"; import { logPerfResult, perfRowStrings } from "./util/perfLogging"; import { verifyBenchResult } from "./util/perfTests"; @@ -24,7 +23,6 @@ export async function dynamicBench( } // warm up - v8.optimizeFunctionOnNextCall(runOnce); runOnce(); const timedResult = await fastestTest(testRepeats, () => { 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/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 df8db2d..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: 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..0a0a6c7 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( 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; -} From 0f0855cce17bde54869ede7f9bb699a25a3b73e8 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 15 Sep 2024 22:49:52 -0500 Subject: [PATCH 20/45] feat: replace v8 intrinsics with node --expose-gc; replace pseudorandom with random package --- README.md | 9 +++--- package.json | 1 + pnpm-lock.yaml | 9 ++++++ src/cellxBench.ts | 2 ++ src/config.ts | 24 ++++++++-------- src/dynamicBench.ts | 11 ++++--- src/frameworks.test.ts | 13 +++++---- src/frameworks/mobx.ts | 6 ++-- src/frameworks/valtio.ts | 2 ++ src/index.ts | 10 ++++--- src/kairoBench.ts | 4 +-- src/molBench.ts | 3 -- src/sBench.ts | 6 ++-- src/util/dependencyGraph.ts | 57 +++++++++++++++++++++++-------------- src/util/pseudoRandom.ts | 47 ------------------------------ 15 files changed, 93 insertions(+), 111 deletions(-) delete mode 100644 src/util/pseudoRandom.ts diff --git a/README.md b/README.md index 81b7843..411a638 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,12 @@ $ 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. diff --git a/package.json b/package.json index 084d0c5..4d92a58 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "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", "signal-polyfill": "^0.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f11ad7c..18639ce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,9 @@ importers: preact: 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 @@ -918,6 +921,10 @@ packages: 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'} @@ -1729,6 +1736,8 @@ snapshots: proxy-compare@3.0.0: {} + random@5.1.0: {} + react@18.3.1: dependencies: loose-envify: 1.4.0 diff --git a/src/cellxBench.ts b/src/cellxBench.ts index b6a8631..0c876bc 100644 --- a/src/cellxBench.ts +++ b/src/cellxBench.ts @@ -114,6 +114,8 @@ export const cellxbench = (framework: ReactiveFramework) => { total += elapsed; } + + globalThis.gc?.(); logPerfResult({ framework: framework.name, test: `cellx${layers}`, diff --git a/src/config.ts b/src/config.ts index bc5e289..254f544 100644 --- a/src/config.ts +++ b/src/config.ts @@ -17,6 +17,10 @@ import { xReactivityFramework } from "./frameworks/xReactivity"; // import { valtioFramework } from "./frameworks/valtio"; export const frameworkInfo: FrameworkInfo[] = [ + { framework: preactSignalFramework, testPullCounts: true }, + { framework: tc39SignalsProposalStage0, testPullCounts: true }, + { framework: reactivelyFramework, testPullCounts: true }, + { framework: sFramework }, { framework: angularFramework, testPullCounts: true }, { framework: compostateFramework, testPullCounts: true }, // { framework: kairoFramework, testPullCounts: true }, @@ -24,13 +28,9 @@ export const frameworkInfo: FrameworkInfo[] = [ { framework: mobxFramework }, { framework: molWireFramework, testPullCounts: true }, { framework: obyFramework, testPullCounts: true }, - { framework: preactSignalFramework, testPullCounts: true }, - { framework: reactivelyFramework, testPullCounts: true }, { framework: signiaFramework, testPullCounts: true }, // Solid can't testPullCounts because batch executes all leaf nodes even if unread { framework: solidFramework }, - { framework: sFramework }, - { framework: tc39SignalsProposalStage0, testPullCounts: true }, { framework: usignalFramework, 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) // ramework: valtioFramework }, @@ -48,8 +48,8 @@ export const perfTests: TestConfig[] = [ readFraction: 0.2, iterations: 600000, expected: { - sum: 19199968, - count: 3480000, + sum: 19199832, + count: 2640004, }, }, { @@ -61,8 +61,8 @@ export const perfTests: TestConfig[] = [ readFraction: 0.2, iterations: 15000, expected: { - sum: 302310782860, - count: 1155000, + sum: 302310477864, + count: 1125003, }, }, { @@ -75,7 +75,7 @@ export const perfTests: TestConfig[] = [ iterations: 7000, expected: { sum: 29355933696000, - count: 1463000, + count: 1473791, }, }, { @@ -88,7 +88,7 @@ export const perfTests: TestConfig[] = [ iterations: 3000, expected: { sum: 1171484375000, - count: 732000, + count: 735756, }, }, { @@ -101,7 +101,7 @@ export const perfTests: TestConfig[] = [ iterations: 500, expected: { sum: 3.0239642676898464e241, - count: 1246500, + count: 1246502, }, }, { @@ -114,7 +114,7 @@ export const perfTests: TestConfig[] = [ iterations: 2000, expected: { sum: 15664996402790400, - count: 1078000, + count: 1078671, }, }, ]; diff --git a/src/dynamicBench.ts b/src/dynamicBench.ts index a69cab2..7d28d2c 100644 --- a/src/dynamicBench.ts +++ b/src/dynamicBench.ts @@ -1,4 +1,4 @@ -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"; @@ -10,20 +10,23 @@ import { fastestTest } from "./util/benchRepeat"; */ export async function dynamicBench( frameworkTest: FrameworkInfo, - testRepeats = 5 + testRepeats = 1 ): Promise { const { framework } = frameworkTest; for (const config of perfTests) { const { iterations, readFraction } = config; - const { graph, counter } = makeGraph(framework, config); + let counter = new Counter(); function runOnce(): number { + // Create a new graph from scratch for each run to ensure they're independent + // from each other. + const graph = makeGraph(framework, config, counter); return runGraph(graph, iterations, readFraction, framework); } // warm up - runOnce(); + // runOnce(); const timedResult = await fastestTest(testRepeats, () => { counter.count = 0; diff --git a/src/frameworks.test.ts b/src/frameworks.test.ts index 8903cc8..cfa6840 100644 --- a/src/frameworks.test.ts +++ b/src/frameworks.test.ts @@ -1,4 +1,4 @@ -import { makeGraph, runGraph } from "./util/dependencyGraph"; +import { Counter, makeGraph, runGraph } from "./util/dependencyGraph"; import { expect, test, vi } from "vitest"; import { FrameworkInfo, TestConfig } from "./util/frameworkTypes"; import { frameworkInfo } from "./config"; @@ -46,7 +46,8 @@ function frameworkTests({ framework, testPullCounts }: FrameworkInfo) { 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); if (testPullCounts) { @@ -60,10 +61,11 @@ function frameworkTests({ framework, testPullCounts }: FrameworkInfo) { const config = makeConfig(); config.readFraction = 2 / 3; config.iterations = 10; - const { counter, graph } = makeGraph(framework, config); + const counter = new Counter(); + const graph = makeGraph(framework, config, counter); const sum = runGraph(graph, 10, 2 / 3, framework); - expect(sum).toEqual(72); + expect(sum).toEqual(73); if (testPullCounts) { expect(counter.count).toEqual(41); } else { @@ -76,7 +78,8 @@ function frameworkTests({ framework, testPullCounts }: FrameworkInfo) { config.staticFraction = 0.5; config.width = 4; config.totalLayers = 2; - const { graph, counter } = makeGraph(framework, config); + const counter = new Counter(); + const graph = makeGraph(framework, config, counter); const sum = runGraph(graph, 10, 1, framework); expect(sum).toEqual(72); diff --git a/src/frameworks/mobx.ts b/src/frameworks/mobx.ts index d757e1b..6d47bd0 100644 --- a/src/frameworks/mobx.ts +++ b/src/frameworks/mobx.ts @@ -1,4 +1,4 @@ -import { computed, observable, autorun, transaction, action } from "mobx"; +import { computed, observable, autorun, runInAction } from "mobx"; import { ReactiveFramework } from "../util/reactiveFramework"; export const mobxFramework: ReactiveFramework = { @@ -7,7 +7,7 @@ export const mobxFramework: ReactiveFramework = { 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/valtio.ts b/src/frameworks/valtio.ts index 0cc8e63..c763bbb 100644 --- a/src/frameworks/valtio.ts +++ b/src/frameworks/valtio.ts @@ -2,6 +2,8 @@ import { ReactiveFramework } from "../util/reactiveFramework"; import { proxy } from "valtio/vanilla"; import { watch } from "valtio/utils"; +// The Valtio adapter is currently broken and not used: https://github.com/pmndrs/valtio/discussions/949 + type WatchGet = (proxyObject: T) => T; // stack of watch getters because Valtio doesn't auto-track dependency reads diff --git a/src/index.ts b/src/index.ts index 248b812..de2596c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -22,10 +22,12 @@ async function main() { sbench(framework); } - // NOTE: Several of the frameworks hang on this benchmark, so disabling it for now. - // for (const { framework } of frameworkInfo) { - // cellxbench(framework); - // } + for (const { framework } of frameworkInfo) { + // https://github.com/vuejs/core/issues/11928 + if (framework.name !== "Vue") { + cellxbench(framework); + } + } for (const frameworkTest of frameworkInfo) { await dynamicBench(frameworkTest); 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..3dccb8b 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"; @@ -47,7 +46,6 @@ export async function molBench(framework: ReactiveFramework) { }; }); - v8.optimizeFunctionOnNextCall(iter); iter(1); const { timing } = await fastestTest(10, () => { @@ -60,6 +58,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..25a511c 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(); }); diff --git a/src/util/dependencyGraph.ts b/src/util/dependencyGraph.ts index a704642..403b2d8 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,50 @@ 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 start = Date.now(); 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); + // } + framework.withBatch(() => { const sourceDex = i % sources.length; sources[sourceDex].write(i + sourceDex); }); - for (const leaf of readLeaves) { - leaf.read(); - } + + // this batch is necessary for `mobx` (https://github.com/mobxjs/mobx/issues/3926) + framework.withBatch(() => { + for (const leaf of readLeaves) { + leaf.read(); + } + }); } - const sum = readLeaves.reduce((total, leaf) => leaf.read() + total, 0); + let sum = 0; + + // this batch is necessary for `mobx` (https://github.com/mobxjs/mobx/issues/3926) + framework.withBatch(() => { + 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 +111,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 +121,7 @@ function makeDependentRows( nSources, framework, l, - random + rand ); rows.push(row); prevRow = row; @@ -121,7 +136,7 @@ function makeRow( nSources: number, framework: ReactiveFramework, _layer: number, - random: () => number + random: Random ): Computed[] { return sources.map((_, myDex) => { const mySources: Computed[] = []; @@ -129,7 +144,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/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; - }; -} From d8215fb5628b339a456b1bf828bd89ce6d3e8b45 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 15 Sep 2024 22:50:59 -0500 Subject: [PATCH 21/45] =?UTF-8?q?=F0=9F=92=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frameworks/kairo.ts | 2 ++ src/frameworks/valtio.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/frameworks/kairo.ts b/src/frameworks/kairo.ts index d78ef6c..613a8df 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 used. + export const kairoFramework: ReactiveFramework = { name: "kairo", signal: (initialValue) => { diff --git a/src/frameworks/valtio.ts b/src/frameworks/valtio.ts index c763bbb..32e4c87 100644 --- a/src/frameworks/valtio.ts +++ b/src/frameworks/valtio.ts @@ -2,7 +2,7 @@ import { ReactiveFramework } from "../util/reactiveFramework"; import { proxy } from "valtio/vanilla"; import { watch } from "valtio/utils"; -// The Valtio adapter is currently broken and not used: https://github.com/pmndrs/valtio/discussions/949 +// The Valtio adapter is currently not working and unused: https://github.com/pmndrs/valtio/discussions/949 type WatchGet = (proxyObject: T) => T; From abcdae32c2e8e082194ea7138f67d8b9d9cd8e89 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 15 Sep 2024 22:52:27 -0500 Subject: [PATCH 22/45] =?UTF-8?q?=F0=9F=8F=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/molBench.ts | 9 ++++---- src/sBench.ts | 60 ++++++++++++++++++++++++------------------------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/molBench.ts b/src/molBench.ts index 3dccb8b..dd209a6 100644 --- a/src/molBench.ts +++ b/src/molBench.ts @@ -7,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); } @@ -29,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; diff --git a/src/sBench.ts b/src/sBench.ts index 25a511c..99af087 100644 --- a/src/sBench.ts +++ b/src/sBench.ts @@ -85,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); } @@ -156,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[]) { @@ -193,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(() => { @@ -247,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++) { From 3ed3e4f7d303de0c7c839d6d3c7890c2e0956a1c Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 00:22:02 -0500 Subject: [PATCH 23/45] feat: update tests to get them all working reliably --- src/cellxBench.ts | 5 ++- src/config.ts | 50 +++++++++++++++------------- src/dynamicBench.ts | 13 ++++++-- src/frameworks.test.ts | 58 ++++++++++++++++++--------------- src/frameworks/compostate.ts | 2 ++ src/frameworks/kairo.ts | 2 +- src/frameworks/vueReactivity.ts | 16 +++++++-- src/index.ts | 13 ++++---- src/kairo/deep.ts | 2 +- src/util/dependencyGraph.ts | 5 ++- src/util/perfTests.ts | 6 +++- 11 files changed, 103 insertions(+), 69 deletions(-) diff --git a/src/cellxBench.ts b/src/cellxBench.ts index 0c876bc..d8b0f29 100644 --- a/src/cellxBench.ts +++ b/src/cellxBench.ts @@ -88,6 +88,8 @@ type BenchmarkResults = [ ]; export const cellxbench = (framework: ReactiveFramework) => { + globalThis.gc?.(); + const expected: Record = { 1000: [ [-3, -6, -2, 2], @@ -115,7 +117,6 @@ export const cellxbench = (framework: ReactiveFramework) => { total += elapsed; } - globalThis.gc?.(); logPerfResult({ framework: framework.name, test: `cellx${layers}`, @@ -137,4 +138,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 254f544..8c49e58 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,7 +1,7 @@ import { TestConfig, FrameworkInfo } from "./util/frameworkTypes"; import { angularFramework } from "./frameworks/angularSignals"; -import { compostateFramework } from "./frameworks/compostate"; +// import { compostateFramework } from "./frameworks/compostate"; import { mobxFramework } from "./frameworks/mobx"; import { tc39SignalsProposalStage0 } from "./frameworks/tc39-proposal-signals-stage-0"; import { molWireFramework } from "./frameworks/molWire"; @@ -22,20 +22,24 @@ export const frameworkInfo: FrameworkInfo[] = [ { framework: reactivelyFramework, testPullCounts: true }, { framework: sFramework }, { framework: angularFramework, testPullCounts: true }, - { framework: compostateFramework, testPullCounts: true }, - // { framework: kairoFramework, testPullCounts: true }, - // NOTE: MobX currently hangs on some of the dynamic tests, so disable it if you want to run them. (https://github.com/mobxjs/mobx/issues/3926) - { framework: mobxFramework }, { framework: molWireFramework, testPullCounts: true }, { framework: obyFramework, testPullCounts: true }, { framework: signiaFramework, testPullCounts: true }, - // Solid can't testPullCounts because batch executes all leaf nodes even if unread { framework: solidFramework }, { framework: usignalFramework, 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) - // ramework: valtioFramework }, - { framework: vueReactivityFramework, testPullCounts: true }, { framework: xReactivityFramework, testPullCounts: true }, + // NOTE: Vue currently hangs on some of the `dynamic` tests and `cellx` tests, so disable it if you want to run them. https://github.com/vuejs/core/issues/11928 + { 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[] = [ @@ -104,17 +108,19 @@ export const perfTests: TestConfig[] = [ count: 1246502, }, }, - { - name: "very dynamic", - width: 100, - totalLayers: 15, - staticFraction: 0.5, - nSources: 6, - readFraction: 1, - iterations: 2000, - expected: { - sum: 15664996402790400, - count: 1078671, - }, - }, + // 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 7d28d2c..1f64f47 100644 --- a/src/dynamicBench.ts +++ b/src/dynamicBench.ts @@ -21,12 +21,19 @@ export async function dynamicBench( function runOnce(): number { // Create a new graph from scratch for each run to ensure they're independent // from each other. - const graph = makeGraph(framework, config, counter); - return runGraph(graph, iterations, readFraction, framework); + 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.message); + return -1; + } } // warm up - // runOnce(); + runOnce(); const timedResult = await fastestTest(testRepeats, () => { counter.count = 0; diff --git a/src/frameworks.test.ts b/src/frameworks.test.ts index cfa6840..fdaf16a 100644 --- a/src/frameworks.test.ts +++ b/src/frameworks.test.ts @@ -58,36 +58,40 @@ function frameworkTests({ framework, testPullCounts }: FrameworkInfo) { }); test(`${name} | static graph, read 2/3 of leaves`, () => { - 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(73); - if (testPullCounts) { - expect(counter.count).toEqual(41); - } else { - expect(counter.count).toBeGreaterThanOrEqual(41); - } + 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(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 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); - } + 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`, () => { 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 613a8df..bb89329 100644 --- a/src/frameworks/kairo.ts +++ b/src/frameworks/kairo.ts @@ -2,7 +2,7 @@ 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 used. +// NOTE: The kairo adapter is currently not working and unused. export const kairoFramework: ReactiveFramework = { name: "kairo", diff --git a/src/frameworks/vueReactivity.ts b/src/frameworks/vueReactivity.ts index d379a6e..89778a5 100644 --- a/src/frameworks/vueReactivity.ts +++ b/src/frameworks/vueReactivity.ts @@ -7,6 +7,8 @@ import { } from "@vue/reactivity"; import { ReactiveFramework } from "../util/reactiveFramework"; +// The `@vue/reactivity` adapter is currently broken for some tests pending https://github.com/vuejs/core/issues/11928 + let scheduled = [] as ReactiveEffect[]; let batching = false; @@ -26,13 +28,12 @@ export const vueReactivityFramework: ReactiveFramework = { }; }, effect: (fn) => { - let t = effect(fn, { + let t = effect(() => fn(), { scheduler: () => { scheduled.push(t.effect); }, }); }, - // withBatch: (fn) => fn(), withBatch: (fn) => { if (batching) { fn(); @@ -44,8 +45,17 @@ export const vueReactivityFramework: ReactiveFramework = { } batching = false; } + + // if (batching) { + // fn(); + // } + // batching = true; + // fn(); + // while (scheduled.length) { + // scheduled.pop()!.run(); + // } + // batching = false; }, - // withBuild: (fn) => fn() withBuild: (fn) => { const e = effectScope(); const r = e.run(fn)!; diff --git a/src/index.ts b/src/index.ts index de2596c..da42b0f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import { dynamicBench } from "./dynamicBench"; -import { cellxbench } from "./cellxBench"; +// import { cellxbench } from "./cellxBench"; import { sbench } from "./sBench"; import { frameworkInfo } from "./config"; import { logPerfResult, perfReportHeaders } from "./util/perfLogging"; @@ -22,12 +22,11 @@ async function main() { sbench(framework); } - for (const { framework } of frameworkInfo) { - // https://github.com/vuejs/core/issues/11928 - if (framework.name !== "Vue") { - cellxbench(framework); - } - } + // MobX, Vue, and Valtio all fail this test currently, so disabling it for now. + // @see https://github.com/vuejs/core/issues/11928 + // for (const { framework } of frameworkInfo) { + // cellxbench(framework); + // } for (const frameworkTest of frameworkInfo) { await dynamicBench(frameworkTest); 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/util/dependencyGraph.ts b/src/util/dependencyGraph.ts index 403b2d8..112e720 100644 --- a/src/util/dependencyGraph.ts +++ b/src/util/dependencyGraph.ts @@ -71,7 +71,7 @@ export function runGraph( sources[sourceDex].write(i + sourceDex); }); - // this batch is necessary for `mobx` (https://github.com/mobxjs/mobx/issues/3926) + // This batch is only necessary for `mobx`: https://github.com/mobxjs/mobx/issues/3926 framework.withBatch(() => { for (const leaf of readLeaves) { leaf.read(); @@ -79,9 +79,8 @@ export function runGraph( }); } + // This batch is only necessary for `mobx`: https://github.com/mobxjs/mobx/issues/3926 let sum = 0; - - // this batch is necessary for `mobx` (https://github.com/mobxjs/mobx/issues/3926) framework.withBatch(() => { sum = readLeaves.reduce((total, leaf) => leaf.read() + total, 0); }); diff --git a/src/util/perfTests.ts b/src/util/perfTests.ts index 0a0a6c7..9b37333 100644 --- a/src/util/perfTests.ts +++ b/src/util/perfTests.ts @@ -29,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}` From e9eb9c757ccbaf18cf6d6efb0ef39d1f69d5ae97 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 00:49:10 -0500 Subject: [PATCH 24/45] feat: fix @vue/reactivity for kairo tests --- package.json | 2 ++ src/index.ts | 20 ++++++++++---------- src/kairo/broad.ts | 4 ++-- src/kairo/deep.ts | 4 ++-- src/kairo/diamond.ts | 4 ++-- src/kairo/repeated.ts | 4 ++-- src/kairo/triangle.ts | 4 ++-- src/kairo/unstable.ts | 4 ++-- 8 files changed, 24 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 4d92a58..01478e0 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,8 @@ "main": "index.js", "scripts": { "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": [], diff --git a/src/index.ts b/src/index.ts index da42b0f..7203048 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,19 +8,19 @@ import { kairoBench } from "./kairoBench"; async function main() { logPerfResult(perfReportHeaders()); - // (globalThis as any).__DEV__ = true; + (globalThis as any).__DEV__ = true; for (const { framework } of frameworkInfo) { await kairoBench(framework); } - for (const { framework } of frameworkInfo) { - await molBench(framework); - } + // for (const { framework } of frameworkInfo) { + // await molBench(framework); + // } - for (const { framework } of frameworkInfo) { - sbench(framework); - } + // for (const { framework } of frameworkInfo) { + // sbench(framework); + // } // MobX, Vue, and Valtio all fail this test currently, so disabling it for now. // @see https://github.com/vuejs/core/issues/11928 @@ -28,9 +28,9 @@ async function main() { // cellxbench(framework); // } - for (const frameworkTest of frameworkInfo) { - await dynamicBench(frameworkTest); - } + // for (const frameworkTest of frameworkInfo) { + // await dynamicBench(frameworkTest); + // } } main(); diff --git a/src/kairo/broad.ts b/src/kairo/broad.ts index 4507289..6a84860 100644 --- a/src/kairo/broad.ts +++ b/src/kairo/broad.ts @@ -24,7 +24,7 @@ export function broadPropagation(bridge: ReactiveFramework) { bridge.withBatch(() => { head.write(1); }); - const atleast = 50 * 50; + // const atleast = 50 * 50; callCounter.count = 0; for (let i = 0; i < 50; i++) { bridge.withBatch(() => { @@ -32,6 +32,6 @@ export function broadPropagation(bridge: ReactiveFramework) { }); console.assert(last.read() === i + 50); } - console.assert(callCounter.count === atleast, callCounter.count); + // console.assert(callCounter.count === atleast, callCounter.count); }; } diff --git a/src/kairo/deep.ts b/src/kairo/deep.ts index eef6f8e..eb05a08 100644 --- a/src/kairo/deep.ts +++ b/src/kairo/deep.ts @@ -25,7 +25,7 @@ export function deepPropagation(bridge: ReactiveFramework) { bridge.withBatch(() => { head.write(1); }); - const atleast = iter; + // const atleast = iter; callCounter.count = 0; for (let i = 0; i < iter; i++) { bridge.withBatch(() => { @@ -34,6 +34,6 @@ export function deepPropagation(bridge: ReactiveFramework) { console.assert(current.read() === len + i); } - console.assert(callCounter.count === atleast); + // console.assert(callCounter.count === atleast); }; } diff --git a/src/kairo/diamond.ts b/src/kairo/diamond.ts index b98fba1..740f1c3 100644 --- a/src/kairo/diamond.ts +++ b/src/kairo/diamond.ts @@ -27,7 +27,7 @@ export function diamond(bridge: ReactiveFramework) { head.write(1); }); console.assert(sum.read() === 2 * width); - const atleast = 500; + // const atleast = 500; callCounter.count = 0; for (let i = 0; i < 500; i++) { bridge.withBatch(() => { @@ -35,6 +35,6 @@ export function diamond(bridge: ReactiveFramework) { }); console.assert(sum.read() === (i + 1) * width); } - console.assert(callCounter.count === atleast); + // console.assert(callCounter.count === atleast); }; } diff --git a/src/kairo/repeated.ts b/src/kairo/repeated.ts index c3313b5..2258dd8 100644 --- a/src/kairo/repeated.ts +++ b/src/kairo/repeated.ts @@ -26,7 +26,7 @@ export function repeatedObservers(bridge: ReactiveFramework) { head.write(1); }); console.assert(current.read() === size); - const atleast = 100; + // const atleast = 100; callCounter.count = 0; for (let i = 0; i < 100; i++) { bridge.withBatch(() => { @@ -34,6 +34,6 @@ export function repeatedObservers(bridge: ReactiveFramework) { }); console.assert(current.read() === i * size); } - console.assert(callCounter.count === atleast); + // console.assert(callCounter.count === atleast); }; } diff --git a/src/kairo/triangle.ts b/src/kairo/triangle.ts index b472506..24a94b2 100644 --- a/src/kairo/triangle.ts +++ b/src/kairo/triangle.ts @@ -30,7 +30,7 @@ export function triangle(bridge: ReactiveFramework) { head.write(1); }); console.assert(sum.read() === constant); - const atleast = 100; + // const atleast = 100; callCounter.count = 0; for (let i = 0; i < 100; i++) { bridge.withBatch(() => { @@ -38,7 +38,7 @@ export function triangle(bridge: ReactiveFramework) { }); console.assert(sum.read() === constant - width + i * width); } - console.assert(callCounter.count === atleast); + // console.assert(callCounter.count === atleast); }; } diff --git a/src/kairo/unstable.ts b/src/kairo/unstable.ts index c520f9f..e70ae16 100644 --- a/src/kairo/unstable.ts +++ b/src/kairo/unstable.ts @@ -24,7 +24,7 @@ export function unstable(bridge: ReactiveFramework) { head.write(1); }); console.assert(current.read() === 40); - const atleast = 100; + // const atleast = 100; callCounter.count = 0; for (let i = 0; i < 100; i++) { bridge.withBatch(() => { @@ -32,6 +32,6 @@ export function unstable(bridge: ReactiveFramework) { }); // console.assert(current.read() === i % 2 ? i * 2 * 10 : i * -10); } - console.assert(callCounter.count === atleast); + // console.assert(callCounter.count === atleast); }; } From 9c65fd25231751b3cb415b53cfc86b2bff9df0e7 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 00:51:39 -0500 Subject: [PATCH 25/45] =?UTF-8?q?=F0=9F=91=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/index.ts b/src/index.ts index 7203048..9998212 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,27 +10,19 @@ async function main() { logPerfResult(perfReportHeaders()); (globalThis as any).__DEV__ = true; - for (const { framework } of frameworkInfo) { - await kairoBench(framework); - } - - // for (const { framework } of frameworkInfo) { - // await molBench(framework); - // } + for (const frameworkTest of frameworkInfo) { + const { framework } = frameworkTest; - // for (const { framework } of frameworkInfo) { - // sbench(framework); - // } + await kairoBench(framework); + await molBench(framework); + sbench(framework); - // MobX, Vue, and Valtio all fail this test currently, so disabling it for now. - // @see https://github.com/vuejs/core/issues/11928 - // for (const { framework } of frameworkInfo) { - // cellxbench(framework); - // } + // MobX, Vue, and Valtio all fail this test currently, so disabling it for now. + // @see https://github.com/vuejs/core/issues/11928 + // cellxbench(framework); - // for (const frameworkTest of frameworkInfo) { - // await dynamicBench(frameworkTest); - // } + await dynamicBench(frameworkTest); + } } main(); From c22196a4f4d2671e35537886233e1c264a7d7070 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 01:34:51 -0500 Subject: [PATCH 26/45] =?UTF-8?q?=F0=9F=8E=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config.ts | 26 +++++++++--------- src/util/dependencyGraph.ts | 53 ++++++++++++++++++++++++------------- 2 files changed, 47 insertions(+), 32 deletions(-) diff --git a/src/config.ts b/src/config.ts index 8c49e58..8b090f8 100644 --- a/src/config.ts +++ b/src/config.ts @@ -17,19 +17,19 @@ import { xReactivityFramework } from "./frameworks/xReactivity"; // import { valtioFramework } from "./frameworks/valtio"; export const frameworkInfo: FrameworkInfo[] = [ - { framework: preactSignalFramework, testPullCounts: true }, - { framework: tc39SignalsProposalStage0, testPullCounts: true }, - { framework: reactivelyFramework, testPullCounts: true }, - { framework: sFramework }, - { framework: angularFramework, testPullCounts: true }, - { framework: molWireFramework, testPullCounts: true }, - { framework: obyFramework, testPullCounts: true }, - { framework: signiaFramework, testPullCounts: true }, - { framework: solidFramework }, - { framework: usignalFramework, testPullCounts: true }, - { framework: xReactivityFramework, testPullCounts: true }, - // NOTE: Vue currently hangs on some of the `dynamic` tests and `cellx` tests, so disable it if you want to run them. https://github.com/vuejs/core/issues/11928 - { framework: vueReactivityFramework, testPullCounts: true }, + // { framework: preactSignalFramework, testPullCounts: true }, + // { framework: tc39SignalsProposalStage0, testPullCounts: true }, + // { framework: reactivelyFramework, testPullCounts: true }, + // { framework: sFramework }, + // { framework: angularFramework, testPullCounts: true }, + // { framework: molWireFramework, testPullCounts: true }, + // { framework: obyFramework, testPullCounts: true }, + // { framework: signiaFramework, testPullCounts: true }, + // { framework: solidFramework }, + // { framework: usignalFramework, testPullCounts: true }, + // { framework: xReactivityFramework, testPullCounts: true }, + // // NOTE: Vue currently hangs on some of the `dynamic` tests and `cellx` tests, so disable it if you want to run them. https://github.com/vuejs/core/issues/11928 + // { 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 }, diff --git a/src/util/dependencyGraph.ts b/src/util/dependencyGraph.ts index 112e720..d99dbc6 100644 --- a/src/util/dependencyGraph.ts +++ b/src/util/dependencyGraph.ts @@ -56,34 +56,49 @@ export function runGraph( const readLeaves = removeElems(leaves, skipCount, rand); // const start = Date.now(); - 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); - // } + let sum = 0; + if (framework.name.toLowerCase() === "mobx") { + // This special-case is only necessary for `mobx`: https://github.com/mobxjs/mobx/issues/3926 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); }); + } else { + for (let i = 0; i < iterations; i++) { + // if (i % 100 === 0) { + // console.log("iteration:", i, "delta:", Date.now() - start); + // } + + framework.withBatch(() => { + const sourceDex = i % sources.length; + sources[sourceDex].write(i + sourceDex); + }); - // This batch is only necessary for `mobx`: https://github.com/mobxjs/mobx/issues/3926 - framework.withBatch(() => { for (const leaf of readLeaves) { leaf.read(); } - }); - } + } - // This batch is only necessary for `mobx`: https://github.com/mobxjs/mobx/issues/3926 - let sum = 0; - framework.withBatch(() => { sum = readLeaves.reduce((total, leaf) => leaf.read() + total, 0); - }); + } return sum; } From 29d22d64666b25aa8268ef8ff30afe8d51bb7937 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 01:42:59 -0500 Subject: [PATCH 27/45] docs: update benchmark results --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 411a638..ae0aa54 100644 --- a/README.md +++ b/README.md @@ -39,13 +39,11 @@ We're also working on enabling consistent logging and efficient tracking of GC t ## Results

- Framework average benchmark results - Raw results CSV (lower times are better) + Average benchmark results across frameworks + Raw results CSV (lower times are better)

-Note that MobX and Valtio are not included in the average results summary because they fail to run some of the benchmark tests. - -These results were last updated _September 2024_ on an M3 Macbook Pro. +These results were last updated _September 2024_ on an M3 Macbook Pro using Node.js v22.4.1 ([c22196a](https://github.com/transitive-bullshit/js-reactivity-benchmark/tree/c22196a4f4d2671e35537886233e1c264a7d7070)).
From ff8b96251f75ad430ac24a647d430998a838916c Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 01:46:49 -0500 Subject: [PATCH 28/45] =?UTF-8?q?=F0=9F=90=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ae0aa54..b62f810 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ We're also working on enabling consistent logging and efficient tracking of GC t Raw results CSV (lower times are better)

-These results were last updated _September 2024_ on an M3 Macbook Pro using Node.js v22.4.1 ([c22196a](https://github.com/transitive-bullshit/js-reactivity-benchmark/tree/c22196a4f4d2671e35537886233e1c264a7d7070)). +These results were last updated _September 2024_ on an M3 Macbook Pro using Node.js v22.4.1 ([29d22d6](https://github.com/transitive-bullshit/js-reactivity-benchmark/tree/29d22d64666b25aa8268ef8ff30afe8d51bb7937)).
From 902b7206ed278404e0fbd0d8fc0967b97b503d1b Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 02:42:25 -0500 Subject: [PATCH 29/45] =?UTF-8?q?=E2=AC=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frameworks/vueReactivity.ts | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/frameworks/vueReactivity.ts b/src/frameworks/vueReactivity.ts index 89778a5..669bae0 100644 --- a/src/frameworks/vueReactivity.ts +++ b/src/frameworks/vueReactivity.ts @@ -13,7 +13,7 @@ let scheduled = [] as ReactiveEffect[]; let batching = false; export const vueReactivityFramework: ReactiveFramework = { - name: "Vue", + name: "@vue/reactivity", signal: (initial) => { const data = shallowRef(initial); return { @@ -45,16 +45,6 @@ export const vueReactivityFramework: ReactiveFramework = { } batching = false; } - - // if (batching) { - // fn(); - // } - // batching = true; - // fn(); - // while (scheduled.length) { - // scheduled.pop()!.run(); - // } - // batching = false; }, withBuild: (fn) => { const e = effectScope(); From 0e93a8b13d11c3644aa44a28b87caa2f3ea3a3a9 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 03:19:31 -0500 Subject: [PATCH 30/45] feat: update @vue/reactivity to latest fix --- package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- src/config.ts | 26 +++++++++++++------------- src/index.ts | 6 +++--- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 01478e0..d267882 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@preact/signals": "^1.3.0", "@reactively/core": "^0.0.8", "@solidjs/reactivity": "^0.0.9", - "@vue/reactivity": "^3.5.5", + "@vue/reactivity": "^3.5.6", "compostate": "0.5.1", "kairo": "0.6.0-rc.0", "mobx": "^6.13.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18639ce..e193462 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: specifier: ^0.0.9 version: 0.0.9 '@vue/reactivity': - specifier: ^3.5.5 - version: 3.5.5 + specifier: ^3.5.6 + version: 3.5.6 compostate: specifier: 0.5.1 version: 0.5.1 @@ -665,11 +665,11 @@ packages: '@vitest/utils@2.1.1': resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} - '@vue/reactivity@3.5.5': - resolution: {integrity: sha512-V4tTWElZQhT73PSK3Wnax9R9m4qvMX+LeKHnfylZc6SLh4Jc5/BPakp6e3zEhKWi5AN8TDzRkGnLkp8OqycYng==} + '@vue/reactivity@3.5.6': + resolution: {integrity: sha512-shZ+KtBoHna5GyUxWfoFVBCVd7k56m6lGhk5e+J9AKjheHF6yob5eukssHRI+rzvHBiU1sWs/1ZhNbLExc5oYQ==} - '@vue/shared@3.5.5': - resolution: {integrity: sha512-0KyMXyEgnmFAs6rNUL+6eUHtUCqCaNrVd+AW3MX3LyA0Yry5SA0Km03CDKiOua1x1WWnIr+W9+S0GMFoSDWERQ==} + '@vue/shared@3.5.6': + resolution: {integrity: sha512-eidH0HInnL39z6wAt6SFIwBrvGOpDWsDxlw3rCgo1B+CQ1781WzQUSU3YjxgdkcJo9Q8S6LmXTkvI+cLHGkQfA==} ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} @@ -1461,11 +1461,11 @@ snapshots: loupe: 3.1.1 tinyrainbow: 1.2.0 - '@vue/reactivity@3.5.5': + '@vue/reactivity@3.5.6': dependencies: - '@vue/shared': 3.5.5 + '@vue/shared': 3.5.6 - '@vue/shared@3.5.5': {} + '@vue/shared@3.5.6': {} ansi-regex@4.1.1: {} diff --git a/src/config.ts b/src/config.ts index 8b090f8..7cfcf58 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,7 +1,6 @@ import { TestConfig, FrameworkInfo } from "./util/frameworkTypes"; import { angularFramework } from "./frameworks/angularSignals"; -// import { compostateFramework } from "./frameworks/compostate"; import { mobxFramework } from "./frameworks/mobx"; import { tc39SignalsProposalStage0 } from "./frameworks/tc39-proposal-signals-stage-0"; import { molWireFramework } from "./frameworks/molWire"; @@ -14,22 +13,23 @@ import { sFramework } from "./frameworks/s"; import { usignalFramework } from "./frameworks/uSignal"; import { vueReactivityFramework } from "./frameworks/vueReactivity"; import { xReactivityFramework } from "./frameworks/xReactivity"; +// import { compostateFramework } from "./frameworks/compostate"; // import { valtioFramework } from "./frameworks/valtio"; export const frameworkInfo: FrameworkInfo[] = [ - // { framework: preactSignalFramework, testPullCounts: true }, - // { framework: tc39SignalsProposalStage0, testPullCounts: true }, - // { framework: reactivelyFramework, testPullCounts: true }, - // { framework: sFramework }, - // { framework: angularFramework, testPullCounts: true }, - // { framework: molWireFramework, testPullCounts: true }, - // { framework: obyFramework, testPullCounts: true }, - // { framework: signiaFramework, testPullCounts: true }, - // { framework: solidFramework }, - // { framework: usignalFramework, testPullCounts: true }, - // { framework: xReactivityFramework, testPullCounts: true }, + { framework: preactSignalFramework, testPullCounts: true }, + { framework: tc39SignalsProposalStage0, testPullCounts: true }, + { framework: reactivelyFramework, testPullCounts: true }, + { framework: sFramework }, + { framework: angularFramework, testPullCounts: true }, + { framework: molWireFramework, testPullCounts: true }, + { framework: obyFramework, testPullCounts: true }, + { framework: signiaFramework, testPullCounts: true }, + { framework: solidFramework }, + { framework: usignalFramework, testPullCounts: true }, + { framework: xReactivityFramework, testPullCounts: true }, // // NOTE: Vue currently hangs on some of the `dynamic` tests and `cellx` tests, so disable it if you want to run them. https://github.com/vuejs/core/issues/11928 - // { framework: vueReactivityFramework, 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 }, diff --git a/src/index.ts b/src/index.ts index 9998212..1387678 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import { dynamicBench } from "./dynamicBench"; -// import { cellxbench } from "./cellxBench"; +import { cellxbench } from "./cellxBench"; import { sbench } from "./sBench"; import { frameworkInfo } from "./config"; import { logPerfResult, perfReportHeaders } from "./util/perfLogging"; @@ -17,9 +17,9 @@ async function main() { await molBench(framework); sbench(framework); - // MobX, Vue, and Valtio all fail this test currently, so disabling it for now. + // MobX and Valtio both fail this test currently, so disabling it for now. // @see https://github.com/vuejs/core/issues/11928 - // cellxbench(framework); + cellxbench(framework); await dynamicBench(frameworkTest); } From 0adc71cdf9d77eda425ee38291211caf15e455cc Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 03:32:12 -0500 Subject: [PATCH 31/45] feat: remove warnings for vue issue --- src/config.ts | 1 - src/frameworks/vueReactivity.ts | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/config.ts b/src/config.ts index 7cfcf58..8ac6411 100644 --- a/src/config.ts +++ b/src/config.ts @@ -28,7 +28,6 @@ export const frameworkInfo: FrameworkInfo[] = [ { framework: solidFramework }, { framework: usignalFramework, testPullCounts: true }, { framework: xReactivityFramework, testPullCounts: true }, - // // NOTE: Vue currently hangs on some of the `dynamic` tests and `cellx` tests, so disable it if you want to run them. https://github.com/vuejs/core/issues/11928 { 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 }, diff --git a/src/frameworks/vueReactivity.ts b/src/frameworks/vueReactivity.ts index 669bae0..4c539cb 100644 --- a/src/frameworks/vueReactivity.ts +++ b/src/frameworks/vueReactivity.ts @@ -7,8 +7,6 @@ import { } from "@vue/reactivity"; import { ReactiveFramework } from "../util/reactiveFramework"; -// The `@vue/reactivity` adapter is currently broken for some tests pending https://github.com/vuejs/core/issues/11928 - let scheduled = [] as ReactiveEffect[]; let batching = false; From fd6d6710a20b7cb46f702b12bba6962958087951 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 03:32:28 -0500 Subject: [PATCH 32/45] =?UTF-8?q?=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b62f810..f8cd0c4 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ We're also working on enabling consistent logging and efficient tracking of GC t - [Angular Signals](https://angular.dev/guide/signals/) - [Compostate](https://github.com/lxsmnsyc/compostate) - [Kairo](https://github.com/3Shain/kairo) -- [MobX](https://mobx.js.org) (not included in the average benchmark results because it fails to run some tests) +- [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) From a136d206e4b749a5a624cc20f173390818b04ffe Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 03:40:12 -0500 Subject: [PATCH 33/45] feat: re-siable the cellx test suite for mobx --- src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 1387678..701829a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import { dynamicBench } from "./dynamicBench"; -import { cellxbench } from "./cellxBench"; +// import { cellxbench } from "./cellxBench"; import { sbench } from "./sBench"; import { frameworkInfo } from "./config"; import { logPerfResult, perfReportHeaders } from "./util/perfLogging"; @@ -19,7 +19,7 @@ async function main() { // MobX and Valtio both fail this test currently, so disabling it for now. // @see https://github.com/vuejs/core/issues/11928 - cellxbench(framework); + // cellxbench(framework); await dynamicBench(frameworkTest); } From e83c0be8981aab07b43e77b9f01330f7c414dcf7 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 03:41:09 -0500 Subject: [PATCH 34/45] =?UTF-8?q?=F0=9F=9A=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frameworks/molWire.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 { From c501ada78d1052554786a74a9549979260ca73fa Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 16:24:16 -0500 Subject: [PATCH 35/45] feat: add svelte v5 framework to benchmark --- README.md | 20 +----- package.json | 1 + pnpm-lock.yaml | 120 ++++++++++++++++++++++++++++++++++++ src/config.ts | 2 + src/frameworks/svelte.ts | 48 +++++++++++++++ src/index.ts | 2 +- src/util/dependencyGraph.ts | 6 +- 7 files changed, 179 insertions(+), 20 deletions(-) create mode 100644 src/frameworks/svelte.ts diff --git a/README.md b/README.md index f8cd0c4..6e0c25e 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ We're also working on enabling consistent logging and efficient tracking of GC t - [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) @@ -39,23 +40,8 @@ We're also working on enabling consistent logging and efficient tracking of GC t ## Results

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

These results were last updated _September 2024_ on an M3 Macbook Pro using Node.js v22.4.1 ([29d22d6](https://github.com/transitive-bullshit/js-reactivity-benchmark/tree/29d22d64666b25aa8268ef8ff30afe8d51bb7937)). - -
- -Old results - - -The frameworks are all plenty fast for typical applications. The charts report the run time of the test in milliseconds on an M1 laptop, and are made using [Tableau](https://public.tableau.com/). Typical applications will do much more work than a framework benchmark, and at these speeds the frameworks are unlikely to bottleneck overall performance. - -That said, there's learning here to improve performance of all the frameworks. - -![Performance Results](https://user-images.githubusercontent.com/14153763/221107379-51a93eab-95ac-4c89-9a74-7a1527fc4a03.png) - -![Raw](https://user-images.githubusercontent.com/14153763/222212050-5b651e4d-6e71-4667-94e7-eb94b7030bc1.png) - -
diff --git a/package.json b/package.json index d267882..ea891e0 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "signal-polyfill": "^0.1.0", "signia": "^0.1.5", "solid-js": "^1.8.22", + "svelte": "5.0.0-next.246", "usignal": "^0.9.0", "valtio": "^2.0.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e193462..98595d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,6 +59,9 @@ importers: solid-js: specifier: ^1.8.22 version: 1.8.22 + svelte: + specifier: 5.0.0-next.246 + version: 5.0.0-next.246 usignal: specifier: ^0.9.0 version: 0.9.0 @@ -108,6 +111,10 @@ importers: packages: + '@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} @@ -529,9 +536,24 @@ packages: cpu: [x64] os: [win32] + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + '@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==} @@ -671,6 +693,16 @@ packages: '@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 + ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} @@ -683,10 +715,18 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + 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: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -774,6 +814,12 @@ packages: engines: {node: '>=18'} hasBin: true + 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==} @@ -826,12 +872,18 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + 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: resolution: {integrity: sha512-8yWTOujaeU5a6FtFCQnRhljxo8KaxQVDV6xJFxEpkCKd2azlMBmc5ARazaQUb/KJ2PWzsVdiXRbvFmreP6pbFA==} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -997,6 +1049,10 @@ packages: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} + svelte@5.0.0-next.246: + resolution: {integrity: sha512-FRfq6W17mOHiSbY9nen6/skCV7AHQJdB9yaS9DA4x4mKXR/RIGMDLlxxU3jhQsMiLoqmUFHXJc6Rqe1o6HWlow==} + engines: {node: '>=18'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -1134,11 +1190,19 @@ packages: 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: + '@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 @@ -1352,8 +1416,23 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@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)': @@ -1467,6 +1546,12 @@ snapshots: '@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: @@ -1478,8 +1563,12 @@ snapshots: 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: @@ -1625,6 +1714,13 @@ snapshots: '@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 @@ -1665,10 +1761,16 @@ snapshots: 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 @@ -1818,6 +1920,22 @@ snapshots: dependencies: ansi-regex: 4.1.1 + svelte@5.0.0-next.246: + 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: {} @@ -1943,4 +2061,6 @@ snapshots: y18n: 4.0.3 yargs-parser: 13.1.2 + zimmerframe@1.1.2: {} + zone.js@0.15.0: {} diff --git a/src/config.ts b/src/config.ts index 8ac6411..d1b17cb 100644 --- a/src/config.ts +++ b/src/config.ts @@ -13,11 +13,13 @@ 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: preactSignalFramework, testPullCounts: true }, + { framework: svelteFramework, testPullCounts: true }, { framework: tc39SignalsProposalStage0, testPullCounts: true }, { framework: reactivelyFramework, testPullCounts: true }, { framework: sFramework }, diff --git a/src/frameworks/svelte.ts b/src/frameworks/svelte.ts new file mode 100644 index 0000000..c129550 --- /dev/null +++ b/src/frameworks/svelte.ts @@ -0,0 +1,48 @@ +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) => { + // TODO: which one makes more sense here? + $.user_effect(fn); + // $.render_effect(fn); + fn(); + }, + withBatch: (fn) => { + fn(); + // $.tick(); + $.flush_sync(); + }, + withBuild: (fn) => { + let res: ReturnType | undefined; + const destroy = $.effect_root(() => { + res = fn(); + }); + $.tick(); + destroy(); + return res!; + }, +}; diff --git a/src/index.ts b/src/index.ts index 701829a..e2e23c2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,7 +18,7 @@ async function main() { sbench(framework); // MobX and Valtio both fail this test currently, so disabling it for now. - // @see https://github.com/vuejs/core/issues/11928 + // @see https://github.com/mobxjs/mobx/issues/3926 // cellxbench(framework); await dynamicBench(frameworkTest); diff --git a/src/util/dependencyGraph.ts b/src/util/dependencyGraph.ts index d99dbc6..d9c62fa 100644 --- a/src/util/dependencyGraph.ts +++ b/src/util/dependencyGraph.ts @@ -55,10 +55,12 @@ export function runGraph( const skipCount = Math.round(leaves.length * (1 - readFraction)); const readLeaves = removeElems(leaves, skipCount, rand); // const start = Date.now(); - let sum = 0; - if (framework.name.toLowerCase() === "mobx") { + if ( + framework.name.toLowerCase() === "mobx" || + framework.name.toLowerCase() === "svelte v5" + ) { // This special-case is only necessary for `mobx`: https://github.com/mobxjs/mobx/issues/3926 framework.withBatch(() => { for (let i = 0; i < iterations; i++) { From 99a7ca8f1f763e23a557391165603404082b5489 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 17:09:56 -0500 Subject: [PATCH 36/45] =?UTF-8?q?=F0=9F=94=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e0c25e..9f414ac 100644 --- a/README.md +++ b/README.md @@ -44,4 +44,4 @@ We're also working on enabling consistent logging and efficient tracking of GC t (lower times are better)

-These results were last updated _September 2024_ on an M3 Macbook Pro using Node.js v22.4.1 ([29d22d6](https://github.com/transitive-bullshit/js-reactivity-benchmark/tree/29d22d64666b25aa8268ef8ff30afe8d51bb7937)). +These results were last updated _September 2024_ on an M3 Macbook Pro using Node.js v22.4.1. From 131f9905059824ca8246259b95151ab719b07289 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 20:04:08 -0500 Subject: [PATCH 37/45] feat: fix s.js and improve svelte adapters --- src/frameworks/svelte.ts | 9 ++------ src/index.ts | 2 ++ src/util/dependencyGraph.ts | 46 +++++++++++++++++++------------------ 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/frameworks/svelte.ts b/src/frameworks/svelte.ts index c129550..4ffe72c 100644 --- a/src/frameworks/svelte.ts +++ b/src/frameworks/svelte.ts @@ -26,15 +26,10 @@ export const svelteFramework: ReactiveFramework = { }; }, effect: (fn) => { - // TODO: which one makes more sense here? - $.user_effect(fn); - // $.render_effect(fn); - fn(); + $.render_effect(fn); }, withBatch: (fn) => { - fn(); - // $.tick(); - $.flush_sync(); + $.flush_sync(fn); }, withBuild: (fn) => { let res: ReturnType | undefined; diff --git a/src/index.ts b/src/index.ts index e2e23c2..4e09041 100644 --- a/src/index.ts +++ b/src/index.ts @@ -22,6 +22,8 @@ async function main() { // cellxbench(framework); await dynamicBench(frameworkTest); + + globalThis.gc?.(); } } diff --git a/src/util/dependencyGraph.ts b/src/util/dependencyGraph.ts index d9c62fa..a740d56 100644 --- a/src/util/dependencyGraph.ts +++ b/src/util/dependencyGraph.ts @@ -57,11 +57,30 @@ export function runGraph( // const start = Date.now(); let sum = 0; - if ( - framework.name.toLowerCase() === "mobx" || - framework.name.toLowerCase() === "svelte v5" - ) { - // This special-case is only necessary for `mobx`: https://github.com/mobxjs/mobx/issues/3926 + if (framework.name === "s-js") { + // [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++) { + // 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); + // } + + framework.withBatch(() => { + 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); + } else { framework.withBatch(() => { for (let i = 0; i < iterations; i++) { // Useful for debugging edge cases for some frameworks that experience @@ -83,23 +102,6 @@ export function runGraph( sum = readLeaves.reduce((total, leaf) => leaf.read() + total, 0); }); - } else { - for (let i = 0; i < iterations; i++) { - // if (i % 100 === 0) { - // console.log("iteration:", i, "delta:", Date.now() - start); - // } - - framework.withBatch(() => { - 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); } return sum; From 5c2d442f4df099e812504f4d08b179efc19ac1c2 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 20:06:57 -0500 Subject: [PATCH 38/45] =?UTF-8?q?=E2=9E=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util/dependencyGraph.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/util/dependencyGraph.ts b/src/util/dependencyGraph.ts index a740d56..888a1ef 100644 --- a/src/util/dependencyGraph.ts +++ b/src/util/dependencyGraph.ts @@ -60,15 +60,6 @@ export function runGraph( if (framework.name === "s-js") { // [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++) { - // 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); - // } - framework.withBatch(() => { const sourceDex = i % sources.length; sources[sourceDex].write(i + sourceDex); From 924147de306a7a9a82b90d4d8fbdf25db2a56fd6 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 16 Sep 2024 20:48:20 -0500 Subject: [PATCH 39/45] feat: bump svelte --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index ea891e0..65ac781 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "signal-polyfill": "^0.1.0", "signia": "^0.1.5", "solid-js": "^1.8.22", - "svelte": "5.0.0-next.246", + "svelte": "5.0.0-next.247", "usignal": "^0.9.0", "valtio": "^2.0.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 98595d5..5a6e353 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,8 +60,8 @@ importers: specifier: ^1.8.22 version: 1.8.22 svelte: - specifier: 5.0.0-next.246 - version: 5.0.0-next.246 + specifier: 5.0.0-next.247 + version: 5.0.0-next.247 usignal: specifier: ^0.9.0 version: 0.9.0 @@ -1049,8 +1049,8 @@ packages: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} - svelte@5.0.0-next.246: - resolution: {integrity: sha512-FRfq6W17mOHiSbY9nen6/skCV7AHQJdB9yaS9DA4x4mKXR/RIGMDLlxxU3jhQsMiLoqmUFHXJc6Rqe1o6HWlow==} + svelte@5.0.0-next.247: + resolution: {integrity: sha512-vfF5x75RDQwYErDru+usscMDrbm4KOV4UY7X52pbGPfFH5DsLpt7jiU+pBzB++W07YPKvoPWlNpl3OUKd7aBAQ==} engines: {node: '>=18'} tinybench@2.9.0: @@ -1920,7 +1920,7 @@ snapshots: dependencies: ansi-regex: 4.1.1 - svelte@5.0.0-next.246: + svelte@5.0.0-next.247: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 From 3153341c408167ff8649325f8a20799d9486aa2d Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 17 Sep 2024 01:33:27 -0500 Subject: [PATCH 40/45] feat: add github CI --- .github/funding.yml | 1 + .github/workflows/main.yml | 41 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 .github/funding.yml create mode 100644 .github/workflows/main.yml diff --git a/.github/funding.yml b/.github/funding.yml new file mode 100644 index 0000000..9377c23 --- /dev/null +++ b/.github/funding.yml @@ -0,0 +1 @@ +github: [transitive-bullshit] 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 From 867d5158437cdbada9bf55bf84008c02b3ef1222 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 17 Sep 2024 01:37:40 -0500 Subject: [PATCH 41/45] =?UTF-8?q?=E2=9C=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frameworks/svelte.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frameworks/svelte.ts b/src/frameworks/svelte.ts index 4ffe72c..61cc082 100644 --- a/src/frameworks/svelte.ts +++ b/src/frameworks/svelte.ts @@ -31,8 +31,8 @@ export const svelteFramework: ReactiveFramework = { withBatch: (fn) => { $.flush_sync(fn); }, - withBuild: (fn) => { - let res: ReturnType | undefined; + withBuild: (fn: () => T): T => { + let res: T | undefined; const destroy = $.effect_root(() => { res = fn(); }); From 630036906ad1d12ce56c1ddf04812d99551d9aad Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 17 Sep 2024 14:59:30 -0500 Subject: [PATCH 42/45] fix: bugs with svelte and vue adapters --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- src/frameworks.test.ts | 20 ++++++++++++-------- src/frameworks/svelte.ts | 4 +--- src/frameworks/vueReactivity.ts | 4 +--- src/index.ts | 3 ++- 6 files changed, 22 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 65ac781..cbb44b6 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "signal-polyfill": "^0.1.0", "signia": "^0.1.5", "solid-js": "^1.8.22", - "svelte": "5.0.0-next.247", + "svelte": "5.0.0-next.249", "usignal": "^0.9.0", "valtio": "^2.0.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5a6e353..2ceb6a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,8 +60,8 @@ importers: specifier: ^1.8.22 version: 1.8.22 svelte: - specifier: 5.0.0-next.247 - version: 5.0.0-next.247 + specifier: 5.0.0-next.249 + version: 5.0.0-next.249 usignal: specifier: ^0.9.0 version: 0.9.0 @@ -1049,8 +1049,8 @@ packages: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} - svelte@5.0.0-next.247: - resolution: {integrity: sha512-vfF5x75RDQwYErDru+usscMDrbm4KOV4UY7X52pbGPfFH5DsLpt7jiU+pBzB++W07YPKvoPWlNpl3OUKd7aBAQ==} + svelte@5.0.0-next.249: + resolution: {integrity: sha512-vbGir3ScQJjdKyWjhLi4aXc0DpilL4zVzC8UdEksoUhvP6OcaXrTC3aitHfSmdQ+FDntDLUWtytZMA01nRBs6Q==} engines: {node: '>=18'} tinybench@2.9.0: @@ -1920,7 +1920,7 @@ snapshots: dependencies: ansi-regex: 4.1.1 - svelte@5.0.0-next.247: + svelte@5.0.0-next.249: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 diff --git a/src/frameworks.test.ts b/src/frameworks.test.ts index fdaf16a..afd94ac 100644 --- a/src/frameworks.test.ts +++ b/src/frameworks.test.ts @@ -109,19 +109,23 @@ function frameworkTests({ framework, testPullCounts }: FrameworkInfo) { test(`${name} | effect`, () => { const spy = vi.fn(); + const s = framework.signal(2); + let c: any; + framework.withBuild(() => { - const s = framework.signal(2); - const c = framework.computed(() => s.read() * 2); + c = framework.computed(() => s.read() * 2); - framework.effect(() => spy(c.read())); - framework.withBatch(() => { - s.write(3); + framework.effect(() => { + spy(c.read()); }); - - expect(s.read()).toEqual(3); - expect(c.read()).toEqual(6); }); + 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/svelte.ts b/src/frameworks/svelte.ts index 61cc082..5644f5b 100644 --- a/src/frameworks/svelte.ts +++ b/src/frameworks/svelte.ts @@ -33,11 +33,9 @@ export const svelteFramework: ReactiveFramework = { }, withBuild: (fn: () => T): T => { let res: T | undefined; - const destroy = $.effect_root(() => { + $.effect_root(() => { res = fn(); }); - $.tick(); - destroy(); return res!; }, }; diff --git a/src/frameworks/vueReactivity.ts b/src/frameworks/vueReactivity.ts index 4c539cb..34268d4 100644 --- a/src/frameworks/vueReactivity.ts +++ b/src/frameworks/vueReactivity.ts @@ -46,8 +46,6 @@ export const vueReactivityFramework: ReactiveFramework = { }, withBuild: (fn) => { const e = effectScope(); - const r = e.run(fn)!; - e.stop(); - return r; + return e.run(fn)!; }, }; diff --git a/src/index.ts b/src/index.ts index 4e09041..46baa74 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,8 +17,9 @@ async function main() { await molBench(framework); sbench(framework); - // MobX and Valtio both fail this test currently, so disabling it for now. + // MobX, Valtio, and Svelte fail this test currently, so disabling it for now. // @see https://github.com/mobxjs/mobx/issues/3926 + // @see https://github.com/sveltejs/svelte/discussions/13277 // cellxbench(framework); await dynamicBench(frameworkTest); From 71223ab57e582a038ee9188939cba724a2aa2809 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 17 Sep 2024 15:30:03 -0500 Subject: [PATCH 43/45] fix: solidjs and svelte --- src/dynamicBench.ts | 2 +- src/util/dependencyGraph.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/dynamicBench.ts b/src/dynamicBench.ts index 1f64f47..91a364a 100644 --- a/src/dynamicBench.ts +++ b/src/dynamicBench.ts @@ -27,7 +27,7 @@ export async function dynamicBench( globalThis.gc?.(); return res; } catch (err: any) { - console.warn(`Error dynamicBench "${framework.name}":`, err.message); + console.warn(`Error dynamicBench "${framework.name}":`, err); return -1; } } diff --git a/src/util/dependencyGraph.ts b/src/util/dependencyGraph.ts index 888a1ef..eea0436 100644 --- a/src/util/dependencyGraph.ts +++ b/src/util/dependencyGraph.ts @@ -54,10 +54,11 @@ export function runGraph( 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 (framework.name === "s-js") { + 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(() => { From e4a399a4bd9034baa1734fce2b91c038b5489906 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 17 Sep 2024 15:31:24 -0500 Subject: [PATCH 44/45] docs: update readme results --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9f414ac..325c1f5 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ We're also working on enabling consistent logging and efficient tracking of GC t ## Results

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

From db852c55b93f5eb6718e27cd8592486aa0cea58d Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 6 Oct 2024 05:30:04 -0400 Subject: [PATCH 45/45] feat: PR feedback --- .github/funding.yml | 1 - src/cellxBench.ts | 19 +++++++++++-------- src/dynamicBench.ts | 2 +- src/index.ts | 8 ++------ src/kairo/broad.ts | 4 ++-- src/kairo/deep.ts | 4 ++-- src/kairo/diamond.ts | 4 ++-- src/kairo/repeated.ts | 4 ++-- src/kairo/triangle.ts | 4 ++-- src/kairo/unstable.ts | 5 +++-- 10 files changed, 27 insertions(+), 28 deletions(-) delete mode 100644 .github/funding.yml diff --git a/.github/funding.yml b/.github/funding.yml deleted file mode 100644 index 9377c23..0000000 --- a/.github/funding.yml +++ /dev/null @@ -1 +0,0 @@ -github: [transitive-bullshit] diff --git a/src/cellxBench.ts b/src/cellxBench.ts index d8b0f29..4d175a5 100644 --- a/src/cellxBench.ts +++ b/src/cellxBench.ts @@ -95,14 +95,17 @@ export const cellxbench = (framework: ReactiveFramework) => { [-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 = {}; diff --git a/src/dynamicBench.ts b/src/dynamicBench.ts index 91a364a..3a7c1ff 100644 --- a/src/dynamicBench.ts +++ b/src/dynamicBench.ts @@ -10,7 +10,7 @@ import { fastestTest } from "./util/benchRepeat"; */ export async function dynamicBench( frameworkTest: FrameworkInfo, - testRepeats = 1 + testRepeats = 5 ): Promise { const { framework } = frameworkTest; for (const config of perfTests) { diff --git a/src/index.ts b/src/index.ts index 46baa74..d0542af 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import { dynamicBench } from "./dynamicBench"; -// import { cellxbench } from "./cellxBench"; +import { cellxbench } from "./cellxBench"; import { sbench } from "./sBench"; import { frameworkInfo } from "./config"; import { logPerfResult, perfReportHeaders } from "./util/perfLogging"; @@ -8,7 +8,6 @@ import { kairoBench } from "./kairoBench"; async function main() { logPerfResult(perfReportHeaders()); - (globalThis as any).__DEV__ = true; for (const frameworkTest of frameworkInfo) { const { framework } = frameworkTest; @@ -17,10 +16,7 @@ async function main() { await molBench(framework); sbench(framework); - // MobX, Valtio, and Svelte fail this test currently, so disabling it for now. - // @see https://github.com/mobxjs/mobx/issues/3926 - // @see https://github.com/sveltejs/svelte/discussions/13277 - // cellxbench(framework); + cellxbench(framework); await dynamicBench(frameworkTest); diff --git a/src/kairo/broad.ts b/src/kairo/broad.ts index 6a84860..4507289 100644 --- a/src/kairo/broad.ts +++ b/src/kairo/broad.ts @@ -24,7 +24,7 @@ export function broadPropagation(bridge: ReactiveFramework) { bridge.withBatch(() => { head.write(1); }); - // const atleast = 50 * 50; + const atleast = 50 * 50; callCounter.count = 0; for (let i = 0; i < 50; i++) { bridge.withBatch(() => { @@ -32,6 +32,6 @@ export function broadPropagation(bridge: ReactiveFramework) { }); console.assert(last.read() === i + 50); } - // console.assert(callCounter.count === atleast, callCounter.count); + console.assert(callCounter.count === atleast, callCounter.count); }; } diff --git a/src/kairo/deep.ts b/src/kairo/deep.ts index eb05a08..eef6f8e 100644 --- a/src/kairo/deep.ts +++ b/src/kairo/deep.ts @@ -25,7 +25,7 @@ export function deepPropagation(bridge: ReactiveFramework) { bridge.withBatch(() => { head.write(1); }); - // const atleast = iter; + const atleast = iter; callCounter.count = 0; for (let i = 0; i < iter; i++) { bridge.withBatch(() => { @@ -34,6 +34,6 @@ export function deepPropagation(bridge: ReactiveFramework) { console.assert(current.read() === len + i); } - // console.assert(callCounter.count === atleast); + console.assert(callCounter.count === atleast); }; } diff --git a/src/kairo/diamond.ts b/src/kairo/diamond.ts index 740f1c3..b98fba1 100644 --- a/src/kairo/diamond.ts +++ b/src/kairo/diamond.ts @@ -27,7 +27,7 @@ export function diamond(bridge: ReactiveFramework) { head.write(1); }); console.assert(sum.read() === 2 * width); - // const atleast = 500; + const atleast = 500; callCounter.count = 0; for (let i = 0; i < 500; i++) { bridge.withBatch(() => { @@ -35,6 +35,6 @@ export function diamond(bridge: ReactiveFramework) { }); console.assert(sum.read() === (i + 1) * width); } - // console.assert(callCounter.count === atleast); + console.assert(callCounter.count === atleast); }; } diff --git a/src/kairo/repeated.ts b/src/kairo/repeated.ts index 2258dd8..c3313b5 100644 --- a/src/kairo/repeated.ts +++ b/src/kairo/repeated.ts @@ -26,7 +26,7 @@ export function repeatedObservers(bridge: ReactiveFramework) { head.write(1); }); console.assert(current.read() === size); - // const atleast = 100; + const atleast = 100; callCounter.count = 0; for (let i = 0; i < 100; i++) { bridge.withBatch(() => { @@ -34,6 +34,6 @@ export function repeatedObservers(bridge: ReactiveFramework) { }); console.assert(current.read() === i * size); } - // console.assert(callCounter.count === atleast); + console.assert(callCounter.count === atleast); }; } diff --git a/src/kairo/triangle.ts b/src/kairo/triangle.ts index 24a94b2..b472506 100644 --- a/src/kairo/triangle.ts +++ b/src/kairo/triangle.ts @@ -30,7 +30,7 @@ export function triangle(bridge: ReactiveFramework) { head.write(1); }); console.assert(sum.read() === constant); - // const atleast = 100; + const atleast = 100; callCounter.count = 0; for (let i = 0; i < 100; i++) { bridge.withBatch(() => { @@ -38,7 +38,7 @@ export function triangle(bridge: ReactiveFramework) { }); console.assert(sum.read() === constant - width + i * width); } - // console.assert(callCounter.count === atleast); + console.assert(callCounter.count === atleast); }; } diff --git a/src/kairo/unstable.ts b/src/kairo/unstable.ts index e70ae16..ca8982f 100644 --- a/src/kairo/unstable.ts +++ b/src/kairo/unstable.ts @@ -24,14 +24,15 @@ export function unstable(bridge: ReactiveFramework) { head.write(1); }); console.assert(current.read() === 40); - // const atleast = 100; + const atleast = 100; callCounter.count = 0; for (let i = 0; i < 100; i++) { 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); + console.assert(callCounter.count === atleast); }; }