UNPKG

@voerkai18n/babel

Version:
1 lines 8.8 kB
{"version":3,"sources":["../src/utils.ts","../src/index.ts"],"names":["isEsModule","path","ele","hasImportTranslateFunction","s","hasRequireTranslateFunction","voerkai18nPlugin","babel","t","pluginOptions","idMap","state","autoImport","devIdMap","getIdMap","module","importName","importModule","message","msgId"],"mappings":"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","file":"index.mjs","sourcesContent":["import * as t from \"@babel/types\"\nimport { NodePath } from '@babel/traverse';\nimport type { Voerkai18nBabelPluginOptions } from \".\";\n\n\n/**\n * 判断当前是否是一个esmodule,判断依据是\n * - 包含import语句\n * - 包含export语句\n \n * @param {*} path \n */\nexport function isEsModule(this:Voerkai18nBabelPluginOptions,path:NodePath<any>){\n for(let ele of path.node.body){\n if(ele.type===\"ImportDeclaration\" \n || ele.type===\"ExportNamedDeclaration\" \n || ele.type===\"ExportDefaultDeclaration\"\n ){\n return true\n }\n } \n}\n/**\n * 判断是否导入了翻译函数 \n * import { t } from \"./i18n\"\n * const { t } form \"./languages\"\n * @param {*} path \n * @returns \n */\nexport function hasImportTranslateFunction(this:Voerkai18nBabelPluginOptions,path:NodePath<any>){ \n for(let ele of path.node.body){\n if(ele.type===\"ImportDeclaration\"){ \n if(Array.isArray(ele.specifiers) \n && ele.specifiers.findIndex((s:any) => (s.type === \"ImportSpecifier\") \n && (s.imported.name =='t') \n && (s.local.name==='t'))>-1\n ){ \n return true\n }\n }\n }\n}\nexport function hasRequireTranslateFunction(this:Voerkai18nBabelPluginOptions,path:NodePath<any>){ \n for(let ele of path.node.body){\n if(ele.type===\"VariableDeclaration\"){ \n if(Array.isArray(ele.specifiers) \n && ele.specifiers.findIndex((s:any) => s.type === \"ImportSpecifier\" \n && s.imported.name == 't'\n && s.local.name=== 't')>-1){\n return true\n }\n }\n }\n}","/**\n * 转译源码中的t翻译函数的翻译内容转换为唯一的id值\n * \n * - 将源文件中的t(\"xxxxx\")转码成t(\"id\")\n * - 自动导入languages/index.js中的翻译函数t\n * \n * 查看AST: https://astexplorer.net/\n * Babel插件手册: https://github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md\n * \n * 使用方法:\n * \n * {\n * plugins:[\n * [\"voerkai18n\",{\n * \n * }]\n * ]\n * \n * \n * \n * }\n * \n * \n * \n */\n\nimport { PluginPass } from '@babel/core';\nimport { getIdMap } from \"@voerkai18n/utils\"\nimport { hasImportTranslateFunction, hasRequireTranslateFunction, isEsModule } from \"./utils\";\nimport * as t from \"@babel/types\" \nimport { NodePath } from '@babel/traverse';\n \nexport type Voerkai18nBabelPluginOptions = {\n autoImport?:boolean | string\n idMap?:Record<string,string>\n}\n\nexport default function voerkai18nPlugin(babel:any) {\n const t = babel.types;\n const pluginOptions = {\n autoImport: false, // 是否自动导入t函数 \n idMap:{} // 此参数用于测试使用 默认会读取languages/idMap.json文件\n }\n let idMap:Record<string,any> = {};\n return {\n visitor:{ \n Program(path: NodePath<t.Program>, state:PluginPass & Voerkai18nBabelPluginOptions){ \n // 转码插件参数可以覆盖默认参数\n const { autoImport,idMap:devIdMap } = Object.assign(pluginOptions,state.opts || {}); \n if(Object.keys(idMap).length===0){\n idMap = devIdMap || getIdMap() || {}\n }\n // 是否自动导入t函数\n if(autoImport){\n let module = isEsModule.call(pluginOptions,path) ? 'esm' : 'cjs' \n const importName = \"t\"\n const importModule = typeof(autoImport)=== 'string' ? autoImport : \"@/languages\"\n if(![\"esm\",\"es\",\"cjs\",\"commonjs\"].includes(module)) module = 'esm'\n if(module === 'esm'){\n // 如果没有定义t函数,则自动导入\n if(!hasImportTranslateFunction.call(pluginOptions, path)){ \n path.node.body.unshift(t.importDeclaration([\n t.ImportSpecifier(t.identifier(importName),t.identifier(importName)\n )],t.stringLiteral(importModule)))\n }\n }else{\n if(!hasRequireTranslateFunction.call(pluginOptions, path)){ \n path.node.body.unshift(t.variableDeclaration(\"const\",[\n t.variableDeclarator(\n t.ObjectPattern([t.ObjectProperty(t.Identifier(importName),t.Identifier(importName),false,true)]),\n t.CallExpression(t.Identifier(\"require\"),[t.stringLiteral(importModule)])\n )\n ]))\n } \n } \n } \n },\n // 将t函数的第一个参数转换为id\n CallExpression(path:NodePath<any>){\n if( path.node.callee.name === 't' ){\n if(path.node.arguments.length>0 && t.isStringLiteral(path.node.arguments[0])){\n let message = path.node.arguments[0].value\n const msgId =(message in idMap) ? idMap[message] : message\n path.node.arguments[0] = t.stringLiteral(String(msgId))\n }\n }else{\n path.skip();\n }\n }\n }\n }\n}"]}