befly 3.16.10 → 3.17.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 (184) hide show
  1. package/README.md +0 -129
  2. package/befly.js +16413 -0
  3. package/befly.min.js +72 -0
  4. package/package.json +19 -29
  5. package/scripts/syncDb/context.js +99 -0
  6. package/scripts/syncDb/diff.js +133 -0
  7. package/scripts/syncDb/index.js +70 -0
  8. package/scripts/syncDb/query.js +26 -0
  9. package/scripts/syncDb/report.js +190 -0
  10. package/scripts/syncDb/transform.js +111 -0
  11. package/dist/befly.config.d.ts +0 -7
  12. package/dist/befly.config.js +0 -128
  13. package/dist/befly.js +0 -17348
  14. package/dist/befly.min.js +0 -23
  15. package/dist/checks/checkApi.d.ts +0 -1
  16. package/dist/checks/checkApi.js +0 -139
  17. package/dist/checks/checkConfig.d.ts +0 -9
  18. package/dist/checks/checkConfig.js +0 -255
  19. package/dist/checks/checkHook.d.ts +0 -1
  20. package/dist/checks/checkHook.js +0 -132
  21. package/dist/checks/checkMenu.d.ts +0 -3
  22. package/dist/checks/checkMenu.js +0 -106
  23. package/dist/checks/checkPlugin.d.ts +0 -1
  24. package/dist/checks/checkPlugin.js +0 -132
  25. package/dist/checks/checkTable.d.ts +0 -7
  26. package/dist/checks/checkTable.js +0 -431
  27. package/dist/configs/presetRegexp.d.ts +0 -145
  28. package/dist/configs/presetRegexp.js +0 -218
  29. package/dist/hooks/auth.d.ts +0 -3
  30. package/dist/hooks/auth.js +0 -24
  31. package/dist/hooks/cors.d.ts +0 -7
  32. package/dist/hooks/cors.js +0 -36
  33. package/dist/hooks/parser.d.ts +0 -10
  34. package/dist/hooks/parser.js +0 -76
  35. package/dist/hooks/permission.d.ts +0 -11
  36. package/dist/hooks/permission.js +0 -78
  37. package/dist/hooks/validator.d.ts +0 -7
  38. package/dist/hooks/validator.js +0 -52
  39. package/dist/index.d.ts +0 -28
  40. package/dist/index.js +0 -316
  41. package/dist/lib/asyncContext.d.ts +0 -21
  42. package/dist/lib/asyncContext.js +0 -27
  43. package/dist/lib/cacheHelper.d.ts +0 -128
  44. package/dist/lib/cacheHelper.js +0 -477
  45. package/dist/lib/cacheKeys.d.ts +0 -27
  46. package/dist/lib/cacheKeys.js +0 -37
  47. package/dist/lib/cipher.d.ts +0 -153
  48. package/dist/lib/cipher.js +0 -237
  49. package/dist/lib/connect.d.ts +0 -95
  50. package/dist/lib/connect.js +0 -313
  51. package/dist/lib/dbHelper.d.ts +0 -229
  52. package/dist/lib/dbHelper.js +0 -1099
  53. package/dist/lib/dbUtils.d.ts +0 -91
  54. package/dist/lib/dbUtils.js +0 -544
  55. package/dist/lib/jwt.d.ts +0 -13
  56. package/dist/lib/jwt.js +0 -77
  57. package/dist/lib/logger.d.ts +0 -46
  58. package/dist/lib/logger.js +0 -731
  59. package/dist/lib/redisHelper.d.ts +0 -193
  60. package/dist/lib/redisHelper.js +0 -598
  61. package/dist/lib/sqlBuilder.d.ts +0 -160
  62. package/dist/lib/sqlBuilder.js +0 -837
  63. package/dist/lib/sqlCheck.d.ts +0 -23
  64. package/dist/lib/sqlCheck.js +0 -119
  65. package/dist/lib/validator.d.ts +0 -45
  66. package/dist/lib/validator.js +0 -424
  67. package/dist/loader/loadApis.d.ts +0 -12
  68. package/dist/loader/loadApis.js +0 -71
  69. package/dist/loader/loadHooks.d.ts +0 -7
  70. package/dist/loader/loadHooks.js +0 -50
  71. package/dist/loader/loadPlugins.d.ts +0 -8
  72. package/dist/loader/loadPlugins.js +0 -69
  73. package/dist/paths.d.ts +0 -93
  74. package/dist/paths.js +0 -100
  75. package/dist/plugins/cache.d.ts +0 -10
  76. package/dist/plugins/cache.js +0 -24
  77. package/dist/plugins/cipher.d.ts +0 -7
  78. package/dist/plugins/cipher.js +0 -14
  79. package/dist/plugins/config.d.ts +0 -3
  80. package/dist/plugins/config.js +0 -9
  81. package/dist/plugins/db.d.ts +0 -10
  82. package/dist/plugins/db.js +0 -48
  83. package/dist/plugins/jwt.d.ts +0 -6
  84. package/dist/plugins/jwt.js +0 -13
  85. package/dist/plugins/logger.d.ts +0 -10
  86. package/dist/plugins/logger.js +0 -21
  87. package/dist/plugins/redis.d.ts +0 -10
  88. package/dist/plugins/redis.js +0 -40
  89. package/dist/plugins/tool.d.ts +0 -75
  90. package/dist/plugins/tool.js +0 -105
  91. package/dist/router/api.d.ts +0 -14
  92. package/dist/router/api.js +0 -109
  93. package/dist/router/static.d.ts +0 -9
  94. package/dist/router/static.js +0 -56
  95. package/dist/scripts/ensureDist.d.ts +0 -1
  96. package/dist/scripts/ensureDist.js +0 -296
  97. package/dist/sync/syncApi.d.ts +0 -3
  98. package/dist/sync/syncApi.js +0 -163
  99. package/dist/sync/syncCache.d.ts +0 -2
  100. package/dist/sync/syncCache.js +0 -14
  101. package/dist/sync/syncDev.d.ts +0 -6
  102. package/dist/sync/syncDev.js +0 -166
  103. package/dist/sync/syncMenu.d.ts +0 -14
  104. package/dist/sync/syncMenu.js +0 -308
  105. package/dist/sync/syncTable.d.ts +0 -126
  106. package/dist/sync/syncTable.js +0 -1129
  107. package/dist/types/api.d.ts +0 -177
  108. package/dist/types/api.js +0 -4
  109. package/dist/types/befly.d.ts +0 -231
  110. package/dist/types/befly.js +0 -4
  111. package/dist/types/cache.d.ts +0 -96
  112. package/dist/types/cache.js +0 -4
  113. package/dist/types/cipher.d.ts +0 -27
  114. package/dist/types/cipher.js +0 -7
  115. package/dist/types/common.d.ts +0 -127
  116. package/dist/types/common.js +0 -5
  117. package/dist/types/context.d.ts +0 -39
  118. package/dist/types/context.js +0 -4
  119. package/dist/types/coreError.d.ts +0 -31
  120. package/dist/types/coreError.js +0 -38
  121. package/dist/types/crypto.d.ts +0 -20
  122. package/dist/types/crypto.js +0 -4
  123. package/dist/types/database.d.ts +0 -182
  124. package/dist/types/database.js +0 -4
  125. package/dist/types/hook.d.ts +0 -30
  126. package/dist/types/hook.js +0 -19
  127. package/dist/types/jwt.d.ts +0 -76
  128. package/dist/types/jwt.js +0 -4
  129. package/dist/types/logger.d.ts +0 -95
  130. package/dist/types/logger.js +0 -6
  131. package/dist/types/plugin.d.ts +0 -27
  132. package/dist/types/plugin.js +0 -17
  133. package/dist/types/redis.d.ts +0 -80
  134. package/dist/types/redis.js +0 -4
  135. package/dist/types/roleApisCache.d.ts +0 -21
  136. package/dist/types/roleApisCache.js +0 -8
  137. package/dist/types/sync.d.ts +0 -93
  138. package/dist/types/sync.js +0 -4
  139. package/dist/types/table.d.ts +0 -34
  140. package/dist/types/table.js +0 -4
  141. package/dist/types/validate.d.ts +0 -113
  142. package/dist/types/validate.js +0 -4
  143. package/dist/utils/calcPerfTime.d.ts +0 -4
  144. package/dist/utils/calcPerfTime.js +0 -13
  145. package/dist/utils/cors.d.ts +0 -8
  146. package/dist/utils/cors.js +0 -17
  147. package/dist/utils/dbFieldRules.d.ts +0 -31
  148. package/dist/utils/dbFieldRules.js +0 -94
  149. package/dist/utils/fieldClear.d.ts +0 -11
  150. package/dist/utils/fieldClear.js +0 -57
  151. package/dist/utils/formatYmdHms.d.ts +0 -1
  152. package/dist/utils/formatYmdHms.js +0 -20
  153. package/dist/utils/getClientIp.d.ts +0 -6
  154. package/dist/utils/getClientIp.js +0 -39
  155. package/dist/utils/importDefault.d.ts +0 -1
  156. package/dist/utils/importDefault.js +0 -53
  157. package/dist/utils/isDirentDirectory.d.ts +0 -3
  158. package/dist/utils/isDirentDirectory.js +0 -18
  159. package/dist/utils/loadMenuConfigs.d.ts +0 -11
  160. package/dist/utils/loadMenuConfigs.js +0 -130
  161. package/dist/utils/loggerUtils.d.ts +0 -18
  162. package/dist/utils/loggerUtils.js +0 -171
  163. package/dist/utils/mergeAndConcat.d.ts +0 -7
  164. package/dist/utils/mergeAndConcat.js +0 -77
  165. package/dist/utils/normalizeFieldDefinition.d.ts +0 -18
  166. package/dist/utils/normalizeFieldDefinition.js +0 -27
  167. package/dist/utils/processInfo.d.ts +0 -26
  168. package/dist/utils/processInfo.js +0 -41
  169. package/dist/utils/response.d.ts +0 -20
  170. package/dist/utils/response.js +0 -96
  171. package/dist/utils/scanAddons.d.ts +0 -15
  172. package/dist/utils/scanAddons.js +0 -35
  173. package/dist/utils/scanCoreBuiltins.d.ts +0 -3
  174. package/dist/utils/scanCoreBuiltins.js +0 -72
  175. package/dist/utils/scanFiles.d.ts +0 -32
  176. package/dist/utils/scanFiles.js +0 -124
  177. package/dist/utils/scanSources.d.ts +0 -10
  178. package/dist/utils/scanSources.js +0 -46
  179. package/dist/utils/sortModules.d.ts +0 -28
  180. package/dist/utils/sortModules.js +0 -105
  181. package/dist/utils/sqlUtil.d.ts +0 -33
  182. package/dist/utils/sqlUtil.js +0 -146
  183. package/dist/utils/util.d.ts +0 -172
  184. package/dist/utils/util.js +0 -517
@@ -0,0 +1,111 @@
1
+ import { DECIMAL_KIND_TYPES, ENUM_KIND_TYPES, FLOAT_KIND_TYPES, INT_KIND_TYPES, JSON_KIND_TYPES, STRING_KIND_TYPES, TEXT_KIND_TYPES } from "../../configs/constConfig.js";
2
+ import { isNonEmptyString, isNumber } from "../../utils/is.js";
3
+ import { camelCase } from "../../utils/util.js";
4
+
5
+ function resolveSyncDbEnumInput(columnType) {
6
+ const matched = /^enum\((.*)\)$/.exec(columnType);
7
+ if (!matched || !matched[1]) {
8
+ return "";
9
+ }
10
+
11
+ const values = [];
12
+ const enumValueRegexp = /'((?:[^'\\]|\\.)*)'/g;
13
+
14
+ let execResult = enumValueRegexp.exec(matched[1]);
15
+ while (execResult) {
16
+ const decodedValue = String(execResult[1]).replaceAll("\\'", "'");
17
+ values.push(decodedValue);
18
+ execResult = enumValueRegexp.exec(matched[1]);
19
+ }
20
+
21
+ if (values.length === 0) {
22
+ return "";
23
+ }
24
+
25
+ return values.join("|");
26
+ }
27
+
28
+ function resolveSyncDbInputByColumn(columnMeta) {
29
+ const dataType = String(columnMeta.dataType || "").toLowerCase();
30
+ const columnType = String(columnMeta.columnType || "").toLowerCase();
31
+
32
+ if (ENUM_KIND_TYPES.includes(dataType)) {
33
+ const enumInput = resolveSyncDbEnumInput(columnType);
34
+ if (isNonEmptyString(enumInput)) {
35
+ return enumInput;
36
+ }
37
+ return "string";
38
+ }
39
+
40
+ if (JSON_KIND_TYPES.includes(dataType)) {
41
+ return "json";
42
+ }
43
+
44
+ if (INT_KIND_TYPES.includes(dataType)) {
45
+ return "integer";
46
+ }
47
+
48
+ if (DECIMAL_KIND_TYPES.includes(dataType) || FLOAT_KIND_TYPES.includes(dataType)) {
49
+ return "number";
50
+ }
51
+
52
+ if (STRING_KIND_TYPES.includes(dataType) || TEXT_KIND_TYPES.includes(dataType)) {
53
+ if (dataType === "char") {
54
+ return "char";
55
+ }
56
+ return "string";
57
+ }
58
+
59
+ if (dataType.includes("date") || dataType.includes("time") || dataType === "year") {
60
+ return "string";
61
+ }
62
+
63
+ if (dataType === "bit" || dataType === "boolean") {
64
+ return "integer";
65
+ }
66
+
67
+ return "string";
68
+ }
69
+
70
+ function resolveSyncDbMaxByColumn(columnMeta) {
71
+ const dataType = String(columnMeta.dataType || "").toLowerCase();
72
+
73
+ if (!(STRING_KIND_TYPES.includes(dataType) || TEXT_KIND_TYPES.includes(dataType))) {
74
+ return null;
75
+ }
76
+
77
+ if (!isNumber(columnMeta.charLength)) {
78
+ return null;
79
+ }
80
+
81
+ if (!Number.isFinite(columnMeta.charLength)) {
82
+ return null;
83
+ }
84
+
85
+ if (columnMeta.charLength <= 0 || columnMeta.charLength > Number.MAX_SAFE_INTEGER) {
86
+ return null;
87
+ }
88
+
89
+ return Math.floor(columnMeta.charLength);
90
+ }
91
+
92
+ export function toSyncDbFieldDef(columnMeta) {
93
+ const fieldName = camelCase(String(columnMeta.columnName || ""));
94
+ const fieldDisplayName = isNonEmptyString(columnMeta.columnComment) ? String(columnMeta.columnComment).trim() : fieldName;
95
+ const fieldInput = resolveSyncDbInputByColumn(columnMeta);
96
+ const fieldMax = resolveSyncDbMaxByColumn(columnMeta);
97
+
98
+ const fieldDef = {
99
+ name: fieldDisplayName,
100
+ input: fieldInput
101
+ };
102
+
103
+ if (isNumber(fieldMax)) {
104
+ fieldDef.max = fieldMax;
105
+ }
106
+
107
+ return {
108
+ fieldName: fieldName,
109
+ fieldDef: fieldDef
110
+ };
111
+ }
@@ -1,7 +0,0 @@
1
- /**
2
- * Befly 配置模块
3
- * 自动加载 configs 目录下的配置文件并与默认配置合并
4
- * 支持环境分离:befly.common.json + befly.development/production.json
5
- */
6
- import type { BeflyOptions } from "./types/befly";
7
- export declare function loadBeflyConfig(nodeEnv?: string): Promise<BeflyOptions>;
@@ -1,128 +0,0 @@
1
- import { join } from "node:path";
2
- import { CoreError } from "./types/coreError";
3
- import { importDefault } from "./utils/importDefault";
4
- import { mergeAndConcat } from "./utils/mergeAndConcat";
5
- /** 默认配置 */
6
- const defaultOptions = {
7
- // ========== 核心参数 ==========
8
- nodeEnv: "development",
9
- appName: "野蜂飞舞",
10
- appPort: 3000,
11
- appHost: "127.0.0.1",
12
- devEmail: "dev@qq.com",
13
- devPassword: "beflydev123456",
14
- bodyLimit: 1048576, // 1MB
15
- tz: "Asia/Shanghai",
16
- strict: true,
17
- // ========== 日志配置 ==========
18
- logger: {
19
- debug: 1,
20
- excludeFields: ["password", "token", "secret"],
21
- dir: "./logs",
22
- console: 1,
23
- maxSize: 20, // 20MB
24
- maxStringLen: 100,
25
- maxArrayItems: 100
26
- },
27
- // ========== 数据库配置 ==========
28
- db: {
29
- idMode: "timeId",
30
- host: "127.0.0.1",
31
- port: 3306,
32
- username: "root",
33
- password: "root",
34
- database: "befly_demo",
35
- poolMax: 10
36
- },
37
- // ========== Redis 配置 ==========
38
- redis: {
39
- host: "127.0.0.1",
40
- port: 6379,
41
- username: "",
42
- password: "",
43
- db: 0,
44
- prefix: "befly_demo"
45
- },
46
- // ========== 认证配置 ==========
47
- auth: {
48
- secret: "befly-secret",
49
- expiresIn: "7d",
50
- algorithm: "HS256"
51
- },
52
- // ========== CORS 配置 ==========
53
- cors: {
54
- origin: "*",
55
- methods: "GET,HEAD,PUT,PATCH,POST,DELETE",
56
- allowedHeaders: "Content-Type,Authorization",
57
- exposedHeaders: "",
58
- maxAge: 86400,
59
- credentials: "true"
60
- },
61
- // ========== Hook:全局限流 ==========
62
- rateLimit: {
63
- enable: 1,
64
- // 默认兜底规则:所有接口按 IP 限流(如需更细粒度请配置 rules)
65
- defaultLimit: 1000,
66
- defaultWindow: 60,
67
- key: "ip",
68
- skipRoutes: [],
69
- rules: []
70
- },
71
- // ========== 菜单禁用配置 ==========
72
- disableMenus: ["**/404", "**/403", "**/500", "/addon/admin/login"],
73
- // ========== Addon 配置 ==========
74
- addons: {}
75
- };
76
- export async function loadBeflyConfig(nodeEnv) {
77
- if (nodeEnv !== "development" && nodeEnv !== "production") {
78
- throw new CoreError({
79
- message: `配置错误:NODE_ENV 只能是 'development' 或 'production',当前值=${String(nodeEnv)}`,
80
- kind: "validation",
81
- noLog: true,
82
- meta: { subsystem: "config", operation: "loadBeflyConfig" }
83
- });
84
- }
85
- // 使用 importDefault 加载 configs 目录下的配置文件。2222
86
- // 合并顺序:defaultOptions ← befly.common.json ← befly.development/production.json
87
- const configsDir = join(process.cwd(), "configs");
88
- const commonConfig = await importDefault(join(configsDir, "befly.common.json"), {});
89
- const envConfig = await importDefault(join(configsDir, `befly.${nodeEnv}.json`), {});
90
- const config = mergeAndConcat(defaultOptions, commonConfig, envConfig);
91
- // 重要:nodeEnv 的来源只从 Befly.start(env) 的入参 env.NODE_ENV 传入,避免 process.env 在 bundle 阶段被常量折叠。
92
- // 同时确保运行时行为(例如 Bun.serve development 标记)与实际选择的配置文件一致。
93
- config.nodeEnv = nodeEnv;
94
- // 配置校验:redis.prefix 作为 key 前缀,由 RedisHelper 统一拼接 ":"。
95
- // 因此 prefix 本身不允许包含 ":",否则会导致 key 结构出现空段或多段分隔(例如 "prefix::key"),
96
- // 在 RedisInsight 等工具里可能显示 [NO NAME] 空分组,且容易造成 key 管理混乱。
97
- const redisPrefix = config.redis?.prefix;
98
- if (typeof redisPrefix === "string") {
99
- const trimmedPrefix = redisPrefix.trim();
100
- if (trimmedPrefix.includes(":")) {
101
- throw new CoreError({
102
- message: `配置错误:redis.prefix 不允许包含 ':'(RedisHelper 会自动拼接分隔符 ':'),请改为不带冒号的前缀,例如 'befly_demo',当前值=${redisPrefix}`,
103
- kind: "validation",
104
- noLog: true,
105
- meta: { subsystem: "config", operation: "loadBeflyConfig" }
106
- });
107
- }
108
- }
109
- const idMode = config.db?.idMode;
110
- if (idMode !== undefined && idMode !== "timeId" && idMode !== "autoId") {
111
- throw new CoreError({
112
- message: `配置错误:db.idMode 只能是 'timeId' 或 'autoId',当前值=${String(idMode)}`,
113
- kind: "validation",
114
- noLog: true,
115
- meta: { subsystem: "config", operation: "loadBeflyConfig" }
116
- });
117
- }
118
- const strict = config.strict;
119
- if (strict !== undefined && typeof strict !== "boolean") {
120
- throw new CoreError({
121
- message: `配置错误:strict 必须为 boolean,当前值=${String(strict)}`,
122
- kind: "validation",
123
- noLog: true,
124
- meta: { subsystem: "config", operation: "loadBeflyConfig" }
125
- });
126
- }
127
- return config;
128
- }