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.
- package/README.md +0 -129
- package/befly.js +16413 -0
- package/befly.min.js +72 -0
- package/package.json +19 -29
- package/scripts/syncDb/context.js +99 -0
- package/scripts/syncDb/diff.js +133 -0
- package/scripts/syncDb/index.js +70 -0
- package/scripts/syncDb/query.js +26 -0
- package/scripts/syncDb/report.js +190 -0
- package/scripts/syncDb/transform.js +111 -0
- package/dist/befly.config.d.ts +0 -7
- package/dist/befly.config.js +0 -128
- package/dist/befly.js +0 -17348
- package/dist/befly.min.js +0 -23
- package/dist/checks/checkApi.d.ts +0 -1
- package/dist/checks/checkApi.js +0 -139
- package/dist/checks/checkConfig.d.ts +0 -9
- package/dist/checks/checkConfig.js +0 -255
- package/dist/checks/checkHook.d.ts +0 -1
- package/dist/checks/checkHook.js +0 -132
- package/dist/checks/checkMenu.d.ts +0 -3
- package/dist/checks/checkMenu.js +0 -106
- package/dist/checks/checkPlugin.d.ts +0 -1
- package/dist/checks/checkPlugin.js +0 -132
- package/dist/checks/checkTable.d.ts +0 -7
- package/dist/checks/checkTable.js +0 -431
- package/dist/configs/presetRegexp.d.ts +0 -145
- package/dist/configs/presetRegexp.js +0 -218
- package/dist/hooks/auth.d.ts +0 -3
- package/dist/hooks/auth.js +0 -24
- package/dist/hooks/cors.d.ts +0 -7
- package/dist/hooks/cors.js +0 -36
- package/dist/hooks/parser.d.ts +0 -10
- package/dist/hooks/parser.js +0 -76
- package/dist/hooks/permission.d.ts +0 -11
- package/dist/hooks/permission.js +0 -78
- package/dist/hooks/validator.d.ts +0 -7
- package/dist/hooks/validator.js +0 -52
- package/dist/index.d.ts +0 -28
- package/dist/index.js +0 -316
- package/dist/lib/asyncContext.d.ts +0 -21
- package/dist/lib/asyncContext.js +0 -27
- package/dist/lib/cacheHelper.d.ts +0 -128
- package/dist/lib/cacheHelper.js +0 -477
- package/dist/lib/cacheKeys.d.ts +0 -27
- package/dist/lib/cacheKeys.js +0 -37
- package/dist/lib/cipher.d.ts +0 -153
- package/dist/lib/cipher.js +0 -237
- package/dist/lib/connect.d.ts +0 -95
- package/dist/lib/connect.js +0 -313
- package/dist/lib/dbHelper.d.ts +0 -229
- package/dist/lib/dbHelper.js +0 -1099
- package/dist/lib/dbUtils.d.ts +0 -91
- package/dist/lib/dbUtils.js +0 -544
- package/dist/lib/jwt.d.ts +0 -13
- package/dist/lib/jwt.js +0 -77
- package/dist/lib/logger.d.ts +0 -46
- package/dist/lib/logger.js +0 -731
- package/dist/lib/redisHelper.d.ts +0 -193
- package/dist/lib/redisHelper.js +0 -598
- package/dist/lib/sqlBuilder.d.ts +0 -160
- package/dist/lib/sqlBuilder.js +0 -837
- package/dist/lib/sqlCheck.d.ts +0 -23
- package/dist/lib/sqlCheck.js +0 -119
- package/dist/lib/validator.d.ts +0 -45
- package/dist/lib/validator.js +0 -424
- package/dist/loader/loadApis.d.ts +0 -12
- package/dist/loader/loadApis.js +0 -71
- package/dist/loader/loadHooks.d.ts +0 -7
- package/dist/loader/loadHooks.js +0 -50
- package/dist/loader/loadPlugins.d.ts +0 -8
- package/dist/loader/loadPlugins.js +0 -69
- package/dist/paths.d.ts +0 -93
- package/dist/paths.js +0 -100
- package/dist/plugins/cache.d.ts +0 -10
- package/dist/plugins/cache.js +0 -24
- package/dist/plugins/cipher.d.ts +0 -7
- package/dist/plugins/cipher.js +0 -14
- package/dist/plugins/config.d.ts +0 -3
- package/dist/plugins/config.js +0 -9
- package/dist/plugins/db.d.ts +0 -10
- package/dist/plugins/db.js +0 -48
- package/dist/plugins/jwt.d.ts +0 -6
- package/dist/plugins/jwt.js +0 -13
- package/dist/plugins/logger.d.ts +0 -10
- package/dist/plugins/logger.js +0 -21
- package/dist/plugins/redis.d.ts +0 -10
- package/dist/plugins/redis.js +0 -40
- package/dist/plugins/tool.d.ts +0 -75
- package/dist/plugins/tool.js +0 -105
- package/dist/router/api.d.ts +0 -14
- package/dist/router/api.js +0 -109
- package/dist/router/static.d.ts +0 -9
- package/dist/router/static.js +0 -56
- package/dist/scripts/ensureDist.d.ts +0 -1
- package/dist/scripts/ensureDist.js +0 -296
- package/dist/sync/syncApi.d.ts +0 -3
- package/dist/sync/syncApi.js +0 -163
- package/dist/sync/syncCache.d.ts +0 -2
- package/dist/sync/syncCache.js +0 -14
- package/dist/sync/syncDev.d.ts +0 -6
- package/dist/sync/syncDev.js +0 -166
- package/dist/sync/syncMenu.d.ts +0 -14
- package/dist/sync/syncMenu.js +0 -308
- package/dist/sync/syncTable.d.ts +0 -126
- package/dist/sync/syncTable.js +0 -1129
- package/dist/types/api.d.ts +0 -177
- package/dist/types/api.js +0 -4
- package/dist/types/befly.d.ts +0 -231
- package/dist/types/befly.js +0 -4
- package/dist/types/cache.d.ts +0 -96
- package/dist/types/cache.js +0 -4
- package/dist/types/cipher.d.ts +0 -27
- package/dist/types/cipher.js +0 -7
- package/dist/types/common.d.ts +0 -127
- package/dist/types/common.js +0 -5
- package/dist/types/context.d.ts +0 -39
- package/dist/types/context.js +0 -4
- package/dist/types/coreError.d.ts +0 -31
- package/dist/types/coreError.js +0 -38
- package/dist/types/crypto.d.ts +0 -20
- package/dist/types/crypto.js +0 -4
- package/dist/types/database.d.ts +0 -182
- package/dist/types/database.js +0 -4
- package/dist/types/hook.d.ts +0 -30
- package/dist/types/hook.js +0 -19
- package/dist/types/jwt.d.ts +0 -76
- package/dist/types/jwt.js +0 -4
- package/dist/types/logger.d.ts +0 -95
- package/dist/types/logger.js +0 -6
- package/dist/types/plugin.d.ts +0 -27
- package/dist/types/plugin.js +0 -17
- package/dist/types/redis.d.ts +0 -80
- package/dist/types/redis.js +0 -4
- package/dist/types/roleApisCache.d.ts +0 -21
- package/dist/types/roleApisCache.js +0 -8
- package/dist/types/sync.d.ts +0 -93
- package/dist/types/sync.js +0 -4
- package/dist/types/table.d.ts +0 -34
- package/dist/types/table.js +0 -4
- package/dist/types/validate.d.ts +0 -113
- package/dist/types/validate.js +0 -4
- package/dist/utils/calcPerfTime.d.ts +0 -4
- package/dist/utils/calcPerfTime.js +0 -13
- package/dist/utils/cors.d.ts +0 -8
- package/dist/utils/cors.js +0 -17
- package/dist/utils/dbFieldRules.d.ts +0 -31
- package/dist/utils/dbFieldRules.js +0 -94
- package/dist/utils/fieldClear.d.ts +0 -11
- package/dist/utils/fieldClear.js +0 -57
- package/dist/utils/formatYmdHms.d.ts +0 -1
- package/dist/utils/formatYmdHms.js +0 -20
- package/dist/utils/getClientIp.d.ts +0 -6
- package/dist/utils/getClientIp.js +0 -39
- package/dist/utils/importDefault.d.ts +0 -1
- package/dist/utils/importDefault.js +0 -53
- package/dist/utils/isDirentDirectory.d.ts +0 -3
- package/dist/utils/isDirentDirectory.js +0 -18
- package/dist/utils/loadMenuConfigs.d.ts +0 -11
- package/dist/utils/loadMenuConfigs.js +0 -130
- package/dist/utils/loggerUtils.d.ts +0 -18
- package/dist/utils/loggerUtils.js +0 -171
- package/dist/utils/mergeAndConcat.d.ts +0 -7
- package/dist/utils/mergeAndConcat.js +0 -77
- package/dist/utils/normalizeFieldDefinition.d.ts +0 -18
- package/dist/utils/normalizeFieldDefinition.js +0 -27
- package/dist/utils/processInfo.d.ts +0 -26
- package/dist/utils/processInfo.js +0 -41
- package/dist/utils/response.d.ts +0 -20
- package/dist/utils/response.js +0 -96
- package/dist/utils/scanAddons.d.ts +0 -15
- package/dist/utils/scanAddons.js +0 -35
- package/dist/utils/scanCoreBuiltins.d.ts +0 -3
- package/dist/utils/scanCoreBuiltins.js +0 -72
- package/dist/utils/scanFiles.d.ts +0 -32
- package/dist/utils/scanFiles.js +0 -124
- package/dist/utils/scanSources.d.ts +0 -10
- package/dist/utils/scanSources.js +0 -46
- package/dist/utils/sortModules.d.ts +0 -28
- package/dist/utils/sortModules.js +0 -105
- package/dist/utils/sqlUtil.d.ts +0 -33
- package/dist/utils/sqlUtil.js +0 -146
- package/dist/utils/util.d.ts +0 -172
- 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
|
+
}
|
package/dist/befly.config.d.ts
DELETED
package/dist/befly.config.js
DELETED
|
@@ -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
|
-
}
|