@formatjs/cli-lib 8.7.4 → 8.7.6
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/index.js
CHANGED
|
@@ -289,7 +289,7 @@ async function processFile(source, fn, { idInterpolationPattern, ...opts }) {
|
|
|
289
289
|
parseFile(source, fn, scriptParseFn);
|
|
290
290
|
} else if (fn.endsWith(".svelte")) {
|
|
291
291
|
debug("Processing %s using svelte extractor", fn);
|
|
292
|
-
const { parseFile } = await import("./svelte_extractor-
|
|
292
|
+
const { parseFile } = await import("./svelte_extractor-kQTSfy8K.js");
|
|
293
293
|
parseFile(source, fn, scriptParseFn);
|
|
294
294
|
} else if (fn.endsWith(".hbs")) {
|
|
295
295
|
debug("Processing %s using hbs extractor", fn);
|
package/package.json
CHANGED
|
@@ -1,19 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@formatjs/cli-lib",
|
|
3
|
+
"version": "8.7.6",
|
|
3
4
|
"description": "Lib for CLI for formatjs.",
|
|
4
|
-
"
|
|
5
|
+
"keywords": [
|
|
6
|
+
"cli",
|
|
7
|
+
"format",
|
|
8
|
+
"formatjs",
|
|
9
|
+
"formatting",
|
|
10
|
+
"globalization",
|
|
11
|
+
"i18n",
|
|
12
|
+
"internationalization",
|
|
13
|
+
"intl",
|
|
14
|
+
"locale",
|
|
15
|
+
"localization",
|
|
16
|
+
"react",
|
|
17
|
+
"react-intl",
|
|
18
|
+
"reactjs",
|
|
19
|
+
"translate",
|
|
20
|
+
"translation"
|
|
21
|
+
],
|
|
22
|
+
"homepage": "https://github.com/formatjs/formatjs",
|
|
23
|
+
"bugs": "https://github.com/formatjs/formatjs/issues",
|
|
5
24
|
"license": "MIT",
|
|
6
25
|
"author": "Linjie Ding <linjie@airtable.com>",
|
|
26
|
+
"repository": "formatjs/formatjs.git",
|
|
7
27
|
"type": "module",
|
|
28
|
+
"main": "index.js",
|
|
8
29
|
"types": "index.d.ts",
|
|
9
30
|
"exports": {
|
|
10
31
|
".": "./index.js"
|
|
11
32
|
},
|
|
12
|
-
"engines": {
|
|
13
|
-
"node": ">= 20.12.0"
|
|
14
|
-
},
|
|
15
33
|
"dependencies": {
|
|
16
|
-
"@types
|
|
34
|
+
"@babel/types": "^7.29.0",
|
|
35
|
+
"@formatjs/icu-messageformat-parser": "3.5.11",
|
|
36
|
+
"@formatjs/ts-transformer": "4.4.12",
|
|
17
37
|
"@types/fs-extra": "^11.0.4",
|
|
18
38
|
"@types/node": "22 || 24",
|
|
19
39
|
"commander": "^14.0.0",
|
|
@@ -21,10 +41,7 @@
|
|
|
21
41
|
"fs-extra": "^11.3.3",
|
|
22
42
|
"json-stable-stringify": "^1.3.0",
|
|
23
43
|
"loud-rejection": "^2",
|
|
24
|
-
"typescript": "^5.6 || 6"
|
|
25
|
-
"@formatjs/icu-skeleton-parser": "2.1.9",
|
|
26
|
-
"@formatjs/ts-transformer": "4.4.11",
|
|
27
|
-
"@formatjs/icu-messageformat-parser": "3.5.10"
|
|
44
|
+
"typescript": "^5.6 || 6"
|
|
28
45
|
},
|
|
29
46
|
"peerDependencies": {
|
|
30
47
|
"@glimmer/syntax": "^0.84.3 || ^0.95.0",
|
|
@@ -33,39 +50,7 @@
|
|
|
33
50
|
"svelte": "^5.0.0",
|
|
34
51
|
"vue": "^3.5.0"
|
|
35
52
|
},
|
|
36
|
-
"bugs": "https://github.com/formatjs/formatjs/issues",
|
|
37
|
-
"homepage": "https://github.com/formatjs/formatjs",
|
|
38
|
-
"keywords": [
|
|
39
|
-
"cli",
|
|
40
|
-
"format",
|
|
41
|
-
"formatjs",
|
|
42
|
-
"formatting",
|
|
43
|
-
"globalization",
|
|
44
|
-
"i18n",
|
|
45
|
-
"internationalization",
|
|
46
|
-
"intl",
|
|
47
|
-
"locale",
|
|
48
|
-
"localization",
|
|
49
|
-
"react",
|
|
50
|
-
"react-intl",
|
|
51
|
-
"reactjs",
|
|
52
|
-
"translate",
|
|
53
|
-
"translation"
|
|
54
|
-
],
|
|
55
|
-
"main": "index.js",
|
|
56
|
-
"optionalDependencies": {
|
|
57
|
-
"@formatjs/cli-native-darwin-arm64": "1.1.0",
|
|
58
|
-
"@formatjs/cli-native-linux-arm64": "1.2.0",
|
|
59
|
-
"@formatjs/cli-native-linux-x64": "1.1.0",
|
|
60
|
-
"@formatjs/cli-native-win32-x64": "1.1.1"
|
|
61
|
-
},
|
|
62
53
|
"peerDependenciesMeta": {
|
|
63
|
-
"vue": {
|
|
64
|
-
"optional": true
|
|
65
|
-
},
|
|
66
|
-
"@vue/compiler-core": {
|
|
67
|
-
"optional": true
|
|
68
|
-
},
|
|
69
54
|
"@glimmer/env": {
|
|
70
55
|
"optional": true
|
|
71
56
|
},
|
|
@@ -78,12 +63,26 @@
|
|
|
78
63
|
"@glimmer/validator": {
|
|
79
64
|
"optional": true
|
|
80
65
|
},
|
|
66
|
+
"@vue/compiler-core": {
|
|
67
|
+
"optional": true
|
|
68
|
+
},
|
|
81
69
|
"content-tag": {
|
|
82
70
|
"optional": true
|
|
83
71
|
},
|
|
84
72
|
"svelte": {
|
|
85
73
|
"optional": true
|
|
74
|
+
},
|
|
75
|
+
"vue": {
|
|
76
|
+
"optional": true
|
|
86
77
|
}
|
|
87
78
|
},
|
|
88
|
-
"
|
|
79
|
+
"optionalDependencies": {
|
|
80
|
+
"@formatjs/cli-native-darwin-arm64": "1.1.2",
|
|
81
|
+
"@formatjs/cli-native-linux-arm64": "1.2.2",
|
|
82
|
+
"@formatjs/cli-native-linux-x64": "1.1.2",
|
|
83
|
+
"@formatjs/cli-native-win32-x64": "1.1.3"
|
|
84
|
+
},
|
|
85
|
+
"engines": {
|
|
86
|
+
"node": ">= 20.12.0"
|
|
87
|
+
}
|
|
89
88
|
}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { parse } from "svelte/compiler";
|
|
2
2
|
//#region packages/cli-lib/svelte_extractor.ts
|
|
3
|
+
const MESSAGE_DESCRIPTOR_PROPS = new Set([
|
|
4
|
+
"id",
|
|
5
|
+
"defaultMessage",
|
|
6
|
+
"description"
|
|
7
|
+
]);
|
|
8
|
+
function isValidIdentifier(name) {
|
|
9
|
+
return /^[$A-Z_a-z][$\w]*$/.test(name);
|
|
10
|
+
}
|
|
3
11
|
function walkFragment(fragment, source, parseScriptFn) {
|
|
4
12
|
if (!fragment || !fragment.nodes) return;
|
|
5
13
|
for (const node of fragment.nodes) walkNode(node, source, parseScriptFn);
|
|
@@ -13,6 +21,43 @@ function extractExpression(expression, source, parseScriptFn) {
|
|
|
13
21
|
console.warn(`Failed to parse "${content}". Ignore this if content has no extractable message`, e);
|
|
14
22
|
}
|
|
15
23
|
}
|
|
24
|
+
function getStringAttributeValue(value) {
|
|
25
|
+
return value.data ?? value.raw ?? "";
|
|
26
|
+
}
|
|
27
|
+
function getAttributeExpression(attr, source) {
|
|
28
|
+
if (attr.value === true || attr.value == null) return;
|
|
29
|
+
if (!Array.isArray(attr.value)) {
|
|
30
|
+
if (attr.value.type === "ExpressionTag") return source.slice(attr.value.expression.start, attr.value.expression.end);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (!attr.value.length) return "\"\"";
|
|
34
|
+
if (attr.value.length === 1) {
|
|
35
|
+
const [value] = attr.value;
|
|
36
|
+
if (value.type === "ExpressionTag") return source.slice(value.expression.start, value.expression.end);
|
|
37
|
+
return JSON.stringify(getStringAttributeValue(value));
|
|
38
|
+
}
|
|
39
|
+
let staticValue = "";
|
|
40
|
+
for (const value of attr.value) {
|
|
41
|
+
if (value.type === "ExpressionTag") return;
|
|
42
|
+
staticValue += getStringAttributeValue(value);
|
|
43
|
+
}
|
|
44
|
+
return JSON.stringify(staticValue);
|
|
45
|
+
}
|
|
46
|
+
function extractMessageComponent(node, source, parseScriptFn) {
|
|
47
|
+
if (typeof node.name !== "string" || !isValidIdentifier(node.name)) return;
|
|
48
|
+
const props = [];
|
|
49
|
+
for (const attr of node.attributes || []) {
|
|
50
|
+
if (attr.type !== "Attribute" || typeof attr.name !== "string" || !MESSAGE_DESCRIPTOR_PROPS.has(attr.name)) continue;
|
|
51
|
+
const expression = getAttributeExpression(attr, source);
|
|
52
|
+
if (expression != null) props.push(`${attr.name}: ${expression}`);
|
|
53
|
+
}
|
|
54
|
+
if (!props.length) return;
|
|
55
|
+
try {
|
|
56
|
+
parseScriptFn(`${node.name}({${props.join(", ")}})`);
|
|
57
|
+
} catch (e) {
|
|
58
|
+
console.warn(`Failed to parse ${node.name} message component. Ignore this if component has no extractable message`, e);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
16
61
|
function walkNode(node, source, parseScriptFn) {
|
|
17
62
|
switch (node.type) {
|
|
18
63
|
case "ExpressionTag":
|
|
@@ -63,6 +108,7 @@ function walkNode(node, source, parseScriptFn) {
|
|
|
63
108
|
case "SlotElement":
|
|
64
109
|
case "SvelteSelf":
|
|
65
110
|
case "SvelteFragment":
|
|
111
|
+
if (node.type === "Component") extractMessageComponent(node, source, parseScriptFn);
|
|
66
112
|
if (node.attributes) {
|
|
67
113
|
for (const attr of node.attributes) if (attr.type === "Attribute") {
|
|
68
114
|
if (Array.isArray(attr.value)) {
|
|
@@ -93,4 +139,4 @@ function parseFile(source, filename, parseScriptFn) {
|
|
|
93
139
|
//#endregion
|
|
94
140
|
export { parseFile };
|
|
95
141
|
|
|
96
|
-
//# sourceMappingURL=svelte_extractor-
|
|
142
|
+
//# sourceMappingURL=svelte_extractor-kQTSfy8K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svelte_extractor-kQTSfy8K.js","names":[],"sources":["../svelte_extractor.ts"],"sourcesContent":["import {parse} from 'svelte/compiler'\n\nexport type ScriptParseFn = (source: string) => void\n\ninterface SvelteNode {\n type: string\n start: number\n end: number\n [key: string]: any\n}\n\nconst MESSAGE_DESCRIPTOR_PROPS = new Set([\n 'id',\n 'defaultMessage',\n 'description',\n])\n\nfunction isValidIdentifier(name: string): boolean {\n return /^[$A-Z_a-z][$\\w]*$/.test(name)\n}\n\nfunction walkFragment(\n fragment: SvelteNode | null | undefined,\n source: string,\n parseScriptFn: ScriptParseFn\n): void {\n if (!fragment || !fragment.nodes) {\n return\n }\n for (const node of fragment.nodes) {\n walkNode(node, source, parseScriptFn)\n }\n}\n\nfunction extractExpression(\n expression: SvelteNode | null | undefined,\n source: string,\n parseScriptFn: ScriptParseFn\n): void {\n if (!expression || expression.start == null || expression.end == null) {\n return\n }\n const content = source.slice(expression.start, expression.end)\n try {\n parseScriptFn(`(${content})`)\n } catch (e) {\n console.warn(\n `Failed to parse \"${content}\". Ignore this if content has no extractable message`,\n e\n )\n }\n}\n\nfunction getStringAttributeValue(value: SvelteNode): string {\n return value.data ?? value.raw ?? ''\n}\n\nfunction getAttributeExpression(\n attr: SvelteNode,\n source: string\n): string | undefined {\n if (attr.value === true || attr.value == null) {\n return undefined\n }\n\n if (!Array.isArray(attr.value)) {\n if (attr.value.type === 'ExpressionTag') {\n return source.slice(\n attr.value.expression.start,\n attr.value.expression.end\n )\n }\n return undefined\n }\n\n if (!attr.value.length) {\n return '\"\"'\n }\n\n if (attr.value.length === 1) {\n const [value] = attr.value\n if (value.type === 'ExpressionTag') {\n return source.slice(value.expression.start, value.expression.end)\n }\n return JSON.stringify(getStringAttributeValue(value))\n }\n\n let staticValue = ''\n for (const value of attr.value) {\n if (value.type === 'ExpressionTag') {\n return undefined\n }\n staticValue += getStringAttributeValue(value)\n }\n return JSON.stringify(staticValue)\n}\n\nfunction extractMessageComponent(\n node: SvelteNode,\n source: string,\n parseScriptFn: ScriptParseFn\n): void {\n if (typeof node.name !== 'string' || !isValidIdentifier(node.name)) {\n return\n }\n\n const props: string[] = []\n for (const attr of node.attributes || []) {\n if (\n attr.type !== 'Attribute' ||\n typeof attr.name !== 'string' ||\n !MESSAGE_DESCRIPTOR_PROPS.has(attr.name)\n ) {\n continue\n }\n\n const expression = getAttributeExpression(attr, source)\n if (expression != null) {\n props.push(`${attr.name}: ${expression}`)\n }\n }\n\n if (!props.length) {\n return\n }\n\n try {\n parseScriptFn(`${node.name}({${props.join(', ')}})`)\n } catch (e) {\n console.warn(\n `Failed to parse ${node.name} message component. Ignore this if component has no extractable message`,\n e\n )\n }\n}\n\nfunction walkNode(\n node: SvelteNode,\n source: string,\n parseScriptFn: ScriptParseFn\n): void {\n switch (node.type) {\n case 'ExpressionTag':\n extractExpression(node.expression, source, parseScriptFn)\n break\n\n case 'ConstTag':\n // {@const x = expr} — the declaration contains the expression\n if (node.declaration) {\n const content = source.slice(\n node.declaration.start,\n node.declaration.end\n )\n try {\n parseScriptFn(content)\n } catch (e) {\n console.warn(\n `Failed to parse const declaration. Ignore this if content has no extractable message`,\n e\n )\n }\n }\n break\n\n case 'IfBlock':\n extractExpression(node.test, source, parseScriptFn)\n walkFragment(node.consequent, source, parseScriptFn)\n walkFragment(node.alternate, source, parseScriptFn)\n break\n\n case 'EachBlock':\n extractExpression(node.expression, source, parseScriptFn)\n if (node.key) {\n extractExpression(node.key, source, parseScriptFn)\n }\n walkFragment(node.body, source, parseScriptFn)\n walkFragment(node.fallback, source, parseScriptFn)\n break\n\n case 'AwaitBlock':\n extractExpression(node.expression, source, parseScriptFn)\n walkFragment(node.pending, source, parseScriptFn)\n walkFragment(node.then, source, parseScriptFn)\n walkFragment(node.catch, source, parseScriptFn)\n break\n\n case 'KeyBlock':\n extractExpression(node.expression, source, parseScriptFn)\n walkFragment(node.fragment, source, parseScriptFn)\n break\n\n case 'SnippetBlock':\n walkFragment(node.body, source, parseScriptFn)\n break\n\n case 'RegularElement':\n case 'Component':\n case 'SvelteComponent':\n case 'SvelteElement':\n case 'SvelteHead':\n case 'SvelteBody':\n case 'SvelteWindow':\n case 'SvelteDocument':\n case 'SlotElement':\n case 'SvelteSelf':\n case 'SvelteFragment':\n if (node.type === 'Component') {\n extractMessageComponent(node, source, parseScriptFn)\n }\n // Process attributes\n if (node.attributes) {\n for (const attr of node.attributes) {\n if (attr.type === 'Attribute') {\n if (Array.isArray(attr.value)) {\n for (const v of attr.value) {\n if (v.type === 'ExpressionTag') {\n extractExpression(v.expression, source, parseScriptFn)\n }\n }\n } else if (\n typeof attr.value === 'object' &&\n attr.value !== null &&\n attr.value.type === 'ExpressionTag'\n ) {\n extractExpression(attr.value.expression, source, parseScriptFn)\n }\n } else if (attr.type === 'SpreadAttribute') {\n extractExpression(attr.expression, source, parseScriptFn)\n } else if (attr.expression) {\n // Directive nodes (OnDirective, BindDirective, etc.)\n extractExpression(attr.expression, source, parseScriptFn)\n }\n }\n }\n // Process children\n walkFragment(node.fragment, source, parseScriptFn)\n break\n }\n}\n\nexport function parseFile(\n source: string,\n filename: string,\n parseScriptFn: ScriptParseFn\n): void {\n const ast = parse(source, {modern: true, filename})\n\n // Walk the template fragment\n walkFragment(ast.fragment as unknown as SvelteNode, source, parseScriptFn)\n\n // Process <script> block\n if (ast.instance) {\n const program = ast.instance.content as unknown as SvelteNode\n parseScriptFn(source.slice(program.start, program.end))\n }\n\n // Process <script context=\"module\"> / <script module> block\n if (ast.module) {\n const program = ast.module.content as unknown as SvelteNode\n parseScriptFn(source.slice(program.start, program.end))\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"svelte_extractor-CDRPXblP.js","names":[],"sources":["../svelte_extractor.ts"],"sourcesContent":["import {parse} from 'svelte/compiler'\n\nexport type ScriptParseFn = (source: string) => void\n\ninterface SvelteNode {\n type: string\n start: number\n end: number\n [key: string]: any\n}\n\nfunction walkFragment(\n fragment: SvelteNode | null | undefined,\n source: string,\n parseScriptFn: ScriptParseFn\n): void {\n if (!fragment || !fragment.nodes) {\n return\n }\n for (const node of fragment.nodes) {\n walkNode(node, source, parseScriptFn)\n }\n}\n\nfunction extractExpression(\n expression: SvelteNode | null | undefined,\n source: string,\n parseScriptFn: ScriptParseFn\n): void {\n if (!expression || expression.start == null || expression.end == null) {\n return\n }\n const content = source.slice(expression.start, expression.end)\n try {\n parseScriptFn(`(${content})`)\n } catch (e) {\n console.warn(\n `Failed to parse \"${content}\". Ignore this if content has no extractable message`,\n e\n )\n }\n}\n\nfunction walkNode(\n node: SvelteNode,\n source: string,\n parseScriptFn: ScriptParseFn\n): void {\n switch (node.type) {\n case 'ExpressionTag':\n extractExpression(node.expression, source, parseScriptFn)\n break\n\n case 'ConstTag':\n // {@const x = expr} — the declaration contains the expression\n if (node.declaration) {\n const content = source.slice(\n node.declaration.start,\n node.declaration.end\n )\n try {\n parseScriptFn(content)\n } catch (e) {\n console.warn(\n `Failed to parse const declaration. Ignore this if content has no extractable message`,\n e\n )\n }\n }\n break\n\n case 'IfBlock':\n extractExpression(node.test, source, parseScriptFn)\n walkFragment(node.consequent, source, parseScriptFn)\n walkFragment(node.alternate, source, parseScriptFn)\n break\n\n case 'EachBlock':\n extractExpression(node.expression, source, parseScriptFn)\n if (node.key) {\n extractExpression(node.key, source, parseScriptFn)\n }\n walkFragment(node.body, source, parseScriptFn)\n walkFragment(node.fallback, source, parseScriptFn)\n break\n\n case 'AwaitBlock':\n extractExpression(node.expression, source, parseScriptFn)\n walkFragment(node.pending, source, parseScriptFn)\n walkFragment(node.then, source, parseScriptFn)\n walkFragment(node.catch, source, parseScriptFn)\n break\n\n case 'KeyBlock':\n extractExpression(node.expression, source, parseScriptFn)\n walkFragment(node.fragment, source, parseScriptFn)\n break\n\n case 'SnippetBlock':\n walkFragment(node.body, source, parseScriptFn)\n break\n\n case 'RegularElement':\n case 'Component':\n case 'SvelteComponent':\n case 'SvelteElement':\n case 'SvelteHead':\n case 'SvelteBody':\n case 'SvelteWindow':\n case 'SvelteDocument':\n case 'SlotElement':\n case 'SvelteSelf':\n case 'SvelteFragment':\n // Process attributes\n if (node.attributes) {\n for (const attr of node.attributes) {\n if (attr.type === 'Attribute') {\n if (Array.isArray(attr.value)) {\n for (const v of attr.value) {\n if (v.type === 'ExpressionTag') {\n extractExpression(v.expression, source, parseScriptFn)\n }\n }\n } else if (\n typeof attr.value === 'object' &&\n attr.value !== null &&\n attr.value.type === 'ExpressionTag'\n ) {\n extractExpression(attr.value.expression, source, parseScriptFn)\n }\n } else if (attr.type === 'SpreadAttribute') {\n extractExpression(attr.expression, source, parseScriptFn)\n } else if (attr.expression) {\n // Directive nodes (OnDirective, BindDirective, etc.)\n extractExpression(attr.expression, source, parseScriptFn)\n }\n }\n }\n // Process children\n walkFragment(node.fragment, source, parseScriptFn)\n break\n }\n}\n\nexport function parseFile(\n source: string,\n filename: string,\n parseScriptFn: ScriptParseFn\n): void {\n const ast = parse(source, {modern: true, filename})\n\n // Walk the template fragment\n walkFragment(ast.fragment as unknown as SvelteNode, source, parseScriptFn)\n\n // Process <script> block\n if (ast.instance) {\n const program = ast.instance.content as unknown as SvelteNode\n parseScriptFn(source.slice(program.start, program.end))\n }\n\n // Process <script context=\"module\"> / <script module> block\n if (ast.module) {\n const program = ast.module.content as unknown as SvelteNode\n parseScriptFn(source.slice(program.start, program.end))\n }\n}\n"],"mappings":"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"}
|