UNPKG

@safeapi/safeapi

Version:

SafeAPI: Secure, deterministic, and tamper-resistant API policy engine for Node and browser.

38 lines (37 loc) 1.01 kB
import { deepFreeze } from "./deepFreeze"; /** @internal */ export function canonicalSortKeys(value) { const ordered = {}; Object.keys(value) .sort() .forEach((key) => { ordered[key] = value[key]; }); return ordered; } /** @internal */ export function canonicalJSONStringify(value, space = 2) { return JSON.stringify(canonicalize(value), null, space); } function canonicalize(value, seen = new WeakSet()) { if (value === null || typeof value !== "object") return value; if (seen.has(value)) return "[Circular]"; seen.add(value); if (Array.isArray(value)) { return value.map((entry) => canonicalize(entry, seen)); } const record = value; const ordered = {}; Object.keys(record) .sort() .forEach((key) => { ordered[key] = canonicalize(record[key], seen); }); return ordered; } /** @internal */ export function freezeCanonical(value) { return deepFreeze(canonicalize(value)); }