@formatjs/cli-lib 9.0.4 → 9.0.5
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/{gts_extractor-LLrMyDFh.js → gts_extractor-DBQky2Xr.js} +3 -4
- package/gts_extractor-DBQky2Xr.js.map +1 -0
- package/hbs_extractor-OLNU6TfH.js.map +1 -1
- package/index.d.ts +33 -6
- package/index.js +153 -90
- package/index.js.map +1 -1
- package/package.json +8 -10
- package/{svelte_extractor-DDQhqn4P.js → svelte_extractor-Csb4fR2L.js} +9 -9
- package/svelte_extractor-Csb4fR2L.js.map +1 -0
- package/{vue_extractor-DFGbWp6f.js → vue_extractor-C6UQIcDj.js} +5 -5
- package/vue_extractor-C6UQIcDj.js.map +1 -0
- package/gts_extractor-LLrMyDFh.js.map +0 -1
- package/parse_script-B0J5TKud.js +0 -93
- package/parse_script-B0J5TKud.js.map +0 -1
- package/svelte_extractor-DDQhqn4P.js.map +0 -1
- package/vue_extractor-DFGbWp6f.js.map +0 -1
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import { t as parseScript } from "./parse_script-B0J5TKud.js";
|
|
2
1
|
import { parseFile as parseFile$1 } from "./hbs_extractor-OLNU6TfH.js";
|
|
3
2
|
import { Preprocessor } from "content-tag";
|
|
4
3
|
//#region packages/cli-lib/gts_extractor.ts
|
|
5
4
|
let p = new Preprocessor();
|
|
6
|
-
function parseFile(source, fileName, options) {
|
|
7
|
-
|
|
5
|
+
function parseFile(source, fileName, options, parseScriptFn) {
|
|
6
|
+
parseScriptFn(p.process(source, { filename: fileName }).code);
|
|
8
7
|
const parseResult = p.parse(source, { filename: fileName });
|
|
9
8
|
for (let parsed of parseResult) parseFile$1(parsed.contents, fileName, options);
|
|
10
9
|
}
|
|
11
10
|
//#endregion
|
|
12
11
|
export { parseFile };
|
|
13
12
|
|
|
14
|
-
//# sourceMappingURL=gts_extractor-
|
|
13
|
+
//# sourceMappingURL=gts_extractor-DBQky2Xr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gts_extractor-DBQky2Xr.js","names":[],"sources":["../gts_extractor.ts"],"sourcesContent":["import {Preprocessor} from 'content-tag'\nimport {parseFile as parseHbsFile} from '#packages/cli-lib/hbs_extractor.js'\nimport {type ScriptParseFn} from '#packages/cli-lib/svelte_extractor.js'\nlet p = new Preprocessor()\n\nexport function parseFile(\n source: string,\n fileName: string,\n options: any,\n parseScriptFn: ScriptParseFn\n): void {\n const transformedSource = p.process(source, {filename: fileName})\n\n parseScriptFn(transformedSource.code)\n\n // extract template from transformed source to then run through hbs processor\n const parseResult = p.parse(source, {filename: fileName})\n\n for (let parsed of parseResult) {\n parseHbsFile(parsed.contents, fileName, options)\n }\n}\n"],"mappings":";;;AAGA,IAAI,IAAI,IAAI,aAAa;AAEzB,SAAgB,UACd,QACA,UACA,SACA,eACM;CAGN,cAF0B,EAAE,QAAQ,QAAQ,EAAC,UAAU,SAAQ,CAEjC,CAAC,CAAC,IAAI;CAGpC,MAAM,cAAc,EAAE,MAAM,QAAQ,EAAC,UAAU,SAAQ,CAAC;CAExD,KAAK,IAAI,UAAU,aACjB,YAAa,OAAO,UAAU,UAAU,OAAO;AAEnD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hbs_extractor-OLNU6TfH.js","names":[],"sources":["../hbs_extractor.ts"],"sourcesContent":["import {type
|
|
1
|
+
{"version":3,"file":"hbs_extractor-OLNU6TfH.js","names":[],"sources":["../hbs_extractor.ts"],"sourcesContent":["import {type ExtractTransformOptions} from '#packages/cli-lib/types.js'\nimport {preprocess, traverse, type AST, type ASTv1} from '@glimmer/syntax'\n\nfunction extractText(\n node: AST.MustacheStatement | AST.SubExpression,\n fileName: string,\n options: ExtractTransformOptions\n) {\n if (!options.onMsgExtracted) return\n if (!options.overrideIdFn) return\n\n if (node.path.type !== 'PathExpression') return\n\n if (['format-message', 'formatMessage'].includes(node.path.original)) {\n let [first, second] = node.params\n\n if (first.type !== 'StringLiteral') return\n\n let message = first?.value\n\n let desc: string | undefined\n if (second?.type === 'StringLiteral') {\n desc = second.value?.trim().replace(/\\s+/gm, ' ')\n }\n\n let defaultMessage = message?.trim().replace(/\\s+/gm, ' ')\n\n let id =\n typeof options.overrideIdFn === 'string'\n ? options.overrideIdFn\n : options.overrideIdFn(undefined, defaultMessage, desc, fileName)\n\n options.onMsgExtracted(fileName, [\n {\n id: id,\n defaultMessage: defaultMessage,\n description: desc,\n },\n ])\n }\n}\n\nexport function parseFile(\n source: string,\n fileName: string,\n options: any\n): void {\n const ast = preprocess(source)\n traverse(ast, {\n MustacheStatement(node: ASTv1.MustacheStatement) {\n extractText(node, fileName, options)\n },\n SubExpression(node: ASTv1.SubExpression) {\n extractText(node, fileName, options)\n },\n })\n}\n"],"mappings":";;AAGA,SAAS,YACP,MACA,UACA,SACA;CACA,IAAI,CAAC,QAAQ,gBAAgB;CAC7B,IAAI,CAAC,QAAQ,cAAc;CAE3B,IAAI,KAAK,KAAK,SAAS,kBAAkB;CAEzC,IAAI,CAAC,kBAAkB,eAAe,CAAC,CAAC,SAAS,KAAK,KAAK,QAAQ,GAAG;EACpE,IAAI,CAAC,OAAO,UAAU,KAAK;EAE3B,IAAI,MAAM,SAAS,iBAAiB;EAEpC,IAAI,UAAU,OAAO;EAErB,IAAI;EACJ,IAAI,QAAQ,SAAS,iBACnB,OAAO,OAAO,OAAO,KAAK,CAAC,CAAC,QAAQ,SAAS,GAAG;EAGlD,IAAI,iBAAiB,SAAS,KAAK,CAAC,CAAC,QAAQ,SAAS,GAAG;EAEzD,IAAI,KACF,OAAO,QAAQ,iBAAiB,WAC5B,QAAQ,eACR,QAAQ,aAAa,KAAA,GAAW,gBAAgB,MAAM,QAAQ;EAEpE,QAAQ,eAAe,UAAU,CAC/B;GACM;GACY;GAChB,aAAa;EACf,CACF,CAAC;CACH;AACF;AAEA,SAAgB,UACd,QACA,UACA,SACM;CACN,MAAM,MAAM,WAAW,MAAM;CAC7B,SAAS,KAAK;EACZ,kBAAkB,MAA+B;GAC/C,YAAY,MAAM,UAAU,OAAO;EACrC;EACA,cAAc,MAA2B;GACvC,YAAY,MAAM,UAAU,OAAO;EACrC;CACF,CAAC;AACH"}
|
package/index.d.ts
CHANGED
|
@@ -1,9 +1,36 @@
|
|
|
1
|
-
import { MessageDescriptor, MessageDescriptor as MessageDescriptor$1, Opts as Opts$1 } from "@formatjs/ts-transformer";
|
|
2
1
|
import { Comparator, Comparator as Comparator$1 } from "json-stable-stringify";
|
|
2
|
+
//#region packages/cli-lib/types.d.ts
|
|
3
|
+
interface MessageDescriptor {
|
|
4
|
+
id: string;
|
|
5
|
+
description?: string | object;
|
|
6
|
+
defaultMessage?: string;
|
|
7
|
+
file?: string;
|
|
8
|
+
start?: number;
|
|
9
|
+
end?: number;
|
|
10
|
+
}
|
|
11
|
+
type MessageExtractor = (filePath: string, messages: MessageDescriptor[]) => void;
|
|
12
|
+
type MetaExtractor = (filePath: string, meta: Record<string, string>) => void;
|
|
13
|
+
type OverrideIdFn = (id?: string, defaultMessage?: string, description?: string | object, filePath?: string) => string;
|
|
14
|
+
interface ExtractTransformOptions {
|
|
15
|
+
pragma?: string;
|
|
16
|
+
extractSourceLocation?: boolean;
|
|
17
|
+
removeDefaultMessage?: boolean;
|
|
18
|
+
additionalComponentNames?: string[];
|
|
19
|
+
additionalFunctionNames?: string[];
|
|
20
|
+
onMsgExtracted?: MessageExtractor;
|
|
21
|
+
onMetaExtracted?: MetaExtractor;
|
|
22
|
+
overrideIdFn?: OverrideIdFn | string;
|
|
23
|
+
ast?: boolean;
|
|
24
|
+
preserveWhitespace?: boolean;
|
|
25
|
+
flatten?: boolean;
|
|
26
|
+
throws?: boolean;
|
|
27
|
+
onMsgError?: (filePath: string, error: Error) => void;
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
3
30
|
//#region packages/cli-lib/formatters/default.d.ts
|
|
4
|
-
type FormatFn<T = Record<string, MessageDescriptor
|
|
5
|
-
type CompileFn<T = Record<string, MessageDescriptor
|
|
6
|
-
type SerializeFn<T = Record<string, MessageDescriptor
|
|
31
|
+
type FormatFn<T = Record<string, MessageDescriptor>> = (msgs: Record<string, MessageDescriptor>) => T;
|
|
32
|
+
type CompileFn<T = Record<string, MessageDescriptor>> = (msgs: T) => Record<string, string>;
|
|
33
|
+
type SerializeFn<T = Record<string, MessageDescriptor>> = (msgs: T) => string;
|
|
7
34
|
//#endregion
|
|
8
35
|
//#region packages/cli-lib/formatters/index.d.ts
|
|
9
36
|
interface Formatter<T> {
|
|
@@ -33,7 +60,7 @@ type ExtractCLIOptions = Omit<ExtractOpts, "overrideIdFn" | "onMsgExtracted" | "
|
|
|
33
60
|
*/
|
|
34
61
|
followLinks?: boolean;
|
|
35
62
|
};
|
|
36
|
-
type ExtractOpts =
|
|
63
|
+
type ExtractOpts = ExtractTransformOptions & {
|
|
37
64
|
/**
|
|
38
65
|
* Whether to throw an error if we had any issues with
|
|
39
66
|
* 1 of the source files
|
|
@@ -59,7 +86,7 @@ type ExtractOpts = Opts$1 & {
|
|
|
59
86
|
* An AbortSignal to cancel the extraction
|
|
60
87
|
*/
|
|
61
88
|
signal?: AbortSignal;
|
|
62
|
-
}
|
|
89
|
+
};
|
|
63
90
|
/**
|
|
64
91
|
* Extract strings from source files
|
|
65
92
|
* @param files list of files
|
package/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { a as writeStdout, i as warn, n as debug, r as getStdinAsString, t as parseScript } from "./parse_script-B0J5TKud.js";
|
|
2
|
-
import { interpolateName } from "@formatjs/ts-transformer";
|
|
3
|
-
import { existsSync } from "fs";
|
|
4
1
|
import { outputFile } from "fs-extra/esm";
|
|
2
|
+
import { clearLine, cursorTo } from "readline";
|
|
3
|
+
import { format, promisify, styleText } from "node:util";
|
|
5
4
|
import * as stringifyNs from "json-stable-stringify";
|
|
6
5
|
import { extname, resolve } from "path";
|
|
7
6
|
import { pathToFileURL } from "url";
|
|
8
7
|
import { createRequire } from "module";
|
|
8
|
+
import { resolve as resolve$1 } from "node:path";
|
|
9
9
|
import { readFile } from "fs/promises";
|
|
10
10
|
import glob from "fast-glob";
|
|
11
11
|
//#region \0rolldown/runtime.js
|
|
@@ -20,12 +20,60 @@ var __exportAll = (all, no_symbols) => {
|
|
|
20
20
|
return target;
|
|
21
21
|
};
|
|
22
22
|
//#endregion
|
|
23
|
+
//#region packages/cli-lib/console_utils.ts
|
|
24
|
+
const CLEAR_WHOLE_LINE = 0;
|
|
25
|
+
const writeStderr = promisify(process.stderr.write).bind(process.stderr);
|
|
26
|
+
const writeStdout = promisify(process.stdout.write).bind(process.stdout);
|
|
27
|
+
async function clearLine$1(terminal) {
|
|
28
|
+
if (!terminal.hasColors?.()) {
|
|
29
|
+
if (terminal.isTTY) {
|
|
30
|
+
if (terminal.columns > 0) await writeStderr(`\r${" ".repeat(terminal.columns - 1)}`);
|
|
31
|
+
await writeStderr(`\r`);
|
|
32
|
+
}
|
|
33
|
+
} else {
|
|
34
|
+
clearLine(terminal, CLEAR_WHOLE_LINE);
|
|
35
|
+
cursorTo(terminal, 0, void 0);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const LEVEL_COLORS = {
|
|
39
|
+
debug: "green",
|
|
40
|
+
warn: "yellow",
|
|
41
|
+
error: "red"
|
|
42
|
+
};
|
|
43
|
+
function label(level, message) {
|
|
44
|
+
return `[@formatjs/cli] [${styleText(LEVEL_COLORS[level], level.toUpperCase())}] ${message}`;
|
|
45
|
+
}
|
|
46
|
+
async function debug(message, ...args) {
|
|
47
|
+
if (process.env.LOG_LEVEL !== "debug") return;
|
|
48
|
+
await clearLine$1(process.stderr);
|
|
49
|
+
await writeStderr(format(label("debug", message), ...args));
|
|
50
|
+
await writeStderr("\n");
|
|
51
|
+
}
|
|
52
|
+
async function warn(message, ...args) {
|
|
53
|
+
await clearLine$1(process.stderr);
|
|
54
|
+
await writeStderr(format(label("warn", message), ...args));
|
|
55
|
+
await writeStderr("\n");
|
|
56
|
+
}
|
|
57
|
+
function getStdinAsString() {
|
|
58
|
+
let result = "";
|
|
59
|
+
return new Promise((resolve) => {
|
|
60
|
+
process.stdin.setEncoding("utf-8");
|
|
61
|
+
process.stdin.on("readable", () => {
|
|
62
|
+
let chunk;
|
|
63
|
+
while (chunk = process.stdin.read()) result += chunk;
|
|
64
|
+
});
|
|
65
|
+
process.stdin.on("end", () => {
|
|
66
|
+
resolve(result);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//#endregion
|
|
23
71
|
//#region packages/cli-lib/formatters/crowdin.ts
|
|
24
72
|
var crowdin_exports = /* @__PURE__ */ __exportAll({
|
|
25
73
|
compile: () => compile$6,
|
|
26
|
-
format: () => format$
|
|
74
|
+
format: () => format$6
|
|
27
75
|
});
|
|
28
|
-
const format$
|
|
76
|
+
const format$6 = (msgs) => {
|
|
29
77
|
const results = {};
|
|
30
78
|
for (const [id, msg] of Object.entries(msgs)) results[id] = {
|
|
31
79
|
message: msg.defaultMessage,
|
|
@@ -45,9 +93,9 @@ const compile$6 = (msgs) => {
|
|
|
45
93
|
//#region packages/cli-lib/formatters/default.ts
|
|
46
94
|
var default_exports = /* @__PURE__ */ __exportAll({
|
|
47
95
|
compile: () => compile$5,
|
|
48
|
-
format: () => format$
|
|
96
|
+
format: () => format$5
|
|
49
97
|
});
|
|
50
|
-
const format$
|
|
98
|
+
const format$5 = (msgs) => msgs;
|
|
51
99
|
const compile$5 = (msgs) => {
|
|
52
100
|
const results = {};
|
|
53
101
|
for (const k in msgs) results[k] = msgs[k].defaultMessage;
|
|
@@ -57,9 +105,9 @@ const compile$5 = (msgs) => {
|
|
|
57
105
|
//#region packages/cli-lib/formatters/lokalise.ts
|
|
58
106
|
var lokalise_exports = /* @__PURE__ */ __exportAll({
|
|
59
107
|
compile: () => compile$4,
|
|
60
|
-
format: () => format$
|
|
108
|
+
format: () => format$4
|
|
61
109
|
});
|
|
62
|
-
const format$
|
|
110
|
+
const format$4 = (msgs) => {
|
|
63
111
|
const results = {};
|
|
64
112
|
for (const [id, msg] of Object.entries(msgs)) results[id] = {
|
|
65
113
|
translation: msg.defaultMessage,
|
|
@@ -76,9 +124,9 @@ const compile$4 = (msgs) => {
|
|
|
76
124
|
//#region packages/cli-lib/formatters/simple.ts
|
|
77
125
|
var simple_exports = /* @__PURE__ */ __exportAll({
|
|
78
126
|
compile: () => compile$3,
|
|
79
|
-
format: () => format$
|
|
127
|
+
format: () => format$3
|
|
80
128
|
});
|
|
81
|
-
const format$
|
|
129
|
+
const format$3 = (msgs) => {
|
|
82
130
|
return Object.keys(msgs).reduce((all, k) => {
|
|
83
131
|
all[k] = msgs[k].defaultMessage;
|
|
84
132
|
return all;
|
|
@@ -90,9 +138,9 @@ const compile$3 = (msgs) => msgs;
|
|
|
90
138
|
var smartling_exports = /* @__PURE__ */ __exportAll({
|
|
91
139
|
compareMessages: () => compareMessages,
|
|
92
140
|
compile: () => compile$2,
|
|
93
|
-
format: () => format$
|
|
141
|
+
format: () => format$2
|
|
94
142
|
});
|
|
95
|
-
const format$
|
|
143
|
+
const format$2 = (msgs) => {
|
|
96
144
|
const results = { smartling: {
|
|
97
145
|
translate_paths: [{
|
|
98
146
|
path: "*/message",
|
|
@@ -125,9 +173,9 @@ const compile$2 = (msgs) => {
|
|
|
125
173
|
//#region packages/cli-lib/formatters/transifex.ts
|
|
126
174
|
var transifex_exports = /* @__PURE__ */ __exportAll({
|
|
127
175
|
compile: () => compile$1,
|
|
128
|
-
format: () => format
|
|
176
|
+
format: () => format$1
|
|
129
177
|
});
|
|
130
|
-
const format = (msgs) => {
|
|
178
|
+
const format$1 = (msgs) => {
|
|
131
179
|
const results = {};
|
|
132
180
|
for (const [id, msg] of Object.entries(msgs)) results[id] = {
|
|
133
181
|
string: msg.defaultMessage,
|
|
@@ -191,7 +239,7 @@ function loadNative() {
|
|
|
191
239
|
const overridePath = process.env.FORMATJS_CLI_LIB_NATIVE_PATH;
|
|
192
240
|
const packageCandidates = getNativePackageCandidates();
|
|
193
241
|
const installedPackageCandidates = getInstalledNativePackageCandidates(packageCandidates);
|
|
194
|
-
const candidates = [overridePath, ...installedPackageCandidates.length ? installedPackageCandidates : packageCandidates].filter(Boolean);
|
|
242
|
+
const candidates = [overridePath ? resolve$1(overridePath) : void 0, ...installedPackageCandidates.length ? installedPackageCandidates : packageCandidates].filter(Boolean);
|
|
195
243
|
const loadErrors = [];
|
|
196
244
|
for (const candidate of candidates) try {
|
|
197
245
|
nativeBinding = require$1(candidate);
|
|
@@ -220,41 +268,20 @@ function compileMessagesWithNative(messages, opts = {}) {
|
|
|
220
268
|
skipErrors: opts.skipErrors
|
|
221
269
|
});
|
|
222
270
|
}
|
|
223
|
-
function
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
followLinks: opts.followLinks,
|
|
230
|
-
format: opts.format,
|
|
231
|
-
idInterpolationPattern: opts.idInterpolationPattern,
|
|
232
|
-
ignore: opts.ignore,
|
|
233
|
-
inFile: opts.inFile,
|
|
234
|
-
pragma: opts.pragma,
|
|
235
|
-
preserveWhitespace: opts.preserveWhitespace,
|
|
236
|
-
throws: opts.throws
|
|
237
|
-
});
|
|
271
|
+
function extractSourcesWithNative(sources, opts = {}, generateIds = true) {
|
|
272
|
+
const native = loadNative();
|
|
273
|
+
return JSON.parse(native.extractSources(sources, opts, generateIds));
|
|
274
|
+
}
|
|
275
|
+
function generateIdWithNative(pattern, defaultMessage, description, filename) {
|
|
276
|
+
return loadNative().generateId(pattern, defaultMessage, description === void 0 ? void 0 : JSON.stringify(description), filename);
|
|
238
277
|
}
|
|
239
278
|
//#endregion
|
|
240
279
|
//#region packages/cli-lib/extract.ts
|
|
241
280
|
const stringify$1 = stringifyNs.default || stringifyNs;
|
|
242
|
-
const
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
"smartling",
|
|
247
|
-
"lokalise",
|
|
248
|
-
"crowdin"
|
|
249
|
-
]);
|
|
250
|
-
const NATIVE_SUPPORTED_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
251
|
-
".cjs",
|
|
252
|
-
".js",
|
|
253
|
-
".jsx",
|
|
254
|
-
".mjs",
|
|
255
|
-
".ts",
|
|
256
|
-
".tsx"
|
|
257
|
-
]);
|
|
281
|
+
const DEFAULT_ID_INTERPOLATION_PATTERN = "[sha1:contenthash:base64:6]";
|
|
282
|
+
function byteOffsetToStringOffset(text, offset) {
|
|
283
|
+
return Buffer.from(text).subarray(0, offset).toString().length;
|
|
284
|
+
}
|
|
258
285
|
function calculateLineColFromOffset(text, start) {
|
|
259
286
|
if (!start) return {
|
|
260
287
|
line: 1,
|
|
@@ -267,63 +294,107 @@ function calculateLineColFromOffset(text, start) {
|
|
|
267
294
|
col: lastLine.length
|
|
268
295
|
};
|
|
269
296
|
}
|
|
270
|
-
function
|
|
271
|
-
|
|
297
|
+
function nativeScriptFilename(filename) {
|
|
298
|
+
const extension = extname(filename).toLowerCase();
|
|
299
|
+
if ([
|
|
300
|
+
".cjs",
|
|
301
|
+
".cts",
|
|
302
|
+
".js",
|
|
303
|
+
".jsx",
|
|
304
|
+
".mjs",
|
|
305
|
+
".mts",
|
|
306
|
+
".rs",
|
|
307
|
+
".ts",
|
|
308
|
+
".tsx"
|
|
309
|
+
].includes(extension)) return filename;
|
|
310
|
+
return `${filename}.tsx`;
|
|
272
311
|
}
|
|
273
|
-
function
|
|
274
|
-
|
|
312
|
+
function applyOverrideId(message, filename, overrideIdFn) {
|
|
313
|
+
const id = typeof overrideIdFn === "function" ? overrideIdFn(message.id, message.defaultMessage, message.description, filename) : message.id;
|
|
314
|
+
return {
|
|
315
|
+
...message,
|
|
316
|
+
id: id || ""
|
|
317
|
+
};
|
|
275
318
|
}
|
|
276
|
-
async function processFile(source, fn,
|
|
319
|
+
async function processFile(source, fn, opts) {
|
|
277
320
|
let messages = [];
|
|
278
321
|
let meta;
|
|
279
|
-
const
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
322
|
+
const idInterpolationPattern = typeof opts.overrideIdFn === "string" ? opts.overrideIdFn : opts.idInterpolationPattern || DEFAULT_ID_INTERPOLATION_PATTERN;
|
|
323
|
+
debug("Processing opts for %s: %s", fn, opts);
|
|
324
|
+
const collectMessages = (filePath, extracted) => {
|
|
325
|
+
messages = messages.concat(extracted);
|
|
326
|
+
opts.onMsgExtracted?.(filePath, extracted);
|
|
327
|
+
};
|
|
328
|
+
const scriptParseFn = (scriptSource, sourceOffset = 0, wrapperOffset = 0) => {
|
|
329
|
+
const file = extractSourcesWithNative([{
|
|
330
|
+
filename: nativeScriptFilename(fn),
|
|
331
|
+
source: scriptSource
|
|
332
|
+
}], {
|
|
333
|
+
additionalComponentNames: ["$formatMessage", ...opts.additionalComponentNames || []],
|
|
334
|
+
additionalFunctionNames: opts.additionalFunctionNames,
|
|
335
|
+
extractSourceLocation: opts.extractSourceLocation,
|
|
336
|
+
idInterpolationPattern,
|
|
337
|
+
pragma: opts.pragma,
|
|
338
|
+
preserveWhitespace: opts.preserveWhitespace,
|
|
339
|
+
flatten: opts.flatten,
|
|
340
|
+
throws: opts.throws
|
|
341
|
+
}, typeof opts.overrideIdFn !== "function").files[0];
|
|
342
|
+
if (!file) return;
|
|
343
|
+
if (file.meta) meta = {
|
|
344
|
+
...meta,
|
|
345
|
+
...file.meta
|
|
346
|
+
};
|
|
347
|
+
for (const error of file.errors || []) opts.onMsgError?.(fn, new Error(error));
|
|
348
|
+
let extracted = file.messages.map((message) => applyOverrideId(message, fn, opts.overrideIdFn));
|
|
349
|
+
if (opts.extractSourceLocation) extracted = extracted.map((message) => {
|
|
350
|
+
const start = message.start === void 0 ? void 0 : sourceOffset + Math.max(0, byteOffsetToStringOffset(scriptSource, message.start) - wrapperOffset);
|
|
351
|
+
const end = message.end === void 0 ? void 0 : sourceOffset + Math.max(0, byteOffsetToStringOffset(scriptSource, message.end) - wrapperOffset);
|
|
352
|
+
return {
|
|
353
|
+
...message,
|
|
354
|
+
file: fn,
|
|
355
|
+
start,
|
|
356
|
+
end,
|
|
357
|
+
...calculateLineColFromOffset(source, start)
|
|
358
|
+
};
|
|
359
|
+
});
|
|
360
|
+
collectMessages(fn, extracted);
|
|
296
361
|
};
|
|
297
|
-
|
|
362
|
+
const hbsOptions = {
|
|
298
363
|
...opts,
|
|
299
|
-
overrideIdFn: (id, defaultMessage, description,
|
|
364
|
+
overrideIdFn: typeof opts.overrideIdFn === "function" ? opts.overrideIdFn : (id, defaultMessage, description, filename) => id || generateIdWithNative(idInterpolationPattern, defaultMessage, description, filename),
|
|
365
|
+
onMsgExtracted: collectMessages,
|
|
366
|
+
onMetaExtracted(_filePath, extractedMeta) {
|
|
367
|
+
meta = {
|
|
368
|
+
...meta,
|
|
369
|
+
...extractedMeta
|
|
370
|
+
};
|
|
371
|
+
}
|
|
300
372
|
};
|
|
301
|
-
debug("Processing opts for %s: %s", fn, opts);
|
|
302
|
-
const scriptParseFn = parseScript(opts, fn);
|
|
303
373
|
if (fn.endsWith(".vue")) {
|
|
304
374
|
debug("Processing %s using vue extractor", fn);
|
|
305
|
-
const { parseFile } = await import("./vue_extractor-
|
|
375
|
+
const { parseFile } = await import("./vue_extractor-C6UQIcDj.js");
|
|
306
376
|
parseFile(source, fn, scriptParseFn);
|
|
307
377
|
} else if (fn.endsWith(".svelte")) {
|
|
308
378
|
debug("Processing %s using svelte extractor", fn);
|
|
309
|
-
const { parseFile } = await import("./svelte_extractor-
|
|
379
|
+
const { parseFile } = await import("./svelte_extractor-Csb4fR2L.js");
|
|
310
380
|
parseFile(source, fn, scriptParseFn);
|
|
311
381
|
} else if (fn.endsWith(".hbs")) {
|
|
312
382
|
debug("Processing %s using hbs extractor", fn);
|
|
313
383
|
const { parseFile } = await import("./hbs_extractor-OLNU6TfH.js");
|
|
314
|
-
parseFile(source, fn,
|
|
384
|
+
parseFile(source, fn, hbsOptions);
|
|
315
385
|
} else if (fn.endsWith(".gts") || fn.endsWith(".gjs")) {
|
|
316
386
|
debug("Processing %s as gts/gjs file", fn);
|
|
317
|
-
const { parseFile } = await import("./gts_extractor-
|
|
318
|
-
parseFile(source, fn,
|
|
387
|
+
const { parseFile } = await import("./gts_extractor-DBQky2Xr.js");
|
|
388
|
+
parseFile(source, fn, hbsOptions, scriptParseFn);
|
|
319
389
|
} else {
|
|
320
|
-
debug("Processing %s using
|
|
390
|
+
debug("Processing %s using native extractor", fn);
|
|
321
391
|
scriptParseFn(source);
|
|
322
392
|
}
|
|
323
393
|
debug("Done extracting %s messages: %s", fn, messages);
|
|
324
394
|
if (meta) {
|
|
325
395
|
debug("Extracted meta:", meta);
|
|
326
396
|
messages.forEach((m) => m.meta = meta);
|
|
397
|
+
opts.onMetaExtracted?.(fn, meta);
|
|
327
398
|
}
|
|
328
399
|
return {
|
|
329
400
|
messages,
|
|
@@ -342,24 +413,16 @@ async function extract(files, extractOpts) {
|
|
|
342
413
|
const shouldThrow = throws === true;
|
|
343
414
|
const optsWithThrows = {
|
|
344
415
|
...opts,
|
|
416
|
+
idInterpolationPattern: opts.idInterpolationPattern || DEFAULT_ID_INTERPOLATION_PATTERN,
|
|
345
417
|
throws: shouldThrow,
|
|
346
|
-
onMsgError: !shouldThrow ? (_, e) => warn(e.message) : void 0
|
|
418
|
+
onMsgError: !shouldThrow ? opts.onMsgError || ((_, e) => warn(e.message)) : void 0
|
|
347
419
|
};
|
|
348
|
-
if (!signal?.aborted && canExtractWithNative(files, opts, readFromStdin)) return extractWithNative(files, {
|
|
349
|
-
additionalComponentNames: ["$formatMessage", ...opts.additionalComponentNames || []],
|
|
350
|
-
additionalFunctionNames: opts.additionalFunctionNames,
|
|
351
|
-
flatten: opts.flatten,
|
|
352
|
-
format: typeof opts.format === "string" ? opts.format : void 0,
|
|
353
|
-
idInterpolationPattern: opts.idInterpolationPattern,
|
|
354
|
-
preserveWhitespace: opts.preserveWhitespace,
|
|
355
|
-
throws: shouldThrow
|
|
356
|
-
});
|
|
357
420
|
let rawResults = [];
|
|
358
421
|
try {
|
|
359
422
|
if (readFromStdin) {
|
|
360
423
|
debug(`Reading input from stdin`);
|
|
361
424
|
if (process.stdin.isTTY) warn("Reading source file from TTY.");
|
|
362
|
-
rawResults = [await processFile(await getStdinAsString(), "dummy", optsWithThrows)];
|
|
425
|
+
rawResults = [await processFile(await getStdinAsString(), "dummy.ts", optsWithThrows)];
|
|
363
426
|
} else if (!shouldThrow) rawResults = (await Promise.allSettled(files.map(async (fn) => {
|
|
364
427
|
debug("Extracting file:", fn);
|
|
365
428
|
return processFile(await readFile(fn, {
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["format","compile","format","compile","format","compile","format","compile","format","compile","compile","defaultFormatter","transifex","smartling","simple","lokalise","crowdin","require","stringify","BUILTIN_FORMATTERS","isBuiltinFormatter"],"sources":["../formatters/crowdin.ts","../formatters/default.ts","../formatters/lokalise.ts","../formatters/simple.ts","../formatters/smartling.ts","../formatters/transifex.ts","../formatters/index.ts","../native.ts","../extract.ts","../compile.ts"],"sourcesContent":["import {\n type CompileFn,\n type FormatFn,\n} from '#packages/cli-lib/formatters/default.js'\n\nexport type CrowdinJson = Record<\n string,\n {\n message: string\n description?: string\n }\n>\n\nexport const format: FormatFn<CrowdinJson> = msgs => {\n const results: CrowdinJson = {}\n for (const [id, msg] of Object.entries(msgs)) {\n results[id] = {\n message: msg.defaultMessage!,\n description:\n typeof msg.description === 'string'\n ? msg.description\n : JSON.stringify(msg.description),\n }\n }\n return results\n}\n\nexport const compile: CompileFn<CrowdinJson> = msgs => {\n const results: Record<string, string> = {}\n for (const [id, msg] of Object.entries(msgs)) {\n if (id === 'smartling') {\n continue\n }\n results[id] = msg.message\n }\n return results\n}\n","import {type MessageDescriptor} from '@formatjs/ts-transformer'\nexport type FormatFn<T = Record<string, MessageDescriptor>> = (\n msgs: Record<string, MessageDescriptor>\n) => T\n\nexport type CompileFn<T = Record<string, MessageDescriptor>> = (\n msgs: T\n) => Record<string, string>\n\nexport type SerializeFn<T = Record<string, MessageDescriptor>> = (\n msgs: T\n) => string\n\nexport const format: FormatFn = msgs => msgs\n\nexport const compile: CompileFn = msgs => {\n const results: Record<string, string> = {}\n for (const k in msgs) {\n results[k] = msgs[k].defaultMessage!\n }\n return results\n}\n","import {\n type CompileFn,\n type FormatFn,\n} from '#packages/cli-lib/formatters/default.js'\n\nexport type StructuredJson = Record<\n string,\n {\n translation: string\n notes?: string\n context?: string\n limit?: string\n }\n>\n\nexport const format: FormatFn<StructuredJson> = msgs => {\n const results: StructuredJson = {}\n for (const [id, msg] of Object.entries(msgs)) {\n results[id] = {\n translation: msg.defaultMessage!,\n notes:\n typeof msg.description === 'string'\n ? msg.description\n : JSON.stringify(msg.description),\n }\n }\n return results\n}\n\nexport const compile: CompileFn<StructuredJson> = msgs => {\n const results: Record<string, string> = {}\n for (const [id, msg] of Object.entries(msgs)) {\n results[id] = msg.translation\n }\n return results\n}\n","import {\n type CompileFn,\n type FormatFn,\n} from '#packages/cli-lib/formatters/default.js'\n\nexport type PhraseJson = Record<string, string>\n\nexport const format: FormatFn<PhraseJson> = msgs => {\n return Object.keys(msgs).reduce((all: PhraseJson, k) => {\n all[k] = msgs[k].defaultMessage!\n return all\n }, {})\n}\n\nexport const compile: CompileFn<PhraseJson> = msgs => msgs\n","import type {Comparator} from 'json-stable-stringify'\nimport {\n type CompileFn,\n type FormatFn,\n} from '#packages/cli-lib/formatters/default.js'\n\nexport interface SmartlingDirectives {\n translate_paths: [\n {\n path: string\n key: string\n instruction: string\n },\n ]\n variants_enabled: boolean\n string_format: string\n [k: string]: any\n}\n\nexport type SmartlingJson = {\n smartling: SmartlingDirectives\n} & Record<\n string,\n {\n message: string\n description?: string\n }\n>\n\nexport const format: FormatFn<SmartlingJson> = msgs => {\n const results: SmartlingJson = {\n smartling: {\n translate_paths: [\n {\n path: '*/message',\n key: '{*}/message',\n instruction: '*/description',\n },\n ],\n variants_enabled: true,\n string_format: 'icu',\n },\n } as any\n for (const [id, msg] of Object.entries(msgs)) {\n results[id] = {\n message: msg.defaultMessage!,\n description:\n typeof msg.description === 'string'\n ? msg.description\n : JSON.stringify(msg.description),\n }\n }\n return results\n}\n\nexport const compareMessages: Comparator = (el1, el2) => {\n // `smartling` has to be the 1st key\n if (el1.key === 'smartling') {\n return -1\n }\n if (el2.key === 'smartling') {\n return 1\n }\n return el1.key < el2.key ? -1 : el1.key === el2.key ? 0 : 1\n}\n\nexport const compile: CompileFn<SmartlingJson> = msgs => {\n const results: Record<string, string> = {}\n for (const [id, msg] of Object.entries(msgs)) {\n if (id === 'smartling') {\n continue\n }\n results[id] = msg.message\n }\n return results\n}\n","import {\n type CompileFn,\n type FormatFn,\n} from '#packages/cli-lib/formatters/default.js'\n\nexport type StructuredJson = Record<\n string,\n {\n string: string\n developer_comment?: string\n context?: string\n character_limit?: string\n }\n>\n\nexport const format: FormatFn<StructuredJson> = msgs => {\n const results: StructuredJson = {}\n for (const [id, msg] of Object.entries(msgs)) {\n results[id] = {\n string: msg.defaultMessage!,\n developer_comment:\n typeof msg.description === 'string'\n ? msg.description\n : JSON.stringify(msg.description),\n }\n }\n return results\n}\n\nexport const compile: CompileFn<StructuredJson> = msgs => {\n const results: Record<string, string> = {}\n for (const [id, msg] of Object.entries(msgs)) {\n results[id] = msg.string\n }\n return results\n}\n","import type {Comparator} from 'json-stable-stringify'\nimport {resolve} from 'path'\nimport {pathToFileURL} from 'url'\nimport * as crowdin from '#packages/cli-lib/formatters/crowdin.js'\nimport * as defaultFormatter from '#packages/cli-lib/formatters/default.js'\nimport {\n type CompileFn,\n type FormatFn,\n type SerializeFn,\n} from '#packages/cli-lib/formatters/default.js'\nimport * as lokalise from '#packages/cli-lib/formatters/lokalise.js'\nimport * as simple from '#packages/cli-lib/formatters/simple.js'\nimport * as smartling from '#packages/cli-lib/formatters/smartling.js'\nimport * as transifex from '#packages/cli-lib/formatters/transifex.js'\n\nexport interface Formatter<T> {\n serialize?: SerializeFn<T>\n format: FormatFn<T>\n compile: CompileFn<T>\n compareMessages?: Comparator\n}\n\nexport async function resolveBuiltinFormatter(\n format?: string | Formatter<unknown>\n): Promise<any> {\n if (!format) {\n return defaultFormatter\n }\n if (typeof format !== 'string') {\n return format\n }\n switch (format) {\n case 'transifex':\n return transifex\n case 'smartling':\n return smartling\n case 'simple':\n return simple\n case 'lokalise':\n return lokalise\n case 'crowdin':\n return crowdin\n }\n try {\n // eslint-disable-next-line import/dynamic-import-chunkname\n return import(pathToFileURL(resolve(process.cwd(), format)).href)\n } catch (e) {\n console.error(`Cannot resolve formatter ${format}`)\n throw e\n }\n}\n","import {createRequire} from 'module'\n\nconst require = createRequire(import.meta.url)\n\nconst NATIVE_PACKAGES: Record<string, string[]> = {\n 'darwin-arm64': ['@formatjs/cli-native-darwin-arm64'],\n 'linux-arm64': [\n '@formatjs/cli-native-linux-arm64',\n '@formatjs/cli-native-linux-arm64-musl',\n ],\n 'linux-x64': [\n '@formatjs/cli-native-linux-x64',\n '@formatjs/cli-native-linux-x64-musl',\n ],\n 'win32-x64': ['@formatjs/cli-native-win32-x64'],\n}\n\nexport interface NativeCompileOptions {\n ast?: boolean\n format?: string\n ignoreTag?: boolean\n pseudoLocale?: string\n skipErrors?: boolean\n followLinks?: boolean\n}\n\nexport interface NativeCompileMessage {\n id: string\n message: string\n sourceFile: string\n}\n\nexport interface NativeExtractOptions {\n additionalComponentNames?: string[]\n additionalFunctionNames?: string[]\n extractSourceLocation?: boolean\n flatten?: boolean\n followLinks?: boolean\n format?: string\n idInterpolationPattern?: string\n ignore?: string[]\n inFile?: string\n pragma?: string\n preserveWhitespace?: boolean\n throws?: boolean\n}\n\nexport interface NativeBinding {\n compile(inputFiles: string[], opts?: NativeCompileOptions): string\n compileMessages(\n messages: NativeCompileMessage[],\n opts?: NativeCompileOptions\n ): string\n extract(inputFiles: string[], opts?: NativeExtractOptions): string\n supportedBuiltinFormatters(): string[]\n}\n\nlet nativeBinding: NativeBinding | null | undefined\n\nexport function getInstalledNativePackageCandidates(\n candidates: readonly string[],\n canResolve = (candidate: string): boolean => {\n try {\n require.resolve(candidate)\n return true\n } catch {\n return false\n }\n }\n): string[] {\n return candidates.filter(canResolve)\n}\n\nexport function getNativePackageCandidates(\n platform: NodeJS.Platform = process.platform,\n arch: string = process.arch\n): string[] {\n const platformArch = `${platform}-${arch}`\n return NATIVE_PACKAGES[platformArch] || []\n}\n\nexport function loadNative(): NativeBinding {\n if (nativeBinding !== undefined) {\n if (nativeBinding) {\n return nativeBinding\n }\n throw new Error('Native @formatjs/cli-lib binding is unavailable')\n }\n\n const overridePath = process.env.FORMATJS_CLI_LIB_NATIVE_PATH\n const packageCandidates = getNativePackageCandidates()\n const installedPackageCandidates =\n getInstalledNativePackageCandidates(packageCandidates)\n const candidates = [\n overridePath,\n ...(installedPackageCandidates.length\n ? installedPackageCandidates\n : packageCandidates),\n ].filter(Boolean) as string[]\n const loadErrors: string[] = []\n\n for (const candidate of candidates) {\n try {\n nativeBinding = require(candidate) as NativeBinding\n return nativeBinding\n } catch (e) {\n loadErrors.push(`${candidate}: ${(e as Error).message}`)\n }\n }\n\n nativeBinding = null\n throw new Error(\n `Native @formatjs/cli-lib binding is unavailable.\\n${loadErrors.join('\\n')}`\n )\n}\n\nexport function compileWithNative(\n inputFiles: string[],\n opts: NativeCompileOptions = {}\n): string {\n const native = loadNative()\n return native.compile(inputFiles, {\n ast: opts.ast,\n format: opts.format,\n followLinks: opts.followLinks,\n ignoreTag: opts.ignoreTag,\n pseudoLocale: opts.pseudoLocale,\n skipErrors: opts.skipErrors,\n })\n}\n\nexport function compileMessagesWithNative(\n messages: NativeCompileMessage[],\n opts: NativeCompileOptions = {}\n): string {\n const native = loadNative()\n return native.compileMessages(messages, {\n ast: opts.ast,\n ignoreTag: opts.ignoreTag,\n pseudoLocale: opts.pseudoLocale,\n skipErrors: opts.skipErrors,\n })\n}\n\nexport function extractWithNative(\n inputFiles: readonly string[],\n opts: NativeExtractOptions = {}\n): string {\n const native = loadNative()\n return native.extract([...inputFiles], {\n additionalComponentNames: opts.additionalComponentNames,\n additionalFunctionNames: opts.additionalFunctionNames,\n extractSourceLocation: opts.extractSourceLocation,\n flatten: opts.flatten,\n followLinks: opts.followLinks,\n format: opts.format,\n idInterpolationPattern: opts.idInterpolationPattern,\n ignore: opts.ignore,\n inFile: opts.inFile,\n pragma: opts.pragma,\n preserveWhitespace: opts.preserveWhitespace,\n throws: opts.throws,\n })\n}\n","import {\n type MessageDescriptor,\n type Opts,\n interpolateName,\n} from '@formatjs/ts-transformer'\nimport {existsSync} from 'fs'\nimport {outputFile} from 'fs-extra/esm'\nimport {\n debug,\n getStdinAsString,\n warn,\n writeStdout,\n} from '#packages/cli-lib/console_utils.js'\nimport * as stringifyNs from 'json-stable-stringify'\nimport {extname} from 'path'\n\nimport {\n type Formatter,\n resolveBuiltinFormatter,\n} from '#packages/cli-lib/formatters/index.js'\nimport {extractWithNative} from '#packages/cli-lib/native.js'\nimport {parseScript} from '#packages/cli-lib/parse_script.js'\nimport {readFile} from 'fs/promises'\n\nconst stringify = (stringifyNs as any).default || stringifyNs\nconst BUILTIN_FORMATTERS = new Set([\n 'default',\n 'simple',\n 'transifex',\n 'smartling',\n 'lokalise',\n 'crowdin',\n])\nconst NATIVE_SUPPORTED_EXTENSIONS = new Set([\n '.cjs',\n '.js',\n '.jsx',\n '.mjs',\n '.ts',\n '.tsx',\n])\nexport interface ExtractionResult<M = Record<string, string>> {\n /**\n * List of extracted messages\n */\n messages: MessageDescriptor[]\n /**\n * Metadata extracted w/ `pragma`\n */\n meta?: M\n}\n\nexport interface ExtractedMessageDescriptor extends MessageDescriptor {\n /**\n * Line number\n */\n line?: number\n /**\n * Column number\n */\n col?: number\n /**\n * Metadata extracted from pragma\n */\n meta?: Record<string, string>\n}\n\nexport type ExtractCLIOptions = Omit<\n ExtractOpts,\n 'overrideIdFn' | 'onMsgExtracted' | 'onMetaExtracted'\n> & {\n /**\n * Output File\n */\n outFile?: string\n /**\n * Input File\n */\n inFile?: string\n /**\n * Ignore file glob pattern\n */\n ignore?: string[]\n /**\n * Whether to follow symbolic links when traversing directories.\n * Defaults to true for compatibility with pnpm symlinked node_modules.\n */\n followLinks?: boolean\n}\n\nexport type ExtractOpts = Opts & {\n /**\n * Whether to throw an error if we had any issues with\n * 1 of the source files\n */\n throws?: boolean\n /**\n * Message ID interpolation pattern\n */\n idInterpolationPattern?: string\n /**\n * Whether we read from stdin instead of a file\n */\n readFromStdin?: boolean\n /**\n * Either path to a formatter file that controls the shape of JSON file from `outFile` or {@link Formatter} object.\n */\n format?: string | Formatter<any>\n /**\n * Whether to hoist selectors & flatten sentences\n */\n flatten?: boolean\n /**\n * An AbortSignal to cancel the extraction\n */\n signal?: AbortSignal\n} & Pick<Opts, 'onMsgExtracted' | 'onMetaExtracted'>\n\nfunction calculateLineColFromOffset(\n text: string,\n start?: number\n): Pick<ExtractedMessageDescriptor, 'line' | 'col'> {\n if (!start) {\n return {line: 1, col: 1}\n }\n const chunk = text.slice(0, start)\n const lines = chunk.split('\\n')\n const lastLine = lines[lines.length - 1]\n return {line: lines.length, col: lastLine.length}\n}\n\nfunction isBuiltinFormatter(\n format: ExtractOpts['format']\n): format is string | undefined {\n return (\n !format || (typeof format === 'string' && BUILTIN_FORMATTERS.has(format))\n )\n}\n\nfunction canExtractWithNative(\n files: readonly string[],\n opts: Omit<ExtractOpts, 'readFromStdin' | 'signal' | 'throws'>,\n readFromStdin: boolean | undefined\n): boolean {\n return (\n !readFromStdin &&\n typeof opts.idInterpolationPattern === 'string' &&\n !opts.ast &&\n !opts.extractSourceLocation &&\n !opts.onMetaExtracted &&\n !opts.onMsgError &&\n !opts.onMsgExtracted &&\n !opts.overrideIdFn &&\n !opts.pragma &&\n !opts.removeDefaultMessage &&\n isBuiltinFormatter(opts.format) &&\n files.every(\n file =>\n existsSync(file) &&\n NATIVE_SUPPORTED_EXTENSIONS.has(extname(file).toLowerCase())\n )\n )\n}\n\nasync function processFile(\n source: string,\n fn: string,\n {idInterpolationPattern, ...opts}: Opts & {idInterpolationPattern?: string}\n) {\n let messages: ExtractedMessageDescriptor[] = []\n let meta: Record<string, string> | undefined\n\n const onMsgExtracted = opts.onMsgExtracted\n const onMetaExtracted = opts.onMetaExtracted\n\n opts = {\n ...opts,\n additionalComponentNames: [\n '$formatMessage',\n ...(opts.additionalComponentNames || []),\n ],\n onMsgExtracted(filePath, msgs) {\n if (opts.extractSourceLocation) {\n msgs = msgs.map(msg => ({\n ...msg,\n ...calculateLineColFromOffset(source, msg.start),\n }))\n }\n messages = messages.concat(msgs)\n\n if (onMsgExtracted) {\n onMsgExtracted(filePath, msgs)\n }\n },\n onMetaExtracted(filePath, m) {\n meta = m\n\n if (onMetaExtracted) {\n onMetaExtracted(filePath, m)\n }\n },\n }\n\n if (!opts.overrideIdFn && idInterpolationPattern) {\n opts = {\n ...opts,\n overrideIdFn: (id, defaultMessage, description, fileName) =>\n id ||\n interpolateName(\n {\n resourcePath: fileName,\n } as any,\n idInterpolationPattern,\n {\n content: description\n ? `${defaultMessage}#${\n typeof description === 'string'\n ? description\n : stringify(description)\n }`\n : defaultMessage,\n }\n ),\n }\n }\n\n debug('Processing opts for %s: %s', fn, opts)\n\n const scriptParseFn = parseScript(opts, fn)\n if (fn.endsWith('.vue')) {\n debug('Processing %s using vue extractor', fn)\n const {parseFile} = await import('./vue_extractor.js')\n parseFile(source, fn, scriptParseFn)\n } else if (fn.endsWith('.svelte')) {\n debug('Processing %s using svelte extractor', fn)\n const {parseFile} = await import('./svelte_extractor.js')\n parseFile(source, fn, scriptParseFn)\n } else if (fn.endsWith('.hbs')) {\n debug('Processing %s using hbs extractor', fn)\n const {parseFile} = await import('./hbs_extractor.js')\n parseFile(source, fn, opts)\n } else if (fn.endsWith('.gts') || fn.endsWith('.gjs')) {\n debug('Processing %s as gts/gjs file', fn)\n const {parseFile} = await import('./gts_extractor.js')\n parseFile(source, fn, opts)\n } else {\n debug('Processing %s using typescript extractor', fn)\n scriptParseFn(source)\n }\n debug('Done extracting %s messages: %s', fn, messages)\n if (meta) {\n debug('Extracted meta:', meta)\n messages.forEach(m => (m.meta = meta))\n }\n return {messages, meta}\n}\n\n/**\n * Extract strings from source files\n * @param files list of files\n * @param extractOpts extract options\n * @returns messages serialized as JSON string since key order\n * matters for some `format`\n */\nexport async function extract(\n files: readonly string[],\n extractOpts: ExtractOpts\n): Promise<string> {\n const {throws, readFromStdin, signal, ...opts} = extractOpts\n // When throws is not explicitly true, we want to collect partial results\n const shouldThrow = throws === true\n // Pass throws option to transformer for per-message error handling\n const optsWithThrows = {\n ...opts,\n throws: shouldThrow,\n onMsgError: !shouldThrow\n ? (_: string, e: Error) => warn(e.message)\n : undefined,\n }\n\n if (!signal?.aborted && canExtractWithNative(files, opts, readFromStdin)) {\n return extractWithNative(files, {\n additionalComponentNames: [\n '$formatMessage',\n ...(opts.additionalComponentNames || []),\n ],\n additionalFunctionNames: opts.additionalFunctionNames,\n flatten: opts.flatten,\n format: typeof opts.format === 'string' ? opts.format : undefined,\n idInterpolationPattern: opts.idInterpolationPattern,\n preserveWhitespace: opts.preserveWhitespace,\n throws: shouldThrow,\n })\n }\n\n let rawResults: Array<ExtractionResult | undefined> = []\n try {\n if (readFromStdin) {\n debug(`Reading input from stdin`)\n // Read from stdin\n if (process.stdin.isTTY) {\n warn('Reading source file from TTY.')\n }\n const stdinSource = await getStdinAsString()\n rawResults = [await processFile(stdinSource, 'dummy', optsWithThrows)]\n } else {\n // Use Promise.allSettled when throws is not explicitly true to collect partial results\n if (!shouldThrow) {\n const settledResults = await Promise.allSettled(\n files.map(async fn => {\n debug('Extracting file:', fn)\n const source = await readFile(fn, {encoding: 'utf8', signal})\n return processFile(source, fn, optsWithThrows)\n })\n )\n rawResults = settledResults.map(result => {\n if (result.status === 'fulfilled') {\n return result.value\n } else {\n warn(String(result.reason))\n return undefined\n }\n })\n } else {\n rawResults = await Promise.all(\n files.map(async fn => {\n debug('Extracting file:', fn)\n const source = await readFile(fn, {encoding: 'utf8', signal})\n return processFile(source, fn, optsWithThrows)\n })\n )\n }\n }\n } catch (e) {\n if (shouldThrow) {\n throw e\n } else {\n warn(String(e))\n }\n }\n\n const formatter: Formatter<unknown> = await resolveBuiltinFormatter(\n opts.format\n )\n const extractionResults = rawResults.filter((r): r is ExtractionResult => !!r)\n\n const extractedMessages = new Map<string, MessageDescriptor>()\n\n for (const {messages} of extractionResults) {\n for (const message of messages) {\n const {id, description, defaultMessage} = message\n if (!id) {\n const error = new Error(\n `[FormatJS CLI] Missing message id for message:\n${JSON.stringify(message, undefined, 2)}`\n )\n if (throws) {\n throw error\n } else {\n warn(error.message)\n }\n continue\n }\n\n if (extractedMessages.has(id)) {\n const existing = extractedMessages.get(id)!\n if (\n stringify(description) !== stringify(existing.description) ||\n defaultMessage !== existing.defaultMessage\n ) {\n const error = new Error(\n `[FormatJS CLI] Duplicate message id: \"${id}\", ` +\n 'but the `description` and/or `defaultMessage` are different.'\n )\n if (throws) {\n throw error\n } else {\n warn(error.message)\n }\n }\n }\n extractedMessages.set(id, message)\n }\n }\n const results: Record<string, Omit<MessageDescriptor, 'id'>> = {}\n const messages = Array.from(extractedMessages.values())\n for (const {id, ...msg} of messages) {\n // GH #3537: flatten is now applied during extraction in the babel plugin,\n // so we don't need to apply it again here. The messages are already flattened.\n results[id] = msg\n }\n if (typeof formatter.serialize === 'function') {\n return formatter.serialize(formatter.format(results as any))\n }\n return (\n stringify(formatter.format(results as any), {\n space: 2,\n cmp: formatter.compareMessages || undefined,\n }) ?? ''\n )\n}\n\n/**\n * Extract strings from source files, also writes to a file.\n * @param files list of files\n * @param extractOpts extract options\n * @returns A Promise that resolves if output file was written successfully\n */\nexport default async function extractAndWrite(\n files: readonly string[],\n extractOpts: ExtractCLIOptions\n): Promise<void> {\n const {outFile, ...opts} = extractOpts\n const serializedResult = (await extract(files, opts)) + '\\n'\n if (outFile) {\n debug('Writing output file:', outFile)\n return outputFile(outFile, serializedResult)\n }\n await writeStdout(serializedResult)\n}\n","import {outputFile} from 'fs-extra/esm'\nimport {readFile} from 'fs/promises'\nimport glob from 'fast-glob'\nimport * as stringifyNs from 'json-stable-stringify'\nimport {resolve} from 'path'\nimport {pathToFileURL} from 'url'\nimport {debug, warn, writeStdout} from '#packages/cli-lib/console_utils.js'\nimport {type Formatter} from '#packages/cli-lib/formatters/index.js'\nimport {\n type NativeCompileMessage,\n compileMessagesWithNative,\n compileWithNative,\n} from '#packages/cli-lib/native.js'\n\nconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n specifier: string\n) => Promise<Formatter<unknown>>\nconst globSync = glob.sync\nconst stringify = (stringifyNs as any).default || stringifyNs\nconst CUSTOM_FORMATTER_FILE_DEPRECATION_WARNING =\n 'Passing a custom formatter file to --format during compilation is deprecated and will be removed in a future release. Prefer a built-in formatter name or pre-process translation files before running formatjs compile.'\n\nconst BUILTIN_FORMATTERS = new Set([\n 'default',\n 'simple',\n 'transifex',\n 'smartling',\n 'lokalise',\n 'crowdin',\n])\n\nexport type PseudoLocale = 'xx-LS' | 'xx-AC' | 'xx-HA' | 'en-XA' | 'en-XB'\n\nexport interface CompileCLIOpts extends Opts {\n /**\n * The target file that contains compiled messages.\n */\n outFile?: string\n}\n\nexport interface Opts {\n /**\n * Whether to compile message into AST instead of just string\n */\n ast?: boolean\n /**\n * Whether to continue compiling messages after encountering an error.\n * Any keys with errors will not be included in the output file.\n */\n skipErrors?: boolean\n /**\n * Built-in formatter name or path to a formatter file that converts\n * <translation_files> to `Record<string, string>` so we can compile.\n * Formatter file paths are deprecated for compilation.\n */\n format?: string | Formatter<unknown>\n /**\n * Whether to compile to pseudo locale\n */\n pseudoLocale?: PseudoLocale\n /**\n * Whether the parser to treat HTML/XML tags as string literal\n * instead of parsing them as tag token.\n * When this is false we only allow simple tags without\n * any attributes\n */\n ignoreTag?: boolean\n /**\n * An AbortSignal to cancel the compilation before invoking native code.\n */\n signal?: AbortSignal\n /**\n * Whether to follow symbolic links when traversing directories.\n * Defaults to true for compatibility with pnpm symlinked node_modules.\n */\n followLinks?: boolean\n}\n\n/**\n * Compile extracted translation files with the native formatjs CLI binding.\n * @param inputFiles Input files or glob patterns\n * @param opts Options\n * @returns serialized result in string format\n */\nexport async function compile(\n inputFiles: string[],\n opts: Opts = {}\n): Promise<string> {\n debug('Compiling files:', inputFiles)\n const {\n ast,\n format,\n pseudoLocale,\n skipErrors,\n ignoreTag,\n signal,\n followLinks,\n } = opts\n signal?.throwIfAborted()\n\n if (format && !isBuiltinFormatter(format)) {\n return compileWithCustomFormatter(inputFiles, opts)\n }\n\n return compileWithNative(inputFiles, {\n ast,\n format: typeof format === 'string' ? format : undefined,\n followLinks,\n ignoreTag,\n pseudoLocale,\n skipErrors,\n })\n}\n\nfunction isBuiltinFormatter(\n format: string | Formatter<unknown>\n): format is string {\n return typeof format === 'string' && BUILTIN_FORMATTERS.has(format)\n}\n\nasync function compileWithCustomFormatter(\n inputFiles: string[],\n opts: Opts\n): Promise<string> {\n if (typeof opts.format === 'string') {\n await warn(CUSTOM_FORMATTER_FILE_DEPRECATION_WARNING)\n }\n\n const formatter = await resolveCustomFormatter(opts.format)\n const files = globSync(inputFiles, {\n followSymbolicLinks: opts.followLinks ?? true,\n })\n\n if (!files.length) {\n throw new Error('No translation files found matching the patterns')\n }\n\n const messages: NativeCompileMessage[] = []\n await Promise.all(\n files.map(async file => {\n opts.signal?.throwIfAborted()\n const content = await readFile(file, {\n encoding: 'utf8',\n signal: opts.signal,\n })\n const compiled = formatter.compile(JSON.parse(content))\n for (const id of Object.keys(compiled)) {\n messages.push({\n id,\n message: compiled[id],\n sourceFile: file,\n })\n }\n })\n )\n\n const serialized = compileMessagesWithNative(messages, {\n ast: opts.ast,\n ignoreTag: opts.ignoreTag,\n pseudoLocale: opts.pseudoLocale,\n skipErrors: opts.skipErrors,\n })\n\n if (formatter.compareMessages) {\n return (\n stringify(JSON.parse(serialized), {\n space: 2,\n cmp: formatter.compareMessages,\n }) ?? ''\n )\n }\n\n return serialized\n}\n\nasync function resolveCustomFormatter(\n format: string | Formatter<unknown> | undefined\n): Promise<Formatter<unknown>> {\n if (!format) {\n throw new Error('A custom formatter is required')\n }\n if (typeof format !== 'string') {\n return format\n }\n try {\n return dynamicImport(pathToFileURL(resolve(process.cwd(), format)).href)\n } catch (e) {\n console.error(`Cannot resolve formatter ${format}`)\n throw e\n }\n}\n\n/**\n * Compile extracted translation files with the native formatjs CLI binding and\n * write output to `outFile` when provided.\n * @param inputFiles Input files or glob patterns\n * @param compileOpts options\n * @returns A `Promise` that resolves if file was written successfully\n */\nexport default async function compileAndWrite(\n inputFiles: string[],\n compileOpts: CompileCLIOpts = {}\n): Promise<void> {\n const {outFile, ...opts} = compileOpts\n const serializedResult = (await compile(inputFiles, opts)) + '\\n'\n if (outFile) {\n debug('Writing output file:', outFile)\n return outputFile(outFile, serializedResult)\n }\n await writeStdout(serializedResult)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["clearLine","format","compile","format","compile","format","compile","format","compile","format","compile","format","compile","defaultFormatter","transifex","smartling","simple","lokalise","crowdin","require","resolve","stringify"],"sources":["../console_utils.ts","../formatters/crowdin.ts","../formatters/default.ts","../formatters/lokalise.ts","../formatters/simple.ts","../formatters/smartling.ts","../formatters/transifex.ts","../formatters/index.ts","../native.ts","../extract.ts","../compile.ts"],"sourcesContent":["import {\n clearLine as nativeClearLine,\n cursorTo as nativeCursorTo,\n} from 'readline'\nimport {format, promisify, styleText} from 'node:util'\n\nconst CLEAR_WHOLE_LINE = 0\n\nexport const writeStderr: (arg1: string | Uint8Array) => Promise<void> =\n promisify(process.stderr.write).bind(process.stderr)\nexport const writeStdout: (arg1: string | Uint8Array) => Promise<void> =\n promisify(process.stdout.write).bind(process.stdout)\n\n// From:\n// https://github.com/yarnpkg/yarn/blob/53d8004229f543f342833310d5af63a4b6e59c8a/src/reporters/console/util.js\nexport async function clearLine(\n terminal: (typeof process)['stderr']\n): Promise<void> {\n if (!terminal.hasColors?.()) {\n if (terminal.isTTY) {\n // terminal\n if (terminal.columns > 0) {\n await writeStderr(`\\r${' '.repeat(terminal.columns - 1)}`)\n }\n await writeStderr(`\\r`)\n }\n // ignore piping to file\n } else {\n nativeClearLine(terminal, CLEAR_WHOLE_LINE)\n nativeCursorTo(terminal, 0, undefined)\n }\n}\n\ntype LogLevel = 'debug' | 'warn' | 'error'\n\nconst LEVEL_COLORS: Record<LogLevel, 'green' | 'yellow' | 'red'> = {\n debug: 'green',\n warn: 'yellow',\n error: 'red',\n}\n\nfunction label(level: LogLevel, message: string) {\n return `[@formatjs/cli] [${styleText(\n LEVEL_COLORS[level],\n level.toUpperCase()\n )}] ${message}`\n}\n\nexport async function debug(message: string, ...args: any[]): Promise<void> {\n if (process.env.LOG_LEVEL !== 'debug') {\n return\n }\n await clearLine(process.stderr)\n await writeStderr(format(label('debug', message), ...args))\n await writeStderr('\\n')\n}\n\nexport async function warn(message: string, ...args: any[]): Promise<void> {\n await clearLine(process.stderr)\n await writeStderr(format(label('warn', message), ...args))\n await writeStderr('\\n')\n}\n\nexport function getStdinAsString(): Promise<string> {\n let result = ''\n return new Promise(resolve => {\n process.stdin.setEncoding('utf-8')\n process.stdin.on('readable', () => {\n let chunk\n while ((chunk = process.stdin.read())) {\n result += chunk\n }\n })\n process.stdin.on('end', () => {\n resolve(result)\n })\n })\n}\n","import {\n type CompileFn,\n type FormatFn,\n} from '#packages/cli-lib/formatters/default.js'\n\nexport type CrowdinJson = Record<\n string,\n {\n message: string\n description?: string\n }\n>\n\nexport const format: FormatFn<CrowdinJson> = msgs => {\n const results: CrowdinJson = {}\n for (const [id, msg] of Object.entries(msgs)) {\n results[id] = {\n message: msg.defaultMessage!,\n description:\n typeof msg.description === 'string'\n ? msg.description\n : JSON.stringify(msg.description),\n }\n }\n return results\n}\n\nexport const compile: CompileFn<CrowdinJson> = msgs => {\n const results: Record<string, string> = {}\n for (const [id, msg] of Object.entries(msgs)) {\n if (id === 'smartling') {\n continue\n }\n results[id] = msg.message\n }\n return results\n}\n","import {type MessageDescriptor} from '#packages/cli-lib/types.js'\nexport type FormatFn<T = Record<string, MessageDescriptor>> = (\n msgs: Record<string, MessageDescriptor>\n) => T\n\nexport type CompileFn<T = Record<string, MessageDescriptor>> = (\n msgs: T\n) => Record<string, string>\n\nexport type SerializeFn<T = Record<string, MessageDescriptor>> = (\n msgs: T\n) => string\n\nexport const format: FormatFn = msgs => msgs\n\nexport const compile: CompileFn = msgs => {\n const results: Record<string, string> = {}\n for (const k in msgs) {\n results[k] = msgs[k].defaultMessage!\n }\n return results\n}\n","import {\n type CompileFn,\n type FormatFn,\n} from '#packages/cli-lib/formatters/default.js'\n\nexport type StructuredJson = Record<\n string,\n {\n translation: string\n notes?: string\n context?: string\n limit?: string\n }\n>\n\nexport const format: FormatFn<StructuredJson> = msgs => {\n const results: StructuredJson = {}\n for (const [id, msg] of Object.entries(msgs)) {\n results[id] = {\n translation: msg.defaultMessage!,\n notes:\n typeof msg.description === 'string'\n ? msg.description\n : JSON.stringify(msg.description),\n }\n }\n return results\n}\n\nexport const compile: CompileFn<StructuredJson> = msgs => {\n const results: Record<string, string> = {}\n for (const [id, msg] of Object.entries(msgs)) {\n results[id] = msg.translation\n }\n return results\n}\n","import {\n type CompileFn,\n type FormatFn,\n} from '#packages/cli-lib/formatters/default.js'\n\nexport type PhraseJson = Record<string, string>\n\nexport const format: FormatFn<PhraseJson> = msgs => {\n return Object.keys(msgs).reduce((all: PhraseJson, k) => {\n all[k] = msgs[k].defaultMessage!\n return all\n }, {})\n}\n\nexport const compile: CompileFn<PhraseJson> = msgs => msgs\n","import type {Comparator} from 'json-stable-stringify'\nimport {\n type CompileFn,\n type FormatFn,\n} from '#packages/cli-lib/formatters/default.js'\n\nexport interface SmartlingDirectives {\n translate_paths: [\n {\n path: string\n key: string\n instruction: string\n },\n ]\n variants_enabled: boolean\n string_format: string\n [k: string]: any\n}\n\nexport type SmartlingJson = {\n smartling: SmartlingDirectives\n} & Record<\n string,\n {\n message: string\n description?: string\n }\n>\n\nexport const format: FormatFn<SmartlingJson> = msgs => {\n const results: SmartlingJson = {\n smartling: {\n translate_paths: [\n {\n path: '*/message',\n key: '{*}/message',\n instruction: '*/description',\n },\n ],\n variants_enabled: true,\n string_format: 'icu',\n },\n } as any\n for (const [id, msg] of Object.entries(msgs)) {\n results[id] = {\n message: msg.defaultMessage!,\n description:\n typeof msg.description === 'string'\n ? msg.description\n : JSON.stringify(msg.description),\n }\n }\n return results\n}\n\nexport const compareMessages: Comparator = (el1, el2) => {\n // `smartling` has to be the 1st key\n if (el1.key === 'smartling') {\n return -1\n }\n if (el2.key === 'smartling') {\n return 1\n }\n return el1.key < el2.key ? -1 : el1.key === el2.key ? 0 : 1\n}\n\nexport const compile: CompileFn<SmartlingJson> = msgs => {\n const results: Record<string, string> = {}\n for (const [id, msg] of Object.entries(msgs)) {\n if (id === 'smartling') {\n continue\n }\n results[id] = msg.message\n }\n return results\n}\n","import {\n type CompileFn,\n type FormatFn,\n} from '#packages/cli-lib/formatters/default.js'\n\nexport type StructuredJson = Record<\n string,\n {\n string: string\n developer_comment?: string\n context?: string\n character_limit?: string\n }\n>\n\nexport const format: FormatFn<StructuredJson> = msgs => {\n const results: StructuredJson = {}\n for (const [id, msg] of Object.entries(msgs)) {\n results[id] = {\n string: msg.defaultMessage!,\n developer_comment:\n typeof msg.description === 'string'\n ? msg.description\n : JSON.stringify(msg.description),\n }\n }\n return results\n}\n\nexport const compile: CompileFn<StructuredJson> = msgs => {\n const results: Record<string, string> = {}\n for (const [id, msg] of Object.entries(msgs)) {\n results[id] = msg.string\n }\n return results\n}\n","import type {Comparator} from 'json-stable-stringify'\nimport {resolve} from 'path'\nimport {pathToFileURL} from 'url'\nimport * as crowdin from '#packages/cli-lib/formatters/crowdin.js'\nimport * as defaultFormatter from '#packages/cli-lib/formatters/default.js'\nimport {\n type CompileFn,\n type FormatFn,\n type SerializeFn,\n} from '#packages/cli-lib/formatters/default.js'\nimport * as lokalise from '#packages/cli-lib/formatters/lokalise.js'\nimport * as simple from '#packages/cli-lib/formatters/simple.js'\nimport * as smartling from '#packages/cli-lib/formatters/smartling.js'\nimport * as transifex from '#packages/cli-lib/formatters/transifex.js'\n\nexport interface Formatter<T> {\n serialize?: SerializeFn<T>\n format: FormatFn<T>\n compile: CompileFn<T>\n compareMessages?: Comparator\n}\n\nexport async function resolveBuiltinFormatter(\n format?: string | Formatter<unknown>\n): Promise<any> {\n if (!format) {\n return defaultFormatter\n }\n if (typeof format !== 'string') {\n return format\n }\n switch (format) {\n case 'transifex':\n return transifex\n case 'smartling':\n return smartling\n case 'simple':\n return simple\n case 'lokalise':\n return lokalise\n case 'crowdin':\n return crowdin\n }\n try {\n // eslint-disable-next-line import/dynamic-import-chunkname\n return import(pathToFileURL(resolve(process.cwd(), format)).href)\n } catch (e) {\n console.error(`Cannot resolve formatter ${format}`)\n throw e\n }\n}\n","import {createRequire} from 'module'\nimport {resolve} from 'node:path'\n\nconst require = createRequire(import.meta.url)\n\nconst NATIVE_PACKAGES: Record<string, string[]> = {\n 'darwin-arm64': ['@formatjs/cli-native-darwin-arm64'],\n 'linux-arm64': [\n '@formatjs/cli-native-linux-arm64',\n '@formatjs/cli-native-linux-arm64-musl',\n ],\n 'linux-x64': [\n '@formatjs/cli-native-linux-x64',\n '@formatjs/cli-native-linux-x64-musl',\n ],\n 'win32-x64': ['@formatjs/cli-native-win32-x64'],\n}\n\nexport interface NativeCompileOptions {\n ast?: boolean\n format?: string\n ignoreTag?: boolean\n pseudoLocale?: string\n skipErrors?: boolean\n followLinks?: boolean\n}\n\nexport interface NativeCompileMessage {\n id: string\n message: string\n sourceFile: string\n}\n\nexport interface NativeExtractOptions {\n additionalComponentNames?: string[]\n additionalFunctionNames?: string[]\n extractSourceLocation?: boolean\n flatten?: boolean\n followLinks?: boolean\n format?: string\n idInterpolationPattern?: string\n ignore?: string[]\n inFile?: string\n pragma?: string\n preserveWhitespace?: boolean\n throws?: boolean\n}\n\nexport interface NativeExtractSourceInput {\n filename: string\n source: string\n}\n\nexport interface NativeMessageDescriptor {\n id?: string\n defaultMessage?: string\n description?: string | object\n file?: string\n start?: number\n end?: number\n}\n\nexport interface NativeExtractSourceResult {\n filename: string\n messages: NativeMessageDescriptor[]\n meta?: Record<string, string>\n errors?: string[]\n}\n\nexport interface NativeExtractSourcesResult {\n files: NativeExtractSourceResult[]\n warnings?: string[]\n}\n\nexport interface NativeBinding {\n compile(inputFiles: string[], opts?: NativeCompileOptions): string\n compileMessages(\n messages: NativeCompileMessage[],\n opts?: NativeCompileOptions\n ): string\n extract(inputFiles: string[], opts?: NativeExtractOptions): string\n extractSources(\n sources: NativeExtractSourceInput[],\n opts?: NativeExtractOptions,\n generateIds?: boolean\n ): string\n generateId(\n pattern: string,\n defaultMessage?: string,\n descriptionJson?: string,\n filename?: string\n ): string\n supportedBuiltinFormatters(): string[]\n}\n\nlet nativeBinding: NativeBinding | null | undefined\n\nexport function getInstalledNativePackageCandidates(\n candidates: readonly string[],\n canResolve = (candidate: string): boolean => {\n try {\n require.resolve(candidate)\n return true\n } catch {\n return false\n }\n }\n): string[] {\n return candidates.filter(canResolve)\n}\n\nexport function getNativePackageCandidates(\n platform: NodeJS.Platform = process.platform,\n arch: string = process.arch\n): string[] {\n const platformArch = `${platform}-${arch}`\n return NATIVE_PACKAGES[platformArch] || []\n}\n\nexport function loadNative(): NativeBinding {\n if (nativeBinding !== undefined) {\n if (nativeBinding) {\n return nativeBinding\n }\n throw new Error('Native @formatjs/cli-lib binding is unavailable')\n }\n\n const overridePath = process.env.FORMATJS_CLI_LIB_NATIVE_PATH\n const packageCandidates = getNativePackageCandidates()\n const installedPackageCandidates =\n getInstalledNativePackageCandidates(packageCandidates)\n const candidates = [\n overridePath ? resolve(overridePath) : undefined,\n ...(installedPackageCandidates.length\n ? installedPackageCandidates\n : packageCandidates),\n ].filter(Boolean) as string[]\n const loadErrors: string[] = []\n\n for (const candidate of candidates) {\n try {\n nativeBinding = require(candidate) as NativeBinding\n return nativeBinding\n } catch (e) {\n loadErrors.push(`${candidate}: ${(e as Error).message}`)\n }\n }\n\n nativeBinding = null\n throw new Error(\n `Native @formatjs/cli-lib binding is unavailable.\\n${loadErrors.join('\\n')}`\n )\n}\n\nexport function compileWithNative(\n inputFiles: string[],\n opts: NativeCompileOptions = {}\n): string {\n const native = loadNative()\n return native.compile(inputFiles, {\n ast: opts.ast,\n format: opts.format,\n followLinks: opts.followLinks,\n ignoreTag: opts.ignoreTag,\n pseudoLocale: opts.pseudoLocale,\n skipErrors: opts.skipErrors,\n })\n}\n\nexport function compileMessagesWithNative(\n messages: NativeCompileMessage[],\n opts: NativeCompileOptions = {}\n): string {\n const native = loadNative()\n return native.compileMessages(messages, {\n ast: opts.ast,\n ignoreTag: opts.ignoreTag,\n pseudoLocale: opts.pseudoLocale,\n skipErrors: opts.skipErrors,\n })\n}\n\nexport function extractSourcesWithNative(\n sources: NativeExtractSourceInput[],\n opts: NativeExtractOptions = {},\n generateIds = true\n): NativeExtractSourcesResult {\n const native = loadNative()\n return JSON.parse(native.extractSources(sources, opts, generateIds))\n}\n\nexport function generateIdWithNative(\n pattern: string,\n defaultMessage?: string,\n description?: string | object,\n filename?: string\n): string {\n return loadNative().generateId(\n pattern,\n defaultMessage,\n description === undefined ? undefined : JSON.stringify(description),\n filename\n )\n}\n","import {outputFile} from 'fs-extra/esm'\nimport {\n debug,\n getStdinAsString,\n warn,\n writeStdout,\n} from '#packages/cli-lib/console_utils.js'\nimport * as stringifyNs from 'json-stable-stringify'\nimport {extname} from 'path'\n\nimport {\n type Formatter,\n resolveBuiltinFormatter,\n} from '#packages/cli-lib/formatters/index.js'\nimport {\n extractSourcesWithNative,\n generateIdWithNative,\n type NativeMessageDescriptor,\n} from '#packages/cli-lib/native.js'\nimport {\n type ExtractTransformOptions,\n type MessageDescriptor,\n} from '#packages/cli-lib/types.js'\nimport {readFile} from 'fs/promises'\n\nconst stringify = (stringifyNs as any).default || stringifyNs\nconst DEFAULT_ID_INTERPOLATION_PATTERN = '[sha1:contenthash:base64:6]'\nexport interface ExtractionResult<M = Record<string, string>> {\n /**\n * List of extracted messages\n */\n messages: MessageDescriptor[]\n /**\n * Metadata extracted w/ `pragma`\n */\n meta?: M\n}\n\nexport interface ExtractedMessageDescriptor extends MessageDescriptor {\n /**\n * Line number\n */\n line?: number\n /**\n * Column number\n */\n col?: number\n /**\n * Metadata extracted from pragma\n */\n meta?: Record<string, string>\n}\n\nexport type ExtractCLIOptions = Omit<\n ExtractOpts,\n 'overrideIdFn' | 'onMsgExtracted' | 'onMetaExtracted'\n> & {\n /**\n * Output File\n */\n outFile?: string\n /**\n * Input File\n */\n inFile?: string\n /**\n * Ignore file glob pattern\n */\n ignore?: string[]\n /**\n * Whether to follow symbolic links when traversing directories.\n * Defaults to true for compatibility with pnpm symlinked node_modules.\n */\n followLinks?: boolean\n}\n\nexport type ExtractOpts = ExtractTransformOptions & {\n /**\n * Whether to throw an error if we had any issues with\n * 1 of the source files\n */\n throws?: boolean\n /**\n * Message ID interpolation pattern\n */\n idInterpolationPattern?: string\n /**\n * Whether we read from stdin instead of a file\n */\n readFromStdin?: boolean\n /**\n * Either path to a formatter file that controls the shape of JSON file from `outFile` or {@link Formatter} object.\n */\n format?: string | Formatter<any>\n /**\n * Whether to hoist selectors & flatten sentences\n */\n flatten?: boolean\n /**\n * An AbortSignal to cancel the extraction\n */\n signal?: AbortSignal\n}\n\nfunction byteOffsetToStringOffset(text: string, offset: number): number {\n return Buffer.from(text).subarray(0, offset).toString().length\n}\n\nfunction calculateLineColFromOffset(\n text: string,\n start?: number\n): Pick<ExtractedMessageDescriptor, 'line' | 'col'> {\n if (!start) {\n return {line: 1, col: 1}\n }\n const chunk = text.slice(0, start)\n const lines = chunk.split('\\n')\n const lastLine = lines[lines.length - 1]\n return {line: lines.length, col: lastLine.length}\n}\n\nfunction nativeScriptFilename(filename: string): string {\n const extension = extname(filename).toLowerCase()\n if (\n [\n '.cjs',\n '.cts',\n '.js',\n '.jsx',\n '.mjs',\n '.mts',\n '.rs',\n '.ts',\n '.tsx',\n ].includes(extension)\n ) {\n return filename\n }\n return `${filename}.tsx`\n}\n\nfunction applyOverrideId(\n message: NativeMessageDescriptor,\n filename: string,\n overrideIdFn: ExtractTransformOptions['overrideIdFn']\n): MessageDescriptor {\n const id =\n typeof overrideIdFn === 'function'\n ? overrideIdFn(\n message.id,\n message.defaultMessage,\n message.description,\n filename\n )\n : message.id\n return {...message, id: id || ''}\n}\n\nasync function processFile(source: string, fn: string, opts: ExtractOpts) {\n let messages: ExtractedMessageDescriptor[] = []\n let meta: Record<string, string> | undefined\n const idInterpolationPattern =\n typeof opts.overrideIdFn === 'string'\n ? opts.overrideIdFn\n : opts.idInterpolationPattern || DEFAULT_ID_INTERPOLATION_PATTERN\n\n debug('Processing opts for %s: %s', fn, opts)\n\n const collectMessages = (\n filePath: string,\n extracted: MessageDescriptor[]\n ) => {\n messages = messages.concat(extracted)\n opts.onMsgExtracted?.(filePath, extracted)\n }\n const scriptParseFn = (\n scriptSource: string,\n sourceOffset = 0,\n wrapperOffset = 0\n ): void => {\n const result = extractSourcesWithNative(\n [{filename: nativeScriptFilename(fn), source: scriptSource}],\n {\n additionalComponentNames: [\n '$formatMessage',\n ...(opts.additionalComponentNames || []),\n ],\n additionalFunctionNames: opts.additionalFunctionNames,\n extractSourceLocation: opts.extractSourceLocation,\n idInterpolationPattern,\n pragma: opts.pragma,\n preserveWhitespace: opts.preserveWhitespace,\n flatten: opts.flatten,\n throws: opts.throws,\n },\n typeof opts.overrideIdFn !== 'function'\n )\n const file = result.files[0]\n if (!file) return\n if (file.meta) {\n meta = {...meta, ...file.meta}\n }\n for (const error of file.errors || []) {\n opts.onMsgError?.(fn, new Error(error))\n }\n let extracted = file.messages.map(message =>\n applyOverrideId(message, fn, opts.overrideIdFn)\n )\n if (opts.extractSourceLocation) {\n extracted = extracted.map(message => {\n const start =\n message.start === undefined\n ? undefined\n : sourceOffset +\n Math.max(\n 0,\n byteOffsetToStringOffset(scriptSource, message.start) -\n wrapperOffset\n )\n const end =\n message.end === undefined\n ? undefined\n : sourceOffset +\n Math.max(\n 0,\n byteOffsetToStringOffset(scriptSource, message.end) -\n wrapperOffset\n )\n return {\n ...message,\n file: fn,\n start,\n end,\n ...calculateLineColFromOffset(source, start),\n }\n })\n }\n collectMessages(fn, extracted)\n }\n const hbsOptions: ExtractTransformOptions = {\n ...opts,\n overrideIdFn:\n typeof opts.overrideIdFn === 'function'\n ? opts.overrideIdFn\n : (id, defaultMessage, description, filename) =>\n id ||\n generateIdWithNative(\n idInterpolationPattern,\n defaultMessage,\n description,\n filename\n ),\n onMsgExtracted: collectMessages,\n onMetaExtracted(_filePath, extractedMeta) {\n meta = {...meta, ...extractedMeta}\n },\n }\n if (fn.endsWith('.vue')) {\n debug('Processing %s using vue extractor', fn)\n const {parseFile} = await import('./vue_extractor.js')\n parseFile(source, fn, scriptParseFn)\n } else if (fn.endsWith('.svelte')) {\n debug('Processing %s using svelte extractor', fn)\n const {parseFile} = await import('./svelte_extractor.js')\n parseFile(source, fn, scriptParseFn)\n } else if (fn.endsWith('.hbs')) {\n debug('Processing %s using hbs extractor', fn)\n const {parseFile} = await import('./hbs_extractor.js')\n parseFile(source, fn, hbsOptions)\n } else if (fn.endsWith('.gts') || fn.endsWith('.gjs')) {\n debug('Processing %s as gts/gjs file', fn)\n const {parseFile} = await import('./gts_extractor.js')\n parseFile(source, fn, hbsOptions, scriptParseFn)\n } else {\n debug('Processing %s using native extractor', fn)\n scriptParseFn(source)\n }\n debug('Done extracting %s messages: %s', fn, messages)\n if (meta) {\n debug('Extracted meta:', meta)\n messages.forEach(m => (m.meta = meta))\n opts.onMetaExtracted?.(fn, meta)\n }\n return {messages, meta}\n}\n\n/**\n * Extract strings from source files\n * @param files list of files\n * @param extractOpts extract options\n * @returns messages serialized as JSON string since key order\n * matters for some `format`\n */\nexport async function extract(\n files: readonly string[],\n extractOpts: ExtractOpts\n): Promise<string> {\n const {throws, readFromStdin, signal, ...opts} = extractOpts\n // When throws is not explicitly true, we want to collect partial results\n const shouldThrow = throws === true\n // Pass throws option to transformer for per-message error handling\n const optsWithThrows = {\n ...opts,\n idInterpolationPattern:\n opts.idInterpolationPattern || DEFAULT_ID_INTERPOLATION_PATTERN,\n throws: shouldThrow,\n onMsgError: !shouldThrow\n ? opts.onMsgError || ((_: string, e: Error) => warn(e.message))\n : undefined,\n }\n\n let rawResults: Array<ExtractionResult | undefined> = []\n try {\n if (readFromStdin) {\n debug(`Reading input from stdin`)\n // Read from stdin\n if (process.stdin.isTTY) {\n warn('Reading source file from TTY.')\n }\n const stdinSource = await getStdinAsString()\n rawResults = [await processFile(stdinSource, 'dummy.ts', optsWithThrows)]\n } else {\n // Use Promise.allSettled when throws is not explicitly true to collect partial results\n if (!shouldThrow) {\n const settledResults = await Promise.allSettled(\n files.map(async fn => {\n debug('Extracting file:', fn)\n const source = await readFile(fn, {encoding: 'utf8', signal})\n return processFile(source, fn, optsWithThrows)\n })\n )\n rawResults = settledResults.map(result => {\n if (result.status === 'fulfilled') {\n return result.value\n } else {\n warn(String(result.reason))\n return undefined\n }\n })\n } else {\n rawResults = await Promise.all(\n files.map(async fn => {\n debug('Extracting file:', fn)\n const source = await readFile(fn, {encoding: 'utf8', signal})\n return processFile(source, fn, optsWithThrows)\n })\n )\n }\n }\n } catch (e) {\n if (shouldThrow) {\n throw e\n } else {\n warn(String(e))\n }\n }\n\n const formatter: Formatter<unknown> = await resolveBuiltinFormatter(\n opts.format\n )\n const extractionResults = rawResults.filter((r): r is ExtractionResult => !!r)\n\n const extractedMessages = new Map<string, MessageDescriptor>()\n\n for (const {messages} of extractionResults) {\n for (const message of messages) {\n const {id, description, defaultMessage} = message\n if (!id) {\n const error = new Error(\n `[FormatJS CLI] Missing message id for message:\n${JSON.stringify(message, undefined, 2)}`\n )\n if (throws) {\n throw error\n } else {\n warn(error.message)\n }\n continue\n }\n\n if (extractedMessages.has(id)) {\n const existing = extractedMessages.get(id)!\n if (\n stringify(description) !== stringify(existing.description) ||\n defaultMessage !== existing.defaultMessage\n ) {\n const error = new Error(\n `[FormatJS CLI] Duplicate message id: \"${id}\", ` +\n 'but the `description` and/or `defaultMessage` are different.'\n )\n if (throws) {\n throw error\n } else {\n warn(error.message)\n }\n }\n }\n extractedMessages.set(id, message)\n }\n }\n const results: Record<string, Omit<MessageDescriptor, 'id'>> = {}\n const messages = Array.from(extractedMessages.values())\n for (const {id, ...msg} of messages) {\n // GH #3537: flatten is now applied during extraction in the babel plugin,\n // so we don't need to apply it again here. The messages are already flattened.\n results[id] = msg\n }\n if (typeof formatter.serialize === 'function') {\n return formatter.serialize(formatter.format(results as any))\n }\n return (\n stringify(formatter.format(results as any), {\n space: 2,\n cmp: formatter.compareMessages || undefined,\n }) ?? ''\n )\n}\n\n/**\n * Extract strings from source files, also writes to a file.\n * @param files list of files\n * @param extractOpts extract options\n * @returns A Promise that resolves if output file was written successfully\n */\nexport default async function extractAndWrite(\n files: readonly string[],\n extractOpts: ExtractCLIOptions\n): Promise<void> {\n const {outFile, ...opts} = extractOpts\n const serializedResult = (await extract(files, opts)) + '\\n'\n if (outFile) {\n debug('Writing output file:', outFile)\n return outputFile(outFile, serializedResult)\n }\n await writeStdout(serializedResult)\n}\n","import {outputFile} from 'fs-extra/esm'\nimport {readFile} from 'fs/promises'\nimport glob from 'fast-glob'\nimport * as stringifyNs from 'json-stable-stringify'\nimport {resolve} from 'path'\nimport {pathToFileURL} from 'url'\nimport {debug, warn, writeStdout} from '#packages/cli-lib/console_utils.js'\nimport {type Formatter} from '#packages/cli-lib/formatters/index.js'\nimport {\n type NativeCompileMessage,\n compileMessagesWithNative,\n compileWithNative,\n} from '#packages/cli-lib/native.js'\n\nconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n specifier: string\n) => Promise<Formatter<unknown>>\nconst globSync = glob.sync\nconst stringify = (stringifyNs as any).default || stringifyNs\nconst CUSTOM_FORMATTER_FILE_DEPRECATION_WARNING =\n 'Passing a custom formatter file to --format during compilation is deprecated and will be removed in a future release. Prefer a built-in formatter name or pre-process translation files before running formatjs compile.'\n\nconst BUILTIN_FORMATTERS = new Set([\n 'default',\n 'simple',\n 'transifex',\n 'smartling',\n 'lokalise',\n 'crowdin',\n])\n\nexport type PseudoLocale = 'xx-LS' | 'xx-AC' | 'xx-HA' | 'en-XA' | 'en-XB'\n\nexport interface CompileCLIOpts extends Opts {\n /**\n * The target file that contains compiled messages.\n */\n outFile?: string\n}\n\nexport interface Opts {\n /**\n * Whether to compile message into AST instead of just string\n */\n ast?: boolean\n /**\n * Whether to continue compiling messages after encountering an error.\n * Any keys with errors will not be included in the output file.\n */\n skipErrors?: boolean\n /**\n * Built-in formatter name or path to a formatter file that converts\n * <translation_files> to `Record<string, string>` so we can compile.\n * Formatter file paths are deprecated for compilation.\n */\n format?: string | Formatter<unknown>\n /**\n * Whether to compile to pseudo locale\n */\n pseudoLocale?: PseudoLocale\n /**\n * Whether the parser to treat HTML/XML tags as string literal\n * instead of parsing them as tag token.\n * When this is false we only allow simple tags without\n * any attributes\n */\n ignoreTag?: boolean\n /**\n * An AbortSignal to cancel the compilation before invoking native code.\n */\n signal?: AbortSignal\n /**\n * Whether to follow symbolic links when traversing directories.\n * Defaults to true for compatibility with pnpm symlinked node_modules.\n */\n followLinks?: boolean\n}\n\n/**\n * Compile extracted translation files with the native formatjs CLI binding.\n * @param inputFiles Input files or glob patterns\n * @param opts Options\n * @returns serialized result in string format\n */\nexport async function compile(\n inputFiles: string[],\n opts: Opts = {}\n): Promise<string> {\n debug('Compiling files:', inputFiles)\n const {\n ast,\n format,\n pseudoLocale,\n skipErrors,\n ignoreTag,\n signal,\n followLinks,\n } = opts\n signal?.throwIfAborted()\n\n if (format && !isBuiltinFormatter(format)) {\n return compileWithCustomFormatter(inputFiles, opts)\n }\n\n return compileWithNative(inputFiles, {\n ast,\n format: typeof format === 'string' ? format : undefined,\n followLinks,\n ignoreTag,\n pseudoLocale,\n skipErrors,\n })\n}\n\nfunction isBuiltinFormatter(\n format: string | Formatter<unknown>\n): format is string {\n return typeof format === 'string' && BUILTIN_FORMATTERS.has(format)\n}\n\nasync function compileWithCustomFormatter(\n inputFiles: string[],\n opts: Opts\n): Promise<string> {\n if (typeof opts.format === 'string') {\n await warn(CUSTOM_FORMATTER_FILE_DEPRECATION_WARNING)\n }\n\n const formatter = await resolveCustomFormatter(opts.format)\n const files = globSync(inputFiles, {\n followSymbolicLinks: opts.followLinks ?? true,\n })\n\n if (!files.length) {\n throw new Error('No translation files found matching the patterns')\n }\n\n const messages: NativeCompileMessage[] = []\n await Promise.all(\n files.map(async file => {\n opts.signal?.throwIfAborted()\n const content = await readFile(file, {\n encoding: 'utf8',\n signal: opts.signal,\n })\n const compiled = formatter.compile(JSON.parse(content))\n for (const id of Object.keys(compiled)) {\n messages.push({\n id,\n message: compiled[id],\n sourceFile: file,\n })\n }\n })\n )\n\n const serialized = compileMessagesWithNative(messages, {\n ast: opts.ast,\n ignoreTag: opts.ignoreTag,\n pseudoLocale: opts.pseudoLocale,\n skipErrors: opts.skipErrors,\n })\n\n if (formatter.compareMessages) {\n return (\n stringify(JSON.parse(serialized), {\n space: 2,\n cmp: formatter.compareMessages,\n }) ?? ''\n )\n }\n\n return serialized\n}\n\nasync function resolveCustomFormatter(\n format: string | Formatter<unknown> | undefined\n): Promise<Formatter<unknown>> {\n if (!format) {\n throw new Error('A custom formatter is required')\n }\n if (typeof format !== 'string') {\n return format\n }\n try {\n return dynamicImport(pathToFileURL(resolve(process.cwd(), format)).href)\n } catch (e) {\n console.error(`Cannot resolve formatter ${format}`)\n throw e\n }\n}\n\n/**\n * Compile extracted translation files with the native formatjs CLI binding and\n * write output to `outFile` when provided.\n * @param inputFiles Input files or glob patterns\n * @param compileOpts options\n * @returns A `Promise` that resolves if file was written successfully\n */\nexport default async function compileAndWrite(\n inputFiles: string[],\n compileOpts: CompileCLIOpts = {}\n): Promise<void> {\n const {outFile, ...opts} = compileOpts\n const serializedResult = (await compile(inputFiles, opts)) + '\\n'\n if (outFile) {\n debug('Writing output file:', outFile)\n return outputFile(outFile, serializedResult)\n }\n await writeStdout(serializedResult)\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@formatjs/cli-lib",
|
|
3
|
-
"version": "9.0.
|
|
3
|
+
"version": "9.0.5",
|
|
4
4
|
"description": "Lib for CLI for formatjs.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -36,15 +36,13 @@
|
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@babel/types": "8",
|
|
38
38
|
"@formatjs/icu-messageformat-parser": "3.5.17",
|
|
39
|
-
"@formatjs/ts-transformer": "4.4.19",
|
|
40
39
|
"@types/fs-extra": "11",
|
|
41
40
|
"@types/node": "22 || 24",
|
|
42
41
|
"commander": "14",
|
|
43
42
|
"fast-glob": "3",
|
|
44
43
|
"fs-extra": "11",
|
|
45
44
|
"json-stable-stringify": "1",
|
|
46
|
-
"loud-rejection": "2"
|
|
47
|
-
"typescript": "^5.6 || 6 || 7"
|
|
45
|
+
"loud-rejection": "2"
|
|
48
46
|
},
|
|
49
47
|
"peerDependencies": {
|
|
50
48
|
"@glimmer/syntax": "^0.84.3 || ^0.95.0",
|
|
@@ -80,12 +78,12 @@
|
|
|
80
78
|
}
|
|
81
79
|
},
|
|
82
80
|
"optionalDependencies": {
|
|
83
|
-
"@formatjs/cli-native-darwin-arm64": "1.1.
|
|
84
|
-
"@formatjs/cli-native-linux-arm64": "1.2.
|
|
85
|
-
"@formatjs/cli-native-linux-arm64-musl": "1.0.
|
|
86
|
-
"@formatjs/cli-native-linux-x64": "1.1.
|
|
87
|
-
"@formatjs/cli-native-linux-x64-musl": "1.0.
|
|
88
|
-
"@formatjs/cli-native-win32-x64": "1.1.
|
|
81
|
+
"@formatjs/cli-native-darwin-arm64": "1.1.13",
|
|
82
|
+
"@formatjs/cli-native-linux-arm64": "1.2.13",
|
|
83
|
+
"@formatjs/cli-native-linux-arm64-musl": "1.0.11",
|
|
84
|
+
"@formatjs/cli-native-linux-x64": "1.1.13",
|
|
85
|
+
"@formatjs/cli-native-linux-x64-musl": "1.0.11",
|
|
86
|
+
"@formatjs/cli-native-win32-x64": "1.1.14"
|
|
89
87
|
},
|
|
90
88
|
"engines": {
|
|
91
89
|
"node": ">= 20.12.0"
|
|
@@ -16,7 +16,7 @@ function extractExpression(expression, source, parseScriptFn) {
|
|
|
16
16
|
if (!expression || expression.start == null || expression.end == null) return;
|
|
17
17
|
const content = source.slice(expression.start, expression.end);
|
|
18
18
|
try {
|
|
19
|
-
parseScriptFn(`(${content})
|
|
19
|
+
parseScriptFn(`(${content})`, expression.start, 1);
|
|
20
20
|
} catch (e) {
|
|
21
21
|
console.warn(`Failed to parse "${content}". Ignore this if content has no extractable message`, e);
|
|
22
22
|
}
|
|
@@ -45,15 +45,15 @@ function getAttributeExpression(attr, source) {
|
|
|
45
45
|
}
|
|
46
46
|
function extractMessageComponent(node, source, parseScriptFn) {
|
|
47
47
|
if (typeof node.name !== "string" || !isValidIdentifier(node.name)) return;
|
|
48
|
-
const
|
|
48
|
+
const attributes = [];
|
|
49
49
|
for (const attr of node.attributes || []) {
|
|
50
50
|
if (attr.type !== "Attribute" || typeof attr.name !== "string" || !MESSAGE_DESCRIPTOR_PROPS.has(attr.name)) continue;
|
|
51
51
|
const expression = getAttributeExpression(attr, source);
|
|
52
|
-
if (expression != null)
|
|
52
|
+
if (expression != null) attributes.push(`${attr.name}={${expression}}`);
|
|
53
53
|
}
|
|
54
|
-
if (!
|
|
54
|
+
if (!attributes.length) return;
|
|
55
55
|
try {
|
|
56
|
-
parseScriptFn(
|
|
56
|
+
parseScriptFn(`<${node.name} ${attributes.join(" ")} />`);
|
|
57
57
|
} catch (e) {
|
|
58
58
|
console.warn(`Failed to parse ${node.name} message component. Ignore this if component has no extractable message`, e);
|
|
59
59
|
}
|
|
@@ -67,7 +67,7 @@ function walkNode(node, source, parseScriptFn) {
|
|
|
67
67
|
if (node.declaration) {
|
|
68
68
|
const content = source.slice(node.declaration.start, node.declaration.end);
|
|
69
69
|
try {
|
|
70
|
-
parseScriptFn(content);
|
|
70
|
+
parseScriptFn(content, node.declaration.start);
|
|
71
71
|
} catch (e) {
|
|
72
72
|
console.warn(`Failed to parse const declaration. Ignore this if content has no extractable message`, e);
|
|
73
73
|
}
|
|
@@ -128,14 +128,14 @@ function parseFile(source, filename, parseScriptFn) {
|
|
|
128
128
|
walkFragment(ast.fragment, source, parseScriptFn);
|
|
129
129
|
if (ast.instance) {
|
|
130
130
|
const program = ast.instance.content;
|
|
131
|
-
parseScriptFn(source.slice(program.start, program.end));
|
|
131
|
+
parseScriptFn(source.slice(program.start, program.end), program.start);
|
|
132
132
|
}
|
|
133
133
|
if (ast.module) {
|
|
134
134
|
const program = ast.module.content;
|
|
135
|
-
parseScriptFn(source.slice(program.start, program.end));
|
|
135
|
+
parseScriptFn(source.slice(program.start, program.end), program.start);
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
//#endregion
|
|
139
139
|
export { parseFile };
|
|
140
140
|
|
|
141
|
-
//# sourceMappingURL=svelte_extractor-
|
|
141
|
+
//# sourceMappingURL=svelte_extractor-Csb4fR2L.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svelte_extractor-Csb4fR2L.js","names":[],"sources":["../svelte_extractor.ts"],"sourcesContent":["import {parse} from 'svelte/compiler'\n\nexport type ScriptParseFn = (\n source: string,\n sourceOffset?: number,\n wrapperOffset?: number\n) => 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})`, expression.start, 1)\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 attributes: 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 attributes.push(`${attr.name}={${expression}}`)\n }\n }\n\n if (!attributes.length) {\n return\n }\n\n try {\n parseScriptFn(`<${node.name} ${attributes.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, node.declaration.start)\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), program.start)\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), program.start)\n }\n}\n"],"mappings":";;AAeA,MAAM,2CAA2B,IAAI,IAAI;CACvC;CACA;CACA;AACF,CAAC;AAED,SAAS,kBAAkB,MAAuB;CAChD,OAAO,qBAAqB,KAAK,IAAI;AACvC;AAEA,SAAS,aACP,UACA,QACA,eACM;CACN,IAAI,CAAC,YAAY,CAAC,SAAS,OACzB;CAEF,KAAK,MAAM,QAAQ,SAAS,OAC1B,SAAS,MAAM,QAAQ,aAAa;AAExC;AAEA,SAAS,kBACP,YACA,QACA,eACM;CACN,IAAI,CAAC,cAAc,WAAW,SAAS,QAAQ,WAAW,OAAO,MAC/D;CAEF,MAAM,UAAU,OAAO,MAAM,WAAW,OAAO,WAAW,GAAG;CAC7D,IAAI;EACF,cAAc,IAAI,QAAQ,IAAI,WAAW,OAAO,CAAC;CACnD,SAAS,GAAG;EACV,QAAQ,KACN,oBAAoB,QAAQ,uDAC5B,CACF;CACF;AACF;AAEA,SAAS,wBAAwB,OAA2B;CAC1D,OAAO,MAAM,QAAQ,MAAM,OAAO;AACpC;AAEA,SAAS,uBACP,MACA,QACoB;CACpB,IAAI,KAAK,UAAU,QAAQ,KAAK,SAAS,MACvC;CAGF,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,GAAG;EAC9B,IAAI,KAAK,MAAM,SAAS,iBACtB,OAAO,OAAO,MACZ,KAAK,MAAM,WAAW,OACtB,KAAK,MAAM,WAAW,GACxB;EAEF;CACF;CAEA,IAAI,CAAC,KAAK,MAAM,QACd,OAAO;CAGT,IAAI,KAAK,MAAM,WAAW,GAAG;EAC3B,MAAM,CAAC,SAAS,KAAK;EACrB,IAAI,MAAM,SAAS,iBACjB,OAAO,OAAO,MAAM,MAAM,WAAW,OAAO,MAAM,WAAW,GAAG;EAElE,OAAO,KAAK,UAAU,wBAAwB,KAAK,CAAC;CACtD;CAEA,IAAI,cAAc;CAClB,KAAK,MAAM,SAAS,KAAK,OAAO;EAC9B,IAAI,MAAM,SAAS,iBACjB;EAEF,eAAe,wBAAwB,KAAK;CAC9C;CACA,OAAO,KAAK,UAAU,WAAW;AACnC;AAEA,SAAS,wBACP,MACA,QACA,eACM;CACN,IAAI,OAAO,KAAK,SAAS,YAAY,CAAC,kBAAkB,KAAK,IAAI,GAC/D;CAGF,MAAM,aAAuB,CAAC;CAC9B,KAAK,MAAM,QAAQ,KAAK,cAAc,CAAC,GAAG;EACxC,IACE,KAAK,SAAS,eACd,OAAO,KAAK,SAAS,YACrB,CAAC,yBAAyB,IAAI,KAAK,IAAI,GAEvC;EAGF,MAAM,aAAa,uBAAuB,MAAM,MAAM;EACtD,IAAI,cAAc,MAChB,WAAW,KAAK,GAAG,KAAK,KAAK,IAAI,WAAW,EAAE;CAElD;CAEA,IAAI,CAAC,WAAW,QACd;CAGF,IAAI;EACF,cAAc,IAAI,KAAK,KAAK,GAAG,WAAW,KAAK,GAAG,EAAE,IAAI;CAC1D,SAAS,GAAG;EACV,QAAQ,KACN,mBAAmB,KAAK,KAAK,0EAC7B,CACF;CACF;AACF;AAEA,SAAS,SACP,MACA,QACA,eACM;CACN,QAAQ,KAAK,MAAb;EACE,KAAK;GACH,kBAAkB,KAAK,YAAY,QAAQ,aAAa;GACxD;EAEF,KAAK;GAEH,IAAI,KAAK,aAAa;IACpB,MAAM,UAAU,OAAO,MACrB,KAAK,YAAY,OACjB,KAAK,YAAY,GACnB;IACA,IAAI;KACF,cAAc,SAAS,KAAK,YAAY,KAAK;IAC/C,SAAS,GAAG;KACV,QAAQ,KACN,wFACA,CACF;IACF;GACF;GACA;EAEF,KAAK;GACH,kBAAkB,KAAK,MAAM,QAAQ,aAAa;GAClD,aAAa,KAAK,YAAY,QAAQ,aAAa;GACnD,aAAa,KAAK,WAAW,QAAQ,aAAa;GAClD;EAEF,KAAK;GACH,kBAAkB,KAAK,YAAY,QAAQ,aAAa;GACxD,IAAI,KAAK,KACP,kBAAkB,KAAK,KAAK,QAAQ,aAAa;GAEnD,aAAa,KAAK,MAAM,QAAQ,aAAa;GAC7C,aAAa,KAAK,UAAU,QAAQ,aAAa;GACjD;EAEF,KAAK;GACH,kBAAkB,KAAK,YAAY,QAAQ,aAAa;GACxD,aAAa,KAAK,SAAS,QAAQ,aAAa;GAChD,aAAa,KAAK,MAAM,QAAQ,aAAa;GAC7C,aAAa,KAAK,OAAO,QAAQ,aAAa;GAC9C;EAEF,KAAK;GACH,kBAAkB,KAAK,YAAY,QAAQ,aAAa;GACxD,aAAa,KAAK,UAAU,QAAQ,aAAa;GACjD;EAEF,KAAK;GACH,aAAa,KAAK,MAAM,QAAQ,aAAa;GAC7C;EAEF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;GACH,IAAI,KAAK,SAAS,aAChB,wBAAwB,MAAM,QAAQ,aAAa;GAGrD,IAAI,KAAK,YACF;SAAA,MAAM,QAAQ,KAAK,YACtB,IAAI,KAAK,SAAS,aAAa;KAC7B,IAAI,MAAM,QAAQ,KAAK,KAAK,GACrB;WAAA,MAAM,KAAK,KAAK,OACnB,IAAI,EAAE,SAAS,iBACb,kBAAkB,EAAE,YAAY,QAAQ,aAAa;KAAA,OAGpD,IACL,OAAO,KAAK,UAAU,YACtB,KAAK,UAAU,QACf,KAAK,MAAM,SAAS,iBAEpB,kBAAkB,KAAK,MAAM,YAAY,QAAQ,aAAa;IAElE,OAAO,IAAI,KAAK,SAAS,mBACvB,kBAAkB,KAAK,YAAY,QAAQ,aAAa;SACnD,IAAI,KAAK,YAEd,kBAAkB,KAAK,YAAY,QAAQ,aAAa;GAAA;GAK9D,aAAa,KAAK,UAAU,QAAQ,aAAa;CAErD;AACF;AAEA,SAAgB,UACd,QACA,UACA,eACM;CACN,MAAM,MAAM,MAAM,QAAQ;EAAC,QAAQ;EAAM;CAAQ,CAAC;CAGlD,aAAa,IAAI,UAAmC,QAAQ,aAAa;CAGzE,IAAI,IAAI,UAAU;EAChB,MAAM,UAAU,IAAI,SAAS;EAC7B,cAAc,OAAO,MAAM,QAAQ,OAAO,QAAQ,GAAG,GAAG,QAAQ,KAAK;CACvE;CAGA,IAAI,IAAI,QAAQ;EACd,MAAM,UAAU,IAAI,OAAO;EAC3B,cAAc,OAAO,MAAM,QAAQ,OAAO,QAAQ,GAAG,GAAG,QAAQ,KAAK;CACvE;AACF"}
|
|
@@ -19,9 +19,9 @@ function templateSimpleExpressionNodeVisitor(parseScriptFn) {
|
|
|
19
19
|
return (n) => {
|
|
20
20
|
if (typeof n !== "object") return;
|
|
21
21
|
if (n.type !== NodeTypes.SIMPLE_EXPRESSION) return;
|
|
22
|
-
const { content } = n;
|
|
22
|
+
const { content, loc } = n;
|
|
23
23
|
try {
|
|
24
|
-
parseScriptFn(`(${content})
|
|
24
|
+
parseScriptFn(`(${content})`, loc.start.offset, 1);
|
|
25
25
|
} catch (e) {
|
|
26
26
|
console.warn(`Failed to parse "${content}". Ignore this if content has no extractable message`, e);
|
|
27
27
|
}
|
|
@@ -32,10 +32,10 @@ function parseFile(source, filename, parseScriptFn) {
|
|
|
32
32
|
if (errors.length) throw errors[0];
|
|
33
33
|
const { script, scriptSetup, template } = descriptor;
|
|
34
34
|
if (template) walk(template.ast, templateSimpleExpressionNodeVisitor(parseScriptFn));
|
|
35
|
-
if (script) parseScriptFn(script.content);
|
|
36
|
-
if (scriptSetup) parseScriptFn(scriptSetup.content);
|
|
35
|
+
if (script) parseScriptFn(script.content, script.loc.start.offset);
|
|
36
|
+
if (scriptSetup) parseScriptFn(scriptSetup.content, scriptSetup.loc.start.offset);
|
|
37
37
|
}
|
|
38
38
|
//#endregion
|
|
39
39
|
export { parseFile };
|
|
40
40
|
|
|
41
|
-
//# sourceMappingURL=vue_extractor-
|
|
41
|
+
//# sourceMappingURL=vue_extractor-C6UQIcDj.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue_extractor-C6UQIcDj.js","names":[],"sources":["../vue_extractor.ts"],"sourcesContent":["import {\n NodeTypes,\n type TextNode,\n type CompoundExpressionNode,\n type DirectiveNode,\n type ElementNode,\n type InterpolationNode,\n type RootNode,\n type SimpleExpressionNode,\n type TemplateChildNode,\n} from '@vue/compiler-core'\nimport {parse} from 'vue/compiler-sfc'\n\nexport type ScriptParseFn = (\n source: string,\n sourceOffset?: number,\n wrapperOffset?: number\n) => void\n\nfunction walk(\n node:\n | RootNode\n | TemplateChildNode\n | SimpleExpressionNode\n | CompoundExpressionNode\n | InterpolationNode\n | TextNode\n | string\n | symbol\n | undefined,\n visitor: (\n node:\n | ElementNode\n | InterpolationNode\n | CompoundExpressionNode\n | SimpleExpressionNode\n ) => void\n) {\n if (typeof node !== 'object' || node == null) {\n return\n }\n if (node.type === NodeTypes.ROOT) {\n node.children.forEach(n => walk(n, visitor))\n return\n }\n if (\n node.type !== NodeTypes.ELEMENT &&\n node.type !== NodeTypes.COMPOUND_EXPRESSION &&\n node.type !== NodeTypes.INTERPOLATION\n ) {\n return\n }\n visitor(node)\n if (node.type === NodeTypes.INTERPOLATION) {\n visitor(node.content)\n } else if (node.type === NodeTypes.ELEMENT) {\n node.children.forEach(n => walk(n, visitor))\n node.props\n .filter(\n (prop): prop is DirectiveNode => prop.type === NodeTypes.DIRECTIVE\n )\n .filter(prop => !!prop.exp)\n .forEach(prop => visitor(prop.exp!))\n } else {\n node.children.forEach(n => walk(n, visitor))\n }\n}\n\nfunction templateSimpleExpressionNodeVisitor(parseScriptFn: ScriptParseFn) {\n return (\n n:\n | ElementNode\n | CompoundExpressionNode\n | CompoundExpressionNode['children'][0]\n ) => {\n if (typeof n !== 'object') {\n return\n }\n if (n.type !== NodeTypes.SIMPLE_EXPRESSION) {\n return\n }\n\n const {content, loc} = n as SimpleExpressionNode\n // Wrap this in () since a vue comp node attribute can just be\n // an object literal which, by itself is invalid TS\n // but with () it becomes an ExpressionStatement\n try {\n parseScriptFn(`(${content})`, loc.start.offset, 1)\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}\n\nexport function parseFile(\n source: string,\n filename: string,\n parseScriptFn: ScriptParseFn\n): void {\n const {descriptor, errors} = parse(source, {\n filename,\n })\n if (errors.length) {\n throw errors[0]\n }\n const {script, scriptSetup, template} = descriptor\n\n if (template) {\n walk(template.ast, templateSimpleExpressionNodeVisitor(parseScriptFn))\n }\n\n if (script) {\n parseScriptFn(script.content, script.loc.start.offset)\n }\n\n if (scriptSetup) {\n parseScriptFn(scriptSetup.content, scriptSetup.loc.start.offset)\n }\n}\n"],"mappings":";;;AAmBA,SAAS,KACP,MAUA,SAOA;CACA,IAAI,OAAO,SAAS,YAAY,QAAQ,MACtC;CAEF,IAAI,KAAK,SAAS,UAAU,MAAM;EAChC,KAAK,SAAS,SAAQ,MAAK,KAAK,GAAG,OAAO,CAAC;EAC3C;CACF;CACA,IACE,KAAK,SAAS,UAAU,WACxB,KAAK,SAAS,UAAU,uBACxB,KAAK,SAAS,UAAU,eAExB;CAEF,QAAQ,IAAI;CACZ,IAAI,KAAK,SAAS,UAAU,eAC1B,QAAQ,KAAK,OAAO;MACf,IAAI,KAAK,SAAS,UAAU,SAAS;EAC1C,KAAK,SAAS,SAAQ,MAAK,KAAK,GAAG,OAAO,CAAC;EAC3C,KAAK,MACF,QACE,SAAgC,KAAK,SAAS,UAAU,SAC3D,CAAC,CACA,QAAO,SAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,CAC1B,SAAQ,SAAQ,QAAQ,KAAK,GAAI,CAAC;CACvC,OACE,KAAK,SAAS,SAAQ,MAAK,KAAK,GAAG,OAAO,CAAC;AAE/C;AAEA,SAAS,oCAAoC,eAA8B;CACzE,QACE,MAIG;EACH,IAAI,OAAO,MAAM,UACf;EAEF,IAAI,EAAE,SAAS,UAAU,mBACvB;EAGF,MAAM,EAAC,SAAS,QAAO;EAIvB,IAAI;GACF,cAAc,IAAI,QAAQ,IAAI,IAAI,MAAM,QAAQ,CAAC;EACnD,SAAS,GAAG;GACV,QAAQ,KACN,oBAAoB,QAAQ,uDAC5B,CACF;EACF;CACF;AACF;AAEA,SAAgB,UACd,QACA,UACA,eACM;CACN,MAAM,EAAC,YAAY,WAAU,MAAM,QAAQ,EACzC,SACF,CAAC;CACD,IAAI,OAAO,QACT,MAAM,OAAO;CAEf,MAAM,EAAC,QAAQ,aAAa,aAAY;CAExC,IAAI,UACF,KAAK,SAAS,KAAK,oCAAoC,aAAa,CAAC;CAGvE,IAAI,QACF,cAAc,OAAO,SAAS,OAAO,IAAI,MAAM,MAAM;CAGvD,IAAI,aACF,cAAc,YAAY,SAAS,YAAY,IAAI,MAAM,MAAM;AAEnE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gts_extractor-LLrMyDFh.js","names":[],"sources":["../gts_extractor.ts"],"sourcesContent":["import {Preprocessor} from 'content-tag'\nimport {parseFile as parseHbsFile} from '#packages/cli-lib/hbs_extractor.js'\nimport {parseScript} from '#packages/cli-lib/parse_script.js'\nlet p = new Preprocessor()\n\nexport function parseFile(\n source: string,\n fileName: string,\n options: any\n): void {\n const scriptParseFn = parseScript(options, fileName)\n const transformedSource = p.process(source, {filename: fileName})\n\n scriptParseFn(transformedSource.code)\n\n // extract template from transformed source to then run through hbs processor\n const parseResult = p.parse(source, {filename: fileName})\n\n for (let parsed of parseResult) {\n parseHbsFile(parsed.contents, fileName, options)\n }\n}\n"],"mappings":";;;;AAGA,IAAI,IAAI,IAAI,aAAa;AAEzB,SAAgB,UACd,QACA,UACA,SACM;CAIN,YAHkC,SAAS,QAG/B,CAAC,CAFa,EAAE,QAAQ,QAAQ,EAAC,UAAU,SAAQ,CAEjC,CAAC,CAAC,IAAI;CAGpC,MAAM,cAAc,EAAE,MAAM,QAAQ,EAAC,UAAU,SAAQ,CAAC;CAExD,KAAK,IAAI,UAAU,aACjB,YAAa,OAAO,UAAU,UAAU,OAAO;AAEnD"}
|
package/parse_script-B0J5TKud.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { transformWithTs } from "@formatjs/ts-transformer";
|
|
2
|
-
import { clearLine, cursorTo } from "readline";
|
|
3
|
-
import { format, promisify, styleText } from "node:util";
|
|
4
|
-
import * as ts from "typescript";
|
|
5
|
-
//#region packages/cli-lib/console_utils.ts
|
|
6
|
-
const CLEAR_WHOLE_LINE = 0;
|
|
7
|
-
const writeStderr = promisify(process.stderr.write).bind(process.stderr);
|
|
8
|
-
const writeStdout = promisify(process.stdout.write).bind(process.stdout);
|
|
9
|
-
async function clearLine$1(terminal) {
|
|
10
|
-
if (!terminal.hasColors?.()) {
|
|
11
|
-
if (terminal.isTTY) {
|
|
12
|
-
if (terminal.columns > 0) await writeStderr(`\r${" ".repeat(terminal.columns - 1)}`);
|
|
13
|
-
await writeStderr(`\r`);
|
|
14
|
-
}
|
|
15
|
-
} else {
|
|
16
|
-
clearLine(terminal, CLEAR_WHOLE_LINE);
|
|
17
|
-
cursorTo(terminal, 0, void 0);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
const LEVEL_COLORS = {
|
|
21
|
-
debug: "green",
|
|
22
|
-
warn: "yellow",
|
|
23
|
-
error: "red"
|
|
24
|
-
};
|
|
25
|
-
function label(level, message) {
|
|
26
|
-
return `[@formatjs/cli] [${styleText(LEVEL_COLORS[level], level.toUpperCase())}] ${message}`;
|
|
27
|
-
}
|
|
28
|
-
async function debug(message, ...args) {
|
|
29
|
-
if (process.env.LOG_LEVEL !== "debug") return;
|
|
30
|
-
await clearLine$1(process.stderr);
|
|
31
|
-
await writeStderr(format(label("debug", message), ...args));
|
|
32
|
-
await writeStderr("\n");
|
|
33
|
-
}
|
|
34
|
-
async function warn(message, ...args) {
|
|
35
|
-
await clearLine$1(process.stderr);
|
|
36
|
-
await writeStderr(format(label("warn", message), ...args));
|
|
37
|
-
await writeStderr("\n");
|
|
38
|
-
}
|
|
39
|
-
function getStdinAsString() {
|
|
40
|
-
let result = "";
|
|
41
|
-
return new Promise((resolve) => {
|
|
42
|
-
process.stdin.setEncoding("utf-8");
|
|
43
|
-
process.stdin.on("readable", () => {
|
|
44
|
-
let chunk;
|
|
45
|
-
while (chunk = process.stdin.read()) result += chunk;
|
|
46
|
-
});
|
|
47
|
-
process.stdin.on("end", () => {
|
|
48
|
-
resolve(result);
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
//#endregion
|
|
53
|
-
//#region packages/cli-lib/parse_script.ts
|
|
54
|
-
/**
|
|
55
|
-
* Invoid TypeScript module transpilation with our TS transformer
|
|
56
|
-
* @param opts Formatjs TS Transformer opt
|
|
57
|
-
* @param fn filename
|
|
58
|
-
*/
|
|
59
|
-
function parseScript(opts, fn) {
|
|
60
|
-
return (source) => {
|
|
61
|
-
let output;
|
|
62
|
-
try {
|
|
63
|
-
debug("Using TS compiler to process file", fn);
|
|
64
|
-
output = ts.transpileModule(source, {
|
|
65
|
-
compilerOptions: {
|
|
66
|
-
allowJs: true,
|
|
67
|
-
target: ts.ScriptTarget.ESNext,
|
|
68
|
-
noEmit: true,
|
|
69
|
-
experimentalDecorators: true
|
|
70
|
-
},
|
|
71
|
-
reportDiagnostics: true,
|
|
72
|
-
fileName: fn,
|
|
73
|
-
transformers: { before: [transformWithTs(ts, opts)] }
|
|
74
|
-
});
|
|
75
|
-
} catch (e) {
|
|
76
|
-
if (e instanceof Error) e.message = `Error processing file ${fn}
|
|
77
|
-
${e.message || ""}`;
|
|
78
|
-
throw e;
|
|
79
|
-
}
|
|
80
|
-
if (output.diagnostics) {
|
|
81
|
-
const errs = output.diagnostics.filter((d) => d.category === ts.DiagnosticCategory.Error);
|
|
82
|
-
if (errs.length) throw new Error(ts.formatDiagnosticsWithColorAndContext(errs, {
|
|
83
|
-
getCanonicalFileName: (fileName) => fileName,
|
|
84
|
-
getCurrentDirectory: () => process.cwd(),
|
|
85
|
-
getNewLine: () => ts.sys.newLine
|
|
86
|
-
}));
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
//#endregion
|
|
91
|
-
export { writeStdout as a, warn as i, debug as n, getStdinAsString as r, parseScript as t };
|
|
92
|
-
|
|
93
|
-
//# sourceMappingURL=parse_script-B0J5TKud.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parse_script-B0J5TKud.js","names":["clearLine"],"sources":["../console_utils.ts","../parse_script.ts"],"sourcesContent":["import {\n clearLine as nativeClearLine,\n cursorTo as nativeCursorTo,\n} from 'readline'\nimport {format, promisify, styleText} from 'node:util'\n\nconst CLEAR_WHOLE_LINE = 0\n\nexport const writeStderr: (arg1: string | Uint8Array) => Promise<void> =\n promisify(process.stderr.write).bind(process.stderr)\nexport const writeStdout: (arg1: string | Uint8Array) => Promise<void> =\n promisify(process.stdout.write).bind(process.stdout)\n\n// From:\n// https://github.com/yarnpkg/yarn/blob/53d8004229f543f342833310d5af63a4b6e59c8a/src/reporters/console/util.js\nexport async function clearLine(\n terminal: (typeof process)['stderr']\n): Promise<void> {\n if (!terminal.hasColors?.()) {\n if (terminal.isTTY) {\n // terminal\n if (terminal.columns > 0) {\n await writeStderr(`\\r${' '.repeat(terminal.columns - 1)}`)\n }\n await writeStderr(`\\r`)\n }\n // ignore piping to file\n } else {\n nativeClearLine(terminal, CLEAR_WHOLE_LINE)\n nativeCursorTo(terminal, 0, undefined)\n }\n}\n\ntype LogLevel = 'debug' | 'warn' | 'error'\n\nconst LEVEL_COLORS: Record<LogLevel, 'green' | 'yellow' | 'red'> = {\n debug: 'green',\n warn: 'yellow',\n error: 'red',\n}\n\nfunction label(level: LogLevel, message: string) {\n return `[@formatjs/cli] [${styleText(\n LEVEL_COLORS[level],\n level.toUpperCase()\n )}] ${message}`\n}\n\nexport async function debug(message: string, ...args: any[]): Promise<void> {\n if (process.env.LOG_LEVEL !== 'debug') {\n return\n }\n await clearLine(process.stderr)\n await writeStderr(format(label('debug', message), ...args))\n await writeStderr('\\n')\n}\n\nexport async function warn(message: string, ...args: any[]): Promise<void> {\n await clearLine(process.stderr)\n await writeStderr(format(label('warn', message), ...args))\n await writeStderr('\\n')\n}\n\nexport function getStdinAsString(): Promise<string> {\n let result = ''\n return new Promise(resolve => {\n process.stdin.setEncoding('utf-8')\n process.stdin.on('readable', () => {\n let chunk\n while ((chunk = process.stdin.read())) {\n result += chunk\n }\n })\n process.stdin.on('end', () => {\n resolve(result)\n })\n })\n}\n","import {type Opts, transformWithTs} from '@formatjs/ts-transformer'\nimport * as ts from 'typescript'\nimport {debug} from '#packages/cli-lib/console_utils.js'\n/**\n * Invoid TypeScript module transpilation with our TS transformer\n * @param opts Formatjs TS Transformer opt\n * @param fn filename\n */\nexport function parseScript(opts: Opts, fn?: string) {\n return (source: string): void => {\n let output\n try {\n debug('Using TS compiler to process file', fn)\n output = ts.transpileModule(source, {\n compilerOptions: {\n allowJs: true,\n target: ts.ScriptTarget.ESNext,\n noEmit: true,\n experimentalDecorators: true,\n },\n reportDiagnostics: true,\n fileName: fn,\n transformers: {\n before: [transformWithTs(ts, opts)],\n },\n })\n } catch (e) {\n if (e instanceof Error) {\n e.message = `Error processing file ${fn} \n${e.message || ''}`\n }\n throw e\n }\n if (output.diagnostics) {\n const errs = output.diagnostics.filter(\n d => d.category === ts.DiagnosticCategory.Error\n )\n if (errs.length) {\n throw new Error(\n ts.formatDiagnosticsWithColorAndContext(errs, {\n getCanonicalFileName: fileName => fileName,\n getCurrentDirectory: () => process.cwd(),\n getNewLine: () => ts.sys.newLine,\n })\n )\n }\n }\n }\n}\n"],"mappings":";;;;;AAMA,MAAM,mBAAmB;AAEzB,MAAa,cACX,UAAU,QAAQ,OAAO,KAAK,CAAC,CAAC,KAAK,QAAQ,MAAM;AACrD,MAAa,cACX,UAAU,QAAQ,OAAO,KAAK,CAAC,CAAC,KAAK,QAAQ,MAAM;AAIrD,eAAsBA,YACpB,UACe;CACf,IAAI,CAAC,SAAS,YAAY,GACpB;MAAA,SAAS,OAAO;GAElB,IAAI,SAAS,UAAU,GACrB,MAAM,YAAY,KAAK,IAAI,OAAO,SAAS,UAAU,CAAC,GAAG;GAE3D,MAAM,YAAY,IAAI;EACxB;QAEK;EACL,UAAgB,UAAU,gBAAgB;EAC1C,SAAe,UAAU,GAAG,KAAA,CAAS;CACvC;AACF;AAIA,MAAM,eAA6D;CACjE,OAAO;CACP,MAAM;CACN,OAAO;AACT;AAEA,SAAS,MAAM,OAAiB,SAAiB;CAC/C,OAAO,oBAAoB,UACzB,aAAa,QACb,MAAM,YAAY,CACpB,EAAE,IAAI;AACR;AAEA,eAAsB,MAAM,SAAiB,GAAG,MAA4B;CAC1E,IAAI,QAAQ,IAAI,cAAc,SAC5B;CAEF,MAAMA,YAAU,QAAQ,MAAM;CAC9B,MAAM,YAAY,OAAO,MAAM,SAAS,OAAO,GAAG,GAAG,IAAI,CAAC;CAC1D,MAAM,YAAY,IAAI;AACxB;AAEA,eAAsB,KAAK,SAAiB,GAAG,MAA4B;CACzE,MAAMA,YAAU,QAAQ,MAAM;CAC9B,MAAM,YAAY,OAAO,MAAM,QAAQ,OAAO,GAAG,GAAG,IAAI,CAAC;CACzD,MAAM,YAAY,IAAI;AACxB;AAEA,SAAgB,mBAAoC;CAClD,IAAI,SAAS;CACb,OAAO,IAAI,SAAQ,YAAW;EAC5B,QAAQ,MAAM,YAAY,OAAO;EACjC,QAAQ,MAAM,GAAG,kBAAkB;GACjC,IAAI;GACJ,OAAQ,QAAQ,QAAQ,MAAM,KAAK,GACjC,UAAU;EAEd,CAAC;EACD,QAAQ,MAAM,GAAG,aAAa;GAC5B,QAAQ,MAAM;EAChB,CAAC;CACH,CAAC;AACH;;;;;;;;ACrEA,SAAgB,YAAY,MAAY,IAAa;CACnD,QAAQ,WAAyB;EAC/B,IAAI;EACJ,IAAI;GACF,MAAM,qCAAqC,EAAE;GAC7C,SAAS,GAAG,gBAAgB,QAAQ;IAClC,iBAAiB;KACf,SAAS;KACT,QAAQ,GAAG,aAAa;KACxB,QAAQ;KACR,wBAAwB;IAC1B;IACA,mBAAmB;IACnB,UAAU;IACV,cAAc,EACZ,QAAQ,CAAC,gBAAgB,IAAI,IAAI,CAAC,EACpC;GACF,CAAC;EACH,SAAS,GAAG;GACV,IAAI,aAAa,OACf,EAAE,UAAU,yBAAyB,GAAG;EAC9C,EAAE,WAAW;GAET,MAAM;EACR;EACA,IAAI,OAAO,aAAa;GACtB,MAAM,OAAO,OAAO,YAAY,QAC9B,MAAK,EAAE,aAAa,GAAG,mBAAmB,KAC5C;GACA,IAAI,KAAK,QACP,MAAM,IAAI,MACR,GAAG,qCAAqC,MAAM;IAC5C,uBAAsB,aAAY;IAClC,2BAA2B,QAAQ,IAAI;IACvC,kBAAkB,GAAG,IAAI;GAC3B,CAAC,CACH;EAEJ;CACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"svelte_extractor-DDQhqn4P.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":"vue_extractor-DFGbWp6f.js","names":[],"sources":["../vue_extractor.ts"],"sourcesContent":["import {\n NodeTypes,\n type TextNode,\n type CompoundExpressionNode,\n type DirectiveNode,\n type ElementNode,\n type InterpolationNode,\n type RootNode,\n type SimpleExpressionNode,\n type TemplateChildNode,\n} from '@vue/compiler-core'\nimport {parse} from 'vue/compiler-sfc'\n\nexport type ScriptParseFn = (source: string) => void\n\nfunction walk(\n node:\n | RootNode\n | TemplateChildNode\n | SimpleExpressionNode\n | CompoundExpressionNode\n | InterpolationNode\n | TextNode\n | string\n | symbol\n | undefined,\n visitor: (\n node:\n | ElementNode\n | InterpolationNode\n | CompoundExpressionNode\n | SimpleExpressionNode\n ) => void\n) {\n if (typeof node !== 'object' || node == null) {\n return\n }\n if (node.type === NodeTypes.ROOT) {\n node.children.forEach(n => walk(n, visitor))\n return\n }\n if (\n node.type !== NodeTypes.ELEMENT &&\n node.type !== NodeTypes.COMPOUND_EXPRESSION &&\n node.type !== NodeTypes.INTERPOLATION\n ) {\n return\n }\n visitor(node)\n if (node.type === NodeTypes.INTERPOLATION) {\n visitor(node.content)\n } else if (node.type === NodeTypes.ELEMENT) {\n node.children.forEach(n => walk(n, visitor))\n node.props\n .filter(\n (prop): prop is DirectiveNode => prop.type === NodeTypes.DIRECTIVE\n )\n .filter(prop => !!prop.exp)\n .forEach(prop => visitor(prop.exp!))\n } else {\n node.children.forEach(n => walk(n, visitor))\n }\n}\n\nfunction templateSimpleExpressionNodeVisitor(parseScriptFn: ScriptParseFn) {\n return (\n n:\n | ElementNode\n | CompoundExpressionNode\n | CompoundExpressionNode['children'][0]\n ) => {\n if (typeof n !== 'object') {\n return\n }\n if (n.type !== NodeTypes.SIMPLE_EXPRESSION) {\n return\n }\n\n const {content} = n as SimpleExpressionNode\n // Wrap this in () since a vue comp node attribute can just be\n // an object literal which, by itself is invalid TS\n // but with () it becomes an ExpressionStatement\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}\n\nexport function parseFile(\n source: string,\n filename: string,\n parseScriptFn: ScriptParseFn\n): void {\n const {descriptor, errors} = parse(source, {\n filename,\n })\n if (errors.length) {\n throw errors[0]\n }\n const {script, scriptSetup, template} = descriptor\n\n if (template) {\n walk(template.ast, templateSimpleExpressionNodeVisitor(parseScriptFn))\n }\n\n if (script) {\n parseScriptFn(script.content)\n }\n\n if (scriptSetup) {\n parseScriptFn(scriptSetup.content)\n }\n}\n"],"mappings":";;;AAeA,SAAS,KACP,MAUA,SAOA;CACA,IAAI,OAAO,SAAS,YAAY,QAAQ,MACtC;CAEF,IAAI,KAAK,SAAS,UAAU,MAAM;EAChC,KAAK,SAAS,SAAQ,MAAK,KAAK,GAAG,OAAO,CAAC;EAC3C;CACF;CACA,IACE,KAAK,SAAS,UAAU,WACxB,KAAK,SAAS,UAAU,uBACxB,KAAK,SAAS,UAAU,eAExB;CAEF,QAAQ,IAAI;CACZ,IAAI,KAAK,SAAS,UAAU,eAC1B,QAAQ,KAAK,OAAO;MACf,IAAI,KAAK,SAAS,UAAU,SAAS;EAC1C,KAAK,SAAS,SAAQ,MAAK,KAAK,GAAG,OAAO,CAAC;EAC3C,KAAK,MACF,QACE,SAAgC,KAAK,SAAS,UAAU,SAC3D,CAAC,CACA,QAAO,SAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,CAC1B,SAAQ,SAAQ,QAAQ,KAAK,GAAI,CAAC;CACvC,OACE,KAAK,SAAS,SAAQ,MAAK,KAAK,GAAG,OAAO,CAAC;AAE/C;AAEA,SAAS,oCAAoC,eAA8B;CACzE,QACE,MAIG;EACH,IAAI,OAAO,MAAM,UACf;EAEF,IAAI,EAAE,SAAS,UAAU,mBACvB;EAGF,MAAM,EAAC,YAAW;EAIlB,IAAI;GACF,cAAc,IAAI,QAAQ,EAAE;EAC9B,SAAS,GAAG;GACV,QAAQ,KACN,oBAAoB,QAAQ,uDAC5B,CACF;EACF;CACF;AACF;AAEA,SAAgB,UACd,QACA,UACA,eACM;CACN,MAAM,EAAC,YAAY,WAAU,MAAM,QAAQ,EACzC,SACF,CAAC;CACD,IAAI,OAAO,QACT,MAAM,OAAO;CAEf,MAAM,EAAC,QAAQ,aAAa,aAAY;CAExC,IAAI,UACF,KAAK,SAAS,KAAK,oCAAoC,aAAa,CAAC;CAGvE,IAAI,QACF,cAAc,OAAO,OAAO;CAG9B,IAAI,aACF,cAAc,YAAY,OAAO;AAErC"}
|