Files
hyperframes/scripts/sync-schemas.ts
T
Miguel Ángel b0071311ed docs: serve hyperframes.json / registry JSON schemas (#304)
The three /schema/*.json URLs baked into every Hyperframes project as
\$schema references were all 404ing on the live docs site — blocking
editor autocomplete and validation for hyperframes.json, registry.json,
and registry-item.json.

Adds docs/schema/ so Mintlify serves the three expected URLs:
- /schema/hyperframes.json       (new — authored from ProjectConfig)
- /schema/registry.json          (mirrored from packages/core/schemas/)
- /schema/registry-item.json     (mirrored from packages/core/schemas/)

The registry schemas stay authoritative in packages/core/schemas/ where
they're npm-exported for @hyperframes/core consumers. scripts/sync-schemas.ts
mirrors them into docs/schema/ and a new --check mode fails the Docs
workflow if the two drift, so the npm copy and the docs copy can't
diverge silently.

Validated against the factory-series-c-video config + a default config
generated by hyperframes init; negative cases (missing registry,
extra top-level keys, empty required strings) reject as expected.
2026-04-17 17:26:22 +02:00

61 lines
1.8 KiB
TypeScript

#!/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();