@safeapi/safeapi
Version:
SafeAPI: Secure, deterministic, and tamper-resistant API policy engine for Node and browser.
38 lines (37 loc) • 1.01 kB
JavaScript
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));
}