diff --git a/packages/cli/src/fontLocalize.test.ts b/packages/cli/src/fontLocalize.test.ts index 43398d51c..9637b2b0e 100644 --- a/packages/cli/src/fontLocalize.test.ts +++ b/packages/cli/src/fontLocalize.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from "vitest"; -import { runFontLocalize, type FontLocalizeIo } from "./fontLocalize.js"; +import { runFontLocalize, stampFontCompilerVersion, type FontLocalizeIo } from "./fontLocalize.js"; function makeIo(input: string): { io: FontLocalizeIo; @@ -70,3 +70,17 @@ describe("runFontLocalize", () => { expect(harness.errors.join(" ")).toContain("empty output"); }); }); + +describe("stampFontCompilerVersion", () => { + it("records the compiler version inside the document head", () => { + const stamped = stampFontCompilerVersion( + "x", + "0.8.15", + ); + + expect(stamped).toContain(''); + expect(stamped.indexOf("hyperframes-font-compiler-version")).toBeLessThan( + stamped.indexOf(""), + ); + }); +}); diff --git a/packages/cli/src/fontLocalize.ts b/packages/cli/src/fontLocalize.ts index 4e01d7119..5dab4bdfe 100644 --- a/packages/cli/src/fontLocalize.ts +++ b/packages/cli/src/fontLocalize.ts @@ -4,6 +4,17 @@ export interface FontLocalizeIo { writeError(value: string): void; } +export function stampFontCompilerVersion(html: string, version: string): string { + const safeVersion = version.replace(/[^A-Za-z0-9.+-]/g, "") || "unknown"; + const tag = ``; + const headClose = html.search(/<\/head\s*>/i); + if (headClose >= 0) return `${html.slice(0, headClose)}${tag}${html.slice(headClose)}`; + const doctype = /^\s*]*>/i.exec(html); + if (!doctype) return `${tag}${html}`; + const insertAt = doctype.index + doctype[0].length; + return `${html.slice(0, insertAt)}${tag}${html.slice(insertAt)}`; +} + function safeErrorName(error: unknown): string { const name = error instanceof Error ? error.name : "UnknownError"; return /^[A-Za-z][A-Za-z0-9]*$/.test(name) ? name : "Error"; diff --git a/packages/cli/src/fontLocalizeCli.ts b/packages/cli/src/fontLocalizeCli.ts index eb6bef8aa..50a7d3f20 100644 --- a/packages/cli/src/fontLocalizeCli.ts +++ b/packages/cli/src/fontLocalizeCli.ts @@ -1,6 +1,7 @@ // fallow-ignore-file unused-file import { injectDeterministicFontFaces } from "@hyperframes/producer"; -import { runFontLocalize } from "./fontLocalize.js"; +import { runFontLocalize, stampFontCompilerVersion } from "./fontLocalize.js"; +import { VERSION } from "./version.js"; async function readStdin(): Promise { const chunks: Buffer[] = []; @@ -18,10 +19,12 @@ export async function main(): Promise { writeOutput: (value) => process.stdout.write(value), writeError: (value) => process.stderr.write(value), }, - (html) => - injectDeterministicFontFaces(html, { + async (html) => { + const localized = await injectDeterministicFontFaces(html, { failClosedFontFetch: true, allowSystemFontCapture: false, - }), + }); + return stampFontCompilerVersion(localized, VERSION); + }, ); }