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.
Files changed (218) 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} +8 -31
  4. package/dist/checks/checkApi.d.ts +1 -0
  5. package/{checks/checkApi.ts → dist/checks/checkApi.js} +10 -27
  6. package/dist/checks/checkHook.d.ts +1 -0
  7. package/{checks/checkHook.ts → dist/checks/checkHook.js} +10 -19
  8. package/dist/checks/checkMenu.d.ts +7 -0
  9. package/{checks/checkMenu.ts → dist/checks/checkMenu.js} +15 -50
  10. package/dist/checks/checkPlugin.d.ts +1 -0
  11. package/{checks/checkPlugin.ts → dist/checks/checkPlugin.js} +10 -19
  12. package/dist/checks/checkTable.d.ts +6 -0
  13. package/{checks/checkTable.ts → dist/checks/checkTable.js} +16 -40
  14. package/dist/configs/presetFields.d.ts +4 -0
  15. package/{configs/presetFields.ts → dist/configs/presetFields.js} +1 -1
  16. package/dist/configs/presetRegexp.d.ts +145 -0
  17. package/{utils/regex.ts → dist/configs/presetRegexp.js} +8 -31
  18. package/dist/hooks/auth.d.ts +5 -0
  19. package/{hooks/auth.ts → dist/hooks/auth.js} +5 -9
  20. package/dist/hooks/cors.d.ts +9 -0
  21. package/{hooks/cors.ts → dist/hooks/cors.js} +2 -12
  22. package/dist/hooks/parser.d.ts +12 -0
  23. package/{hooks/parser.ts → dist/hooks/parser.js} +27 -42
  24. package/dist/hooks/permission.d.ts +12 -0
  25. package/{hooks/permission.ts → dist/hooks/permission.js} +11 -22
  26. package/dist/hooks/validator.d.ts +9 -0
  27. package/{hooks/validator.ts → dist/hooks/validator.js} +5 -12
  28. package/dist/lib/asyncContext.d.ts +21 -0
  29. package/dist/lib/asyncContext.js +27 -0
  30. package/dist/lib/cacheHelper.d.ts +95 -0
  31. package/{lib/cacheHelper.ts → dist/lib/cacheHelper.js} +43 -103
  32. package/dist/lib/cacheKeys.d.ts +23 -0
  33. package/{lib/cacheKeys.ts → dist/lib/cacheKeys.js} +5 -10
  34. package/dist/lib/cipher.d.ts +153 -0
  35. package/{lib/cipher.ts → dist/lib/cipher.js} +23 -44
  36. package/dist/lib/connect.d.ts +91 -0
  37. package/{lib/connect.ts → dist/lib/connect.js} +46 -87
  38. package/dist/lib/dbDialect.d.ts +87 -0
  39. package/{lib/dbDialect.ts → dist/lib/dbDialect.js} +32 -112
  40. package/dist/lib/dbHelper.d.ts +204 -0
  41. package/{lib/dbHelper.ts → dist/lib/dbHelper.js} +73 -230
  42. package/dist/lib/dbUtils.d.ts +68 -0
  43. package/{lib/dbUtils.ts → dist/lib/dbUtils.js} +49 -123
  44. package/dist/lib/jwt.d.ts +13 -0
  45. package/{lib/jwt.ts → dist/lib/jwt.js} +11 -32
  46. package/dist/lib/logger.d.ts +32 -0
  47. package/{lib/logger.ts → dist/lib/logger.js} +201 -278
  48. package/dist/lib/redisHelper.d.ts +185 -0
  49. package/{lib/redisHelper.ts → dist/lib/redisHelper.js} +95 -139
  50. package/dist/lib/sqlBuilder.d.ts +160 -0
  51. package/{lib/sqlBuilder.ts → dist/lib/sqlBuilder.js} +131 -277
  52. package/dist/lib/sqlCheck.d.ts +23 -0
  53. package/{lib/sqlCheck.ts → dist/lib/sqlCheck.js} +24 -41
  54. package/dist/lib/validator.d.ts +45 -0
  55. package/{lib/validator.ts → dist/lib/validator.js} +43 -60
  56. package/dist/loader/loadApis.d.ts +12 -0
  57. package/{loader/loadApis.ts → dist/loader/loadApis.js} +7 -17
  58. package/dist/loader/loadHooks.d.ts +8 -0
  59. package/{loader/loadHooks.ts → dist/loader/loadHooks.js} +5 -19
  60. package/dist/loader/loadPlugins.d.ts +8 -0
  61. package/{loader/loadPlugins.ts → dist/loader/loadPlugins.js} +8 -20
  62. package/dist/main.d.ts +26 -0
  63. package/{main.ts → dist/main.js} +39 -78
  64. package/dist/paths.d.ts +93 -0
  65. package/{paths.ts → dist/paths.js} +6 -19
  66. package/dist/plugins/cache.d.ts +14 -0
  67. package/{plugins/cache.ts → dist/plugins/cache.js} +4 -11
  68. package/dist/plugins/cipher.d.ts +10 -0
  69. package/{plugins/cipher.ts → dist/plugins/cipher.js} +1 -5
  70. package/dist/plugins/config.d.ts +10 -0
  71. package/dist/plugins/config.js +6 -0
  72. package/dist/plugins/db.d.ts +14 -0
  73. package/{plugins/db.ts → dist/plugins/db.js} +5 -13
  74. package/dist/plugins/jwt.d.ts +10 -0
  75. package/{plugins/jwt.ts → dist/plugins/jwt.js} +2 -7
  76. package/dist/plugins/logger.d.ts +28 -0
  77. package/{plugins/logger.ts → dist/plugins/logger.js} +2 -7
  78. package/dist/plugins/redis.d.ts +14 -0
  79. package/{plugins/redis.ts → dist/plugins/redis.js} +4 -9
  80. package/dist/plugins/tool.d.ts +79 -0
  81. package/{plugins/tool.ts → dist/plugins/tool.js} +7 -30
  82. package/dist/router/api.d.ts +14 -0
  83. package/dist/router/api.js +107 -0
  84. package/dist/router/static.d.ts +9 -0
  85. package/{router/static.ts → dist/router/static.js} +17 -31
  86. package/dist/scripts/ensureDist.d.ts +1 -0
  87. package/dist/scripts/ensureDist.js +80 -0
  88. package/dist/sync/syncApi.d.ts +3 -0
  89. package/{sync/syncApi.ts → dist/sync/syncApi.js} +33 -53
  90. package/dist/sync/syncCache.d.ts +2 -0
  91. package/{sync/syncCache.ts → dist/sync/syncCache.js} +1 -6
  92. package/dist/sync/syncDev.d.ts +6 -0
  93. package/{sync/syncDev.ts → dist/sync/syncDev.js} +27 -60
  94. package/dist/sync/syncMenu.d.ts +14 -0
  95. package/{sync/syncMenu.ts → dist/sync/syncMenu.js} +61 -121
  96. package/dist/sync/syncTable.d.ts +151 -0
  97. package/{sync/syncTable.ts → dist/sync/syncTable.js} +168 -375
  98. package/{types → dist/types}/api.d.ts +12 -51
  99. package/dist/types/api.js +4 -0
  100. package/{types → dist/types}/befly.d.ts +32 -223
  101. package/dist/types/befly.js +4 -0
  102. package/{types → dist/types}/cache.d.ts +7 -15
  103. package/dist/types/cache.js +4 -0
  104. package/dist/types/cipher.d.ts +27 -0
  105. package/dist/types/cipher.js +7 -0
  106. package/{types → dist/types}/common.d.ts +8 -33
  107. package/dist/types/common.js +5 -0
  108. package/{types → dist/types}/context.d.ts +3 -5
  109. package/dist/types/context.js +4 -0
  110. package/{types → dist/types}/crypto.d.ts +0 -3
  111. package/dist/types/crypto.js +4 -0
  112. package/dist/types/database.d.ts +138 -0
  113. package/dist/types/database.js +4 -0
  114. package/dist/types/hook.d.ts +15 -0
  115. package/dist/types/hook.js +6 -0
  116. package/dist/types/jwt.d.ts +75 -0
  117. package/dist/types/jwt.js +4 -0
  118. package/dist/types/logger.d.ts +47 -0
  119. package/dist/types/logger.js +6 -0
  120. package/dist/types/plugin.d.ts +14 -0
  121. package/dist/types/plugin.js +6 -0
  122. package/dist/types/redis.d.ts +71 -0
  123. package/dist/types/redis.js +4 -0
  124. package/{types/roleApisCache.ts → dist/types/roleApisCache.d.ts} +0 -2
  125. package/dist/types/roleApisCache.js +8 -0
  126. package/dist/types/sync.d.ts +92 -0
  127. package/dist/types/sync.js +4 -0
  128. package/dist/types/table.d.ts +34 -0
  129. package/dist/types/table.js +4 -0
  130. package/dist/types/validate.d.ts +67 -0
  131. package/dist/types/validate.js +4 -0
  132. package/dist/utils/arrayKeysToCamel.d.ts +13 -0
  133. package/{utils/arrayKeysToCamel.ts → dist/utils/arrayKeysToCamel.js} +4 -4
  134. package/dist/utils/calcPerfTime.d.ts +4 -0
  135. package/{utils/calcPerfTime.ts → dist/utils/calcPerfTime.js} +3 -3
  136. package/dist/utils/configTypes.d.ts +1 -0
  137. package/dist/utils/configTypes.js +1 -0
  138. package/dist/utils/convertBigIntFields.d.ts +11 -0
  139. package/{utils/convertBigIntFields.ts → dist/utils/convertBigIntFields.js} +5 -9
  140. package/dist/utils/cors.d.ts +8 -0
  141. package/{utils/cors.ts → dist/utils/cors.js} +1 -3
  142. package/dist/utils/disableMenusGlob.d.ts +13 -0
  143. package/{utils/disableMenusGlob.ts → dist/utils/disableMenusGlob.js} +9 -29
  144. package/dist/utils/fieldClear.d.ts +11 -0
  145. package/{utils/fieldClear.ts → dist/utils/fieldClear.js} +15 -33
  146. package/dist/utils/genShortId.d.ts +10 -0
  147. package/{utils/genShortId.ts → dist/utils/genShortId.js} +1 -1
  148. package/dist/utils/getClientIp.d.ts +6 -0
  149. package/{utils/getClientIp.ts → dist/utils/getClientIp.js} +1 -7
  150. package/dist/utils/importDefault.d.ts +1 -0
  151. package/dist/utils/importDefault.js +29 -0
  152. package/dist/utils/isDirentDirectory.d.ts +2 -0
  153. package/{utils/isDirentDirectory.ts → dist/utils/isDirentDirectory.js} +3 -8
  154. package/dist/utils/keysToCamel.d.ts +10 -0
  155. package/{utils/keysToCamel.ts → dist/utils/keysToCamel.js} +4 -5
  156. package/dist/utils/keysToSnake.d.ts +10 -0
  157. package/{utils/keysToSnake.ts → dist/utils/keysToSnake.js} +4 -5
  158. package/dist/utils/loadMenuConfigs.d.ts +5 -0
  159. package/{utils/loadMenuConfigs.ts → dist/utils/loadMenuConfigs.js} +22 -49
  160. package/dist/utils/pickFields.d.ts +4 -0
  161. package/{utils/pickFields.ts → dist/utils/pickFields.js} +2 -5
  162. package/dist/utils/process.d.ts +24 -0
  163. package/{utils/process.ts → dist/utils/process.js} +2 -18
  164. package/dist/utils/processFields.d.ts +4 -0
  165. package/{utils/processFields.ts → dist/utils/processFields.js} +4 -8
  166. package/dist/utils/regex.d.ts +145 -0
  167. package/{configs/presetRegexp.ts → dist/utils/regex.js} +8 -31
  168. package/dist/utils/response.d.ts +20 -0
  169. package/{utils/response.ts → dist/utils/response.js} +27 -48
  170. package/dist/utils/scanAddons.d.ts +17 -0
  171. package/{utils/scanAddons.ts → dist/utils/scanAddons.js} +4 -38
  172. package/dist/utils/scanConfig.d.ts +26 -0
  173. package/{utils/scanConfig.ts → dist/utils/scanConfig.js} +22 -59
  174. package/dist/utils/scanFiles.d.ts +30 -0
  175. package/{utils/scanFiles.ts → dist/utils/scanFiles.js} +25 -65
  176. package/dist/utils/scanSources.d.ts +10 -0
  177. package/{utils/scanSources.ts → dist/utils/scanSources.js} +16 -39
  178. package/dist/utils/sortModules.d.ts +28 -0
  179. package/{utils/sortModules.ts → dist/utils/sortModules.js} +24 -64
  180. package/dist/utils/sqlLog.d.ts +14 -0
  181. package/{utils/sqlLog.ts → dist/utils/sqlLog.js} +2 -14
  182. package/package.json +15 -32
  183. package/.gitignore +0 -0
  184. package/bunfig.toml +0 -3
  185. package/docs/README.md +0 -98
  186. package/docs/api/api.md +0 -1921
  187. package/docs/guide/examples.md +0 -926
  188. package/docs/guide/quickstart.md +0 -354
  189. package/docs/hooks/auth.md +0 -38
  190. package/docs/hooks/cors.md +0 -28
  191. package/docs/hooks/hook.md +0 -838
  192. package/docs/hooks/parser.md +0 -19
  193. package/docs/hooks/rateLimit.md +0 -47
  194. package/docs/infra/redis.md +0 -628
  195. package/docs/plugins/cipher.md +0 -61
  196. package/docs/plugins/database.md +0 -189
  197. package/docs/plugins/plugin.md +0 -986
  198. package/docs/reference/addon.md +0 -510
  199. package/docs/reference/config.md +0 -573
  200. package/docs/reference/logger.md +0 -495
  201. package/docs/reference/sync.md +0 -478
  202. package/docs/reference/table.md +0 -763
  203. package/docs/reference/validator.md +0 -620
  204. package/lib/asyncContext.ts +0 -43
  205. package/plugins/config.ts +0 -13
  206. package/router/api.ts +0 -130
  207. package/tsconfig.json +0 -54
  208. package/types/database.d.ts +0 -541
  209. package/types/hook.d.ts +0 -25
  210. package/types/jwt.d.ts +0 -118
  211. package/types/logger.d.ts +0 -65
  212. package/types/plugin.d.ts +0 -19
  213. package/types/redis.d.ts +0 -83
  214. package/types/sync.d.ts +0 -398
  215. package/types/table.d.ts +0 -216
  216. package/types/validate.d.ts +0 -69
  217. package/utils/configTypes.ts +0 -3
  218. 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
- } as any);
29
-
19
+ });
30
20
  const dbLists = allDbApis.data.lists || [];
31
- const allDbApiMap = keyBy(dbLists, (item: any) => item.routePath);
32
-
33
- const insData: SyncApiItem[] = [];
34
- const updData: Array<{ id: number; api: SyncApiItem }> = [];
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<string>();
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 = (allDbApiMap as any)[routePath];
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
- } else {
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
- tableName,
73
- updData.map((item) => {
74
- return {
75
- id: item.id,
76
- data: {
77
- name: item.api.name,
78
- routePath: item.api.routePath,
79
- addonName: item.api.addonName
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
- tableName,
93
- insData.map((api) => {
94
- return {
95
- name: api.name,
96
- routePath: api.routePath,
97
- addonName: api.addonName
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
- } catch (error: any) {
88
+ }
89
+ catch (error) {
110
90
  Logger.error({ err: error }, "同步接口批量删除失败");
111
91
  }
112
92
  }
@@ -0,0 +1,2 @@
1
+ import type { BeflyContext } from "../types/befly.ts";
2
+ export declare function syncCache(ctx: Pick<BeflyContext, "cache">): Promise<void>;
@@ -1,16 +1,11 @@
1
- import type { BeflyContext } from "../types/befly.js";
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
  }
@@ -0,0 +1,6 @@
1
+ import type { BeflyContext } from "../types/befly.ts";
2
+ export type SyncDevConfig = {
3
+ devEmail?: string;
4
+ devPassword?: string;
5
+ };
6
+ export declare function syncDev(ctx: BeflyContext, config?: SyncDevConfig): Promise<void>;
@@ -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
- } as any);
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: string[] = [];
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
- } as any);
57
-
58
- apiPaths = Array.from(
59
- new Set(
60
- (allApis.data.lists || []).map((a: any) => {
61
- if (typeof a?.routePath !== "string") {
62
- throw new Error("syncDev: addon_admin_api.routePath 必须是字符串");
63
- }
64
-
65
- const routePath = a.routePath.trim();
66
- if (routePath.length === 0) {
67
- throw new Error("syncDev: addon_admin_api.routePath 不允许为空字符串");
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 existingMenus = Array.isArray((existingRole.data as any).menus) ? (existingRole.data as any).menus : [];
127
- const existingApis = Array.isArray((existingRole.data as any).apis) ? (existingRole.data as any).apis : [];
128
-
129
- const menusChanged = existingMenus.length !== nextMenus.length || existingMenus.some((v: any, i: number) => v !== nextMenus[i]);
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
- } else {
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
- } else {
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 {};