14 lines
930 B
TypeScript
14 lines
930 B
TypeScript
// нормализация значений для сравнения с golden-эталоном: ключи объектов по алфавиту, Set — отсортированный массив,
|
||
// undefined-поля выбрасываются (как в JSON). Set распознаётся по тегу: объекты из node:vm — из другого realm
|
||
const isSet = (v: unknown): v is Set<unknown> => Object.prototype.toString.call(v) === "[object Set]";
|
||
|
||
export function canon(v: unknown): unknown {
|
||
if (isSet(v)) return [...v].map(canon).sort((a, b) => { const x = JSON.stringify(a), y = JSON.stringify(b); return x < y ? -1 : x > y ? 1 : 0; });
|
||
if (Array.isArray(v)) return v.map(canon);
|
||
if (v && typeof v === "object") {
|
||
const o = v as Record<string, unknown>;
|
||
return Object.fromEntries(Object.keys(o).sort().filter((k) => o[k] !== undefined).map((k) => [k, canon(o[k])]));
|
||
}
|
||
return v;
|
||
}
|