@intlayer/vue-transformer 7.3.1 → 7.3.2-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.
package/README.md CHANGED
@@ -24,8 +24,6 @@
24
24
  <a href="https://github.com/aymericzip/intlayer/blob/main/LICENSE" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/github/license/aymericzip/intlayer?style=for-the-badge&labelColor=000000&color=FFFFFF&logoColor=000000&cacheSeconds=86400" alt="license"/></a>
25
25
  <a href="https://github.com/aymericzip/intlayer/commits/main" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/github/last-commit/aymericzip/intlayer?style=for-the-badge&labelColor=000000&color=FFFFFF&logoColor=000000&cacheSeconds=86400" alt="last commit"/>
26
26
  </a>
27
- <a href="https://bountyhub.dev/bounties?repo=intlayer" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/badge/Bounties-on%20BountyHub-yellow?style=for-the-badge&labelColor=000000&color=FFFFFF&logoColor=000000&cacheSeconds=86400" alt="Bounties on BountyHub"/>
28
- </a>
29
27
  </p>
30
28
 
31
29
  ![Watch the video](https://github.com/aymericzip/intlayer/blob/main/docs/assets/demo_video.gif)
@@ -173,9 +171,8 @@ Explore our comprehensive documentation to get started with Intlayer and learn h
173
171
  <details open>
174
172
  <summary style="font-size:16px; font-weight:bold;">🌐 Environment</summary>
175
173
  <ul>
176
- <li><a href="https://intlayer.org/doc/environment/nextjs" rel=''>Intlayer with Next.js 16</a>
174
+ <li><a href="https://intlayer.org/doc/environment/nextjs" rel=''>Intlayer with Next.js 15</a>
177
175
  <ul>
178
- <li><a href="https://intlayer.org/doc/environment/nextjs/15" rel=''>Next.js 15</a></li>
179
176
  <li><a href="https://intlayer.org/doc/environment/nextjs/14" rel=''>Next.js 14 (App Router)</a></li>
180
177
  <li><a href="https://intlayer.org/doc/environment/nextjs/next-with-Page-Router" rel=''>Next.js Page Router</a></li>
181
178
  </ul>
@@ -190,7 +187,6 @@ Explore our comprehensive documentation to get started with Intlayer and learn h
190
187
  <li><a href="https://intlayer.org/doc/environment/react-native-and-expo" rel=''>React Native</a></li>
191
188
  <li><a href="https://intlayer.org/doc/environment/lynx-and-react" rel=''>Lynx + React</a></li>
192
189
  <li><a href="https://intlayer.org/doc/environment/vite-and-svelte" rel=''>Vite + Svelte</a></li>
193
- <li><a href="https://intlayer.org/doc/environment/sveltekit" rel=''>SvelteKit</a></li>
194
190
  <li><a href="https://intlayer.org/doc/environment/vite-and-preact" rel=''>Vite + Preact</a></li>
195
191
  <li><a href="https://intlayer.org/doc/environment/vite-and-vue" rel=''>Vite + Vue</a></li>
196
192
  <li><a href="https://intlayer.org/doc/environment/vite-and-nuxt" rel=''>Vite + Nuxt</a></li>
@@ -250,6 +246,9 @@ You can also follow us on :
250
246
  <a href="https://www.linkedin.com/company/intlayerorg" target="blank" rel='noopener noreferrer nofollow'><img align="center"
251
247
  src="https://img.shields.io/badge/linkedin-%231DA1F2.svg?style=for-the-badge&logo=linkedin&logoColor=white"
252
248
  alt="Intlayer LinkedIn" height="30"/></a>
249
+ <a href="https://www.facebook.com/intlayer" target="blank" rel='noopener noreferrer nofollow'><img align="center"
250
+ src="https://img.shields.io/badge/facebook-4267B2.svg?style=for-the-badge&logo=facebook&logoColor=white"
251
+ alt="Intlayer Facebook" height="30"/></a>
253
252
  <a href="https://www.instagram.com/intlayer/" target="blank" rel='noopener noreferrer nofollow'><img align="center"
254
253
  src="https://img.shields.io/badge/instagram-%23E4405F.svg?style=for-the-badge&logo=Instagram&logoColor=white"
255
254
  alt="Intlayer Instagram" height="30"/></a>
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["MagicString","extractedContent: Record<string, string>","Project"],"sources":["../../src/index.ts"],"sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport { parse as parseVue } from '@vue/compiler-sfc';\nimport MagicString from 'magic-string';\nimport { type Node, Project, type SourceFile } from 'ts-morph';\n\ntype TsReplacement = {\n node: Node;\n key: string;\n type: 'jsx-text' | 'jsx-attribute' | 'string-literal';\n};\n\ntype Tools = {\n generateKey: (text: string, existingKeys: Set<string>) => string;\n shouldExtract: (text: string) => boolean;\n extractTsContent: (\n sourceFile: SourceFile,\n existingKeys: Set<string>\n ) => {\n extractedContent: Record<string, string>;\n replacements: TsReplacement[];\n };\n};\n\n// Kept local as it's specific to Vue attributes, though shared list is 'title', 'placeholder' etc.\n// If we want to strictly mutualize, we can pass it too.\nconst ATTRIBUTES_TO_EXTRACT = [\n 'title',\n 'placeholder',\n 'alt',\n 'aria-label',\n 'label',\n];\n\nexport const processVueFile = async (\n filePath: string,\n componentKey: string,\n packageName: string,\n tools: Tools,\n save: boolean = true\n) => {\n const { generateKey, shouldExtract, extractTsContent } = tools;\n const code = await readFile(filePath, 'utf-8');\n const sfc = parseVue(code);\n const magic = new MagicString(code);\n\n const extractedContent: Record<string, string> = {};\n const existingKeys = new Set<string>();\n\n // 3a. Template Extraction\n if (sfc.descriptor.template) {\n const walkVueAst = (node: any) => {\n if (node.type === 2) {\n // NodeTypes.TEXT\n const text = node.content;\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.replace(/\\s+/g, ' ').trim();\n magic.overwrite(\n node.loc.start.offset,\n node.loc.end.offset,\n `{{ content.${key} }}`\n );\n }\n } else if (node.type === 1) {\n // NodeTypes.ELEMENT\n node.props.forEach((prop: any) => {\n if (\n prop.type === 6 && // NodeTypes.ATTRIBUTE\n ATTRIBUTES_TO_EXTRACT.includes(prop.name) &&\n prop.value\n ) {\n const text = prop.value.content;\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n magic.overwrite(\n prop.loc.start.offset,\n prop.loc.end.offset,\n `:${prop.name}=\"content.${key}\"`\n );\n }\n }\n });\n }\n\n if (node.children) {\n node.children.forEach(walkVueAst);\n }\n };\n walkVueAst(sfc.descriptor.template.ast);\n }\n\n // 3b. Script Extraction\n const scriptBlock = sfc.descriptor.scriptSetup || sfc.descriptor.script;\n if (scriptBlock) {\n const scriptContent = scriptBlock.content;\n const scriptOffset = scriptBlock.loc.start.offset;\n const project = new Project({ skipAddingFilesFromTsConfig: true });\n const sourceFile = project.createSourceFile('temp.ts', scriptContent);\n\n const { extractedContent: scriptExtracted, replacements } =\n extractTsContent(sourceFile, existingKeys);\n Object.assign(extractedContent, scriptExtracted);\n\n for (const { node, key } of replacements) {\n // Calculate absolute pos\n const start = scriptOffset + node.getStart();\n const end = scriptOffset + node.getEnd();\n magic.overwrite(start, end, `content.${key}`);\n }\n }\n\n if (Object.keys(extractedContent).length === 0) return null;\n\n // Inject Script\n const importStmt = `import { useIntlayer } from '${packageName}';`;\n const contentDecl = `const content = useIntlayer('${componentKey}');`;\n\n if (sfc.descriptor.scriptSetup) {\n magic.appendLeft(\n sfc.descriptor.scriptSetup.loc.start.offset,\n `\\n${importStmt}\\n${contentDecl}\\n`\n );\n } else if (sfc.descriptor.script) {\n magic.appendLeft(\n sfc.descriptor.script.loc.start.offset,\n `\\n${importStmt}\\n${contentDecl}\\n`\n );\n } else {\n magic.prepend(`<script setup>\\n${importStmt}\\n${contentDecl}\\n</script>\\n`);\n }\n\n if (save) {\n await writeFile(filePath, magic.toString());\n }\n return extractedContent;\n};\n"],"mappings":";;;;;;;;AAyBA,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,iBAAiB,OAC5B,UACA,cACA,aACA,OACA,OAAgB,SACb;CACH,MAAM,EAAE,aAAa,eAAe,qBAAqB;CACzD,MAAM,OAAO,qCAAe,UAAU,QAAQ;CAC9C,MAAM,oCAAe,KAAK;CAC1B,MAAM,QAAQ,IAAIA,qBAAY,KAAK;CAEnC,MAAMC,mBAA2C,EAAE;CACnD,MAAM,+BAAe,IAAI,KAAa;AAGtC,KAAI,IAAI,WAAW,UAAU;EAC3B,MAAM,cAAc,SAAc;AAChC,OAAI,KAAK,SAAS,GAAG;IAEnB,MAAM,OAAO,KAAK;AAClB,QAAI,cAAc,KAAK,EAAE;KACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,kBAAa,IAAI,IAAI;AACrB,sBAAiB,OAAO,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;AACxD,WAAM,UACJ,KAAK,IAAI,MAAM,QACf,KAAK,IAAI,IAAI,QACb,cAAc,IAAI,KACnB;;cAEM,KAAK,SAAS,EAEvB,MAAK,MAAM,SAAS,SAAc;AAChC,QACE,KAAK,SAAS,KACd,sBAAsB,SAAS,KAAK,KAAK,IACzC,KAAK,OACL;KACA,MAAM,OAAO,KAAK,MAAM;AACxB,SAAI,cAAc,KAAK,EAAE;MACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,mBAAa,IAAI,IAAI;AACrB,uBAAiB,OAAO,KAAK,MAAM;AACnC,YAAM,UACJ,KAAK,IAAI,MAAM,QACf,KAAK,IAAI,IAAI,QACb,IAAI,KAAK,KAAK,YAAY,IAAI,GAC/B;;;KAGL;AAGJ,OAAI,KAAK,SACP,MAAK,SAAS,QAAQ,WAAW;;AAGrC,aAAW,IAAI,WAAW,SAAS,IAAI;;CAIzC,MAAM,cAAc,IAAI,WAAW,eAAe,IAAI,WAAW;AACjE,KAAI,aAAa;EACf,MAAM,gBAAgB,YAAY;EAClC,MAAM,eAAe,YAAY,IAAI,MAAM;EAI3C,MAAM,EAAE,kBAAkB,iBAAiB,iBACzC,iBAJc,IAAIC,iBAAQ,EAAE,6BAA6B,MAAM,CAAC,CACvC,iBAAiB,WAAW,cAAc,EAGtC,aAAa;AAC5C,SAAO,OAAO,kBAAkB,gBAAgB;AAEhD,OAAK,MAAM,EAAE,MAAM,SAAS,cAAc;GAExC,MAAM,QAAQ,eAAe,KAAK,UAAU;GAC5C,MAAM,MAAM,eAAe,KAAK,QAAQ;AACxC,SAAM,UAAU,OAAO,KAAK,WAAW,MAAM;;;AAIjD,KAAI,OAAO,KAAK,iBAAiB,CAAC,WAAW,EAAG,QAAO;CAGvD,MAAM,aAAa,gCAAgC,YAAY;CAC/D,MAAM,cAAc,gCAAgC,aAAa;AAEjE,KAAI,IAAI,WAAW,YACjB,OAAM,WACJ,IAAI,WAAW,YAAY,IAAI,MAAM,QACrC,KAAK,WAAW,IAAI,YAAY,IACjC;UACQ,IAAI,WAAW,OACxB,OAAM,WACJ,IAAI,WAAW,OAAO,IAAI,MAAM,QAChC,KAAK,WAAW,IAAI,YAAY,IACjC;KAED,OAAM,QAAQ,mBAAmB,WAAW,IAAI,YAAY,gBAAe;AAG7E,KAAI,KACF,uCAAgB,UAAU,MAAM,UAAU,CAAC;AAE7C,QAAO"}
1
+ {"version":3,"file":"index.cjs","names":["MagicString","extractedContent: Record<string, string>","Project"],"sources":["../../src/index.ts"],"sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport { parse as parseVue } from '@vue/compiler-sfc';\nimport MagicString from 'magic-string';\nimport { type Node, Project, type SourceFile } from 'ts-morph';\n\ntype TsReplacement = {\n node: Node;\n key: string;\n type: 'jsx-text' | 'jsx-attribute' | 'string-literal';\n};\n\ntype Tools = {\n generateKey: (text: string, existingKeys: Set<string>) => string;\n shouldExtract: (text: string) => boolean;\n extractTsContent: (\n sourceFile: SourceFile,\n existingKeys: Set<string>\n ) => {\n extractedContent: Record<string, string>;\n replacements: TsReplacement[];\n };\n};\n\n// Kept local as it's specific to Vue attributes, though shared list is 'title', 'placeholder' etc.\n// If we want to strictly mutualize, we can pass it too.\nconst ATTRIBUTES_TO_EXTRACT = [\n 'title',\n 'placeholder',\n 'alt',\n 'aria-label',\n 'label',\n];\n\nexport const processVueFile = async (\n filePath: string,\n componentKey: string,\n packageName: string,\n tools: Tools,\n save: boolean = true\n) => {\n const { generateKey, shouldExtract, extractTsContent } = tools;\n const code = await readFile(filePath, 'utf-8');\n const sfc = parseVue(code);\n const magic = new MagicString(code);\n\n const extractedContent: Record<string, string> = {};\n const existingKeys = new Set<string>();\n\n if (sfc.descriptor.template) {\n const walkVueAst = (node: any) => {\n if (node.type === 2) {\n // NodeTypes.TEXT\n const text = node.content;\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.replace(/\\s+/g, ' ').trim();\n magic.overwrite(\n node.loc.start.offset,\n node.loc.end.offset,\n `{{ content.${key} }}`\n );\n }\n } else if (node.type === 1) {\n // NodeTypes.ELEMENT\n node.props.forEach((prop: any) => {\n if (\n prop.type === 6 && // NodeTypes.ATTRIBUTE\n ATTRIBUTES_TO_EXTRACT.includes(prop.name) &&\n prop.value\n ) {\n const text = prop.value.content;\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n magic.overwrite(\n prop.loc.start.offset,\n prop.loc.end.offset,\n `:${prop.name}=\"content.${key}\"`\n );\n }\n }\n });\n }\n\n if (node.children) {\n node.children.forEach(walkVueAst);\n }\n };\n walkVueAst(sfc.descriptor.template.ast);\n }\n\n const scriptBlock = sfc.descriptor.scriptSetup || sfc.descriptor.script;\n if (scriptBlock) {\n const scriptContent = scriptBlock.content;\n const scriptOffset = scriptBlock.loc.start.offset;\n const project = new Project({ skipAddingFilesFromTsConfig: true });\n const sourceFile = project.createSourceFile('temp.ts', scriptContent);\n\n const { extractedContent: scriptExtracted, replacements } =\n extractTsContent(sourceFile, existingKeys);\n Object.assign(extractedContent, scriptExtracted);\n\n for (const { node, key } of replacements) {\n // Calculate absolute pos\n const start = scriptOffset + node.getStart();\n const end = scriptOffset + node.getEnd();\n magic.overwrite(start, end, `content.${key}`);\n }\n }\n\n if (Object.keys(extractedContent).length === 0) return null;\n\n // Inject Script\n const importStmt = `import { useIntlayer } from '${packageName}';`;\n const contentDecl = `const content = useIntlayer('${componentKey}');`;\n\n if (sfc.descriptor.scriptSetup) {\n magic.appendLeft(\n sfc.descriptor.scriptSetup.loc.start.offset,\n `\\n${importStmt}\\n${contentDecl}\\n`\n );\n } else if (sfc.descriptor.script) {\n magic.appendLeft(\n sfc.descriptor.script.loc.start.offset,\n `\\n${importStmt}\\n${contentDecl}\\n`\n );\n } else {\n magic.prepend(`<script setup>\\n${importStmt}\\n${contentDecl}\\n</script>\\n`);\n }\n\n if (save) {\n await writeFile(filePath, magic.toString());\n }\n return extractedContent;\n};\n"],"mappings":";;;;;;;;AAyBA,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,iBAAiB,OAC5B,UACA,cACA,aACA,OACA,OAAgB,SACb;CACH,MAAM,EAAE,aAAa,eAAe,qBAAqB;CACzD,MAAM,OAAO,qCAAe,UAAU,QAAQ;CAC9C,MAAM,oCAAe,KAAK;CAC1B,MAAM,QAAQ,IAAIA,qBAAY,KAAK;CAEnC,MAAMC,mBAA2C,EAAE;CACnD,MAAM,+BAAe,IAAI,KAAa;AAEtC,KAAI,IAAI,WAAW,UAAU;EAC3B,MAAM,cAAc,SAAc;AAChC,OAAI,KAAK,SAAS,GAAG;IAEnB,MAAM,OAAO,KAAK;AAClB,QAAI,cAAc,KAAK,EAAE;KACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,kBAAa,IAAI,IAAI;AACrB,sBAAiB,OAAO,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;AACxD,WAAM,UACJ,KAAK,IAAI,MAAM,QACf,KAAK,IAAI,IAAI,QACb,cAAc,IAAI,KACnB;;cAEM,KAAK,SAAS,EAEvB,MAAK,MAAM,SAAS,SAAc;AAChC,QACE,KAAK,SAAS,KACd,sBAAsB,SAAS,KAAK,KAAK,IACzC,KAAK,OACL;KACA,MAAM,OAAO,KAAK,MAAM;AACxB,SAAI,cAAc,KAAK,EAAE;MACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,mBAAa,IAAI,IAAI;AACrB,uBAAiB,OAAO,KAAK,MAAM;AACnC,YAAM,UACJ,KAAK,IAAI,MAAM,QACf,KAAK,IAAI,IAAI,QACb,IAAI,KAAK,KAAK,YAAY,IAAI,GAC/B;;;KAGL;AAGJ,OAAI,KAAK,SACP,MAAK,SAAS,QAAQ,WAAW;;AAGrC,aAAW,IAAI,WAAW,SAAS,IAAI;;CAGzC,MAAM,cAAc,IAAI,WAAW,eAAe,IAAI,WAAW;AACjE,KAAI,aAAa;EACf,MAAM,gBAAgB,YAAY;EAClC,MAAM,eAAe,YAAY,IAAI,MAAM;EAI3C,MAAM,EAAE,kBAAkB,iBAAiB,iBACzC,iBAJc,IAAIC,iBAAQ,EAAE,6BAA6B,MAAM,CAAC,CACvC,iBAAiB,WAAW,cAAc,EAGtC,aAAa;AAC5C,SAAO,OAAO,kBAAkB,gBAAgB;AAEhD,OAAK,MAAM,EAAE,MAAM,SAAS,cAAc;GAExC,MAAM,QAAQ,eAAe,KAAK,UAAU;GAC5C,MAAM,MAAM,eAAe,KAAK,QAAQ;AACxC,SAAM,UAAU,OAAO,KAAK,WAAW,MAAM;;;AAIjD,KAAI,OAAO,KAAK,iBAAiB,CAAC,WAAW,EAAG,QAAO;CAGvD,MAAM,aAAa,gCAAgC,YAAY;CAC/D,MAAM,cAAc,gCAAgC,aAAa;AAEjE,KAAI,IAAI,WAAW,YACjB,OAAM,WACJ,IAAI,WAAW,YAAY,IAAI,MAAM,QACrC,KAAK,WAAW,IAAI,YAAY,IACjC;UACQ,IAAI,WAAW,OACxB,OAAM,WACJ,IAAI,WAAW,OAAO,IAAI,MAAM,QAChC,KAAK,WAAW,IAAI,YAAY,IACjC;KAED,OAAM,QAAQ,mBAAmB,WAAW,IAAI,YAAY,gBAAe;AAG7E,KAAI,KACF,uCAAgB,UAAU,MAAM,UAAU,CAAC;AAE7C,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["parseVue","extractedContent: Record<string, string>"],"sources":["../../src/index.ts"],"sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport { parse as parseVue } from '@vue/compiler-sfc';\nimport MagicString from 'magic-string';\nimport { type Node, Project, type SourceFile } from 'ts-morph';\n\ntype TsReplacement = {\n node: Node;\n key: string;\n type: 'jsx-text' | 'jsx-attribute' | 'string-literal';\n};\n\ntype Tools = {\n generateKey: (text: string, existingKeys: Set<string>) => string;\n shouldExtract: (text: string) => boolean;\n extractTsContent: (\n sourceFile: SourceFile,\n existingKeys: Set<string>\n ) => {\n extractedContent: Record<string, string>;\n replacements: TsReplacement[];\n };\n};\n\n// Kept local as it's specific to Vue attributes, though shared list is 'title', 'placeholder' etc.\n// If we want to strictly mutualize, we can pass it too.\nconst ATTRIBUTES_TO_EXTRACT = [\n 'title',\n 'placeholder',\n 'alt',\n 'aria-label',\n 'label',\n];\n\nexport const processVueFile = async (\n filePath: string,\n componentKey: string,\n packageName: string,\n tools: Tools,\n save: boolean = true\n) => {\n const { generateKey, shouldExtract, extractTsContent } = tools;\n const code = await readFile(filePath, 'utf-8');\n const sfc = parseVue(code);\n const magic = new MagicString(code);\n\n const extractedContent: Record<string, string> = {};\n const existingKeys = new Set<string>();\n\n // 3a. Template Extraction\n if (sfc.descriptor.template) {\n const walkVueAst = (node: any) => {\n if (node.type === 2) {\n // NodeTypes.TEXT\n const text = node.content;\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.replace(/\\s+/g, ' ').trim();\n magic.overwrite(\n node.loc.start.offset,\n node.loc.end.offset,\n `{{ content.${key} }}`\n );\n }\n } else if (node.type === 1) {\n // NodeTypes.ELEMENT\n node.props.forEach((prop: any) => {\n if (\n prop.type === 6 && // NodeTypes.ATTRIBUTE\n ATTRIBUTES_TO_EXTRACT.includes(prop.name) &&\n prop.value\n ) {\n const text = prop.value.content;\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n magic.overwrite(\n prop.loc.start.offset,\n prop.loc.end.offset,\n `:${prop.name}=\"content.${key}\"`\n );\n }\n }\n });\n }\n\n if (node.children) {\n node.children.forEach(walkVueAst);\n }\n };\n walkVueAst(sfc.descriptor.template.ast);\n }\n\n // 3b. Script Extraction\n const scriptBlock = sfc.descriptor.scriptSetup || sfc.descriptor.script;\n if (scriptBlock) {\n const scriptContent = scriptBlock.content;\n const scriptOffset = scriptBlock.loc.start.offset;\n const project = new Project({ skipAddingFilesFromTsConfig: true });\n const sourceFile = project.createSourceFile('temp.ts', scriptContent);\n\n const { extractedContent: scriptExtracted, replacements } =\n extractTsContent(sourceFile, existingKeys);\n Object.assign(extractedContent, scriptExtracted);\n\n for (const { node, key } of replacements) {\n // Calculate absolute pos\n const start = scriptOffset + node.getStart();\n const end = scriptOffset + node.getEnd();\n magic.overwrite(start, end, `content.${key}`);\n }\n }\n\n if (Object.keys(extractedContent).length === 0) return null;\n\n // Inject Script\n const importStmt = `import { useIntlayer } from '${packageName}';`;\n const contentDecl = `const content = useIntlayer('${componentKey}');`;\n\n if (sfc.descriptor.scriptSetup) {\n magic.appendLeft(\n sfc.descriptor.scriptSetup.loc.start.offset,\n `\\n${importStmt}\\n${contentDecl}\\n`\n );\n } else if (sfc.descriptor.script) {\n magic.appendLeft(\n sfc.descriptor.script.loc.start.offset,\n `\\n${importStmt}\\n${contentDecl}\\n`\n );\n } else {\n magic.prepend(`<script setup>\\n${importStmt}\\n${contentDecl}\\n</script>\\n`);\n }\n\n if (save) {\n await writeFile(filePath, magic.toString());\n }\n return extractedContent;\n};\n"],"mappings":";;;;;;AAyBA,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,iBAAiB,OAC5B,UACA,cACA,aACA,OACA,OAAgB,SACb;CACH,MAAM,EAAE,aAAa,eAAe,qBAAqB;CACzD,MAAM,OAAO,MAAM,SAAS,UAAU,QAAQ;CAC9C,MAAM,MAAMA,MAAS,KAAK;CAC1B,MAAM,QAAQ,IAAI,YAAY,KAAK;CAEnC,MAAMC,mBAA2C,EAAE;CACnD,MAAM,+BAAe,IAAI,KAAa;AAGtC,KAAI,IAAI,WAAW,UAAU;EAC3B,MAAM,cAAc,SAAc;AAChC,OAAI,KAAK,SAAS,GAAG;IAEnB,MAAM,OAAO,KAAK;AAClB,QAAI,cAAc,KAAK,EAAE;KACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,kBAAa,IAAI,IAAI;AACrB,sBAAiB,OAAO,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;AACxD,WAAM,UACJ,KAAK,IAAI,MAAM,QACf,KAAK,IAAI,IAAI,QACb,cAAc,IAAI,KACnB;;cAEM,KAAK,SAAS,EAEvB,MAAK,MAAM,SAAS,SAAc;AAChC,QACE,KAAK,SAAS,KACd,sBAAsB,SAAS,KAAK,KAAK,IACzC,KAAK,OACL;KACA,MAAM,OAAO,KAAK,MAAM;AACxB,SAAI,cAAc,KAAK,EAAE;MACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,mBAAa,IAAI,IAAI;AACrB,uBAAiB,OAAO,KAAK,MAAM;AACnC,YAAM,UACJ,KAAK,IAAI,MAAM,QACf,KAAK,IAAI,IAAI,QACb,IAAI,KAAK,KAAK,YAAY,IAAI,GAC/B;;;KAGL;AAGJ,OAAI,KAAK,SACP,MAAK,SAAS,QAAQ,WAAW;;AAGrC,aAAW,IAAI,WAAW,SAAS,IAAI;;CAIzC,MAAM,cAAc,IAAI,WAAW,eAAe,IAAI,WAAW;AACjE,KAAI,aAAa;EACf,MAAM,gBAAgB,YAAY;EAClC,MAAM,eAAe,YAAY,IAAI,MAAM;EAI3C,MAAM,EAAE,kBAAkB,iBAAiB,iBACzC,iBAJc,IAAI,QAAQ,EAAE,6BAA6B,MAAM,CAAC,CACvC,iBAAiB,WAAW,cAAc,EAGtC,aAAa;AAC5C,SAAO,OAAO,kBAAkB,gBAAgB;AAEhD,OAAK,MAAM,EAAE,MAAM,SAAS,cAAc;GAExC,MAAM,QAAQ,eAAe,KAAK,UAAU;GAC5C,MAAM,MAAM,eAAe,KAAK,QAAQ;AACxC,SAAM,UAAU,OAAO,KAAK,WAAW,MAAM;;;AAIjD,KAAI,OAAO,KAAK,iBAAiB,CAAC,WAAW,EAAG,QAAO;CAGvD,MAAM,aAAa,gCAAgC,YAAY;CAC/D,MAAM,cAAc,gCAAgC,aAAa;AAEjE,KAAI,IAAI,WAAW,YACjB,OAAM,WACJ,IAAI,WAAW,YAAY,IAAI,MAAM,QACrC,KAAK,WAAW,IAAI,YAAY,IACjC;UACQ,IAAI,WAAW,OACxB,OAAM,WACJ,IAAI,WAAW,OAAO,IAAI,MAAM,QAChC,KAAK,WAAW,IAAI,YAAY,IACjC;KAED,OAAM,QAAQ,mBAAmB,WAAW,IAAI,YAAY,gBAAe;AAG7E,KAAI,KACF,OAAM,UAAU,UAAU,MAAM,UAAU,CAAC;AAE7C,QAAO"}
1
+ {"version":3,"file":"index.mjs","names":["parseVue","extractedContent: Record<string, string>"],"sources":["../../src/index.ts"],"sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport { parse as parseVue } from '@vue/compiler-sfc';\nimport MagicString from 'magic-string';\nimport { type Node, Project, type SourceFile } from 'ts-morph';\n\ntype TsReplacement = {\n node: Node;\n key: string;\n type: 'jsx-text' | 'jsx-attribute' | 'string-literal';\n};\n\ntype Tools = {\n generateKey: (text: string, existingKeys: Set<string>) => string;\n shouldExtract: (text: string) => boolean;\n extractTsContent: (\n sourceFile: SourceFile,\n existingKeys: Set<string>\n ) => {\n extractedContent: Record<string, string>;\n replacements: TsReplacement[];\n };\n};\n\n// Kept local as it's specific to Vue attributes, though shared list is 'title', 'placeholder' etc.\n// If we want to strictly mutualize, we can pass it too.\nconst ATTRIBUTES_TO_EXTRACT = [\n 'title',\n 'placeholder',\n 'alt',\n 'aria-label',\n 'label',\n];\n\nexport const processVueFile = async (\n filePath: string,\n componentKey: string,\n packageName: string,\n tools: Tools,\n save: boolean = true\n) => {\n const { generateKey, shouldExtract, extractTsContent } = tools;\n const code = await readFile(filePath, 'utf-8');\n const sfc = parseVue(code);\n const magic = new MagicString(code);\n\n const extractedContent: Record<string, string> = {};\n const existingKeys = new Set<string>();\n\n if (sfc.descriptor.template) {\n const walkVueAst = (node: any) => {\n if (node.type === 2) {\n // NodeTypes.TEXT\n const text = node.content;\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.replace(/\\s+/g, ' ').trim();\n magic.overwrite(\n node.loc.start.offset,\n node.loc.end.offset,\n `{{ content.${key} }}`\n );\n }\n } else if (node.type === 1) {\n // NodeTypes.ELEMENT\n node.props.forEach((prop: any) => {\n if (\n prop.type === 6 && // NodeTypes.ATTRIBUTE\n ATTRIBUTES_TO_EXTRACT.includes(prop.name) &&\n prop.value\n ) {\n const text = prop.value.content;\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n magic.overwrite(\n prop.loc.start.offset,\n prop.loc.end.offset,\n `:${prop.name}=\"content.${key}\"`\n );\n }\n }\n });\n }\n\n if (node.children) {\n node.children.forEach(walkVueAst);\n }\n };\n walkVueAst(sfc.descriptor.template.ast);\n }\n\n const scriptBlock = sfc.descriptor.scriptSetup || sfc.descriptor.script;\n if (scriptBlock) {\n const scriptContent = scriptBlock.content;\n const scriptOffset = scriptBlock.loc.start.offset;\n const project = new Project({ skipAddingFilesFromTsConfig: true });\n const sourceFile = project.createSourceFile('temp.ts', scriptContent);\n\n const { extractedContent: scriptExtracted, replacements } =\n extractTsContent(sourceFile, existingKeys);\n Object.assign(extractedContent, scriptExtracted);\n\n for (const { node, key } of replacements) {\n // Calculate absolute pos\n const start = scriptOffset + node.getStart();\n const end = scriptOffset + node.getEnd();\n magic.overwrite(start, end, `content.${key}`);\n }\n }\n\n if (Object.keys(extractedContent).length === 0) return null;\n\n // Inject Script\n const importStmt = `import { useIntlayer } from '${packageName}';`;\n const contentDecl = `const content = useIntlayer('${componentKey}');`;\n\n if (sfc.descriptor.scriptSetup) {\n magic.appendLeft(\n sfc.descriptor.scriptSetup.loc.start.offset,\n `\\n${importStmt}\\n${contentDecl}\\n`\n );\n } else if (sfc.descriptor.script) {\n magic.appendLeft(\n sfc.descriptor.script.loc.start.offset,\n `\\n${importStmt}\\n${contentDecl}\\n`\n );\n } else {\n magic.prepend(`<script setup>\\n${importStmt}\\n${contentDecl}\\n</script>\\n`);\n }\n\n if (save) {\n await writeFile(filePath, magic.toString());\n }\n return extractedContent;\n};\n"],"mappings":";;;;;;AAyBA,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,iBAAiB,OAC5B,UACA,cACA,aACA,OACA,OAAgB,SACb;CACH,MAAM,EAAE,aAAa,eAAe,qBAAqB;CACzD,MAAM,OAAO,MAAM,SAAS,UAAU,QAAQ;CAC9C,MAAM,MAAMA,MAAS,KAAK;CAC1B,MAAM,QAAQ,IAAI,YAAY,KAAK;CAEnC,MAAMC,mBAA2C,EAAE;CACnD,MAAM,+BAAe,IAAI,KAAa;AAEtC,KAAI,IAAI,WAAW,UAAU;EAC3B,MAAM,cAAc,SAAc;AAChC,OAAI,KAAK,SAAS,GAAG;IAEnB,MAAM,OAAO,KAAK;AAClB,QAAI,cAAc,KAAK,EAAE;KACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,kBAAa,IAAI,IAAI;AACrB,sBAAiB,OAAO,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;AACxD,WAAM,UACJ,KAAK,IAAI,MAAM,QACf,KAAK,IAAI,IAAI,QACb,cAAc,IAAI,KACnB;;cAEM,KAAK,SAAS,EAEvB,MAAK,MAAM,SAAS,SAAc;AAChC,QACE,KAAK,SAAS,KACd,sBAAsB,SAAS,KAAK,KAAK,IACzC,KAAK,OACL;KACA,MAAM,OAAO,KAAK,MAAM;AACxB,SAAI,cAAc,KAAK,EAAE;MACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,mBAAa,IAAI,IAAI;AACrB,uBAAiB,OAAO,KAAK,MAAM;AACnC,YAAM,UACJ,KAAK,IAAI,MAAM,QACf,KAAK,IAAI,IAAI,QACb,IAAI,KAAK,KAAK,YAAY,IAAI,GAC/B;;;KAGL;AAGJ,OAAI,KAAK,SACP,MAAK,SAAS,QAAQ,WAAW;;AAGrC,aAAW,IAAI,WAAW,SAAS,IAAI;;CAGzC,MAAM,cAAc,IAAI,WAAW,eAAe,IAAI,WAAW;AACjE,KAAI,aAAa;EACf,MAAM,gBAAgB,YAAY;EAClC,MAAM,eAAe,YAAY,IAAI,MAAM;EAI3C,MAAM,EAAE,kBAAkB,iBAAiB,iBACzC,iBAJc,IAAI,QAAQ,EAAE,6BAA6B,MAAM,CAAC,CACvC,iBAAiB,WAAW,cAAc,EAGtC,aAAa;AAC5C,SAAO,OAAO,kBAAkB,gBAAgB;AAEhD,OAAK,MAAM,EAAE,MAAM,SAAS,cAAc;GAExC,MAAM,QAAQ,eAAe,KAAK,UAAU;GAC5C,MAAM,MAAM,eAAe,KAAK,QAAQ;AACxC,SAAM,UAAU,OAAO,KAAK,WAAW,MAAM;;;AAIjD,KAAI,OAAO,KAAK,iBAAiB,CAAC,WAAW,EAAG,QAAO;CAGvD,MAAM,aAAa,gCAAgC,YAAY;CAC/D,MAAM,cAAc,gCAAgC,aAAa;AAEjE,KAAI,IAAI,WAAW,YACjB,OAAM,WACJ,IAAI,WAAW,YAAY,IAAI,MAAM,QACrC,KAAK,WAAW,IAAI,YAAY,IACjC;UACQ,IAAI,WAAW,OACxB,OAAM,WACJ,IAAI,WAAW,OAAO,IAAI,MAAM,QAChC,KAAK,WAAW,IAAI,YAAY,IACjC;KAED,OAAM,QAAQ,mBAAmB,WAAW,IAAI,YAAY,gBAAe;AAG7E,KAAI,KACF,OAAM,UAAU,UAAU,MAAM,UAAU,CAAC;AAE7C,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/index.ts"],"sourcesContent":[],"mappings":";;;KAKK,aAAA;QACG;EADH,GAAA,EAAA,MAAA;EAMA,IAAA,EAAA,UAAK,GAAA,eAAA,GAAA,gBAAA;CACkC;KADvC,KAAA,GAIW;EACE,WAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAJ0B,GAI1B,CAAA,MAAA,CAAA,EAAA,GAAA,MAAA;EAEI,aAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,OAAA;EACJ,gBAAA,EAAA,CAAA,UAAA,EAJF,UAIE,EAAA,YAAA,EAHA,GAGA,CAAA,MAAA,CAAA,EAAA,GAAA;IAAa,gBAAA,EADT,MACS,CAAA,MAAA,EAAA,MAAA,CAAA;IAclB,YAAA,EAdK,aAuHjB,EAAA;EArGQ,CAAA;CACa;AAAA,cALT,cAKS,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,YAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MAAA,EAAA,KAAA,EADb,KACa,EAAA,IAAA,CAAA,EAAA,OAAA,EAAA,GAAA,OAAA,CAAA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/index.ts"],"sourcesContent":[],"mappings":";;;KAKK,aAAA;QACG;EADH,GAAA,EAAA,MAAA;EAMA,IAAA,EAAA,UAAK,GAAA,eAAA,GAAA,gBAAA;CACkC;KADvC,KAAA,GAIW;EACE,WAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAJ0B,GAI1B,CAAA,MAAA,CAAA,EAAA,GAAA,MAAA;EAEI,aAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,OAAA;EACJ,gBAAA,EAAA,CAAA,UAAA,EAJF,UAIE,EAAA,YAAA,EAHA,GAGA,CAAA,MAAA,CAAA,EAAA,GAAA;IAAa,gBAAA,EADT,MACS,CAAA,MAAA,EAAA,MAAA,CAAA;IAclB,YAAA,EAdK,aAqHjB,EAAA;EAnGQ,CAAA;CACa;AAAA,cALT,cAKS,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,YAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MAAA,EAAA,KAAA,EADb,KACa,EAAA,IAAA,CAAA,EAAA,OAAA,EAAA,GAAA,OAAA,CAAA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intlayer/vue-transformer",
3
- "version": "7.3.1",
3
+ "version": "7.3.2-canary.0",
4
4
  "private": false,
5
5
  "description": "A transformer for Intlayer that extract strings from Vue components.",
6
6
  "keywords": [
@@ -52,6 +52,7 @@
52
52
  "./package.json"
53
53
  ],
54
54
  "scripts": {
55
+ "_prepublish": "cp -f ../../README.md ./README.md",
55
56
  "build": "tsdown --config tsdown.config.ts",
56
57
  "build:ci": "tsdown --config tsdown.config.ts",
57
58
  "clean": "rimraf ./dist .turbo",
@@ -61,7 +62,7 @@
61
62
  "lint": "biome lint .",
62
63
  "lint:fix": "biome lint --write .",
63
64
  "process-files": "ts-node src/transpiler/processFilesCLI.ts --dir $npm_config_dir --extension $npm_config_extension --no-node-snapshot",
64
- "prepublish": "cp -f ../../README.md ./README.md",
65
+ "prepublish": "echo prepublish temporally disabled to avoid rewrite readme",
65
66
  "publish": "bun publish || true",
66
67
  "publish:canary": "bun publish --access public --tag canary || true",
67
68
  "publish:latest": "bun publish --access public --tag latest || true",