must-cli 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/LICENSE +22 -0
  2. package/dist/cli/index.d.ts +2 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +192 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +5 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config/index.d.ts +16 -0
  11. package/dist/config/index.d.ts.map +1 -0
  12. package/dist/config/index.js +142 -0
  13. package/dist/config/index.js.map +1 -0
  14. package/dist/extractors/base.d.ts +59 -0
  15. package/dist/extractors/base.d.ts.map +1 -0
  16. package/dist/extractors/base.js +204 -0
  17. package/dist/extractors/base.js.map +1 -0
  18. package/dist/extractors/html.d.ts +8 -0
  19. package/dist/extractors/html.d.ts.map +1 -0
  20. package/dist/extractors/html.js +70 -0
  21. package/dist/extractors/html.js.map +1 -0
  22. package/dist/extractors/index.d.ts +33 -0
  23. package/dist/extractors/index.d.ts.map +1 -0
  24. package/dist/extractors/index.js +86 -0
  25. package/dist/extractors/index.js.map +1 -0
  26. package/dist/extractors/javascript.d.ts +17 -0
  27. package/dist/extractors/javascript.d.ts.map +1 -0
  28. package/dist/extractors/javascript.js +249 -0
  29. package/dist/extractors/javascript.js.map +1 -0
  30. package/dist/extractors/vue.d.ts +9 -0
  31. package/dist/extractors/vue.d.ts.map +1 -0
  32. package/dist/extractors/vue.js +99 -0
  33. package/dist/extractors/vue.js.map +1 -0
  34. package/dist/index.d.ts +36 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +414 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/transformer/index.d.ts +102 -0
  39. package/dist/transformer/index.d.ts.map +1 -0
  40. package/dist/transformer/index.js +844 -0
  41. package/dist/transformer/index.js.map +1 -0
  42. package/dist/translators/azure.d.ts +7 -0
  43. package/dist/translators/azure.d.ts.map +1 -0
  44. package/dist/translators/azure.js +43 -0
  45. package/dist/translators/azure.js.map +1 -0
  46. package/dist/translators/baidu.d.ts +8 -0
  47. package/dist/translators/baidu.d.ts.map +1 -0
  48. package/dist/translators/baidu.js +67 -0
  49. package/dist/translators/baidu.js.map +1 -0
  50. package/dist/translators/base.d.ts +15 -0
  51. package/dist/translators/base.d.ts.map +1 -0
  52. package/dist/translators/base.js +50 -0
  53. package/dist/translators/base.js.map +1 -0
  54. package/dist/translators/custom.d.ts +19 -0
  55. package/dist/translators/custom.d.ts.map +1 -0
  56. package/dist/translators/custom.js +82 -0
  57. package/dist/translators/custom.js.map +1 -0
  58. package/dist/translators/google.d.ts +6 -0
  59. package/dist/translators/google.d.ts.map +1 -0
  60. package/dist/translators/google.js +25 -0
  61. package/dist/translators/google.js.map +1 -0
  62. package/dist/translators/index.d.ts +16 -0
  63. package/dist/translators/index.d.ts.map +1 -0
  64. package/dist/translators/index.js +57 -0
  65. package/dist/translators/index.js.map +1 -0
  66. package/dist/types/index.d.ts +385 -0
  67. package/dist/types/index.d.ts.map +1 -0
  68. package/dist/types/index.js +3 -0
  69. package/dist/types/index.js.map +1 -0
  70. package/dist/utils/file.d.ts +5 -0
  71. package/dist/utils/file.d.ts.map +1 -0
  72. package/dist/utils/file.js +41 -0
  73. package/dist/utils/file.js.map +1 -0
  74. package/dist/utils/interpolation.d.ts +68 -0
  75. package/dist/utils/interpolation.d.ts.map +1 -0
  76. package/dist/utils/interpolation.js +174 -0
  77. package/dist/utils/interpolation.js.map +1 -0
  78. package/dist/utils/text.d.ts +42 -0
  79. package/dist/utils/text.d.ts.map +1 -0
  80. package/dist/utils/text.js +234 -0
  81. package/dist/utils/text.js.map +1 -0
  82. package/package.json +86 -0
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseExtractor = void 0;
4
+ const interpolation_1 = require("../utils/interpolation");
5
+ class BaseExtractor {
6
+ constructor(config = {}) {
7
+ this.warnings = [];
8
+ this.options = {
9
+ includeComments: false,
10
+ includeTemplateLiterals: true,
11
+ includeJSX: true,
12
+ includeVue: true,
13
+ includeHTML: true,
14
+ ...config.options
15
+ };
16
+ this.sourceLanguage = config.sourceLanguage || 'zh-CN';
17
+ this.interpolation = (0, interpolation_1.createInterpolationHandler)(config.interpolation);
18
+ }
19
+ /**
20
+ * 清空警告列表
21
+ */
22
+ clearWarnings() {
23
+ this.warnings = [];
24
+ }
25
+ /**
26
+ * 获取所有警告
27
+ */
28
+ getWarnings() {
29
+ return [...this.warnings];
30
+ }
31
+ /**
32
+ * 添加警告
33
+ */
34
+ addWarning(type, severity, message, file, line, column, code, suggestion) {
35
+ this.warnings.push({
36
+ type,
37
+ severity,
38
+ message,
39
+ file,
40
+ line,
41
+ column,
42
+ code,
43
+ suggestion
44
+ });
45
+ }
46
+ /**
47
+ * 分析表达式复杂度并返回警告信息(如果需要)
48
+ */
49
+ analyzeExpressionComplexity(expression, file, line, column) {
50
+ // 简单标识符
51
+ if (expression.type === 'Identifier') {
52
+ return { isComplex: false, name: expression.name };
53
+ }
54
+ // 简单成员表达式: user.name
55
+ if (expression.type === 'MemberExpression') {
56
+ if (!expression.computed) {
57
+ const objectName = this.extractExpressionName(expression.object);
58
+ const propertyName = expression.property.type === 'Identifier'
59
+ ? expression.property.name
60
+ : undefined;
61
+ if (objectName && propertyName) {
62
+ return { isComplex: false, name: `${objectName}_${propertyName}` };
63
+ }
64
+ }
65
+ // 动态成员访问: obj[key]
66
+ this.addWarning('complex-expression', 'warning', '动态成员访问表达式,无法静态提取变量名', file, line, column, this.getExpressionCode(expression), '建议将表达式结果先赋值给变量,再在模板中使用');
67
+ return { isComplex: true };
68
+ }
69
+ // 嵌套模板字符串
70
+ if (expression.type === 'TemplateLiteral') {
71
+ this.addWarning('nested-template', 'warning', '嵌套的模板字符串,难以提取和翻译', file, line, column, this.getExpressionCode(expression), '建议将嵌套的模板字符串拆分为独立的翻译单元');
72
+ return { isComplex: true };
73
+ }
74
+ // 条件表达式: a ? b : c
75
+ if (expression.type === 'ConditionalExpression') {
76
+ this.addWarning('conditional-expression', 'warning', '条件表达式,翻译结果可能不一致', file, line, column, this.getExpressionCode(expression), '建议将条件表达式移到模板外部,或拆分为多个独立的翻译');
77
+ return { isComplex: true };
78
+ }
79
+ // 函数调用
80
+ if (expression.type === 'CallExpression') {
81
+ // 检查是否是简单的格式化函数
82
+ const calleeName = expression.callee.type === 'Identifier'
83
+ ? expression.callee.name
84
+ : undefined;
85
+ // 允许一些常见的格式化函数
86
+ const allowedFunctions = ['String', 'Number', 'toString', 'toFixed', 'toLocaleString'];
87
+ if (calleeName && allowedFunctions.includes(calleeName)) {
88
+ return { isComplex: false, name: `formatted` };
89
+ }
90
+ this.addWarning('function-call', 'info', '函数调用表达式,无法静态分析返回值', file, line, column, this.getExpressionCode(expression), '建议将函数调用结果先赋值给变量,再在模板中使用');
91
+ return { isComplex: true };
92
+ }
93
+ // 二元表达式: a + b, a - b
94
+ if (expression.type === 'BinaryExpression') {
95
+ this.addWarning('binary-expression', 'info', '二元表达式,无法静态分析计算结果', file, line, column, this.getExpressionCode(expression), '建议将计算结果先赋值给变量,再在模板中使用');
96
+ return { isComplex: true };
97
+ }
98
+ // 其他复杂表达式
99
+ this.addWarning('complex-expression', 'info', `复杂表达式类型: ${expression.type}`, file, line, column, this.getExpressionCode(expression), '建议简化表达式或将结果先赋值给变量');
100
+ return { isComplex: true };
101
+ }
102
+ /**
103
+ * 获取表达式的代码片段(简化版)
104
+ */
105
+ getExpressionCode(expression) {
106
+ try {
107
+ // 尝试从位置信息构建代码预览
108
+ if (expression.start !== undefined && expression.end !== undefined) {
109
+ return `[${expression.type}]`;
110
+ }
111
+ return `[${expression.type}]`;
112
+ }
113
+ catch {
114
+ return '[unknown]';
115
+ }
116
+ }
117
+ /**
118
+ * 生成占位符
119
+ * @param index 占位符索引
120
+ * @param name 变量名(用于命名参数模式)
121
+ */
122
+ formatPlaceholder(index, name) {
123
+ return this.interpolation.formatPlaceholder(index, name);
124
+ }
125
+ /**
126
+ * 是否使用命名参数
127
+ */
128
+ get useNamedParams() {
129
+ return this.interpolation.useNamedParams;
130
+ }
131
+ /**
132
+ * 从表达式节点提取变量名
133
+ */
134
+ extractExpressionName(expression) {
135
+ // 简单标识符: username
136
+ if (expression.type === 'Identifier') {
137
+ return expression.name;
138
+ }
139
+ // 成员表达式: user.name -> 'user_name'
140
+ if (expression.type === 'MemberExpression') {
141
+ const object = this.extractExpressionName(expression.object);
142
+ const property = expression.property.type === 'Identifier'
143
+ ? expression.property.name
144
+ : undefined;
145
+ if (object && property) {
146
+ return `${object}_${property}`;
147
+ }
148
+ }
149
+ return undefined;
150
+ }
151
+ createExtractedText(text, file, line, column, type, context) {
152
+ return {
153
+ text: text.trim(),
154
+ file,
155
+ line,
156
+ column,
157
+ context,
158
+ type
159
+ };
160
+ }
161
+ isValidText(text) {
162
+ // 去除模板占位符后检查文本
163
+ const placeholderRegex = this.interpolation.getPlaceholderRegex();
164
+ const textWithoutPlaceholders = text.replace(placeholderRegex, '');
165
+ // Filter out very short texts, numbers, and special characters
166
+ if (textWithoutPlaceholders.trim().length < 2)
167
+ return false;
168
+ if (/^[0-9\s\-_\.]+$/.test(textWithoutPlaceholders))
169
+ return false;
170
+ if (/^[a-zA-Z]{1,2}$/.test(textWithoutPlaceholders.trim()))
171
+ return false;
172
+ // Filter out URLs and paths
173
+ if (/^(https?:\/\/|\/|\.\/|\.\.\/|~\/)/.test(text))
174
+ return false;
175
+ if (/^[@\.][\w\-\/]+/.test(text))
176
+ return false; // npm packages, relative paths
177
+ // Filter out file extensions
178
+ if (/^\.[a-z]{2,4}$/i.test(text))
179
+ return false;
180
+ // Filter out hex colors
181
+ if (/^#[0-9a-f]{3,8}$/i.test(text))
182
+ return false;
183
+ // 根据源语言决定提取策略
184
+ // 目前只支持中文作为源语言,只提取包含中文的文本
185
+ // 未来可以扩展支持英文等其他语言
186
+ if (this.sourceLanguage.startsWith('zh')) {
187
+ // 中文源语言:必须包含中文字符
188
+ return /[\u4e00-\u9fa5]/.test(textWithoutPlaceholders);
189
+ }
190
+ // 日文源语言:必须包含日文字符(平假名、片假名、汉字)
191
+ if (this.sourceLanguage.startsWith('ja')) {
192
+ return /[\u3040-\u309f\u30a0-\u30ff\u4e00-\u9fa5]/.test(textWithoutPlaceholders);
193
+ }
194
+ // 韩文源语言:必须包含韩文字符
195
+ if (this.sourceLanguage.startsWith('ko')) {
196
+ return /[\uac00-\ud7af\u1100-\u11ff]/.test(textWithoutPlaceholders);
197
+ }
198
+ // 其他语言(如英文):暂不支持,返回 false
199
+ // 英文文案和代码本身都是英文,不好区分,未来再扩展
200
+ return false;
201
+ }
202
+ }
203
+ exports.BaseExtractor = BaseExtractor;
204
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/extractors/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { BaseExtractor, ExtractorConfig } from './base';
2
+ import { ExtractedText } from '../types';
3
+ export declare class HTMLExtractor extends BaseExtractor {
4
+ constructor(config?: ExtractorConfig);
5
+ extract(filePath: string): Promise<ExtractedText[]>;
6
+ private getLineNumber;
7
+ }
8
+ //# sourceMappingURL=html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/extractors/html.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,qBAAa,aAAc,SAAQ,aAAa;gBAClC,MAAM,GAAE,eAAoB;IAGlC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA6EzD,OAAO,CAAC,aAAa;CAStB"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HTMLExtractor = void 0;
4
+ const fs_1 = require("fs");
5
+ const jsdom_1 = require("jsdom");
6
+ const base_1 = require("./base");
7
+ class HTMLExtractor extends base_1.BaseExtractor {
8
+ constructor(config = {}) {
9
+ super(config);
10
+ }
11
+ async extract(filePath) {
12
+ const extractedTexts = [];
13
+ try {
14
+ const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
15
+ const dom = new jsdom_1.JSDOM(content);
16
+ const document = dom.window.document;
17
+ // Extract text content from all elements
18
+ const walker = document.createTreeWalker(document.body || document.documentElement, dom.window.NodeFilter.SHOW_TEXT, {
19
+ acceptNode: (node) => {
20
+ // Skip script and style tags
21
+ const parent = node.parentElement;
22
+ if (parent && (parent.tagName === 'SCRIPT' || parent.tagName === 'STYLE')) {
23
+ return dom.window.NodeFilter.FILTER_REJECT;
24
+ }
25
+ const text = node.textContent?.trim();
26
+ if (text && this.isValidText(text)) {
27
+ return dom.window.NodeFilter.FILTER_ACCEPT;
28
+ }
29
+ return dom.window.NodeFilter.FILTER_REJECT;
30
+ }
31
+ });
32
+ let node;
33
+ while ((node = walker.nextNode())) {
34
+ const text = node.textContent?.trim();
35
+ if (text && this.isValidText(text)) {
36
+ // Try to get line number from source
37
+ const lineNumber = this.getLineNumber(content, text);
38
+ extractedTexts.push(this.createExtractedText(text, filePath, lineNumber, 0, 'html'));
39
+ }
40
+ }
41
+ // Extract text from attributes like title, alt, placeholder
42
+ const elementsWithTextAttrs = document.querySelectorAll('[title], [alt], [placeholder], [aria-label]');
43
+ elementsWithTextAttrs.forEach((element) => {
44
+ const attrs = ['title', 'alt', 'placeholder', 'aria-label'];
45
+ attrs.forEach(attr => {
46
+ const value = element.getAttribute(attr);
47
+ if (value && this.isValidText(value)) {
48
+ const lineNumber = this.getLineNumber(content, value);
49
+ extractedTexts.push(this.createExtractedText(value, filePath, lineNumber, 0, 'html'));
50
+ }
51
+ });
52
+ });
53
+ }
54
+ catch (error) {
55
+ console.warn(`Failed to parse HTML file ${filePath}:`, error);
56
+ }
57
+ return extractedTexts;
58
+ }
59
+ getLineNumber(content, text) {
60
+ const lines = content.split('\n');
61
+ for (let i = 0; i < lines.length; i++) {
62
+ if (lines[i].includes(text)) {
63
+ return i + 1;
64
+ }
65
+ }
66
+ return 1;
67
+ }
68
+ }
69
+ exports.HTMLExtractor = HTMLExtractor;
70
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/extractors/html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { BaseExtractor, ExtractorConfig } from './base';
2
+ import { JavaScriptExtractor } from './javascript';
3
+ import { VueExtractor } from './vue';
4
+ import { HTMLExtractor } from './html';
5
+ import { ExtractedText, ExtractorOptions, InterpolationConfig, ExtractionWarning } from '../types';
6
+ export interface TextExtractorConfig {
7
+ options?: ExtractorOptions;
8
+ sourceLanguage?: string;
9
+ interpolation?: InterpolationConfig;
10
+ }
11
+ export interface TextExtractResult {
12
+ texts: ExtractedText[];
13
+ warnings: ExtractionWarning[];
14
+ }
15
+ export declare class TextExtractor {
16
+ private extractors;
17
+ private allWarnings;
18
+ constructor(config?: TextExtractorConfig);
19
+ /**
20
+ * 清空所有警告
21
+ */
22
+ clearWarnings(): void;
23
+ /**
24
+ * 获取所有警告
25
+ */
26
+ getWarnings(): ExtractionWarning[];
27
+ extractFromFile(filePath: string): Promise<ExtractedText[]>;
28
+ extractFromFileWithWarnings(filePath: string): Promise<TextExtractResult>;
29
+ private getFileExtension;
30
+ }
31
+ export { BaseExtractor, JavaScriptExtractor, VueExtractor, HTMLExtractor };
32
+ export type { ExtractedText, ExtractorOptions, ExtractorConfig };
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extractors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAiB,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEnG,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAyC;IAC3D,OAAO,CAAC,WAAW,CAA2B;gBAElC,MAAM,GAAE,mBAAwB;IAe5C;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;OAEG;IACH,WAAW,IAAI,iBAAiB,EAAE;IAI5B,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAK3D,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA6B/E,OAAO,CAAC,gBAAgB;CAazB;AAED,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;AAC3E,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HTMLExtractor = exports.VueExtractor = exports.JavaScriptExtractor = exports.BaseExtractor = exports.TextExtractor = void 0;
4
+ const base_1 = require("./base");
5
+ Object.defineProperty(exports, "BaseExtractor", { enumerable: true, get: function () { return base_1.BaseExtractor; } });
6
+ const javascript_1 = require("./javascript");
7
+ Object.defineProperty(exports, "JavaScriptExtractor", { enumerable: true, get: function () { return javascript_1.JavaScriptExtractor; } });
8
+ const vue_1 = require("./vue");
9
+ Object.defineProperty(exports, "VueExtractor", { enumerable: true, get: function () { return vue_1.VueExtractor; } });
10
+ const html_1 = require("./html");
11
+ Object.defineProperty(exports, "HTMLExtractor", { enumerable: true, get: function () { return html_1.HTMLExtractor; } });
12
+ class TextExtractor {
13
+ constructor(config = {}) {
14
+ this.extractors = new Map();
15
+ this.allWarnings = [];
16
+ const extractorConfig = {
17
+ options: config.options,
18
+ sourceLanguage: config.sourceLanguage,
19
+ interpolation: config.interpolation
20
+ };
21
+ this.extractors.set('js', new javascript_1.JavaScriptExtractor(extractorConfig));
22
+ this.extractors.set('jsx', new javascript_1.JavaScriptExtractor(extractorConfig));
23
+ this.extractors.set('ts', new javascript_1.JavaScriptExtractor(extractorConfig));
24
+ this.extractors.set('tsx', new javascript_1.JavaScriptExtractor(extractorConfig));
25
+ this.extractors.set('vue', new vue_1.VueExtractor(extractorConfig));
26
+ this.extractors.set('html', new html_1.HTMLExtractor(extractorConfig));
27
+ }
28
+ /**
29
+ * 清空所有警告
30
+ */
31
+ clearWarnings() {
32
+ this.allWarnings = [];
33
+ }
34
+ /**
35
+ * 获取所有警告
36
+ */
37
+ getWarnings() {
38
+ return [...this.allWarnings];
39
+ }
40
+ async extractFromFile(filePath) {
41
+ const result = await this.extractFromFileWithWarnings(filePath);
42
+ return result.texts;
43
+ }
44
+ async extractFromFileWithWarnings(filePath) {
45
+ const extension = this.getFileExtension(filePath);
46
+ const extractor = this.extractors.get(extension);
47
+ if (!extractor) {
48
+ console.warn(`No extractor found for file type: ${extension}`);
49
+ return { texts: [], warnings: [] };
50
+ }
51
+ try {
52
+ // 检查提取器是否支持带警告的提取
53
+ const jsExtractor = extractor;
54
+ if (typeof jsExtractor.extractWithWarnings === 'function') {
55
+ const result = await jsExtractor.extractWithWarnings(filePath);
56
+ this.allWarnings.push(...result.warnings);
57
+ return result;
58
+ }
59
+ // 回退到普通提取
60
+ const texts = await extractor.extract(filePath);
61
+ const warnings = extractor.getWarnings();
62
+ this.allWarnings.push(...warnings);
63
+ return { texts, warnings };
64
+ }
65
+ catch (error) {
66
+ console.error(`Error extracting from ${filePath}:`, error);
67
+ return { texts: [], warnings: [] };
68
+ }
69
+ }
70
+ getFileExtension(filePath) {
71
+ const parts = filePath.split('.');
72
+ if (parts.length < 2)
73
+ return '';
74
+ const extension = parts[parts.length - 1].toLowerCase();
75
+ // Handle special cases
76
+ if (extension === 'jsx')
77
+ return 'jsx';
78
+ if (extension === 'tsx')
79
+ return 'tsx';
80
+ if (extension === 'ts')
81
+ return 'ts';
82
+ return extension;
83
+ }
84
+ }
85
+ exports.TextExtractor = TextExtractor;
86
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extractors/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { BaseExtractor, ExtractorConfig, ExtractResult } from './base';
2
+ import { ExtractedText } from '../types';
3
+ export declare class JavaScriptExtractor extends BaseExtractor {
4
+ constructor(config?: ExtractorConfig);
5
+ extract(filePath: string): Promise<ExtractedText[]>;
6
+ extractWithWarnings(filePath: string): Promise<ExtractResult>;
7
+ /**
8
+ * 获取 AST 节点对应的源代码
9
+ */
10
+ private getNodeCode;
11
+ /**
12
+ * 合并 JSX 子元素为一个带插值的字符串
13
+ * 例如: "当前等级:" + {level} + " 级" => "当前等级:{{0}} 级"
14
+ */
15
+ private mergeJSXChildren;
16
+ }
17
+ //# sourceMappingURL=javascript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript.d.ts","sourceRoot":"","sources":["../../src/extractors/javascript.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,qBAAa,mBAAoB,SAAQ,aAAa;gBACxC,MAAM,GAAE,eAAoB;IAIlC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAKnD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA0NnE;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAkCzB"}