From 7e247f284e5c0604ed61bede09cf323f196a7120 Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Fri, 22 May 2026 10:26:28 -0400 Subject: [PATCH 1/5] Migrate to Solid 2 beta 13 --- .changeset/deep-solid2-migration.md | 18 ++ packages/deep/README.md | 71 ++++---- packages/deep/package.json | 6 +- packages/deep/src/store-updates.ts | 22 +-- packages/deep/src/track-deep.ts | 10 +- packages/deep/src/track-store.ts | 92 ++--------- packages/deep/test/track.test.ts | 247 ++++++++++++++++------------ packages/deep/test/updates.test.ts | 131 +++++++++------ pnpm-lock.yaml | 35 ++-- 9 files changed, 329 insertions(+), 303 deletions(-) create mode 100644 .changeset/deep-solid2-migration.md diff --git a/.changeset/deep-solid2-migration.md b/.changeset/deep-solid2-migration.md new file mode 100644 index 000000000..a4b5f5126 --- /dev/null +++ b/.changeset/deep-solid2-migration.md @@ -0,0 +1,18 @@ +--- +"@solid-primitives/deep": major +--- + +Migrate to Solid.js v2.0 (beta.13) + +## Breaking Changes + +**Peer dependencies**: `solid-js@^2.0.0-beta.13` and `@solidjs/web@^2.0.0-beta.13` are now required. + +### `@solid-primitives/deep` + +- `isServer` now imported from `@solidjs/web` (not `solid-js/web`) +- Store imports (`createStore`, `reconcile`, `snapshot`) moved from `solid-js/store` to `solid-js` +- `unwrap` replaced by `snapshot` — returns a plain non-reactive copy of a store +- Store setters now use draft-first form: `setState(s => { s.prop = value; })` replaces path-based setters +- `createEffect` in examples updated to required split compute/apply form +- `trackStore` now correctly handles getters (subscribes to reactive deps accessed through getters) and rejects plain object wrappers around stores (`pojo: false` behavior preserved) diff --git a/packages/deep/README.md b/packages/deep/README.md index 58a865d0b..14c7d0915 100644 --- a/packages/deep/README.md +++ b/packages/deep/README.md @@ -41,20 +41,23 @@ import { trackDeep } from "@solid-primitives/deep"; const [state, setState] = createStore({ name: "John", age: 42 }); -createEffect(() => { - trackDeep(state); - /* execute some logic whenever the state changes */ -}); +createEffect( + () => trackDeep(state), + () => { + /* execute some logic whenever the state changes */ + } +); ``` Or since this has a composable design, you can create _derivative_ functions and use them similar to derivative signals. ```ts const deeplyTrackedStore = () => trackDeep(sign); -createEffect(() => { - console.log("Store is: ", deeplyTrackedStore()); - // ^ this causes a re-execution of the effect on deep changes of properties -}); +createEffect( + () => deeplyTrackedStore(), + // ^ this causes a re-execution of the effect on deep changes of properties + value => console.log("Store is:", value) +); ``` `trackDeep` will traverse any "wrappable" object _(objects that solid stores will wrap with proxies)_, even if it's not a solid store. @@ -66,15 +69,17 @@ createEffect(() => { }); ``` -> **Warning** If you `unwrap` a store, it will no longer be tracked by `trackDeep` nor `trackStore`! +> **Warning** If you `snapshot` a store, it will no longer be tracked by `trackDeep` nor `trackStore`! ```ts -const unwrapped = unwrap(state); +import { snapshot } from "solid-js"; -createEffect(() => { - // This will NOT work: - trackDeep(unwrapped); -}); +const plain = snapshot(state); + +createEffect( + () => trackDeep(plain), // This will NOT work — plain objects are not reactive + () => {} +); ``` ## `trackStore` @@ -92,10 +97,12 @@ import { trackStore } from "@solid-primitives/deep"; const [state, setState] = createStore({ name: "John", age: 42 }); -createEffect(() => { - trackStore(state); - /* execute some logic whenever the state changes */ -}); +createEffect( + () => trackStore(state), + () => { + /* execute some logic whenever the state changes */ + } +); ``` ## `captureStoreUpdates` @@ -115,7 +122,7 @@ const getDelta = captureStoreUpdates(state); getDelta(); // [{ path: [], value: { todos: [] } }] -setState("todos", ["foo"]); +setState(s => { s.todos = ["foo"]; }); getDelta(); // [{ path: ["todos"], value: ["foo"] }] ``` @@ -127,11 +134,13 @@ const [state, setState] = createStore({ todos: [] }); const getDelta = captureStoreUpdates(state); -createEffect(() => { - const delta = getDelta(); - /* execute some logic whenever the state changes */ - console.log(delta); -}); +createEffect( + () => getDelta(), + delta => { + /* execute some logic whenever the state changes */ + console.log(delta); + } +); ``` The returned function is not a signal - it won't get updated by itself, it has to be called manually, or under a tracking scope to capture new updates. @@ -144,12 +153,14 @@ const [state, setState] = createStore({ todos: [] }); const delta = createMemo(captureStoreUpdates(state)); // both of these effects will receive the same delta -createEffect(() => { - console.log(delta()); -}); -createEffect(() => { - console.log(delta()); -}); +createEffect( + () => delta(), + value => console.log(value) +); +createEffect( + () => delta(), + value => console.log(value) +); ``` ### Demo diff --git a/packages/deep/package.json b/packages/deep/package.json index 0bb6b97db..4af5d3c07 100644 --- a/packages/deep/package.json +++ b/packages/deep/package.json @@ -61,9 +61,11 @@ "@solid-primitives/memo": "workspace:^" }, "peerDependencies": { - "solid-js": "^1.6.12" + "@solidjs/web": "^2.0.0-beta.13", + "solid-js": "^2.0.0-beta.13" }, "devDependencies": { - "solid-js": "^1.9.7" + "@solidjs/web": "2.0.0-beta.13", + "solid-js": "2.0.0-beta.13" } } diff --git a/packages/deep/src/store-updates.ts b/packages/deep/src/store-updates.ts index ec2879d0d..cfcf73572 100644 --- a/packages/deep/src/store-updates.ts +++ b/packages/deep/src/store-updates.ts @@ -1,7 +1,6 @@ import { createLazyMemo } from "@solid-primitives/memo"; -import { $PROXY, $TRACK, type Accessor, createRoot, untrack } from "solid-js"; -import { unwrap } from "solid-js/store"; -import { isDev, isServer } from "solid-js/web"; +import { $PROXY, $TRACK, type Accessor, DEV, runWithOwner, untrack, snapshot } from "solid-js"; +import { isServer } from "@solidjs/web"; type Static = { [K in number | string]: T } | T[]; @@ -28,14 +27,15 @@ function getStoreNodechildren(node: StoreNode): StoreNodeChildren { let signal = StoreNodeChildrenCache.get(node); if (!signal) { - const unwrapped = unwrap(node), - isArray = Array.isArray(unwrapped); + const isArray = Array.isArray(node); - signal = createRoot(() => + signal = runWithOwner(null, () => createLazyMemo(() => { node[$TRACK]; + // take a plain snapshot inside untrack so we don't add per-key tracking subscriptions + const unwrapped = untrack(() => snapshot(node)); const children: StoreNodeChildren = isArray ? [] : {}; - for (const [key, child] of entries(unwrapped)) { + for (const [key, child] of entries(unwrapped as Static)) { let childNode: any; if ( child != null && @@ -50,10 +50,10 @@ function getStoreNodechildren(node: StoreNode): StoreNodeChildren { }), ); - StoreNodeChildrenCache.set(node, signal); + StoreNodeChildrenCache.set(node, signal!); } - return signal(); + return signal!(); } export type AllNestedObjects = T extends Static ? AllNestedObjects | T : never; @@ -125,7 +125,7 @@ function compareStoreWithCache( * * getDelta(); // [{ path: [], value: { todos: [] } }] * - * setState("todos", ["foo"]); + * setState(s => { s.todos = ["foo"]; }); * * getDelta(); // [{ path: ["todos"], value: ["foo"] }] * ``` @@ -134,7 +134,7 @@ export function captureStoreUpdates(store: T): () => NestedUpd // on the server you cannot check if the passed object is a store // so we just return the whole store always if (isServer || !($TRACK in store)) { - if (isDev) { + if (DEV) { // eslint-disable-next-line no-console console.warn("createStoreDelta expects a store, got", store); } diff --git a/packages/deep/src/track-deep.ts b/packages/deep/src/track-deep.ts index 4019c3e06..b2916092c 100644 --- a/packages/deep/src/track-deep.ts +++ b/packages/deep/src/track-deep.ts @@ -1,5 +1,5 @@ import { $PROXY } from "solid-js"; -import { type Store } from "solid-js/store"; +import { type Store } from "solid-js"; /** * Tracks all properties of a {@link store} by iterating over them recursively. @@ -11,12 +11,12 @@ import { type Store } from "solid-js/store"; * * @example * ```ts - * createEffect(on( + * createEffect( * () => trackDeep(store), * () => { * // this effect will run when any property of store changes * } - * )); + * ); * ``` */ function trackDeep>(store: T): T { @@ -27,7 +27,7 @@ function trackDeep>(store: T): T { function traverse(value: Store, seen: Set): void { let isArray: boolean; let proto; - // check the same conditions as in `isWrappable` from `/packages/solid/store/src/store.ts` + // check the same conditions as in `isWrappable` from solid's store implementation if ( value != null && typeof value === "object" && @@ -38,7 +38,7 @@ function traverse(value: Store, seen: Set): void { proto === Object.prototype) ) { seen.add(value); - for (const child of isArray ? (value as any[]) : Object.values(value)) traverse(child, seen); + for (const child of isArray ? (value as unknown as any[]) : Object.values(value)) traverse(child, seen); } } diff --git a/packages/deep/src/track-store.ts b/packages/deep/src/track-store.ts index e6adcb8ff..c57415a44 100644 --- a/packages/deep/src/track-store.ts +++ b/packages/deep/src/track-store.ts @@ -1,74 +1,4 @@ -import { $PROXY, $TRACK, createMemo, createRoot, createSignal, untrack } from "solid-js"; -import { type Store, unwrap } from "solid-js/store"; - -const EQUALS_FALSE = { equals: false } as const; - -type StoreNode = Record; - -const TrackStoreCache = new WeakMap(); - -// for preventing the same object to be visited multiple times in the same trackStore call -let TrackVersion = 0; - -function getTrackStoreNode(node: StoreNode): VoidFunction | undefined { - let track = TrackStoreCache.get(node); - - if (!track) { - createRoot(() => { - const unwrapped = unwrap(node); - - // custom lazy memo to support circular references - // maybe it won't be needed in solid 2.0 - - let is_reading = false; - let is_stale = true; - let version = 0; - - const [signal, trigger] = createSignal(undefined, EQUALS_FALSE); - - const memo = createMemo( - () => { - if (is_reading) { - node[$TRACK]; // shallow track store node - - // track each child node - for (const [key, child] of Object.entries(unwrapped)) { - let childNode: StoreNode; - if ( - child != null && - typeof child === "object" && - ((childNode = child[$PROXY]) || $TRACK in (childNode = untrack(() => node[key]))) - ) { - getTrackStoreNode(childNode)?.(); - } - } - } else { - signal(); - is_stale = true; - } - }, - undefined, - EQUALS_FALSE, - ); - - track = () => { - is_reading = true; - if (is_stale) { - trigger(); - is_stale = false; - } - const already_tracked = version === TrackVersion; - version = TrackVersion; - already_tracked || memo(); - is_reading = false; - }; - - TrackStoreCache.set(node, track); - }); - } - - return track; -} +import { $TRACK, type Store } from "solid-js"; /** * Tracks all nested changes to passed {@link store}. @@ -80,18 +10,30 @@ function getTrackStoreNode(node: StoreNode): VoidFunction | undefined { * * @example * ```ts - * createEffect(on( + * createEffect( * () => trackStore(store), * () => { * // this effect will run when any property of store changes * } - * )); + * ); * ``` */ function trackStore(store: Store): T { - TrackVersion++; - $TRACK in store && getTrackStoreNode(store)?.(); + traverseStore(store as any, new Set()); return store; } +function traverseStore(node: any, seen: Set): void { + if (!($TRACK in node) || seen.has(node)) return; + seen.add(node); + // subscribe to structural changes (additions/removals) + (node as any)[$TRACK]; + // access all values through the proxy to subscribe to getters and collect children + for (const child of Object.values(node as any)) { + if (child != null && typeof child === "object") { + traverseStore(child, seen); + } + } +} + export { trackStore }; diff --git a/packages/deep/test/track.test.ts b/packages/deep/test/track.test.ts index 52ffa5f2c..f28321c52 100644 --- a/packages/deep/test/track.test.ts +++ b/packages/deep/test/track.test.ts @@ -1,7 +1,7 @@ import { describe, test, expect } from "vitest"; -import { batch, createEffect, createRoot, createSignal } from "solid-js"; +import { createEffect, createRoot, createSignal, flush } from "solid-js"; +import { createStore, snapshot } from "solid-js"; import { captureStoreUpdates, trackDeep, trackStore } from "../src/index.js"; -import { createStore, reconcile, unwrap } from "solid-js/store"; const apis: { name: string; @@ -34,18 +34,21 @@ for (const api of apis) { let runs = 0; createRoot(() => { - createEffect(() => { - fn(); - runs++; - }); + createEffect( + () => fn(), + () => { runs++; }, + ); }); + flush(); expect(runs).toBe(1); - set("a", "a.b", "minds"); + set(s => { s.a["a.b"] = "minds"; }); + flush(); expect(runs).toBe(2); - set("b", "bar"); + set(s => { s.b = "bar"; }); + flush(); expect(runs).toBe(3); }); @@ -55,22 +58,25 @@ for (const api of apis) { let runs = 0; createRoot(() => { - createEffect(() => { - fn(); - runs++; - }); - createEffect(() => { - fn(); - runs++; - }); + createEffect( + () => fn(), + () => { runs++; }, + ); + createEffect( + () => fn(), + () => { runs++; }, + ); }); + flush(); expect(runs).toBe(2); - set("a", "a.b", "minds"); + set(s => { s.a["a.b"] = "minds"; }); + flush(); expect(runs).toBe(4); - set("b", "bar"); + set(s => { s.b = "bar"; }); + flush(); expect(runs).toBe(6); }); @@ -80,17 +86,17 @@ for (const api of apis) { let runs = 0; createRoot(() => { - createEffect(() => { - fn(); - runs++; - }); + createEffect( + () => fn(), + () => { runs++; }, + ); }); + flush(); expect(runs).toBe(1); - batch(() => { - set("a", "a.b", "minds"); - set("b", "bar"); - }); + set(s => { s.a["a.b"] = "minds"; }); + set(s => { s.b = "bar"; }); + flush(); expect(runs).toBe(2); }); @@ -100,14 +106,16 @@ for (const api of apis) { let runs = 0; createRoot(() => { - createEffect(() => { - fn(); - runs++; - }); + createEffect( + () => fn(), + () => { runs++; }, + ); }); + flush(); expect(runs).toBe(1); - set("b", "foo"); + set((s: any) => { s.b = "foo"; }); + flush(); expect(runs).toBe(2); }); @@ -117,14 +125,16 @@ for (const api of apis) { let runs = 0; createRoot(() => { - createEffect(() => { - fn(); - runs++; - }); + createEffect( + () => fn(), + () => { runs++; }, + ); }); + flush(); expect(runs).toBe(1); - set("b", undefined); + set(s => { (s as any).b = undefined; }); + flush(); expect(runs).toBe(2); }); @@ -134,17 +144,20 @@ for (const api of apis) { let runs = 0; createRoot(() => { - createEffect(() => { - fn(); - runs++; - }); + createEffect( + () => fn(), + () => { runs++; }, + ); }); + flush(); expect(runs).toBe(1); - set({ a: { "a.b": "minds" } }); + set(() => ({ a: { "a.b": "minds" } })); + flush(); expect(runs).toBe(2); - set("a", "a.b", "thoughts"); + set(s => { s.a["a.b"] = "thoughts"; }); + flush(); expect(runs).toBe(3); }); @@ -154,14 +167,16 @@ for (const api of apis) { let runs = 0; createRoot(() => { - createEffect(() => { - fn(); - runs++; - }); + createEffect( + () => fn(), + () => { runs++; }, + ); }); + flush(); expect(runs).toBe(1); - set("a", [2, 3, 1]); + set(s => { s.a[0] = 2; s.a[1] = 3; s.a[2] = 1; }); + flush(); expect(runs).toBe(2); }); @@ -175,14 +190,16 @@ for (const api of apis) { let runs = 0; createRoot(() => { - createEffect(() => { - fn(); - runs += 1; - }); + createEffect( + () => fn(), + () => { runs += 1; }, + ); }); + flush(); expect(runs).toBe(1); - set("count", 1); + set(s => { s.count = 1; }); + flush(); expect(runs).toBe(2); }); @@ -199,20 +216,22 @@ for (const api of apis) { let runs_leaf = 0; createRoot(() => { - createEffect(() => { - fn_root(); - runs_root += 1; - }); - createEffect(() => { - fn_leaf(); - runs_leaf += 1; - }); + createEffect( + () => fn_root(), + () => { runs_root += 1; }, + ); + createEffect( + () => fn_leaf(), + () => { runs_leaf += 1; }, + ); }); + flush(); expect(runs_root).toBe(1); expect(runs_leaf).toBe(1); - set("count", 1); + set(s => { s.count = 1; }); + flush(); expect(runs_root).toBe(2); expect(runs_leaf).toBe(2); }); @@ -225,18 +244,21 @@ for (const api of apis) { let runs = 0; createRoot(() => { - createEffect(() => { - fn(); - runs++; - }); + createEffect( + () => fn(), + () => { runs++; }, + ); }); + flush(); expect(runs).toBe(1); - set("a", "count", 1); + set(s => { s.a.count = 1; }); + flush(); expect(runs).toBe(2); - set("b", "count", 2); + set(s => { s.b.count = 2; }); + flush(); expect(runs).toBe(3); }); @@ -251,24 +273,27 @@ for (const api of apis) { let runs_b = 0; createRoot(() => { - createEffect(() => { - fn_a(); - runs_a++; - }); - createEffect(() => { - fn_b(); - runs_b++; - }); + createEffect( + () => fn_a(), + () => { runs_a++; }, + ); + createEffect( + () => fn_b(), + () => { runs_b++; }, + ); }); + flush(); expect(runs_a).toBe(1); expect(runs_b).toBe(1); - set("a", "count", 1); + set(s => { s.a.count = 1; }); + flush(); expect(runs_a).toBe(2); expect(runs_b).toBe(2); - set("b", "count", 2); + set(s => { s.b.count = 2; }); + flush(); expect(runs_a).toBe(3); expect(runs_b).toBe(3); }); @@ -279,16 +304,21 @@ for (const api of apis) { let runs = 0; createRoot(() => { - createEffect(() => fn); + createEffect( + () => fn, + () => {}, + ); const a = sign.a; - createEffect(() => { - api.fn(a); - runs++; - }); + createEffect( + () => { api.fn(a); }, + () => { runs++; }, + ); }); + flush(); expect(runs).toBe(1); - set("b", "foo"); + set((s: any) => { s.b = "foo"; }); + flush(); expect(runs).toBe(1); }); @@ -298,35 +328,40 @@ for (const api of apis) { let runs = 0; createRoot(() => { - createEffect(() => { - fn(); - runs++; - }); + createEffect( + () => fn(), + () => { runs++; }, + ); }); + flush(); expect(runs).toBe(1); - set("a", reconcile({ foo: "bar" })); + set((s: any) => { s.a = { foo: "bar" }; }); + flush(); expect(runs).toBe(2); - set("a", "foo", "baz"); + set((s: any) => { s.a.foo = "baz"; }); + flush(); expect(runs).toBe(3); }); test("unwrapped", () => { const [sign, set] = createStore({ a: { "a.b": "thoughts" } }); - const unwrapped = unwrap(sign); + const unwrapped = snapshot(sign); const fn = api.fn(unwrapped); let runs = 0; createRoot(() => { - createEffect(() => { - fn(); - runs++; - }); + createEffect( + () => fn(), + () => { runs++; }, + ); }); + flush(); expect(runs).toBe(1); - set("a", "a.b", "minds"); + set(s => { s.a["a.b"] = "minds"; }); + flush(); expect(runs).toBe(1); }); @@ -336,14 +371,16 @@ for (const api of apis) { let runs = 0; createRoot(() => { - createEffect(() => { - fn(); - runs++; - }); + createEffect( + () => fn(), + () => { runs++; }, + ); }); + flush(); expect(runs).toBe(1); - set("a", "a.b", "minds"); + set(s => { s.a["a.b"] = "minds"; }); + flush(); if (api.pojo) { expect(runs).toBe(2); } else { @@ -363,14 +400,16 @@ for (const api of apis) { let runs = 0; createRoot(() => { - createEffect(() => { - fn(); - runs++; - }); + createEffect( + () => fn(), + () => { runs++; }, + ); }); + flush(); expect(runs).toBe(1); setCount(1); + flush(); expect(runs).toBe(2); }); }); diff --git a/packages/deep/test/updates.test.ts b/packages/deep/test/updates.test.ts index 100966c6f..c1b1533f4 100644 --- a/packages/deep/test/updates.test.ts +++ b/packages/deep/test/updates.test.ts @@ -1,7 +1,7 @@ import { describe, test, expect } from "vitest"; -import { batch, createEffect, createRoot, createSignal } from "solid-js"; +import { createEffect, createRoot, createSignal, flush } from "solid-js"; +import { createStore, reconcile } from "solid-js"; import { captureStoreUpdates } from "../src/index.js"; -import { createStore } from "solid-js/store"; describe("createStoreDelta", () => { test("initial value", () => { @@ -22,12 +22,15 @@ describe("createStoreDelta", () => { const diff = captureStoreUpdates(sign); createRoot(() => { - createEffect(() => { - captured.push(diff()); - }); + createEffect( + () => diff(), + updates => { captured.push(updates); }, + ); }); + flush(); - set("a", "a.b", "minds"); + set(s => { s.a["a.b"] = "minds"; }); + flush(); expect(captured).toHaveLength(2); expect(captured[1]).toEqual([ { @@ -36,7 +39,8 @@ describe("createStoreDelta", () => { }, ] satisfies ReturnType); - set("b", "bar"); + set(s => { s.b = "bar"; }); + flush(); expect(captured).toHaveLength(3); expect(captured[2]).toEqual([ { @@ -52,15 +56,16 @@ describe("createStoreDelta", () => { const diff = captureStoreUpdates(sign); createRoot(() => { - createEffect(() => { - captured.push(diff()); - }); + createEffect( + () => diff(), + updates => { captured.push(updates); }, + ); }); + flush(); - batch(() => { - set("a", "ab", "minds"); - set("b", "ba", 2); - }); + set(s => { s.a.ab = "minds"; }); + set(s => { s.b.ba = 2; }); + flush(); expect(captured).toHaveLength(2); expect(captured[1]).toEqual([ @@ -81,15 +86,16 @@ describe("createStoreDelta", () => { const diff = captureStoreUpdates(sign); createRoot(() => { - createEffect(() => { - captured.push(diff()); - }); + createEffect( + () => diff(), + updates => { captured.push(updates); }, + ); }); + flush(); - batch(() => { - set("a", "a.b", "minds"); - set("b", "bar"); - }); + set(s => { s.a["a.b"] = "minds"; }); + set(s => { s.b = "bar"; }); + flush(); expect(captured).toHaveLength(2); expect(captured[1]).toEqual([ @@ -104,16 +110,18 @@ describe("createStoreDelta", () => { const captured: any[] = []; const [sign] = createStore({ a: { "a.b": "thoughts" } }); const diff = captureStoreUpdates(sign); - const [track, trigger] = createSignal(undefined, { equals: false }); + const [track, trigger] = createSignal(undefined, { equals: false }); createRoot(() => { - createEffect(() => { - track(); - captured.push(diff()); - }); + createEffect( + () => { track(); return diff(); }, + updates => { captured.push(updates); }, + ); }); + flush(); - trigger(); + trigger(undefined); + flush(); expect(captured).toHaveLength(2); expect(captured[1]).toEqual([]); }); @@ -124,12 +132,15 @@ describe("createStoreDelta", () => { const diff = captureStoreUpdates(sign); createRoot(() => { - createEffect(() => { - captured.push(diff()); - }); + createEffect( + () => diff(), + updates => { captured.push(updates); }, + ); }); + flush(); - set("b", "foo"); + set((s: any) => { s.b = "foo"; }); + flush(); expect(captured).toHaveLength(2); expect(captured[1]).toEqual([ { @@ -145,12 +156,15 @@ describe("createStoreDelta", () => { const diff = captureStoreUpdates(sign); createRoot(() => { - createEffect(() => { - captured.push(diff()); - }); + createEffect( + () => diff(), + updates => { captured.push(updates); }, + ); }); + flush(); - set("b", undefined); + set(s => { (s as any).b = undefined; }); + flush(); expect(captured).toHaveLength(2); expect(captured[1]).toEqual([ { @@ -166,12 +180,15 @@ describe("createStoreDelta", () => { const diff = captureStoreUpdates(sign); createRoot(() => { - createEffect(() => { - captured.push(diff()); - }); + createEffect( + () => diff(), + updates => { captured.push(updates); }, + ); }); + flush(); - set({ a: { "a.b": "minds" } }); + set(() => ({ a: { "a.b": "minds" } })); + flush(); expect(captured).toHaveLength(2); expect(captured[1]).toEqual([ { @@ -187,12 +204,15 @@ describe("createStoreDelta", () => { const diff = captureStoreUpdates(sign); createRoot(() => { - createEffect(() => { - captured.push(diff()); - }); + createEffect( + () => diff(), + updates => { captured.push(updates); }, + ); }); + flush(); - set("b", 0, "bar"); + set(s => { s.b[0] = "bar"; }); + flush(); expect(captured).toHaveLength(2); expect(captured[1]).toEqual([ { @@ -201,7 +221,8 @@ describe("createStoreDelta", () => { }, ] satisfies ReturnType); - set("b", 1, "baz"); + set(s => { (s.b as any)[1] = "baz"; }); + flush(); expect(captured).toHaveLength(3); expect(captured[2]).toEqual([ { @@ -217,12 +238,15 @@ describe("createStoreDelta", () => { const diff = captureStoreUpdates(sign); createRoot(() => { - createEffect(() => { - captured.push(diff()); - }); + createEffect( + () => diff(), + updates => { captured.push(updates); }, + ); }); + flush(); - set(0, "n", 1); + set(s => { s[0].n = 1; }); + flush(); expect(captured).toHaveLength(2); expect(captured[1]).toEqual([ { @@ -238,12 +262,15 @@ describe("createStoreDelta", () => { const diff = captureStoreUpdates(sign); createRoot(() => { - createEffect(() => { - captured.push(diff()); - }); + createEffect( + () => diff(), + updates => { captured.push(updates); }, + ); }); + flush(); - set("a", "ab", sign); + set((s: any) => { s.a.ab = sign; }); + flush(); expect(captured).toHaveLength(2); expect(captured[1]).toEqual([ { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7a083eac..fd8ba3197 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -278,9 +278,12 @@ importers: specifier: workspace:^ version: link:../memo devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/destructure: dependencies: @@ -5267,12 +5270,6 @@ packages: peerDependencies: seroval: ^1.0 - seroval-plugins@1.5.2: - resolution: {integrity: sha512-qpY0Cl+fKYFn4GOf3cMiq6l72CpuVaawb6ILjubOQ+diJ54LfOWaSSPsaswN8DRPIPW4Yq+tE1k5aKd7ILyaFg==} - engines: {node: '>=10'} - peerDependencies: - seroval: ^1.0 - seroval-plugins@1.5.4: resolution: {integrity: sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==} engines: {node: '>=10'} @@ -5283,10 +5280,6 @@ packages: resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} engines: {node: '>=10'} - seroval@1.5.2: - resolution: {integrity: sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==} - engines: {node: '>=10'} - seroval@1.5.4: resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} engines: {node: '>=10'} @@ -7761,14 +7754,14 @@ snapshots: '@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10)': dependencies: - seroval: 1.5.2 - seroval-plugins: 1.5.2(seroval@1.5.2) + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) solid-js: 2.0.0-beta.10 '@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.13)': dependencies: - seroval: 1.5.2 - seroval-plugins: 1.5.2(seroval@1.5.2) + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) solid-js: 2.0.0-beta.13 '@supabase/auth-js@2.67.3': @@ -10744,18 +10737,12 @@ snapshots: dependencies: seroval: 1.3.2 - seroval-plugins@1.5.2(seroval@1.5.2): - dependencies: - seroval: 1.5.2 - seroval-plugins@1.5.4(seroval@1.5.4): dependencies: seroval: 1.5.4 seroval@1.3.2: {} - seroval@1.5.2: {} - seroval@1.5.4: {} set-blocking@2.0.0: {} @@ -10829,8 +10816,8 @@ snapshots: dependencies: '@solidjs/signals': 2.0.0-beta.13 csstype: 3.1.3 - seroval: 1.5.2 - seroval-plugins: 1.5.2(seroval@1.5.2) + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) solid-refresh@0.8.0-next.7(solid-js@2.0.0-beta.10): dependencies: From 4d587ab74e2c68c1043df24df3e29082d30c1c30 Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Fri, 22 May 2026 10:42:21 -0400 Subject: [PATCH 2/5] Refined types and added further documentation --- packages/deep/src/store-updates.ts | 61 ++++++++++++++++++++++++------ packages/deep/src/track-deep.ts | 7 ++-- packages/deep/src/track-store.ts | 6 +-- 3 files changed, 55 insertions(+), 19 deletions(-) diff --git a/packages/deep/src/store-updates.ts b/packages/deep/src/store-updates.ts index cfcf73572..57624d5dd 100644 --- a/packages/deep/src/store-updates.ts +++ b/packages/deep/src/store-updates.ts @@ -2,8 +2,12 @@ import { createLazyMemo } from "@solid-primitives/memo"; import { $PROXY, $TRACK, type Accessor, DEV, runWithOwner, untrack, snapshot } from "solid-js"; import { isServer } from "@solidjs/web"; +// Indexable by string or number keys — matches what Solid stores can wrap. type Static = { [K in number | string]: T } | T[]; +// Typed iterator that preserves numeric keys for arrays vs. string keys for objects. +// Object.entries() returns [string, T][] even for arrays, losing the numeric key type, +// so arrays are iterated manually. function* entries( obj: T, ): IterableIterator { @@ -18,28 +22,41 @@ function* entries( } } +// A store node is any object that Solid has wrapped with a reactive proxy ($TRACK marks it). type StoreNode = Record & Static; +// The set of direct store-node children of a given node (non-store leaf values are excluded). type StoreNodeChildren = Static; +// One lazy memo per store node, keyed by node identity. The memo re-runs whenever the node's +// structure changes ([$TRACK] subscription) and returns the current set of child store nodes. +// Detached from any owner so it lives as long as the node is reachable, then self-disposes. const StoreNodeChildrenCache = new WeakMap>(); +// Returns the reactive snapshot of a node's direct store-node children. +// Uses a lazy memo so the computation is only created once per node, and only runs when read. function getStoreNodechildren(node: StoreNode): StoreNodeChildren { let signal = StoreNodeChildrenCache.get(node); if (!signal) { const isArray = Array.isArray(node); + // runWithOwner(null) detaches the memo from any current reactive owner so it won't be + // disposed when a caller's effect re-runs. It self-disposes when it has no subscribers. signal = runWithOwner(null, () => createLazyMemo(() => { + // Subscribe to structural changes (key additions/removals) on this node. node[$TRACK]; - // take a plain snapshot inside untrack so we don't add per-key tracking subscriptions + // snapshot() inside untrack() gives us the plain key list without subscribing to + // individual property signals — we only want to know which keys exist, not their values. const unwrapped = untrack(() => snapshot(node)); const children: StoreNodeChildren = isArray ? [] : {}; - for (const [key, child] of entries(unwrapped as Static)) { + for (const [key, child] of entries(unwrapped)) { let childNode: any; if ( child != null && typeof child === "object" && + // Prefer the proxy stored on the plain value ($PROXY), falling back to reading the + // key through the live store proxy (which re-wraps nested objects on access). ((childNode = (child as any)[$PROXY]) || ((childNode = untrack(() => node[key as any])) && $TRACK in childNode)) ) { @@ -50,10 +67,10 @@ function getStoreNodechildren(node: StoreNode): StoreNodeChildren { }), ); - StoreNodeChildrenCache.set(node, signal!); + StoreNodeChildrenCache.set(node, signal); } - return signal!(); + return signal(); } export type AllNestedObjects = T extends Static ? AllNestedObjects | T : never; @@ -63,6 +80,8 @@ export type NestedUpdate = { value: AllNestedObjects; }; +// Per-node cache entry: the children snapshot from the last getDelta() call, plus a +// recursively-shaped record mirroring the same structure so we can walk the tree. type StoreUpdateCache = { [K in string | number]: { children: StoreNodeChildren; @@ -70,14 +89,18 @@ type StoreUpdateCache = { }; }; +// Module-level globals, reset at the start of every getDelta() call. +// Safe because JS is single-threaded — no two calls can interleave. let CurrentUpdates!: NestedUpdate[]; let SeenNodes!: WeakSet; +// Builds a fresh cache entry for a node that was added or changed. +// Recursively pre-populates children so future calls can diff them. function newCacheNode(children: StoreNodeChildren): StoreUpdateCache[number] { const record: StoreUpdateCache = { ...children } as any; for (const [key, node] of entries(children)) { - if (SeenNodes.has(node)) continue; + if (SeenNodes.has(node)) continue; // guard against circular references SeenNodes.add(node); record[key] = newCacheNode(getStoreNodechildren(node)); } @@ -85,23 +108,32 @@ function newCacheNode(children: StoreNodeChildren): StoreUpdateCache[number] { return { children, record }; } +// Walks the store tree, diffing each node against its cached snapshot. +// A node is "changed" when its children reference differs from the cached one — +// getStoreNodechildren() returns a stable reference when nothing has changed, +// so a strict equality check is sufficient and cheap. +// When a change is found, the whole subtree is re-cached and reported as a single +// update at the shallowest changed node (so leaf changes inside an object are reported +// as one update on the parent object, not one per leaf). function compareStoreWithCache( node: StoreNode, parent: StoreUpdateCache, key: string | number, path: (string | number)[], ): void { - if (SeenNodes.has(node)) return; + if (SeenNodes.has(node)) return; // guard against circular references SeenNodes.add(node); const cacheNode = parent[key], children = getStoreNodechildren(node); if (cacheNode && children === cacheNode.children) { + // Node itself is unchanged; recurse to check its children. for (const [key, child] of entries(children)) { compareStoreWithCache(child, cacheNode.record, key, [...path, key]); } } else { + // Node is new or its structure changed — record it and rebuild its subtree cache. parent[key] = newCacheNode(children); CurrentUpdates.push({ path, value: node }); } @@ -131,22 +163,27 @@ function compareStoreWithCache( * ``` */ export function captureStoreUpdates(store: T): () => NestedUpdate[] { - // on the server you cannot check if the passed object is a store - // so we just return the whole store always - if (isServer || !($TRACK in store)) { + // On the server $TRACK is not present on store proxies, so we can't diff. + // Return the whole store on the first call and nothing thereafter. + if (isServer) { + let init = true; + return () => (init ? ((init = false), [{ path: [], value: store as any }]) : []); + } + + if (!($TRACK in store)) { if (DEV) { // eslint-disable-next-line no-console - console.warn("createStoreDelta expects a store, got", store); + console.warn("captureStoreUpdates expects a store, got", store); } - let init = true; return () => (init ? ((init = false), [{ path: [], value: store as any }]) : []); } + // The root cache entry — "root" is a synthetic key so compareStoreWithCache can write + // cache[key] uniformly without special-casing the top level. const cache: StoreUpdateCache = {}; return () => { - // set globals before each cycle CurrentUpdates = []; SeenNodes = new WeakSet(); diff --git a/packages/deep/src/track-deep.ts b/packages/deep/src/track-deep.ts index b2916092c..c03bfe325 100644 --- a/packages/deep/src/track-deep.ts +++ b/packages/deep/src/track-deep.ts @@ -1,5 +1,4 @@ -import { $PROXY } from "solid-js"; -import { type Store } from "solid-js"; +import { $PROXY, type Store } from "solid-js"; /** * Tracks all properties of a {@link store} by iterating over them recursively. @@ -24,7 +23,7 @@ function trackDeep>(store: T): T { return store; } -function traverse(value: Store, seen: Set): void { +function traverse(value: unknown, seen: Set): void { let isArray: boolean; let proto; // check the same conditions as in `isWrappable` from solid's store implementation @@ -38,7 +37,7 @@ function traverse(value: Store, seen: Set): void { proto === Object.prototype) ) { seen.add(value); - for (const child of isArray ? (value as unknown as any[]) : Object.values(value)) traverse(child, seen); + for (const child of isArray ? (value as any[]) : Object.values(value)) traverse(child, seen); } } diff --git a/packages/deep/src/track-store.ts b/packages/deep/src/track-store.ts index c57415a44..0a77ab6b1 100644 --- a/packages/deep/src/track-store.ts +++ b/packages/deep/src/track-store.ts @@ -19,7 +19,7 @@ import { $TRACK, type Store } from "solid-js"; * ``` */ function trackStore(store: Store): T { - traverseStore(store as any, new Set()); + traverseStore(store, new Set()); return store; } @@ -27,9 +27,9 @@ function traverseStore(node: any, seen: Set): void { if (!($TRACK in node) || seen.has(node)) return; seen.add(node); // subscribe to structural changes (additions/removals) - (node as any)[$TRACK]; + node[$TRACK]; // access all values through the proxy to subscribe to getters and collect children - for (const child of Object.values(node as any)) { + for (const child of Object.values(node)) { if (child != null && typeof child === "object") { traverseStore(child, seen); } From 67f7efcb0b98f0dfb6cafdafcbfcb050bb5af948 Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Sat, 23 May 2026 11:52:14 -0400 Subject: [PATCH 3/5] Applied suggestions from CR --- packages/deep/src/store-updates.ts | 2 +- packages/deep/test/track.test.ts | 2 +- pnpm-lock.yaml | 671 ++++++++++++++--------------- 3 files changed, 321 insertions(+), 354 deletions(-) diff --git a/packages/deep/src/store-updates.ts b/packages/deep/src/store-updates.ts index 57624d5dd..d78f63a77 100644 --- a/packages/deep/src/store-updates.ts +++ b/packages/deep/src/store-updates.ts @@ -170,7 +170,7 @@ export function captureStoreUpdates(store: T): () => NestedUpd return () => (init ? ((init = false), [{ path: [], value: store as any }]) : []); } - if (!($TRACK in store)) { + if (!(typeof store === "object" && store !== null && $TRACK in store)) { if (DEV) { // eslint-disable-next-line no-console console.warn("captureStoreUpdates expects a store, got", store); diff --git a/packages/deep/test/track.test.ts b/packages/deep/test/track.test.ts index f28321c52..a3f8ca39b 100644 --- a/packages/deep/test/track.test.ts +++ b/packages/deep/test/track.test.ts @@ -305,7 +305,7 @@ for (const api of apis) { let runs = 0; createRoot(() => { createEffect( - () => fn, + () => fn(), () => {}, ); const a = sign.a; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd8ba3197..9b7165ff2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: specifier: ^1.0.1 version: 1.0.1 '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) '@types/jsdom': specifier: ^21.1.7 version: 21.1.7 @@ -33,14 +33,14 @@ importers: specifier: ^8.34.0 version: 8.34.0(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3) babel-preset-solid: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(@babel/core@7.27.4)(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(@babel/core@7.27.4)(solid-js@2.0.0-beta.14) esbuild: specifier: ^0.25.5 version: 0.25.5 esbuild-plugin-solid: specifier: ^0.6.0 - version: 0.6.0(esbuild@0.25.5)(solid-js@2.0.0-beta.10) + version: 0.6.0(esbuild@0.25.5)(solid-js@2.0.0-beta.14) eslint: specifier: ^9.28.0 version: 9.28.0(jiti@1.21.7) @@ -75,8 +75,8 @@ importers: specifier: ^4.0.1 version: 4.0.1 solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -85,7 +85,7 @@ importers: version: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) vite-plugin-solid: specifier: 3.0.0-next.5 - version: 3.0.0-next.5(@solidjs/web@2.0.0-beta.10(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + version: 3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) vitest: specifier: ^2.1.9 version: 2.1.9(@types/node@22.15.31)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.77.8) @@ -119,11 +119,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/autofocus: dependencies: @@ -132,11 +132,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/bounds: dependencies: @@ -151,20 +151,20 @@ importers: specifier: workspace:^ version: link:../scheduled '@solidjs/web': - specifier: ^2.0.0-beta.12 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: ^2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: ^2.0.0-beta.12 - version: 2.0.0-beta.13 + specifier: ^2.0.0-beta.14 + version: 2.0.0-beta.14 packages/broadcast-channel: devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/clipboard: dependencies: @@ -173,11 +173,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/connectivity: dependencies: @@ -218,8 +218,8 @@ importers: version: link:../utils devDependencies: solid-js: - specifier: 2.0.0-beta.12 - version: 2.0.0-beta.12 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/cookies: devDependencies: @@ -292,8 +292,8 @@ importers: version: link:../utils devDependencies: solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/devices: devDependencies: @@ -308,8 +308,8 @@ importers: version: link:../utils devDependencies: solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/event-dispatcher: devDependencies: @@ -324,17 +324,17 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/event-props: devDependencies: solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/fetch: dependencies: @@ -387,8 +387,8 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(solid-js@2.0.0-beta.10) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) '@types/leaflet': specifier: ^1.9.8 version: 1.9.12 @@ -396,8 +396,8 @@ importers: specifier: ^1.9.4 version: 1.9.4 solid-js: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/gestures: devDependencies: @@ -483,8 +483,8 @@ importers: packages/input-mask: devDependencies: solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/interaction: dependencies: @@ -493,11 +493,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/intersection-observer: dependencies: @@ -509,11 +509,11 @@ importers: specifier: workspace:^ version: link:../range '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/jsx-tokenizer: dependencies: @@ -538,11 +538,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/keyed: devDependencies: @@ -578,11 +578,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.12 - version: 2.0.0-beta.12(solid-js@2.0.0-beta.12) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.12 - version: 2.0.0-beta.12 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/map: dependencies: @@ -597,8 +597,8 @@ importers: packages/marker: devDependencies: solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/masonry: dependencies: @@ -610,8 +610,8 @@ importers: specifier: workspace:^ version: link:../media solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/match: devDependencies: @@ -635,11 +635,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/memo: dependencies: @@ -648,11 +648,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/mouse: dependencies: @@ -689,11 +689,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/orientation: dependencies: @@ -702,11 +702,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/page-visibility: dependencies: @@ -743,11 +743,11 @@ importers: packages/platform: devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/pointer: dependencies: @@ -762,11 +762,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/presence: dependencies: @@ -775,8 +775,8 @@ importers: version: link:../utils devDependencies: solid-js: - specifier: ^2.0.0-beta.12 - version: 2.0.0-beta.13 + specifier: ^2.0.0-beta.14 + version: 2.0.0-beta.14 packages/promise: dependencies: @@ -805,11 +805,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/range: dependencies: @@ -831,14 +831,14 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 solid-transition-group: specifier: ^0.2.3 - version: 0.2.3(solid-js@2.0.0-beta.13) + version: 0.2.3(solid-js@2.0.0-beta.14) packages/resize-observer: dependencies: @@ -856,11 +856,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/resource: devDependencies: @@ -875,11 +875,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/scheduled: devDependencies: @@ -890,20 +890,20 @@ importers: specifier: workspace:^ version: link:../timer '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/script-loader: devDependencies: '@solidjs/web': - specifier: ^2.0.0-beta.12 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: ^2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: ^2.0.0-beta.12 - version: 2.0.0-beta.13 + specifier: ^2.0.0-beta.14 + version: 2.0.0-beta.14 packages/scroll: dependencies: @@ -921,11 +921,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.12 - version: 2.0.0-beta.12(solid-js@2.0.0-beta.12) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.12 - version: 2.0.0-beta.12 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/selection: devDependencies: @@ -988,11 +988,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/storage: dependencies: @@ -1027,11 +1027,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/timer: devDependencies: @@ -1058,20 +1058,20 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/tween: devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/upload: dependencies: @@ -1086,11 +1086,11 @@ importers: packages/utils: devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/vibrate: dependencies: @@ -1099,11 +1099,11 @@ importers: version: link:../utils devDependencies: '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/virtual: dependencies: @@ -1115,14 +1115,14 @@ importers: specifier: ^7.27.0 version: 7.27.4 '@solidjs/web': - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) babel-preset-solid: - specifier: 2.0.0-beta.10 - version: 2.0.0-beta.10(@babel/core@7.27.4)(solid-js@2.0.0-beta.13) + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(@babel/core@7.27.4)(solid-js@2.0.0-beta.14) solid-js: - specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/websocket: devDependencies: @@ -1191,13 +1191,13 @@ importers: version: link:../packages/utils '@solidjs/web': specifier: 2.0.0-beta.13 - version: 2.0.0-beta.13(solid-js@2.0.0-beta.10) + version: 2.0.0-beta.13(solid-js@2.0.0-beta.14) '@tanstack/solid-router': specifier: ^2.0.0-beta.17 - version: 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10) + version: 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) '@tanstack/solid-start': specifier: ^2.0.0-beta.17 - version: 2.0.0-beta.18(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + version: 2.0.0-beta.18(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) clsx: specifier: ^2.0.0 version: 2.1.1 @@ -1258,7 +1258,7 @@ importers: version: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) vite-plugin-solid: specifier: 3.0.0-next.5 - version: 3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + version: 3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) packages: @@ -2725,21 +2725,19 @@ packages: '@solidjs/signals@2.0.0-beta.13': resolution: {integrity: sha512-jc+wLRK+eyUFerH8Mjed4HikdJwz3z95TT7tqyG+K00IV9jfgZWvR1nZDUEZc6kXffmtW/z+w6PNn62ea5KjIw==} - '@solidjs/web@2.0.0-beta.10': - resolution: {integrity: sha512-Ox7MBv19kuxHoHhWoLCCcc6aykSgaqzWvWT7RB66VqlFnQ8Lid2ncd30g5L4XC0GB+MN/WZVb68tiYrAFUDIAg==} - peerDependencies: - solid-js: ^2.0.0-beta.10 - - '@solidjs/web@2.0.0-beta.12': - resolution: {integrity: sha512-Wc+/LctUqfNQs98VnijoEu4gWFOSu/kUcZiBIjQ+S9ZUuT6Z77CRkmiZ0C8dyOhNPbTgpU2JYH6B5wqY2eqS0A==} - peerDependencies: - solid-js: ^2.0.0-beta.12 + '@solidjs/signals@2.0.0-beta.14': + resolution: {integrity: sha512-y72nYtD7ogwX/UR5g2Y+meyeO6Q/xbQGtmvVTQX6USkMwEGOMnytqDnHj5amUzD7Fzqg32svwtCSx/q8hsOXAA==} '@solidjs/web@2.0.0-beta.13': resolution: {integrity: sha512-ugSnWcNc18osJZ24+op7mQpm6LlyHSgTnvSaYqEwL9PVmLxXpmAS7/dt5nc7MLLZtwgf1J1rmRfZb7mT8fTL2w==} peerDependencies: solid-js: ^2.0.0-beta.13 + '@solidjs/web@2.0.0-beta.14': + resolution: {integrity: sha512-iYqLqYapbnYBxbX9WspujYBdFHM1HND+Pd0p18vXHHlhYi42oBmIayxH4JsqPA+abe19nnpjXLmv03X2/IpmVQ==} + peerDependencies: + solid-js: ^2.0.0-beta.14 + '@supabase/auth-js@2.67.3': resolution: {integrity: sha512-NJDaW8yXs49xMvWVOkSIr8j46jf+tYHV0wHhrwOaLLMZSFO4g6kKAf+MfzQ2RaD06OCUkUHIzctLAxjTgEVpzw==} @@ -3202,8 +3200,8 @@ packages: peerDependencies: '@babel/core': ^7.20.12 - babel-plugin-jsx-dom-expressions@0.50.0-next.6: - resolution: {integrity: sha512-D7SSrMu1EupiCFT3hBhWJj0EWzaI27HV1ysbLSKFcH1ROZe61DmnNVchrnr5QeAw5O8bqSdlMDLdEqMYzi4tTA==} + babel-plugin-jsx-dom-expressions@0.50.0-next.13: + resolution: {integrity: sha512-ANjSohrXkRTxqFOENz5vk57UEjLHx4lqOibSXmNZ51aNvzZ7zT22JB+kpv9AutPzhy7tcJaNtnLoq6yqlTZTzw==} peerDependencies: '@babel/core': ^7.20.12 @@ -3224,20 +3222,20 @@ packages: solid-js: optional: true - babel-preset-solid@2.0.0-beta.10: - resolution: {integrity: sha512-lzGgPsh1fVtBJDl+UWLTCgimzPMda7X2Xzq7asCCOq/zHRwiF5vF3Eb3xj65dGyi7YpgVROTwJEpj+XiroKaww==} + babel-preset-solid@2.0.0-beta.13: + resolution: {integrity: sha512-VX5fa4b6Sn92v+vFw3ITEvDv0f5vZZZhGgGcqYaAzjP7RF45+VZcZBoG0pHwCGA7UfXdYLUQuqXb4tG1uV3cQA==} peerDependencies: '@babel/core': ^7.0.0 - solid-js: ^2.0.0-beta.10 + solid-js: ^2.0.0-beta.13 peerDependenciesMeta: solid-js: optional: true - babel-preset-solid@2.0.0-beta.13: - resolution: {integrity: sha512-VX5fa4b6Sn92v+vFw3ITEvDv0f5vZZZhGgGcqYaAzjP7RF45+VZcZBoG0pHwCGA7UfXdYLUQuqXb4tG1uV3cQA==} + babel-preset-solid@2.0.0-beta.14: + resolution: {integrity: sha512-l0eX4t+vYmANQqEbRWz0d7b9zt2SybxX7/PfA5cyWGphSGiMtGahFT6XHXktDd8x16o5t1DyPIl7yfa/HAho3A==} peerDependencies: '@babel/core': ^7.0.0 - solid-js: ^2.0.0-beta.13 + solid-js: ^2.0.0-beta.14 peerDependenciesMeta: solid-js: optional: true @@ -5339,15 +5337,12 @@ packages: solid-js@1.9.7: resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} - solid-js@2.0.0-beta.10: - resolution: {integrity: sha512-EAfV6b1SC4c3wEBAoX4dMy063uTb4nfL5uXnN8yse4InH7RTw1LoB0I9HAy+pj3/GHqQE2tYZurlZtqU4pGyog==} - - solid-js@2.0.0-beta.12: - resolution: {integrity: sha512-UJC4gc0Dgbm6BTBFhUdrfIEXiQ/jaQuUGxYfZnEkywwD5FX16MhlM/e6bq2+94mhXUExYI9VJoGBh7CpOZ/1XA==} - solid-js@2.0.0-beta.13: resolution: {integrity: sha512-uAknr7Xkn25zAufBrYko4eOCbcg/gkrwnmE9KVb2Kb3vVZw2ibqseNxpjslnwJkT4gFScmFniqJtzRp7vO2klA==} + solid-js@2.0.0-beta.14: + resolution: {integrity: sha512-gbbvlxhs1GgL1IsnwHNtkTCRBBQcIDMwznBw3T05iYvP+fuUKMyIPku+ZLjeALyX4RaSLR99JSL6NttyHsYb8Q==} + solid-refresh@0.8.0-next.7: resolution: {integrity: sha512-fqkPRAeiE0tqfo2ZljeQBIXwfYssU2w1FmaWFrXmnV33B/CfGfez7BjtOF0Y1/orUNRXI/DZcJlJThHllcCMsA==} peerDependencies: @@ -7609,160 +7604,156 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@solid-devtools/debugger@0.28.1(solid-js@2.0.0-beta.10)': + '@solid-devtools/debugger@0.28.1(solid-js@2.0.0-beta.14)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-beta.10) - '@solid-primitives/bounds': 0.1.5(solid-js@2.0.0-beta.10) - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.10) - '@solid-primitives/keyboard': 1.3.5(solid-js@2.0.0-beta.10) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.10) - '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-beta.10) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.10) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.10) - solid-js: 2.0.0-beta.10 - - '@solid-devtools/logger@0.9.11(solid-js@2.0.0-beta.10)': + '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-beta.14) + '@solid-primitives/bounds': 0.1.5(solid-js@2.0.0-beta.14) + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.14) + '@solid-primitives/keyboard': 1.3.5(solid-js@2.0.0-beta.14) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.14) + '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-beta.14) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.14) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 + + '@solid-devtools/logger@0.9.11(solid-js@2.0.0-beta.14)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-devtools/debugger': 0.28.1(solid-js@2.0.0-beta.10) - '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-beta.10) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.10) - solid-js: 2.0.0-beta.10 + '@solid-devtools/debugger': 0.28.1(solid-js@2.0.0-beta.14) + '@solid-devtools/shared': 0.20.0(solid-js@2.0.0-beta.14) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 - '@solid-devtools/shared@0.20.0(solid-js@2.0.0-beta.10)': + '@solid-devtools/shared@0.20.0(solid-js@2.0.0-beta.14)': dependencies: '@nothing-but/utils': 0.17.0 - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.10) - '@solid-primitives/media': 2.3.5(solid-js@2.0.0-beta.10) - '@solid-primitives/refs': 1.1.3(solid-js@2.0.0-beta.10) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.10) - '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-beta.10) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.10) - '@solid-primitives/styles': 0.1.3(solid-js@2.0.0-beta.10) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.10) - solid-js: 2.0.0-beta.10 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.14) + '@solid-primitives/media': 2.3.5(solid-js@2.0.0-beta.14) + '@solid-primitives/refs': 1.1.3(solid-js@2.0.0-beta.14) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.14) + '@solid-primitives/scheduled': 1.5.3(solid-js@2.0.0-beta.14) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.14) + '@solid-primitives/styles': 0.1.3(solid-js@2.0.0-beta.14) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 - '@solid-primitives/bounds@0.1.5(solid-js@2.0.0-beta.10)': + '@solid-primitives/bounds@0.1.5(solid-js@2.0.0-beta.14)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.10) - '@solid-primitives/resize-observer': 2.1.5(solid-js@2.0.0-beta.10) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.10) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.10) - solid-js: 2.0.0-beta.10 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.14) + '@solid-primitives/resize-observer': 2.1.5(solid-js@2.0.0-beta.14) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.14) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 - '@solid-primitives/event-listener@2.4.5(solid-js@2.0.0-beta.10)': + '@solid-primitives/event-listener@2.4.5(solid-js@2.0.0-beta.14)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.10) - solid-js: 2.0.0-beta.10 + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 - '@solid-primitives/keyboard@1.3.5(solid-js@2.0.0-beta.10)': + '@solid-primitives/keyboard@1.3.5(solid-js@2.0.0-beta.14)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.10) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.10) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.10) - solid-js: 2.0.0-beta.10 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.14) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.14) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 - '@solid-primitives/media@2.3.5(solid-js@2.0.0-beta.10)': + '@solid-primitives/media@2.3.5(solid-js@2.0.0-beta.14)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.10) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.10) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.10) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.10) - solid-js: 2.0.0-beta.10 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.14) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.14) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.14) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 '@solid-primitives/refs@1.0.8(solid-js@1.9.7)': dependencies: '@solid-primitives/utils': 6.2.3(solid-js@1.9.7) solid-js: 1.9.7 - '@solid-primitives/refs@1.0.8(solid-js@2.0.0-beta.13)': + '@solid-primitives/refs@1.0.8(solid-js@2.0.0-beta.14)': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + '@solid-primitives/utils': 6.2.3(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 - '@solid-primitives/refs@1.1.3(solid-js@2.0.0-beta.10)': + '@solid-primitives/refs@1.1.3(solid-js@2.0.0-beta.14)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.10) - solid-js: 2.0.0-beta.10 + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 - '@solid-primitives/resize-observer@2.1.5(solid-js@2.0.0-beta.10)': + '@solid-primitives/resize-observer@2.1.5(solid-js@2.0.0-beta.14)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.10) - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.10) - '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.10) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.10) - solid-js: 2.0.0-beta.10 + '@solid-primitives/event-listener': 2.4.5(solid-js@2.0.0-beta.14) + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.14) + '@solid-primitives/static-store': 0.1.3(solid-js@2.0.0-beta.14) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 - '@solid-primitives/rootless@1.5.3(solid-js@2.0.0-beta.10)': + '@solid-primitives/rootless@1.5.3(solid-js@2.0.0-beta.14)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.10) - solid-js: 2.0.0-beta.10 + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 - '@solid-primitives/scheduled@1.5.3(solid-js@2.0.0-beta.10)': + '@solid-primitives/scheduled@1.5.3(solid-js@2.0.0-beta.14)': dependencies: - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.14 - '@solid-primitives/static-store@0.1.3(solid-js@2.0.0-beta.10)': + '@solid-primitives/static-store@0.1.3(solid-js@2.0.0-beta.14)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.10) - solid-js: 2.0.0-beta.10 + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 - '@solid-primitives/styles@0.1.3(solid-js@2.0.0-beta.10)': + '@solid-primitives/styles@0.1.3(solid-js@2.0.0-beta.14)': dependencies: - '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.10) - '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.10) - solid-js: 2.0.0-beta.10 + '@solid-primitives/rootless': 1.5.3(solid-js@2.0.0-beta.14) + '@solid-primitives/utils': 6.4.0(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 '@solid-primitives/transition-group@1.0.5(solid-js@1.9.7)': dependencies: solid-js: 1.9.7 - '@solid-primitives/transition-group@1.0.5(solid-js@2.0.0-beta.13)': + '@solid-primitives/transition-group@1.0.5(solid-js@2.0.0-beta.14)': dependencies: - solid-js: 2.0.0-beta.13 + solid-js: 2.0.0-beta.14 '@solid-primitives/utils@6.2.3(solid-js@1.9.7)': dependencies: solid-js: 1.9.7 - '@solid-primitives/utils@6.2.3(solid-js@2.0.0-beta.13)': + '@solid-primitives/utils@6.2.3(solid-js@2.0.0-beta.14)': dependencies: - solid-js: 2.0.0-beta.13 + solid-js: 2.0.0-beta.14 - '@solid-primitives/utils@6.4.0(solid-js@2.0.0-beta.10)': + '@solid-primitives/utils@6.4.0(solid-js@2.0.0-beta.14)': dependencies: - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.14 - '@solidjs/meta@0.29.4(solid-js@2.0.0-beta.10)': + '@solidjs/meta@0.29.4(solid-js@2.0.0-beta.14)': dependencies: - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.14 '@solidjs/signals@2.0.0-beta.13': {} - '@solidjs/web@2.0.0-beta.10(solid-js@2.0.0-beta.10)': - dependencies: - seroval: 1.5.4 - seroval-plugins: 1.5.4(seroval@1.5.4) - solid-js: 2.0.0-beta.10 + '@solidjs/signals@2.0.0-beta.14': {} - '@solidjs/web@2.0.0-beta.12(solid-js@2.0.0-beta.12)': + '@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.13)': dependencies: seroval: 1.5.4 seroval-plugins: 1.5.4(seroval@1.5.4) - solid-js: 2.0.0-beta.12 + solid-js: 2.0.0-beta.13 - '@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10)': + '@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14)': dependencies: seroval: 1.5.4 seroval-plugins: 1.5.4(seroval@1.5.4) - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.14 - '@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.13)': + '@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14)': dependencies: seroval: 1.5.4 seroval-plugins: 1.5.4(seroval@1.5.4) - solid-js: 2.0.0-beta.13 + solid-js: 2.0.0-beta.14 '@supabase/auth-js@2.67.3': dependencies: @@ -7840,7 +7831,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.167.12(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/router-plugin@1.167.12(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -7857,7 +7848,7 @@ snapshots: zod: 3.25.63 optionalDependencies: vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) - vite-plugin-solid: 3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + vite-plugin-solid: 3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) transitivePeerDependencies: - supports-color @@ -7875,48 +7866,48 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/solid-router@2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)': + '@tanstack/solid-router@2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)': dependencies: - '@solid-devtools/logger': 0.9.11(solid-js@2.0.0-beta.10) - '@solidjs/meta': 0.29.4(solid-js@2.0.0-beta.10) - '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.10) + '@solid-devtools/logger': 0.9.11(solid-js@2.0.0-beta.14) + '@solidjs/meta': 0.29.4(solid-js@2.0.0-beta.14) + '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.14) '@tanstack/history': 1.161.6 '@tanstack/router-core': 1.168.9 isbot: 5.1.40 - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.14 - '@tanstack/solid-start-client@2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)': + '@tanstack/solid-start-client@2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)': dependencies: - '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.10) + '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.14) '@tanstack/router-core': 1.168.9 - '@tanstack/solid-router': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10) + '@tanstack/solid-router': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) '@tanstack/start-client-core': 1.167.9 - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.14 - '@tanstack/solid-start-server@2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)': + '@tanstack/solid-start-server@2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)': dependencies: - '@solidjs/meta': 0.29.4(solid-js@2.0.0-beta.10) - '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.10) + '@solidjs/meta': 0.29.4(solid-js@2.0.0-beta.14) + '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.14) '@tanstack/history': 1.161.6 '@tanstack/router-core': 1.168.9 - '@tanstack/solid-router': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10) + '@tanstack/solid-router': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) '@tanstack/start-client-core': 1.167.9 '@tanstack/start-server-core': 1.167.9 - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.14 transitivePeerDependencies: - crossws - '@tanstack/solid-start@2.0.0-beta.18(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/solid-start@2.0.0-beta.18(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': dependencies: - '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.10) - '@tanstack/solid-router': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10) - '@tanstack/solid-start-client': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10) - '@tanstack/solid-start-server': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10) + '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.14) + '@tanstack/solid-router': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) + '@tanstack/solid-start-client': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) + '@tanstack/solid-start-server': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) '@tanstack/start-client-core': 1.167.9 - '@tanstack/start-plugin-core': 1.167.17(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/start-plugin-core': 1.167.17(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) '@tanstack/start-server-core': 1.167.9 pathe: 2.0.3 - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.14 vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) transitivePeerDependencies: - '@rsbuild/core' @@ -7935,7 +7926,7 @@ snapshots: '@tanstack/start-fn-stubs@1.161.6': {} - '@tanstack/start-plugin-core@1.167.17(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/start-plugin-core@1.167.17(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -7943,7 +7934,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.168.9 '@tanstack/router-generator': 1.166.24 - '@tanstack/router-plugin': 1.167.12(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/router-plugin': 1.167.12(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.9 '@tanstack/start-server-core': 1.167.9 @@ -8371,16 +8362,6 @@ snapshots: html-entities: 2.3.3 parse5: 7.3.0 - babel-plugin-jsx-dom-expressions@0.50.0-next.11(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.4) - '@babel/types': 7.29.0 - html-entities: 2.3.3 - parse5: 7.3.0 - validate-html-nesting: 1.2.4 - babel-plugin-jsx-dom-expressions@0.50.0-next.11(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 @@ -8391,7 +8372,7 @@ snapshots: parse5: 7.3.0 validate-html-nesting: 1.2.4 - babel-plugin-jsx-dom-expressions@0.50.0-next.6(@babel/core@7.27.4): + babel-plugin-jsx-dom-expressions@0.50.0-next.13(@babel/core@7.27.4): dependencies: '@babel/core': 7.27.4 '@babel/helper-module-imports': 7.18.6 @@ -8436,33 +8417,26 @@ snapshots: transitivePeerDependencies: - supports-color - babel-preset-solid@1.9.12(@babel/core@7.27.4)(solid-js@2.0.0-beta.10): + babel-preset-solid@1.9.12(@babel/core@7.27.4)(solid-js@2.0.0-beta.14): dependencies: '@babel/core': 7.27.4 babel-plugin-jsx-dom-expressions: 0.40.7(@babel/core@7.27.4) optionalDependencies: - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.14 - babel-preset-solid@2.0.0-beta.10(@babel/core@7.27.4)(solid-js@2.0.0-beta.13): + babel-preset-solid@2.0.0-beta.13(@babel/core@7.29.0)(solid-js@2.0.0-beta.14): dependencies: - '@babel/core': 7.27.4 - babel-plugin-jsx-dom-expressions: 0.50.0-next.6(@babel/core@7.27.4) + '@babel/core': 7.29.0 + babel-plugin-jsx-dom-expressions: 0.50.0-next.11(@babel/core@7.29.0) optionalDependencies: - solid-js: 2.0.0-beta.13 + solid-js: 2.0.0-beta.14 - babel-preset-solid@2.0.0-beta.13(@babel/core@7.27.4)(solid-js@2.0.0-beta.10): + babel-preset-solid@2.0.0-beta.14(@babel/core@7.27.4)(solid-js@2.0.0-beta.14): dependencies: '@babel/core': 7.27.4 - babel-plugin-jsx-dom-expressions: 0.50.0-next.11(@babel/core@7.27.4) + babel-plugin-jsx-dom-expressions: 0.50.0-next.13(@babel/core@7.27.4) optionalDependencies: - solid-js: 2.0.0-beta.10 - - babel-preset-solid@2.0.0-beta.13(@babel/core@7.29.0)(solid-js@2.0.0-beta.10): - dependencies: - '@babel/core': 7.29.0 - babel-plugin-jsx-dom-expressions: 0.50.0-next.11(@babel/core@7.29.0) - optionalDependencies: - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.14 bail@2.0.2: {} @@ -8917,13 +8891,13 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild-plugin-solid@0.6.0(esbuild@0.25.5)(solid-js@2.0.0-beta.10): + esbuild-plugin-solid@0.6.0(esbuild@0.25.5)(solid-js@2.0.0-beta.14): dependencies: '@babel/core': 7.27.4 '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) - babel-preset-solid: 1.9.12(@babel/core@7.27.4)(solid-js@2.0.0-beta.10) + babel-preset-solid: 1.9.12(@babel/core@7.27.4)(solid-js@2.0.0-beta.14) esbuild: 0.25.5 - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.14 transitivePeerDependencies: - supports-color @@ -10798,32 +10772,25 @@ snapshots: seroval: 1.3.2 seroval-plugins: 1.3.2(seroval@1.3.2) - solid-js@2.0.0-beta.10: - dependencies: - '@solidjs/signals': 2.0.0-beta.13 - csstype: 3.1.3 - seroval: 1.5.4 - seroval-plugins: 1.5.4(seroval@1.5.4) - - solid-js@2.0.0-beta.12: + solid-js@2.0.0-beta.13: dependencies: '@solidjs/signals': 2.0.0-beta.13 csstype: 3.1.3 seroval: 1.5.4 seroval-plugins: 1.5.4(seroval@1.5.4) - solid-js@2.0.0-beta.13: + solid-js@2.0.0-beta.14: dependencies: - '@solidjs/signals': 2.0.0-beta.13 + '@solidjs/signals': 2.0.0-beta.14 csstype: 3.1.3 seroval: 1.5.4 seroval-plugins: 1.5.4(seroval@1.5.4) - solid-refresh@0.8.0-next.7(solid-js@2.0.0-beta.10): + solid-refresh@0.8.0-next.7(solid-js@2.0.0-beta.14): dependencies: '@babel/generator': 7.29.1 '@babel/types': 7.29.0 - solid-js: 2.0.0-beta.10 + solid-js: 2.0.0-beta.14 solid-transition-group@0.2.3(solid-js@1.9.7): dependencies: @@ -10831,11 +10798,11 @@ snapshots: '@solid-primitives/transition-group': 1.0.5(solid-js@1.9.7) solid-js: 1.9.7 - solid-transition-group@0.2.3(solid-js@2.0.0-beta.13): + solid-transition-group@0.2.3(solid-js@2.0.0-beta.14): dependencies: - '@solid-primitives/refs': 1.0.8(solid-js@2.0.0-beta.13) - '@solid-primitives/transition-group': 1.0.5(solid-js@2.0.0-beta.13) - solid-js: 2.0.0-beta.13 + '@solid-primitives/refs': 1.0.8(solid-js@2.0.0-beta.14) + '@solid-primitives/transition-group': 1.0.5(solid-js@2.0.0-beta.14) + solid-js: 2.0.0-beta.14 source-map-js@1.2.1: {} @@ -11200,31 +11167,31 @@ snapshots: - supports-color - terser - vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.10(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)): + vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)): dependencies: '@babel/core': 7.29.0 - '@solidjs/web': 2.0.0-beta.10(solid-js@2.0.0-beta.10) + '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.14) '@types/babel__core': 7.20.5 - babel-preset-solid: 2.0.0-beta.13(@babel/core@7.29.0)(solid-js@2.0.0-beta.10) + babel-preset-solid: 2.0.0-beta.13(@babel/core@7.29.0)(solid-js@2.0.0-beta.14) merge-anything: 5.1.7 - solid-js: 2.0.0-beta.10 - solid-refresh: 0.8.0-next.7(solid-js@2.0.0-beta.10) - vite: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) - vitefu: 1.1.3(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + solid-js: 2.0.0-beta.14 + solid-refresh: 0.8.0-next.7(solid-js@2.0.0-beta.14) + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + vitefu: 1.1.3(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) transitivePeerDependencies: - supports-color - vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.10))(solid-js@2.0.0-beta.10)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)): + vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)): dependencies: '@babel/core': 7.29.0 - '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.10) + '@solidjs/web': 2.0.0-beta.14(solid-js@2.0.0-beta.14) '@types/babel__core': 7.20.5 - babel-preset-solid: 2.0.0-beta.13(@babel/core@7.29.0)(solid-js@2.0.0-beta.10) + babel-preset-solid: 2.0.0-beta.13(@babel/core@7.29.0)(solid-js@2.0.0-beta.14) merge-anything: 5.1.7 - solid-js: 2.0.0-beta.10 - solid-refresh: 0.8.0-next.7(solid-js@2.0.0-beta.10) - vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) - vitefu: 1.1.3(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + solid-js: 2.0.0-beta.14 + solid-refresh: 0.8.0-next.7(solid-js@2.0.0-beta.14) + vite: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + vitefu: 1.1.3(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) transitivePeerDependencies: - supports-color From 74d351714c268c0d1e504040e7164d3449551f7f Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Sat, 6 Jun 2026 13:57:36 -0400 Subject: [PATCH 4/5] Added deep documentation differences --- packages/deep/README.md | 29 +++++++++++++++++++++++++++++ pnpm-lock.yaml | 9 ++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/packages/deep/README.md b/packages/deep/README.md index 7c5a002a6..45e5a88ca 100644 --- a/packages/deep/README.md +++ b/packages/deep/README.md @@ -14,6 +14,35 @@ Primitives for tracking and observing nested reactive objects in Solid. - [`trackStore`](#trackstore) - A more performant alternative to `trackDeep` utilizing specific store implementations. - [`captureStoreUpdates`](#capturestoreupdates) - A utility function that captures all updates to a store and returns them as an array. +## Comparison with Solid's built-in `deep` + +Solid 2.0 ships a `deep` helper in `solid-js` that tracks all nested properties of a store and returns a **plain snapshot** — a non-reactive copy suitable for serialization: + +```ts +import { deep } from "solid-js"; + +createEffect( + () => deep(store), + snapshot => localStorage.setItem("state", JSON.stringify(snapshot)) +); +``` + +This package complements that with three distinct utilities: + +| | Solid's `deep` | `trackDeep` | `trackStore` | `captureStoreUpdates` | +|---|---|---|---|---| +| Tracks all nested changes | ✓ | ✓ | ✓ | ✓ | +| Returns live store proxy | — | ✓ | ✓ | — | +| Returns plain snapshot | ✓ | — | — | — | +| Works on plain objects wrapping stores | — | ✓ | — | — | +| Reports what changed and where | — | — | — | ✓ | + +**Use Solid's `deep`** when you want to observe all changes and immediately consume a serializable value (e.g. persist to localStorage, send over the wire). + +**Use `trackDeep` or `trackStore`** when you need the live reactive proxy back — for example, to pass it reactively to another primitive, or when you want to decide what to do with the store rather than serialize it immediately. `trackStore` is preferred for large or frequently updated stores due to its use of memoized structural subscriptions; `trackDeep` additionally accepts plain objects that contain stores. + +**Use `captureStoreUpdates`** when you need to know _what_ changed and _where_ — it returns an array of `{ path, value }` deltas since the last call. Solid's `deep` has no equivalent for this. + ## Installation ```bash diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e8012e803..5e98696f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -302,9 +302,12 @@ importers: specifier: workspace:^ version: link:../memo devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13(solid-js@2.0.0-beta.13) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.13 + version: 2.0.0-beta.13 packages/destructure: dependencies: @@ -12198,7 +12201,7 @@ snapshots: solid-js@2.0.0-beta.13: dependencies: '@solidjs/signals': 2.0.0-beta.14 - csstype: 3.1.3 + csstype: 3.2.3 seroval: 1.5.2 seroval-plugins: 1.5.2(seroval@1.5.2) From 015f99ed9faf4dfac7abadeda561921f938ec509 Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Sat, 6 Jun 2026 14:09:59 -0400 Subject: [PATCH 5/5] Added stories --- packages/deep/README.md | 4 - packages/deep/dev/index.tsx | 86 ------- packages/deep/package.json | 1 - packages/deep/stories/deep.stories.tsx | 334 +++++++++++++++++++++++++ 4 files changed, 334 insertions(+), 91 deletions(-) delete mode 100644 packages/deep/dev/index.tsx create mode 100644 packages/deep/stories/deep.stories.tsx diff --git a/packages/deep/README.md b/packages/deep/README.md index 45e5a88ca..75de83bd9 100644 --- a/packages/deep/README.md +++ b/packages/deep/README.md @@ -192,10 +192,6 @@ createEffect( ); ``` -### Demo - -See a demo of this primitive in action [here](https://primitives.solidjs.community/playground/deep). - ## Changelog See [CHANGELOG.md](./CHANGELOG.md) diff --git a/packages/deep/dev/index.tsx b/packages/deep/dev/index.tsx deleted file mode 100644 index acf79322e..000000000 --- a/packages/deep/dev/index.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { For, createMemo } from "solid-js"; -import { createStore, produce } from "solid-js/store"; -import { captureStoreUpdates } from "../src/index.js"; - -type TodoItem = { title: string; done: boolean }; - -const App = () => { - const [state, setState] = createStore({ - new: { title: "" }, - todos: [] as TodoItem[], - }); - - const updates = createMemo(captureStoreUpdates(state)); - - return ( -
-
-

Simple Todos Example

-
{ - e.preventDefault(); - setState( - produce(proxy => { - proxy.todos.push({ - title: proxy.new.title, - done: false, - }); - proxy.new.title = ""; - }), - ); - }} - class="flex" - > - setState("new", "title", e.currentTarget.value)} - /> - -
- - {(todo, i) => ( -
- setState("todos", i(), "done", e.currentTarget.checked)} - /> - setState("todos", i(), "title", e.currentTarget.value)} - /> - -
- )} -
-
-
-

Latest updates:

-
    - {updates().map(update => ( -
  1. -
    Path: {JSON.stringify(update.path, null, 2)}
    -
    - Value:
    {JSON.stringify(update.value, null, 2)}
    -
    -
  2. - ))} -
-
-
- ); -}; - -export default App; diff --git a/packages/deep/package.json b/packages/deep/package.json index 6e2a32b33..b9eef63d7 100644 --- a/packages/deep/package.json +++ b/packages/deep/package.json @@ -52,7 +52,6 @@ }, "typesVersions": {}, "scripts": { - "dev": "node --import=@nothing-but/node-resolve-ts --experimental-transform-types ../../scripts/dev.ts", "build": "node --import=@nothing-but/node-resolve-ts --experimental-transform-types ../../scripts/build.ts", "vitest": "vitest -c ../../configs/vitest.config.ts", "test": "pnpm run vitest", diff --git a/packages/deep/stories/deep.stories.tsx b/packages/deep/stories/deep.stories.tsx new file mode 100644 index 000000000..8076b5306 --- /dev/null +++ b/packages/deep/stories/deep.stories.tsx @@ -0,0 +1,334 @@ +import { createEffect, createSignal, For, Show } from "solid-js"; +import { createStore } from "solid-js"; +import preview from "../../../.storybook/preview.js"; +import { captureStoreUpdates, trackDeep, trackStore } from "@solid-primitives/deep"; +import readme from "../README.md?raw"; +import { + Button, + Container, + Section, + Separator, + StatRow, + TextField, + colors, + font, + radii, +} from "../../../.storybook/ui/index.js"; + +const meta = preview.meta({ + title: "Reactivity/Deep", + tags: ["autodocs"], + parameters: { + layout: "centered", + docs: { + description: { + component: readme, + }, + }, + }, +}); + +export default meta; + +// ─── trackDeep ─────────────────────────────────────────────────────────────── + +export const TrackDeepMultiple = meta.story({ + name: "One effect, two stores", + parameters: { + docs: { + description: { + story: + "`trackDeep` accepts any wrappable structure — not just a store proxy but any plain object or array containing store nodes. Here two independent stores (`user` and `prefs`) are bundled into a single plain object and subscribed with one `createEffect`. Any mutation to either store fires the effect. `trackStore` cannot do this — it requires a store proxy at the root.", + }, + }, + }, + render: () => { + const [user, setUser] = createStore({ name: "Alice", email: "alice@example.com" }); + const [prefs, setPrefs] = createStore({ theme: "light" as "light" | "dark", notify: true }); + + const [saveCount, setSaveCount] = createSignal(0); + const [lastSave, setLastSave] = createSignal("—"); + + let ready = false; + createEffect( + () => trackDeep({ user, prefs }), + () => { + if (!ready) { + ready = true; + return; + } + setSaveCount(c => c + 1); + setLastSave(new Date().toLocaleTimeString()); + }, + ); + + return ( + +
+ setUser(s => { s.name = v; })} + /> + setUser(s => { s.email = v; })} + /> +
+
+
+ + +
+
+ +
+ + +
+
+ ); + }, +}); + +// ─── trackStore ────────────────────────────────────────────────────────────── + +export const TrackStoreWholeTree = meta.story({ + name: "Sync on any nested change", + parameters: { + docs: { + description: { + story: + "`trackStore` subscribes to every node in a store tree using Solid's internal `$TRACK` structural subscriptions, and memoizes a per-node accessor in a `WeakMap` so each node is only ever subscribed once regardless of how many effects share the same store. Edit the note, adjust a quantity, or add and remove items — any change at any depth fires the effect once.", + }, + }, + }, + render: () => { + const [cart, setCart] = createStore({ + items: [ + { name: "Widget", qty: 1 }, + { name: "Gadget", qty: 2 }, + ] as { name: string; qty: number }[], + note: "", + }); + + const [fireCount, setFireCount] = createSignal(0); + let nextId = 2; + + let ready = false; + createEffect( + () => trackStore(cart), + () => { + if (!ready) { + ready = true; + return; + } + setFireCount(c => c + 1); + }, + ); + + return ( + +
+ + {(item, i) => ( +
+ {item.name} + + + {item.qty} + + + +
+ )} +
+
+ setCart(s => { s.note = v; })} + placeholder="Special instructions…" + /> + + +
+ +
+
+ ); + }, +}); + +// ─── captureStoreUpdates ───────────────────────────────────────────────────── + +export const StoreDeltaStory = meta.story({ + name: "Which path changed?", + parameters: { + docs: { + description: { + story: + "`captureStoreUpdates(store)` returns a `getDelta()` function that, on each call, reports the `{ path, value }` pairs describing exactly which store nodes changed since the previous call. Wrap it in `createEffect` for a reactive delta stream — ideal for undo/redo stacks, selective sync, or change debugging. Toggle a task or rename one to see the path and the affected node.", + }, + }, + }, + render: () => { + const [board, setBoard] = createStore({ + tasks: [ + { id: 1, title: "Design", done: false }, + { id: 2, title: "Build", done: false }, + { id: 3, title: "Ship", done: false }, + ], + }); + + const getDelta = captureStoreUpdates(board); + + type DeltaEntry = { path: string; value: string }; + const [deltaLog, setDeltaLog] = createSignal([]); + let ready = false; + + createEffect( + () => getDelta(), + updates => { + if (!ready) { + ready = true; + return; + } + if (updates.length === 0) return; + setDeltaLog(prev => + [ + updates.map(u => ({ + path: `[${u.path.map(String).join(", ")}]`, + value: JSON.stringify(u.value, null, 2), + })), + ...prev, + ].slice(0, 4), + ); + }, + ); + + return ( + +
+ + {(task, i) => ( +
+ setBoard(s => { s.tasks[i()].done = !s.tasks[i()].done; })} + /> + setBoard(s => { s.tasks[i()].title = e.currentTarget.value; })} + style={{ + flex: 1, + border: `1px solid ${colors.border}`, + "border-radius": radii.sm, + padding: "0.25rem 0.4rem", + "font-size": font.sizeBase, + "font-family": font.system, + "text-decoration": task.done ? "line-through" : "none", + color: task.done ? colors.mutedFg : "inherit", + }} + /> +
+ )} +
+
+ +
+ 0} + fallback={ + + Make a change to see deltas… + + } + > + + {(entries, batchIndex) => ( +
+ + {entry => ( +
+ path + {entry.path} +
+                          {entry.value}
+                        
+
+ )} +
+
+ )} +
+
+
+
+ ); + }, +});