UNPKG

@voerkai18n/babel

Version:
1 lines 9.09 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":";;;;AAYO,SAASA,CAAAA,CAA6CC,EAAmB,CAC5E,IAAA,IAAQC,CAAOD,IAAAA,CAAAA,CAAK,KAAK,IACrB,CAAA,GAAGC,CAAI,CAAA,IAAA,GAAO,qBACPA,CAAI,CAAA,IAAA,GAAO,wBACXA,EAAAA,CAAAA,CAAI,OAAO,0BAEd,CAAA,OAAO,KAGnB,CAQO,SAASC,CAA6DF,CAAAA,CAAAA,CAAmB,CAC5F,IAAA,IAAQC,KAAOD,CAAK,CAAA,IAAA,CAAK,KACrB,GAAGC,CAAAA,CAAI,OAAO,mBACP,EAAA,KAAA,CAAM,OAAQA,CAAAA,CAAAA,CAAI,UAAU,CACxBA,EAAAA,CAAAA,CAAI,UAAW,CAAA,SAAA,CAAWE,GAAWA,CAAE,CAAA,IAAA,GAAS,iBAC/CA,EAAAA,CAAAA,CAAE,SAAS,IAAO,EAAA,GAAA,EAClBA,CAAE,CAAA,KAAA,CAAM,OAAO,GAAI,CAAA,CAAE,EAEzB,CAAA,OAAO,KAIvB,CACO,SAASC,CAA8DJ,CAAAA,CAAAA,CAAmB,CAC7F,IAAQC,IAAAA,CAAAA,IAAOD,CAAK,CAAA,IAAA,CAAK,KACrB,GAAGC,CAAAA,CAAI,OAAO,qBACP,EAAA,KAAA,CAAM,QAAQA,CAAI,CAAA,UAAU,CACxBA,EAAAA,CAAAA,CAAI,WAAW,SAAWE,CAAAA,CAAAA,EAAUA,CAAE,CAAA,IAAA,GAAS,mBAC/CA,CAAE,CAAA,QAAA,CAAS,IAAQ,EAAA,GAAA,EACnBA,EAAE,KAAM,CAAA,IAAA,GAAQ,GAAG,CAAA,CAAE,GACxB,OAAO,KAIvB,CChBe,SAARE,EAAkCC,CAAW,CAAA,CAChD,IAAMC,CAAAA,CAAID,EAAM,KACVE,CAAAA,CAAAA,CAAgB,CAClB,UAAA,CAAY,MACZ,KAAM,CAAA,EACV,CACIC,CAAAA,CAAAA,CAA2B,EAC/B,CAAA,OAAO,CACH,OAAA,CAAQ,CACJ,OAAQT,CAAAA,CAAAA,CAA2BU,CAAgD,CAAA,CAE/E,GAAM,CAAE,UAAA,CAAAC,CAAW,CAAA,KAAA,CAAMC,CAAS,CAAI,CAAA,MAAA,CAAO,OAAOJ,CAAcE,CAAAA,CAAAA,CAAM,MAAQ,EAAE,CAKlF,CAAA,GAJG,OAAO,IAAKD,CAAAA,CAAK,CAAE,CAAA,MAAA,GAAS,IAC3BA,CAAQG,CAAAA,CAAAA,EAAYC,QAAS,EAAA,EAAK,EAGnCF,CAAAA,CAAAA,CAAAA,CAAW,CACV,IAAIG,CAAAA,CAASf,EAAW,IAAKS,CAAAA,CAAAA,CAAcR,CAAI,CAAA,CAAI,MAAQ,KACrDe,CAAAA,CAAAA,CAAa,GACbC,CAAAA,CAAAA,CAAe,OAAOL,CAAe,EAAA,QAAA,CAAWA,CAAa,CAAA,aAAA,CAC/D,CAAC,KAAM,CAAA,IAAA,CAAK,KAAM,CAAA,UAAU,EAAE,QAASG,CAAAA,CAAM,CAAGA,GAAAA,CAAAA,CAAS,OAC1DA,CAAW,GAAA,KAAA,CAENZ,CAA2B,CAAA,IAAA,CAAKM,EAAeR,CAAI,CAAA,EACnDA,CAAK,CAAA,IAAA,CAAK,KAAK,OAAQO,CAAAA,CAAAA,CAAE,kBAAkB,CACvCA,CAAAA,CAAE,gBAAgBA,CAAE,CAAA,UAAA,CAAWQ,CAAU,CAAA,CAAER,EAAE,UAAWQ,CAAAA,CAAU,CACtE,CAAC,EAAER,CAAE,CAAA,aAAA,CAAcS,CAAY,CAAC,CAAC,CAGjCZ,CAAAA,CAAAA,CAA4B,IAAKI,CAAAA,CAAAA,CAAeR,CAAI,CACpDA,EAAAA,CAAAA,CAAK,IAAK,CAAA,IAAA,CAAK,QAAQO,CAAE,CAAA,mBAAA,CAAoB,OAAQ,CAAA,CACjDA,EAAE,kBACEA,CAAAA,CAAAA,CAAE,aAAc,CAAA,CAACA,EAAE,cAAeA,CAAAA,CAAAA,CAAE,WAAWQ,CAAU,CAAA,CAAER,EAAE,UAAWQ,CAAAA,CAAU,CAAE,CAAA,KAAA,CAAM,IAAI,CAAC,CAAC,CAChGR,CAAAA,CAAAA,CAAE,eAAeA,CAAE,CAAA,UAAA,CAAW,SAAS,CAAA,CAAE,CAACA,CAAE,CAAA,aAAA,CAAcS,CAAY,CAAC,CAAC,CAC5E,CACJ,CAAC,CAAC,EAGd,CACJ,CAAA,CAEA,cAAehB,CAAAA,CAAAA,CAAmB,CAC9B,GAAIA,CAAAA,CAAK,IAAK,CAAA,MAAA,CAAO,OAAS,GAC1B,CAAA,CAAA,GAAGA,EAAK,IAAK,CAAA,SAAA,CAAU,OAAO,CAAKO,EAAAA,CAAAA,CAAE,eAAgBP,CAAAA,CAAAA,CAAK,KAAK,SAAU,CAAA,CAAC,CAAC,CAAA,CAAE,CACzE,IAAIiB,CAAAA,CAAUjB,CAAK,CAAA,IAAA,CAAK,UAAU,CAAC,CAAA,CAAE,MAC/BkB,CAAQD,CAAAA,CAAAA,IAAWR,EAASA,CAAMQ,CAAAA,CAAO,CAAIA,CAAAA,CAAAA,CACnDjB,EAAK,IAAK,CAAA,SAAA,CAAU,CAAC,CAAA,CAAIO,EAAE,aAAc,CAAA,MAAA,CAAOW,CAAK,CAAC,EAC1D,CAEAlB,CAAAA,KAAAA,CAAAA,CAAK,OAEb,CACJ,CACJ,CACJ","file":"index.mjs","sourcesContent":["import * as t from \"@babel/types\"\r\nimport { NodePath } from '@babel/traverse';\r\nimport type { Voerkai18nBabelPluginOptions } from \".\";\r\n\r\n\r\n/**\r\n * 判断当前是否是一个esmodule,判断依据是\r\n * - 包含import语句\r\n * - 包含export语句\r\n \r\n * @param {*} path \r\n */\r\nexport function isEsModule(this:Voerkai18nBabelPluginOptions,path:NodePath<any>){\r\n for(let ele of path.node.body){\r\n if(ele.type===\"ImportDeclaration\" \r\n || ele.type===\"ExportNamedDeclaration\" \r\n || ele.type===\"ExportDefaultDeclaration\"\r\n ){\r\n return true\r\n }\r\n } \r\n}\r\n/**\r\n * 判断是否导入了翻译函数 \r\n * import { t } from \"./i18n\"\r\n * const { t } form \"./languages\"\r\n * @param {*} path \r\n * @returns \r\n */\r\nexport function hasImportTranslateFunction(this:Voerkai18nBabelPluginOptions,path:NodePath<any>){ \r\n for(let ele of path.node.body){\r\n if(ele.type===\"ImportDeclaration\"){ \r\n if(Array.isArray(ele.specifiers) \r\n && ele.specifiers.findIndex((s:any) => (s.type === \"ImportSpecifier\") \r\n && (s.imported.name =='t') \r\n && (s.local.name==='t'))>-1\r\n ){ \r\n return true\r\n }\r\n }\r\n }\r\n}\r\nexport function hasRequireTranslateFunction(this:Voerkai18nBabelPluginOptions,path:NodePath<any>){ \r\n for(let ele of path.node.body){\r\n if(ele.type===\"VariableDeclaration\"){ \r\n if(Array.isArray(ele.specifiers) \r\n && ele.specifiers.findIndex((s:any) => s.type === \"ImportSpecifier\" \r\n && s.imported.name == 't'\r\n && s.local.name=== 't')>-1){\r\n return true\r\n }\r\n }\r\n }\r\n}","/**\r\n * 转译源码中的t翻译函数的翻译内容转换为唯一的id值\r\n * \r\n * - 将源文件中的t(\"xxxxx\")转码成t(\"id\")\r\n * - 自动导入languages/index.js中的翻译函数t\r\n * \r\n * 查看AST: https://astexplorer.net/\r\n * Babel插件手册: https://github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md\r\n * \r\n * 使用方法:\r\n * \r\n * {\r\n * plugins:[\r\n * [\"voerkai18n\",{\r\n * \r\n * }]\r\n * ]\r\n * \r\n * \r\n * \r\n * }\r\n * \r\n * \r\n * \r\n */\r\n\r\nimport { PluginPass } from '@babel/core';\r\nimport { getIdMap } from \"@voerkai18n/utils\"\r\nimport { hasImportTranslateFunction, hasRequireTranslateFunction, isEsModule } from \"./utils\";\r\nimport * as t from \"@babel/types\" \r\nimport { NodePath } from '@babel/traverse';\r\n \r\nexport type Voerkai18nBabelPluginOptions = {\r\n autoImport?:boolean | string\r\n idMap?:Record<string,string>\r\n}\r\n\r\nexport default function voerkai18nPlugin(babel:any) {\r\n const t = babel.types;\r\n const pluginOptions = {\r\n autoImport: false, // 是否自动导入t函数 \r\n idMap:{} // 此参数用于测试使用 默认会读取languages/idMap.json文件\r\n }\r\n let idMap:Record<string,any> = {};\r\n return {\r\n visitor:{ \r\n Program(path: NodePath<t.Program>, state:PluginPass & Voerkai18nBabelPluginOptions){ \r\n // 转码插件参数可以覆盖默认参数\r\n const { autoImport,idMap:devIdMap } = Object.assign(pluginOptions,state.opts || {}); \r\n if(Object.keys(idMap).length===0){\r\n idMap = devIdMap || getIdMap() || {}\r\n }\r\n // 是否自动导入t函数\r\n if(autoImport){\r\n let module = isEsModule.call(pluginOptions,path) ? 'esm' : 'cjs' \r\n const importName = \"t\"\r\n const importModule = typeof(autoImport)=== 'string' ? autoImport : \"@/languages\"\r\n if(![\"esm\",\"es\",\"cjs\",\"commonjs\"].includes(module)) module = 'esm'\r\n if(module === 'esm'){\r\n // 如果没有定义t函数,则自动导入\r\n if(!hasImportTranslateFunction.call(pluginOptions, path)){ \r\n path.node.body.unshift(t.importDeclaration([\r\n t.ImportSpecifier(t.identifier(importName),t.identifier(importName)\r\n )],t.stringLiteral(importModule)))\r\n }\r\n }else{\r\n if(!hasRequireTranslateFunction.call(pluginOptions, path)){ \r\n path.node.body.unshift(t.variableDeclaration(\"const\",[\r\n t.variableDeclarator(\r\n t.ObjectPattern([t.ObjectProperty(t.Identifier(importName),t.Identifier(importName),false,true)]),\r\n t.CallExpression(t.Identifier(\"require\"),[t.stringLiteral(importModule)])\r\n )\r\n ]))\r\n } \r\n } \r\n } \r\n },\r\n // 将t函数的第一个参数转换为id\r\n CallExpression(path:NodePath<any>){\r\n if( path.node.callee.name === 't' ){\r\n if(path.node.arguments.length>0 && t.isStringLiteral(path.node.arguments[0])){\r\n let message = path.node.arguments[0].value\r\n const msgId =(message in idMap) ? idMap[message] : message\r\n path.node.arguments[0] = t.stringLiteral(String(msgId))\r\n }\r\n }else{\r\n path.skip();\r\n }\r\n }\r\n }\r\n }\r\n}"]}