befly 2.3.3 → 3.0.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 (93) hide show
  1. package/apis/health/info.ts +64 -0
  2. package/apis/tool/tokenCheck.ts +51 -0
  3. package/bin/befly.ts +202 -0
  4. package/checks/conflict.ts +408 -0
  5. package/checks/{table.js → table.ts} +139 -61
  6. package/config/env.ts +218 -0
  7. package/config/reserved.ts +96 -0
  8. package/main.ts +101 -0
  9. package/package.json +44 -8
  10. package/plugins/{db.js → db.ts} +24 -11
  11. package/plugins/logger.ts +28 -0
  12. package/plugins/redis.ts +51 -0
  13. package/plugins/tool.ts +34 -0
  14. package/scripts/syncDb/apply.ts +171 -0
  15. package/scripts/syncDb/constants.ts +70 -0
  16. package/scripts/syncDb/ddl.ts +182 -0
  17. package/scripts/syncDb/helpers.ts +172 -0
  18. package/scripts/syncDb/index.ts +215 -0
  19. package/scripts/syncDb/schema.ts +199 -0
  20. package/scripts/syncDb/sqlite.ts +50 -0
  21. package/scripts/syncDb/state.ts +104 -0
  22. package/scripts/syncDb/table.ts +204 -0
  23. package/scripts/syncDb/tableCreate.ts +142 -0
  24. package/scripts/syncDb/tests/constants.test.ts +104 -0
  25. package/scripts/syncDb/tests/ddl.test.ts +134 -0
  26. package/scripts/syncDb/tests/helpers.test.ts +70 -0
  27. package/scripts/syncDb/types.ts +92 -0
  28. package/scripts/syncDb/version.ts +73 -0
  29. package/scripts/syncDb.ts +9 -0
  30. package/scripts/{syncDev.js → syncDev.ts} +41 -25
  31. package/system.ts +149 -0
  32. package/tables/_common.json +21 -0
  33. package/tables/admin.json +10 -0
  34. package/tsconfig.json +58 -0
  35. package/types/api.d.ts +246 -0
  36. package/types/befly.d.ts +234 -0
  37. package/types/common.d.ts +215 -0
  38. package/types/context.ts +167 -0
  39. package/types/crypto.d.ts +23 -0
  40. package/types/database.d.ts +278 -0
  41. package/types/index.d.ts +16 -0
  42. package/types/index.ts +459 -0
  43. package/types/jwt.d.ts +99 -0
  44. package/types/logger.d.ts +43 -0
  45. package/types/plugin.d.ts +109 -0
  46. package/types/redis.d.ts +44 -0
  47. package/types/tool.d.ts +67 -0
  48. package/types/validator.d.ts +45 -0
  49. package/utils/addonHelper.ts +60 -0
  50. package/utils/api.ts +23 -0
  51. package/utils/{colors.js → colors.ts} +79 -21
  52. package/utils/crypto.ts +308 -0
  53. package/utils/datetime.ts +51 -0
  54. package/utils/dbHelper.ts +142 -0
  55. package/utils/errorHandler.ts +68 -0
  56. package/utils/index.ts +46 -0
  57. package/utils/jwt.ts +493 -0
  58. package/utils/logger.ts +284 -0
  59. package/utils/objectHelper.ts +68 -0
  60. package/utils/pluginHelper.ts +62 -0
  61. package/utils/redisHelper.ts +338 -0
  62. package/utils/response.ts +38 -0
  63. package/utils/{sqlBuilder.js → sqlBuilder.ts} +233 -97
  64. package/utils/sqlHelper.ts +447 -0
  65. package/utils/tableHelper.ts +167 -0
  66. package/utils/tool.ts +230 -0
  67. package/utils/typeHelper.ts +101 -0
  68. package/utils/validate.ts +451 -0
  69. package/utils/{xml.js → xml.ts} +100 -74
  70. package/.npmrc +0 -3
  71. package/.prettierignore +0 -2
  72. package/.prettierrc +0 -11
  73. package/apis/health/info.js +0 -49
  74. package/apis/tool/tokenCheck.js +0 -29
  75. package/bin/befly.js +0 -109
  76. package/config/env.js +0 -64
  77. package/main.js +0 -579
  78. package/plugins/logger.js +0 -14
  79. package/plugins/redis.js +0 -32
  80. package/plugins/tool.js +0 -8
  81. package/scripts/syncDb.js +0 -752
  82. package/system.js +0 -118
  83. package/tables/common.json +0 -16
  84. package/tables/tool.json +0 -6
  85. package/utils/api.js +0 -27
  86. package/utils/crypto.js +0 -260
  87. package/utils/index.js +0 -334
  88. package/utils/jwt.js +0 -387
  89. package/utils/logger.js +0 -143
  90. package/utils/redisHelper.js +0 -74
  91. package/utils/sqlManager.js +0 -471
  92. package/utils/tool.js +0 -31
  93. package/utils/validate.js +0 -226
package/types/index.ts ADDED
@@ -0,0 +1,459 @@
1
+ /**
2
+ * Befly 核心类型定义
3
+ *
4
+ * 这个文件导出所有 Befly 框架的类型定义
5
+ */
6
+
7
+ // 导出基础类型
8
+ export * from './common';
9
+ export * from './api';
10
+ export * from './befly';
11
+ export * from './plugin';
12
+ export * from './context';
13
+
14
+ // 导出功能模块类型
15
+ export * from './database';
16
+ export * from './crypto';
17
+ export * from './jwt';
18
+ export * from './validator';
19
+ export * from './redis';
20
+ export * from './logger';
21
+ export * from './tool';
22
+
23
+ /**
24
+ * API 请求上下文
25
+ */
26
+ export interface RequestContext {
27
+ /** 原始请求对象 */
28
+ req: Request;
29
+ /** 解析后的 URL */
30
+ url: URL;
31
+ /** 路径名 */
32
+ pathname: string;
33
+ /** 查询参数 */
34
+ query: URLSearchParams;
35
+ /** 请求体数据 */
36
+ body: any;
37
+ /** 请求头 */
38
+ headers: Headers;
39
+ /** 路由参数 */
40
+ params?: Record<string, string>;
41
+ /** JWT 载荷(认证后) */
42
+ jwt?: JwtPayload;
43
+ }
44
+
45
+ /**
46
+ * API 响应格式
47
+ */
48
+ export interface ApiResponse<T = any> {
49
+ /** 状态码:0=成功,1=失败 */
50
+ code: 0 | 1;
51
+ /** 提示信息 */
52
+ msg: string;
53
+ /** 响应数据 */
54
+ data: T;
55
+ }
56
+
57
+ /**
58
+ * API 处理函数
59
+ */
60
+ export type ApiHandler = (befly: BeflyContext, ctx: RequestContext, req: Request) => Promise<ApiResponse>;
61
+
62
+ /**
63
+ * API 路由定义
64
+ */
65
+ export interface ApiRoute {
66
+ /** HTTP 方法 */
67
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS';
68
+ /** 接口名称 */
69
+ name: string;
70
+ /** 认证要求:false=公开,true=需登录,['admin']=需特定角色 */
71
+ auth: boolean | string[];
72
+ /** 字段规则定义 */
73
+ fields: Record<string, string>;
74
+ /** 必填字段列表 */
75
+ required: string[];
76
+ /** 处理函数 */
77
+ handler: ApiHandler;
78
+ }
79
+
80
+ /**
81
+ * JWT 载荷
82
+ */
83
+ export interface JwtPayload {
84
+ /** 用户 ID */
85
+ userId?: string;
86
+ /** 用户名 */
87
+ username?: string;
88
+ /** 角色 */
89
+ role?: string;
90
+ /** 权限列表 */
91
+ permissions?: string[];
92
+ /** 签发时间 */
93
+ iat?: number;
94
+ /** 过期时间 */
95
+ exp?: number;
96
+ /** 主题 */
97
+ sub?: string;
98
+ /** 签发者 */
99
+ iss?: string;
100
+ /** 受众 */
101
+ aud?: string;
102
+ /** JWT ID */
103
+ jti?: string;
104
+ /** 生效时间 */
105
+ nbf?: number;
106
+ /** 其他自定义字段 */
107
+ [key: string]: any;
108
+ }
109
+
110
+ /**
111
+ * JWT 签名选项
112
+ */
113
+ export interface JwtSignOptions {
114
+ /** 密钥 */
115
+ secret?: string;
116
+ /** 算法 */
117
+ algorithm?: string;
118
+ /** 过期时间 */
119
+ expiresIn?: string;
120
+ /** 签发者 */
121
+ issuer?: string;
122
+ /** 受众 */
123
+ audience?: string;
124
+ /** 主题 */
125
+ subject?: string;
126
+ /** 生效时间 */
127
+ notBefore?: string | number;
128
+ /** JWT ID */
129
+ jwtId?: string;
130
+ }
131
+
132
+ /**
133
+ * Befly 应用上下文
134
+ * 包含所有插件提供的功能
135
+ */
136
+ export interface BeflyContext {
137
+ /** 数据库管理器 */
138
+ db: SqlHelper;
139
+ /** Redis 助手 */
140
+ redis: typeof RedisHelper;
141
+ /** 日志记录器 */
142
+ logger: typeof Logger;
143
+ /** 数据处理工具 */
144
+ tool: Tool;
145
+ /** 自定义插件 */
146
+ [key: string]: any;
147
+ }
148
+
149
+ /**
150
+ * 插件定义
151
+ */
152
+ export interface Plugin {
153
+ /** 插件名称 */
154
+ name?: string;
155
+ /** 依赖的插件列表 */
156
+ after?: string[];
157
+ /** 初始化函数 */
158
+ onInit?: (befly: BeflyContext) => Promise<any>;
159
+ }
160
+
161
+ /**
162
+ * 服务器配置
163
+ */
164
+ export interface ServerConfig {
165
+ /** 服务名称 */
166
+ name: string;
167
+ /** 端口号 */
168
+ port: number;
169
+ /** 主机 */
170
+ host?: string;
171
+ /** 静态文件目录 */
172
+ static?: string;
173
+ /** 自定义插件 */
174
+ plugins?: Plugin[];
175
+ }
176
+
177
+ /**
178
+ * SQL 查询操作符
179
+ */
180
+ export interface WhereOperator {
181
+ /** 大于 */
182
+ $gt?: number;
183
+ /** 大于等于 */
184
+ $gte?: number;
185
+ /** 小于 */
186
+ $lt?: number;
187
+ /** 小于等于 */
188
+ $lte?: number;
189
+ /** 不等于 */
190
+ $ne?: any;
191
+ /** 不等于($ne 的别名) */
192
+ $not?: any;
193
+ /** 在...之中 */
194
+ $in?: any[];
195
+ /** 不在...之中 */
196
+ $nin?: any[];
197
+ /** 不在...之中($nin 的别名) */
198
+ $notIn?: any[];
199
+ /** LIKE 模糊匹配 */
200
+ $like?: string;
201
+ /** NOT LIKE 模糊匹配 */
202
+ $notLike?: string;
203
+ /** BETWEEN...AND 范围查询 */
204
+ $between?: [any, any];
205
+ /** NOT BETWEEN...AND 范围查询 */
206
+ $notBetween?: [any, any];
207
+ /** IS NULL 空值检查 */
208
+ $null?: boolean;
209
+ /** IS NOT NULL 非空检查 */
210
+ $notNull?: boolean;
211
+ }
212
+
213
+ /**
214
+ * WHERE 条件
215
+ * 支持两种格式:
216
+ * 1. 嵌套格式:{ age: { $gt: 18 } }
217
+ * 2. 一级属性格式:{ 'age$gt': 18 }(推荐)
218
+ */
219
+ export type WhereConditions = {
220
+ /** 普通字段条件(支持一级属性格式:'field$operator') */
221
+ [field: string]:
222
+ | string
223
+ | number
224
+ | boolean
225
+ | null
226
+ | any[] // 支持 $in、$nin 的数组值
227
+ | WhereOperator // 支持嵌套格式
228
+ | WhereConditions[]; // 支持 $or、$and 的数组值
229
+
230
+ /** OR 逻辑操作符 */
231
+ $or?: WhereConditions[];
232
+
233
+ /** AND 逻辑操作符 */
234
+ $and?: WhereConditions[];
235
+ };
236
+
237
+ /**
238
+ * SQL 查询选项
239
+ */
240
+ export interface QueryOptions {
241
+ /** 表名 */
242
+ table: string;
243
+ /** 查询字段,默认 ['*'] */
244
+ fields?: string[];
245
+ /** WHERE 条件 */
246
+ where?: WhereConditions;
247
+ /** 排序,如 'id DESC' */
248
+ orderBy?: string;
249
+ /** 页码(从 1 开始) */
250
+ page?: number;
251
+ /** 每页数量 */
252
+ limit?: number;
253
+ /** 是否包含已删除数据 */
254
+ includeDeleted?: boolean;
255
+ /** 自定义 state 条件 */
256
+ customState?: WhereConditions;
257
+ }
258
+
259
+ /**
260
+ * 插入选项
261
+ */
262
+ export interface InsertOptions {
263
+ /** 表名 */
264
+ table: string;
265
+ /** 插入数据(ID、时间戳、state 会自动生成) */
266
+ data: Record<string, any>;
267
+ }
268
+
269
+ /**
270
+ * 更新选项
271
+ */
272
+ export interface UpdateOptions {
273
+ /** 表名 */
274
+ table: string;
275
+ /** 更新数据(updated_at 会自动更新) */
276
+ data: Record<string, any>;
277
+ /** WHERE 条件 */
278
+ where: WhereConditions;
279
+ /** 是否包含已删除数据,默认 false */
280
+ includeDeleted?: boolean;
281
+ }
282
+
283
+ /**
284
+ * 删除选项
285
+ */
286
+ export interface DeleteOptions {
287
+ /** 表名 */
288
+ table: string;
289
+ /** WHERE 条件 */
290
+ where: WhereConditions;
291
+ /** 是否物理删除,默认 false(软删除) */
292
+ hard?: boolean;
293
+ }
294
+
295
+ /**
296
+ * 列表查询结果
297
+ */
298
+ export interface ListResult<T = any> {
299
+ /** 数据列表 */
300
+ list: T[];
301
+ /** 总条数 */
302
+ total: number;
303
+ /** 当前页码 */
304
+ page: number;
305
+ /** 每页数量 */
306
+ limit: number;
307
+ /** 总页数 */
308
+ pages: number;
309
+ }
310
+
311
+ /**
312
+ * 事务回调函数
313
+ */
314
+ export type TransactionCallback<T = any> = (trans: SqlHelper) => Promise<T>;
315
+
316
+ /**
317
+ * SQL 查询对象
318
+ */
319
+ export interface SqlQuery {
320
+ /** SQL 语句 */
321
+ sql: string;
322
+ /** 参数列表 */
323
+ params: any[];
324
+ }
325
+
326
+ /**
327
+ * SQL 管理器接口
328
+ */
329
+ export interface SqlHelper {
330
+ /** 查询单条数据 */
331
+ getDetail<T = any>(options: QueryOptions): Promise<T | null>;
332
+ /** 查询列表(带分页) */
333
+ getList<T = any>(options: QueryOptions): Promise<ListResult<T>>;
334
+ /** 查询所有数据 */
335
+ getAll<T = any>(options: Omit<QueryOptions, 'page' | 'limit'>): Promise<T[]>;
336
+ /** 插入数据 */
337
+ insData(options: InsertOptions): Promise<number>;
338
+ /** 更新数据 */
339
+ updData(options: UpdateOptions): Promise<number>;
340
+ /** 删除数据 */
341
+ delData(options: DeleteOptions): Promise<number>;
342
+ /** 执行事务 */
343
+ trans<T = any>(callback: TransactionCallback<T>): Promise<T>;
344
+ /** 执行原始 SQL */
345
+ query(sql: string, params?: any[]): Promise<any>;
346
+ }
347
+
348
+ /**
349
+ * Redis 助手接口
350
+ */
351
+ export interface RedisHelper {
352
+ /** 设置对象到 Redis */
353
+ setObject<T = any>(key: string, obj: T, ttl?: number | null): Promise<string | null>;
354
+ /** 从 Redis 获取对象 */
355
+ getObject<T = any>(key: string): Promise<T | null>;
356
+ /** 从 Redis 删除对象 */
357
+ delObject(key: string): Promise<void>;
358
+ /** 生成基于时间的唯一 ID */
359
+ genTimeID(): Promise<number>;
360
+ /** 设置字符串值 */
361
+ setString(key: string, value: string, ttl?: number | null): Promise<string | null>;
362
+ /** 获取字符串值 */
363
+ getString(key: string): Promise<string | null>;
364
+ /** 检查键是否存在 */
365
+ exists(key: string): Promise<number>;
366
+ /** 设置过期时间 */
367
+ expire(key: string, seconds: number): Promise<number>;
368
+ /** 获取剩余过期时间 */
369
+ ttl(key: string): Promise<number>;
370
+ }
371
+
372
+ /**
373
+ * 日志记录器接口
374
+ */
375
+ export interface Logger {
376
+ /** 记录信息日志 */
377
+ info(message: string | object): void;
378
+ /** 记录警告日志 */
379
+ warn(message: string | object): void;
380
+ /** 记录错误日志 */
381
+ error(message: string | object): void;
382
+ /** 记录调试日志 */
383
+ debug(message: string | object): void;
384
+ }
385
+
386
+ /**
387
+ * 工具类接口
388
+ */
389
+ export interface Tool {
390
+ /** 处理更新数据 */
391
+ updData(data: Record<string, any>, now?: number): Promise<Record<string, any>>;
392
+ /** 处理插入数据 */
393
+ insData(data: Record<string, any> | Record<string, any>[], now?: number): Promise<Record<string, any> | Record<string, any>[]>;
394
+ /** 处理删除数据 */
395
+ delData(now?: number): Promise<Record<string, any>>;
396
+ /** 批量生成 ID */
397
+ genIds(count: number): Promise<number[]>;
398
+ /** 清理数据对象 */
399
+ cleanData(data: Record<string, any>, removeNull?: boolean, removeEmptyString?: boolean): Record<string, any>;
400
+ }
401
+
402
+ /**
403
+ * 验证结果
404
+ */
405
+ export interface ValidationResult {
406
+ /** 是否有效 */
407
+ valid: boolean;
408
+ /** 处理后的值 */
409
+ value: any;
410
+ /** 错误列表 */
411
+ errors: string[];
412
+ }
413
+
414
+ /**
415
+ * 数据库类型
416
+ */
417
+ export type DbType = 'mysql' | 'postgresql' | 'sqlite';
418
+
419
+ /**
420
+ * 列信息
421
+ */
422
+ export interface ColumnInfo {
423
+ /** 列名 */
424
+ name: string;
425
+ /** 数据类型 */
426
+ type: string;
427
+ /** 是否可空 */
428
+ nullable: boolean;
429
+ /** 默认值 */
430
+ default: any;
431
+ /** 注释 */
432
+ comment: string;
433
+ }
434
+
435
+ /**
436
+ * 索引信息
437
+ */
438
+ export interface IndexInfo {
439
+ /** 索引名 */
440
+ name: string;
441
+ /** 列名 */
442
+ column: string;
443
+ /** 是否唯一 */
444
+ unique: boolean;
445
+ }
446
+
447
+ /**
448
+ * 同步统计
449
+ */
450
+ export interface SyncStats {
451
+ /** 创建的表数 */
452
+ created: number;
453
+ /** 修改的表数 */
454
+ modified: number;
455
+ /** 创建的索引数 */
456
+ indexesCreated: number;
457
+ /** 删除的索引数 */
458
+ indexesDropped: number;
459
+ }
package/types/jwt.d.ts ADDED
@@ -0,0 +1,99 @@
1
+ /**
2
+ * JWT 相关类型定义
3
+ */
4
+
5
+ /**
6
+ * JWT 算法类型
7
+ */
8
+ export type JwtAlgorithm = 'HS256' | 'HS384' | 'HS512';
9
+
10
+ /**
11
+ * JWT Header 接口
12
+ */
13
+ export interface JwtHeader {
14
+ alg: JwtAlgorithm;
15
+ typ: 'JWT';
16
+ }
17
+
18
+ /**
19
+ * JWT 完整解码结果
20
+ */
21
+ export interface JwtDecoded {
22
+ header: JwtHeader;
23
+ payload: JwtPayload;
24
+ signature: string;
25
+ }
26
+
27
+ /**
28
+ * JWT 载荷
29
+ */
30
+ export interface JwtPayload {
31
+ /** 用户 ID */
32
+ userId?: string;
33
+ /** 用户名 */
34
+ username?: string;
35
+ /** 角色 */
36
+ role?: string;
37
+ /** 角色列表 */
38
+ roles?: string[];
39
+ /** 权限列表 */
40
+ permissions?: string[];
41
+ /** 签发时间 */
42
+ iat?: number;
43
+ /** 过期时间 */
44
+ exp?: number;
45
+ /** 主题 */
46
+ sub?: string;
47
+ /** 签发者 */
48
+ iss?: string;
49
+ /** 受众 */
50
+ aud?: string | string[];
51
+ /** JWT ID */
52
+ jti?: string;
53
+ /** 生效时间 */
54
+ nbf?: number;
55
+ /** 其他自定义字段 */
56
+ [key: string]: any;
57
+ }
58
+
59
+ /**
60
+ * JWT 签名选项
61
+ */
62
+ export interface JwtSignOptions {
63
+ /** 密钥 */
64
+ secret?: string;
65
+ /** 算法 */
66
+ algorithm?: JwtAlgorithm;
67
+ /** 过期时间 */
68
+ expiresIn?: string | number;
69
+ /** 签发者 */
70
+ issuer?: string;
71
+ /** 受众 */
72
+ audience?: string;
73
+ /** 主题 */
74
+ subject?: string;
75
+ /** 生效时间 */
76
+ notBefore?: string | number;
77
+ /** JWT ID */
78
+ jwtId?: string;
79
+ }
80
+
81
+ /**
82
+ * JWT 验证选项
83
+ */
84
+ export interface JwtVerifyOptions {
85
+ /** 密钥 */
86
+ secret?: string;
87
+ /** 算法列表 */
88
+ algorithms?: JwtAlgorithm[];
89
+ /** 签发者 */
90
+ issuer?: string;
91
+ /** 受众 */
92
+ audience?: string;
93
+ /** 主题 */
94
+ subject?: string;
95
+ /** 是否忽略过期 */
96
+ ignoreExpiration?: boolean;
97
+ /** 是否忽略生效时间 */
98
+ ignoreNotBefore?: boolean;
99
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 日志相关类型定义
3
+ */
4
+
5
+ /**
6
+ * 日志级别
7
+ */
8
+ export type LogLevel = 'info' | 'warn' | 'error' | 'debug' | 'trace';
9
+
10
+ /**
11
+ * 日志消息
12
+ */
13
+ export type LogMessage = string | Record<string, any>;
14
+
15
+ /**
16
+ * 日志选项
17
+ */
18
+ export interface LogOptions {
19
+ /** 日志级别 */
20
+ level?: LogLevel;
21
+ /** 是否输出到控制台 */
22
+ console?: boolean;
23
+ /** 是否写入文件 */
24
+ file?: boolean;
25
+ /** 日志文件路径 */
26
+ filePath?: string;
27
+ /** 敏感字段列表 */
28
+ sensitiveFields?: string[];
29
+ }
30
+
31
+ /**
32
+ * 日志记录器接口
33
+ */
34
+ export interface Logger {
35
+ /** 记录信息日志 */
36
+ info(message: LogMessage): void;
37
+ /** 记录警告日志 */
38
+ warn(message: LogMessage): void;
39
+ /** 记录错误日志 */
40
+ error(message: LogMessage): void;
41
+ /** 记录调试日志 */
42
+ debug(message: LogMessage): void;
43
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Befly 插件系统类型定义
3
+ */
4
+
5
+ import type { BeflyContext } from './befly.js';
6
+ import type { RequestContext } from './context.js';
7
+
8
+ /**
9
+ * 插件初始化函数类型
10
+ */
11
+ export type PluginInitFunction = (befly: BeflyContext) => Promise<any> | any;
12
+
13
+ /**
14
+ * 插件请求处理钩子函数类型
15
+ */
16
+ export type PluginGetHook = (befly: BeflyContext, ctx: RequestContext, req: Request) => Promise<void> | void;
17
+
18
+ /**
19
+ * 插件配置类型
20
+ */
21
+ export interface Plugin {
22
+ /** 插件名称 */
23
+ name: string;
24
+
25
+ /** 插件名称(运行时动态添加,与 name 相同) */
26
+ pluginName?: string;
27
+
28
+ /** 依赖的插件列表(在这些插件之后执行) */
29
+ after?: string[];
30
+
31
+ /** 插件初始化函数 */
32
+ onInit?: PluginInitFunction;
33
+
34
+ /** 请求处理钩子(在每个 API 请求时执行) */
35
+ onGet?: PluginGetHook;
36
+
37
+ /** 插件描述 */
38
+ description?: string;
39
+
40
+ /** 插件版本 */
41
+ version?: string;
42
+
43
+ /** 插件作者 */
44
+ author?: string;
45
+ }
46
+
47
+ /**
48
+ * 插件导出格式
49
+ */
50
+ export interface PluginExport {
51
+ default: Plugin;
52
+ }
53
+
54
+ /**
55
+ * 插件加载选项
56
+ */
57
+ export interface PluginLoadOptions {
58
+ /** 插件目录路径 */
59
+ pluginDir: string;
60
+
61
+ /** 是否跳过错误 */
62
+ skipErrors?: boolean;
63
+
64
+ /** 插件过滤函数 */
65
+ filter?: (filename: string) => boolean;
66
+ }
67
+
68
+ /**
69
+ * 插件执行上下文
70
+ */
71
+ export interface PluginContext {
72
+ /** 插件名称 */
73
+ name: string;
74
+
75
+ /** 执行开始时间 */
76
+ startTime: number;
77
+
78
+ /** 执行结束时间 */
79
+ endTime?: number;
80
+
81
+ /** 执行状态 */
82
+ status: 'pending' | 'running' | 'success' | 'error';
83
+
84
+ /** 错误信息 */
85
+ error?: Error;
86
+ }
87
+
88
+ /**
89
+ * 插件管理器接口
90
+ */
91
+ export interface PluginManager {
92
+ /** 已加载的插件列表 */
93
+ plugins: Plugin[];
94
+
95
+ /** 注册插件 */
96
+ register(plugin: Plugin): void;
97
+
98
+ /** 加载插件目录 */
99
+ loadPlugins(options: PluginLoadOptions): Promise<void>;
100
+
101
+ /** 执行所有插件 */
102
+ executeAll(befly: BeflyContext): Promise<void>;
103
+
104
+ /** 获取插件 */
105
+ getPlugin(name: string): Plugin | undefined;
106
+
107
+ /** 移除插件 */
108
+ removePlugin(name: string): boolean;
109
+ }