{"version":3,"sources":["../../../node_modules/.pnpm/flex-tools@1.4.41/node_modules/flex-tools/src/errors.ts","../../../node_modules/.pnpm/flex-tools@1.4.41/node_modules/flex-tools/dist/chunk-R42SWOGE.mjs","../src/getSettingsFromPackageJson.ts","../src/getDefaultLanguageDir.ts","../src/getLanguageDir.ts","../src/getIdMap.ts","../src/isVoerkaI18nInstalled.ts","../src/escapeRegex.ts","../src/applyIdMap.ts","../src/getVoerkaI18nSettings.ts","../src/getBcp47LanguageApi.ts","../src/getFileNamespace.ts","../src/getApi.ts","../src/aiQuestion.ts","../../../node_modules/.pnpm/flex-tools@1.4.41/node_modules/flex-tools/src/package/getPackageModuleType.ts","../../../node_modules/.pnpm/flex-tools@1.4.41/node_modules/flex-tools/src/func/promisify.ts","../src/getProjectContext.ts","../src/getBackupFile.ts","../src/addToGitIgnore.ts","../src/trimChars.ts","../src/hasImport.ts","../src/addImport.ts","../../../node_modules/.pnpm/flex-tools@1.4.41/node_modules/flex-tools/src/typecheck/isNumber.ts","../src/isMessageId.ts","../src/getDir.ts","../src/indentString.ts","../src/fetchJson.ts","../src/encodeRegExp.ts","../src/extractMessages.ts","../../../node_modules/.pnpm/flex-tools@1.4.41/node_modules/flex-tools/src/typecheck/isPlainObject.ts","../../../node_modules/.pnpm/flex-tools@1.4.41/node_modules/flex-tools/src/object/pick.ts","../src/extractParagraphs.ts"],"names":["InvalidProjectPathError","getPackageRootPath","entryPath","excludeCurrent","path","r","pkgFile","fs","parent","a","b","c","getPackageJson","entry","findUp","packageRoot","__require","getSettingsFromPackageJson","pkg","settings","undefined","Object","assign","voerkai18n","getDefaultLanguageDir","cwd","process","env","INIT_CWD","srcPath","join","existsSync","getLanguageDir","options","location","autoCreate","absolute","langDir","isAbsolute","mkdirSync","recursive","relative","e","console","error","getIdMap","idMapFile","JSON","parse","readFileSync","encoding","isVoerkaI18nInstalled","settingsFile","escapeRegex","input","replace","getMessageRegex","names","RegExp","map","name","getComponentRegex","tags","tag","applyIdMap","code","idMap","tFuncNames","tComponentNames","matched","pre","tName","_","message","n","tagName","attrs","getVoerkaI18nSettings","packageJsonSettings","namespaces","settingFile","require","defaultLanguage","languages","find","lang","default","activeLanguage","active","getBcp47LanguageApi","osLocale","split","inNamespace","filePath","nsPath","startsWith","getFileNamespace","file","value","entries","paths","Array","isArray","getApi","defaultValue","apikeyFile","apikeys","removeCodeBlock","text","aiQuestion","prompt","apiUrl","apiKey","temperature","model","roles","request","messages","role","content","data","res","axios","post","headers","status","Error","statusText","result","choices","trim","err","getPackageModuleType","packageJson","fileIsExists","filename","isTypeScriptPackage","projectFolder","buildNodejsArgs","args","callback","parseNodejsCallback","results","promisify","fn","buildArgs","parseCallback","resolve","reject","callArgs","readFile","getPromptTemplate","defaultPrompt","promptDir","promptFile","endsWith","getDefaultPatterns","patterns","langRelDir","push","every","p","apiFile","apis","getApiParams","api","call","forEach","key","length","substring","toLowerCase","getDir","dir","getProjectContext","ctx","rootDir","replaceAll","sep","settingRelFile","getPrompt","bind","getTranslateMessagesDir","getTranslateParagraphsDir","getMessagesDir","getParagraphsDir","typescript","moduleType","getBackupFile","i","extName","extname","bakFile","addToGitIgnore","files","projectRoot","gitignoreFile","writeFileSync","toString","lines","newLines","includes","trimChars","str","chars","start","end","RequireRegex","hasImport","importName","test","reg","addImport","fromModule","scriptSection","importCode","hasScript","scriptBegin","scriptContent","scriptEnd","isNumber","strict","v","isMessageId","spath","indentString","indent","indentChars","repeat","line","fetchJson","urls","url","response","get","encodeRegExp","regex","vars","k","commentRegexs","removeComments","language","filetype","regexps","messageExtractors","getMessageExtractors","parseTranslateMessagesByRegex","exec","index","lastIndex","groups","rang","extractMessagesUseRegex","namespace","extractMessages","opts","isPlainObject","obj","proto","baseProto","pick","source","keys","defaultValues","newObject","field","attrsRegex","parseTranslateAttrs","attrsMap","paragraphExtractors","getParagraphExtractors","parseParagraphsByRegex","paragraphs","extractParagraphs"],"mappings":"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","file":"index.mjs","sourcesContent":["\nexport class InvalidProjectPathError extends Error{}\nexport class CircularRefError extends Error{}\nexport class TimeoutError  extends Error{}","/**\n*   ---=== FlexTools ===---\n*   https://zhangfisher.github.com/flex-tools \n*/\nvar i=Object.create;var f=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var l=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty;var g=a=>{throw TypeError(a)};var o=(a=>typeof require<\"u\"?require:typeof Proxy<\"u\"?new Proxy(a,{get:(b,c)=>(typeof require<\"u\"?require:b)[c]}):a)(function(a){if(typeof require<\"u\")return require.apply(this,arguments);throw Error('Dynamic require of \"'+a+'\" is not supported')});var p=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports);var n=(a,b,c,d)=>{if(b&&typeof b==\"object\"||typeof b==\"function\")for(let e of k(b))!m.call(a,e)&&e!==c&&f(a,e,{get:()=>b[e],enumerable:!(d=j(b,e))||d.enumerable});return a};var q=(a,b,c)=>(c=a!=null?i(l(a)):{},n(b||!a||!a.__esModule?f(c,\"default\",{value:a,enumerable:true}):c,a));var h=(a,b,c)=>b.has(a)||g(\"Cannot \"+c);var r=(a,b,c)=>(h(a,b,\"read from private field\"),c?c.call(a):b.get(a)),s=(a,b,c)=>b.has(a)?g(\"Cannot add the same private member more than once\"):b instanceof WeakSet?b.add(a):b.set(a,c),t=(a,b,c,d)=>(h(a,b,\"write to private field\"),d?d.call(a,c):b.set(a,c),c);export{o as a,p as b,q as c,r as d,s as e,t as f};//# sourceMappingURL=chunk-R42SWOGE.mjs.map\n//# sourceMappingURL=chunk-R42SWOGE.mjs.map","import { VoerkaI18nPackageJsonSettings } from \"./types\"\r\nimport { getPackageJson } from \"flex-tools/package/getPackageJson\"\r\n \r\n/**\r\n * \r\n * 从当前文件的package.json读取voerkai18n配置\r\n * \r\n */\r\nexport function getSettingsFromPackageJson(entry?:string):VoerkaI18nPackageJsonSettings{\r\n\tconst pkg =  getPackageJson(entry,false)\r\n    const settings = { entry: undefined }\r\n\tif(typeof(pkg)=='object' &&  \"voerkai18n\" in pkg){\r\n\t\tObject.assign(settings,pkg.voerkai18n)\r\n\t} \r\n\treturn settings\r\n}","/**\r\n *\r\n * 获取VoerkaI18n语言文件夹\r\n * \r\n */\r\n\r\nimport fs from \"node:fs\"\r\nimport path from \"node:path\" \r\nimport { getExistedDir } from \"flex-tools/fs/getExistedDir\"\r\nimport { LanguagesDirOptions } from \"./getLanguageDir\"\r\n\r\n \r\n/**\r\n * \r\n * 获取语言文件夹\r\n * \r\n * - 读取package.json中的voerkai18n字段\r\n * - 如果没有，则在当前文件夹下查找\r\n *      - <src/languages>\r\n *      - <languages>\r\n * \r\n * 如果目录不存在，则自动创建\r\n * \r\n * \r\n * @returns \r\n * @param location 指定入口文件夹\r\n * @param created 是否创建\r\n */\r\nexport function getDefaultLanguageDir():string{    \r\n    const cwd = process.env.INIT_CWD || process.cwd()\r\n    const srcPath = path.join(cwd,\"src\")\r\n    if(fs.existsSync(srcPath)){\r\n        return  path.join(srcPath,\"languages\")\r\n    }else{\r\n        return path.join(cwd,\"languages\")\r\n    } \r\n}\r\n","/**\r\n *\r\n * 获取VoerkaI18n语言文件夹\r\n * \r\n */\r\n\r\nimport { getSettingsFromPackageJson } from \"./getSettingsFromPackageJson\"\r\nimport fs from \"node:fs\"\r\nimport path from \"node:path\"  \r\nimport { getDefaultLanguageDir } from \"./getDefaultLanguageDir\"\r\n\r\n\r\nexport type LanguagesDirOptions = {\r\n    location?   : string\r\n    autoCreate? : boolean\r\n    absolute?   : boolean           // 是否返回绝对路径\r\n}\r\n\r\n/**\r\n * \r\n * 获取语言工作文件夹\r\n * \r\n * - 读取package.json中的voerkai18n字段\r\n * - 如果没有，则在当前文件夹下查找\r\n *      - <src/languages>\r\n *      - <languages>\r\n * \r\n * 如果目录不存在，则自动创建\r\n * \r\n * \r\n * @returns \r\n * @param location 指定入口文件夹\r\n * @param created 是否创建\r\n */\r\nexport function getLanguageDir(options?:LanguagesDirOptions):string{    \r\n    const { location,autoCreate,absolute } = Object.assign({\r\n        autoCreate:true,\r\n        absolute:true\r\n    }, options)      \r\n \r\n    const cwd = process.env.INIT_CWD ||  process.cwd()\r\n\r\n    try{\r\n        const { entry } = getSettingsFromPackageJson(location)     \r\n\r\n        let langDir :string = entry || getDefaultLanguageDir() \r\n        langDir = path.isAbsolute(langDir) ?  langDir : path.join(cwd,langDir)\r\n\r\n        if(autoCreate && !fs.existsSync(langDir)){\r\n            fs.mkdirSync(langDir,{ recursive: true })\r\n        }\r\n\r\n        return absolute ? langDir : path.relative(cwd,langDir)\r\n\r\n    }catch(e){\r\n        console.error(\"获取语言文件夹失败\",e)\r\n        return \"src/languages\"\r\n    }    \r\n}\r\n","import path from \"node:path\"\r\nimport fs from \"node:fs\"\r\nimport { getLanguageDir } from \"./getLanguageDir\"\r\n\r\nexport function getIdMap(idMapFile?:string): Record<string,string> | undefined{\r\n    if(!idMapFile){\r\n        const langDir = getLanguageDir({autoCreate:false,absolute:true})\r\n        idMapFile = path.join(langDir,\"idMap.json\")\r\n    }    \r\n    try{        \r\n        if(fs.existsSync(idMapFile!)){\r\n            return JSON.parse(fs.readFileSync(idMapFile!,{encoding:\"utf-8\"}))\r\n        }\r\n    }catch{\r\n\r\n    } \r\n}","import fs from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { getLanguageDir } from \"./getLanguageDir\";\r\n\r\n/**\r\n * \r\n * 检查当前工程是否已经安装了voerkai18n支持\r\n * \r\n * @returns \r\n */\r\nexport function isVoerkaI18nInstalled(): boolean {\r\n    const langDir = getLanguageDir({\r\n        autoCreate: false\r\n    });\r\n    const settingsFile = path.join(langDir, \"settings.json\");\r\n    return fs.existsSync(settingsFile); \r\n}","\r\nexport function escapeRegex(input:string) {\r\n    return input.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\r\n}","/**\r\n * 将idMap应用到翻译结果中\r\n * \r\n */\r\n\r\nimport { escapeRegex } from \"./escapeRegex\"\r\n\r\n \r\n\r\n// 捕获翻译文本正则表达式二： 能够支持复杂的表达式，但是当提供不完整的t函数定义时，也会进行匹配提取 \r\n// const MessageRegex = /([ \\t\\^;\\{\\(\\,=\\'\\\"\\.\\[\\|\\+\\>])(t)\\(\\s*([\"']{1})(.*?)(\\3)/gm\r\n// const MessageComponentRegex = /<Translate\\s+[^>]*(?<![:@#%&*])message\\s*=\\s*(?:\"([^\"]+)\"|{[\"'`](.+?)[\"'`]}|{`([^`]+)`})/gm\r\n\r\nconst getMessageRegex = (names:string[]=['t'])=>{     \r\n    return new RegExp(`([ \\\\t\\\\^;\\\\{\\\\(\\\\,=\\\\'\\\\\"\\\\.\\\\[\\\\|\\\\+\\\\>])(${names.map(name=>escapeRegex(name)).join(\"|\")})\\\\(\\\\s*([\"']{1})(.*?)(\\\\3)`,\"gm\")    \r\n}\r\nconst getComponentRegex = (tags:string[]=['Translate'])=>{     \r\n    return new RegExp(`<(${tags.map(tag=>escapeRegex(tag)).join(\"|\")})(\\\\s+[^>]*)(?<![:@#%&*])message\\\\s*=\\\\s*(?:\"([^\"]+)\"|{[\"'\\`](.+?)[\"'\\`]}|{\\`([^\\`]+)\\`})`,\"gm\")    \r\n}\r\n\r\nexport type ApplyIdMapOptions = {\r\n    tFuncNames?: string[]\r\n    tComponentNames?:string[]\r\n}\r\n\r\nexport function applyIdMap(code:string,idMap:Record<string,string>,options?:ApplyIdMapOptions):string{ \r\n    const { tFuncNames, tComponentNames } = Object.assign({\r\n        tFuncNames:['t','$t'],\r\n        tComponentNames:['Translate','v-translate']\r\n    },options)\r\n    return code.replace(getMessageRegex(tFuncNames),(matched,pre,tName,_,message,n)=>{ \r\n        return `${pre}${tName}('${idMap[message] || message}'`\r\n    }).replace(getComponentRegex(tComponentNames),(_,tagName,attrs,message)=>{\r\n        return `<${tagName}${attrs}message=\"${idMap[message] || message}\"`\r\n    })\r\n}\r\n\r\n\r\n// console.log(applyIdMap(String.raw`\r\n//   t(\"aaa\") \r\n//   t('bbb') \r\n//   t(\"ccc\", {xxx:xxx})\r\n//   t('ddd', [1,2,3,\"\"])\r\n//   t(\"eee\", {xxx:xxx},{})\r\n//   t('fff', [1,2,3,\"\"],{})\r\n//   t(\"ggg\", {xxx:xxx},()=>{}) \r\n//   t('hhh', [1,2,3,\"\"],()=>{})  \r\n//   $t('iii', [1,2,3,\"\"],()=>{})  \r\n// `,{\r\n//     \"aaa\":\"1\",\r\n//     \"bbb\":\"2\",\r\n//     \"ccc\":\"3\",\r\n//     \"ddd\":\"4\",\r\n//     \"eee\":\"5\",\r\n//     \"fff\":\"6\",\r\n//     \"ggg\":\"7\",\r\n//     \"hhh\":\"8\"    \r\n// }))\r\n","import { getLanguageDir } from \"./getLanguageDir\";\r\nimport { getSettingsFromPackageJson } from \"./getSettingsFromPackageJson\";\r\nimport path from \"node:path\"\r\nimport fs from \"node:fs\"\r\nimport type { VoerkaI18nLanguage, VoerkaI18nSettings } from \"@voerkai18n/runtime\";\r\n\r\n\r\nexport function getVoerkaI18nSettings():VoerkaI18nSettings{\r\n\r\n    const packageJsonSettings = getSettingsFromPackageJson()    \r\n\r\n    const langDir = getLanguageDir({\r\n        autoCreate: false\r\n    })\r\n\r\n    const settings = Object.assign({\r\n        namespaces : {},\r\n    },packageJsonSettings) as VoerkaI18nSettings\r\n\r\n    \r\n    const settingFile = path.join(langDir, \"settings.json\")\r\n    if(fs.existsSync(settingFile)){\r\n        Object.assign(settings, require(settingFile))\r\n    }        \r\n\r\n    // @ts-ignore\r\n    settings.defaultLanguage = (settings.languages || []).find((lang:VoerkaI18nLanguage) => lang.default)?.name\r\n\r\n    // @ts-ignore\r\n    settings.activeLanguage = (settings.languages || []).find((lang:VoerkaI18nLanguage) => lang.active)?.name\r\n\r\n    return settings as VoerkaI18nSettings\r\n}","\r\nexport function getBcp47LanguageApi(osLocale:string = 'en-US') {\r\n    try{\r\n        return require(`bcp47-language-tags/${osLocale.split(\"-\")[0]}`)\r\n    }catch(e){\r\n        return require(\"bcp47-language-tags/en\")\r\n    }    \r\n}\r\n","import type { VoerkaI18nNamespaces } from '@voerkai18n/runtime'\r\nimport path from 'node:path'\r\n\r\n/**\r\n * \r\n * 返回filePath是否在nsPaths名称空间内\r\n * \r\n * inNamespace(\"a/b/c/xxx.js\",\"a/b\")  == true\r\n * inNamespace(\"a/c/c/xxx.js\",\"a/b\")  == false\r\n * \r\n * @param {*} filePath  文件路径\r\n * @param {*} nsPath  名称空间的路径\r\n * @returns \r\n */\r\nfunction inNamespace(filePath:string,nsPath:string){\r\n    return !path.relative(nsPath,filePath).startsWith(\"..\") \r\n\r\n\r\n}\r\n/**\r\n * \r\n * 输入一个namespaces配置，\r\n * const namespaces = {\r\n *   \"a\":\"src/a\",\r\n *   \"b\":[\"src/b\",\"src/c\"],\r\n *   \"c\":(file)=>file.startsWith(\"src/c\")\r\n * }\r\n * \r\n * 如果输入的文件在namespace指定的路径内，则返回namespace的名称\r\n * \r\n * \r\n * @param {*} file \r\n * @param {*} options.namespaces  名称空间配置 {<name>:[path,...,path],<name>:path,<name>:(file)=>{}}\r\n */\r\nexport function getFileNamespace(file:string,namespaces?:VoerkaI18nNamespaces):string{\r\n    if(!namespaces) return \"default\"\r\n    if(!file) return \"default\"\r\n    const cwd = process.env.INIT_CWD || process.cwd()\r\n    file = path.isAbsolute(file) ? file : path.join(cwd,file)\r\n    for(let [name,value] of Object.entries(namespaces)){\r\n        if(typeof(value)=== 'function'){\r\n            if(value(file)===true) return name\r\n        }else{\r\n            const paths = Array.isArray(value) ? value : [value]\r\n            for(let nsPath of paths){\r\n                nsPath = path.isAbsolute(nsPath) ? nsPath : path.join(cwd,nsPath)\r\n                if(inNamespace(file,nsPath)){\r\n                    return name\r\n                }\r\n            }\r\n        }\r\n    }\r\n    return \"default\"\r\n}","/**\r\n * 在languages/.apikey.json中获取对应的API Key\r\n * \r\n * .apikey.json文件格式如下：\r\n * {\r\n *  \"baidu\": {\r\n * \r\n *   },\r\n *   \"deepseek\": {\r\n *     \"appid\": \"xxxx\",\r\n *   }\r\n * }\r\n * \r\n * \r\n * 之所有api key放在单独的文件中，是因为api key是敏感信息，不应该放在代码中\r\n * 所以应该在.gitignore中忽略这个文件\r\n * \r\n */\r\n\r\nimport { getLanguageDir } from \"./getLanguageDir\"\r\nimport path from \"node:path\"\r\nimport fs from 'node:fs';\r\n\r\nexport function getApi<T extends Record<string,any> =Record<string,any>>(name:string,defaultValue?:Partial<T>):T | undefined{\r\n    // 读取.apikey.json文件\r\n    const langDir = getLanguageDir()\r\n    const apikeyFile = path.join(langDir,\"./api.json\")\r\n    if(fs.existsSync(apikeyFile)){                    \r\n        const apikeys = JSON.parse(fs.readFileSync(apikeyFile,\"utf-8\"))\r\n        return apikeys[name] || defaultValue  \r\n    }\r\n    return defaultValue as T\r\n}","import axios from 'axios';\r\n\r\n\r\nexport type AiRole = {\r\n    role: string\r\n    content: string\r\n}\r\nexport interface AiQuestionOptions {\r\n    model?: string\r\n    temperature?: number\r\n    apiUrl: string\r\n    apiKey: string\r\n    roles?: AiRole[]\r\n}\r\n\r\nexport interface AiResponse {\r\n    choices: {\r\n        message: {\r\n            content: string\r\n        }\r\n    }[]\r\n}\r\n\r\nexport type AiError = Error & {\r\n    response?: Response\r\n    data?: any\r\n}\r\n\r\n/**\r\n * 输入一个代码块，返回代码块中的所有字符串字面量\r\n * @param text \r\n */\r\nfunction removeCodeBlock(text:string){\r\n    return text.replace(/^```\\w?.*?[\\n\\r]+/gm,\"\")\r\n                    .replace(/```\\s*$/gm,\"\")\r\n}\r\n\r\n/**\r\n * \r\n * 向AI提问并返回结果\r\n * \r\n * 目标AI大模型的API是OpenAI兼容的接口，可以使用OpenAI的API Key\r\n * \r\n * 如:\r\n * \r\n * ```ts\r\n * const answer = await aiQuestion(\"今天天气如何\",{\r\n *    apiUrl:\"https://api.deepseek.ai\",\r\n *    model:\"gpt-3.5-turbo\",\r\n *    apiKey:\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\r\n * })\r\n * \r\n * \r\n * @param prompt \r\n * @param options \r\n */\r\nexport async function  aiQuestion<T=string>(prompt:string,options?:AiQuestionOptions):Promise<T>{\r\n    const { apiUrl,apiKey,temperature,model,roles } = Object.assign({\r\n        temperature:1,\r\n        roles:[]\r\n    },options)\r\n\r\n    const request = {\r\n        messages:[\r\n            {\r\n                role:\"user\",\r\n                content:prompt\r\n            },\r\n            ...roles\r\n        ],        \r\n        model,\r\n        temperature\r\n    }\r\n    // 使用fetch向API发送请求\r\n    let data:any \r\n    try{\r\n        const res = await axios.post(apiUrl, request, {\r\n            headers: {\r\n                \"Content-Type\": \"application/json\",\r\n                \"Authorization\": `Bearer ${apiKey}`,\r\n                \"Cache-Control\": \"no-cache\"\r\n            }\r\n        });\r\n        if (res.status !== 200) {\r\n            throw new Error(`API request failed with status ${res.status}: ${res.statusText}`);\r\n        }\r\n        data = res.data;\r\n        const result = removeCodeBlock(data.choices[0].message.content.trim()) as T;\r\n        return result;\r\n\r\n    } catch (err:any) {\r\n        throw new Error(`Error when calling AI api: ${err.message}`)\r\n    }\r\n}\r\n","import { getPackageJson } from \"./getPackageJson\" \n\nexport type  ModuleType = \"esm\" | \"cjs\"  \n\nexport function getPackageModuleType(entry?:string):ModuleType | undefined{ \n    try{\n        let packageJson = getPackageJson(entry)\n        if(packageJson){\n            return packageJson.type==\"module\" ? \"esm\" : \"cjs\"\n        } \n    }catch{\n    }\n}","/**\r\n * \r\n * 封装一个任意支持callback的同步函数为异步函数\r\n * \r\n * \r\n * \r\n * \r\n * promiseify(fs.readFile)('package.json', 'utf8').then().catch()\r\n * \r\n * \r\n * // 比如myFunc函数的第二个参数是callback，那么可以这样使用\r\n * function myfunc(a,callback,options){  \r\n * } \r\n * \r\n * promisedFunc(a,options).then().catch()\r\n * \r\n * \r\n * promisedFunc = promiseify(myfunc,{\r\n *      buildArgs:(...args:any[],callback)=>{  // 将callback放到最后一个参数\r\n *          return [args[0],callback,args[1]]\r\n *      }\r\n * })\r\n * \r\n *  如果myFunc函数的callback不是标准nodejs callback样式,签名是这样: (a,b,err,c)=>{}\r\n *  \r\n *  则需要自己实现handleCallback\r\n * \r\n * promisedFunc = promiseify(myfunc,{\r\n *      buildArgs:(...args:any[],callback)=>{  // 将callback放到最后一个参数\r\n *          return [args[0],callback,args[1]]\r\n *      },\r\n *      parseCallback:(results:any[])=>{\r\n *          return [results[2],results[0],results[1],results[3]]\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\n import type { AsyncFunction } from '../types/asyncFunction';\r\n\r\nexport type BuildArgsFunction<Args> = (args:Args,callback:(...results:any[])=>void)=>any[] \r\n\r\nexport interface PromiseifyOptions<Func extends (...args: any) => any>{\r\n    // 处理输入参数，返回最终异步函数的入参，以及callback函数参数\r\n    // 例：nodejs的函数一般最后一个参数是callback,如fs.readFile(path,encoding,callback)\r\n    // buildArgs:(...args:any[])=>{\r\n    //     return [...args,callback]   // 将参数添加到最后一个\r\n    //}\r\n    buildArgs?:BuildArgsFunction<Parameters<Func>>\r\n    parseCallback?:(results:any[])=>any\r\n}\r\n\r\nexport interface IncludeCallbackFunction {\r\n\r\n}\r\n \r\nconst buildNodejsArgs = (args:any[],callback:Function)=>{\r\n    return [...args,callback]\r\n}\r\nconst parseNodejsCallback = (results:any[])=>{\r\n    if(results.length===0) return undefined\r\n    if(results.length>0 && results[0]){\r\n        throw results[0]\r\n    }else{\r\n        if(results.length==2) return results[1]\r\n        return results.slice(1)\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \r\n * \r\n * @param fn  \r\n * @param options \r\n * @returns \r\n */\r\n\r\nexport function promisify<PromisedFunc extends (...args:any[])=>any = AsyncFunction>(fn:(...args:any)=>any,options?:PromiseifyOptions<PromisedFunc>){\r\n    const { buildArgs,parseCallback } = Object.assign({\r\n        buildArgs:buildNodejsArgs,\r\n        parseCallback:parseNodejsCallback\r\n    },options) as Required<PromiseifyOptions<PromisedFunc>>\r\n    const promisifyed = function(...args:any[]){\r\n        return new Promise<any>((resolve,reject)=>{\r\n            let callArgs = buildArgs(args as any,(...results:any[])=>{\r\n                try{\r\n                    const result = parseCallback(results)\r\n                    resolve(result)\r\n                }catch(e){\r\n                    reject(e)\r\n                }\r\n            }) \r\n            try{\r\n                fn(...callArgs)\r\n            }catch(e){\r\n                reject(e)\r\n            }\r\n        })\r\n    }\r\n    \r\n    return  promisifyed as PromisedFunc\r\n}\r\n \r\n\r\n// import fs from \"node:fs\"\r\n// const readFile = promisify<string>(fs.readFile)\r\n\r\n// readFile(\"./retry.ts\").then((content)=>{\r\n//     console.log(\"content:\",String(content))\r\n// })\r\n\r\n\r\n// function sum(callback:(x:number,y:number,z:number)=>void,a:number,b:number){\r\n//     if(a==0 && b==0) throw new Error(\"a and b can not be 0\")\r\n//     callback(a,b,a+b)\r\n// }\r\n\r\n// const promisifySum = promisify(sum,{\r\n//     buildArgs:(args:any[],callback)=>{\r\n//         return [callback,...args]\r\n//     },\r\n//     parseCallback:(results:any[])=>{\r\n//         return results\r\n//     }\r\n// })\r\n\r\n// promisifySum(1,2).then((result)=>{\r\n//     console.log(\"sum result:\",result)\r\n// })  \r\n\r\n\r\n// promisifySum(0,0).catch((e:Error)=>{\r\n//     console.log(\"sum error:\",e.message)\r\n// }) \r\n\r\n\r\n\r\n\r\n// import fs from \"node:fs\"\r\n// import path from \"node:path\"\r\n\r\n// const fileExists = promisify(fs.exists,{\r\n//     parseCallback(results) {\r\n//         return results[0]\r\n//     },\r\n// })\r\n// const readFile = promisify(fs.readFile)\r\n// const writeFile = promisify(fs.writeFile)\r\n// const mkdir = promisify(fs.mkdir)\r\n\r\n// async function main(){\r\n//     console.log(\"-------------------\")\r\n//     const file = path.join(__dirname,\"promisify.ts\")\r\n//     console.log(\"promisify.ts is exists: \",await fileExists(file))\r\n//     console.log(\"promisify.ts content: \",await readFile(file))\r\n//     console.log(\"mkdir: \",await mkdir(\"dir\"))\r\n\r\n// }\r\n\r\n// main().then(()=>{}).catch((e)=>{\r\n//     console.log(e.stack)\r\n// })\r\n\r\n","\r\nimport type { VoerkaI18nSettings } from \"@voerkai18n/runtime\"\r\nimport  { getLanguageDir } from \"./getLanguageDir\"\r\nimport { getVoerkaI18nSettings } from \"./getVoerkaI18nSettings\"\r\nimport { getPackageModuleType } from \"flex-tools/package/getPackageModuleType\"\r\nimport { isTypeScriptPackage } from \"flex-tools/package/isTypeScriptPackage\"\r\nimport { readFile } from \"flex-tools/fs/nodefs\"\r\nimport path from \"node:path\"\r\nimport fs from \"node:fs\"  \r\n\r\nexport type VoerkaI18nProjectContext= VoerkaI18nSettings & { \r\n    rootDir                  : string\r\n    langDir                  : string    \r\n    langRelDir               : string\r\n    settingFile              : string\r\n    settingRelFile           : string\r\n    typescript               : boolean\r\n    moduleType               : \"esm\" | \"cjs\" | undefined\r\n    promptDir                : string \r\n    getTranslateMessagesDir  : (autoCreate?:boolean)=>string\r\n    getTranslateParagraphsDir: (autoCreate?:boolean)=>string\r\n    getMessagesDir           : (autoCreate?:boolean)=>string\r\n    getParagraphsDir         : (autoCreate?:boolean)=>string\r\n    getPrompt                : (name:string)=>Promise<string>\r\n    getApi                   : (name:string,defaultValue?:Record<string,any>)=>Record<string,any> | undefined\r\n    api                      : Record<string,any> | undefined\r\n}\r\n\r\n\r\n\r\nasync function getPromptTemplate(this:VoerkaI18nProjectContext,name:string,defaultPrompt?:string){\r\n    const { promptDir } = this;\r\n    if(!name) return defaultPrompt\r\n    const promptFile = path.isAbsolute(name) ? name : path.join(promptDir,name.endsWith(\".md\") ? name : name+\".md\");\r\n    if(fs.existsSync(promptFile)){\r\n        return await readFile(promptFile,{ encoding: \"utf-8\" });\r\n    }\r\n    return defaultPrompt\r\n}\r\n\r\nfunction getDefaultPatterns(this:VoerkaI18nProjectContext,options?:Record<string,any>){\r\n    \r\n    const patterns = [\r\n        \"!coverage\",\r\n        \"!.pnpm\",\r\n        \"!**/*.test.*\",\r\n        \"!**/*.spec.*\",\r\n        \"!.vscode\",\r\n        \"!dist\",\r\n        \"!.git\",\r\n        \"!.turbo\",\r\n        \"!**/*.d.ts\",\r\n        \"!*.config.{js,ts}\",\r\n        \"!node_modules\",\r\n        \"!\"+this.langRelDir \r\n    ]\r\n    if(Array.isArray(this.patterns)){\r\n        patterns.push(...this.patterns)\r\n    }\r\n    \r\n    if(Array.isArray(options?.patterns)){\r\n        patterns.push(...options.patterns)\r\n        delete options.patterns\r\n    }else if(typeof(options?.patterns)==='string'){\r\n        patterns.push(options.patterns)\r\n        delete options.patterns\r\n    }\r\n\r\n    // 如果所有的patterns都是排除模式，则添加默认的包含模式\r\n    if(patterns.every(p=>p.startsWith(\"!\"))){\r\n        patterns.push(\"**/*.{js,jsx,ts,tsx,vue,astro,svelte,mdx}\")\r\n    }\r\n    return patterns\r\n}\r\n\r\nfunction getApi(this:VoerkaI18nProjectContext,name:string,defaultValue?:Record<string,any>){\r\n    const { langDir } = this;\r\n    const apiFile= path.join(langDir,\"api.json\")\r\n    let apis:Record<string,any> = {}\r\n    try{\r\n        if(fs.existsSync(apiFile)){\r\n            apis = JSON.parse(fs.readFileSync(apiFile,\"utf-8\"))\r\n        }\r\n    }catch{}  \r\n    return apis[name] || defaultValue  \r\n} \r\n\r\nfunction getApiParams(this:VoerkaI18nProjectContext,options?:Record<string,any>){\r\n    if(typeof(options)==='object'){\r\n        let api:Record<string,any> | undefined\r\n        if(typeof(options.api)==='string'){\r\n            api = getApi.call(this,options.api,{})\r\n        }\r\n        Object.entries(options).forEach(([key,value])=>{\r\n            if(key.startsWith(\"api\") && key.length>3){\r\n                const name = key.substring(3)                \r\n                if(!api) api = {}\r\n                api[name[0].toLowerCase() + name.substring(1)] = value\r\n            }\r\n        })\r\n        return api\r\n    }\r\n}\r\n \r\n\r\nfunction getDir(this:VoerkaI18nProjectContext,location:string){\r\n    return (autoCreate:boolean=true)=>{\r\n        const dir =  path.join(this.langDir,location)\r\n        if(autoCreate && !fs.existsSync(dir)){            \r\n            fs.mkdirSync(dir,{recursive:true})\r\n        }\r\n        return dir\r\n    }\r\n    \r\n} \r\n/**\r\n * \r\n * @param options \r\n * @returns \r\n */\r\nexport async function getProjectContext(options?:Record<string,any>) {     \r\n    const ctx          = await getVoerkaI18nSettings() as VoerkaI18nProjectContext    \r\n    ctx.rootDir        = process.env.INIT_CWD || process.cwd()\r\n    ctx.langDir        = getLanguageDir()\r\n    ctx.langRelDir     = path.relative(process.cwd(),ctx.langDir).replaceAll(path.sep,\"/\")    \r\n    ctx.settingFile    = path.join(ctx.langDir, \"settings.json\")\r\n    ctx.settingRelFile = path.relative(process.cwd(),ctx.settingFile).replace(/\\\\/g,'/')\r\n    ctx.promptDir      = path.join(ctx.langDir,\"prompts\")\r\n    ctx.getPrompt      = getPromptTemplate.bind(ctx) \r\n    ctx.patterns       = getDefaultPatterns.call(ctx,options)    \r\n    ctx.getApi         = getApi.bind(ctx) \r\n    ctx.getTranslateMessagesDir = getDir.call(ctx,\"translates/messages\").bind(ctx)\r\n    ctx.getTranslateParagraphsDir = getDir.call(ctx,\"translates/paragraphs\").bind(ctx)\r\n    ctx.getMessagesDir = getDir.call(ctx,\"messages\").bind(ctx)\r\n    ctx.getParagraphsDir = getDir.call(ctx,\"paragraphs\").bind(ctx)\r\n    if(!ctx.typescript) ctx.typescript = isTypeScriptPackage()\r\n    if(!ctx.moduleType) ctx.moduleType = getPackageModuleType()    \r\n    Object.assign(ctx,options)\r\n    ctx.api = getApiParams.call(ctx,options) \r\n    return ctx\r\n}\r\n","import fs from 'node:fs'\r\nimport path from 'node:path'\r\n\r\n\r\nexport function getBackupFile(file:string){\r\n    let i = 0\r\n    const extName = path.extname(file)\r\n    while(true){\r\n        const bakFile =  file.replace(extName,`.bak.${i++}${extName}`)\r\n        if(!fs.existsSync(bakFile)){\r\n            return bakFile\r\n        }\r\n    }\r\n}\r\n","import { getPackageRootPath } from \"flex-tools/package/getPackageRootPath\"\r\nimport path from \"node:path\"\r\nimport fs from \"node:fs\"\r\n\r\n\r\n/**\r\n * 将指定的文件或文件模式添加到项目的.gitignore文件中\r\n * 如果.gitignore文件不存在，会先创建一个空的.gitignore文件\r\n * \r\n * @param files 要添加到.gitignore中的文件或文件模式，可以是单个字符串或字符串数组\r\n */\r\nexport function addToGitIgnore(files:string | string[]){\r\n    // 获取项目根目录路径\r\n    const projectRoot = getPackageRootPath() || process.cwd()\r\n    // 构建.gitignore文件的绝对路径\r\n    const gitignoreFile = path.resolve(projectRoot,'.gitignore')\r\n    // 如果.gitignore文件不存在，则创建一个空的.gitignore文件\r\n    if(!fs.existsSync(gitignoreFile)){\r\n        fs.writeFileSync(gitignoreFile,'')\r\n    }\r\n    // 读取.gitignore文件的内容\r\n    const content = fs.readFileSync(gitignoreFile).toString()\r\n    // 将内容按行分割成数组\r\n    const lines = content.split('\\n')\r\n    // 确保files参数总是数组形式\r\n    const newLines = Array.isArray(files) ? files : [files]\r\n    // 遍历要添加的文件或文件模式\r\n    newLines.forEach(file=>{\r\n        // 如果.gitignore中已存在，则跳过\r\n        if(lines.includes(file)){\r\n            return\r\n        }\r\n        // 否则，添加到lines数组中\r\n        lines.push(file)\r\n    })\r\n    // 将更新后的内容写回.gitignore文件\r\n    fs.writeFileSync(gitignoreFile,lines.join('\\n'))\r\n}","\r\n/**\r\n * 移除字符串前后的字符\r\n * \r\n * trimChars(\" hello world  \") => \"hello world\"\r\n * trimChars(\" \\nhello world\\n \") => \"hello world\"\r\n * \r\n * @param {*} str \r\n * @param {*} chars \r\n * @returns \r\n */\r\nexport function trimChars(str:string,chars=['\"',\"'\"]){\r\n    let start = 0\r\n    let end = str.length\r\n    while(start<end && chars.includes(str[start])){\r\n        start++\r\n    }\r\n    while(end>start && chars.includes(str[end-1])){\r\n        end--\r\n    }\r\n    return str.substring(start,end) \r\n}\r\n","\r\n\r\n\r\nexport type HasImportOptions = {\r\n    moduleType:'ts' | 'esm' | 'cjs' | 'auto'    \r\n}\r\n\r\nconst RequireRegex = /(let|const|var)\\s*((\\{[^}]*\\})|(\\w+))\\s+=\\s*require\\(['\"]\\S+['\"]\\)/gm\r\n// const ImportRegex = /import\\s*((\\{[^}]*\\})|(\\w+))\\s+from\\s+['\"]\\S+['\"]/gm\r\n\r\n/**\r\n * 判断代码中是否有导入某个模块的\r\n * \r\n * \r\n * hasImport(code,\"t\")\r\n * \r\n * \r\n * \r\n * \r\n * @param code \r\n * @param importName \r\n * @param moduleType \r\n * @returns \r\n */\r\nexport function hasImport(code:string, importName:string, options?: HasImportOptions):boolean{\r\n    let { moduleType } = Object.assign({moduleType: 'auto'},options) as HasImportOptions    \r\n    if(moduleType === 'auto'){\r\n        moduleType = RequireRegex.test(code) ? 'cjs' : 'ts'\r\n    }\r\n    let reg:RegExp\r\n    if(moduleType === 'ts' || moduleType === 'esm'){       \r\n        reg = new RegExp(`import\\\\s+\\\\{[^}]*${importName}[^}]*\\\\}\\\\s+from\\\\s+['\"]([^'\"]+)['\"]`)\r\n    }else{\r\n        reg = new RegExp(`(let|const|var){1}\\\\s+\\\\{[^}]*${importName}[^}]*\\\\}\\\\s*=\\\\s*require\\\\(['\"]([^'\"]+)['\"]\\\\)`)\r\n    }\r\n    return reg.test(code)\r\n}\r\n\r\n\r\n// const tsCode = [\r\n//     `import { t } from \"languages\"`,\r\n//     `import { t,i18nScope } from \"./languages\"`,\r\n//     `import { i18nScope, Translate, t } from \"./languages\"`,\r\n//     `import { i18nScope,t,  Translate } from \"./languages\"`,\r\n//     `import t from \"./languages\"`,\r\n// ]\r\n\r\n// tsCode.forEach(code=>{\r\n//     console.log(code,\" = \",hasImport(code,\"t\",\"ts\"))\r\n// })\r\n\r\n\r\n// console.log(\"------------------\")\r\n\r\n// const jsCode = [\r\n//     `const { t } =require(\"languages\")`,\r\n//     `let  { t,i18nScope }  =require(\"./languages\")`,\r\n//     `var { i18nScope, Translate, t }  =require(\"./languages\")`,\r\n//     `let { i18nScope,t,  Translate }  =require(\"./languages\")`,\r\n//     `const t  =require(\"./languages\")`,\r\n// ]\r\n\r\n// jsCode.forEach(code=>{\r\n//     console.log(code,\" = \",hasImport(code,\"t\",\"cjs\"))\r\n// })\r\n","import { hasImport, HasImportOptions } from \"./hasImport\";\r\n\r\nconst RequireRegex = /(let|const|var)\\s*((\\{[^}]*\\})|(\\w+))\\s+=\\s*require\\(['\"]\\S+['\"]\\)/gm\r\n\r\nexport type AddImportOptions = HasImportOptions & {\r\n    scriptSection?: RegExp\r\n}\r\n\r\n\r\nexport function addImport(code:string,fromModule:string, importName:string, options?:AddImportOptions){    \r\n    let { moduleType,scriptSection } = Object.assign({\r\n        moduleType   : 'auto',\r\n        scriptSection: /(<script[^>]*>)([\\s\\S]*?)(<\\/script>)/gm\r\n    },options) as Required<AddImportOptions>\r\n\r\n    if(moduleType === 'auto'){\r\n        moduleType = RequireRegex.test(code) ? 'cjs' : 'ts'\r\n    }\r\n    if(hasImport(code,importName,options as HasImportOptions)){\r\n        return code\r\n    }else{\r\n        const importCode = moduleType == 'cjs' ?   `const { ${importName} } from \"${fromModule}\"` : `import { ${importName} } from \"${fromModule}\"`\r\n\r\n        let hasScript = false        \r\n\r\n        // 在script标签中添加\r\n        code = code.replace(scriptSection,(matched,scriptBegin,scriptContent,scriptEnd)=>{\r\n            hasScript = true\r\n            return matched.replace(scriptContent,scriptBegin+\"\\n\"+importCode + \"\\n\" + scriptContent + \"\\n\" + scriptEnd)\r\n        })\r\n        if(!hasScript){\r\n            code = importCode + \"\\n\" + code\r\n        }\r\n    }\r\n    return code\r\n}\r\n\r\n\r\n\r\n// const code = `\r\n// <script>\r\n// aaaa\r\n// </script>\r\n// <script setup> \r\n// bbbb\r\n// </script>\r\n// `\r\n\r\n\r\n// console.log(addImport(code,\"languages\",\"t\"))\r\n ","/**\n * 判断值是否是一个数字\n * \n * 默认情况下，也会对字符串类型的数字进行判断\n * 如isNumber('123')返回true\n * \n * \n * @param {*} value \n * @returns \n */\nexport function isNumber(value:any,strict:boolean=false):boolean {    \n    if(typeof(value)=='number') return true\n    if(typeof(value)!='string') return false\n    // 如果是严格模式，那么不允许字符串类型的数字\n    if(strict) return false        \n    try{\n        if(value.includes(\".\")){\n            let v = parseFloat(value)\n            if(value.endsWith(\".\")){                \n                return !isNaN(v) && String(v).length===value.length-1\n            }else{\n                return !isNaN(v) && String(v).length===value.length\n            }            \n        }else{\n            let v = parseInt(value)\n            return !isNaN(v) && String(v).length===value.length\n        }    \n    }catch{\n        return false\n    }\n}\n","import { isNumber } from \"flex-tools/typecheck/isNumber\";\r\n\r\n/**\r\n * 文本id必须是一个数字\r\n * @param {*} content \r\n * @returns \r\n */\r\nexport function isMessageId(content:string){\r\n    return isNumber(content)\r\n}","import fs from \"node:fs\"\r\nimport path from \"node:path\"\r\n\r\n\r\n/**\r\n * 确保指定的目录存在。如果目录不存在，将会创建该目录。\r\n *\r\n * @param spath - 目录的路径。如果路径不是绝对路径，将会相对于当前工作目录进行解析。\r\n */\r\nexport function getDir(spath:string){\r\n    spath = path.isAbsolute(spath) ? spath : path.join(process.cwd(),spath)\r\n    if(!fs.existsSync(spath)){\r\n        fs.mkdirSync(spath,{recursive:true})\r\n    }\r\n    return spath\r\n}","\r\n/**\r\n * 为多行字符串移除空格缩进，如果中tab按4个空格计算\r\n * @param str \r\n * @param indent \r\n */\r\nexport function indentString(str:string,indent:number = 0){    \r\n    const indentChars = \" \".repeat(indent)\r\n    const lines = str.split(\"\\n\").map((line)=>{\r\n        if(line.startsWith(indentChars)){\r\n            line = line.substring(indentChars.length)\r\n        }\r\n        return line\r\n    })\r\n    return lines.join(\"\\n\")\r\n}\r\n ","import axios from 'axios';\r\n\r\n\r\nexport async function fetchJson<T=any>(urls: string | string[], defaultValue?: T): Promise<T | undefined> {\r\n    if (typeof urls === 'string') {\r\n        urls = [urls];\r\n    }\r\n    for (const url of urls) {\r\n        try {\r\n            const response = await axios.get(url);\r\n            if (response.status === 200) {\r\n                return JSON.parse(response.data) as T;\r\n            }\r\n        } catch (error) {            \r\n        }\r\n    }\r\n    return defaultValue;\r\n}","import { escapeRegex } from './escapeRegex';\r\n/**\r\n * \r\n * 将一个正则表达式转换为字符串形式\r\n * \r\n * 如果提供了vars参数，将会替换掉正则表达式字符串中的变量\r\n * \r\n * encodeRegExp(/a\\bc/i) => \"a\\\\bc\"\r\n * encodeRegExp(/<__TAG__ a\\bc/i,{'__TAG__':'div'}) => \"<div a\\\\bc\"\r\n * \r\n * \r\n * @param regex \r\n * @returns \r\n */\r\nexport function encodeRegExp(regex:RegExp,vars?:Record<string,string>){\r\n    let r = regex.toString().replace(/^\\/|\\/$/g, \"\");\r\n    if(vars && typeof(vars)===\"object\"){\r\n        Object.entries(vars).forEach(([k,v])=>{\r\n            r = r.replaceAll(k,v)\r\n        })        \r\n    }\r\n    return r\r\n}","/**\r\n * \r\n * 解析源码中的t(\"xxxx\")的内容\r\n *  \r\n */\r\n\r\nimport type { VoerkaI18nNamespaces } from '@voerkai18n/runtime'\r\nimport {  getFileNamespace } from './getFileNamespace' \r\nimport { encodeRegExp } from './encodeRegExp' \r\nimport { escapeRegex } from './escapeRegex'\r\n\r\nexport type MessageNode = {\r\n    message   : string\r\n    rang      : { start: number, end: number }\r\n    vars?     : string\r\n    options?  : string\r\n    namespace?: string\r\n    file?     : string\r\n} \r\n\r\nexport type ExtractMessagesOptions = {\r\n    language?       : \"js\" | \"ts\" | \"jsx\" | \"tsx\" | \"vue\" | \"react\" | \"svelte\" | \"astro\" | \"mdx\" \r\n    namespaces      : VoerkaI18nNamespaces\r\n    file            : string\r\n    tFuncNames?     : string[]\r\n    tComponentNames?: string[]\r\n}\r\n\r\n\r\n\r\n// 声明各种语言的注释匹配正则表达式 \r\nconst commentRegexs ={\r\n    \"js,vue,jsx,ts,tsx\" : [\r\n        /(^[^\\n\\r\\w\\W]*\\/\\/.*$)|(\\/\\/.*$)/gm,                   // 单行注释\r\n        /\\/\\*\\s*[\\W\\w|\\r|\\n|*]*\\s*\\*\\//gm,                      // 多行注释\r\n    ],\r\n    \"html,vue,svelte\" : [\r\n        /\\<\\!--[\\s\\r\\n-]*?[\\w\\r\\n-\\W]*?[\\s\\r\\n-]*?--\\>/gm,    // 注释\r\n    ]\r\n} \r\n\r\n/**\r\n* 匹配文件中的注释部分\r\n*/\r\nfunction removeComments(code:string,language=\"js\"){\r\n    Object.entries(commentRegexs).forEach(([filetype,regexps])=>{\r\n        if(filetype.split(\",\").includes(filetype)){\r\n            regexps.forEach(regex=>{\r\n                code = code.replaceAll(regex,\"\")\r\n            })\r\n        }\r\n    })\r\n    return code\r\n} \r\n\r\n// const messageExtractors = [\r\n//     /[ \\\\t\\\\^;\\\\{\\\\(\\\\,=\\\\'\\\\\"\\\\.\\\\[\\\\|\\\\+\\\\>]t\\(\\s*(\"|'){1}(?<text>.*?)(?=(\\1\\s*\\))|(\\1\\s*\\,))/gm,\r\n//     /\\<Translate[^:#@]*?message\\s*=\\s*([\"'])(?<text>.*?)\\1/gm\r\n// ]\r\n   \r\nconst messageExtractors = [\r\n    /[ \\t\\^;\\{\\(,='\"\\.\\[\\|\\+\\>](__T_FUNC__)\\(\\s*([\"'])(?<text>.*?)(?=(\\2\\s*\\))|(\\2\\s*\\,))/,\r\n    /<(__T_COMPONENT__)[^:#@\\>]*?message\\s*=\\s*([\"'])(?<text>.*?)\\2[\\s\\/\\>]/\r\n]\r\n   \r\nfunction getMessageExtractors(options:{tFuncNames:string[],tComponentNames:string[]}){\r\n    const { tFuncNames = ['t','$t'], tComponentNames=['Translate','v-translate'] } = options\r\n    return messageExtractors.map(regex=>{\r\n        return new RegExp(encodeRegExp(regex,{\r\n            \"__T_FUNC__\"     : tFuncNames.map(n=>escapeRegex(n)).join(\"|\"),\r\n            \"__T_COMPONENT__\": tComponentNames.map(n=>escapeRegex(n)).join(\"|\")\r\n        }),\"gm\")\r\n    })\r\n}\r\n\r\n/**\r\n * 使用正则表达式提取翻译文本\r\n * \r\n * parseTranslateFunction(\"t('hello')\") => [{text:\"hello\"}]\r\n * parseTranslateFunction(\"t('a') t('ns::b')\") => [{text:\"a\"},{text:\"b\",namespace:\"ns\"}]\r\n * \r\n * @param {*} content \r\n * @returns \r\n */\r\nexport function parseTranslateMessagesByRegex(code:string,options:ExtractMessagesOptions){\r\n    const { tFuncNames, tComponentNames } = Object.assign({\r\n        tFuncNames     : ['t','$t'],\r\n        tComponentNames: ['Translate','v-translate']\r\n    },options)\r\n    let result\r\n    let messages:MessageNode[] = []\r\n\r\n    const messageExtractors = getMessageExtractors({ tFuncNames, tComponentNames })\r\n\r\n    for(let regex of messageExtractors){\r\n        while ((result = regex.exec(code)) !== null) {\r\n            // 这对于避免零宽度匹配的无限循环是必要的\r\n            if (result.index === regex.lastIndex) {\r\n              regex.lastIndex++;\r\n            }           \r\n            const text = result.groups?.text \r\n            if(text){\r\n                messages.push({\r\n                  message: text,\r\n                  rang   : { start:result.index, end:result.index+result[0].length }\r\n                })\r\n            }\r\n        }\r\n    }    \r\n    return messages \r\n }\r\n\r\n \r\nexport function extractMessagesUseRegex(code:string,options:ExtractMessagesOptions):MessageNode[]{\r\n    const { file, namespaces, language}  = options   \r\n    const namespace = file ? getFileNamespace(file, namespaces) :'default'\r\n\r\n    code = removeComments(code,language)\r\n\r\n    const messages = parseTranslateMessagesByRegex(code,options)\r\n\r\n    return messages.map((message:any)=>({        \r\n        vars:undefined,\r\n        options:undefined,\r\n        namespace,\r\n        file,\r\n        ...message\r\n    }))\r\n}\r\n/**\r\n * 提取要翻译的文本信息\r\n * \r\n * @param code \r\n * @returns\r\n * [\r\n *   {text:\"xxxx\",rang,vars:[],options:{}},\r\n * ]\r\n */\r\nexport function extractMessages(code:string,options?:ExtractMessagesOptions):MessageNode[]{    \r\n    const  opts   = Object.assign({\r\n        language  : 'ts', \r\n        namespaces: {}\r\n    },options) as Required<ExtractMessagesOptions> \r\n    return extractMessagesUseRegex(code,opts)\r\n}\r\n \r\n         ","/**\n * 返回是否原始{}\n * @param obj\n * @returns {boolean}\n */\nexport function isPlainObject(obj:any):boolean{\n    if (typeof obj !== 'object' || obj === null) return false;\n    var proto = Object.getPrototypeOf(obj);\n    if (proto === null) return true;\n    var baseProto = proto;\n    while (Object.getPrototypeOf(baseProto) !== null) {\n        baseProto = Object.getPrototypeOf(baseProto);\n    }\n    return proto === baseProto;\n}\n","/**\n * 从对象中提取指定的字段\n * \n * pick({a:1,b:2,c:3},\"a\")  // == {a:1}\n * pick({a:1,b:2,c:3},[\"a\",\"b\"])  // == {a:1,b:2} \n * pick({a:1,b:2,c:3},(k,v)=>{\n *      return k =='a'\n * } )  // == {a:1}\n * \n * \n * \n */\n\nimport { isPlainObject } from \"../typecheck/isPlainObject\"\n\nexport type ItemPicker = string | string[] | ((key:any,value:any) => boolean)\nexport function pick(source:Record<any,any>,keys:ItemPicker,defaultValues?:Record<any,any>){\n    let newObject:Record<any,any> =isPlainObject(defaultValues) ? Object.assign({},defaultValues) : {}\n    if(typeof(keys) == 'function'){\n        Object.entries(source).forEach(([key,value]) =>{\n            if(keys.call(source,key,value)){\n                newObject[key] = value\n            } \n        })\n    }else{\n        let fields:string[] = Array.isArray(keys) ? keys : [keys]\n        fields.forEach(field =>{\n            if((field in source) && source[field]!==undefined){\n                newObject[field] =  source[field]  \n            }\n        })\n    }\n    return newObject \n}\n","import { pick } from \"flex-tools/object/pick\";\r\nimport { encodeRegExp } from \"./encodeRegExp\";\r\nimport { escapeRegex } from \"./escapeRegex\";\r\n\r\n\r\nexport type ParagraphNode = {\r\n    id?     : string\r\n    message : string\r\n    vars?   : string\r\n    scope?  : string\r\n    options?: string\r\n    rang    : { start: number, end: number }\r\n    file?   : string\r\n    [key    : string]: any\r\n}\r\n\r\nexport type ExtractParagraphsOptions = {\r\n    language?       : string\r\n    namespaces?     : Record<string,string>\r\n    file?           : string \r\n    tComponentNames?: string[]    \r\n}\r\n\r\nconst attrsRegex = /(?<name>\\w+)\\s*=\\s*([\"'])(?<value>.*?)\\2/gm\r\n\r\nfunction parseTranslateAttrs(attrs:string):Record<string,any> {\r\n    let result\r\n    let attrsMap:Record<string,any> = {}\r\n    while ((result = attrsRegex.exec(attrs)) !== null) {\r\n        const { name,value } = result.groups || {}\r\n        if(name && value){\r\n            attrsMap[name] = value\r\n        }\r\n    }\r\n    return attrsMap\r\n}   \r\n\r\n\r\n// /<Translate\\s*[^>]*(id\\s*=\\s*(['\"])(\\w+)\\2)?[^>]*?(?<![\\/])>(?<text>[\\s\\S]*?)<\\/Translate>/gm\r\nconst paragraphExtractors = [\r\n    /<(__T_COMPONENT__)\\s*(?<attrs>[^>]*)(?<![\\/])>(?<text>[\\s\\S]*?)<\\/\\1>/\r\n]\r\nfunction getParagraphExtractors(options:{tComponentNames:string[]}){\r\n    const {  tComponentNames=['Translate','v-translate'] } = options\r\n    return paragraphExtractors.map(regex=>{\r\n        return new RegExp(encodeRegExp(regex,{\r\n            \"__T_COMPONENT__\" : tComponentNames.map(n=>escapeRegex(n)).join(\"|\")\r\n        }),\"gm\")\r\n    })\r\n}\r\n\r\n/**\r\n * 解释段落\r\n */\r\nexport function parseParagraphsByRegex(code:string,options:ExtractParagraphsOptions){\r\n    const { file }  = options    \r\n    const { tComponentNames } = Object.assign({\r\n        tComponentNames: ['Translate','v-translate']\r\n    },options)\r\n\r\n    const paragraphExtractors = getParagraphExtractors({ tComponentNames })\r\n\r\n    let result\r\n    let paragraphs:ParagraphNode[] = []\r\n\r\n    for(let regex of paragraphExtractors){\r\n      while ((result = regex.exec(code)) !== null) {\r\n          // 这对于避免零宽度匹配的无限循环是必要的\r\n        if (result.index === regex.lastIndex) {\r\n            regex.lastIndex++;\r\n        }           \r\n        const text = result.groups?.text \r\n        const attrs = parseTranslateAttrs(result.groups?.attrs || '')\r\n        if(text){\r\n            paragraphs.push({\r\n                message:text,\r\n                rang:{ \r\n                    start: result.index, \r\n                    end: result.index + result[0].length \r\n                },\r\n                file,\r\n                ...pick(attrs,[\r\n                    'id',\r\n                    'vars',\r\n                    'scope',\r\n                    'options',\r\n                    'tag',\r\n                    'style',\r\n                    'class',\r\n                    'className' \r\n                ])\r\n              })\r\n          }\r\n      }\r\n    }    \r\n    return paragraphs\r\n}\r\n\r\n/**\r\n * \r\n * 提取段落\r\n * \r\n * <Translate>\r\n *   段落内容\r\n * </Translate>\r\n * \r\n * @param code \r\n */\r\nexport function extractParagraphs(code:string,options?:ExtractParagraphsOptions):ParagraphNode[]{\r\n    const opts = Object.assign({},options) as Required<ExtractParagraphsOptions>\r\n    const paragraphs:ParagraphNode[] = parseParagraphsByRegex(code,opts)\r\n    return paragraphs\r\n}"]}