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
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Befly 核心框架类型定义
3
+ */
4
+
5
+ import type { Plugin } from './plugin.js';
6
+ import type { ApiRoute, HttpMethod } from './api.js';
7
+ import type { KeyValue } from './common.js';
8
+ import type { Logger } from '../utils/logger.js';
9
+ import type { Jwt } from '../utils/jwt.js';
10
+ import type { Validator } from '../utils/validate.js';
11
+ import type { SqlHelper } from '../utils/sqlHelper.js';
12
+ import type { Crypto2 } from '../utils/crypto.js';
13
+ import type { Tool } from '../utils/tool.js';
14
+
15
+ /**
16
+ * Befly 应用选项
17
+ */
18
+ export interface BeflyOptions {
19
+ /** 应用名称 */
20
+ name?: string;
21
+
22
+ /** 监听主机 */
23
+ host?: string;
24
+
25
+ /** 监听端口 */
26
+ port?: number;
27
+
28
+ /** 是否启用 CORS */
29
+ cors?: boolean | CorsOptions;
30
+
31
+ /** 静态文件目录 */
32
+ staticDir?: string;
33
+
34
+ /** 上传文件目录 */
35
+ uploadDir?: string;
36
+
37
+ /** 最大请求体大小 */
38
+ maxBodySize?: number;
39
+
40
+ /** 自定义配置 */
41
+ [key: string]: any;
42
+ }
43
+
44
+ /**
45
+ * CORS 配置选项
46
+ */
47
+ export interface CorsOptions {
48
+ origin?: string | string[] | boolean;
49
+ methods?: string[];
50
+ allowedHeaders?: string[];
51
+ exposedHeaders?: string[];
52
+ credentials?: boolean;
53
+ maxAge?: number;
54
+ }
55
+
56
+ /**
57
+ * Befly 核心类
58
+ */
59
+ export interface Befly {
60
+ /** API 路由映射 */
61
+ apiRoutes: Map<string, ApiRoute>;
62
+
63
+ /** 插件列表 */
64
+ pluginLists: Plugin[];
65
+
66
+ /** 应用上下文 */
67
+ appContext: KeyValue;
68
+
69
+ /** 应用选项 */
70
+ appOptions: BeflyOptions;
71
+
72
+ /** 日志器 */
73
+ logger: Logger;
74
+
75
+ /** JWT 工具 */
76
+ jwt: Jwt;
77
+
78
+ /** 验证器 */
79
+ validator: Validator;
80
+
81
+ /** SQL 管理器 */
82
+ sql: SqlHelper;
83
+
84
+ /** 加密工具 */
85
+ crypto: Crypto2;
86
+
87
+ /** 通用工具 */
88
+ tool: Tool;
89
+
90
+ /** 数据库连接 */
91
+ db: any;
92
+
93
+ /** Redis 连接 */
94
+ redis: any;
95
+
96
+ /**
97
+ * 初始化检查器
98
+ */
99
+ initCheck(): Promise<void>;
100
+
101
+ /**
102
+ * 加载插件
103
+ */
104
+ loadPlugins(): Promise<void>;
105
+
106
+ /**
107
+ * 加载 API 路由
108
+ */
109
+ loadApis(): Promise<void>;
110
+
111
+ /**
112
+ * 启动服务器
113
+ */
114
+ start(): Promise<void>;
115
+
116
+ /**
117
+ * 停止服务器
118
+ */
119
+ stop(): Promise<void>;
120
+
121
+ /**
122
+ * 处理请求
123
+ */
124
+ handleRequest(request: Request): Promise<Response>;
125
+
126
+ /**
127
+ * 注册中间件
128
+ */
129
+ use(middleware: Function): void;
130
+
131
+ /**
132
+ * 获取配置
133
+ */
134
+ getConfig(key: string): any;
135
+
136
+ /**
137
+ * 设置配置
138
+ */
139
+ setConfig(key: string, value: any): void;
140
+ }
141
+
142
+ /**
143
+ * Befly 构造函数类型
144
+ */
145
+ export interface BeflyConstructor {
146
+ new (options?: BeflyOptions): Befly;
147
+ }
148
+
149
+ /**
150
+ * 服务器启动选项
151
+ */
152
+ export interface ServerOptions {
153
+ /** 主机名 */
154
+ hostname: string;
155
+
156
+ /** 端口 */
157
+ port: number;
158
+
159
+ /** 请求处理函数 */
160
+ fetch: (request: Request) => Promise<Response>;
161
+
162
+ /** 错误处理函数 */
163
+ error?: (error: Error) => Response;
164
+
165
+ /** 开发模式 */
166
+ development?: boolean;
167
+ }
168
+
169
+ /**
170
+ * 服务器实例
171
+ */
172
+ export interface Server {
173
+ /** 主机名 */
174
+ hostname: string;
175
+
176
+ /** 端口 */
177
+ port: number;
178
+
179
+ /** 停止服务器 */
180
+ stop(): Promise<void>;
181
+
182
+ /** 重启服务器 */
183
+ reload(options: ServerOptions): void;
184
+ }
185
+
186
+ /**
187
+ * 检查函数类型
188
+ */
189
+ export type CheckFunction = (befly: Befly) => Promise<void> | void;
190
+
191
+ /**
192
+ * 检查结果
193
+ */
194
+ export interface CheckResult {
195
+ /** 文件名 */
196
+ filename: string;
197
+
198
+ /** 检查名称 */
199
+ checkName: string;
200
+
201
+ /** 是否通过 */
202
+ passed: boolean;
203
+
204
+ /** 执行时间(纳秒) */
205
+ duration: number;
206
+
207
+ /** 错误信息 */
208
+ error?: Error;
209
+ }
210
+
211
+ /**
212
+ * 性能统计
213
+ */
214
+ export interface PerformanceStats {
215
+ /** 启动时间 */
216
+ startTime: number;
217
+
218
+ /** 检查时间 */
219
+ checkTime: number;
220
+
221
+ /** 插件加载时间 */
222
+ pluginTime: number;
223
+
224
+ /** API 加载时间 */
225
+ apiTime: number;
226
+
227
+ /** 总时间 */
228
+ totalTime: number;
229
+ }
230
+
231
+ /**
232
+ * 导出 Befly 实例创建函数
233
+ */
234
+ export function createBefly(options?: BeflyOptions): Befly;
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Befly 框架通用类型定义
3
+ */
4
+
5
+ /**
6
+ * 响应结果类型
7
+ */
8
+ export interface ResponseResult<T = any> {
9
+ code: number;
10
+ msg: string;
11
+ data?: T;
12
+ error?: any;
13
+ }
14
+
15
+ /**
16
+ * 验证结果类型
17
+ */
18
+ export interface ValidationResult {
19
+ code: 0 | 1;
20
+ fields: Record<string, any>;
21
+ }
22
+
23
+ /**
24
+ * 字段规则字符串
25
+ * 格式: "字段名|类型|最小值|最大值|默认值|是否索引|正则约束"
26
+ *
27
+ * @example
28
+ * "用户名|string|2|50|null|1|^[a-zA-Z0-9_]+$"
29
+ * "年龄|number|0|150|18|0|null"
30
+ */
31
+ export type FieldRule = string;
32
+
33
+ /**
34
+ * 表定义类型
35
+ */
36
+ export type TableDefinition = Record<string, FieldRule>;
37
+
38
+ /**
39
+ * 解析后的字段规则
40
+ */
41
+ export interface ParsedFieldRule {
42
+ name: string; // 字段名称
43
+ type: 'string' | 'number' | 'text' | 'array';
44
+ min: number | null; // 最小值
45
+ max: number | null; // 最大值
46
+ default: any; // 默认值
47
+ index: 0 | 1; // 是否索引
48
+ regex: string | null; // 正则约束
49
+ }
50
+
51
+ /**
52
+ * SQL 查询参数类型
53
+ */
54
+ export type SqlValue = string | number | boolean | null | Date;
55
+ export type SqlParams = SqlValue[];
56
+
57
+ /**
58
+ * 排序方向
59
+ */
60
+ export type OrderDirection = 'ASC' | 'DESC' | 'asc' | 'desc';
61
+
62
+ /**
63
+ * 比较运算符
64
+ */
65
+ export type ComparisonOperator = '=' | '>' | '<' | '>=' | '<=' | '!=' | '<>' | 'LIKE' | 'IN' | 'NOT IN' | 'IS NULL' | 'IS NOT NULL';
66
+
67
+ /**
68
+ * JOIN 类型
69
+ */
70
+ export type JoinType = 'INNER' | 'LEFT' | 'RIGHT' | 'FULL';
71
+
72
+ /**
73
+ * 数据库配置类型
74
+ */
75
+ export interface DatabaseConfig {
76
+ host: string;
77
+ port: number;
78
+ user: string;
79
+ password: string;
80
+ database: string;
81
+ connectionLimit?: number;
82
+ }
83
+
84
+ /**
85
+ * Redis 配置类型
86
+ */
87
+ export interface RedisConfig {
88
+ host: string;
89
+ port: number;
90
+ password?: string;
91
+ db?: number;
92
+ }
93
+
94
+ /**
95
+ * 日志级别
96
+ */
97
+ export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
98
+
99
+ /**
100
+ * 日志配置
101
+ */
102
+ export interface LoggerConfig {
103
+ level?: LogLevel;
104
+ transport?: {
105
+ target: string;
106
+ options?: Record<string, any>;
107
+ };
108
+ }
109
+
110
+ /**
111
+ * 环境变量类型
112
+ */
113
+ export interface EnvConfig {
114
+ // 服务配置
115
+ appName: string;
116
+ appHost: string;
117
+ appPort: number;
118
+
119
+ // 数据库配置
120
+ mysqlHost: string;
121
+ mysqlPort: number;
122
+ mysqlUsername: string;
123
+ mysqlPassword: string;
124
+ mysqlDatabase: string;
125
+
126
+ // Redis 配置
127
+ redisHost?: string;
128
+ redisPort?: number;
129
+ redisPassword?: string;
130
+
131
+ // JWT 配置
132
+ jwtSecret: string;
133
+ jwtExpires?: string;
134
+
135
+ // 其他配置
136
+ [key: string]: any;
137
+ }
138
+
139
+ /**
140
+ * 工具函数返回类型
141
+ */
142
+ export interface ToolResponse<T = any> {
143
+ success: boolean;
144
+ data?: T;
145
+ error?: string;
146
+ }
147
+
148
+ /**
149
+ * 分页参数
150
+ */
151
+ export interface PaginationParams {
152
+ page: number;
153
+ limit: number;
154
+ }
155
+
156
+ /**
157
+ * 分页结果
158
+ */
159
+ export interface PaginatedResult<T = any> {
160
+ total: number;
161
+ page: number;
162
+ limit: number;
163
+ data: T[];
164
+ }
165
+
166
+ /**
167
+ * 通用键值对
168
+ */
169
+ export type KeyValue<T = any> = Record<string, T>;
170
+
171
+ /**
172
+ * 可选字段
173
+ */
174
+ export type Optional<T> = T | null | undefined;
175
+
176
+ /**
177
+ * 深度可选
178
+ */
179
+ export type DeepPartial<T> = T extends object ? { [P in keyof T]?: DeepPartial<T[P]> } : T;
180
+
181
+ /**
182
+ * 保留字段(系统自动管理)
183
+ */
184
+ export type ReservedFields = 'id' | 'created_at' | 'updated_at' | 'deleted_at' | 'state';
185
+
186
+ /**
187
+ * 排除保留字段
188
+ */
189
+ export type ExcludeReserved<T> = Omit<T, ReservedFields>;
190
+
191
+ /**
192
+ * 数据库记录基础类型
193
+ */
194
+ export interface BaseRecord {
195
+ id: number;
196
+ created_at: Date;
197
+ updated_at: Date;
198
+ deleted_at: Date | null;
199
+ state: number;
200
+ }
201
+
202
+ /**
203
+ * 异步函数类型
204
+ */
205
+ export type AsyncFunction<T = any> = (...args: any[]) => Promise<T>;
206
+
207
+ /**
208
+ * 同步函数类型
209
+ */
210
+ export type SyncFunction<T = any> = (...args: any[]) => T;
211
+
212
+ /**
213
+ * 通用回调函数
214
+ */
215
+ export type Callback<T = any> = (error: Error | null, result?: T) => void;
@@ -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
+ }