@tanstack/table-devtools
Version:
Devtools for TanStack Table.
104 lines (102 loc) • 3.19 kB
JavaScript
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 };