befly 3.9.38 → 3.9.40

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 (155) hide show
  1. package/README.md +37 -38
  2. package/befly.config.ts +62 -40
  3. package/checks/checkApi.ts +16 -16
  4. package/checks/checkApp.ts +19 -25
  5. package/checks/checkTable.ts +42 -42
  6. package/docs/README.md +42 -35
  7. package/docs/{api.md → api/api.md} +223 -231
  8. package/docs/cipher.md +71 -69
  9. package/docs/database.md +143 -141
  10. package/docs/{examples.md → guide/examples.md} +181 -181
  11. package/docs/guide/quickstart.md +331 -0
  12. package/docs/hooks/auth.md +38 -0
  13. package/docs/hooks/cors.md +28 -0
  14. package/docs/{hook.md → hooks/hook.md} +140 -57
  15. package/docs/hooks/parser.md +19 -0
  16. package/docs/hooks/rateLimit.md +47 -0
  17. package/docs/{redis.md → infra/redis.md} +84 -93
  18. package/docs/plugins/cipher.md +61 -0
  19. package/docs/plugins/database.md +128 -0
  20. package/docs/{plugin.md → plugins/plugin.md} +83 -81
  21. package/docs/quickstart.md +26 -26
  22. package/docs/{addon.md → reference/addon.md} +46 -46
  23. package/docs/{config.md → reference/config.md} +32 -80
  24. package/docs/{logger.md → reference/logger.md} +52 -52
  25. package/docs/{sync.md → reference/sync.md} +32 -35
  26. package/docs/{table.md → reference/table.md} +1 -1
  27. package/docs/{validator.md → reference/validator.md} +57 -57
  28. package/hooks/auth.ts +8 -4
  29. package/hooks/cors.ts +13 -13
  30. package/hooks/parser.ts +37 -17
  31. package/hooks/permission.ts +26 -14
  32. package/hooks/rateLimit.ts +276 -0
  33. package/hooks/validator.ts +8 -8
  34. package/lib/asyncContext.ts +43 -0
  35. package/lib/cacheHelper.ts +212 -77
  36. package/lib/cacheKeys.ts +38 -0
  37. package/lib/cipher.ts +30 -30
  38. package/lib/connect.ts +28 -28
  39. package/lib/dbHelper.ts +183 -102
  40. package/lib/jwt.ts +16 -16
  41. package/lib/logger.ts +610 -19
  42. package/lib/redisHelper.ts +185 -44
  43. package/lib/sqlBuilder.ts +90 -91
  44. package/lib/validator.ts +59 -39
  45. package/loader/loadApis.ts +48 -44
  46. package/loader/loadHooks.ts +40 -14
  47. package/loader/loadPlugins.ts +16 -17
  48. package/main.ts +57 -47
  49. package/package.json +47 -45
  50. package/paths.ts +15 -14
  51. package/plugins/cache.ts +5 -4
  52. package/plugins/cipher.ts +3 -3
  53. package/plugins/config.ts +2 -2
  54. package/plugins/db.ts +9 -9
  55. package/plugins/jwt.ts +3 -3
  56. package/plugins/logger.ts +8 -12
  57. package/plugins/redis.ts +8 -8
  58. package/plugins/tool.ts +6 -6
  59. package/router/api.ts +85 -56
  60. package/router/static.ts +12 -12
  61. package/sync/syncAll.ts +12 -12
  62. package/sync/syncApi.ts +55 -52
  63. package/sync/syncDb/apply.ts +20 -19
  64. package/sync/syncDb/constants.ts +25 -23
  65. package/sync/syncDb/ddl.ts +35 -36
  66. package/sync/syncDb/helpers.ts +6 -9
  67. package/sync/syncDb/schema.ts +10 -9
  68. package/sync/syncDb/sqlite.ts +7 -8
  69. package/sync/syncDb/table.ts +37 -35
  70. package/sync/syncDb/tableCreate.ts +21 -20
  71. package/sync/syncDb/types.ts +23 -20
  72. package/sync/syncDb/version.ts +10 -10
  73. package/sync/syncDb.ts +43 -36
  74. package/sync/syncDev.ts +74 -65
  75. package/sync/syncMenu.ts +190 -55
  76. package/tests/api-integration-array-number.test.ts +282 -0
  77. package/tests/befly-config-env.test.ts +78 -0
  78. package/tests/cacheHelper.test.ts +135 -104
  79. package/tests/cacheKeys.test.ts +41 -0
  80. package/tests/cipher.test.ts +90 -89
  81. package/tests/dbHelper-advanced.test.ts +140 -134
  82. package/tests/dbHelper-all-array-types.test.ts +316 -0
  83. package/tests/dbHelper-array-serialization.test.ts +258 -0
  84. package/tests/dbHelper-columns.test.ts +56 -55
  85. package/tests/dbHelper-execute.test.ts +45 -44
  86. package/tests/dbHelper-joins.test.ts +124 -119
  87. package/tests/fields-redis-cache.test.ts +29 -27
  88. package/tests/fields-validate.test.ts +38 -38
  89. package/tests/getClientIp.test.ts +54 -0
  90. package/tests/integration.test.ts +69 -67
  91. package/tests/jwt.test.ts +27 -26
  92. package/tests/logger.test.ts +267 -34
  93. package/tests/rateLimit-hook.test.ts +477 -0
  94. package/tests/redisHelper.test.ts +187 -188
  95. package/tests/redisKeys.test.ts +6 -73
  96. package/tests/scanConfig.test.ts +144 -0
  97. package/tests/sqlBuilder-advanced.test.ts +217 -215
  98. package/tests/sqlBuilder.test.ts +92 -91
  99. package/tests/sync-connection.test.ts +29 -29
  100. package/tests/syncDb-apply.test.ts +97 -96
  101. package/tests/syncDb-array-number.test.ts +160 -0
  102. package/tests/syncDb-constants.test.ts +48 -47
  103. package/tests/syncDb-ddl.test.ts +99 -98
  104. package/tests/syncDb-helpers.test.ts +29 -28
  105. package/tests/syncDb-schema.test.ts +61 -60
  106. package/tests/syncDb-types.test.ts +60 -59
  107. package/tests/syncMenu-paths.test.ts +68 -0
  108. package/tests/util.test.ts +42 -41
  109. package/tests/validator-array-number.test.ts +310 -0
  110. package/tests/validator-default.test.ts +373 -0
  111. package/tests/validator.test.ts +271 -266
  112. package/tsconfig.json +4 -5
  113. package/types/api.d.ts +7 -12
  114. package/types/befly.d.ts +60 -13
  115. package/types/cache.d.ts +8 -4
  116. package/types/common.d.ts +17 -9
  117. package/types/context.d.ts +2 -2
  118. package/types/crypto.d.ts +23 -0
  119. package/types/database.d.ts +19 -19
  120. package/types/hook.d.ts +2 -2
  121. package/types/jwt.d.ts +118 -0
  122. package/types/logger.d.ts +30 -0
  123. package/types/plugin.d.ts +4 -4
  124. package/types/redis.d.ts +7 -3
  125. package/types/roleApisCache.ts +23 -0
  126. package/types/sync.d.ts +10 -10
  127. package/types/table.d.ts +50 -9
  128. package/types/validate.d.ts +69 -0
  129. package/utils/addonHelper.ts +90 -0
  130. package/utils/arrayKeysToCamel.ts +18 -0
  131. package/utils/calcPerfTime.ts +13 -0
  132. package/utils/configTypes.ts +3 -0
  133. package/utils/cors.ts +19 -0
  134. package/utils/fieldClear.ts +75 -0
  135. package/utils/genShortId.ts +12 -0
  136. package/utils/getClientIp.ts +45 -0
  137. package/utils/keysToCamel.ts +22 -0
  138. package/utils/keysToSnake.ts +22 -0
  139. package/utils/modules.ts +98 -0
  140. package/utils/pickFields.ts +19 -0
  141. package/utils/process.ts +56 -0
  142. package/utils/regex.ts +225 -0
  143. package/utils/response.ts +115 -0
  144. package/utils/route.ts +23 -0
  145. package/utils/scanConfig.ts +142 -0
  146. package/utils/scanFiles.ts +48 -0
  147. package/.prettierignore +0 -2
  148. package/.prettierrc +0 -12
  149. package/docs/1-/345/237/272/346/234/254/344/273/213/347/273/215.md +0 -35
  150. package/docs/2-/345/210/235/346/255/245/344/275/223/351/252/214.md +0 -64
  151. package/docs/3-/347/254/254/344/270/200/344/270/252/346/216/245/345/217/243.md +0 -46
  152. package/docs/4-/346/223/215/344/275/234/346/225/260/346/215/256/345/272/223.md +0 -172
  153. package/hooks/requestLogger.ts +0 -84
  154. package/types/index.ts +0 -24
  155. package/util.ts +0 -283
package/lib/connect.ts CHANGED
@@ -1,13 +1,13 @@
1
- /**
1
+ /**
2
2
  * 数据库连接管理器
3
3
  * 统一管理 SQL 和 Redis 连接
4
4
  * 配置从 beflyConfig 全局对象获取
5
5
  */
6
6
 
7
- import { SQL, RedisClient } from 'bun';
7
+ import { SQL, RedisClient } from "bun";
8
8
 
9
- import { beflyConfig } from '../befly.config.js';
10
- import { Logger } from './logger.js';
9
+ import { beflyConfig } from "../befly.config.js";
10
+ import { Logger } from "./logger.js";
11
11
 
12
12
  /**
13
13
  * 数据库连接管理器
@@ -36,26 +36,26 @@ export class Connect {
36
36
  const config = beflyConfig.db || {};
37
37
 
38
38
  // 构建数据库连接字符串
39
- const type = config.type || 'mysql';
40
- const host = config.host || '127.0.0.1';
39
+ const type = config.type || "mysql";
40
+ const host = config.host || "127.0.0.1";
41
41
  const port = config.port || 3306;
42
- const user = encodeURIComponent(config.username || 'root');
43
- const password = encodeURIComponent(config.password || 'root');
44
- const database = encodeURIComponent(config.database || 'befly_demo');
42
+ const user = encodeURIComponent(config.username || "root");
43
+ const password = encodeURIComponent(config.password || "root");
44
+ const database = encodeURIComponent(config.database || "befly_demo");
45
45
 
46
46
  let finalUrl: string;
47
- if (type === 'sqlite') {
47
+ if (type === "sqlite") {
48
48
  finalUrl = database;
49
49
  } else {
50
50
  if (!host || !database) {
51
- throw new Error('数据库配置不完整,请检查配置参数');
51
+ throw new Error("数据库配置不完整,请检查配置参数");
52
52
  }
53
53
  finalUrl = `${type}://${user}:${password}@${host}:${port}/${database}`;
54
54
  }
55
55
 
56
56
  let sql: SQL;
57
57
 
58
- if (type === 'sqlite') {
58
+ if (type === "sqlite") {
59
59
  sql = new SQL(finalUrl);
60
60
  } else {
61
61
  sql = new SQL({
@@ -69,11 +69,11 @@ export class Connect {
69
69
  const timeout = 30000;
70
70
 
71
71
  const healthCheckPromise = (async () => {
72
- let version = '';
73
- if (type === 'sqlite') {
72
+ let version = "";
73
+ if (type === "sqlite") {
74
74
  const v = await sql`SELECT sqlite_version() AS version`;
75
75
  version = v?.[0]?.version;
76
- } else if (type === 'postgresql' || type === 'postgres') {
76
+ } else if (type === "postgresql" || type === "postgres") {
77
77
  const v = await sql`SELECT version() AS version`;
78
78
  version = v?.[0]?.version;
79
79
  } else {
@@ -89,17 +89,17 @@ export class Connect {
89
89
  }, timeout);
90
90
  });
91
91
 
92
- const version = await Promise.race([healthCheckPromise, timeoutPromise]);
92
+ await Promise.race([healthCheckPromise, timeoutPromise]);
93
93
 
94
94
  this.sqlClient = sql;
95
95
  this.sqlConnectedAt = Date.now();
96
96
  this.sqlPoolMax = config.poolMax ?? 1;
97
97
  return sql;
98
98
  } catch (error: any) {
99
- Logger.error({ err: error }, '[Connect] SQL 连接失败');
99
+ Logger.error({ err: error }, "[Connect] SQL 连接失败");
100
100
  try {
101
101
  await sql?.close();
102
- } catch (cleanupError) {}
102
+ } catch {}
103
103
 
104
104
  throw error;
105
105
  }
@@ -113,7 +113,7 @@ export class Connect {
113
113
  try {
114
114
  await this.sqlClient.close();
115
115
  } catch (error: any) {
116
- Logger.error({ err: error }, '[Connect] 关闭 SQL 连接时出错');
116
+ Logger.error({ err: error }, "[Connect] 关闭 SQL 连接时出错");
117
117
  }
118
118
  this.sqlClient = null;
119
119
  this.sqlConnectedAt = null;
@@ -126,7 +126,7 @@ export class Connect {
126
126
  */
127
127
  static getSql(): SQL {
128
128
  if (!this.sqlClient) {
129
- throw new Error('SQL 客户端未连接,请先调用 Connect.connectSql()');
129
+ throw new Error("SQL 客户端未连接,请先调用 Connect.connectSql()");
130
130
  }
131
131
  return this.sqlClient;
132
132
  }
@@ -145,13 +145,13 @@ export class Connect {
145
145
 
146
146
  try {
147
147
  // 构建 Redis URL
148
- const host = config.host || '127.0.0.1';
148
+ const host = config.host || "127.0.0.1";
149
149
  const port = config.port || 6379;
150
- const username = config.username || '';
151
- const password = config.password || '';
150
+ const username = config.username || "";
151
+ const password = config.password || "";
152
152
  const db = config.db || 0;
153
153
 
154
- let auth = '';
154
+ let auth = "";
155
155
  if (username && password) {
156
156
  auth = `${username}:${password}@`;
157
157
  } else if (password) {
@@ -175,7 +175,7 @@ export class Connect {
175
175
  this.redisConnectedAt = Date.now();
176
176
  return redis;
177
177
  } catch (error: any) {
178
- Logger.error({ err: error }, '[Connect] Redis 连接失败');
178
+ Logger.error({ err: error }, "[Connect] Redis 连接失败");
179
179
  throw new Error(`Redis 连接失败: ${error.message}`);
180
180
  }
181
181
  }
@@ -189,7 +189,7 @@ export class Connect {
189
189
  this.redisClient.close();
190
190
  this.redisConnectedAt = null;
191
191
  } catch (error: any) {
192
- Logger.error({ err: error }, '[Connect] 关闭 Redis 连接时出错');
192
+ Logger.error({ err: error }, "[Connect] 关闭 Redis 连接时出错");
193
193
  }
194
194
  this.redisClient = null;
195
195
  }
@@ -201,7 +201,7 @@ export class Connect {
201
201
  */
202
202
  static getRedis(): RedisClient {
203
203
  if (!this.redisClient) {
204
- throw new Error('Redis 客户端未连接,请先调用 Connect.connectRedis()');
204
+ throw new Error("Redis 客户端未连接,请先调用 Connect.connectRedis()");
205
205
  }
206
206
  return this.redisClient;
207
207
  }
@@ -222,7 +222,7 @@ export class Connect {
222
222
  // 连接 Redis
223
223
  await this.connectRedis();
224
224
  } catch (error: any) {
225
- Logger.error({ err: error }, '数据库初始化失败');
225
+ Logger.error({ err: error }, "数据库初始化失败");
226
226
  await this.disconnect();
227
227
  throw error;
228
228
  }