UNPKG

@tanstack/solid-table

Version:

Headless UI for building powerful tables & datagrids for Solid.

62 lines (60 loc) 1.83 kB
import { batch, createMemo, createSignal, observable, runWithOwner, untrack } from "solid-js"; //#region src/reactivity.ts function signalToReadonlyAtom(signal, owner) { return Object.assign(signal, { get: () => signal(), subscribe: (observer) => { return runWithOwner(owner, () => observable(signal)).subscribe(observer); } }); } function signalToWritableAtom(signalTuple, owner) { const [signal, setSignal] = signalTuple; return Object.assign(signal, { set: (updater) => { typeof updater === "function" ? setSignal(updater) : setSignal(updater); }, get: () => signal(), subscribe: (observer) => { return runWithOwner(owner, () => observable(signal)).subscribe(observer); } }); } /** * Creates the table-core reactivity bindings used by the Solid adapter. * * Table state atoms are backed by TanStack Store atoms. The options store stays * framework-native because row-model APIs read `table.options` directly during * render. Readonly table atoms bridge Store dependency tracking into Solid memos. */ function solidReactivity(owner) { const subscriptions = /* @__PURE__ */ new Set(); return { createOptionsStore: true, wrapExternalAtoms: true, addSubscription: (subscription) => { subscriptions.add(subscription); }, unmount: () => { subscriptions.forEach((s) => s.unsubscribe()); subscriptions.clear(); }, schedule: (fn) => queueMicrotask(() => fn()), createReadonlyAtom: (fn, options) => { return signalToReadonlyAtom(createMemo(() => fn(), { equals: options?.compare, name: options?.debugName }), owner); }, createWritableAtom: (value, options) => { return signalToWritableAtom(createSignal(value, { equals: options?.compare, name: options?.debugName }), owner); }, untrack, batch }; } //#endregion export { solidReactivity };