Files
hyperframes/packages/producer/src/services/compilationRunner.ts
T
Vance Ingalls 20be2ea1c2 style: apply oxfmt baseline formatting across all source files (#25)
## Summary
- Run `oxfmt .` across the entire codebase to establish formatted baseline
- 299 files changed — mechanical formatting only, no logic changes
- Double quotes, semicolons, 2-space indent, trailing commas, 100 print width

Part 3/4 of [VA-851](https://linear.app/heygen/issue/VA-851/pre-migration-configure-eslint-prettier-and-conventional-commits)

## Test plan
- [x] `pnpm format:check` — all 426 files pass
- [x] `pnpm -r typecheck` — all packages pass
- [x] `pnpm build` — all packages build
- [x] All 348 tests pass
2026-03-23 17:15:14 -07:00

145 lines
4.3 KiB
TypeScript

/**
* Compilation Test Runner
*
* Orchestrates compilation tests: compiles input HTML, compares to golden files.
*/
import { readFileSync, writeFileSync, existsSync, mkdtempSync, rmSync, mkdirSync } from "fs";
import { join } from "path";
import { tmpdir } from "os";
import { compileForRender } from "./htmlCompiler.js";
import { validateCompilation, type CompilationValidationResult } from "./compilationTester.js";
export interface CompilationTestResult {
testId: string;
passed: boolean;
validation: CompilationValidationResult;
compilationTimeMs: number;
compiledHtmlPath?: string; // For --keep-temp
}
interface TestSuite {
id: string;
dir: string;
srcDir: string;
goldenMp4: string;
meta: Record<string, unknown>;
}
/**
* Run compilation test for a test suite.
* Compiles src/index.html and compares against compiled.html golden file.
*/
export async function runCompilationTest(
suite: TestSuite,
keepTemp: boolean,
): Promise<CompilationTestResult> {
const startTime = Date.now();
// Create temp directory for downloads (if HTML has HTTP URLs)
const tempDir = mkdtempSync(join(tmpdir(), `compile-test-${suite.id}-`));
try {
// Compile the input HTML
const inputHtmlPath = join(suite.srcDir, "index.html");
if (!existsSync(inputHtmlPath)) {
throw new Error(`Input HTML not found: ${inputHtmlPath}`);
}
const compiled = await compileForRender(suite.srcDir, inputHtmlPath, tempDir);
const actualHtml = compiled.html;
// Load golden compiled HTML
const goldenPath = join(suite.dir, "output", "compiled.html");
if (!existsSync(goldenPath)) {
throw new Error(`Golden compiled.html not found: ${goldenPath}`);
}
const goldenHtml = readFileSync(goldenPath, "utf-8");
// Validate
const validation = validateCompilation(actualHtml, goldenHtml);
const compilationTimeMs = Date.now() - startTime;
// Save compiled HTML if --keep-temp
let compiledHtmlPath: string | undefined;
if (keepTemp) {
compiledHtmlPath = join(tempDir, "compiled.html");
writeFileSync(compiledHtmlPath, actualHtml, "utf-8");
}
return {
testId: suite.id,
passed: validation.passed,
validation,
compilationTimeMs,
compiledHtmlPath,
};
} catch (error) {
const compilationTimeMs = Date.now() - startTime;
const errorMessage = error instanceof Error ? error.message : String(error);
return {
testId: suite.id,
passed: false,
validation: {
passed: false,
actualElements: [],
goldenElements: [],
errors: [`Compilation failed: ${errorMessage}`],
warnings: [],
},
compilationTimeMs,
};
} finally {
// Cleanup temp directory unless --keep-temp
if (!keepTemp && existsSync(tempDir)) {
rmSync(tempDir, { recursive: true, force: true });
}
}
}
/**
* Generate or update compiled.html golden file for a test suite.
* Compiles src/index.html and writes to compiled.html.
*/
export async function updateCompiledGolden(suite: TestSuite): Promise<void> {
console.log(`[${suite.id}] Updating compiled.html golden file...`);
// Create temp directory for downloads
const tempDir = mkdtempSync(join(tmpdir(), `update-golden-${suite.id}-`));
try {
const inputHtmlPath = join(suite.srcDir, "index.html");
if (!existsSync(inputHtmlPath)) {
throw new Error(`Input HTML not found: ${inputHtmlPath}`);
}
// Compile the input HTML
const compiled = await compileForRender(suite.srcDir, inputHtmlPath, tempDir);
// Write to output/compiled.html
const outputDir = join(suite.dir, "output");
if (!existsSync(outputDir)) {
mkdirSync(outputDir, { recursive: true });
}
const goldenPath = join(outputDir, "compiled.html");
writeFileSync(goldenPath, compiled.html, "utf-8");
console.log(
`[${suite.id}] ✓ Updated output/compiled.html (${compiled.videos.length} video(s), ${compiled.audios.length} audio(s))`,
);
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
console.error(`[${suite.id}] ✗ Failed to update compiled.html: ${errorMessage}`);
throw error;
} finally {
// Cleanup temp directory
if (existsSync(tempDir)) {
rmSync(tempDir, { recursive: true, force: true });
}
}
}