Sorting and serialization of structural keys
The policy implementation follows.
ts
export function retrievalQueryKey(value: unknown): string {
const serialized = JSON.stringify(canonical(value));
breakWhile(serialized === undefined, () => new TypeError('Query cannot be serialized'));
return serialized!;
}
function canonical(value: unknown): unknown {
if (Array.isArray(value)) return value.map(canonical);
if (value && typeof value === 'object') {
return Object.fromEntries(
Object.entries(value)
.sort(([left], [right]) => left.localeCompare(right))
.map(([key, item]) => [key, canonical(item)]),
);
}
return value;
}