export function isRecord(value: unknown): value is Record { return value !== null && typeof value === 'object' && !Array.isArray(value); } export function hasOwn(record: object, key: PropertyKey): boolean { return Object.prototype.hasOwnProperty.call(record, key); } export function hasExactKeys( record: Readonly>, keys: readonly string[], ): boolean { const actual = Object.keys(record).sort(); const expected = [...keys].sort(); return actual.length === expected.length && actual.every((key, index) => key === expected[index]); } export function cloneJson(value: unknown): unknown { if (Array.isArray(value)) return value.map(cloneJson); if (!isRecord(value)) return value; return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, cloneJson(child)])); }