Files
zooqueenandHanzo Dev 70b41673a3 frames: rebrand the fork to Hanzo Frames
Forked from HyperFrames (Apache-2.0), full history preserved.

Hosts are mapped explicitly and BEFORE the identifier rename, because
hyperframes.heygen.com is not decoration: 175 of its occurrences are $schema
identifiers that a validator dereferences. A blind rename would have left them
naming a host that never serves them. The schema files are in this repo under
docs/schema, so the mapped host is one we can actually serve -- that is the
condition that makes the rewrite safe, and serving them is a deploy task, not
an edit. docs/schema/hyperframes.json is renamed to frames.json to match the
identifier it is now published under.

api.heygen.com and the CLI auth against heygen.com are left UNRENAMED on
purpose. They are a dependency on HeyGen's SaaS, not a name of ours to take,
and the right move is to remove that integration rather than rebrand it.

LICENSE and CREDITS.md are untouched; NOTICE records the lineage.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-28 23:42:24 -07:00

83 lines
2.6 KiB
TypeScript

/**
* Build script: compile stubs/hf-early-stub.ts → src/generated/hf-early-stub-inline.ts
*
* Run via: bun run scripts/build-hf-early-stub.ts
* (also called automatically as part of `bun run build`)
*
* Output format mirrors packages/core/scripts/build-frames-runtime-artifact.ts:
* a TypeScript module exporting a single string-constant getter that is
* compiled by tsc into dist/ — no esbuild, no file I/O, no dynamic paths at
* runtime.
*/
import { mkdirSync, writeFileSync } from "node:fs";
import { dirname, resolve } from "node:path";
import { fileURLToPath } from "node:url";
import { buildSync } from "esbuild";
import { execSync } from "node:child_process";
const thisDir = dirname(fileURLToPath(import.meta.url));
const repoRoot = resolve(thisDir, "..");
const stubEntry = resolve(repoRoot, "stubs/hf-early-stub.ts");
const generatedDir = resolve(repoRoot, "src/generated");
const outPath = resolve(generatedDir, "hf-early-stub-inline.ts");
// ── Compile the stub to a self-contained IIFE ─────────────────────────────────
const result = buildSync({
entryPoints: [stubEntry],
bundle: true,
write: false,
platform: "browser",
format: "iife",
target: ["es2020"],
// Minify for production — the stub is injected on every page load.
minify: true,
legalComments: "none",
});
const iife = result.outputFiles[0]?.text ?? "";
if (!iife) {
throw new Error("esbuild produced no output for hf-early-stub.ts");
}
// ── Write the generated module ────────────────────────────────────────────────
mkdirSync(generatedDir, { recursive: true });
const escaped = JSON.stringify(iife);
writeFileSync(
outPath,
[
"// AUTO-GENERATED by scripts/build-hf-early-stub.ts — do not edit",
`const HF_EARLY_STUB_IIFE: string = ${escaped};`,
"",
"/**",
" * Returns the pre-built Frames early stub IIFE as a string constant.",
" * Inject into <head> before any other scripts so the GSAP batching",
" * interceptor is in place when user composition scripts run.",
" */",
"export function getHfEarlyStub(): string {",
" return HF_EARLY_STUB_IIFE;",
"}",
"",
].join("\n"),
"utf8",
);
// Format the generated file so `oxfmt --check` passes in CI.
// Errors are intentionally swallowed — oxfmt unavailable in some envs.
try {
execSync(`bunx oxfmt ${outPath}`, { stdio: "ignore" });
} catch {
// not fatal
}
console.log(
JSON.stringify({
event: "hf_early_stub_generated",
stubEntry,
outPath,
bytes: Buffer.byteLength(iife, "utf8"),
}),
);