From 55b5a2602af7134d9f82e7a3992ef6043c9d6640 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sun, 6 Jul 2025 15:06:00 -0700 Subject: [PATCH 1/2] fix: make solid adapter behave more like how we'd expect --- packages/solid-store/src/index.tsx | 62 ++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/packages/solid-store/src/index.tsx b/packages/solid-store/src/index.tsx index 3897e533..44651697 100644 --- a/packages/solid-store/src/index.tsx +++ b/packages/solid-store/src/index.tsx @@ -1,5 +1,4 @@ -import { onCleanup } from 'solid-js' -import { createStore, reconcile } from 'solid-js/store' +import { createSignal, onCleanup } from 'solid-js' import type { Derived, Store } from '@tanstack/store' import type { Accessor } from 'solid-js' @@ -22,18 +21,65 @@ export function useStore>( store: Store | Derived, selector: (state: NoInfer) => TSelected = (d) => d as any, ): Accessor { - const [slice, setSlice] = createStore({ - value: selector(store.state), - }) + const [signal, setSignal] = createSignal(selector(store.state)) const unsub = store.subscribe(() => { - const newValue = selector(store.state) - setSlice('value', reconcile(newValue)) + const data = selector(store.state) + if (shallow(signal(), data)) { + return + } + setSignal(() => data) }) onCleanup(() => { unsub() }) - return () => slice.value + return signal +} + +export function shallow(objA: T, objB: T) { + if (Object.is(objA, objB)) { + return true + } + + if ( + typeof objA !== 'object' || + objA === null || + typeof objB !== 'object' || + objB === null + ) { + return false + } + + if (objA instanceof Map && objB instanceof Map) { + if (objA.size !== objB.size) return false + for (const [k, v] of objA) { + if (!objB.has(k) || !Object.is(v, objB.get(k))) return false + } + return true + } + + if (objA instanceof Set && objB instanceof Set) { + if (objA.size !== objB.size) return false + for (const v of objA) { + if (!objB.has(v)) return false + } + return true + } + + const keysA = Object.keys(objA) + if (keysA.length !== Object.keys(objB).length) { + return false + } + + for (let i = 0; i < keysA.length; i++) { + if ( + !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) || + !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T]) + ) { + return false + } + } + return true } From 5ec8ab4d5dded316cbb7c037809b45a0b7ec1dac Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sun, 6 Jul 2025 22:07:35 +0000 Subject: [PATCH 2/2] ci: apply automated fixes and generate docs --- .../solid/reference/functions/shallow.md | 32 +++++++++++++++++++ .../solid/reference/functions/usestore.md | 4 +-- docs/framework/solid/reference/index.md | 1 + 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 docs/framework/solid/reference/functions/shallow.md diff --git a/docs/framework/solid/reference/functions/shallow.md b/docs/framework/solid/reference/functions/shallow.md new file mode 100644 index 00000000..bcc1517e --- /dev/null +++ b/docs/framework/solid/reference/functions/shallow.md @@ -0,0 +1,32 @@ +--- +id: shallow +title: shallow +--- + + + +# Function: shallow() + +```ts +function shallow(objA, objB): boolean +``` + +Defined in: [index.tsx:41](https://github.com/TanStack/store/blob/main/packages/solid-store/src/index.tsx#L41) + +## Type Parameters + +• **T** + +## Parameters + +### objA + +`T` + +### objB + +`T` + +## Returns + +`boolean` diff --git a/docs/framework/solid/reference/functions/usestore.md b/docs/framework/solid/reference/functions/usestore.md index c69d28b4..86e40538 100644 --- a/docs/framework/solid/reference/functions/usestore.md +++ b/docs/framework/solid/reference/functions/usestore.md @@ -13,7 +13,7 @@ title: useStore function useStore(store, selector?): Accessor ``` -Defined in: [index.tsx:13](https://github.com/TanStack/store/blob/main/packages/solid-store/src/index.tsx#L13) +Defined in: [index.tsx:12](https://github.com/TanStack/store/blob/main/packages/solid-store/src/index.tsx#L12) ### Type Parameters @@ -41,7 +41,7 @@ Defined in: [index.tsx:13](https://github.com/TanStack/store/blob/main/packages/ function useStore(store, selector?): Accessor ``` -Defined in: [index.tsx:17](https://github.com/TanStack/store/blob/main/packages/solid-store/src/index.tsx#L17) +Defined in: [index.tsx:16](https://github.com/TanStack/store/blob/main/packages/solid-store/src/index.tsx#L16) ### Type Parameters diff --git a/docs/framework/solid/reference/index.md b/docs/framework/solid/reference/index.md index 73214416..a3531ff0 100644 --- a/docs/framework/solid/reference/index.md +++ b/docs/framework/solid/reference/index.md @@ -9,4 +9,5 @@ title: "@tanstack/solid-store" ## Functions +- [shallow](../functions/shallow.md) - [useStore](../functions/usestore.md)