key-hierarchy
Version:
A tiny TypeScript library for managing key hierarchies. The perfect companion for TanStack Query.
89 lines (88 loc) • 2.38 kB
JavaScript
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
};