mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-11-15 22:08:03 +00:00
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.
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
#!/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();
|
||||
Reference in New Issue
Block a user