@nlabs/lex
Version:
75 lines (74 loc) • 8.44 kB
JavaScript
import { existsSync, readFileSync, writeFileSync } from "fs";
import { sync as globSync } from "glob";
import { resolve as pathResolve } from "path";
import { log } from "./log.js";
const flattenTranslations = (obj, prefix = "") => {
let flattened = {};
for (const key in obj) {
const value = obj[key];
const newKey = prefix ? `${prefix}.${key}` : key;
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
flattened = { ...flattened, ...flattenTranslations(value, newKey) };
} else {
flattened[newKey] = String(value);
}
}
return flattened;
};
const findTranslationFiles = (sourcePath) => {
const patterns = [
"**/translations/*.json",
"**/i18n/*.json",
"**/locales/*.json",
"**/lang/*.json"
];
const files = [];
patterns.forEach((pattern) => {
try {
const matches = globSync(pattern, {
absolute: true,
cwd: sourcePath,
nodir: true
});
files.push(...matches);
} catch (error) {
}
});
return files;
};
const processTranslations = async (sourcePath, outputPath, quiet = false) => {
if (!existsSync(sourcePath)) {
log(`Source path does not exist: ${sourcePath}`, "error", quiet);
return;
}
log("Finding translation files...", "info", quiet);
const translationFiles = findTranslationFiles(sourcePath);
if (translationFiles.length === 0) {
log("No translation files found", "warn", quiet);
return;
}
log(`Found ${translationFiles.length} translation files`, "info", quiet);
let allTranslations = {};
for (const filePath of translationFiles) {
try {
const content = readFileSync(filePath, "utf8");
const data = JSON.parse(content);
allTranslations = { ...allTranslations, ...data };
log(`Processed: ${filePath}`, "info", quiet);
} catch (error) {
log(`Error processing ${filePath}: ${error.message}`, "error", quiet);
}
}
const flattenedTranslations = flattenTranslations(allTranslations);
const outputFile = pathResolve(outputPath, "translations.json");
try {
writeFileSync(outputFile, JSON.stringify(flattenedTranslations, null, 2), "utf8");
log(`Translations written to: ${outputFile}`, "info", quiet);
} catch (error) {
log(`Error writing translations file: ${error.message}`, "error", quiet);
}
};
export {
processTranslations
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3V0aWxzL3RyYW5zbGF0aW9ucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjUtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3N5bmMgYXMgZ2xvYlN5bmN9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHtyZXNvbHZlIGFzIHBhdGhSZXNvbHZlfSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtsb2d9IGZyb20gJy4vbG9nLmpzJztcblxuY29uc3QgZmxhdHRlblRyYW5zbGF0aW9ucyA9IChvYmo6IGFueSwgcHJlZml4ID0gJycpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgbGV0IGZsYXR0ZW5lZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGZvcihjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICBjb25zdCBuZXdLZXkgPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICBpZih0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZmxhdHRlbmVkID0gey4uLmZsYXR0ZW5lZCwgLi4uZmxhdHRlblRyYW5zbGF0aW9ucyh2YWx1ZSwgbmV3S2V5KX07XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsYXR0ZW5lZFtuZXdLZXldID0gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdHRlbmVkO1xufTtcblxuY29uc3QgZmluZFRyYW5zbGF0aW9uRmlsZXMgPSAoc291cmNlUGF0aDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBwYXR0ZXJucyA9IFtcbiAgICAnKiovdHJhbnNsYXRpb25zLyouanNvbicsXG4gICAgJyoqL2kxOG4vKi5qc29uJyxcbiAgICAnKiovbG9jYWxlcy8qLmpzb24nLFxuICAgICcqKi9sYW5nLyouanNvbidcbiAgXTtcblxuICBjb25zdCBmaWxlczogc3RyaW5nW10gPSBbXTtcblxuICBwYXR0ZXJucy5mb3JFYWNoKChwYXR0ZXJuKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBnbG9iU3luYyhwYXR0ZXJuLCB7XG4gICAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgICAgICBjd2Q6IHNvdXJjZVBhdGgsXG4gICAgICAgIG5vZGlyOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGZpbGVzLnB1c2goLi4ubWF0Y2hlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFBhdHRlcm4gbm90IGZvdW5kLCBjb250aW51ZVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZpbGVzO1xufTtcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NUcmFuc2xhdGlvbnMgPSBhc3luYyAoXG4gIHNvdXJjZVBhdGg6IHN0cmluZyxcbiAgb3V0cHV0UGF0aDogc3RyaW5nLFxuICBxdWlldDogYm9vbGVhbiA9IGZhbHNlXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgaWYoIWV4aXN0c1N5bmMoc291cmNlUGF0aCkpIHtcbiAgICBsb2coYFNvdXJjZSBwYXRoIGRvZXMgbm90IGV4aXN0OiAke3NvdXJjZVBhdGh9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZygnRmluZGluZyB0cmFuc2xhdGlvbiBmaWxlcy4uLicsICdpbmZvJywgcXVpZXQpO1xuXG4gIGNvbnN0IHRyYW5zbGF0aW9uRmlsZXMgPSBmaW5kVHJhbnNsYXRpb25GaWxlcyhzb3VyY2VQYXRoKTtcblxuICBpZih0cmFuc2xhdGlvbkZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZygnTm8gdHJhbnNsYXRpb24gZmlsZXMgZm91bmQnLCAnd2FybicsIHF1aWV0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2coYEZvdW5kICR7dHJhbnNsYXRpb25GaWxlcy5sZW5ndGh9IHRyYW5zbGF0aW9uIGZpbGVzYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgbGV0IGFsbFRyYW5zbGF0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGZvcihjb25zdCBmaWxlUGF0aCBvZiB0cmFuc2xhdGlvbkZpbGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShjb250ZW50KTtcblxuICAgICAgYWxsVHJhbnNsYXRpb25zID0gey4uLmFsbFRyYW5zbGF0aW9ucywgLi4uZGF0YX07XG5cbiAgICAgIGxvZyhgUHJvY2Vzc2VkOiAke2ZpbGVQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYEVycm9yIHByb2Nlc3NpbmcgJHtmaWxlUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZmxhdHRlbmVkVHJhbnNsYXRpb25zID0gZmxhdHRlblRyYW5zbGF0aW9ucyhhbGxUcmFuc2xhdGlvbnMpO1xuICBjb25zdCBvdXRwdXRGaWxlID0gcGF0aFJlc29sdmUob3V0cHV0UGF0aCwgJ3RyYW5zbGF0aW9ucy5qc29uJyk7XG5cbiAgdHJ5IHtcbiAgICB3cml0ZUZpbGVTeW5jKG91dHB1dEZpbGUsIEpTT04uc3RyaW5naWZ5KGZsYXR0ZW5lZFRyYW5zbGF0aW9ucywgbnVsbCwgMiksICd1dGY4Jyk7XG4gICAgbG9nKGBUcmFuc2xhdGlvbnMgd3JpdHRlbiB0bzogJHtvdXRwdXRGaWxlfWAsICdpbmZvJywgcXVpZXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZyhgRXJyb3Igd3JpdGluZyB0cmFuc2xhdGlvbnMgZmlsZTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgfVxufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxTQUFRLFlBQVksY0FBYyxxQkFBb0I7QUFDdEQsU0FBUSxRQUFRLGdCQUFlO0FBQy9CLFNBQVEsV0FBVyxtQkFBa0I7QUFFckMsU0FBUSxXQUFVO0FBRWxCLE1BQU0sc0JBQXNCLENBQUMsS0FBVSxTQUFTLE9BQStCO0FBQzdFLE1BQUksWUFBb0MsQ0FBQztBQUV6QyxhQUFVLE9BQU8sS0FBSztBQUNwQixVQUFNLFFBQVEsSUFBSSxHQUFHO0FBQ3JCLFVBQU0sU0FBUyxTQUFTLEdBQUcsTUFBTSxJQUFJLEdBQUcsS0FBSztBQUU3QyxRQUFHLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFDdkUsa0JBQVksRUFBQyxHQUFHLFdBQVcsR0FBRyxvQkFBb0IsT0FBTyxNQUFNLEVBQUM7QUFBQSxJQUNsRSxPQUFPO0FBQ0wsZ0JBQVUsTUFBTSxJQUFJLE9BQU8sS0FBSztBQUFBLElBQ2xDO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQUVBLE1BQU0sdUJBQXVCLENBQUMsZUFBaUM7QUFDN0QsUUFBTSxXQUFXO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFFBQWtCLENBQUM7QUFFekIsV0FBUyxRQUFRLENBQUMsWUFBWTtBQUM1QixRQUFJO0FBQ0YsWUFBTSxVQUFVLFNBQVMsU0FBUztBQUFBLFFBQ2hDLFVBQVU7QUFBQSxRQUNWLEtBQUs7QUFBQSxRQUNMLE9BQU87QUFBQSxNQUNULENBQUM7QUFDRCxZQUFNLEtBQUssR0FBRyxPQUFPO0FBQUEsSUFDdkIsU0FBUyxPQUFPO0FBQUEsSUFFaEI7QUFBQSxFQUNGLENBQUM7QUFFRCxTQUFPO0FBQ1Q7QUFFTyxNQUFNLHNCQUFzQixPQUNqQyxZQUNBLFlBQ0EsUUFBaUIsVUFDQztBQUNsQixNQUFHLENBQUMsV0FBVyxVQUFVLEdBQUc7QUFDMUIsUUFBSSwrQkFBK0IsVUFBVSxJQUFJLFNBQVMsS0FBSztBQUMvRDtBQUFBLEVBQ0Y7QUFFQSxNQUFJLGdDQUFnQyxRQUFRLEtBQUs7QUFFakQsUUFBTSxtQkFBbUIscUJBQXFCLFVBQVU7QUFFeEQsTUFBRyxpQkFBaUIsV0FBVyxHQUFHO0FBQ2hDLFFBQUksOEJBQThCLFFBQVEsS0FBSztBQUMvQztBQUFBLEVBQ0Y7QUFFQSxNQUFJLFNBQVMsaUJBQWlCLE1BQU0sc0JBQXNCLFFBQVEsS0FBSztBQUV2RSxNQUFJLGtCQUF1QyxDQUFDO0FBRTVDLGFBQVUsWUFBWSxrQkFBa0I7QUFDdEMsUUFBSTtBQUNGLFlBQU0sVUFBVSxhQUFhLFVBQVUsTUFBTTtBQUM3QyxZQUFNLE9BQU8sS0FBSyxNQUFNLE9BQU87QUFFL0Isd0JBQWtCLEVBQUMsR0FBRyxpQkFBaUIsR0FBRyxLQUFJO0FBRTlDLFVBQUksY0FBYyxRQUFRLElBQUksUUFBUSxLQUFLO0FBQUEsSUFDN0MsU0FBUyxPQUFPO0FBQ2QsVUFBSSxvQkFBb0IsUUFBUSxLQUFLLE1BQU0sT0FBTyxJQUFJLFNBQVMsS0FBSztBQUFBLElBQ3RFO0FBQUEsRUFDRjtBQUVBLFFBQU0sd0JBQXdCLG9CQUFvQixlQUFlO0FBQ2pFLFFBQU0sYUFBYSxZQUFZLFlBQVksbUJBQW1CO0FBRTlELE1BQUk7QUFDRixrQkFBYyxZQUFZLEtBQUssVUFBVSx1QkFBdUIsTUFBTSxDQUFDLEdBQUcsTUFBTTtBQUNoRixRQUFJLDRCQUE0QixVQUFVLElBQUksUUFBUSxLQUFLO0FBQUEsRUFDN0QsU0FBUyxPQUFPO0FBQ2QsUUFBSSxvQ0FBb0MsTUFBTSxPQUFPLElBQUksU0FBUyxLQUFLO0FBQUEsRUFDekU7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K