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,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InterpolationHandler = void 0;
4
+ exports.createInterpolationHandler = createInterpolationHandler;
5
+ /**
6
+ * 插值处理器 - 处理模板字符串中的动态表达式占位符
7
+ */
8
+ class InterpolationHandler {
9
+ constructor(config = {}) {
10
+ this.config = {
11
+ prefix: config.prefix ?? '{{',
12
+ suffix: config.suffix ?? '}}',
13
+ ...config
14
+ };
15
+ }
16
+ /**
17
+ * 是否使用命名参数
18
+ */
19
+ get useNamedParams() {
20
+ return this.config.namedParams ?? false;
21
+ }
22
+ /**
23
+ * 是否在 key 中包含参数名
24
+ */
25
+ get includeParamsInKey() {
26
+ return this.config.includeParamsInKey ?? false;
27
+ }
28
+ /**
29
+ * 生成标准占位符(用于提取和最终输出)
30
+ * @param index 占位符索引
31
+ * @param name 变量名(用于命名参数模式)
32
+ */
33
+ formatPlaceholder(index, name) {
34
+ if (this.config.format) {
35
+ return this.config.format(index, name);
36
+ }
37
+ // 如果使用命名参数且提供了名称,使用名称
38
+ if (this.useNamedParams && name) {
39
+ return `${this.config.prefix}${name}${this.config.suffix}`;
40
+ }
41
+ return `${this.config.prefix}${index}${this.config.suffix}`;
42
+ }
43
+ /**
44
+ * 生成用于 key 的参数后缀
45
+ * 例如: ['username', 'count'] -> '_{username}_{count}'
46
+ */
47
+ formatKeyParamsSuffix(paramNames) {
48
+ if (!this.includeParamsInKey || paramNames.length === 0) {
49
+ return '';
50
+ }
51
+ return paramNames.map(name => `_{${name}}`).join('');
52
+ }
53
+ /**
54
+ * 生成翻译时使用的占位符
55
+ * 根据 translationFormat 配置决定使用什么格式
56
+ * @param indexOrName 索引或参数名
57
+ */
58
+ formatForTranslation(indexOrName) {
59
+ const id = typeof indexOrName === 'number' ? indexOrName.toString() : indexOrName;
60
+ switch (this.config.translationFormat) {
61
+ case 'xml':
62
+ // XML 标签格式,大多数翻译 API 会保留
63
+ return `<ph id="${id}"/>`;
64
+ case 'bracket':
65
+ // 方括号格式
66
+ return `[${id}]`;
67
+ case 'custom':
68
+ // 自定义格式
69
+ const prefix = this.config.translationPrefix ?? '__PH';
70
+ const suffix = this.config.translationSuffix ?? '__';
71
+ return `${prefix}${id}${suffix}`;
72
+ default:
73
+ // 不转换,使用原格式
74
+ if (typeof indexOrName === 'number') {
75
+ return this.formatPlaceholder(indexOrName);
76
+ }
77
+ return this.formatPlaceholder(0, indexOrName);
78
+ }
79
+ }
80
+ /**
81
+ * 获取匹配标准占位符的正则表达式
82
+ * 支持索引格式 {{0}} 和命名格式 {{name}}
83
+ */
84
+ getPlaceholderRegex() {
85
+ const prefix = this.escapeRegex(this.config.prefix);
86
+ const suffix = this.escapeRegex(this.config.suffix);
87
+ // 匹配数字或标识符
88
+ return new RegExp(`${prefix}(\\d+|[a-zA-Z_][a-zA-Z0-9_]*)${suffix}`, 'g');
89
+ }
90
+ /**
91
+ * 获取匹配翻译格式占位符的正则表达式
92
+ * 支持索引和命名参数
93
+ */
94
+ getTranslationFormatRegex() {
95
+ // 匹配数字或标识符
96
+ const idPattern = '(\\d+|[a-zA-Z_][a-zA-Z0-9_]*)';
97
+ switch (this.config.translationFormat) {
98
+ case 'xml':
99
+ // 翻译 API 可能会修改 XML 标签格式,需要匹配多种变体:
100
+ // <ph id="0"/> <phid="0"/> <ph id=0/> <ph id="0" /> <ph id="name"/> 等
101
+ return new RegExp(`<ph\\s*id\\s*=\\s*"?${idPattern}"?\\s*\\/>`, 'gi');
102
+ case 'bracket':
103
+ return new RegExp(`\\[${idPattern}\\]`, 'g');
104
+ case 'custom':
105
+ const prefix = this.escapeRegex(this.config.translationPrefix ?? '__PH');
106
+ const suffix = this.escapeRegex(this.config.translationSuffix ?? '__');
107
+ return new RegExp(`${prefix}${idPattern}${suffix}`, 'g');
108
+ default:
109
+ return this.getPlaceholderRegex();
110
+ }
111
+ }
112
+ /**
113
+ * 将文本中的标准占位符转换为翻译格式
114
+ */
115
+ convertToTranslationFormat(text) {
116
+ if (!this.config.translationFormat) {
117
+ return text;
118
+ }
119
+ const regex = this.getPlaceholderRegex();
120
+ return text.replace(regex, (_, idOrName) => {
121
+ // 如果是数字,转换为数字;否则保持字符串
122
+ const id = /^\d+$/.test(idOrName) ? parseInt(idOrName, 10) : idOrName;
123
+ return this.formatForTranslation(id);
124
+ });
125
+ }
126
+ /**
127
+ * 将翻译后的文本中的翻译格式占位符转换回标准格式
128
+ */
129
+ convertFromTranslationFormat(text) {
130
+ if (!this.config.translationFormat) {
131
+ return text;
132
+ }
133
+ const regex = this.getTranslationFormatRegex();
134
+ return text.replace(regex, (_, idOrName) => {
135
+ // 如果是数字,使用索引格式;否则使用命名格式
136
+ if (/^\d+$/.test(idOrName)) {
137
+ return this.formatPlaceholder(parseInt(idOrName, 10));
138
+ }
139
+ return this.formatPlaceholder(0, idOrName);
140
+ });
141
+ }
142
+ /**
143
+ * 检查文本是否包含占位符
144
+ */
145
+ hasPlaceholders(text) {
146
+ return this.getPlaceholderRegex().test(text);
147
+ }
148
+ /**
149
+ * 提取文本中的所有占位符索引
150
+ */
151
+ extractPlaceholderIndices(text) {
152
+ const regex = this.getPlaceholderRegex();
153
+ const indices = [];
154
+ let match;
155
+ while ((match = regex.exec(text)) !== null) {
156
+ indices.push(parseInt(match[1], 10));
157
+ }
158
+ return indices;
159
+ }
160
+ /**
161
+ * 转义正则表达式特殊字符
162
+ */
163
+ escapeRegex(str) {
164
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
165
+ }
166
+ }
167
+ exports.InterpolationHandler = InterpolationHandler;
168
+ /**
169
+ * 创建默认的插值处理器
170
+ */
171
+ function createInterpolationHandler(config) {
172
+ return new InterpolationHandler(config);
173
+ }
174
+ //# sourceMappingURL=interpolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolation.js","sourceRoot":"","sources":["../../src/utils/interpolation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { KeyConfig } from '../types';
2
+ export declare function normalizeText(text: string): string;
3
+ /**
4
+ * 从文件路径生成路径部分(不含扩展名)
5
+ */
6
+ export declare function generatePathPart(filePath: string, keyStyle?: 'dot' | 'underscore'): string;
7
+ /**
8
+ * 生成 text 部分(从翻译文本生成驼峰命名)
9
+ */
10
+ export declare function generateTextPart(translatedText: string, maxLength?: number): string;
11
+ export interface GenerateKeyOptions {
12
+ text: string;
13
+ filePath: string;
14
+ translatedText: string;
15
+ appName?: string;
16
+ keyStyle?: 'dot' | 'underscore';
17
+ existingKeys?: Set<string>;
18
+ maxKeyLength?: number;
19
+ paramNames?: string[];
20
+ keyConfig?: KeyConfig;
21
+ /** 全局计数器(用于 prefixOnly 模式) */
22
+ globalCounter?: {
23
+ value: number;
24
+ };
25
+ }
26
+ /**
27
+ * 生成唯一的 i18n key
28
+ * 支持多种配置模式:
29
+ * 1. 默认模式: {appName}.{filePath}.{text}[_{params}][.counter]
30
+ * 2. 前缀模式: {prefix}{counter}
31
+ * 3. 自定义函数模式: 完全由用户定义
32
+ */
33
+ export declare function generateKey(options: GenerateKeyOptions): string;
34
+ /**
35
+ * @deprecated 使用对象参数版本
36
+ */
37
+ export declare function generateKey(text: string, filePath: string, translatedText: string, appName?: string, keyStyle?: 'dot' | 'underscore', existingKeys?: Set<string>, maxKeyLength?: number, paramNames?: string[], keyConfig?: KeyConfig, globalCounter?: {
38
+ value: number;
39
+ }): string;
40
+ export declare function deduplicateTexts(texts: string[]): string[];
41
+ export declare function isSimilarText(text1: string, text2: string, threshold?: number): boolean;
42
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAsB,MAAM,UAAU,CAAC;AAEzD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AA6CD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,KAAK,GAAG,YAAoB,GAAG,MAAM,CASjG;AAYD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,GAAE,MAAW,GAAG,MAAM,CAEvF;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC;IAChC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8BAA8B;IAC9B,aAAa,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAAC;AACjE;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,KAAK,GAAG,YAAY,EAC/B,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAC1B,YAAY,CAAC,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,SAAS,CAAC,EAAE,SAAS,EACrB,aAAa,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC,MAAM,CAAC;AAyLV,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAa1D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,OAAO,CAe5F"}
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeText = normalizeText;
4
+ exports.generatePathPart = generatePathPart;
5
+ exports.generateTextPart = generateTextPart;
6
+ exports.generateKey = generateKey;
7
+ exports.deduplicateTexts = deduplicateTexts;
8
+ exports.isSimilarText = isSimilarText;
9
+ function normalizeText(text) {
10
+ return text.trim().replace(/\s+/g, ' ');
11
+ }
12
+ /**
13
+ * 将文本转换为驼峰命名
14
+ */
15
+ function toCamelCase(text, maxLength) {
16
+ const result = text
17
+ .replace(/[^\w\s]/g, '') // 移除特殊字符
18
+ .split(/\s+/)
19
+ .map((word, index) => {
20
+ if (index === 0) {
21
+ return word.toLowerCase();
22
+ }
23
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
24
+ })
25
+ .join('');
26
+ // 如果有最大长度限制,智能截断
27
+ if (maxLength && result.length > maxLength) {
28
+ return smartTruncate(result, maxLength);
29
+ }
30
+ return result;
31
+ }
32
+ /**
33
+ * 智能截断:在驼峰边界处截断,保持可读性
34
+ */
35
+ function smartTruncate(text, maxLength) {
36
+ if (text.length <= maxLength)
37
+ return text;
38
+ // 找到最接近 maxLength 的驼峰边界
39
+ let truncateAt = maxLength;
40
+ // 从 maxLength 往前找大写字母(驼峰边界)
41
+ for (let i = maxLength; i > maxLength * 0.6; i--) {
42
+ if (text[i] && text[i] === text[i].toUpperCase() && /[A-Z]/.test(text[i])) {
43
+ truncateAt = i;
44
+ break;
45
+ }
46
+ }
47
+ return text.substring(0, truncateAt);
48
+ }
49
+ /**
50
+ * 从文件路径生成路径部分(不含扩展名)
51
+ */
52
+ function generatePathPart(filePath, keyStyle = 'dot') {
53
+ const separator = keyStyle === 'dot' ? '.' : '_';
54
+ return filePath
55
+ .replace(/\.(tsx?|jsx?|vue|html)$/, '')
56
+ .replace(/^(src\/|app\/|pages\/|components\/)/, '')
57
+ .replace(/\\/g, '/')
58
+ .split('/')
59
+ .filter(Boolean)
60
+ .join(separator);
61
+ }
62
+ /**
63
+ * 格式化计数器
64
+ */
65
+ function formatCounter(num, padding = 0) {
66
+ if (padding <= 0) {
67
+ return String(num);
68
+ }
69
+ return String(num).padStart(padding, '0');
70
+ }
71
+ /**
72
+ * 生成 text 部分(从翻译文本生成驼峰命名)
73
+ */
74
+ function generateTextPart(translatedText, maxLength = 30) {
75
+ return toCamelCase(translatedText, maxLength);
76
+ }
77
+ function generateKey(textOrOptions, filePath, translatedText, appName, keyStyle = 'dot', existingKeys = new Set(), maxKeyLength = 50, paramNames, keyConfig, globalCounter) {
78
+ // 处理新的对象参数格式
79
+ let opts;
80
+ if (typeof textOrOptions === 'object') {
81
+ opts = textOrOptions;
82
+ }
83
+ else {
84
+ opts = {
85
+ text: textOrOptions,
86
+ filePath: filePath,
87
+ translatedText: translatedText,
88
+ appName,
89
+ keyStyle,
90
+ existingKeys,
91
+ maxKeyLength,
92
+ paramNames,
93
+ keyConfig,
94
+ globalCounter
95
+ };
96
+ }
97
+ const { text, filePath: fp, translatedText: tt, appName: app, keyStyle: ks = 'dot', existingKeys: ek = new Set(), maxKeyLength: mkl = 50, paramNames: pn, keyConfig: kc, globalCounter: gc } = opts;
98
+ const separator = ks === 'dot' ? '.' : '_';
99
+ // 生成各部分
100
+ const base = generateBasePart(fp, app, ks);
101
+ const textPart = generateTextPart(tt || text, mkl - base.length - 10);
102
+ // 如果有自定义生成函数,使用它
103
+ if (kc?.generator) {
104
+ let num = gc?.value ?? kc.counterStart ?? 0;
105
+ const generatorParams = {
106
+ base,
107
+ text: textPart,
108
+ num,
109
+ params: pn,
110
+ filePath: fp,
111
+ originalText: text,
112
+ translatedText: tt,
113
+ appName: app
114
+ };
115
+ let key = kc.generator(generatorParams);
116
+ // 处理重复 key
117
+ while (ek.has(key)) {
118
+ num++;
119
+ generatorParams.num = num;
120
+ key = kc.generator(generatorParams);
121
+ }
122
+ // 更新全局计数器
123
+ if (gc) {
124
+ gc.value = num + 1;
125
+ }
126
+ return key;
127
+ }
128
+ // 前缀模式: {prefix}{counter}[_{params}]
129
+ if (kc?.prefixOnly && kc?.prefix) {
130
+ const counterStart = kc.counterStart ?? 0;
131
+ const counterPadding = kc.counterPadding ?? 0;
132
+ let num = gc?.value ?? counterStart;
133
+ // 生成参数后缀(如果启用了 includeParams)
134
+ const paramsSuffix = (kc.includeParams && pn && pn.length > 0)
135
+ ? pn.map(name => `_{${name}}`).join('')
136
+ : '';
137
+ let key = `${kc.prefix}${formatCounter(num, counterPadding)}${paramsSuffix}`;
138
+ while (ek.has(key)) {
139
+ num++;
140
+ key = `${kc.prefix}${formatCounter(num, counterPadding)}${paramsSuffix}`;
141
+ }
142
+ // 更新全局计数器
143
+ if (gc) {
144
+ gc.value = num + 1;
145
+ }
146
+ return key;
147
+ }
148
+ // 默认模式: {prefix?}{base}.{text}[_{params}][.counter]
149
+ const parts = [];
150
+ // 添加前缀(如果有)
151
+ if (kc?.prefix) {
152
+ parts.push(kc.prefix);
153
+ }
154
+ // 添加 base 部分
155
+ if (base) {
156
+ parts.push(base);
157
+ }
158
+ // 添加 text 部分
159
+ if (textPart) {
160
+ parts.push(textPart);
161
+ }
162
+ // 生成基础 key
163
+ let baseKey = parts.filter(Boolean).join(separator);
164
+ // 添加参数后缀
165
+ if (pn && pn.length > 0) {
166
+ baseKey += pn.map(name => `_{${name}}`).join('');
167
+ }
168
+ // 处理计数器
169
+ const counterStyle = kc?.counterStyle ?? 'auto';
170
+ const counterStart = kc?.counterStart ?? 0;
171
+ const counterPadding = kc?.counterPadding ?? 0;
172
+ if (counterStyle === 'always') {
173
+ // 始终添加计数器
174
+ const num = gc?.value ?? counterStart;
175
+ const finalKey = `${baseKey}${separator}${formatCounter(num, counterPadding)}`;
176
+ if (gc) {
177
+ gc.value = num + 1;
178
+ }
179
+ return finalKey;
180
+ }
181
+ if (counterStyle === 'none') {
182
+ // 不添加计数器(可能会有重复)
183
+ return baseKey;
184
+ }
185
+ // auto 模式:仅在重复时添加计数器
186
+ let finalKey = baseKey;
187
+ let counter = 1;
188
+ while (ek.has(finalKey)) {
189
+ finalKey = `${baseKey}${separator}${counter}`;
190
+ counter++;
191
+ }
192
+ return finalKey;
193
+ }
194
+ /**
195
+ * 生成 base 部分(appName + filePath)
196
+ */
197
+ function generateBasePart(filePath, appName, keyStyle = 'dot') {
198
+ const separator = keyStyle === 'dot' ? '.' : '_';
199
+ const parts = [];
200
+ if (appName) {
201
+ parts.push(appName.toLowerCase().replace(/[^\w]/g, ''));
202
+ }
203
+ const pathPart = generatePathPart(filePath, keyStyle);
204
+ if (pathPart) {
205
+ parts.push(pathPart);
206
+ }
207
+ return parts.join(separator);
208
+ }
209
+ function deduplicateTexts(texts) {
210
+ const seen = new Set();
211
+ const unique = [];
212
+ for (const text of texts) {
213
+ const normalized = normalizeText(text);
214
+ if (!seen.has(normalized)) {
215
+ seen.add(normalized);
216
+ unique.push(text);
217
+ }
218
+ }
219
+ return unique;
220
+ }
221
+ function isSimilarText(text1, text2, threshold = 0.8) {
222
+ const normalized1 = normalizeText(text1);
223
+ const normalized2 = normalizeText(text2);
224
+ if (normalized1 === normalized2)
225
+ return true;
226
+ // Simple similarity check based on common words
227
+ const words1 = new Set(normalized1.split(' '));
228
+ const words2 = new Set(normalized2.split(' '));
229
+ const intersection = new Set([...words1].filter(x => words2.has(x)));
230
+ const union = new Set([...words1, ...words2]);
231
+ const similarity = intersection.size / union.size;
232
+ return similarity >= threshold;
233
+ }
234
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "must-cli",
3
+ "version": "1.9.0",
4
+ "description": "An automated internationalization tool that extracts text from projects and translates them using various translation providers",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.js"
12
+ }
13
+ },
14
+ "bin": {
15
+ "must": "./dist/cli.js"
16
+ },
17
+ "keywords": [
18
+ "i18n",
19
+ "internationalization",
20
+ "translation",
21
+ "automation",
22
+ "cli",
23
+ "text-extraction",
24
+ "react",
25
+ "vue",
26
+ "typescript"
27
+ ],
28
+ "author": "Your Name",
29
+ "license": "MIT",
30
+ "dependencies": {
31
+ "commander": "^11.1.0",
32
+ "chalk": "^4.1.2",
33
+ "ora": "^5.4.1",
34
+ "inquirer": "^8.2.6",
35
+ "translate-google": "^1.5.0",
36
+ "tsx": "^4.7.0",
37
+ "axios": "^1.6.2",
38
+ "glob": "^10.3.10",
39
+ "fs-extra": "^11.2.0",
40
+ "jsdom": "^23.0.1",
41
+ "@babel/parser": "^7.23.6",
42
+ "@babel/traverse": "^7.23.6",
43
+ "@babel/types": "^7.23.6",
44
+ "@babel/generator": "^7.23.6"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^20.10.5",
48
+ "@types/fs-extra": "^11.0.4",
49
+ "@types/inquirer": "^8.2.10",
50
+ "@types/jest": "^29.5.8",
51
+ "@types/jsdom": "^21.1.6",
52
+ "@typescript-eslint/eslint-plugin": "^6.14.0",
53
+ "@typescript-eslint/parser": "^6.14.0",
54
+ "eslint": "^8.55.0",
55
+ "jest": "^29.7.0",
56
+ "ts-jest": "^29.1.1",
57
+ "typescript": "^5.3.3"
58
+ },
59
+ "engines": {
60
+ "node": ">=16.0.0"
61
+ },
62
+ "files": [
63
+ "dist/**/*",
64
+ "README.md",
65
+ "LICENSE"
66
+ ],
67
+ "repository": {
68
+ "type": "git",
69
+ "url": "https://github.com/anthropics/must.git",
70
+ "directory": "packages/must"
71
+ },
72
+ "bugs": {
73
+ "url": "https://github.com/anthropics/must/issues"
74
+ },
75
+ "homepage": "https://github.com/anthropics/must#readme",
76
+ "publishConfig": {
77
+ "access": "public"
78
+ },
79
+ "scripts": {
80
+ "build": "tsc",
81
+ "dev": "tsc --watch",
82
+ "test": "jest",
83
+ "lint": "eslint src/**/*.ts",
84
+ "clean": "rm -rf dist"
85
+ }
86
+ }