// нормализация значений для сравнения с golden-эталоном: ключи объектов по алфавиту, Set — отсортированный массив, // undefined-поля выбрасываются (как в JSON). Set распознаётся по тегу: объекты из node:vm — из другого realm const isSet = (v: unknown): v is Set => 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; return Object.fromEntries(Object.keys(o).sort().filter((k) => o[k] !== undefined).map((k) => [k, canon(o[k])])); } return v; }