extract-i18n.js
1 const { extract } = require('@formatjs/cli'); 2 const fs = require('fs'); 3 const { sync: globSync } = require('fast-glob'); 4 const { ArgumentParser } = require('argparse'); 5 6 const OUT_FILE = './src/lang/default/en.json'; 7 const FILE_PATTERN = 'src/**/*.(j|t)s?(x)'; 8 const FILE_IGNORE_PATTERNS = ['**/*.d.ts', '**/*.(j|t)est.(j|t)s?(x)']; 9 const EXTRACT_OPTS = { 10 idInterpolationPattern: '[sha512:contenthash:base64:6]', 11 removeDefaultMessage: false, 12 extractFromFormatMessageCall: true, 13 ast: true, 14 }; 15 16 const parser = new ArgumentParser({ 17 description: 'Databricks i18n Key Extractor', 18 add_help: true, 19 }); 20 parser.add_argument('-l', '--lint', { 21 action: 'store_true', 22 help: 'Only report if the extracted keys need to be updated without actually updating.', 23 }); 24 25 async function main(args) { 26 const files = globSync(FILE_PATTERN, { ignore: FILE_IGNORE_PATTERNS }); 27 28 const extractedMessages = JSON.parse(await extract(files, EXTRACT_OPTS)); 29 console.log(`Extracted ${Object.keys(extractedMessages).length} keys from ${files.length} files`); 30 31 if (args.lint) { 32 let existingMessages = {}; 33 if (fs.existsSync(OUT_FILE)) { 34 existingMessages = JSON.parse(fs.readFileSync(OUT_FILE, 'utf8')); 35 console.log(`There are ${Object.keys(existingMessages).length} existing keys in ${OUT_FILE}`); 36 } else { 37 console.log(`${OUT_FILE} does not exist`); 38 } 39 40 const extractedKeys = Object.keys(extractedMessages); 41 const existingKeys = new Set(Object.keys(existingMessages)); 42 43 if (extractedKeys.length === existingKeys.size && extractedKeys.every((key) => existingKeys.has(key))) { 44 console.log('Extracted keys are up-to-date.'); 45 process.exit(0); 46 } else { 47 console.log('Mismatch detected between extracted keys. Run without --lint to update.'); 48 process.exit(1); 49 } 50 } else { 51 fs.writeFileSync(OUT_FILE, JSON.stringify(extractedMessages, null, 2)); 52 } 53 } 54 55 if (require.main === module) { 56 main(parser.parse_args()); 57 }