zotero/js-build/ftl-to-json.mjs

53 lines
1.6 KiB
JavaScript
Raw Normal View History

import { ftlToJSON } from "ftl-tx";
import fs from 'fs-extra';
import { dirname, join } from 'path';
import { fileURLToPath } from 'url';
import { ftlFileBaseNames as sourceFileBaseNames } from './config.js';
import { onError, onProgress, onSuccess } from './utils.js';
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
const TRANSIFEX_FILE_NAME = 'zotero.json';
async function getJSON() {
const t1 = performance.now();
const sourceDir = join(ROOT, 'chrome', 'locale', 'en-US', 'zotero');
const destFile = join(sourceDir, TRANSIFEX_FILE_NAME);
let messagesMap = new Map();
for (let sourceFileBaseName of sourceFileBaseNames) {
const sourceFile = join(sourceDir, sourceFileBaseName + '.ftl');
const ftl = await fs.readFile(sourceFile, 'utf8');
const json = ftlToJSON(ftl, { transformTerms: false, storeTermsInJSON: false, skipRefOnly: true });
Object.entries(json).forEach(([key, value]) => {
if (messagesMap.has(key)) {
throw new Error(`Duplicate key: ${key} found in file ${sourceFileBaseName}.ftl`);
}
messagesMap.set(key, value);
});
onProgress(`${sourceFileBaseName}.ftl`, TRANSIFEX_FILE_NAME, 'ftl->json');
}
const messagesJSON = Object.fromEntries(messagesMap);
await fs.outputJSON(destFile, messagesJSON, { spaces: '\t' });
const t2 = performance.now();
return ({
action: 'ftl->json',
count: sourceFileBaseNames.length,
totalCount: sourceFileBaseNames.length,
processingTime: t2 - t1
});
}
if (process.argv[1] === fileURLToPath(import.meta.url)) {
(async () => {
try {
onSuccess(await getJSON());
}
catch (err) {
process.exitCode = 1;
global.isError = true;
onError(err);
}
})();
}