github.com/pingcap/tiflow@v0.0.0-20240520035814-5bf52d54e205/dm/ui/plugins/vite-plugin-i18next-scanner/worker.js (about) 1 // src/worker.ts 2 const workerpool = require('workerpool') 3 const vfs = require('vinyl-fs') 4 const { createStream } = require('i18next-scanner') 5 6 // src/options.ts 7 const path = require('path') 8 const { defaults, defaultsDeep } = require('lodash') 9 var defaultOptions = { 10 input: ['src/**/*.{js,jsx,ts,tsx}'], 11 output: './', 12 options: { 13 debug: false, 14 removeUnusedKeys: true, 15 sort: true, 16 attr: { 17 list: ['data-i18n'], 18 extensions: ['.html', '.htm'], 19 }, 20 func: { 21 list: ['t', 'i18next.t', 'i18n.t'], 22 extensions: ['.ts', '.tsx', '.js', '.jsx'], 23 }, 24 trans: { 25 component: 'Trans', 26 i18nKey: 'i18nKey', 27 defaultsKey: 'defaults', 28 extensions: [], 29 fallbackKey: false, 30 }, 31 lngs: ['en'], 32 defaultLng: 'en', 33 defaultValue: function (_, __, key) { 34 return key 35 }, 36 resource: { 37 loadPath: './locales/{{lng}}.json', 38 savePath: './locales/{{lng}}.json', 39 jsonIndent: 2, 40 lineEnding: '\n', 41 }, 42 nsSeparator: ':', 43 keySeparator: '.', 44 pluralSeparator: '_', 45 contextSeparator: '_', 46 contextDefaultValues: [], 47 interpolation: { 48 prefix: '{{', 49 suffix: '}}', 50 }, 51 }, 52 } 53 var defaultPluginOptions = { 54 langs: ['en'], 55 outDir: 'locales', 56 includes: ['src/**/*.{js,jsx,ts,tsx}'], 57 } 58 function mergePluginOptionToScannerOption(a, b) { 59 const o = defaults(b, defaultPluginOptions) 60 a.input = o.includes 61 a.options.lngs = o.langs 62 a.options.resource.savePath = path.join(o.outDir, '{{lng}}.json') 63 a.options.resource.loadPath = path.join(o.outDir, '{{lng}}.json') 64 return a 65 } 66 function normalizeOptions(o = {}) { 67 const options = defaultsDeep({}, defaultOptions) 68 return mergePluginOptionToScannerOption(options, o) 69 } 70 71 // src/worker.ts 72 async function scanAndGenerateResource(input, output, options) { 73 const scannerOptions = normalizeOptions(options) 74 return new Promise((resolve, reject) => { 75 vfs 76 .src(input) 77 .pipe(createStream(scannerOptions.options)) 78 .pipe(vfs.dest(output)) 79 .on('finish', () => resolve()) 80 .on('error', e => reject(e)) 81 }) 82 } 83 workerpool.worker({ 84 scanAndGenerateResource, 85 })