UNPKG

react-i18n-replace

Version:

一个批量支持国际化方法的脚本

106 lines (88 loc) 2.64 kB
import fs from "fs"; import path from "path"; import prettier from "prettier"; import * as parser from "@babel/parser"; import generator from "@babel/generator"; import { glob } from "glob"; import minimist from "minimist"; import traverse from "./traverse"; const options = { default: { help: false, }, boolean: ["help"], alias: { wd: "wrapped", impLib: "importLibrary", impFuncs: "importFunctions", ext: "extension", ignore: "ignore", }, }; const args = minimist(process.argv.slice(2), options); const dir = args?._?.[0]; if (!dir) { console.error(`缺失path参数, 请检查命令是否完整`); process.exit(0); } const required = ["wd", "impLib", "impFuncs", "ext"]; for (let i = 0; i < required.length; i++) { const option = required[i]; if (!args[option]) { console.error(`缺失${option}参数,请检查命令是否完整`); process.exit(1); } } const commandDescriptions = { v: "显示版本号", wd: "字符串包裹的方法名,示例:t或者lang", impLib: "需要导入的包,示例: i18nxt", impFuncs: "从impLib需要导入的方法名,需和--wrapped参数保持一致\n可多次添加此参数,示例:--impFuncs t --impFuncs useTranslate", ext: "需要执行脚本文件的后缀,示例: js,ts,tsx", ignore: "需要忽略的文件夹或文件,示例:node_modules/**\n可多次添加此参数,示例:--ignore node_modules/** --ignore **/*.d.ts", }; const main = async () => { const prettierConfig = (await prettier.resolveConfig(path.resolve(process.cwd(), dir ?? "."))) || {}; const files = await glob( path.resolve(process.cwd(), `${dir}/**/*.{${args.ext}}`), { ignore: args.ignore ?? ["node_modules/**", "**/*.d.ts"], } ); for (let i = 0; i < files.length; i++) { const src = files[i]; var code = fs.readFileSync(src, "utf8"); // const parsedPath = path.parse(src); console.log(`处理文件:${src}`); var ast = parser.parse(code, { sourceType: "module", plugins: ["typescript", "jsx"], }); const traverseAst = traverse(ast, args); const astCode = generator(traverseAst, { retainLines: true, jsescOption: { minimal: true, }, code, }).code; const formatCode = prettier.format(astCode, { parser: "typescript", ...prettierConfig, }); fs.writeFileSync(src, await formatCode, "utf-8"); } }; if (args.help) { for (const key in commandDescriptions) { console.log( `-${key}, --${options.alias[key] || key}: ${commandDescriptions[key]}\n` ); } } else { main(); }