Files
openhuman/scripts/verify-i18n-bundle.mjs
T

86 lines
2.3 KiB
JavaScript

#!/usr/bin/env node
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
import { dirname, join, resolve } from "node:path";
import { fileURLToPath } from "node:url";
const root = resolve(dirname(fileURLToPath(import.meta.url)), "..");
let distDir = resolve(root, "app/dist");
for (let i = 2; i < process.argv.length; i += 1) {
const arg = process.argv[i];
if (arg === "--dist") {
const value = process.argv[i + 1];
if (!value) {
console.error("verify-i18n-bundle: --dist requires a path");
process.exit(2);
}
distDir = resolve(process.cwd(), value);
i += 1;
} else if (arg === "--help" || arg === "-h") {
console.log("Usage: node scripts/verify-i18n-bundle.mjs [--dist app/dist]");
process.exit(0);
} else {
console.error(`verify-i18n-bundle: unknown argument: ${arg}`);
process.exit(2);
}
}
function listJsFiles(dir) {
const out = [];
for (const entry of readdirSync(dir)) {
const path = join(dir, entry);
const stat = statSync(path);
if (stat.isDirectory()) {
out.push(...listJsFiles(path));
} else if (entry.endsWith(".js")) {
out.push(path);
}
}
return out;
}
const requiredMarkers = [
{
label: "zh-CN locale key",
needles: ["zh-CN"],
},
{
label: "Simplified Chinese picker label",
needles: ["\u7b80\u4f53\u4e2d\u6587", "\\u7b80\\u4f53\\u4e2d\\u6587"],
},
];
if (!existsSync(distDir) || !statSync(distDir).isDirectory()) {
console.error(
`verify-i18n-bundle: dist directory does not exist or is not a directory: ${distDir}`,
);
process.exit(1);
}
const files = listJsFiles(distDir);
if (files.length === 0) {
console.error(
`verify-i18n-bundle: no JavaScript assets found under ${distDir}`,
);
process.exit(1);
}
const bundle = files.map((file) => readFileSync(file, "utf8")).join("\n");
const missing = requiredMarkers.filter(
(marker) => !marker.needles.some((needle) => bundle.includes(needle)),
);
if (missing.length > 0) {
console.error(
"verify-i18n-bundle: production bundle is missing i18n markers:",
);
for (const marker of missing) {
console.error(` - ${marker.label}`);
}
process.exit(1);
}
console.log(
`verify-i18n-bundle: found ${requiredMarkers.length} required markers in ${files.length} JS assets`,
);