#!/usr/bin/env tsx /** * Mirror JSON Schemas from `packages/core/schemas/` into `docs/schema/` so * Mintlify serves them at `https://hyperframes.heygen.com/schema/*`. The core * copies stay authoritative — they're exported from `@hyperframes/core` for * npm consumers — and this script is the single contract that prevents the * docs mirror from drifting. * * Usage: * bun run sync-schemas # copy core → docs * bun run sync-schemas --check # exit non-zero if copies are stale (CI) * * `docs/schema/hyperframes.json` is authored directly in docs (no source in * core) so it's skipped by this script. */ import { readFileSync, writeFileSync } from "node:fs"; import { join } from "node:path"; const ROOT = join(import.meta.dirname, ".."); const SOURCE_DIR = join(ROOT, "packages/core/schemas"); const TARGET_DIR = join(ROOT, "docs/schema"); const MIRRORED = ["registry.json", "registry-item.json"]; function main() { const checkOnly = process.argv.includes("--check"); let drift = 0; for (const name of MIRRORED) { const source = readFileSync(join(SOURCE_DIR, name), "utf-8"); const targetPath = join(TARGET_DIR, name); const target = (() => { try { return readFileSync(targetPath, "utf-8"); } catch { return null; } })(); if (target === source) { console.log(` ✓ ${name} in sync`); continue; } drift++; if (checkOnly) { console.error(` ✗ ${name} out of sync (run \`bun run sync-schemas\` to fix)`); continue; } writeFileSync(targetPath, source); console.log(` → ${name} updated`); } if (checkOnly && drift > 0) { console.error(`\n${drift} schema${drift === 1 ? "" : "s"} drifted from source.`); process.exit(1); } } main();