Files
MorphDoc/scripts/build-font-packs.mjs
T

76 lines
2.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { readFile } from "node:fs/promises";
import { dirname, join, resolve } from "node:path";
import { fileURLToPath } from "node:url";
import {
buildFontPack,
verifyFontPack
} from "../packages/font-pack-builder/dist/index.js";
import { discoverFontPacks } from "../packages/font-pack-registry/dist/index.js";
const repositoryRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
const bundlePath = join(repositoryRoot, "font-packs", "bundle.json");
const bundle = JSON.parse(await readFile(bundlePath, "utf8"));
const outputRoot = join(repositoryRoot, "output", "font-packs", "root");
const appVersion = process.env.npm_package_version || "0.6.0";
if (
bundle.schemaVersion !== 1 ||
!Array.isArray(bundle.packs) ||
bundle.packs.length === 0
) {
throw new Error("字体包集合清单无效");
}
const identities = new Set();
const reports = [];
for (const pack of bundle.packs) {
const identity = `${pack.id}@${pack.version}`;
if (identities.has(identity)) {
throw new Error(`字体包集合存在重复项:${identity}`);
}
identities.add(identity);
const reportPath = join(
repositoryRoot,
"output",
"font-packs",
`${pack.id}-build-report.json`
);
const built = await buildFontPack({
recipePath: resolve(repositoryRoot, pack.recipe),
sourceRoot: resolve(repositoryRoot, pack.sourceRoot),
outputRoot,
reportPath
});
const verified = await verifyFontPack({
root: outputRoot,
appVersion,
packId: pack.id,
packVersion: pack.version
});
reports.push({ identity, built, verified });
}
const registry = await discoverFontPacks({
roots: [outputRoot],
appVersion
});
const errors = registry.diagnostics.filter((item) => item.severity === "error");
if (errors.length > 0) {
throw new Error(
`字体包集合注册失败:${errors.map((item) => `${item.code} ${item.message}`).join("")}`
);
}
const actualIdentities = registry.packs
.map((pack) => `${pack.id}@${pack.version}`)
.sort();
const expectedIdentities = [...identities].sort();
if (JSON.stringify(actualIdentities) !== JSON.stringify(expectedIdentities)) {
throw new Error(
`字体包输出根目录包含清单外内容:期望 ${expectedIdentities.join(", ")},实际 ${actualIdentities.join(", ")}`
);
}
process.stdout.write(
`${JSON.stringify({ appVersion, outputRoot, registryFingerprint: registry.fingerprint, reports }, null, 2)}\n`
);