@tanstack/solid-table
Version:
Headless UI for building powerful tables & datagrids for Solid.
62 lines (60 loc) • 1.83 kB
JavaScript
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 };