@eevee-ta/cli 0.1.0-beta.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 +195 -119
- 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 +87 -3
- package/assets/skills/eevee-mcp/reference.md +31 -2
- package/dist/src/bin/cli.js +66 -27
- package/dist/src/bin/cli.js.map +1 -1
- package/dist/src/commands/business-command.js +9 -4
- package/dist/src/commands/business-command.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 +80 -29
- 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/config.js +1 -1
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/http.js +95 -0
- package/dist/src/lib/http.js.map +1 -0
- 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 +5 -4
- package/dist/src/lib/mcp-client.js.map +1 -1
- package/dist/src/lib/skill-installer.js +140 -42
- package/dist/src/lib/skill-installer.js.map +1 -1
- package/dist/src/lib/updater.js +129 -0
- package/dist/src/lib/updater.js.map +1 -0
- package/dist/src/lib/version.js +55 -0
- package/dist/src/lib/version.js.map +1 -0
- package/install.sh +203 -0
- package/package.json +9 -9
- package/scripts/postinstall.mjs +31 -0
- package/assets/skills/eevee-migration/SKILL.md +0 -181
- package/assets/skills/eevee-project-setup/SKILL.md +0 -266
- package/dist/src/commands/intl-command.js +0 -131
- package/dist/src/commands/intl-command.js.map +0 -1
- package/dist/src/commands/lint-command.js +0 -105
- package/dist/src/commands/lint-command.js.map +0 -1
- package/dist/src/lib/intl-catalog.js +0 -58
- package/dist/src/lib/intl-catalog.js.map +0 -1
- package/dist/src/lib/intl-config.js +0 -125
- package/dist/src/lib/intl-config.js.map +0 -1
- package/dist/src/lib/intl-downloader.js +0 -217
- package/dist/src/lib/intl-downloader.js.map +0 -1
- package/dist/src/lib/intl-serializers/csv.js +0 -25
- package/dist/src/lib/intl-serializers/csv.js.map +0 -1
- package/dist/src/lib/intl-serializers/custom.js +0 -23
- package/dist/src/lib/intl-serializers/custom.js.map +0 -1
- package/dist/src/lib/intl-serializers/index.js +0 -22
- package/dist/src/lib/intl-serializers/index.js.map +0 -1
- package/dist/src/lib/intl-serializers/js.js +0 -10
- package/dist/src/lib/intl-serializers/js.js.map +0 -1
- package/dist/src/lib/intl-serializers/json.js +0 -7
- package/dist/src/lib/intl-serializers/json.js.map +0 -1
- package/dist/src/lib/intl-serializers/properties.js +0 -43
- package/dist/src/lib/intl-serializers/properties.js.map +0 -1
- package/dist/src/lib/intl-serializers/ts.js +0 -16
- package/dist/src/lib/intl-serializers/ts.js.map +0 -1
- package/dist/src/lib/intl-serializers/xml.js +0 -21
- package/dist/src/lib/intl-serializers/xml.js.map +0 -1
- package/dist/src/lib/lint-config.js +0 -180
- package/dist/src/lib/lint-config.js.map +0 -1
- package/dist/src/lib/lint-java.js +0 -226
- package/dist/src/lib/lint-java.js.map +0 -1
- package/dist/src/lib/lint-types.js +0 -2
- package/dist/src/lib/lint-types.js.map +0 -1
- package/dist/src/lib/lint-web.js +0 -183
- package/dist/src/lib/lint-web.js.map +0 -1
- package/dist/src/lib/lint.js +0 -192
- package/dist/src/lib/lint.js.map +0 -1
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: eevee-project-setup
|
|
3
|
-
description: Guide configuring a frontend or Java backend project to use @eevee/cli for term sync (intl download) and lint (missing-key / hardcoded-text detection). Covers web and Java adapters, file layout, and step-by-step initialization.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# eevee 项目接入技能
|
|
7
|
-
|
|
8
|
-
当需要让一个代码仓库通过 `@eevee/cli` 实现**词条同步**和**国际化检查**时使用此技能。
|
|
9
|
-
核心原则:**所有词条数据通过 API 拉取,配置文件提交到仓库,token 不入 Git**。
|
|
10
|
-
|
|
11
|
-
## 前置条件
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
eevee config set --url http://127.0.0.1:10001/mcp
|
|
15
|
-
eevee config set --token <your-user-token>
|
|
16
|
-
eevee ping
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
确认项目 ID 和版本 ID:
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
eevee project list
|
|
23
|
-
eevee intl versions --project <projectId>
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## 通用流程
|
|
27
|
-
|
|
28
|
-
1. 确认项目类型(前端 web / 后端 java)
|
|
29
|
-
2. 创建 `.eevee/` 目录存放同步配置
|
|
30
|
-
3. 创建 `.eevee-lint.json`(Java)或在 `package.json` 配置 `eevee.lint`(web)
|
|
31
|
-
4. 运行 `eevee intl download --dry-run` 验证
|
|
32
|
-
5. 运行 `eevee lint` 验证
|
|
33
|
-
6. 把快照目录加入 `.gitignore`(快照不入 Git)
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## 前端项目(web adapter)
|
|
38
|
-
|
|
39
|
-
前端项目有 `package.json`,配置写入 `eevee` 字段或独立 `.eevee-lint.json`。
|
|
40
|
-
|
|
41
|
-
### package.json
|
|
42
|
-
|
|
43
|
-
```jsonc
|
|
44
|
-
{
|
|
45
|
-
"eevee": {
|
|
46
|
-
"intl": "intl.download.json",
|
|
47
|
-
"lint": {
|
|
48
|
-
"refresh": {
|
|
49
|
-
"config": "intl.download.json"
|
|
50
|
-
},
|
|
51
|
-
"languages": {
|
|
52
|
-
"web": {
|
|
53
|
-
"enabled": true,
|
|
54
|
-
"root": ".",
|
|
55
|
-
"intlConfig": "intl.json",
|
|
56
|
-
"includes": ["src/**/*.{ts,tsx,js,jsx}"],
|
|
57
|
-
"excludes": ["**/*.test.*", "**/mock/**", "**/node_modules/**"],
|
|
58
|
-
"excludeAscii": true,
|
|
59
|
-
"tagMatchMap": {
|
|
60
|
-
"src/**/*": ["<project-tag>"]
|
|
61
|
-
},
|
|
62
|
-
"excludeProperties": ["title", "description"],
|
|
63
|
-
"excludeTrack": true
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### intl.download.json
|
|
72
|
-
|
|
73
|
-
```json
|
|
74
|
-
[
|
|
75
|
-
{
|
|
76
|
-
"outPath": ".eevee/locales",
|
|
77
|
-
"format": "json",
|
|
78
|
-
"splitByTag": false,
|
|
79
|
-
"languages": {
|
|
80
|
-
"zh-CN": "zh-CN-<tag-name>"
|
|
81
|
-
},
|
|
82
|
-
"projects": [
|
|
83
|
-
{ "projectId": 1, "tags": [123] }
|
|
84
|
-
]
|
|
85
|
-
}
|
|
86
|
-
]
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### intl.json(lint 数据源)
|
|
90
|
-
|
|
91
|
-
```json
|
|
92
|
-
{
|
|
93
|
-
"outPaths": [
|
|
94
|
-
{ "path": ".eevee/locales" }
|
|
95
|
-
]
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### 运行
|
|
100
|
-
|
|
101
|
-
```bash
|
|
102
|
-
eevee lint --staged
|
|
103
|
-
eevee lint --language web
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
## 后端项目(Java adapter)
|
|
109
|
-
|
|
110
|
-
Java 项目(如 Spring Boot)通常没有 `package.json`,推荐在仓库根目录放 `.eevee-lint.json`,
|
|
111
|
-
同步配置放 `.eevee/` 目录。
|
|
112
|
-
|
|
113
|
-
### 目录结构
|
|
114
|
-
|
|
115
|
-
```
|
|
116
|
-
project-root/
|
|
117
|
-
├── .eevee/
|
|
118
|
-
│ ├── sync.json ← 运行时 properties 全量生成
|
|
119
|
-
│ ├── download.json ← lint 用 JSON 快照
|
|
120
|
-
│ ├── intl.json ← lint 数据源声明
|
|
121
|
-
│ └── README.md
|
|
122
|
-
├── .eevee-lint.json ← lint 规则
|
|
123
|
-
└── .gitignore ← 忽略 .eevee/locales/
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### .eevee-lint.json
|
|
127
|
-
|
|
128
|
-
```json
|
|
129
|
-
{
|
|
130
|
-
"refresh": {
|
|
131
|
-
"config": ".eevee/download.json"
|
|
132
|
-
},
|
|
133
|
-
"languages": {
|
|
134
|
-
"web": { "enabled": false },
|
|
135
|
-
"java": {
|
|
136
|
-
"enabled": true,
|
|
137
|
-
"root": ".",
|
|
138
|
-
"intlConfig": ".eevee/intl.json",
|
|
139
|
-
"includes": ["*/src/main/java/**/*.java"],
|
|
140
|
-
"excludes": ["**/src/test/**", "**/generated/**", "**/target/**"],
|
|
141
|
-
"tagMatchMap": {
|
|
142
|
-
"*/src/main/java/**/*": ["<tag-name>"]
|
|
143
|
-
},
|
|
144
|
-
"localeMethods": ["getLocaleMessage", "tryLocaleMessage", "getMessage"],
|
|
145
|
-
"checkHardcoded": true,
|
|
146
|
-
"excludeMethods": ["trace", "debug", "info", "warn", "error"]
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### .eevee/download.json(lint 快照)
|
|
153
|
-
|
|
154
|
-
```json
|
|
155
|
-
[
|
|
156
|
-
{
|
|
157
|
-
"outPath": "locales",
|
|
158
|
-
"format": "json",
|
|
159
|
-
"splitByTag": false,
|
|
160
|
-
"languages": {
|
|
161
|
-
"zh-CN": "zh-CN-<tag-name>"
|
|
162
|
-
},
|
|
163
|
-
"projects": [
|
|
164
|
-
{ "projectId": 3, "versions": [2, 29, 30, 31] }
|
|
165
|
-
]
|
|
166
|
-
}
|
|
167
|
-
]
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### .eevee/intl.json
|
|
171
|
-
|
|
172
|
-
```json
|
|
173
|
-
{
|
|
174
|
-
"outPaths": [
|
|
175
|
-
{ "path": "locales" }
|
|
176
|
-
]
|
|
177
|
-
}
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
> `outPaths` 相对于 `.eevee/intl.json` 自身目录解析,所以 `"locales"` 指向 `.eevee/locales/`。
|
|
181
|
-
|
|
182
|
-
### .eevee/sync.json(运行时 properties 全量生成)
|
|
183
|
-
|
|
184
|
-
```json
|
|
185
|
-
[
|
|
186
|
-
{
|
|
187
|
-
"outPath": "<module>/src/main/resources/static/i18n",
|
|
188
|
-
"format": "properties",
|
|
189
|
-
"splitByTag": false,
|
|
190
|
-
"languages": {
|
|
191
|
-
"zh-CN": "messages_zh_CN",
|
|
192
|
-
"en-US": "messages_en_US",
|
|
193
|
-
"ja-JP": "messages_ja_JP",
|
|
194
|
-
"ko-KR": "messages_ko_KR"
|
|
195
|
-
},
|
|
196
|
-
"projects": [
|
|
197
|
-
{
|
|
198
|
-
"projectId": 3,
|
|
199
|
-
"versions": [2, 29, 30, 31],
|
|
200
|
-
"tags": []
|
|
201
|
-
}
|
|
202
|
-
],
|
|
203
|
-
"options": {
|
|
204
|
-
"properties": { "escape": "none" }
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
]
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
关键点:
|
|
211
|
-
|
|
212
|
-
- `tags: []` 表示不做标签过滤,项目级全量拉取(适用于没有平台标签的后端项目)
|
|
213
|
-
- 语言映射的 value 是文件名前缀(不含 `.properties`),直接生成 `messages_zh_CN.properties`
|
|
214
|
-
- `escape: "none"` 保持 UTF-8 原文,与 Spring Boot `MessageSource` 兼容
|
|
215
|
-
- `outPath` 相对于 `.eevee/` 目录解析,`../` 可以跳出回到仓库根
|
|
216
|
-
|
|
217
|
-
### .gitignore 追加
|
|
218
|
-
|
|
219
|
-
```gitignore
|
|
220
|
-
# eevee lint 本地快照;运行时 properties 由 sync.json 显式同步
|
|
221
|
-
/.eevee/locales/
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
### 运行
|
|
225
|
-
|
|
226
|
-
```bash
|
|
227
|
-
# 预览运行时同步
|
|
228
|
-
eevee intl download --config .eevee/sync.json --dry-run
|
|
229
|
-
|
|
230
|
-
# 全量生成 properties
|
|
231
|
-
eevee intl download --config .eevee/sync.json
|
|
232
|
-
|
|
233
|
-
# lint(自动刷新快照 + 检查)
|
|
234
|
-
eevee lint --staged --language java
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
---
|
|
238
|
-
|
|
239
|
-
## 无标签项目的特殊处理
|
|
240
|
-
|
|
241
|
-
如果 EEVEE 平台项目没有创建任何标签组:
|
|
242
|
-
|
|
243
|
-
- `tags: []` → 项目级全量拉取
|
|
244
|
-
- 省略 `tags` 且平台无标签 → 自动降级为项目级全量
|
|
245
|
-
- `versions` 省略 → 拉取项目全部版本
|
|
246
|
-
|
|
247
|
-
后端项目推荐显式配置 `versions`,避免新版本迁移后把未发布的 key 拉进当前分支。
|
|
248
|
-
|
|
249
|
-
## 版本升级维护
|
|
250
|
-
|
|
251
|
-
每次创建新 release 版本后:
|
|
252
|
-
|
|
253
|
-
1. 在 EEVEE 通过 API 迁移增量词条
|
|
254
|
-
2. 拿到新 version ID
|
|
255
|
-
3. 追加到 `.eevee/sync.json` 和 `.eevee/download.json` 的 `versions` 数组
|
|
256
|
-
4. 执行 `eevee intl download --config .eevee/sync.json` 刷新 properties
|
|
257
|
-
|
|
258
|
-
## 常见问题
|
|
259
|
-
|
|
260
|
-
| 问题 | 原因 | 解决 |
|
|
261
|
-
|------|------|------|
|
|
262
|
-
| 未读取到任何 zh-CN*.json | `intl.json` 的 `outPaths` 路径不对 | 确认路径相对于 `intl.json` 所在目录 |
|
|
263
|
-
| 平台返回 0 个词条 | 项目没有标签且未配置 `tags: []` | 显式设置 `"tags": []` |
|
|
264
|
-
| token 过期 401 | `~/.eevee-cli/config.json` 里的 token 失效 | `eevee config set --token <new>` |
|
|
265
|
-
| 全量 sync 后 diff 很大 | key 顺序按平台排序 | 一次性重排,后续 diff 只看新增/删除 |
|
|
266
|
-
| properties 某行换行 | 翻译里含物理换行 | 已在 CLI 修复,确保使用最新版本 |
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import { CliError, parseArgs, hasFlag, requireOption } from '../lib/args.js';
|
|
2
|
-
import { loadIntlConfig } from '../lib/intl-config.js';
|
|
3
|
-
import { downloadIntl } from '../lib/intl-downloader.js';
|
|
4
|
-
import { resolveRuntimeConfig, requireToken } from '../lib/config.js';
|
|
5
|
-
export async function runIntl(subcommand, argv) {
|
|
6
|
-
switch (subcommand) {
|
|
7
|
-
case 'download':
|
|
8
|
-
return await runDownload(argv);
|
|
9
|
-
case 'tags':
|
|
10
|
-
return await runTags(argv);
|
|
11
|
-
case 'versions':
|
|
12
|
-
return await runVersions(argv);
|
|
13
|
-
case 'languages':
|
|
14
|
-
return await runLanguages(argv);
|
|
15
|
-
default:
|
|
16
|
-
throw new CliError(`用法: eevee intl <download|tags|versions|languages>`);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
// ---------- download ----------
|
|
20
|
-
async function runDownload(argv) {
|
|
21
|
-
const parsed = parseArgs(argv, [
|
|
22
|
-
{ long: 'dry-run' },
|
|
23
|
-
{ long: 'json' },
|
|
24
|
-
{ long: 'config', value: true },
|
|
25
|
-
]);
|
|
26
|
-
const config = await loadIntlConfig(typeof parsed.options.get('config') === 'string' ? String(parsed.options.get('config')) : undefined);
|
|
27
|
-
if (hasFlag(parsed.options, 'dry-run')) {
|
|
28
|
-
const summary = config.targets.map((t, i) => ({
|
|
29
|
-
index: i + 1,
|
|
30
|
-
outPath: t.outPath,
|
|
31
|
-
format: t.format ?? 'json',
|
|
32
|
-
splitByTag: t.splitByTag ?? false,
|
|
33
|
-
languages: t.languages,
|
|
34
|
-
projects: t.projects.map((p) => ({
|
|
35
|
-
projectId: p.projectId,
|
|
36
|
-
versions: p.versions ?? '(all)',
|
|
37
|
-
tags: p.tags ?? '(all)',
|
|
38
|
-
})),
|
|
39
|
-
}));
|
|
40
|
-
if (hasFlag(parsed.options, 'json')) {
|
|
41
|
-
console.log(JSON.stringify({ ok: true, data: { dryRun: true, targets: summary } }, null, 2));
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
console.log('dry-run — 以下为将要执行的下载计划:\n');
|
|
45
|
-
for (const s of summary) {
|
|
46
|
-
console.log(`[${s.index}] outPath=${s.outPath} format=${s.format} splitByTag=${s.splitByTag}`);
|
|
47
|
-
console.log(` languages: ${JSON.stringify(s.languages)}`);
|
|
48
|
-
for (const p of s.projects) {
|
|
49
|
-
console.log(` project=${p.projectId} versions=${p.versions} tags=${p.tags}`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
const result = await downloadIntl(config);
|
|
56
|
-
if (hasFlag(parsed.options, 'json')) {
|
|
57
|
-
console.log(JSON.stringify({ ok: true, data: result }, null, 2));
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
console.log('✔ 下载完成\n');
|
|
61
|
-
for (const target of result.targets) {
|
|
62
|
-
console.log(`输出目录: ${target.outPath} 格式: ${target.format}`);
|
|
63
|
-
for (const file of target.files) {
|
|
64
|
-
console.log(` ${file.path} ${file.terms} 词条`);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
console.log(`\n总计: ${result.totalTerms} 词条, 耗时 ${result.duration}ms`);
|
|
68
|
-
}
|
|
69
|
-
// ---------- tags / versions / languages ----------
|
|
70
|
-
async function queryApi(argv, apiPath) {
|
|
71
|
-
const parsed = parseArgs(argv, [
|
|
72
|
-
{ long: 'project', value: true },
|
|
73
|
-
{ long: 'json' },
|
|
74
|
-
]);
|
|
75
|
-
const projectId = Number(requireOption(parsed.options, 'project'));
|
|
76
|
-
if (!Number.isInteger(projectId) || projectId <= 0)
|
|
77
|
-
throw new CliError('--project 必须是正整数');
|
|
78
|
-
const runtime = await resolveRuntimeConfig({});
|
|
79
|
-
requireToken(runtime.token);
|
|
80
|
-
const base = new URL(runtime.url);
|
|
81
|
-
base.pathname = base.pathname.replace(/\/mcp\/?$/, '');
|
|
82
|
-
const url = new URL(apiPath(projectId), base.origin + (base.pathname === '/' ? '' : base.pathname));
|
|
83
|
-
const response = await fetch(url, {
|
|
84
|
-
headers: { Authorization: `Bearer ${runtime.token}` },
|
|
85
|
-
signal: AbortSignal.timeout(15_000),
|
|
86
|
-
});
|
|
87
|
-
if (!response.ok)
|
|
88
|
-
throw new CliError(`API ${response.status}: ${url.pathname}`);
|
|
89
|
-
const json = await response.json();
|
|
90
|
-
return json.data;
|
|
91
|
-
}
|
|
92
|
-
async function runTags(argv) {
|
|
93
|
-
const parsed = parseArgs(argv, [{ long: 'project', value: true }, { long: 'json' }]);
|
|
94
|
-
const data = await queryApi(argv, (id) => `/api/v1/projects/${id}/tag-groups`);
|
|
95
|
-
if (hasFlag(parsed.options, 'json')) {
|
|
96
|
-
console.log(JSON.stringify({ ok: true, data }, null, 2));
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
console.log('标签组 标签ID 标签名');
|
|
100
|
-
for (const group of data) {
|
|
101
|
-
for (const tag of group.tags ?? []) {
|
|
102
|
-
console.log(`${group.name.padEnd(14)} ${String(tag.id).padEnd(6)} ${tag.name}`);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
async function runVersions(argv) {
|
|
107
|
-
const parsed = parseArgs(argv, [{ long: 'project', value: true }, { long: 'json' }]);
|
|
108
|
-
const data = await queryApi(argv, (id) => `/api/v1/projects/${id}/versions`);
|
|
109
|
-
if (hasFlag(parsed.options, 'json')) {
|
|
110
|
-
console.log(JSON.stringify({ ok: true, data }, null, 2));
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
console.log('版本ID 版本名 词条数');
|
|
114
|
-
for (const v of data) {
|
|
115
|
-
console.log(`${String(v.id).padEnd(6)} ${(v.name ?? '').padEnd(12)} ${v.term_count ?? '-'}`);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
async function runLanguages(argv) {
|
|
119
|
-
const parsed = parseArgs(argv, [{ long: 'json' }]);
|
|
120
|
-
const projectId = Number(requireOption(parseArgs(argv, [{ long: 'project', value: true }]).options, 'project'));
|
|
121
|
-
const data = await queryApi(argv, (id) => `/api/v1/projects/${id}`);
|
|
122
|
-
const locales = data.locales ?? (data.ref_locale ? [data.ref_locale] : []);
|
|
123
|
-
if (hasFlag(parsed.options, 'json')) {
|
|
124
|
-
console.log(JSON.stringify({ ok: true, data: locales }, null, 2));
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
console.log('locale');
|
|
128
|
-
for (const locale of locales)
|
|
129
|
-
console.log(locale);
|
|
130
|
-
}
|
|
131
|
-
//# sourceMappingURL=intl-command.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intl-command.js","sourceRoot":"","sources":["../../../src/commands/intl-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEtE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAAkB,EAAE,IAAuB;IACvE,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,UAAU;YACb,OAAO,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,KAAK,UAAU;YACb,OAAO,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,WAAW;YACd,OAAO,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QAClC;YACE,MAAM,IAAI,QAAQ,CAAC,mDAAmD,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,iCAAiC;AAEjC,KAAK,UAAU,WAAW,CAAC,IAAuB;IAChD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE;QAC7B,EAAE,IAAI,EAAE,SAAS,EAAE;QACnB,EAAE,IAAI,EAAE,MAAM,EAAE;QAChB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;KAChC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CACpG,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5C,KAAK,EAAE,CAAC,GAAG,CAAC;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,MAAM;YAC1B,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,KAAK;YACjC,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/B,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,OAAO;gBAC/B,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,OAAO;aACxB,CAAC,CAAC;SACJ,CAAC,CAAC,CAAC;QACJ,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,gBAAgB,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;gBACjG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBAC7D,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,SAAS,cAAc,CAAC,CAAC,QAAQ,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpF,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IAE1C,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,UAAU,WAAW,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,oDAAoD;AAEpD,KAAK,UAAU,QAAQ,CAAI,IAAuB,EAAE,OAAsC;IACxF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE;QAC7B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE;QAChC,EAAE,IAAI,EAAE,MAAM,EAAE;KACjB,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAE3F,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC/C,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE,EAAE;QACrD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,QAAQ,CAAC,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAiB,CAAC;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAQD,KAAK,UAAU,OAAO,CAAC,IAAuB;IAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAiB,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;IAE/F,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;AACH,CAAC;AAQD,KAAK,UAAU,WAAW,CAAC,IAAuB;IAChD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAgB,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;IAE5F,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAOD,KAAK,UAAU,YAAY,CAAC,IAAuB;IACjD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAChH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAc,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE3E,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,KAAK,MAAM,MAAM,IAAI,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { CliError, hasFlag, optionalOption, parseArgs } from '../lib/args.js';
|
|
3
|
-
import { runLintScan } from '../lib/lint.js';
|
|
4
|
-
export async function runLint(argv) {
|
|
5
|
-
let jsonRequested = false;
|
|
6
|
-
try {
|
|
7
|
-
const parsed = parseArgs(argv, [
|
|
8
|
-
{ long: 'config', value: true },
|
|
9
|
-
{ long: 'language', value: true },
|
|
10
|
-
{ long: 'source', value: true },
|
|
11
|
-
{ long: 'staged' },
|
|
12
|
-
{ long: 'changed' },
|
|
13
|
-
{ long: 'fix' },
|
|
14
|
-
{ long: 'refresh' },
|
|
15
|
-
{ long: 'no-refresh' },
|
|
16
|
-
{ long: 'refresh-config', value: true },
|
|
17
|
-
{ long: 'refresh-on-error', value: true },
|
|
18
|
-
{ long: 'json' },
|
|
19
|
-
]);
|
|
20
|
-
jsonRequested = hasFlag(parsed.options, 'json');
|
|
21
|
-
if (hasFlag(parsed.options, 'fix')) {
|
|
22
|
-
throw new CliError('当前没有可安全自动修复的问题;--fix 已保留。请按诊断 hint 修改,或让 Agent 根据 --json 生成补丁。', 64);
|
|
23
|
-
}
|
|
24
|
-
const sourceFlag = optionalOption(parsed.options, 'source');
|
|
25
|
-
if (sourceFlag && !['workspace', 'staged', 'changed'].includes(sourceFlag)) {
|
|
26
|
-
throw new CliError('--source 仅支持 workspace、staged 或 changed', 64);
|
|
27
|
-
}
|
|
28
|
-
let source = sourceFlag ?? 'workspace';
|
|
29
|
-
const staged = hasFlag(parsed.options, 'staged');
|
|
30
|
-
const changed = hasFlag(parsed.options, 'changed');
|
|
31
|
-
if (staged && changed)
|
|
32
|
-
throw new CliError('--staged 和 --changed 不能同时使用', 64);
|
|
33
|
-
if (staged)
|
|
34
|
-
source = 'staged';
|
|
35
|
-
if (changed)
|
|
36
|
-
source = 'changed';
|
|
37
|
-
const refresh = hasFlag(parsed.options, 'refresh');
|
|
38
|
-
const noRefresh = hasFlag(parsed.options, 'no-refresh');
|
|
39
|
-
if (noRefresh)
|
|
40
|
-
throw new CliError('词条同步是强制步骤,不支持 --no-refresh', 64);
|
|
41
|
-
const refreshOnError = optionalOption(parsed.options, 'refresh-on-error');
|
|
42
|
-
if (refreshOnError) {
|
|
43
|
-
throw new CliError('词条同步是强制步骤,不支持 --refresh-on-error', 64);
|
|
44
|
-
}
|
|
45
|
-
const languages = optionalOption(parsed.options, 'language')?.split(',').map((item) => item.trim());
|
|
46
|
-
const report = await runLintScan({
|
|
47
|
-
cwd: process.cwd(),
|
|
48
|
-
configPath: optionalOption(parsed.options, 'config'),
|
|
49
|
-
languages,
|
|
50
|
-
files: parsed.positionals,
|
|
51
|
-
source,
|
|
52
|
-
refresh: {
|
|
53
|
-
enabled: refresh ? true : undefined,
|
|
54
|
-
config: optionalOption(parsed.options, 'refresh-config'),
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
if (jsonRequested) {
|
|
58
|
-
console.log(JSON.stringify({ ok: true, data: report }, null, 2));
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
renderHuman(report);
|
|
62
|
-
}
|
|
63
|
-
if (!report.passed)
|
|
64
|
-
process.exitCode = 1;
|
|
65
|
-
}
|
|
66
|
-
catch (error) {
|
|
67
|
-
if (!jsonRequested)
|
|
68
|
-
throw error;
|
|
69
|
-
const exitCode = error instanceof CliError && Number.isInteger(error.exitCode) ? error.exitCode : 1;
|
|
70
|
-
console.log(JSON.stringify({ ok: false, error: { message: error.message } }, null, 2));
|
|
71
|
-
process.exitCode = exitCode;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
function renderHuman(report) {
|
|
75
|
-
if (report.refresh?.status === 'ok') {
|
|
76
|
-
console.log(`✔ 词条同步完成:${report.refresh.totalTerms ?? 0} 词条,耗时 ${report.refresh.duration ?? 0}ms`);
|
|
77
|
-
}
|
|
78
|
-
else if (report.refresh?.status === 'warn') {
|
|
79
|
-
console.warn('词条同步失败时不会继续检查');
|
|
80
|
-
}
|
|
81
|
-
if (report.issueCount === 0) {
|
|
82
|
-
console.log(`✔ ${report.source === 'workspace' ? '检查完成' : `检查 ${report.source} 文件完成`},未发现国际化问题`);
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
console.log('EEVEE 国际化检查\n');
|
|
86
|
-
for (const file of report.files) {
|
|
87
|
-
for (const diagnostic of file.diagnostics) {
|
|
88
|
-
const relative = path.relative(report.root, diagnostic.file).replaceAll(path.sep, '/');
|
|
89
|
-
console.log(`${relative}:${diagnostic.line}:${diagnostic.column} error ${diagnostic.message} ${diagnostic.ruleId}`);
|
|
90
|
-
console.log(` ${diagnostic.excerpt}`);
|
|
91
|
-
console.log(` 建议: ${diagnostic.hint}`);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
const byCode = groupCount(report.files.flatMap((file) => file.diagnostics.map((item) => item.code)));
|
|
95
|
-
console.log(`\n✖ ${report.issueCount} 个问题,覆盖 ${report.files.length} 个文件`);
|
|
96
|
-
console.log(` ${Object.entries(byCode).map(([code, count]) => `${code}: ${count}`).join(', ')}`);
|
|
97
|
-
console.log(' 自动修复: 当前规则需要业务决策,没有启用自动改写;可使用 --json 获取结构化建议');
|
|
98
|
-
}
|
|
99
|
-
function groupCount(values) {
|
|
100
|
-
const result = {};
|
|
101
|
-
for (const value of values)
|
|
102
|
-
result[value] = (result[value] ?? 0) + 1;
|
|
103
|
-
return result;
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=lint-command.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lint-command.js","sourceRoot":"","sources":["../../../src/commands/lint-command.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAuB;IACnD,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE;YAC7B,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;YAC/B,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE;YACjC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;YAC/B,EAAE,IAAI,EAAE,QAAQ,EAAE;YAClB,EAAE,IAAI,EAAE,SAAS,EAAE;YACnB,EAAE,IAAI,EAAE,KAAK,EAAE;YACf,EAAE,IAAI,EAAE,SAAS,EAAE;YACnB,EAAE,IAAI,EAAE,YAAY,EAAE;YACtB,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE;YACvC,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE;YACzC,EAAE,IAAI,EAAE,MAAM,EAAE;SACjB,CAAC,CAAC;QACH,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEhD,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,QAAQ,CAChB,gEAAgE,EAChE,EAAE,CACH,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAA2B,CAAC;QACtF,IAAI,UAAU,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,QAAQ,CAAC,yCAAyC,EAAE,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,MAAM,GAAe,UAAU,IAAI,WAAW,CAAC;QACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACnD,IAAI,MAAM,IAAI,OAAO;YAAE,MAAM,IAAI,QAAQ,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;QAC7E,IAAI,MAAM;YAAE,MAAM,GAAG,QAAQ,CAAC;QAC9B,IAAI,OAAO;YAAE,MAAM,GAAG,SAAS,CAAC;QAChC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACxD,IAAI,SAAS;YAAE,MAAM,IAAI,QAAQ,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;QACpE,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QAC1E,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,IAAI,QAAQ,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACpG,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;YAC/B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC;YACpD,SAAS;YACT,KAAK,EAAE,MAAM,CAAC,WAAW;YACzB,MAAM;YACN,OAAO,EAAE;gBACP,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;gBACnC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,gBAAgB,CAAC;aACzD;SACF,CAAC,CAAC;QAEH,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,aAAa;YAAE,MAAM,KAAK,CAAC;QAChC,MAAM,QAAQ,GAAG,KAAK,YAAY,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAG,KAAe,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClG,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAkB;IACrC,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CACT,YAAY,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,UAAU,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,CACrF,CAAC;IACJ,CAAC;SAAM,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;QACjG,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvF,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,MAAM,YAAY,UAAU,CAAC,OAAO,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACvH,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,UAAU,WAAW,MAAM,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClG,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,UAAU,CAAC,MAAyB;IAC3C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { readFile, readdir } from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { CliError } from './args.js';
|
|
4
|
-
export async function readIntlCatalog(_root, configFile) {
|
|
5
|
-
let raw;
|
|
6
|
-
try {
|
|
7
|
-
raw = JSON.parse(await readFile(configFile, 'utf8'));
|
|
8
|
-
}
|
|
9
|
-
catch (error) {
|
|
10
|
-
throw new CliError(`Intl 数据配置解析失败 (${configFile}): ${error.message}`);
|
|
11
|
-
}
|
|
12
|
-
const source = raw;
|
|
13
|
-
if (!source || !Array.isArray(source.outPaths)) {
|
|
14
|
-
throw new CliError(`Intl 数据配置格式不正确,缺少 outPaths 数组: ${configFile}`);
|
|
15
|
-
}
|
|
16
|
-
const catalog = { allTerms: new Map(), tagTerms: new Map() };
|
|
17
|
-
for (const output of source.outPaths) {
|
|
18
|
-
if (!output?.path || typeof output.path !== 'string')
|
|
19
|
-
continue;
|
|
20
|
-
// outPaths 相对于 intl 配置文件所在目录解析;这样 .eevee/intl.json 可以直接指向 .eevee/locales。
|
|
21
|
-
const directory = path.resolve(path.dirname(configFile), output.path);
|
|
22
|
-
let entries;
|
|
23
|
-
try {
|
|
24
|
-
entries = await readdir(directory, { withFileTypes: true });
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
for (const entry of entries) {
|
|
30
|
-
const match = /^zh-CN(?:-([^.]+))?\.json$/i.exec(entry.name);
|
|
31
|
-
if (!match || !entry.isFile())
|
|
32
|
-
continue;
|
|
33
|
-
const tag = match[1] ?? 'default';
|
|
34
|
-
const file = path.join(directory, entry.name);
|
|
35
|
-
let terms;
|
|
36
|
-
try {
|
|
37
|
-
terms = JSON.parse(await readFile(file, 'utf8'));
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
40
|
-
throw new CliError(`Intl 词条文件解析失败 (${file}): ${error.message}`);
|
|
41
|
-
}
|
|
42
|
-
if (!terms || typeof terms !== 'object' || Array.isArray(terms)) {
|
|
43
|
-
throw new CliError(`Intl 词条文件必须是对象: ${file}`);
|
|
44
|
-
}
|
|
45
|
-
const tagMap = catalog.tagTerms.get(tag) ?? new Map();
|
|
46
|
-
for (const key of Object.keys(terms)) {
|
|
47
|
-
tagMap.set(key, true);
|
|
48
|
-
catalog.allTerms.set(key, true);
|
|
49
|
-
}
|
|
50
|
-
catalog.tagTerms.set(tag, tagMap);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
if (catalog.allTerms.size === 0) {
|
|
54
|
-
throw new CliError(`未读取到任何 zh-CN*.json 词条; 请检查 Intl 数据配置: ${configFile}`);
|
|
55
|
-
}
|
|
56
|
-
return catalog;
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=intl-catalog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intl-catalog.js","sourceRoot":"","sources":["../../../src/lib/intl-catalog.ts"],"names":[],"mappings":"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"}
|