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  })