← Files CompText ContextARCHIVED FILE

scripts/canonical-json.mjs

829 Bytes · Oct 2, 2026 · 00:31 UTC

↓ Download file

import crypto from 'node:crypto';
import fs from 'node:fs';

export function canonicalize(value) {
  if (Array.isArray(value)) return value.map(canonicalize);
  if (value && typeof value === 'object') {
    return Object.fromEntries(
      Object.keys(value).sort().map(key => [key, canonicalize(value[key])])
    );
  }
  return value;
}

export function canonicalText(value) {
  return JSON.stringify(canonicalize(value));
}

export function sha256Canonical(value) {
  const text = canonicalText(value);
  return `sha256:${crypto.createHash('sha256').update(text).digest('hex')}`;
}

if (process.argv[1] && process.argv[1].endsWith('canonical-json.mjs') && process.argv[2]) {
  const value = JSON.parse(fs.readFileSync(process.argv[2], 'utf8'));
  process.stdout.write(`${sha256Canonical(value)}\n${canonicalText(value)}\n`);
}

SHA-256: 9c0ef39f88069327854ffdc6a1bc58186a3b43623bd59985d57064610323bc0a