@logistically/i18n-cli
Version:
Enterprise-grade CLI tool for extracting and managing translations in Logistically microservices
59 lines • 2.68 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.extractTranslationKeys = extractTranslationKeys;
exports.createExtractCommand = createExtractCommand;
const commander_1 = require("commander");
const extractor_1 = require("../utils/extractor");
const logger_1 = require("../utils/logger");
const fs_extra_1 = __importDefault(require("fs-extra"));
const logger = logger_1.Logger.getInstance();
// Extracted business logic for better testability
async function extractTranslationKeys(options) {
const extractor = new extractor_1.TranslationExtractor();
const ignorePatterns = options.ignore.split(',').map((pattern) => pattern.trim());
const strings = await extractor.extract({
path: options.path,
ignore: ignorePatterns,
verbose: options.verbose
});
// Save to output file
const outputData = {
keys: strings,
totalKeys: strings.length,
services: [...new Set(strings.map(s => s.file.split('/')[0]))],
generatedAt: new Date().toISOString()
};
await fs_extra_1.default.writeJson(options.output, outputData, { spaces: 2 });
logger.success(`Translation keys saved to ${options.output}`);
// Also save as CSV for easy viewing
const csvFile = options.output.replace('.json', '.csv');
const csvContent = [
'Key,Text,Type,File,Line',
...strings.map(s => `"${s.key}","${s.text}","${s.type}","${s.file}",${s.line}`)
].join('\n');
await fs_extra_1.default.writeFile(csvFile, csvContent);
logger.info(`CSV file saved to ${csvFile}`);
}
function createExtractCommand() {
const command = new commander_1.Command('extract')
.description('Extract translatable strings from TypeScript files')
.option('-p, --path <path>', 'Path to search for TypeScript files', '.')
.option('-o, --output <file>', 'Output file for translation keys', 'translation-keys.json')
.option('-i, --ignore <patterns>', 'Ignore patterns (comma-separated)', '**/node_modules/**,**/dist/**,**/coverage/**,**/*.spec.ts,**/*.test.ts')
.option('-v, --verbose', 'Enable verbose output')
.action(async (options) => {
try {
await extractTranslationKeys(options);
}
catch (error) {
logger.error(`Extraction failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
// Handle error gracefully without exiting
}
});
return command;
}
//# sourceMappingURL=extract.js.map