befly 3.10.18 → 3.11.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 (223) hide show
  1. package/README.md +83 -307
  2. package/dist/befly.config.d.ts +7 -0
  3. package/{befly.config.ts → dist/befly.config.js} +11 -36
  4. package/dist/befly.js +15621 -0
  5. package/dist/befly.min.js +21 -0
  6. package/dist/checks/checkApi.d.ts +1 -0
  7. package/{checks/checkApi.ts → dist/checks/checkApi.js} +12 -30
  8. package/dist/checks/checkHook.d.ts +1 -0
  9. package/dist/checks/checkHook.js +86 -0
  10. package/dist/checks/checkMenu.d.ts +7 -0
  11. package/{checks/checkMenu.ts → dist/checks/checkMenu.js} +18 -53
  12. package/dist/checks/checkPlugin.d.ts +1 -0
  13. package/dist/checks/checkPlugin.js +86 -0
  14. package/dist/checks/checkTable.d.ts +6 -0
  15. package/{checks/checkTable.ts → dist/checks/checkTable.js} +17 -41
  16. package/dist/configs/presetFields.d.ts +4 -0
  17. package/{configs/presetFields.ts → dist/configs/presetFields.js} +1 -1
  18. package/dist/configs/presetRegexp.d.ts +145 -0
  19. package/{utils/regex.ts → dist/configs/presetRegexp.js} +8 -31
  20. package/dist/hooks/auth.d.ts +7 -0
  21. package/{hooks/auth.ts → dist/hooks/auth.js} +8 -10
  22. package/dist/hooks/cors.d.ts +11 -0
  23. package/{hooks/cors.ts → dist/hooks/cors.js} +5 -13
  24. package/dist/hooks/parser.d.ts +14 -0
  25. package/{hooks/parser.ts → dist/hooks/parser.js} +31 -45
  26. package/dist/hooks/permission.d.ts +14 -0
  27. package/{hooks/permission.ts → dist/hooks/permission.js} +16 -25
  28. package/dist/hooks/validator.d.ts +11 -0
  29. package/{hooks/validator.ts → dist/hooks/validator.js} +9 -14
  30. package/dist/index.d.ts +26 -0
  31. package/{main.ts → dist/index.js} +61 -100
  32. package/dist/lib/asyncContext.d.ts +21 -0
  33. package/dist/lib/asyncContext.js +27 -0
  34. package/dist/lib/cacheHelper.d.ts +95 -0
  35. package/{lib/cacheHelper.ts → dist/lib/cacheHelper.js} +45 -105
  36. package/dist/lib/cacheKeys.d.ts +23 -0
  37. package/{lib/cacheKeys.ts → dist/lib/cacheKeys.js} +5 -10
  38. package/dist/lib/cipher.d.ts +153 -0
  39. package/{lib/cipher.ts → dist/lib/cipher.js} +23 -44
  40. package/dist/lib/connect.d.ts +91 -0
  41. package/{lib/connect.ts → dist/lib/connect.js} +47 -88
  42. package/dist/lib/dbDialect.d.ts +87 -0
  43. package/{lib/dbDialect.ts → dist/lib/dbDialect.js} +32 -112
  44. package/dist/lib/dbHelper.d.ts +204 -0
  45. package/{lib/dbHelper.ts → dist/lib/dbHelper.js} +82 -241
  46. package/dist/lib/dbUtils.d.ts +68 -0
  47. package/{lib/dbUtils.ts → dist/lib/dbUtils.js} +51 -126
  48. package/dist/lib/jwt.d.ts +13 -0
  49. package/{lib/jwt.ts → dist/lib/jwt.js} +11 -32
  50. package/dist/lib/logger.d.ts +42 -0
  51. package/dist/lib/logger.js +1144 -0
  52. package/dist/lib/redisHelper.d.ts +185 -0
  53. package/{lib/redisHelper.ts → dist/lib/redisHelper.js} +97 -141
  54. package/dist/lib/sqlBuilder.d.ts +160 -0
  55. package/{lib/sqlBuilder.ts → dist/lib/sqlBuilder.js} +132 -278
  56. package/dist/lib/sqlCheck.d.ts +23 -0
  57. package/{lib/sqlCheck.ts → dist/lib/sqlCheck.js} +24 -41
  58. package/dist/lib/validator.d.ts +45 -0
  59. package/{lib/validator.ts → dist/lib/validator.js} +44 -61
  60. package/dist/loader/loadApis.d.ts +12 -0
  61. package/{loader/loadApis.ts → dist/loader/loadApis.js} +10 -20
  62. package/dist/loader/loadHooks.d.ts +7 -0
  63. package/dist/loader/loadHooks.js +35 -0
  64. package/dist/loader/loadPlugins.d.ts +8 -0
  65. package/{loader/loadPlugins.ts → dist/loader/loadPlugins.js} +14 -26
  66. package/dist/paths.d.ts +93 -0
  67. package/{paths.ts → dist/paths.js} +6 -19
  68. package/dist/plugins/cache.d.ts +16 -0
  69. package/{plugins/cache.ts → dist/plugins/cache.js} +7 -12
  70. package/dist/plugins/cipher.d.ts +12 -0
  71. package/{plugins/cipher.ts → dist/plugins/cipher.js} +4 -6
  72. package/dist/plugins/config.d.ts +12 -0
  73. package/dist/plugins/config.js +8 -0
  74. package/dist/plugins/db.d.ts +16 -0
  75. package/{plugins/db.ts → dist/plugins/db.js} +11 -17
  76. package/dist/plugins/jwt.d.ts +12 -0
  77. package/dist/plugins/jwt.js +12 -0
  78. package/dist/plugins/logger.d.ts +32 -0
  79. package/{plugins/logger.ts → dist/plugins/logger.js} +5 -8
  80. package/dist/plugins/redis.d.ts +16 -0
  81. package/{plugins/redis.ts → dist/plugins/redis.js} +9 -12
  82. package/dist/plugins/tool.d.ts +81 -0
  83. package/{plugins/tool.ts → dist/plugins/tool.js} +9 -30
  84. package/dist/router/api.d.ts +14 -0
  85. package/dist/router/api.js +107 -0
  86. package/dist/router/static.d.ts +9 -0
  87. package/{router/static.ts → dist/router/static.js} +20 -34
  88. package/dist/scripts/ensureDist.d.ts +1 -0
  89. package/dist/scripts/ensureDist.js +296 -0
  90. package/dist/sync/syncApi.d.ts +3 -0
  91. package/{sync/syncApi.ts → dist/sync/syncApi.js} +35 -55
  92. package/dist/sync/syncCache.d.ts +2 -0
  93. package/{sync/syncCache.ts → dist/sync/syncCache.js} +1 -6
  94. package/dist/sync/syncDev.d.ts +6 -0
  95. package/{sync/syncDev.ts → dist/sync/syncDev.js} +29 -62
  96. package/dist/sync/syncMenu.d.ts +14 -0
  97. package/{sync/syncMenu.ts → dist/sync/syncMenu.js} +65 -125
  98. package/dist/sync/syncTable.d.ts +151 -0
  99. package/{sync/syncTable.ts → dist/sync/syncTable.js} +172 -379
  100. package/{types → dist/types}/api.d.ts +12 -51
  101. package/dist/types/api.js +4 -0
  102. package/{types → dist/types}/befly.d.ts +32 -227
  103. package/dist/types/befly.js +4 -0
  104. package/{types → dist/types}/cache.d.ts +7 -15
  105. package/dist/types/cache.js +4 -0
  106. package/dist/types/cipher.d.ts +27 -0
  107. package/dist/types/cipher.js +7 -0
  108. package/{types → dist/types}/common.d.ts +8 -33
  109. package/dist/types/common.js +5 -0
  110. package/{types → dist/types}/context.d.ts +3 -5
  111. package/dist/types/context.js +4 -0
  112. package/{types → dist/types}/crypto.d.ts +0 -3
  113. package/dist/types/crypto.js +4 -0
  114. package/dist/types/database.d.ts +138 -0
  115. package/dist/types/database.js +4 -0
  116. package/dist/types/hook.d.ts +17 -0
  117. package/dist/types/hook.js +6 -0
  118. package/dist/types/jwt.d.ts +75 -0
  119. package/dist/types/jwt.js +4 -0
  120. package/dist/types/logger.d.ts +59 -0
  121. package/dist/types/logger.js +6 -0
  122. package/dist/types/plugin.d.ts +16 -0
  123. package/dist/types/plugin.js +6 -0
  124. package/dist/types/redis.d.ts +71 -0
  125. package/dist/types/redis.js +4 -0
  126. package/{types/roleApisCache.ts → dist/types/roleApisCache.d.ts} +0 -2
  127. package/dist/types/roleApisCache.js +8 -0
  128. package/dist/types/sync.d.ts +92 -0
  129. package/dist/types/sync.js +4 -0
  130. package/dist/types/table.d.ts +34 -0
  131. package/dist/types/table.js +4 -0
  132. package/dist/types/validate.d.ts +67 -0
  133. package/dist/types/validate.js +4 -0
  134. package/dist/utils/calcPerfTime.d.ts +4 -0
  135. package/{utils/calcPerfTime.ts → dist/utils/calcPerfTime.js} +3 -3
  136. package/dist/utils/convertBigIntFields.d.ts +11 -0
  137. package/{utils/convertBigIntFields.ts → dist/utils/convertBigIntFields.js} +5 -9
  138. package/dist/utils/cors.d.ts +8 -0
  139. package/{utils/cors.ts → dist/utils/cors.js} +1 -3
  140. package/dist/utils/disableMenusGlob.d.ts +13 -0
  141. package/{utils/disableMenusGlob.ts → dist/utils/disableMenusGlob.js} +9 -29
  142. package/dist/utils/fieldClear.d.ts +11 -0
  143. package/{utils/fieldClear.ts → dist/utils/fieldClear.js} +15 -33
  144. package/dist/utils/getClientIp.d.ts +6 -0
  145. package/{utils/getClientIp.ts → dist/utils/getClientIp.js} +1 -7
  146. package/dist/utils/importDefault.d.ts +1 -0
  147. package/dist/utils/importDefault.js +29 -0
  148. package/dist/utils/isDirentDirectory.d.ts +2 -0
  149. package/{utils/isDirentDirectory.ts → dist/utils/isDirentDirectory.js} +3 -8
  150. package/dist/utils/loadMenuConfigs.d.ts +29 -0
  151. package/{utils/loadMenuConfigs.ts → dist/utils/loadMenuConfigs.js} +66 -52
  152. package/dist/utils/mergeAndConcat.d.ts +7 -0
  153. package/dist/utils/mergeAndConcat.js +72 -0
  154. package/dist/utils/processAtSymbol.d.ts +4 -0
  155. package/{utils/processFields.ts → dist/utils/processAtSymbol.js} +5 -9
  156. package/dist/utils/processInfo.d.ts +24 -0
  157. package/{utils/process.ts → dist/utils/processInfo.js} +2 -18
  158. package/dist/utils/response.d.ts +20 -0
  159. package/{utils/response.ts → dist/utils/response.js} +28 -49
  160. package/dist/utils/scanAddons.d.ts +17 -0
  161. package/{utils/scanAddons.ts → dist/utils/scanAddons.js} +7 -41
  162. package/dist/utils/scanConfig.d.ts +26 -0
  163. package/{utils/scanConfig.ts → dist/utils/scanConfig.js} +28 -66
  164. package/dist/utils/scanCoreBuiltins.d.ts +3 -0
  165. package/dist/utils/scanCoreBuiltins.js +65 -0
  166. package/dist/utils/scanFiles.d.ts +30 -0
  167. package/{utils/scanFiles.ts → dist/utils/scanFiles.js} +44 -71
  168. package/dist/utils/scanSources.d.ts +10 -0
  169. package/dist/utils/scanSources.js +46 -0
  170. package/dist/utils/sortModules.d.ts +28 -0
  171. package/{utils/sortModules.ts → dist/utils/sortModules.js} +26 -66
  172. package/dist/utils/util.d.ts +84 -0
  173. package/dist/utils/util.js +262 -0
  174. package/package.json +26 -34
  175. package/.gitignore +0 -0
  176. package/bunfig.toml +0 -3
  177. package/checks/checkHook.ts +0 -48
  178. package/checks/checkPlugin.ts +0 -48
  179. package/configs/presetRegexp.ts +0 -225
  180. package/docs/README.md +0 -98
  181. package/docs/api/api.md +0 -1921
  182. package/docs/guide/examples.md +0 -926
  183. package/docs/guide/quickstart.md +0 -354
  184. package/docs/hooks/auth.md +0 -38
  185. package/docs/hooks/cors.md +0 -28
  186. package/docs/hooks/hook.md +0 -838
  187. package/docs/hooks/parser.md +0 -19
  188. package/docs/hooks/rateLimit.md +0 -47
  189. package/docs/infra/redis.md +0 -628
  190. package/docs/plugins/cipher.md +0 -61
  191. package/docs/plugins/database.md +0 -189
  192. package/docs/plugins/plugin.md +0 -986
  193. package/docs/reference/addon.md +0 -510
  194. package/docs/reference/config.md +0 -573
  195. package/docs/reference/logger.md +0 -495
  196. package/docs/reference/sync.md +0 -478
  197. package/docs/reference/table.md +0 -763
  198. package/docs/reference/validator.md +0 -620
  199. package/lib/asyncContext.ts +0 -43
  200. package/lib/logger.ts +0 -811
  201. package/loader/loadHooks.ts +0 -51
  202. package/plugins/config.ts +0 -13
  203. package/plugins/jwt.ts +0 -15
  204. package/router/api.ts +0 -130
  205. package/tsconfig.json +0 -8
  206. package/types/database.d.ts +0 -541
  207. package/types/hook.d.ts +0 -25
  208. package/types/jwt.d.ts +0 -118
  209. package/types/logger.d.ts +0 -65
  210. package/types/plugin.d.ts +0 -19
  211. package/types/redis.d.ts +0 -83
  212. package/types/sync.d.ts +0 -398
  213. package/types/table.d.ts +0 -216
  214. package/types/validate.d.ts +0 -69
  215. package/utils/arrayKeysToCamel.ts +0 -18
  216. package/utils/configTypes.ts +0 -3
  217. package/utils/genShortId.ts +0 -12
  218. package/utils/importDefault.ts +0 -21
  219. package/utils/keysToCamel.ts +0 -22
  220. package/utils/keysToSnake.ts +0 -22
  221. package/utils/pickFields.ts +0 -19
  222. package/utils/scanSources.ts +0 -64
  223. package/utils/sqlLog.ts +0 -37
@@ -2,37 +2,28 @@
2
2
  * 数据库连接管理器
3
3
  * 统一管理 SQL 和 Redis 连接
4
4
  */
5
-
6
- import type { DatabaseConfig, RedisConfig } from "../types/befly.ts";
7
-
8
5
  import { SQL, RedisClient } from "bun";
9
-
10
- import { Logger } from "./logger.ts";
11
-
6
+ import { Logger } from "./logger";
12
7
  /**
13
8
  * 数据库连接管理器
14
9
  * 使用静态方法管理全局单例连接
15
10
  */
16
11
  export class Connect {
17
- private static sqlClient: SQL | null = null;
18
- private static redisClient: RedisClient | null = null;
19
-
12
+ static sqlClient = null;
13
+ static redisClient = null;
20
14
  // 连接统计信息
21
- private static sqlConnectedAt: number | null = null;
22
- private static redisConnectedAt: number | null = null;
23
- private static sqlPoolMax: number = 1;
24
-
15
+ static sqlConnectedAt = null;
16
+ static redisConnectedAt = null;
17
+ static sqlPoolMax = 1;
25
18
  // ========================================
26
19
  // SQL 连接管理
27
20
  // ========================================
28
-
29
21
  /**
30
22
  * 连接 SQL 数据库
31
23
  * @returns SQL 客户端实例
32
24
  */
33
- static async connectSql(dbConfig: DatabaseConfig): Promise<SQL> {
25
+ static async connectSql(dbConfig) {
34
26
  const config = dbConfig || {};
35
-
36
27
  // 构建数据库连接字符串
37
28
  const type = config.type || "mysql";
38
29
  const host = config.host || "127.0.0.1";
@@ -40,106 +31,99 @@ export class Connect {
40
31
  const user = encodeURIComponent(config.username || "root");
41
32
  const password = encodeURIComponent(config.password || "root");
42
33
  const database = encodeURIComponent(config.database || "befly_demo");
43
-
44
- let finalUrl: string;
34
+ let finalUrl;
45
35
  if (type === "sqlite") {
46
36
  finalUrl = database;
47
- } else {
37
+ }
38
+ else {
48
39
  if (!host || !database) {
49
40
  throw new Error("数据库配置不完整,请检查配置参数");
50
41
  }
51
42
  finalUrl = `${type}://${user}:${password}@${host}:${port}/${database}`;
52
43
  }
53
-
54
- let sql: SQL;
55
-
44
+ let sql;
56
45
  if (type === "sqlite") {
57
46
  sql = new SQL(finalUrl);
58
- } else {
47
+ }
48
+ else {
59
49
  sql = new SQL({
60
50
  url: finalUrl,
61
51
  max: config.poolMax ?? 1,
62
52
  bigint: false
63
53
  });
64
54
  }
65
-
66
55
  try {
67
56
  const timeout = 30000;
68
-
69
57
  const healthCheckPromise = (async () => {
70
58
  let version = "";
71
59
  if (type === "sqlite") {
72
- const v = await sql`SELECT sqlite_version() AS version`;
60
+ const v = await sql `SELECT sqlite_version() AS version`;
73
61
  version = v?.[0]?.version;
74
- } else if (type === "postgresql" || type === "postgres") {
75
- const v = await sql`SELECT version() AS version`;
62
+ }
63
+ else if (type === "postgresql" || type === "postgres") {
64
+ const v = await sql `SELECT version() AS version`;
76
65
  version = v?.[0]?.version;
77
- } else {
78
- const v = await sql`SELECT VERSION() AS version`;
66
+ }
67
+ else {
68
+ const v = await sql `SELECT VERSION() AS version`;
79
69
  version = v?.[0]?.version;
80
70
  }
81
71
  return version;
82
72
  })();
83
-
84
- const timeoutPromise = new Promise<never>((_, reject) => {
73
+ const timeoutPromise = new Promise((_, reject) => {
85
74
  setTimeout(() => {
86
75
  reject(new Error(`数据库连接超时 (${timeout}ms)`));
87
76
  }, timeout);
88
77
  });
89
-
90
78
  await Promise.race([healthCheckPromise, timeoutPromise]);
91
-
92
79
  this.sqlClient = sql;
93
80
  this.sqlConnectedAt = Date.now();
94
81
  this.sqlPoolMax = config.poolMax ?? 1;
95
82
  return sql;
96
- } catch (error: any) {
83
+ }
84
+ catch (error) {
97
85
  Logger.error({ err: error }, "[Connect] SQL 连接失败");
98
86
  try {
99
87
  await sql?.close();
100
- } catch {}
101
-
88
+ }
89
+ catch { }
102
90
  throw error;
103
91
  }
104
92
  }
105
-
106
93
  /**
107
94
  * 断开 SQL 连接
108
95
  */
109
- static async disconnectSql(): Promise<void> {
96
+ static async disconnectSql() {
110
97
  if (this.sqlClient) {
111
98
  try {
112
99
  await this.sqlClient.close();
113
- } catch (error: any) {
100
+ }
101
+ catch (error) {
114
102
  Logger.error({ err: error }, "[Connect] 关闭 SQL 连接时出错");
115
103
  }
116
104
  this.sqlClient = null;
117
105
  this.sqlConnectedAt = null;
118
106
  }
119
107
  }
120
-
121
108
  /**
122
109
  * 获取 SQL 客户端实例
123
110
  * @throws 如果未连接则抛出错误
124
111
  */
125
- static getSql(): SQL {
112
+ static getSql() {
126
113
  if (!this.sqlClient) {
127
114
  throw new Error("SQL 客户端未连接,请先调用 Connect.connectSql()");
128
115
  }
129
116
  return this.sqlClient;
130
117
  }
131
-
132
118
  // ========================================
133
119
  // Redis 连接管理
134
120
  // ========================================
135
-
136
121
  /**
137
122
  * 连接 Redis
138
123
  * @returns Redis 客户端实例
139
124
  */
140
- static async connectRedis(redisConfig: RedisConfig): Promise<RedisClient> {
125
+ static async connectRedis(redisConfig) {
141
126
  const config = redisConfig || {};
142
-
143
127
  try {
144
128
  // 构建 Redis URL
145
129
  const host = config.host || "127.0.0.1";
@@ -147,16 +131,14 @@ export class Connect {
147
131
  const username = config.username || "";
148
132
  const password = config.password || "";
149
133
  const db = config.db || 0;
150
-
151
134
  let auth = "";
152
135
  if (username && password) {
153
136
  auth = `${username}:${password}@`;
154
- } else if (password) {
137
+ }
138
+ else if (password) {
155
139
  auth = `:${password}@`;
156
140
  }
157
-
158
141
  const url = `redis://${auth}${host}:${port}/${db}`;
159
-
160
142
  const redis = new RedisClient(url, {
161
143
  connectionTimeout: 30000,
162
144
  idleTimeout: 0,
@@ -165,99 +147,80 @@ export class Connect {
165
147
  enableOfflineQueue: true,
166
148
  enableAutoPipelining: true
167
149
  });
168
-
169
150
  await redis.ping();
170
-
171
151
  this.redisClient = redis;
172
152
  this.redisConnectedAt = Date.now();
173
153
  return redis;
174
- } catch (error: any) {
154
+ }
155
+ catch (error) {
175
156
  Logger.error({ err: error }, "[Connect] Redis 连接失败");
176
157
  throw new Error(`Redis 连接失败: ${error.message}`);
177
158
  }
178
159
  }
179
-
180
160
  /**
181
161
  * 断开 Redis 连接
182
162
  */
183
- static async disconnectRedis(): Promise<void> {
163
+ static async disconnectRedis() {
184
164
  if (this.redisClient) {
185
165
  try {
186
166
  this.redisClient.close();
187
167
  this.redisConnectedAt = null;
188
- } catch (error: any) {
168
+ }
169
+ catch (error) {
189
170
  Logger.error({ err: error }, "[Connect] 关闭 Redis 连接时出错");
190
171
  }
191
172
  this.redisClient = null;
192
173
  }
193
174
  }
194
-
195
175
  /**
196
176
  * 获取 Redis 客户端实例
197
177
  * @throws 如果未连接则抛出错误
198
178
  */
199
- static getRedis(): RedisClient {
179
+ static getRedis() {
200
180
  if (!this.redisClient) {
201
181
  throw new Error("Redis 客户端未连接,请先调用 Connect.connectRedis()");
202
182
  }
203
183
  return this.redisClient;
204
184
  }
205
-
206
185
  // ========================================
207
186
  // 统一连接管理
208
187
  // ========================================
209
-
210
188
  /**
211
189
  * 连接所有数据库(SQL + Redis)
212
190
  */
213
- static async connect(config: { db: DatabaseConfig; redis: RedisConfig }): Promise<void> {
191
+ static async connect(config) {
214
192
  try {
215
193
  // 连接 SQL
216
194
  await this.connectSql(config.db || {});
217
-
218
195
  // 连接 Redis
219
196
  await this.connectRedis(config.redis || {});
220
- } catch (error: any) {
197
+ }
198
+ catch (error) {
221
199
  Logger.error({ err: error }, "数据库初始化失败");
222
200
  await this.disconnect();
223
201
  throw error;
224
202
  }
225
203
  }
226
-
227
204
  /**
228
205
  * 断开所有数据库连接
229
206
  */
230
- static async disconnect(): Promise<void> {
207
+ static async disconnect() {
231
208
  await this.disconnectSql();
232
209
  await this.disconnectRedis();
233
210
  }
234
-
235
211
  /**
236
212
  * 检查连接状态
237
213
  */
238
- static isConnected(): { sql: boolean; redis: boolean } {
214
+ static isConnected() {
239
215
  return {
240
216
  sql: this.sqlClient !== null,
241
217
  redis: this.redisClient !== null
242
218
  };
243
219
  }
244
-
245
220
  /**
246
221
  * 获取连接状态详细信息(用于监控和调试)
247
222
  */
248
- static getStatus(): {
249
- sql: {
250
- connected: boolean;
251
- connectedAt: number | null;
252
- uptime: number | null;
253
- poolMax: number;
254
- };
255
- redis: {
256
- connected: boolean;
257
- connectedAt: number | null;
258
- uptime: number | null;
259
- };
260
- } {
223
+ static getStatus() {
261
224
  const now = Date.now();
262
225
  return {
263
226
  sql: {
@@ -273,29 +236,25 @@ export class Connect {
273
236
  }
274
237
  };
275
238
  }
276
-
277
239
  // ========================================
278
240
  // 测试辅助方法
279
241
  // ========================================
280
-
281
242
  /**
282
243
  * 设置 mock SQL 客户端(仅用于测试)
283
244
  */
284
- static __setMockSql(mockClient: SQL): void {
245
+ static __setMockSql(mockClient) {
285
246
  this.sqlClient = mockClient;
286
247
  }
287
-
288
248
  /**
289
249
  * 设置 mock Redis 客户端(仅用于测试)
290
250
  */
291
- static __setMockRedis(mockClient: RedisClient): void {
251
+ static __setMockRedis(mockClient) {
292
252
  this.redisClient = mockClient;
293
253
  }
294
-
295
254
  /**
296
255
  * 重置所有连接状态(仅用于测试)
297
256
  */
298
- static __reset(): void {
257
+ static __reset() {
299
258
  this.sqlClient = null;
300
259
  this.redisClient = null;
301
260
  this.sqlConnectedAt = null;
@@ -0,0 +1,87 @@
1
+ export type DbDialectName = "mysql" | "postgresql" | "sqlite";
2
+ /**
3
+ * 获取方言实例(内部缓存,避免到处 new)。
4
+ *
5
+ * 约束:dialect 实例应当是纯逻辑对象(无连接/无 IO/无状态副作用),可全局复用。
6
+ */
7
+ export declare function getDialectByName(name: DbDialectName): DbDialect;
8
+ export type SqlTextQuery = {
9
+ sql: string;
10
+ params: unknown[];
11
+ };
12
+ export type SyncTableColumnsInfoQuery = {
13
+ columns: SqlTextQuery;
14
+ comments?: SqlTextQuery;
15
+ };
16
+ export type SyncTableIndexesQuery = SqlTextQuery;
17
+ /**
18
+ * syncTable 专用:获取“列元信息”查询。
19
+ *
20
+ * 说明:
21
+ * - 这里仅负责 SQL + 参数构造(方言差异);
22
+ * - 解析为 ColumnInfo 的逻辑仍放在 syncTable.ts(保持同步算法聚合)。
23
+ */
24
+ export declare function getSyncTableColumnsInfoQuery(options: {
25
+ dialect: DbDialectName;
26
+ table: string;
27
+ dbName: string;
28
+ schema?: string;
29
+ }): SyncTableColumnsInfoQuery;
30
+ /**
31
+ * syncTable 专用:获取“索引元信息”查询(只负责 SQL + 参数构造)。
32
+ *
33
+ * 约束:
34
+ * - 仅下沉 MySQL / PostgreSQL;SQLite 仍走 PRAGMA(需要多次查询)。
35
+ * - 解析(比如 PG indexdef 解析列名)仍留在 syncTable.ts。
36
+ */
37
+ export declare function getSyncTableIndexesQuery(options: {
38
+ dialect: DbDialectName;
39
+ table: string;
40
+ dbName: string;
41
+ schema?: string;
42
+ }): SyncTableIndexesQuery;
43
+ export interface DbDialect {
44
+ name: DbDialectName;
45
+ /**
46
+ * 转义/引用 SQL 标识符(表名/字段名)。
47
+ * 注意:仅用于单个标识符片段,不支持包含空格、点号、函数等复杂表达式。
48
+ */
49
+ quoteIdent(identifier: string): string;
50
+ /**
51
+ * 获取表字段列表的查询。
52
+ * 约定:返回结果应能通过 getTableColumnsFromResult 提取列名。
53
+ */
54
+ getTableColumnsQuery(table: string, schema?: string): SqlTextQuery;
55
+ /** 从 getTableColumnsQuery 的结果中提取列名数组 */
56
+ getTableColumnsFromResult(result: any): string[];
57
+ /** 检查表是否存在的查询 */
58
+ tableExistsQuery(table: string, schema?: string): SqlTextQuery;
59
+ /**
60
+ * 是否支持 schema.table 形式(仅用于校验;具体 quoting 仍由 SqlBuilder 处理)。
61
+ */
62
+ supportsSchema: boolean;
63
+ }
64
+ export declare class MySqlDialect implements DbDialect {
65
+ name: DbDialectName;
66
+ supportsSchema: boolean;
67
+ quoteIdent(identifier: string): string;
68
+ getTableColumnsQuery(table: string, _schema?: string): SqlTextQuery;
69
+ getTableColumnsFromResult(result: any): string[];
70
+ tableExistsQuery(table: string, schema?: string): SqlTextQuery;
71
+ }
72
+ export declare class PostgresDialect implements DbDialect {
73
+ name: DbDialectName;
74
+ supportsSchema: boolean;
75
+ quoteIdent(identifier: string): string;
76
+ getTableColumnsQuery(table: string, schema?: string): SqlTextQuery;
77
+ getTableColumnsFromResult(result: any): string[];
78
+ tableExistsQuery(table: string, schema?: string): SqlTextQuery;
79
+ }
80
+ export declare class SqliteDialect implements DbDialect {
81
+ name: DbDialectName;
82
+ supportsSchema: boolean;
83
+ quoteIdent(identifier: string): string;
84
+ getTableColumnsQuery(table: string, _schema?: string): SqlTextQuery;
85
+ getTableColumnsFromResult(result: any): string[];
86
+ tableExistsQuery(table: string, _schema?: string): SqlTextQuery;
87
+ }