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);
+ },
);
}