UNPKG

key-hierarchy

Version:

A tiny TypeScript library for managing key hierarchies. The perfect companion for TanStack Query.

89 lines (88 loc) 2.38 kB
function y(e) { return e == null || (Object.freeze(e), Object.getOwnPropertyNames(e).forEach((r) => { e[r] !== null && (typeof e[r] == "object" || typeof e[r] == "function") && !Object.isFrozen(e[r]) && y(e[r]); })), e; } function l(e) { return typeof e == "function" || typeof e == "symbol" ? e : structuredClone(e); } const b = Symbol("DynamicSegment"), z = Symbol("DynamicExtendedSegment"); function P(e, r, t) { const o = {}, u = [...Object.keys(r), ...Object.getOwnPropertySymbols(r)].filter((n) => n !== b && n !== z); for (const n of u) { const f = r[n], i = [...e, n]; if (typeof f == "boolean") o[n] = t.freeze ? y(i) : [...i]; else if (typeof f == "object" && f !== null) if (z in f) { const c = { ...f }; o[n] = (s) => { const d = t.freeze ? l(s) : s, m = [...e, [n, d]], _ = P(m, c, t); return _.__key = t.freeze ? y(m) : m, _; }; } else if (b in f) o[n] = (c) => { const s = t.freeze ? l(c) : c, d = [...e, [n, s]]; return t.freeze ? y(d) : d; }; else { const c = P(i, f, t); c.__key = t.freeze ? y(i) : [...i], o[n] = c; } } return o; } function j(e, r, t) { return new Proxy( {}, { get(o, u) { if (u === "__key") return t.freeze ? y([...e]) : [...e]; const n = r[u]; return typeof n == "object" && n !== null && z in n ? (f) => { const i = t.freeze ? l(f) : f, c = [ ...e, [u, i] ], s = { ...n }; return j(c, s, t); } : typeof n == "object" && n !== null && b in n ? (f) => { const i = t.freeze ? l(f) : f, c = [ ...e, [u, i] ]; return t.freeze ? y(c) : c; } : typeof n == "object" && n !== null ? j([...e, u], n, t) : t.freeze ? y([...e, u]) : [...e, u]; } } ); } function E(e) { return typeof e == "function" ? e(h) : e; } function O(e, r = {}) { const t = { freeze: !1, method: "proxy", ...r }, o = x(e); return t.method === "precompute" ? P([], o, t) : j([], o, t); } function x(e) { return E(e); } function h() { return { [b]: void 0, extend(e) { return { [z]: void 0, ...e }; } }; } export { O as defineKeyHierarchy, x as defineKeyHierarchyModule };