@intlayer/vue-transformer 7.5.0-canary.0 → 7.5.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,6 +1,6 @@
1
1
  const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
2
  let node_fs_promises = require("node:fs/promises");
3
- let __vue_compiler_sfc = require("@vue/compiler-sfc");
3
+ let _vue_compiler_sfc = require("@vue/compiler-sfc");
4
4
  let magic_string = require("magic-string");
5
5
  magic_string = require_rolldown_runtime.__toESM(magic_string);
6
6
  let ts_morph = require("ts-morph");
@@ -16,7 +16,7 @@ const ATTRIBUTES_TO_EXTRACT = [
16
16
  const processVueFile = async (filePath, componentKey, packageName, tools, save = true) => {
17
17
  const { generateKey, shouldExtract, extractTsContent } = tools;
18
18
  const code = await (0, node_fs_promises.readFile)(filePath, "utf-8");
19
- const sfc = (0, __vue_compiler_sfc.parse)(code);
19
+ const sfc = (0, _vue_compiler_sfc.parse)(code);
20
20
  const magic = new magic_string.default(code);
21
21
  const extractedContent = {};
22
22
  const existingKeys = /* @__PURE__ */ new Set();
@@ -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 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
+ {"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,mCAAe,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intlayer/vue-transformer",
3
- "version": "7.5.0-canary.0",
3
+ "version": "7.5.0",
4
4
  "private": false,
5
5
  "description": "A transformer for Intlayer that extract strings from Vue components.",
6
6
  "keywords": [
@@ -76,14 +76,14 @@
76
76
  "ts-morph": "^27.0.0"
77
77
  },
78
78
  "devDependencies": {
79
- "@types/node": "24.10.1",
79
+ "@types/node": "25.0.3",
80
80
  "@utils/ts-config": "1.0.4",
81
81
  "@utils/ts-config-types": "1.0.4",
82
82
  "@utils/tsdown-config": "1.0.4",
83
83
  "rimraf": "6.1.2",
84
- "tsdown": "0.16.8",
84
+ "tsdown": "0.18.1",
85
85
  "typescript": "5.9.3",
86
- "vitest": "4.0.15"
86
+ "vitest": "4.0.16"
87
87
  },
88
88
  "engines": {
89
89
  "node": ">=14.18"