@intlayer/svelte-transformer 8.1.2 → 8.1.3
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,29 +1 @@
|
|
|
1
|
-
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __copyProps = (to, from, except, desc) => {
|
|
9
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
-
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
11
|
-
key = keys[i];
|
|
12
|
-
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
13
|
-
__defProp(to, key, {
|
|
14
|
-
get: ((k) => from[k]).bind(null, key),
|
|
15
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return to;
|
|
21
|
-
};
|
|
22
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
23
|
-
value: mod,
|
|
24
|
-
enumerable: true
|
|
25
|
-
}) : target, mod));
|
|
26
|
-
|
|
27
|
-
//#endregion
|
|
28
|
-
|
|
29
|
-
exports.__toESM = __toESM;
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));exports.__toESM=s;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,79 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,
|
|
2
|
-
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
3
|
-
let node_fs_promises = require("node:fs/promises");
|
|
4
|
-
let magic_string = require("magic-string");
|
|
5
|
-
magic_string = require_runtime.__toESM(magic_string);
|
|
6
|
-
let svelte_compiler = require("svelte/compiler");
|
|
7
|
-
svelte_compiler = require_runtime.__toESM(svelte_compiler);
|
|
8
|
-
let ts_morph = require("ts-morph");
|
|
9
|
-
|
|
10
|
-
//#region src/index.ts
|
|
11
|
-
const ATTRIBUTES_TO_EXTRACT = [
|
|
12
|
-
"title",
|
|
13
|
-
"placeholder",
|
|
14
|
-
"alt",
|
|
15
|
-
"aria-label",
|
|
16
|
-
"label"
|
|
17
|
-
];
|
|
18
|
-
const processSvelteFile = async (filePath, componentKey, packageName, tools, save = true) => {
|
|
19
|
-
const { generateKey, shouldExtract, extractTsContent } = tools;
|
|
20
|
-
const code = await (0, node_fs_promises.readFile)(filePath, "utf-8");
|
|
21
|
-
const ast = svelte_compiler.parse(code);
|
|
22
|
-
const magic = new magic_string.default(code);
|
|
23
|
-
const extractedContent = {};
|
|
24
|
-
const existingKeys = /* @__PURE__ */ new Set();
|
|
25
|
-
const walkSvelte = (node) => {
|
|
26
|
-
if (node.type === "Text") {
|
|
27
|
-
const text = node.data;
|
|
28
|
-
if (shouldExtract(text)) {
|
|
29
|
-
const key = generateKey(text, existingKeys);
|
|
30
|
-
existingKeys.add(key);
|
|
31
|
-
extractedContent[key] = text.replace(/\s+/g, " ").trim();
|
|
32
|
-
magic.overwrite(node.start, node.end, `{$content.${key}}`);
|
|
33
|
-
}
|
|
34
|
-
} else if (node.type === "Attribute" && ATTRIBUTES_TO_EXTRACT.includes(node.name)) {
|
|
35
|
-
if (node.value && node.value.length === 1 && node.value[0].type === "Text") {
|
|
36
|
-
const text = node.value[0].data;
|
|
37
|
-
if (shouldExtract(text)) {
|
|
38
|
-
const key = generateKey(text, existingKeys);
|
|
39
|
-
existingKeys.add(key);
|
|
40
|
-
extractedContent[key] = text.trim();
|
|
41
|
-
magic.overwrite(node.start, node.end, `${node.name}={$content.${key}}`);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
if (node.children) node.children.forEach(walkSvelte);
|
|
46
|
-
else if (node.fragment?.children) node.fragment.children.forEach(walkSvelte);
|
|
47
|
-
if (node.attributes) node.attributes.forEach(walkSvelte);
|
|
48
|
-
};
|
|
49
|
-
walkSvelte(ast.html);
|
|
50
|
-
const match = /<script[^>]*>([\s\S]*?)<\/script>/.exec(code);
|
|
51
|
-
let scriptExtractedKeys = 0;
|
|
52
|
-
if (match) {
|
|
53
|
-
const scriptContent = match[1];
|
|
54
|
-
const openTagLength = match[0].indexOf(scriptContent);
|
|
55
|
-
const scriptOffset = match.index + openTagLength;
|
|
56
|
-
const { extractedContent: scriptExtracted, replacements } = extractTsContent(new ts_morph.Project({ skipAddingFilesFromTsConfig: true }).createSourceFile("temp.ts", scriptContent), existingKeys);
|
|
57
|
-
Object.assign(extractedContent, scriptExtracted);
|
|
58
|
-
scriptExtractedKeys = Object.keys(scriptExtracted).length;
|
|
59
|
-
for (const { node, key } of replacements) {
|
|
60
|
-
const start = scriptOffset + node.getStart();
|
|
61
|
-
const end = scriptOffset + node.getEnd();
|
|
62
|
-
magic.overwrite(start, end, `get(content).${key}`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
if (Object.keys(extractedContent).length === 0) return null;
|
|
66
|
-
const importStmt = `import { useIntlayer } from '${packageName}';`;
|
|
67
|
-
const getImportStmt = `import { get } from 'svelte/store';`;
|
|
68
|
-
const callStmt = `const content = useIntlayer('${componentKey}');`;
|
|
69
|
-
if (match) {
|
|
70
|
-
const scriptContentStart = match.index + match[0].indexOf(">") + 1;
|
|
71
|
-
magic.appendLeft(scriptContentStart, `\n ${importStmt}\n ${scriptExtractedKeys > 0 ? getImportStmt : ""}\n ${callStmt}\n`);
|
|
72
|
-
} else magic.prepend(`<script>\n ${importStmt}\n ${callStmt}\n<\/script>\n`);
|
|
73
|
-
if (save) await (0, node_fs_promises.writeFile)(filePath, magic.toString());
|
|
74
|
-
return extractedContent;
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
//#endregion
|
|
78
|
-
exports.processSvelteFile = processSvelteFile;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./_virtual/_rolldown/runtime.cjs`);let t=require(`node:fs/promises`),n=require(`magic-string`);n=e.__toESM(n);let r=require(`svelte/compiler`);r=e.__toESM(r);let i=require(`ts-morph`);const a=[`title`,`placeholder`,`alt`,`aria-label`,`label`],o=async(e,o,s,c,l=!0)=>{let{generateKey:u,shouldExtract:d,extractTsContent:f}=c,p=await(0,t.readFile)(e,`utf-8`),m=r.parse(p),h=new n.default(p),g={},_=new Set,v=e=>{if(e.type===`Text`){let t=e.data;if(d(t)){let n=u(t,_);_.add(n),g[n]=t.replace(/\s+/g,` `).trim(),h.overwrite(e.start,e.end,`{$content.${n}}`)}}else if(e.type===`Attribute`&&a.includes(e.name)&&e.value&&e.value.length===1&&e.value[0].type===`Text`){let t=e.value[0].data;if(d(t)){let n=u(t,_);_.add(n),g[n]=t.trim(),h.overwrite(e.start,e.end,`${e.name}={$content.${n}}`)}}e.children?e.children.forEach(v):e.fragment?.children&&e.fragment.children.forEach(v),e.attributes&&e.attributes.forEach(v)};v(m.html);let y=/<script[^>]*>([\s\S]*?)<\/script>/.exec(p),b=0;if(y){let e=y[1],t=y[0].indexOf(e),n=y.index+t,{extractedContent:r,replacements:a}=f(new i.Project({skipAddingFilesFromTsConfig:!0}).createSourceFile(`temp.ts`,e),_);Object.assign(g,r),b=Object.keys(r).length;for(let{node:e,key:t}of a){let r=n+e.getStart(),i=n+e.getEnd();h.overwrite(r,i,`get(content).${t}`)}}if(Object.keys(g).length===0)return null;let x=`import { useIntlayer } from '${s}';`,S=`const content = useIntlayer('${o}');`;if(y){let e=y.index+y[0].indexOf(`>`)+1;h.appendLeft(e,`\n ${x}\n ${b>0?`import { get } from 'svelte/store';`:``}\n ${S}\n`)}else h.prepend(`<script>\n ${x}\n ${S}\n<\/script>\n`);return l&&await(0,t.writeFile)(e,h.toString()),g};exports.processSvelteFile=o;
|
|
79
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":"
|
|
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":"4QAuBA,MAAM,EAAwB,CAC5B,QACA,cACA,MACA,aACA,QACD,CAEY,EAAoB,MAC/B,EACA,EACA,EACA,EACA,EAAgB,KACb,CACH,GAAM,CAAE,cAAa,gBAAe,oBAAqB,EACnD,EAAO,MAAA,EAAA,EAAA,UAAe,EAAU,QAAQ,CAExC,EAAMA,EAAe,MAAM,EAAK,CAChC,EAAQ,IAAIC,EAAAA,QAAY,EAAK,CAE7B,EAA2C,EAAE,CAC7C,EAAe,IAAI,IAEnB,EAAc,GAAc,CAChC,GAAI,EAAK,OAAS,OAAQ,CACxB,IAAM,EAAO,EAAK,KAClB,GAAI,EAAc,EAAK,CAAE,CACvB,IAAM,EAAM,EAAY,EAAM,EAAa,CAC3C,EAAa,IAAI,EAAI,CACrB,EAAiB,GAAO,EAAK,QAAQ,OAAQ,IAAI,CAAC,MAAM,CACxD,EAAM,UAAU,EAAK,MAAO,EAAK,IAAK,aAAa,EAAI,GAAG,UAG5D,EAAK,OAAS,aACd,EAAsB,SAAS,EAAK,KAAK,EAGvC,EAAK,OACL,EAAK,MAAM,SAAW,GACtB,EAAK,MAAM,GAAG,OAAS,OACvB,CACA,IAAM,EAAO,EAAK,MAAM,GAAG,KAC3B,GAAI,EAAc,EAAK,CAAE,CACvB,IAAM,EAAM,EAAY,EAAM,EAAa,CAC3C,EAAa,IAAI,EAAI,CACrB,EAAiB,GAAO,EAAK,MAAM,CACnC,EAAM,UACJ,EAAK,MACL,EAAK,IACL,GAAG,EAAK,KAAK,aAAa,EAAI,GAC/B,EAKH,EAAK,SAAU,EAAK,SAAS,QAAQ,EAAW,CAC3C,EAAK,UAAU,UACtB,EAAK,SAAS,SAAS,QAAQ,EAAW,CACxC,EAAK,YAAY,EAAK,WAAW,QAAQ,EAAW,EAG1D,EAAW,EAAI,KAAK,CAGpB,IAAM,EADc,oCACM,KAAK,EAAK,CAChC,EAAsB,EAE1B,GAAI,EAAO,CACT,IAAM,EAAgB,EAAM,GAGtB,EAAgB,EAAM,GAAG,QAAQ,EAAc,CAC/C,EAAe,EAAM,MAAQ,EAK7B,CAAE,iBAAkB,EAAiB,gBACzC,EAJc,IAAIC,EAAAA,QAAQ,CAAE,4BAA6B,GAAM,CAAC,CACvC,iBAAiB,UAAW,EAAc,CAGtC,EAAa,CAC5C,OAAO,OAAO,EAAkB,EAAgB,CAChD,EAAsB,OAAO,KAAK,EAAgB,CAAC,OAEnD,IAAK,GAAM,CAAE,OAAM,SAAS,EAAc,CACxC,IAAM,EAAQ,EAAe,EAAK,UAAU,CACtC,EAAM,EAAe,EAAK,QAAQ,CACxC,EAAM,UAAU,EAAO,EAAK,gBAAgB,IAAM,EAItD,GAAI,OAAO,KAAK,EAAiB,CAAC,SAAW,EAAG,OAAO,KAGvD,IAAM,EAAa,gCAAgC,EAAY,IAEzD,EAAW,gCAAgC,EAAa,KAE9D,GAAI,EAAO,CACT,IAAM,EAAqB,EAAM,MAAQ,EAAM,GAAG,QAAQ,IAAI,CAAG,EACjE,EAAM,WACJ,EACA,OAAO,EAAW,MAAM,EAAsB,EAAI,sCAAgB,GAAG,MAAM,EAAS,IACrF,MAED,EAAM,QAAQ,eAAe,EAAW,MAAM,EAAS,gBAAe,CAMxE,OAHI,GACF,MAAA,EAAA,EAAA,WAAgB,EAAU,EAAM,UAAU,CAAC,CAEtC"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,75 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
import MagicString from "magic-string";
|
|
3
|
-
import * as svelteCompiler from "svelte/compiler";
|
|
4
|
-
import { Project } from "ts-morph";
|
|
5
|
-
|
|
6
|
-
//#region src/index.ts
|
|
7
|
-
const ATTRIBUTES_TO_EXTRACT = [
|
|
8
|
-
"title",
|
|
9
|
-
"placeholder",
|
|
10
|
-
"alt",
|
|
11
|
-
"aria-label",
|
|
12
|
-
"label"
|
|
13
|
-
];
|
|
14
|
-
const processSvelteFile = async (filePath, componentKey, packageName, tools, save = true) => {
|
|
15
|
-
const { generateKey, shouldExtract, extractTsContent } = tools;
|
|
16
|
-
const code = await readFile(filePath, "utf-8");
|
|
17
|
-
const ast = svelteCompiler.parse(code);
|
|
18
|
-
const magic = new MagicString(code);
|
|
19
|
-
const extractedContent = {};
|
|
20
|
-
const existingKeys = /* @__PURE__ */ new Set();
|
|
21
|
-
const walkSvelte = (node) => {
|
|
22
|
-
if (node.type === "Text") {
|
|
23
|
-
const text = node.data;
|
|
24
|
-
if (shouldExtract(text)) {
|
|
25
|
-
const key = generateKey(text, existingKeys);
|
|
26
|
-
existingKeys.add(key);
|
|
27
|
-
extractedContent[key] = text.replace(/\s+/g, " ").trim();
|
|
28
|
-
magic.overwrite(node.start, node.end, `{$content.${key}}`);
|
|
29
|
-
}
|
|
30
|
-
} else if (node.type === "Attribute" && ATTRIBUTES_TO_EXTRACT.includes(node.name)) {
|
|
31
|
-
if (node.value && node.value.length === 1 && node.value[0].type === "Text") {
|
|
32
|
-
const text = node.value[0].data;
|
|
33
|
-
if (shouldExtract(text)) {
|
|
34
|
-
const key = generateKey(text, existingKeys);
|
|
35
|
-
existingKeys.add(key);
|
|
36
|
-
extractedContent[key] = text.trim();
|
|
37
|
-
magic.overwrite(node.start, node.end, `${node.name}={$content.${key}}`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
if (node.children) node.children.forEach(walkSvelte);
|
|
42
|
-
else if (node.fragment?.children) node.fragment.children.forEach(walkSvelte);
|
|
43
|
-
if (node.attributes) node.attributes.forEach(walkSvelte);
|
|
44
|
-
};
|
|
45
|
-
walkSvelte(ast.html);
|
|
46
|
-
const match = /<script[^>]*>([\s\S]*?)<\/script>/.exec(code);
|
|
47
|
-
let scriptExtractedKeys = 0;
|
|
48
|
-
if (match) {
|
|
49
|
-
const scriptContent = match[1];
|
|
50
|
-
const openTagLength = match[0].indexOf(scriptContent);
|
|
51
|
-
const scriptOffset = match.index + openTagLength;
|
|
52
|
-
const { extractedContent: scriptExtracted, replacements } = extractTsContent(new Project({ skipAddingFilesFromTsConfig: true }).createSourceFile("temp.ts", scriptContent), existingKeys);
|
|
53
|
-
Object.assign(extractedContent, scriptExtracted);
|
|
54
|
-
scriptExtractedKeys = Object.keys(scriptExtracted).length;
|
|
55
|
-
for (const { node, key } of replacements) {
|
|
56
|
-
const start = scriptOffset + node.getStart();
|
|
57
|
-
const end = scriptOffset + node.getEnd();
|
|
58
|
-
magic.overwrite(start, end, `get(content).${key}`);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
if (Object.keys(extractedContent).length === 0) return null;
|
|
62
|
-
const importStmt = `import { useIntlayer } from '${packageName}';`;
|
|
63
|
-
const getImportStmt = `import { get } from 'svelte/store';`;
|
|
64
|
-
const callStmt = `const content = useIntlayer('${componentKey}');`;
|
|
65
|
-
if (match) {
|
|
66
|
-
const scriptContentStart = match.index + match[0].indexOf(">") + 1;
|
|
67
|
-
magic.appendLeft(scriptContentStart, `\n ${importStmt}\n ${scriptExtractedKeys > 0 ? getImportStmt : ""}\n ${callStmt}\n`);
|
|
68
|
-
} else magic.prepend(`<script>\n ${importStmt}\n ${callStmt}\n<\/script>\n`);
|
|
69
|
-
if (save) await writeFile(filePath, magic.toString());
|
|
70
|
-
return extractedContent;
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
//#endregion
|
|
74
|
-
export { processSvelteFile };
|
|
1
|
+
import{readFile as e,writeFile as t}from"node:fs/promises";import n from"magic-string";import*as r from"svelte/compiler";import{Project as i}from"ts-morph";const a=[`title`,`placeholder`,`alt`,`aria-label`,`label`],o=async(o,s,c,l,u=!0)=>{let{generateKey:d,shouldExtract:f,extractTsContent:p}=l,m=await e(o,`utf-8`),h=r.parse(m),g=new n(m),_={},v=new Set,y=e=>{if(e.type===`Text`){let t=e.data;if(f(t)){let n=d(t,v);v.add(n),_[n]=t.replace(/\s+/g,` `).trim(),g.overwrite(e.start,e.end,`{$content.${n}}`)}}else if(e.type===`Attribute`&&a.includes(e.name)&&e.value&&e.value.length===1&&e.value[0].type===`Text`){let t=e.value[0].data;if(f(t)){let n=d(t,v);v.add(n),_[n]=t.trim(),g.overwrite(e.start,e.end,`${e.name}={$content.${n}}`)}}e.children?e.children.forEach(y):e.fragment?.children&&e.fragment.children.forEach(y),e.attributes&&e.attributes.forEach(y)};y(h.html);let b=/<script[^>]*>([\s\S]*?)<\/script>/.exec(m),x=0;if(b){let e=b[1],t=b[0].indexOf(e),n=b.index+t,{extractedContent:r,replacements:a}=p(new i({skipAddingFilesFromTsConfig:!0}).createSourceFile(`temp.ts`,e),v);Object.assign(_,r),x=Object.keys(r).length;for(let{node:e,key:t}of a){let r=n+e.getStart(),i=n+e.getEnd();g.overwrite(r,i,`get(content).${t}`)}}if(Object.keys(_).length===0)return null;let S=`import { useIntlayer } from '${c}';`,C=`const content = useIntlayer('${s}');`;if(b){let e=b.index+b[0].indexOf(`>`)+1;g.appendLeft(e,`\n ${S}\n ${x>0?`import { get } from 'svelte/store';`:``}\n ${C}\n`)}else g.prepend(`<script>\n ${S}\n ${C}\n<\/script>\n`);return u&&await t(o,g.toString()),_};export{o as processSvelteFile};
|
|
75
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":"
|
|
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":"4JAuBA,MAAM,EAAwB,CAC5B,QACA,cACA,MACA,aACA,QACD,CAEY,EAAoB,MAC/B,EACA,EACA,EACA,EACA,EAAgB,KACb,CACH,GAAM,CAAE,cAAa,gBAAe,oBAAqB,EACnD,EAAO,MAAM,EAAS,EAAU,QAAQ,CAExC,EAAM,EAAe,MAAM,EAAK,CAChC,EAAQ,IAAI,EAAY,EAAK,CAE7B,EAA2C,EAAE,CAC7C,EAAe,IAAI,IAEnB,EAAc,GAAc,CAChC,GAAI,EAAK,OAAS,OAAQ,CACxB,IAAM,EAAO,EAAK,KAClB,GAAI,EAAc,EAAK,CAAE,CACvB,IAAM,EAAM,EAAY,EAAM,EAAa,CAC3C,EAAa,IAAI,EAAI,CACrB,EAAiB,GAAO,EAAK,QAAQ,OAAQ,IAAI,CAAC,MAAM,CACxD,EAAM,UAAU,EAAK,MAAO,EAAK,IAAK,aAAa,EAAI,GAAG,UAG5D,EAAK,OAAS,aACd,EAAsB,SAAS,EAAK,KAAK,EAGvC,EAAK,OACL,EAAK,MAAM,SAAW,GACtB,EAAK,MAAM,GAAG,OAAS,OACvB,CACA,IAAM,EAAO,EAAK,MAAM,GAAG,KAC3B,GAAI,EAAc,EAAK,CAAE,CACvB,IAAM,EAAM,EAAY,EAAM,EAAa,CAC3C,EAAa,IAAI,EAAI,CACrB,EAAiB,GAAO,EAAK,MAAM,CACnC,EAAM,UACJ,EAAK,MACL,EAAK,IACL,GAAG,EAAK,KAAK,aAAa,EAAI,GAC/B,EAKH,EAAK,SAAU,EAAK,SAAS,QAAQ,EAAW,CAC3C,EAAK,UAAU,UACtB,EAAK,SAAS,SAAS,QAAQ,EAAW,CACxC,EAAK,YAAY,EAAK,WAAW,QAAQ,EAAW,EAG1D,EAAW,EAAI,KAAK,CAGpB,IAAM,EADc,oCACM,KAAK,EAAK,CAChC,EAAsB,EAE1B,GAAI,EAAO,CACT,IAAM,EAAgB,EAAM,GAGtB,EAAgB,EAAM,GAAG,QAAQ,EAAc,CAC/C,EAAe,EAAM,MAAQ,EAK7B,CAAE,iBAAkB,EAAiB,gBACzC,EAJc,IAAI,EAAQ,CAAE,4BAA6B,GAAM,CAAC,CACvC,iBAAiB,UAAW,EAAc,CAGtC,EAAa,CAC5C,OAAO,OAAO,EAAkB,EAAgB,CAChD,EAAsB,OAAO,KAAK,EAAgB,CAAC,OAEnD,IAAK,GAAM,CAAE,OAAM,SAAS,EAAc,CACxC,IAAM,EAAQ,EAAe,EAAK,UAAU,CACtC,EAAM,EAAe,EAAK,QAAQ,CACxC,EAAM,UAAU,EAAO,EAAK,gBAAgB,IAAM,EAItD,GAAI,OAAO,KAAK,EAAiB,CAAC,SAAW,EAAG,OAAO,KAGvD,IAAM,EAAa,gCAAgC,EAAY,IAEzD,EAAW,gCAAgC,EAAa,KAE9D,GAAI,EAAO,CACT,IAAM,EAAqB,EAAM,MAAQ,EAAM,GAAG,QAAQ,IAAI,CAAG,EACjE,EAAM,WACJ,EACA,OAAO,EAAW,MAAM,EAAsB,EAAI,sCAAgB,GAAG,MAAM,EAAS,IACrF,MAED,EAAM,QAAQ,eAAe,EAAW,MAAM,EAAS,gBAAe,CAMxE,OAHI,GACF,MAAM,EAAU,EAAU,EAAM,UAAU,CAAC,CAEtC"}
|