@eevee-ta/cli 1.0.1 → 1.2.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.
- package/README.md +163 -9
- package/assets/skills/eevee-integration/SKILL.md +46 -0
- package/assets/skills/eevee-integration/agents/openai.yaml +3 -0
- package/assets/skills/eevee-integration/references/intake.md +87 -0
- package/assets/skills/eevee-integration/references/java-springboot.md +182 -0
- package/assets/skills/eevee-integration/references/umijs.md +210 -0
- package/assets/skills/eevee-mcp/SKILL.md +63 -5
- package/assets/skills/eevee-mcp/reference.md +20 -3
- package/dist/src/bin/cli.js +23 -7
- package/dist/src/bin/cli.js.map +1 -1
- package/dist/src/commands/i18n-command.js +194 -0
- package/dist/src/commands/i18n-command.js.map +1 -0
- package/dist/src/commands/skill-command.js +42 -26
- package/dist/src/commands/skill-command.js.map +1 -1
- package/dist/src/lib/business-catalog.js +24 -20
- package/dist/src/lib/business-catalog.js.map +1 -1
- package/dist/src/lib/i18n-exporter.js +402 -0
- package/dist/src/lib/i18n-exporter.js.map +1 -0
- package/dist/src/lib/i18n-scanner.js +1172 -0
- package/dist/src/lib/i18n-scanner.js.map +1 -0
- package/dist/src/lib/mcp-client.js +1 -1
- package/dist/src/lib/mcp-client.js.map +1 -1
- package/dist/src/lib/skill-installer.js +19 -10
- package/dist/src/lib/skill-installer.js.map +1 -1
- package/dist/src/lib/updater.js +4 -4
- package/dist/src/lib/updater.js.map +1 -1
- package/dist/src/lib/version.js +1 -1
- package/dist/src/lib/version.js.map +1 -1
- package/install.sh +3 -3
- package/package.json +2 -2
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir, readdir, readFile, rename, stat, unlink, writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { McpClient } from './mcp-client.js';
|
|
5
|
+
import { resolveRuntimeConfig } from './config.js';
|
|
6
|
+
const SUPPORTED_FORMATS = ['json', 'js', 'ts', 'property', 'properties'];
|
|
7
|
+
const SUPPORTED_CLEAN_EXTENSIONS = ['.json', '.js', '.ts', '.property', '.properties'];
|
|
8
|
+
export async function exportProjectI18n(projectRootInput, options = {}) {
|
|
9
|
+
const projectRoot = path.resolve(projectRootInput);
|
|
10
|
+
if (!(await stat(projectRoot)).isDirectory())
|
|
11
|
+
throw new Error(`项目目录不存在或不是目录: ${projectRoot}`);
|
|
12
|
+
const config = await loadExportConfig(projectRoot, options.configPath);
|
|
13
|
+
const outputs = [];
|
|
14
|
+
for (const outputConfig of config.outPaths) {
|
|
15
|
+
outputs.push(await exportOutput(projectRoot, outputConfig, options, options.client));
|
|
16
|
+
}
|
|
17
|
+
return { configPath: config.configPath, outputs };
|
|
18
|
+
}
|
|
19
|
+
async function loadExportConfig(projectRoot, overridePath) {
|
|
20
|
+
const candidates = overridePath
|
|
21
|
+
? [overridePath]
|
|
22
|
+
: ['intl.json', '.eevee/i18n.json', 'eevee.i18n.json'].map((item) => path.join(projectRoot, item));
|
|
23
|
+
let configPath = null;
|
|
24
|
+
for (const candidate of candidates) {
|
|
25
|
+
const resolved = path.resolve(candidate);
|
|
26
|
+
if ((await stat(resolved).catch(() => undefined))?.isFile()) {
|
|
27
|
+
configPath = resolved;
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (!configPath)
|
|
32
|
+
throw new Error(overridePath ? `导出配置不存在: ${overridePath}` : '未找到 intl.json 导出配置');
|
|
33
|
+
let raw;
|
|
34
|
+
try {
|
|
35
|
+
raw = JSON.parse(await readFile(configPath, 'utf8'));
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
throw new Error(`无法解析导出配置 ${configPath}: ${error.message}`);
|
|
39
|
+
}
|
|
40
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
41
|
+
throw new Error(`导出配置必须是 JSON 对象: ${configPath}`);
|
|
42
|
+
if (!Array.isArray(raw.outPaths) || raw.outPaths.length === 0)
|
|
43
|
+
throw new Error('导出配置缺少非空 outPaths');
|
|
44
|
+
const outPaths = raw.outPaths.map((item, index) => normalizeOutputConfig(raw, item, index));
|
|
45
|
+
return { configPath, outPaths };
|
|
46
|
+
}
|
|
47
|
+
function normalizeOutputConfig(root, item, index) {
|
|
48
|
+
const format = item.format ?? root.format ?? 'json';
|
|
49
|
+
if (!SUPPORTED_FORMATS.includes(format))
|
|
50
|
+
throw new Error(`outPaths[${index}].format 不支持: ${format}`);
|
|
51
|
+
const projectIds = item.projectIds ?? root.projectIds ?? [];
|
|
52
|
+
if (!Array.isArray(projectIds) || projectIds.length === 0)
|
|
53
|
+
throw new Error(`outPaths[${index}].projectIds 不能为空`);
|
|
54
|
+
const normalizedProjects = projectIds.map((project, projectIndex) => {
|
|
55
|
+
const projectId = Number(project?.projectId);
|
|
56
|
+
if (!Number.isSafeInteger(projectId) || projectId <= 0) {
|
|
57
|
+
throw new Error(`outPaths[${index}].projectIds[${projectIndex}].projectId 必须是正整数`);
|
|
58
|
+
}
|
|
59
|
+
if (!Array.isArray(project.branchIds)) {
|
|
60
|
+
throw new Error(`outPaths[${index}].projectIds[${projectIndex}].branchIds 必须是版本 ID 数组;[] 表示全部版本`);
|
|
61
|
+
}
|
|
62
|
+
if (project.branchIds.some((branch) => !Number.isSafeInteger(branch) || branch <= 0)) {
|
|
63
|
+
throw new Error(`outPaths[${index}].projectIds[${projectIndex}].branchIds 必须是正整数数组`);
|
|
64
|
+
}
|
|
65
|
+
const branches = [...new Set(project.branchIds)];
|
|
66
|
+
const tags = project.tags ?? [];
|
|
67
|
+
if (!Array.isArray(tags) || tags.some((tag) => tag !== null && (typeof tag !== 'string' || !tag.trim()))) {
|
|
68
|
+
throw new Error(`outPaths[${index}].projectIds[${projectIndex}].tags 必须是字符串数组;[] 表示全部,[null] 表示无标签`);
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
projectId,
|
|
72
|
+
branches,
|
|
73
|
+
tags: tags.map((tag) => typeof tag === 'string' ? tag.trim() : null),
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
const localeAliases = { ...(root.localeAliases ?? {}), ...(item.localeAliases ?? {}) };
|
|
77
|
+
for (const [locale, alias] of Object.entries(localeAliases)) {
|
|
78
|
+
if (!locale.trim() || !alias.trim())
|
|
79
|
+
throw new Error(`outPaths[${index}].localeAliases 值不能为空`);
|
|
80
|
+
if (/[\\/]|\.(?=\.)|^\.$|\.\.$/.test(alias))
|
|
81
|
+
throw new Error(`语言别名不能用作文件名: ${alias}`);
|
|
82
|
+
}
|
|
83
|
+
const noTagLabel = item.noTagLabel ?? root.noTagLabel ?? 'default';
|
|
84
|
+
if (!noTagLabel.trim() || /[\\/]/.test(noTagLabel))
|
|
85
|
+
throw new Error(`outPaths[${index}].noTagLabel 不能用作文件名`);
|
|
86
|
+
return {
|
|
87
|
+
path: requireOutputDirectory(item.path ?? root.path, index, 'path'),
|
|
88
|
+
buildPath: item.buildPath ?? root.buildPath,
|
|
89
|
+
format,
|
|
90
|
+
groupByTag: item.groupByTag ?? root.groupByTag ?? true,
|
|
91
|
+
clean: item.clean ?? root.clean ?? false,
|
|
92
|
+
localeAliases,
|
|
93
|
+
noTagLabel,
|
|
94
|
+
projectIds: normalizedProjects,
|
|
95
|
+
token: item.token ?? root.token,
|
|
96
|
+
url: item.url ?? root.url,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function requireOutputDirectory(value, index, field) {
|
|
100
|
+
if (!value || !value.trim())
|
|
101
|
+
throw new Error(`outPaths[${index}] 缺少 ${field}`);
|
|
102
|
+
return value.trim();
|
|
103
|
+
}
|
|
104
|
+
async function exportOutput(projectRoot, outputConfig, options, injectedClient) {
|
|
105
|
+
const target = options.target ?? 'dev';
|
|
106
|
+
const configuredDirectory = target === 'dev' ? outputConfig.path : outputConfig.buildPath;
|
|
107
|
+
if (!configuredDirectory)
|
|
108
|
+
throw new Error('outPaths 配置缺少 buildPath,无法导出到线上目录');
|
|
109
|
+
const directory = resolveProjectDirectory(projectRoot, configuredDirectory);
|
|
110
|
+
const client = injectedClient ?? await createClient(options, outputConfig);
|
|
111
|
+
const locales = new Set();
|
|
112
|
+
const groups = new Set();
|
|
113
|
+
const projectResults = [];
|
|
114
|
+
const batches = [];
|
|
115
|
+
for (const projectConfig of outputConfig.projectIds) {
|
|
116
|
+
const detail = await callApi(client, 'ProjectsController_detail', { id: projectConfig.projectId });
|
|
117
|
+
const projectLocales = detail.locales ?? [];
|
|
118
|
+
if (!projectLocales.length)
|
|
119
|
+
throw new Error(`项目 ${projectConfig.projectId} 未配置语言`);
|
|
120
|
+
projectLocales.forEach((locale) => locales.add(locale));
|
|
121
|
+
const refLocale = detail.ref_locale ?? projectLocales[0];
|
|
122
|
+
const availableTags = await loadProjectTags(client, projectConfig.projectId);
|
|
123
|
+
const configuredTags = projectConfig.tags ?? [];
|
|
124
|
+
let fetchedTerms = 0;
|
|
125
|
+
if (configuredTags.length === 0) {
|
|
126
|
+
const terms = await fetchTermsForBranches(client, {
|
|
127
|
+
projectId: projectConfig.projectId,
|
|
128
|
+
refLocale,
|
|
129
|
+
tagIds: [],
|
|
130
|
+
includeEmptyTag: false,
|
|
131
|
+
}, projectConfig.branches);
|
|
132
|
+
fetchedTerms += terms.length;
|
|
133
|
+
batches.push({ terms, group: null });
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
for (const tagName of configuredTags) {
|
|
137
|
+
if (tagName === null) {
|
|
138
|
+
const terms = await fetchTermsForBranches(client, {
|
|
139
|
+
projectId: projectConfig.projectId,
|
|
140
|
+
refLocale,
|
|
141
|
+
tagIds: [],
|
|
142
|
+
includeEmptyTag: true,
|
|
143
|
+
}, projectConfig.branches);
|
|
144
|
+
fetchedTerms += terms.length;
|
|
145
|
+
if (outputConfig.groupByTag)
|
|
146
|
+
groups.add(outputConfig.noTagLabel);
|
|
147
|
+
batches.push({ terms, group: null });
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const group = tagName ?? null;
|
|
151
|
+
const tagIds = resolveTagIds(projectConfig.projectId, availableTags, tagName);
|
|
152
|
+
const terms = await fetchTermsForBranches(client, {
|
|
153
|
+
projectId: projectConfig.projectId,
|
|
154
|
+
refLocale,
|
|
155
|
+
tagIds,
|
|
156
|
+
includeEmptyTag: group === null,
|
|
157
|
+
}, projectConfig.branches);
|
|
158
|
+
fetchedTerms += terms.length;
|
|
159
|
+
if (outputConfig.groupByTag)
|
|
160
|
+
groups.add(group);
|
|
161
|
+
batches.push({ terms, group });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (!outputConfig.groupByTag)
|
|
165
|
+
groups.add('');
|
|
166
|
+
projectResults.push({
|
|
167
|
+
projectId: projectConfig.projectId,
|
|
168
|
+
branches: projectConfig.branches,
|
|
169
|
+
tags: configuredTags,
|
|
170
|
+
terms: fetchedTerms,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
const files = new Map();
|
|
174
|
+
let overwrites = 0;
|
|
175
|
+
for (const group of groups) {
|
|
176
|
+
for (const locale of locales)
|
|
177
|
+
files.set(fileKey(locale, group), new Map());
|
|
178
|
+
}
|
|
179
|
+
for (const batch of batches) {
|
|
180
|
+
for (const term of batch.terms) {
|
|
181
|
+
const key = term.name ?? '';
|
|
182
|
+
if (!key)
|
|
183
|
+
continue;
|
|
184
|
+
const targetGroups = targetGroupsForTerm(term, batch.group, outputConfig);
|
|
185
|
+
for (const group of targetGroups) {
|
|
186
|
+
if (!groups.has(group)) {
|
|
187
|
+
groups.add(group);
|
|
188
|
+
for (const locale of locales)
|
|
189
|
+
files.set(fileKey(locale, group), new Map());
|
|
190
|
+
}
|
|
191
|
+
for (const locale of locales) {
|
|
192
|
+
const bundle = files.get(fileKey(locale, group));
|
|
193
|
+
if (bundle.has(key))
|
|
194
|
+
overwrites++;
|
|
195
|
+
bundle.set(key, term.translations?.find((item) => item.locale === locale)?.content ?? '');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (outputConfig.clean && !options.dryRun)
|
|
201
|
+
await cleanGeneratedFiles(directory, [...locales], outputConfig.localeAliases);
|
|
202
|
+
if (!options.dryRun)
|
|
203
|
+
await mkdir(directory, { recursive: true });
|
|
204
|
+
const fileResults = [];
|
|
205
|
+
for (const [key, values] of files) {
|
|
206
|
+
const [locale, group] = decodeFileKey(key);
|
|
207
|
+
const fileName = outputFileName(locale, group, outputConfig);
|
|
208
|
+
const content = renderFile(values, outputConfig.format);
|
|
209
|
+
if (!options.dryRun)
|
|
210
|
+
await writeAtomic(path.join(directory, fileName), content);
|
|
211
|
+
fileResults.push({
|
|
212
|
+
file: toPosix(path.relative(projectRoot, path.join(directory, fileName))),
|
|
213
|
+
format: outputConfig.format,
|
|
214
|
+
keys: values.size,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
fileResults.sort((left, right) => left.file.localeCompare(right.file));
|
|
218
|
+
return {
|
|
219
|
+
target,
|
|
220
|
+
directory,
|
|
221
|
+
format: outputConfig.format,
|
|
222
|
+
groupByTag: outputConfig.groupByTag,
|
|
223
|
+
clean: outputConfig.clean,
|
|
224
|
+
locales: [...locales].sort(),
|
|
225
|
+
files: fileResults,
|
|
226
|
+
projects: projectResults,
|
|
227
|
+
overwrites,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
async function createClient(options, outputConfig) {
|
|
231
|
+
const url = options.url ?? process.env.EEVEE_MCP_URL ?? outputConfig.url;
|
|
232
|
+
const token = options.token ?? process.env.EEVEE_TOKEN ?? outputConfig.token;
|
|
233
|
+
const config = await resolveRuntimeConfig({ url, token });
|
|
234
|
+
return new McpClient(config, options.timeout ?? 60_000);
|
|
235
|
+
}
|
|
236
|
+
async function callApi(client, operationId, parameters) {
|
|
237
|
+
const result = await client.callTool('call_api_operation', {
|
|
238
|
+
operation_id: operationId,
|
|
239
|
+
parameters,
|
|
240
|
+
});
|
|
241
|
+
if (result.isError)
|
|
242
|
+
throw new Error(`调用 ${operationId} 失败`);
|
|
243
|
+
const envelope = result.structuredContent;
|
|
244
|
+
if (!envelope || envelope.status !== 0)
|
|
245
|
+
throw new Error(`调用 ${operationId} 失败: ${envelope?.msg ?? '未知错误'}`);
|
|
246
|
+
return envelope.data;
|
|
247
|
+
}
|
|
248
|
+
async function loadProjectTags(client, projectId) {
|
|
249
|
+
const groups = await callApi(client, 'TagsController_tree', { id: projectId });
|
|
250
|
+
const tags = new Map();
|
|
251
|
+
for (const group of groups ?? []) {
|
|
252
|
+
for (const tag of group.tags ?? []) {
|
|
253
|
+
if (!tag?.name || !Number.isSafeInteger(Number(tag.id)))
|
|
254
|
+
continue;
|
|
255
|
+
const ids = tags.get(tag.name) ?? [];
|
|
256
|
+
ids.push(Number(tag.id));
|
|
257
|
+
tags.set(tag.name, ids);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return tags;
|
|
261
|
+
}
|
|
262
|
+
function resolveTagIds(projectId, availableTags, tagName) {
|
|
263
|
+
const ids = availableTags.get(tagName);
|
|
264
|
+
if (!ids?.length)
|
|
265
|
+
throw new Error(`项目 ${projectId} 不存在标签: ${tagName}`);
|
|
266
|
+
return ids;
|
|
267
|
+
}
|
|
268
|
+
async function fetchTerms(client, query) {
|
|
269
|
+
const items = [];
|
|
270
|
+
let page = 1;
|
|
271
|
+
let total = Number.POSITIVE_INFINITY;
|
|
272
|
+
while (items.length < total) {
|
|
273
|
+
if (page > 10_000)
|
|
274
|
+
throw new Error(`项目 ${query.projectId} 词条分页数量异常`);
|
|
275
|
+
const parameters = {
|
|
276
|
+
id: query.projectId,
|
|
277
|
+
ref_locale: query.refLocale,
|
|
278
|
+
page,
|
|
279
|
+
page_size: 200,
|
|
280
|
+
};
|
|
281
|
+
if (query.branch)
|
|
282
|
+
parameters.version_id = query.branch;
|
|
283
|
+
if (query.tagIds.length)
|
|
284
|
+
parameters.tag_ids = query.tagIds.join(',');
|
|
285
|
+
if (query.includeEmptyTag)
|
|
286
|
+
parameters.empty_tag = '1';
|
|
287
|
+
const result = await callApi(client, 'TermsController_page', parameters);
|
|
288
|
+
total = Number(result.total ?? 0);
|
|
289
|
+
items.push(...(result.items ?? []));
|
|
290
|
+
if (!result.items?.length)
|
|
291
|
+
break;
|
|
292
|
+
page++;
|
|
293
|
+
}
|
|
294
|
+
return items;
|
|
295
|
+
}
|
|
296
|
+
async function fetchTermsForBranches(client, query, branches) {
|
|
297
|
+
const items = [];
|
|
298
|
+
for (const branch of branches.length ? branches : [undefined]) {
|
|
299
|
+
items.push(...await fetchTerms(client, { ...query, branch }));
|
|
300
|
+
}
|
|
301
|
+
return items;
|
|
302
|
+
}
|
|
303
|
+
function targetGroupsForTerm(term, configuredGroup, outputConfig) {
|
|
304
|
+
if (!outputConfig.groupByTag)
|
|
305
|
+
return [''];
|
|
306
|
+
if (configuredGroup !== null)
|
|
307
|
+
return [configuredGroup];
|
|
308
|
+
const names = [...new Set((term.tags ?? []).map((tag) => tag?.name).filter((name) => !!name))];
|
|
309
|
+
return names.length ? names : [outputConfig.noTagLabel];
|
|
310
|
+
}
|
|
311
|
+
function fileKey(locale, group) {
|
|
312
|
+
return `${locale}\0${group}`;
|
|
313
|
+
}
|
|
314
|
+
function decodeFileKey(key) {
|
|
315
|
+
const separator = key.indexOf('\0');
|
|
316
|
+
return [key.slice(0, separator), key.slice(separator + 1)];
|
|
317
|
+
}
|
|
318
|
+
function outputFileName(locale, group, config) {
|
|
319
|
+
const localeName = config.localeAliases[locale] ?? locale;
|
|
320
|
+
const extension = config.format === 'properties' ? 'properties' : config.format;
|
|
321
|
+
return group ? `${localeName}-${group}.${extension}` : `${localeName}.${extension}`;
|
|
322
|
+
}
|
|
323
|
+
export function renderFile(values, format) {
|
|
324
|
+
const record = {};
|
|
325
|
+
for (const [key, value] of values)
|
|
326
|
+
record[key] = value;
|
|
327
|
+
if (format === 'json')
|
|
328
|
+
return `${JSON.stringify(record, null, 2)}\n`;
|
|
329
|
+
if (format === 'js' || format === 'ts')
|
|
330
|
+
return `export default ${JSON.stringify(record, null, 2)};\n`;
|
|
331
|
+
return renderProperties(record);
|
|
332
|
+
}
|
|
333
|
+
export function renderProperties(record) {
|
|
334
|
+
return Object.entries(record)
|
|
335
|
+
.map(([key, value]) => `${escapeProperty(key, true)}=${escapeProperty(value, false)}`)
|
|
336
|
+
.join('\n') + (Object.keys(record).length ? '\n' : '');
|
|
337
|
+
}
|
|
338
|
+
function escapeProperty(value, isKey) {
|
|
339
|
+
let result = value.replace(/\\/g, '\\\\')
|
|
340
|
+
.replace(/\n/g, '\\n')
|
|
341
|
+
.replace(/\r/g, '\\r')
|
|
342
|
+
.replace(/\t/g, '\\t')
|
|
343
|
+
.replace(/\f/g, '\\f');
|
|
344
|
+
if (isKey)
|
|
345
|
+
result = result.replace(/([=:])/g, '\\$1');
|
|
346
|
+
if (/^[ \t]/.test(result))
|
|
347
|
+
result = `\\${result}`;
|
|
348
|
+
if (/[ \t]$/.test(result))
|
|
349
|
+
result = `${result.slice(0, -1)}\\${result.slice(-1)}`;
|
|
350
|
+
return result;
|
|
351
|
+
}
|
|
352
|
+
async function cleanGeneratedFiles(directory, locales, aliases) {
|
|
353
|
+
const entries = await readdir(directory, { withFileTypes: true }).catch((error) => {
|
|
354
|
+
if (error.code === 'ENOENT')
|
|
355
|
+
return [];
|
|
356
|
+
throw error;
|
|
357
|
+
});
|
|
358
|
+
const localeTokens = [...new Set([
|
|
359
|
+
...locales,
|
|
360
|
+
...locales.map((locale) => aliases[locale]).filter((alias) => !!alias),
|
|
361
|
+
])].sort((left, right) => right.length - left.length);
|
|
362
|
+
let deleted = 0;
|
|
363
|
+
for (const entry of entries) {
|
|
364
|
+
if (!entry.isFile())
|
|
365
|
+
continue;
|
|
366
|
+
const extension = path.extname(entry.name).toLowerCase();
|
|
367
|
+
if (!SUPPORTED_CLEAN_EXTENSIONS.includes(extension))
|
|
368
|
+
continue;
|
|
369
|
+
const stem = entry.name.slice(0, entry.name.length - extension.length);
|
|
370
|
+
const matched = localeTokens.some((locale) => stem === locale || stem.startsWith(`${locale}-`));
|
|
371
|
+
if (!matched)
|
|
372
|
+
continue;
|
|
373
|
+
await unlink(path.join(directory, entry.name));
|
|
374
|
+
deleted++;
|
|
375
|
+
}
|
|
376
|
+
return deleted;
|
|
377
|
+
}
|
|
378
|
+
async function writeAtomic(file, content) {
|
|
379
|
+
const temporary = `${file}.tmp-${process.pid}-${randomUUID()}`;
|
|
380
|
+
await writeFile(temporary, content, 'utf8');
|
|
381
|
+
try {
|
|
382
|
+
await rename(temporary, file);
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
await unlink(temporary).catch(() => undefined);
|
|
386
|
+
throw error;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
function resolveProjectDirectory(projectRoot, value) {
|
|
390
|
+
const normalized = value.replace(/\\/g, '/');
|
|
391
|
+
const resolved = normalized.startsWith('/')
|
|
392
|
+
? path.resolve(projectRoot, `.${normalized}`)
|
|
393
|
+
: path.resolve(projectRoot, normalized);
|
|
394
|
+
const relative = path.relative(projectRoot, resolved);
|
|
395
|
+
if (relative.startsWith('..') || path.isAbsolute(relative))
|
|
396
|
+
throw new Error(`导出目录不能超出项目范围: ${value}`);
|
|
397
|
+
return resolved;
|
|
398
|
+
}
|
|
399
|
+
function toPosix(value) {
|
|
400
|
+
return value.replace(/\\/g, '/');
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=i18n-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n-exporter.js","sourceRoot":"","sources":["../../../src/lib/i18n-exporter.ts"],"names":[],"mappings":"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"}
|