From d3be221f97bcacf55ee7494566e15b05ef8981af Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sun, 4 Feb 2024 23:41:44 -0800 Subject: [PATCH 01/81] feat!: initial work on adding derived signals --- packages/store/src/derived.ts | 130 ++++++++++++++++++ packages/store/src/{index.ts => store.ts} | 0 packages/store/src/tests/derived.test.tsx | 25 ++++ .../tests/{index.test.tsx => store.test.tsx} | 2 +- 4 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 packages/store/src/derived.ts rename packages/store/src/{index.ts => store.ts} (100%) create mode 100644 packages/store/src/tests/derived.test.tsx rename packages/store/src/tests/{index.test.tsx => store.test.tsx} (98%) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts new file mode 100644 index 0000000..fc192d1 --- /dev/null +++ b/packages/store/src/derived.ts @@ -0,0 +1,130 @@ +import {Store} from "./store"; + +export type Listener = () => void + +interface DerivedOptions< + TState +> { + onSubscribe?: ( + listener: Listener, + derived: Derived, + ) => () => void + onUpdate?: () => void + // TODO: Temporary for Corbin to debug + debug?: boolean +} + +type Deps = Array | Store>; + +function _findRootStores(derived: Derived) { + let rootStores: Set> = new Set() + derived.deps.forEach(dep => { + if (dep instanceof Store) { + rootStores.add(dep); + } else { + const newStores = _findRootStores(dep); + newStores.forEach(val => rootStores.add(val)) + } + }) + return rootStores +} + +export function findRootStores(derived: Derived) { + return [..._findRootStores(derived)] +} + +export class Derived< + TState +> { + listeners = new Set() + state: TState + options?: DerivedOptions + + /** + * This is here to solve the pyramid dependency problem where: + * A + * / \ + * B C + * \ / + * D + * + * Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is. + * + * To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been + * resolved. + * + * This is a record of stores, because derived stores are not able to write values to, but stores are + */ + linkedDeps: Map, Array>> = new Map(); + + deps: Deps; + + // Functions representing the subscriptions. Call a function to cleanup + _subscriptions: Array<() => void> = []; + + constructor(deps: Deps, fn: () => TState, options?: DerivedOptions) { + this.options = options; + this.deps = deps; + this.state = fn(); + deps.forEach(dep => { + if (dep instanceof Derived) { + const rootStores = findRootStores(dep); + rootStores.forEach(store => { + const prevLinkedDeps = this.linkedDeps.get(store) || []; + prevLinkedDeps.push(dep); + this.linkedDeps.set(store, prevLinkedDeps) + }) + } + + const unsub = dep.subscribe(() => { + // Check to see if `dep` is typeof "Derived", if it is go find it in the linkedDeps tree and wait for the other value to be written + // Otherwise, if `dep` is typeof "Store", let's see if there are any derived values that it relies on and do the same + this.linkedDeps.forEach((derivedVals, store) => { + if ( + (dep instanceof Derived && derivedVals.includes(dep)) || + // TODO: is this edgecase correct? The assumption is that we want to handle: `Derived(a, b)` type deal where a is the signal that b depends on as well + // (dep instanceof Store && store === dep) + ) { + + } + }) + }) + + this._subscriptions.push(unsub) + }) + + this.linkedDeps.forEach((derivedValues, key) => { + if (derivedValues.length >= 2) return; + this.linkedDeps.delete(key) + }) + + if (options?.debug) { + console.log(this.linkedDeps) + } + } + + cleanup = () => { + this._subscriptions.forEach(cleanup => cleanup()) + } + + subscribe = (listener: Listener) => { + this.listeners.add(listener) + const unsub = this.options?.onSubscribe?.(listener, this) + return () => { + this.listeners.delete(listener) + unsub?.() + } + } + + _setState = (val: TState) => { + this.state = val; + this.options?.onUpdate?.() + this._flush() + } + + _flush = () => { + this.listeners.forEach((listener) => { + listener() + }) + } +} diff --git a/packages/store/src/index.ts b/packages/store/src/store.ts similarity index 100% rename from packages/store/src/index.ts rename to packages/store/src/store.ts diff --git a/packages/store/src/tests/derived.test.tsx b/packages/store/src/tests/derived.test.tsx new file mode 100644 index 0000000..604f1eb --- /dev/null +++ b/packages/store/src/tests/derived.test.tsx @@ -0,0 +1,25 @@ +import {Store} from "../store"; +import {Derived} from "../derived"; + +test("Pyramid dep problem", () => { + const count = new Store(10); + + const halfCount = new Derived([count], () => { + return count.state / 2; + }) + + const doubleCount = new Derived([count], () => { + return count.state * 2; + }) + + const sumDoubleHalfCount = new Derived([halfCount, doubleCount], () => { + return halfCount.state + doubleCount.state; + }, {debug: true}) + + sumDoubleHalfCount.subscribe(() => { + // This console should only run once + console.warn(sumDoubleHalfCount) + }) + + count.setState(() => 20) +}) diff --git a/packages/store/src/tests/index.test.tsx b/packages/store/src/tests/store.test.tsx similarity index 98% rename from packages/store/src/tests/index.test.tsx rename to packages/store/src/tests/store.test.tsx index e887891..bf0266d 100644 --- a/packages/store/src/tests/index.test.tsx +++ b/packages/store/src/tests/store.test.tsx @@ -1,5 +1,5 @@ import { describe, test, expect, vi } from 'vitest' -import { Store } from '../index' +import { Store } from '../store' describe('store', () => { test(`should set the initial value`, () => { From 5830fcac3a3247b39791b1f3ee15f831680fc640 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sun, 4 Feb 2024 23:58:25 -0800 Subject: [PATCH 02/81] chore: add tests to derived state --- packages/store/src/derived.ts | 45 ++++++++++++----------- packages/store/src/tests/derived.test.tsx | 20 +++++++--- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index fc192d1..66f63d6 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -10,8 +10,6 @@ interface DerivedOptions< derived: Derived, ) => () => void onUpdate?: () => void - // TODO: Temporary for Corbin to debug - debug?: boolean } type Deps = Array | Store>; @@ -62,6 +60,9 @@ export class Derived< // Functions representing the subscriptions. Call a function to cleanup _subscriptions: Array<() => void> = []; + // Seriously, users of Store, don't mess with this whatever you do + __depsThatHaveWrittenThisTick: Deps = []; + constructor(deps: Deps, fn: () => TState, options?: DerivedOptions) { this.options = options; this.deps = deps; @@ -75,22 +76,6 @@ export class Derived< this.linkedDeps.set(store, prevLinkedDeps) }) } - - const unsub = dep.subscribe(() => { - // Check to see if `dep` is typeof "Derived", if it is go find it in the linkedDeps tree and wait for the other value to be written - // Otherwise, if `dep` is typeof "Store", let's see if there are any derived values that it relies on and do the same - this.linkedDeps.forEach((derivedVals, store) => { - if ( - (dep instanceof Derived && derivedVals.includes(dep)) || - // TODO: is this edgecase correct? The assumption is that we want to handle: `Derived(a, b)` type deal where a is the signal that b depends on as well - // (dep instanceof Store && store === dep) - ) { - - } - }) - }) - - this._subscriptions.push(unsub) }) this.linkedDeps.forEach((derivedValues, key) => { @@ -98,9 +83,27 @@ export class Derived< this.linkedDeps.delete(key) }) - if (options?.debug) { - console.log(this.linkedDeps) - } + deps.forEach(dep => { + let relatedLinkedDerivedVals: null | Derived[] = null; + this.linkedDeps.forEach((derivedVals) => { + if ( + (dep instanceof Derived && derivedVals.includes(dep)) + ) { + relatedLinkedDerivedVals = derivedVals; + } + }) + + const unsub = dep.subscribe(() => { + this.__depsThatHaveWrittenThisTick.push(dep); + if (!relatedLinkedDerivedVals || this.__depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.length) { + // Yay! All deps are resolved - write the value of this derived + this._setState(fn()) + return; + } + }) + + this._subscriptions.push(unsub) + }) } cleanup = () => { diff --git a/packages/store/src/tests/derived.test.tsx b/packages/store/src/tests/derived.test.tsx index 604f1eb..15dd8a3 100644 --- a/packages/store/src/tests/derived.test.tsx +++ b/packages/store/src/tests/derived.test.tsx @@ -1,5 +1,12 @@ import {Store} from "../store"; import {Derived} from "../derived"; +import {expect, vi} from "vitest"; + +function viFnSubscribe(subscribable: Store | Derived) { + const fn = vi.fn(); + subscribable.subscribe(() => fn(subscribable.state)); + return fn; +} test("Pyramid dep problem", () => { const count = new Store(10); @@ -14,12 +21,15 @@ test("Pyramid dep problem", () => { const sumDoubleHalfCount = new Derived([halfCount, doubleCount], () => { return halfCount.state + doubleCount.state; - }, {debug: true}) - - sumDoubleHalfCount.subscribe(() => { - // This console should only run once - console.warn(sumDoubleHalfCount) }) + const halfCountFn = viFnSubscribe(halfCount); + const doubleCountFn = viFnSubscribe(doubleCount); + const sumDoubleHalfCountFn = viFnSubscribe(sumDoubleHalfCount); + count.setState(() => 20) + + expect(halfCountFn).toHaveBeenNthCalledWith(1, 10) + expect(doubleCountFn).toHaveBeenNthCalledWith(1, 40) + expect(sumDoubleHalfCountFn).toHaveBeenNthCalledWith(1, 50) }) From ae74fa50e683af538c904cb4d89ad23138a2a603 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 5 Feb 2024 00:03:01 -0800 Subject: [PATCH 03/81] fix: add cleanup edgecase --- packages/store/src/derived.ts | 2 ++ packages/store/src/tests/derived.test.tsx | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 66f63d6..15fafc4 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -98,6 +98,8 @@ export class Derived< if (!relatedLinkedDerivedVals || this.__depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.length) { // Yay! All deps are resolved - write the value of this derived this._setState(fn()) + // Cleanup the deps that have written this tick + this.__depsThatHaveWrittenThisTick = []; return; } }) diff --git a/packages/store/src/tests/derived.test.tsx b/packages/store/src/tests/derived.test.tsx index 15dd8a3..0583cfa 100644 --- a/packages/store/src/tests/derived.test.tsx +++ b/packages/store/src/tests/derived.test.tsx @@ -32,4 +32,10 @@ test("Pyramid dep problem", () => { expect(halfCountFn).toHaveBeenNthCalledWith(1, 10) expect(doubleCountFn).toHaveBeenNthCalledWith(1, 40) expect(sumDoubleHalfCountFn).toHaveBeenNthCalledWith(1, 50) + + count.setState(() => 30) + + expect(halfCountFn).toHaveBeenNthCalledWith(2, 15) + expect(doubleCountFn).toHaveBeenNthCalledWith(2, 60) + expect(sumDoubleHalfCountFn).toHaveBeenNthCalledWith(2, 75) }) From 605b520139da47ebddc8a2b82147dffbdd667b86 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 5 Feb 2024 00:31:05 -0800 Subject: [PATCH 04/81] fix: edgecase where using derived and store for base --- packages/store/src/derived.ts | 9 ++- packages/store/src/tests/derived.test.tsx | 71 ++++++++++++++++------- 2 files changed, 56 insertions(+), 24 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 15fafc4..62a1d2b 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -75,6 +75,10 @@ export class Derived< prevLinkedDeps.push(dep); this.linkedDeps.set(store, prevLinkedDeps) }) + } else if (dep instanceof Store) { + const prevLinkedDeps = this.linkedDeps.get(dep) || []; + prevLinkedDeps.push(this as Derived); + this.linkedDeps.set(dep, prevLinkedDeps) } }) @@ -85,9 +89,10 @@ export class Derived< deps.forEach(dep => { let relatedLinkedDerivedVals: null | Derived[] = null; - this.linkedDeps.forEach((derivedVals) => { + this.linkedDeps.forEach((derivedVals, store) => { if ( - (dep instanceof Derived && derivedVals.includes(dep)) + (dep instanceof Derived && derivedVals.includes(dep)) || + (dep instanceof Store && dep === store) ) { relatedLinkedDerivedVals = derivedVals; } diff --git a/packages/store/src/tests/derived.test.tsx b/packages/store/src/tests/derived.test.tsx index 0583cfa..984ebc8 100644 --- a/packages/store/src/tests/derived.test.tsx +++ b/packages/store/src/tests/derived.test.tsx @@ -8,34 +8,61 @@ function viFnSubscribe(subscribable: Store | Derived) { return fn; } -test("Pyramid dep problem", () => { - const count = new Store(10); +describe('Derived', () => { + test("Pyramid dep problem", () => { + const count = new Store(10); - const halfCount = new Derived([count], () => { - return count.state / 2; - }) + const halfCount = new Derived([count], () => { + return count.state / 2; + }) - const doubleCount = new Derived([count], () => { - return count.state * 2; - }) + const doubleCount = new Derived([count], () => { + return count.state * 2; + }) + + const sumDoubleHalfCount = new Derived([halfCount, doubleCount], () => { + return halfCount.state + doubleCount.state; + }) + + const halfCountFn = viFnSubscribe(halfCount); + const doubleCountFn = viFnSubscribe(doubleCount); + const sumDoubleHalfCountFn = viFnSubscribe(sumDoubleHalfCount); + + count.setState(() => 20) + + expect(halfCountFn).toHaveBeenNthCalledWith(1, 10) + expect(doubleCountFn).toHaveBeenNthCalledWith(1, 40) + expect(sumDoubleHalfCountFn).toHaveBeenNthCalledWith(1, 50) - const sumDoubleHalfCount = new Derived([halfCount, doubleCount], () => { - return halfCount.state + doubleCount.state; + count.setState(() => 30) + + expect(halfCountFn).toHaveBeenNthCalledWith(2, 15) + expect(doubleCountFn).toHaveBeenNthCalledWith(2, 60) + expect(sumDoubleHalfCountFn).toHaveBeenNthCalledWith(2, 75) }) - const halfCountFn = viFnSubscribe(halfCount); - const doubleCountFn = viFnSubscribe(doubleCount); - const sumDoubleHalfCountFn = viFnSubscribe(sumDoubleHalfCount); + test("Derive from store and another derived", () => { + const count = new Store(10); + + const doubleCount = new Derived([count], () => { + return count.state * 2; + }) + + const tripleCount = new Derived([count, doubleCount], () => { + return count.state + doubleCount.state; + }) - count.setState(() => 20) + const doubleCountFn = viFnSubscribe(doubleCount); + const tripleCountFn = viFnSubscribe(tripleCount); - expect(halfCountFn).toHaveBeenNthCalledWith(1, 10) - expect(doubleCountFn).toHaveBeenNthCalledWith(1, 40) - expect(sumDoubleHalfCountFn).toHaveBeenNthCalledWith(1, 50) + count.setState(() => 20) - count.setState(() => 30) + expect(doubleCountFn).toHaveBeenNthCalledWith(1, 40) + expect(tripleCountFn).toHaveBeenNthCalledWith(1, 60) - expect(halfCountFn).toHaveBeenNthCalledWith(2, 15) - expect(doubleCountFn).toHaveBeenNthCalledWith(2, 60) - expect(sumDoubleHalfCountFn).toHaveBeenNthCalledWith(2, 75) -}) + count.setState(() => 30) + + expect(doubleCountFn).toHaveBeenNthCalledWith(2, 60) + expect(tripleCountFn).toHaveBeenNthCalledWith(2, 90) + }) +}); From 9d4deb7f79ebb1bf274cfbceee4b3913efb7de38 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 5 Feb 2024 17:58:35 -0800 Subject: [PATCH 05/81] docs: update docs link --- docs/framework/solid/reference/useStore.md | 2 +- docs/framework/vue/reference/useStore.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/framework/solid/reference/useStore.md b/docs/framework/solid/reference/useStore.md index 2811c11..bed242c 100644 --- a/docs/framework/solid/reference/useStore.md +++ b/docs/framework/solid/reference/useStore.md @@ -3,4 +3,4 @@ title: Use Store id: useStore --- -Please see [/packages/solid-store/src/index.ts](https://github.com/tanstack/store/tree/main/packages/solid-store/src/index.ts) +Please see [/packages/solid-store/src/store.ts](https://github.com/tanstack/store/tree/main/packages/solid-store/src/index.ts) diff --git a/docs/framework/vue/reference/useStore.md b/docs/framework/vue/reference/useStore.md index 725ae81..de535ca 100644 --- a/docs/framework/vue/reference/useStore.md +++ b/docs/framework/vue/reference/useStore.md @@ -3,4 +3,4 @@ title: Use Store id: useStore --- -Please see [/packages/vue-store/src/index.ts](https://github.com/tanstack/store/tree/main/packages/vue-store/src/index.ts) +Please see [/packages/vue-store/src/store.ts](https://github.com/tanstack/store/tree/main/packages/vue-store/src/index.ts) From 12d40a6d6275257a8d694c7a992438e7cdc11fc8 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 5 Feb 2024 22:50:08 -0800 Subject: [PATCH 06/81] chore: refactor derived class --- packages/store/package.json | 1 + packages/store/src/derived.ts | 93 +++++++++-------------- packages/store/src/index.ts | 2 + packages/store/src/store.ts | 4 +- packages/store/src/tests/derived.test.tsx | 2 +- packages/store/src/types.ts | 3 + 6 files changed, 46 insertions(+), 59 deletions(-) create mode 100644 packages/store/src/index.ts create mode 100644 packages/store/src/types.ts diff --git a/packages/store/package.json b/packages/store/package.json index 010ec55..839b260 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -15,6 +15,7 @@ "test:types:versions52": "tsc", "test:types": "pnpm run \"/^test:types:versions.*/\"", "test:lib": "vitest", + "test:bench": "vitest bench", "test:lib:dev": "pnpm run test:lib --watch", "test:build": "publint --strict", "build": "vite build" diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 62a1d2b..28e1ea9 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -1,6 +1,5 @@ import {Store} from "./store"; - -export type Listener = () => void +import {Listener} from "./types"; interface DerivedOptions< TState @@ -14,23 +13,6 @@ interface DerivedOptions< type Deps = Array | Store>; -function _findRootStores(derived: Derived) { - let rootStores: Set> = new Set() - derived.deps.forEach(dep => { - if (dep instanceof Store) { - rootStores.add(dep); - } else { - const newStores = _findRootStores(dep); - newStores.forEach(val => rootStores.add(val)) - } - }) - return rootStores -} - -export function findRootStores(derived: Derived) { - return [..._findRootStores(derived)] -} - export class Derived< TState > { @@ -38,58 +20,55 @@ export class Derived< state: TState options?: DerivedOptions - /** - * This is here to solve the pyramid dependency problem where: - * A - * / \ - * B C - * \ / - * D - * - * Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is. - * - * To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been - * resolved. - * - * This is a record of stores, because derived stores are not able to write values to, but stores are - */ - linkedDeps: Map, Array>> = new Map(); - + rootStores: Array> = []; deps: Deps; // Functions representing the subscriptions. Call a function to cleanup _subscriptions: Array<() => void> = []; - // Seriously, users of Store, don't mess with this whatever you do - __depsThatHaveWrittenThisTick: Deps = []; - constructor(deps: Deps, fn: () => TState, options?: DerivedOptions) { this.options = options; this.deps = deps; this.state = fn(); + /** + * This is here to solve the pyramid dependency problem where: + * A + * / \ + * B C + * \ / + * D + * + * Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is. + * + * To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been + * resolved. + * + * This is a record of stores, because derived stores are not able to write values to, but stores are + */ + const linkedDeps: Map, Array>> = new Map(); + + const setLinkedDeps = (store: Store, dep: Derived) => { + const prevLinkedDeps = linkedDeps.get(store) || []; + prevLinkedDeps.push(dep); + linkedDeps.set(store, prevLinkedDeps) + } deps.forEach(dep => { if (dep instanceof Derived) { - const rootStores = findRootStores(dep); - rootStores.forEach(store => { - const prevLinkedDeps = this.linkedDeps.get(store) || []; - prevLinkedDeps.push(dep); - this.linkedDeps.set(store, prevLinkedDeps) + dep.rootStores.forEach(store => { + setLinkedDeps(store, dep) }) } else if (dep instanceof Store) { - const prevLinkedDeps = this.linkedDeps.get(dep) || []; - prevLinkedDeps.push(this as Derived); - this.linkedDeps.set(dep, prevLinkedDeps) + this.rootStores.push(dep); + setLinkedDeps(dep, this as Derived) } }) - this.linkedDeps.forEach((derivedValues, key) => { - if (derivedValues.length >= 2) return; - this.linkedDeps.delete(key) - }) + let __depsThatHaveWrittenThisTick: Deps = []; deps.forEach(dep => { let relatedLinkedDerivedVals: null | Derived[] = null; - this.linkedDeps.forEach((derivedVals, store) => { + linkedDeps.forEach((derivedVals, store) => { + if (derivedVals.length < 2) return; if ( (dep instanceof Derived && derivedVals.includes(dep)) || (dep instanceof Store && dep === store) @@ -99,12 +78,12 @@ export class Derived< }) const unsub = dep.subscribe(() => { - this.__depsThatHaveWrittenThisTick.push(dep); - if (!relatedLinkedDerivedVals || this.__depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.length) { + __depsThatHaveWrittenThisTick.push(dep); + if (!relatedLinkedDerivedVals || __depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.length) { // Yay! All deps are resolved - write the value of this derived this._setState(fn()) // Cleanup the deps that have written this tick - this.__depsThatHaveWrittenThisTick = []; + __depsThatHaveWrittenThisTick = []; return; } }) @@ -117,6 +96,10 @@ export class Derived< this._subscriptions.forEach(cleanup => cleanup()) } + [Symbol.dispose]() { + this.cleanup(); + } + subscribe = (listener: Listener) => { this.listeners.add(listener) const unsub = this.options?.onSubscribe?.(listener, this) diff --git a/packages/store/src/index.ts b/packages/store/src/index.ts new file mode 100644 index 0000000..fb15456 --- /dev/null +++ b/packages/store/src/index.ts @@ -0,0 +1,2 @@ +export * from "./derived" +export * from "./store" diff --git a/packages/store/src/store.ts b/packages/store/src/store.ts index fba4301..293143b 100644 --- a/packages/store/src/store.ts +++ b/packages/store/src/store.ts @@ -1,6 +1,4 @@ -export type AnyUpdater = (...args: any[]) => any - -export type Listener = () => void +import {AnyUpdater, Listener} from "./types"; interface StoreOptions< TState, diff --git a/packages/store/src/tests/derived.test.tsx b/packages/store/src/tests/derived.test.tsx index 984ebc8..f97ad0c 100644 --- a/packages/store/src/tests/derived.test.tsx +++ b/packages/store/src/tests/derived.test.tsx @@ -9,7 +9,7 @@ function viFnSubscribe(subscribable: Store | Derived) { } describe('Derived', () => { - test("Pyramid dep problem", () => { + test("Diamond dep problem", () => { const count = new Store(10); const halfCount = new Derived([count], () => { diff --git a/packages/store/src/types.ts b/packages/store/src/types.ts new file mode 100644 index 0000000..964a731 --- /dev/null +++ b/packages/store/src/types.ts @@ -0,0 +1,3 @@ +export type AnyUpdater = (...args: any[]) => any + +export type Listener = () => void From 368db9d43f07284c6fc037cd973a456b30d448bc Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 5 Feb 2024 23:10:14 -0800 Subject: [PATCH 07/81] chore: further refactors --- packages/store/package.json | 1 - packages/store/src/derived.ts | 33 +++++++++++++++++++-------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/packages/store/package.json b/packages/store/package.json index 839b260..010ec55 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -15,7 +15,6 @@ "test:types:versions52": "tsc", "test:types": "pnpm run \"/^test:types:versions.*/\"", "test:lib": "vitest", - "test:bench": "vitest bench", "test:lib:dev": "pnpm run test:lib --watch", "test:build": "publint --strict", "build": "vite build" diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 28e1ea9..bd3c518 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -45,12 +45,21 @@ export class Derived< * * This is a record of stores, because derived stores are not able to write values to, but stores are */ - const linkedDeps: Map, Array>> = new Map(); + const linkedDeps: Map, Set>> = new Map(); + const derivedToDerived: Map, Set>> = new Map(); const setLinkedDeps = (store: Store, dep: Derived) => { - const prevLinkedDeps = linkedDeps.get(store) || []; - prevLinkedDeps.push(dep); + const prevLinkedDeps = linkedDeps.get(store) || new Set(); + prevLinkedDeps.add(dep); linkedDeps.set(store, prevLinkedDeps) + + // Update the derivedToDerived mapping + dep.rootStores.forEach(rootStore => { + const relatedDerived = linkedDeps.get(rootStore); + if (relatedDerived) { + derivedToDerived.set(dep, relatedDerived); + } + }); } deps.forEach(dep => { if (dep instanceof Derived) { @@ -66,20 +75,16 @@ export class Derived< let __depsThatHaveWrittenThisTick: Deps = []; deps.forEach(dep => { - let relatedLinkedDerivedVals: null | Derived[] = null; - linkedDeps.forEach((derivedVals, store) => { - if (derivedVals.length < 2) return; - if ( - (dep instanceof Derived && derivedVals.includes(dep)) || - (dep instanceof Store && dep === store) - ) { - relatedLinkedDerivedVals = derivedVals; - } - }) + let relatedLinkedDerivedVals: null | Set> = null; + if (dep instanceof Derived) { + relatedLinkedDerivedVals = derivedToDerived.get(dep) || null + } else if (dep instanceof Store) { + relatedLinkedDerivedVals = linkedDeps.get(dep) || null; + } const unsub = dep.subscribe(() => { __depsThatHaveWrittenThisTick.push(dep); - if (!relatedLinkedDerivedVals || __depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.length) { + if (!relatedLinkedDerivedVals || __depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.size) { // Yay! All deps are resolved - write the value of this derived this._setState(fn()) // Cleanup the deps that have written this tick From 759040d68d86ce0c81d985207879d1d1f9e9a71a Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 5 Feb 2024 23:51:49 -0800 Subject: [PATCH 08/81] chore: refactor work to make things a bit cleaner --- packages/store/src/derived.ts | 35 ++++++++--------- packages/store/src/tests/derived.test.tsx | 47 ++++++++++++++++++++++- packages/store/src/tests/store.test.tsx | 3 +- 3 files changed, 63 insertions(+), 22 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index bd3c518..43d10f1 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -20,7 +20,7 @@ export class Derived< state: TState options?: DerivedOptions - rootStores: Array> = []; + rootStores: Set> = new Set(); deps: Deps; // Functions representing the subscriptions. Call a function to cleanup @@ -45,29 +45,23 @@ export class Derived< * * This is a record of stores, because derived stores are not able to write values to, but stores are */ - const linkedDeps: Map, Set>> = new Map(); - const derivedToDerived: Map, Set>> = new Map(); + const storeToDerived: Map, Set>> = new Map(); + const derivedToStore: Map, Set>> = new Map(); const setLinkedDeps = (store: Store, dep: Derived) => { - const prevLinkedDeps = linkedDeps.get(store) || new Set(); + const prevLinkedDeps = storeToDerived.get(store) || new Set(); prevLinkedDeps.add(dep); - linkedDeps.set(store, prevLinkedDeps) - - // Update the derivedToDerived mapping - dep.rootStores.forEach(rootStore => { - const relatedDerived = linkedDeps.get(rootStore); - if (relatedDerived) { - derivedToDerived.set(dep, relatedDerived); - } - }); + storeToDerived.set(store, prevLinkedDeps) } deps.forEach(dep => { if (dep instanceof Derived) { + derivedToStore.set(dep, dep.rootStores) dep.rootStores.forEach(store => { + this.rootStores.add(store); setLinkedDeps(store, dep) }) } else if (dep instanceof Store) { - this.rootStores.push(dep); + this.rootStores.add(dep); setLinkedDeps(dep, this as Derived) } }) @@ -76,11 +70,14 @@ export class Derived< deps.forEach(dep => { let relatedLinkedDerivedVals: null | Set> = null; - if (dep instanceof Derived) { - relatedLinkedDerivedVals = derivedToDerived.get(dep) || null - } else if (dep instanceof Store) { - relatedLinkedDerivedVals = linkedDeps.get(dep) || null; - } + const stores = (dep instanceof Derived ? derivedToStore.get(dep) : new Set([dep])) ?? new Set(); + stores.forEach(store => { + // Only runs on first loop through the store + if (!relatedLinkedDerivedVals) relatedLinkedDerivedVals = new Set(); + storeToDerived.get(store)?.forEach(derived => { + relatedLinkedDerivedVals!.add(derived) + }) + }) const unsub = dep.subscribe(() => { __depsThatHaveWrittenThisTick.push(dep); diff --git a/packages/store/src/tests/derived.test.tsx b/packages/store/src/tests/derived.test.tsx index f97ad0c..98d4baf 100644 --- a/packages/store/src/tests/derived.test.tsx +++ b/packages/store/src/tests/derived.test.tsx @@ -1,10 +1,13 @@ import {Store} from "../store"; import {Derived} from "../derived"; -import {expect, vi} from "vitest"; +import {afterEach, expect, vi} from "vitest"; function viFnSubscribe(subscribable: Store | Derived) { const fn = vi.fn(); - subscribable.subscribe(() => fn(subscribable.state)); + const cleanup = subscribable.subscribe(() => fn(subscribable.state)); + afterEach(() => { + cleanup() + }) return fn; } @@ -41,6 +44,46 @@ describe('Derived', () => { expect(sumDoubleHalfCountFn).toHaveBeenNthCalledWith(2, 75) }) + + /** + * A + * / \ + * B C + * / \ | + * D E F + * \ / | + * \ / + * G + */ + test("Complex diamond dep problem", () => { + const a = new Store(1); + const b = new Derived([a], () => a.state) + const c = new Derived([a], () => a.state) + const d = new Derived([b], () => b.state) + const e = new Derived([b], () => b.state) + const f = new Derived([c], () => c.state) + const g = new Derived([d, e, f], () => d.state + e.state + f.state); + + const aFn = viFnSubscribe(a); + const bFn = viFnSubscribe(b); + const cFn = viFnSubscribe(c); + const dFn = viFnSubscribe(d); + const eFn = viFnSubscribe(e); + const fFn = viFnSubscribe(f); + const gFn = viFnSubscribe(g); + + a.setState(() => 2) + + expect(aFn).toHaveBeenNthCalledWith(1, 2) + expect(bFn).toHaveBeenNthCalledWith(1, 2) + expect(cFn).toHaveBeenNthCalledWith(1, 2) + expect(dFn).toHaveBeenNthCalledWith(1, 2) + expect(eFn).toHaveBeenNthCalledWith(1, 2) + expect(fFn).toHaveBeenNthCalledWith(1, 2) + expect(gFn).toHaveBeenNthCalledWith(1, 6) + }) + + test("Derive from store and another derived", () => { const count = new Store(10); diff --git a/packages/store/src/tests/store.test.tsx b/packages/store/src/tests/store.test.tsx index bf0266d..a12459a 100644 --- a/packages/store/src/tests/store.test.tsx +++ b/packages/store/src/tests/store.test.tsx @@ -58,7 +58,7 @@ describe('store', () => { const listener = vi.fn() - store.subscribe(listener) + const unsub = store.subscribe(listener) store.batch(() => { store.setState(() => 1) @@ -79,5 +79,6 @@ describe('store', () => { expect(store.state).toEqual(4) // Listener is called 4 times because of a lack of batching expect(listener).toHaveBeenCalledTimes(5) + unsub(); }) }) From d79b4738002358f5e7e429c5dad5aceb02d1a6c7 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Tue, 6 Feb 2024 21:15:07 -0800 Subject: [PATCH 09/81] chore: minor renaming and cleanup --- packages/store/src/derived.ts | 12 ++++++------ packages/store/src/index.ts | 1 + packages/store/src/tests/derived.test.tsx | 1 - 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 43d10f1..987755c 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -48,21 +48,21 @@ export class Derived< const storeToDerived: Map, Set>> = new Map(); const derivedToStore: Map, Set>> = new Map(); - const setLinkedDeps = (store: Store, dep: Derived) => { - const prevLinkedDeps = storeToDerived.get(store) || new Set(); - prevLinkedDeps.add(dep); - storeToDerived.set(store, prevLinkedDeps) + const updateStoreToDerived = (store: Store, dep: Derived) => { + const prevDerivesForStore = storeToDerived.get(store) || new Set(); + prevDerivesForStore.add(dep); + storeToDerived.set(store, prevDerivesForStore) } deps.forEach(dep => { if (dep instanceof Derived) { derivedToStore.set(dep, dep.rootStores) dep.rootStores.forEach(store => { this.rootStores.add(store); - setLinkedDeps(store, dep) + updateStoreToDerived(store, dep) }) } else if (dep instanceof Store) { this.rootStores.add(dep); - setLinkedDeps(dep, this as Derived) + updateStoreToDerived(dep, this as Derived) } }) diff --git a/packages/store/src/index.ts b/packages/store/src/index.ts index fb15456..6ea32a1 100644 --- a/packages/store/src/index.ts +++ b/packages/store/src/index.ts @@ -1,2 +1,3 @@ export * from "./derived" export * from "./store" +export * from "./types" diff --git a/packages/store/src/tests/derived.test.tsx b/packages/store/src/tests/derived.test.tsx index 98d4baf..dbf0920 100644 --- a/packages/store/src/tests/derived.test.tsx +++ b/packages/store/src/tests/derived.test.tsx @@ -44,7 +44,6 @@ describe('Derived', () => { expect(sumDoubleHalfCountFn).toHaveBeenNthCalledWith(2, 75) }) - /** * A * / \ From 5700cc3e24fb2e07795f5ea0309a41873e10efb1 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Tue, 6 Feb 2024 21:50:06 -0800 Subject: [PATCH 10/81] chore: add initial benchmarks --- packages/store/package.json | 10 ++- packages/store/src/tests/derived.bench.tsx | 84 ++++++++++++++++++++++ pnpm-lock.yaml | 59 ++++++++++++++- 3 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 packages/store/src/tests/derived.bench.tsx diff --git a/packages/store/package.json b/packages/store/package.json index 010ec55..445f57f 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -15,6 +15,7 @@ "test:types:versions52": "tsc", "test:types": "pnpm run \"/^test:types:versions.*/\"", "test:lib": "vitest", + "test:bench": "vitest bench", "test:lib:dev": "pnpm run test:lib --watch", "test:build": "publint --strict", "build": "vite build" @@ -51,5 +52,12 @@ "files": [ "dist", "src" - ] + ], + "devDependencies": { + "@angular/core": "^17.1.2", + "preact": "^10.19.3", + "solid-js": "^1.7.8", + "@preact/signals": "^1.2.2", + "vue": "^3.3.4" + } } diff --git a/packages/store/src/tests/derived.bench.tsx b/packages/store/src/tests/derived.bench.tsx new file mode 100644 index 0000000..f8866a9 --- /dev/null +++ b/packages/store/src/tests/derived.bench.tsx @@ -0,0 +1,84 @@ +import { Store } from '../store' +import { Derived } from '../derived' +import { describe, bench } from 'vitest' +import { computed as vueComputed, ref, watch } from 'vue' +import { createEffect, createMemo, createSignal } from 'solid-js' +import { signal, computed as preactComputed, effect } from '@preact/signals' + +function noop(val: any) { + val +} + +/** + * A + * / \ + * B C + * / \ | + * D E F + * \ / | + * \ / + * G + */ +describe('Derived', () => { + bench('TanStack', () => { + const a = new Store(1) + const b = new Derived([a], () => a.state) + const c = new Derived([a], () => a.state) + const d = new Derived([b], () => b.state) + const e = new Derived([b], () => b.state) + const f = new Derived([c], () => c.state) + const g = new Derived([d, e, f], () => d.state + e.state + f.state) + + g.subscribe(() => noop(g.state)) + + a.setState(() => 2) + }) + + bench('Vue', () => { + const a = ref(1) + const b = vueComputed(() => a.value) + const c = vueComputed(() => a.value) + const d = vueComputed(() => b.value) + const e = vueComputed(() => b.value) + const f = vueComputed(() => c.value) + const g = vueComputed(() => d.value + e.value + f.value) + + watch(g, () => { + noop(g.value) + }) + + a.value = 2 + }) + + bench('Solid', () => { + const [a, setA] = createSignal(1) + const b = createMemo(() => a()) + const c = createMemo(() => a()) + const d = createMemo(() => b()) + const e = createMemo(() => b()) + const f = createMemo(() => c()) + const g = createMemo(() => d() + e() + f()) + + createEffect(() => { + noop(g()) + }) + + setA(2) + }) + + bench('Preact', () => { + const a = signal(1) + const b = preactComputed(() => a.value) + const c = preactComputed(() => a.value) + const d = preactComputed(() => b.value) + const e = preactComputed(() => b.value) + const f = preactComputed(() => c.value) + const g = preactComputed(() => d.value + e.value + f.value) + + effect(() => { + noop(g.value) + }) + + a.value = 2 + }) +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d54947c..eb9eff3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -152,7 +152,23 @@ importers: specifier: ^2.8.0 version: 2.8.0(solid-js@1.7.11)(vite@5.0.11) - packages/store: {} + packages/store: + devDependencies: + '@angular/core': + specifier: ^17.1.2 + version: 17.1.2(rxjs@7.8.1)(zone.js@0.14.3) + '@preact/signals': + specifier: ^1.2.2 + version: 1.2.2(preact@10.19.3) + preact: + specifier: ^10.19.3 + version: 10.19.3 + solid-js: + specifier: ^1.7.8 + version: 1.7.11 + vue: + specifier: ^3.3.4 + version: 3.3.4 packages/vue-store: dependencies: @@ -198,6 +214,18 @@ packages: '@jridgewell/trace-mapping': 0.3.19 dev: true + /@angular/core@17.1.2(rxjs@7.8.1)(zone.js@0.14.3): + resolution: {integrity: sha512-0M787BZVgYSVogHCUzo/dFrT56TgfQoEsOQngHMpyERJZv6dycXZlRdHc6TzvHUa+Uu/MNjn/RclBR8063bdWA==} + engines: {node: ^18.13.0 || >=20.9.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.3 + dev: true + /@asamuzakjp/dom-selector@2.0.1: resolution: {integrity: sha512-QJAJffmCiymkv6YyQ7voyQb5caCth6jzZsQncYCpHXrJ7RqdYG5y43+is8mnFcYubdOkr7cn1+na9BdFMxqw7w==} dependencies: @@ -1232,6 +1260,19 @@ packages: dev: true optional: true + /@preact/signals-core@1.5.1: + resolution: {integrity: sha512-dE6f+WCX5ZUDwXzUIWNMhhglmuLpqJhuy3X3xHrhZYI0Hm2LyQwOu0l9mdPiWrVNsE+Q7txOnJPgtIqHCYoBVA==} + dev: true + + /@preact/signals@1.2.2(preact@10.19.3): + resolution: {integrity: sha512-ColCqdo4cRP18bAuIR4Oik5rDpiyFtPIJIygaYPMEAwTnl4buWkBOflGBSzhYyPyJfKpkwlekrvK+1pzQ2ldWw==} + peerDependencies: + preact: 10.x + dependencies: + '@preact/signals-core': 1.5.1 + preact: 10.19.3 + dev: true + /@prettier/cli@0.3.0(prettier@4.0.0-alpha.8): resolution: {integrity: sha512-8qq527QT5n8paE9eoHeulmGw7a3MroVk5+8ITf+xoWJn1gcVaZiOP6vb9OlwZv49hhdRZ1WX+0MyisSSXL/4fA==} hasBin: true @@ -5205,6 +5246,10 @@ packages: source-map-js: 1.0.2 dev: true + /preact@10.19.3: + resolution: {integrity: sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==} + dev: true + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -5534,6 +5579,12 @@ packages: queue-microtask: 1.2.3 dev: true + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: true + /sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -6757,3 +6808,9 @@ packages: dependencies: grammex: 3.1.2 dev: true + + /zone.js@0.14.3: + resolution: {integrity: sha512-jYoNqF046Q+JfcZSItRSt+oXFcpXL88yq7XAZjb/NKTS7w2hHpKjRJ3VlFD1k75wMaRRXNUt5vrZVlygiMyHbA==} + dependencies: + tslib: 2.6.2 + dev: true From 0f7c648997b1993ecabe12f8c825f4236e29288b Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Tue, 6 Feb 2024 22:06:46 -0800 Subject: [PATCH 11/81] chore: add Angular --- packages/store/src/tests/derived.bench.tsx | 24 +++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/packages/store/src/tests/derived.bench.tsx b/packages/store/src/tests/derived.bench.tsx index f8866a9..3d61ab5 100644 --- a/packages/store/src/tests/derived.bench.tsx +++ b/packages/store/src/tests/derived.bench.tsx @@ -3,7 +3,9 @@ import { Derived } from '../derived' import { describe, bench } from 'vitest' import { computed as vueComputed, ref, watch } from 'vue' import { createEffect, createMemo, createSignal } from 'solid-js' -import { signal, computed as preactComputed, effect } from '@preact/signals' +import { signal as preactSignal, computed as preactComputed, effect as preactEffect } from '@preact/signals' +import { signal as angularSignal, computed as angularComputed } from '@angular/core' +import { createWatch } from '@angular/core/primitives/signals' function noop(val: any) { val @@ -67,7 +69,7 @@ describe('Derived', () => { }) bench('Preact', () => { - const a = signal(1) + const a = preactSignal(1) const b = preactComputed(() => a.value) const c = preactComputed(() => a.value) const d = preactComputed(() => b.value) @@ -75,10 +77,26 @@ describe('Derived', () => { const f = preactComputed(() => c.value) const g = preactComputed(() => d.value + e.value + f.value) - effect(() => { + preactEffect(() => { noop(g.value) }) a.value = 2 }) + + bench("Angular", () => { + const a = angularSignal(1); + const b = angularComputed(() => a()) + const c = angularComputed(() => a()) + const d = angularComputed(() => b()) + const e = angularComputed(() => b()) + const f = angularComputed(() => c()) + const g = angularComputed(() => d() + e() + f()); + + createWatch(() => { + console.log(g()); + }, () => {}, false) + + a.set(2) + }) }) From f0ec93551d8882354a36d6ad4901e6673a5eac23 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Tue, 6 Feb 2024 22:13:35 -0800 Subject: [PATCH 12/81] chore: update benchmark package versions --- packages/store/package.json | 5 +- pnpm-lock.yaml | 146 +++++++++++++++++++++++++++++++----- 2 files changed, 129 insertions(+), 22 deletions(-) diff --git a/packages/store/package.json b/packages/store/package.json index 445f57f..fe79cd1 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -55,9 +55,8 @@ ], "devDependencies": { "@angular/core": "^17.1.2", - "preact": "^10.19.3", - "solid-js": "^1.7.8", + "solid-js": "^1.8.14", "@preact/signals": "^1.2.2", - "vue": "^3.3.4" + "vue": "^3.4.15" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb9eff3..a655d83 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -160,15 +160,12 @@ importers: '@preact/signals': specifier: ^1.2.2 version: 1.2.2(preact@10.19.3) - preact: - specifier: ^10.19.3 - version: 10.19.3 solid-js: - specifier: ^1.7.8 - version: 1.7.11 + specifier: ^1.8.14 + version: 1.8.14 vue: - specifier: ^3.3.4 - version: 3.3.4 + specifier: ^3.4.15 + version: 3.4.15(typescript@5.2.2) packages/vue-store: dependencies: @@ -270,7 +267,7 @@ packages: '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.17) '@babel/helpers': 7.22.15 - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.6 '@babel/template': 7.22.15 '@babel/traverse': 7.22.17 '@babel/types': 7.22.17 @@ -388,7 +385,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.22.17 + '@babel/types': 7.23.6 dev: true /@babel/helper-function-name@7.23.0: @@ -507,7 +504,6 @@ packages: /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-identifier@7.22.15: resolution: {integrity: sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==} @@ -516,7 +512,6 @@ packages: /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-option@7.22.15: resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} @@ -534,7 +529,7 @@ packages: dependencies: '@babel/template': 7.22.15 '@babel/traverse': 7.22.17 - '@babel/types': 7.22.17 + '@babel/types': 7.23.6 transitivePeerDependencies: - supports-color dev: true @@ -581,7 +576,6 @@ packages: hasBin: true dependencies: '@babel/types': 7.23.6 - dev: true /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7): resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} @@ -674,7 +668,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.6 '@babel/types': 7.22.17 dev: true @@ -688,8 +682,8 @@ packages: '@babel/helper-function-name': 7.22.5 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.16 - '@babel/types': 7.22.17 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -729,7 +723,6 @@ packages: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - dev: true /@commitlint/parse@18.4.4: resolution: {integrity: sha512-99G7dyn/OoyNWXJni0Ki0K3aJd01pEb/Im/Id6y4X7PN+kGOahjz2z/cXYYHn7xDdooqFVdiVrVLeChfgpWZ2g==} @@ -1962,17 +1955,34 @@ packages: /@vue/compiler-core@3.3.4: resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} dependencies: - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.6 '@vue/shared': 3.3.4 estree-walker: 2.0.2 source-map-js: 1.0.2 + /@vue/compiler-core@3.4.15: + resolution: {integrity: sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==} + dependencies: + '@babel/parser': 7.23.6 + '@vue/shared': 3.4.15 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: true + /@vue/compiler-dom@3.3.4: resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} dependencies: '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 + /@vue/compiler-dom@3.4.15: + resolution: {integrity: sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==} + dependencies: + '@vue/compiler-core': 3.4.15 + '@vue/shared': 3.4.15 + dev: true + /@vue/compiler-sfc@2.7.14: resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==} dependencies: @@ -1995,12 +2005,33 @@ packages: postcss: 8.4.29 source-map-js: 1.0.2 + /@vue/compiler-sfc@3.4.15: + resolution: {integrity: sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==} + dependencies: + '@babel/parser': 7.23.6 + '@vue/compiler-core': 3.4.15 + '@vue/compiler-dom': 3.4.15 + '@vue/compiler-ssr': 3.4.15 + '@vue/shared': 3.4.15 + estree-walker: 2.0.2 + magic-string: 0.30.5 + postcss: 8.4.33 + source-map-js: 1.0.2 + dev: true + /@vue/compiler-ssr@3.3.4: resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} dependencies: '@vue/compiler-dom': 3.3.4 '@vue/shared': 3.3.4 + /@vue/compiler-ssr@3.4.15: + resolution: {integrity: sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==} + dependencies: + '@vue/compiler-dom': 3.4.15 + '@vue/shared': 3.4.15 + dev: true + /@vue/composition-api@1.7.2(vue@3.3.4): resolution: {integrity: sha512-M8jm9J/laYrYT02665HkZ5l2fWTK4dcVg3BsDHm/pfz+MjDYwX+9FUaZyGwEyXEDonQYRCo0H7aLgdklcIELjw==} peerDependencies: @@ -2031,7 +2062,7 @@ packages: /@vue/reactivity-transform@3.3.4: resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} dependencies: - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.6 '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 @@ -2042,12 +2073,25 @@ packages: dependencies: '@vue/shared': 3.3.4 + /@vue/reactivity@3.4.15: + resolution: {integrity: sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==} + dependencies: + '@vue/shared': 3.4.15 + dev: true + /@vue/runtime-core@3.3.4: resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} dependencies: '@vue/reactivity': 3.3.4 '@vue/shared': 3.3.4 + /@vue/runtime-core@3.4.15: + resolution: {integrity: sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==} + dependencies: + '@vue/reactivity': 3.4.15 + '@vue/shared': 3.4.15 + dev: true + /@vue/runtime-dom@3.3.4: resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} dependencies: @@ -2055,6 +2099,14 @@ packages: '@vue/shared': 3.3.4 csstype: 3.1.2 + /@vue/runtime-dom@3.4.15: + resolution: {integrity: sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==} + dependencies: + '@vue/runtime-core': 3.4.15 + '@vue/shared': 3.4.15 + csstype: 3.1.3 + dev: true + /@vue/server-renderer@3.3.4(vue@3.3.4): resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} peerDependencies: @@ -2064,9 +2116,23 @@ packages: '@vue/shared': 3.3.4 vue: 3.3.4 + /@vue/server-renderer@3.4.15(vue@3.4.15): + resolution: {integrity: sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==} + peerDependencies: + vue: 3.4.15 + dependencies: + '@vue/compiler-ssr': 3.4.15 + '@vue/shared': 3.4.15 + vue: 3.4.15(typescript@5.2.2) + dev: true + /@vue/shared@3.3.4: resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + /@vue/shared@3.4.15: + resolution: {integrity: sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==} + dev: true + /@vue/test-utils@2.4.1(vue@3.3.4): resolution: {integrity: sha512-VO8nragneNzUZUah6kOjiFmD/gwRjUauG9DROh6oaOeFwX1cZRUNHhdeogE8635cISigXFTtGLUQWx5KCb0xeg==} peerDependencies: @@ -2697,6 +2763,10 @@ packages: /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: true + /current-git-branch@1.1.0: resolution: {integrity: sha512-n5mwGZllLsFzxDPtTmadqGe4IIBPfqPbiIRX4xgFR9VK/Bx47U+94KiVkxSKAKN6/s43TlkztS2GZpgMKzwQ8A==} dependencies: @@ -5655,11 +5725,25 @@ packages: lru-cache: 6.0.0 dev: true + /seroval-plugins@1.0.4(seroval@1.0.4): + resolution: {integrity: sha512-DQ2IK6oQVvy8k+c2V5x5YCtUa/GGGsUwUBNN9UqohrZ0rWdUapBFpNMYP1bCyRHoxOJjdKGl+dieacFIpU/i1A==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + dependencies: + seroval: 1.0.4 + dev: true + /seroval@0.5.1: resolution: {integrity: sha512-ZfhQVB59hmIauJG5Ydynupy8KHyr5imGNtdDhbZG68Ufh1Ynkv9KOYOAABf71oVbQxJ8VkWnMHAjEHE7fWkH5g==} engines: {node: '>=10'} dev: true + /seroval@1.0.4: + resolution: {integrity: sha512-qQs/N+KfJu83rmszFQaTxcoJoPn6KNUruX4KmnmyD0oZkUoiNvJ1rpdYKDf4YHM05k+HOgCxa3yvf15QbVijGg==} + engines: {node: '>=10'} + dev: true + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -5717,6 +5801,14 @@ packages: seroval: 0.5.1 dev: true + /solid-js@1.8.14: + resolution: {integrity: sha512-kDfgHBm+ROVLDVuqaXh/jYz0ZVJ29TYfVsKsgDPtNcjoyaPtOvDX2l0tVnthjLdEXr7vDTYeqEYFfMkZakDsOQ==} + dependencies: + csstype: 3.1.2 + seroval: 1.0.4 + seroval-plugins: 1.0.4(seroval@1.0.4) + dev: true + /solid-refresh@0.5.3(solid-js@1.7.11): resolution: {integrity: sha512-Otg5it5sjOdZbQZJnvo99TEBAr6J7PQ5AubZLNU6szZzg3RQQ5MX04oteBIIGDs0y2Qv8aXKm9e44V8z+UnFdw==} peerDependencies: @@ -6578,6 +6670,22 @@ packages: '@vue/server-renderer': 3.3.4(vue@3.3.4) '@vue/shared': 3.3.4 + /vue@3.4.15(typescript@5.2.2): + resolution: {integrity: sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@vue/compiler-dom': 3.4.15 + '@vue/compiler-sfc': 3.4.15 + '@vue/runtime-dom': 3.4.15 + '@vue/server-renderer': 3.4.15(vue@3.4.15) + '@vue/shared': 3.4.15 + typescript: 5.2.2 + dev: true + /w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} From 790303c547bb280a61a5701c40b39813c12a3916 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Wed, 7 Feb 2024 01:39:31 -0800 Subject: [PATCH 13/81] chore: fix ci --- packages/store/src/derived.ts | 91 +++++++++++----------- packages/store/src/index.ts | 6 +- packages/store/src/store.ts | 2 +- packages/store/src/tests/derived.bench.tsx | 29 ++++--- packages/store/src/tests/derived.test.tsx | 63 ++++++++------- packages/store/src/tests/store.test.tsx | 2 +- 6 files changed, 102 insertions(+), 91 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 987755c..555bb14 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -1,35 +1,28 @@ -import {Store} from "./store"; -import {Listener} from "./types"; - -interface DerivedOptions< - TState -> { - onSubscribe?: ( - listener: Listener, - derived: Derived, - ) => () => void +import { Store } from './store' +import type { Listener } from './types' + +interface DerivedOptions { + onSubscribe?: (listener: Listener, derived: Derived) => () => void onUpdate?: () => void } -type Deps = Array | Store>; +type Deps = Array | Store> -export class Derived< - TState -> { +export class Derived { listeners = new Set() state: TState options?: DerivedOptions - rootStores: Set> = new Set(); - deps: Deps; + rootStores: Set> = new Set() + deps: Deps // Functions representing the subscriptions. Call a function to cleanup - _subscriptions: Array<() => void> = []; + _subscriptions: Array<() => void> = [] constructor(deps: Deps, fn: () => TState, options?: DerivedOptions) { - this.options = options; - this.deps = deps; - this.state = fn(); + this.options = options + this.deps = deps + this.state = fn() /** * This is here to solve the pyramid dependency problem where: * A @@ -45,48 +38,56 @@ export class Derived< * * This is a record of stores, because derived stores are not able to write values to, but stores are */ - const storeToDerived: Map, Set>> = new Map(); - const derivedToStore: Map, Set>> = new Map(); - - const updateStoreToDerived = (store: Store, dep: Derived) => { - const prevDerivesForStore = storeToDerived.get(store) || new Set(); - prevDerivesForStore.add(dep); + const storeToDerived: Map, Set>> = new Map() + const derivedToStore: Map, Set>> = new Map() + + const updateStoreToDerived = ( + store: Store, + dep: Derived, + ) => { + const prevDerivesForStore = storeToDerived.get(store) || new Set() + prevDerivesForStore.add(dep) storeToDerived.set(store, prevDerivesForStore) } - deps.forEach(dep => { + deps.forEach((dep) => { if (dep instanceof Derived) { derivedToStore.set(dep, dep.rootStores) - dep.rootStores.forEach(store => { - this.rootStores.add(store); + dep.rootStores.forEach((store) => { + this.rootStores.add(store) updateStoreToDerived(store, dep) }) } else if (dep instanceof Store) { - this.rootStores.add(dep); + this.rootStores.add(dep) updateStoreToDerived(dep, this as Derived) } }) - let __depsThatHaveWrittenThisTick: Deps = []; + let __depsThatHaveWrittenThisTick: Deps = [] - deps.forEach(dep => { - let relatedLinkedDerivedVals: null | Set> = null; - const stores = (dep instanceof Derived ? derivedToStore.get(dep) : new Set([dep])) ?? new Set(); - stores.forEach(store => { + deps.forEach((dep) => { + let relatedLinkedDerivedVals: null | Set> = null + const stores = + (dep instanceof Derived ? derivedToStore.get(dep) : new Set([dep])) ?? + new Set() + stores.forEach((store) => { // Only runs on first loop through the store - if (!relatedLinkedDerivedVals) relatedLinkedDerivedVals = new Set(); - storeToDerived.get(store)?.forEach(derived => { + if (!relatedLinkedDerivedVals) relatedLinkedDerivedVals = new Set() + storeToDerived.get(store)?.forEach((derived) => { relatedLinkedDerivedVals!.add(derived) }) }) const unsub = dep.subscribe(() => { - __depsThatHaveWrittenThisTick.push(dep); - if (!relatedLinkedDerivedVals || __depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.size) { + __depsThatHaveWrittenThisTick.push(dep) + if ( + !relatedLinkedDerivedVals || + __depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.size + ) { // Yay! All deps are resolved - write the value of this derived this._setState(fn()) // Cleanup the deps that have written this tick - __depsThatHaveWrittenThisTick = []; - return; + __depsThatHaveWrittenThisTick = [] + return } }) @@ -95,11 +96,11 @@ export class Derived< } cleanup = () => { - this._subscriptions.forEach(cleanup => cleanup()) - } + this._subscriptions.forEach((cleanup) => cleanup()) + }; [Symbol.dispose]() { - this.cleanup(); + this.cleanup() } subscribe = (listener: Listener) => { @@ -112,7 +113,7 @@ export class Derived< } _setState = (val: TState) => { - this.state = val; + this.state = val this.options?.onUpdate?.() this._flush() } diff --git a/packages/store/src/index.ts b/packages/store/src/index.ts index 6ea32a1..8656fee 100644 --- a/packages/store/src/index.ts +++ b/packages/store/src/index.ts @@ -1,3 +1,3 @@ -export * from "./derived" -export * from "./store" -export * from "./types" +export * from './derived' +export * from './store' +export * from './types' diff --git a/packages/store/src/store.ts b/packages/store/src/store.ts index 293143b..216918c 100644 --- a/packages/store/src/store.ts +++ b/packages/store/src/store.ts @@ -1,4 +1,4 @@ -import {AnyUpdater, Listener} from "./types"; +import type { AnyUpdater, Listener } from './types' interface StoreOptions< TState, diff --git a/packages/store/src/tests/derived.bench.tsx b/packages/store/src/tests/derived.bench.tsx index 3d61ab5..414a77c 100644 --- a/packages/store/src/tests/derived.bench.tsx +++ b/packages/store/src/tests/derived.bench.tsx @@ -3,8 +3,15 @@ import { Derived } from '../derived' import { describe, bench } from 'vitest' import { computed as vueComputed, ref, watch } from 'vue' import { createEffect, createMemo, createSignal } from 'solid-js' -import { signal as preactSignal, computed as preactComputed, effect as preactEffect } from '@preact/signals' -import { signal as angularSignal, computed as angularComputed } from '@angular/core' +import { + signal as preactSignal, + computed as preactComputed, + effect as preactEffect, +} from '@preact/signals' +import { + signal as angularSignal, + computed as angularComputed, +} from '@angular/core' import { createWatch } from '@angular/core/primitives/signals' function noop(val: any) { @@ -84,18 +91,22 @@ describe('Derived', () => { a.value = 2 }) - bench("Angular", () => { - const a = angularSignal(1); + bench('Angular', () => { + const a = angularSignal(1) const b = angularComputed(() => a()) const c = angularComputed(() => a()) const d = angularComputed(() => b()) const e = angularComputed(() => b()) const f = angularComputed(() => c()) - const g = angularComputed(() => d() + e() + f()); - - createWatch(() => { - console.log(g()); - }, () => {}, false) + const g = angularComputed(() => d() + e() + f()) + + createWatch( + () => { + console.log(g()) + }, + () => {}, + false, + ) a.set(2) }) diff --git a/packages/store/src/tests/derived.test.tsx b/packages/store/src/tests/derived.test.tsx index dbf0920..bc2a0f1 100644 --- a/packages/store/src/tests/derived.test.tsx +++ b/packages/store/src/tests/derived.test.tsx @@ -1,35 +1,35 @@ -import {Store} from "../store"; -import {Derived} from "../derived"; -import {afterEach, expect, vi} from "vitest"; +import { Store } from '../store' +import { Derived } from '../derived' +import { afterEach, expect, vi } from 'vitest' function viFnSubscribe(subscribable: Store | Derived) { - const fn = vi.fn(); - const cleanup = subscribable.subscribe(() => fn(subscribable.state)); + const fn = vi.fn() + const cleanup = subscribable.subscribe(() => fn(subscribable.state)) afterEach(() => { cleanup() }) - return fn; + return fn } describe('Derived', () => { - test("Diamond dep problem", () => { - const count = new Store(10); + test('Diamond dep problem', () => { + const count = new Store(10) const halfCount = new Derived([count], () => { - return count.state / 2; + return count.state / 2 }) const doubleCount = new Derived([count], () => { - return count.state * 2; + return count.state * 2 }) const sumDoubleHalfCount = new Derived([halfCount, doubleCount], () => { - return halfCount.state + doubleCount.state; + return halfCount.state + doubleCount.state }) - const halfCountFn = viFnSubscribe(halfCount); - const doubleCountFn = viFnSubscribe(doubleCount); - const sumDoubleHalfCountFn = viFnSubscribe(sumDoubleHalfCount); + const halfCountFn = viFnSubscribe(halfCount) + const doubleCountFn = viFnSubscribe(doubleCount) + const sumDoubleHalfCountFn = viFnSubscribe(sumDoubleHalfCount) count.setState(() => 20) @@ -54,22 +54,22 @@ describe('Derived', () => { * \ / * G */ - test("Complex diamond dep problem", () => { - const a = new Store(1); + test('Complex diamond dep problem', () => { + const a = new Store(1) const b = new Derived([a], () => a.state) const c = new Derived([a], () => a.state) const d = new Derived([b], () => b.state) const e = new Derived([b], () => b.state) const f = new Derived([c], () => c.state) - const g = new Derived([d, e, f], () => d.state + e.state + f.state); + const g = new Derived([d, e, f], () => d.state + e.state + f.state) - const aFn = viFnSubscribe(a); - const bFn = viFnSubscribe(b); - const cFn = viFnSubscribe(c); - const dFn = viFnSubscribe(d); - const eFn = viFnSubscribe(e); - const fFn = viFnSubscribe(f); - const gFn = viFnSubscribe(g); + const aFn = viFnSubscribe(a) + const bFn = viFnSubscribe(b) + const cFn = viFnSubscribe(c) + const dFn = viFnSubscribe(d) + const eFn = viFnSubscribe(e) + const fFn = viFnSubscribe(f) + const gFn = viFnSubscribe(g) a.setState(() => 2) @@ -82,20 +82,19 @@ describe('Derived', () => { expect(gFn).toHaveBeenNthCalledWith(1, 6) }) - - test("Derive from store and another derived", () => { - const count = new Store(10); + test('Derive from store and another derived', () => { + const count = new Store(10) const doubleCount = new Derived([count], () => { - return count.state * 2; + return count.state * 2 }) const tripleCount = new Derived([count, doubleCount], () => { - return count.state + doubleCount.state; + return count.state + doubleCount.state }) - const doubleCountFn = viFnSubscribe(doubleCount); - const tripleCountFn = viFnSubscribe(tripleCount); + const doubleCountFn = viFnSubscribe(doubleCount) + const tripleCountFn = viFnSubscribe(tripleCount) count.setState(() => 20) @@ -107,4 +106,4 @@ describe('Derived', () => { expect(doubleCountFn).toHaveBeenNthCalledWith(2, 60) expect(tripleCountFn).toHaveBeenNthCalledWith(2, 90) }) -}); +}) diff --git a/packages/store/src/tests/store.test.tsx b/packages/store/src/tests/store.test.tsx index a12459a..60a8bb0 100644 --- a/packages/store/src/tests/store.test.tsx +++ b/packages/store/src/tests/store.test.tsx @@ -79,6 +79,6 @@ describe('store', () => { expect(store.state).toEqual(4) // Listener is called 4 times because of a lack of batching expect(listener).toHaveBeenCalledTimes(5) - unsub(); + unsub() }) }) From 5a069c7c345127e707f2c38b814cc45d83ab1e71 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 8 Feb 2024 17:59:13 -0800 Subject: [PATCH 14/81] chore: move to proper derived store --- packages/store/src/derived.ts | 36 +++++++++++------------------------ 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 555bb14..dec5678 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -9,10 +9,7 @@ interface DerivedOptions { type Deps = Array | Store> export class Derived { - listeners = new Set() - state: TState - options?: DerivedOptions - + _store!: Store rootStores: Set> = new Set() deps: Deps @@ -20,9 +17,11 @@ export class Derived { _subscriptions: Array<() => void> = [] constructor(deps: Deps, fn: () => TState, options?: DerivedOptions) { - this.options = options this.deps = deps - this.state = fn() + this._store = new Store(fn(), { + onSubscribe: options?.onSubscribe?.bind(this) as never, + onUpdate: options?.onUpdate + }) /** * This is here to solve the pyramid dependency problem where: * A @@ -84,7 +83,7 @@ export class Derived { __depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.size ) { // Yay! All deps are resolved - write the value of this derived - this._setState(fn()) + this._store.setState(fn) // Cleanup the deps that have written this tick __depsThatHaveWrittenThisTick = [] return @@ -95,6 +94,10 @@ export class Derived { }) } + get state() { + return this._store.state; + } + cleanup = () => { this._subscriptions.forEach((cleanup) => cleanup()) }; @@ -104,23 +107,6 @@ export class Derived { } subscribe = (listener: Listener) => { - this.listeners.add(listener) - const unsub = this.options?.onSubscribe?.(listener, this) - return () => { - this.listeners.delete(listener) - unsub?.() - } - } - - _setState = (val: TState) => { - this.state = val - this.options?.onUpdate?.() - this._flush() - } - - _flush = () => { - this.listeners.forEach((listener) => { - listener() - }) + return this._store.subscribe(listener); } } From 157413f5088aa6eb15c447108d42df5bd5832e58 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 8 Feb 2024 18:36:04 -0800 Subject: [PATCH 15/81] fix: avoid issues with what signal is being written --- packages/store/src/derived.ts | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index dec5678..f21740e 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -16,6 +16,9 @@ export class Derived { // Functions representing the subscriptions. Call a function to cleanup _subscriptions: Array<() => void> = [] + // What store called the current update, if any + _whatStoreIsCurrentlyInUse: Store | null = null; + constructor(deps: Deps, fn: () => TState, options?: DerivedOptions) { this.deps = deps this._store = new Store(fn(), { @@ -64,19 +67,16 @@ export class Derived { let __depsThatHaveWrittenThisTick: Deps = [] deps.forEach((dep) => { + const isDepAStore = dep instanceof Store; let relatedLinkedDerivedVals: null | Set> = null - const stores = - (dep instanceof Derived ? derivedToStore.get(dep) : new Set([dep])) ?? - new Set() - stores.forEach((store) => { - // Only runs on first loop through the store - if (!relatedLinkedDerivedVals) relatedLinkedDerivedVals = new Set() - storeToDerived.get(store)?.forEach((derived) => { - relatedLinkedDerivedVals!.add(derived) - }) - }) const unsub = dep.subscribe(() => { + const store = isDepAStore ? dep : dep._whatStoreIsCurrentlyInUse; + this._whatStoreIsCurrentlyInUse = store; + if (store) { + relatedLinkedDerivedVals = storeToDerived.get(store) ?? null + } + __depsThatHaveWrittenThisTick.push(dep) if ( !relatedLinkedDerivedVals || @@ -86,6 +86,7 @@ export class Derived { this._store.setState(fn) // Cleanup the deps that have written this tick __depsThatHaveWrittenThisTick = [] + this._whatStoreIsCurrentlyInUse = null; return } }) From 192829cd5423c7e6fac7ad4797e1687749329e3e Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 8 Feb 2024 18:40:07 -0800 Subject: [PATCH 16/81] chore: ignore benchmark file in test coverage --- packages/store/src/tests/derived.bench.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/store/src/tests/derived.bench.tsx b/packages/store/src/tests/derived.bench.tsx index 414a77c..1c477c3 100644 --- a/packages/store/src/tests/derived.bench.tsx +++ b/packages/store/src/tests/derived.bench.tsx @@ -1,3 +1,4 @@ +/* istanbul ignore file -- @preserve */ import { Store } from '../store' import { Derived } from '../derived' import { describe, bench } from 'vitest' From f4dc9daa0a19e3c0a86e3947fcbb6ea698b98d8d Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 8 Feb 2024 19:00:53 -0800 Subject: [PATCH 17/81] chore: rename TSX to TS --- packages/store/src/derived.ts | 2 +- .../store/src/tests/{derived.bench.tsx => derived.bench.ts} | 0 packages/store/src/tests/{derived.test.tsx => derived.test.ts} | 0 packages/store/src/tests/{store.test.tsx => store.test.ts} | 0 4 files changed, 1 insertion(+), 1 deletion(-) rename packages/store/src/tests/{derived.bench.tsx => derived.bench.ts} (100%) rename packages/store/src/tests/{derived.test.tsx => derived.test.ts} (100%) rename packages/store/src/tests/{store.test.tsx => store.test.ts} (100%) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index f21740e..8c295fd 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -6,7 +6,7 @@ interface DerivedOptions { onUpdate?: () => void } -type Deps = Array | Store> +export type Deps = Array | Store> export class Derived { _store!: Store diff --git a/packages/store/src/tests/derived.bench.tsx b/packages/store/src/tests/derived.bench.ts similarity index 100% rename from packages/store/src/tests/derived.bench.tsx rename to packages/store/src/tests/derived.bench.ts diff --git a/packages/store/src/tests/derived.test.tsx b/packages/store/src/tests/derived.test.ts similarity index 100% rename from packages/store/src/tests/derived.test.tsx rename to packages/store/src/tests/derived.test.ts diff --git a/packages/store/src/tests/store.test.tsx b/packages/store/src/tests/store.test.ts similarity index 100% rename from packages/store/src/tests/store.test.tsx rename to packages/store/src/tests/store.test.ts From b7987e8db2a1b2da14b114293dc4be2fddcf1cb7 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 8 Feb 2024 19:01:18 -0800 Subject: [PATCH 18/81] feat: add Effect --- packages/store/src/effect.ts | 21 +++++++++ packages/store/src/index.ts | 1 + packages/store/src/tests/effect.test.ts | 60 +++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 packages/store/src/effect.ts create mode 100644 packages/store/src/tests/effect.test.ts diff --git a/packages/store/src/effect.ts b/packages/store/src/effect.ts new file mode 100644 index 0000000..f2c7832 --- /dev/null +++ b/packages/store/src/effect.ts @@ -0,0 +1,21 @@ +import {Deps, Derived} from "./derived"; + +export class Effect { + _derived: Derived; + + constructor(items: Deps, effectFn: () => void) { + this._derived = new Derived(items, () => {}, { + onUpdate() { + effectFn(); + }, + }); + } + + cleanup() { + this._derived.cleanup() + } + + [Symbol.dispose]() { + this.cleanup() + } +} diff --git a/packages/store/src/index.ts b/packages/store/src/index.ts index 8656fee..c766b28 100644 --- a/packages/store/src/index.ts +++ b/packages/store/src/index.ts @@ -1,3 +1,4 @@ export * from './derived' +export * from './effect' export * from './store' export * from './types' diff --git a/packages/store/src/tests/effect.test.ts b/packages/store/src/tests/effect.test.ts new file mode 100644 index 0000000..bf3918c --- /dev/null +++ b/packages/store/src/tests/effect.test.ts @@ -0,0 +1,60 @@ +import { Store } from '../store' +import { Derived } from '../derived' +import { expect, vi } from 'vitest' +import {Effect} from "../effect"; + +describe('Effect', () => { + test('Side effect free', () => { + const count = new Store(10) + + const halfCount = new Derived([count], () => { + return count.state / 2 + }) + + const doubleCount = new Derived([count], () => { + return count.state * 2 + }) + + const sumDoubleHalfCount = new Derived([halfCount, doubleCount], () => { + return halfCount.state + doubleCount.state + }) + + const fn = vi.fn(); + new Effect([sumDoubleHalfCount], () => fn(sumDoubleHalfCount.state)); + + count.setState(() => 20) + + expect(fn).toHaveBeenNthCalledWith(1, 50) + + count.setState(() => 30) + + expect(fn).toHaveBeenNthCalledWith(2, 75) + }) + + /** + * A + * / \ + * B C + * / \ | + * D E F + * \ / | + * \ / + * G + */ + test('Complex diamond dep problem', () => { + const a = new Store(1) + const b = new Derived([a], () => a.state) + const c = new Derived([a], () => a.state) + const d = new Derived([b], () => b.state) + const e = new Derived([b], () => b.state) + const f = new Derived([c], () => c.state) + const g = new Derived([d, e, f], () => d.state + e.state + f.state) + + const fn = vi.fn(); + new Effect([g], () => fn(g.state)); + + a.setState(() => 2) + + expect(fn).toHaveBeenNthCalledWith(1, 6) + }) +}) From 87dd588df5ab5b90563cc36a574bc3b1917d84cd Mon Sep 17 00:00:00 2001 From: Lachlan Collins <1667261+lachlancollins@users.noreply.github.com> Date: Sat, 17 Feb 2024 14:22:17 +1100 Subject: [PATCH 19/81] Fix eslint, sherif, and knip --- .eslintrc.cjs | 1 + knip.json | 9 + package.json | 4 +- packages/solid-store/package.json | 2 +- packages/store/src/derived.ts | 22 +-- packages/store/src/effect.ts | 9 +- packages/store/src/tests/derived.bench.ts | 12 +- packages/store/src/tests/derived.test.ts | 2 +- packages/store/src/tests/effect.test.ts | 12 +- packages/vue-store/package.json | 2 +- pnpm-lock.yaml | 203 +++++----------------- 11 files changed, 90 insertions(+), 188 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index ce03ce6..5ad9cda 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -47,6 +47,7 @@ const config = { ], '@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/method-signature-style': 'error', + '@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-empty-interface': 'off', '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-non-null-assertion': 'off', diff --git a/knip.json b/knip.json index 5dc66d8..65512ed 100644 --- a/knip.json +++ b/knip.json @@ -4,6 +4,15 @@ "packages/angular-store": { "ignoreDependencies": ["@angular/compiler-cli"] }, + "packages/store": { + "ignore": ["src/tests/derived.bench.ts"], + "ignoreDependencies": [ + "@angular/core", + "@preact/signals", + "solid-js", + "vue" + ] + }, "packages/vue-store": { "ignoreDependencies": ["vue2", "vue2.7"] } diff --git a/package.json b/package.json index 578fc87..8daa0b8 100644 --- a/package.json +++ b/package.json @@ -66,13 +66,13 @@ "react-dom": "^18.2.0", "rimraf": "^5.0.5", "sherif": "^0.7.0", - "solid-js": "^1.7.8", + "solid-js": "^1.8.14", "typescript": "^5.2.2", "typescript49": "npm:typescript@4.9", "typescript50": "npm:typescript@5.0", "typescript51": "npm:typescript@5.1", "vite": "^5.1.0", "vitest": "^1.2.2", - "vue": "^3.3.4" + "vue": "^3.4.15" } } diff --git a/packages/solid-store/package.json b/packages/solid-store/package.json index 09828b0..82227cc 100644 --- a/packages/solid-store/package.json +++ b/packages/solid-store/package.json @@ -60,7 +60,7 @@ "@tanstack/store": "workspace:*" }, "devDependencies": { - "solid-js": "^1.7.8", + "solid-js": "^1.8.14", "vite-plugin-solid": "^2.8.0" } } diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 8c295fd..2731974 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -10,20 +10,20 @@ export type Deps = Array | Store> export class Derived { _store!: Store - rootStores: Set> = new Set() + rootStores = new Set>() deps: Deps // Functions representing the subscriptions. Call a function to cleanup _subscriptions: Array<() => void> = [] // What store called the current update, if any - _whatStoreIsCurrentlyInUse: Store | null = null; + _whatStoreIsCurrentlyInUse: Store | null = null constructor(deps: Deps, fn: () => TState, options?: DerivedOptions) { this.deps = deps this._store = new Store(fn(), { onSubscribe: options?.onSubscribe?.bind(this) as never, - onUpdate: options?.onUpdate + onUpdate: options?.onUpdate, }) /** * This is here to solve the pyramid dependency problem where: @@ -40,8 +40,8 @@ export class Derived { * * This is a record of stores, because derived stores are not able to write values to, but stores are */ - const storeToDerived: Map, Set>> = new Map() - const derivedToStore: Map, Set>> = new Map() + const storeToDerived = new Map, Set>>() + const derivedToStore = new Map, Set>>() const updateStoreToDerived = ( store: Store, @@ -67,12 +67,12 @@ export class Derived { let __depsThatHaveWrittenThisTick: Deps = [] deps.forEach((dep) => { - const isDepAStore = dep instanceof Store; + const isDepAStore = dep instanceof Store let relatedLinkedDerivedVals: null | Set> = null const unsub = dep.subscribe(() => { - const store = isDepAStore ? dep : dep._whatStoreIsCurrentlyInUse; - this._whatStoreIsCurrentlyInUse = store; + const store = isDepAStore ? dep : dep._whatStoreIsCurrentlyInUse + this._whatStoreIsCurrentlyInUse = store if (store) { relatedLinkedDerivedVals = storeToDerived.get(store) ?? null } @@ -86,7 +86,7 @@ export class Derived { this._store.setState(fn) // Cleanup the deps that have written this tick __depsThatHaveWrittenThisTick = [] - this._whatStoreIsCurrentlyInUse = null; + this._whatStoreIsCurrentlyInUse = null return } }) @@ -96,7 +96,7 @@ export class Derived { } get state() { - return this._store.state; + return this._store.state } cleanup = () => { @@ -108,6 +108,6 @@ export class Derived { } subscribe = (listener: Listener) => { - return this._store.subscribe(listener); + return this._store.subscribe(listener) } } diff --git a/packages/store/src/effect.ts b/packages/store/src/effect.ts index f2c7832..102812e 100644 --- a/packages/store/src/effect.ts +++ b/packages/store/src/effect.ts @@ -1,14 +1,15 @@ -import {Deps, Derived} from "./derived"; +import { Derived } from './derived' +import type { Deps } from './derived' export class Effect { - _derived: Derived; + _derived: Derived constructor(items: Deps, effectFn: () => void) { this._derived = new Derived(items, () => {}, { onUpdate() { - effectFn(); + effectFn() }, - }); + }) } cleanup() { diff --git a/packages/store/src/tests/derived.bench.ts b/packages/store/src/tests/derived.bench.ts index 1c477c3..b95fc36 100644 --- a/packages/store/src/tests/derived.bench.ts +++ b/packages/store/src/tests/derived.bench.ts @@ -1,19 +1,19 @@ /* istanbul ignore file -- @preserve */ -import { Store } from '../store' -import { Derived } from '../derived' -import { describe, bench } from 'vitest' -import { computed as vueComputed, ref, watch } from 'vue' +import { bench, describe } from 'vitest' +import { ref, computed as vueComputed, watch } from 'vue' import { createEffect, createMemo, createSignal } from 'solid-js' import { - signal as preactSignal, computed as preactComputed, effect as preactEffect, + signal as preactSignal, } from '@preact/signals' import { - signal as angularSignal, computed as angularComputed, + signal as angularSignal, } from '@angular/core' import { createWatch } from '@angular/core/primitives/signals' +import { Store } from '../store' +import { Derived } from '../derived' function noop(val: any) { val diff --git a/packages/store/src/tests/derived.test.ts b/packages/store/src/tests/derived.test.ts index bc2a0f1..24aafd2 100644 --- a/packages/store/src/tests/derived.test.ts +++ b/packages/store/src/tests/derived.test.ts @@ -1,6 +1,6 @@ +import { afterEach, expect, vi } from 'vitest' import { Store } from '../store' import { Derived } from '../derived' -import { afterEach, expect, vi } from 'vitest' function viFnSubscribe(subscribable: Store | Derived) { const fn = vi.fn() diff --git a/packages/store/src/tests/effect.test.ts b/packages/store/src/tests/effect.test.ts index bf3918c..d3b7d26 100644 --- a/packages/store/src/tests/effect.test.ts +++ b/packages/store/src/tests/effect.test.ts @@ -1,7 +1,7 @@ +import { expect, vi } from 'vitest' import { Store } from '../store' import { Derived } from '../derived' -import { expect, vi } from 'vitest' -import {Effect} from "../effect"; +import { Effect } from '../effect' describe('Effect', () => { test('Side effect free', () => { @@ -19,8 +19,8 @@ describe('Effect', () => { return halfCount.state + doubleCount.state }) - const fn = vi.fn(); - new Effect([sumDoubleHalfCount], () => fn(sumDoubleHalfCount.state)); + const fn = vi.fn() + new Effect([sumDoubleHalfCount], () => fn(sumDoubleHalfCount.state)) count.setState(() => 20) @@ -50,8 +50,8 @@ describe('Effect', () => { const f = new Derived([c], () => c.state) const g = new Derived([d, e, f], () => d.state + e.state + f.state) - const fn = vi.fn(); - new Effect([g], () => fn(g.state)); + const fn = vi.fn() + new Effect([g], () => fn(g.state)) a.setState(() => 2) diff --git a/packages/vue-store/package.json b/packages/vue-store/package.json index 96cec8e..e03ab70 100644 --- a/packages/vue-store/package.json +++ b/packages/vue-store/package.json @@ -58,7 +58,7 @@ }, "devDependencies": { "@vue/composition-api": "^1.7.2", - "vue": "^3.3.4", + "vue": "^3.4.15", "vue2": "npm:vue@2.6", "vue2.7": "npm:vue@2.7", "@vitejs/plugin-vue": "^5.0.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 00f3335..a64d4ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: '@solidjs/testing-library': specifier: ^0.8.5 - version: 0.8.5(@solidjs/router@0.8.3)(solid-js@1.7.11) + version: 0.8.5(@solidjs/router@0.8.3)(solid-js@1.8.14) '@tanstack/config': specifier: ^0.4.2 version: 0.4.2(@types/node@18.19.5)(esbuild@0.19.11)(rollup@4.9.4)(typescript@5.2.2)(vite@5.1.0) @@ -25,7 +25,7 @@ importers: version: 14.4.3(@testing-library/dom@9.3.1) '@testing-library/vue': specifier: ^7.0.0 - version: 7.0.0(@vue/compiler-sfc@3.4.15)(vue@3.3.4) + version: 7.0.0(@vue/compiler-sfc@3.4.15)(vue@3.4.15) '@types/eslint': specifier: ^8.56.2 version: 8.56.2 @@ -96,8 +96,8 @@ importers: specifier: ^0.7.0 version: 0.7.0 solid-js: - specifier: ^1.7.8 - version: 1.7.11 + specifier: ^1.8.14 + version: 1.8.14 typescript: specifier: ^5.2.2 version: 5.2.2 @@ -117,8 +117,8 @@ importers: specifier: ^1.2.2 version: 1.2.2(@types/node@18.19.5)(jsdom@23.2.0) vue: - specifier: ^3.3.4 - version: 3.3.4 + specifier: ^3.4.15 + version: 3.4.15(typescript@5.2.2) packages/angular-store: dependencies: @@ -180,11 +180,11 @@ importers: version: link:../store devDependencies: solid-js: - specifier: ^1.7.8 - version: 1.7.11 + specifier: ^1.8.14 + version: 1.8.14 vite-plugin-solid: specifier: ^2.8.0 - version: 2.8.0(solid-js@1.7.11)(vite@5.1.0) + version: 2.8.0(solid-js@1.8.14)(vite@5.1.0) packages/store: devDependencies: @@ -208,17 +208,17 @@ importers: version: link:../store vue-demi: specifier: ^0.14.6 - version: 0.14.6(@vue/composition-api@1.7.2)(vue@3.3.4) + version: 0.14.6(@vue/composition-api@1.7.2)(vue@3.4.15) devDependencies: '@vitejs/plugin-vue': specifier: ^5.0.2 - version: 5.0.2(vite@5.1.0)(vue@3.3.4) + version: 5.0.2(vite@5.1.0)(vue@3.4.15) '@vue/composition-api': specifier: ^1.7.2 - version: 1.7.2(vue@3.3.4) + version: 1.7.2(vue@3.4.15) vue: - specifier: ^3.3.4 - version: 3.3.4 + specifier: ^3.4.15 + version: 3.4.15(typescript@5.2.2) vue2: specifier: npm:vue@2.6 version: /vue@2.6.14 @@ -829,6 +829,7 @@ packages: /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} @@ -837,6 +838,7 @@ packages: /@babel/helper-validator-identifier@7.22.15: resolution: {integrity: sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} @@ -896,6 +898,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.22.17 + dev: true /@babel/parser@7.23.6: resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} @@ -1885,6 +1888,7 @@ packages: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.15 to-fast-properties: 2.0.0 + dev: true /@babel/types@7.23.6: resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} @@ -2908,24 +2912,24 @@ packages: p-map: 4.0.0 dev: true - /@solidjs/router@0.8.3(solid-js@1.7.11): + /@solidjs/router@0.8.3(solid-js@1.8.14): resolution: {integrity: sha512-oJuqQo10rVTiQYhe1qXIG1NyZIZ2YOwHnlLc8Xx+g/iJhFCJo1saLOIrD/Dkh2fpIaIny5ZMkz1cYYqoTYGJbg==} peerDependencies: solid-js: ^1.5.3 dependencies: - solid-js: 1.7.11 + solid-js: 1.8.14 dev: true - /@solidjs/testing-library@0.8.5(@solidjs/router@0.8.3)(solid-js@1.7.11): + /@solidjs/testing-library@0.8.5(@solidjs/router@0.8.3)(solid-js@1.8.14): resolution: {integrity: sha512-L9TowCoqdRQGB8ikODh9uHXrYTjCUZseVUG0tIVa836//qeSqXP4m0BKG66v9Zp1y1wRxok5qUW97GwrtEBMcw==} engines: {node: '>= 14'} peerDependencies: '@solidjs/router': '>=0.6.0' solid-js: '>=1.0.0' dependencies: - '@solidjs/router': 0.8.3(solid-js@1.7.11) + '@solidjs/router': 0.8.3(solid-js@1.8.14) '@testing-library/dom': 9.3.1 - solid-js: 1.7.11 + solid-js: 1.8.14 dev: true /@tanstack/config@0.4.2(@types/node@18.19.5)(esbuild@0.19.11)(rollup@4.9.4)(typescript@5.2.2)(vite@5.1.0): @@ -3026,7 +3030,7 @@ packages: '@testing-library/dom': 9.3.1 dev: true - /@testing-library/vue@7.0.0(@vue/compiler-sfc@3.4.15)(vue@3.3.4): + /@testing-library/vue@7.0.0(@vue/compiler-sfc@3.4.15)(vue@3.4.15): resolution: {integrity: sha512-JU/q93HGo2qdm1dCgWymkeQlfpC0/0/DBZ2nAHgEAsVZxX11xVIxT7gbXdI7HACQpUbsUWt1zABGU075Fzt9XQ==} engines: {node: '>=14'} peerDependencies: @@ -3036,8 +3040,8 @@ packages: '@babel/runtime': 7.22.15 '@testing-library/dom': 9.3.1 '@vue/compiler-sfc': 3.4.15 - '@vue/test-utils': 2.4.1(vue@3.3.4) - vue: 3.3.4 + '@vue/test-utils': 2.4.1(vue@3.4.15) + vue: 3.4.15(typescript@5.2.2) transitivePeerDependencies: - '@vue/server-renderer' dev: true @@ -3461,7 +3465,7 @@ packages: - supports-color dev: true - /@vitejs/plugin-vue@5.0.2(vite@5.1.0)(vue@3.3.4): + /@vitejs/plugin-vue@5.0.2(vite@5.1.0)(vue@3.4.15): resolution: {integrity: sha512-kEjJHrLb5ePBvjD0SPZwJlw1QTRcjjCA9sB5VyfonoXVBxTS7TMnqL6EkLt1Eu61RDeiuZ/WN9Hf6PxXhPI2uA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: @@ -3469,7 +3473,7 @@ packages: vue: ^3.2.25 dependencies: vite: 5.1.0(@types/node@18.19.5) - vue: 3.3.4 + vue: 3.4.15(typescript@5.2.2) dev: true /@vitest/coverage-istanbul@1.2.2(vitest@1.2.2): @@ -3549,14 +3553,6 @@ packages: path-browserify: 1.0.1 dev: true - /@vue/compiler-core@3.3.4: - resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} - dependencies: - '@babel/parser': 7.23.6 - '@vue/shared': 3.3.4 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - /@vue/compiler-core@3.4.15: resolution: {integrity: sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==} dependencies: @@ -3565,20 +3561,12 @@ packages: entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.0.2 - dev: true - - /@vue/compiler-dom@3.3.4: - resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} - dependencies: - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 /@vue/compiler-dom@3.4.15: resolution: {integrity: sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==} dependencies: '@vue/compiler-core': 3.4.15 '@vue/shared': 3.4.15 - dev: true /@vue/compiler-sfc@2.7.14: resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==} @@ -3588,20 +3576,6 @@ packages: source-map: 0.6.1 dev: true - /@vue/compiler-sfc@3.3.4: - resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} - dependencies: - '@babel/parser': 7.22.16 - '@vue/compiler-core': 3.3.4 - '@vue/compiler-dom': 3.3.4 - '@vue/compiler-ssr': 3.3.4 - '@vue/reactivity-transform': 3.3.4 - '@vue/shared': 3.3.4 - estree-walker: 2.0.2 - magic-string: 0.30.3 - postcss: 8.4.29 - source-map-js: 1.0.2 - /@vue/compiler-sfc@3.4.15: resolution: {integrity: sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==} dependencies: @@ -3612,29 +3586,21 @@ packages: '@vue/shared': 3.4.15 estree-walker: 2.0.2 magic-string: 0.30.5 - postcss: 8.4.33 + postcss: 8.4.35 source-map-js: 1.0.2 - dev: true - - /@vue/compiler-ssr@3.3.4: - resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} - dependencies: - '@vue/compiler-dom': 3.3.4 - '@vue/shared': 3.3.4 /@vue/compiler-ssr@3.4.15: resolution: {integrity: sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==} dependencies: '@vue/compiler-dom': 3.4.15 '@vue/shared': 3.4.15 - dev: true - /@vue/composition-api@1.7.2(vue@3.3.4): + /@vue/composition-api@1.7.2(vue@3.4.15): resolution: {integrity: sha512-M8jm9J/laYrYT02665HkZ5l2fWTK4dcVg3BsDHm/pfz+MjDYwX+9FUaZyGwEyXEDonQYRCo0H7aLgdklcIELjw==} peerDependencies: vue: '>= 2.5 < 2.7' dependencies: - vue: 3.3.4 + vue: 3.4.15(typescript@5.2.2) /@vue/language-core@1.8.27(typescript@5.2.2): resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} @@ -3646,8 +3612,8 @@ packages: dependencies: '@volar/language-core': 1.11.1 '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/compiler-dom': 3.4.15 + '@vue/shared': 3.4.15 computeds: 0.0.1 minimatch: 9.0.3 muggle-string: 0.3.1 @@ -3656,45 +3622,16 @@ packages: vue-template-compiler: 2.7.16 dev: true - /@vue/reactivity-transform@3.3.4: - resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} - dependencies: - '@babel/parser': 7.23.6 - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 - estree-walker: 2.0.2 - magic-string: 0.30.3 - - /@vue/reactivity@3.3.4: - resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} - dependencies: - '@vue/shared': 3.3.4 - /@vue/reactivity@3.4.15: resolution: {integrity: sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==} dependencies: '@vue/shared': 3.4.15 - dev: true - - /@vue/runtime-core@3.3.4: - resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} - dependencies: - '@vue/reactivity': 3.3.4 - '@vue/shared': 3.3.4 /@vue/runtime-core@3.4.15: resolution: {integrity: sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==} dependencies: '@vue/reactivity': 3.4.15 '@vue/shared': 3.4.15 - dev: true - - /@vue/runtime-dom@3.3.4: - resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} - dependencies: - '@vue/runtime-core': 3.3.4 - '@vue/shared': 3.3.4 - csstype: 3.1.2 /@vue/runtime-dom@3.4.15: resolution: {integrity: sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==} @@ -3702,16 +3639,6 @@ packages: '@vue/runtime-core': 3.4.15 '@vue/shared': 3.4.15 csstype: 3.1.3 - dev: true - - /@vue/server-renderer@3.3.4(vue@3.3.4): - resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} - peerDependencies: - vue: 3.3.4 - dependencies: - '@vue/compiler-ssr': 3.3.4 - '@vue/shared': 3.3.4 - vue: 3.3.4 /@vue/server-renderer@3.4.15(vue@3.4.15): resolution: {integrity: sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==} @@ -3721,16 +3648,11 @@ packages: '@vue/compiler-ssr': 3.4.15 '@vue/shared': 3.4.15 vue: 3.4.15(typescript@5.2.2) - dev: true - - /@vue/shared@3.3.4: - resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} /@vue/shared@3.4.15: resolution: {integrity: sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==} - dev: true - /@vue/test-utils@2.4.1(vue@3.3.4): + /@vue/test-utils@2.4.1(vue@3.4.15): resolution: {integrity: sha512-VO8nragneNzUZUah6kOjiFmD/gwRjUauG9DROh6oaOeFwX1cZRUNHhdeogE8635cISigXFTtGLUQWx5KCb0xeg==} peerDependencies: '@vue/server-renderer': ^3.0.1 @@ -3740,7 +3662,7 @@ packages: optional: true dependencies: js-beautify: 1.14.9 - vue: 3.3.4 + vue: 3.4.15(typescript@5.2.2) vue-component-type-helpers: 1.8.4 dev: true @@ -4955,10 +4877,10 @@ packages: /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: true /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: true /current-git-branch@1.1.0: resolution: {integrity: sha512-n5mwGZllLsFzxDPtTmadqGe4IIBPfqPbiIRX4xgFR9VK/Bx47U+94KiVkxSKAKN6/s43TlkztS2GZpgMKzwQ8A==} @@ -5316,7 +5238,6 @@ packages: /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - dev: true /err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} @@ -7755,18 +7676,11 @@ packages: vlq: 0.2.3 dev: true - /magic-string@0.30.3: - resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - /magic-string@0.30.5: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true /magicast@0.3.3: resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} @@ -8039,12 +7953,12 @@ packages: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: true /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: true /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -8864,6 +8778,7 @@ packages: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: true /postcss@8.4.33: resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} @@ -8881,7 +8796,6 @@ packages: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true /preact@10.19.5: resolution: {integrity: sha512-OPELkDmSVbKjbFqF9tgvOowiiQ9TmsJljIzXRyNE8nGiis94pwv1siF78rQkAP1Q1738Ce6pellRg/Ns/CtHqQ==} @@ -9592,11 +9506,6 @@ packages: seroval: 1.0.4 dev: true - /seroval@0.5.1: - resolution: {integrity: sha512-ZfhQVB59hmIauJG5Ydynupy8KHyr5imGNtdDhbZG68Ufh1Ynkv9KOYOAABf71oVbQxJ8VkWnMHAjEHE7fWkH5g==} - engines: {node: '>=10'} - dev: true - /seroval@1.0.4: resolution: {integrity: sha512-qQs/N+KfJu83rmszFQaTxcoJoPn6KNUruX4KmnmyD0oZkUoiNvJ1rpdYKDf4YHM05k+HOgCxa3yvf15QbVijGg==} engines: {node: '>=10'} @@ -9792,22 +9701,15 @@ packages: websocket-driver: 0.7.4 dev: true - /solid-js@1.7.11: - resolution: {integrity: sha512-JkuvsHt8jqy7USsy9xJtT18aF9r2pFO+GB8JQ2XGTvtF49rGTObB46iebD25sE3qVNvIbwglXOXdALnJq9IHtQ==} - dependencies: - csstype: 3.1.2 - seroval: 0.5.1 - dev: true - /solid-js@1.8.14: resolution: {integrity: sha512-kDfgHBm+ROVLDVuqaXh/jYz0ZVJ29TYfVsKsgDPtNcjoyaPtOvDX2l0tVnthjLdEXr7vDTYeqEYFfMkZakDsOQ==} dependencies: - csstype: 3.1.2 + csstype: 3.1.3 seroval: 1.0.4 seroval-plugins: 1.0.4(seroval@1.0.4) dev: true - /solid-refresh@0.5.3(solid-js@1.7.11): + /solid-refresh@0.5.3(solid-js@1.8.14): resolution: {integrity: sha512-Otg5it5sjOdZbQZJnvo99TEBAr6J7PQ5AubZLNU6szZzg3RQQ5MX04oteBIIGDs0y2Qv8aXKm9e44V8z+UnFdw==} peerDependencies: solid-js: ^1.3 @@ -9815,7 +9717,7 @@ packages: '@babel/generator': 7.22.15 '@babel/helper-module-imports': 7.22.15 '@babel/types': 7.23.6 - solid-js: 1.7.11 + solid-js: 1.8.14 dev: true /source-map-js@1.0.2: @@ -10558,7 +10460,6 @@ packages: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} hasBin: true - dev: true /typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} @@ -10797,7 +10698,7 @@ packages: vite: 5.1.0(@types/node@18.19.5) dev: true - /vite-plugin-solid@2.8.0(solid-js@1.7.11)(vite@5.1.0): + /vite-plugin-solid@2.8.0(solid-js@1.8.14)(vite@5.1.0): resolution: {integrity: sha512-n5FAm7ZmTl94VWUoiJCgG7bouF2NlC9CA1wY/qbVnkFbYDWk++bFWyNoU48aLJ+lMtzNeYzJypJXOHzFKxL9xA==} peerDependencies: solid-js: ^1.7.2 @@ -10808,8 +10709,8 @@ packages: '@types/babel__core': 7.20.5 babel-preset-solid: 1.8.9(@babel/core@7.23.7) merge-anything: 5.1.7 - solid-js: 1.7.11 - solid-refresh: 0.5.3(solid-js@1.7.11) + solid-js: 1.8.14 + solid-refresh: 0.5.3(solid-js@1.8.14) vite: 5.1.0(@types/node@18.19.5) vitefu: 0.2.5(vite@5.1.0) transitivePeerDependencies: @@ -10968,7 +10869,7 @@ packages: resolution: {integrity: sha512-6bnLkn8O0JJyiFSIF0EfCogzeqNXpnjJ0vW/SZzNHfe6sPx30lTtTXlE5TFs2qhJlAtDFybStVNpL73cPe3OMQ==} dev: true - /vue-demi@0.14.6(@vue/composition-api@1.7.2)(vue@3.3.4): + /vue-demi@0.14.6(@vue/composition-api@1.7.2)(vue@3.4.15): resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==} engines: {node: '>=12'} hasBin: true @@ -10980,8 +10881,8 @@ packages: '@vue/composition-api': optional: true dependencies: - '@vue/composition-api': 1.7.2(vue@3.3.4) - vue: 3.3.4 + '@vue/composition-api': 1.7.2(vue@3.4.15) + vue: 3.4.15(typescript@5.2.2) dev: false /vue-template-compiler@2.7.16: @@ -11014,15 +10915,6 @@ packages: csstype: 3.1.2 dev: true - /vue@3.3.4: - resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} - dependencies: - '@vue/compiler-dom': 3.3.4 - '@vue/compiler-sfc': 3.3.4 - '@vue/runtime-dom': 3.3.4 - '@vue/server-renderer': 3.3.4(vue@3.3.4) - '@vue/shared': 3.3.4 - /vue@3.4.15(typescript@5.2.2): resolution: {integrity: sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==} peerDependencies: @@ -11037,7 +10929,6 @@ packages: '@vue/server-renderer': 3.4.15(vue@3.4.15) '@vue/shared': 3.4.15 typescript: 5.2.2 - dev: true /w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} From de55814397987a128c99cfff067930db3cc7a0a1 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 26 Feb 2024 14:48:48 -0800 Subject: [PATCH 20/81] chore: migrate from forEach to for of loop --- packages/store/src/derived.ts | 16 +++++++++------- packages/store/src/store.ts | 6 +++--- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 2731974..9e22878 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -51,22 +51,22 @@ export class Derived { prevDerivesForStore.add(dep) storeToDerived.set(store, prevDerivesForStore) } - deps.forEach((dep) => { + for (const dep of deps) { if (dep instanceof Derived) { derivedToStore.set(dep, dep.rootStores) - dep.rootStores.forEach((store) => { + for (const store of dep.rootStores) { this.rootStores.add(store) updateStoreToDerived(store, dep) - }) + } } else if (dep instanceof Store) { this.rootStores.add(dep) updateStoreToDerived(dep, this as Derived) } - }) + } let __depsThatHaveWrittenThisTick: Deps = [] - deps.forEach((dep) => { + for (const dep of deps) { const isDepAStore = dep instanceof Store let relatedLinkedDerivedVals: null | Set> = null @@ -92,7 +92,7 @@ export class Derived { }) this._subscriptions.push(unsub) - }) + } } get state() { @@ -100,7 +100,9 @@ export class Derived { } cleanup = () => { - this._subscriptions.forEach((cleanup) => cleanup()) + for (const cleanup of this._subscriptions) { + cleanup() + } }; [Symbol.dispose]() { diff --git a/packages/store/src/store.ts b/packages/store/src/store.ts index 216918c..5674496 100644 --- a/packages/store/src/store.ts +++ b/packages/store/src/store.ts @@ -52,10 +52,10 @@ export class Store< _flush = () => { if (this._batching) return const flushId = ++this._flushing - this.listeners.forEach((listener) => { - if (this._flushing !== flushId) return + for (const listener of this.listeners) { + if (this._flushing !== flushId) continue listener() - }) + } } batch = (cb: () => void) => { From fa65a7e2d61e1dce429c4a00e271066fe28355bc Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 20:34:56 +0000 Subject: [PATCH 21/81] ci: apply automated fixes --- packages/store/src/derived.ts | 2 +- packages/store/src/effect.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 10ffbe0..5aeda6b 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -105,7 +105,7 @@ export class Derived { } }; - [(Symbol as never as {readonly dispose: unique symbol}).dispose]() { + [(Symbol as never as { readonly dispose: unique symbol }).dispose]() { this.cleanup() } diff --git a/packages/store/src/effect.ts b/packages/store/src/effect.ts index c91446b..f721c37 100644 --- a/packages/store/src/effect.ts +++ b/packages/store/src/effect.ts @@ -16,7 +16,7 @@ export class Effect { this._derived.cleanup() } - [(Symbol as never as {readonly dispose: unique symbol}).dispose]() { + [(Symbol as never as { readonly dispose: unique symbol }).dispose]() { this.cleanup() } } From 357a301c82d255289e86e37164ee7a1b2aef9bb5 Mon Sep 17 00:00:00 2001 From: Zain Wania Date: Sun, 29 Sep 2024 01:13:18 -0400 Subject: [PATCH 22/81] improve Vue performance (#122) --- package.json | 2 +- packages/store/package.json | 4 +- packages/store/tests/derived.bench.ts | 6 +- pnpm-lock.yaml | 1197 ++++++++++++++++++------- 4 files changed, 898 insertions(+), 311 deletions(-) diff --git a/package.json b/package.json index e44a17f..e091c86 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,6 @@ "typescript53": "npm:typescript@5.3", "vite": "^5.1.0", "vitest": "^2.0.5", - "vue": "^3.4.37" + "vue": "^3.5.9" } } diff --git a/packages/store/package.json b/packages/store/package.json index 1966e2e..eaabeb5 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -58,8 +58,8 @@ ], "devDependencies": { "@angular/core": "^17.3.12", - "solid-js": "^1.8.20", "@preact/signals": "^1.3.0", - "vue": "^3.4.37" + "solid-js": "^1.8.20", + "vue": "^3.5.10" } } diff --git a/packages/store/tests/derived.bench.ts b/packages/store/tests/derived.bench.ts index 3ab04e7..db65890 100644 --- a/packages/store/tests/derived.bench.ts +++ b/packages/store/tests/derived.bench.ts @@ -1,6 +1,6 @@ /* istanbul ignore file -- @preserve */ import { bench, describe } from 'vitest' -import { ref, computed as vueComputed, watch } from 'vue' +import { shallowRef, computed as vueComputed, watchEffect } from 'vue' import { createEffect, createMemo, createSignal } from 'solid-js' import { computed as preactComputed, @@ -45,7 +45,7 @@ describe('Derived', () => { }) bench('Vue', () => { - const a = ref(1) + const a = shallowRef(1) const b = vueComputed(() => a.value) const c = vueComputed(() => a.value) const d = vueComputed(() => b.value) @@ -53,7 +53,7 @@ describe('Derived', () => { const f = vueComputed(() => c.value) const g = vueComputed(() => d.value + e.value + f.value) - watch(g, () => { + watchEffect(() => { noop(g.value) }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c724f5..4cb81a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,7 +16,7 @@ importers: version: 0.8.9(solid-js@1.8.20) '@tanstack/config': specifier: ^0.11.2 - version: 0.11.2(@types/node@18.19.42)(esbuild@0.21.5)(eslint@8.57.0)(rollup@4.19.1)(typescript@5.4.2)(vite@5.4.0(@types/node@18.19.42)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) + version: 0.11.2(@types/node@18.19.42)(esbuild@0.21.5)(eslint@8.57.0)(rollup@4.22.5)(typescript@5.4.2)(vite@5.4.0(@types/node@18.19.42)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) '@testing-library/jest-dom': specifier: ^6.4.8 version: 6.4.8 @@ -28,7 +28,7 @@ importers: version: 14.5.2(@testing-library/dom@10.4.0) '@testing-library/vue': specifier: ^8.1.0 - version: 8.1.0(@vue/compiler-sfc@3.4.37)(vue@3.4.37(typescript@5.4.2)) + version: 8.1.0(@vue/compiler-sfc@3.5.10)(vue@3.5.9(typescript@5.4.2)) '@types/node': specifier: ^18.19.3 version: 18.19.42 @@ -105,8 +105,8 @@ importers: specifier: ^2.0.5 version: 2.0.5(@types/node@18.19.42)(jsdom@24.1.1)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) vue: - specifier: ^3.4.37 - version: 3.4.37(typescript@5.4.2) + specifier: ^3.5.9 + version: 3.5.9(typescript@5.4.2) packages/angular-store: dependencies: @@ -119,7 +119,7 @@ importers: devDependencies: '@analogjs/vite-plugin-angular': specifier: ^1.7.1 - version: 1.7.1(@angular-devkit/build-angular@18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(@types/node@20.14.13)(chokidar@3.6.0)(ng-packagr@17.3.0(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(tslib@2.6.3)(typescript@5.4.2))(typescript@5.4.2))(@ngtools/webpack@18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(typescript@5.4.2)(webpack@5.92.1(esbuild@0.21.5))) + version: 1.7.1(@angular-devkit/build-angular@18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(@types/node@22.7.4)(chokidar@3.6.0)(ng-packagr@17.3.0(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(tslib@2.6.3)(typescript@5.4.2))(typescript@5.4.2))(@ngtools/webpack@18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(typescript@5.4.2)(webpack@5.92.1(esbuild@0.21.5))) '@angular/common': specifier: ^17.3.12 version: 17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1) @@ -165,7 +165,7 @@ importers: version: 0.0.6 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) + version: 4.3.1(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) packages/solid-store: dependencies: @@ -178,7 +178,7 @@ importers: version: 1.8.20 vite-plugin-solid: specifier: ^2.10.2 - version: 2.10.2(@testing-library/jest-dom@6.4.8)(solid-js@1.8.20)(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) + version: 2.10.2(@testing-library/jest-dom@6.4.8)(solid-js@1.8.20)(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) packages/store: devDependencies: @@ -192,8 +192,8 @@ importers: specifier: ^1.8.20 version: 1.8.20 vue: - specifier: ^3.4.37 - version: 3.4.37(typescript@5.4.2) + specifier: ^3.5.10 + version: 3.5.10(typescript@5.4.2) packages/svelte-store: dependencies: @@ -206,10 +206,10 @@ importers: version: 2.3.3(svelte@5.0.0-next.216)(typescript@5.4.2) '@sveltejs/vite-plugin-svelte': specifier: ^4.0.0-next.6 - version: 4.0.0-next.6(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) + version: 4.0.0-next.6(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) '@testing-library/svelte': specifier: ^5.2.1 - version: 5.2.1(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))(vitest@2.0.5(@types/node@20.14.13)(jsdom@24.1.1)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) + version: 5.2.1(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))(vitest@2.0.5(@types/node@22.7.4)(jsdom@24.1.1)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) eslint-plugin-svelte: specifier: ^2.43.0 version: 2.43.0(eslint@8.57.0)(svelte@5.0.0-next.216) @@ -231,7 +231,7 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: ^5.1.2 - version: 5.1.2(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))(vue@3.4.37(typescript@5.4.2)) + version: 5.1.2(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))(vue@3.4.37(typescript@5.4.2)) '@vue/composition-api': specifier: ^1.7.2 version: 1.7.2(vue@3.4.37(typescript@5.4.2)) @@ -406,6 +406,10 @@ packages: resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.25.4': + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} + engines: {node: '>=6.9.0'} + '@babel/core@7.23.9': resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} engines: {node: '>=6.9.0'} @@ -426,6 +430,10 @@ packages: resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.25.6': + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.24.7': resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} @@ -438,8 +446,8 @@ packages: resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.25.0': - resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} + '@babel/helper-create-class-features-plugin@7.25.4': + resolution: {integrity: sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -529,6 +537,10 @@ packages: resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.25.6': + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} @@ -538,6 +550,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3': resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==} engines: {node: '>=6.9.0'} @@ -594,8 +611,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.24.7': - resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} + '@babel/plugin-syntax-import-assertions@7.25.6': + resolution: {integrity: sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -606,6 +623,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-attributes@7.25.6': + resolution: {integrity: sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4': resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -700,8 +723,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.24.7': - resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} + '@babel/plugin-transform-class-properties@7.25.4': + resolution: {integrity: sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -712,8 +735,8 @@ packages: peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.25.0': - resolution: {integrity: sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==} + '@babel/plugin-transform-classes@7.25.4': + resolution: {integrity: sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -874,8 +897,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.24.7': - resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} + '@babel/plugin-transform-private-methods@7.25.4': + resolution: {integrity: sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -970,8 +993,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.24.7': - resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} + '@babel/plugin-transform-unicode-sets-regex@7.25.4': + resolution: {integrity: sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1006,10 +1029,18 @@ packages: resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.6': + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.25.2': resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} engines: {node: '>=6.9.0'} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} + '@commitlint/parse@19.0.3': resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} engines: {node: '>=v18'} @@ -1377,12 +1408,12 @@ packages: resolution: {integrity: sha512-7vsXSfxtrrbwMTirfaKwPcjqJy7pzeuF/bP62yo1NQrRJ5HjmMlrhZml/Ljm9ODc1RnbhJlTeSnCkjtFddKjwA==} engines: {node: '>=18'} - '@inquirer/figures@1.0.5': - resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} + '@inquirer/figures@1.0.6': + resolution: {integrity: sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==} engines: {node: '>=18'} - '@inquirer/type@1.5.1': - resolution: {integrity: sha512-m3YgGQlKNS0BM+8AFiJkCsTqHEFCWn6s/Rqye3mYwvqY6LdfUv12eSwbsgNzrYyrLXiy7IrrjDLPysaSBwEfhw==} + '@inquirer/type@1.5.5': + resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} engines: {node: '>=18'} '@isaacs/cliui@8.0.2': @@ -1424,8 +1455,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/json-pack@1.0.4': - resolution: {integrity: sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==} + '@jsonjoy.com/json-pack@1.1.0': + resolution: {integrity: sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -1661,6 +1692,11 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.22.5': + resolution: {integrity: sha512-SU5cvamg0Eyu/F+kLeMXS7GoahL+OoizlclVFX3l5Ql6yNlywJJ0OuqTzUx0v+aHhPHEB/56CT06GQrRrGNYww==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.18.0': resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} cpu: [arm64] @@ -1671,6 +1707,11 @@ packages: cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.22.5': + resolution: {integrity: sha512-S4pit5BP6E5R5C8S6tgU/drvgjtYW76FBuG6+ibG3tMvlD1h9LHVF9KmlmaUBQ8Obou7hEyS+0w+IR/VtxwNMQ==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.18.0': resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} cpu: [arm64] @@ -1681,6 +1722,11 @@ packages: cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.22.5': + resolution: {integrity: sha512-250ZGg4ipTL0TGvLlfACkIxS9+KLtIbn7BCZjsZj88zSg2Lvu3Xdw6dhAhfe/FjjXPVNCtcSp+WZjVsD3a/Zlw==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.18.0': resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} cpu: [x64] @@ -1691,6 +1737,11 @@ packages: cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.22.5': + resolution: {integrity: sha512-D8brJEFg5D+QxFcW6jYANu+Rr9SlKtTenmsX5hOSzNYVrK5oLAEMTUgKWYJP+wdKyCdeSwnapLsn+OVRFycuQg==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} cpu: [arm] @@ -1701,6 +1752,11 @@ packages: cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.22.5': + resolution: {integrity: sha512-PNqXYmdNFyWNg0ma5LdY8wP+eQfdvyaBAojAXgO7/gs0Q/6TQJVXAXe8gwW9URjbS0YAammur0fynYGiWsKlXw==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.18.0': resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} cpu: [arm] @@ -1711,6 +1767,11 @@ packages: cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.22.5': + resolution: {integrity: sha512-kSSCZOKz3HqlrEuwKd9TYv7vxPYD77vHSUvM2y0YaTGnFc8AdI5TTQRrM1yIp3tXCKrSL9A7JLoILjtad5t8pQ==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.18.0': resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} cpu: [arm64] @@ -1721,6 +1782,11 @@ packages: cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.22.5': + resolution: {integrity: sha512-oTXQeJHRbOnwRnRffb6bmqmUugz0glXaPyspp4gbQOPVApdpRrY/j7KP3lr7M8kTfQTyrBUzFjj5EuHAhqH4/w==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.18.0': resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} cpu: [arm64] @@ -1731,6 +1797,11 @@ packages: cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.22.5': + resolution: {integrity: sha512-qnOTIIs6tIGFKCHdhYitgC2XQ2X25InIbZFor5wh+mALH84qnFHvc+vmWUpyX97B0hNvwNUL4B+MB8vJvH65Fw==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} cpu: [ppc64] @@ -1741,6 +1812,11 @@ packages: cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.22.5': + resolution: {integrity: sha512-TMYu+DUdNlgBXING13rHSfUc3Ky5nLPbWs4bFnT+R6Vu3OvXkTkixvvBKk8uO4MT5Ab6lC3U7x8S8El2q5o56w==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.18.0': resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} cpu: [riscv64] @@ -1751,6 +1827,11 @@ packages: cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.22.5': + resolution: {integrity: sha512-PTQq1Kz22ZRvuhr3uURH+U/Q/a0pbxJoICGSprNLAoBEkyD3Sh9qP5I0Asn0y0wejXQBbsVMRZRxlbGFD9OK4A==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.18.0': resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} cpu: [s390x] @@ -1761,6 +1842,11 @@ packages: cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.22.5': + resolution: {integrity: sha512-bR5nCojtpuMss6TDEmf/jnBnzlo+6n1UhgwqUvRoe4VIotC7FG1IKkyJbwsT7JDsF2jxR+NTnuOwiGv0hLyDoQ==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.18.0': resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} cpu: [x64] @@ -1771,6 +1857,11 @@ packages: cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.22.5': + resolution: {integrity: sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.18.0': resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} cpu: [x64] @@ -1781,6 +1872,11 @@ packages: cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.22.5': + resolution: {integrity: sha512-uBa2e28ohzNNwjr6Uxm4XyaA1M/8aTgfF2T7UIlElLaeXkgpmIJ2EitVNQxjO9xLLLy60YqAgKn/AqSpCUkE9g==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.18.0': resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} cpu: [arm64] @@ -1791,6 +1887,11 @@ packages: cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.22.5': + resolution: {integrity: sha512-RXT8S1HP8AFN/Kr3tg4fuYrNxZ/pZf1HemC5Tsddc6HzgGnJm0+Lh5rAHJkDuW3StI0ynNXukidROMXYl6ew8w==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.18.0': resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} cpu: [ia32] @@ -1801,6 +1902,11 @@ packages: cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.22.5': + resolution: {integrity: sha512-ElTYOh50InL8kzyUD6XsnPit7jYCKrphmddKAe1/Ytt74apOxDq5YEcbsiKs0fR3vff3jEneMM+3I7jbqaMyBg==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.18.0': resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} cpu: [x64] @@ -1811,6 +1917,11 @@ packages: cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.22.5': + resolution: {integrity: sha512-+lvL/4mQxSV8MukpkKyyvfwhH266COcWlXE/1qxwN08ajovta3459zrjLghYMgDerlzNwLAcFpvU+WWE5y6nAQ==} + cpu: [x64] + os: [win32] + '@rollup/wasm-node@4.19.1': resolution: {integrity: sha512-G90QnusWbCqaHB0BRgGb5f1FIs7W+0bh/kaoBMZNS30VzCcGBEzbpL0UIDQZYPkbKnP5GHZ9s+HrWuny3IAGIw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1997,11 +2108,20 @@ packages: '@types/eslint@9.6.0': resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/express-serve-static-core@4.19.5': - resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express-serve-static-core@5.0.0': + resolution: {integrity: sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==} '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} @@ -2012,8 +2132,8 @@ packages: '@types/http-errors@2.0.4': resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - '@types/http-proxy@1.17.14': - resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + '@types/http-proxy@1.17.15': + resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -2030,8 +2150,11 @@ packages: '@types/node@18.19.42': resolution: {integrity: sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==} - '@types/node@20.14.13': - resolution: {integrity: sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==} + '@types/node@20.16.10': + resolution: {integrity: sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==} + + '@types/node@22.7.4': + resolution: {integrity: sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==} '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -2039,8 +2162,8 @@ packages: '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} - '@types/qs@6.9.15': - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + '@types/qs@6.9.16': + resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -2241,18 +2364,42 @@ packages: '@vue/compiler-core@3.4.37': resolution: {integrity: sha512-ZDDT/KiLKuCRXyzWecNzC5vTcubGz4LECAtfGPENpo0nrmqJHwuWtRLxk/Sb9RAKtR9iFflFycbkjkY+W/PZUQ==} + '@vue/compiler-core@3.5.10': + resolution: {integrity: sha512-iXWlk+Cg/ag7gLvY0SfVucU8Kh2CjysYZjhhP70w9qI4MvSox4frrP+vDGvtQuzIcgD8+sxM6lZvCtdxGunTAA==} + + '@vue/compiler-core@3.5.9': + resolution: {integrity: sha512-KE1sCdwqSKq0CQ/ltg3XnlMTKeinjegIkuFsuq9DKvNPmqLGdmI51ChZdGBBRXIvEYTLm8X/JxOuBQ1HqF/+PA==} + '@vue/compiler-dom@3.4.37': resolution: {integrity: sha512-rIiSmL3YrntvgYV84rekAtU/xfogMUJIclUMeIKEtVBFngOL3IeZHhsH3UaFEgB5iFGpj6IW+8YuM/2Up+vVag==} + '@vue/compiler-dom@3.5.10': + resolution: {integrity: sha512-DyxHC6qPcktwYGKOIy3XqnHRrrXyWR2u91AjP+nLkADko380srsC2DC3s7Y1Rk6YfOlxOlvEQKa9XXmLI+W4ZA==} + + '@vue/compiler-dom@3.5.9': + resolution: {integrity: sha512-gEAURwPo902AsJF50vl59VaWR+Cx6cX9SoqLYHu1jq9hDbmQlXvpZyYNIIbxa2JTJ+FD/oBQweVUwuTQv79KTg==} + '@vue/compiler-sfc@2.7.16': resolution: {integrity: sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==} '@vue/compiler-sfc@3.4.37': resolution: {integrity: sha512-vCfetdas40Wk9aK/WWf8XcVESffsbNkBQwS5t13Y/PcfqKfIwJX2gF+82th6dOpnpbptNMlMjAny80li7TaCIg==} + '@vue/compiler-sfc@3.5.10': + resolution: {integrity: sha512-to8E1BgpakV7224ZCm8gz1ZRSyjNCAWEplwFMWKlzCdP9DkMKhRRwt0WkCjY7jkzi/Vz3xgbpeig5Pnbly4Tow==} + + '@vue/compiler-sfc@3.5.9': + resolution: {integrity: sha512-kp9qawcTXakYm0TN6YAwH24IurSywoXh4fWhRbLu0at4UVyo994bhEzJlQn82eiyqtut4GjkQodSfn8drFbpZQ==} + '@vue/compiler-ssr@3.4.37': resolution: {integrity: sha512-TyAgYBWrHlFrt4qpdACh8e9Ms6C/AZQ6A6xLJaWrCL8GCX5DxMzxyeFAEMfU/VFr4tylHm+a2NpfJpcd7+20XA==} + '@vue/compiler-ssr@3.5.10': + resolution: {integrity: sha512-hxP4Y3KImqdtyUKXDRSxKSRkSm1H9fCvhojEYrnaoWhE4w/y8vwWhnosJoPPe2AXm5sU7CSbYYAgkt2ZPhDz+A==} + + '@vue/compiler-ssr@3.5.9': + resolution: {integrity: sha512-fb1g2mQv32QzIei76rlXRTz08Grw+ZzBXSQfHo4StGFutm/flyebw3dGJkexKwcU3GjX9s5fIGjEv/cjO8j8Yw==} + '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -2272,20 +2419,54 @@ packages: '@vue/reactivity@3.4.37': resolution: {integrity: sha512-UmdKXGx0BZ5kkxPqQr3PK3tElz6adTey4307NzZ3whZu19i5VavYal7u2FfOmAzlcDVgE8+X0HZ2LxLb/jgbYw==} + '@vue/reactivity@3.5.10': + resolution: {integrity: sha512-kW08v06F6xPSHhid9DJ9YjOGmwNDOsJJQk0ax21wKaUYzzuJGEuoKNU2Ujux8FLMrP7CFJJKsHhXN9l2WOVi2g==} + + '@vue/reactivity@3.5.9': + resolution: {integrity: sha512-88ApgNZ6yPYpyYkTfXzcbWk6O8+LrPRIpa/U4AdeTzpfRUO+EUt5jemnTBVSlAUNmlYY96xa5feUNEq+BouLog==} + '@vue/runtime-core@3.4.37': resolution: {integrity: sha512-MNjrVoLV/sirHZoD7QAilU1Ifs7m/KJv4/84QVbE6nyAZGQNVOa1HGxaOzp9YqCG+GpLt1hNDC4RbH+KtanV7w==} + '@vue/runtime-core@3.5.10': + resolution: {integrity: sha512-9Q86I5Qq3swSkFfzrZ+iqEy7Vla325M7S7xc1NwKnRm/qoi1Dauz0rT6mTMmscqx4qz0EDJ1wjB+A36k7rl8mA==} + + '@vue/runtime-core@3.5.9': + resolution: {integrity: sha512-YAeP0zNkjSl5mEc1NxOg9qoAhLNbREElHAhfYbMXT57oF0ixehEEJWBhg2uvVxslCGh23JhpEAyMvJrJHW9WGg==} + '@vue/runtime-dom@3.4.37': resolution: {integrity: sha512-Mg2EwgGZqtwKrqdL/FKMF2NEaOHuH+Ks9TQn3DHKyX//hQTYOun+7Tqp1eo0P4Ds+SjltZshOSRq6VsU0baaNg==} + '@vue/runtime-dom@3.5.10': + resolution: {integrity: sha512-t3x7ht5qF8ZRi1H4fZqFzyY2j+GTMTDxRheT+i8M9Ph0oepUxoadmbwlFwMoW7RYCpNQLpP2Yx3feKs+fyBdpA==} + + '@vue/runtime-dom@3.5.9': + resolution: {integrity: sha512-5Oq/5oenpB9lw94moKvOHqBDEaMSyDmcu2HS8AtAT6/pwdo/t9fR9aVtLh6FzYGGqZR9yRfoHAN6P7goblq1aA==} + '@vue/server-renderer@3.4.37': resolution: {integrity: sha512-jZ5FAHDR2KBq2FsRUJW6GKDOAG9lUTX8aBEGq4Vf6B/35I9fPce66BornuwmqmKgfiSlecwuOb6oeoamYMohkg==} peerDependencies: vue: 3.4.37 + '@vue/server-renderer@3.5.10': + resolution: {integrity: sha512-IVE97tt2kGKwHNq9yVO0xdh1IvYfZCShvDSy46JIh5OQxP1/EXSpoDqetVmyIzL7CYOWnnmMkVqd7YK2QSWkdw==} + peerDependencies: + vue: 3.5.10 + + '@vue/server-renderer@3.5.9': + resolution: {integrity: sha512-tbuUsZfMWGazR9LXLNiiDSTwkO8K9sLyR70diY+FbQmKmh7236PPz4jkTxymelV8D89IJUGtbfe4VdmpHkmuxg==} + peerDependencies: + vue: 3.5.9 + '@vue/shared@3.4.37': resolution: {integrity: sha512-nIh8P2fc3DflG8+5Uw8PT/1i17ccFn0xxN/5oE9RfV5SVnd7G0XEFRwakrnNFE/jlS95fpGXDVG5zDETS26nmg==} + '@vue/shared@3.5.10': + resolution: {integrity: sha512-VkkBhU97Ki+XJ0xvl4C9YJsIZ2uIlQ7HqPpZOS3m9VCvmROPaChZU6DexdMJqvz9tbgG+4EtFVrSuailUq5KGQ==} + + '@vue/shared@3.5.9': + resolution: {integrity: sha512-8wiT/m0mnsLhTME0mPgc57jv+4TipRBSAAmheUdYgiOaO6AobZPNOmm87ub4np65VVDgLcWxc+Edc++5Wyz1uA==} + '@vue/test-utils@2.4.6': resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} @@ -2564,8 +2745,8 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.10.4: - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -2601,8 +2782,8 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} bonjour-service@1.2.1: @@ -2626,6 +2807,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.24.0: + resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-crc32@1.0.0: resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} engines: {node: '>=8.0.0'} @@ -2671,6 +2857,9 @@ packages: caniuse-lite@1.0.30001645: resolution: {integrity: sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==} + caniuse-lite@1.0.30001664: + resolution: {integrity: sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==} + chai@5.1.1: resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} engines: {node: '>=12'} @@ -2852,8 +3041,8 @@ packages: peerDependencies: webpack: ^5.1.0 - core-js-compat@3.37.1: - resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + core-js-compat@3.38.1: + resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -2946,6 +3135,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -3101,6 +3299,9 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + electron-to-chromium@1.5.29: + resolution: {integrity: sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==} + electron-to-chromium@1.5.4: resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} @@ -3118,6 +3319,10 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -3194,6 +3399,10 @@ packages: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -3391,8 +3600,8 @@ packages: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + express@4.21.0: + resolution: {integrity: sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==} engines: {node: '>= 0.10.0'} extend@3.0.2: @@ -3433,8 +3642,8 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} find-cache-dir@3.3.2: @@ -3489,6 +3698,15 @@ packages: debug: optional: true + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -3785,6 +4003,10 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + image-size@0.5.5: resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} engines: {node: '>=0.10.0'} @@ -4204,8 +4426,8 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - launch-editor@2.8.0: - resolution: {integrity: sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==} + launch-editor@2.9.1: + resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==} less-loader@12.2.0: resolution: {integrity: sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==} @@ -4369,8 +4591,8 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - memfs@4.11.0: - resolution: {integrity: sha512-+6kz90/YQoZuHvg3rn1CGPMZfEMaU5xe7xIavZMNiom2RNesiI8S37p9O9n+PlIUnUgretjLdM6HnqpZYl3X2g==} + memfs@4.12.0: + resolution: {integrity: sha512-74wDsex5tQDSClVkeK1vtxqYCAgCoXxx+K4NSHzgU/muYVYByFqa+0RnrPO9NM6naWm1+G9JmZ0p6QHhXmeYfA==} engines: {node: '>= 4.0.0'} meow@12.1.1: @@ -4381,8 +4603,8 @@ packages: resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} engines: {node: '>=12.13'} - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -4399,6 +4621,10 @@ packages: resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -4732,8 +4958,8 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} - ordered-binary@1.5.1: - resolution: {integrity: sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==} + ordered-binary@1.5.2: + resolution: {integrity: sha512-JTo+4+4Fw7FreyAvlSLjb1BBVaxEQAacmjD3jjuyPZclpbEghTvQZbXBb2qPd2LeIMxiHwXBZUcpmG2Gl/mDEA==} p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} @@ -4860,8 +5086,8 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-to-regexp@0.1.10: + resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -4881,6 +5107,9 @@ packages: picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -4979,6 +5208,10 @@ packages: resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} engines: {node: '>=4'} + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -4990,6 +5223,10 @@ packages: resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} engines: {node: ^10 || ^12 || >=14} + 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==} @@ -5060,8 +5297,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} querystringify@2.2.0: @@ -5122,8 +5359,8 @@ packages: reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} engines: {node: '>=4'} regenerate@1.4.2: @@ -5221,6 +5458,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.22.5: + resolution: {integrity: sha512-WoinX7GeQOFMGznEcWA1WrTQCd/tpEbMkc3nuMs9BT0CPjMdSjPMTVClwWd4pgSQwJdP65SK9mTCNvItlr5o7w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} @@ -5332,8 +5574,8 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} serialize-javascript@6.0.2: @@ -5353,8 +5595,8 @@ packages: resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} engines: {node: '>= 0.8.0'} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} set-function-length@1.2.2: @@ -5483,6 +5725,10 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-loader@5.0.0: resolution: {integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==} engines: {node: '>= 18.12.0'} @@ -5914,20 +6160,23 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici@6.19.2: resolution: {integrity: sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==} engines: {node: '>=18.17'} - unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} - unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} engines: {node: '>=4'} unicode-property-aliases-ecmascript@2.1.0: @@ -5968,6 +6217,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -6170,6 +6425,22 @@ packages: typescript: optional: true + vue@3.5.10: + resolution: {integrity: sha512-Vy2kmJwHPlouC/tSnIgXVg03SG+9wSqT1xu1Vehc+ChsXsRd7jLkKgMltVEFOzUdBr3uFwBCG+41LJtfAcBRng==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vue@3.5.9: + resolution: {integrity: sha512-nHzQhZ5cjFKynAY2beAm7XtJ5C13VKAFTLTgRYXy+Id1KEKBeiK6hO2RcW1hUjdbHMadz1YzxyHgQigOC54wug==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -6389,9 +6660,9 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@analogjs/vite-plugin-angular@1.7.1(@angular-devkit/build-angular@18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(@types/node@20.14.13)(chokidar@3.6.0)(ng-packagr@17.3.0(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(tslib@2.6.3)(typescript@5.4.2))(typescript@5.4.2))(@ngtools/webpack@18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(typescript@5.4.2)(webpack@5.92.1(esbuild@0.21.5)))': + '@analogjs/vite-plugin-angular@1.7.1(@angular-devkit/build-angular@18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(@types/node@22.7.4)(chokidar@3.6.0)(ng-packagr@17.3.0(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(tslib@2.6.3)(typescript@5.4.2))(typescript@5.4.2))(@ngtools/webpack@18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(typescript@5.4.2)(webpack@5.92.1(esbuild@0.21.5)))': dependencies: - '@angular-devkit/build-angular': 18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(@types/node@20.14.13)(chokidar@3.6.0)(ng-packagr@17.3.0(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(tslib@2.6.3)(typescript@5.4.2))(typescript@5.4.2) + '@angular-devkit/build-angular': 18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(@types/node@22.7.4)(chokidar@3.6.0)(ng-packagr@17.3.0(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(tslib@2.6.3)(typescript@5.4.2))(typescript@5.4.2) '@ngtools/webpack': 18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(typescript@5.4.2)(webpack@5.92.1(esbuild@0.21.5)) ts-morph: 21.0.1 @@ -6402,13 +6673,13 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(@types/node@20.14.13)(chokidar@3.6.0)(ng-packagr@17.3.0(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(tslib@2.6.3)(typescript@5.4.2))(typescript@5.4.2)': + '@angular-devkit/build-angular@18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(@types/node@22.7.4)(chokidar@3.6.0)(ng-packagr@17.3.0(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(tslib@2.6.3)(typescript@5.4.2))(typescript@5.4.2)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1801.3(chokidar@3.6.0) '@angular-devkit/build-webpack': 0.1801.3(chokidar@3.6.0)(webpack-dev-server@5.0.4(webpack@5.92.1(esbuild@0.21.5)))(webpack@5.92.1(esbuild@0.21.5)) '@angular-devkit/core': 18.1.3(chokidar@3.6.0) - '@angular/build': 18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(@types/node@20.14.13)(chokidar@3.6.0)(less@4.2.0)(postcss@8.4.38)(terser@5.29.2)(typescript@5.4.2) + '@angular/build': 18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(@types/node@22.7.4)(chokidar@3.6.0)(less@4.2.0)(postcss@8.4.38)(terser@5.29.2)(typescript@5.4.2) '@angular/compiler-cli': 17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2) '@babel/core': 7.24.7 '@babel/generator': 7.24.7 @@ -6421,11 +6692,11 @@ snapshots: '@babel/runtime': 7.24.7 '@discoveryjs/json-ext': 0.5.7 '@ngtools/webpack': 18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(typescript@5.4.2)(webpack@5.92.1(esbuild@0.21.5)) - '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.3.2(@types/node@20.14.13)(less@4.2.0)(sass@1.77.6)(terser@5.29.2)) + '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.3.2(@types/node@22.7.4)(less@4.2.0)(sass@1.77.6)(terser@5.29.2)) ansi-colors: 4.1.3 autoprefixer: 10.4.19(postcss@8.4.38) babel-loader: 9.1.3(@babel/core@7.24.7)(webpack@5.92.1(esbuild@0.21.5)) - browserslist: 4.23.2 + browserslist: 4.24.0 copy-webpack-plugin: 12.0.2(webpack@5.92.1(esbuild@0.21.5)) critters: 0.0.24 css-loader: 7.1.2(webpack@5.92.1(esbuild@0.21.5)) @@ -6462,7 +6733,7 @@ snapshots: tslib: 2.6.3 typescript: 5.4.2 undici: 6.19.2 - vite: 5.3.2(@types/node@20.14.13)(less@4.2.0)(sass@1.77.6)(terser@5.29.2) + vite: 5.3.2(@types/node@22.7.4)(less@4.2.0)(sass@1.77.6)(terser@5.29.2) watchpack: 2.4.1 webpack: 5.92.1(esbuild@0.21.5) webpack-dev-middleware: 7.2.1(webpack@5.92.1(esbuild@0.21.5)) @@ -6510,7 +6781,7 @@ snapshots: optionalDependencies: chokidar: 3.6.0 - '@angular/build@18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(@types/node@20.14.13)(chokidar@3.6.0)(less@4.2.0)(postcss@8.4.38)(terser@5.29.2)(typescript@5.4.2)': + '@angular/build@18.1.3(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.2))(@types/node@22.7.4)(chokidar@3.6.0)(less@4.2.0)(postcss@8.4.38)(terser@5.29.2)(typescript@5.4.2)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1801.3(chokidar@3.6.0) @@ -6520,9 +6791,9 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.7 '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.24.7) '@inquirer/confirm': 3.1.11 - '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.3.2(@types/node@20.14.13)(less@4.2.0)(sass@1.77.6)(terser@5.29.2)) + '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.3.2(@types/node@22.7.4)(less@4.2.0)(sass@1.77.6)(terser@5.29.2)) ansi-colors: 4.1.3 - browserslist: 4.23.2 + browserslist: 4.24.0 critters: 0.0.24 esbuild: 0.21.5 fast-glob: 3.3.2 @@ -6539,7 +6810,7 @@ snapshots: semver: 7.6.2 typescript: 5.4.2 undici: 6.19.2 - vite: 5.3.2(@types/node@20.14.13)(less@4.2.0)(sass@1.77.6)(terser@5.29.2) + vite: 5.3.2(@types/node@22.7.4)(less@4.2.0)(sass@1.77.6)(terser@5.29.2) watchpack: 2.4.1 optionalDependencies: less: 4.2.0 @@ -6607,6 +6878,8 @@ snapshots: '@babel/compat-data@7.25.2': {} + '@babel/compat-data@7.25.4': {} + '@babel/core@7.23.9': dependencies: '@ampproject/remapping': 2.3.0 @@ -6631,16 +6904,16 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 + '@babel/generator': 7.24.7 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.7) - '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.3 + '@babel/helpers': 7.25.6 + '@babel/parser': 7.25.6 '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 convert-source-map: 2.0.0 - debug: 4.3.6 + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -6669,7 +6942,7 @@ snapshots: '@babel/generator@7.24.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -6681,14 +6954,21 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 + '@babel/generator@7.25.6': + dependencies: + '@babel/types': 7.25.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + '@babel/helper-annotate-as-pure@7.24.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -6700,7 +6980,7 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.24.7)': + '@babel/helper-create-class-features-plugin@7.25.4(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.24.7 @@ -6708,7 +6988,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.24.7 '@babel/helper-replace-supers': 7.25.0(@babel/core@7.24.7) '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -6725,7 +7005,7 @@ snapshots: '@babel/core': 7.24.7 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - debug: 4.3.6 + debug: 4.3.7 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -6733,18 +7013,18 @@ snapshots: '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@babel/helper-member-expression-to-functions@7.24.8': dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.18.6': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@babel/helper-module-imports@7.24.7': dependencies: @@ -6785,7 +7065,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.24.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@babel/helper-plugin-utils@7.24.8': {} @@ -6794,7 +7074,7 @@ snapshots: '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-wrap-function': 7.25.0 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -6803,7 +7083,7 @@ snapshots: '@babel/core': 7.24.7 '@babel/helper-member-expression-to-functions': 7.24.8 '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -6816,14 +7096,14 @@ snapshots: '@babel/helper-skip-transparent-expression-wrappers@7.24.7': dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@babel/helper-string-parser@7.24.8': {} @@ -6834,8 +7114,8 @@ snapshots: '@babel/helper-wrap-function@7.25.0': dependencies: '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -6844,6 +7124,11 @@ snapshots: '@babel/template': 7.25.0 '@babel/types': 7.25.2 + '@babel/helpers@7.25.6': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + '@babel/highlight@7.24.7': dependencies: '@babel/helper-validator-identifier': 7.24.7 @@ -6855,11 +7140,15 @@ snapshots: dependencies: '@babel/types': 7.25.2 + '@babel/parser@7.25.6': + dependencies: + '@babel/types': 7.25.6 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -6881,7 +7170,7 @@ snapshots: dependencies: '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -6914,7 +7203,7 @@ snapshots: '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-syntax-import-assertions@7.25.6(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 @@ -6924,6 +7213,11 @@ snapshots: '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 @@ -7019,10 +7313,10 @@ snapshots: '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-transform-class-properties@7.25.4(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.7) + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.24.7) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color @@ -7030,20 +7324,20 @@ snapshots: '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.7) + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.24.7) '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.0(@babel/core@7.24.7)': + '@babel/plugin-transform-classes@7.25.4(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-replace-supers': 7.25.0(@babel/core@7.24.7) - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -7103,7 +7397,7 @@ snapshots: '@babel/core': 7.24.7 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -7152,7 +7446,7 @@ snapshots: '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.7) '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -7223,10 +7517,10 @@ snapshots: '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-transform-private-methods@7.25.4(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.7) + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.24.7) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color @@ -7235,7 +7529,7 @@ snapshots: dependencies: '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.7) + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.24.7) '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7) transitivePeerDependencies: @@ -7273,7 +7567,7 @@ snapshots: '@babel/helper-module-imports': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.7) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.7) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.24.7) babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.7) semver: 6.3.1 transitivePeerDependencies: @@ -7324,7 +7618,7 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.7) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-transform-unicode-sets-regex@7.25.4(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.7) @@ -7332,7 +7626,7 @@ snapshots: '@babel/preset-env@7.24.7(@babel/core@7.24.7)': dependencies: - '@babel/compat-data': 7.25.2 + '@babel/compat-data': 7.25.4 '@babel/core': 7.24.7 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 @@ -7347,8 +7641,8 @@ snapshots: '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7) '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-import-assertions': 7.25.6(@babel/core@7.24.7) + '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.24.7) '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) @@ -7365,9 +7659,9 @@ snapshots: '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.24.7) - '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-class-properties': 7.25.4(@babel/core@7.24.7) '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-classes': 7.25.0(@babel/core@7.24.7) + '@babel/plugin-transform-classes': 7.25.4(@babel/core@7.24.7) '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.24.7) '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.24.7) @@ -7394,7 +7688,7 @@ snapshots: '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.24.7) '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-private-methods': 7.25.4(@babel/core@7.24.7) '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.24.7) @@ -7407,12 +7701,12 @@ snapshots: '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-sets-regex': 7.25.4(@babel/core@7.24.7) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.7) babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.7) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.7) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.24.7) babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.7) - core-js-compat: 3.37.1 + core-js-compat: 3.38.1 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -7421,7 +7715,7 @@ snapshots: dependencies: '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 esutils: 2.0.3 '@babel/regjsgen@0.8.0': {} @@ -7452,12 +7746,30 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.25.6': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.25.2': dependencies: '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@babel/types@7.25.6': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + '@commitlint/parse@19.0.3': dependencies: '@commitlint/types': 19.0.3 @@ -7765,27 +8077,27 @@ snapshots: '@inquirer/confirm@3.1.11': dependencies: '@inquirer/core': 8.2.4 - '@inquirer/type': 1.5.1 + '@inquirer/type': 1.5.5 '@inquirer/core@8.2.4': dependencies: - '@inquirer/figures': 1.0.5 - '@inquirer/type': 1.5.1 + '@inquirer/figures': 1.0.6 + '@inquirer/type': 1.5.5 '@types/mute-stream': 0.0.4 - '@types/node': 20.14.13 + '@types/node': 20.16.10 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 cli-spinners: 2.9.2 cli-width: 4.1.0 mute-stream: 1.0.0 - picocolors: 1.0.1 + picocolors: 1.1.0 signal-exit: 4.1.0 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - '@inquirer/figures@1.0.5': {} + '@inquirer/figures@1.0.6': {} - '@inquirer/type@1.5.1': + '@inquirer/type@1.5.5': dependencies: mute-stream: 1.0.0 @@ -7830,7 +8142,7 @@ snapshots: dependencies: tslib: 2.6.3 - '@jsonjoy.com/json-pack@1.0.4(tslib@2.6.3)': + '@jsonjoy.com/json-pack@1.1.0(tslib@2.6.3)': dependencies: '@jsonjoy.com/base64': 1.1.2(tslib@2.6.3) '@jsonjoy.com/util': 1.3.0(tslib@2.6.3) @@ -8027,102 +8339,158 @@ snapshots: optionalDependencies: rollup: 4.19.1 + '@rollup/pluginutils@5.1.0(rollup@4.22.5)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.22.5 + '@rollup/rollup-android-arm-eabi@4.18.0': optional: true '@rollup/rollup-android-arm-eabi@4.19.1': optional: true + '@rollup/rollup-android-arm-eabi@4.22.5': + optional: true + '@rollup/rollup-android-arm64@4.18.0': optional: true '@rollup/rollup-android-arm64@4.19.1': optional: true + '@rollup/rollup-android-arm64@4.22.5': + optional: true + '@rollup/rollup-darwin-arm64@4.18.0': optional: true '@rollup/rollup-darwin-arm64@4.19.1': optional: true + '@rollup/rollup-darwin-arm64@4.22.5': + optional: true + '@rollup/rollup-darwin-x64@4.18.0': optional: true '@rollup/rollup-darwin-x64@4.19.1': optional: true + '@rollup/rollup-darwin-x64@4.22.5': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': optional: true '@rollup/rollup-linux-arm-gnueabihf@4.19.1': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.22.5': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.18.0': optional: true '@rollup/rollup-linux-arm-musleabihf@4.19.1': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.22.5': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.18.0': optional: true '@rollup/rollup-linux-arm64-gnu@4.19.1': optional: true + '@rollup/rollup-linux-arm64-gnu@4.22.5': + optional: true + '@rollup/rollup-linux-arm64-musl@4.18.0': optional: true '@rollup/rollup-linux-arm64-musl@4.19.1': optional: true + '@rollup/rollup-linux-arm64-musl@4.22.5': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.19.1': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.22.5': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.18.0': optional: true '@rollup/rollup-linux-riscv64-gnu@4.19.1': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.22.5': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.18.0': optional: true '@rollup/rollup-linux-s390x-gnu@4.19.1': optional: true + '@rollup/rollup-linux-s390x-gnu@4.22.5': + optional: true + '@rollup/rollup-linux-x64-gnu@4.18.0': optional: true '@rollup/rollup-linux-x64-gnu@4.19.1': optional: true + '@rollup/rollup-linux-x64-gnu@4.22.5': + optional: true + '@rollup/rollup-linux-x64-musl@4.18.0': optional: true '@rollup/rollup-linux-x64-musl@4.19.1': optional: true + '@rollup/rollup-linux-x64-musl@4.22.5': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.18.0': optional: true '@rollup/rollup-win32-arm64-msvc@4.19.1': optional: true + '@rollup/rollup-win32-arm64-msvc@4.22.5': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.18.0': optional: true '@rollup/rollup-win32-ia32-msvc@4.19.1': optional: true + '@rollup/rollup-win32-ia32-msvc@4.22.5': + optional: true + '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true '@rollup/rollup-win32-x64-msvc@4.19.1': optional: true + '@rollup/rollup-win32-x64-msvc@4.22.5': + optional: true + '@rollup/wasm-node@4.19.1': dependencies: '@types/estree': 1.0.5 @@ -8201,29 +8569,29 @@ snapshots: transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@3.0.0-next.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)))(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))': + '@sveltejs/vite-plugin-svelte-inspector@3.0.0-next.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)))(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 4.0.0-next.6(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) + '@sveltejs/vite-plugin-svelte': 4.0.0-next.6(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) debug: 4.3.6 svelte: 5.0.0-next.216 - vite: 5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) + vite: 5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))': + '@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 3.0.0-next.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)))(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) + '@sveltejs/vite-plugin-svelte-inspector': 3.0.0-next.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)))(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) debug: 4.3.6 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.11 svelte: 5.0.0-next.216 - vite: 5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) - vitefu: 0.2.5(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) + vite: 5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) + vitefu: 0.2.5(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) transitivePeerDependencies: - supports-color - '@tanstack/config@0.11.2(@types/node@18.19.42)(esbuild@0.21.5)(eslint@8.57.0)(rollup@4.19.1)(typescript@5.4.2)(vite@5.4.0(@types/node@18.19.42)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))': + '@tanstack/config@0.11.2(@types/node@18.19.42)(esbuild@0.21.5)(eslint@8.57.0)(rollup@4.22.5)(typescript@5.4.2)(vite@5.4.0(@types/node@18.19.42)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))': dependencies: '@commitlint/parse': 19.0.3 '@eslint/js': 8.57.0 @@ -8238,7 +8606,7 @@ snapshots: jsonfile: 6.1.0 liftoff: 5.0.0 minimist: 1.2.8 - rollup-plugin-preserve-directives: 0.4.0(rollup@4.19.1) + rollup-plugin-preserve-directives: 0.4.0(rollup@4.22.5) semver: 7.6.3 simple-git: 3.25.0 typedoc: 0.26.5(typescript@5.4.2) @@ -8246,7 +8614,7 @@ snapshots: typedoc-plugin-markdown: 4.2.3(typedoc@0.26.5(typescript@5.4.2)) typescript-eslint: 7.18.0(eslint@8.57.0)(typescript@5.4.2) v8flags: 4.0.1 - vite-plugin-dts: 4.0.2(@types/node@18.19.42)(rollup@4.19.1)(typescript@5.4.2)(vite@5.4.0(@types/node@18.19.42)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) + vite-plugin-dts: 4.0.2(@types/node@18.19.42)(rollup@4.22.5)(typescript@5.4.2)(vite@5.4.0(@types/node@18.19.42)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) vite-plugin-externalize-deps: 0.8.0(vite@5.4.0(@types/node@18.19.42)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) vite-tsconfig-paths: 5.0.1(typescript@5.4.2)(vite@5.4.0(@types/node@18.19.42)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) transitivePeerDependencies: @@ -8301,26 +8669,26 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@testing-library/svelte@5.2.1(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))(vitest@2.0.5(@types/node@20.14.13)(jsdom@24.1.1)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))': + '@testing-library/svelte@5.2.1(svelte@5.0.0-next.216)(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))(vitest@2.0.5(@types/node@22.7.4)(jsdom@24.1.1)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))': dependencies: '@testing-library/dom': 10.4.0 svelte: 5.0.0-next.216 optionalDependencies: - vite: 5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) - vitest: 2.0.5(@types/node@20.14.13)(jsdom@24.1.1)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) + vite: 5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) + vitest: 2.0.5(@types/node@22.7.4)(jsdom@24.1.1)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': dependencies: '@testing-library/dom': 10.4.0 - '@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.37)(vue@3.4.37(typescript@5.4.2))': + '@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.10)(vue@3.5.9(typescript@5.4.2))': dependencies: '@babel/runtime': 7.25.0 '@testing-library/dom': 9.3.4 '@vue/test-utils': 2.4.6 - vue: 3.4.37(typescript@5.4.2) + vue: 3.5.9(typescript@5.4.2) optionalDependencies: - '@vue/compiler-sfc': 3.4.37 + '@vue/compiler-sfc': 3.5.10 '@ts-morph/common@0.22.0': dependencies: @@ -8361,20 +8729,20 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 18.19.42 + '@types/node': 22.7.4 '@types/bonjour@3.5.13': dependencies: - '@types/node': 18.19.42 + '@types/node': 22.7.4 '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/express-serve-static-core': 4.19.5 - '@types/node': 18.19.42 + '@types/express-serve-static-core': 5.0.0 + '@types/node': 22.7.4 '@types/connect@3.4.38': dependencies: - '@types/node': 18.19.42 + '@types/node': 22.7.4 '@types/conventional-commits-parser@5.0.0': dependencies: @@ -8382,28 +8750,42 @@ snapshots: '@types/eslint-scope@3.7.7': dependencies: - '@types/eslint': 9.6.0 - '@types/estree': 1.0.5 + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 '@types/eslint@9.6.0': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + '@types/estree@1.0.5': {} - '@types/express-serve-static-core@4.19.5': + '@types/estree@1.0.6': {} + + '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 18.19.42 - '@types/qs': 6.9.15 + '@types/node': 22.7.4 + '@types/qs': 6.9.16 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express-serve-static-core@5.0.0': + dependencies: + '@types/node': 22.7.4 + '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.5 - '@types/qs': 6.9.15 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.9.16 '@types/serve-static': 1.15.7 '@types/hast@3.0.4': @@ -8412,9 +8794,9 @@ snapshots: '@types/http-errors@2.0.4': {} - '@types/http-proxy@1.17.14': + '@types/http-proxy@1.17.15': dependencies: - '@types/node': 18.19.42 + '@types/node': 22.7.4 '@types/json-schema@7.0.15': {} @@ -8422,25 +8804,29 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 18.19.42 + '@types/node': 20.16.10 '@types/node-forge@1.3.11': dependencies: - '@types/node': 18.19.42 + '@types/node': 22.7.4 '@types/node@18.19.42': dependencies: undici-types: 5.26.5 - '@types/node@20.14.13': + '@types/node@20.16.10': dependencies: - undici-types: 5.26.5 + undici-types: 6.19.8 + + '@types/node@22.7.4': + dependencies: + undici-types: 6.19.8 '@types/prop-types@15.7.12': {} '@types/pug@2.0.10': {} - '@types/qs@6.9.15': {} + '@types/qs@6.9.16': {} '@types/range-parser@1.2.7': {} @@ -8460,7 +8846,7 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 18.19.42 + '@types/node': 22.7.4 '@types/serve-index@1.9.4': dependencies: @@ -8469,12 +8855,12 @@ snapshots: '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 18.19.42 + '@types/node': 22.7.4 '@types/send': 0.17.4 '@types/sockjs@0.3.36': dependencies: - '@types/node': 18.19.42 + '@types/node': 22.7.4 '@types/unist@3.0.2': {} @@ -8484,7 +8870,7 @@ snapshots: '@types/ws@8.5.12': dependencies: - '@types/node': 18.19.42 + '@types/node': 22.7.4 '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2)': dependencies: @@ -8619,24 +9005,24 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-basic-ssl@1.1.0(vite@5.3.2(@types/node@20.14.13)(less@4.2.0)(sass@1.77.6)(terser@5.29.2))': + '@vitejs/plugin-basic-ssl@1.1.0(vite@5.3.2(@types/node@22.7.4)(less@4.2.0)(sass@1.77.6)(terser@5.29.2))': dependencies: - vite: 5.3.2(@types/node@20.14.13)(less@4.2.0)(sass@1.77.6)(terser@5.29.2) + vite: 5.3.2(@types/node@22.7.4)(less@4.2.0)(sass@1.77.6)(terser@5.29.2) - '@vitejs/plugin-react@4.3.1(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))': + '@vitejs/plugin-react@4.3.1(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) + vite: 5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.1.2(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))(vue@3.4.37(typescript@5.4.2))': + '@vitejs/plugin-vue@5.1.2(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))(vue@3.4.37(typescript@5.4.2))': dependencies: - vite: 5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) + vite: 5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) vue: 3.4.37(typescript@5.4.2) '@vitest/coverage-istanbul@2.0.5(vitest@2.0.5(@types/node@18.19.42)(jsdom@24.1.1)(less@4.2.0)(sass@1.77.8)(terser@5.29.2))': @@ -8714,17 +9100,43 @@ snapshots: '@vue/compiler-core@3.4.37': dependencies: - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 '@vue/shared': 3.4.37 entities: 5.0.0 estree-walker: 2.0.2 - source-map-js: 1.2.0 + source-map-js: 1.2.1 + + '@vue/compiler-core@3.5.10': + dependencies: + '@babel/parser': 7.25.6 + '@vue/shared': 3.5.10 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-core@3.5.9': + dependencies: + '@babel/parser': 7.25.6 + '@vue/shared': 3.5.9 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 '@vue/compiler-dom@3.4.37': dependencies: '@vue/compiler-core': 3.4.37 '@vue/shared': 3.4.37 + '@vue/compiler-dom@3.5.10': + dependencies: + '@vue/compiler-core': 3.5.10 + '@vue/shared': 3.5.10 + + '@vue/compiler-dom@3.5.9': + dependencies: + '@vue/compiler-core': 3.5.9 + '@vue/shared': 3.5.9 + '@vue/compiler-sfc@2.7.16': dependencies: '@babel/parser': 7.25.3 @@ -8745,11 +9157,45 @@ snapshots: postcss: 8.4.40 source-map-js: 1.2.0 + '@vue/compiler-sfc@3.5.10': + dependencies: + '@babel/parser': 7.25.6 + '@vue/compiler-core': 3.5.10 + '@vue/compiler-dom': 3.5.10 + '@vue/compiler-ssr': 3.5.10 + '@vue/shared': 3.5.10 + estree-walker: 2.0.2 + magic-string: 0.30.11 + postcss: 8.4.47 + source-map-js: 1.2.1 + + '@vue/compiler-sfc@3.5.9': + dependencies: + '@babel/parser': 7.25.6 + '@vue/compiler-core': 3.5.9 + '@vue/compiler-dom': 3.5.9 + '@vue/compiler-ssr': 3.5.9 + '@vue/shared': 3.5.9 + estree-walker: 2.0.2 + magic-string: 0.30.11 + postcss: 8.4.47 + source-map-js: 1.2.1 + '@vue/compiler-ssr@3.4.37': dependencies: '@vue/compiler-dom': 3.4.37 '@vue/shared': 3.4.37 + '@vue/compiler-ssr@3.5.10': + dependencies: + '@vue/compiler-dom': 3.5.10 + '@vue/shared': 3.5.10 + + '@vue/compiler-ssr@3.5.9': + dependencies: + '@vue/compiler-dom': 3.5.9 + '@vue/shared': 3.5.9 + '@vue/compiler-vue2@2.7.16': dependencies: de-indent: 1.0.2 @@ -8762,9 +9208,9 @@ snapshots: '@vue/language-core@2.0.29(typescript@5.4.2)': dependencies: '@volar/language-core': 2.4.0-alpha.18 - '@vue/compiler-dom': 3.4.37 + '@vue/compiler-dom': 3.5.10 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.4.37 + '@vue/shared': 3.5.10 computeds: 0.0.1 minimatch: 9.0.5 muggle-string: 0.4.1 @@ -8776,11 +9222,29 @@ snapshots: dependencies: '@vue/shared': 3.4.37 + '@vue/reactivity@3.5.10': + dependencies: + '@vue/shared': 3.5.10 + + '@vue/reactivity@3.5.9': + dependencies: + '@vue/shared': 3.5.9 + '@vue/runtime-core@3.4.37': dependencies: '@vue/reactivity': 3.4.37 '@vue/shared': 3.4.37 + '@vue/runtime-core@3.5.10': + dependencies: + '@vue/reactivity': 3.5.10 + '@vue/shared': 3.5.10 + + '@vue/runtime-core@3.5.9': + dependencies: + '@vue/reactivity': 3.5.9 + '@vue/shared': 3.5.9 + '@vue/runtime-dom@3.4.37': dependencies: '@vue/reactivity': 3.4.37 @@ -8788,14 +9252,44 @@ snapshots: '@vue/shared': 3.4.37 csstype: 3.1.3 + '@vue/runtime-dom@3.5.10': + dependencies: + '@vue/reactivity': 3.5.10 + '@vue/runtime-core': 3.5.10 + '@vue/shared': 3.5.10 + csstype: 3.1.3 + + '@vue/runtime-dom@3.5.9': + dependencies: + '@vue/reactivity': 3.5.9 + '@vue/runtime-core': 3.5.9 + '@vue/shared': 3.5.9 + csstype: 3.1.3 + '@vue/server-renderer@3.4.37(vue@3.4.37(typescript@5.4.2))': dependencies: '@vue/compiler-ssr': 3.4.37 '@vue/shared': 3.4.37 vue: 3.4.37(typescript@5.4.2) + '@vue/server-renderer@3.5.10(vue@3.5.10(typescript@5.4.2))': + dependencies: + '@vue/compiler-ssr': 3.5.10 + '@vue/shared': 3.5.10 + vue: 3.5.10(typescript@5.4.2) + + '@vue/server-renderer@3.5.9(vue@3.5.9(typescript@5.4.2))': + dependencies: + '@vue/compiler-ssr': 3.5.9 + '@vue/shared': 3.5.9 + vue: 3.5.9(typescript@5.4.2) + '@vue/shared@3.4.37': {} + '@vue/shared@3.5.10': {} + + '@vue/shared@3.5.9': {} + '@vue/test-utils@2.4.6': dependencies: js-beautify: 1.15.1 @@ -9058,11 +9552,11 @@ snapshots: autoprefixer@10.4.19(postcss@8.4.38): dependencies: - browserslist: 4.23.2 - caniuse-lite: 1.0.30001645 + browserslist: 4.24.0 + caniuse-lite: 1.0.30001664 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.1 + picocolors: 1.1.0 postcss: 8.4.38 postcss-value-parser: 4.2.0 @@ -9072,7 +9566,7 @@ snapshots: axios@1.7.2: dependencies: - follow-redirects: 1.15.6(debug@4.3.6) + follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -9094,24 +9588,24 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.18.6 '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 html-entities: 2.3.3 validate-html-nesting: 1.2.2 babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.7): dependencies: - '@babel/compat-data': 7.25.2 + '@babel/compat-data': 7.25.4 '@babel/core': 7.24.7 '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.7): + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.24.7): dependencies: '@babel/core': 7.24.7 '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7) - core-js-compat: 3.37.1 + core-js-compat: 3.38.1 transitivePeerDependencies: - supports-color @@ -9145,7 +9639,7 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - body-parser@1.20.2: + body-parser@1.20.3: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -9155,7 +9649,7 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.11.0 + qs: 6.13.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -9189,6 +9683,13 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.2) + browserslist@4.24.0: + dependencies: + caniuse-lite: 1.0.30001664 + electron-to-chromium: 1.5.29 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.0) + buffer-crc32@1.0.0: {} buffer-from@1.1.2: {} @@ -9237,6 +9738,8 @@ snapshots: caniuse-lite@1.0.30001645: {} + caniuse-lite@1.0.30001664: {} + chai@5.1.1: dependencies: assertion-error: 2.0.1 @@ -9414,9 +9917,9 @@ snapshots: serialize-javascript: 6.0.2 webpack: 5.92.1(esbuild@0.21.5) - core-js-compat@3.37.1: + core-js-compat@3.38.1: dependencies: - browserslist: 4.23.2 + browserslist: 4.24.0 core-util-is@1.0.3: {} @@ -9436,7 +9939,7 @@ snapshots: dom-serializer: 2.0.0 domhandler: 5.0.3 htmlparser2: 8.0.2 - postcss: 8.4.40 + postcss: 8.4.38 postcss-media-query-parser: 0.2.3 cross-spawn@5.1.0: @@ -9453,14 +9956,14 @@ snapshots: css-loader@7.1.2(webpack@5.92.1(esbuild@0.21.5)): dependencies: - icss-utils: 5.1.0(postcss@8.4.40) - postcss: 8.4.40 - postcss-modules-extract-imports: 3.1.0(postcss@8.4.40) - postcss-modules-local-by-default: 4.0.5(postcss@8.4.40) - postcss-modules-scope: 3.2.0(postcss@8.4.40) - postcss-modules-values: 4.0.0(postcss@8.4.40) + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.38) + postcss-modules-scope: 3.2.0(postcss@8.4.38) + postcss-modules-values: 4.0.0(postcss@8.4.38) postcss-value-parser: 4.2.0 - semver: 7.6.3 + semver: 7.6.2 optionalDependencies: webpack: 5.92.1(esbuild@0.21.5) @@ -9509,6 +10012,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.3.7: + dependencies: + ms: 2.1.3 + decimal.js@10.4.3: {} dedent-js@1.0.1: {} @@ -9656,6 +10163,8 @@ snapshots: ee-first@1.1.1: {} + electron-to-chromium@1.5.29: {} + electron-to-chromium@1.5.4: {} emoji-regex@8.0.0: {} @@ -9666,6 +10175,8 @@ snapshots: encodeurl@1.0.2: {} + encodeurl@2.0.0: {} + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -9782,6 +10293,8 @@ snapshots: escalade@3.1.2: {} + escalade@3.2.0: {} + escape-html@1.0.3: {} escape-string-regexp@1.0.5: {} @@ -10102,34 +10615,34 @@ snapshots: dependencies: homedir-polyfill: 1.0.3 - express@4.19.2: + express@4.21.0: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 + body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.3.1 fresh: 0.5.2 http-errors: 2.0.0 - merge-descriptors: 1.0.1 + merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: 0.1.10 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.19.0 + serve-static: 1.16.2 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -10176,10 +10689,10 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.2.0: + finalhandler@1.3.1: dependencies: debug: 2.6.9 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 @@ -10241,9 +10754,11 @@ snapshots: flatted@3.3.1: {} - follow-redirects@1.15.6(debug@4.3.6): + follow-redirects@1.15.6: {} + + follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: - debug: 4.3.6 + debug: 4.3.7 for-each@0.3.3: dependencies: @@ -10402,7 +10917,7 @@ snapshots: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 path-type: 5.0.0 slash: 5.1.0 unicorn-magic: 0.1.0 @@ -10499,11 +11014,11 @@ snapshots: http-proxy-middleware@2.0.6(@types/express@4.17.21): dependencies: - '@types/http-proxy': 1.17.14 - http-proxy: 1.18.1(debug@4.3.6) + '@types/http-proxy': 1.17.15 + http-proxy: 1.18.1(debug@4.3.7) is-glob: 4.0.3 is-plain-obj: 3.0.0 - micromatch: 4.0.7 + micromatch: 4.0.8 optionalDependencies: '@types/express': 4.17.21 transitivePeerDependencies: @@ -10511,19 +11026,19 @@ snapshots: http-proxy-middleware@3.0.0: dependencies: - '@types/http-proxy': 1.17.14 - debug: 4.3.6 - http-proxy: 1.18.1(debug@4.3.6) + '@types/http-proxy': 1.17.15 + debug: 4.3.7 + http-proxy: 1.18.1(debug@4.3.7) is-glob: 4.0.3 is-plain-obj: 3.0.0 - micromatch: 4.0.7 + micromatch: 4.0.8 transitivePeerDependencies: - supports-color - http-proxy@1.18.1(debug@4.3.6): + http-proxy@1.18.1(debug@4.3.7): dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.6(debug@4.3.6) + follow-redirects: 1.15.9(debug@4.3.7) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -10549,9 +11064,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.4.40): + icss-utils@5.1.0(postcss@8.4.38): dependencies: - postcss: 8.4.40 + postcss: 8.4.38 ieee754@1.2.1: {} @@ -10561,6 +11076,8 @@ snapshots: ignore@5.3.1: {} + ignore@5.3.2: {} + image-size@0.5.5: optional: true @@ -10783,11 +11300,11 @@ snapshots: istanbul-lib-instrument@6.0.2: dependencies: - '@babel/core': 7.25.2 - '@babel/parser': 7.25.3 + '@babel/core': 7.24.7 + '@babel/parser': 7.25.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.3 + semver: 7.6.2 transitivePeerDependencies: - supports-color @@ -10837,7 +11354,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 18.19.42 + '@types/node': 22.7.4 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -10963,9 +11480,9 @@ snapshots: kolorist@1.8.0: {} - launch-editor@2.8.0: + launch-editor@2.9.1: dependencies: - picocolors: 1.0.1 + picocolors: 1.1.0 shell-quote: 1.8.1 less-loader@12.2.0(less@4.2.0)(webpack@5.92.1(esbuild@0.21.5)): @@ -11024,7 +11541,7 @@ snapshots: msgpackr: 1.11.0 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.2.2 - ordered-binary: 1.5.1 + ordered-binary: 1.5.2 weak-lru-cache: 1.2.2 optionalDependencies: '@lmdb/lmdb-darwin-arm64': 3.0.12 @@ -11148,9 +11665,9 @@ snapshots: media-typer@0.3.0: {} - memfs@4.11.0: + memfs@4.12.0: dependencies: - '@jsonjoy.com/json-pack': 1.0.4(tslib@2.6.3) + '@jsonjoy.com/json-pack': 1.1.0(tslib@2.6.3) '@jsonjoy.com/util': 1.3.0(tslib@2.6.3) tree-dump: 1.0.2(tslib@2.6.3) tslib: 2.6.3 @@ -11161,7 +11678,7 @@ snapshots: dependencies: is-what: 4.1.16 - merge-descriptors@1.0.1: {} + merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -11174,6 +11691,11 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + mime-db@1.52.0: {} mime-db@1.53.0: {} @@ -11559,7 +12081,7 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - ordered-binary@1.5.1: {} + ordered-binary@1.5.2: {} p-finally@1.0.0: {} @@ -11672,7 +12194,7 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@0.1.7: {} + path-to-regexp@0.1.10: {} path-type@4.0.0: {} @@ -11684,6 +12206,8 @@ snapshots: picocolors@1.0.1: {} + picocolors@1.1.0: {} + picomatch@2.3.1: {} picomatch@4.0.2: {} @@ -11723,7 +12247,7 @@ snapshots: cosmiconfig: 9.0.0(typescript@5.4.2) jiti: 1.21.6 postcss: 8.4.38 - semver: 7.6.3 + semver: 7.6.2 optionalDependencies: webpack: 5.92.1(esbuild@0.21.5) transitivePeerDependencies: @@ -11731,26 +12255,26 @@ snapshots: postcss-media-query-parser@0.2.3: {} - postcss-modules-extract-imports@3.1.0(postcss@8.4.40): + postcss-modules-extract-imports@3.1.0(postcss@8.4.38): dependencies: - postcss: 8.4.40 + postcss: 8.4.38 - postcss-modules-local-by-default@4.0.5(postcss@8.4.40): + postcss-modules-local-by-default@4.0.5(postcss@8.4.38): dependencies: - icss-utils: 5.1.0(postcss@8.4.40) - postcss: 8.4.40 - postcss-selector-parser: 6.1.1 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.0(postcss@8.4.40): + postcss-modules-scope@3.2.0(postcss@8.4.38): dependencies: - postcss: 8.4.40 - postcss-selector-parser: 6.1.1 + postcss: 8.4.38 + postcss-selector-parser: 6.1.2 - postcss-modules-values@4.0.0(postcss@8.4.40): + postcss-modules-values@4.0.0(postcss@8.4.38): dependencies: - icss-utils: 5.1.0(postcss@8.4.40) - postcss: 8.4.40 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 postcss-safe-parser@6.0.0(postcss@8.4.40): dependencies: @@ -11765,13 +12289,18 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} postcss@8.4.38: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.0 + source-map-js: 1.2.1 postcss@8.4.40: dependencies: @@ -11779,6 +12308,12 @@ snapshots: picocolors: 1.0.1 source-map-js: 1.2.0 + postcss@8.4.47: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.1 + preact@10.23.2: {} prelude-ls@1.2.1: {} @@ -11837,7 +12372,7 @@ snapshots: punycode@2.3.1: {} - qs@6.11.0: + qs@6.13.0: dependencies: side-channel: 1.0.6 @@ -11905,7 +12440,7 @@ snapshots: reflect-metadata@0.2.2: {} - regenerate-unicode-properties@10.1.1: + regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -11915,7 +12450,7 @@ snapshots: regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.24.7 regex-parser@2.3.0: {} @@ -11930,10 +12465,10 @@ snapshots: dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.1 + regenerate-unicode-properties: 10.2.0 regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 + unicode-match-property-value-ecmascript: 2.2.0 regjsparser@0.9.1: dependencies: @@ -11959,7 +12494,7 @@ snapshots: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.4.40 + postcss: 8.4.38 source-map: 0.6.1 resolve@1.22.8: @@ -11989,11 +12524,11 @@ snapshots: dependencies: glob: 10.4.5 - rollup-plugin-preserve-directives@0.4.0(rollup@4.19.1): + rollup-plugin-preserve-directives@0.4.0(rollup@4.22.5): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.19.1) + '@rollup/pluginutils': 5.1.0(rollup@4.22.5) magic-string: 0.30.11 - rollup: 4.19.1 + rollup: 4.22.5 rollup@4.18.0: dependencies: @@ -12039,6 +12574,28 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.19.1 fsevents: 2.3.3 + rollup@4.22.5: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.22.5 + '@rollup/rollup-android-arm64': 4.22.5 + '@rollup/rollup-darwin-arm64': 4.22.5 + '@rollup/rollup-darwin-x64': 4.22.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.22.5 + '@rollup/rollup-linux-arm-musleabihf': 4.22.5 + '@rollup/rollup-linux-arm64-gnu': 4.22.5 + '@rollup/rollup-linux-arm64-musl': 4.22.5 + '@rollup/rollup-linux-powerpc64le-gnu': 4.22.5 + '@rollup/rollup-linux-riscv64-gnu': 4.22.5 + '@rollup/rollup-linux-s390x-gnu': 4.22.5 + '@rollup/rollup-linux-x64-gnu': 4.22.5 + '@rollup/rollup-linux-x64-musl': 4.22.5 + '@rollup/rollup-win32-arm64-msvc': 4.22.5 + '@rollup/rollup-win32-ia32-msvc': 4.22.5 + '@rollup/rollup-win32-x64-msvc': 4.22.5 + fsevents: 2.3.3 + rrweb-cssom@0.6.0: {} rrweb-cssom@0.7.1: {} @@ -12081,13 +12638,13 @@ snapshots: dependencies: chokidar: 3.6.0 immutable: 4.3.7 - source-map-js: 1.2.0 + source-map-js: 1.2.1 sass@1.77.8: dependencies: chokidar: 3.6.0 immutable: 4.3.7 - source-map-js: 1.2.0 + source-map-js: 1.2.1 sax@1.4.1: optional: true @@ -12133,7 +12690,7 @@ snapshots: semver@7.6.3: {} - send@0.18.0: + send@0.19.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -12173,12 +12730,12 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@1.15.0: + serve-static@1.16.2: dependencies: - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.19.0 transitivePeerDependencies: - supports-color @@ -12311,10 +12868,12 @@ snapshots: source-map-js@1.2.0: {} + source-map-js@1.2.1: {} + source-map-loader@5.0.0(webpack@5.92.1(esbuild@0.21.5)): dependencies: iconv-lite: 0.6.3 - source-map-js: 1.2.0 + source-map-js: 1.2.1 webpack: 5.92.1(esbuild@0.21.5) source-map-support@0.5.21: @@ -12328,7 +12887,7 @@ snapshots: spdy-transport@3.0.0: dependencies: - debug: 4.3.6 + debug: 4.3.7 detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -12339,7 +12898,7 @@ snapshots: spdy@4.0.2: dependencies: - debug: 4.3.6 + debug: 4.3.7 handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -12692,16 +13251,18 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.19.8: {} + undici@6.19.2: {} - unicode-canonical-property-names-ecmascript@2.0.0: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-canonical-property-names-ecmascript: 2.0.1 unicode-property-aliases-ecmascript: 2.1.0 - unicode-match-property-value-ecmascript@2.1.0: {} + unicode-match-property-value-ecmascript@2.2.0: {} unicode-property-aliases-ecmascript@2.1.0: {} @@ -12729,6 +13290,12 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 + update-browserslist-db@1.1.1(browserslist@4.24.0): + dependencies: + browserslist: 4.24.0 + escalade: 3.2.0 + picocolors: 1.1.0 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -12772,13 +13339,13 @@ snapshots: - supports-color - terser - vite-node@2.0.5(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2): + vite-node@2.0.5(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2): dependencies: cac: 6.7.14 debug: 4.3.6 pathe: 1.1.2 tinyrainbow: 1.2.0 - vite: 5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) + vite: 5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) transitivePeerDependencies: - '@types/node' - less @@ -12791,10 +13358,10 @@ snapshots: - terser optional: true - vite-plugin-dts@4.0.2(@types/node@18.19.42)(rollup@4.19.1)(typescript@5.4.2)(vite@5.4.0(@types/node@18.19.42)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)): + vite-plugin-dts@4.0.2(@types/node@18.19.42)(rollup@4.22.5)(typescript@5.4.2)(vite@5.4.0(@types/node@18.19.42)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)): dependencies: '@microsoft/api-extractor': 7.47.4(@types/node@18.19.42) - '@rollup/pluginutils': 5.1.0(rollup@4.19.1) + '@rollup/pluginutils': 5.1.0(rollup@4.22.5) '@volar/typescript': 2.3.4 '@vue/language-core': 2.0.29(typescript@5.4.2) compare-versions: 6.1.1 @@ -12815,7 +13382,7 @@ snapshots: dependencies: vite: 5.4.0(@types/node@18.19.42)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) - vite-plugin-solid@2.10.2(@testing-library/jest-dom@6.4.8)(solid-js@1.8.20)(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)): + vite-plugin-solid@2.10.2(@testing-library/jest-dom@6.4.8)(solid-js@1.8.20)(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)): dependencies: '@babel/core': 7.25.2 '@types/babel__core': 7.20.5 @@ -12823,8 +13390,8 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.8.20 solid-refresh: 0.6.3(solid-js@1.8.20) - vite: 5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) - vitefu: 0.2.5(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) + vite: 5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) + vitefu: 0.2.5(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)) optionalDependencies: '@testing-library/jest-dom': 6.4.8 transitivePeerDependencies: @@ -12841,13 +13408,13 @@ snapshots: - supports-color - typescript - vite@5.3.2(@types/node@20.14.13)(less@4.2.0)(sass@1.77.6)(terser@5.29.2): + vite@5.3.2(@types/node@22.7.4)(less@4.2.0)(sass@1.77.6)(terser@5.29.2): dependencies: esbuild: 0.21.5 - postcss: 8.4.40 - rollup: 4.19.1 + postcss: 8.4.38 + rollup: 4.22.5 optionalDependencies: - '@types/node': 20.14.13 + '@types/node': 22.7.4 fsevents: 2.3.3 less: 4.2.0 sass: 1.77.6 @@ -12865,21 +13432,21 @@ snapshots: sass: 1.77.8 terser: 5.29.2 - vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2): + vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2): dependencies: esbuild: 0.21.5 postcss: 8.4.40 rollup: 4.19.1 optionalDependencies: - '@types/node': 20.14.13 + '@types/node': 22.7.4 fsevents: 2.3.3 less: 4.2.0 sass: 1.77.8 terser: 5.29.2 - vitefu@0.2.5(vite@5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)): + vitefu@0.2.5(vite@5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2)): optionalDependencies: - vite: 5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) + vite: 5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) vitest@2.0.5(@types/node@18.19.42)(jsdom@24.1.1)(less@4.2.0)(sass@1.77.8)(terser@5.29.2): dependencies: @@ -12915,7 +13482,7 @@ snapshots: - supports-color - terser - vitest@2.0.5(@types/node@20.14.13)(jsdom@24.1.1)(less@4.2.0)(sass@1.77.8)(terser@5.29.2): + vitest@2.0.5(@types/node@22.7.4)(jsdom@24.1.1)(less@4.2.0)(sass@1.77.8)(terser@5.29.2): dependencies: '@ampproject/remapping': 2.3.0 '@vitest/expect': 2.0.5 @@ -12933,11 +13500,11 @@ snapshots: tinybench: 2.8.0 tinypool: 1.0.0 tinyrainbow: 1.2.0 - vite: 5.4.0(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) - vite-node: 2.0.5(@types/node@20.14.13)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) + vite: 5.4.0(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) + vite-node: 2.0.5(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.29.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.14.13 + '@types/node': 22.7.4 jsdom: 24.1.1 transitivePeerDependencies: - less @@ -12984,6 +13551,26 @@ snapshots: optionalDependencies: typescript: 5.4.2 + vue@3.5.10(typescript@5.4.2): + dependencies: + '@vue/compiler-dom': 3.5.10 + '@vue/compiler-sfc': 3.5.10 + '@vue/runtime-dom': 3.5.10 + '@vue/server-renderer': 3.5.10(vue@3.5.10(typescript@5.4.2)) + '@vue/shared': 3.5.10 + optionalDependencies: + typescript: 5.4.2 + + vue@3.5.9(typescript@5.4.2): + dependencies: + '@vue/compiler-dom': 3.5.9 + '@vue/compiler-sfc': 3.5.9 + '@vue/runtime-dom': 3.5.9 + '@vue/server-renderer': 3.5.9(vue@3.5.9(typescript@5.4.2)) + '@vue/shared': 3.5.9 + optionalDependencies: + typescript: 5.4.2 + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -13008,7 +13595,7 @@ snapshots: webpack-dev-middleware@7.2.1(webpack@5.92.1(esbuild@0.21.5)): dependencies: colorette: 2.0.20 - memfs: 4.11.0 + memfs: 4.12.0 mime-types: 2.1.35 on-finished: 2.4.1 range-parser: 1.2.1 @@ -13032,12 +13619,12 @@ snapshots: compression: 1.7.4 connect-history-api-fallback: 2.0.0 default-gateway: 6.0.3 - express: 4.19.2 + express: 4.21.0 graceful-fs: 4.2.11 html-entities: 2.5.2 http-proxy-middleware: 2.0.6(@types/express@4.17.21) ipaddr.js: 2.2.0 - launch-editor: 2.8.0 + launch-editor: 2.9.1 open: 10.1.0 p-retry: 6.2.0 rimraf: 5.0.10 @@ -13072,13 +13659,13 @@ snapshots: webpack@5.92.1(esbuild@0.21.5): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 acorn: 8.12.1 acorn-import-attributes: 1.9.5(acorn@8.12.1) - browserslist: 4.23.2 + browserslist: 4.24.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.17.1 es-module-lexer: 1.5.4 From 228db0e6aca73a767761ca2034779828f0e798c9 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 25 Nov 2024 01:10:29 -0800 Subject: [PATCH 23/81] feat: add lazyness to derived (#109) * feat: add lazyness to derived * ci: apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- packages/store/src/derived.ts | 24 ++++++++++++-- packages/store/tests/derived.test.ts | 49 ++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 5aeda6b..620086e 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -4,14 +4,21 @@ import type { Listener } from './types' interface DerivedOptions { onSubscribe?: (listener: Listener, derived: Derived) => () => void onUpdate?: () => void + /** + * Should the value of `Derived` only be computed once it is accessed + * @default false + */ + lazy?: boolean } export type Deps = Array | Store> export class Derived { - _store!: Store + _store: Store rootStores = new Set>() deps: Deps + options?: DerivedOptions + fn: () => TState // Functions representing the subscriptions. Call a function to cleanup _subscriptions: Array<() => void> = [] @@ -21,7 +28,10 @@ export class Derived { constructor(deps: Deps, fn: () => TState, options?: DerivedOptions) { this.deps = deps - this._store = new Store(fn(), { + this.options = options + this.fn = fn + const initVal = options?.lazy ? (undefined as ReturnType) : fn() + this._store = new Store(initVal, { onSubscribe: options?.onSubscribe?.bind(this) as never, onUpdate: options?.onUpdate, }) @@ -83,7 +93,10 @@ export class Derived { __depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.size ) { // Yay! All deps are resolved - write the value of this derived - this._store.setState(fn) + if (!options?.lazy) { + this._store.setState(fn) + } + // Cleanup the deps that have written this tick __depsThatHaveWrittenThisTick = [] this._whatStoreIsCurrentlyInUse = null @@ -96,6 +109,11 @@ export class Derived { } get state() { + if (this.options?.lazy && this._store.state === undefined) { + this.options.lazy = false + this._store.setState(() => this.fn()) + return this._store.state + } return this._store.state } diff --git a/packages/store/tests/derived.test.ts b/packages/store/tests/derived.test.ts index 36300df..25868cf 100644 --- a/packages/store/tests/derived.test.ts +++ b/packages/store/tests/derived.test.ts @@ -106,4 +106,53 @@ describe('Derived', () => { expect(doubleCountFn).toHaveBeenNthCalledWith(2, 60) expect(tripleCountFn).toHaveBeenNthCalledWith(2, 90) }) + + test('Derive from store and another derived, even when lazy', () => { + const count = new Store(10) + + const doubleCount = new Derived( + [count], + () => { + return count.state * 2 + }, + { lazy: true }, + ) + + const tripleCount = new Derived([count, doubleCount], () => { + return count.state + doubleCount.state + }) + + const doubleCountFn = viFnSubscribe(doubleCount) + const tripleCountFn = viFnSubscribe(tripleCount) + + count.setState(() => 20) + + expect(doubleCountFn).toHaveBeenNthCalledWith(1, 40) + expect(tripleCountFn).toHaveBeenNthCalledWith(1, 60) + + count.setState(() => 30) + + expect(doubleCountFn).toHaveBeenNthCalledWith(2, 60) + expect(tripleCountFn).toHaveBeenNthCalledWith(2, 90) + }) + + test("Derive that's lazy should not update on first tick", () => { + const count = new Store(10) + const fn = vi.fn() + const doubleCount = new Derived( + [count], + () => { + fn() + return count.state * 2 + }, + { lazy: true }, + ) + + const doubleCountFn = viFnSubscribe(doubleCount) + + count.setState(() => 20) + + expect(doubleCountFn).not.toHaveBeenCalled() + expect(fn).not.toHaveBeenCalled() + }) }) From 81ef72c01b20116622c56a69dda0be14d23c705f Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 25 Nov 2024 01:45:14 -0800 Subject: [PATCH 24/81] chore: migrate to options object over positional arguments --- packages/store/src/derived.ts | 34 +++++------ packages/store/src/effect.ts | 26 +++++++-- packages/store/tests/derived.bench.ts | 12 ++-- packages/store/tests/derived.test.ts | 83 +++++++++++++++++---------- packages/store/tests/effect.test.ts | 43 +++++++++----- 5 files changed, 123 insertions(+), 75 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 620086e..8dcf59b 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -1,7 +1,7 @@ import { Store } from './store' import type { Listener } from './types' -interface DerivedOptions { +export interface DerivedOptions { onSubscribe?: (listener: Listener, derived: Derived) => () => void onUpdate?: () => void /** @@ -9,16 +9,14 @@ interface DerivedOptions { * @default false */ lazy?: boolean + deps: Array | Store>; + fn: () => TState; } -export type Deps = Array | Store> - export class Derived { _store: Store rootStores = new Set>() - deps: Deps - options?: DerivedOptions - fn: () => TState + options: DerivedOptions // Functions representing the subscriptions. Call a function to cleanup _subscriptions: Array<() => void> = [] @@ -26,14 +24,12 @@ export class Derived { // What store called the current update, if any _whatStoreIsCurrentlyInUse: Store | null = null - constructor(deps: Deps, fn: () => TState, options?: DerivedOptions) { - this.deps = deps + constructor(options: DerivedOptions) { this.options = options - this.fn = fn - const initVal = options?.lazy ? (undefined as ReturnType) : fn() + const initVal = options.lazy ? (undefined as ReturnType) : options.fn() this._store = new Store(initVal, { - onSubscribe: options?.onSubscribe?.bind(this) as never, - onUpdate: options?.onUpdate, + onSubscribe: options.onSubscribe?.bind(this) as never, + onUpdate: options.onUpdate, }) /** * This is here to solve the pyramid dependency problem where: @@ -61,7 +57,7 @@ export class Derived { prevDerivesForStore.add(dep) storeToDerived.set(store, prevDerivesForStore) } - for (const dep of deps) { + for (const dep of options.deps) { if (dep instanceof Derived) { derivedToStore.set(dep, dep.rootStores) for (const store of dep.rootStores) { @@ -74,9 +70,9 @@ export class Derived { } } - let __depsThatHaveWrittenThisTick: Deps = [] + let __depsThatHaveWrittenThisTick: DerivedOptions['deps'] = [] - for (const dep of deps) { + for (const dep of options.deps) { const isDepAStore = dep instanceof Store let relatedLinkedDerivedVals: null | Set> = null @@ -93,8 +89,8 @@ export class Derived { __depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.size ) { // Yay! All deps are resolved - write the value of this derived - if (!options?.lazy) { - this._store.setState(fn) + if (!options.lazy) { + this._store.setState(options.fn) } // Cleanup the deps that have written this tick @@ -109,9 +105,9 @@ export class Derived { } get state() { - if (this.options?.lazy && this._store.state === undefined) { + if (this.options.lazy && this._store.state === undefined) { this.options.lazy = false - this._store.setState(() => this.fn()) + this._store.setState(() => this.options.fn()) return this._store.state } return this._store.state diff --git a/packages/store/src/effect.ts b/packages/store/src/effect.ts index f721c37..9125a4d 100644 --- a/packages/store/src/effect.ts +++ b/packages/store/src/effect.ts @@ -1,15 +1,31 @@ -import { Derived } from './derived' -import type { Deps } from './derived' +import { Derived } from './derived' +import type {DerivedOptions} from './derived'; + +interface EffectOptions extends Omit, 'onUpdate' | 'onSubscribe' | "lazy"> { + /** + * Should the effect trigger immediately? + * @default false + */ + eager?: boolean; +} export class Effect { _derived: Derived - constructor(items: Deps, effectFn: () => void) { - this._derived = new Derived(items, () => {}, { + constructor(opts: EffectOptions) { + const {eager, fn, ...derivedProps} = opts; + + this._derived = new Derived({ + ...derivedProps, + fn: () => {}, onUpdate() { - effectFn() + fn() }, }) + + if (eager) { + fn(); + } } cleanup() { diff --git a/packages/store/tests/derived.bench.ts b/packages/store/tests/derived.bench.ts index db65890..8564ef5 100644 --- a/packages/store/tests/derived.bench.ts +++ b/packages/store/tests/derived.bench.ts @@ -32,12 +32,12 @@ function noop(val: any) { describe('Derived', () => { bench('TanStack', () => { const a = new Store(1) - const b = new Derived([a], () => a.state) - const c = new Derived([a], () => a.state) - const d = new Derived([b], () => b.state) - const e = new Derived([b], () => b.state) - const f = new Derived([c], () => c.state) - const g = new Derived([d, e, f], () => d.state + e.state + f.state) + const b = new Derived({deps: [a], fn: () => a.state}) + const c = new Derived({deps: [a], fn: () => a.state}) + const d = new Derived({deps: [b], fn: () => b.state}) + const e = new Derived({deps: [b], fn: () => b.state}) + const f = new Derived({deps: [c], fn: () => c.state}) + const g = new Derived({deps: [d, e, f], fn: () => d.state + e.state + f.state}) g.subscribe(() => noop(g.state)) diff --git a/packages/store/tests/derived.test.ts b/packages/store/tests/derived.test.ts index 25868cf..b94a776 100644 --- a/packages/store/tests/derived.test.ts +++ b/packages/store/tests/derived.test.ts @@ -15,16 +15,25 @@ describe('Derived', () => { test('Diamond dep problem', () => { const count = new Store(10) - const halfCount = new Derived([count], () => { - return count.state / 2 + const halfCount = new Derived({ + deps: [count], + fn: () => { + return count.state / 2 + }, }) - const doubleCount = new Derived([count], () => { - return count.state * 2 + const doubleCount = new Derived({ + deps: [count], + fn: () => { + return count.state * 2 + }, }) - const sumDoubleHalfCount = new Derived([halfCount, doubleCount], () => { - return halfCount.state + doubleCount.state + const sumDoubleHalfCount = new Derived({ + deps: [halfCount, doubleCount], + fn: () => { + return halfCount.state + doubleCount.state + }, }) const halfCountFn = viFnSubscribe(halfCount) @@ -56,12 +65,15 @@ describe('Derived', () => { */ test('Complex diamond dep problem', () => { const a = new Store(1) - const b = new Derived([a], () => a.state) - const c = new Derived([a], () => a.state) - const d = new Derived([b], () => b.state) - const e = new Derived([b], () => b.state) - const f = new Derived([c], () => c.state) - const g = new Derived([d, e, f], () => d.state + e.state + f.state) + const b = new Derived({ deps: [a], fn: () => a.state }) + const c = new Derived({ deps: [a], fn: () => a.state }) + const d = new Derived({ deps: [b], fn: () => b.state }) + const e = new Derived({ deps: [b], fn: () => b.state }) + const f = new Derived({ deps: [c], fn: () => c.state }) + const g = new Derived({ + deps: [d, e, f], + fn: () => d.state + e.state + f.state, + }) const aFn = viFnSubscribe(a) const bFn = viFnSubscribe(b) @@ -85,12 +97,18 @@ describe('Derived', () => { test('Derive from store and another derived', () => { const count = new Store(10) - const doubleCount = new Derived([count], () => { - return count.state * 2 + const doubleCount = new Derived({ + deps: [count], + fn: () => { + return count.state * 2 + }, }) - const tripleCount = new Derived([count, doubleCount], () => { - return count.state + doubleCount.state + const tripleCount = new Derived({ + deps: [count, doubleCount], + fn: () => { + return count.state + doubleCount.state + }, }) const doubleCountFn = viFnSubscribe(doubleCount) @@ -110,16 +128,19 @@ describe('Derived', () => { test('Derive from store and another derived, even when lazy', () => { const count = new Store(10) - const doubleCount = new Derived( - [count], - () => { + const doubleCount = new Derived({ + deps: [count], + fn: () => { return count.state * 2 }, - { lazy: true }, - ) + lazy: true, + }) - const tripleCount = new Derived([count, doubleCount], () => { - return count.state + doubleCount.state + const tripleCount = new Derived({ + deps: [count, doubleCount], + fn: () => { + return count.state + doubleCount.state + }, }) const doubleCountFn = viFnSubscribe(doubleCount) @@ -138,21 +159,21 @@ describe('Derived', () => { test("Derive that's lazy should not update on first tick", () => { const count = new Store(10) - const fn = vi.fn() - const doubleCount = new Derived( - [count], - () => { - fn() + const viFn = vi.fn() + const doubleCount = new Derived({ + deps: [count], + fn: () => { + viFn() return count.state * 2 }, - { lazy: true }, - ) + lazy: true, + }) const doubleCountFn = viFnSubscribe(doubleCount) count.setState(() => 20) expect(doubleCountFn).not.toHaveBeenCalled() - expect(fn).not.toHaveBeenCalled() + expect(viFn).not.toHaveBeenCalled() }) }) diff --git a/packages/store/tests/effect.test.ts b/packages/store/tests/effect.test.ts index 8d86d5c..54dd922 100644 --- a/packages/store/tests/effect.test.ts +++ b/packages/store/tests/effect.test.ts @@ -7,20 +7,32 @@ describe('Effect', () => { test('Side effect free', () => { const count = new Store(10) - const halfCount = new Derived([count], () => { - return count.state / 2 + const halfCount = new Derived({ + deps: [count], + fn: () => { + return count.state / 2 + }, }) - const doubleCount = new Derived([count], () => { - return count.state * 2 + const doubleCount = new Derived({ + deps: [count], + fn: () => { + return count.state * 2 + }, }) - const sumDoubleHalfCount = new Derived([halfCount, doubleCount], () => { - return halfCount.state + doubleCount.state + const sumDoubleHalfCount = new Derived({ + deps: [halfCount, doubleCount], + fn: () => { + return halfCount.state + doubleCount.state + }, }) const fn = vi.fn() - new Effect([sumDoubleHalfCount], () => fn(sumDoubleHalfCount.state)) + new Effect({ + deps: [sumDoubleHalfCount], + fn: () => fn(sumDoubleHalfCount.state), + }) count.setState(() => 20) @@ -43,15 +55,18 @@ describe('Effect', () => { */ test('Complex diamond dep problem', () => { const a = new Store(1) - const b = new Derived([a], () => a.state) - const c = new Derived([a], () => a.state) - const d = new Derived([b], () => b.state) - const e = new Derived([b], () => b.state) - const f = new Derived([c], () => c.state) - const g = new Derived([d, e, f], () => d.state + e.state + f.state) + const b = new Derived({ deps: [a], fn: () => a.state }) + const c = new Derived({ deps: [a], fn: () => a.state }) + const d = new Derived({ deps: [b], fn: () => b.state }) + const e = new Derived({ deps: [b], fn: () => b.state }) + const f = new Derived({ deps: [c], fn: () => c.state }) + const g = new Derived({ + deps: [d, e, f], + fn: () => d.state + e.state + f.state, + }) const fn = vi.fn() - new Effect([g], () => fn(g.state)) + new Effect({ deps: [g], fn: () => fn(g.state) }) a.setState(() => 2) From eac78fa57966ee7eabb47b2c2bcfc0a0d8f90f64 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 09:45:57 +0000 Subject: [PATCH 25/81] ci: apply automated fixes --- packages/store/src/derived.ts | 8 +++++--- packages/store/src/effect.ts | 13 +++++++------ packages/store/tests/derived.bench.ts | 15 +++++++++------ 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 8dcf59b..5fbd056 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -9,8 +9,8 @@ export interface DerivedOptions { * @default false */ lazy?: boolean - deps: Array | Store>; - fn: () => TState; + deps: Array | Store> + fn: () => TState } export class Derived { @@ -26,7 +26,9 @@ export class Derived { constructor(options: DerivedOptions) { this.options = options - const initVal = options.lazy ? (undefined as ReturnType) : options.fn() + const initVal = options.lazy + ? (undefined as ReturnType) + : options.fn() this._store = new Store(initVal, { onSubscribe: options.onSubscribe?.bind(this) as never, onUpdate: options.onUpdate, diff --git a/packages/store/src/effect.ts b/packages/store/src/effect.ts index 9125a4d..da7d050 100644 --- a/packages/store/src/effect.ts +++ b/packages/store/src/effect.ts @@ -1,19 +1,20 @@ -import { Derived } from './derived' -import type {DerivedOptions} from './derived'; +import { Derived } from './derived' +import type { DerivedOptions } from './derived' -interface EffectOptions extends Omit, 'onUpdate' | 'onSubscribe' | "lazy"> { +interface EffectOptions + extends Omit, 'onUpdate' | 'onSubscribe' | 'lazy'> { /** * Should the effect trigger immediately? * @default false */ - eager?: boolean; + eager?: boolean } export class Effect { _derived: Derived constructor(opts: EffectOptions) { - const {eager, fn, ...derivedProps} = opts; + const { eager, fn, ...derivedProps } = opts this._derived = new Derived({ ...derivedProps, @@ -24,7 +25,7 @@ export class Effect { }) if (eager) { - fn(); + fn() } } diff --git a/packages/store/tests/derived.bench.ts b/packages/store/tests/derived.bench.ts index 8564ef5..9dc743e 100644 --- a/packages/store/tests/derived.bench.ts +++ b/packages/store/tests/derived.bench.ts @@ -32,12 +32,15 @@ function noop(val: any) { describe('Derived', () => { bench('TanStack', () => { const a = new Store(1) - const b = new Derived({deps: [a], fn: () => a.state}) - const c = new Derived({deps: [a], fn: () => a.state}) - const d = new Derived({deps: [b], fn: () => b.state}) - const e = new Derived({deps: [b], fn: () => b.state}) - const f = new Derived({deps: [c], fn: () => c.state}) - const g = new Derived({deps: [d, e, f], fn: () => d.state + e.state + f.state}) + const b = new Derived({ deps: [a], fn: () => a.state }) + const c = new Derived({ deps: [a], fn: () => a.state }) + const d = new Derived({ deps: [b], fn: () => b.state }) + const e = new Derived({ deps: [b], fn: () => b.state }) + const f = new Derived({ deps: [c], fn: () => c.state }) + const g = new Derived({ + deps: [d, e, f], + fn: () => d.state + e.state + f.state, + }) g.subscribe(() => noop(g.state)) From a7e9cbedc0ba274cc7bc5e097e789b6ed06b4962 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 25 Nov 2024 01:51:12 -0800 Subject: [PATCH 26/81] chore: fix sherif --- packages/store/package.json | 4 ++-- pnpm-lock.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/store/package.json b/packages/store/package.json index 47152b1..d0c0952 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -59,7 +59,7 @@ "devDependencies": { "@angular/core": "^17.3.12", "@preact/signals": "^1.3.0", - "solid-js": "^1.8.20", - "vue": "^3.5.10" + "solid-js": "^1.9.3", + "vue": "^3.5.13" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f49e94..3e99135 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -189,10 +189,10 @@ importers: specifier: ^1.3.0 version: 1.3.0(preact@10.25.0) solid-js: - specifier: ^1.8.20 + specifier: ^1.9.3 version: 1.9.3 vue: - specifier: ^3.5.10 + specifier: ^3.5.13 version: 3.5.13(typescript@5.4.2) packages/svelte-store: From bd900f71817262745731f0284283ceaa5c616662 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 25 Nov 2024 03:01:59 -0800 Subject: [PATCH 27/81] docs: add autogenerated docs for effect and derived --- docs/config.json | 12 +++ docs/reference/classes/derived.md | 100 ++++++++++++++++++++ docs/reference/classes/effect.md | 42 ++++++++ docs/reference/classes/store.md | 14 +-- docs/reference/index.md | 3 + docs/reference/interfaces/derivedoptions.md | 100 ++++++++++++++++++++ docs/reference/interfaces/storeoptions.md | 6 +- packages/store/src/derived.ts | 16 +++- packages/store/src/effect.ts | 3 + 9 files changed, 284 insertions(+), 12 deletions(-) create mode 100644 docs/reference/classes/derived.md create mode 100644 docs/reference/classes/effect.md create mode 100644 docs/reference/interfaces/derivedoptions.md diff --git a/docs/config.json b/docs/config.json index ce37c6a..8af9482 100644 --- a/docs/config.json +++ b/docs/config.json @@ -77,10 +77,22 @@ "label": "Classes / Store", "to": "reference/classes/store" }, + { + "label": "Classes / Derived", + "to": "reference/classes/derived" + }, + { + "label": "Classes / Effect", + "to": "reference/classes/effect" + }, { "label": "Interfaces / StoreOptions", "to": "reference/interfaces/storeoptions" } + { + "label": "Interfaces / DerivedOptions", + "to": "reference/interfaces/derivedoptions" + } ], "frameworks": [ { diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md new file mode 100644 index 0000000..14016ae --- /dev/null +++ b/docs/reference/classes/derived.md @@ -0,0 +1,100 @@ +--- +id: Derived +title: Derived +--- + +# Class: Derived\ + +## Type Parameters + +• **TState** + +## Constructors + +### new Derived() + +```ts +new Derived(options): Derived +``` + +#### Parameters + +• **options**: [`DerivedOptions`](../interfaces/derivedoptions.md)\<`TState`\> + +#### Returns + +[`Derived`](derived.md)\<`TState`\> + +#### Defined in + +[derived.ts:39](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L39) + +## Properties + +### options + +```ts +options: DerivedOptions; +``` + +#### Defined in + +[derived.ts:25](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L25) + +## Accessors + +### state + +#### Get Signature + +```ts +get state(): TState +``` + +##### Returns + +`TState` + +#### Defined in + +[derived.ts:121](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L121) + +## Methods + +### cleanup() + +```ts +cleanup(): void +``` + +#### Returns + +`void` + +#### Defined in + +[derived.ts:130](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L130) + +*** + +### subscribe() + +```ts +subscribe(listener): () => void +``` + +#### Parameters + +• **listener**: `Listener` + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Defined in + +[derived.ts:140](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L140) diff --git a/docs/reference/classes/effect.md b/docs/reference/classes/effect.md new file mode 100644 index 0000000..113890d --- /dev/null +++ b/docs/reference/classes/effect.md @@ -0,0 +1,42 @@ +--- +id: Effect +title: Effect +--- + +# Class: Effect + +## Constructors + +### new Effect() + +```ts +new Effect(opts): Effect +``` + +#### Parameters + +• **opts**: `EffectOptions` + +#### Returns + +[`Effect`](effect.md) + +#### Defined in + +[effect.ts:19](https://github.com/TanStack/store/blob/main/packages/store/src/effect.ts#L19) + +## Methods + +### cleanup() + +```ts +cleanup(): void +``` + +#### Returns + +`void` + +#### Defined in + +[effect.ts:35](https://github.com/TanStack/store/blob/main/packages/store/src/effect.ts#L35) diff --git a/docs/reference/classes/store.md b/docs/reference/classes/store.md index eed14dc..c82fc46 100644 --- a/docs/reference/classes/store.md +++ b/docs/reference/classes/store.md @@ -31,7 +31,7 @@ new Store(initialState, options?): Store #### Defined in -[index.ts:50](https://github.com/TanStack/store/blob/main/packages/store/src/index.ts#L50) +[store.ts:42](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L42) ## Properties @@ -43,7 +43,7 @@ listeners: Set; #### Defined in -[index.ts:38](https://github.com/TanStack/store/blob/main/packages/store/src/index.ts#L38) +[store.ts:30](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L30) *** @@ -55,7 +55,7 @@ optional options: StoreOptions; #### Defined in -[index.ts:40](https://github.com/TanStack/store/blob/main/packages/store/src/index.ts#L40) +[store.ts:32](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L32) *** @@ -67,7 +67,7 @@ state: TState; #### Defined in -[index.ts:39](https://github.com/TanStack/store/blob/main/packages/store/src/index.ts#L39) +[store.ts:31](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L31) ## Methods @@ -87,7 +87,7 @@ batch(cb): void #### Defined in -[index.ts:89](https://github.com/TanStack/store/blob/main/packages/store/src/index.ts#L89) +[store.ts:81](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L81) *** @@ -107,7 +107,7 @@ setState(updater): void #### Defined in -[index.ts:64](https://github.com/TanStack/store/blob/main/packages/store/src/index.ts#L64) +[store.ts:56](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L56) *** @@ -131,4 +131,4 @@ subscribe(listener): () => void #### Defined in -[index.ts:55](https://github.com/TanStack/store/blob/main/packages/store/src/index.ts#L55) +[store.ts:47](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L47) diff --git a/docs/reference/index.md b/docs/reference/index.md index 1ad16e4..a2ee5d9 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -7,8 +7,11 @@ title: "@tanstack/store" ## Classes +- [Derived](classes/derived.md) +- [Effect](classes/effect.md) - [Store](classes/store.md) ## Interfaces +- [DerivedOptions](interfaces/derivedoptions.md) - [StoreOptions](interfaces/storeoptions.md) diff --git a/docs/reference/interfaces/derivedoptions.md b/docs/reference/interfaces/derivedoptions.md new file mode 100644 index 0000000..0f8e437 --- /dev/null +++ b/docs/reference/interfaces/derivedoptions.md @@ -0,0 +1,100 @@ +--- +id: DerivedOptions +title: DerivedOptions +--- + +# Interface: DerivedOptions\ + +## Type Parameters + +• **TState** + +## Properties + +### deps + +```ts +deps: (Derived | Store any>)[]; +``` + +#### Defined in + +[derived.ts:12](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L12) + +*** + +### fn() + +```ts +fn: () => TState; +``` + +#### Returns + +`TState` + +#### Defined in + +[derived.ts:13](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L13) + +*** + +### lazy? + +```ts +optional lazy: boolean; +``` + +Should the value of `Derived` only be computed once it is accessed + +#### Default + +```ts +false +``` + +#### Defined in + +[derived.ts:11](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L11) + +*** + +### onSubscribe()? + +```ts +optional onSubscribe: (listener, derived) => () => void; +``` + +#### Parameters + +• **listener**: `Listener` + +• **derived**: [`Derived`](../classes/derived.md)\<`TState`\> + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Defined in + +[derived.ts:5](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L5) + +*** + +### onUpdate()? + +```ts +optional onUpdate: () => void; +``` + +#### Returns + +`void` + +#### Defined in + +[derived.ts:6](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L6) diff --git a/docs/reference/interfaces/storeoptions.md b/docs/reference/interfaces/storeoptions.md index 5ae4d8f..8cedc02 100644 --- a/docs/reference/interfaces/storeoptions.md +++ b/docs/reference/interfaces/storeoptions.md @@ -39,7 +39,7 @@ a function to unsubscribe the listener #### Defined in -[index.ts:24](https://github.com/TanStack/store/blob/main/packages/store/src/index.ts#L24) +[store.ts:16](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L16) *** @@ -57,7 +57,7 @@ Called after the state has been updated, used to derive other state. #### Defined in -[index.ts:31](https://github.com/TanStack/store/blob/main/packages/store/src/index.ts#L31) +[store.ts:23](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L23) *** @@ -87,4 +87,4 @@ Replace the default update function with a custom one. #### Defined in -[index.ts:18](https://github.com/TanStack/store/blob/main/packages/store/src/index.ts#L18) +[store.ts:10](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L10) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 5fbd056..10fa367 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -14,14 +14,26 @@ export interface DerivedOptions { } export class Derived { + /** + * @private + */ _store: Store + /** + * @private + */ rootStores = new Set>() options: DerivedOptions - // Functions representing the subscriptions. Call a function to cleanup + /** + * Functions representing the subscriptions. Call a function to cleanup + * @private + */ _subscriptions: Array<() => void> = [] - // What store called the current update, if any + /** + * What store called the current update, if any + * @private + */ _whatStoreIsCurrentlyInUse: Store | null = null constructor(options: DerivedOptions) { diff --git a/packages/store/src/effect.ts b/packages/store/src/effect.ts index da7d050..8728c24 100644 --- a/packages/store/src/effect.ts +++ b/packages/store/src/effect.ts @@ -11,6 +11,9 @@ interface EffectOptions } export class Effect { + /** + * @private + */ _derived: Derived constructor(opts: EffectOptions) { From b952bce553c98affb1195fdf405d646fe7dce206 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 25 Nov 2024 07:18:49 -0800 Subject: [PATCH 28/81] chore: migrate derived and effect to have cleanup and mount as distinct steps --- packages/store/src/derived.ts | 81 +++++++++++++-------------- packages/store/src/effect.ts | 8 +-- packages/store/tests/derived.bench.ts | 6 ++ packages/store/tests/derived.test.ts | 22 ++++++++ packages/store/tests/effect.test.ts | 18 +++++- 5 files changed, 86 insertions(+), 49 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 10fa367..446d611 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -36,6 +36,24 @@ export class Derived { */ _whatStoreIsCurrentlyInUse: Store | null = null + /** + * This is here to solve the pyramid dependency problem where: + * A + * / \ + * B C + * \ / + * D + * + * Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is. + * + * To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been + * resolved. + * + * This is a record of stores, because derived stores are not able to write values to, but stores are + */ + storeToDerived = new Map, Set>>() + derivedToStore = new Map, Set>>() + constructor(options: DerivedOptions) { this.options = options const initVal = options.lazy @@ -45,35 +63,18 @@ export class Derived { onSubscribe: options.onSubscribe?.bind(this) as never, onUpdate: options.onUpdate, }) - /** - * This is here to solve the pyramid dependency problem where: - * A - * / \ - * B C - * \ / - * D - * - * Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is. - * - * To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been - * resolved. - * - * This is a record of stores, because derived stores are not able to write values to, but stores are - */ - const storeToDerived = new Map, Set>>() - const derivedToStore = new Map, Set>>() const updateStoreToDerived = ( store: Store, dep: Derived, ) => { - const prevDerivesForStore = storeToDerived.get(store) || new Set() + const prevDerivesForStore = this.storeToDerived.get(store) || new Set() prevDerivesForStore.add(dep) - storeToDerived.set(store, prevDerivesForStore) + this.storeToDerived.set(store, prevDerivesForStore) } for (const dep of options.deps) { if (dep instanceof Derived) { - derivedToStore.set(dep, dep.rootStores) + this.derivedToStore.set(dep, dep.rootStores) for (const store of dep.rootStores) { this.rootStores.add(store) updateStoreToDerived(store, dep) @@ -83,10 +84,21 @@ export class Derived { updateStoreToDerived(dep, this as Derived) } } + } + + get state() { + if (this.options.lazy && this._store.state === undefined) { + this.options.lazy = false + this._store.setState(() => this.options.fn()) + return this._store.state + } + return this._store.state + } + mount = () => { let __depsThatHaveWrittenThisTick: DerivedOptions['deps'] = [] - for (const dep of options.deps) { + for (const dep of this.options.deps) { const isDepAStore = dep instanceof Store let relatedLinkedDerivedVals: null | Set> = null @@ -94,7 +106,7 @@ export class Derived { const store = isDepAStore ? dep : dep._whatStoreIsCurrentlyInUse this._whatStoreIsCurrentlyInUse = store if (store) { - relatedLinkedDerivedVals = storeToDerived.get(store) ?? null + relatedLinkedDerivedVals = this.storeToDerived.get(store) ?? null } __depsThatHaveWrittenThisTick.push(dep) @@ -103,8 +115,8 @@ export class Derived { __depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.size ) { // Yay! All deps are resolved - write the value of this derived - if (!options.lazy) { - this._store.setState(options.fn) + if (!this.options.lazy) { + this._store.setState(this.options.fn) } // Cleanup the deps that have written this tick @@ -116,25 +128,12 @@ export class Derived { this._subscriptions.push(unsub) } - } - get state() { - if (this.options.lazy && this._store.state === undefined) { - this.options.lazy = false - this._store.setState(() => this.options.fn()) - return this._store.state - } - return this._store.state - } - - cleanup = () => { - for (const cleanup of this._subscriptions) { - cleanup() + return () => { + for (const cleanup of this._subscriptions) { + cleanup() + } } - }; - - [(Symbol as never as { readonly dispose: unique symbol }).dispose]() { - this.cleanup() } subscribe = (listener: Listener) => { diff --git a/packages/store/src/effect.ts b/packages/store/src/effect.ts index 8728c24..0b3ae74 100644 --- a/packages/store/src/effect.ts +++ b/packages/store/src/effect.ts @@ -32,11 +32,7 @@ export class Effect { } } - cleanup() { - this._derived.cleanup() - } - - [(Symbol as never as { readonly dispose: unique symbol }).dispose]() { - this.cleanup() + mount() { + return this._derived.mount() } } diff --git a/packages/store/tests/derived.bench.ts b/packages/store/tests/derived.bench.ts index 9dc743e..e789afd 100644 --- a/packages/store/tests/derived.bench.ts +++ b/packages/store/tests/derived.bench.ts @@ -33,14 +33,20 @@ describe('Derived', () => { bench('TanStack', () => { const a = new Store(1) const b = new Derived({ deps: [a], fn: () => a.state }) + b.mount() const c = new Derived({ deps: [a], fn: () => a.state }) + c.mount() const d = new Derived({ deps: [b], fn: () => b.state }) + d.mount() const e = new Derived({ deps: [b], fn: () => b.state }) + e.mount() const f = new Derived({ deps: [c], fn: () => c.state }) + f.mount() const g = new Derived({ deps: [d, e, f], fn: () => d.state + e.state + f.state, }) + g.mount() g.subscribe(() => noop(g.state)) diff --git a/packages/store/tests/derived.test.ts b/packages/store/tests/derived.test.ts index b94a776..d34804c 100644 --- a/packages/store/tests/derived.test.ts +++ b/packages/store/tests/derived.test.ts @@ -22,6 +22,8 @@ describe('Derived', () => { }, }) + halfCount.mount() + const doubleCount = new Derived({ deps: [count], fn: () => { @@ -29,6 +31,8 @@ describe('Derived', () => { }, }) + doubleCount.mount() + const sumDoubleHalfCount = new Derived({ deps: [halfCount, doubleCount], fn: () => { @@ -36,6 +40,8 @@ describe('Derived', () => { }, }) + sumDoubleHalfCount.mount() + const halfCountFn = viFnSubscribe(halfCount) const doubleCountFn = viFnSubscribe(doubleCount) const sumDoubleHalfCountFn = viFnSubscribe(sumDoubleHalfCount) @@ -66,14 +72,20 @@ describe('Derived', () => { test('Complex diamond dep problem', () => { const a = new Store(1) const b = new Derived({ deps: [a], fn: () => a.state }) + b.mount() const c = new Derived({ deps: [a], fn: () => a.state }) + c.mount() const d = new Derived({ deps: [b], fn: () => b.state }) + d.mount() const e = new Derived({ deps: [b], fn: () => b.state }) + e.mount() const f = new Derived({ deps: [c], fn: () => c.state }) + f.mount() const g = new Derived({ deps: [d, e, f], fn: () => d.state + e.state + f.state, }) + g.mount() const aFn = viFnSubscribe(a) const bFn = viFnSubscribe(b) @@ -104,6 +116,8 @@ describe('Derived', () => { }, }) + doubleCount.mount() + const tripleCount = new Derived({ deps: [count, doubleCount], fn: () => { @@ -111,6 +125,8 @@ describe('Derived', () => { }, }) + tripleCount.mount() + const doubleCountFn = viFnSubscribe(doubleCount) const tripleCountFn = viFnSubscribe(tripleCount) @@ -136,6 +152,8 @@ describe('Derived', () => { lazy: true, }) + doubleCount.mount() + const tripleCount = new Derived({ deps: [count, doubleCount], fn: () => { @@ -143,6 +161,8 @@ describe('Derived', () => { }, }) + tripleCount.mount() + const doubleCountFn = viFnSubscribe(doubleCount) const tripleCountFn = viFnSubscribe(tripleCount) @@ -169,6 +189,8 @@ describe('Derived', () => { lazy: true, }) + doubleCount.mount() + const doubleCountFn = viFnSubscribe(doubleCount) count.setState(() => 20) diff --git a/packages/store/tests/effect.test.ts b/packages/store/tests/effect.test.ts index 54dd922..9127efc 100644 --- a/packages/store/tests/effect.test.ts +++ b/packages/store/tests/effect.test.ts @@ -14,6 +14,8 @@ describe('Effect', () => { }, }) + halfCount.mount() + const doubleCount = new Derived({ deps: [count], fn: () => { @@ -21,6 +23,8 @@ describe('Effect', () => { }, }) + doubleCount.mount() + const sumDoubleHalfCount = new Derived({ deps: [halfCount, doubleCount], fn: () => { @@ -28,11 +32,14 @@ describe('Effect', () => { }, }) + sumDoubleHalfCount.mount() + const fn = vi.fn() - new Effect({ + const effect = new Effect({ deps: [sumDoubleHalfCount], fn: () => fn(sumDoubleHalfCount.state), }) + effect.mount() count.setState(() => 20) @@ -56,17 +63,24 @@ describe('Effect', () => { test('Complex diamond dep problem', () => { const a = new Store(1) const b = new Derived({ deps: [a], fn: () => a.state }) + b.mount() const c = new Derived({ deps: [a], fn: () => a.state }) + c.mount() const d = new Derived({ deps: [b], fn: () => b.state }) + d.mount() const e = new Derived({ deps: [b], fn: () => b.state }) + e.mount() const f = new Derived({ deps: [c], fn: () => c.state }) + f.mount() const g = new Derived({ deps: [d, e, f], fn: () => d.state + e.state + f.state, }) + g.mount() const fn = vi.fn() - new Effect({ deps: [g], fn: () => fn(g.state) }) + const effect = new Effect({ deps: [g], fn: () => fn(g.state) }) + effect.mount() a.setState(() => 2) From 9958187283e080741cf2e6e7e7f0efaa344ec56e Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 15:19:45 +0000 Subject: [PATCH 29/81] ci: apply automated fixes and generate docs --- docs/reference/classes/derived.md | 54 +++++++++++++++++++++++++++---- docs/reference/classes/effect.md | 8 +++-- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md index 14016ae..ba24e2f 100644 --- a/docs/reference/classes/derived.md +++ b/docs/reference/classes/derived.md @@ -27,10 +27,22 @@ new Derived(options): Derived #### Defined in -[derived.ts:39](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L39) +[derived.ts:57](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L57) ## Properties +### derivedToStore + +```ts +derivedToStore: Map, Set unknown>>>; +``` + +#### Defined in + +[derived.ts:55](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L55) + +*** + ### options ```ts @@ -41,6 +53,32 @@ options: DerivedOptions; [derived.ts:25](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L25) +*** + +### storeToDerived + +```ts +storeToDerived: Map unknown>, Set>>; +``` + +This is here to solve the pyramid dependency problem where: + A + / \ + B C + \ / + D + +Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is. + +To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been +resolved. + +This is a record of stores, because derived stores are not able to write values to, but stores are + +#### Defined in + +[derived.ts:54](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L54) + ## Accessors ### state @@ -57,23 +95,27 @@ get state(): TState #### Defined in -[derived.ts:121](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L121) +[derived.ts:89](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L89) ## Methods -### cleanup() +### mount() ```ts -cleanup(): void +mount(): () => void ``` #### Returns +`Function` + +##### Returns + `void` #### Defined in -[derived.ts:130](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L130) +[derived.ts:98](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L98) *** @@ -97,4 +139,4 @@ subscribe(listener): () => void #### Defined in -[derived.ts:140](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L140) +[derived.ts:139](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L139) diff --git a/docs/reference/classes/effect.md b/docs/reference/classes/effect.md index 113890d..8a67dcc 100644 --- a/docs/reference/classes/effect.md +++ b/docs/reference/classes/effect.md @@ -27,14 +27,18 @@ new Effect(opts): Effect ## Methods -### cleanup() +### mount() ```ts -cleanup(): void +mount(): () => void ``` #### Returns +`Function` + +##### Returns + `void` #### Defined in From b53b821ddb717cd8dd2eaabb50fd440d74ce80d8 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 25 Nov 2024 07:33:06 -0800 Subject: [PATCH 30/81] feat: add previous and current value to the store --- packages/store/src/derived.ts | 8 ++++++-- packages/store/src/store.ts | 11 +++++++---- packages/store/src/types.ts | 2 +- packages/store/tests/derived.test.ts | 15 +++++++++++++++ packages/store/tests/store.test.ts | 8 ++++++++ 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 446d611..eca2186 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -2,7 +2,10 @@ import { Store } from './store' import type { Listener } from './types' export interface DerivedOptions { - onSubscribe?: (listener: Listener, derived: Derived) => () => void + onSubscribe?: ( + listener: Listener, + derived: Derived, + ) => () => void onUpdate?: () => void /** * Should the value of `Derived` only be computed once it is accessed @@ -59,6 +62,7 @@ export class Derived { const initVal = options.lazy ? (undefined as ReturnType) : options.fn() + this._store = new Store(initVal, { onSubscribe: options.onSubscribe?.bind(this) as never, onUpdate: options.onUpdate, @@ -136,7 +140,7 @@ export class Derived { } } - subscribe = (listener: Listener) => { + subscribe = (listener: Listener) => { return this._store.subscribe(listener) } } diff --git a/packages/store/src/store.ts b/packages/store/src/store.ts index 562927d..8a372fa 100644 --- a/packages/store/src/store.ts +++ b/packages/store/src/store.ts @@ -14,7 +14,7 @@ export interface StoreOptions< * @return a function to unsubscribe the listener */ onSubscribe?: ( - listener: Listener, + listener: Listener, store: Store, ) => () => void /** @@ -27,8 +27,9 @@ export class Store< TState, TUpdater extends AnyUpdater = (cb: TState) => TState, > { - listeners = new Set() + listeners = new Set>() state: TState + prevState: TState options?: StoreOptions /** * @private @@ -40,11 +41,12 @@ export class Store< _flushing = 0 constructor(initialState: TState, options?: StoreOptions) { + this.prevState = initialState this.state = initialState this.options = options } - subscribe = (listener: Listener) => { + subscribe = (listener: Listener) => { this.listeners.add(listener) const unsub = this.options?.onSubscribe?.(listener, this) return () => { @@ -64,6 +66,7 @@ export class Store< // Attempt to flush this._flush() + this.prevState = this.state } /** @@ -74,7 +77,7 @@ export class Store< const flushId = ++this._flushing for (const listener of this.listeners) { if (this._flushing !== flushId) continue - listener() + listener({ prevVal: this.prevState, currentVal: this.state }) } } diff --git a/packages/store/src/types.ts b/packages/store/src/types.ts index ab92e43..51496d1 100644 --- a/packages/store/src/types.ts +++ b/packages/store/src/types.ts @@ -6,4 +6,4 @@ export type AnyUpdater = (...args: Array) => any /** * @private */ -export type Listener = () => void +export type Listener = (props: { prevVal: T; currentVal: T }) => void diff --git a/packages/store/tests/derived.test.ts b/packages/store/tests/derived.test.ts index d34804c..f3ba1fc 100644 --- a/packages/store/tests/derived.test.ts +++ b/packages/store/tests/derived.test.ts @@ -198,4 +198,19 @@ describe('Derived', () => { expect(doubleCountFn).not.toHaveBeenCalled() expect(viFn).not.toHaveBeenCalled() }) + + test('listeners should receive old and new values', () => { + const store = new Store(12) + const derived = new Derived({ + deps: [store], + fn: () => { + return store.state * 2 + }, + }) + derived.mount() + const fn = vi.fn() + derived.subscribe(fn) + store.setState(() => 24) + expect(fn).toBeCalledWith({ prevVal: 24, currentVal: 48 }) + }) }) diff --git a/packages/store/tests/store.test.ts b/packages/store/tests/store.test.ts index e2fc75f..79f38e7 100644 --- a/packages/store/tests/store.test.ts +++ b/packages/store/tests/store.test.ts @@ -81,4 +81,12 @@ describe('store', () => { expect(listener).toHaveBeenCalledTimes(5) unsub() }) + + test('listeners should receive old and new values', () => { + const store = new Store(12) + const fn = vi.fn() + store.subscribe(fn) + store.setState(() => 24) + expect(fn).toBeCalledWith({ prevVal: 12, currentVal: 24 }) + }) }) From a46d7784a7195f316af67a1130f83a8118fd96cc Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 25 Nov 2024 07:45:07 -0800 Subject: [PATCH 31/81] feat: add ability to track previous and new values of deps --- packages/store/src/derived.ts | 37 +++++++++++++++++++++++++--- packages/store/tests/derived.test.ts | 18 ++++++++++++++ 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index eca2186..5c57dfe 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -13,7 +13,16 @@ export interface DerivedOptions { */ lazy?: boolean deps: Array | Store> - fn: () => TState + /** + * Values of the `deps` from before and after the current invocation of `fn` + * + * @todo Improve the typings to match `deps` from above + */ + fn: (props: { + // `undefined` if it's the first run + prevVals: Array | undefined + currentVals: Array + }) => TState } export class Derived { @@ -57,11 +66,27 @@ export class Derived { storeToDerived = new Map, Set>>() derivedToStore = new Map, Set>>() + getDepVals = () => { + const prevVals = [] as Array + const currentVals = [] as Array + for (const dep of this.options.deps) { + prevVals.push(dep.prevState) + currentVals.push(dep.state) + } + return { + prevVals, + currentVals, + } + } + constructor(options: DerivedOptions) { this.options = options const initVal = options.lazy ? (undefined as ReturnType) - : options.fn() + : options.fn({ + prevVals: undefined, + currentVals: this.getDepVals().currentVals, + }) this._store = new Store(initVal, { onSubscribe: options.onSubscribe?.bind(this) as never, @@ -93,12 +118,16 @@ export class Derived { get state() { if (this.options.lazy && this._store.state === undefined) { this.options.lazy = false - this._store.setState(() => this.options.fn()) + this._store.setState(() => this.options.fn(this.getDepVals())) return this._store.state } return this._store.state } + get prevState() { + return this._store.prevState + } + mount = () => { let __depsThatHaveWrittenThisTick: DerivedOptions['deps'] = [] @@ -120,7 +149,7 @@ export class Derived { ) { // Yay! All deps are resolved - write the value of this derived if (!this.options.lazy) { - this._store.setState(this.options.fn) + this._store.setState(() => this.options.fn(this.getDepVals())) } // Cleanup the deps that have written this tick diff --git a/packages/store/tests/derived.test.ts b/packages/store/tests/derived.test.ts index f3ba1fc..21c1fc6 100644 --- a/packages/store/tests/derived.test.ts +++ b/packages/store/tests/derived.test.ts @@ -213,4 +213,22 @@ describe('Derived', () => { store.setState(() => 24) expect(fn).toBeCalledWith({ prevVal: 24, currentVal: 48 }) }) + + test('derivedFn should receive old and new values', () => { + const count = new Store(12) + const date = new Date() + const time = new Store(date) + const fn = vi.fn() + const derived = new Derived({ + deps: [count, time], + fn: ({ prevVals, currentVals }) => { + fn({ prevVals, currentVals }) + return void 0 + }, + }) + derived.mount() + expect(fn).toBeCalledWith({ prevVals: undefined, currentVals: [12, date] }) + count.setState(() => 24) + expect(fn).toBeCalledWith({ prevVals: [12, date], currentVals: [24, date] }) + }) }) From cd7bb0d191280ad42a308f9f3e76f82793d232fb Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 15:46:21 +0000 Subject: [PATCH 32/81] ci: apply automated fixes and generate docs --- .../reference/functions/injectstore.md | 37 ----- docs/framework/angular/reference/index.md | 10 -- .../react/reference/functions/shallow.md | 28 ---- .../react/reference/functions/usestore.md | 32 ---- docs/framework/react/reference/index.md | 11 -- .../solid/reference/functions/usestore.md | 32 ---- docs/framework/solid/reference/index.md | 10 -- .../svelte/reference/functions/shallow.md | 28 ---- .../svelte/reference/functions/usestore.md | 44 ------ docs/framework/svelte/reference/index.md | 11 -- .../vue/reference/functions/shallow.md | 28 ---- .../vue/reference/functions/usestore.md | 32 ---- docs/framework/vue/reference/index.md | 11 -- docs/reference/classes/derived.md | 142 ------------------ docs/reference/classes/effect.md | 46 ------ docs/reference/classes/store.md | 134 ----------------- docs/reference/index.md | 17 --- docs/reference/interfaces/derivedoptions.md | 100 ------------ docs/reference/interfaces/storeoptions.md | 90 ----------- 19 files changed, 843 deletions(-) delete mode 100644 docs/framework/angular/reference/functions/injectstore.md delete mode 100644 docs/framework/angular/reference/index.md delete mode 100644 docs/framework/react/reference/functions/shallow.md delete mode 100644 docs/framework/react/reference/functions/usestore.md delete mode 100644 docs/framework/react/reference/index.md delete mode 100644 docs/framework/solid/reference/functions/usestore.md delete mode 100644 docs/framework/solid/reference/index.md delete mode 100644 docs/framework/svelte/reference/functions/shallow.md delete mode 100644 docs/framework/svelte/reference/functions/usestore.md delete mode 100644 docs/framework/svelte/reference/index.md delete mode 100644 docs/framework/vue/reference/functions/shallow.md delete mode 100644 docs/framework/vue/reference/functions/usestore.md delete mode 100644 docs/framework/vue/reference/index.md delete mode 100644 docs/reference/classes/derived.md delete mode 100644 docs/reference/classes/effect.md delete mode 100644 docs/reference/classes/store.md delete mode 100644 docs/reference/index.md delete mode 100644 docs/reference/interfaces/derivedoptions.md delete mode 100644 docs/reference/interfaces/storeoptions.md diff --git a/docs/framework/angular/reference/functions/injectstore.md b/docs/framework/angular/reference/functions/injectstore.md deleted file mode 100644 index 895f6d3..0000000 --- a/docs/framework/angular/reference/functions/injectstore.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -id: injectStore -title: injectStore ---- - -# Function: injectStore() - -```ts -function injectStore( - store, - selector, -options): Signal -``` - -## Type Parameters - -• **TState** - -• **TSelected** = `NoInfer`\<`TState`\> - -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters - -• **store**: `Store`\<`TState`, `TUpdater`\> - -• **selector** = `...` - -• **options**: `CreateSignalOptions`\<`TSelected`\> & `object` = `...` - -## Returns - -`Signal`\<`TSelected`\> - -## Defined in - -[index.ts:17](https://github.com/TanStack/store/blob/main/packages/angular-store/src/index.ts#L17) diff --git a/docs/framework/angular/reference/index.md b/docs/framework/angular/reference/index.md deleted file mode 100644 index ac9a76d..0000000 --- a/docs/framework/angular/reference/index.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -id: "@tanstack/angular-store" -title: "@tanstack/angular-store" ---- - -# @tanstack/angular-store - -## Functions - -- [injectStore](functions/injectstore.md) diff --git a/docs/framework/react/reference/functions/shallow.md b/docs/framework/react/reference/functions/shallow.md deleted file mode 100644 index d434664..0000000 --- a/docs/framework/react/reference/functions/shallow.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: shallow -title: shallow ---- - -# Function: shallow() - -```ts -function shallow(objA, objB): boolean -``` - -## Type Parameters - -• **T** - -## Parameters - -• **objA**: `T` - -• **objB**: `T` - -## Returns - -`boolean` - -## Defined in - -[index.ts:30](https://github.com/TanStack/store/blob/main/packages/react-store/src/index.ts#L30) diff --git a/docs/framework/react/reference/functions/usestore.md b/docs/framework/react/reference/functions/usestore.md deleted file mode 100644 index c8708ea..0000000 --- a/docs/framework/react/reference/functions/usestore.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -id: useStore -title: useStore ---- - -# Function: useStore() - -```ts -function useStore(store, selector): TSelected -``` - -## Type Parameters - -• **TState** - -• **TSelected** = `NoInfer`\<`TState`\> - -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters - -• **store**: `Store`\<`TState`, `TUpdater`\> - -• **selector** = `...` - -## Returns - -`TSelected` - -## Defined in - -[index.ts:11](https://github.com/TanStack/store/blob/main/packages/react-store/src/index.ts#L11) diff --git a/docs/framework/react/reference/index.md b/docs/framework/react/reference/index.md deleted file mode 100644 index 4a1665a..0000000 --- a/docs/framework/react/reference/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: "@tanstack/react-store" -title: "@tanstack/react-store" ---- - -# @tanstack/react-store - -## Functions - -- [shallow](functions/shallow.md) -- [useStore](functions/usestore.md) diff --git a/docs/framework/solid/reference/functions/usestore.md b/docs/framework/solid/reference/functions/usestore.md deleted file mode 100644 index 414ef75..0000000 --- a/docs/framework/solid/reference/functions/usestore.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -id: useStore -title: useStore ---- - -# Function: useStore() - -```ts -function useStore(store, selector): Accessor -``` - -## Type Parameters - -• **TState** - -• **TSelected** = `NoInfer`\<`TState`\> - -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters - -• **store**: `Store`\<`TState`, `TUpdater`\> - -• **selector** = `...` - -## Returns - -`Accessor`\<`TSelected`\> - -## Defined in - -[index.tsx:13](https://github.com/TanStack/store/blob/main/packages/solid-store/src/index.tsx#L13) diff --git a/docs/framework/solid/reference/index.md b/docs/framework/solid/reference/index.md deleted file mode 100644 index a6e4497..0000000 --- a/docs/framework/solid/reference/index.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -id: "@tanstack/solid-store" -title: "@tanstack/solid-store" ---- - -# @tanstack/solid-store - -## Functions - -- [useStore](functions/usestore.md) diff --git a/docs/framework/svelte/reference/functions/shallow.md b/docs/framework/svelte/reference/functions/shallow.md deleted file mode 100644 index ec5fc24..0000000 --- a/docs/framework/svelte/reference/functions/shallow.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: shallow -title: shallow ---- - -# Function: shallow() - -```ts -function shallow(objA, objB): boolean -``` - -## Type Parameters - -• **T** - -## Parameters - -• **objA**: `T` - -• **objB**: `T` - -## Returns - -`boolean` - -## Defined in - -[index.svelte.ts:39](https://github.com/TanStack/store/blob/main/packages/svelte-store/src/index.svelte.ts#L39) diff --git a/docs/framework/svelte/reference/functions/usestore.md b/docs/framework/svelte/reference/functions/usestore.md deleted file mode 100644 index eb7925e..0000000 --- a/docs/framework/svelte/reference/functions/usestore.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -id: useStore -title: useStore ---- - -# Function: useStore() - -```ts -function useStore(store, selector): object -``` - -## Type Parameters - -• **TState** - -• **TSelected** = `NoInfer`\<`TState`\> - -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters - -• **store**: `Store`\<`TState`, `TUpdater`\> - -• **selector** = `...` - -## Returns - -`object` - -### current - -#### Get Signature - -```ts -get current(): TSelected -``` - -##### Returns - -`TSelected` - -## Defined in - -[index.svelte.ts:10](https://github.com/TanStack/store/blob/main/packages/svelte-store/src/index.svelte.ts#L10) diff --git a/docs/framework/svelte/reference/index.md b/docs/framework/svelte/reference/index.md deleted file mode 100644 index 36d4f81..0000000 --- a/docs/framework/svelte/reference/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: "@tanstack/svelte-store" -title: "@tanstack/svelte-store" ---- - -# @tanstack/svelte-store - -## Functions - -- [shallow](functions/shallow.md) -- [useStore](functions/usestore.md) diff --git a/docs/framework/vue/reference/functions/shallow.md b/docs/framework/vue/reference/functions/shallow.md deleted file mode 100644 index 157a151..0000000 --- a/docs/framework/vue/reference/functions/shallow.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: shallow -title: shallow ---- - -# Function: shallow() - -```ts -function shallow(objA, objB): boolean -``` - -## Type Parameters - -• **T** - -## Parameters - -• **objA**: `T` - -• **objB**: `T` - -## Returns - -`boolean` - -## Defined in - -[index.ts:43](https://github.com/TanStack/store/blob/main/packages/vue-store/src/index.ts#L43) diff --git a/docs/framework/vue/reference/functions/usestore.md b/docs/framework/vue/reference/functions/usestore.md deleted file mode 100644 index dc20e9e..0000000 --- a/docs/framework/vue/reference/functions/usestore.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -id: useStore -title: useStore ---- - -# Function: useStore() - -```ts -function useStore(store, selector): Readonly> -``` - -## Type Parameters - -• **TState** - -• **TSelected** = `NoInfer`\<`TState`\> - -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters - -• **store**: `Store`\<`TState`, `TUpdater`\> - -• **selector** = `...` - -## Returns - -`Readonly`\<`Ref`\<`TSelected`\>\> - -## Defined in - -[index.ts:12](https://github.com/TanStack/store/blob/main/packages/vue-store/src/index.ts#L12) diff --git a/docs/framework/vue/reference/index.md b/docs/framework/vue/reference/index.md deleted file mode 100644 index 7fef438..0000000 --- a/docs/framework/vue/reference/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: "@tanstack/vue-store" -title: "@tanstack/vue-store" ---- - -# @tanstack/vue-store - -## Functions - -- [shallow](functions/shallow.md) -- [useStore](functions/usestore.md) diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md deleted file mode 100644 index ba24e2f..0000000 --- a/docs/reference/classes/derived.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -id: Derived -title: Derived ---- - -# Class: Derived\ - -## Type Parameters - -• **TState** - -## Constructors - -### new Derived() - -```ts -new Derived(options): Derived -``` - -#### Parameters - -• **options**: [`DerivedOptions`](../interfaces/derivedoptions.md)\<`TState`\> - -#### Returns - -[`Derived`](derived.md)\<`TState`\> - -#### Defined in - -[derived.ts:57](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L57) - -## Properties - -### derivedToStore - -```ts -derivedToStore: Map, Set unknown>>>; -``` - -#### Defined in - -[derived.ts:55](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L55) - -*** - -### options - -```ts -options: DerivedOptions; -``` - -#### Defined in - -[derived.ts:25](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L25) - -*** - -### storeToDerived - -```ts -storeToDerived: Map unknown>, Set>>; -``` - -This is here to solve the pyramid dependency problem where: - A - / \ - B C - \ / - D - -Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is. - -To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been -resolved. - -This is a record of stores, because derived stores are not able to write values to, but stores are - -#### Defined in - -[derived.ts:54](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L54) - -## Accessors - -### state - -#### Get Signature - -```ts -get state(): TState -``` - -##### Returns - -`TState` - -#### Defined in - -[derived.ts:89](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L89) - -## Methods - -### mount() - -```ts -mount(): () => void -``` - -#### Returns - -`Function` - -##### Returns - -`void` - -#### Defined in - -[derived.ts:98](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L98) - -*** - -### subscribe() - -```ts -subscribe(listener): () => void -``` - -#### Parameters - -• **listener**: `Listener` - -#### Returns - -`Function` - -##### Returns - -`void` - -#### Defined in - -[derived.ts:139](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L139) diff --git a/docs/reference/classes/effect.md b/docs/reference/classes/effect.md deleted file mode 100644 index 8a67dcc..0000000 --- a/docs/reference/classes/effect.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -id: Effect -title: Effect ---- - -# Class: Effect - -## Constructors - -### new Effect() - -```ts -new Effect(opts): Effect -``` - -#### Parameters - -• **opts**: `EffectOptions` - -#### Returns - -[`Effect`](effect.md) - -#### Defined in - -[effect.ts:19](https://github.com/TanStack/store/blob/main/packages/store/src/effect.ts#L19) - -## Methods - -### mount() - -```ts -mount(): () => void -``` - -#### Returns - -`Function` - -##### Returns - -`void` - -#### Defined in - -[effect.ts:35](https://github.com/TanStack/store/blob/main/packages/store/src/effect.ts#L35) diff --git a/docs/reference/classes/store.md b/docs/reference/classes/store.md deleted file mode 100644 index c82fc46..0000000 --- a/docs/reference/classes/store.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -id: Store -title: Store ---- - -# Class: Store\ - -## Type Parameters - -• **TState** - -• **TUpdater** *extends* `AnyUpdater` = (`cb`) => `TState` - -## Constructors - -### new Store() - -```ts -new Store(initialState, options?): Store -``` - -#### Parameters - -• **initialState**: `TState` - -• **options?**: [`StoreOptions`](../interfaces/storeoptions.md)\<`TState`, `TUpdater`\> - -#### Returns - -[`Store`](store.md)\<`TState`, `TUpdater`\> - -#### Defined in - -[store.ts:42](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L42) - -## Properties - -### listeners - -```ts -listeners: Set; -``` - -#### Defined in - -[store.ts:30](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L30) - -*** - -### options? - -```ts -optional options: StoreOptions; -``` - -#### Defined in - -[store.ts:32](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L32) - -*** - -### state - -```ts -state: TState; -``` - -#### Defined in - -[store.ts:31](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L31) - -## Methods - -### batch() - -```ts -batch(cb): void -``` - -#### Parameters - -• **cb** - -#### Returns - -`void` - -#### Defined in - -[store.ts:81](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L81) - -*** - -### setState() - -```ts -setState(updater): void -``` - -#### Parameters - -• **updater**: `TUpdater` - -#### Returns - -`void` - -#### Defined in - -[store.ts:56](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L56) - -*** - -### subscribe() - -```ts -subscribe(listener): () => void -``` - -#### Parameters - -• **listener**: `Listener` - -#### Returns - -`Function` - -##### Returns - -`void` - -#### Defined in - -[store.ts:47](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L47) diff --git a/docs/reference/index.md b/docs/reference/index.md deleted file mode 100644 index a2ee5d9..0000000 --- a/docs/reference/index.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: "@tanstack/store" -title: "@tanstack/store" ---- - -# @tanstack/store - -## Classes - -- [Derived](classes/derived.md) -- [Effect](classes/effect.md) -- [Store](classes/store.md) - -## Interfaces - -- [DerivedOptions](interfaces/derivedoptions.md) -- [StoreOptions](interfaces/storeoptions.md) diff --git a/docs/reference/interfaces/derivedoptions.md b/docs/reference/interfaces/derivedoptions.md deleted file mode 100644 index 0f8e437..0000000 --- a/docs/reference/interfaces/derivedoptions.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -id: DerivedOptions -title: DerivedOptions ---- - -# Interface: DerivedOptions\ - -## Type Parameters - -• **TState** - -## Properties - -### deps - -```ts -deps: (Derived | Store any>)[]; -``` - -#### Defined in - -[derived.ts:12](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L12) - -*** - -### fn() - -```ts -fn: () => TState; -``` - -#### Returns - -`TState` - -#### Defined in - -[derived.ts:13](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L13) - -*** - -### lazy? - -```ts -optional lazy: boolean; -``` - -Should the value of `Derived` only be computed once it is accessed - -#### Default - -```ts -false -``` - -#### Defined in - -[derived.ts:11](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L11) - -*** - -### onSubscribe()? - -```ts -optional onSubscribe: (listener, derived) => () => void; -``` - -#### Parameters - -• **listener**: `Listener` - -• **derived**: [`Derived`](../classes/derived.md)\<`TState`\> - -#### Returns - -`Function` - -##### Returns - -`void` - -#### Defined in - -[derived.ts:5](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L5) - -*** - -### onUpdate()? - -```ts -optional onUpdate: () => void; -``` - -#### Returns - -`void` - -#### Defined in - -[derived.ts:6](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L6) diff --git a/docs/reference/interfaces/storeoptions.md b/docs/reference/interfaces/storeoptions.md deleted file mode 100644 index 8cedc02..0000000 --- a/docs/reference/interfaces/storeoptions.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -id: StoreOptions -title: StoreOptions ---- - -# Interface: StoreOptions\ - -## Type Parameters - -• **TState** - -• **TUpdater** *extends* `AnyUpdater` = (`cb`) => `TState` - -## Properties - -### onSubscribe()? - -```ts -optional onSubscribe: (listener, store) => () => void; -``` - -Called when a listener subscribes to the store. - -#### Parameters - -• **listener**: `Listener` - -• **store**: [`Store`](../classes/store.md)\<`TState`, `TUpdater`\> - -#### Returns - -`Function` - -a function to unsubscribe the listener - -##### Returns - -`void` - -#### Defined in - -[store.ts:16](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L16) - -*** - -### onUpdate()? - -```ts -optional onUpdate: () => void; -``` - -Called after the state has been updated, used to derive other state. - -#### Returns - -`void` - -#### Defined in - -[store.ts:23](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L23) - -*** - -### updateFn()? - -```ts -optional updateFn: (previous) => (updater) => TState; -``` - -Replace the default update function with a custom one. - -#### Parameters - -• **previous**: `TState` - -#### Returns - -`Function` - -##### Parameters - -• **updater**: `TUpdater` - -##### Returns - -`TState` - -#### Defined in - -[store.ts:10](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L10) From 0fe462802b73ba8c6ceab562b36930eeef90a9a8 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Mon, 25 Nov 2024 08:04:18 -0800 Subject: [PATCH 33/81] chore: fix build --- packages/store/src/effect.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/store/src/effect.ts b/packages/store/src/effect.ts index 0b3ae74..cbb647c 100644 --- a/packages/store/src/effect.ts +++ b/packages/store/src/effect.ts @@ -2,12 +2,16 @@ import { Derived } from './derived' import type { DerivedOptions } from './derived' interface EffectOptions - extends Omit, 'onUpdate' | 'onSubscribe' | 'lazy'> { + extends Omit< + DerivedOptions, + 'onUpdate' | 'onSubscribe' | 'lazy' | 'fn' + > { /** * Should the effect trigger immediately? * @default false */ eager?: boolean + fn: () => void } export class Effect { From cc484365bb76e76f68a2e111b30c1252742d7e8e Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 16:05:24 +0000 Subject: [PATCH 34/81] ci: apply automated fixes and generate docs --- .../reference/functions/injectstore.md | 37 ++++ docs/framework/angular/reference/index.md | 10 + .../react/reference/functions/shallow.md | 28 +++ .../react/reference/functions/usestore.md | 32 +++ docs/framework/react/reference/index.md | 11 + .../solid/reference/functions/usestore.md | 32 +++ docs/framework/solid/reference/index.md | 10 + .../svelte/reference/functions/shallow.md | 28 +++ .../svelte/reference/functions/usestore.md | 44 ++++ docs/framework/svelte/reference/index.md | 11 + .../vue/reference/functions/shallow.md | 28 +++ .../vue/reference/functions/usestore.md | 32 +++ docs/framework/vue/reference/index.md | 11 + docs/reference/classes/derived.md | 188 ++++++++++++++++++ docs/reference/classes/effect.md | 46 +++++ docs/reference/classes/store.md | 146 ++++++++++++++ docs/reference/index.md | 17 ++ docs/reference/interfaces/derivedoptions.md | 114 +++++++++++ docs/reference/interfaces/storeoptions.md | 90 +++++++++ 19 files changed, 915 insertions(+) create mode 100644 docs/framework/angular/reference/functions/injectstore.md create mode 100644 docs/framework/angular/reference/index.md create mode 100644 docs/framework/react/reference/functions/shallow.md create mode 100644 docs/framework/react/reference/functions/usestore.md create mode 100644 docs/framework/react/reference/index.md create mode 100644 docs/framework/solid/reference/functions/usestore.md create mode 100644 docs/framework/solid/reference/index.md create mode 100644 docs/framework/svelte/reference/functions/shallow.md create mode 100644 docs/framework/svelte/reference/functions/usestore.md create mode 100644 docs/framework/svelte/reference/index.md create mode 100644 docs/framework/vue/reference/functions/shallow.md create mode 100644 docs/framework/vue/reference/functions/usestore.md create mode 100644 docs/framework/vue/reference/index.md create mode 100644 docs/reference/classes/derived.md create mode 100644 docs/reference/classes/effect.md create mode 100644 docs/reference/classes/store.md create mode 100644 docs/reference/index.md create mode 100644 docs/reference/interfaces/derivedoptions.md create mode 100644 docs/reference/interfaces/storeoptions.md diff --git a/docs/framework/angular/reference/functions/injectstore.md b/docs/framework/angular/reference/functions/injectstore.md new file mode 100644 index 0000000..895f6d3 --- /dev/null +++ b/docs/framework/angular/reference/functions/injectstore.md @@ -0,0 +1,37 @@ +--- +id: injectStore +title: injectStore +--- + +# Function: injectStore() + +```ts +function injectStore( + store, + selector, +options): Signal +``` + +## Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> + +• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` + +## Parameters + +• **store**: `Store`\<`TState`, `TUpdater`\> + +• **selector** = `...` + +• **options**: `CreateSignalOptions`\<`TSelected`\> & `object` = `...` + +## Returns + +`Signal`\<`TSelected`\> + +## Defined in + +[index.ts:17](https://github.com/TanStack/store/blob/main/packages/angular-store/src/index.ts#L17) diff --git a/docs/framework/angular/reference/index.md b/docs/framework/angular/reference/index.md new file mode 100644 index 0000000..ac9a76d --- /dev/null +++ b/docs/framework/angular/reference/index.md @@ -0,0 +1,10 @@ +--- +id: "@tanstack/angular-store" +title: "@tanstack/angular-store" +--- + +# @tanstack/angular-store + +## Functions + +- [injectStore](functions/injectstore.md) diff --git a/docs/framework/react/reference/functions/shallow.md b/docs/framework/react/reference/functions/shallow.md new file mode 100644 index 0000000..d434664 --- /dev/null +++ b/docs/framework/react/reference/functions/shallow.md @@ -0,0 +1,28 @@ +--- +id: shallow +title: shallow +--- + +# Function: shallow() + +```ts +function shallow(objA, objB): boolean +``` + +## Type Parameters + +• **T** + +## Parameters + +• **objA**: `T` + +• **objB**: `T` + +## Returns + +`boolean` + +## Defined in + +[index.ts:30](https://github.com/TanStack/store/blob/main/packages/react-store/src/index.ts#L30) diff --git a/docs/framework/react/reference/functions/usestore.md b/docs/framework/react/reference/functions/usestore.md new file mode 100644 index 0000000..c8708ea --- /dev/null +++ b/docs/framework/react/reference/functions/usestore.md @@ -0,0 +1,32 @@ +--- +id: useStore +title: useStore +--- + +# Function: useStore() + +```ts +function useStore(store, selector): TSelected +``` + +## Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> + +• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` + +## Parameters + +• **store**: `Store`\<`TState`, `TUpdater`\> + +• **selector** = `...` + +## Returns + +`TSelected` + +## Defined in + +[index.ts:11](https://github.com/TanStack/store/blob/main/packages/react-store/src/index.ts#L11) diff --git a/docs/framework/react/reference/index.md b/docs/framework/react/reference/index.md new file mode 100644 index 0000000..4a1665a --- /dev/null +++ b/docs/framework/react/reference/index.md @@ -0,0 +1,11 @@ +--- +id: "@tanstack/react-store" +title: "@tanstack/react-store" +--- + +# @tanstack/react-store + +## Functions + +- [shallow](functions/shallow.md) +- [useStore](functions/usestore.md) diff --git a/docs/framework/solid/reference/functions/usestore.md b/docs/framework/solid/reference/functions/usestore.md new file mode 100644 index 0000000..414ef75 --- /dev/null +++ b/docs/framework/solid/reference/functions/usestore.md @@ -0,0 +1,32 @@ +--- +id: useStore +title: useStore +--- + +# Function: useStore() + +```ts +function useStore(store, selector): Accessor +``` + +## Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> + +• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` + +## Parameters + +• **store**: `Store`\<`TState`, `TUpdater`\> + +• **selector** = `...` + +## Returns + +`Accessor`\<`TSelected`\> + +## Defined in + +[index.tsx:13](https://github.com/TanStack/store/blob/main/packages/solid-store/src/index.tsx#L13) diff --git a/docs/framework/solid/reference/index.md b/docs/framework/solid/reference/index.md new file mode 100644 index 0000000..a6e4497 --- /dev/null +++ b/docs/framework/solid/reference/index.md @@ -0,0 +1,10 @@ +--- +id: "@tanstack/solid-store" +title: "@tanstack/solid-store" +--- + +# @tanstack/solid-store + +## Functions + +- [useStore](functions/usestore.md) diff --git a/docs/framework/svelte/reference/functions/shallow.md b/docs/framework/svelte/reference/functions/shallow.md new file mode 100644 index 0000000..ec5fc24 --- /dev/null +++ b/docs/framework/svelte/reference/functions/shallow.md @@ -0,0 +1,28 @@ +--- +id: shallow +title: shallow +--- + +# Function: shallow() + +```ts +function shallow(objA, objB): boolean +``` + +## Type Parameters + +• **T** + +## Parameters + +• **objA**: `T` + +• **objB**: `T` + +## Returns + +`boolean` + +## Defined in + +[index.svelte.ts:39](https://github.com/TanStack/store/blob/main/packages/svelte-store/src/index.svelte.ts#L39) diff --git a/docs/framework/svelte/reference/functions/usestore.md b/docs/framework/svelte/reference/functions/usestore.md new file mode 100644 index 0000000..eb7925e --- /dev/null +++ b/docs/framework/svelte/reference/functions/usestore.md @@ -0,0 +1,44 @@ +--- +id: useStore +title: useStore +--- + +# Function: useStore() + +```ts +function useStore(store, selector): object +``` + +## Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> + +• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` + +## Parameters + +• **store**: `Store`\<`TState`, `TUpdater`\> + +• **selector** = `...` + +## Returns + +`object` + +### current + +#### Get Signature + +```ts +get current(): TSelected +``` + +##### Returns + +`TSelected` + +## Defined in + +[index.svelte.ts:10](https://github.com/TanStack/store/blob/main/packages/svelte-store/src/index.svelte.ts#L10) diff --git a/docs/framework/svelte/reference/index.md b/docs/framework/svelte/reference/index.md new file mode 100644 index 0000000..36d4f81 --- /dev/null +++ b/docs/framework/svelte/reference/index.md @@ -0,0 +1,11 @@ +--- +id: "@tanstack/svelte-store" +title: "@tanstack/svelte-store" +--- + +# @tanstack/svelte-store + +## Functions + +- [shallow](functions/shallow.md) +- [useStore](functions/usestore.md) diff --git a/docs/framework/vue/reference/functions/shallow.md b/docs/framework/vue/reference/functions/shallow.md new file mode 100644 index 0000000..157a151 --- /dev/null +++ b/docs/framework/vue/reference/functions/shallow.md @@ -0,0 +1,28 @@ +--- +id: shallow +title: shallow +--- + +# Function: shallow() + +```ts +function shallow(objA, objB): boolean +``` + +## Type Parameters + +• **T** + +## Parameters + +• **objA**: `T` + +• **objB**: `T` + +## Returns + +`boolean` + +## Defined in + +[index.ts:43](https://github.com/TanStack/store/blob/main/packages/vue-store/src/index.ts#L43) diff --git a/docs/framework/vue/reference/functions/usestore.md b/docs/framework/vue/reference/functions/usestore.md new file mode 100644 index 0000000..dc20e9e --- /dev/null +++ b/docs/framework/vue/reference/functions/usestore.md @@ -0,0 +1,32 @@ +--- +id: useStore +title: useStore +--- + +# Function: useStore() + +```ts +function useStore(store, selector): Readonly> +``` + +## Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> + +• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` + +## Parameters + +• **store**: `Store`\<`TState`, `TUpdater`\> + +• **selector** = `...` + +## Returns + +`Readonly`\<`Ref`\<`TSelected`\>\> + +## Defined in + +[index.ts:12](https://github.com/TanStack/store/blob/main/packages/vue-store/src/index.ts#L12) diff --git a/docs/framework/vue/reference/index.md b/docs/framework/vue/reference/index.md new file mode 100644 index 0000000..7fef438 --- /dev/null +++ b/docs/framework/vue/reference/index.md @@ -0,0 +1,11 @@ +--- +id: "@tanstack/vue-store" +title: "@tanstack/vue-store" +--- + +# @tanstack/vue-store + +## Functions + +- [shallow](functions/shallow.md) +- [useStore](functions/usestore.md) diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md new file mode 100644 index 0000000..0d08ada --- /dev/null +++ b/docs/reference/classes/derived.md @@ -0,0 +1,188 @@ +--- +id: Derived +title: Derived +--- + +# Class: Derived\ + +## Type Parameters + +• **TState** + +## Constructors + +### new Derived() + +```ts +new Derived(options): Derived +``` + +#### Parameters + +• **options**: [`DerivedOptions`](../interfaces/derivedoptions.md)\<`TState`\> + +#### Returns + +[`Derived`](derived.md)\<`TState`\> + +#### Defined in + +[derived.ts:82](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L82) + +## Properties + +### derivedToStore + +```ts +derivedToStore: Map, Set unknown>>>; +``` + +#### Defined in + +[derived.ts:67](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L67) + +*** + +### options + +```ts +options: DerivedOptions; +``` + +#### Defined in + +[derived.ts:37](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L37) + +*** + +### storeToDerived + +```ts +storeToDerived: Map unknown>, Set>>; +``` + +This is here to solve the pyramid dependency problem where: + A + / \ + B C + \ / + D + +Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is. + +To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been +resolved. + +This is a record of stores, because derived stores are not able to write values to, but stores are + +#### Defined in + +[derived.ts:66](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L66) + +## Accessors + +### prevState + +#### Get Signature + +```ts +get prevState(): TState +``` + +##### Returns + +`TState` + +#### Defined in + +[derived.ts:127](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L127) + +*** + +### state + +#### Get Signature + +```ts +get state(): TState +``` + +##### Returns + +`TState` + +#### Defined in + +[derived.ts:118](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L118) + +## Methods + +### getDepVals() + +```ts +getDepVals(): object +``` + +#### Returns + +`object` + +##### currentVals + +```ts +currentVals: unknown[]; +``` + +##### prevVals + +```ts +prevVals: unknown[]; +``` + +#### Defined in + +[derived.ts:69](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L69) + +*** + +### mount() + +```ts +mount(): () => void +``` + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Defined in + +[derived.ts:131](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L131) + +*** + +### subscribe() + +```ts +subscribe(listener): () => void +``` + +#### Parameters + +• **listener**: `Listener`\<`TState`\> + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Defined in + +[derived.ts:172](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L172) diff --git a/docs/reference/classes/effect.md b/docs/reference/classes/effect.md new file mode 100644 index 0000000..f8c7602 --- /dev/null +++ b/docs/reference/classes/effect.md @@ -0,0 +1,46 @@ +--- +id: Effect +title: Effect +--- + +# Class: Effect + +## Constructors + +### new Effect() + +```ts +new Effect(opts): Effect +``` + +#### Parameters + +• **opts**: `EffectOptions` + +#### Returns + +[`Effect`](effect.md) + +#### Defined in + +[effect.ts:23](https://github.com/TanStack/store/blob/main/packages/store/src/effect.ts#L23) + +## Methods + +### mount() + +```ts +mount(): () => void +``` + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Defined in + +[effect.ts:39](https://github.com/TanStack/store/blob/main/packages/store/src/effect.ts#L39) diff --git a/docs/reference/classes/store.md b/docs/reference/classes/store.md new file mode 100644 index 0000000..5cd7c54 --- /dev/null +++ b/docs/reference/classes/store.md @@ -0,0 +1,146 @@ +--- +id: Store +title: Store +--- + +# Class: Store\ + +## Type Parameters + +• **TState** + +• **TUpdater** *extends* `AnyUpdater` = (`cb`) => `TState` + +## Constructors + +### new Store() + +```ts +new Store(initialState, options?): Store +``` + +#### Parameters + +• **initialState**: `TState` + +• **options?**: [`StoreOptions`](../interfaces/storeoptions.md)\<`TState`, `TUpdater`\> + +#### Returns + +[`Store`](store.md)\<`TState`, `TUpdater`\> + +#### Defined in + +[store.ts:43](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L43) + +## Properties + +### listeners + +```ts +listeners: Set>; +``` + +#### Defined in + +[store.ts:30](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L30) + +*** + +### options? + +```ts +optional options: StoreOptions; +``` + +#### Defined in + +[store.ts:33](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L33) + +*** + +### prevState + +```ts +prevState: TState; +``` + +#### Defined in + +[store.ts:32](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L32) + +*** + +### state + +```ts +state: TState; +``` + +#### Defined in + +[store.ts:31](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L31) + +## Methods + +### batch() + +```ts +batch(cb): void +``` + +#### Parameters + +• **cb** + +#### Returns + +`void` + +#### Defined in + +[store.ts:84](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L84) + +*** + +### setState() + +```ts +setState(updater): void +``` + +#### Parameters + +• **updater**: `TUpdater` + +#### Returns + +`void` + +#### Defined in + +[store.ts:58](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L58) + +*** + +### subscribe() + +```ts +subscribe(listener): () => void +``` + +#### Parameters + +• **listener**: `Listener`\<`TState`\> + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Defined in + +[store.ts:49](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L49) diff --git a/docs/reference/index.md b/docs/reference/index.md new file mode 100644 index 0000000..a2ee5d9 --- /dev/null +++ b/docs/reference/index.md @@ -0,0 +1,17 @@ +--- +id: "@tanstack/store" +title: "@tanstack/store" +--- + +# @tanstack/store + +## Classes + +- [Derived](classes/derived.md) +- [Effect](classes/effect.md) +- [Store](classes/store.md) + +## Interfaces + +- [DerivedOptions](interfaces/derivedoptions.md) +- [StoreOptions](interfaces/storeoptions.md) diff --git a/docs/reference/interfaces/derivedoptions.md b/docs/reference/interfaces/derivedoptions.md new file mode 100644 index 0000000..340524c --- /dev/null +++ b/docs/reference/interfaces/derivedoptions.md @@ -0,0 +1,114 @@ +--- +id: DerivedOptions +title: DerivedOptions +--- + +# Interface: DerivedOptions\ + +## Type Parameters + +• **TState** + +## Properties + +### deps + +```ts +deps: (Derived | Store any>)[]; +``` + +#### Defined in + +[derived.ts:15](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L15) + +*** + +### fn() + +```ts +fn: (props) => TState; +``` + +Values of the `deps` from before and after the current invocation of `fn` + +#### Parameters + +• **props** + +• **props.currentVals**: `any`[] + +• **props.prevVals**: `undefined` \| `any`[] + +#### Returns + +`TState` + +#### Todo + +Improve the typings to match `deps` from above + +#### Defined in + +[derived.ts:21](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L21) + +*** + +### lazy? + +```ts +optional lazy: boolean; +``` + +Should the value of `Derived` only be computed once it is accessed + +#### Default + +```ts +false +``` + +#### Defined in + +[derived.ts:14](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L14) + +*** + +### onSubscribe()? + +```ts +optional onSubscribe: (listener, derived) => () => void; +``` + +#### Parameters + +• **listener**: `Listener`\<`TState`\> + +• **derived**: [`Derived`](../classes/derived.md)\<`TState`\> + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Defined in + +[derived.ts:5](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L5) + +*** + +### onUpdate()? + +```ts +optional onUpdate: () => void; +``` + +#### Returns + +`void` + +#### Defined in + +[derived.ts:9](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L9) diff --git a/docs/reference/interfaces/storeoptions.md b/docs/reference/interfaces/storeoptions.md new file mode 100644 index 0000000..df06c29 --- /dev/null +++ b/docs/reference/interfaces/storeoptions.md @@ -0,0 +1,90 @@ +--- +id: StoreOptions +title: StoreOptions +--- + +# Interface: StoreOptions\ + +## Type Parameters + +• **TState** + +• **TUpdater** *extends* `AnyUpdater` = (`cb`) => `TState` + +## Properties + +### onSubscribe()? + +```ts +optional onSubscribe: (listener, store) => () => void; +``` + +Called when a listener subscribes to the store. + +#### Parameters + +• **listener**: `Listener`\<`TState`\> + +• **store**: [`Store`](../classes/store.md)\<`TState`, `TUpdater`\> + +#### Returns + +`Function` + +a function to unsubscribe the listener + +##### Returns + +`void` + +#### Defined in + +[store.ts:16](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L16) + +*** + +### onUpdate()? + +```ts +optional onUpdate: () => void; +``` + +Called after the state has been updated, used to derive other state. + +#### Returns + +`void` + +#### Defined in + +[store.ts:23](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L23) + +*** + +### updateFn()? + +```ts +optional updateFn: (previous) => (updater) => TState; +``` + +Replace the default update function with a custom one. + +#### Parameters + +• **previous**: `TState` + +#### Returns + +`Function` + +##### Parameters + +• **updater**: `TUpdater` + +##### Returns + +`TState` + +#### Defined in + +[store.ts:10](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L10) From 709f04b560959c7b8c47b045ecaebdd8a750f2be Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Tue, 26 Nov 2024 19:23:07 -0800 Subject: [PATCH 35/81] feat: add ability to get previous value from derived fn --- packages/store/src/derived.ts | 34 ++++++++++++++++------------ packages/store/tests/derived.test.ts | 34 ++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 5c57dfe..249dd27 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -1,6 +1,14 @@ import { Store } from './store' import type { Listener } from './types' +export interface DerivedFnProps { + // `undefined` if it's the first run + prevDepVals: Array | undefined + // Can't have currVal, as it's being evaluated from the current derived fn + prevVal: TState | undefined + currDepVals: Array +} + export interface DerivedOptions { onSubscribe?: ( listener: Listener, @@ -18,11 +26,7 @@ export interface DerivedOptions { * * @todo Improve the typings to match `deps` from above */ - fn: (props: { - // `undefined` if it's the first run - prevVals: Array | undefined - currentVals: Array - }) => TState + fn: (props: DerivedFnProps) => TState } export class Derived { @@ -66,16 +70,17 @@ export class Derived { storeToDerived = new Map, Set>>() derivedToStore = new Map, Set>>() - getDepVals = () => { - const prevVals = [] as Array - const currentVals = [] as Array + getDepVals = (): DerivedFnProps => { + const prevDepVals = [] as Array + const currDepVals = [] as Array for (const dep of this.options.deps) { - prevVals.push(dep.prevState) - currentVals.push(dep.state) + prevDepVals.push(dep.prevState) + currDepVals.push(dep.state) } return { - prevVals, - currentVals, + prevDepVals, + currDepVals, + prevVal: this._store?.prevState ?? undefined, } } @@ -84,8 +89,9 @@ export class Derived { const initVal = options.lazy ? (undefined as ReturnType) : options.fn({ - prevVals: undefined, - currentVals: this.getDepVals().currentVals, + prevDepVals: undefined, + prevVal: undefined, + currDepVals: this.getDepVals().currDepVals, }) this._store = new Store(initVal, { diff --git a/packages/store/tests/derived.test.ts b/packages/store/tests/derived.test.ts index 21c1fc6..01bc963 100644 --- a/packages/store/tests/derived.test.ts +++ b/packages/store/tests/derived.test.ts @@ -214,21 +214,45 @@ describe('Derived', () => { expect(fn).toBeCalledWith({ prevVal: 24, currentVal: 48 }) }) - test('derivedFn should receive old and new values', () => { + test('derivedFn should receive old and new dep values', () => { const count = new Store(12) const date = new Date() const time = new Store(date) const fn = vi.fn() const derived = new Derived({ deps: [count, time], - fn: ({ prevVals, currentVals }) => { - fn({ prevVals, currentVals }) + fn: ({ prevDepVals, currDepVals }) => { + fn({ prevDepVals, currDepVals }) return void 0 }, }) derived.mount() - expect(fn).toBeCalledWith({ prevVals: undefined, currentVals: [12, date] }) + expect(fn).toBeCalledWith({ + prevDepVals: undefined, + currDepVals: [12, date], + }) + count.setState(() => 24) + expect(fn).toBeCalledWith({ + prevDepVals: [12, date], + currDepVals: [24, date], + }) + }) + + test('derivedFn should receive the old value', () => { + const count = new Store(12) + const date = new Date() + const time = new Store(date) + const fn = vi.fn() + const derived = new Derived({ + deps: [count, time], + fn: ({ prevVal }) => { + fn(prevVal) + return count.state + }, + }) + derived.mount() + expect(fn).toBeCalledWith(undefined) count.setState(() => 24) - expect(fn).toBeCalledWith({ prevVals: [12, date], currentVals: [24, date] }) + expect(fn).toBeCalledWith(12) }) }) From f8c98399fc0174a0910c7b3ff85e9a02037654b5 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 27 Nov 2024 03:24:09 +0000 Subject: [PATCH 36/81] ci: apply automated fixes and generate docs --- docs/reference/classes/derived.md | 34 +++++---------- docs/reference/index.md | 1 + docs/reference/interfaces/derivedfnprops.md | 46 +++++++++++++++++++++ docs/reference/interfaces/derivedoptions.md | 16 +++---- 4 files changed, 64 insertions(+), 33 deletions(-) create mode 100644 docs/reference/interfaces/derivedfnprops.md diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md index 0d08ada..86f43b0 100644 --- a/docs/reference/classes/derived.md +++ b/docs/reference/classes/derived.md @@ -27,7 +27,7 @@ new Derived(options): Derived #### Defined in -[derived.ts:82](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L82) +[derived.ts:87](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L87) ## Properties @@ -39,7 +39,7 @@ derivedToStore: Map, Set unknown>>>; #### Defined in -[derived.ts:67](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L67) +[derived.ts:71](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L71) *** @@ -51,7 +51,7 @@ options: DerivedOptions; #### Defined in -[derived.ts:37](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L37) +[derived.ts:41](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L41) *** @@ -77,7 +77,7 @@ This is a record of stores, because derived stores are not able to write values #### Defined in -[derived.ts:66](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L66) +[derived.ts:70](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L70) ## Accessors @@ -95,7 +95,7 @@ get prevState(): TState #### Defined in -[derived.ts:127](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L127) +[derived.ts:133](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L133) *** @@ -113,35 +113,23 @@ get state(): TState #### Defined in -[derived.ts:118](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L118) +[derived.ts:124](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L124) ## Methods ### getDepVals() ```ts -getDepVals(): object +getDepVals(): DerivedFnProps ``` #### Returns -`object` - -##### currentVals - -```ts -currentVals: unknown[]; -``` - -##### prevVals - -```ts -prevVals: unknown[]; -``` +[`DerivedFnProps`](../interfaces/derivedfnprops.md)\<`TState`\> #### Defined in -[derived.ts:69](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L69) +[derived.ts:73](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L73) *** @@ -161,7 +149,7 @@ mount(): () => void #### Defined in -[derived.ts:131](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L131) +[derived.ts:137](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L137) *** @@ -185,4 +173,4 @@ subscribe(listener): () => void #### Defined in -[derived.ts:172](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L172) +[derived.ts:178](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L178) diff --git a/docs/reference/index.md b/docs/reference/index.md index a2ee5d9..4c00a50 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -13,5 +13,6 @@ title: "@tanstack/store" ## Interfaces +- [DerivedFnProps](interfaces/derivedfnprops.md) - [DerivedOptions](interfaces/derivedoptions.md) - [StoreOptions](interfaces/storeoptions.md) diff --git a/docs/reference/interfaces/derivedfnprops.md b/docs/reference/interfaces/derivedfnprops.md new file mode 100644 index 0000000..4a09dee --- /dev/null +++ b/docs/reference/interfaces/derivedfnprops.md @@ -0,0 +1,46 @@ +--- +id: DerivedFnProps +title: DerivedFnProps +--- + +# Interface: DerivedFnProps\ + +## Type Parameters + +• **TState** + +## Properties + +### currDepVals + +```ts +currDepVals: any[]; +``` + +#### Defined in + +[derived.ts:9](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L9) + +*** + +### prevDepVals + +```ts +prevDepVals: undefined | any[]; +``` + +#### Defined in + +[derived.ts:6](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L6) + +*** + +### prevVal + +```ts +prevVal: undefined | TState; +``` + +#### Defined in + +[derived.ts:8](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L8) diff --git a/docs/reference/interfaces/derivedoptions.md b/docs/reference/interfaces/derivedoptions.md index 340524c..b9c0816 100644 --- a/docs/reference/interfaces/derivedoptions.md +++ b/docs/reference/interfaces/derivedoptions.md @@ -19,7 +19,7 @@ deps: (Derived | Store any>)[]; #### Defined in -[derived.ts:15](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L15) +[derived.ts:23](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L23) *** @@ -33,11 +33,7 @@ Values of the `deps` from before and after the current invocation of `fn` #### Parameters -• **props** - -• **props.currentVals**: `any`[] - -• **props.prevVals**: `undefined` \| `any`[] +• **props**: [`DerivedFnProps`](derivedfnprops.md)\<`TState`\> #### Returns @@ -49,7 +45,7 @@ Improve the typings to match `deps` from above #### Defined in -[derived.ts:21](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L21) +[derived.ts:29](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L29) *** @@ -69,7 +65,7 @@ false #### Defined in -[derived.ts:14](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L14) +[derived.ts:22](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L22) *** @@ -95,7 +91,7 @@ optional onSubscribe: (listener, derived) => () => void; #### Defined in -[derived.ts:5](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L5) +[derived.ts:13](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L13) *** @@ -111,4 +107,4 @@ optional onUpdate: () => void; #### Defined in -[derived.ts:9](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L9) +[derived.ts:17](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L17) From c3b3f94108efd4b5b649da4af51cc79615b86c53 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Tue, 26 Nov 2024 19:54:07 -0800 Subject: [PATCH 37/81] feat: add proper typings to derived state --- packages/store/src/derived.ts | 58 +++++++++++++++++++------- packages/store/tests/derived.test-d.ts | 13 ++++++ 2 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 packages/store/tests/derived.test-d.ts diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 249dd27..aa1ce32 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -1,15 +1,40 @@ import { Store } from './store' import type { Listener } from './types' -export interface DerivedFnProps { +export type UnwrapDerivedOrStore = + T extends Derived + ? InnerD + : T extends Store + ? InnerS + : never + +type UnwrapReadonlyDerivedOrStoreArray< + TArr extends ReadonlyArray | Store>, +> = TArr extends readonly [infer Head, ...infer Tail] + ? Head extends Derived | Store + ? Tail extends ReadonlyArray | Store> + ? [UnwrapDerivedOrStore, ...UnwrapReadonlyDerivedOrStoreArray] + : [] + : [] + : [] + +export interface DerivedFnProps< + TState, + ArrType extends ReadonlyArray | Store> = ReadonlyArray, + UnwrappedArrT extends + UnwrapReadonlyDerivedOrStoreArray = UnwrapReadonlyDerivedOrStoreArray, +> { // `undefined` if it's the first run - prevDepVals: Array | undefined + prevDepVals: UnwrappedArrT | undefined // Can't have currVal, as it's being evaluated from the current derived fn prevVal: TState | undefined - currDepVals: Array + currDepVals: UnwrappedArrT } -export interface DerivedOptions { +export interface DerivedOptions< + TState, + TArr extends ReadonlyArray | Store> = ReadonlyArray, +> { onSubscribe?: ( listener: Listener, derived: Derived, @@ -20,16 +45,19 @@ export interface DerivedOptions { * @default false */ lazy?: boolean - deps: Array | Store> + deps: TArr /** * Values of the `deps` from before and after the current invocation of `fn` - * - * @todo Improve the typings to match `deps` from above */ - fn: (props: DerivedFnProps) => TState + fn: (props: DerivedFnProps) => TState } -export class Derived { +export class Derived< + TState, + const TArr extends ReadonlyArray< + Derived | Store + > = ReadonlyArray, +> { /** * @private */ @@ -38,7 +66,7 @@ export class Derived { * @private */ rootStores = new Set>() - options: DerivedOptions + options: DerivedOptions /** * Functions representing the subscriptions. Call a function to cleanup @@ -70,7 +98,7 @@ export class Derived { storeToDerived = new Map, Set>>() derivedToStore = new Map, Set>>() - getDepVals = (): DerivedFnProps => { + getDepVals = () => { const prevDepVals = [] as Array const currDepVals = [] as Array for (const dep of this.options.deps) { @@ -78,13 +106,13 @@ export class Derived { currDepVals.push(dep.state) } return { - prevDepVals, - currDepVals, + prevDepVals: prevDepVals as never, + currDepVals: currDepVals as never, prevVal: this._store?.prevState ?? undefined, } } - constructor(options: DerivedOptions) { + constructor(options: DerivedOptions) { this.options = options const initVal = options.lazy ? (undefined as ReturnType) @@ -135,7 +163,7 @@ export class Derived { } mount = () => { - let __depsThatHaveWrittenThisTick: DerivedOptions['deps'] = [] + let __depsThatHaveWrittenThisTick = [] as any[] for (const dep of this.options.deps) { const isDepAStore = dep instanceof Store diff --git a/packages/store/tests/derived.test-d.ts b/packages/store/tests/derived.test-d.ts new file mode 100644 index 0000000..578ef3e --- /dev/null +++ b/packages/store/tests/derived.test-d.ts @@ -0,0 +1,13 @@ +import { test, expectTypeOf } from 'vitest' +import { Derived, Store } from '../src' + +test('dep array inner types work', () => { + const store = new Store(12) + new Derived({ + deps: [store], + fn: ({ currDepVals: [currentStore], prevDepVals }) => { + expectTypeOf(currentStore).toMatchTypeOf() + expectTypeOf(prevDepVals).toMatchTypeOf<[number] | undefined>() + }, + }) +}) From 24a771bc9e9c6de1e771770a786993d83b4c51ed Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 27 Nov 2024 03:55:01 +0000 Subject: [PATCH 38/81] ci: apply automated fixes and generate docs --- docs/reference/classes/derived.md | 56 +++++++++++++------ docs/reference/index.md | 4 ++ docs/reference/interfaces/derivedfnprops.md | 16 ++++-- docs/reference/interfaces/derivedoptions.md | 24 ++++---- .../type-aliases/unwrapderivedorstore.md | 18 ++++++ 5 files changed, 81 insertions(+), 37 deletions(-) create mode 100644 docs/reference/type-aliases/unwrapderivedorstore.md diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md index 86f43b0..9e95182 100644 --- a/docs/reference/classes/derived.md +++ b/docs/reference/classes/derived.md @@ -3,62 +3,64 @@ id: Derived title: Derived --- -# Class: Derived\ +# Class: Derived\ ## Type Parameters • **TState** +• **TArr** *extends* `ReadonlyArray`\<[`Derived`](derived.md)\<`any`\> \| [`Store`](store.md)\<`any`\>\> = `ReadonlyArray`\<`any`\> + ## Constructors ### new Derived() ```ts -new Derived(options): Derived +new Derived(options): Derived ``` #### Parameters -• **options**: [`DerivedOptions`](../interfaces/derivedoptions.md)\<`TState`\> +• **options**: [`DerivedOptions`](../interfaces/derivedoptions.md)\<`TState`, `TArr`\> #### Returns -[`Derived`](derived.md)\<`TState`\> +[`Derived`](derived.md)\<`TState`, `TArr`\> #### Defined in -[derived.ts:87](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L87) +[derived.ts:115](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L115) ## Properties ### derivedToStore ```ts -derivedToStore: Map, Set unknown>>>; +derivedToStore: Map, Set unknown>>>; ``` #### Defined in -[derived.ts:71](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L71) +[derived.ts:99](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L99) *** ### options ```ts -options: DerivedOptions; +options: DerivedOptions; ``` #### Defined in -[derived.ts:41](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L41) +[derived.ts:69](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L69) *** ### storeToDerived ```ts -storeToDerived: Map unknown>, Set>>; +storeToDerived: Map unknown>, Set>>; ``` This is here to solve the pyramid dependency problem where: @@ -77,7 +79,7 @@ This is a record of stores, because derived stores are not able to write values #### Defined in -[derived.ts:70](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L70) +[derived.ts:98](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L98) ## Accessors @@ -95,7 +97,7 @@ get prevState(): TState #### Defined in -[derived.ts:133](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L133) +[derived.ts:161](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L161) *** @@ -113,23 +115,41 @@ get state(): TState #### Defined in -[derived.ts:124](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L124) +[derived.ts:152](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L152) ## Methods ### getDepVals() ```ts -getDepVals(): DerivedFnProps +getDepVals(): object ``` #### Returns -[`DerivedFnProps`](../interfaces/derivedfnprops.md)\<`TState`\> +`object` + +##### currDepVals + +```ts +currDepVals: never; +``` + +##### prevDepVals + +```ts +prevDepVals: never; +``` + +##### prevVal + +```ts +prevVal: undefined | NonNullable; +``` #### Defined in -[derived.ts:73](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L73) +[derived.ts:101](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L101) *** @@ -149,7 +169,7 @@ mount(): () => void #### Defined in -[derived.ts:137](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L137) +[derived.ts:165](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L165) *** @@ -173,4 +193,4 @@ subscribe(listener): () => void #### Defined in -[derived.ts:178](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L178) +[derived.ts:206](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L206) diff --git a/docs/reference/index.md b/docs/reference/index.md index 4c00a50..0a972b8 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -16,3 +16,7 @@ title: "@tanstack/store" - [DerivedFnProps](interfaces/derivedfnprops.md) - [DerivedOptions](interfaces/derivedoptions.md) - [StoreOptions](interfaces/storeoptions.md) + +## Type Aliases + +- [UnwrapDerivedOrStore](type-aliases/unwrapderivedorstore.md) diff --git a/docs/reference/interfaces/derivedfnprops.md b/docs/reference/interfaces/derivedfnprops.md index 4a09dee..04bea0b 100644 --- a/docs/reference/interfaces/derivedfnprops.md +++ b/docs/reference/interfaces/derivedfnprops.md @@ -3,35 +3,39 @@ id: DerivedFnProps title: DerivedFnProps --- -# Interface: DerivedFnProps\ +# Interface: DerivedFnProps\ ## Type Parameters • **TState** +• **ArrType** *extends* `ReadonlyArray`\<[`Derived`](../classes/derived.md)\<`any`\> \| [`Store`](../classes/store.md)\<`any`\>\> = `ReadonlyArray`\<`any`\> + +• **UnwrappedArrT** *extends* `UnwrapReadonlyDerivedOrStoreArray`\<`ArrType`\> = `UnwrapReadonlyDerivedOrStoreArray`\<`ArrType`\> + ## Properties ### currDepVals ```ts -currDepVals: any[]; +currDepVals: UnwrappedArrT; ``` #### Defined in -[derived.ts:9](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L9) +[derived.ts:31](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L31) *** ### prevDepVals ```ts -prevDepVals: undefined | any[]; +prevDepVals: undefined | UnwrappedArrT; ``` #### Defined in -[derived.ts:6](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L6) +[derived.ts:28](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L28) *** @@ -43,4 +47,4 @@ prevVal: undefined | TState; #### Defined in -[derived.ts:8](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L8) +[derived.ts:30](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L30) diff --git a/docs/reference/interfaces/derivedoptions.md b/docs/reference/interfaces/derivedoptions.md index b9c0816..1f7600d 100644 --- a/docs/reference/interfaces/derivedoptions.md +++ b/docs/reference/interfaces/derivedoptions.md @@ -3,23 +3,25 @@ id: DerivedOptions title: DerivedOptions --- -# Interface: DerivedOptions\ +# Interface: DerivedOptions\ ## Type Parameters • **TState** +• **TArr** *extends* `ReadonlyArray`\<[`Derived`](../classes/derived.md)\<`any`\> \| [`Store`](../classes/store.md)\<`any`\>\> = `ReadonlyArray`\<`any`\> + ## Properties ### deps ```ts -deps: (Derived | Store any>)[]; +deps: TArr; ``` #### Defined in -[derived.ts:23](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L23) +[derived.ts:48](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L48) *** @@ -33,19 +35,15 @@ Values of the `deps` from before and after the current invocation of `fn` #### Parameters -• **props**: [`DerivedFnProps`](derivedfnprops.md)\<`TState`\> +• **props**: [`DerivedFnProps`](derivedfnprops.md)\<`TState`, `TArr`, `UnwrapReadonlyDerivedOrStoreArray`\<`TArr`\>\> #### Returns `TState` -#### Todo - -Improve the typings to match `deps` from above - #### Defined in -[derived.ts:29](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L29) +[derived.ts:52](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L52) *** @@ -65,7 +63,7 @@ false #### Defined in -[derived.ts:22](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L22) +[derived.ts:47](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L47) *** @@ -79,7 +77,7 @@ optional onSubscribe: (listener, derived) => () => void; • **listener**: `Listener`\<`TState`\> -• **derived**: [`Derived`](../classes/derived.md)\<`TState`\> +• **derived**: [`Derived`](../classes/derived.md)\<`TState`, readonly `any`[]\> #### Returns @@ -91,7 +89,7 @@ optional onSubscribe: (listener, derived) => () => void; #### Defined in -[derived.ts:13](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L13) +[derived.ts:38](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L38) *** @@ -107,4 +105,4 @@ optional onUpdate: () => void; #### Defined in -[derived.ts:17](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L17) +[derived.ts:42](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L42) diff --git a/docs/reference/type-aliases/unwrapderivedorstore.md b/docs/reference/type-aliases/unwrapderivedorstore.md new file mode 100644 index 0000000..11b9e3e --- /dev/null +++ b/docs/reference/type-aliases/unwrapderivedorstore.md @@ -0,0 +1,18 @@ +--- +id: UnwrapDerivedOrStore +title: UnwrapDerivedOrStore +--- + +# Type Alias: UnwrapDerivedOrStore\ + +```ts +type UnwrapDerivedOrStore: T extends Derived ? InnerD : T extends Store ? InnerS : never; +``` + +## Type Parameters + +• **T** + +## Defined in + +[derived.ts:4](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L4) From ec4fcc14496114eb9e1eae2949d3c22f40505be2 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Tue, 26 Nov 2024 20:29:00 -0800 Subject: [PATCH 39/81] chore: fix potentially faulty TState inferencing --- packages/store/src/derived.ts | 11 +++++++---- packages/store/tests/derived.test-d.ts | 13 +++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index aa1ce32..c2ad749 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -18,16 +18,19 @@ type UnwrapReadonlyDerivedOrStoreArray< : [] : [] +// Can't have currVal, as it's being evaluated from the current derived fn export interface DerivedFnProps< - TState, ArrType extends ReadonlyArray | Store> = ReadonlyArray, UnwrappedArrT extends UnwrapReadonlyDerivedOrStoreArray = UnwrapReadonlyDerivedOrStoreArray, > { // `undefined` if it's the first run + /** + * `undefined` if it's the first run + * @privateRemarks this also cannot be typed as TState, as it breaks the inferencing of the function's return type when an argument is used - even with `NoInfer` usage + */ + prevVal: unknown | undefined prevDepVals: UnwrappedArrT | undefined - // Can't have currVal, as it's being evaluated from the current derived fn - prevVal: TState | undefined currDepVals: UnwrappedArrT } @@ -49,7 +52,7 @@ export interface DerivedOptions< /** * Values of the `deps` from before and after the current invocation of `fn` */ - fn: (props: DerivedFnProps) => TState + fn: (props: DerivedFnProps) => TState } export class Derived< diff --git a/packages/store/tests/derived.test-d.ts b/packages/store/tests/derived.test-d.ts index 578ef3e..87bc140 100644 --- a/packages/store/tests/derived.test-d.ts +++ b/packages/store/tests/derived.test-d.ts @@ -11,3 +11,16 @@ test('dep array inner types work', () => { }, }) }) + +test('return type inferencing should work', () => { + const derived = new Derived({ + deps: [], + fn: ({ prevVal }) => { + // See comment in `DerivedOptions` for why this is necessary + expectTypeOf(prevVal).toMatchTypeOf() + return 12 as const + }, + }) + + expectTypeOf(derived).toMatchTypeOf>() +}) From 15ce0d44f08a3c2642e65536f02758dc52c1e592 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 27 Nov 2024 04:29:57 +0000 Subject: [PATCH 40/81] ci: apply automated fixes and generate docs --- docs/reference/classes/derived.md | 18 +++++++++--------- docs/reference/interfaces/derivedfnprops.md | 14 +++++++------- docs/reference/interfaces/derivedoptions.md | 12 ++++++------ 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md index 9e95182..b3483fa 100644 --- a/docs/reference/classes/derived.md +++ b/docs/reference/classes/derived.md @@ -29,7 +29,7 @@ new Derived(options): Derived #### Defined in -[derived.ts:115](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L115) +[derived.ts:118](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L118) ## Properties @@ -41,7 +41,7 @@ derivedToStore: Map, Set #### Defined in -[derived.ts:99](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L99) +[derived.ts:102](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L102) *** @@ -53,7 +53,7 @@ options: DerivedOptions; #### Defined in -[derived.ts:69](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L69) +[derived.ts:72](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L72) *** @@ -79,7 +79,7 @@ This is a record of stores, because derived stores are not able to write values #### Defined in -[derived.ts:98](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L98) +[derived.ts:101](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L101) ## Accessors @@ -97,7 +97,7 @@ get prevState(): TState #### Defined in -[derived.ts:161](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L161) +[derived.ts:164](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L164) *** @@ -115,7 +115,7 @@ get state(): TState #### Defined in -[derived.ts:152](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L152) +[derived.ts:155](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L155) ## Methods @@ -149,7 +149,7 @@ prevVal: undefined | NonNullable; #### Defined in -[derived.ts:101](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L101) +[derived.ts:104](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L104) *** @@ -169,7 +169,7 @@ mount(): () => void #### Defined in -[derived.ts:165](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L165) +[derived.ts:168](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L168) *** @@ -193,4 +193,4 @@ subscribe(listener): () => void #### Defined in -[derived.ts:206](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L206) +[derived.ts:209](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L209) diff --git a/docs/reference/interfaces/derivedfnprops.md b/docs/reference/interfaces/derivedfnprops.md index 04bea0b..340d1df 100644 --- a/docs/reference/interfaces/derivedfnprops.md +++ b/docs/reference/interfaces/derivedfnprops.md @@ -3,12 +3,10 @@ id: DerivedFnProps title: DerivedFnProps --- -# Interface: DerivedFnProps\ +# Interface: DerivedFnProps\ ## Type Parameters -• **TState** - • **ArrType** *extends* `ReadonlyArray`\<[`Derived`](../classes/derived.md)\<`any`\> \| [`Store`](../classes/store.md)\<`any`\>\> = `ReadonlyArray`\<`any`\> • **UnwrappedArrT** *extends* `UnwrapReadonlyDerivedOrStoreArray`\<`ArrType`\> = `UnwrapReadonlyDerivedOrStoreArray`\<`ArrType`\> @@ -23,7 +21,7 @@ currDepVals: UnwrappedArrT; #### Defined in -[derived.ts:31](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L31) +[derived.ts:34](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L34) *** @@ -35,16 +33,18 @@ prevDepVals: undefined | UnwrappedArrT; #### Defined in -[derived.ts:28](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L28) +[derived.ts:33](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L33) *** ### prevVal ```ts -prevVal: undefined | TState; +prevVal: unknown; ``` +`undefined` if it's the first run + #### Defined in -[derived.ts:30](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L30) +[derived.ts:32](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L32) diff --git a/docs/reference/interfaces/derivedoptions.md b/docs/reference/interfaces/derivedoptions.md index 1f7600d..b38f17a 100644 --- a/docs/reference/interfaces/derivedoptions.md +++ b/docs/reference/interfaces/derivedoptions.md @@ -21,7 +21,7 @@ deps: TArr; #### Defined in -[derived.ts:48](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L48) +[derived.ts:51](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L51) *** @@ -35,7 +35,7 @@ Values of the `deps` from before and after the current invocation of `fn` #### Parameters -• **props**: [`DerivedFnProps`](derivedfnprops.md)\<`TState`, `TArr`, `UnwrapReadonlyDerivedOrStoreArray`\<`TArr`\>\> +• **props**: [`DerivedFnProps`](derivedfnprops.md)\<`TArr`, `UnwrapReadonlyDerivedOrStoreArray`\<`TArr`\>\> #### Returns @@ -43,7 +43,7 @@ Values of the `deps` from before and after the current invocation of `fn` #### Defined in -[derived.ts:52](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L52) +[derived.ts:55](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L55) *** @@ -63,7 +63,7 @@ false #### Defined in -[derived.ts:47](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L47) +[derived.ts:50](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L50) *** @@ -89,7 +89,7 @@ optional onSubscribe: (listener, derived) => () => void; #### Defined in -[derived.ts:38](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L38) +[derived.ts:41](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L41) *** @@ -105,4 +105,4 @@ optional onUpdate: () => void; #### Defined in -[derived.ts:42](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L42) +[derived.ts:45](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L45) From b1fa3ad70c9162efc4428f15cdb9fc8e4c3beec0 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 28 Nov 2024 20:22:54 -0800 Subject: [PATCH 41/81] chore: fix usage for TypeScript 4.9 --- packages/store/package.json | 7 +++++++ packages/store/src/derived.ts | 19 ++++++++++--------- packages/store/tests/derived.test-d.ts | 4 ++-- packages/store/ts-5/index.d.ts | 18 ++++++++++++++++++ 4 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 packages/store/ts-5/index.d.ts diff --git a/packages/store/package.json b/packages/store/package.json index d7c3c3a..00d18ff 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -36,6 +36,13 @@ }, "type": "module", "types": "dist/esm/index.d.ts", + "typesVersions": { + "=>5.0": { + "index.d.ts": [ + "ts-5/index.v5.d.ts" + ] + } + }, "main": "dist/cjs/index.cjs", "module": "dist/esm/index.js", "exports": { diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index c2ad749..d376481 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -20,9 +20,9 @@ type UnwrapReadonlyDerivedOrStoreArray< // Can't have currVal, as it's being evaluated from the current derived fn export interface DerivedFnProps< - ArrType extends ReadonlyArray | Store> = ReadonlyArray, - UnwrappedArrT extends - UnwrapReadonlyDerivedOrStoreArray = UnwrapReadonlyDerivedOrStoreArray, + TArr extends ReadonlyArray | Store> = ReadonlyArray, + TUnwrappedArr extends + UnwrapReadonlyDerivedOrStoreArray = UnwrapReadonlyDerivedOrStoreArray, > { // `undefined` if it's the first run /** @@ -30,8 +30,8 @@ export interface DerivedFnProps< * @privateRemarks this also cannot be typed as TState, as it breaks the inferencing of the function's return type when an argument is used - even with `NoInfer` usage */ prevVal: unknown | undefined - prevDepVals: UnwrappedArrT | undefined - currDepVals: UnwrappedArrT + prevDepVals: TUnwrappedArr | undefined + currDepVals: TUnwrappedArr } export interface DerivedOptions< @@ -57,9 +57,7 @@ export interface DerivedOptions< export class Derived< TState, - const TArr extends ReadonlyArray< - Derived | Store - > = ReadonlyArray, + TArr extends ReadonlyArray | Store> = ReadonlyArray, > { /** * @private @@ -111,6 +109,7 @@ export class Derived< return { prevDepVals: prevDepVals as never, currDepVals: currDepVals as never, + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition prevVal: this._store?.prevState ?? undefined, } } @@ -166,7 +165,9 @@ export class Derived< } mount = () => { - let __depsThatHaveWrittenThisTick = [] as any[] + let __depsThatHaveWrittenThisTick = [] as Array< + Derived | Store + > for (const dep of this.options.deps) { const isDepAStore = dep instanceof Store diff --git a/packages/store/tests/derived.test-d.ts b/packages/store/tests/derived.test-d.ts index 87bc140..6099e25 100644 --- a/packages/store/tests/derived.test-d.ts +++ b/packages/store/tests/derived.test-d.ts @@ -1,10 +1,10 @@ -import { test, expectTypeOf } from 'vitest' +import { expectTypeOf, test } from 'vitest' import { Derived, Store } from '../src' test('dep array inner types work', () => { const store = new Store(12) new Derived({ - deps: [store], + deps: [store] as const, fn: ({ currDepVals: [currentStore], prevDepVals }) => { expectTypeOf(currentStore).toMatchTypeOf() expectTypeOf(prevDepVals).toMatchTypeOf<[number] | undefined>() diff --git a/packages/store/ts-5/index.d.ts b/packages/store/ts-5/index.d.ts new file mode 100644 index 0000000..921f816 --- /dev/null +++ b/packages/store/ts-5/index.d.ts @@ -0,0 +1,18 @@ +export * from '../dist/esm/effect.js' +export * from '../dist/esm/store.js' +export * from '../dist/esm/types.js' +export { + DerivedFnProps, + DerivedOptions, + UnwrapDerivedOrStore, +} from '../dist/esm/derived.js' + +import { Store } from '../dist/esm/store.js' +import { Derived as DerivedV4 } from '../dist/esm/derived.js' + +export class Derived< + TVal, + const TArr extends ReadonlyArray< + Derived | Store + > = ReadonlyArray, +> extends DerivedV4 {} From ab0889d67a08c3acb0dc4e925211172b13056e69 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 29 Nov 2024 04:23:47 +0000 Subject: [PATCH 42/81] ci: apply automated fixes and generate docs --- docs/reference/classes/derived.md | 18 +++++++++--------- docs/reference/interfaces/derivedfnprops.md | 10 +++++----- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md index b3483fa..23e4ec9 100644 --- a/docs/reference/classes/derived.md +++ b/docs/reference/classes/derived.md @@ -29,7 +29,7 @@ new Derived(options): Derived #### Defined in -[derived.ts:118](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L118) +[derived.ts:117](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L117) ## Properties @@ -41,7 +41,7 @@ derivedToStore: Map, Set #### Defined in -[derived.ts:102](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L102) +[derived.ts:100](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L100) *** @@ -53,7 +53,7 @@ options: DerivedOptions; #### Defined in -[derived.ts:72](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L72) +[derived.ts:70](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L70) *** @@ -79,7 +79,7 @@ This is a record of stores, because derived stores are not able to write values #### Defined in -[derived.ts:101](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L101) +[derived.ts:99](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L99) ## Accessors @@ -97,7 +97,7 @@ get prevState(): TState #### Defined in -[derived.ts:164](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L164) +[derived.ts:163](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L163) *** @@ -115,7 +115,7 @@ get state(): TState #### Defined in -[derived.ts:155](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L155) +[derived.ts:154](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L154) ## Methods @@ -149,7 +149,7 @@ prevVal: undefined | NonNullable; #### Defined in -[derived.ts:104](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L104) +[derived.ts:102](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L102) *** @@ -169,7 +169,7 @@ mount(): () => void #### Defined in -[derived.ts:168](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L168) +[derived.ts:167](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L167) *** @@ -193,4 +193,4 @@ subscribe(listener): () => void #### Defined in -[derived.ts:209](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L209) +[derived.ts:210](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L210) diff --git a/docs/reference/interfaces/derivedfnprops.md b/docs/reference/interfaces/derivedfnprops.md index 340d1df..0abb4c0 100644 --- a/docs/reference/interfaces/derivedfnprops.md +++ b/docs/reference/interfaces/derivedfnprops.md @@ -3,20 +3,20 @@ id: DerivedFnProps title: DerivedFnProps --- -# Interface: DerivedFnProps\ +# Interface: DerivedFnProps\ ## Type Parameters -• **ArrType** *extends* `ReadonlyArray`\<[`Derived`](../classes/derived.md)\<`any`\> \| [`Store`](../classes/store.md)\<`any`\>\> = `ReadonlyArray`\<`any`\> +• **TArr** *extends* `ReadonlyArray`\<[`Derived`](../classes/derived.md)\<`any`\> \| [`Store`](../classes/store.md)\<`any`\>\> = `ReadonlyArray`\<`any`\> -• **UnwrappedArrT** *extends* `UnwrapReadonlyDerivedOrStoreArray`\<`ArrType`\> = `UnwrapReadonlyDerivedOrStoreArray`\<`ArrType`\> +• **TUnwrappedArr** *extends* `UnwrapReadonlyDerivedOrStoreArray`\<`TArr`\> = `UnwrapReadonlyDerivedOrStoreArray`\<`TArr`\> ## Properties ### currDepVals ```ts -currDepVals: UnwrappedArrT; +currDepVals: TUnwrappedArr; ``` #### Defined in @@ -28,7 +28,7 @@ currDepVals: UnwrappedArrT; ### prevDepVals ```ts -prevDepVals: undefined | UnwrappedArrT; +prevDepVals: undefined | TUnwrappedArr; ``` #### Defined in From 4be2a82dc5be1789d6bb309d113529d7dff22e3d Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 28 Nov 2024 20:30:06 -0800 Subject: [PATCH 43/81] chore: fix knip --- knip.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/knip.json b/knip.json index 2bcf1cb..7a52050 100644 --- a/knip.json +++ b/knip.json @@ -5,7 +5,7 @@ "ignoreDependencies": ["@angular/compiler-cli"] }, "packages/store": { - "ignore": ["src/tests/derived.bench.ts"], + "ignore": ["src/tests/derived.bench.ts", "ts-5/index.d.ts"], "ignoreDependencies": [ "@angular/core", "@preact/signals", From bf39f70082859c13bddea3c353ffffc40f3a68a3 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 28 Nov 2024 20:42:42 -0800 Subject: [PATCH 44/81] chore: more work to support TS5 --- packages/store/package.json | 5 ++++- packages/store/ts-5/index.d.cts | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 packages/store/ts-5/index.d.cts diff --git a/packages/store/package.json b/packages/store/package.json index 00d18ff..8c11f4c 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -48,10 +48,12 @@ "exports": { ".": { "import": { + "types@>=5.0": "./ts-5/index.v5.d.ts", "types": "./dist/esm/index.d.ts", "default": "./dist/esm/index.js" }, "require": { + "types@>=5.0": "./ts-5/index.v5.d.cts", "types": "./dist/cjs/index.d.cts", "default": "./dist/cjs/index.cjs" } @@ -61,7 +63,8 @@ "sideEffects": false, "files": [ "dist", - "src" + "src", + "ts-5" ], "devDependencies": { "@angular/core": "^19.0.0", diff --git a/packages/store/ts-5/index.d.cts b/packages/store/ts-5/index.d.cts new file mode 100644 index 0000000..7da6170 --- /dev/null +++ b/packages/store/ts-5/index.d.cts @@ -0,0 +1,18 @@ +export * from '../dist/cjs/effect.js' +export * from '../dist/cjs/store.js' +export * from '../dist/cjs/types.js' +export { + DerivedFnProps, + DerivedOptions, + UnwrapDerivedOrStore, +} from '../dist/cjs/derived.js' + +import { Store } from '../dist/cjs/store.js' +import { Derived as DerivedV4 } from '../dist/cjs/derived.js' + +export class Derived< + TVal, + const TArr extends ReadonlyArray< + Derived | Store + > = ReadonlyArray, +> extends DerivedV4 {} From 1e7fec03aa816a06ff176624038dabddf36ed885 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 28 Nov 2024 21:03:34 -0800 Subject: [PATCH 45/81] chore: fix usage of import and require type --- knip.json | 2 +- packages/store/package.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/knip.json b/knip.json index 7a52050..2bcf1cb 100644 --- a/knip.json +++ b/knip.json @@ -5,7 +5,7 @@ "ignoreDependencies": ["@angular/compiler-cli"] }, "packages/store": { - "ignore": ["src/tests/derived.bench.ts", "ts-5/index.d.ts"], + "ignore": ["src/tests/derived.bench.ts"], "ignoreDependencies": [ "@angular/core", "@preact/signals", diff --git a/packages/store/package.json b/packages/store/package.json index 8c11f4c..b6e066b 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -6,7 +6,7 @@ "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/TanStack/store.git", + "url": "git+https://github.com/TanStack/store.git", "directory": "packages/store" }, "homepage": "https://tanstack.com/store", @@ -48,13 +48,13 @@ "exports": { ".": { "import": { - "types@>=5.0": "./ts-5/index.v5.d.ts", "types": "./dist/esm/index.d.ts", + "types@>=5.0": "./ts-5/index.d.ts", "default": "./dist/esm/index.js" }, "require": { - "types@>=5.0": "./ts-5/index.v5.d.cts", "types": "./dist/cjs/index.d.cts", + "types@>=5.0": "./ts-5/index.d.cts", "default": "./dist/cjs/index.cjs" } }, From df0646d47e5e214cafe98fe795e12328ea8e1708 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 28 Nov 2024 23:20:15 -0800 Subject: [PATCH 46/81] chore!: drop TypeScript 4.9 support --- package.json | 1 - packages/react-store/package.json | 1 - packages/react-store/tsconfig.legacy.json | 10 ---------- packages/solid-store/package.json | 1 - packages/solid-store/tsconfig.legacy.json | 11 ----------- packages/store/package.json | 13 +------------ packages/store/src/derived.ts | 2 +- packages/store/tests/derived.test-d.ts | 2 +- packages/store/ts-5/index.d.cts | 18 ------------------ packages/store/ts-5/index.d.ts | 18 ------------------ packages/store/tsconfig.legacy.json | 4 ---- packages/vue-store/package.json | 1 - packages/vue-store/tsconfig.legacy.json | 12 ------------ pnpm-lock.yaml | 10 ---------- 14 files changed, 3 insertions(+), 101 deletions(-) delete mode 100644 packages/react-store/tsconfig.legacy.json delete mode 100644 packages/solid-store/tsconfig.legacy.json delete mode 100644 packages/store/ts-5/index.d.cts delete mode 100644 packages/store/ts-5/index.d.ts delete mode 100644 packages/store/tsconfig.legacy.json delete mode 100644 packages/vue-store/tsconfig.legacy.json diff --git a/package.json b/package.json index 9e6ca18..75d68a8 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,6 @@ "sherif": "^1.0.2", "solid-js": "^1.9.3", "typescript": "5.6.3", - "typescript49": "npm:typescript@4.9", "typescript50": "npm:typescript@5.0", "typescript51": "npm:typescript@5.1", "typescript52": "npm:typescript@5.2", diff --git a/packages/react-store/package.json b/packages/react-store/package.json index 419076f..183668a 100644 --- a/packages/react-store/package.json +++ b/packages/react-store/package.json @@ -23,7 +23,6 @@ "clean": "rimraf ./dist && rimraf ./coverage", "test:eslint": "eslint ./src ./tests", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts49": "node ../../node_modules/typescript49/lib/tsc.js -p tsconfig.legacy.json", "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", diff --git a/packages/react-store/tsconfig.legacy.json b/packages/react-store/tsconfig.legacy.json deleted file mode 100644 index bfa4367..0000000 --- a/packages/react-store/tsconfig.legacy.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "jsx": "react", - "paths": { - "@tanstack/store": ["../store/src"] - } - }, - "include": ["src"] -} diff --git a/packages/solid-store/package.json b/packages/solid-store/package.json index 958b58f..c4c8eb9 100644 --- a/packages/solid-store/package.json +++ b/packages/solid-store/package.json @@ -23,7 +23,6 @@ "clean": "rimraf ./dist && rimraf ./coverage", "test:eslint": "eslint ./src ./tests", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts49": "node ../../node_modules/typescript49/lib/tsc.js -p tsconfig.legacy.json", "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", diff --git a/packages/solid-store/tsconfig.legacy.json b/packages/solid-store/tsconfig.legacy.json deleted file mode 100644 index 783ab9e..0000000 --- a/packages/solid-store/tsconfig.legacy.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "jsx": "preserve", - "jsxImportSource": "solid-js", - "paths": { - "@tanstack/store": ["../store/src"] - } - }, - "include": ["src"] -} diff --git a/packages/store/package.json b/packages/store/package.json index b6e066b..fb32c9b 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -22,7 +22,6 @@ "clean": "rimraf ./dist && rimraf ./coverage", "test:eslint": "eslint ./src ./tests", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts49": "node ../../node_modules/typescript49/lib/tsc.js -p tsconfig.legacy.json", "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", @@ -36,25 +35,16 @@ }, "type": "module", "types": "dist/esm/index.d.ts", - "typesVersions": { - "=>5.0": { - "index.d.ts": [ - "ts-5/index.v5.d.ts" - ] - } - }, "main": "dist/cjs/index.cjs", "module": "dist/esm/index.js", "exports": { ".": { "import": { "types": "./dist/esm/index.d.ts", - "types@>=5.0": "./ts-5/index.d.ts", "default": "./dist/esm/index.js" }, "require": { "types": "./dist/cjs/index.d.cts", - "types@>=5.0": "./ts-5/index.d.cts", "default": "./dist/cjs/index.cjs" } }, @@ -63,8 +53,7 @@ "sideEffects": false, "files": [ "dist", - "src", - "ts-5" + "src" ], "devDependencies": { "@angular/core": "^19.0.0", diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index d376481..4570ccf 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -57,7 +57,7 @@ export interface DerivedOptions< export class Derived< TState, - TArr extends ReadonlyArray | Store> = ReadonlyArray, + const TArr extends ReadonlyArray | Store> = ReadonlyArray, > { /** * @private diff --git a/packages/store/tests/derived.test-d.ts b/packages/store/tests/derived.test-d.ts index 6099e25..9fb0fc4 100644 --- a/packages/store/tests/derived.test-d.ts +++ b/packages/store/tests/derived.test-d.ts @@ -4,7 +4,7 @@ import { Derived, Store } from '../src' test('dep array inner types work', () => { const store = new Store(12) new Derived({ - deps: [store] as const, + deps: [store], fn: ({ currDepVals: [currentStore], prevDepVals }) => { expectTypeOf(currentStore).toMatchTypeOf() expectTypeOf(prevDepVals).toMatchTypeOf<[number] | undefined>() diff --git a/packages/store/ts-5/index.d.cts b/packages/store/ts-5/index.d.cts deleted file mode 100644 index 7da6170..0000000 --- a/packages/store/ts-5/index.d.cts +++ /dev/null @@ -1,18 +0,0 @@ -export * from '../dist/cjs/effect.js' -export * from '../dist/cjs/store.js' -export * from '../dist/cjs/types.js' -export { - DerivedFnProps, - DerivedOptions, - UnwrapDerivedOrStore, -} from '../dist/cjs/derived.js' - -import { Store } from '../dist/cjs/store.js' -import { Derived as DerivedV4 } from '../dist/cjs/derived.js' - -export class Derived< - TVal, - const TArr extends ReadonlyArray< - Derived | Store - > = ReadonlyArray, -> extends DerivedV4 {} diff --git a/packages/store/ts-5/index.d.ts b/packages/store/ts-5/index.d.ts deleted file mode 100644 index 921f816..0000000 --- a/packages/store/ts-5/index.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -export * from '../dist/esm/effect.js' -export * from '../dist/esm/store.js' -export * from '../dist/esm/types.js' -export { - DerivedFnProps, - DerivedOptions, - UnwrapDerivedOrStore, -} from '../dist/esm/derived.js' - -import { Store } from '../dist/esm/store.js' -import { Derived as DerivedV4 } from '../dist/esm/derived.js' - -export class Derived< - TVal, - const TArr extends ReadonlyArray< - Derived | Store - > = ReadonlyArray, -> extends DerivedV4 {} diff --git a/packages/store/tsconfig.legacy.json b/packages/store/tsconfig.legacy.json deleted file mode 100644 index 596e2cf..0000000 --- a/packages/store/tsconfig.legacy.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "include": ["src"] -} diff --git a/packages/vue-store/package.json b/packages/vue-store/package.json index b048d4c..7c3bf48 100644 --- a/packages/vue-store/package.json +++ b/packages/vue-store/package.json @@ -23,7 +23,6 @@ "clean": "rimraf ./dist && rimraf ./coverage", "test:eslint": "eslint ./src ./tests", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts49": "node ../../node_modules/typescript49/lib/tsc.js -p tsconfig.legacy.json", "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", diff --git a/packages/vue-store/tsconfig.legacy.json b/packages/vue-store/tsconfig.legacy.json deleted file mode 100644 index 05c9a49..0000000 --- a/packages/vue-store/tsconfig.legacy.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "jsx": "preserve", - "jsxImportSource": "vue", - "types": ["vue/jsx"], - "paths": { - "@tanstack/store": ["../store/src"] - } - }, - "include": ["src"] -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 855e934..611ade8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -83,9 +83,6 @@ importers: typescript: specifier: 5.6.3 version: 5.6.3 - typescript49: - specifier: npm:typescript@4.9 - version: typescript@4.9.5 typescript50: specifier: npm:typescript@5.0 version: typescript@5.0.4 @@ -6514,11 +6511,6 @@ packages: typescript: optional: true - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - typescript@5.0.4: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} @@ -13877,8 +13869,6 @@ snapshots: - eslint - supports-color - typescript@4.9.5: {} - typescript@5.0.4: {} typescript@5.1.6: {} From 7b0bdd2bdbcea2b44de63a2018c4380d9e11e2cb Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 29 Nov 2024 07:21:04 +0000 Subject: [PATCH 47/81] ci: apply automated fixes and generate docs --- docs/reference/classes/derived.md | 18 +++++++++--------- packages/store/src/derived.ts | 4 +++- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md index 23e4ec9..c74d0e0 100644 --- a/docs/reference/classes/derived.md +++ b/docs/reference/classes/derived.md @@ -29,7 +29,7 @@ new Derived(options): Derived #### Defined in -[derived.ts:117](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L117) +[derived.ts:119](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L119) ## Properties @@ -41,7 +41,7 @@ derivedToStore: Map, Set #### Defined in -[derived.ts:100](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L100) +[derived.ts:102](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L102) *** @@ -53,7 +53,7 @@ options: DerivedOptions; #### Defined in -[derived.ts:70](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L70) +[derived.ts:72](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L72) *** @@ -79,7 +79,7 @@ This is a record of stores, because derived stores are not able to write values #### Defined in -[derived.ts:99](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L99) +[derived.ts:101](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L101) ## Accessors @@ -97,7 +97,7 @@ get prevState(): TState #### Defined in -[derived.ts:163](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L163) +[derived.ts:165](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L165) *** @@ -115,7 +115,7 @@ get state(): TState #### Defined in -[derived.ts:154](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L154) +[derived.ts:156](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L156) ## Methods @@ -149,7 +149,7 @@ prevVal: undefined | NonNullable; #### Defined in -[derived.ts:102](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L102) +[derived.ts:104](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L104) *** @@ -169,7 +169,7 @@ mount(): () => void #### Defined in -[derived.ts:167](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L167) +[derived.ts:169](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L169) *** @@ -193,4 +193,4 @@ subscribe(listener): () => void #### Defined in -[derived.ts:210](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L210) +[derived.ts:212](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L212) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 4570ccf..509dff1 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -57,7 +57,9 @@ export interface DerivedOptions< export class Derived< TState, - const TArr extends ReadonlyArray | Store> = ReadonlyArray, + const TArr extends ReadonlyArray< + Derived | Store + > = ReadonlyArray, > { /** * @private From d751b2d40f7850da5fe1dd8ca856637cadb90be8 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 29 Nov 2024 07:07:36 -0800 Subject: [PATCH 48/81] fix: prevState now works as intended --- packages/store/src/store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/store/src/store.ts b/packages/store/src/store.ts index 8a372fa..4263755 100644 --- a/packages/store/src/store.ts +++ b/packages/store/src/store.ts @@ -66,7 +66,6 @@ export class Store< // Attempt to flush this._flush() - this.prevState = this.state } /** @@ -78,6 +77,7 @@ export class Store< for (const listener of this.listeners) { if (this._flushing !== flushId) continue listener({ prevVal: this.prevState, currentVal: this.state }) + this.prevState = this.state } } From e8ff103d54c59e6c148d927462e3657038c10507 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 29 Nov 2024 09:02:17 -0800 Subject: [PATCH 49/81] chore!: remove store.batch, add in temporary scheduler, skip intentionally broken tests --- packages/store/src/derived.ts | 102 +++++++++++-------------- packages/store/src/index.ts | 1 + packages/store/src/scheduler.ts | 38 +++++++++ packages/store/src/store.ts | 31 +------- packages/store/tests/derived.test.ts | 27 +++++++ packages/store/tests/scheduler.test.ts | 31 ++++++++ packages/store/tests/store.test.ts | 14 ++-- 7 files changed, 149 insertions(+), 95 deletions(-) create mode 100644 packages/store/src/scheduler.ts create mode 100644 packages/store/tests/scheduler.test.ts diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 509dff1..63dee71 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -1,4 +1,10 @@ import { Store } from './store' +import { + __depsThatHaveWrittenThisTick, + __derivedToStore, + __storeToDerived, + __whatStoreIsCurrentlyInUse, +} from './scheduler' import type { Listener } from './types' export type UnwrapDerivedOrStore = @@ -65,10 +71,6 @@ export class Derived< * @private */ _store: Store - /** - * @private - */ - rootStores = new Set>() options: DerivedOptions /** @@ -77,30 +79,6 @@ export class Derived< */ _subscriptions: Array<() => void> = [] - /** - * What store called the current update, if any - * @private - */ - _whatStoreIsCurrentlyInUse: Store | null = null - - /** - * This is here to solve the pyramid dependency problem where: - * A - * / \ - * B C - * \ / - * D - * - * Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is. - * - * To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been - * resolved. - * - * This is a record of stores, because derived stores are not able to write values to, but stores are - */ - storeToDerived = new Map, Set>>() - derivedToStore = new Map, Set>>() - getDepVals = () => { const prevDepVals = [] as Array const currDepVals = [] as Array @@ -130,27 +108,6 @@ export class Derived< onSubscribe: options.onSubscribe?.bind(this) as never, onUpdate: options.onUpdate, }) - - const updateStoreToDerived = ( - store: Store, - dep: Derived, - ) => { - const prevDerivesForStore = this.storeToDerived.get(store) || new Set() - prevDerivesForStore.add(dep) - this.storeToDerived.set(store, prevDerivesForStore) - } - for (const dep of options.deps) { - if (dep instanceof Derived) { - this.derivedToStore.set(dep, dep.rootStores) - for (const store of dep.rootStores) { - this.rootStores.add(store) - updateStoreToDerived(store, dep) - } - } else if (dep instanceof Store) { - this.rootStores.add(dep) - updateStoreToDerived(dep, this as Derived) - } - } } get state() { @@ -166,20 +123,46 @@ export class Derived< return this._store.prevState } - mount = () => { - let __depsThatHaveWrittenThisTick = [] as Array< - Derived | Store - > + registerOnGraph( + deps: ReadonlyArray | Store> = this.options.deps, + ) { + for (const dep of deps) { + if (dep instanceof Derived) { + // Go into the deps of the derived and find the root store(s) that it depends on deeply + // Then, register this derived as a related derived to the store + this.registerOnGraph(dep.options.deps) + } else if (dep instanceof Store) { + // Register the derived as related derived to the store + let relatedLinkedDerivedVals = __storeToDerived.get(dep) + if (!relatedLinkedDerivedVals) { + relatedLinkedDerivedVals = new Set() + __storeToDerived.set(dep, relatedLinkedDerivedVals) + } + relatedLinkedDerivedVals.add(this as never) + // Register the store as a related store to this derived + let relatedStores = __derivedToStore.get(this as never) + if (!relatedStores) { + relatedStores = new Set() + __derivedToStore.set(this as never, relatedStores) + } + relatedStores.add(dep) + } + } + } + + unregisterFromGraph() {} + + mount = () => { + this.registerOnGraph() for (const dep of this.options.deps) { const isDepAStore = dep instanceof Store let relatedLinkedDerivedVals: null | Set> = null const unsub = dep.subscribe(() => { - const store = isDepAStore ? dep : dep._whatStoreIsCurrentlyInUse - this._whatStoreIsCurrentlyInUse = store + const store = isDepAStore ? dep : __whatStoreIsCurrentlyInUse.current if (store) { - relatedLinkedDerivedVals = this.storeToDerived.get(store) ?? null + relatedLinkedDerivedVals = __storeToDerived.get(store) ?? null } __depsThatHaveWrittenThisTick.push(dep) @@ -192,9 +175,9 @@ export class Derived< this._store.setState(() => this.options.fn(this.getDepVals())) } - // Cleanup the deps that have written this tick - __depsThatHaveWrittenThisTick = [] - this._whatStoreIsCurrentlyInUse = null + // // Cleanup the deps that have written this tick + // __depsThatHaveWrittenThisTick = [] + __whatStoreIsCurrentlyInUse.current = null return } }) @@ -203,6 +186,7 @@ export class Derived< } return () => { + this.unregisterFromGraph() for (const cleanup of this._subscriptions) { cleanup() } diff --git a/packages/store/src/index.ts b/packages/store/src/index.ts index c766b28..7b106f5 100644 --- a/packages/store/src/index.ts +++ b/packages/store/src/index.ts @@ -2,3 +2,4 @@ export * from './derived' export * from './effect' export * from './store' export * from './types' +export * from './scheduler' diff --git a/packages/store/src/scheduler.ts b/packages/store/src/scheduler.ts new file mode 100644 index 0000000..bb2988f --- /dev/null +++ b/packages/store/src/scheduler.ts @@ -0,0 +1,38 @@ +import type { Store } from './store' +import type { Derived } from './derived' + +/** + * What store called the current update, if any + * @private + */ +export const __whatStoreIsCurrentlyInUse = { + current: null as Store | null, +} + +/** + * This is here to solve the pyramid dependency problem where: + * A + * / \ + * B C + * \ / + * D + * + * Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is. + * + * To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been + * resolved. + * + * This is a record of stores, because derived stores are not able to write values to, but stores are + */ +export const __storeToDerived = new WeakMap< + Store, + Set> +>() +export const __derivedToStore = new WeakMap< + Derived, + Set> +>() + +export const __depsThatHaveWrittenThisTick = [] as Array< + Derived | Store +> diff --git a/packages/store/src/store.ts b/packages/store/src/store.ts index 4263755..24f3a68 100644 --- a/packages/store/src/store.ts +++ b/packages/store/src/store.ts @@ -1,3 +1,4 @@ +import { __whatStoreIsCurrentlyInUse } from './scheduler' import type { AnyUpdater, Listener } from './types' export interface StoreOptions< @@ -31,14 +32,6 @@ export class Store< state: TState prevState: TState options?: StoreOptions - /** - * @private - */ - _batching = false - /** - * @private - */ - _flushing = 0 constructor(initialState: TState, options?: StoreOptions) { this.prevState = initialState @@ -56,6 +49,7 @@ export class Store< } setState = (updater: TUpdater) => { + __whatStoreIsCurrentlyInUse.current = this as never const previous = this.state this.state = this.options?.updateFn ? this.options.updateFn(previous)(updater) @@ -67,25 +61,4 @@ export class Store< // Attempt to flush this._flush() } - - /** - * @private - */ - _flush = () => { - if (this._batching) return - const flushId = ++this._flushing - for (const listener of this.listeners) { - if (this._flushing !== flushId) continue - listener({ prevVal: this.prevState, currentVal: this.state }) - this.prevState = this.state - } - } - - batch = (cb: () => void) => { - if (this._batching) return cb() - this._batching = true - cb() - this._batching = false - this._flush() - } } diff --git a/packages/store/tests/derived.test.ts b/packages/store/tests/derived.test.ts index 01bc963..1a6193f 100644 --- a/packages/store/tests/derived.test.ts +++ b/packages/store/tests/derived.test.ts @@ -238,6 +238,33 @@ describe('Derived', () => { }) }) + test.skip('derivedFn should receive old and new dep values for similar derived values', () => { + const count = new Store(12) + const halfCount = new Derived({ + deps: [count], + fn: () => count.state / 2, + }) + halfCount.mount() + const fn = vi.fn() + const derived = new Derived({ + deps: [count, halfCount], + fn: ({ prevDepVals, currDepVals }) => { + fn({ prevDepVals, currDepVals }) + return void 0 + }, + }) + derived.mount() + expect(fn).toBeCalledWith({ + prevDepVals: undefined, + currDepVals: [12, 6], + }) + count.setState(() => 24) + expect(fn).toBeCalledWith({ + prevDepVals: [12, 6], + currDepVals: [24, 12], + }) + }) + test('derivedFn should receive the old value', () => { const count = new Store(12) const date = new Date() diff --git a/packages/store/tests/scheduler.test.ts b/packages/store/tests/scheduler.test.ts new file mode 100644 index 0000000..1f127ca --- /dev/null +++ b/packages/store/tests/scheduler.test.ts @@ -0,0 +1,31 @@ +import { describe, expect, test } from 'vitest' +import { Derived, Store, __derivedToStore, __storeToDerived } from '../src' + +describe('Scheduler logic', () => { + test('Should build a graph properly', () => { + const count = new Store(10) + + const halfCount = new Derived({ + deps: [count], + fn: () => { + return count.state / 2 + }, + }) + + halfCount.registerOnGraph() + + const doubleHalfCount = new Derived({ + deps: [halfCount], + fn: () => { + return halfCount.state * 2 + }, + }) + + doubleHalfCount.registerOnGraph() + + expect(__storeToDerived.get(count)).toContain(halfCount) + expect(__derivedToStore.get(halfCount)).toContain(count) + expect(__storeToDerived.get(count)).toContain(doubleHalfCount) + expect(__derivedToStore.get(doubleHalfCount)).toContain(count) + }) +}) diff --git a/packages/store/tests/store.test.ts b/packages/store/tests/store.test.ts index 79f38e7..42c25dc 100644 --- a/packages/store/tests/store.test.ts +++ b/packages/store/tests/store.test.ts @@ -53,19 +53,19 @@ describe('store', () => { expect(typeof store.state).toEqual('number') }) - test('Batch prevents listeners from being called during repeated setStates', () => { + test.skip('Batch prevents listeners from being called during repeated setStates', () => { const store = new Store(0) const listener = vi.fn() const unsub = store.subscribe(listener) - store.batch(() => { - store.setState(() => 1) - store.setState(() => 2) - store.setState(() => 3) - store.setState(() => 4) - }) + // store.batch(() => { + // store.setState(() => 1) + // store.setState(() => 2) + // store.setState(() => 3) + // store.setState(() => 4) + // }) expect(store.state).toEqual(4) // Listener is only called once because of batching From 5f11306255557ce0715c9b97ecea10d28fe87d75 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 29 Nov 2024 17:09:01 +0000 Subject: [PATCH 50/81] ci: apply automated fixes and generate docs --- .../reference/functions/injectstore.md | 37 ---- docs/framework/angular/reference/index.md | 10 - .../react/reference/functions/shallow.md | 28 --- .../react/reference/functions/usestore.md | 32 --- docs/framework/react/reference/index.md | 11 - .../solid/reference/functions/usestore.md | 32 --- docs/framework/solid/reference/index.md | 10 - .../svelte/reference/functions/shallow.md | 28 --- .../svelte/reference/functions/usestore.md | 44 ---- docs/framework/svelte/reference/index.md | 11 - .../vue/reference/functions/shallow.md | 28 --- .../vue/reference/functions/usestore.md | 32 --- docs/framework/vue/reference/index.md | 11 - docs/reference/classes/derived.md | 196 ------------------ docs/reference/classes/effect.md | 46 ---- docs/reference/classes/store.md | 146 ------------- docs/reference/index.md | 22 -- docs/reference/interfaces/derivedfnprops.md | 50 ----- docs/reference/interfaces/derivedoptions.md | 108 ---------- docs/reference/interfaces/storeoptions.md | 90 -------- .../type-aliases/unwrapderivedorstore.md | 18 -- 21 files changed, 990 deletions(-) delete mode 100644 docs/framework/angular/reference/functions/injectstore.md delete mode 100644 docs/framework/angular/reference/index.md delete mode 100644 docs/framework/react/reference/functions/shallow.md delete mode 100644 docs/framework/react/reference/functions/usestore.md delete mode 100644 docs/framework/react/reference/index.md delete mode 100644 docs/framework/solid/reference/functions/usestore.md delete mode 100644 docs/framework/solid/reference/index.md delete mode 100644 docs/framework/svelte/reference/functions/shallow.md delete mode 100644 docs/framework/svelte/reference/functions/usestore.md delete mode 100644 docs/framework/svelte/reference/index.md delete mode 100644 docs/framework/vue/reference/functions/shallow.md delete mode 100644 docs/framework/vue/reference/functions/usestore.md delete mode 100644 docs/framework/vue/reference/index.md delete mode 100644 docs/reference/classes/derived.md delete mode 100644 docs/reference/classes/effect.md delete mode 100644 docs/reference/classes/store.md delete mode 100644 docs/reference/index.md delete mode 100644 docs/reference/interfaces/derivedfnprops.md delete mode 100644 docs/reference/interfaces/derivedoptions.md delete mode 100644 docs/reference/interfaces/storeoptions.md delete mode 100644 docs/reference/type-aliases/unwrapderivedorstore.md diff --git a/docs/framework/angular/reference/functions/injectstore.md b/docs/framework/angular/reference/functions/injectstore.md deleted file mode 100644 index 895f6d3..0000000 --- a/docs/framework/angular/reference/functions/injectstore.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -id: injectStore -title: injectStore ---- - -# Function: injectStore() - -```ts -function injectStore( - store, - selector, -options): Signal -``` - -## Type Parameters - -• **TState** - -• **TSelected** = `NoInfer`\<`TState`\> - -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters - -• **store**: `Store`\<`TState`, `TUpdater`\> - -• **selector** = `...` - -• **options**: `CreateSignalOptions`\<`TSelected`\> & `object` = `...` - -## Returns - -`Signal`\<`TSelected`\> - -## Defined in - -[index.ts:17](https://github.com/TanStack/store/blob/main/packages/angular-store/src/index.ts#L17) diff --git a/docs/framework/angular/reference/index.md b/docs/framework/angular/reference/index.md deleted file mode 100644 index ac9a76d..0000000 --- a/docs/framework/angular/reference/index.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -id: "@tanstack/angular-store" -title: "@tanstack/angular-store" ---- - -# @tanstack/angular-store - -## Functions - -- [injectStore](functions/injectstore.md) diff --git a/docs/framework/react/reference/functions/shallow.md b/docs/framework/react/reference/functions/shallow.md deleted file mode 100644 index d434664..0000000 --- a/docs/framework/react/reference/functions/shallow.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: shallow -title: shallow ---- - -# Function: shallow() - -```ts -function shallow(objA, objB): boolean -``` - -## Type Parameters - -• **T** - -## Parameters - -• **objA**: `T` - -• **objB**: `T` - -## Returns - -`boolean` - -## Defined in - -[index.ts:30](https://github.com/TanStack/store/blob/main/packages/react-store/src/index.ts#L30) diff --git a/docs/framework/react/reference/functions/usestore.md b/docs/framework/react/reference/functions/usestore.md deleted file mode 100644 index c8708ea..0000000 --- a/docs/framework/react/reference/functions/usestore.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -id: useStore -title: useStore ---- - -# Function: useStore() - -```ts -function useStore(store, selector): TSelected -``` - -## Type Parameters - -• **TState** - -• **TSelected** = `NoInfer`\<`TState`\> - -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters - -• **store**: `Store`\<`TState`, `TUpdater`\> - -• **selector** = `...` - -## Returns - -`TSelected` - -## Defined in - -[index.ts:11](https://github.com/TanStack/store/blob/main/packages/react-store/src/index.ts#L11) diff --git a/docs/framework/react/reference/index.md b/docs/framework/react/reference/index.md deleted file mode 100644 index 4a1665a..0000000 --- a/docs/framework/react/reference/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: "@tanstack/react-store" -title: "@tanstack/react-store" ---- - -# @tanstack/react-store - -## Functions - -- [shallow](functions/shallow.md) -- [useStore](functions/usestore.md) diff --git a/docs/framework/solid/reference/functions/usestore.md b/docs/framework/solid/reference/functions/usestore.md deleted file mode 100644 index 414ef75..0000000 --- a/docs/framework/solid/reference/functions/usestore.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -id: useStore -title: useStore ---- - -# Function: useStore() - -```ts -function useStore(store, selector): Accessor -``` - -## Type Parameters - -• **TState** - -• **TSelected** = `NoInfer`\<`TState`\> - -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters - -• **store**: `Store`\<`TState`, `TUpdater`\> - -• **selector** = `...` - -## Returns - -`Accessor`\<`TSelected`\> - -## Defined in - -[index.tsx:13](https://github.com/TanStack/store/blob/main/packages/solid-store/src/index.tsx#L13) diff --git a/docs/framework/solid/reference/index.md b/docs/framework/solid/reference/index.md deleted file mode 100644 index a6e4497..0000000 --- a/docs/framework/solid/reference/index.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -id: "@tanstack/solid-store" -title: "@tanstack/solid-store" ---- - -# @tanstack/solid-store - -## Functions - -- [useStore](functions/usestore.md) diff --git a/docs/framework/svelte/reference/functions/shallow.md b/docs/framework/svelte/reference/functions/shallow.md deleted file mode 100644 index ec5fc24..0000000 --- a/docs/framework/svelte/reference/functions/shallow.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: shallow -title: shallow ---- - -# Function: shallow() - -```ts -function shallow(objA, objB): boolean -``` - -## Type Parameters - -• **T** - -## Parameters - -• **objA**: `T` - -• **objB**: `T` - -## Returns - -`boolean` - -## Defined in - -[index.svelte.ts:39](https://github.com/TanStack/store/blob/main/packages/svelte-store/src/index.svelte.ts#L39) diff --git a/docs/framework/svelte/reference/functions/usestore.md b/docs/framework/svelte/reference/functions/usestore.md deleted file mode 100644 index eb7925e..0000000 --- a/docs/framework/svelte/reference/functions/usestore.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -id: useStore -title: useStore ---- - -# Function: useStore() - -```ts -function useStore(store, selector): object -``` - -## Type Parameters - -• **TState** - -• **TSelected** = `NoInfer`\<`TState`\> - -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters - -• **store**: `Store`\<`TState`, `TUpdater`\> - -• **selector** = `...` - -## Returns - -`object` - -### current - -#### Get Signature - -```ts -get current(): TSelected -``` - -##### Returns - -`TSelected` - -## Defined in - -[index.svelte.ts:10](https://github.com/TanStack/store/blob/main/packages/svelte-store/src/index.svelte.ts#L10) diff --git a/docs/framework/svelte/reference/index.md b/docs/framework/svelte/reference/index.md deleted file mode 100644 index 36d4f81..0000000 --- a/docs/framework/svelte/reference/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: "@tanstack/svelte-store" -title: "@tanstack/svelte-store" ---- - -# @tanstack/svelte-store - -## Functions - -- [shallow](functions/shallow.md) -- [useStore](functions/usestore.md) diff --git a/docs/framework/vue/reference/functions/shallow.md b/docs/framework/vue/reference/functions/shallow.md deleted file mode 100644 index 157a151..0000000 --- a/docs/framework/vue/reference/functions/shallow.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: shallow -title: shallow ---- - -# Function: shallow() - -```ts -function shallow(objA, objB): boolean -``` - -## Type Parameters - -• **T** - -## Parameters - -• **objA**: `T` - -• **objB**: `T` - -## Returns - -`boolean` - -## Defined in - -[index.ts:43](https://github.com/TanStack/store/blob/main/packages/vue-store/src/index.ts#L43) diff --git a/docs/framework/vue/reference/functions/usestore.md b/docs/framework/vue/reference/functions/usestore.md deleted file mode 100644 index dc20e9e..0000000 --- a/docs/framework/vue/reference/functions/usestore.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -id: useStore -title: useStore ---- - -# Function: useStore() - -```ts -function useStore(store, selector): Readonly> -``` - -## Type Parameters - -• **TState** - -• **TSelected** = `NoInfer`\<`TState`\> - -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters - -• **store**: `Store`\<`TState`, `TUpdater`\> - -• **selector** = `...` - -## Returns - -`Readonly`\<`Ref`\<`TSelected`\>\> - -## Defined in - -[index.ts:12](https://github.com/TanStack/store/blob/main/packages/vue-store/src/index.ts#L12) diff --git a/docs/framework/vue/reference/index.md b/docs/framework/vue/reference/index.md deleted file mode 100644 index 7fef438..0000000 --- a/docs/framework/vue/reference/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: "@tanstack/vue-store" -title: "@tanstack/vue-store" ---- - -# @tanstack/vue-store - -## Functions - -- [shallow](functions/shallow.md) -- [useStore](functions/usestore.md) diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md deleted file mode 100644 index c74d0e0..0000000 --- a/docs/reference/classes/derived.md +++ /dev/null @@ -1,196 +0,0 @@ ---- -id: Derived -title: Derived ---- - -# Class: Derived\ - -## Type Parameters - -• **TState** - -• **TArr** *extends* `ReadonlyArray`\<[`Derived`](derived.md)\<`any`\> \| [`Store`](store.md)\<`any`\>\> = `ReadonlyArray`\<`any`\> - -## Constructors - -### new Derived() - -```ts -new Derived(options): Derived -``` - -#### Parameters - -• **options**: [`DerivedOptions`](../interfaces/derivedoptions.md)\<`TState`, `TArr`\> - -#### Returns - -[`Derived`](derived.md)\<`TState`, `TArr`\> - -#### Defined in - -[derived.ts:119](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L119) - -## Properties - -### derivedToStore - -```ts -derivedToStore: Map, Set unknown>>>; -``` - -#### Defined in - -[derived.ts:102](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L102) - -*** - -### options - -```ts -options: DerivedOptions; -``` - -#### Defined in - -[derived.ts:72](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L72) - -*** - -### storeToDerived - -```ts -storeToDerived: Map unknown>, Set>>; -``` - -This is here to solve the pyramid dependency problem where: - A - / \ - B C - \ / - D - -Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is. - -To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been -resolved. - -This is a record of stores, because derived stores are not able to write values to, but stores are - -#### Defined in - -[derived.ts:101](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L101) - -## Accessors - -### prevState - -#### Get Signature - -```ts -get prevState(): TState -``` - -##### Returns - -`TState` - -#### Defined in - -[derived.ts:165](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L165) - -*** - -### state - -#### Get Signature - -```ts -get state(): TState -``` - -##### Returns - -`TState` - -#### Defined in - -[derived.ts:156](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L156) - -## Methods - -### getDepVals() - -```ts -getDepVals(): object -``` - -#### Returns - -`object` - -##### currDepVals - -```ts -currDepVals: never; -``` - -##### prevDepVals - -```ts -prevDepVals: never; -``` - -##### prevVal - -```ts -prevVal: undefined | NonNullable; -``` - -#### Defined in - -[derived.ts:104](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L104) - -*** - -### mount() - -```ts -mount(): () => void -``` - -#### Returns - -`Function` - -##### Returns - -`void` - -#### Defined in - -[derived.ts:169](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L169) - -*** - -### subscribe() - -```ts -subscribe(listener): () => void -``` - -#### Parameters - -• **listener**: `Listener`\<`TState`\> - -#### Returns - -`Function` - -##### Returns - -`void` - -#### Defined in - -[derived.ts:212](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L212) diff --git a/docs/reference/classes/effect.md b/docs/reference/classes/effect.md deleted file mode 100644 index f8c7602..0000000 --- a/docs/reference/classes/effect.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -id: Effect -title: Effect ---- - -# Class: Effect - -## Constructors - -### new Effect() - -```ts -new Effect(opts): Effect -``` - -#### Parameters - -• **opts**: `EffectOptions` - -#### Returns - -[`Effect`](effect.md) - -#### Defined in - -[effect.ts:23](https://github.com/TanStack/store/blob/main/packages/store/src/effect.ts#L23) - -## Methods - -### mount() - -```ts -mount(): () => void -``` - -#### Returns - -`Function` - -##### Returns - -`void` - -#### Defined in - -[effect.ts:39](https://github.com/TanStack/store/blob/main/packages/store/src/effect.ts#L39) diff --git a/docs/reference/classes/store.md b/docs/reference/classes/store.md deleted file mode 100644 index 5cd7c54..0000000 --- a/docs/reference/classes/store.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -id: Store -title: Store ---- - -# Class: Store\ - -## Type Parameters - -• **TState** - -• **TUpdater** *extends* `AnyUpdater` = (`cb`) => `TState` - -## Constructors - -### new Store() - -```ts -new Store(initialState, options?): Store -``` - -#### Parameters - -• **initialState**: `TState` - -• **options?**: [`StoreOptions`](../interfaces/storeoptions.md)\<`TState`, `TUpdater`\> - -#### Returns - -[`Store`](store.md)\<`TState`, `TUpdater`\> - -#### Defined in - -[store.ts:43](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L43) - -## Properties - -### listeners - -```ts -listeners: Set>; -``` - -#### Defined in - -[store.ts:30](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L30) - -*** - -### options? - -```ts -optional options: StoreOptions; -``` - -#### Defined in - -[store.ts:33](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L33) - -*** - -### prevState - -```ts -prevState: TState; -``` - -#### Defined in - -[store.ts:32](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L32) - -*** - -### state - -```ts -state: TState; -``` - -#### Defined in - -[store.ts:31](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L31) - -## Methods - -### batch() - -```ts -batch(cb): void -``` - -#### Parameters - -• **cb** - -#### Returns - -`void` - -#### Defined in - -[store.ts:84](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L84) - -*** - -### setState() - -```ts -setState(updater): void -``` - -#### Parameters - -• **updater**: `TUpdater` - -#### Returns - -`void` - -#### Defined in - -[store.ts:58](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L58) - -*** - -### subscribe() - -```ts -subscribe(listener): () => void -``` - -#### Parameters - -• **listener**: `Listener`\<`TState`\> - -#### Returns - -`Function` - -##### Returns - -`void` - -#### Defined in - -[store.ts:49](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L49) diff --git a/docs/reference/index.md b/docs/reference/index.md deleted file mode 100644 index 0a972b8..0000000 --- a/docs/reference/index.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: "@tanstack/store" -title: "@tanstack/store" ---- - -# @tanstack/store - -## Classes - -- [Derived](classes/derived.md) -- [Effect](classes/effect.md) -- [Store](classes/store.md) - -## Interfaces - -- [DerivedFnProps](interfaces/derivedfnprops.md) -- [DerivedOptions](interfaces/derivedoptions.md) -- [StoreOptions](interfaces/storeoptions.md) - -## Type Aliases - -- [UnwrapDerivedOrStore](type-aliases/unwrapderivedorstore.md) diff --git a/docs/reference/interfaces/derivedfnprops.md b/docs/reference/interfaces/derivedfnprops.md deleted file mode 100644 index 0abb4c0..0000000 --- a/docs/reference/interfaces/derivedfnprops.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -id: DerivedFnProps -title: DerivedFnProps ---- - -# Interface: DerivedFnProps\ - -## Type Parameters - -• **TArr** *extends* `ReadonlyArray`\<[`Derived`](../classes/derived.md)\<`any`\> \| [`Store`](../classes/store.md)\<`any`\>\> = `ReadonlyArray`\<`any`\> - -• **TUnwrappedArr** *extends* `UnwrapReadonlyDerivedOrStoreArray`\<`TArr`\> = `UnwrapReadonlyDerivedOrStoreArray`\<`TArr`\> - -## Properties - -### currDepVals - -```ts -currDepVals: TUnwrappedArr; -``` - -#### Defined in - -[derived.ts:34](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L34) - -*** - -### prevDepVals - -```ts -prevDepVals: undefined | TUnwrappedArr; -``` - -#### Defined in - -[derived.ts:33](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L33) - -*** - -### prevVal - -```ts -prevVal: unknown; -``` - -`undefined` if it's the first run - -#### Defined in - -[derived.ts:32](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L32) diff --git a/docs/reference/interfaces/derivedoptions.md b/docs/reference/interfaces/derivedoptions.md deleted file mode 100644 index b38f17a..0000000 --- a/docs/reference/interfaces/derivedoptions.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -id: DerivedOptions -title: DerivedOptions ---- - -# Interface: DerivedOptions\ - -## Type Parameters - -• **TState** - -• **TArr** *extends* `ReadonlyArray`\<[`Derived`](../classes/derived.md)\<`any`\> \| [`Store`](../classes/store.md)\<`any`\>\> = `ReadonlyArray`\<`any`\> - -## Properties - -### deps - -```ts -deps: TArr; -``` - -#### Defined in - -[derived.ts:51](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L51) - -*** - -### fn() - -```ts -fn: (props) => TState; -``` - -Values of the `deps` from before and after the current invocation of `fn` - -#### Parameters - -• **props**: [`DerivedFnProps`](derivedfnprops.md)\<`TArr`, `UnwrapReadonlyDerivedOrStoreArray`\<`TArr`\>\> - -#### Returns - -`TState` - -#### Defined in - -[derived.ts:55](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L55) - -*** - -### lazy? - -```ts -optional lazy: boolean; -``` - -Should the value of `Derived` only be computed once it is accessed - -#### Default - -```ts -false -``` - -#### Defined in - -[derived.ts:50](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L50) - -*** - -### onSubscribe()? - -```ts -optional onSubscribe: (listener, derived) => () => void; -``` - -#### Parameters - -• **listener**: `Listener`\<`TState`\> - -• **derived**: [`Derived`](../classes/derived.md)\<`TState`, readonly `any`[]\> - -#### Returns - -`Function` - -##### Returns - -`void` - -#### Defined in - -[derived.ts:41](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L41) - -*** - -### onUpdate()? - -```ts -optional onUpdate: () => void; -``` - -#### Returns - -`void` - -#### Defined in - -[derived.ts:45](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L45) diff --git a/docs/reference/interfaces/storeoptions.md b/docs/reference/interfaces/storeoptions.md deleted file mode 100644 index df06c29..0000000 --- a/docs/reference/interfaces/storeoptions.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -id: StoreOptions -title: StoreOptions ---- - -# Interface: StoreOptions\ - -## Type Parameters - -• **TState** - -• **TUpdater** *extends* `AnyUpdater` = (`cb`) => `TState` - -## Properties - -### onSubscribe()? - -```ts -optional onSubscribe: (listener, store) => () => void; -``` - -Called when a listener subscribes to the store. - -#### Parameters - -• **listener**: `Listener`\<`TState`\> - -• **store**: [`Store`](../classes/store.md)\<`TState`, `TUpdater`\> - -#### Returns - -`Function` - -a function to unsubscribe the listener - -##### Returns - -`void` - -#### Defined in - -[store.ts:16](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L16) - -*** - -### onUpdate()? - -```ts -optional onUpdate: () => void; -``` - -Called after the state has been updated, used to derive other state. - -#### Returns - -`void` - -#### Defined in - -[store.ts:23](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L23) - -*** - -### updateFn()? - -```ts -optional updateFn: (previous) => (updater) => TState; -``` - -Replace the default update function with a custom one. - -#### Parameters - -• **previous**: `TState` - -#### Returns - -`Function` - -##### Parameters - -• **updater**: `TUpdater` - -##### Returns - -`TState` - -#### Defined in - -[store.ts:10](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L10) diff --git a/docs/reference/type-aliases/unwrapderivedorstore.md b/docs/reference/type-aliases/unwrapderivedorstore.md deleted file mode 100644 index 11b9e3e..0000000 --- a/docs/reference/type-aliases/unwrapderivedorstore.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: UnwrapDerivedOrStore -title: UnwrapDerivedOrStore ---- - -# Type Alias: UnwrapDerivedOrStore\ - -```ts -type UnwrapDerivedOrStore: T extends Derived ? InnerD : T extends Store ? InnerS : never; -``` - -## Type Parameters - -• **T** - -## Defined in - -[derived.ts:4](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L4) From 8fb38a877eb10b9ac96410091cd218c7b9348bcc Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 29 Nov 2024 09:09:26 -0800 Subject: [PATCH 51/81] chore: add working unregister from graph --- packages/store/src/derived.ts | 20 ++++++++++++++- packages/store/tests/scheduler.test.ts | 34 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 63dee71..7fc63d9 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -151,7 +151,25 @@ export class Derived< } } - unregisterFromGraph() {} + unregisterFromGraph( + deps: ReadonlyArray | Store> = this.options.deps, + ) { + for (const dep of deps) { + if (dep instanceof Derived) { + this.unregisterFromGraph(dep.options.deps) + } else if (dep instanceof Store) { + const relatedLinkedDerivedVals = __storeToDerived.get(dep) + if (relatedLinkedDerivedVals) { + relatedLinkedDerivedVals.delete(this as never) + } + + const relatedStores = __derivedToStore.get(this as never) + if (relatedStores) { + relatedStores.delete(dep) + } + } + } + } mount = () => { this.registerOnGraph() diff --git a/packages/store/tests/scheduler.test.ts b/packages/store/tests/scheduler.test.ts index 1f127ca..390dd51 100644 --- a/packages/store/tests/scheduler.test.ts +++ b/packages/store/tests/scheduler.test.ts @@ -28,4 +28,38 @@ describe('Scheduler logic', () => { expect(__storeToDerived.get(count)).toContain(doubleHalfCount) expect(__derivedToStore.get(doubleHalfCount)).toContain(count) }) + + test('should unbuild a graph properly', () => { + const count = new Store(10) + + const halfCount = new Derived({ + deps: [count], + fn: () => { + return count.state / 2 + }, + }) + + halfCount.registerOnGraph() + + const doubleHalfCount = new Derived({ + deps: [halfCount], + fn: () => { + return halfCount.state * 2 + }, + }) + + doubleHalfCount.registerOnGraph() + + doubleHalfCount.unregisterFromGraph() + + expect(__storeToDerived.get(count)).toContain(halfCount) + expect(__derivedToStore.get(halfCount)).toContain(count) + expect(__storeToDerived.get(count)).not.toContain(doubleHalfCount) + expect(__derivedToStore.get(doubleHalfCount)).not.toContain(count) + + halfCount.unregisterFromGraph() + + expect(__storeToDerived.get(count)).not.toContain(halfCount) + expect(__derivedToStore.get(halfCount)).not.toContain(count) + }) }) From ee555389d836ec669aaa2ad0378b5bd85e39f122 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 29 Nov 2024 09:33:22 -0800 Subject: [PATCH 52/81] chore: hooman attempt --- packages/store/src/derived.ts | 42 ++++++----------------- packages/store/src/scheduler.ts | 61 +++++++++++++++++++++++++++------ packages/store/src/store.ts | 5 ++- 3 files changed, 63 insertions(+), 45 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 7fc63d9..020c7b7 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -1,9 +1,7 @@ import { Store } from './store' import { - __depsThatHaveWrittenThisTick, __derivedToStore, __storeToDerived, - __whatStoreIsCurrentlyInUse, } from './scheduler' import type { Listener } from './types' @@ -171,37 +169,19 @@ export class Derived< } } - mount = () => { - this.registerOnGraph() - for (const dep of this.options.deps) { - const isDepAStore = dep instanceof Store - let relatedLinkedDerivedVals: null | Set> = null - - const unsub = dep.subscribe(() => { - const store = isDepAStore ? dep : __whatStoreIsCurrentlyInUse.current - if (store) { - relatedLinkedDerivedVals = __storeToDerived.get(store) ?? null - } - - __depsThatHaveWrittenThisTick.push(dep) - if ( - !relatedLinkedDerivedVals || - __depsThatHaveWrittenThisTick.length === relatedLinkedDerivedVals.size - ) { - // Yay! All deps are resolved - write the value of this derived - if (!this.options.lazy) { - this._store.setState(() => this.options.fn(this.getDepVals())) - } - - // // Cleanup the deps that have written this tick - // __depsThatHaveWrittenThisTick = [] - __whatStoreIsCurrentlyInUse.current = null - return - } + recompute = () => { + this._store.setState(() => { + const { prevDepVals, currDepVals, prevVal } = this.getDepVals() + return this.options.fn({ + prevDepVals, + currDepVals, + prevVal, }) + }) + } - this._subscriptions.push(unsub) - } + mount = () => { + this.registerOnGraph() return () => { this.unregisterFromGraph() diff --git a/packages/store/src/scheduler.ts b/packages/store/src/scheduler.ts index bb2988f..6445ec6 100644 --- a/packages/store/src/scheduler.ts +++ b/packages/store/src/scheduler.ts @@ -1,14 +1,6 @@ import type { Store } from './store' import type { Derived } from './derived' -/** - * What store called the current update, if any - * @private - */ -export const __whatStoreIsCurrentlyInUse = { - current: null as Store | null, -} - /** * This is here to solve the pyramid dependency problem where: * A @@ -33,6 +25,53 @@ export const __derivedToStore = new WeakMap< Set> >() -export const __depsThatHaveWrittenThisTick = [] as Array< - Derived | Store -> +export const __depsThatHaveWrittenThisTick = { + current: [] as Array | Store>, +} + +let __isFlushing = false + +function __flush_internals( + _writingSignal: Store, + relatedVals: Set>, +) { + try { + if (__depsThatHaveWrittenThisTick.current.length >= relatedVals.size) { + return + } + for (const derived of relatedVals) { + if (__depsThatHaveWrittenThisTick.current.includes(derived)) { + continue + } + __depsThatHaveWrittenThisTick.current.push(derived) + derived.recompute() + const stores = __derivedToStore.get(derived) + if (stores) { + for (const store of stores) { + const relatedLinkedDerivedVals = __storeToDerived.get(store) + if (!relatedLinkedDerivedVals) continue + __flush_internals(store, relatedLinkedDerivedVals) + } + } + } + } finally { + __depsThatHaveWrittenThisTick.current = [] + } +} + +/** + * @private only to be called from `Store` on write + */ +export function __flush(store: Store) { + try { + store.listeners.forEach((listener) => listener(0 as never)) + if (__isFlushing) return + __isFlushing = true + const derivedVals = __storeToDerived.get(store) + if (!derivedVals) return + __depsThatHaveWrittenThisTick.current.push(store) + __flush_internals(store, derivedVals) + } finally { + __isFlushing = false + } +} diff --git a/packages/store/src/store.ts b/packages/store/src/store.ts index 24f3a68..f57ae05 100644 --- a/packages/store/src/store.ts +++ b/packages/store/src/store.ts @@ -1,4 +1,4 @@ -import { __whatStoreIsCurrentlyInUse } from './scheduler' +import { __flush } from './scheduler' import type { AnyUpdater, Listener } from './types' export interface StoreOptions< @@ -49,7 +49,6 @@ export class Store< } setState = (updater: TUpdater) => { - __whatStoreIsCurrentlyInUse.current = this as never const previous = this.state this.state = this.options?.updateFn ? this.options.updateFn(previous)(updater) @@ -59,6 +58,6 @@ export class Store< this.options?.onUpdate?.() // Attempt to flush - this._flush() + __flush(this as never) } } From 0be525787095d2c9e00c388ae57d0a7534b26721 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 29 Nov 2024 09:33:30 -0800 Subject: [PATCH 53/81] chore: cursor attempt --- packages/store/src/scheduler.ts | 63 ++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/packages/store/src/scheduler.ts b/packages/store/src/scheduler.ts index 6445ec6..01bd6a9 100644 --- a/packages/store/src/scheduler.ts +++ b/packages/store/src/scheduler.ts @@ -30,21 +30,21 @@ export const __depsThatHaveWrittenThisTick = { } let __isFlushing = false +let __batchDepth = 0 +const __pendingUpdates = new Set>() function __flush_internals( _writingSignal: Store, relatedVals: Set>, ) { - try { - if (__depsThatHaveWrittenThisTick.current.length >= relatedVals.size) { - return + for (const derived of relatedVals) { + if (__depsThatHaveWrittenThisTick.current.includes(derived)) { + continue } - for (const derived of relatedVals) { - if (__depsThatHaveWrittenThisTick.current.includes(derived)) { - continue - } + __depsThatHaveWrittenThisTick.current.push(derived) derived.recompute() + const stores = __derivedToStore.get(derived) if (stores) { for (const store of stores) { @@ -53,9 +53,6 @@ function __flush_internals( __flush_internals(store, relatedLinkedDerivedVals) } } - } - } finally { - __depsThatHaveWrittenThisTick.current = [] } } @@ -63,15 +60,49 @@ function __flush_internals( * @private only to be called from `Store` on write */ export function __flush(store: Store) { + __pendingUpdates.add(store) + + // If we're already in a batch, don't flush yet + if (__batchDepth > 0) return + + if (__isFlushing) return + try { - store.listeners.forEach((listener) => listener(0 as never)) - if (__isFlushing) return __isFlushing = true - const derivedVals = __storeToDerived.get(store) - if (!derivedVals) return - __depsThatHaveWrittenThisTick.current.push(store) - __flush_internals(store, derivedVals) + + // Process all pending updates + while (__pendingUpdates.size > 0) { + const stores = Array.from(__pendingUpdates) + __pendingUpdates.clear() + + // First update all derived values + for (const store of stores) { + const derivedVals = __storeToDerived.get(store) + if (!derivedVals) continue + + __depsThatHaveWrittenThisTick.current.push(store) + __flush_internals(store, derivedVals) + } + + // Then notify listeners with updated values + for (const store of stores) { + store.listeners.forEach((listener) => listener(store.state as never)) + } + } } finally { __isFlushing = false + __depsThatHaveWrittenThisTick.current = [] + } +} + +export function batch(fn: () => void) { + __batchDepth++ + try { + fn() + } finally { + __batchDepth-- + if (__batchDepth === 0) { + __flush(Array.from(__pendingUpdates)[0] as Store) // Trigger flush of all pending updates + } } } From 7a41b27ae2aeae60a6de2b3c5aa49f8bb69f16da Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 29 Nov 2024 09:36:28 -0800 Subject: [PATCH 54/81] chore: code cleanup and add back batch tests --- packages/store/src/scheduler.ts | 53 ++++++++++++-------------- packages/store/tests/scheduler.test.ts | 39 ++++++++++++++++++- packages/store/tests/store.test.ts | 29 -------------- 3 files changed, 62 insertions(+), 59 deletions(-) diff --git a/packages/store/src/scheduler.ts b/packages/store/src/scheduler.ts index 01bd6a9..f865bdc 100644 --- a/packages/store/src/scheduler.ts +++ b/packages/store/src/scheduler.ts @@ -33,26 +33,23 @@ let __isFlushing = false let __batchDepth = 0 const __pendingUpdates = new Set>() -function __flush_internals( - _writingSignal: Store, - relatedVals: Set>, -) { +function __flush_internals(relatedVals: Set>) { for (const derived of relatedVals) { if (__depsThatHaveWrittenThisTick.current.includes(derived)) { continue } - - __depsThatHaveWrittenThisTick.current.push(derived) - derived.recompute() - - const stores = __derivedToStore.get(derived) - if (stores) { - for (const store of stores) { - const relatedLinkedDerivedVals = __storeToDerived.get(store) - if (!relatedLinkedDerivedVals) continue - __flush_internals(store, relatedLinkedDerivedVals) - } + + __depsThatHaveWrittenThisTick.current.push(derived) + derived.recompute() + + const stores = __derivedToStore.get(derived) + if (stores) { + for (const store of stores) { + const relatedLinkedDerivedVals = __storeToDerived.get(store) + if (!relatedLinkedDerivedVals) continue + __flush_internals(relatedLinkedDerivedVals) } + } } } @@ -61,32 +58,32 @@ function __flush_internals( */ export function __flush(store: Store) { __pendingUpdates.add(store) - + // If we're already in a batch, don't flush yet if (__batchDepth > 0) return - + if (__isFlushing) return - + try { __isFlushing = true - + // Process all pending updates while (__pendingUpdates.size > 0) { const stores = Array.from(__pendingUpdates) __pendingUpdates.clear() - - // First update all derived values + + // First notify listeners with updated values + for (const store of stores) { + store.listeners.forEach((listener) => listener(store.state as never)) + } + + // Then update all derived values for (const store of stores) { const derivedVals = __storeToDerived.get(store) if (!derivedVals) continue - + __depsThatHaveWrittenThisTick.current.push(store) - __flush_internals(store, derivedVals) - } - - // Then notify listeners with updated values - for (const store of stores) { - store.listeners.forEach((listener) => listener(store.state as never)) + __flush_internals(derivedVals) } } } finally { diff --git a/packages/store/tests/scheduler.test.ts b/packages/store/tests/scheduler.test.ts index 390dd51..12795db 100644 --- a/packages/store/tests/scheduler.test.ts +++ b/packages/store/tests/scheduler.test.ts @@ -1,5 +1,11 @@ -import { describe, expect, test } from 'vitest' -import { Derived, Store, __derivedToStore, __storeToDerived } from '../src' +import { describe, expect, test, vi } from 'vitest' +import { + Derived, + Store, + batch, + __derivedToStore, + __storeToDerived, +} from '../src' describe('Scheduler logic', () => { test('Should build a graph properly', () => { @@ -62,4 +68,33 @@ describe('Scheduler logic', () => { expect(__storeToDerived.get(count)).not.toContain(halfCount) expect(__derivedToStore.get(halfCount)).not.toContain(count) }) + + test('Batch prevents listeners from being called during repeated setStates', () => { + const store = new Store(0) + + const listener = vi.fn() + + const unsub = store.subscribe(listener) + + batch(() => { + store.setState(() => 1) + store.setState(() => 2) + store.setState(() => 3) + store.setState(() => 4) + }) + + expect(store.state).toEqual(4) + // Listener is only called once because of batching + expect(listener).toHaveBeenCalledTimes(1) + + store.setState(() => 1) + store.setState(() => 2) + store.setState(() => 3) + store.setState(() => 4) + + expect(store.state).toEqual(4) + // Listener is called 4 times because of a lack of batching + expect(listener).toHaveBeenCalledTimes(5) + unsub() + }) }) diff --git a/packages/store/tests/store.test.ts b/packages/store/tests/store.test.ts index 42c25dc..5d7b9ae 100644 --- a/packages/store/tests/store.test.ts +++ b/packages/store/tests/store.test.ts @@ -53,35 +53,6 @@ describe('store', () => { expect(typeof store.state).toEqual('number') }) - test.skip('Batch prevents listeners from being called during repeated setStates', () => { - const store = new Store(0) - - const listener = vi.fn() - - const unsub = store.subscribe(listener) - - // store.batch(() => { - // store.setState(() => 1) - // store.setState(() => 2) - // store.setState(() => 3) - // store.setState(() => 4) - // }) - - expect(store.state).toEqual(4) - // Listener is only called once because of batching - expect(listener).toHaveBeenCalledTimes(1) - - store.setState(() => 1) - store.setState(() => 2) - store.setState(() => 3) - store.setState(() => 4) - - expect(store.state).toEqual(4) - // Listener is called 4 times because of a lack of batching - expect(listener).toHaveBeenCalledTimes(5) - unsub() - }) - test('listeners should receive old and new values', () => { const store = new Store(12) const fn = vi.fn() From dbbf6646d6264511cd94f3fabd30eb960142ae87 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 29 Nov 2024 09:43:08 -0800 Subject: [PATCH 55/81] chore: fix listener recieving old values --- packages/store/src/scheduler.ts | 10 ++++++---- packages/store/src/store.ts | 6 +++--- packages/store/src/types.ts | 12 ++++++++++-- packages/store/tests/derived.test.ts | 2 +- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/packages/store/src/scheduler.ts b/packages/store/src/scheduler.ts index f865bdc..6665628 100644 --- a/packages/store/src/scheduler.ts +++ b/packages/store/src/scheduler.ts @@ -59,22 +59,24 @@ function __flush_internals(relatedVals: Set>) { export function __flush(store: Store) { __pendingUpdates.add(store) - // If we're already in a batch, don't flush yet if (__batchDepth > 0) return - if (__isFlushing) return try { __isFlushing = true - // Process all pending updates while (__pendingUpdates.size > 0) { const stores = Array.from(__pendingUpdates) __pendingUpdates.clear() // First notify listeners with updated values for (const store of stores) { - store.listeners.forEach((listener) => listener(store.state as never)) + store.listeners.forEach((listener) => + listener({ + prevVal: store.prevState as never, + currentVal: store.state as never + }) + ) } // Then update all derived values diff --git a/packages/store/src/store.ts b/packages/store/src/store.ts index f57ae05..078af36 100644 --- a/packages/store/src/store.ts +++ b/packages/store/src/store.ts @@ -49,10 +49,10 @@ export class Store< } setState = (updater: TUpdater) => { - const previous = this.state + this.prevState = this.state this.state = this.options?.updateFn - ? this.options.updateFn(previous)(updater) - : (updater as any)(previous) + ? this.options.updateFn(this.prevState)(updater) + : (updater as any)(this.prevState) // Always run onUpdate, regardless of batching this.options?.onUpdate?.() diff --git a/packages/store/src/types.ts b/packages/store/src/types.ts index 51496d1..836ae5b 100644 --- a/packages/store/src/types.ts +++ b/packages/store/src/types.ts @@ -1,9 +1,17 @@ /** * @private */ -export type AnyUpdater = (...args: Array) => any +export type AnyUpdater = (prev: any) => any /** * @private */ -export type Listener = (props: { prevVal: T; currentVal: T }) => void +export interface ListenerValue { + prevVal: T + currentVal: T +} + +/** + * @private + */ +export type Listener = (value: ListenerValue) => void diff --git a/packages/store/tests/derived.test.ts b/packages/store/tests/derived.test.ts index 1a6193f..f6707b8 100644 --- a/packages/store/tests/derived.test.ts +++ b/packages/store/tests/derived.test.ts @@ -238,7 +238,7 @@ describe('Derived', () => { }) }) - test.skip('derivedFn should receive old and new dep values for similar derived values', () => { + test('derivedFn should receive old and new dep values for similar derived values', () => { const count = new Store(12) const halfCount = new Derived({ deps: [count], From 2b9568860e9220ac2cd42243805dd5d3ea94b0d5 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 29 Nov 2024 10:09:45 -0800 Subject: [PATCH 56/81] chore: fix laziness --- packages/store/src/derived.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 020c7b7..e8924cf 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -108,7 +108,10 @@ export class Derived< }) } + hasBeenRead = false + get state() { + this.hasBeenRead = true if (this.options.lazy && this._store.state === undefined) { this.options.lazy = false this._store.setState(() => this.options.fn(this.getDepVals())) @@ -170,6 +173,9 @@ export class Derived< } recompute = () => { + if (this.options.lazy && !this.hasBeenRead) { + return + } this._store.setState(() => { const { prevDepVals, currDepVals, prevVal } = this.getDepVals() return this.options.fn({ From 9661c174a9590b9b9f40321cc2885fbb9d5333d4 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 29 Nov 2024 18:10:51 +0000 Subject: [PATCH 57/81] ci: apply automated fixes and generate docs --- .../reference/functions/injectstore.md | 37 +++ docs/framework/angular/reference/index.md | 10 + .../react/reference/functions/shallow.md | 28 +++ .../react/reference/functions/usestore.md | 32 +++ docs/framework/react/reference/index.md | 11 + .../solid/reference/functions/usestore.md | 32 +++ docs/framework/solid/reference/index.md | 10 + .../svelte/reference/functions/shallow.md | 28 +++ .../svelte/reference/functions/usestore.md | 44 ++++ docs/framework/svelte/reference/index.md | 11 + .../vue/reference/functions/shallow.md | 28 +++ .../vue/reference/functions/usestore.md | 32 +++ docs/framework/vue/reference/index.md | 11 + docs/reference/classes/derived.md | 226 ++++++++++++++++++ docs/reference/classes/effect.md | 46 ++++ docs/reference/classes/store.md | 126 ++++++++++ docs/reference/functions/batch.md | 22 ++ docs/reference/index.md | 32 +++ docs/reference/interfaces/derivedfnprops.md | 50 ++++ docs/reference/interfaces/derivedoptions.md | 108 +++++++++ docs/reference/interfaces/storeoptions.md | 90 +++++++ .../type-aliases/unwrapderivedorstore.md | 18 ++ .../variables/depsthathavewrittenthistick.md | 22 ++ docs/reference/variables/derivedtostore.md | 14 ++ docs/reference/variables/storetoderived.md | 28 +++ packages/store/src/derived.ts | 5 +- packages/store/src/scheduler.ts | 6 +- 27 files changed, 1100 insertions(+), 7 deletions(-) create mode 100644 docs/framework/angular/reference/functions/injectstore.md create mode 100644 docs/framework/angular/reference/index.md create mode 100644 docs/framework/react/reference/functions/shallow.md create mode 100644 docs/framework/react/reference/functions/usestore.md create mode 100644 docs/framework/react/reference/index.md create mode 100644 docs/framework/solid/reference/functions/usestore.md create mode 100644 docs/framework/solid/reference/index.md create mode 100644 docs/framework/svelte/reference/functions/shallow.md create mode 100644 docs/framework/svelte/reference/functions/usestore.md create mode 100644 docs/framework/svelte/reference/index.md create mode 100644 docs/framework/vue/reference/functions/shallow.md create mode 100644 docs/framework/vue/reference/functions/usestore.md create mode 100644 docs/framework/vue/reference/index.md create mode 100644 docs/reference/classes/derived.md create mode 100644 docs/reference/classes/effect.md create mode 100644 docs/reference/classes/store.md create mode 100644 docs/reference/functions/batch.md create mode 100644 docs/reference/index.md create mode 100644 docs/reference/interfaces/derivedfnprops.md create mode 100644 docs/reference/interfaces/derivedoptions.md create mode 100644 docs/reference/interfaces/storeoptions.md create mode 100644 docs/reference/type-aliases/unwrapderivedorstore.md create mode 100644 docs/reference/variables/depsthathavewrittenthistick.md create mode 100644 docs/reference/variables/derivedtostore.md create mode 100644 docs/reference/variables/storetoderived.md diff --git a/docs/framework/angular/reference/functions/injectstore.md b/docs/framework/angular/reference/functions/injectstore.md new file mode 100644 index 0000000..895f6d3 --- /dev/null +++ b/docs/framework/angular/reference/functions/injectstore.md @@ -0,0 +1,37 @@ +--- +id: injectStore +title: injectStore +--- + +# Function: injectStore() + +```ts +function injectStore( + store, + selector, +options): Signal +``` + +## Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> + +• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` + +## Parameters + +• **store**: `Store`\<`TState`, `TUpdater`\> + +• **selector** = `...` + +• **options**: `CreateSignalOptions`\<`TSelected`\> & `object` = `...` + +## Returns + +`Signal`\<`TSelected`\> + +## Defined in + +[index.ts:17](https://github.com/TanStack/store/blob/main/packages/angular-store/src/index.ts#L17) diff --git a/docs/framework/angular/reference/index.md b/docs/framework/angular/reference/index.md new file mode 100644 index 0000000..ac9a76d --- /dev/null +++ b/docs/framework/angular/reference/index.md @@ -0,0 +1,10 @@ +--- +id: "@tanstack/angular-store" +title: "@tanstack/angular-store" +--- + +# @tanstack/angular-store + +## Functions + +- [injectStore](functions/injectstore.md) diff --git a/docs/framework/react/reference/functions/shallow.md b/docs/framework/react/reference/functions/shallow.md new file mode 100644 index 0000000..d434664 --- /dev/null +++ b/docs/framework/react/reference/functions/shallow.md @@ -0,0 +1,28 @@ +--- +id: shallow +title: shallow +--- + +# Function: shallow() + +```ts +function shallow(objA, objB): boolean +``` + +## Type Parameters + +• **T** + +## Parameters + +• **objA**: `T` + +• **objB**: `T` + +## Returns + +`boolean` + +## Defined in + +[index.ts:30](https://github.com/TanStack/store/blob/main/packages/react-store/src/index.ts#L30) diff --git a/docs/framework/react/reference/functions/usestore.md b/docs/framework/react/reference/functions/usestore.md new file mode 100644 index 0000000..c8708ea --- /dev/null +++ b/docs/framework/react/reference/functions/usestore.md @@ -0,0 +1,32 @@ +--- +id: useStore +title: useStore +--- + +# Function: useStore() + +```ts +function useStore(store, selector): TSelected +``` + +## Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> + +• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` + +## Parameters + +• **store**: `Store`\<`TState`, `TUpdater`\> + +• **selector** = `...` + +## Returns + +`TSelected` + +## Defined in + +[index.ts:11](https://github.com/TanStack/store/blob/main/packages/react-store/src/index.ts#L11) diff --git a/docs/framework/react/reference/index.md b/docs/framework/react/reference/index.md new file mode 100644 index 0000000..4a1665a --- /dev/null +++ b/docs/framework/react/reference/index.md @@ -0,0 +1,11 @@ +--- +id: "@tanstack/react-store" +title: "@tanstack/react-store" +--- + +# @tanstack/react-store + +## Functions + +- [shallow](functions/shallow.md) +- [useStore](functions/usestore.md) diff --git a/docs/framework/solid/reference/functions/usestore.md b/docs/framework/solid/reference/functions/usestore.md new file mode 100644 index 0000000..414ef75 --- /dev/null +++ b/docs/framework/solid/reference/functions/usestore.md @@ -0,0 +1,32 @@ +--- +id: useStore +title: useStore +--- + +# Function: useStore() + +```ts +function useStore(store, selector): Accessor +``` + +## Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> + +• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` + +## Parameters + +• **store**: `Store`\<`TState`, `TUpdater`\> + +• **selector** = `...` + +## Returns + +`Accessor`\<`TSelected`\> + +## Defined in + +[index.tsx:13](https://github.com/TanStack/store/blob/main/packages/solid-store/src/index.tsx#L13) diff --git a/docs/framework/solid/reference/index.md b/docs/framework/solid/reference/index.md new file mode 100644 index 0000000..a6e4497 --- /dev/null +++ b/docs/framework/solid/reference/index.md @@ -0,0 +1,10 @@ +--- +id: "@tanstack/solid-store" +title: "@tanstack/solid-store" +--- + +# @tanstack/solid-store + +## Functions + +- [useStore](functions/usestore.md) diff --git a/docs/framework/svelte/reference/functions/shallow.md b/docs/framework/svelte/reference/functions/shallow.md new file mode 100644 index 0000000..ec5fc24 --- /dev/null +++ b/docs/framework/svelte/reference/functions/shallow.md @@ -0,0 +1,28 @@ +--- +id: shallow +title: shallow +--- + +# Function: shallow() + +```ts +function shallow(objA, objB): boolean +``` + +## Type Parameters + +• **T** + +## Parameters + +• **objA**: `T` + +• **objB**: `T` + +## Returns + +`boolean` + +## Defined in + +[index.svelte.ts:39](https://github.com/TanStack/store/blob/main/packages/svelte-store/src/index.svelte.ts#L39) diff --git a/docs/framework/svelte/reference/functions/usestore.md b/docs/framework/svelte/reference/functions/usestore.md new file mode 100644 index 0000000..eb7925e --- /dev/null +++ b/docs/framework/svelte/reference/functions/usestore.md @@ -0,0 +1,44 @@ +--- +id: useStore +title: useStore +--- + +# Function: useStore() + +```ts +function useStore(store, selector): object +``` + +## Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> + +• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` + +## Parameters + +• **store**: `Store`\<`TState`, `TUpdater`\> + +• **selector** = `...` + +## Returns + +`object` + +### current + +#### Get Signature + +```ts +get current(): TSelected +``` + +##### Returns + +`TSelected` + +## Defined in + +[index.svelte.ts:10](https://github.com/TanStack/store/blob/main/packages/svelte-store/src/index.svelte.ts#L10) diff --git a/docs/framework/svelte/reference/index.md b/docs/framework/svelte/reference/index.md new file mode 100644 index 0000000..36d4f81 --- /dev/null +++ b/docs/framework/svelte/reference/index.md @@ -0,0 +1,11 @@ +--- +id: "@tanstack/svelte-store" +title: "@tanstack/svelte-store" +--- + +# @tanstack/svelte-store + +## Functions + +- [shallow](functions/shallow.md) +- [useStore](functions/usestore.md) diff --git a/docs/framework/vue/reference/functions/shallow.md b/docs/framework/vue/reference/functions/shallow.md new file mode 100644 index 0000000..157a151 --- /dev/null +++ b/docs/framework/vue/reference/functions/shallow.md @@ -0,0 +1,28 @@ +--- +id: shallow +title: shallow +--- + +# Function: shallow() + +```ts +function shallow(objA, objB): boolean +``` + +## Type Parameters + +• **T** + +## Parameters + +• **objA**: `T` + +• **objB**: `T` + +## Returns + +`boolean` + +## Defined in + +[index.ts:43](https://github.com/TanStack/store/blob/main/packages/vue-store/src/index.ts#L43) diff --git a/docs/framework/vue/reference/functions/usestore.md b/docs/framework/vue/reference/functions/usestore.md new file mode 100644 index 0000000..dc20e9e --- /dev/null +++ b/docs/framework/vue/reference/functions/usestore.md @@ -0,0 +1,32 @@ +--- +id: useStore +title: useStore +--- + +# Function: useStore() + +```ts +function useStore(store, selector): Readonly> +``` + +## Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> + +• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` + +## Parameters + +• **store**: `Store`\<`TState`, `TUpdater`\> + +• **selector** = `...` + +## Returns + +`Readonly`\<`Ref`\<`TSelected`\>\> + +## Defined in + +[index.ts:12](https://github.com/TanStack/store/blob/main/packages/vue-store/src/index.ts#L12) diff --git a/docs/framework/vue/reference/index.md b/docs/framework/vue/reference/index.md new file mode 100644 index 0000000..7fef438 --- /dev/null +++ b/docs/framework/vue/reference/index.md @@ -0,0 +1,11 @@ +--- +id: "@tanstack/vue-store" +title: "@tanstack/vue-store" +--- + +# @tanstack/vue-store + +## Functions + +- [shallow](functions/shallow.md) +- [useStore](functions/usestore.md) diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md new file mode 100644 index 0000000..20ef819 --- /dev/null +++ b/docs/reference/classes/derived.md @@ -0,0 +1,226 @@ +--- +id: Derived +title: Derived +--- + +# Class: Derived\ + +## Type Parameters + +• **TState** + +• **TArr** *extends* `ReadonlyArray`\<[`Derived`](derived.md)\<`any`\> \| [`Store`](store.md)\<`any`\>\> = `ReadonlyArray`\<`any`\> + +## Constructors + +### new Derived() + +```ts +new Derived(options): Derived +``` + +#### Parameters + +• **options**: [`DerivedOptions`](../interfaces/derivedoptions.md)\<`TState`, `TArr`\> + +#### Returns + +[`Derived`](derived.md)\<`TState`, `TArr`\> + +#### Defined in + +[derived.ts:92](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L92) + +## Properties + +### hasBeenRead + +```ts +hasBeenRead: boolean = false; +``` + +#### Defined in + +[derived.ts:108](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L108) + +*** + +### options + +```ts +options: DerivedOptions; +``` + +#### Defined in + +[derived.ts:69](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L69) + +## Accessors + +### prevState + +#### Get Signature + +```ts +get prevState(): TState +``` + +##### Returns + +`TState` + +#### Defined in + +[derived.ts:120](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L120) + +*** + +### state + +#### Get Signature + +```ts +get state(): TState +``` + +##### Returns + +`TState` + +#### Defined in + +[derived.ts:110](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L110) + +## Methods + +### getDepVals() + +```ts +getDepVals(): object +``` + +#### Returns + +`object` + +##### currDepVals + +```ts +currDepVals: never; +``` + +##### prevDepVals + +```ts +prevDepVals: never; +``` + +##### prevVal + +```ts +prevVal: undefined | NonNullable; +``` + +#### Defined in + +[derived.ts:77](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L77) + +*** + +### mount() + +```ts +mount(): () => void +``` + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Defined in + +[derived.ts:186](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L186) + +*** + +### recompute() + +```ts +recompute(): void +``` + +#### Returns + +`void` + +#### Defined in + +[derived.ts:172](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L172) + +*** + +### registerOnGraph() + +```ts +registerOnGraph(deps): void +``` + +#### Parameters + +• **deps**: readonly ([`Derived`](derived.md)\<`any`, readonly `any`[]\> \| [`Store`](store.md)\<`any`, (`cb`) => `any`\>)[] = `...` + +#### Returns + +`void` + +#### Defined in + +[derived.ts:124](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L124) + +*** + +### subscribe() + +```ts +subscribe(listener): () => void +``` + +#### Parameters + +• **listener**: `Listener`\<`TState`\> + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Defined in + +[derived.ts:197](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L197) + +*** + +### unregisterFromGraph() + +```ts +unregisterFromGraph(deps): void +``` + +#### Parameters + +• **deps**: readonly ([`Derived`](derived.md)\<`any`, readonly `any`[]\> \| [`Store`](store.md)\<`any`, (`cb`) => `any`\>)[] = `...` + +#### Returns + +`void` + +#### Defined in + +[derived.ts:152](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L152) diff --git a/docs/reference/classes/effect.md b/docs/reference/classes/effect.md new file mode 100644 index 0000000..f8c7602 --- /dev/null +++ b/docs/reference/classes/effect.md @@ -0,0 +1,46 @@ +--- +id: Effect +title: Effect +--- + +# Class: Effect + +## Constructors + +### new Effect() + +```ts +new Effect(opts): Effect +``` + +#### Parameters + +• **opts**: `EffectOptions` + +#### Returns + +[`Effect`](effect.md) + +#### Defined in + +[effect.ts:23](https://github.com/TanStack/store/blob/main/packages/store/src/effect.ts#L23) + +## Methods + +### mount() + +```ts +mount(): () => void +``` + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Defined in + +[effect.ts:39](https://github.com/TanStack/store/blob/main/packages/store/src/effect.ts#L39) diff --git a/docs/reference/classes/store.md b/docs/reference/classes/store.md new file mode 100644 index 0000000..07d3522 --- /dev/null +++ b/docs/reference/classes/store.md @@ -0,0 +1,126 @@ +--- +id: Store +title: Store +--- + +# Class: Store\ + +## Type Parameters + +• **TState** + +• **TUpdater** *extends* `AnyUpdater` = (`cb`) => `TState` + +## Constructors + +### new Store() + +```ts +new Store(initialState, options?): Store +``` + +#### Parameters + +• **initialState**: `TState` + +• **options?**: [`StoreOptions`](../interfaces/storeoptions.md)\<`TState`, `TUpdater`\> + +#### Returns + +[`Store`](store.md)\<`TState`, `TUpdater`\> + +#### Defined in + +[store.ts:36](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L36) + +## Properties + +### listeners + +```ts +listeners: Set>; +``` + +#### Defined in + +[store.ts:31](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L31) + +*** + +### options? + +```ts +optional options: StoreOptions; +``` + +#### Defined in + +[store.ts:34](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L34) + +*** + +### prevState + +```ts +prevState: TState; +``` + +#### Defined in + +[store.ts:33](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L33) + +*** + +### state + +```ts +state: TState; +``` + +#### Defined in + +[store.ts:32](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L32) + +## Methods + +### setState() + +```ts +setState(updater): void +``` + +#### Parameters + +• **updater**: `TUpdater` + +#### Returns + +`void` + +#### Defined in + +[store.ts:51](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L51) + +*** + +### subscribe() + +```ts +subscribe(listener): () => void +``` + +#### Parameters + +• **listener**: `Listener`\<`TState`\> + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Defined in + +[store.ts:42](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L42) diff --git a/docs/reference/functions/batch.md b/docs/reference/functions/batch.md new file mode 100644 index 0000000..3323883 --- /dev/null +++ b/docs/reference/functions/batch.md @@ -0,0 +1,22 @@ +--- +id: batch +title: batch +--- + +# Function: batch() + +```ts +function batch(fn): void +``` + +## Parameters + +• **fn** + +## Returns + +`void` + +## Defined in + +[scheduler.ts:97](https://github.com/TanStack/store/blob/main/packages/store/src/scheduler.ts#L97) diff --git a/docs/reference/index.md b/docs/reference/index.md new file mode 100644 index 0000000..720551c --- /dev/null +++ b/docs/reference/index.md @@ -0,0 +1,32 @@ +--- +id: "@tanstack/store" +title: "@tanstack/store" +--- + +# @tanstack/store + +## Classes + +- [Derived](classes/derived.md) +- [Effect](classes/effect.md) +- [Store](classes/store.md) + +## Interfaces + +- [DerivedFnProps](interfaces/derivedfnprops.md) +- [DerivedOptions](interfaces/derivedoptions.md) +- [StoreOptions](interfaces/storeoptions.md) + +## Type Aliases + +- [UnwrapDerivedOrStore](type-aliases/unwrapderivedorstore.md) + +## Variables + +- [\_\_depsThatHaveWrittenThisTick](variables/depsthathavewrittenthistick.md) +- [\_\_derivedToStore](variables/derivedtostore.md) +- [\_\_storeToDerived](variables/storetoderived.md) + +## Functions + +- [batch](functions/batch.md) diff --git a/docs/reference/interfaces/derivedfnprops.md b/docs/reference/interfaces/derivedfnprops.md new file mode 100644 index 0000000..721c204 --- /dev/null +++ b/docs/reference/interfaces/derivedfnprops.md @@ -0,0 +1,50 @@ +--- +id: DerivedFnProps +title: DerivedFnProps +--- + +# Interface: DerivedFnProps\ + +## Type Parameters + +• **TArr** *extends* `ReadonlyArray`\<[`Derived`](../classes/derived.md)\<`any`\> \| [`Store`](../classes/store.md)\<`any`\>\> = `ReadonlyArray`\<`any`\> + +• **TUnwrappedArr** *extends* `UnwrapReadonlyDerivedOrStoreArray`\<`TArr`\> = `UnwrapReadonlyDerivedOrStoreArray`\<`TArr`\> + +## Properties + +### currDepVals + +```ts +currDepVals: TUnwrappedArr; +``` + +#### Defined in + +[derived.ts:35](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L35) + +*** + +### prevDepVals + +```ts +prevDepVals: undefined | TUnwrappedArr; +``` + +#### Defined in + +[derived.ts:34](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L34) + +*** + +### prevVal + +```ts +prevVal: unknown; +``` + +`undefined` if it's the first run + +#### Defined in + +[derived.ts:33](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L33) diff --git a/docs/reference/interfaces/derivedoptions.md b/docs/reference/interfaces/derivedoptions.md new file mode 100644 index 0000000..d16a3f2 --- /dev/null +++ b/docs/reference/interfaces/derivedoptions.md @@ -0,0 +1,108 @@ +--- +id: DerivedOptions +title: DerivedOptions +--- + +# Interface: DerivedOptions\ + +## Type Parameters + +• **TState** + +• **TArr** *extends* `ReadonlyArray`\<[`Derived`](../classes/derived.md)\<`any`\> \| [`Store`](../classes/store.md)\<`any`\>\> = `ReadonlyArray`\<`any`\> + +## Properties + +### deps + +```ts +deps: TArr; +``` + +#### Defined in + +[derived.ts:52](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L52) + +*** + +### fn() + +```ts +fn: (props) => TState; +``` + +Values of the `deps` from before and after the current invocation of `fn` + +#### Parameters + +• **props**: [`DerivedFnProps`](derivedfnprops.md)\<`TArr`, `UnwrapReadonlyDerivedOrStoreArray`\<`TArr`\>\> + +#### Returns + +`TState` + +#### Defined in + +[derived.ts:56](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L56) + +*** + +### lazy? + +```ts +optional lazy: boolean; +``` + +Should the value of `Derived` only be computed once it is accessed + +#### Default + +```ts +false +``` + +#### Defined in + +[derived.ts:51](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L51) + +*** + +### onSubscribe()? + +```ts +optional onSubscribe: (listener, derived) => () => void; +``` + +#### Parameters + +• **listener**: `Listener`\<`TState`\> + +• **derived**: [`Derived`](../classes/derived.md)\<`TState`, readonly `any`[]\> + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Defined in + +[derived.ts:42](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L42) + +*** + +### onUpdate()? + +```ts +optional onUpdate: () => void; +``` + +#### Returns + +`void` + +#### Defined in + +[derived.ts:46](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L46) diff --git a/docs/reference/interfaces/storeoptions.md b/docs/reference/interfaces/storeoptions.md new file mode 100644 index 0000000..494c66d --- /dev/null +++ b/docs/reference/interfaces/storeoptions.md @@ -0,0 +1,90 @@ +--- +id: StoreOptions +title: StoreOptions +--- + +# Interface: StoreOptions\ + +## Type Parameters + +• **TState** + +• **TUpdater** *extends* `AnyUpdater` = (`cb`) => `TState` + +## Properties + +### onSubscribe()? + +```ts +optional onSubscribe: (listener, store) => () => void; +``` + +Called when a listener subscribes to the store. + +#### Parameters + +• **listener**: `Listener`\<`TState`\> + +• **store**: [`Store`](../classes/store.md)\<`TState`, `TUpdater`\> + +#### Returns + +`Function` + +a function to unsubscribe the listener + +##### Returns + +`void` + +#### Defined in + +[store.ts:17](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L17) + +*** + +### onUpdate()? + +```ts +optional onUpdate: () => void; +``` + +Called after the state has been updated, used to derive other state. + +#### Returns + +`void` + +#### Defined in + +[store.ts:24](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L24) + +*** + +### updateFn()? + +```ts +optional updateFn: (previous) => (updater) => TState; +``` + +Replace the default update function with a custom one. + +#### Parameters + +• **previous**: `TState` + +#### Returns + +`Function` + +##### Parameters + +• **updater**: `TUpdater` + +##### Returns + +`TState` + +#### Defined in + +[store.ts:11](https://github.com/TanStack/store/blob/main/packages/store/src/store.ts#L11) diff --git a/docs/reference/type-aliases/unwrapderivedorstore.md b/docs/reference/type-aliases/unwrapderivedorstore.md new file mode 100644 index 0000000..6d41771 --- /dev/null +++ b/docs/reference/type-aliases/unwrapderivedorstore.md @@ -0,0 +1,18 @@ +--- +id: UnwrapDerivedOrStore +title: UnwrapDerivedOrStore +--- + +# Type Alias: UnwrapDerivedOrStore\ + +```ts +type UnwrapDerivedOrStore: T extends Derived ? InnerD : T extends Store ? InnerS : never; +``` + +## Type Parameters + +• **T** + +## Defined in + +[derived.ts:5](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L5) diff --git a/docs/reference/variables/depsthathavewrittenthistick.md b/docs/reference/variables/depsthathavewrittenthistick.md new file mode 100644 index 0000000..d35dfed --- /dev/null +++ b/docs/reference/variables/depsthathavewrittenthistick.md @@ -0,0 +1,22 @@ +--- +id: __depsThatHaveWrittenThisTick +title: __depsThatHaveWrittenThisTick +--- + +# Variable: \_\_depsThatHaveWrittenThisTick + +```ts +const __depsThatHaveWrittenThisTick: object; +``` + +## Type declaration + +### current + +```ts +current: (Derived | Store unknown>)[]; +``` + +## Defined in + +[scheduler.ts:28](https://github.com/TanStack/store/blob/main/packages/store/src/scheduler.ts#L28) diff --git a/docs/reference/variables/derivedtostore.md b/docs/reference/variables/derivedtostore.md new file mode 100644 index 0000000..27cd548 --- /dev/null +++ b/docs/reference/variables/derivedtostore.md @@ -0,0 +1,14 @@ +--- +id: __derivedToStore +title: __derivedToStore +--- + +# Variable: \_\_derivedToStore + +```ts +const __derivedToStore: WeakMap, Set unknown>>>; +``` + +## Defined in + +[scheduler.ts:23](https://github.com/TanStack/store/blob/main/packages/store/src/scheduler.ts#L23) diff --git a/docs/reference/variables/storetoderived.md b/docs/reference/variables/storetoderived.md new file mode 100644 index 0000000..ba5abc0 --- /dev/null +++ b/docs/reference/variables/storetoderived.md @@ -0,0 +1,28 @@ +--- +id: __storeToDerived +title: __storeToDerived +--- + +# Variable: \_\_storeToDerived + +```ts +const __storeToDerived: WeakMap unknown>, Set>>; +``` + +This is here to solve the pyramid dependency problem where: + A + / \ + B C + \ / + D + +Where we deeply traverse this tree, how do we avoid D being recomputed twice; once when B is updated, once when C is. + +To solve this, we create linkedDeps that allows us to sync avoid writes to the state until all of the deps have been +resolved. + +This is a record of stores, because derived stores are not able to write values to, but stores are + +## Defined in + +[scheduler.ts:19](https://github.com/TanStack/store/blob/main/packages/store/src/scheduler.ts#L19) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index e8924cf..0793984 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -1,8 +1,5 @@ import { Store } from './store' -import { - __derivedToStore, - __storeToDerived, -} from './scheduler' +import { __derivedToStore, __storeToDerived } from './scheduler' import type { Listener } from './types' export type UnwrapDerivedOrStore = diff --git a/packages/store/src/scheduler.ts b/packages/store/src/scheduler.ts index 6665628..ae6bb10 100644 --- a/packages/store/src/scheduler.ts +++ b/packages/store/src/scheduler.ts @@ -71,11 +71,11 @@ export function __flush(store: Store) { // First notify listeners with updated values for (const store of stores) { - store.listeners.forEach((listener) => + store.listeners.forEach((listener) => listener({ prevVal: store.prevState as never, - currentVal: store.state as never - }) + currentVal: store.state as never, + }), ) } From acf03d7efcd289f89bb45371e4902911892f701d Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 29 Nov 2024 16:28:25 -0800 Subject: [PATCH 58/81] chore!: fix timings and temporarily(?) remove lazy prop --- packages/store/src/derived.ts | 32 +++++---------- packages/store/src/scheduler.ts | 10 ++++- packages/store/src/store.ts | 6 +-- packages/store/tests/derived.test.ts | 58 ---------------------------- 4 files changed, 21 insertions(+), 85 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 0793984..9584413 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -44,11 +44,6 @@ export interface DerivedOptions< derived: Derived, ) => () => void onUpdate?: () => void - /** - * Should the value of `Derived` only be computed once it is accessed - * @default false - */ - lazy?: boolean deps: TArr /** * Values of the `deps` from before and after the current invocation of `fn` @@ -91,13 +86,11 @@ export class Derived< constructor(options: DerivedOptions) { this.options = options - const initVal = options.lazy - ? (undefined as ReturnType) - : options.fn({ - prevDepVals: undefined, - prevVal: undefined, - currDepVals: this.getDepVals().currDepVals, - }) + const initVal = options.fn({ + prevDepVals: undefined, + prevVal: undefined, + currDepVals: this.getDepVals().currDepVals, + }) this._store = new Store(initVal, { onSubscribe: options.onSubscribe?.bind(this) as never, @@ -105,18 +98,14 @@ export class Derived< }) } - hasBeenRead = false - get state() { - this.hasBeenRead = true - if (this.options.lazy && this._store.state === undefined) { - this.options.lazy = false - this._store.setState(() => this.options.fn(this.getDepVals())) - return this._store.state - } return this._store.state } + set prevState(val: TState) { + this._store.prevState = val + } + get prevState() { return this._store.prevState } @@ -170,9 +159,6 @@ export class Derived< } recompute = () => { - if (this.options.lazy && !this.hasBeenRead) { - return - } this._store.setState(() => { const { prevDepVals, currDepVals, prevVal } = this.getDepVals() return this.options.fn({ diff --git a/packages/store/src/scheduler.ts b/packages/store/src/scheduler.ts index ae6bb10..84d439f 100644 --- a/packages/store/src/scheduler.ts +++ b/packages/store/src/scheduler.ts @@ -90,6 +90,9 @@ export function __flush(store: Store) { } } finally { __isFlushing = false + __depsThatHaveWrittenThisTick.current.forEach((dep) => { + dep.prevState = dep.state + }) __depsThatHaveWrittenThisTick.current = [] } } @@ -101,7 +104,12 @@ export function batch(fn: () => void) { } finally { __batchDepth-- if (__batchDepth === 0) { - __flush(Array.from(__pendingUpdates)[0] as Store) // Trigger flush of all pending updates + const pendingUpdateToFlush = Array.from(__pendingUpdates)[0] as + | Store + | undefined + if (pendingUpdateToFlush) { + __flush(pendingUpdateToFlush) // Trigger flush of all pending updates + } } } } diff --git a/packages/store/src/store.ts b/packages/store/src/store.ts index 078af36..a79f855 100644 --- a/packages/store/src/store.ts +++ b/packages/store/src/store.ts @@ -49,10 +49,10 @@ export class Store< } setState = (updater: TUpdater) => { - this.prevState = this.state + const prevVal = this.state this.state = this.options?.updateFn - ? this.options.updateFn(this.prevState)(updater) - : (updater as any)(this.prevState) + ? this.options.updateFn(prevVal)(updater) + : (updater as any)(prevVal) // Always run onUpdate, regardless of batching this.options?.onUpdate?.() diff --git a/packages/store/tests/derived.test.ts b/packages/store/tests/derived.test.ts index f6707b8..3e0e537 100644 --- a/packages/store/tests/derived.test.ts +++ b/packages/store/tests/derived.test.ts @@ -141,64 +141,6 @@ describe('Derived', () => { expect(tripleCountFn).toHaveBeenNthCalledWith(2, 90) }) - test('Derive from store and another derived, even when lazy', () => { - const count = new Store(10) - - const doubleCount = new Derived({ - deps: [count], - fn: () => { - return count.state * 2 - }, - lazy: true, - }) - - doubleCount.mount() - - const tripleCount = new Derived({ - deps: [count, doubleCount], - fn: () => { - return count.state + doubleCount.state - }, - }) - - tripleCount.mount() - - const doubleCountFn = viFnSubscribe(doubleCount) - const tripleCountFn = viFnSubscribe(tripleCount) - - count.setState(() => 20) - - expect(doubleCountFn).toHaveBeenNthCalledWith(1, 40) - expect(tripleCountFn).toHaveBeenNthCalledWith(1, 60) - - count.setState(() => 30) - - expect(doubleCountFn).toHaveBeenNthCalledWith(2, 60) - expect(tripleCountFn).toHaveBeenNthCalledWith(2, 90) - }) - - test("Derive that's lazy should not update on first tick", () => { - const count = new Store(10) - const viFn = vi.fn() - const doubleCount = new Derived({ - deps: [count], - fn: () => { - viFn() - return count.state * 2 - }, - lazy: true, - }) - - doubleCount.mount() - - const doubleCountFn = viFnSubscribe(doubleCount) - - count.setState(() => 20) - - expect(doubleCountFn).not.toHaveBeenCalled() - expect(viFn).not.toHaveBeenCalled() - }) - test('listeners should receive old and new values', () => { const store = new Store(12) const derived = new Derived({ From 7e9752f33fcf8623506c368f5a9df30df520c5c8 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 30 Nov 2024 00:29:28 +0000 Subject: [PATCH 59/81] ci: apply automated fixes and generate docs --- docs/reference/classes/derived.md | 46 +++++++++++---------- docs/reference/functions/batch.md | 2 +- docs/reference/interfaces/derivedoptions.md | 22 +--------- 3 files changed, 26 insertions(+), 44 deletions(-) diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md index 20ef819..51c7656 100644 --- a/docs/reference/classes/derived.md +++ b/docs/reference/classes/derived.md @@ -29,22 +29,10 @@ new Derived(options): Derived #### Defined in -[derived.ts:92](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L92) +[derived.ts:87](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L87) ## Properties -### hasBeenRead - -```ts -hasBeenRead: boolean = false; -``` - -#### Defined in - -[derived.ts:108](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L108) - -*** - ### options ```ts @@ -53,7 +41,7 @@ options: DerivedOptions; #### Defined in -[derived.ts:69](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L69) +[derived.ts:64](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L64) ## Accessors @@ -69,9 +57,23 @@ get prevState(): TState `TState` +#### Set Signature + +```ts +set prevState(val): void +``` + +##### Parameters + +• **val**: `TState` + +##### Returns + +`void` + #### Defined in -[derived.ts:120](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L120) +[derived.ts:109](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L109) *** @@ -89,7 +91,7 @@ get state(): TState #### Defined in -[derived.ts:110](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L110) +[derived.ts:101](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L101) ## Methods @@ -123,7 +125,7 @@ prevVal: undefined | NonNullable; #### Defined in -[derived.ts:77](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L77) +[derived.ts:72](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L72) *** @@ -143,7 +145,7 @@ mount(): () => void #### Defined in -[derived.ts:186](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L186) +[derived.ts:172](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L172) *** @@ -159,7 +161,7 @@ recompute(): void #### Defined in -[derived.ts:172](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L172) +[derived.ts:161](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L161) *** @@ -179,7 +181,7 @@ registerOnGraph(deps): void #### Defined in -[derived.ts:124](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L124) +[derived.ts:113](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L113) *** @@ -203,7 +205,7 @@ subscribe(listener): () => void #### Defined in -[derived.ts:197](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L197) +[derived.ts:183](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L183) *** @@ -223,4 +225,4 @@ unregisterFromGraph(deps): void #### Defined in -[derived.ts:152](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L152) +[derived.ts:141](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L141) diff --git a/docs/reference/functions/batch.md b/docs/reference/functions/batch.md index 3323883..b0e506f 100644 --- a/docs/reference/functions/batch.md +++ b/docs/reference/functions/batch.md @@ -19,4 +19,4 @@ function batch(fn): void ## Defined in -[scheduler.ts:97](https://github.com/TanStack/store/blob/main/packages/store/src/scheduler.ts#L97) +[scheduler.ts:100](https://github.com/TanStack/store/blob/main/packages/store/src/scheduler.ts#L100) diff --git a/docs/reference/interfaces/derivedoptions.md b/docs/reference/interfaces/derivedoptions.md index d16a3f2..2d06c6d 100644 --- a/docs/reference/interfaces/derivedoptions.md +++ b/docs/reference/interfaces/derivedoptions.md @@ -21,7 +21,7 @@ deps: TArr; #### Defined in -[derived.ts:52](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L52) +[derived.ts:47](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L47) *** @@ -43,26 +43,6 @@ Values of the `deps` from before and after the current invocation of `fn` #### Defined in -[derived.ts:56](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L56) - -*** - -### lazy? - -```ts -optional lazy: boolean; -``` - -Should the value of `Derived` only be computed once it is accessed - -#### Default - -```ts -false -``` - -#### Defined in - [derived.ts:51](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L51) *** From 13c472ff2920f6dfb112601cdd9511fb919399bf Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 29 Nov 2024 16:45:47 -0800 Subject: [PATCH 60/81] chore: migrate useStore in React to support Derived values stores as well --- packages/react-store/src/index.ts | 20 ++++++++++++-------- packages/react-store/tests/test.test-d.ts | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 packages/react-store/tests/test.test-d.ts diff --git a/packages/react-store/src/index.ts b/packages/react-store/src/index.ts index 5d0b8ac..b865512 100644 --- a/packages/react-store/src/index.ts +++ b/packages/react-store/src/index.ts @@ -1,5 +1,5 @@ import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector.js' -import type { AnyUpdater, Store } from '@tanstack/store' +import type { Derived, Store } from '@tanstack/store' export * from '@tanstack/store' @@ -8,14 +8,18 @@ export * from '@tanstack/store' */ export type NoInfer = [T][T extends any ? 0 : never] -export function useStore< - TState, - TSelected = NoInfer, - TUpdater extends AnyUpdater = AnyUpdater, ->( - store: Store, +export function useStore>( + store: Store, + selector: (state: NoInfer) => TSelected, +): TSelected +export function useStore>( + store: Derived, + selector: (state: NoInfer) => TSelected, +): TSelected +export function useStore>( + store: Store | Derived, selector: (state: NoInfer) => TSelected = (d) => d as any, -) { +): TSelected { const slice = useSyncExternalStoreWithSelector( store.subscribe, () => store.state, diff --git a/packages/react-store/tests/test.test-d.ts b/packages/react-store/tests/test.test-d.ts new file mode 100644 index 0000000..24093bd --- /dev/null +++ b/packages/react-store/tests/test.test-d.ts @@ -0,0 +1,19 @@ +import { expectTypeOf, test } from 'vitest' +import { Derived, Store, useStore } from '../src' + +test('useStore works with derived state', () => { + const store = new Store(12) + const derived = new Derived({ + deps: [store], + fn: () => { + return { val: store.state * 2 } + }, + }) + + const val = useStore(derived, (state) => { + expectTypeOf(state).toMatchTypeOf<{ val: number }>() + return state.val + }) + + expectTypeOf(val).toMatchTypeOf() +}) From 8c0e587ca5eeb73f4952380d42099c638da92821 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 30 Nov 2024 00:46:49 +0000 Subject: [PATCH 61/81] ci: apply automated fixes and generate docs --- .../react/reference/functions/shallow.md | 2 +- .../react/reference/functions/usestore.md | 44 +++++++++++++++---- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/docs/framework/react/reference/functions/shallow.md b/docs/framework/react/reference/functions/shallow.md index d434664..a45e60c 100644 --- a/docs/framework/react/reference/functions/shallow.md +++ b/docs/framework/react/reference/functions/shallow.md @@ -25,4 +25,4 @@ function shallow(objA, objB): boolean ## Defined in -[index.ts:30](https://github.com/TanStack/store/blob/main/packages/react-store/src/index.ts#L30) +[index.ts:34](https://github.com/TanStack/store/blob/main/packages/react-store/src/index.ts#L34) diff --git a/docs/framework/react/reference/functions/usestore.md b/docs/framework/react/reference/functions/usestore.md index c8708ea..1a69e52 100644 --- a/docs/framework/react/reference/functions/usestore.md +++ b/docs/framework/react/reference/functions/usestore.md @@ -5,28 +5,54 @@ title: useStore # Function: useStore() +## useStore(store, selector) + ```ts -function useStore(store, selector): TSelected +function useStore(store, selector): TSelected ``` -## Type Parameters +### Type Parameters • **TState** • **TSelected** = `NoInfer`\<`TState`\> -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters +### Parameters -• **store**: `Store`\<`TState`, `TUpdater`\> +• **store**: `Store`\<`TState`, `any`\> -• **selector** = `...` +• **selector** -## Returns +### Returns `TSelected` -## Defined in +### Defined in [index.ts:11](https://github.com/TanStack/store/blob/main/packages/react-store/src/index.ts#L11) + +## useStore(store, selector) + +```ts +function useStore(store, selector): TSelected +``` + +### Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> + +### Parameters + +• **store**: `Derived`\<`TState`, `any`\> + +• **selector** + +### Returns + +`TSelected` + +### Defined in + +[index.ts:15](https://github.com/TanStack/store/blob/main/packages/react-store/src/index.ts#L15) From 782e772c087822316e995711227ebc97cfbba3c1 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 29 Nov 2024 16:46:57 -0800 Subject: [PATCH 62/81] chore: fix CI tests --- packages/store/tests/scheduler.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/store/tests/scheduler.test.ts b/packages/store/tests/scheduler.test.ts index 12795db..0042a25 100644 --- a/packages/store/tests/scheduler.test.ts +++ b/packages/store/tests/scheduler.test.ts @@ -2,9 +2,9 @@ import { describe, expect, test, vi } from 'vitest' import { Derived, Store, - batch, __derivedToStore, __storeToDerived, + batch, } from '../src' describe('Scheduler logic', () => { From 5d2e67fd4c8c73b7c30326fe430735afc32dca10 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 30 Nov 2024 00:47:24 -0800 Subject: [PATCH 63/81] chore: add Angular store Derived support --- packages/angular-store/src/index.ts | 26 ++++++++++++++------- packages/angular-store/tests/test.test-d.ts | 20 ++++++++++++++++ packages/react-store/src/index.ts | 4 ++-- 3 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 packages/angular-store/tests/test.test-d.ts diff --git a/packages/angular-store/src/index.ts b/packages/angular-store/src/index.ts index f31e019..af0ad0c 100644 --- a/packages/angular-store/src/index.ts +++ b/packages/angular-store/src/index.ts @@ -6,25 +6,33 @@ import { linkedSignal, runInInjectionContext, } from '@angular/core' -import type { AnyUpdater, Store } from '@tanstack/store' -import type { CreateSignalOptions } from '@angular/core' +import type { Derived, Store } from '@tanstack/store' +import type { CreateSignalOptions, Signal } from '@angular/core' + +export * from '@tanstack/store' /** * @private */ type NoInfer = [T][T extends any ? 0 : never] -export function injectStore< - TState, - TSelected = NoInfer, - TUpdater extends AnyUpdater = AnyUpdater, ->( - store: Store, +export function injectStore>( + store: Store, + selector?: (state: NoInfer) => TSelected, + options?: CreateSignalOptions & { injector?: Injector }, +): Signal +export function injectStore>( + store: Derived, + selector?: (state: NoInfer) => TSelected, + options?: CreateSignalOptions & { injector?: Injector }, +): Signal +export function injectStore>( + store: Store | Derived, selector: (state: NoInfer) => TSelected = (d) => d as TSelected, options: CreateSignalOptions & { injector?: Injector } = { equal: shallow, }, -) { +): Signal { !options.injector && assertInInjectionContext(injectStore) if (!options.injector) { diff --git a/packages/angular-store/tests/test.test-d.ts b/packages/angular-store/tests/test.test-d.ts new file mode 100644 index 0000000..0cc4256 --- /dev/null +++ b/packages/angular-store/tests/test.test-d.ts @@ -0,0 +1,20 @@ +import { expectTypeOf, test } from 'vitest' +import { Derived, Store, injectStore } from '../src' +import type { Signal } from '@angular/core' + +test('useStore works with derived state', () => { + const store = new Store(12) + const derived = new Derived({ + deps: [store], + fn: () => { + return { val: store.state * 2 } + }, + }) + + const val = injectStore(derived, (state) => { + expectTypeOf(state).toMatchTypeOf<{ val: number }>() + return state.val + }) + + expectTypeOf(val).toMatchTypeOf>() +}) diff --git a/packages/react-store/src/index.ts b/packages/react-store/src/index.ts index b865512..155b0f5 100644 --- a/packages/react-store/src/index.ts +++ b/packages/react-store/src/index.ts @@ -10,11 +10,11 @@ export type NoInfer = [T][T extends any ? 0 : never] export function useStore>( store: Store, - selector: (state: NoInfer) => TSelected, + selector?: (state: NoInfer) => TSelected, ): TSelected export function useStore>( store: Derived, - selector: (state: NoInfer) => TSelected, + selector?: (state: NoInfer) => TSelected, ): TSelected export function useStore>( store: Store | Derived, From 6e5156ddff5aa5d3febb8bf90934ed6a8b4f5b22 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 30 Nov 2024 08:48:19 +0000 Subject: [PATCH 64/81] ci: apply automated fixes and generate docs --- .../reference/functions/injectstore.md | 55 +++++++++++++++---- .../react/reference/functions/usestore.md | 8 +-- 2 files changed, 47 insertions(+), 16 deletions(-) diff --git a/docs/framework/angular/reference/functions/injectstore.md b/docs/framework/angular/reference/functions/injectstore.md index 895f6d3..3464804 100644 --- a/docs/framework/angular/reference/functions/injectstore.md +++ b/docs/framework/angular/reference/functions/injectstore.md @@ -5,33 +5,64 @@ title: injectStore # Function: injectStore() +## injectStore(store, selector, options) + ```ts -function injectStore( +function injectStore( store, - selector, -options): Signal + selector?, +options?): Signal ``` -## Type Parameters +### Type Parameters • **TState** • **TSelected** = `NoInfer`\<`TState`\> -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` +### Parameters + +• **store**: `Store`\<`TState`, `any`\> + +• **selector?** + +• **options?**: `CreateSignalOptions`\<`TSelected`\> & `object` + +### Returns + +`Signal`\<`TSelected`\> + +### Defined in + +[index.ts:19](https://github.com/TanStack/store/blob/main/packages/angular-store/src/index.ts#L19) + +## injectStore(store, selector, options) + +```ts +function injectStore( + store, + selector?, +options?): Signal +``` + +### Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> -## Parameters +### Parameters -• **store**: `Store`\<`TState`, `TUpdater`\> +• **store**: `Derived`\<`TState`, `any`\> -• **selector** = `...` +• **selector?** -• **options**: `CreateSignalOptions`\<`TSelected`\> & `object` = `...` +• **options?**: `CreateSignalOptions`\<`TSelected`\> & `object` -## Returns +### Returns `Signal`\<`TSelected`\> -## Defined in +### Defined in -[index.ts:17](https://github.com/TanStack/store/blob/main/packages/angular-store/src/index.ts#L17) +[index.ts:24](https://github.com/TanStack/store/blob/main/packages/angular-store/src/index.ts#L24) diff --git a/docs/framework/react/reference/functions/usestore.md b/docs/framework/react/reference/functions/usestore.md index 1a69e52..5f2a28b 100644 --- a/docs/framework/react/reference/functions/usestore.md +++ b/docs/framework/react/reference/functions/usestore.md @@ -8,7 +8,7 @@ title: useStore ## useStore(store, selector) ```ts -function useStore(store, selector): TSelected +function useStore(store, selector?): TSelected ``` ### Type Parameters @@ -21,7 +21,7 @@ function useStore(store, selector): TSelected • **store**: `Store`\<`TState`, `any`\> -• **selector** +• **selector?** ### Returns @@ -34,7 +34,7 @@ function useStore(store, selector): TSelected ## useStore(store, selector) ```ts -function useStore(store, selector): TSelected +function useStore(store, selector?): TSelected ``` ### Type Parameters @@ -47,7 +47,7 @@ function useStore(store, selector): TSelected • **store**: `Derived`\<`TState`, `any`\> -• **selector** +• **selector?** ### Returns From 2baec1f4bd4914fc8125ba662760c1bdfab7d009 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 30 Nov 2024 01:02:42 -0800 Subject: [PATCH 65/81] chore: fix issues with Solid store tests --- packages/angular-store/tests/test.test-d.ts | 2 +- packages/solid-store/src/index.tsx | 18 +++++++++++------- packages/solid-store/tests/test.test-d.ts | 20 ++++++++++++++++++++ 3 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 packages/solid-store/tests/test.test-d.ts diff --git a/packages/angular-store/tests/test.test-d.ts b/packages/angular-store/tests/test.test-d.ts index 0cc4256..414ae52 100644 --- a/packages/angular-store/tests/test.test-d.ts +++ b/packages/angular-store/tests/test.test-d.ts @@ -2,7 +2,7 @@ import { expectTypeOf, test } from 'vitest' import { Derived, Store, injectStore } from '../src' import type { Signal } from '@angular/core' -test('useStore works with derived state', () => { +test('injectStore works with derived state', () => { const store = new Store(12) const derived = new Derived({ deps: [store], diff --git a/packages/solid-store/src/index.tsx b/packages/solid-store/src/index.tsx index 7b82b73..3897e53 100644 --- a/packages/solid-store/src/index.tsx +++ b/packages/solid-store/src/index.tsx @@ -1,6 +1,6 @@ import { onCleanup } from 'solid-js' import { createStore, reconcile } from 'solid-js/store' -import type { AnyUpdater, Store } from '@tanstack/store' +import type { Derived, Store } from '@tanstack/store' import type { Accessor } from 'solid-js' export * from '@tanstack/store' @@ -10,12 +10,16 @@ export * from '@tanstack/store' */ export type NoInfer = [T][T extends any ? 0 : never] -export function useStore< - TState, - TSelected = NoInfer, - TUpdater extends AnyUpdater = AnyUpdater, ->( - store: Store, +export function useStore>( + store: Store, + selector?: (state: NoInfer) => TSelected, +): Accessor +export function useStore>( + store: Derived, + selector?: (state: NoInfer) => TSelected, +): Accessor +export function useStore>( + store: Store | Derived, selector: (state: NoInfer) => TSelected = (d) => d as any, ): Accessor { const [slice, setSlice] = createStore({ diff --git a/packages/solid-store/tests/test.test-d.ts b/packages/solid-store/tests/test.test-d.ts new file mode 100644 index 0000000..d02e4ab --- /dev/null +++ b/packages/solid-store/tests/test.test-d.ts @@ -0,0 +1,20 @@ +import { expectTypeOf, test } from 'vitest' +import { Derived, Store, useStore } from '../src' +import type { Accessor } from 'solid-js' + +test('useStore works with derived state', () => { + const store = new Store(12) + const derived = new Derived({ + deps: [store], + fn: () => { + return { val: store.state * 2 } + }, + }) + + const val = useStore(derived, (state) => { + expectTypeOf(state).toMatchTypeOf<{ val: number }>() + return state.val + }) + + expectTypeOf(val).toMatchTypeOf>() +}) From ac58a5f7f9431f6c271ca1a3196e63e9371481be Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 30 Nov 2024 09:05:20 +0000 Subject: [PATCH 66/81] ci: apply automated fixes and generate docs --- .../solid/reference/functions/usestore.md | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/docs/framework/solid/reference/functions/usestore.md b/docs/framework/solid/reference/functions/usestore.md index 414ef75..9d52da2 100644 --- a/docs/framework/solid/reference/functions/usestore.md +++ b/docs/framework/solid/reference/functions/usestore.md @@ -5,28 +5,54 @@ title: useStore # Function: useStore() +## useStore(store, selector) + ```ts -function useStore(store, selector): Accessor +function useStore(store, selector?): Accessor ``` -## Type Parameters +### Type Parameters • **TState** • **TSelected** = `NoInfer`\<`TState`\> -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters +### Parameters -• **store**: `Store`\<`TState`, `TUpdater`\> +• **store**: `Store`\<`TState`, `any`\> -• **selector** = `...` +• **selector?** -## Returns +### Returns `Accessor`\<`TSelected`\> -## Defined in +### Defined in [index.tsx:13](https://github.com/TanStack/store/blob/main/packages/solid-store/src/index.tsx#L13) + +## useStore(store, selector) + +```ts +function useStore(store, selector?): Accessor +``` + +### Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> + +### Parameters + +• **store**: `Derived`\<`TState`, `any`\> + +• **selector?** + +### Returns + +`Accessor`\<`TSelected`\> + +### Defined in + +[index.tsx:17](https://github.com/TanStack/store/blob/main/packages/solid-store/src/index.tsx#L17) From 2c4129fb64e77a2c42d073e690c4434c2a9599a4 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 30 Nov 2024 01:11:17 -0800 Subject: [PATCH 67/81] chore: fix useStore from Vue --- packages/vue-store/src/index.ts | 18 +++++++++++------- packages/vue-store/tests/test.test-d.ts | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 packages/vue-store/tests/test.test-d.ts diff --git a/packages/vue-store/src/index.ts b/packages/vue-store/src/index.ts index 8db080a..0d3dfaa 100644 --- a/packages/vue-store/src/index.ts +++ b/packages/vue-store/src/index.ts @@ -1,5 +1,5 @@ import { readonly, ref, toRaw, watch } from 'vue-demi' -import type { AnyUpdater, Store } from '@tanstack/store' +import type { Derived, Store } from '@tanstack/store' import type { Ref } from 'vue-demi' export * from '@tanstack/store' @@ -9,12 +9,16 @@ export * from '@tanstack/store' */ export type NoInfer = [T][T extends any ? 0 : never] -export function useStore< - TState, - TSelected = NoInfer, - TUpdater extends AnyUpdater = AnyUpdater, ->( - store: Store, +export function useStore>( + store: Store, + selector?: (state: NoInfer) => TSelected, +): Readonly> +export function useStore>( + store: Derived, + selector?: (state: NoInfer) => TSelected, +): Readonly> +export function useStore>( + store: Store | Derived, selector: (state: NoInfer) => TSelected = (d) => d as any, ): Readonly> { const slice = ref(selector(store.state)) as Ref diff --git a/packages/vue-store/tests/test.test-d.ts b/packages/vue-store/tests/test.test-d.ts new file mode 100644 index 0000000..13dfca9 --- /dev/null +++ b/packages/vue-store/tests/test.test-d.ts @@ -0,0 +1,20 @@ +import { expectTypeOf, test } from 'vitest' +import { Derived, Store, useStore } from '../src' +import { Ref } from 'vue-demi' + +test('useStore works with derived state', () => { + const store = new Store(12) + const derived = new Derived({ + deps: [store], + fn: () => { + return { val: store.state * 2 } + }, + }) + + const val = useStore(derived, (state) => { + expectTypeOf(state).toMatchTypeOf<{ val: number }>() + return state.val + }) + + expectTypeOf(val).toMatchTypeOf>>() +}) From 59ab2df8903d906e934ab7835e2c7cb5b0146a7d Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 30 Nov 2024 09:12:15 +0000 Subject: [PATCH 68/81] ci: apply automated fixes and generate docs --- .../vue/reference/functions/shallow.md | 2 +- .../vue/reference/functions/usestore.md | 44 +++++++++++++++---- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/docs/framework/vue/reference/functions/shallow.md b/docs/framework/vue/reference/functions/shallow.md index 157a151..38a2393 100644 --- a/docs/framework/vue/reference/functions/shallow.md +++ b/docs/framework/vue/reference/functions/shallow.md @@ -25,4 +25,4 @@ function shallow(objA, objB): boolean ## Defined in -[index.ts:43](https://github.com/TanStack/store/blob/main/packages/vue-store/src/index.ts#L43) +[index.ts:47](https://github.com/TanStack/store/blob/main/packages/vue-store/src/index.ts#L47) diff --git a/docs/framework/vue/reference/functions/usestore.md b/docs/framework/vue/reference/functions/usestore.md index dc20e9e..361c86d 100644 --- a/docs/framework/vue/reference/functions/usestore.md +++ b/docs/framework/vue/reference/functions/usestore.md @@ -5,28 +5,54 @@ title: useStore # Function: useStore() +## useStore(store, selector) + ```ts -function useStore(store, selector): Readonly> +function useStore(store, selector?): Readonly> ``` -## Type Parameters +### Type Parameters • **TState** • **TSelected** = `NoInfer`\<`TState`\> -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters +### Parameters -• **store**: `Store`\<`TState`, `TUpdater`\> +• **store**: `Store`\<`TState`, `any`\> -• **selector** = `...` +• **selector?** -## Returns +### Returns `Readonly`\<`Ref`\<`TSelected`\>\> -## Defined in +### Defined in [index.ts:12](https://github.com/TanStack/store/blob/main/packages/vue-store/src/index.ts#L12) + +## useStore(store, selector) + +```ts +function useStore(store, selector?): Readonly> +``` + +### Type Parameters + +• **TState** + +• **TSelected** = `NoInfer`\<`TState`\> + +### Parameters + +• **store**: `Derived`\<`TState`, `any`\> + +• **selector?** + +### Returns + +`Readonly`\<`Ref`\<`TSelected`\>\> + +### Defined in + +[index.ts:16](https://github.com/TanStack/store/blob/main/packages/vue-store/src/index.ts#L16) From 9a5d4854b263a01ceba4a3c57beb0cde1b6da6c3 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 30 Nov 2024 01:29:38 -0800 Subject: [PATCH 69/81] chore: svelte works with useStore now --- packages/svelte-store/src/index.svelte.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/svelte-store/src/index.svelte.ts b/packages/svelte-store/src/index.svelte.ts index f13f545..3d8429a 100644 --- a/packages/svelte-store/src/index.svelte.ts +++ b/packages/svelte-store/src/index.svelte.ts @@ -1,4 +1,4 @@ -import type { AnyUpdater, Store } from '@tanstack/store' +import type { Derived, Store } from '@tanstack/store' export * from '@tanstack/store' @@ -7,14 +7,18 @@ export * from '@tanstack/store' */ export type NoInfer = [T][T extends any ? 0 : never] -export function useStore< - TState, - TSelected = NoInfer, - TUpdater extends AnyUpdater = AnyUpdater, ->( - store: Store, +export function useStore>( + store: Store, + selector?: (state: NoInfer) => TSelected, +): { readonly current: TSelected } +export function useStore>( + store: Derived, + selector?: (state: NoInfer) => TSelected, +): { readonly current: TSelected } +export function useStore>( + store: Store | Derived, selector: (state: NoInfer) => TSelected = (d) => d as any, -) { +): { readonly current: TSelected } { let slice = $state(selector(store.state)) $effect(() => { From 46e63efd025ea5b9a5c81741ad93320c76a425e8 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 30 Nov 2024 09:30:29 +0000 Subject: [PATCH 70/81] ci: apply automated fixes and generate docs --- .../svelte/reference/functions/shallow.md | 2 +- .../svelte/reference/functions/usestore.md | 56 ++++++++++++++----- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/docs/framework/svelte/reference/functions/shallow.md b/docs/framework/svelte/reference/functions/shallow.md index ec5fc24..06baf55 100644 --- a/docs/framework/svelte/reference/functions/shallow.md +++ b/docs/framework/svelte/reference/functions/shallow.md @@ -25,4 +25,4 @@ function shallow(objA, objB): boolean ## Defined in -[index.svelte.ts:39](https://github.com/TanStack/store/blob/main/packages/svelte-store/src/index.svelte.ts#L39) +[index.svelte.ts:43](https://github.com/TanStack/store/blob/main/packages/svelte-store/src/index.svelte.ts#L43) diff --git a/docs/framework/svelte/reference/functions/usestore.md b/docs/framework/svelte/reference/functions/usestore.md index eb7925e..e13dea5 100644 --- a/docs/framework/svelte/reference/functions/usestore.md +++ b/docs/framework/svelte/reference/functions/usestore.md @@ -5,40 +5,66 @@ title: useStore # Function: useStore() +## useStore(store, selector) + ```ts -function useStore(store, selector): object +function useStore(store, selector?): object ``` -## Type Parameters +### Type Parameters • **TState** • **TSelected** = `NoInfer`\<`TState`\> -• **TUpdater** *extends* `AnyUpdater` = `AnyUpdater` - -## Parameters +### Parameters -• **store**: `Store`\<`TState`, `TUpdater`\> +• **store**: `Store`\<`TState`, `any`\> -• **selector** = `...` +• **selector?** -## Returns +### Returns `object` -### current +#### current + +```ts +readonly current: TSelected; +``` -#### Get Signature +### Defined in + +[index.svelte.ts:10](https://github.com/TanStack/store/blob/main/packages/svelte-store/src/index.svelte.ts#L10) + +## useStore(store, selector) ```ts -get current(): TSelected +function useStore(store, selector?): object ``` -##### Returns +### Type Parameters -`TSelected` +• **TState** -## Defined in +• **TSelected** = `NoInfer`\<`TState`\> -[index.svelte.ts:10](https://github.com/TanStack/store/blob/main/packages/svelte-store/src/index.svelte.ts#L10) +### Parameters + +• **store**: `Derived`\<`TState`, `any`\> + +• **selector?** + +### Returns + +`object` + +#### current + +```ts +readonly current: TSelected; +``` + +### Defined in + +[index.svelte.ts:14](https://github.com/TanStack/store/blob/main/packages/svelte-store/src/index.svelte.ts#L14) From 7dc64d557f6b61d3634dff2b50bd09df7c660013 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 30 Nov 2024 01:34:09 -0800 Subject: [PATCH 71/81] chore: add demo of useStore working as-intended --- packages/react-store/tests/index.test.tsx | 35 ++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/react-store/tests/index.test.tsx b/packages/react-store/tests/index.test.tsx index 7aead5d..29f4f8f 100644 --- a/packages/react-store/tests/index.test.tsx +++ b/packages/react-store/tests/index.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it, test, vi } from 'vitest' import { render, waitFor } from '@testing-library/react' import * as React from 'react' -import { Store } from '@tanstack/store' +import { Derived, Store } from '@tanstack/store' import { useState } from 'react' import { userEvent } from '@testing-library/user-event' import { shallow, useStore } from '../src/index' @@ -78,6 +78,39 @@ describe('useStore', () => { await user.click(getByText('Update ignored')) expect(getByText('Number rendered: 2')).toBeInTheDocument() }) + + it('works with mounted derived stores', async () => { + const store = new Store(0) + + const derived = new Derived({ + deps: [store], + fn: () => { + return { val: store.state * 2 } + }, + }) + + derived.mount() + + function Comp() { + const derivedVal = useStore(derived, (state) => state.val) + + return ( +
+

Derived: {derivedVal}

+ +
+ ) + } + + const { getByText } = render() + expect(getByText('Derived: 0')).toBeInTheDocument() + + await user.click(getByText('Update select')) + + await waitFor(() => expect(getByText('Derived: 2')).toBeInTheDocument()) + }) }) describe('shallow', () => { From f8c01f6c3c4d803344121f5b863c1e5994d14151 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 30 Nov 2024 02:34:28 -0800 Subject: [PATCH 72/81] chore: fix CI --- packages/vue-store/tests/test.test-d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue-store/tests/test.test-d.ts b/packages/vue-store/tests/test.test-d.ts index 13dfca9..6c53f9c 100644 --- a/packages/vue-store/tests/test.test-d.ts +++ b/packages/vue-store/tests/test.test-d.ts @@ -1,6 +1,6 @@ import { expectTypeOf, test } from 'vitest' import { Derived, Store, useStore } from '../src' -import { Ref } from 'vue-demi' +import type { Ref } from 'vue-demi' test('useStore works with derived state', () => { const store = new Store(12) From e9c449db2f8072a7a3ef4119d824eb2615af36d0 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 30 Nov 2024 21:50:10 -0800 Subject: [PATCH 73/81] fix: issues with unmounting and remounting derived values --- packages/store/src/derived.ts | 13 ++++++++++++- packages/store/src/effect.ts | 2 +- packages/store/tests/derived.test.ts | 23 +++++++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 9584413..161a4e5 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -51,6 +51,14 @@ export interface DerivedOptions< fn: (props: DerivedFnProps) => TState } +export interface DerivedMountOptions { + /** + * Should recompute the value on mount? + * @default {true} + */ + recompute?: boolean +} + export class Derived< TState, const TArr extends ReadonlyArray< @@ -169,8 +177,11 @@ export class Derived< }) } - mount = () => { + mount = ({ recompute = true }: DerivedMountOptions = {}) => { this.registerOnGraph() + if (recompute) { + this.recompute() + } return () => { this.unregisterFromGraph() diff --git a/packages/store/src/effect.ts b/packages/store/src/effect.ts index cbb647c..6615fbd 100644 --- a/packages/store/src/effect.ts +++ b/packages/store/src/effect.ts @@ -37,6 +37,6 @@ export class Effect { } mount() { - return this._derived.mount() + return this._derived.mount({ recompute: false }) } } diff --git a/packages/store/tests/derived.test.ts b/packages/store/tests/derived.test.ts index 3e0e537..2e7da24 100644 --- a/packages/store/tests/derived.test.ts +++ b/packages/store/tests/derived.test.ts @@ -224,4 +224,27 @@ describe('Derived', () => { count.setState(() => 24) expect(fn).toBeCalledWith(12) }) + + test('derivedFn should be able to mount and unmount correctly repeatly', () => { + const count = new Store(12) + const derived = new Derived({ + deps: [count], + fn: () => { + return count.state * 2 + }, + }) + + count.setState(() => 24) + + const cleanup1 = derived.mount() + cleanup1() + const cleanup2 = derived.mount() + cleanup2() + const cleanup3 = derived.mount() + cleanup3() + derived.mount() + + expect(count.state).toBe(24) + expect(derived.state).toBe(48) + }) }) From ab4c1f326b4485f8f27e787f2d90b8f2ae80aa00 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sun, 1 Dec 2024 05:51:02 +0000 Subject: [PATCH 74/81] ci: apply automated fixes and generate docs --- docs/reference/classes/derived.md | 26 +++++++++++-------- docs/reference/index.md | 1 + .../interfaces/derivedmountoptions.md | 26 +++++++++++++++++++ 3 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 docs/reference/interfaces/derivedmountoptions.md diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md index 51c7656..4ec7860 100644 --- a/docs/reference/classes/derived.md +++ b/docs/reference/classes/derived.md @@ -29,7 +29,7 @@ new Derived(options): Derived #### Defined in -[derived.ts:87](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L87) +[derived.ts:95](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L95) ## Properties @@ -41,7 +41,7 @@ options: DerivedOptions; #### Defined in -[derived.ts:64](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L64) +[derived.ts:72](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L72) ## Accessors @@ -73,7 +73,7 @@ set prevState(val): void #### Defined in -[derived.ts:109](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L109) +[derived.ts:117](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L117) *** @@ -91,7 +91,7 @@ get state(): TState #### Defined in -[derived.ts:101](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L101) +[derived.ts:109](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L109) ## Methods @@ -125,16 +125,20 @@ prevVal: undefined | NonNullable; #### Defined in -[derived.ts:72](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L72) +[derived.ts:80](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L80) *** ### mount() ```ts -mount(): () => void +mount(__namedParameters): () => void ``` +#### Parameters + +• **\_\_namedParameters**: [`DerivedMountOptions`](../interfaces/derivedmountoptions.md) = `{}` + #### Returns `Function` @@ -145,7 +149,7 @@ mount(): () => void #### Defined in -[derived.ts:172](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L172) +[derived.ts:180](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L180) *** @@ -161,7 +165,7 @@ recompute(): void #### Defined in -[derived.ts:161](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L161) +[derived.ts:169](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L169) *** @@ -181,7 +185,7 @@ registerOnGraph(deps): void #### Defined in -[derived.ts:113](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L113) +[derived.ts:121](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L121) *** @@ -205,7 +209,7 @@ subscribe(listener): () => void #### Defined in -[derived.ts:183](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L183) +[derived.ts:194](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L194) *** @@ -225,4 +229,4 @@ unregisterFromGraph(deps): void #### Defined in -[derived.ts:141](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L141) +[derived.ts:149](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L149) diff --git a/docs/reference/index.md b/docs/reference/index.md index 720551c..a7aba24 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -14,6 +14,7 @@ title: "@tanstack/store" ## Interfaces - [DerivedFnProps](interfaces/derivedfnprops.md) +- [DerivedMountOptions](interfaces/derivedmountoptions.md) - [DerivedOptions](interfaces/derivedoptions.md) - [StoreOptions](interfaces/storeoptions.md) diff --git a/docs/reference/interfaces/derivedmountoptions.md b/docs/reference/interfaces/derivedmountoptions.md new file mode 100644 index 0000000..d74704b --- /dev/null +++ b/docs/reference/interfaces/derivedmountoptions.md @@ -0,0 +1,26 @@ +--- +id: DerivedMountOptions +title: DerivedMountOptions +--- + +# Interface: DerivedMountOptions + +## Properties + +### recompute? + +```ts +optional recompute: boolean; +``` + +Should recompute the value on mount? + +#### Default + +```ts +{true} +``` + +#### Defined in + +[derived.ts:59](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L59) From 2e0bfd3adf1bf92b42366558691a133d73e129a2 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sun, 1 Dec 2024 05:35:40 -0800 Subject: [PATCH 75/81] chore: add failing tests --- packages/store/tests/derived.test.ts | 29 +++++++++++++++++++++++++- packages/store/tests/scheduler.test.ts | 25 ++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/packages/store/tests/derived.test.ts b/packages/store/tests/derived.test.ts index 2e7da24..25b0ecc 100644 --- a/packages/store/tests/derived.test.ts +++ b/packages/store/tests/derived.test.ts @@ -225,7 +225,7 @@ describe('Derived', () => { expect(fn).toBeCalledWith(12) }) - test('derivedFn should be able to mount and unmount correctly repeatly', () => { + test('should be able to mount and unmount correctly repeatly', () => { const count = new Store(12) const derived = new Derived({ deps: [count], @@ -247,4 +247,31 @@ describe('Derived', () => { expect(count.state).toBe(24) expect(derived.state).toBe(48) }) + + test('should be able to mount in the wrong order and still work', () => { + const count = new Store(12) + + const double = new Derived({ + deps: [count], + fn: () => { + return count.state * 2 + }, + }) + + const halfDouble = new Derived({ + deps: [double], + fn: () => { + return double.state / 2 + }, + }) + + halfDouble.mount() + double.mount() + + count.setState(() => 24) + + expect(count.state).toBe(24) + expect(double.state).toBe(48) + expect(halfDouble.state).toBe(24) + }) }) diff --git a/packages/store/tests/scheduler.test.ts b/packages/store/tests/scheduler.test.ts index 0042a25..bf5d96c 100644 --- a/packages/store/tests/scheduler.test.ts +++ b/packages/store/tests/scheduler.test.ts @@ -97,4 +97,29 @@ describe('Scheduler logic', () => { expect(listener).toHaveBeenCalledTimes(5) unsub() }) + + test('should register graph items in the wrong order properly', () => { + const count = new Store(12) + + const double = new Derived({ + deps: [count], + fn: () => { + return count.state * 2 + }, + }) + + const halfDouble = new Derived({ + deps: [double], + fn: () => { + return double.state / 2 + }, + }) + + halfDouble.registerOnGraph() + + expect(__storeToDerived.get(count)).toContain(halfDouble) + expect(__derivedToStore.get(halfDouble)).toContain(count) + expect(__storeToDerived.get(count)).toContain(double) + expect(__derivedToStore.get(double)).toContain(count) + }) }) From 634cbf29a1ec86895a0baeb3728741dd441383a2 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sun, 1 Dec 2024 05:41:56 -0800 Subject: [PATCH 76/81] fix: issues with out-of-order mounting should be fixed --- packages/store/src/derived.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/store/src/derived.ts b/packages/store/src/derived.ts index 161a4e5..d11177e 100644 --- a/packages/store/src/derived.ts +++ b/packages/store/src/derived.ts @@ -123,8 +123,9 @@ export class Derived< ) { for (const dep of deps) { if (dep instanceof Derived) { - // Go into the deps of the derived and find the root store(s) that it depends on deeply - // Then, register this derived as a related derived to the store + // First register the intermediate derived value if it's not already registered + dep.registerOnGraph() + // Then register this derived with the dep's underlying stores this.registerOnGraph(dep.options.deps) } else if (dep instanceof Store) { // Register the derived as related derived to the store From 4ec258b4e337115c1a7ee4c73502dfeecdb5d14c Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sun, 1 Dec 2024 13:42:53 +0000 Subject: [PATCH 77/81] ci: apply automated fixes and generate docs --- docs/reference/classes/derived.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/reference/classes/derived.md b/docs/reference/classes/derived.md index 4ec7860..df06f13 100644 --- a/docs/reference/classes/derived.md +++ b/docs/reference/classes/derived.md @@ -149,7 +149,7 @@ mount(__namedParameters): () => void #### Defined in -[derived.ts:180](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L180) +[derived.ts:181](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L181) *** @@ -165,7 +165,7 @@ recompute(): void #### Defined in -[derived.ts:169](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L169) +[derived.ts:170](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L170) *** @@ -209,7 +209,7 @@ subscribe(listener): () => void #### Defined in -[derived.ts:194](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L194) +[derived.ts:195](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L195) *** @@ -229,4 +229,4 @@ unregisterFromGraph(deps): void #### Defined in -[derived.ts:149](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L149) +[derived.ts:150](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L150) From ce6f794185b4e03ff179ee2ffeeab7a4b852cc13 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sun, 1 Dec 2024 09:42:52 -0800 Subject: [PATCH 78/81] chore: add tests --- packages/store/tests/scheduler.test.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/store/tests/scheduler.test.ts b/packages/store/tests/scheduler.test.ts index bf5d96c..43e6542 100644 --- a/packages/store/tests/scheduler.test.ts +++ b/packages/store/tests/scheduler.test.ts @@ -122,4 +122,26 @@ describe('Scheduler logic', () => { expect(__storeToDerived.get(count)).toContain(double) expect(__derivedToStore.get(double)).toContain(count) }) + + test('should register graph items in the right direction order', () => { + const count = new Store(12) + + const double = new Derived({ + deps: [count], + fn: () => { + return count.state * 2 + }, + }) + + const halfDouble = new Derived({ + deps: [double], + fn: () => { + return double.state / 2 + }, + }) + + halfDouble.registerOnGraph() + + expect(Array.from(__storeToDerived.get(count)!)).toEqual([double, halfDouble]) + }) }) From 38558db730b006857b88d2c862c83a3d7511a5b4 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sun, 1 Dec 2024 17:43:43 +0000 Subject: [PATCH 79/81] ci: apply automated fixes and generate docs --- packages/store/tests/scheduler.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/store/tests/scheduler.test.ts b/packages/store/tests/scheduler.test.ts index 43e6542..c09f564 100644 --- a/packages/store/tests/scheduler.test.ts +++ b/packages/store/tests/scheduler.test.ts @@ -142,6 +142,9 @@ describe('Scheduler logic', () => { halfDouble.registerOnGraph() - expect(Array.from(__storeToDerived.get(count)!)).toEqual([double, halfDouble]) + expect(Array.from(__storeToDerived.get(count)!)).toEqual([ + double, + halfDouble, + ]) }) }) From 29af493aaf06b3fd57e82c2cc7f00dc92d51019a Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sun, 1 Dec 2024 10:04:28 -0800 Subject: [PATCH 80/81] chore: add another failing test --- packages/store/tests/derived.test.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/store/tests/derived.test.ts b/packages/store/tests/derived.test.ts index 25b0ecc..2d3bc9c 100644 --- a/packages/store/tests/derived.test.ts +++ b/packages/store/tests/derived.test.ts @@ -274,4 +274,31 @@ describe('Derived', () => { expect(double.state).toBe(48) expect(halfDouble.state).toBe(24) }) + + test('should recompute in the right order', () => { + const count = new Store(12) + + const fn = vi.fn() + + const double = new Derived({ + deps: [count], + fn: () => { + fn(2); + return count.state * 2 + }, + }) + + const halfDouble = new Derived({ + deps: [double, count], + fn: () => { + fn(3); + return double.state / 2 + }, + }) + + halfDouble.mount() + double.mount() + + expect(fn).toHaveBeenLastCalledWith(3) + }) }) From cc4516947da43c3127293d9b2515894e32a2f1ae Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sun, 1 Dec 2024 18:16:17 +0000 Subject: [PATCH 81/81] ci: apply automated fixes and generate docs --- packages/store/tests/derived.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/store/tests/derived.test.ts b/packages/store/tests/derived.test.ts index 2d3bc9c..25f8de1 100644 --- a/packages/store/tests/derived.test.ts +++ b/packages/store/tests/derived.test.ts @@ -283,7 +283,7 @@ describe('Derived', () => { const double = new Derived({ deps: [count], fn: () => { - fn(2); + fn(2) return count.state * 2 }, }) @@ -291,7 +291,7 @@ describe('Derived', () => { const halfDouble = new Derived({ deps: [double, count], fn: () => { - fn(3); + fn(3) return double.state / 2 }, })