@intlayer/svelte-transformer 7.5.13 → 7.5.14

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 +1 @@
1
- {"version":3,"file":"index.cjs","names":["svelteCompiler","MagicString","extractedContent: Record<string, string>","Project"],"sources":["../../src/index.ts"],"sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport MagicString from 'magic-string';\nimport * as svelteCompiler from 'svelte/compiler'; // Works for Svelte 3/4/5\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\nconst ATTRIBUTES_TO_EXTRACT = [\n 'title',\n 'placeholder',\n 'alt',\n 'aria-label',\n 'label',\n];\n\nexport const processSvelteFile = 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\n const ast = svelteCompiler.parse(code);\n const magic = new MagicString(code);\n\n const extractedContent: Record<string, string> = {};\n const existingKeys = new Set<string>();\n\n const walkSvelte = (node: any) => {\n if (node.type === 'Text') {\n const text = node.data;\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(node.start, node.end, `{$content.${key}}`);\n }\n } else if (\n node.type === 'Attribute' &&\n ATTRIBUTES_TO_EXTRACT.includes(node.name)\n ) {\n if (\n node.value &&\n node.value.length === 1 &&\n node.value[0].type === 'Text'\n ) {\n const text = node.value[0].data;\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n magic.overwrite(\n node.start,\n node.end,\n `${node.name}={$content.${key}}`\n );\n }\n }\n }\n\n if (node.children) node.children.forEach(walkSvelte);\n else if (node.fragment?.children)\n node.fragment.children.forEach(walkSvelte);\n if (node.attributes) node.attributes.forEach(walkSvelte);\n };\n\n walkSvelte(ast.html);\n\n const scriptRegex = /<script[^>]*>([\\s\\S]*?)<\\/script>/;\n const match = scriptRegex.exec(code);\n let scriptExtractedKeys = 0;\n\n if (match) {\n const scriptContent = match[1];\n // Offset: index + length of opening tag. match[0] is whole tag, match[1] is content.\n // match.index is start of <script...\n const openTagLength = match[0].indexOf(scriptContent);\n const scriptOffset = match.index + openTagLength;\n\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 scriptExtractedKeys = Object.keys(scriptExtracted).length;\n\n for (const { node, key } of replacements) {\n const start = scriptOffset + node.getStart();\n const end = scriptOffset + node.getEnd();\n magic.overwrite(start, end, `get(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 getImportStmt = `import { get } from 'svelte/store';`;\n const callStmt = `const content = useIntlayer('${componentKey}');`;\n\n if (match) {\n const scriptContentStart = match.index + match[0].indexOf('>') + 1;\n magic.appendLeft(\n scriptContentStart,\n `\\n ${importStmt}\\n ${scriptExtractedKeys > 0 ? getImportStmt : ''}\\n ${callStmt}\\n`\n );\n } else {\n magic.prepend(`<script>\\n ${importStmt}\\n ${callStmt}\\n</script>\\n`);\n }\n\n if (save) {\n await writeFile(filePath, magic.toString());\n }\n return extractedContent;\n};\n"],"mappings":";;;;;;;;;AAuBA,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,oBAAoB,OAC/B,UACA,cACA,aACA,OACA,OAAgB,SACb;CACH,MAAM,EAAE,aAAa,eAAe,qBAAqB;CACzD,MAAM,OAAO,qCAAe,UAAU,QAAQ;CAE9C,MAAM,MAAMA,gBAAe,MAAM,KAAK;CACtC,MAAM,QAAQ,IAAIC,qBAAY,KAAK;CAEnC,MAAMC,mBAA2C,EAAE;CACnD,MAAM,+BAAe,IAAI,KAAa;CAEtC,MAAM,cAAc,SAAc;AAChC,MAAI,KAAK,SAAS,QAAQ;GACxB,MAAM,OAAO,KAAK;AAClB,OAAI,cAAc,KAAK,EAAE;IACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,iBAAa,IAAI,IAAI;AACrB,qBAAiB,OAAO,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;AACxD,UAAM,UAAU,KAAK,OAAO,KAAK,KAAK,aAAa,IAAI,GAAG;;aAG5D,KAAK,SAAS,eACd,sBAAsB,SAAS,KAAK,KAAK,EAEzC;OACE,KAAK,SACL,KAAK,MAAM,WAAW,KACtB,KAAK,MAAM,GAAG,SAAS,QACvB;IACA,MAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,QAAI,cAAc,KAAK,EAAE;KACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,kBAAa,IAAI,IAAI;AACrB,sBAAiB,OAAO,KAAK,MAAM;AACnC,WAAM,UACJ,KAAK,OACL,KAAK,KACL,GAAG,KAAK,KAAK,aAAa,IAAI,GAC/B;;;;AAKP,MAAI,KAAK,SAAU,MAAK,SAAS,QAAQ,WAAW;WAC3C,KAAK,UAAU,SACtB,MAAK,SAAS,SAAS,QAAQ,WAAW;AAC5C,MAAI,KAAK,WAAY,MAAK,WAAW,QAAQ,WAAW;;AAG1D,YAAW,IAAI,KAAK;CAGpB,MAAM,QADc,oCACM,KAAK,KAAK;CACpC,IAAI,sBAAsB;AAE1B,KAAI,OAAO;EACT,MAAM,gBAAgB,MAAM;EAG5B,MAAM,gBAAgB,MAAM,GAAG,QAAQ,cAAc;EACrD,MAAM,eAAe,MAAM,QAAQ;EAKnC,MAAM,EAAE,kBAAkB,iBAAiB,iBACzC,iBAJc,IAAIC,iBAAQ,EAAE,6BAA6B,MAAM,CAAC,CACvC,iBAAiB,WAAW,cAAc,EAGtC,aAAa;AAC5C,SAAO,OAAO,kBAAkB,gBAAgB;AAChD,wBAAsB,OAAO,KAAK,gBAAgB,CAAC;AAEnD,OAAK,MAAM,EAAE,MAAM,SAAS,cAAc;GACxC,MAAM,QAAQ,eAAe,KAAK,UAAU;GAC5C,MAAM,MAAM,eAAe,KAAK,QAAQ;AACxC,SAAM,UAAU,OAAO,KAAK,gBAAgB,MAAM;;;AAItD,KAAI,OAAO,KAAK,iBAAiB,CAAC,WAAW,EAAG,QAAO;CAGvD,MAAM,aAAa,gCAAgC,YAAY;CAC/D,MAAM,gBAAgB;CACtB,MAAM,WAAW,gCAAgC,aAAa;AAE9D,KAAI,OAAO;EACT,MAAM,qBAAqB,MAAM,QAAQ,MAAM,GAAG,QAAQ,IAAI,GAAG;AACjE,QAAM,WACJ,oBACA,OAAO,WAAW,MAAM,sBAAsB,IAAI,gBAAgB,GAAG,MAAM,SAAS,IACrF;OAED,OAAM,QAAQ,eAAe,WAAW,MAAM,SAAS,gBAAe;AAGxE,KAAI,KACF,uCAAgB,UAAU,MAAM,UAAU,CAAC;AAE7C,QAAO"}
1
+ {"version":3,"file":"index.cjs","names":["svelteCompiler","MagicString","Project"],"sources":["../../src/index.ts"],"sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport MagicString from 'magic-string';\nimport * as svelteCompiler from 'svelte/compiler'; // Works for Svelte 3/4/5\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\nconst ATTRIBUTES_TO_EXTRACT = [\n 'title',\n 'placeholder',\n 'alt',\n 'aria-label',\n 'label',\n];\n\nexport const processSvelteFile = 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\n const ast = svelteCompiler.parse(code);\n const magic = new MagicString(code);\n\n const extractedContent: Record<string, string> = {};\n const existingKeys = new Set<string>();\n\n const walkSvelte = (node: any) => {\n if (node.type === 'Text') {\n const text = node.data;\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(node.start, node.end, `{$content.${key}}`);\n }\n } else if (\n node.type === 'Attribute' &&\n ATTRIBUTES_TO_EXTRACT.includes(node.name)\n ) {\n if (\n node.value &&\n node.value.length === 1 &&\n node.value[0].type === 'Text'\n ) {\n const text = node.value[0].data;\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n magic.overwrite(\n node.start,\n node.end,\n `${node.name}={$content.${key}}`\n );\n }\n }\n }\n\n if (node.children) node.children.forEach(walkSvelte);\n else if (node.fragment?.children)\n node.fragment.children.forEach(walkSvelte);\n if (node.attributes) node.attributes.forEach(walkSvelte);\n };\n\n walkSvelte(ast.html);\n\n const scriptRegex = /<script[^>]*>([\\s\\S]*?)<\\/script>/;\n const match = scriptRegex.exec(code);\n let scriptExtractedKeys = 0;\n\n if (match) {\n const scriptContent = match[1];\n // Offset: index + length of opening tag. match[0] is whole tag, match[1] is content.\n // match.index is start of <script...\n const openTagLength = match[0].indexOf(scriptContent);\n const scriptOffset = match.index + openTagLength;\n\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 scriptExtractedKeys = Object.keys(scriptExtracted).length;\n\n for (const { node, key } of replacements) {\n const start = scriptOffset + node.getStart();\n const end = scriptOffset + node.getEnd();\n magic.overwrite(start, end, `get(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 getImportStmt = `import { get } from 'svelte/store';`;\n const callStmt = `const content = useIntlayer('${componentKey}');`;\n\n if (match) {\n const scriptContentStart = match.index + match[0].indexOf('>') + 1;\n magic.appendLeft(\n scriptContentStart,\n `\\n ${importStmt}\\n ${scriptExtractedKeys > 0 ? getImportStmt : ''}\\n ${callStmt}\\n`\n );\n } else {\n magic.prepend(`<script>\\n ${importStmt}\\n ${callStmt}\\n</script>\\n`);\n }\n\n if (save) {\n await writeFile(filePath, magic.toString());\n }\n return extractedContent;\n};\n"],"mappings":";;;;;;;;;AAuBA,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,oBAAoB,OAC/B,UACA,cACA,aACA,OACA,OAAgB,SACb;CACH,MAAM,EAAE,aAAa,eAAe,qBAAqB;CACzD,MAAM,OAAO,qCAAe,UAAU,QAAQ;CAE9C,MAAM,MAAMA,gBAAe,MAAM,KAAK;CACtC,MAAM,QAAQ,IAAIC,qBAAY,KAAK;CAEnC,MAAM,mBAA2C,EAAE;CACnD,MAAM,+BAAe,IAAI,KAAa;CAEtC,MAAM,cAAc,SAAc;AAChC,MAAI,KAAK,SAAS,QAAQ;GACxB,MAAM,OAAO,KAAK;AAClB,OAAI,cAAc,KAAK,EAAE;IACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,iBAAa,IAAI,IAAI;AACrB,qBAAiB,OAAO,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;AACxD,UAAM,UAAU,KAAK,OAAO,KAAK,KAAK,aAAa,IAAI,GAAG;;aAG5D,KAAK,SAAS,eACd,sBAAsB,SAAS,KAAK,KAAK,EAEzC;OACE,KAAK,SACL,KAAK,MAAM,WAAW,KACtB,KAAK,MAAM,GAAG,SAAS,QACvB;IACA,MAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,QAAI,cAAc,KAAK,EAAE;KACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,kBAAa,IAAI,IAAI;AACrB,sBAAiB,OAAO,KAAK,MAAM;AACnC,WAAM,UACJ,KAAK,OACL,KAAK,KACL,GAAG,KAAK,KAAK,aAAa,IAAI,GAC/B;;;;AAKP,MAAI,KAAK,SAAU,MAAK,SAAS,QAAQ,WAAW;WAC3C,KAAK,UAAU,SACtB,MAAK,SAAS,SAAS,QAAQ,WAAW;AAC5C,MAAI,KAAK,WAAY,MAAK,WAAW,QAAQ,WAAW;;AAG1D,YAAW,IAAI,KAAK;CAGpB,MAAM,QADc,oCACM,KAAK,KAAK;CACpC,IAAI,sBAAsB;AAE1B,KAAI,OAAO;EACT,MAAM,gBAAgB,MAAM;EAG5B,MAAM,gBAAgB,MAAM,GAAG,QAAQ,cAAc;EACrD,MAAM,eAAe,MAAM,QAAQ;EAKnC,MAAM,EAAE,kBAAkB,iBAAiB,iBACzC,iBAJc,IAAIC,iBAAQ,EAAE,6BAA6B,MAAM,CAAC,CACvC,iBAAiB,WAAW,cAAc,EAGtC,aAAa;AAC5C,SAAO,OAAO,kBAAkB,gBAAgB;AAChD,wBAAsB,OAAO,KAAK,gBAAgB,CAAC;AAEnD,OAAK,MAAM,EAAE,MAAM,SAAS,cAAc;GACxC,MAAM,QAAQ,eAAe,KAAK,UAAU;GAC5C,MAAM,MAAM,eAAe,KAAK,QAAQ;AACxC,SAAM,UAAU,OAAO,KAAK,gBAAgB,MAAM;;;AAItD,KAAI,OAAO,KAAK,iBAAiB,CAAC,WAAW,EAAG,QAAO;CAGvD,MAAM,aAAa,gCAAgC,YAAY;CAC/D,MAAM,gBAAgB;CACtB,MAAM,WAAW,gCAAgC,aAAa;AAE9D,KAAI,OAAO;EACT,MAAM,qBAAqB,MAAM,QAAQ,MAAM,GAAG,QAAQ,IAAI,GAAG;AACjE,QAAM,WACJ,oBACA,OAAO,WAAW,MAAM,sBAAsB,IAAI,gBAAgB,GAAG,MAAM,SAAS,IACrF;OAED,OAAM,QAAQ,eAAe,WAAW,MAAM,SAAS,gBAAe;AAGxE,KAAI,KACF,uCAAgB,UAAU,MAAM,UAAU,CAAC;AAE7C,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["extractedContent: Record<string, string>"],"sources":["../../src/index.ts"],"sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport MagicString from 'magic-string';\nimport * as svelteCompiler from 'svelte/compiler'; // Works for Svelte 3/4/5\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\nconst ATTRIBUTES_TO_EXTRACT = [\n 'title',\n 'placeholder',\n 'alt',\n 'aria-label',\n 'label',\n];\n\nexport const processSvelteFile = 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\n const ast = svelteCompiler.parse(code);\n const magic = new MagicString(code);\n\n const extractedContent: Record<string, string> = {};\n const existingKeys = new Set<string>();\n\n const walkSvelte = (node: any) => {\n if (node.type === 'Text') {\n const text = node.data;\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(node.start, node.end, `{$content.${key}}`);\n }\n } else if (\n node.type === 'Attribute' &&\n ATTRIBUTES_TO_EXTRACT.includes(node.name)\n ) {\n if (\n node.value &&\n node.value.length === 1 &&\n node.value[0].type === 'Text'\n ) {\n const text = node.value[0].data;\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n magic.overwrite(\n node.start,\n node.end,\n `${node.name}={$content.${key}}`\n );\n }\n }\n }\n\n if (node.children) node.children.forEach(walkSvelte);\n else if (node.fragment?.children)\n node.fragment.children.forEach(walkSvelte);\n if (node.attributes) node.attributes.forEach(walkSvelte);\n };\n\n walkSvelte(ast.html);\n\n const scriptRegex = /<script[^>]*>([\\s\\S]*?)<\\/script>/;\n const match = scriptRegex.exec(code);\n let scriptExtractedKeys = 0;\n\n if (match) {\n const scriptContent = match[1];\n // Offset: index + length of opening tag. match[0] is whole tag, match[1] is content.\n // match.index is start of <script...\n const openTagLength = match[0].indexOf(scriptContent);\n const scriptOffset = match.index + openTagLength;\n\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 scriptExtractedKeys = Object.keys(scriptExtracted).length;\n\n for (const { node, key } of replacements) {\n const start = scriptOffset + node.getStart();\n const end = scriptOffset + node.getEnd();\n magic.overwrite(start, end, `get(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 getImportStmt = `import { get } from 'svelte/store';`;\n const callStmt = `const content = useIntlayer('${componentKey}');`;\n\n if (match) {\n const scriptContentStart = match.index + match[0].indexOf('>') + 1;\n magic.appendLeft(\n scriptContentStart,\n `\\n ${importStmt}\\n ${scriptExtractedKeys > 0 ? getImportStmt : ''}\\n ${callStmt}\\n`\n );\n } else {\n magic.prepend(`<script>\\n ${importStmt}\\n ${callStmt}\\n</script>\\n`);\n }\n\n if (save) {\n await writeFile(filePath, magic.toString());\n }\n return extractedContent;\n};\n"],"mappings":";;;;;;AAuBA,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,oBAAoB,OAC/B,UACA,cACA,aACA,OACA,OAAgB,SACb;CACH,MAAM,EAAE,aAAa,eAAe,qBAAqB;CACzD,MAAM,OAAO,MAAM,SAAS,UAAU,QAAQ;CAE9C,MAAM,MAAM,eAAe,MAAM,KAAK;CACtC,MAAM,QAAQ,IAAI,YAAY,KAAK;CAEnC,MAAMA,mBAA2C,EAAE;CACnD,MAAM,+BAAe,IAAI,KAAa;CAEtC,MAAM,cAAc,SAAc;AAChC,MAAI,KAAK,SAAS,QAAQ;GACxB,MAAM,OAAO,KAAK;AAClB,OAAI,cAAc,KAAK,EAAE;IACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,iBAAa,IAAI,IAAI;AACrB,qBAAiB,OAAO,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;AACxD,UAAM,UAAU,KAAK,OAAO,KAAK,KAAK,aAAa,IAAI,GAAG;;aAG5D,KAAK,SAAS,eACd,sBAAsB,SAAS,KAAK,KAAK,EAEzC;OACE,KAAK,SACL,KAAK,MAAM,WAAW,KACtB,KAAK,MAAM,GAAG,SAAS,QACvB;IACA,MAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,QAAI,cAAc,KAAK,EAAE;KACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,kBAAa,IAAI,IAAI;AACrB,sBAAiB,OAAO,KAAK,MAAM;AACnC,WAAM,UACJ,KAAK,OACL,KAAK,KACL,GAAG,KAAK,KAAK,aAAa,IAAI,GAC/B;;;;AAKP,MAAI,KAAK,SAAU,MAAK,SAAS,QAAQ,WAAW;WAC3C,KAAK,UAAU,SACtB,MAAK,SAAS,SAAS,QAAQ,WAAW;AAC5C,MAAI,KAAK,WAAY,MAAK,WAAW,QAAQ,WAAW;;AAG1D,YAAW,IAAI,KAAK;CAGpB,MAAM,QADc,oCACM,KAAK,KAAK;CACpC,IAAI,sBAAsB;AAE1B,KAAI,OAAO;EACT,MAAM,gBAAgB,MAAM;EAG5B,MAAM,gBAAgB,MAAM,GAAG,QAAQ,cAAc;EACrD,MAAM,eAAe,MAAM,QAAQ;EAKnC,MAAM,EAAE,kBAAkB,iBAAiB,iBACzC,iBAJc,IAAI,QAAQ,EAAE,6BAA6B,MAAM,CAAC,CACvC,iBAAiB,WAAW,cAAc,EAGtC,aAAa;AAC5C,SAAO,OAAO,kBAAkB,gBAAgB;AAChD,wBAAsB,OAAO,KAAK,gBAAgB,CAAC;AAEnD,OAAK,MAAM,EAAE,MAAM,SAAS,cAAc;GACxC,MAAM,QAAQ,eAAe,KAAK,UAAU;GAC5C,MAAM,MAAM,eAAe,KAAK,QAAQ;AACxC,SAAM,UAAU,OAAO,KAAK,gBAAgB,MAAM;;;AAItD,KAAI,OAAO,KAAK,iBAAiB,CAAC,WAAW,EAAG,QAAO;CAGvD,MAAM,aAAa,gCAAgC,YAAY;CAC/D,MAAM,gBAAgB;CACtB,MAAM,WAAW,gCAAgC,aAAa;AAE9D,KAAI,OAAO;EACT,MAAM,qBAAqB,MAAM,QAAQ,MAAM,GAAG,QAAQ,IAAI,GAAG;AACjE,QAAM,WACJ,oBACA,OAAO,WAAW,MAAM,sBAAsB,IAAI,gBAAgB,GAAG,MAAM,SAAS,IACrF;OAED,OAAM,QAAQ,eAAe,WAAW,MAAM,SAAS,gBAAe;AAGxE,KAAI,KACF,OAAM,UAAU,UAAU,MAAM,UAAU,CAAC;AAE7C,QAAO"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/index.ts"],"sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport MagicString from 'magic-string';\nimport * as svelteCompiler from 'svelte/compiler'; // Works for Svelte 3/4/5\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\nconst ATTRIBUTES_TO_EXTRACT = [\n 'title',\n 'placeholder',\n 'alt',\n 'aria-label',\n 'label',\n];\n\nexport const processSvelteFile = 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\n const ast = svelteCompiler.parse(code);\n const magic = new MagicString(code);\n\n const extractedContent: Record<string, string> = {};\n const existingKeys = new Set<string>();\n\n const walkSvelte = (node: any) => {\n if (node.type === 'Text') {\n const text = node.data;\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(node.start, node.end, `{$content.${key}}`);\n }\n } else if (\n node.type === 'Attribute' &&\n ATTRIBUTES_TO_EXTRACT.includes(node.name)\n ) {\n if (\n node.value &&\n node.value.length === 1 &&\n node.value[0].type === 'Text'\n ) {\n const text = node.value[0].data;\n if (shouldExtract(text)) {\n const key = generateKey(text, existingKeys);\n existingKeys.add(key);\n extractedContent[key] = text.trim();\n magic.overwrite(\n node.start,\n node.end,\n `${node.name}={$content.${key}}`\n );\n }\n }\n }\n\n if (node.children) node.children.forEach(walkSvelte);\n else if (node.fragment?.children)\n node.fragment.children.forEach(walkSvelte);\n if (node.attributes) node.attributes.forEach(walkSvelte);\n };\n\n walkSvelte(ast.html);\n\n const scriptRegex = /<script[^>]*>([\\s\\S]*?)<\\/script>/;\n const match = scriptRegex.exec(code);\n let scriptExtractedKeys = 0;\n\n if (match) {\n const scriptContent = match[1];\n // Offset: index + length of opening tag. match[0] is whole tag, match[1] is content.\n // match.index is start of <script...\n const openTagLength = match[0].indexOf(scriptContent);\n const scriptOffset = match.index + openTagLength;\n\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 scriptExtractedKeys = Object.keys(scriptExtracted).length;\n\n for (const { node, key } of replacements) {\n const start = scriptOffset + node.getStart();\n const end = scriptOffset + node.getEnd();\n magic.overwrite(start, end, `get(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 getImportStmt = `import { get } from 'svelte/store';`;\n const callStmt = `const content = useIntlayer('${componentKey}');`;\n\n if (match) {\n const scriptContentStart = match.index + match[0].indexOf('>') + 1;\n magic.appendLeft(\n scriptContentStart,\n `\\n ${importStmt}\\n ${scriptExtractedKeys > 0 ? getImportStmt : ''}\\n ${callStmt}\\n`\n );\n } else {\n magic.prepend(`<script>\\n ${importStmt}\\n ${callStmt}\\n</script>\\n`);\n }\n\n if (save) {\n await writeFile(filePath, magic.toString());\n }\n return extractedContent;\n};\n"],"mappings":";;;;;;AAuBA,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,oBAAoB,OAC/B,UACA,cACA,aACA,OACA,OAAgB,SACb;CACH,MAAM,EAAE,aAAa,eAAe,qBAAqB;CACzD,MAAM,OAAO,MAAM,SAAS,UAAU,QAAQ;CAE9C,MAAM,MAAM,eAAe,MAAM,KAAK;CACtC,MAAM,QAAQ,IAAI,YAAY,KAAK;CAEnC,MAAM,mBAA2C,EAAE;CACnD,MAAM,+BAAe,IAAI,KAAa;CAEtC,MAAM,cAAc,SAAc;AAChC,MAAI,KAAK,SAAS,QAAQ;GACxB,MAAM,OAAO,KAAK;AAClB,OAAI,cAAc,KAAK,EAAE;IACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,iBAAa,IAAI,IAAI;AACrB,qBAAiB,OAAO,KAAK,QAAQ,QAAQ,IAAI,CAAC,MAAM;AACxD,UAAM,UAAU,KAAK,OAAO,KAAK,KAAK,aAAa,IAAI,GAAG;;aAG5D,KAAK,SAAS,eACd,sBAAsB,SAAS,KAAK,KAAK,EAEzC;OACE,KAAK,SACL,KAAK,MAAM,WAAW,KACtB,KAAK,MAAM,GAAG,SAAS,QACvB;IACA,MAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,QAAI,cAAc,KAAK,EAAE;KACvB,MAAM,MAAM,YAAY,MAAM,aAAa;AAC3C,kBAAa,IAAI,IAAI;AACrB,sBAAiB,OAAO,KAAK,MAAM;AACnC,WAAM,UACJ,KAAK,OACL,KAAK,KACL,GAAG,KAAK,KAAK,aAAa,IAAI,GAC/B;;;;AAKP,MAAI,KAAK,SAAU,MAAK,SAAS,QAAQ,WAAW;WAC3C,KAAK,UAAU,SACtB,MAAK,SAAS,SAAS,QAAQ,WAAW;AAC5C,MAAI,KAAK,WAAY,MAAK,WAAW,QAAQ,WAAW;;AAG1D,YAAW,IAAI,KAAK;CAGpB,MAAM,QADc,oCACM,KAAK,KAAK;CACpC,IAAI,sBAAsB;AAE1B,KAAI,OAAO;EACT,MAAM,gBAAgB,MAAM;EAG5B,MAAM,gBAAgB,MAAM,GAAG,QAAQ,cAAc;EACrD,MAAM,eAAe,MAAM,QAAQ;EAKnC,MAAM,EAAE,kBAAkB,iBAAiB,iBACzC,iBAJc,IAAI,QAAQ,EAAE,6BAA6B,MAAM,CAAC,CACvC,iBAAiB,WAAW,cAAc,EAGtC,aAAa;AAC5C,SAAO,OAAO,kBAAkB,gBAAgB;AAChD,wBAAsB,OAAO,KAAK,gBAAgB,CAAC;AAEnD,OAAK,MAAM,EAAE,MAAM,SAAS,cAAc;GACxC,MAAM,QAAQ,eAAe,KAAK,UAAU;GAC5C,MAAM,MAAM,eAAe,KAAK,QAAQ;AACxC,SAAM,UAAU,OAAO,KAAK,gBAAgB,MAAM;;;AAItD,KAAI,OAAO,KAAK,iBAAiB,CAAC,WAAW,EAAG,QAAO;CAGvD,MAAM,aAAa,gCAAgC,YAAY;CAC/D,MAAM,gBAAgB;CACtB,MAAM,WAAW,gCAAgC,aAAa;AAE9D,KAAI,OAAO;EACT,MAAM,qBAAqB,MAAM,QAAQ,MAAM,GAAG,QAAQ,IAAI,GAAG;AACjE,QAAM,WACJ,oBACA,OAAO,WAAW,MAAM,sBAAsB,IAAI,gBAAgB,GAAG,MAAM,SAAS,IACrF;OAED,OAAM,QAAQ,eAAe,WAAW,MAAM,SAAS,gBAAe;AAGxE,KAAI,KACF,OAAM,UAAU,UAAU,MAAM,UAAU,CAAC;AAE7C,QAAO"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intlayer/svelte-transformer",
3
- "version": "7.5.13",
3
+ "version": "7.5.14",
4
4
  "private": false,
5
5
  "description": "A transformer for Intlayer that extract strings from Svelte components.",
6
6
  "keywords": [
@@ -76,14 +76,14 @@
76
76
  "ts-morph": "^27.0.0"
77
77
  },
78
78
  "devDependencies": {
79
- "@types/node": "25.0.3",
79
+ "@types/node": "25.0.6",
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.18.2",
84
+ "tsdown": "0.19.0",
85
85
  "typescript": "5.9.3",
86
- "vitest": "4.0.16"
86
+ "vitest": "4.0.17"
87
87
  },
88
88
  "engines": {
89
89
  "node": ">=14.18"