befly 2.3.2 → 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.ts +284 -0
  6. package/config/env.ts +218 -0
  7. package/config/reserved.ts +96 -0
  8. package/main.ts +101 -0
  9. package/package.json +45 -16
  10. package/plugins/{db.js → db.ts} +25 -12
  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.ts +112 -0
  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/checks/table.js +0 -221
  76. package/config/env.js +0 -62
  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 -603
  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 -387
  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 -228
@@ -0,0 +1,167 @@
1
+ /**
2
+ * 请求上下文类
3
+ * 提供统一的请求数据访问接口和类型安全
4
+ */
5
+
6
+ /**
7
+ * 标准请求上下文类
8
+ */
9
+ export class RequestContext {
10
+ /** 原始请求对象 */
11
+ public readonly request: Request;
12
+
13
+ /** 请求开始时间(毫秒) */
14
+ public readonly startTime: number;
15
+
16
+ /** 请求体参数 (GET/POST 解析后的数据) */
17
+ public body: Record<string, any> = {};
18
+
19
+ /** 用户信息 (认证后填充) */
20
+ public user: Record<string, any> = {};
21
+
22
+ /** 自定义状态 (用于在中间件间传递数据) */
23
+ public state: Record<string, any> = {};
24
+
25
+ /** 响应数据 (由 handler 设置) */
26
+ public response?: any;
27
+
28
+ constructor(req: Request) {
29
+ this.request = req;
30
+ this.startTime = Date.now();
31
+ }
32
+
33
+ // ========== 便捷访问器 ==========
34
+
35
+ /**
36
+ * 获取请求方法
37
+ */
38
+ get method(): string {
39
+ return this.request.method;
40
+ }
41
+
42
+ /**
43
+ * 获取请求 URL
44
+ */
45
+ get url(): string {
46
+ return this.request.url;
47
+ }
48
+
49
+ /**
50
+ * 获取请求头对象
51
+ */
52
+ get headers(): Headers {
53
+ return this.request.headers;
54
+ }
55
+
56
+ /**
57
+ * 获取客户端 IP 地址
58
+ */
59
+ get ip(): string | null {
60
+ return this.request.headers.get('x-forwarded-for') || this.request.headers.get('x-real-ip') || this.request.headers.get('cf-connecting-ip') || null;
61
+ }
62
+
63
+ /**
64
+ * 获取 User-Agent
65
+ */
66
+ get userAgent(): string | null {
67
+ return this.request.headers.get('user-agent');
68
+ }
69
+
70
+ /**
71
+ * 获取 Content-Type
72
+ */
73
+ get contentType(): string | null {
74
+ return this.request.headers.get('content-type');
75
+ }
76
+
77
+ // ========== 工具方法 ==========
78
+
79
+ /**
80
+ * 获取请求头
81
+ * @param name - 请求头名称
82
+ */
83
+ header(name: string): string | null {
84
+ return this.request.headers.get(name);
85
+ }
86
+
87
+ /**
88
+ * 获取参数值
89
+ * @param key - 参数键名
90
+ */
91
+ get(key: string): any {
92
+ return this.body[key];
93
+ }
94
+
95
+ /**
96
+ * 设置参数值
97
+ * @param key - 参数键名
98
+ * @param value - 参数值
99
+ */
100
+ set(key: string, value: any): void {
101
+ this.body[key] = value;
102
+ }
103
+
104
+ /**
105
+ * 检查参数是否存在
106
+ * @param key - 参数键名
107
+ */
108
+ has(key: string): boolean {
109
+ return key in this.params;
110
+ }
111
+
112
+ /**
113
+ * 获取所有参数
114
+ */
115
+ all(): Record<string, any> {
116
+ return { ...this.params };
117
+ }
118
+
119
+ /**
120
+ * 计算请求耗时(毫秒)
121
+ */
122
+ getElapsedTime(): number {
123
+ return Date.now() - this.startTime;
124
+ }
125
+
126
+ /**
127
+ * 获取格式化的请求信息(用于日志)
128
+ */
129
+ getRequestInfo(): Record<string, any> {
130
+ return {
131
+ method: this.method,
132
+ url: this.url,
133
+ ip: this.ip,
134
+ userAgent: this.userAgent,
135
+ elapsedTime: this.getElapsedTime()
136
+ };
137
+ }
138
+
139
+ /**
140
+ * 设置响应数据
141
+ * @param data - 响应数据
142
+ */
143
+ setResponse(data: any): void {
144
+ this.response = data;
145
+ }
146
+
147
+ /**
148
+ * 判断用户是否已登录
149
+ */
150
+ isAuthenticated(): boolean {
151
+ return !!this.user.id;
152
+ }
153
+
154
+ /**
155
+ * 获取用户 ID
156
+ */
157
+ getUserId(): number | null {
158
+ return this.user.id || null;
159
+ }
160
+
161
+ /**
162
+ * 获取用户角色
163
+ */
164
+ getUserRole(): string | null {
165
+ return this.user.role || this.user.role_type || null;
166
+ }
167
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * 加密相关类型定义
3
+ */
4
+
5
+ /**
6
+ * 编码类型
7
+ */
8
+ export type EncodingType = 'hex' | 'base64' | 'base64url';
9
+
10
+ /**
11
+ * 哈希算法类型
12
+ */
13
+ export type HashAlgorithm = 'md5' | 'sha1' | 'sha256' | 'sha512' | 'sha384' | 'sha224';
14
+
15
+ /**
16
+ * 密码哈希选项
17
+ */
18
+ export interface PasswordHashOptions {
19
+ algorithm?: 'argon2' | 'bcrypt';
20
+ memoryCost?: number;
21
+ timeCost?: number;
22
+ [key: string]: any;
23
+ }
@@ -0,0 +1,278 @@
1
+ /**
2
+ * 数据库相关类型定义
3
+ */
4
+
5
+ import type { SqlValue, WhereConditions } from './common';
6
+
7
+ // 重新导出 WhereOperator 和 WhereConditions,供其他模块使用
8
+ export type { WhereOperator, WhereConditions } from './index';
9
+
10
+ /**
11
+ * 查询选项
12
+ */
13
+ export interface QueryOptions {
14
+ /** 表名 */
15
+ table: string;
16
+ /** 查询字段 */
17
+ fields?: string[];
18
+ /** WHERE 条件 */
19
+ where?: WhereConditions;
20
+ /** 排序 */
21
+ orderBy?: string;
22
+ /** 页码(从 1 开始) */
23
+ page?: number;
24
+ /** 每页数量 */
25
+ limit?: number;
26
+ /** 是否包含已删除数据 */
27
+ includeDeleted?: boolean;
28
+ /** 自定义 state 条件 */
29
+ customState?: WhereConditions;
30
+ }
31
+
32
+ /**
33
+ * 插入选项
34
+ */
35
+ export interface InsertOptions {
36
+ /** 表名 */
37
+ table: string;
38
+ /** 插入数据(ID、时间戳、state 会自动生成) */
39
+ data: Record<string, any>;
40
+ }
41
+
42
+ /**
43
+ * 更新选项
44
+ */
45
+ export interface UpdateOptions {
46
+ /** 表名 */
47
+ table: string;
48
+ /** 更新数据(updated_at 会自动更新) */
49
+ data: Record<string, any>;
50
+ /** WHERE 条件 */
51
+ where: WhereConditions;
52
+ /** 是否包含已删除数据 */
53
+ includeDeleted?: boolean;
54
+ }
55
+
56
+ /**
57
+ * 删除选项
58
+ */
59
+ export interface DeleteOptions {
60
+ /** 表名 */
61
+ table: string;
62
+ /** WHERE 条件 */
63
+ where: WhereConditions;
64
+ /** 是否物理删除(false=软删除,true=物理删除) */
65
+ hard?: boolean;
66
+ }
67
+
68
+ /**
69
+ * 列表查询结果
70
+ */
71
+ export interface ListResult<T = any> {
72
+ /** 数据列表 */
73
+ list: T[];
74
+ /** 总条数 */
75
+ total: number;
76
+ /** 当前页码 */
77
+ page: number;
78
+ /** 每页数量 */
79
+ limit: number;
80
+ /** 总页数 */
81
+ pages: number;
82
+ }
83
+
84
+ /**
85
+ * 事务回调函数
86
+ */
87
+ export type TransactionCallback<T = any> = (trans: SqlHelper) => Promise<T>;
88
+
89
+ /**
90
+ * SQL 查询结果
91
+ */
92
+ export interface SqlQuery {
93
+ sql: string;
94
+ params: SqlValue[];
95
+ }
96
+
97
+ /**
98
+ * 插入数据类型
99
+ */
100
+ export type InsertData = Record<string, SqlValue> | Record<string, SqlValue>[];
101
+
102
+ /**
103
+ * 更新数据类型
104
+ */
105
+ export type UpdateData = Record<string, SqlValue>;
106
+
107
+ /**
108
+ * 数据库类型
109
+ */
110
+ export type DbType = 'mysql' | 'postgresql' | 'sqlite';
111
+
112
+ /**
113
+ * 列信息
114
+ */
115
+ export interface ColumnInfo {
116
+ /** 列名 */
117
+ name: string;
118
+ /** 数据类型 */
119
+ type: string;
120
+ /** 是否可空 */
121
+ nullable: boolean;
122
+ /** 默认值 */
123
+ default: any;
124
+ /** 注释 */
125
+ comment: string;
126
+ /** 长度 */
127
+ length?: number;
128
+ }
129
+
130
+ /**
131
+ * 索引信息
132
+ */
133
+ export interface IndexInfo {
134
+ /** 索引名 */
135
+ name: string;
136
+ /** 列名 */
137
+ column: string;
138
+ /** 是否唯一 */
139
+ unique: boolean;
140
+ }
141
+
142
+ /**
143
+ * 同步统计
144
+ */
145
+ export interface SyncStats {
146
+ /** 创建的表数 */
147
+ created: number;
148
+ /** 修改的表数 */
149
+ modified: number;
150
+ /** 创建的索引数 */
151
+ indexesCreated: number;
152
+ /** 删除的索引数 */
153
+ indexesDropped: number;
154
+ }
155
+
156
+ /**
157
+ * SqlHelper 接口(前向声明)
158
+ */
159
+ export interface SqlHelper {
160
+ getDetail<T = any>(options: QueryOptions): Promise<T | null>;
161
+ getList<T = any>(options: QueryOptions): Promise<ListResult<T>>;
162
+ getAll<T = any>(options: Omit<QueryOptions, 'page' | 'limit'>): Promise<T[]>;
163
+ insData(options: InsertOptions): Promise<number>;
164
+ updData(options: UpdateOptions): Promise<number>;
165
+ delData(options: DeleteOptions): Promise<number>;
166
+ trans<T = any>(callback: TransactionCallback<T>): Promise<T>;
167
+ query(sql: string, params?: any[]): Promise<any>;
168
+ }
169
+
170
+ /**
171
+ * SQL 客户端选项
172
+ */
173
+ export interface SqlClientOptions {
174
+ /** 最大连接数 */
175
+ max?: number;
176
+ /** 是否使用 BigInt */
177
+ bigint?: boolean;
178
+ /** 其他自定义选项 */
179
+ [key: string]: any;
180
+ }
181
+
182
+ // ========== 数据库同步相关类型 ==========
183
+
184
+ /**
185
+ * 列信息接口(用于数据库同步)
186
+ */
187
+ export interface ColumnInfo {
188
+ /** 字段类型(如 string, number 等) */
189
+ type: string;
190
+ /** 数据库列类型(如 VARCHAR, INT 等) */
191
+ columnType: string;
192
+ /** 字段长度 */
193
+ length: number | null;
194
+ /** 是否可空 */
195
+ nullable: boolean;
196
+ /** 默认值 */
197
+ defaultValue: any;
198
+ /** 字段注释 */
199
+ comment: string | null;
200
+ }
201
+
202
+ /**
203
+ * 索引信息接口
204
+ */
205
+ export interface IndexInfo {
206
+ /** 索引名称到字段数组的映射 */
207
+ [indexName: string]: string[];
208
+ }
209
+
210
+ /**
211
+ * 字段变更类型
212
+ */
213
+ export interface FieldChange {
214
+ /** 变更类型 */
215
+ type: 'length' | 'comment' | 'datatype' | 'default';
216
+ /** 当前值 */
217
+ current: any;
218
+ /** 新值 */
219
+ new: any;
220
+ }
221
+
222
+ /**
223
+ * 索引操作接口
224
+ */
225
+ export interface IndexAction {
226
+ /** 操作类型:create(创建)或 drop(删除) */
227
+ action: 'create' | 'drop';
228
+ /** 索引名称 */
229
+ indexName: string;
230
+ /** 字段名称 */
231
+ fieldName: string;
232
+ }
233
+
234
+ /**
235
+ * 表同步计划接口
236
+ */
237
+ export interface TablePlan {
238
+ /** 是否有变更 */
239
+ changed: boolean;
240
+ /** 添加字段的 SQL 子句 */
241
+ addClauses: string[];
242
+ /** 修改字段的 SQL 子句 */
243
+ modifyClauses: string[];
244
+ /** 默认值变更的 SQL 子句 */
245
+ defaultClauses: string[];
246
+ /** 索引操作列表 */
247
+ indexActions: IndexAction[];
248
+ /** 注释变更的 SQL 子句(可选) */
249
+ commentActions?: string[];
250
+ }
251
+
252
+ /**
253
+ * 全局统计计数接口
254
+ */
255
+ export interface GlobalCount {
256
+ /** 已处理表数量 */
257
+ processedTables: number;
258
+ /** 创建表数量 */
259
+ createdTables: number;
260
+ /** 修改表数量 */
261
+ modifiedTables: number;
262
+ /** 新增字段数量 */
263
+ addFields: number;
264
+ /** 类型变更数量 */
265
+ typeChanges: number;
266
+ /** 最大值变更数量 */
267
+ maxChanges: number;
268
+ /** 最小值变更数量 */
269
+ minChanges: number;
270
+ /** 默认值变更数量 */
271
+ defaultChanges: number;
272
+ /** 名称变更数量 */
273
+ nameChanges: number;
274
+ /** 索引创建数量 */
275
+ indexCreate: number;
276
+ /** 索引删除数量 */
277
+ indexDrop: number;
278
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Befly 类型定义入口文件
3
+ * 统一导出所有类型定义
4
+ */
5
+
6
+ // 通用类型
7
+ export * from './common.js';
8
+
9
+ // 插件系统
10
+ export * from './plugin.js';
11
+
12
+ // API 系统
13
+ export * from './api.js';
14
+
15
+ // Befly 核心
16
+ export * from './befly.js';