/** * 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-hyperframes-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 HyperFrames early stub IIFE as a string constant.", " * Inject into 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"), }), );