@intlayer/vue-compiler 8.2.4 → 8.3.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./_virtual/_rolldown/runtime.cjs`);let t=require(`node:fs/promises`),n=require(`@babel/core`),r=require(`@vue/compiler-sfc`);r=e.__toESM(r);const i=(e,t)=>{if(!e)return!1;if(!t||t.length===0)return!0;let n=e.replace(/\\/g,`/`);return t.some(e=>e.replace(/\\/g,`/`)===n)},a={TEXT:2,ELEMENT:1,ATTRIBUTE:6},o=async(e,t,o={})=>{let{defaultLocale:s=`en`,packageName:c=`vue-intlayer`,filesList:l,shouldExtract:u,onExtract:d,dictionaryKey:f,attributesToExtract:p=[],extractDictionaryKeyFromPath:m,generateKey:h}=o;if(!i(t,l)||!t.endsWith(`.vue`))return null;let g,_;try{g=r.default.parse}catch{return console.warn(`Vue extraction: @vue/compiler-sfc not found.`),null}try{_=(await import(`magic-string`)).default}catch{return console.warn(`Vue extraction: magic-string not found.`),null}let v=g(e),y=new _(e),b={},x=new Set,S=f??m?.(t)??``,C=[];if(v.descriptor.template){let e=t=>{if(t.type===a.TEXT){let e=t.content??``;if(u?.(e)&&h){let n=h(e,x);x.add(n),C.push({start:t.loc.start.offset,end:t.loc.end.offset,replacement:`{{ content.${n} }}`,key:n,value:e.replace(/\s+/g,` `).trim()})}}else t.type===a.ELEMENT&&t.props?.forEach(e=>{if(e.type===a.ATTRIBUTE&&p.includes(e.name)&&e.value){let t=e.value.content;if(u?.(t)&&h){let n=h(t,x);x.add(n),C.push({start:e.loc.start.offset,end:e.loc.end.offset,replacement:`:${e.name}="content.${n}"`,key:n,value:t.trim()})}}});t.children&&t.children.forEach(e)};e(v.descriptor.template.ast)}let w=v.descriptor.scriptSetup??v.descriptor.script;if(w){let e=w.content,r=w.loc.start.offset;try{let t=(0,n.parse)(e,{parserOpts:{sourceType:`module`,plugins:[`typescript`,`jsx`]}});t&&(0,n.traverse)(t,{StringLiteral(e){if(e.parentPath.isImportDeclaration()||e.parentPath.isExportDeclaration()||e.parentPath.isImportSpecifier()||e.parentPath.isObjectProperty()&&e.key===`key`)return;if(e.parentPath.isCallExpression()){let t=e.parentPath.node.callee;if(n.types.isMemberExpression(t)&&n.types.isIdentifier(t.object)&&t.object.name===`console`||n.types.isIdentifier(t)&&(t.name===`useIntlayer`||t.name===`t`)||t.type===`Import`||n.types.isIdentifier(t)&&t.name===`require`)return}let t=e.node.value;if(u?.(t)&&h){let n=h(t,x);x.add(n),e.node.start!=null&&e.node.end!=null&&C.push({start:r+e.node.start,end:r+e.node.end,replacement:`content.${n}`,key:n,value:t.trim()})}}})}catch(e){console.warn(`Vue extraction: Failed to parse script content for ${t}`,e)}}if(C.length===0)return null;C.sort((e,t)=>t.start-e.start);for(let{start:e,end:t,replacement:n,key:r,value:i}of C)y.overwrite(e,t,n),b[r]=i;let T=w?.content??``,E=/import\s*{[^}]*useIntlayer[^}]*}\s*from\s*['"][^'"]+['"]/.test(T)||/import\s+useIntlayer\s+from\s*['"][^'"]+['"]/.test(T),D=/const\s+content\s*=\s*useIntlayer\s*\(/.test(T),O=E?``:`import { useIntlayer } from '${c}';`,k=D?``:`const content = useIntlayer('${S}');`,A=[O,k].filter(Boolean);if(A.length>0){let e=`\n${A.join(`
2
- `)}\n`;v.descriptor.scriptSetup?y.appendLeft(v.descriptor.scriptSetup.loc.start.offset,e):v.descriptor.script?y.appendLeft(v.descriptor.script.loc.start.offset,e):y.prepend(`<script setup>\n${O}\n${k}\n<\/script>\n`)}return d&&d({dictionaryKey:S,filePath:t,content:{...b},locale:s}),{code:y.toString(),map:y.generateMap({source:t,includeContent:!0}),extracted:!0}},s=async(e,n,r,i,a=!0)=>{let s=await(0,t.readFile)(e,`utf-8`),c={},l=await o(s,e,{packageName:r,dictionaryKey:n,shouldExtract:i.shouldExtract,generateKey:i.generateKey,extractDictionaryKeyFromPath:i.extractDictionaryKeyFromPath,attributesToExtract:i.attributesToExtract,onExtract:e=>{c=e.content}});return l?(a&&await(0,t.writeFile)(e,l.code),c):null};exports.intlayerVueExtract=o,exports.processVueFile=s,exports.shouldProcessFile=i;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./_virtual/_rolldown/runtime.cjs`);let t=require(`node:fs`),n=require(`@babel/core`),r=require(`@intlayer/config/client`),i=require(`@vue/compiler-sfc`);i=e.__toESM(i);let a=require(`magic-string`);a=e.__toESM(a);const o=(e,t)=>{if(!e)return!1;if(!t||t.length===0)return!0;let n=e.replace(/\\/g,`/`);return t.some(e=>e.replace(/\\/g,`/`)===n)},s={TEXT:2,ELEMENT:1,ATTRIBUTE:6},c=(e,t,c={})=>{let{defaultLocale:l=r.DefaultValues.Internationalization.DEFAULT_LOCALE,packageName:u=`vue-intlayer`,filesList:d,shouldExtract:f,onExtract:p,dictionaryKey:m,attributesToExtract:h=[],extractDictionaryKeyFromPath:g,generateKey:_}=c;if(!o(t,d)||!t.endsWith(`.vue`))return null;let v;try{v=i.default.parse}catch{return console.warn(`Vue extraction: @vue/compiler-sfc not found.`),null}let y=v(e),b=new a.default(e),x={},S=new Set,C=m??g?.(t)??``,w=[];if(y.descriptor.template){let e=t=>{if(t.type===s.TEXT){let e=t.content??``;if(f?.(e)&&_){let n=_(e,S);S.add(n),w.push({start:t.loc.start.offset,end:t.loc.end.offset,replacement:`{{ content.${n} }}`,key:n,value:e.replace(/\s+/g,` `).trim()})}}else t.type===s.ELEMENT&&t.props?.forEach(e=>{if(e.type===s.ATTRIBUTE&&h.includes(e.name)&&e.value){let t=e.value.content;if(f?.(t)&&_){let n=_(t,S);S.add(n),w.push({start:e.loc.start.offset,end:e.loc.end.offset,replacement:`:${e.name}="content.${n}"`,key:n,value:t.trim()})}}});t.children&&t.children.forEach(e)};e(y.descriptor.template.ast)}let T=y.descriptor.scriptSetup??y.descriptor.script;if(T){let e=T.content,r=T.loc.start.offset;try{let t=(0,n.parse)(e,{parserOpts:{sourceType:`module`,plugins:[`typescript`,`jsx`]}});t&&(0,n.traverse)(t,{StringLiteral(e){if(e.parentPath.isImportDeclaration()||e.parentPath.isExportDeclaration()||e.parentPath.isImportSpecifier()||e.parentPath.isObjectProperty()&&e.key===`key`)return;if(e.parentPath.isCallExpression()){let t=e.parentPath.node.callee;if(n.types.isMemberExpression(t)&&n.types.isIdentifier(t.object)&&t.object.name===`console`||n.types.isIdentifier(t)&&(t.name===`useIntlayer`||t.name===`t`)||t.type===`Import`||n.types.isIdentifier(t)&&t.name===`require`)return}let t=e.node.value;if(f?.(t)&&_){let n=_(t,S);S.add(n),e.node.start!=null&&e.node.end!=null&&w.push({start:r+e.node.start,end:r+e.node.end,replacement:`content.${n}`,key:n,value:t.trim()})}}})}catch(e){console.warn(`Vue extraction: Failed to parse script content for ${t}`,e)}}if(w.length===0)return null;w.sort((e,t)=>t.start-e.start);for(let{start:e,end:t,replacement:n,key:r,value:i}of w)b.overwrite(e,t,n),x[r]=i;let E=T?.content??``,D=/import\s*{[^}]*useIntlayer[^}]*}\s*from\s*['"][^'"]+['"]/.test(E)||/import\s+useIntlayer\s+from\s*['"][^'"]+['"]/.test(E),O=/const\s+content\s*=\s*useIntlayer\s*\(/.test(E),k=D?``:`import { useIntlayer } from '${u}';`,A=O?``:`const content = useIntlayer('${C}');`,j=[k,A].filter(Boolean);if(j.length>0){let e=`\n${j.join(`
2
+ `)}\n`;y.descriptor.scriptSetup?b.appendLeft(y.descriptor.scriptSetup.loc.start.offset,e):y.descriptor.script?b.appendLeft(y.descriptor.script.loc.start.offset,e):b.prepend(`<script setup>\n${k}\n${A}\n<\/script>\n`)}return p&&p({dictionaryKey:C,filePath:t,content:{...x},locale:l}),{code:b.toString(),map:b.generateMap({source:t,includeContent:!0}),extracted:!0}},l=(e,n,r,i,a=!0)=>{let o=(0,t.readFileSync)(e,`utf-8`),s={},l=c(o,e,{packageName:r,dictionaryKey:n,shouldExtract:i.shouldExtract,generateKey:i.generateKey,extractDictionaryKeyFromPath:i.extractDictionaryKeyFromPath,attributesToExtract:i.attributesToExtract,onExtract:e=>{s=e.content}});return l?(a&&(0,t.writeFileSync)(e,l.code),{extractedContent:s,code:l.code,map:l.map}):null};exports.intlayerVueExtract=c,exports.processVueFile=l,exports.shouldProcessFile=o;
3
3
  //# sourceMappingURL=vue-intlayer-extract.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"vue-intlayer-extract.cjs","names":["vueSfc","t"],"sources":["../../src/vue-intlayer-extract.ts"],"sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport { parse as babelParse, types as t, traverse } from '@babel/core';\nimport vueSfc from '@vue/compiler-sfc';\n\nexport type ExtractedContent = Record<string, string>;\n\nexport type ExtractResult = {\n dictionaryKey: string;\n filePath: string;\n content: ExtractedContent;\n locale: string;\n};\n\nexport type ExtractPluginOptions = {\n defaultLocale?: string;\n packageName?: string;\n filesList?: string[];\n shouldExtract?: (text: string) => boolean;\n onExtract?: (result: ExtractResult) => void;\n dictionaryKey?: string;\n attributesToExtract?: readonly string[];\n extractDictionaryKeyFromPath?: (path: string) => string;\n generateKey?: (text: string, existingKeys: Set<string>) => string;\n};\n\ntype Replacement = {\n start: number;\n end: number;\n replacement: string;\n key: string;\n value: string;\n};\n\nexport const shouldProcessFile = (\n filename: string | undefined,\n filesList?: string[]\n): boolean => {\n if (!filename) return false;\n if (!filesList || filesList.length === 0) return true;\n\n const normalizedFilename = filename.replace(/\\\\/g, '/');\n return filesList.some((f) => {\n const normalizedF = f.replace(/\\\\/g, '/');\n return normalizedF === normalizedFilename;\n });\n};\n\ntype VueParseResult = {\n descriptor: {\n template?: {\n ast: VueAstNode;\n loc: { start: { offset: number }; end: { offset: number } };\n };\n script?: {\n content: string;\n loc: { start: { offset: number }; end: { offset: number } };\n };\n scriptSetup?: {\n content: string;\n loc: { start: { offset: number }; end: { offset: number } };\n };\n };\n};\n\ntype VueAstNode = {\n type: number;\n content?: string;\n children?: VueAstNode[];\n props?: VueAstProp[];\n loc: { start: { offset: number }; end: { offset: number } };\n};\n\ntype VueAstProp = {\n type: number;\n name: string;\n value?: { content: string };\n loc: { start: { offset: number }; end: { offset: number } };\n};\n\nconst NODE_TYPES = {\n TEXT: 2,\n ELEMENT: 1,\n ATTRIBUTE: 6,\n};\n\ntype MagicStringType = {\n overwrite: (start: number, end: number, content: string) => void;\n appendLeft: (index: number, content: string) => void;\n prepend: (content: string) => void;\n toString: () => string;\n generateMap: (options: {\n source: string;\n includeContent: boolean;\n }) => unknown;\n};\n\nexport const intlayerVueExtract = async (\n code: string,\n filename: string,\n options: ExtractPluginOptions = {}\n): Promise<{ code: string; map?: unknown; extracted: boolean } | null> => {\n const {\n defaultLocale = 'en',\n packageName = 'vue-intlayer',\n filesList,\n shouldExtract,\n onExtract,\n dictionaryKey: dictionaryKeyOption,\n attributesToExtract = [],\n extractDictionaryKeyFromPath,\n generateKey,\n } = options;\n\n if (!shouldProcessFile(filename, filesList)) return null;\n if (!filename.endsWith('.vue')) return null;\n\n let parseVue: (code: string) => VueParseResult;\n let MagicString: new (code: string) => MagicStringType;\n\n try {\n parseVue = vueSfc.parse as unknown as (code: string) => VueParseResult;\n } catch {\n console.warn('Vue extraction: @vue/compiler-sfc not found.');\n return null;\n }\n\n try {\n const magicStringModule = await import('magic-string');\n MagicString = magicStringModule.default;\n } catch {\n console.warn('Vue extraction: magic-string not found.');\n return null;\n }\n\n const sfc = parseVue(code);\n const magic = new MagicString(code);\n\n const extractedContent: ExtractedContent = {};\n const existingKeys = new Set<string>();\n const dictionaryKey =\n dictionaryKeyOption ?? extractDictionaryKeyFromPath?.(filename) ?? '';\n const replacements: Replacement[] = [];\n\n // 1. Walk Vue Template AST\n if (sfc.descriptor.template) {\n const walkVueAst = (node: VueAstNode) => {\n if (node.type === NODE_TYPES.TEXT) {\n const text = node.content ?? '';\n if (shouldExtract?.(text) && generateKey) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n replacements.push({\n start: node.loc.start.offset,\n end: node.loc.end.offset,\n replacement: `{{ content.${key} }}`,\n key,\n value: text.replace(/\\s+/g, ' ').trim(),\n });\n }\n } else if (node.type === NODE_TYPES.ELEMENT) {\n node.props?.forEach((prop) => {\n if (\n prop.type === NODE_TYPES.ATTRIBUTE &&\n (attributesToExtract as readonly string[]).includes(prop.name) &&\n prop.value\n ) {\n const text = prop.value.content;\n if (shouldExtract?.(text) && generateKey) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n replacements.push({\n start: prop.loc.start.offset,\n end: prop.loc.end.offset,\n replacement: `:${prop.name}=\"content.${key}\"`,\n key,\n value: text.trim(),\n });\n }\n }\n });\n }\n\n if (node.children) {\n node.children.forEach(walkVueAst);\n }\n };\n\n walkVueAst(sfc.descriptor.template.ast);\n }\n\n // 2. Extract and Walk Script using Babel\n const scriptBlock = sfc.descriptor.scriptSetup ?? sfc.descriptor.script;\n\n if (scriptBlock) {\n const scriptText = scriptBlock.content;\n const offset = scriptBlock.loc.start.offset;\n\n try {\n const ast = babelParse(scriptText, {\n parserOpts: {\n sourceType: 'module',\n plugins: ['typescript', 'jsx'],\n },\n });\n\n if (ast) {\n traverse(ast, {\n StringLiteral(path: any) {\n if (path.parentPath.isImportDeclaration()) return;\n if (path.parentPath.isExportDeclaration()) return;\n if (path.parentPath.isImportSpecifier()) return;\n if (path.parentPath.isObjectProperty() && path.key === 'key')\n return;\n\n if (path.parentPath.isCallExpression()) {\n const callee = path.parentPath.node.callee;\n if (\n t.isMemberExpression(callee) &&\n t.isIdentifier(callee.object) &&\n callee.object.name === 'console'\n )\n return;\n\n if (\n t.isIdentifier(callee) &&\n (callee.name === 'useIntlayer' || callee.name === 't')\n )\n return;\n\n if (callee.type === 'Import') return;\n if (t.isIdentifier(callee) && callee.name === 'require') return;\n }\n\n const text = path.node.value;\n if (shouldExtract?.(text) && generateKey) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n\n if (path.node.start != null && path.node.end != null) {\n replacements.push({\n start: offset + path.node.start,\n end: offset + path.node.end,\n replacement: `content.${key}`,\n key,\n value: text.trim(),\n });\n }\n }\n },\n });\n }\n } catch (e) {\n console.warn(\n `Vue extraction: Failed to parse script content for ${filename}`,\n e\n );\n }\n }\n\n // Abort if nothing was extracted\n if (replacements.length === 0) return null;\n\n // 3. Apply Replacements in Reverse Order\n replacements.sort((a, b) => b.start - a.start);\n for (const { start, end, replacement, key, value } of replacements) {\n magic.overwrite(start, end, replacement);\n extractedContent[key] = value;\n }\n\n // 4. Inject necessary imports and setup\n const finalScriptContent = scriptBlock?.content ?? '';\n\n const hasUseIntlayerImport =\n /import\\s*{[^}]*useIntlayer[^}]*}\\s*from\\s*['\"][^'\"]+['\"]/.test(\n finalScriptContent\n ) ||\n /import\\s+useIntlayer\\s+from\\s*['\"][^'\"]+['\"]/.test(finalScriptContent);\n\n const hasContentDeclaration = /const\\s+content\\s*=\\s*useIntlayer\\s*\\(/.test(\n finalScriptContent\n );\n\n const importStmt = hasUseIntlayerImport\n ? ''\n : `import { useIntlayer } from '${packageName}';`;\n const contentDecl = hasContentDeclaration\n ? ''\n : `const content = useIntlayer('${dictionaryKey}');`;\n\n const injectionParts = [importStmt, contentDecl].filter(Boolean);\n\n if (injectionParts.length > 0) {\n const injection = `\\n${injectionParts.join('\\n')}\\n`;\n\n if (sfc.descriptor.scriptSetup) {\n magic.appendLeft(sfc.descriptor.scriptSetup.loc.start.offset, injection);\n } else if (sfc.descriptor.script) {\n magic.appendLeft(sfc.descriptor.script.loc.start.offset, injection);\n } else {\n magic.prepend(\n `<script setup>\\n${importStmt}\\n${contentDecl}\\n</script>\\n`\n );\n }\n }\n\n if (onExtract) {\n onExtract({\n dictionaryKey,\n filePath: filename,\n content: { ...extractedContent },\n locale: defaultLocale,\n });\n }\n\n return {\n code: magic.toString(),\n map: magic.generateMap({ source: filename, includeContent: true }),\n extracted: true,\n };\n};\n\ntype Tools = {\n generateKey: (text: string, existingKeys: Set<string>) => string;\n shouldExtract: (text: string) => boolean;\n extractDictionaryKeyFromPath: (path: string) => string;\n attributesToExtract: readonly string[];\n extractTsContent: any;\n};\n\nexport const processVueFile = async (\n filePath: string,\n _componentKey: string,\n packageName: string,\n tools: Tools,\n save: boolean = true\n): Promise<Record<string, string> | null> => {\n const code = await readFile(filePath, 'utf-8');\n let extractedContent: Record<string, string> = {};\n\n const result = await intlayerVueExtract(code, filePath, {\n packageName,\n dictionaryKey: _componentKey,\n shouldExtract: tools.shouldExtract,\n generateKey: tools.generateKey,\n extractDictionaryKeyFromPath: tools.extractDictionaryKeyFromPath,\n attributesToExtract: tools.attributesToExtract,\n onExtract: (extractResult) => {\n extractedContent = extractResult.content;\n },\n });\n\n if (!result) return null;\n\n if (save) {\n await writeFile(filePath, result.code);\n }\n\n return extractedContent;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"vue-intlayer-extract.cjs","names":["DefaultValues","vueSfc","MagicString","t"],"sources":["../../src/vue-intlayer-extract.ts"],"sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\nimport { parse as babelParse, types as t, traverse } from '@babel/core';\nimport { DefaultValues } from '@intlayer/config/client';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport vueSfc from '@vue/compiler-sfc';\nimport MagicString from 'magic-string';\n\nexport type ExtractedContent = Record<string, string>;\n\nexport type ExtractResult = {\n dictionaryKey: string;\n filePath: string;\n content: ExtractedContent;\n locale: Locale;\n};\n\nexport type ExtractPluginOptions = {\n defaultLocale?: Locale;\n packageName?: string;\n filesList?: string[];\n shouldExtract?: (text: string) => boolean;\n onExtract?: (result: ExtractResult) => void;\n dictionaryKey?: string;\n attributesToExtract?: readonly string[];\n extractDictionaryKeyFromPath?: (path: string) => string;\n generateKey?: (text: string, existingKeys: Set<string>) => string;\n};\n\ntype Replacement = {\n start: number;\n end: number;\n replacement: string;\n key: string;\n value: string;\n};\n\nexport const shouldProcessFile = (\n filename: string | undefined,\n filesList?: string[]\n): boolean => {\n if (!filename) return false;\n if (!filesList || filesList.length === 0) return true;\n\n const normalizedFilename = filename.replace(/\\\\/g, '/');\n return filesList.some((f) => {\n const normalizedF = f.replace(/\\\\/g, '/');\n return normalizedF === normalizedFilename;\n });\n};\n\ntype VueParseResult = {\n descriptor: {\n template?: {\n ast: VueAstNode;\n loc: { start: { offset: number }; end: { offset: number } };\n };\n script?: {\n content: string;\n loc: { start: { offset: number }; end: { offset: number } };\n };\n scriptSetup?: {\n content: string;\n loc: { start: { offset: number }; end: { offset: number } };\n };\n };\n};\n\ntype VueAstNode = {\n type: number;\n content?: string;\n children?: VueAstNode[];\n props?: VueAstProp[];\n loc: { start: { offset: number }; end: { offset: number } };\n};\n\ntype VueAstProp = {\n type: number;\n name: string;\n value?: { content: string };\n loc: { start: { offset: number }; end: { offset: number } };\n};\n\nconst NODE_TYPES = {\n TEXT: 2,\n ELEMENT: 1,\n ATTRIBUTE: 6,\n};\n\nexport const intlayerVueExtract = (\n code: string,\n filename: string,\n options: ExtractPluginOptions = {}\n): { code: string; map?: unknown; extracted: boolean } | null => {\n const {\n defaultLocale = DefaultValues.Internationalization.DEFAULT_LOCALE,\n packageName = 'vue-intlayer',\n filesList,\n shouldExtract,\n onExtract,\n dictionaryKey: dictionaryKeyOption,\n attributesToExtract = [],\n extractDictionaryKeyFromPath,\n generateKey,\n } = options;\n\n if (!shouldProcessFile(filename, filesList)) return null;\n if (!filename.endsWith('.vue')) return null;\n\n let parseVue: (code: string) => VueParseResult;\n\n try {\n parseVue = vueSfc.parse as unknown as (code: string) => VueParseResult;\n } catch {\n console.warn('Vue extraction: @vue/compiler-sfc not found.');\n return null;\n }\n\n const sfc = parseVue(code);\n const magic = new MagicString(code);\n\n const extractedContent: ExtractedContent = {};\n const existingKeys = new Set<string>();\n const dictionaryKey =\n dictionaryKeyOption ?? extractDictionaryKeyFromPath?.(filename) ?? '';\n const replacements: Replacement[] = [];\n\n // Walk Vue Template AST\n if (sfc.descriptor.template) {\n const walkVueAst = (node: VueAstNode) => {\n if (node.type === NODE_TYPES.TEXT) {\n const text = node.content ?? '';\n\n if (shouldExtract?.(text) && generateKey) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n replacements.push({\n start: node.loc.start.offset,\n end: node.loc.end.offset,\n replacement: `{{ content.${key} }}`,\n key,\n value: text.replace(/\\s+/g, ' ').trim(),\n });\n }\n } else if (node.type === NODE_TYPES.ELEMENT) {\n node.props?.forEach((prop) => {\n if (\n prop.type === NODE_TYPES.ATTRIBUTE &&\n (attributesToExtract as readonly string[]).includes(prop.name) &&\n prop.value\n ) {\n const text = prop.value.content;\n\n if (shouldExtract?.(text) && generateKey) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n replacements.push({\n start: prop.loc.start.offset,\n end: prop.loc.end.offset,\n replacement: `:${prop.name}=\"content.${key}\"`,\n key,\n value: text.trim(),\n });\n }\n }\n });\n }\n\n if (node.children) {\n node.children.forEach(walkVueAst);\n }\n };\n\n walkVueAst(sfc.descriptor.template.ast);\n }\n\n // Extract and Walk Script using Babel\n const scriptBlock = sfc.descriptor.scriptSetup ?? sfc.descriptor.script;\n\n if (scriptBlock) {\n const scriptText = scriptBlock.content;\n const offset = scriptBlock.loc.start.offset;\n\n try {\n const ast = babelParse(scriptText, {\n parserOpts: {\n sourceType: 'module',\n plugins: ['typescript', 'jsx'],\n },\n });\n\n if (ast) {\n traverse(ast, {\n StringLiteral(path: any) {\n if (path.parentPath.isImportDeclaration()) return;\n\n if (path.parentPath.isExportDeclaration()) return;\n\n if (path.parentPath.isImportSpecifier()) return;\n\n if (path.parentPath.isObjectProperty() && path.key === 'key')\n return;\n\n if (path.parentPath.isCallExpression()) {\n const callee = path.parentPath.node.callee;\n\n if (\n t.isMemberExpression(callee) &&\n t.isIdentifier(callee.object) &&\n callee.object.name === 'console'\n )\n return;\n\n if (\n t.isIdentifier(callee) &&\n (callee.name === 'useIntlayer' || callee.name === 't')\n )\n return;\n\n if (callee.type === 'Import') return;\n\n if (t.isIdentifier(callee) && callee.name === 'require') return;\n }\n\n const text = path.node.value;\n\n if (shouldExtract?.(text) && generateKey) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n\n if (path.node.start != null && path.node.end != null) {\n replacements.push({\n start: offset + path.node.start,\n end: offset + path.node.end,\n replacement: `content.${key}`,\n key,\n value: text.trim(),\n });\n }\n }\n },\n });\n }\n } catch (e) {\n console.warn(\n `Vue extraction: Failed to parse script content for ${filename}`,\n e\n );\n }\n }\n\n // Abort if nothing was extracted\n if (replacements.length === 0) return null;\n\n // Apply Replacements in Reverse Order\n replacements.sort((a, b) => b.start - a.start);\n\n for (const { start, end, replacement, key, value } of replacements) {\n magic.overwrite(start, end, replacement);\n extractedContent[key] = value;\n }\n\n // 4. Inject necessary imports and setup\n const finalScriptContent = scriptBlock?.content ?? '';\n\n const hasUseIntlayerImport =\n /import\\s*{[^}]*useIntlayer[^}]*}\\s*from\\s*['\"][^'\"]+['\"]/.test(\n finalScriptContent\n ) ||\n /import\\s+useIntlayer\\s+from\\s*['\"][^'\"]+['\"]/.test(finalScriptContent);\n\n const hasContentDeclaration = /const\\s+content\\s*=\\s*useIntlayer\\s*\\(/.test(\n finalScriptContent\n );\n\n const importStmt = hasUseIntlayerImport\n ? ''\n : `import { useIntlayer } from '${packageName}';`;\n const contentDecl = hasContentDeclaration\n ? ''\n : `const content = useIntlayer('${dictionaryKey}');`;\n\n const injectionParts = [importStmt, contentDecl].filter(Boolean);\n\n if (injectionParts.length > 0) {\n const injection = `\\n${injectionParts.join('\\n')}\\n`;\n\n if (sfc.descriptor.scriptSetup) {\n magic.appendLeft(sfc.descriptor.scriptSetup.loc.start.offset, injection);\n } else if (sfc.descriptor.script) {\n magic.appendLeft(sfc.descriptor.script.loc.start.offset, injection);\n } else {\n magic.prepend(\n `<script setup>\\n${importStmt}\\n${contentDecl}\\n</script>\\n`\n );\n }\n }\n\n if (onExtract) {\n onExtract({\n dictionaryKey,\n filePath: filename,\n content: { ...extractedContent },\n locale: defaultLocale,\n });\n }\n\n return {\n code: magic.toString(),\n map: magic.generateMap({ source: filename, includeContent: true }),\n extracted: true,\n };\n};\n\ntype Tools = {\n generateKey: (text: string, existingKeys: Set<string>) => string;\n shouldExtract: (text: string) => boolean;\n extractDictionaryKeyFromPath: (path: string) => string;\n attributesToExtract: readonly string[];\n extractTsContent: any;\n};\n\nexport const processVueFile = (\n filePath: string,\n _componentKey: string,\n packageName: string,\n tools: Tools,\n save: boolean = true\n): {\n extractedContent: Record<string, string>;\n code: string;\n map?: any;\n} | null => {\n const code = readFileSync(filePath, 'utf-8');\n let extractedContent: Record<string, string> = {};\n\n const result = intlayerVueExtract(code, filePath, {\n packageName,\n dictionaryKey: _componentKey,\n shouldExtract: tools.shouldExtract,\n generateKey: tools.generateKey,\n extractDictionaryKeyFromPath: tools.extractDictionaryKeyFromPath,\n attributesToExtract: tools.attributesToExtract,\n onExtract: (extractResult) => {\n extractedContent = extractResult.content;\n },\n });\n\n if (!result) return null;\n\n if (save) {\n writeFileSync(filePath, result.code);\n }\n\n return {\n extractedContent,\n code: result.code,\n map: result.map,\n };\n};\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import{readFile as e,writeFile as t}from"node:fs/promises";import{parse as n,traverse as r,types as i}from"@babel/core";import a from"@vue/compiler-sfc";const o=(e,t)=>{if(!e)return!1;if(!t||t.length===0)return!0;let n=e.replace(/\\/g,`/`);return t.some(e=>e.replace(/\\/g,`/`)===n)},s={TEXT:2,ELEMENT:1,ATTRIBUTE:6},c=async(e,t,c={})=>{let{defaultLocale:l=`en`,packageName:u=`vue-intlayer`,filesList:d,shouldExtract:f,onExtract:p,dictionaryKey:m,attributesToExtract:h=[],extractDictionaryKeyFromPath:g,generateKey:_}=c;if(!o(t,d)||!t.endsWith(`.vue`))return null;let v,y;try{v=a.parse}catch{return console.warn(`Vue extraction: @vue/compiler-sfc not found.`),null}try{y=(await import(`magic-string`)).default}catch{return console.warn(`Vue extraction: magic-string not found.`),null}let b=v(e),x=new y(e),S={},C=new Set,w=m??g?.(t)??``,T=[];if(b.descriptor.template){let e=t=>{if(t.type===s.TEXT){let e=t.content??``;if(f?.(e)&&_){let n=_(e,C);C.add(n),T.push({start:t.loc.start.offset,end:t.loc.end.offset,replacement:`{{ content.${n} }}`,key:n,value:e.replace(/\s+/g,` `).trim()})}}else t.type===s.ELEMENT&&t.props?.forEach(e=>{if(e.type===s.ATTRIBUTE&&h.includes(e.name)&&e.value){let t=e.value.content;if(f?.(t)&&_){let n=_(t,C);C.add(n),T.push({start:e.loc.start.offset,end:e.loc.end.offset,replacement:`:${e.name}="content.${n}"`,key:n,value:t.trim()})}}});t.children&&t.children.forEach(e)};e(b.descriptor.template.ast)}let E=b.descriptor.scriptSetup??b.descriptor.script;if(E){let e=E.content,a=E.loc.start.offset;try{let t=n(e,{parserOpts:{sourceType:`module`,plugins:[`typescript`,`jsx`]}});t&&r(t,{StringLiteral(e){if(e.parentPath.isImportDeclaration()||e.parentPath.isExportDeclaration()||e.parentPath.isImportSpecifier()||e.parentPath.isObjectProperty()&&e.key===`key`)return;if(e.parentPath.isCallExpression()){let t=e.parentPath.node.callee;if(i.isMemberExpression(t)&&i.isIdentifier(t.object)&&t.object.name===`console`||i.isIdentifier(t)&&(t.name===`useIntlayer`||t.name===`t`)||t.type===`Import`||i.isIdentifier(t)&&t.name===`require`)return}let t=e.node.value;if(f?.(t)&&_){let n=_(t,C);C.add(n),e.node.start!=null&&e.node.end!=null&&T.push({start:a+e.node.start,end:a+e.node.end,replacement:`content.${n}`,key:n,value:t.trim()})}}})}catch(e){console.warn(`Vue extraction: Failed to parse script content for ${t}`,e)}}if(T.length===0)return null;T.sort((e,t)=>t.start-e.start);for(let{start:e,end:t,replacement:n,key:r,value:i}of T)x.overwrite(e,t,n),S[r]=i;let D=E?.content??``,O=/import\s*{[^}]*useIntlayer[^}]*}\s*from\s*['"][^'"]+['"]/.test(D)||/import\s+useIntlayer\s+from\s*['"][^'"]+['"]/.test(D),k=/const\s+content\s*=\s*useIntlayer\s*\(/.test(D),A=O?``:`import { useIntlayer } from '${u}';`,j=k?``:`const content = useIntlayer('${w}');`,M=[A,j].filter(Boolean);if(M.length>0){let e=`\n${M.join(`
2
- `)}\n`;b.descriptor.scriptSetup?x.appendLeft(b.descriptor.scriptSetup.loc.start.offset,e):b.descriptor.script?x.appendLeft(b.descriptor.script.loc.start.offset,e):x.prepend(`<script setup>\n${A}\n${j}\n<\/script>\n`)}return p&&p({dictionaryKey:w,filePath:t,content:{...S},locale:l}),{code:x.toString(),map:x.generateMap({source:t,includeContent:!0}),extracted:!0}},l=async(n,r,i,a,o=!0)=>{let s=await e(n,`utf-8`),l={},u=await c(s,n,{packageName:i,dictionaryKey:r,shouldExtract:a.shouldExtract,generateKey:a.generateKey,extractDictionaryKeyFromPath:a.extractDictionaryKeyFromPath,attributesToExtract:a.attributesToExtract,onExtract:e=>{l=e.content}});return u?(o&&await t(n,u.code),l):null};export{c as intlayerVueExtract,l as processVueFile,o as shouldProcessFile};
1
+ import{readFileSync as e,writeFileSync as t}from"node:fs";import{parse as n,traverse as r,types as i}from"@babel/core";import{DefaultValues as a}from"@intlayer/config/client";import o from"@vue/compiler-sfc";import s from"magic-string";const c=(e,t)=>{if(!e)return!1;if(!t||t.length===0)return!0;let n=e.replace(/\\/g,`/`);return t.some(e=>e.replace(/\\/g,`/`)===n)},l={TEXT:2,ELEMENT:1,ATTRIBUTE:6},u=(e,t,u={})=>{let{defaultLocale:d=a.Internationalization.DEFAULT_LOCALE,packageName:f=`vue-intlayer`,filesList:p,shouldExtract:m,onExtract:h,dictionaryKey:g,attributesToExtract:_=[],extractDictionaryKeyFromPath:v,generateKey:y}=u;if(!c(t,p)||!t.endsWith(`.vue`))return null;let b;try{b=o.parse}catch{return console.warn(`Vue extraction: @vue/compiler-sfc not found.`),null}let x=b(e),S=new s(e),C={},w=new Set,T=g??v?.(t)??``,E=[];if(x.descriptor.template){let e=t=>{if(t.type===l.TEXT){let e=t.content??``;if(m?.(e)&&y){let n=y(e,w);w.add(n),E.push({start:t.loc.start.offset,end:t.loc.end.offset,replacement:`{{ content.${n} }}`,key:n,value:e.replace(/\s+/g,` `).trim()})}}else t.type===l.ELEMENT&&t.props?.forEach(e=>{if(e.type===l.ATTRIBUTE&&_.includes(e.name)&&e.value){let t=e.value.content;if(m?.(t)&&y){let n=y(t,w);w.add(n),E.push({start:e.loc.start.offset,end:e.loc.end.offset,replacement:`:${e.name}="content.${n}"`,key:n,value:t.trim()})}}});t.children&&t.children.forEach(e)};e(x.descriptor.template.ast)}let D=x.descriptor.scriptSetup??x.descriptor.script;if(D){let e=D.content,a=D.loc.start.offset;try{let t=n(e,{parserOpts:{sourceType:`module`,plugins:[`typescript`,`jsx`]}});t&&r(t,{StringLiteral(e){if(e.parentPath.isImportDeclaration()||e.parentPath.isExportDeclaration()||e.parentPath.isImportSpecifier()||e.parentPath.isObjectProperty()&&e.key===`key`)return;if(e.parentPath.isCallExpression()){let t=e.parentPath.node.callee;if(i.isMemberExpression(t)&&i.isIdentifier(t.object)&&t.object.name===`console`||i.isIdentifier(t)&&(t.name===`useIntlayer`||t.name===`t`)||t.type===`Import`||i.isIdentifier(t)&&t.name===`require`)return}let t=e.node.value;if(m?.(t)&&y){let n=y(t,w);w.add(n),e.node.start!=null&&e.node.end!=null&&E.push({start:a+e.node.start,end:a+e.node.end,replacement:`content.${n}`,key:n,value:t.trim()})}}})}catch(e){console.warn(`Vue extraction: Failed to parse script content for ${t}`,e)}}if(E.length===0)return null;E.sort((e,t)=>t.start-e.start);for(let{start:e,end:t,replacement:n,key:r,value:i}of E)S.overwrite(e,t,n),C[r]=i;let O=D?.content??``,k=/import\s*{[^}]*useIntlayer[^}]*}\s*from\s*['"][^'"]+['"]/.test(O)||/import\s+useIntlayer\s+from\s*['"][^'"]+['"]/.test(O),A=/const\s+content\s*=\s*useIntlayer\s*\(/.test(O),j=k?``:`import { useIntlayer } from '${f}';`,M=A?``:`const content = useIntlayer('${T}');`,N=[j,M].filter(Boolean);if(N.length>0){let e=`\n${N.join(`
2
+ `)}\n`;x.descriptor.scriptSetup?S.appendLeft(x.descriptor.scriptSetup.loc.start.offset,e):x.descriptor.script?S.appendLeft(x.descriptor.script.loc.start.offset,e):S.prepend(`<script setup>\n${j}\n${M}\n<\/script>\n`)}return h&&h({dictionaryKey:T,filePath:t,content:{...C},locale:d}),{code:S.toString(),map:S.generateMap({source:t,includeContent:!0}),extracted:!0}},d=(n,r,i,a,o=!0)=>{let s=e(n,`utf-8`),c={},l=u(s,n,{packageName:i,dictionaryKey:r,shouldExtract:a.shouldExtract,generateKey:a.generateKey,extractDictionaryKeyFromPath:a.extractDictionaryKeyFromPath,attributesToExtract:a.attributesToExtract,onExtract:e=>{c=e.content}});return l?(o&&t(n,l.code),{extractedContent:c,code:l.code,map:l.map}):null};export{u as intlayerVueExtract,d as processVueFile,c as shouldProcessFile};
3
3
  //# sourceMappingURL=vue-intlayer-extract.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"vue-intlayer-extract.mjs","names":["babelParse","t"],"sources":["../../src/vue-intlayer-extract.ts"],"sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport { parse as babelParse, types as t, traverse } from '@babel/core';\nimport vueSfc from '@vue/compiler-sfc';\n\nexport type ExtractedContent = Record<string, string>;\n\nexport type ExtractResult = {\n dictionaryKey: string;\n filePath: string;\n content: ExtractedContent;\n locale: string;\n};\n\nexport type ExtractPluginOptions = {\n defaultLocale?: string;\n packageName?: string;\n filesList?: string[];\n shouldExtract?: (text: string) => boolean;\n onExtract?: (result: ExtractResult) => void;\n dictionaryKey?: string;\n attributesToExtract?: readonly string[];\n extractDictionaryKeyFromPath?: (path: string) => string;\n generateKey?: (text: string, existingKeys: Set<string>) => string;\n};\n\ntype Replacement = {\n start: number;\n end: number;\n replacement: string;\n key: string;\n value: string;\n};\n\nexport const shouldProcessFile = (\n filename: string | undefined,\n filesList?: string[]\n): boolean => {\n if (!filename) return false;\n if (!filesList || filesList.length === 0) return true;\n\n const normalizedFilename = filename.replace(/\\\\/g, '/');\n return filesList.some((f) => {\n const normalizedF = f.replace(/\\\\/g, '/');\n return normalizedF === normalizedFilename;\n });\n};\n\ntype VueParseResult = {\n descriptor: {\n template?: {\n ast: VueAstNode;\n loc: { start: { offset: number }; end: { offset: number } };\n };\n script?: {\n content: string;\n loc: { start: { offset: number }; end: { offset: number } };\n };\n scriptSetup?: {\n content: string;\n loc: { start: { offset: number }; end: { offset: number } };\n };\n };\n};\n\ntype VueAstNode = {\n type: number;\n content?: string;\n children?: VueAstNode[];\n props?: VueAstProp[];\n loc: { start: { offset: number }; end: { offset: number } };\n};\n\ntype VueAstProp = {\n type: number;\n name: string;\n value?: { content: string };\n loc: { start: { offset: number }; end: { offset: number } };\n};\n\nconst NODE_TYPES = {\n TEXT: 2,\n ELEMENT: 1,\n ATTRIBUTE: 6,\n};\n\ntype MagicStringType = {\n overwrite: (start: number, end: number, content: string) => void;\n appendLeft: (index: number, content: string) => void;\n prepend: (content: string) => void;\n toString: () => string;\n generateMap: (options: {\n source: string;\n includeContent: boolean;\n }) => unknown;\n};\n\nexport const intlayerVueExtract = async (\n code: string,\n filename: string,\n options: ExtractPluginOptions = {}\n): Promise<{ code: string; map?: unknown; extracted: boolean } | null> => {\n const {\n defaultLocale = 'en',\n packageName = 'vue-intlayer',\n filesList,\n shouldExtract,\n onExtract,\n dictionaryKey: dictionaryKeyOption,\n attributesToExtract = [],\n extractDictionaryKeyFromPath,\n generateKey,\n } = options;\n\n if (!shouldProcessFile(filename, filesList)) return null;\n if (!filename.endsWith('.vue')) return null;\n\n let parseVue: (code: string) => VueParseResult;\n let MagicString: new (code: string) => MagicStringType;\n\n try {\n parseVue = vueSfc.parse as unknown as (code: string) => VueParseResult;\n } catch {\n console.warn('Vue extraction: @vue/compiler-sfc not found.');\n return null;\n }\n\n try {\n const magicStringModule = await import('magic-string');\n MagicString = magicStringModule.default;\n } catch {\n console.warn('Vue extraction: magic-string not found.');\n return null;\n }\n\n const sfc = parseVue(code);\n const magic = new MagicString(code);\n\n const extractedContent: ExtractedContent = {};\n const existingKeys = new Set<string>();\n const dictionaryKey =\n dictionaryKeyOption ?? extractDictionaryKeyFromPath?.(filename) ?? '';\n const replacements: Replacement[] = [];\n\n // 1. Walk Vue Template AST\n if (sfc.descriptor.template) {\n const walkVueAst = (node: VueAstNode) => {\n if (node.type === NODE_TYPES.TEXT) {\n const text = node.content ?? '';\n if (shouldExtract?.(text) && generateKey) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n replacements.push({\n start: node.loc.start.offset,\n end: node.loc.end.offset,\n replacement: `{{ content.${key} }}`,\n key,\n value: text.replace(/\\s+/g, ' ').trim(),\n });\n }\n } else if (node.type === NODE_TYPES.ELEMENT) {\n node.props?.forEach((prop) => {\n if (\n prop.type === NODE_TYPES.ATTRIBUTE &&\n (attributesToExtract as readonly string[]).includes(prop.name) &&\n prop.value\n ) {\n const text = prop.value.content;\n if (shouldExtract?.(text) && generateKey) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n replacements.push({\n start: prop.loc.start.offset,\n end: prop.loc.end.offset,\n replacement: `:${prop.name}=\"content.${key}\"`,\n key,\n value: text.trim(),\n });\n }\n }\n });\n }\n\n if (node.children) {\n node.children.forEach(walkVueAst);\n }\n };\n\n walkVueAst(sfc.descriptor.template.ast);\n }\n\n // 2. Extract and Walk Script using Babel\n const scriptBlock = sfc.descriptor.scriptSetup ?? sfc.descriptor.script;\n\n if (scriptBlock) {\n const scriptText = scriptBlock.content;\n const offset = scriptBlock.loc.start.offset;\n\n try {\n const ast = babelParse(scriptText, {\n parserOpts: {\n sourceType: 'module',\n plugins: ['typescript', 'jsx'],\n },\n });\n\n if (ast) {\n traverse(ast, {\n StringLiteral(path: any) {\n if (path.parentPath.isImportDeclaration()) return;\n if (path.parentPath.isExportDeclaration()) return;\n if (path.parentPath.isImportSpecifier()) return;\n if (path.parentPath.isObjectProperty() && path.key === 'key')\n return;\n\n if (path.parentPath.isCallExpression()) {\n const callee = path.parentPath.node.callee;\n if (\n t.isMemberExpression(callee) &&\n t.isIdentifier(callee.object) &&\n callee.object.name === 'console'\n )\n return;\n\n if (\n t.isIdentifier(callee) &&\n (callee.name === 'useIntlayer' || callee.name === 't')\n )\n return;\n\n if (callee.type === 'Import') return;\n if (t.isIdentifier(callee) && callee.name === 'require') return;\n }\n\n const text = path.node.value;\n if (shouldExtract?.(text) && generateKey) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n\n if (path.node.start != null && path.node.end != null) {\n replacements.push({\n start: offset + path.node.start,\n end: offset + path.node.end,\n replacement: `content.${key}`,\n key,\n value: text.trim(),\n });\n }\n }\n },\n });\n }\n } catch (e) {\n console.warn(\n `Vue extraction: Failed to parse script content for ${filename}`,\n e\n );\n }\n }\n\n // Abort if nothing was extracted\n if (replacements.length === 0) return null;\n\n // 3. Apply Replacements in Reverse Order\n replacements.sort((a, b) => b.start - a.start);\n for (const { start, end, replacement, key, value } of replacements) {\n magic.overwrite(start, end, replacement);\n extractedContent[key] = value;\n }\n\n // 4. Inject necessary imports and setup\n const finalScriptContent = scriptBlock?.content ?? '';\n\n const hasUseIntlayerImport =\n /import\\s*{[^}]*useIntlayer[^}]*}\\s*from\\s*['\"][^'\"]+['\"]/.test(\n finalScriptContent\n ) ||\n /import\\s+useIntlayer\\s+from\\s*['\"][^'\"]+['\"]/.test(finalScriptContent);\n\n const hasContentDeclaration = /const\\s+content\\s*=\\s*useIntlayer\\s*\\(/.test(\n finalScriptContent\n );\n\n const importStmt = hasUseIntlayerImport\n ? ''\n : `import { useIntlayer } from '${packageName}';`;\n const contentDecl = hasContentDeclaration\n ? ''\n : `const content = useIntlayer('${dictionaryKey}');`;\n\n const injectionParts = [importStmt, contentDecl].filter(Boolean);\n\n if (injectionParts.length > 0) {\n const injection = `\\n${injectionParts.join('\\n')}\\n`;\n\n if (sfc.descriptor.scriptSetup) {\n magic.appendLeft(sfc.descriptor.scriptSetup.loc.start.offset, injection);\n } else if (sfc.descriptor.script) {\n magic.appendLeft(sfc.descriptor.script.loc.start.offset, injection);\n } else {\n magic.prepend(\n `<script setup>\\n${importStmt}\\n${contentDecl}\\n</script>\\n`\n );\n }\n }\n\n if (onExtract) {\n onExtract({\n dictionaryKey,\n filePath: filename,\n content: { ...extractedContent },\n locale: defaultLocale,\n });\n }\n\n return {\n code: magic.toString(),\n map: magic.generateMap({ source: filename, includeContent: true }),\n extracted: true,\n };\n};\n\ntype Tools = {\n generateKey: (text: string, existingKeys: Set<string>) => string;\n shouldExtract: (text: string) => boolean;\n extractDictionaryKeyFromPath: (path: string) => string;\n attributesToExtract: readonly string[];\n extractTsContent: any;\n};\n\nexport const processVueFile = async (\n filePath: string,\n _componentKey: string,\n packageName: string,\n tools: Tools,\n save: boolean = true\n): Promise<Record<string, string> | null> => {\n const code = await readFile(filePath, 'utf-8');\n let extractedContent: Record<string, string> = {};\n\n const result = await intlayerVueExtract(code, filePath, {\n packageName,\n dictionaryKey: _componentKey,\n shouldExtract: tools.shouldExtract,\n generateKey: tools.generateKey,\n extractDictionaryKeyFromPath: tools.extractDictionaryKeyFromPath,\n attributesToExtract: tools.attributesToExtract,\n onExtract: (extractResult) => {\n extractedContent = extractResult.content;\n },\n });\n\n if (!result) return null;\n\n if (save) {\n await writeFile(filePath, result.code);\n }\n\n return extractedContent;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"vue-intlayer-extract.mjs","names":["babelParse","t"],"sources":["../../src/vue-intlayer-extract.ts"],"sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\nimport { parse as babelParse, types as t, traverse } from '@babel/core';\nimport { DefaultValues } from '@intlayer/config/client';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport vueSfc from '@vue/compiler-sfc';\nimport MagicString from 'magic-string';\n\nexport type ExtractedContent = Record<string, string>;\n\nexport type ExtractResult = {\n dictionaryKey: string;\n filePath: string;\n content: ExtractedContent;\n locale: Locale;\n};\n\nexport type ExtractPluginOptions = {\n defaultLocale?: Locale;\n packageName?: string;\n filesList?: string[];\n shouldExtract?: (text: string) => boolean;\n onExtract?: (result: ExtractResult) => void;\n dictionaryKey?: string;\n attributesToExtract?: readonly string[];\n extractDictionaryKeyFromPath?: (path: string) => string;\n generateKey?: (text: string, existingKeys: Set<string>) => string;\n};\n\ntype Replacement = {\n start: number;\n end: number;\n replacement: string;\n key: string;\n value: string;\n};\n\nexport const shouldProcessFile = (\n filename: string | undefined,\n filesList?: string[]\n): boolean => {\n if (!filename) return false;\n if (!filesList || filesList.length === 0) return true;\n\n const normalizedFilename = filename.replace(/\\\\/g, '/');\n return filesList.some((f) => {\n const normalizedF = f.replace(/\\\\/g, '/');\n return normalizedF === normalizedFilename;\n });\n};\n\ntype VueParseResult = {\n descriptor: {\n template?: {\n ast: VueAstNode;\n loc: { start: { offset: number }; end: { offset: number } };\n };\n script?: {\n content: string;\n loc: { start: { offset: number }; end: { offset: number } };\n };\n scriptSetup?: {\n content: string;\n loc: { start: { offset: number }; end: { offset: number } };\n };\n };\n};\n\ntype VueAstNode = {\n type: number;\n content?: string;\n children?: VueAstNode[];\n props?: VueAstProp[];\n loc: { start: { offset: number }; end: { offset: number } };\n};\n\ntype VueAstProp = {\n type: number;\n name: string;\n value?: { content: string };\n loc: { start: { offset: number }; end: { offset: number } };\n};\n\nconst NODE_TYPES = {\n TEXT: 2,\n ELEMENT: 1,\n ATTRIBUTE: 6,\n};\n\nexport const intlayerVueExtract = (\n code: string,\n filename: string,\n options: ExtractPluginOptions = {}\n): { code: string; map?: unknown; extracted: boolean } | null => {\n const {\n defaultLocale = DefaultValues.Internationalization.DEFAULT_LOCALE,\n packageName = 'vue-intlayer',\n filesList,\n shouldExtract,\n onExtract,\n dictionaryKey: dictionaryKeyOption,\n attributesToExtract = [],\n extractDictionaryKeyFromPath,\n generateKey,\n } = options;\n\n if (!shouldProcessFile(filename, filesList)) return null;\n if (!filename.endsWith('.vue')) return null;\n\n let parseVue: (code: string) => VueParseResult;\n\n try {\n parseVue = vueSfc.parse as unknown as (code: string) => VueParseResult;\n } catch {\n console.warn('Vue extraction: @vue/compiler-sfc not found.');\n return null;\n }\n\n const sfc = parseVue(code);\n const magic = new MagicString(code);\n\n const extractedContent: ExtractedContent = {};\n const existingKeys = new Set<string>();\n const dictionaryKey =\n dictionaryKeyOption ?? extractDictionaryKeyFromPath?.(filename) ?? '';\n const replacements: Replacement[] = [];\n\n // Walk Vue Template AST\n if (sfc.descriptor.template) {\n const walkVueAst = (node: VueAstNode) => {\n if (node.type === NODE_TYPES.TEXT) {\n const text = node.content ?? '';\n\n if (shouldExtract?.(text) && generateKey) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n replacements.push({\n start: node.loc.start.offset,\n end: node.loc.end.offset,\n replacement: `{{ content.${key} }}`,\n key,\n value: text.replace(/\\s+/g, ' ').trim(),\n });\n }\n } else if (node.type === NODE_TYPES.ELEMENT) {\n node.props?.forEach((prop) => {\n if (\n prop.type === NODE_TYPES.ATTRIBUTE &&\n (attributesToExtract as readonly string[]).includes(prop.name) &&\n prop.value\n ) {\n const text = prop.value.content;\n\n if (shouldExtract?.(text) && generateKey) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n replacements.push({\n start: prop.loc.start.offset,\n end: prop.loc.end.offset,\n replacement: `:${prop.name}=\"content.${key}\"`,\n key,\n value: text.trim(),\n });\n }\n }\n });\n }\n\n if (node.children) {\n node.children.forEach(walkVueAst);\n }\n };\n\n walkVueAst(sfc.descriptor.template.ast);\n }\n\n // Extract and Walk Script using Babel\n const scriptBlock = sfc.descriptor.scriptSetup ?? sfc.descriptor.script;\n\n if (scriptBlock) {\n const scriptText = scriptBlock.content;\n const offset = scriptBlock.loc.start.offset;\n\n try {\n const ast = babelParse(scriptText, {\n parserOpts: {\n sourceType: 'module',\n plugins: ['typescript', 'jsx'],\n },\n });\n\n if (ast) {\n traverse(ast, {\n StringLiteral(path: any) {\n if (path.parentPath.isImportDeclaration()) return;\n\n if (path.parentPath.isExportDeclaration()) return;\n\n if (path.parentPath.isImportSpecifier()) return;\n\n if (path.parentPath.isObjectProperty() && path.key === 'key')\n return;\n\n if (path.parentPath.isCallExpression()) {\n const callee = path.parentPath.node.callee;\n\n if (\n t.isMemberExpression(callee) &&\n t.isIdentifier(callee.object) &&\n callee.object.name === 'console'\n )\n return;\n\n if (\n t.isIdentifier(callee) &&\n (callee.name === 'useIntlayer' || callee.name === 't')\n )\n return;\n\n if (callee.type === 'Import') return;\n\n if (t.isIdentifier(callee) && callee.name === 'require') return;\n }\n\n const text = path.node.value;\n\n if (shouldExtract?.(text) && generateKey) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n\n if (path.node.start != null && path.node.end != null) {\n replacements.push({\n start: offset + path.node.start,\n end: offset + path.node.end,\n replacement: `content.${key}`,\n key,\n value: text.trim(),\n });\n }\n }\n },\n });\n }\n } catch (e) {\n console.warn(\n `Vue extraction: Failed to parse script content for ${filename}`,\n e\n );\n }\n }\n\n // Abort if nothing was extracted\n if (replacements.length === 0) return null;\n\n // Apply Replacements in Reverse Order\n replacements.sort((a, b) => b.start - a.start);\n\n for (const { start, end, replacement, key, value } of replacements) {\n magic.overwrite(start, end, replacement);\n extractedContent[key] = value;\n }\n\n // 4. Inject necessary imports and setup\n const finalScriptContent = scriptBlock?.content ?? '';\n\n const hasUseIntlayerImport =\n /import\\s*{[^}]*useIntlayer[^}]*}\\s*from\\s*['\"][^'\"]+['\"]/.test(\n finalScriptContent\n ) ||\n /import\\s+useIntlayer\\s+from\\s*['\"][^'\"]+['\"]/.test(finalScriptContent);\n\n const hasContentDeclaration = /const\\s+content\\s*=\\s*useIntlayer\\s*\\(/.test(\n finalScriptContent\n );\n\n const importStmt = hasUseIntlayerImport\n ? ''\n : `import { useIntlayer } from '${packageName}';`;\n const contentDecl = hasContentDeclaration\n ? ''\n : `const content = useIntlayer('${dictionaryKey}');`;\n\n const injectionParts = [importStmt, contentDecl].filter(Boolean);\n\n if (injectionParts.length > 0) {\n const injection = `\\n${injectionParts.join('\\n')}\\n`;\n\n if (sfc.descriptor.scriptSetup) {\n magic.appendLeft(sfc.descriptor.scriptSetup.loc.start.offset, injection);\n } else if (sfc.descriptor.script) {\n magic.appendLeft(sfc.descriptor.script.loc.start.offset, injection);\n } else {\n magic.prepend(\n `<script setup>\\n${importStmt}\\n${contentDecl}\\n</script>\\n`\n );\n }\n }\n\n if (onExtract) {\n onExtract({\n dictionaryKey,\n filePath: filename,\n content: { ...extractedContent },\n locale: defaultLocale,\n });\n }\n\n return {\n code: magic.toString(),\n map: magic.generateMap({ source: filename, includeContent: true }),\n extracted: true,\n };\n};\n\ntype Tools = {\n generateKey: (text: string, existingKeys: Set<string>) => string;\n shouldExtract: (text: string) => boolean;\n extractDictionaryKeyFromPath: (path: string) => string;\n attributesToExtract: readonly string[];\n extractTsContent: any;\n};\n\nexport const processVueFile = (\n filePath: string,\n _componentKey: string,\n packageName: string,\n tools: Tools,\n save: boolean = true\n): {\n extractedContent: Record<string, string>;\n code: string;\n map?: any;\n} | null => {\n const code = readFileSync(filePath, 'utf-8');\n let extractedContent: Record<string, string> = {};\n\n const result = intlayerVueExtract(code, filePath, {\n packageName,\n dictionaryKey: _componentKey,\n shouldExtract: tools.shouldExtract,\n generateKey: tools.generateKey,\n extractDictionaryKeyFromPath: tools.extractDictionaryKeyFromPath,\n attributesToExtract: tools.attributesToExtract,\n onExtract: (extractResult) => {\n extractedContent = extractResult.content;\n },\n });\n\n if (!result) return null;\n\n if (save) {\n writeFileSync(filePath, result.code);\n }\n\n return {\n extractedContent,\n code: result.code,\n map: result.map,\n };\n};\n"],"mappings":"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"}
@@ -1,13 +1,15 @@
1
+ import { Locale } from "@intlayer/types/allLocales";
2
+
1
3
  //#region src/vue-intlayer-extract.d.ts
2
4
  type ExtractedContent = Record<string, string>;
3
5
  type ExtractResult = {
4
6
  dictionaryKey: string;
5
7
  filePath: string;
6
8
  content: ExtractedContent;
7
- locale: string;
9
+ locale: Locale;
8
10
  };
9
11
  type ExtractPluginOptions = {
10
- defaultLocale?: string;
12
+ defaultLocale?: Locale;
11
13
  packageName?: string;
12
14
  filesList?: string[];
13
15
  shouldExtract?: (text: string) => boolean;
@@ -18,11 +20,11 @@ type ExtractPluginOptions = {
18
20
  generateKey?: (text: string, existingKeys: Set<string>) => string;
19
21
  };
20
22
  declare const shouldProcessFile: (filename: string | undefined, filesList?: string[]) => boolean;
21
- declare const intlayerVueExtract: (code: string, filename: string, options?: ExtractPluginOptions) => Promise<{
23
+ declare const intlayerVueExtract: (code: string, filename: string, options?: ExtractPluginOptions) => {
22
24
  code: string;
23
25
  map?: unknown;
24
26
  extracted: boolean;
25
- } | null>;
27
+ } | null;
26
28
  type Tools = {
27
29
  generateKey: (text: string, existingKeys: Set<string>) => string;
28
30
  shouldExtract: (text: string) => boolean;
@@ -30,7 +32,11 @@ type Tools = {
30
32
  attributesToExtract: readonly string[];
31
33
  extractTsContent: any;
32
34
  };
33
- declare const processVueFile: (filePath: string, _componentKey: string, packageName: string, tools: Tools, save?: boolean) => Promise<Record<string, string> | null>;
35
+ declare const processVueFile: (filePath: string, _componentKey: string, packageName: string, tools: Tools, save?: boolean) => {
36
+ extractedContent: Record<string, string>;
37
+ code: string;
38
+ map?: any;
39
+ } | null;
34
40
  //#endregion
35
41
  export { ExtractPluginOptions, ExtractResult, ExtractedContent, intlayerVueExtract, processVueFile, shouldProcessFile };
36
42
  //# sourceMappingURL=vue-intlayer-extract.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vue-intlayer-extract.d.ts","names":[],"sources":["../../src/vue-intlayer-extract.ts"],"mappings":";KAIY,gBAAA,GAAmB,MAAA;AAAA,KAEnB,aAAA;EACV,aAAA;EACA,QAAA;EACA,OAAA,EAAS,gBAAA;EACT,MAAA;AAAA;AAAA,KAGU,oBAAA;EACV,aAAA;EACA,WAAA;EACA,SAAA;EACA,aAAA,IAAiB,IAAA;EACjB,SAAA,IAAa,MAAA,EAAQ,aAAA;EACrB,aAAA;EACA,mBAAA;EACA,4BAAA,IAAgC,IAAA;EAChC,WAAA,IAAe,IAAA,UAAc,YAAA,EAAc,GAAA;AAAA;AAAA,cAWhC,iBAAA,GACX,QAAA,sBACA,SAAA;AAAA,cA6DW,kBAAA,GACX,IAAA,UACA,QAAA,UACA,OAAA,GAAS,oBAAA,KACR,OAAA;EAAU,IAAA;EAAc,GAAA;EAAe,SAAA;AAAA;AAAA,KA6NrC,KAAA;EACH,WAAA,GAAc,IAAA,UAAc,YAAA,EAAc,GAAA;EAC1C,aAAA,GAAgB,IAAA;EAChB,4BAAA,GAA+B,IAAA;EAC/B,mBAAA;EACA,gBAAA;AAAA;AAAA,cAGW,cAAA,GACX,QAAA,UACA,aAAA,UACA,WAAA,UACA,KAAA,EAAO,KAAA,EACP,IAAA,eACC,OAAA,CAAQ,MAAA"}
1
+ {"version":3,"file":"vue-intlayer-extract.d.ts","names":[],"sources":["../../src/vue-intlayer-extract.ts"],"mappings":";;;KAOY,gBAAA,GAAmB,MAAA;AAAA,KAEnB,aAAA;EACV,aAAA;EACA,QAAA;EACA,OAAA,EAAS,gBAAA;EACT,MAAA,EAAQ,MAAA;AAAA;AAAA,KAGE,oBAAA;EACV,aAAA,GAAgB,MAAA;EAChB,WAAA;EACA,SAAA;EACA,aAAA,IAAiB,IAAA;EACjB,SAAA,IAAa,MAAA,EAAQ,aAAA;EACrB,aAAA;EACA,mBAAA;EACA,4BAAA,IAAgC,IAAA;EAChC,WAAA,IAAe,IAAA,UAAc,YAAA,EAAc,GAAA;AAAA;AAAA,cAWhC,iBAAA,GACX,QAAA,sBACA,SAAA;AAAA,cAkDW,kBAAA,GACX,IAAA,UACA,QAAA,UACA,OAAA,GAAS,oBAAA;EACN,IAAA;EAAc,GAAA;EAAe,SAAA;AAAA;AAAA,KA6N7B,KAAA;EACH,WAAA,GAAc,IAAA,UAAc,YAAA,EAAc,GAAA;EAC1C,aAAA,GAAgB,IAAA;EAChB,4BAAA,GAA+B,IAAA;EAC/B,mBAAA;EACA,gBAAA;AAAA;AAAA,cAGW,cAAA,GACX,QAAA,UACA,aAAA,UACA,WAAA,UACA,KAAA,EAAO,KAAA,EACP,IAAA;EAEA,gBAAA,EAAkB,MAAA;EAClB,IAAA;EACA,GAAA;AAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intlayer/vue-compiler",
3
- "version": "8.2.4",
3
+ "version": "8.3.0-canary.0",
4
4
  "private": false,
5
5
  "description": "Vite-compatible compiler plugin for Vue with Intlayer, providing HMR support, file transformation, and optimized dictionary loading for Vue applications.",
6
6
  "keywords": [
@@ -60,27 +60,28 @@
60
60
  "./package.json"
61
61
  ],
62
62
  "scripts": {
63
- "build": "tsdown --config tsdown.config.ts",
64
- "build:ci": "tsdown --config tsdown.config.ts",
65
- "clean": "rimraf ./dist .turbo",
66
- "dev": "tsdown --config tsdown.config.ts --watch",
67
- "format": "biome format . --check",
68
- "format:fix": "biome format --write .",
69
- "lint": "biome lint .",
70
- "lint:fix": "biome lint --write .",
63
+ "build": "bun --bun tsdown --config tsdown.config.ts",
64
+ "build:ci": "bun --bun tsdown --config tsdown.config.ts",
65
+ "clean": "bun --bun rimraf ./dist .turbo",
66
+ "dev": "bun --bun tsdown --config tsdown.config.ts --watch",
67
+ "format": "bun --bun biome format . --check",
68
+ "format:fix": "bun --bun biome format --write .",
69
+ "lint": "bun --bun biome lint .",
70
+ "lint:fix": "bun --bun biome lint --write .",
71
71
  "prepublish": "cp -f ../../../README.md ./README.md",
72
72
  "publish": "bun publish || true",
73
73
  "publish:canary": "bun publish --access public --tag canary || true",
74
74
  "publish:latest": "bun publish --access public --tag latest || true",
75
75
  "serve": "webpack serve --config ./webpack.config.ts",
76
- "test": "vitest run",
77
- "test:watch": "vitest",
76
+ "test": "bun --bun vitest run",
77
+ "test:watch": "bun --bun vitest",
78
78
  "transpile": "webpack --config ./webpack.config.ts",
79
79
  "typecheck": "tsc --noEmit --project tsconfig.types.json",
80
80
  "watch": "webpack --config ./webpack.config.ts --watch"
81
81
  },
82
82
  "dependencies": {
83
83
  "@babel/core": "7.29.0",
84
+ "@intlayer/types": "8.3.0-canary.0",
84
85
  "@vue/compiler-sfc": ">=3.0.0",
85
86
  "fast-glob": "3.3.3",
86
87
  "magic-string": "0.30.21"
@@ -94,7 +95,7 @@
94
95
  "@utils/ts-config-types": "1.0.4",
95
96
  "@utils/tsdown-config": "1.0.4",
96
97
  "rimraf": "6.1.3",
97
- "tsdown": "0.21.0",
98
+ "tsdown": "0.21.1",
98
99
  "typescript": "5.9.3",
99
100
  "vitest": "4.0.18"
100
101
  },