import { createHash } from 'node:crypto'; import type { SystemDefinition } from './types.ts'; /** Canonical JSON for stable hashing (sorted keys). */ export function canonicalJson(value: unknown): string { return JSON.stringify(sortKeys(value)); } function sortKeys(value: unknown): unknown { if (Array.isArray(value)) return value.map(sortKeys); if (value && typeof value === 'object') { const obj = value as Record; const out: Record = {}; for (const key of Object.keys(obj).sort()) { out[key] = sortKeys(obj[key]); } return out; } return value; } export function snapshotHash(system: SystemDefinition): string { const payload = { id: system.id, schemaVersion: system.schemaVersion, revision: system.revision, bricks: system.bricks, creationRules: system.creationRules, sheetLayout: system.sheetLayout, compendium: system.compendium, }; return createHash('sha256').update(canonicalJson(payload)).digest('hex'); }