@tanstack/solid-store
Advanced tools
@@ -6,6 +6,6 @@ "use strict"; | ||
| function useStore(store2, selector = (d) => d, options = {}) { | ||
| const [signal, setSignal] = solidJs.createSignal(selector(store2.state)); | ||
| const [signal, setSignal] = solidJs.createSignal(selector(store2.get())); | ||
| const equal = options.equal ?? shallow; | ||
| const unsub = store2.subscribe(() => { | ||
| const data = selector(store2.state); | ||
| const unsub = store2.subscribe((s) => { | ||
| const data = selector(s); | ||
| if (equal(signal(), data)) { | ||
@@ -15,3 +15,3 @@ return; | ||
| setSignal(() => data); | ||
| }); | ||
| }).unsubscribe; | ||
| solidJs.onCleanup(() => { | ||
@@ -18,0 +18,0 @@ unsub(); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.cjs","sources":["../../src/index.tsx"],"sourcesContent":["import { createSignal, onCleanup } from 'solid-js'\nimport type { Derived, Store } from '@tanstack/store'\nimport type { Accessor } from 'solid-js'\n\nexport * from '@tanstack/store'\n\n/**\n * @private\n */\nexport type NoInfer<T> = [T][T extends any ? 0 : never]\ntype EqualityFn<T> = (objA: T, objB: T) => boolean\ninterface UseStoreOptions<T> {\n equal?: EqualityFn<T>\n}\n\nexport function useStore<TState, TSelected = NoInfer<TState>>(\n store: Store<TState, any>,\n selector?: (state: NoInfer<TState>) => TSelected,\n options?: UseStoreOptions<TSelected>,\n): Accessor<TSelected>\nexport function useStore<TState, TSelected = NoInfer<TState>>(\n store: Derived<TState, any>,\n selector?: (state: NoInfer<TState>) => TSelected,\n options?: UseStoreOptions<TSelected>,\n): Accessor<TSelected>\nexport function useStore<TState, TSelected = NoInfer<TState>>(\n store: Store<TState, any> | Derived<TState, any>,\n selector: (state: NoInfer<TState>) => TSelected = (d) => d as any,\n options: UseStoreOptions<TSelected> = {},\n): Accessor<TSelected> {\n const [signal, setSignal] = createSignal(selector(store.state))\n const equal = options.equal ?? shallow\n\n const unsub = store.subscribe(() => {\n const data = selector(store.state)\n if (equal(signal(), data)) {\n return\n }\n setSignal(() => data)\n })\n\n onCleanup(() => {\n unsub()\n })\n\n return signal\n}\n\nexport function shallow<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false\n for (const [k, v] of objA) {\n if (!objB.has(k) || !Object.is(v, objB.get(k))) return false\n }\n return true\n }\n\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false\n for (const v of objA) {\n if (!objB.has(v)) return false\n }\n return true\n }\n\n if (objA instanceof Date && objB instanceof Date) {\n if (objA.getTime() !== objB.getTime()) return false\n return true\n }\n\n const keysA = Object.keys(objA)\n if (keysA.length !== Object.keys(objB).length) {\n return false\n }\n\n for (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n"],"names":["useStore","store","selector","d","options","signal","setSignal","createSignal","state","equal","shallow","unsub","subscribe","data","onCleanup","objA","objB","Object","is","Map","size","k","v","has","get","Set","Date","getTime","keysA","keys","length","i","prototype","hasOwnProperty","call"],"mappings":";;;;AAyBO,SAASA,SACdC,QACAC,WAAmDC,OAAMA,GACzDC,UAAsC,IACjB;AACrB,QAAM,CAACC,QAAQC,SAAS,IAAIC,QAAAA,aAAaL,SAASD,OAAMO,KAAK,CAAC;AAC9D,QAAMC,QAAQL,QAAQK,SAASC;AAE/B,QAAMC,QAAQV,OAAMW,UAAU,MAAM;AAClC,UAAMC,OAAOX,SAASD,OAAMO,KAAK;AACjC,QAAIC,MAAMJ,UAAUQ,IAAI,GAAG;AACzB;AAAA,IACF;AACAP,cAAU,MAAMO,IAAI;AAAA,EACtB,CAAC;AAEDC,UAAAA,UAAU,MAAM;AACdH,UAAAA;AAAAA,EACF,CAAC;AAED,SAAON;AACT;AAEO,SAASK,QAAWK,MAASC,MAAS;AAC3C,MAAIC,OAAOC,GAAGH,MAAMC,IAAI,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,MACE,OAAOD,SAAS,YAChBA,SAAS,QACT,OAAOC,SAAS,YAChBA,SAAS,MACT;AACA,WAAO;AAAA,EACT;AAEA,MAAID,gBAAgBI,OAAOH,gBAAgBG,KAAK;AAC9C,QAAIJ,KAAKK,SAASJ,KAAKI,KAAM,QAAO;AACpC,eAAW,CAACC,GAAGC,CAAC,KAAKP,MAAM;AACzB,UAAI,CAACC,KAAKO,IAAIF,CAAC,KAAK,CAACJ,OAAOC,GAAGI,GAAGN,KAAKQ,IAAIH,CAAC,CAAC,EAAG,QAAO;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAEA,MAAIN,gBAAgBU,OAAOT,gBAAgBS,KAAK;AAC9C,QAAIV,KAAKK,SAASJ,KAAKI,KAAM,QAAO;AACpC,eAAWE,KAAKP,MAAM;AACpB,UAAI,CAACC,KAAKO,IAAID,CAAC,EAAG,QAAO;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAEA,MAAIP,gBAAgBW,QAAQV,gBAAgBU,MAAM;AAChD,QAAIX,KAAKY,QAAAA,MAAcX,KAAKW,QAAAA,EAAW,QAAO;AAC9C,WAAO;AAAA,EACT;AAEA,QAAMC,QAAQX,OAAOY,KAAKd,IAAI;AAC9B,MAAIa,MAAME,WAAWb,OAAOY,KAAKb,IAAI,EAAEc,QAAQ;AAC7C,WAAO;AAAA,EACT;AAEA,WAASC,IAAI,GAAGA,IAAIH,MAAME,QAAQC,KAAK;AACrC,QACE,CAACd,OAAOe,UAAUC,eAAeC,KAAKlB,MAAMY,MAAMG,CAAC,CAAW,KAC9D,CAACd,OAAOC,GAAGH,KAAKa,MAAMG,CAAC,CAAY,GAAGf,KAAKY,MAAMG,CAAC,CAAY,CAAC,GAC/D;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;;;;;;;"} | ||
| {"version":3,"file":"index.cjs","sources":["../../src/index.tsx"],"sourcesContent":["import { createSignal, onCleanup } from 'solid-js'\nimport type { Accessor } from 'solid-js'\nimport type { Atom, ReadonlyAtom } from '@tanstack/store'\n\nexport * from '@tanstack/store'\n\ntype EqualityFn<T> = (objA: T, objB: T) => boolean\ninterface UseStoreOptions<T> {\n equal?: EqualityFn<T>\n}\n\nexport function useStore<TState, TSelected = NoInfer<TState>>(\n store: Atom<TState> | ReadonlyAtom<TState>,\n selector: (state: NoInfer<TState>) => TSelected = (d) => d as any,\n options: UseStoreOptions<TSelected> = {},\n): Accessor<TSelected> {\n const [signal, setSignal] = createSignal(selector(store.get()))\n const equal = options.equal ?? shallow\n\n const unsub = store.subscribe((s) => {\n const data = selector(s)\n if (equal(signal(), data)) {\n return\n }\n setSignal(() => data)\n }).unsubscribe\n\n onCleanup(() => {\n unsub()\n })\n\n return signal\n}\n\nexport function shallow<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false\n for (const [k, v] of objA) {\n if (!objB.has(k) || !Object.is(v, objB.get(k))) return false\n }\n return true\n }\n\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false\n for (const v of objA) {\n if (!objB.has(v)) return false\n }\n return true\n }\n\n if (objA instanceof Date && objB instanceof Date) {\n if (objA.getTime() !== objB.getTime()) return false\n return true\n }\n\n const keysA = Object.keys(objA)\n if (keysA.length !== Object.keys(objB).length) {\n return false\n }\n\n for (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n"],"names":["useStore","store","selector","d","options","signal","setSignal","createSignal","get","equal","shallow","unsub","subscribe","s","data","unsubscribe","onCleanup","objA","objB","Object","is","Map","size","k","v","has","Set","Date","getTime","keysA","keys","length","i","prototype","hasOwnProperty","call"],"mappings":";;;;AAWO,SAASA,SACdC,QACAC,WAAmDC,OAAMA,GACzDC,UAAsC,IACjB;AACrB,QAAM,CAACC,QAAQC,SAAS,IAAIC,QAAAA,aAAaL,SAASD,OAAMO,IAAAA,CAAK,CAAC;AAC9D,QAAMC,QAAQL,QAAQK,SAASC;AAE/B,QAAMC,QAAQV,OAAMW,UAAWC,CAAAA,MAAM;AACnC,UAAMC,OAAOZ,SAASW,CAAC;AACvB,QAAIJ,MAAMJ,UAAUS,IAAI,GAAG;AACzB;AAAA,IACF;AACAR,cAAU,MAAMQ,IAAI;AAAA,EACtB,CAAC,EAAEC;AAEHC,UAAAA,UAAU,MAAM;AACdL,UAAAA;AAAAA,EACF,CAAC;AAED,SAAON;AACT;AAEO,SAASK,QAAWO,MAASC,MAAS;AAC3C,MAAIC,OAAOC,GAAGH,MAAMC,IAAI,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,MACE,OAAOD,SAAS,YAChBA,SAAS,QACT,OAAOC,SAAS,YAChBA,SAAS,MACT;AACA,WAAO;AAAA,EACT;AAEA,MAAID,gBAAgBI,OAAOH,gBAAgBG,KAAK;AAC9C,QAAIJ,KAAKK,SAASJ,KAAKI,KAAM,QAAO;AACpC,eAAW,CAACC,GAAGC,CAAC,KAAKP,MAAM;AACzB,UAAI,CAACC,KAAKO,IAAIF,CAAC,KAAK,CAACJ,OAAOC,GAAGI,GAAGN,KAAKV,IAAIe,CAAC,CAAC,EAAG,QAAO;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAEA,MAAIN,gBAAgBS,OAAOR,gBAAgBQ,KAAK;AAC9C,QAAIT,KAAKK,SAASJ,KAAKI,KAAM,QAAO;AACpC,eAAWE,KAAKP,MAAM;AACpB,UAAI,CAACC,KAAKO,IAAID,CAAC,EAAG,QAAO;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAEA,MAAIP,gBAAgBU,QAAQT,gBAAgBS,MAAM;AAChD,QAAIV,KAAKW,QAAAA,MAAcV,KAAKU,QAAAA,EAAW,QAAO;AAC9C,WAAO;AAAA,EACT;AAEA,QAAMC,QAAQV,OAAOW,KAAKb,IAAI;AAC9B,MAAIY,MAAME,WAAWZ,OAAOW,KAAKZ,IAAI,EAAEa,QAAQ;AAC7C,WAAO;AAAA,EACT;AAEA,WAASC,IAAI,GAAGA,IAAIH,MAAME,QAAQC,KAAK;AACrC,QACE,CAACb,OAAOc,UAAUC,eAAeC,KAAKjB,MAAMW,MAAMG,CAAC,CAAW,KAC9D,CAACb,OAAOC,GAAGH,KAAKY,MAAMG,CAAC,CAAY,GAAGd,KAAKW,MAAMG,CAAC,CAAY,CAAC,GAC/D;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;;;;;;;"} |
@@ -1,8 +0,4 @@ | ||
| import { Derived, Store } from '@tanstack/store'; | ||
| import { Accessor } from 'solid-js'; | ||
| import { Atom, ReadonlyAtom } from '@tanstack/store'; | ||
| export * from '@tanstack/store'; | ||
| /** | ||
| * @private | ||
| */ | ||
| export type NoInfer<T> = [T][T extends any ? 0 : never]; | ||
| type EqualityFn<T> = (objA: T, objB: T) => boolean; | ||
@@ -12,4 +8,3 @@ interface UseStoreOptions<T> { | ||
| } | ||
| export declare function useStore<TState, TSelected = NoInfer<TState>>(store: Store<TState, any>, selector?: (state: NoInfer<TState>) => TSelected, options?: UseStoreOptions<TSelected>): Accessor<TSelected>; | ||
| export declare function useStore<TState, TSelected = NoInfer<TState>>(store: Derived<TState, any>, selector?: (state: NoInfer<TState>) => TSelected, options?: UseStoreOptions<TSelected>): Accessor<TSelected>; | ||
| export declare function useStore<TState, TSelected = NoInfer<TState>>(store: Atom<TState> | ReadonlyAtom<TState>, selector?: (state: NoInfer<TState>) => TSelected, options?: UseStoreOptions<TSelected>): Accessor<TSelected>; | ||
| export declare function shallow<T>(objA: T, objB: T): boolean; |
@@ -1,8 +0,4 @@ | ||
| import { Derived, Store } from '@tanstack/store'; | ||
| import { Accessor } from 'solid-js'; | ||
| import { Atom, ReadonlyAtom } from '@tanstack/store'; | ||
| export * from '@tanstack/store'; | ||
| /** | ||
| * @private | ||
| */ | ||
| export type NoInfer<T> = [T][T extends any ? 0 : never]; | ||
| type EqualityFn<T> = (objA: T, objB: T) => boolean; | ||
@@ -12,4 +8,3 @@ interface UseStoreOptions<T> { | ||
| } | ||
| export declare function useStore<TState, TSelected = NoInfer<TState>>(store: Store<TState, any>, selector?: (state: NoInfer<TState>) => TSelected, options?: UseStoreOptions<TSelected>): Accessor<TSelected>; | ||
| export declare function useStore<TState, TSelected = NoInfer<TState>>(store: Derived<TState, any>, selector?: (state: NoInfer<TState>) => TSelected, options?: UseStoreOptions<TSelected>): Accessor<TSelected>; | ||
| export declare function useStore<TState, TSelected = NoInfer<TState>>(store: Atom<TState> | ReadonlyAtom<TState>, selector?: (state: NoInfer<TState>) => TSelected, options?: UseStoreOptions<TSelected>): Accessor<TSelected>; | ||
| export declare function shallow<T>(objA: T, objB: T): boolean; |
| import { createSignal, onCleanup } from "solid-js"; | ||
| export * from "@tanstack/store"; | ||
| function useStore(store, selector = (d) => d, options = {}) { | ||
| const [signal, setSignal] = createSignal(selector(store.state)); | ||
| const [signal, setSignal] = createSignal(selector(store.get())); | ||
| const equal = options.equal ?? shallow; | ||
| const unsub = store.subscribe(() => { | ||
| const data = selector(store.state); | ||
| const unsub = store.subscribe((s) => { | ||
| const data = selector(s); | ||
| if (equal(signal(), data)) { | ||
@@ -12,3 +12,3 @@ return; | ||
| setSignal(() => data); | ||
| }); | ||
| }).unsubscribe; | ||
| onCleanup(() => { | ||
@@ -15,0 +15,0 @@ unsub(); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sources":["../../src/index.tsx"],"sourcesContent":["import { createSignal, onCleanup } from 'solid-js'\nimport type { Derived, Store } from '@tanstack/store'\nimport type { Accessor } from 'solid-js'\n\nexport * from '@tanstack/store'\n\n/**\n * @private\n */\nexport type NoInfer<T> = [T][T extends any ? 0 : never]\ntype EqualityFn<T> = (objA: T, objB: T) => boolean\ninterface UseStoreOptions<T> {\n equal?: EqualityFn<T>\n}\n\nexport function useStore<TState, TSelected = NoInfer<TState>>(\n store: Store<TState, any>,\n selector?: (state: NoInfer<TState>) => TSelected,\n options?: UseStoreOptions<TSelected>,\n): Accessor<TSelected>\nexport function useStore<TState, TSelected = NoInfer<TState>>(\n store: Derived<TState, any>,\n selector?: (state: NoInfer<TState>) => TSelected,\n options?: UseStoreOptions<TSelected>,\n): Accessor<TSelected>\nexport function useStore<TState, TSelected = NoInfer<TState>>(\n store: Store<TState, any> | Derived<TState, any>,\n selector: (state: NoInfer<TState>) => TSelected = (d) => d as any,\n options: UseStoreOptions<TSelected> = {},\n): Accessor<TSelected> {\n const [signal, setSignal] = createSignal(selector(store.state))\n const equal = options.equal ?? shallow\n\n const unsub = store.subscribe(() => {\n const data = selector(store.state)\n if (equal(signal(), data)) {\n return\n }\n setSignal(() => data)\n })\n\n onCleanup(() => {\n unsub()\n })\n\n return signal\n}\n\nexport function shallow<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false\n for (const [k, v] of objA) {\n if (!objB.has(k) || !Object.is(v, objB.get(k))) return false\n }\n return true\n }\n\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false\n for (const v of objA) {\n if (!objB.has(v)) return false\n }\n return true\n }\n\n if (objA instanceof Date && objB instanceof Date) {\n if (objA.getTime() !== objB.getTime()) return false\n return true\n }\n\n const keysA = Object.keys(objA)\n if (keysA.length !== Object.keys(objB).length) {\n return false\n }\n\n for (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n"],"names":["useStore","store","selector","d","options","signal","setSignal","createSignal","state","equal","shallow","unsub","subscribe","data","onCleanup","objA","objB","Object","is","Map","size","k","v","has","get","Set","Date","getTime","keysA","keys","length","i","prototype","hasOwnProperty","call"],"mappings":";;AAyBO,SAASA,SACdC,OACAC,WAAmDC,OAAMA,GACzDC,UAAsC,IACjB;AACrB,QAAM,CAACC,QAAQC,SAAS,IAAIC,aAAaL,SAASD,MAAMO,KAAK,CAAC;AAC9D,QAAMC,QAAQL,QAAQK,SAASC;AAE/B,QAAMC,QAAQV,MAAMW,UAAU,MAAM;AAClC,UAAMC,OAAOX,SAASD,MAAMO,KAAK;AACjC,QAAIC,MAAMJ,UAAUQ,IAAI,GAAG;AACzB;AAAA,IACF;AACAP,cAAU,MAAMO,IAAI;AAAA,EACtB,CAAC;AAEDC,YAAU,MAAM;AACdH,UAAAA;AAAAA,EACF,CAAC;AAED,SAAON;AACT;AAEO,SAASK,QAAWK,MAASC,MAAS;AAC3C,MAAIC,OAAOC,GAAGH,MAAMC,IAAI,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,MACE,OAAOD,SAAS,YAChBA,SAAS,QACT,OAAOC,SAAS,YAChBA,SAAS,MACT;AACA,WAAO;AAAA,EACT;AAEA,MAAID,gBAAgBI,OAAOH,gBAAgBG,KAAK;AAC9C,QAAIJ,KAAKK,SAASJ,KAAKI,KAAM,QAAO;AACpC,eAAW,CAACC,GAAGC,CAAC,KAAKP,MAAM;AACzB,UAAI,CAACC,KAAKO,IAAIF,CAAC,KAAK,CAACJ,OAAOC,GAAGI,GAAGN,KAAKQ,IAAIH,CAAC,CAAC,EAAG,QAAO;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAEA,MAAIN,gBAAgBU,OAAOT,gBAAgBS,KAAK;AAC9C,QAAIV,KAAKK,SAASJ,KAAKI,KAAM,QAAO;AACpC,eAAWE,KAAKP,MAAM;AACpB,UAAI,CAACC,KAAKO,IAAID,CAAC,EAAG,QAAO;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAEA,MAAIP,gBAAgBW,QAAQV,gBAAgBU,MAAM;AAChD,QAAIX,KAAKY,QAAAA,MAAcX,KAAKW,QAAAA,EAAW,QAAO;AAC9C,WAAO;AAAA,EACT;AAEA,QAAMC,QAAQX,OAAOY,KAAKd,IAAI;AAC9B,MAAIa,MAAME,WAAWb,OAAOY,KAAKb,IAAI,EAAEc,QAAQ;AAC7C,WAAO;AAAA,EACT;AAEA,WAASC,IAAI,GAAGA,IAAIH,MAAME,QAAQC,KAAK;AACrC,QACE,CAACd,OAAOe,UAAUC,eAAeC,KAAKlB,MAAMY,MAAMG,CAAC,CAAW,KAC9D,CAACd,OAAOC,GAAGH,KAAKa,MAAMG,CAAC,CAAY,GAAGf,KAAKY,MAAMG,CAAC,CAAY,CAAC,GAC/D;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;"} | ||
| {"version":3,"file":"index.js","sources":["../../src/index.tsx"],"sourcesContent":["import { createSignal, onCleanup } from 'solid-js'\nimport type { Accessor } from 'solid-js'\nimport type { Atom, ReadonlyAtom } from '@tanstack/store'\n\nexport * from '@tanstack/store'\n\ntype EqualityFn<T> = (objA: T, objB: T) => boolean\ninterface UseStoreOptions<T> {\n equal?: EqualityFn<T>\n}\n\nexport function useStore<TState, TSelected = NoInfer<TState>>(\n store: Atom<TState> | ReadonlyAtom<TState>,\n selector: (state: NoInfer<TState>) => TSelected = (d) => d as any,\n options: UseStoreOptions<TSelected> = {},\n): Accessor<TSelected> {\n const [signal, setSignal] = createSignal(selector(store.get()))\n const equal = options.equal ?? shallow\n\n const unsub = store.subscribe((s) => {\n const data = selector(s)\n if (equal(signal(), data)) {\n return\n }\n setSignal(() => data)\n }).unsubscribe\n\n onCleanup(() => {\n unsub()\n })\n\n return signal\n}\n\nexport function shallow<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false\n for (const [k, v] of objA) {\n if (!objB.has(k) || !Object.is(v, objB.get(k))) return false\n }\n return true\n }\n\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false\n for (const v of objA) {\n if (!objB.has(v)) return false\n }\n return true\n }\n\n if (objA instanceof Date && objB instanceof Date) {\n if (objA.getTime() !== objB.getTime()) return false\n return true\n }\n\n const keysA = Object.keys(objA)\n if (keysA.length !== Object.keys(objB).length) {\n return false\n }\n\n for (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n"],"names":["useStore","store","selector","d","options","signal","setSignal","createSignal","get","equal","shallow","unsub","subscribe","s","data","unsubscribe","onCleanup","objA","objB","Object","is","Map","size","k","v","has","Set","Date","getTime","keysA","keys","length","i","prototype","hasOwnProperty","call"],"mappings":";;AAWO,SAASA,SACdC,OACAC,WAAmDC,OAAMA,GACzDC,UAAsC,IACjB;AACrB,QAAM,CAACC,QAAQC,SAAS,IAAIC,aAAaL,SAASD,MAAMO,IAAAA,CAAK,CAAC;AAC9D,QAAMC,QAAQL,QAAQK,SAASC;AAE/B,QAAMC,QAAQV,MAAMW,UAAWC,CAAAA,MAAM;AACnC,UAAMC,OAAOZ,SAASW,CAAC;AACvB,QAAIJ,MAAMJ,UAAUS,IAAI,GAAG;AACzB;AAAA,IACF;AACAR,cAAU,MAAMQ,IAAI;AAAA,EACtB,CAAC,EAAEC;AAEHC,YAAU,MAAM;AACdL,UAAAA;AAAAA,EACF,CAAC;AAED,SAAON;AACT;AAEO,SAASK,QAAWO,MAASC,MAAS;AAC3C,MAAIC,OAAOC,GAAGH,MAAMC,IAAI,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,MACE,OAAOD,SAAS,YAChBA,SAAS,QACT,OAAOC,SAAS,YAChBA,SAAS,MACT;AACA,WAAO;AAAA,EACT;AAEA,MAAID,gBAAgBI,OAAOH,gBAAgBG,KAAK;AAC9C,QAAIJ,KAAKK,SAASJ,KAAKI,KAAM,QAAO;AACpC,eAAW,CAACC,GAAGC,CAAC,KAAKP,MAAM;AACzB,UAAI,CAACC,KAAKO,IAAIF,CAAC,KAAK,CAACJ,OAAOC,GAAGI,GAAGN,KAAKV,IAAIe,CAAC,CAAC,EAAG,QAAO;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAEA,MAAIN,gBAAgBS,OAAOR,gBAAgBQ,KAAK;AAC9C,QAAIT,KAAKK,SAASJ,KAAKI,KAAM,QAAO;AACpC,eAAWE,KAAKP,MAAM;AACpB,UAAI,CAACC,KAAKO,IAAID,CAAC,EAAG,QAAO;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAEA,MAAIP,gBAAgBU,QAAQT,gBAAgBS,MAAM;AAChD,QAAIV,KAAKW,QAAAA,MAAcV,KAAKU,QAAAA,EAAW,QAAO;AAC9C,WAAO;AAAA,EACT;AAEA,QAAMC,QAAQV,OAAOW,KAAKb,IAAI;AAC9B,MAAIY,MAAME,WAAWZ,OAAOW,KAAKZ,IAAI,EAAEa,QAAQ;AAC7C,WAAO;AAAA,EACT;AAEA,WAASC,IAAI,GAAGA,IAAIH,MAAME,QAAQC,KAAK;AACrC,QACE,CAACb,OAAOc,UAAUC,eAAeC,KAAKjB,MAAMW,MAAMG,CAAC,CAAW,KAC9D,CAACb,OAAOC,GAAGH,KAAKY,MAAMG,CAAC,CAAY,GAAGd,KAAKW,MAAMG,CAAC,CAAY,CAAC,GAC/D;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;"} |
@@ -1,8 +0,4 @@ | ||
| import type { Derived, Store } from '@tanstack/store'; | ||
| import type { Accessor } from 'solid-js'; | ||
| import type { Atom, ReadonlyAtom } from '@tanstack/store'; | ||
| export * from '@tanstack/store'; | ||
| /** | ||
| * @private | ||
| */ | ||
| export type NoInfer<T> = [T][T extends any ? 0 : never]; | ||
| type EqualityFn<T> = (objA: T, objB: T) => boolean; | ||
@@ -12,4 +8,3 @@ interface UseStoreOptions<T> { | ||
| } | ||
| export declare function useStore<TState, TSelected = NoInfer<TState>>(store: Store<TState, any>, selector?: (state: NoInfer<TState>) => TSelected, options?: UseStoreOptions<TSelected>): Accessor<TSelected>; | ||
| export declare function useStore<TState, TSelected = NoInfer<TState>>(store: Derived<TState, any>, selector?: (state: NoInfer<TState>) => TSelected, options?: UseStoreOptions<TSelected>): Accessor<TSelected>; | ||
| export declare function useStore<TState, TSelected = NoInfer<TState>>(store: Atom<TState> | ReadonlyAtom<TState>, selector?: (state: NoInfer<TState>) => TSelected, options?: UseStoreOptions<TSelected>): Accessor<TSelected>; | ||
| export declare function shallow<T>(objA: T, objB: T): boolean; |
| import { createSignal, onCleanup } from 'solid-js'; | ||
| export * from '@tanstack/store'; | ||
| export function useStore(store, selector = (d) => d, options = {}) { | ||
| const [signal, setSignal] = createSignal(selector(store.state)); | ||
| const [signal, setSignal] = createSignal(selector(store.get())); | ||
| const equal = options.equal ?? shallow; | ||
| const unsub = store.subscribe(() => { | ||
| const data = selector(store.state); | ||
| const unsub = store.subscribe((s) => { | ||
| const data = selector(s); | ||
| if (equal(signal(), data)) { | ||
@@ -12,3 +12,3 @@ return; | ||
| setSignal(() => data); | ||
| }); | ||
| }).unsubscribe; | ||
| onCleanup(() => { | ||
@@ -15,0 +15,0 @@ unsub(); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"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"} |
+6
-7
| { | ||
| "name": "@tanstack/solid-store", | ||
| "version": "0.8.1", | ||
| "version": "0.9.0", | ||
| "description": "Framework agnostic type-safe store w/ reactive framework adapters", | ||
@@ -49,3 +49,3 @@ "author": "Tanner Linsley", | ||
| "dependencies": { | ||
| "@tanstack/store": "0.8.1" | ||
| "@tanstack/store": "0.9.0" | ||
| }, | ||
@@ -64,7 +64,6 @@ "devDependencies": { | ||
| "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", | ||
| "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", | ||
| "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", | ||
| "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", | ||
| "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", | ||
| "test:types:ts54": "tsc", | ||
| "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js", | ||
| "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js", | ||
| "test:types:ts58": "node ../../node_modules/typescript58/lib/tsc.js", | ||
| "test:types:ts59": "tsc", | ||
| "test:lib": "vitest", | ||
@@ -71,0 +70,0 @@ "test:lib:dev": "pnpm run test:lib --watch", |
+6
-20
| import { createSignal, onCleanup } from 'solid-js' | ||
| import type { Derived, Store } from '@tanstack/store' | ||
| import type { Accessor } from 'solid-js' | ||
| import type { Atom, ReadonlyAtom } from '@tanstack/store' | ||
| export * from '@tanstack/store' | ||
| /** | ||
| * @private | ||
| */ | ||
| export type NoInfer<T> = [T][T extends any ? 0 : never] | ||
| type EqualityFn<T> = (objA: T, objB: T) => boolean | ||
@@ -17,21 +13,11 @@ interface UseStoreOptions<T> { | ||
| export function useStore<TState, TSelected = NoInfer<TState>>( | ||
| store: Store<TState, any>, | ||
| selector?: (state: NoInfer<TState>) => TSelected, | ||
| options?: UseStoreOptions<TSelected>, | ||
| ): Accessor<TSelected> | ||
| export function useStore<TState, TSelected = NoInfer<TState>>( | ||
| store: Derived<TState, any>, | ||
| selector?: (state: NoInfer<TState>) => TSelected, | ||
| options?: UseStoreOptions<TSelected>, | ||
| ): Accessor<TSelected> | ||
| export function useStore<TState, TSelected = NoInfer<TState>>( | ||
| store: Store<TState, any> | Derived<TState, any>, | ||
| store: Atom<TState> | ReadonlyAtom<TState>, | ||
| selector: (state: NoInfer<TState>) => TSelected = (d) => d as any, | ||
| options: UseStoreOptions<TSelected> = {}, | ||
| ): Accessor<TSelected> { | ||
| const [signal, setSignal] = createSignal(selector(store.state)) | ||
| const [signal, setSignal] = createSignal(selector(store.get())) | ||
| const equal = options.equal ?? shallow | ||
| const unsub = store.subscribe(() => { | ||
| const data = selector(store.state) | ||
| const unsub = store.subscribe((s) => { | ||
| const data = selector(s) | ||
| if (equal(signal(), data)) { | ||
@@ -41,3 +27,3 @@ return | ||
| setSignal(() => data) | ||
| }) | ||
| }).unsubscribe | ||
@@ -44,0 +30,0 @@ onCleanup(() => { |
22290
-9.37%273
-8.08%+ Added
- Removed
Updated