befly 3.10.17 → 3.10.19
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 +83 -307
- package/dist/befly.config.d.ts +7 -0
- package/{befly.config.ts → dist/befly.config.js} +8 -31
- package/dist/checks/checkApi.d.ts +1 -0
- package/{checks/checkApi.ts → dist/checks/checkApi.js} +10 -27
- package/dist/checks/checkHook.d.ts +1 -0
- package/{checks/checkHook.ts → dist/checks/checkHook.js} +10 -19
- package/dist/checks/checkMenu.d.ts +7 -0
- package/{checks/checkMenu.ts → dist/checks/checkMenu.js} +15 -50
- package/dist/checks/checkPlugin.d.ts +1 -0
- package/{checks/checkPlugin.ts → dist/checks/checkPlugin.js} +10 -19
- package/dist/checks/checkTable.d.ts +6 -0
- package/{checks/checkTable.ts → dist/checks/checkTable.js} +16 -40
- package/dist/configs/presetFields.d.ts +4 -0
- package/{configs/presetFields.ts → dist/configs/presetFields.js} +1 -1
- package/dist/configs/presetRegexp.d.ts +145 -0
- package/{utils/regex.ts → dist/configs/presetRegexp.js} +8 -31
- package/dist/hooks/auth.d.ts +5 -0
- package/{hooks/auth.ts → dist/hooks/auth.js} +5 -9
- package/dist/hooks/cors.d.ts +9 -0
- package/{hooks/cors.ts → dist/hooks/cors.js} +2 -12
- package/dist/hooks/parser.d.ts +12 -0
- package/{hooks/parser.ts → dist/hooks/parser.js} +27 -42
- package/dist/hooks/permission.d.ts +12 -0
- package/{hooks/permission.ts → dist/hooks/permission.js} +11 -22
- package/dist/hooks/validator.d.ts +9 -0
- package/{hooks/validator.ts → dist/hooks/validator.js} +5 -12
- package/dist/lib/asyncContext.d.ts +21 -0
- package/dist/lib/asyncContext.js +27 -0
- package/dist/lib/cacheHelper.d.ts +95 -0
- package/{lib/cacheHelper.ts → dist/lib/cacheHelper.js} +43 -103
- package/dist/lib/cacheKeys.d.ts +23 -0
- package/{lib/cacheKeys.ts → dist/lib/cacheKeys.js} +5 -10
- package/dist/lib/cipher.d.ts +153 -0
- package/{lib/cipher.ts → dist/lib/cipher.js} +23 -44
- package/dist/lib/connect.d.ts +91 -0
- package/{lib/connect.ts → dist/lib/connect.js} +46 -87
- package/dist/lib/dbDialect.d.ts +87 -0
- package/{lib/dbDialect.ts → dist/lib/dbDialect.js} +32 -112
- package/dist/lib/dbHelper.d.ts +204 -0
- package/{lib/dbHelper.ts → dist/lib/dbHelper.js} +73 -230
- package/dist/lib/dbUtils.d.ts +68 -0
- package/{lib/dbUtils.ts → dist/lib/dbUtils.js} +49 -123
- package/dist/lib/jwt.d.ts +13 -0
- package/{lib/jwt.ts → dist/lib/jwt.js} +11 -32
- package/dist/lib/logger.d.ts +32 -0
- package/{lib/logger.ts → dist/lib/logger.js} +201 -278
- package/dist/lib/redisHelper.d.ts +185 -0
- package/{lib/redisHelper.ts → dist/lib/redisHelper.js} +95 -139
- package/dist/lib/sqlBuilder.d.ts +160 -0
- package/{lib/sqlBuilder.ts → dist/lib/sqlBuilder.js} +131 -277
- package/dist/lib/sqlCheck.d.ts +23 -0
- package/{lib/sqlCheck.ts → dist/lib/sqlCheck.js} +24 -41
- package/dist/lib/validator.d.ts +45 -0
- package/{lib/validator.ts → dist/lib/validator.js} +43 -60
- package/dist/loader/loadApis.d.ts +12 -0
- package/{loader/loadApis.ts → dist/loader/loadApis.js} +7 -17
- package/dist/loader/loadHooks.d.ts +8 -0
- package/{loader/loadHooks.ts → dist/loader/loadHooks.js} +5 -19
- package/dist/loader/loadPlugins.d.ts +8 -0
- package/{loader/loadPlugins.ts → dist/loader/loadPlugins.js} +8 -20
- package/dist/main.d.ts +26 -0
- package/{main.ts → dist/main.js} +39 -78
- package/dist/paths.d.ts +93 -0
- package/{paths.ts → dist/paths.js} +6 -19
- package/dist/plugins/cache.d.ts +14 -0
- package/{plugins/cache.ts → dist/plugins/cache.js} +4 -11
- package/dist/plugins/cipher.d.ts +10 -0
- package/{plugins/cipher.ts → dist/plugins/cipher.js} +1 -5
- package/dist/plugins/config.d.ts +10 -0
- package/dist/plugins/config.js +6 -0
- package/dist/plugins/db.d.ts +14 -0
- package/{plugins/db.ts → dist/plugins/db.js} +5 -13
- package/dist/plugins/jwt.d.ts +10 -0
- package/{plugins/jwt.ts → dist/plugins/jwt.js} +2 -7
- package/dist/plugins/logger.d.ts +28 -0
- package/{plugins/logger.ts → dist/plugins/logger.js} +2 -7
- package/dist/plugins/redis.d.ts +14 -0
- package/{plugins/redis.ts → dist/plugins/redis.js} +4 -9
- package/dist/plugins/tool.d.ts +79 -0
- package/{plugins/tool.ts → dist/plugins/tool.js} +7 -30
- package/dist/router/api.d.ts +14 -0
- package/dist/router/api.js +107 -0
- package/dist/router/static.d.ts +9 -0
- package/{router/static.ts → dist/router/static.js} +17 -31
- package/dist/scripts/ensureDist.d.ts +1 -0
- package/dist/scripts/ensureDist.js +80 -0
- package/dist/sync/syncApi.d.ts +3 -0
- package/{sync/syncApi.ts → dist/sync/syncApi.js} +33 -53
- package/dist/sync/syncCache.d.ts +2 -0
- package/{sync/syncCache.ts → dist/sync/syncCache.js} +1 -6
- package/dist/sync/syncDev.d.ts +6 -0
- package/{sync/syncDev.ts → dist/sync/syncDev.js} +27 -60
- package/dist/sync/syncMenu.d.ts +14 -0
- package/{sync/syncMenu.ts → dist/sync/syncMenu.js} +61 -121
- package/dist/sync/syncTable.d.ts +151 -0
- package/{sync/syncTable.ts → dist/sync/syncTable.js} +168 -375
- package/{types → dist/types}/api.d.ts +12 -51
- package/dist/types/api.js +4 -0
- package/{types → dist/types}/befly.d.ts +32 -223
- package/dist/types/befly.js +4 -0
- package/{types → dist/types}/cache.d.ts +7 -15
- package/dist/types/cache.js +4 -0
- package/dist/types/cipher.d.ts +27 -0
- package/dist/types/cipher.js +7 -0
- package/{types → dist/types}/common.d.ts +8 -33
- package/dist/types/common.js +5 -0
- package/{types → dist/types}/context.d.ts +3 -5
- package/dist/types/context.js +4 -0
- package/{types → dist/types}/crypto.d.ts +0 -3
- package/dist/types/crypto.js +4 -0
- package/dist/types/database.d.ts +138 -0
- package/dist/types/database.js +4 -0
- package/dist/types/hook.d.ts +15 -0
- package/dist/types/hook.js +6 -0
- package/dist/types/jwt.d.ts +75 -0
- package/dist/types/jwt.js +4 -0
- package/dist/types/logger.d.ts +47 -0
- package/dist/types/logger.js +6 -0
- package/dist/types/plugin.d.ts +14 -0
- package/dist/types/plugin.js +6 -0
- package/dist/types/redis.d.ts +71 -0
- package/dist/types/redis.js +4 -0
- package/{types/roleApisCache.ts → dist/types/roleApisCache.d.ts} +0 -2
- package/dist/types/roleApisCache.js +8 -0
- package/dist/types/sync.d.ts +92 -0
- package/dist/types/sync.js +4 -0
- package/dist/types/table.d.ts +34 -0
- package/dist/types/table.js +4 -0
- package/dist/types/validate.d.ts +67 -0
- package/dist/types/validate.js +4 -0
- package/dist/utils/arrayKeysToCamel.d.ts +13 -0
- package/{utils/arrayKeysToCamel.ts → dist/utils/arrayKeysToCamel.js} +4 -4
- package/dist/utils/calcPerfTime.d.ts +4 -0
- package/{utils/calcPerfTime.ts → dist/utils/calcPerfTime.js} +3 -3
- package/dist/utils/configTypes.d.ts +1 -0
- package/dist/utils/configTypes.js +1 -0
- package/dist/utils/convertBigIntFields.d.ts +11 -0
- package/{utils/convertBigIntFields.ts → dist/utils/convertBigIntFields.js} +5 -9
- package/dist/utils/cors.d.ts +8 -0
- package/{utils/cors.ts → dist/utils/cors.js} +1 -3
- package/dist/utils/disableMenusGlob.d.ts +13 -0
- package/{utils/disableMenusGlob.ts → dist/utils/disableMenusGlob.js} +9 -29
- package/dist/utils/fieldClear.d.ts +11 -0
- package/{utils/fieldClear.ts → dist/utils/fieldClear.js} +15 -33
- package/dist/utils/genShortId.d.ts +10 -0
- package/{utils/genShortId.ts → dist/utils/genShortId.js} +1 -1
- package/dist/utils/getClientIp.d.ts +6 -0
- package/{utils/getClientIp.ts → dist/utils/getClientIp.js} +1 -7
- package/dist/utils/importDefault.d.ts +1 -0
- package/dist/utils/importDefault.js +29 -0
- package/dist/utils/isDirentDirectory.d.ts +2 -0
- package/{utils/isDirentDirectory.ts → dist/utils/isDirentDirectory.js} +3 -8
- package/dist/utils/keysToCamel.d.ts +10 -0
- package/{utils/keysToCamel.ts → dist/utils/keysToCamel.js} +4 -5
- package/dist/utils/keysToSnake.d.ts +10 -0
- package/{utils/keysToSnake.ts → dist/utils/keysToSnake.js} +4 -5
- package/dist/utils/loadMenuConfigs.d.ts +5 -0
- package/{utils/loadMenuConfigs.ts → dist/utils/loadMenuConfigs.js} +22 -49
- package/dist/utils/pickFields.d.ts +4 -0
- package/{utils/pickFields.ts → dist/utils/pickFields.js} +2 -5
- package/dist/utils/process.d.ts +24 -0
- package/{utils/process.ts → dist/utils/process.js} +2 -18
- package/dist/utils/processFields.d.ts +4 -0
- package/{utils/processFields.ts → dist/utils/processFields.js} +4 -8
- package/dist/utils/regex.d.ts +145 -0
- package/{configs/presetRegexp.ts → dist/utils/regex.js} +8 -31
- package/dist/utils/response.d.ts +20 -0
- package/{utils/response.ts → dist/utils/response.js} +27 -48
- package/dist/utils/scanAddons.d.ts +17 -0
- package/{utils/scanAddons.ts → dist/utils/scanAddons.js} +4 -38
- package/dist/utils/scanConfig.d.ts +26 -0
- package/{utils/scanConfig.ts → dist/utils/scanConfig.js} +22 -59
- package/dist/utils/scanFiles.d.ts +30 -0
- package/{utils/scanFiles.ts → dist/utils/scanFiles.js} +25 -65
- package/dist/utils/scanSources.d.ts +10 -0
- package/{utils/scanSources.ts → dist/utils/scanSources.js} +16 -39
- package/dist/utils/sortModules.d.ts +28 -0
- package/{utils/sortModules.ts → dist/utils/sortModules.js} +24 -64
- package/dist/utils/sqlLog.d.ts +14 -0
- package/{utils/sqlLog.ts → dist/utils/sqlLog.js} +2 -14
- package/package.json +15 -32
- package/.gitignore +0 -0
- package/bunfig.toml +0 -3
- package/docs/README.md +0 -98
- package/docs/api/api.md +0 -1921
- package/docs/guide/examples.md +0 -926
- package/docs/guide/quickstart.md +0 -354
- package/docs/hooks/auth.md +0 -38
- package/docs/hooks/cors.md +0 -28
- package/docs/hooks/hook.md +0 -838
- package/docs/hooks/parser.md +0 -19
- package/docs/hooks/rateLimit.md +0 -47
- package/docs/infra/redis.md +0 -628
- package/docs/plugins/cipher.md +0 -61
- package/docs/plugins/database.md +0 -189
- package/docs/plugins/plugin.md +0 -986
- package/docs/reference/addon.md +0 -510
- package/docs/reference/config.md +0 -573
- package/docs/reference/logger.md +0 -495
- package/docs/reference/sync.md +0 -478
- package/docs/reference/table.md +0 -763
- package/docs/reference/validator.md +0 -620
- package/lib/asyncContext.ts +0 -43
- package/plugins/config.ts +0 -13
- package/router/api.ts +0 -130
- package/tsconfig.json +0 -54
- package/types/database.d.ts +0 -541
- package/types/hook.d.ts +0 -25
- package/types/jwt.d.ts +0 -118
- package/types/logger.d.ts +0 -65
- package/types/plugin.d.ts +0 -19
- package/types/redis.d.ts +0 -83
- package/types/sync.d.ts +0 -398
- package/types/table.d.ts +0 -216
- package/types/validate.d.ts +0 -69
- package/utils/configTypes.ts +0 -3
- package/utils/importDefault.ts +0 -21
|
@@ -1,42 +1,29 @@
|
|
|
1
|
-
import type { BeflyContext } from "../types/befly.js";
|
|
2
|
-
import type { SyncApiItem } from "../types/sync.js";
|
|
3
|
-
|
|
4
1
|
import { keyBy } from "es-toolkit/array";
|
|
5
|
-
|
|
6
2
|
import { Logger } from "../lib/logger.js";
|
|
7
|
-
|
|
8
|
-
export async function syncApi(ctx: Pick<BeflyContext, "db" | "cache">, apis: SyncApiItem[]): Promise<void> {
|
|
3
|
+
export async function syncApi(ctx, apis) {
|
|
9
4
|
const tableName = "addon_admin_api";
|
|
10
|
-
|
|
11
5
|
if (!ctx.db) {
|
|
12
6
|
throw new Error("syncApi: ctx.db 未初始化(Db 插件未加载或注入失败)");
|
|
13
7
|
}
|
|
14
|
-
|
|
15
8
|
if (!ctx.cache) {
|
|
16
9
|
throw new Error("syncApi: ctx.cache 未初始化(cache 插件未加载或注入失败)");
|
|
17
10
|
}
|
|
18
|
-
|
|
19
11
|
if (!(await ctx.db.tableExists(tableName)).data) {
|
|
20
12
|
Logger.debug(`${tableName} 表不存在`);
|
|
21
13
|
return;
|
|
22
14
|
}
|
|
23
|
-
|
|
24
15
|
const allDbApis = await ctx.db.getAll({
|
|
25
16
|
table: tableName,
|
|
26
17
|
fields: ["id", "routePath", "name", "addonName", "state"],
|
|
27
18
|
where: { state$gte: 0 }
|
|
28
|
-
}
|
|
29
|
-
|
|
19
|
+
});
|
|
30
20
|
const dbLists = allDbApis.data.lists || [];
|
|
31
|
-
const allDbApiMap = keyBy(dbLists, (item
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
const delData: number[] = [];
|
|
36
|
-
|
|
21
|
+
const allDbApiMap = keyBy(dbLists, (item) => item.routePath);
|
|
22
|
+
const insData = [];
|
|
23
|
+
const updData = [];
|
|
24
|
+
const delData = [];
|
|
37
25
|
// 1) 先构建当前扫描到的 routePath 集合(用于删除差集)
|
|
38
|
-
const apiRouteKeys = new Set
|
|
39
|
-
|
|
26
|
+
const apiRouteKeys = new Set();
|
|
40
27
|
// 2) 插入 / 更新(存在不一定更新:仅当 name/routePath/addonName 任一不匹配时更新)
|
|
41
28
|
for (const api of apis) {
|
|
42
29
|
const apiType = api.type;
|
|
@@ -45,68 +32,61 @@ export async function syncApi(ctx: Pick<BeflyContext, "db" | "cache">, apis: Syn
|
|
|
45
32
|
if (apiType && apiType !== "api") {
|
|
46
33
|
continue;
|
|
47
34
|
}
|
|
48
|
-
|
|
49
35
|
const routePath = api.routePath;
|
|
50
36
|
apiRouteKeys.add(api.routePath);
|
|
51
|
-
const item =
|
|
37
|
+
const item = allDbApiMap[routePath];
|
|
52
38
|
if (item) {
|
|
53
39
|
const shouldUpdate = api.name !== item.name || api.routePath !== item.routePath || api.addonName !== item.addonName;
|
|
54
40
|
if (shouldUpdate) {
|
|
55
41
|
updData.push({ id: item.id, api: api });
|
|
56
42
|
}
|
|
57
|
-
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
58
45
|
insData.push(api);
|
|
59
46
|
}
|
|
60
47
|
}
|
|
61
|
-
|
|
62
48
|
// 3) 删除:用差集(DB - 当前扫描)得到要删除的 id
|
|
63
49
|
for (const record of dbLists) {
|
|
64
50
|
if (!apiRouteKeys.has(record.routePath)) {
|
|
65
51
|
delData.push(record.id);
|
|
66
52
|
}
|
|
67
53
|
}
|
|
68
|
-
|
|
69
54
|
if (updData.length > 0) {
|
|
70
55
|
try {
|
|
71
|
-
await ctx.db.updBatch(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
);
|
|
84
|
-
} catch (error: any) {
|
|
56
|
+
await ctx.db.updBatch(tableName, updData.map((item) => {
|
|
57
|
+
return {
|
|
58
|
+
id: item.id,
|
|
59
|
+
data: {
|
|
60
|
+
name: item.api.name,
|
|
61
|
+
routePath: item.api.routePath,
|
|
62
|
+
addonName: item.api.addonName
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
85
68
|
Logger.error({ err: error }, "同步接口批量更新失败");
|
|
86
69
|
}
|
|
87
70
|
}
|
|
88
|
-
|
|
89
71
|
if (insData.length > 0) {
|
|
90
72
|
try {
|
|
91
|
-
await ctx.db.insBatch(
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
);
|
|
101
|
-
} catch (error: any) {
|
|
73
|
+
await ctx.db.insBatch(tableName, insData.map((api) => {
|
|
74
|
+
return {
|
|
75
|
+
name: api.name,
|
|
76
|
+
routePath: api.routePath,
|
|
77
|
+
addonName: api.addonName
|
|
78
|
+
};
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
102
82
|
Logger.error({ err: error }, "同步接口批量新增失败");
|
|
103
83
|
}
|
|
104
84
|
}
|
|
105
|
-
|
|
106
85
|
if (delData.length > 0) {
|
|
107
86
|
try {
|
|
108
87
|
await ctx.db.delForceBatch(tableName, delData);
|
|
109
|
-
}
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
110
90
|
Logger.error({ err: error }, "同步接口批量删除失败");
|
|
111
91
|
}
|
|
112
92
|
}
|
|
@@ -1,16 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export async function syncCache(ctx: Pick<BeflyContext, "cache">): Promise<void> {
|
|
1
|
+
export async function syncCache(ctx) {
|
|
4
2
|
if (!ctx.cache) {
|
|
5
3
|
throw new Error("syncCache: ctx.cache 未初始化(cache 插件未加载或注入失败)");
|
|
6
4
|
}
|
|
7
|
-
|
|
8
5
|
// 1) 缓存接口列表
|
|
9
6
|
await ctx.cache.cacheApis();
|
|
10
|
-
|
|
11
7
|
// 2) 缓存菜单列表
|
|
12
8
|
await ctx.cache.cacheMenus();
|
|
13
|
-
|
|
14
9
|
// 3) 重建角色权限缓存(严格模式下要求 role.apis 必须为 pathname 字符串数组)
|
|
15
10
|
await ctx.cache.rebuildRoleApiPermissions();
|
|
16
11
|
}
|
|
@@ -1,28 +1,16 @@
|
|
|
1
|
-
import type { BeflyContext } from "../types/befly.js";
|
|
2
|
-
|
|
3
1
|
import { Cipher } from "../lib/cipher.js";
|
|
4
2
|
import { Logger } from "../lib/logger.js";
|
|
5
|
-
|
|
6
|
-
export type SyncDevConfig = {
|
|
7
|
-
devEmail?: string;
|
|
8
|
-
devPassword?: string;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export async function syncDev(ctx: BeflyContext, config: SyncDevConfig = {}): Promise<void> {
|
|
3
|
+
export async function syncDev(ctx, config = {}) {
|
|
12
4
|
if (!config.devPassword) {
|
|
13
5
|
return;
|
|
14
6
|
}
|
|
15
|
-
|
|
16
7
|
const devEmail = typeof config.devEmail === "string" && config.devEmail.length > 0 ? config.devEmail : "dev@qq.com";
|
|
17
|
-
|
|
18
8
|
if (!ctx.db) {
|
|
19
9
|
throw new Error("syncDev: ctx.db 未初始化(Db 插件未加载或注入失败)");
|
|
20
10
|
}
|
|
21
|
-
|
|
22
11
|
if (!ctx.cache) {
|
|
23
12
|
throw new Error("syncDev: ctx.cache 未初始化(cache 插件未加载或注入失败)");
|
|
24
13
|
}
|
|
25
|
-
|
|
26
14
|
if (!(await ctx.db.tableExists("addon_admin_admin")).data) {
|
|
27
15
|
Logger.debug(`addon_admin_admin 表不存在`);
|
|
28
16
|
return;
|
|
@@ -35,48 +23,36 @@ export async function syncDev(ctx: BeflyContext, config: SyncDevConfig = {}): Pr
|
|
|
35
23
|
Logger.debug(`addon_admin_menu 表不存在`);
|
|
36
24
|
return;
|
|
37
25
|
}
|
|
38
|
-
|
|
39
26
|
const allMenus = await ctx.db.getAll({
|
|
40
27
|
table: "addon_admin_menu",
|
|
41
28
|
fields: ["path"],
|
|
42
29
|
where: { state$gte: 0 },
|
|
43
30
|
orderBy: ["id#ASC"]
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const menuPaths = Array.from(new Set((allMenus.data.lists || []).map((m: any) => (typeof m?.path === "string" ? m.path.trim() : "")).filter((p: string) => p.length > 0)));
|
|
47
|
-
|
|
31
|
+
});
|
|
32
|
+
const menuPaths = Array.from(new Set((allMenus.data.lists || []).map((m) => (typeof m?.path === "string" ? m.path.trim() : "")).filter((p) => p.length > 0)));
|
|
48
33
|
const existApi = await ctx.db.tableExists("addon_admin_api");
|
|
49
|
-
let apiPaths
|
|
34
|
+
let apiPaths = [];
|
|
50
35
|
if (existApi.data) {
|
|
51
36
|
const allApis = await ctx.db.getAll({
|
|
52
37
|
table: "addon_admin_api",
|
|
53
38
|
fields: ["routePath"],
|
|
54
39
|
where: { state$gte: 0 },
|
|
55
40
|
orderBy: ["id#ASC"]
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (!routePath.startsWith("/")) {
|
|
71
|
-
throw new Error(`syncDev: addon_admin_api.routePath 必须是 pathname(以 / 开头),当前值=${routePath}`);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return routePath;
|
|
75
|
-
})
|
|
76
|
-
)
|
|
77
|
-
);
|
|
41
|
+
});
|
|
42
|
+
apiPaths = Array.from(new Set((allApis.data.lists || []).map((a) => {
|
|
43
|
+
if (typeof a?.routePath !== "string") {
|
|
44
|
+
throw new Error("syncDev: addon_admin_api.routePath 必须是字符串");
|
|
45
|
+
}
|
|
46
|
+
const routePath = a.routePath.trim();
|
|
47
|
+
if (routePath.length === 0) {
|
|
48
|
+
throw new Error("syncDev: addon_admin_api.routePath 不允许为空字符串");
|
|
49
|
+
}
|
|
50
|
+
if (!routePath.startsWith("/")) {
|
|
51
|
+
throw new Error(`syncDev: addon_admin_api.routePath 必须是 pathname(以 / 开头),当前值=${routePath}`);
|
|
52
|
+
}
|
|
53
|
+
return routePath;
|
|
54
|
+
})));
|
|
78
55
|
}
|
|
79
|
-
|
|
80
56
|
const roles = [
|
|
81
57
|
{
|
|
82
58
|
code: "dev",
|
|
@@ -111,26 +87,20 @@ export async function syncDev(ctx: BeflyContext, config: SyncDevConfig = {}): Pr
|
|
|
111
87
|
sort: 3
|
|
112
88
|
}
|
|
113
89
|
];
|
|
114
|
-
|
|
115
90
|
let devRole = null;
|
|
116
91
|
for (const roleConfig of roles) {
|
|
117
92
|
const existingRole = await ctx.db.getOne({
|
|
118
93
|
table: "addon_admin_role",
|
|
119
94
|
where: { code: roleConfig.code }
|
|
120
95
|
});
|
|
121
|
-
|
|
122
96
|
if (existingRole.data) {
|
|
123
97
|
const nextMenus = roleConfig.menus;
|
|
124
98
|
const nextApis = roleConfig.apis;
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
const
|
|
130
|
-
const apisChanged = existingApis.length !== nextApis.length || existingApis.some((v: any, i: number) => v !== nextApis[i]);
|
|
131
|
-
|
|
132
|
-
const hasChanges = (existingRole.data as any).name !== roleConfig.name || (existingRole.data as any).description !== roleConfig.description || menusChanged || apisChanged || (existingRole.data as any).sort !== roleConfig.sort;
|
|
133
|
-
|
|
99
|
+
const existingMenus = Array.isArray(existingRole.data.menus) ? existingRole.data.menus : [];
|
|
100
|
+
const existingApis = Array.isArray(existingRole.data.apis) ? existingRole.data.apis : [];
|
|
101
|
+
const menusChanged = existingMenus.length !== nextMenus.length || existingMenus.some((v, i) => v !== nextMenus[i]);
|
|
102
|
+
const apisChanged = existingApis.length !== nextApis.length || existingApis.some((v, i) => v !== nextApis[i]);
|
|
103
|
+
const hasChanges = existingRole.data.name !== roleConfig.name || existingRole.data.description !== roleConfig.description || menusChanged || apisChanged || existingRole.data.sort !== roleConfig.sort;
|
|
134
104
|
if (hasChanges) {
|
|
135
105
|
await ctx.db.updData({
|
|
136
106
|
table: "addon_admin_role",
|
|
@@ -147,7 +117,8 @@ export async function syncDev(ctx: BeflyContext, config: SyncDevConfig = {}): Pr
|
|
|
147
117
|
if (roleConfig.code === "dev") {
|
|
148
118
|
devRole = existingRole.data;
|
|
149
119
|
}
|
|
150
|
-
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
151
122
|
const roleId = await ctx.db.insData({
|
|
152
123
|
table: "addon_admin_role",
|
|
153
124
|
data: roleConfig
|
|
@@ -157,15 +128,12 @@ export async function syncDev(ctx: BeflyContext, config: SyncDevConfig = {}): Pr
|
|
|
157
128
|
}
|
|
158
129
|
}
|
|
159
130
|
}
|
|
160
|
-
|
|
161
131
|
if (!devRole) {
|
|
162
132
|
Logger.error("dev 角色不存在,无法创建开发者账号");
|
|
163
133
|
return;
|
|
164
134
|
}
|
|
165
|
-
|
|
166
135
|
const sha256Hashed = Cipher.sha256(config.devPassword + "befly");
|
|
167
136
|
const hashed = await Cipher.hashPassword(sha256Hashed);
|
|
168
|
-
|
|
169
137
|
const devData = {
|
|
170
138
|
nickname: "开发者",
|
|
171
139
|
email: devEmail,
|
|
@@ -174,19 +142,18 @@ export async function syncDev(ctx: BeflyContext, config: SyncDevConfig = {}): Pr
|
|
|
174
142
|
roleCode: "dev",
|
|
175
143
|
roleType: "admin"
|
|
176
144
|
};
|
|
177
|
-
|
|
178
145
|
const existing = await ctx.db.getOne({
|
|
179
146
|
table: "addon_admin_admin",
|
|
180
147
|
where: { email: devEmail }
|
|
181
148
|
});
|
|
182
|
-
|
|
183
149
|
if (existing.data) {
|
|
184
150
|
await ctx.db.updData({
|
|
185
151
|
table: "addon_admin_admin",
|
|
186
152
|
where: { email: devEmail },
|
|
187
153
|
data: devData
|
|
188
154
|
});
|
|
189
|
-
}
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
190
157
|
await ctx.db.insData({
|
|
191
158
|
table: "addon_admin_admin",
|
|
192
159
|
data: devData
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BeflyContext } from "../types/befly.ts";
|
|
2
|
+
import type { MenuConfig } from "../types/sync.ts";
|
|
3
|
+
type MenuDef = {
|
|
4
|
+
path: string;
|
|
5
|
+
name: string;
|
|
6
|
+
sort: number;
|
|
7
|
+
parentPath: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function syncMenu(ctx: BeflyContext, mergedMenus: MenuConfig[]): Promise<void>;
|
|
10
|
+
export declare const __test__: {
|
|
11
|
+
scanViewsDir: (viewsDir: string, prefix: string, parentPath?: string) => Promise<MenuConfig[]>;
|
|
12
|
+
flattenMenusToDefMap: (mergedMenus: MenuConfig[]) => Map<string, MenuDef>;
|
|
13
|
+
};
|
|
14
|
+
export {};
|