befly 3.8.19 → 3.8.21
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 +7 -6
- package/bunfig.toml +1 -1
- package/checks/checkApi.ts +92 -0
- package/checks/checkApp.ts +31 -0
- package/{check.ts → checks/checkTable.ts} +28 -159
- package/config.ts +71 -0
- package/hooks/auth.ts +30 -0
- package/hooks/cors.ts +48 -0
- package/hooks/errorHandler.ts +23 -0
- package/hooks/parser.ts +67 -0
- package/hooks/permission.ts +54 -0
- package/hooks/rateLimit.ts +70 -0
- package/hooks/requestId.ts +24 -0
- package/hooks/requestLogger.ts +25 -0
- package/hooks/responseFormatter.ts +64 -0
- package/hooks/validator.ts +34 -0
- package/lib/database.ts +28 -25
- package/lib/dbHelper.ts +3 -3
- package/lib/jwt.ts +90 -99
- package/lib/logger.ts +44 -23
- package/lib/redisHelper.ts +19 -22
- package/loader/loadApis.ts +69 -114
- package/loader/loadHooks.ts +65 -0
- package/loader/loadPlugins.ts +50 -219
- package/main.ts +106 -133
- package/package.json +23 -14
- package/paths.ts +20 -0
- package/plugins/cache.ts +1 -3
- package/plugins/db.ts +8 -11
- package/plugins/logger.ts +5 -3
- package/plugins/redis.ts +10 -14
- package/router/api.ts +60 -106
- package/router/root.ts +15 -12
- package/router/static.ts +54 -58
- package/sync/syncAll.ts +58 -0
- package/sync/syncApi.ts +264 -0
- package/sync/syncDb/apply.ts +194 -0
- package/sync/syncDb/constants.ts +76 -0
- package/sync/syncDb/ddl.ts +194 -0
- package/sync/syncDb/helpers.ts +200 -0
- package/sync/syncDb/index.ts +164 -0
- package/sync/syncDb/schema.ts +201 -0
- package/sync/syncDb/sqlite.ts +50 -0
- package/sync/syncDb/table.ts +321 -0
- package/sync/syncDb/tableCreate.ts +146 -0
- package/sync/syncDb/version.ts +72 -0
- package/sync/syncDb.ts +19 -0
- package/sync/syncDev.ts +206 -0
- package/sync/syncMenu.ts +331 -0
- package/tests/cipher.test.ts +248 -0
- package/tests/dbHelper-advanced.test.ts +717 -0
- package/tests/dbHelper-columns.test.ts +266 -0
- package/tests/dbHelper-execute.test.ts +240 -0
- package/tests/fields-redis-cache.test.ts +123 -0
- package/tests/fields-validate.test.ts +99 -0
- package/tests/integration.test.ts +202 -0
- package/tests/jwt.test.ts +122 -0
- package/tests/logger.test.ts +94 -0
- package/tests/redisHelper.test.ts +231 -0
- package/tests/sqlBuilder-advanced.test.ts +593 -0
- package/tests/sqlBuilder.test.ts +184 -0
- package/tests/util.test.ts +95 -0
- package/tests/validator-advanced.test.ts +653 -0
- package/tests/validator.test.ts +148 -0
- package/tests/xml.test.ts +101 -0
- package/tsconfig.json +2 -4
- package/types/api.d.ts +6 -0
- package/types/befly.d.ts +152 -28
- package/types/context.d.ts +29 -3
- package/types/hook.d.ts +35 -0
- package/types/index.ts +14 -1
- package/types/plugin.d.ts +6 -7
- package/types/sync.d.ts +403 -0
- package/env.ts +0 -106
- package/lib/middleware.ts +0 -275
- package/types/env.ts +0 -65
- package/types/util.d.ts +0 -45
- package/util.ts +0 -257
package/types/sync.d.ts
ADDED
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI 项目类型定义
|
|
3
|
+
* 集中管理所有接口和类型定义
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// ==================== 命令选项类型 ====================
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* SyncDb 命令选项
|
|
10
|
+
*/
|
|
11
|
+
export interface SyncDbOptions {
|
|
12
|
+
table?: string;
|
|
13
|
+
dryRun?: boolean;
|
|
14
|
+
force?: boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Sync 命令选项
|
|
19
|
+
*/
|
|
20
|
+
export interface SyncOptions {
|
|
21
|
+
table?: string;
|
|
22
|
+
force?: boolean;
|
|
23
|
+
dryRun?: boolean;
|
|
24
|
+
drop?: boolean;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* SyncMenu 命令选项
|
|
29
|
+
*/
|
|
30
|
+
export interface SyncMenuOptions {
|
|
31
|
+
plan?: boolean;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 菜单配置
|
|
36
|
+
*/
|
|
37
|
+
export interface MenuConfig {
|
|
38
|
+
name: string;
|
|
39
|
+
path: string;
|
|
40
|
+
icon?: string;
|
|
41
|
+
sort?: number;
|
|
42
|
+
children?: MenuConfig[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* SyncDev 命令选项
|
|
47
|
+
*/
|
|
48
|
+
export interface SyncDevOptions {
|
|
49
|
+
plan?: boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* SyncApi 命令选项
|
|
54
|
+
*/
|
|
55
|
+
export interface SyncApiOptions {
|
|
56
|
+
plan?: boolean;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* API 信息
|
|
61
|
+
*/
|
|
62
|
+
export interface ApiInfo {
|
|
63
|
+
name: string;
|
|
64
|
+
path: string;
|
|
65
|
+
method: string;
|
|
66
|
+
description: string;
|
|
67
|
+
addonName: string;
|
|
68
|
+
addonTitle: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ==================== 统计信息类型 ====================
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* SyncMenu 统计信息
|
|
75
|
+
*/
|
|
76
|
+
export interface SyncMenuStats {
|
|
77
|
+
totalMenus: number;
|
|
78
|
+
parentMenus: number;
|
|
79
|
+
childMenus: number;
|
|
80
|
+
created: number;
|
|
81
|
+
updated: number;
|
|
82
|
+
deleted: number;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* SyncApi 统计信息
|
|
87
|
+
*/
|
|
88
|
+
export interface SyncApiStats {
|
|
89
|
+
totalApis: number;
|
|
90
|
+
created: number;
|
|
91
|
+
updated: number;
|
|
92
|
+
deleted: number;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ==================== 数据库相关类型 ====================
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* 列信息接口
|
|
99
|
+
*/
|
|
100
|
+
export interface ColumnInfo {
|
|
101
|
+
type: string;
|
|
102
|
+
columnType: string;
|
|
103
|
+
length: number | null;
|
|
104
|
+
nullable: boolean;
|
|
105
|
+
defaultValue: any;
|
|
106
|
+
comment: string | null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 索引信息接口(键为索引名,值为列名数组)
|
|
111
|
+
*/
|
|
112
|
+
export interface IndexInfo {
|
|
113
|
+
[indexName: string]: string[];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* 字段变更接口
|
|
118
|
+
*/
|
|
119
|
+
export interface FieldChange {
|
|
120
|
+
type: 'length' | 'datatype' | 'comment' | 'default';
|
|
121
|
+
current: any;
|
|
122
|
+
expected: any;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* 索引操作接口
|
|
127
|
+
*/
|
|
128
|
+
export interface IndexAction {
|
|
129
|
+
action: 'create' | 'drop';
|
|
130
|
+
indexName: string;
|
|
131
|
+
fieldName: string;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* 表变更计划接口
|
|
136
|
+
*/
|
|
137
|
+
export interface TablePlan {
|
|
138
|
+
changed: boolean;
|
|
139
|
+
addClauses: string[];
|
|
140
|
+
modifyClauses: string[];
|
|
141
|
+
defaultClauses: string[];
|
|
142
|
+
indexActions: IndexAction[];
|
|
143
|
+
commentActions?: string[];
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* 全局统计对象
|
|
148
|
+
*/
|
|
149
|
+
export interface GlobalStats {
|
|
150
|
+
processedTables: number;
|
|
151
|
+
createdTables: number;
|
|
152
|
+
modifiedTables: number;
|
|
153
|
+
addFields: number;
|
|
154
|
+
nameChanges: number;
|
|
155
|
+
typeChanges: number;
|
|
156
|
+
minChanges: number;
|
|
157
|
+
maxChanges: number;
|
|
158
|
+
defaultChanges: number;
|
|
159
|
+
indexCreate: number;
|
|
160
|
+
indexDrop: number;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* 解析后的字段规则
|
|
165
|
+
*/
|
|
166
|
+
export interface ParsedFieldRule {
|
|
167
|
+
name: string;
|
|
168
|
+
type: 'string' | 'number' | 'text' | 'array_string' | 'array_text';
|
|
169
|
+
min: number | null;
|
|
170
|
+
max: number | null;
|
|
171
|
+
default: any;
|
|
172
|
+
index: 0 | 1;
|
|
173
|
+
regex: string | null;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* 阶段统计信息
|
|
178
|
+
*/
|
|
179
|
+
export interface PhaseStats {
|
|
180
|
+
startTime: number;
|
|
181
|
+
endTime?: number;
|
|
182
|
+
duration?: number;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// ==================== 报告相关类型 ====================
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* 完整的同步报告数据结构
|
|
189
|
+
*/
|
|
190
|
+
export interface SyncReport {
|
|
191
|
+
meta: SyncReportMeta;
|
|
192
|
+
database: DatabaseReport;
|
|
193
|
+
api: ApiReport;
|
|
194
|
+
menu: MenuReport;
|
|
195
|
+
dev: DevReport;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* 报告元信息
|
|
200
|
+
*/
|
|
201
|
+
export interface SyncReportMeta {
|
|
202
|
+
timestamp: number;
|
|
203
|
+
timestampStr: string;
|
|
204
|
+
environment: string;
|
|
205
|
+
totalTime: number;
|
|
206
|
+
status: 'success' | 'error';
|
|
207
|
+
error?: string;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* 数据库同步报告
|
|
212
|
+
*/
|
|
213
|
+
export interface DatabaseReport {
|
|
214
|
+
stats: SyncDbStats;
|
|
215
|
+
details: {
|
|
216
|
+
tables: TableChangeDetail[];
|
|
217
|
+
};
|
|
218
|
+
timing: {
|
|
219
|
+
validation: number;
|
|
220
|
+
connection: number;
|
|
221
|
+
scanning: number;
|
|
222
|
+
processing: number;
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* 表变更详情
|
|
228
|
+
*/
|
|
229
|
+
export interface TableChangeDetail {
|
|
230
|
+
name: string;
|
|
231
|
+
source: 'app' | 'addon';
|
|
232
|
+
addonName?: string;
|
|
233
|
+
action: 'create' | 'modify' | 'none';
|
|
234
|
+
fields: {
|
|
235
|
+
added: FieldDetail[];
|
|
236
|
+
modified: FieldModification[];
|
|
237
|
+
removed: FieldDetail[];
|
|
238
|
+
};
|
|
239
|
+
indexes: {
|
|
240
|
+
added: IndexDetail[];
|
|
241
|
+
removed: IndexDetail[];
|
|
242
|
+
};
|
|
243
|
+
sql: string[];
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* 字段详情
|
|
248
|
+
*/
|
|
249
|
+
export interface FieldDetail {
|
|
250
|
+
name: string;
|
|
251
|
+
type: string;
|
|
252
|
+
length?: number;
|
|
253
|
+
nullable?: boolean;
|
|
254
|
+
defaultValue?: any;
|
|
255
|
+
comment?: string;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* 字段修改详情
|
|
260
|
+
*/
|
|
261
|
+
export interface FieldModification {
|
|
262
|
+
name: string;
|
|
263
|
+
before: FieldDetail;
|
|
264
|
+
after: FieldDetail;
|
|
265
|
+
changeType: 'type' | 'length' | 'default' | 'nullable' | 'comment';
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* 索引详情
|
|
270
|
+
*/
|
|
271
|
+
export interface IndexDetail {
|
|
272
|
+
name: string;
|
|
273
|
+
fields: string[];
|
|
274
|
+
type?: string;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* 接口同步报告
|
|
279
|
+
*/
|
|
280
|
+
export interface ApiReport {
|
|
281
|
+
stats: {
|
|
282
|
+
totalApis: number;
|
|
283
|
+
projectApis: number;
|
|
284
|
+
addonApis: number;
|
|
285
|
+
created: number;
|
|
286
|
+
updated: number;
|
|
287
|
+
deleted: number;
|
|
288
|
+
};
|
|
289
|
+
details: {
|
|
290
|
+
bySource: {
|
|
291
|
+
project: ApiDetail[];
|
|
292
|
+
addons: Record<string, ApiDetail[]>;
|
|
293
|
+
};
|
|
294
|
+
byAction: {
|
|
295
|
+
created: ApiDetail[];
|
|
296
|
+
updated: ApiDetailWithDiff[];
|
|
297
|
+
deleted: ApiDetail[];
|
|
298
|
+
};
|
|
299
|
+
};
|
|
300
|
+
timing: {
|
|
301
|
+
scanning: number;
|
|
302
|
+
processing: number;
|
|
303
|
+
caching: number;
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* 接口详情
|
|
309
|
+
*/
|
|
310
|
+
export interface ApiDetail {
|
|
311
|
+
name: string;
|
|
312
|
+
path: string;
|
|
313
|
+
method: string;
|
|
314
|
+
description: string;
|
|
315
|
+
addonName: string;
|
|
316
|
+
addonTitle: string;
|
|
317
|
+
auth?: boolean;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* 带差异的接口详情
|
|
322
|
+
*/
|
|
323
|
+
export interface ApiDetailWithDiff extends ApiDetail {
|
|
324
|
+
changes: {
|
|
325
|
+
field: string;
|
|
326
|
+
before: any;
|
|
327
|
+
after: any;
|
|
328
|
+
}[];
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* 菜单同步报告
|
|
333
|
+
*/
|
|
334
|
+
export interface MenuReport {
|
|
335
|
+
stats: SyncMenuStats;
|
|
336
|
+
details: {
|
|
337
|
+
tree: MenuTreeNode[];
|
|
338
|
+
byAction: {
|
|
339
|
+
created: MenuDetail[];
|
|
340
|
+
updated: MenuDetailWithDiff[];
|
|
341
|
+
deleted: MenuDetail[];
|
|
342
|
+
};
|
|
343
|
+
};
|
|
344
|
+
timing: {
|
|
345
|
+
scanning: number;
|
|
346
|
+
processing: number;
|
|
347
|
+
caching: number;
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* 菜单树节点
|
|
353
|
+
*/
|
|
354
|
+
export interface MenuTreeNode {
|
|
355
|
+
name: string;
|
|
356
|
+
path: string;
|
|
357
|
+
icon?: string;
|
|
358
|
+
sort?: number;
|
|
359
|
+
type?: number;
|
|
360
|
+
action?: 'created' | 'updated' | 'none';
|
|
361
|
+
children?: MenuTreeNode[];
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* 菜单详情
|
|
366
|
+
*/
|
|
367
|
+
export interface MenuDetail {
|
|
368
|
+
name: string;
|
|
369
|
+
path: string;
|
|
370
|
+
icon?: string;
|
|
371
|
+
sort?: number;
|
|
372
|
+
type?: number;
|
|
373
|
+
addonName: string;
|
|
374
|
+
addonTitle: string;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* 带差异的菜单详情
|
|
379
|
+
*/
|
|
380
|
+
export interface MenuDetailWithDiff extends MenuDetail {
|
|
381
|
+
changes: {
|
|
382
|
+
field: string;
|
|
383
|
+
before: any;
|
|
384
|
+
after: any;
|
|
385
|
+
}[];
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* 管理员详情
|
|
390
|
+
*/
|
|
391
|
+
export interface AdminDetail {
|
|
392
|
+
username: string;
|
|
393
|
+
action: 'created' | 'updated' | 'exists';
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* 角色详情
|
|
398
|
+
*/
|
|
399
|
+
export interface RoleDetail {
|
|
400
|
+
name: string;
|
|
401
|
+
permissions: number;
|
|
402
|
+
action: 'created' | 'updated' | 'exists';
|
|
403
|
+
}
|
package/env.ts
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 环境变量配置
|
|
3
|
-
* 根据 NODE_ENV 自动切换开发/生产环境配置
|
|
4
|
-
* 项目可通过创建 env.ts 或 env.js 文件覆盖这些配置
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { existsSync } from 'node:fs';
|
|
8
|
-
import type { EnvConfig } from './types/env.js';
|
|
9
|
-
|
|
10
|
-
const isProd = process.env.NODE_ENV === 'production';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* 核心默认配置
|
|
14
|
-
* 使用三元运算符根据环境切换配置
|
|
15
|
-
*/
|
|
16
|
-
const coreEnv: EnvConfig = {
|
|
17
|
-
// ========== 项目配置 ==========
|
|
18
|
-
NODE_ENV: process.env.NODE_ENV || 'development',
|
|
19
|
-
APP_NAME: isProd ? '野蜂飞舞正式环境' : '野蜂飞舞开发环境',
|
|
20
|
-
APP_PORT: 3000,
|
|
21
|
-
APP_HOST: '127.0.0.1',
|
|
22
|
-
DEV_EMAIL: '',
|
|
23
|
-
DEV_PASSWORD: '123456',
|
|
24
|
-
BODY_LIMIT: 10 * 1024 * 1024, // 10MB
|
|
25
|
-
DATABASE_ENABLE: 0,
|
|
26
|
-
// ========== 时区配置 ==========
|
|
27
|
-
TZ: 'Asia/Shanghai',
|
|
28
|
-
|
|
29
|
-
// ========== 日志配置 ==========
|
|
30
|
-
LOG_DEBUG: 1,
|
|
31
|
-
LOG_EXCLUDE_FIELDS: 'password,token,secret',
|
|
32
|
-
LOG_DIR: './logs',
|
|
33
|
-
LOG_TO_CONSOLE: 1,
|
|
34
|
-
LOG_MAX_SIZE: 10 * 1024 * 1024, // 10MB
|
|
35
|
-
|
|
36
|
-
// ========== 数据库配置 ==========
|
|
37
|
-
DB_TYPE: 'mysql',
|
|
38
|
-
DB_HOST: '127.0.0.1',
|
|
39
|
-
DB_PORT: 3306,
|
|
40
|
-
DB_USER: 'root',
|
|
41
|
-
DB_PASS: 'root',
|
|
42
|
-
DB_NAME: 'befly_demo',
|
|
43
|
-
DB_POOL_MAX: 10,
|
|
44
|
-
|
|
45
|
-
// ========== Redis 配置 ==========
|
|
46
|
-
REDIS_HOST: '127.0.0.1',
|
|
47
|
-
REDIS_PORT: 6379,
|
|
48
|
-
REDIS_USERNAME: '',
|
|
49
|
-
REDIS_PASSWORD: '',
|
|
50
|
-
REDIS_DB: 0,
|
|
51
|
-
REDIS_KEY_PREFIX: 'befly_demo',
|
|
52
|
-
|
|
53
|
-
// ========== JWT 配置 ==========
|
|
54
|
-
JWT_SECRET: 'befly-secret',
|
|
55
|
-
JWT_EXPIRES_IN: '7d',
|
|
56
|
-
JWT_ALGORITHM: 'HS256',
|
|
57
|
-
|
|
58
|
-
// ========== CORS 配置 ==========
|
|
59
|
-
CORS_ALLOWED_ORIGIN: '*',
|
|
60
|
-
CORS_ALLOWED_METHODS: 'GET, POST, PUT, DELETE, OPTIONS',
|
|
61
|
-
CORS_ALLOWED_HEADERS: 'Content-Type, Authorization, authorization, token',
|
|
62
|
-
CORS_EXPOSE_HEADERS: 'Content-Range, X-Content-Range, Authorization, authorization, token',
|
|
63
|
-
CORS_MAX_AGE: 86400,
|
|
64
|
-
CORS_ALLOW_CREDENTIALS: 'true'
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* 尝试加载项目级别的 env.ts 配置
|
|
69
|
-
*/
|
|
70
|
-
async function loadProjectEnv(): Promise<Partial<EnvConfig>> {
|
|
71
|
-
try {
|
|
72
|
-
// 尝试从项目根目录加载 env.ts 或 env.js
|
|
73
|
-
const projectEnvPathTs = process.cwd() + '/env.ts';
|
|
74
|
-
const projectEnvPathJs = process.cwd() + '/env.js';
|
|
75
|
-
|
|
76
|
-
let projectEnvPath = '';
|
|
77
|
-
if (existsSync(projectEnvPathTs)) {
|
|
78
|
-
projectEnvPath = projectEnvPathTs;
|
|
79
|
-
} else if (existsSync(projectEnvPathJs)) {
|
|
80
|
-
projectEnvPath = projectEnvPathJs;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// 检查文件是否存在
|
|
84
|
-
if (!projectEnvPath) {
|
|
85
|
-
return {};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// 动态导入
|
|
89
|
-
const module = await import(projectEnvPath);
|
|
90
|
-
return module.Env || module.default || {};
|
|
91
|
-
} catch (error) {
|
|
92
|
-
// 项目没有自定义配置,使用核心默认配置
|
|
93
|
-
return {};
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// 使用 top-level await 加载项目配置
|
|
98
|
-
const projectEnv = await loadProjectEnv();
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* 合并配置:项目配置覆盖核心配置
|
|
102
|
-
*/
|
|
103
|
-
export const Env: EnvConfig = {
|
|
104
|
-
...coreEnv,
|
|
105
|
-
...projectEnv
|
|
106
|
-
};
|