befly 2.3.3 → 3.0.1

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 (87) hide show
  1. package/checks/conflict.ts +329 -0
  2. package/checks/table.ts +252 -0
  3. package/config/env.ts +218 -0
  4. package/config/fields.ts +55 -0
  5. package/config/regexAliases.ts +51 -0
  6. package/config/reserved.ts +96 -0
  7. package/main.ts +47 -0
  8. package/package.json +26 -11
  9. package/plugins/db.ts +60 -0
  10. package/plugins/logger.ts +28 -0
  11. package/plugins/redis.ts +47 -0
  12. package/scripts/syncDb/apply.ts +171 -0
  13. package/scripts/syncDb/constants.ts +71 -0
  14. package/scripts/syncDb/ddl.ts +189 -0
  15. package/scripts/syncDb/helpers.ts +173 -0
  16. package/scripts/syncDb/index.ts +203 -0
  17. package/scripts/syncDb/schema.ts +199 -0
  18. package/scripts/syncDb/sqlite.ts +50 -0
  19. package/scripts/syncDb/state.ts +106 -0
  20. package/scripts/syncDb/table.ts +214 -0
  21. package/scripts/syncDb/tableCreate.ts +148 -0
  22. package/scripts/syncDb/tests/constants.test.ts +105 -0
  23. package/scripts/syncDb/tests/ddl.test.ts +134 -0
  24. package/scripts/syncDb/tests/helpers.test.ts +70 -0
  25. package/scripts/syncDb/types.ts +92 -0
  26. package/scripts/syncDb/version.ts +73 -0
  27. package/scripts/syncDb.ts +10 -0
  28. package/tsconfig.json +58 -0
  29. package/types/addon.d.ts +53 -0
  30. package/types/api.d.ts +249 -0
  31. package/types/befly.d.ts +230 -0
  32. package/types/common.d.ts +215 -0
  33. package/types/context.d.ts +7 -0
  34. package/types/crypto.d.ts +23 -0
  35. package/types/database.d.ts +273 -0
  36. package/types/index.d.ts +450 -0
  37. package/types/index.ts +438 -0
  38. package/types/jwt.d.ts +99 -0
  39. package/types/logger.d.ts +43 -0
  40. package/types/plugin.d.ts +109 -0
  41. package/types/redis.d.ts +46 -0
  42. package/types/tool.d.ts +67 -0
  43. package/types/validator.d.ts +43 -0
  44. package/types/validator.ts +43 -0
  45. package/utils/colors.ts +221 -0
  46. package/utils/crypto.ts +308 -0
  47. package/utils/database.ts +348 -0
  48. package/utils/dbHelper.ts +713 -0
  49. package/utils/helper.ts +812 -0
  50. package/utils/index.ts +33 -0
  51. package/utils/jwt.ts +493 -0
  52. package/utils/logger.ts +191 -0
  53. package/utils/redisHelper.ts +321 -0
  54. package/utils/requestContext.ts +167 -0
  55. package/utils/sqlBuilder.ts +611 -0
  56. package/utils/validate.ts +493 -0
  57. package/utils/{xml.js → xml.ts} +100 -74
  58. package/.npmrc +0 -3
  59. package/.prettierignore +0 -2
  60. package/.prettierrc +0 -11
  61. package/apis/health/info.js +0 -49
  62. package/apis/tool/tokenCheck.js +0 -29
  63. package/bin/befly.js +0 -109
  64. package/bunfig.toml +0 -3
  65. package/checks/table.js +0 -206
  66. package/config/env.js +0 -64
  67. package/main.js +0 -579
  68. package/plugins/db.js +0 -46
  69. package/plugins/logger.js +0 -14
  70. package/plugins/redis.js +0 -32
  71. package/plugins/tool.js +0 -8
  72. package/scripts/syncDb.js +0 -752
  73. package/scripts/syncDev.js +0 -96
  74. package/system.js +0 -118
  75. package/tables/common.json +0 -16
  76. package/tables/tool.json +0 -6
  77. package/utils/api.js +0 -27
  78. package/utils/colors.js +0 -83
  79. package/utils/crypto.js +0 -260
  80. package/utils/index.js +0 -334
  81. package/utils/jwt.js +0 -387
  82. package/utils/logger.js +0 -143
  83. package/utils/redisHelper.js +0 -74
  84. package/utils/sqlBuilder.js +0 -498
  85. package/utils/sqlManager.js +0 -471
  86. package/utils/tool.js +0 -31
  87. package/utils/validate.js +0 -226
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Redis 相关类型定义
3
+ */
4
+
5
+ import { RedisClient as BunRedisClient } from 'bun';
6
+
7
+ /**
8
+ * Redis 客户端类型
9
+ */
10
+ export type RedisClient = BunRedisClient;
11
+
12
+ /**
13
+ * Redis 键前缀
14
+ */
15
+ export type RedisKeyPrefix = string;
16
+
17
+ /**
18
+ * Redis TTL(秒)
19
+ */
20
+ export type RedisTTL = number | null;
21
+
22
+ /**
23
+ * Redis 助手接口
24
+ */
25
+ export interface RedisHelper {
26
+ /** 设置对象到 Redis */
27
+ setObject<T = any>(key: string, obj: T, ttl?: RedisTTL): Promise<string | null>;
28
+ /** 从 Redis 获取对象 */
29
+ getObject<T = any>(key: string): Promise<T | null>;
30
+ /** 从 Redis 删除对象 */
31
+ delObject(key: string): Promise<void>;
32
+ /** 生成基于时间的唯一 ID */
33
+ genTimeID(): Promise<number>;
34
+ /** 设置字符串值 */
35
+ setString(key: string, value: string, ttl?: RedisTTL): Promise<string | null>;
36
+ /** 获取字符串值 */
37
+ getString(key: string): Promise<string | null>;
38
+ /** 检查键是否存在 */
39
+ exists(key: string): Promise<number>;
40
+ /** 设置过期时间 */
41
+ expire(key: string, seconds: number): Promise<number>;
42
+ /** 获取剩余过期时间 */
43
+ ttl(key: string): Promise<number>;
44
+ /** 测试 Redis 连接 */
45
+ ping(): Promise<string>;
46
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * 工具函数相关类型定义
3
+ */
4
+
5
+ /**
6
+ * 日期格式化类型
7
+ */
8
+ export type DateFormat = 'YYYY-MM-DD' | 'YYYY-MM-DD HH:mm:ss' | 'HH:mm:ss' | 'YYYY/MM/DD' | 'MM-DD' | string;
9
+
10
+ /**
11
+ * 颜色代码
12
+ */
13
+ export type ColorCode = 'reset' | 'bright' | 'dim' | 'underscore' | 'blink' | 'reverse' | 'hidden' | 'black' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white';
14
+
15
+ /**
16
+ * 分页参数
17
+ */
18
+ export interface PaginationParams {
19
+ /** 页码(从 1 开始) */
20
+ page?: number;
21
+ /** 每页数量 */
22
+ limit?: number;
23
+ }
24
+
25
+ /**
26
+ * 分页结果
27
+ */
28
+ export interface PaginationResult<T = any> {
29
+ /** 数据列表 */
30
+ list: T[];
31
+ /** 总条数 */
32
+ total: number;
33
+ /** 当前页码 */
34
+ page: number;
35
+ /** 每页数量 */
36
+ limit: number;
37
+ /** 总页数 */
38
+ pages: number;
39
+ /** 是否有下一页 */
40
+ hasNext: boolean;
41
+ /** 是否有上一页 */
42
+ hasPrev: boolean;
43
+ }
44
+
45
+ /**
46
+ * 文件类型
47
+ */
48
+ export type FileType = 'image' | 'video' | 'audio' | 'document' | 'archive' | 'other';
49
+
50
+ /**
51
+ * MIME 类型
52
+ */
53
+ export type MimeType = string;
54
+
55
+ /**
56
+ * 文件上传选项
57
+ */
58
+ export interface FileUploadOptions {
59
+ /** 允许的文件类型 */
60
+ allowedTypes?: string[];
61
+ /** 最大文件大小(字节) */
62
+ maxSize?: number;
63
+ /** 保存目录 */
64
+ saveDir?: string;
65
+ /** 文件名生成函数 */
66
+ filename?: (originalName: string) => string;
67
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 验证器相关类型定义
3
+ */
4
+
5
+ /**
6
+ * 字段验证错误信息
7
+ */
8
+ export type ValidationError = string | null;
9
+
10
+ /**
11
+ * 字段类型
12
+ */
13
+ export type FieldType = 'string' | 'number' | 'text' | 'array';
14
+
15
+ /**
16
+ * 验证结果
17
+ */
18
+ export interface ValidationResult {
19
+ /** 验证状态码:0=成功,1=失败 */
20
+ code: 0 | 1;
21
+ /** 字段验证结果 */
22
+ fields: Record<string, any>;
23
+ }
24
+
25
+ /**
26
+ * 字段规则
27
+ */
28
+ export interface FieldRule {
29
+ /** 字段名 */
30
+ name: string;
31
+ /** 字段类型 */
32
+ type: FieldType;
33
+ /** 最小值/长度 */
34
+ min: number | null;
35
+ /** 最大值/长度 */
36
+ max: number | null;
37
+ /** 默认值 */
38
+ default: any;
39
+ /** 是否索引 */
40
+ index: 0 | 1;
41
+ /** 正则约束 */
42
+ regex: string | null;
43
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 验证器相关类型定义
3
+ */
4
+
5
+ /**
6
+ * 字段验证错误信息
7
+ */
8
+ export type ValidationError = string | null;
9
+
10
+ /**
11
+ * 字段类型
12
+ */
13
+ export type FieldType = 'string' | 'number' | 'text' | 'array';
14
+
15
+ /**
16
+ * 验证结果
17
+ */
18
+ export interface ValidationResult {
19
+ /** 验证状态码:0=成功,1=失败 */
20
+ code: 0 | 1;
21
+ /** 字段验证结果 */
22
+ fields: Record<string, any>;
23
+ }
24
+
25
+ /**
26
+ * 字段规则
27
+ */
28
+ export interface FieldRule {
29
+ /** 字段名 */
30
+ name: string;
31
+ /** 字段类型 */
32
+ type: FieldType;
33
+ /** 最小值/长度 */
34
+ min: number | null;
35
+ /** 最大值/长度 */
36
+ max: number | null;
37
+ /** 默认值 */
38
+ default: any;
39
+ /** 是否索引 */
40
+ index: 0 | 1;
41
+ /** 正则约束 */
42
+ regex: string | null;
43
+ }
@@ -0,0 +1,221 @@
1
+ /**
2
+ * 终端颜色工具 - TypeScript 版本
3
+ * 提供 ANSI 颜色和样式支持,自动检测终端颜色能力
4
+ */
5
+
6
+ /**
7
+ * 格式化函数类型
8
+ */
9
+ type Formatter = (input: string | number) => string;
10
+
11
+ /**
12
+ * 颜色工具接口
13
+ */
14
+ interface ColorsInterface {
15
+ /** 是否支持颜色 */
16
+ isColorSupported: boolean;
17
+
18
+ // 样式
19
+ /** 重置所有样式 */
20
+ reset: Formatter;
21
+ /** 加粗 */
22
+ bold: Formatter;
23
+ /** 变暗 */
24
+ dim: Formatter;
25
+ /** 斜体 */
26
+ italic: Formatter;
27
+ /** 下划线 */
28
+ underline: Formatter;
29
+ /** 反色 */
30
+ inverse: Formatter;
31
+ /** 隐藏 */
32
+ hidden: Formatter;
33
+ /** 删除线 */
34
+ strikethrough: Formatter;
35
+
36
+ // 前景色(标准)
37
+ black: Formatter;
38
+ red: Formatter;
39
+ green: Formatter;
40
+ yellow: Formatter;
41
+ blue: Formatter;
42
+ magenta: Formatter;
43
+ cyan: Formatter;
44
+ white: Formatter;
45
+ gray: Formatter;
46
+
47
+ // 前景色(高亮)
48
+ blackBright: Formatter;
49
+ redBright: Formatter;
50
+ greenBright: Formatter;
51
+ yellowBright: Formatter;
52
+ blueBright: Formatter;
53
+ magentaBright: Formatter;
54
+ cyanBright: Formatter;
55
+ whiteBright: Formatter;
56
+
57
+ // 背景色(标准)
58
+ bgBlack: Formatter;
59
+ bgRed: Formatter;
60
+ bgGreen: Formatter;
61
+ bgYellow: Formatter;
62
+ bgBlue: Formatter;
63
+ bgMagenta: Formatter;
64
+ bgCyan: Formatter;
65
+ bgWhite: Formatter;
66
+
67
+ // 背景色(高亮)
68
+ bgBlackBright: Formatter;
69
+ bgRedBright: Formatter;
70
+ bgGreenBright: Formatter;
71
+ bgYellowBright: Formatter;
72
+ bgBlueBright: Formatter;
73
+ bgMagentaBright: Formatter;
74
+ bgCyanBright: Formatter;
75
+ bgWhiteBright: Formatter;
76
+
77
+ // 语义化颜色(带图标)
78
+ info: Formatter;
79
+ success: Formatter;
80
+ warn: Formatter;
81
+ error: Formatter;
82
+ }
83
+
84
+ /**
85
+ * 检测是否支持颜色
86
+ */
87
+ const detectColorSupport = (): boolean => {
88
+ const env = process.env || {};
89
+ const argv = process.argv || [];
90
+
91
+ // 明确禁用颜色
92
+ if (env.NO_COLOR || argv.includes('--no-color')) {
93
+ return false;
94
+ }
95
+
96
+ // 明确启用颜色
97
+ if (env.FORCE_COLOR || argv.includes('--color')) {
98
+ return true;
99
+ }
100
+
101
+ // 根据平台和终端环境判断
102
+ return process.platform === 'win32' || (process.stdout?.isTTY && env.TERM !== 'dumb') || !!env.CI;
103
+ };
104
+
105
+ const isColorSupported = detectColorSupport();
106
+
107
+ /**
108
+ * 创建格式化函数
109
+ * @param open - 开始 ANSI 码
110
+ * @param close - 结束 ANSI 码
111
+ * @param replace - 替换的 ANSI 码(用于嵌套)
112
+ * @returns 格式化函数
113
+ */
114
+ const formatter =
115
+ (open: string, close: string, replace: string = open): Formatter =>
116
+ (input: string | number): string => {
117
+ const string = String(input);
118
+ const index = string.indexOf(close, open.length);
119
+ // 如果字符串中包含结束码,需要处理嵌套情况
120
+ return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;
121
+ };
122
+
123
+ /**
124
+ * 替换字符串中的结束码(处理嵌套颜色)
125
+ * @param string - 原始字符串
126
+ * @param close - 结束码
127
+ * @param replace - 替换码
128
+ * @param index - 起始索引
129
+ * @returns 处理后的字符串
130
+ */
131
+ const replaceClose = (string: string, close: string, replace: string, index: number): string => {
132
+ let result = '';
133
+ let cursor = 0;
134
+ do {
135
+ result += string.substring(cursor, index) + replace;
136
+ cursor = index + close.length;
137
+ index = string.indexOf(close, cursor);
138
+ } while (~index);
139
+ return result + string.substring(cursor);
140
+ };
141
+
142
+ /**
143
+ * 创建颜色工具实例
144
+ * @param enabled - 是否启用颜色
145
+ * @returns 颜色工具对象
146
+ */
147
+ const createColors = (enabled: boolean = isColorSupported): ColorsInterface => {
148
+ // 如果禁用颜色,返回直接转字符串的函数
149
+ const f = enabled ? formatter : (): Formatter => (input: string | number) => String(input);
150
+
151
+ return {
152
+ isColorSupported: enabled,
153
+
154
+ // 样式 - https://en.wikipedia.org/wiki/ANSI_escape_code#SGR
155
+ reset: f('\x1b[0m', '\x1b[0m'),
156
+ bold: f('\x1b[1m', '\x1b[22m', '\x1b[22m\x1b[1m'),
157
+ dim: f('\x1b[2m', '\x1b[22m', '\x1b[22m\x1b[2m'),
158
+ italic: f('\x1b[3m', '\x1b[23m'),
159
+ underline: f('\x1b[4m', '\x1b[24m'),
160
+ inverse: f('\x1b[7m', '\x1b[27m'),
161
+ hidden: f('\x1b[8m', '\x1b[28m'),
162
+ strikethrough: f('\x1b[9m', '\x1b[29m'),
163
+
164
+ // 前景色(标准) - 30-37
165
+ black: f('\x1b[30m', '\x1b[39m'),
166
+ red: f('\x1b[31m', '\x1b[39m'),
167
+ green: f('\x1b[32m', '\x1b[39m'),
168
+ yellow: f('\x1b[33m', '\x1b[39m'),
169
+ blue: f('\x1b[34m', '\x1b[39m'),
170
+ magenta: f('\x1b[35m', '\x1b[39m'),
171
+ cyan: f('\x1b[36m', '\x1b[39m'),
172
+ white: f('\x1b[37m', '\x1b[39m'),
173
+ gray: f('\x1b[90m', '\x1b[39m'), // 实际上是 blackBright
174
+
175
+ // 前景色(高亮) - 90-97
176
+ blackBright: f('\x1b[90m', '\x1b[39m'),
177
+ redBright: f('\x1b[91m', '\x1b[39m'),
178
+ greenBright: f('\x1b[92m', '\x1b[39m'),
179
+ yellowBright: f('\x1b[93m', '\x1b[39m'),
180
+ blueBright: f('\x1b[94m', '\x1b[39m'),
181
+ magentaBright: f('\x1b[95m', '\x1b[39m'),
182
+ cyanBright: f('\x1b[96m', '\x1b[39m'),
183
+ whiteBright: f('\x1b[97m', '\x1b[39m'),
184
+
185
+ // 背景色(标准) - 40-47
186
+ bgBlack: f('\x1b[40m', '\x1b[49m'),
187
+ bgRed: f('\x1b[41m', '\x1b[49m'),
188
+ bgGreen: f('\x1b[42m', '\x1b[49m'),
189
+ bgYellow: f('\x1b[43m', '\x1b[49m'),
190
+ bgBlue: f('\x1b[44m', '\x1b[49m'),
191
+ bgMagenta: f('\x1b[45m', '\x1b[49m'),
192
+ bgCyan: f('\x1b[46m', '\x1b[49m'),
193
+ bgWhite: f('\x1b[47m', '\x1b[49m'),
194
+
195
+ // 背景色(高亮) - 100-107
196
+ bgBlackBright: f('\x1b[100m', '\x1b[49m'),
197
+ bgRedBright: f('\x1b[101m', '\x1b[49m'),
198
+ bgGreenBright: f('\x1b[102m', '\x1b[49m'),
199
+ bgYellowBright: f('\x1b[103m', '\x1b[49m'),
200
+ bgBlueBright: f('\x1b[104m', '\x1b[49m'),
201
+ bgMagentaBright: f('\x1b[105m', '\x1b[49m'),
202
+ bgCyanBright: f('\x1b[106m', '\x1b[49m'),
203
+ bgWhiteBright: f('\x1b[107m', '\x1b[49m'),
204
+
205
+ // 语义化颜色(函数形式,带图标前缀)
206
+ info: (input: string | number) => f('\x1b[34m', '\x1b[39m')(`ℹ ${input}`),
207
+ success: (input: string | number) => f('\x1b[32m', '\x1b[39m')(`✓ ${input}`),
208
+ warn: (input: string | number) => f('\x1b[33m', '\x1b[39m')(`⚠ ${input}`),
209
+ error: (input: string | number) => f('\x1b[31m', '\x1b[39m')(`✖ ${input}`)
210
+ };
211
+ };
212
+
213
+ /**
214
+ * 默认颜色工具实例
215
+ */
216
+ export const Colors = createColors();
217
+
218
+ /**
219
+ * 导出类型
220
+ */
221
+ export type { ColorsInterface, Formatter };