UNPKG

@tanstack/svelte-store

Version:

Framework agnostic type-safe store w/ reactive framework adapters

66 lines (65 loc) 1.82 kB
export * from '@tanstack/store'; export function useStore(store, selector = (d) => d, options = {}) { const equal = options.equal ?? shallow; let slice = $state(selector(store.state)); $effect(() => { const unsub = store.subscribe(() => { const data = selector(store.state); if (equal(slice, data)) { return; } slice = data; }); return unsub; }); return { get current() { return slice; }, }; } export function shallow(objA, objB) { 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; } if (objA instanceof Date && objB instanceof Date) { if (objA.getTime() !== objB.getTime()) 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]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) { return false; } } return true; }