UNPKG

@tanstack/table-devtools

Version:

Devtools for TanStack Table.

104 lines (102 loc) 3.19 kB
import { createEffect, createRoot, createSignal, untrack } from "solid-js"; //#region src/tableTarget.ts const MISSING_KEY_ERROR = "[TanStack Table Devtools] Missing table key. Add a `key` option to your table to use devtools."; const [registrationsMap, setRegistrationsMap] = createSignal(/* @__PURE__ */ new Map()); function getTableKey(table) { return untrack(() => table.options.key?.trim()) || void 0; } function upsertTableDevtoolsTarget(options) { const table = options.table; const key = getTableKey(table); if (!key) { console.error(MISSING_KEY_ERROR); return; } const registrations = untrack(registrationsMap); const existingEntry = registrations.get(key); const lease = Symbol(key); if (existingEntry) { if (existingEntry.registration.table === table || existingEntry.registration.table.store === table.store) { if (existingEntry.registration.table !== table) Object.assign(existingEntry.registration.table, table); existingEntry.leases.add(lease); return () => { releaseTableDevtoolsTarget(key, lease); }; } const nextRegistrations = new Map(registrations); nextRegistrations.set(key, { registration: { id: key, table }, leases: /* @__PURE__ */ new Set([lease]) }); setRegistrationsMap(nextRegistrations); } else { const nextRegistrations = new Map(registrations); nextRegistrations.set(key, { registration: { id: key, table }, leases: /* @__PURE__ */ new Set([lease]) }); setRegistrationsMap(nextRegistrations); } return () => { releaseTableDevtoolsTarget(key, lease); }; } function releaseTableDevtoolsTarget(id, lease) { const registrations = untrack(registrationsMap); const entry = registrations.get(id); if (!entry?.leases.delete(lease) || entry.leases.size > 0) return; const nextRegistrations = new Map(registrations); nextRegistrations.delete(id); setRegistrationsMap(nextRegistrations); } function removeTableDevtoolsTarget(id) { const registrations = untrack(registrationsMap); if (!registrations.has(id)) return; const nextRegistrations = new Map(registrations); nextRegistrations.delete(id); setRegistrationsMap(nextRegistrations); } function getTableDevtoolsTargets() { return Array.from(registrationsMap().values(), (entry) => entry.registration); } function subscribeTableDevtoolsTargets(listener) { let disposeRoot = () => {}; createRoot((dispose) => { disposeRoot = dispose; createEffect(() => { listener(getTableDevtoolsTargets()); }); }); return disposeRoot; } function setTableDevtoolsTarget(table) { if (!table) return; upsertTableDevtoolsTarget({ table }); } function createTableDevtoolsRegistrationManager() { let cleanup; return { update: (table, enabled = true) => { if (!enabled || !table) { cleanup?.(); cleanup = void 0; return; } const previousCleanup = cleanup; cleanup = upsertTableDevtoolsTarget({ table }); previousCleanup?.(); }, dispose: () => { cleanup?.(); cleanup = void 0; } }; } //#endregion export { createTableDevtoolsRegistrationManager, getTableDevtoolsTargets, removeTableDevtoolsTarget, setTableDevtoolsTarget, subscribeTableDevtoolsTargets, upsertTableDevtoolsTarget };