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
package/dist/index.js ADDED
@@ -0,0 +1,414 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TranslationManager = exports.TextExtractor = exports.ConfigManager = exports.AutoI18n = void 0;
37
+ const config_1 = require("./config");
38
+ Object.defineProperty(exports, "ConfigManager", { enumerable: true, get: function () { return config_1.ConfigManager; } });
39
+ const extractors_1 = require("./extractors");
40
+ Object.defineProperty(exports, "TextExtractor", { enumerable: true, get: function () { return extractors_1.TextExtractor; } });
41
+ const translators_1 = require("./translators");
42
+ Object.defineProperty(exports, "TranslationManager", { enumerable: true, get: function () { return translators_1.TranslationManager; } });
43
+ const transformer_1 = require("./transformer");
44
+ const file_1 = require("./utils/file");
45
+ const text_1 = require("./utils/text");
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ class AutoI18n {
49
+ constructor(config) {
50
+ this.existingKeys = new Set();
51
+ const configManager = new config_1.ConfigManager();
52
+ this.config = config || configManager.getConfig();
53
+ // 传递源语言和插值配置给提取器
54
+ this.extractor = new extractors_1.TextExtractor({
55
+ sourceLanguage: this.config.sourceLanguage,
56
+ interpolation: this.config.interpolation
57
+ });
58
+ this.translator = new translators_1.TranslationManager(this.config);
59
+ // 加载已存在的 keys
60
+ this.loadExistingKeys();
61
+ }
62
+ /**
63
+ * 加载已存在的翻译 keys
64
+ */
65
+ loadExistingKeys() {
66
+ try {
67
+ const sourceFile = path.join(this.config.outputDir, `${this.config.sourceLanguage}.json`);
68
+ if (fs.existsSync(sourceFile)) {
69
+ const content = fs.readFileSync(sourceFile, 'utf-8');
70
+ const translations = JSON.parse(content);
71
+ Object.keys(translations).forEach(key => this.existingKeys.add(key));
72
+ }
73
+ }
74
+ catch (error) {
75
+ // 如果文件不存在或无法读取,继续使用空的 keys
76
+ }
77
+ }
78
+ async extractTexts() {
79
+ const result = await this.extractTextsWithWarnings();
80
+ return result.texts;
81
+ }
82
+ async extractTextsWithWarnings() {
83
+ console.log('🔍 Extracting texts from files...');
84
+ const files = await (0, file_1.findFiles)(this.config.inputPatterns, this.config.excludePatterns);
85
+ console.log(`📁 Found ${files.length} files to process`);
86
+ const allExtractedTexts = [];
87
+ this.extractor.clearWarnings();
88
+ for (const file of files) {
89
+ try {
90
+ const result = await this.extractor.extractFromFileWithWarnings(file);
91
+ allExtractedTexts.push(...result.texts);
92
+ }
93
+ catch (error) {
94
+ console.warn(`⚠️ Failed to extract from ${file}:`, error);
95
+ }
96
+ }
97
+ const warnings = this.extractor.getWarnings();
98
+ // 如果有警告,输出提示
99
+ if (warnings.length > 0) {
100
+ const errorCount = warnings.filter(w => w.severity === 'error').length;
101
+ const warningCount = warnings.filter(w => w.severity === 'warning').length;
102
+ const infoCount = warnings.filter(w => w.severity === 'info').length;
103
+ if (errorCount > 0 || warningCount > 0) {
104
+ console.log(`⚠️ 发现 ${warnings.length} 条提取警告 (${errorCount} 错误, ${warningCount} 警告, ${infoCount} 信息)`);
105
+ }
106
+ }
107
+ console.log(`✅ Extracted ${allExtractedTexts.length} text strings`);
108
+ return { texts: allExtractedTexts, warnings };
109
+ }
110
+ async translateTexts(extractedTexts) {
111
+ console.log('🌐 Translating texts...');
112
+ // 去重并保留第一个出现的位置信息
113
+ const textMap = new Map();
114
+ extractedTexts.forEach(extracted => {
115
+ const normalized = extracted.text.trim();
116
+ if (normalized && !textMap.has(normalized)) {
117
+ textMap.set(normalized, extracted);
118
+ }
119
+ });
120
+ const uniqueTexts = Array.from(textMap.keys());
121
+ console.log(`📝 Found ${uniqueTexts.length} unique texts to translate`);
122
+ // Translate to all target languages
123
+ const translations = await this.translator.translateToMultipleLanguages(uniqueTexts, this.config.sourceLanguage, this.config.targetLanguages);
124
+ // Generate keys and organize translations
125
+ const result = {};
126
+ const sourceMap = {};
127
+ // 初始化每个语言的翻译对象
128
+ for (const targetLang of this.config.targetLanguages) {
129
+ result[targetLang] = {};
130
+ }
131
+ // 处理源语言
132
+ result[this.config.sourceLanguage] = {};
133
+ // 创建 text -> existing key 的映射
134
+ const existingTextToKey = new Map();
135
+ try {
136
+ const sourceFile = path.join(this.config.outputDir, `${this.config.sourceLanguage}.json`);
137
+ if (fs.existsSync(sourceFile)) {
138
+ const content = JSON.parse(fs.readFileSync(sourceFile, 'utf-8'));
139
+ Object.entries(content).forEach(([key, text]) => {
140
+ existingTextToKey.set(text, key);
141
+ });
142
+ }
143
+ }
144
+ catch (error) {
145
+ // 忽略错误
146
+ }
147
+ // 全局计数器(用于 prefixOnly 或 always 计数器模式)
148
+ const globalCounter = { value: this.config.keyConfig?.counterStart ?? 0 };
149
+ for (const sourceText of uniqueTexts) {
150
+ const extracted = textMap.get(sourceText);
151
+ // 如果文本已经存在,使用已有的 key
152
+ let key;
153
+ if (existingTextToKey.has(sourceText)) {
154
+ key = existingTextToKey.get(sourceText);
155
+ }
156
+ else {
157
+ // 获取英文翻译用于生成 key
158
+ const enTranslations = translations['en'] || translations[this.config.targetLanguages[0]];
159
+ const enTranslation = enTranslations?.find(t => t.sourceText === sourceText);
160
+ const translatedForKey = enTranslation?.translatedText || sourceText;
161
+ // 从 context 中提取参数名(如果启用了 includeParams 或 includeParamsInKey)
162
+ let paramNames;
163
+ const shouldIncludeParams = this.config.keyConfig?.includeParams ||
164
+ this.config.interpolation?.includeParamsInKey;
165
+ if (shouldIncludeParams) {
166
+ // 首先尝试从 context 中获取(模板字符串)
167
+ if (extracted.context) {
168
+ try {
169
+ const ctx = JSON.parse(extracted.context);
170
+ paramNames = ctx.paramNames;
171
+ }
172
+ catch {
173
+ // 忽略解析错误
174
+ }
175
+ }
176
+ // 如果没有从 context 获取到,尝试从文本中提取 {name} 格式的参数
177
+ if (!paramNames || paramNames.length === 0) {
178
+ const prefix = this.config.interpolation?.prefix || '{{';
179
+ const suffix = this.config.interpolation?.suffix || '}}';
180
+ // 构建正则表达式来匹配占位符
181
+ const escapedPrefix = prefix.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
182
+ const escapedSuffix = suffix.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
183
+ const regex = new RegExp(`${escapedPrefix}([a-zA-Z_][a-zA-Z0-9_]*)${escapedSuffix}`, 'g');
184
+ const matches = [...sourceText.matchAll(regex)];
185
+ if (matches.length > 0) {
186
+ paramNames = matches.map(m => m[1]);
187
+ }
188
+ }
189
+ }
190
+ // 生成新的唯一 key
191
+ key = (0, text_1.generateKey)({
192
+ text: sourceText,
193
+ filePath: extracted.file,
194
+ translatedText: translatedForKey,
195
+ appName: this.config.appName,
196
+ keyStyle: this.config.keyStyle || 'dot',
197
+ existingKeys: this.existingKeys,
198
+ maxKeyLength: this.config.keyMaxLength || 50,
199
+ paramNames,
200
+ keyConfig: this.config.keyConfig,
201
+ globalCounter
202
+ });
203
+ this.existingKeys.add(key);
204
+ }
205
+ sourceMap[key] = extracted;
206
+ // 添加源语言文本
207
+ result[this.config.sourceLanguage][key] = sourceText;
208
+ // 添加目标语言翻译
209
+ for (const targetLang of this.config.targetLanguages) {
210
+ const langTranslations = translations[targetLang];
211
+ if (langTranslations) {
212
+ const translation = langTranslations.find(t => t.sourceText === sourceText);
213
+ result[targetLang][key] = translation?.translatedText || sourceText;
214
+ }
215
+ }
216
+ }
217
+ console.log('✅ Translation completed');
218
+ return { translations: result, sourceMap };
219
+ }
220
+ async generateI18nFiles(translations, sourceMap) {
221
+ console.log('📄 Generating i18n files...');
222
+ (0, file_1.ensureOutputDirectory)(this.config.outputDir);
223
+ // 加载现有翻译
224
+ const existingTranslations = {};
225
+ for (const lang of [this.config.sourceLanguage, ...this.config.targetLanguages]) {
226
+ const langFile = path.join(this.config.outputDir, `${lang}.json`);
227
+ if (fs.existsSync(langFile)) {
228
+ existingTranslations[lang] = JSON.parse(fs.readFileSync(langFile, 'utf-8'));
229
+ }
230
+ else {
231
+ existingTranslations[lang] = {};
232
+ }
233
+ }
234
+ // 合并新旧翻译
235
+ const mergedTranslations = {};
236
+ const newTranslations = {};
237
+ for (const lang of [this.config.sourceLanguage, ...this.config.targetLanguages]) {
238
+ mergedTranslations[lang] = { ...existingTranslations[lang] };
239
+ newTranslations[lang] = {};
240
+ // 添加新的翻译
241
+ for (const [key, value] of Object.entries(translations[lang] || {})) {
242
+ if (!existingTranslations[lang][key]) {
243
+ // 这是新增的翻译
244
+ newTranslations[lang][key] = value;
245
+ }
246
+ mergedTranslations[lang][key] = value;
247
+ }
248
+ }
249
+ // 写入完整的翻译文件
250
+ for (const [language, texts] of Object.entries(mergedTranslations)) {
251
+ (0, file_1.writeI18nFile)(this.config.outputDir, language, texts);
252
+ console.log(`📝 Generated ${language}.json with ${Object.keys(texts).length} translations`);
253
+ }
254
+ // 生成 patch 文件(仅包含新增的翻译)
255
+ await this.generatePatchFiles(newTranslations, sourceMap);
256
+ }
257
+ async generatePatchFiles(newTranslations, sourceMap) {
258
+ const patchDir = this.config.patchDir || path.join(this.config.outputDir, 'patches');
259
+ // 检查是否有新增翻译
260
+ const hasNewTranslations = Object.values(newTranslations).some(translations => Object.keys(translations).length > 0);
261
+ if (!hasNewTranslations) {
262
+ console.log('ℹ️ No new translations to patch');
263
+ return;
264
+ }
265
+ (0, file_1.ensureOutputDirectory)(patchDir);
266
+ // 生成与 i18n 目录相同结构的 patch 文件
267
+ // patches 目录下只包含本次新增的翻译
268
+ let newCount = 0;
269
+ for (const lang of [this.config.sourceLanguage, ...this.config.targetLanguages]) {
270
+ const langTranslations = newTranslations[lang];
271
+ if (langTranslations && Object.keys(langTranslations).length > 0) {
272
+ const patchPath = path.join(patchDir, `${lang}.json`);
273
+ (0, file_1.writeI18nFile)(patchDir, lang, langTranslations);
274
+ newCount = Object.keys(langTranslations).length;
275
+ }
276
+ }
277
+ console.log(`📦 Generated patch files in ${patchDir} (${newCount} new translations)`);
278
+ }
279
+ async transformSourceFiles(translations) {
280
+ if (!this.config.transform?.enabled) {
281
+ return;
282
+ }
283
+ console.log('🔄 Transforming source files...');
284
+ // 创建 text -> key 的映射
285
+ const keyMap = new Map();
286
+ const sourceTranslations = translations[this.config.sourceLanguage];
287
+ Object.entries(sourceTranslations).forEach(([key, text]) => {
288
+ keyMap.set(text, key);
289
+ });
290
+ // 创建转换器
291
+ const transformer = new transformer_1.CodeTransformer(this.config, keyMap);
292
+ // 获取需要转换的文件
293
+ const files = await (0, file_1.findFiles)(this.config.inputPatterns, this.config.excludePatterns);
294
+ let transformedCount = 0;
295
+ for (const file of files) {
296
+ try {
297
+ const code = fs.readFileSync(file, 'utf-8');
298
+ const result = await transformer.transform(code, file);
299
+ if (result.modified) {
300
+ fs.writeFileSync(file, result.code, 'utf-8');
301
+ transformedCount++;
302
+ console.log(` ✓ Transformed ${file}`);
303
+ }
304
+ }
305
+ catch (error) {
306
+ console.warn(` ⚠️ Failed to transform ${file}:`, error);
307
+ }
308
+ }
309
+ console.log(`✅ Transformed ${transformedCount} files`);
310
+ }
311
+ async generateReport(extractedTexts) {
312
+ console.log('📊 Generating extraction report...');
313
+ const groupedByFile = (0, file_1.groupTextsByFile)(extractedTexts);
314
+ const report = {
315
+ summary: {
316
+ totalFiles: groupedByFile.size,
317
+ totalTexts: extractedTexts.length,
318
+ uniqueTexts: (0, text_1.deduplicateTexts)(extractedTexts.map(t => t.text)).length
319
+ },
320
+ byFile: Object.fromEntries(groupedByFile)
321
+ };
322
+ (0, file_1.ensureOutputDirectory)(this.config.outputDir);
323
+ const reportPath = path.join(this.config.outputDir, 'extraction-report.json');
324
+ fs.writeFileSync(reportPath, JSON.stringify(report, null, 2), 'utf-8');
325
+ console.log(`📋 Report saved to ${reportPath}`);
326
+ }
327
+ /**
328
+ * 生成警告日志文件
329
+ */
330
+ async generateWarningsLog(warnings) {
331
+ if (warnings.length === 0) {
332
+ return;
333
+ }
334
+ (0, file_1.ensureOutputDirectory)(this.config.outputDir);
335
+ const logPath = path.join(this.config.outputDir, 'extraction-warnings.json');
336
+ // 按文件分组警告
337
+ const warningsByFile = {};
338
+ for (const warning of warnings) {
339
+ if (!warningsByFile[warning.file]) {
340
+ warningsByFile[warning.file] = [];
341
+ }
342
+ warningsByFile[warning.file].push(warning);
343
+ }
344
+ // 统计信息
345
+ const summary = {
346
+ total: warnings.length,
347
+ byType: {},
348
+ bySeverity: {
349
+ error: warnings.filter(w => w.severity === 'error').length,
350
+ warning: warnings.filter(w => w.severity === 'warning').length,
351
+ info: warnings.filter(w => w.severity === 'info').length
352
+ }
353
+ };
354
+ // 按类型统计
355
+ for (const warning of warnings) {
356
+ summary.byType[warning.type] = (summary.byType[warning.type] || 0) + 1;
357
+ }
358
+ const logContent = {
359
+ generatedAt: new Date().toISOString(),
360
+ summary,
361
+ warningsByFile
362
+ };
363
+ fs.writeFileSync(logPath, JSON.stringify(logContent, null, 2), 'utf-8');
364
+ // 控制台输出警告摘要
365
+ console.log(`⚠️ 警告日志已保存到 ${logPath}`);
366
+ // 输出主要警告到控制台
367
+ const errorWarnings = warnings.filter(w => w.severity === 'error');
368
+ const importantWarnings = warnings.filter(w => w.severity === 'warning');
369
+ if (errorWarnings.length > 0) {
370
+ console.log('\n❌ 错误:');
371
+ errorWarnings.slice(0, 5).forEach(w => {
372
+ console.log(` ${w.file}:${w.line} - ${w.message}`);
373
+ });
374
+ if (errorWarnings.length > 5) {
375
+ console.log(` ... 还有 ${errorWarnings.length - 5} 条错误`);
376
+ }
377
+ }
378
+ if (importantWarnings.length > 0) {
379
+ console.log('\n⚠️ 警告:');
380
+ importantWarnings.slice(0, 5).forEach(w => {
381
+ console.log(` ${w.file}:${w.line} - ${w.message}`);
382
+ });
383
+ if (importantWarnings.length > 5) {
384
+ console.log(` ... 还有 ${importantWarnings.length - 5} 条警告`);
385
+ }
386
+ }
387
+ }
388
+ async run() {
389
+ try {
390
+ console.log('🚀 Starting auto i18n process...');
391
+ const { texts: extractedTexts, warnings } = await this.extractTextsWithWarnings();
392
+ // 生成警告日志
393
+ if (warnings.length > 0) {
394
+ await this.generateWarningsLog(warnings);
395
+ }
396
+ if (extractedTexts.length === 0) {
397
+ console.log('ℹ️ No texts found to translate');
398
+ return;
399
+ }
400
+ const { translations, sourceMap } = await this.translateTexts(extractedTexts);
401
+ await this.generateI18nFiles(translations, sourceMap);
402
+ await this.generateReport(extractedTexts);
403
+ // 执行代码转换(如果启用)
404
+ await this.transformSourceFiles(translations);
405
+ console.log('🎉 Auto i18n process completed successfully!');
406
+ }
407
+ catch (error) {
408
+ console.error('❌ Auto i18n process failed:', error);
409
+ throw error;
410
+ }
411
+ }
412
+ }
413
+ exports.AutoI18n = AutoI18n;
414
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import { I18nConfig } from '../types';
2
+ export interface TransformResult {
3
+ code: string;
4
+ modified: boolean;
5
+ translations: Map<string, string>;
6
+ }
7
+ export declare class CodeTransformer {
8
+ private config;
9
+ private keyMap;
10
+ private interpolation;
11
+ constructor(config: I18nConfig, keyMap: Map<string, string>);
12
+ /**
13
+ * 从表达式节点提取变量名
14
+ */
15
+ private extractExpressionName;
16
+ /**
17
+ * 解析导入配置,支持字符串和对象两种格式
18
+ */
19
+ private parseImportConfig;
20
+ /**
21
+ * 检查包裹器是否为模板字符串格式(包含 {{key}} 或 {{text}})
22
+ */
23
+ private isTemplateWrapper;
24
+ /**
25
+ * 使用模板或函数生成包裹代码
26
+ */
27
+ private generateWrapperCode;
28
+ /**
29
+ * 解析模板生成的代码为 AST 表达式
30
+ */
31
+ private parseWrapperToAST;
32
+ /**
33
+ * 检测文件是否为静态文件(非 React 组件)
34
+ * 静态文件特征:
35
+ * 1. 不包含 JSX
36
+ * 2. 不包含 React 组件定义
37
+ * 3. 不导入 React
38
+ */
39
+ private isStaticFile;
40
+ /**
41
+ * 转换文件中的硬编码文本
42
+ */
43
+ transform(code: string, filePath: string): Promise<TransformResult>;
44
+ /**
45
+ * 标记函数需要注入上下文
46
+ */
47
+ private markFunctionForInjection;
48
+ /**
49
+ * 创建翻译函数调用
50
+ * 支持多种格式:
51
+ * 1. 简单函数: t("key") 或 i18n.t("key")
52
+ * 2. 模板格式: getLocal('{{key}}', '{{text}}') -> getLocal('key', '原文')
53
+ * 3. 函数生成器: 自定义函数
54
+ */
55
+ private createTCallWithComment;
56
+ /**
57
+ * 检查解构模式中是否已经有指定的属性
58
+ */
59
+ private checkHasDestructuredProperty;
60
+ /**
61
+ * 更新 useTranslation 的解构,添加缺少的属性
62
+ */
63
+ private updateUseTranslationDestructure;
64
+ /**
65
+ * 添加全局导入语句
66
+ */
67
+ private addGlobalImport;
68
+ /**
69
+ * 添加上下文注入到函数中
70
+ */
71
+ private addContextInjections;
72
+ /**
73
+ * 注入语句到普通函数体
74
+ */
75
+ private injectToFunctionBody;
76
+ /**
77
+ * 注入语句到箭头函数
78
+ */
79
+ private injectToArrowFunction;
80
+ /**
81
+ * 格式化代码
82
+ */
83
+ private formatCode;
84
+ /**
85
+ * 查找项目中的 prettier
86
+ */
87
+ private findPrettier;
88
+ /**
89
+ * 判断是否应该转换这个字符串
90
+ */
91
+ private shouldTransform;
92
+ /**
93
+ * 判断是否应该转换模板字符串
94
+ */
95
+ private shouldTransformTemplate;
96
+ /**
97
+ * 尝试合并 JSX 元素的子节点为一个带插值的字符串
98
+ * 例如: <p>当前等级:{level} 级</p> => "当前等级:{level} 级"
99
+ */
100
+ private tryMergeJSXChildren;
101
+ }
102
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transformer/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAkC,MAAM,UAAU,CAAC;AAQtE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,aAAa,CAAuB;gBAEhC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAM3D;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAkB7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmDzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAyCpB;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAuWzE;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAYhC;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAiE9B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAepC;;OAEG;IACH,OAAO,CAAC,+BAA+B;IA2BvC;;OAEG;IACH,OAAO,CAAC,eAAe;IA6BvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyC5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAe7B;;OAEG;YACW,UAAU;IAiCxB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAuCvB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAc/B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAsD5B"}