befly 3.8.19 → 3.8.20
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/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 +15 -7
- 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/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/check.ts +0 -378
- 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
|
+
}
|