@arch-cadre/modules 0.0.6

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 (66) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  2. package/dist/client/extension-point-client.cjs +28 -0
  3. package/dist/client/extension-point-client.d.cts +20 -0
  4. package/dist/client/extension-point-client.d.cts.map +1 -0
  5. package/dist/client/extension-point-client.d.mts +20 -0
  6. package/dist/client/extension-point-client.d.mts.map +1 -0
  7. package/dist/client/extension-point-client.mjs +27 -0
  8. package/dist/client/extension-point-client.mjs.map +1 -0
  9. package/dist/client/extension-point.cjs +21 -0
  10. package/dist/client/extension-point.d.cts +21 -0
  11. package/dist/client/extension-point.d.cts.map +1 -0
  12. package/dist/client/extension-point.d.mts +21 -0
  13. package/dist/client/extension-point.d.mts.map +1 -0
  14. package/dist/client/extension-point.mjs +20 -0
  15. package/dist/client/extension-point.mjs.map +1 -0
  16. package/dist/client/widget-area.cjs +21 -0
  17. package/dist/client/widget-area.d.cts +19 -0
  18. package/dist/client/widget-area.d.cts.map +1 -0
  19. package/dist/client/widget-area.d.mts +19 -0
  20. package/dist/client/widget-area.d.mts.map +1 -0
  21. package/dist/client/widget-area.mjs +20 -0
  22. package/dist/client/widget-area.mjs.map +1 -0
  23. package/dist/index.cjs +22 -0
  24. package/dist/index.d.cts +6 -0
  25. package/dist/index.d.mts +6 -0
  26. package/dist/index.mjs +7 -0
  27. package/dist/server/lifecycle.cjs +192 -0
  28. package/dist/server/lifecycle.d.cts +9 -0
  29. package/dist/server/lifecycle.d.cts.map +1 -0
  30. package/dist/server/lifecycle.d.mts +9 -0
  31. package/dist/server/lifecycle.d.mts.map +1 -0
  32. package/dist/server/lifecycle.mjs +190 -0
  33. package/dist/server/lifecycle.mjs.map +1 -0
  34. package/dist/server/manage.cjs +123 -0
  35. package/dist/server/manage.d.cts +35 -0
  36. package/dist/server/manage.d.cts.map +1 -0
  37. package/dist/server/manage.d.mts +35 -0
  38. package/dist/server/manage.d.mts.map +1 -0
  39. package/dist/server/manage.mjs +117 -0
  40. package/dist/server/manage.mjs.map +1 -0
  41. package/dist/server/registry.cjs +86 -0
  42. package/dist/server/registry.d.cts +5 -0
  43. package/dist/server/registry.d.cts.map +1 -0
  44. package/dist/server/registry.d.mts +5 -0
  45. package/dist/server/registry.d.mts.map +1 -0
  46. package/dist/server/registry.mjs +86 -0
  47. package/dist/server/registry.mjs.map +1 -0
  48. package/dist/server/ui.cjs +188 -0
  49. package/dist/server/ui.d.cts +17 -0
  50. package/dist/server/ui.d.cts.map +1 -0
  51. package/dist/server/ui.d.mts +17 -0
  52. package/dist/server/ui.d.mts.map +1 -0
  53. package/dist/server/ui.mjs +178 -0
  54. package/dist/server/ui.mjs.map +1 -0
  55. package/dist/server.cjs +30 -0
  56. package/dist/server.d.cts +6 -0
  57. package/dist/server.d.mts +6 -0
  58. package/dist/server.mjs +7 -0
  59. package/dist/types.cjs +19 -0
  60. package/dist/types.d.cts +117 -0
  61. package/dist/types.d.cts.map +1 -0
  62. package/dist/types.d.mts +117 -0
  63. package/dist/types.d.mts.map +1 -0
  64. package/dist/types.mjs +19 -0
  65. package/dist/types.mjs.map +1 -0
  66. package/package.json +48 -0
@@ -0,0 +1,86 @@
1
+ "use server";
2
+
3
+ import { getModuleInstance, getModules, isModuleEnabled } from "./manage.mjs";
4
+ import { db } from "@kryo/core/server";
5
+ import { eventBus, systemModulesTable } from "@kryo/core";
6
+ import { eq } from "drizzle-orm";
7
+
8
+ //#region src/server/registry.ts
9
+ const globalForRegistry = globalThis;
10
+ async function initModules(force = false) {
11
+ if (globalForRegistry.__WINKLY_MODULES_INITIALIZED__ && !force) return;
12
+ if (force) {
13
+ console.log("[Kernel:Registry] Forcing re-initialization...");
14
+ eventBus.clearAll();
15
+ }
16
+ console.log("[Kernel:Registry] Synchronizing module listeners...");
17
+ globalForRegistry.__WINKLY_MODULES_INITIALIZED__ = true;
18
+ await eventBus.publish("system:modules:init:start", { timestamp: Date.now() });
19
+ const processedModuleIds = /* @__PURE__ */ new Set();
20
+ let hasNewModules = true;
21
+ let iterations = 0;
22
+ const MAX_ITERATIONS = 10;
23
+ while (hasNewModules && iterations < MAX_ITERATIONS) {
24
+ hasNewModules = false;
25
+ iterations++;
26
+ const pendingModules = (await getModules()).filter((mod) => !processedModuleIds.has(mod.id));
27
+ if (pendingModules.length === 0) break;
28
+ for (const mod of pendingModules) try {
29
+ await db.insert(systemModulesTable).values({
30
+ id: mod.id,
31
+ enabled: mod.system ?? false,
32
+ installed: mod.system ?? false,
33
+ system: mod.system ?? false
34
+ }).onConflictDoNothing();
35
+ } catch (e) {}
36
+ const sortedPending = [...pendingModules].sort((a, b) => a.system === b.system ? 0 : a.system ? -1 : 1);
37
+ for (const mod of sortedPending) {
38
+ processedModuleIds.add(mod.id);
39
+ hasNewModules = true;
40
+ try {
41
+ const enabled = await isModuleEnabled(mod.id);
42
+ if (!enabled) continue;
43
+ const instance = await getModuleInstance(mod.id);
44
+ if (!instance) {
45
+ console.warn(`[Kernel:Registry] No instance found for module ${mod.id}. Ensure it is registered correctly.`);
46
+ continue;
47
+ }
48
+ let dbMod = null;
49
+ try {
50
+ [dbMod] = await db.select().from(systemModulesTable).where(eq(systemModulesTable.id, mod.id));
51
+ } catch (e) {}
52
+ if (enabled && (!dbMod || !dbMod.installed)) {
53
+ console.log(`[Kernel:Registry] Installing module ${mod.id}...`);
54
+ if (instance.onMigrate) {
55
+ console.log(`[Kernel:Registry] Running onMigrate for ${mod.id}...`);
56
+ await instance.onMigrate();
57
+ }
58
+ console.log(`[Kernel:Registry] Running onEnable for ${mod.id}...`);
59
+ if (instance.onEnable) await instance.onEnable();
60
+ try {
61
+ await db.update(systemModulesTable).set({
62
+ installed: true,
63
+ lastStep: null
64
+ }).where(eq(systemModulesTable.id, mod.id));
65
+ } catch (e) {}
66
+ }
67
+ if (instance.init) {
68
+ console.log(`[Kernel:Registry] Initializing ${mod.id}...`);
69
+ await instance.init();
70
+ console.log(`[Kernel:Registry] Module ${mod.id} is active.`);
71
+ }
72
+ } catch (error) {
73
+ console.error(`[Kernel:Registry] Critical failure for ${mod.id}:`, error);
74
+ }
75
+ }
76
+ }
77
+ if (iterations >= MAX_ITERATIONS) console.warn("[Kernel:Registry] Max init iterations reached. Check for circular module registrations.");
78
+ await eventBus.publish("system:modules:init:end", {
79
+ timestamp: Date.now(),
80
+ moduleCount: processedModuleIds.size
81
+ });
82
+ }
83
+
84
+ //#endregion
85
+ export { initModules };
86
+ //# sourceMappingURL=registry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.mjs","names":[],"sources":["../../src/server/registry.ts"],"sourcesContent":["\"use server\";\n\nimport { eventBus, systemModulesTable } from \"@kryo/core\";\nimport { db } from \"@kryo/core/server\";\nimport { eq } from \"drizzle-orm\";\nimport { getModuleInstance, getModules, isModuleEnabled } from \"./manage\";\n\nconst globalForRegistry = globalThis as unknown as {\n __WINKLY_MODULES_INITIALIZED__: boolean | undefined;\n};\n\nexport async function initModules(force = false) {\n if (globalForRegistry.__WINKLY_MODULES_INITIALIZED__ && !force) return;\n\n if (force) {\n console.log(\"[Kernel:Registry] Forcing re-initialization...\");\n eventBus.clearAll();\n }\n\n console.log(\"[Kernel:Registry] Synchronizing module listeners...\");\n globalForRegistry.__WINKLY_MODULES_INITIALIZED__ = true;\n\n await eventBus.publish(\"system:modules:init:start\", {\n timestamp: Date.now(),\n });\n\n const processedModuleIds = new Set<string>();\n let hasNewModules = true;\n let iterations = 0;\n const MAX_ITERATIONS = 10; // Bezpiecznik przed nieskończoną pętlą\n\n while (hasNewModules && iterations < MAX_ITERATIONS) {\n hasNewModules = false;\n iterations++;\n\n // 1. Get ALL currently registered modules (including newly added ones)\n const currentModules = await getModules();\n\n // 2. Filter out modules that are already processed\n const pendingModules = currentModules.filter(\n (mod) => !processedModuleIds.has(mod.id),\n );\n\n if (pendingModules.length === 0) {\n break;\n }\n\n // 3. Synchronize new modules with database\n for (const mod of pendingModules) {\n try {\n await db\n .insert(systemModulesTable)\n .values({\n id: mod.id,\n enabled: mod.system ?? false,\n installed: mod.system ?? false,\n system: mod.system ?? false,\n })\n .onConflictDoNothing();\n } catch (e) {\n // Table might not exist yet\n }\n }\n\n // 4. Sort pending modules: system modules first\n const sortedPending = [...pendingModules].sort((a, b) =>\n a.system === b.system ? 0 : a.system ? -1 : 1,\n );\n\n // 5. Initialize modules\n for (const mod of sortedPending) {\n // Mark as processed immediately to avoid cycles\n processedModuleIds.add(mod.id);\n hasNewModules = true; // We processed something, so we should check again in case it added more\n\n try {\n const enabled = await isModuleEnabled(mod.id);\n if (!enabled) continue;\n\n const instance = await getModuleInstance(mod.id);\n\n if (!instance) {\n console.warn(\n `[Kernel:Registry] No instance found for module ${mod.id}. Ensure it is registered correctly.`,\n );\n continue;\n }\n\n let dbMod: any = null;\n try {\n [dbMod] = await db\n .select()\n .from(systemModulesTable)\n .where(eq(systemModulesTable.id, mod.id));\n } catch (e) {\n // Ignore missing table\n }\n\n // onEnable lifecycle\n if (enabled && (!dbMod || !dbMod.installed)) {\n console.log(`[Kernel:Registry] Installing module ${mod.id}...`);\n\n // 1. Run migrations first\n if (instance.onMigrate) {\n console.log(`[Kernel:Registry] Running onMigrate for ${mod.id}...`);\n await instance.onMigrate();\n }\n\n // 2. Run enable hook\n console.log(`[Kernel:Registry] Running onEnable for ${mod.id}...`);\n if (instance.onEnable) await instance.onEnable();\n\n try {\n await db\n .update(systemModulesTable)\n .set({ installed: true, lastStep: null })\n .where(eq(systemModulesTable.id, mod.id));\n } catch (e) {\n // Ignore missing table\n }\n }\n\n // Operational init\n if (instance.init) {\n console.log(`[Kernel:Registry] Initializing ${mod.id}...`);\n await instance.init();\n console.log(`[Kernel:Registry] Module ${mod.id} is active.`);\n }\n } catch (error) {\n console.error(\n `[Kernel:Registry] Critical failure for ${mod.id}:`,\n error,\n );\n }\n }\n }\n\n if (iterations >= MAX_ITERATIONS) {\n console.warn(\n \"[Kernel:Registry] Max init iterations reached. Check for circular module registrations.\",\n );\n }\n\n await eventBus.publish(\"system:modules:init:end\", {\n timestamp: Date.now(),\n moduleCount: processedModuleIds.size,\n });\n}\n"],"mappings":";;;;;;;;AAOA,MAAM,oBAAoB;AAI1B,eAAsB,YAAY,QAAQ,OAAO;AAC/C,KAAI,kBAAkB,kCAAkC,CAAC,MAAO;AAEhE,KAAI,OAAO;AACT,UAAQ,IAAI,iDAAiD;AAC7D,WAAS,UAAU;;AAGrB,SAAQ,IAAI,sDAAsD;AAClE,mBAAkB,iCAAiC;AAEnD,OAAM,SAAS,QAAQ,6BAA6B,EAClD,WAAW,KAAK,KAAK,EACtB,CAAC;CAEF,MAAM,qCAAqB,IAAI,KAAa;CAC5C,IAAI,gBAAgB;CACpB,IAAI,aAAa;CACjB,MAAM,iBAAiB;AAEvB,QAAO,iBAAiB,aAAa,gBAAgB;AACnD,kBAAgB;AAChB;EAMA,MAAM,kBAHiB,MAAM,YAAY,EAGH,QACnC,QAAQ,CAAC,mBAAmB,IAAI,IAAI,GAAG,CACzC;AAED,MAAI,eAAe,WAAW,EAC5B;AAIF,OAAK,MAAM,OAAO,eAChB,KAAI;AACF,SAAM,GACH,OAAO,mBAAmB,CAC1B,OAAO;IACN,IAAI,IAAI;IACR,SAAS,IAAI,UAAU;IACvB,WAAW,IAAI,UAAU;IACzB,QAAQ,IAAI,UAAU;IACvB,CAAC,CACD,qBAAqB;WACjB,GAAG;EAMd,MAAM,gBAAgB,CAAC,GAAG,eAAe,CAAC,MAAM,GAAG,MACjD,EAAE,WAAW,EAAE,SAAS,IAAI,EAAE,SAAS,KAAK,EAC7C;AAGD,OAAK,MAAM,OAAO,eAAe;AAE/B,sBAAmB,IAAI,IAAI,GAAG;AAC9B,mBAAgB;AAEhB,OAAI;IACF,MAAM,UAAU,MAAM,gBAAgB,IAAI,GAAG;AAC7C,QAAI,CAAC,QAAS;IAEd,MAAM,WAAW,MAAM,kBAAkB,IAAI,GAAG;AAEhD,QAAI,CAAC,UAAU;AACb,aAAQ,KACN,kDAAkD,IAAI,GAAG,sCAC1D;AACD;;IAGF,IAAI,QAAa;AACjB,QAAI;AACF,MAAC,SAAS,MAAM,GACb,QAAQ,CACR,KAAK,mBAAmB,CACxB,MAAM,GAAG,mBAAmB,IAAI,IAAI,GAAG,CAAC;aACpC,GAAG;AAKZ,QAAI,YAAY,CAAC,SAAS,CAAC,MAAM,YAAY;AAC3C,aAAQ,IAAI,uCAAuC,IAAI,GAAG,KAAK;AAG/D,SAAI,SAAS,WAAW;AACtB,cAAQ,IAAI,2CAA2C,IAAI,GAAG,KAAK;AACnE,YAAM,SAAS,WAAW;;AAI5B,aAAQ,IAAI,0CAA0C,IAAI,GAAG,KAAK;AAClE,SAAI,SAAS,SAAU,OAAM,SAAS,UAAU;AAEhD,SAAI;AACF,YAAM,GACH,OAAO,mBAAmB,CAC1B,IAAI;OAAE,WAAW;OAAM,UAAU;OAAM,CAAC,CACxC,MAAM,GAAG,mBAAmB,IAAI,IAAI,GAAG,CAAC;cACpC,GAAG;;AAMd,QAAI,SAAS,MAAM;AACjB,aAAQ,IAAI,kCAAkC,IAAI,GAAG,KAAK;AAC1D,WAAM,SAAS,MAAM;AACrB,aAAQ,IAAI,4BAA4B,IAAI,GAAG,aAAa;;YAEvD,OAAO;AACd,YAAQ,MACN,0CAA0C,IAAI,GAAG,IACjD,MACD;;;;AAKP,KAAI,cAAc,eAChB,SAAQ,KACN,0FACD;AAGH,OAAM,SAAS,QAAQ,2BAA2B;EAChD,WAAW,KAAK,KAAK;EACrB,aAAa,mBAAmB;EACjC,CAAC"}
@@ -0,0 +1,188 @@
1
+ "use server";
2
+
3
+ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
4
+ const require_manage = require('./manage.cjs');
5
+ let _kryo_core_server = require("@kryo/core/server");
6
+
7
+ //#region src/server/ui.ts
8
+ /**
9
+ * Helper to check and filter a navigation item based on roles and permissions.
10
+ * Returns the item (potentially with filtered sub-items) or null if access is denied.
11
+ */
12
+ function filterNavItem(item, userRoles, userPermissions) {
13
+ if (item.roles && item.roles.length > 0) {
14
+ if (!item.roles.some((role) => userRoles.includes(role))) return null;
15
+ }
16
+ if (item.permissions && item.permissions.length > 0) {
17
+ if (!item.permissions.every((perm) => userPermissions.includes(perm))) return null;
18
+ }
19
+ if (item.items && item.items.length > 0) {
20
+ const filteredSubItems = item.items.map((subItem) => filterNavItem(subItem, userRoles, userPermissions)).filter((subItem) => subItem !== null);
21
+ return {
22
+ ...item,
23
+ items: filteredSubItems
24
+ };
25
+ }
26
+ return item;
27
+ }
28
+ async function getModuleNavigationGrouped(type) {
29
+ const { user } = await (0, _kryo_core_server.getCurrentSession)();
30
+ const userRoles = user?.roles || [];
31
+ const userPermissions = user?.permissions || [];
32
+ const active = (await require_manage.getModules()).filter((m) => m.enabled);
33
+ const groups = {};
34
+ for (const mod of active) try {
35
+ const instanceNav = (await require_manage.getModuleInstance(mod.id))?.navigation?.[type];
36
+ if (instanceNav) for (const [groupName, items] of Object.entries(instanceNav)) {
37
+ if (!groups[groupName]) groups[groupName] = [];
38
+ for (const rawItem of items) {
39
+ const item = filterNavItem(rawItem, userRoles, userPermissions);
40
+ if (item && !groups[groupName].some((existing) => existing.url === item.url)) groups[groupName].push(item);
41
+ }
42
+ }
43
+ } catch (_e) {
44
+ console.warn(`[Kernel:UI] Failed to load navigation for module ${mod.id}:`, _e);
45
+ }
46
+ return groups;
47
+ }
48
+ async function getKryoPathPrefix() {
49
+ try {
50
+ await (0, _kryo_core_server.ensureSystemInitialized)();
51
+ return (await require_manage.getModuleConfig("kryo-panel"))?.pathPrefix ?? "/kryo";
52
+ } catch (e) {
53
+ return "/kryo";
54
+ }
55
+ }
56
+ async function getKryoModuleNavigationGrouped(type) {
57
+ const groups = await getModuleNavigationGrouped(type);
58
+ const prefix = await getKryoPathPrefix();
59
+ const prefixUrl = (url) => {
60
+ if (url.startsWith(prefix)) return url;
61
+ return url === "/" ? prefix : `${prefix}${url}`;
62
+ };
63
+ const processItems = (items) => {
64
+ return items.map((item) => ({
65
+ ...item,
66
+ url: prefixUrl(item.url),
67
+ items: item.items ? processItems(item.items) : void 0
68
+ }));
69
+ };
70
+ const transformedGroups = {};
71
+ for (const [group, items] of Object.entries(groups)) transformedGroups[group] = processItems(items);
72
+ return transformedGroups;
73
+ }
74
+ async function getModuleNavigation(type) {
75
+ await (0, _kryo_core_server.ensureSystemInitialized)();
76
+ const { user } = await (0, _kryo_core_server.getCurrentSession)();
77
+ const userRoles = user?.roles || [];
78
+ const userPermissions = user?.permissions || [];
79
+ const active = (await require_manage.getModules()).filter((m) => m.enabled);
80
+ const all = [];
81
+ for (const mod of active) try {
82
+ const instance = await require_manage.getModuleInstance(mod.id);
83
+ if (instance?.navigation?.[type]) {
84
+ const items = instance.navigation[type];
85
+ for (const rawItem of items) {
86
+ const item = filterNavItem(rawItem, userRoles, userPermissions);
87
+ if (item) all.push(item);
88
+ }
89
+ }
90
+ } catch {}
91
+ return all;
92
+ }
93
+ async function getPublicModuleRoutes() {
94
+ await (0, _kryo_core_server.ensureSystemInitialized)();
95
+ const active = (await require_manage.getModules()).filter((m) => m.enabled);
96
+ const allRoutes = [];
97
+ for (const mod of active) try {
98
+ const instance = await require_manage.getModuleInstance(mod.id);
99
+ if (instance?.routes?.public) allRoutes.push(...instance.routes.public);
100
+ } catch {}
101
+ return allRoutes;
102
+ }
103
+ async function getPrivateModuleRoutes() {
104
+ await (0, _kryo_core_server.ensureSystemInitialized)();
105
+ const active = (await require_manage.getModules()).filter((m) => m.enabled);
106
+ const allRoutes = [];
107
+ for (const mod of active) try {
108
+ const instance = await require_manage.getModuleInstance(mod.id);
109
+ if (instance?.routes?.private) allRoutes.push(...instance.routes.private);
110
+ } catch {}
111
+ return allRoutes;
112
+ }
113
+ async function getKryoModuleRoutes() {
114
+ const routes = await getPrivateModuleRoutes();
115
+ const prefix = await getKryoPathPrefix();
116
+ return routes.map((route) => ({
117
+ ...route,
118
+ path: route.path === "/" ? prefix : `${prefix}${route.path}`
119
+ }));
120
+ }
121
+ async function getApiModuleRoutes() {
122
+ await (0, _kryo_core_server.ensureSystemInitialized)();
123
+ const active = (await require_manage.getModules()).filter((m) => m.enabled);
124
+ const allRoutes = [];
125
+ for (const mod of active) try {
126
+ const instance = await require_manage.getModuleInstance(mod.id);
127
+ if (instance?.routes?.api) allRoutes.push(...instance.routes.api);
128
+ } catch {}
129
+ return allRoutes;
130
+ }
131
+ async function getModuleWidgets(area) {
132
+ await (0, _kryo_core_server.ensureSystemInitialized)();
133
+ const active = (await require_manage.getModules()).filter((m) => m.enabled);
134
+ const widgets = [];
135
+ for (const mod of active) try {
136
+ const instance = await require_manage.getModuleInstance(mod.id);
137
+ if (instance?.widgets) {
138
+ const matching = instance.widgets.filter((w) => w.area === area);
139
+ widgets.push(...matching);
140
+ }
141
+ } catch (_e) {}
142
+ return widgets.sort((a, b) => (a.priority || 0) - (b.priority || 0));
143
+ }
144
+ async function getExtensions(targetModule, point) {
145
+ await (0, _kryo_core_server.ensureSystemInitialized)();
146
+ const active = (await require_manage.getModules()).filter((m) => m.enabled);
147
+ const extensions = [];
148
+ for (const mod of active) try {
149
+ const instance = await require_manage.getModuleInstance(mod.id);
150
+ if (instance?.extensions) {
151
+ const matching = instance.extensions.filter((ext) => {
152
+ const isTarget = ext.targetModule === targetModule;
153
+ const isPoint = point ? ext.point === point : true;
154
+ return isTarget && isPoint;
155
+ });
156
+ extensions.push(...matching);
157
+ }
158
+ } catch (_e) {}
159
+ return extensions.sort((a, b) => (a.priority || 0) - (b.priority || 0));
160
+ }
161
+ async function hasExtension(targetModule, point) {
162
+ await (0, _kryo_core_server.ensureSystemInitialized)();
163
+ const active = (await require_manage.getModules()).filter((m) => m.enabled);
164
+ for (const mod of active) try {
165
+ const instance = await require_manage.getModuleInstance(mod.id);
166
+ if (instance?.extensions) {
167
+ if (instance.extensions.filter((ext) => {
168
+ const isTarget = ext.targetModule === targetModule;
169
+ const isPoint = point ? ext.point === point : true;
170
+ return isTarget && isPoint;
171
+ }).length > 0) return true;
172
+ }
173
+ } catch (_e) {}
174
+ return false;
175
+ }
176
+
177
+ //#endregion
178
+ exports.getApiModuleRoutes = getApiModuleRoutes;
179
+ exports.getExtensions = getExtensions;
180
+ exports.getKryoModuleNavigationGrouped = getKryoModuleNavigationGrouped;
181
+ exports.getKryoModuleRoutes = getKryoModuleRoutes;
182
+ exports.getKryoPathPrefix = getKryoPathPrefix;
183
+ exports.getModuleNavigation = getModuleNavigation;
184
+ exports.getModuleNavigationGrouped = getModuleNavigationGrouped;
185
+ exports.getModuleWidgets = getModuleWidgets;
186
+ exports.getPrivateModuleRoutes = getPrivateModuleRoutes;
187
+ exports.getPublicModuleRoutes = getPublicModuleRoutes;
188
+ exports.hasExtension = hasExtension;
@@ -0,0 +1,17 @@
1
+ import { ApiRouteDefinition, ModuleExtension, ModuleNavElement, ModuleWidget, PrivateRouteDefinition, PublicRouteDefinition } from "../types.cjs";
2
+
3
+ //#region src/server/ui.d.ts
4
+ declare function getModuleNavigationGrouped(type: "admin" | "settings"): Promise<Record<string, ModuleNavElement[]>>;
5
+ declare function getKryoPathPrefix(): Promise<string>;
6
+ declare function getKryoModuleNavigationGrouped(type: "admin" | "settings"): Promise<Record<string, ModuleNavElement[]>>;
7
+ declare function getModuleNavigation(type: "public"): Promise<ModuleNavElement[]>;
8
+ declare function getPublicModuleRoutes(): Promise<PublicRouteDefinition[]>;
9
+ declare function getPrivateModuleRoutes(): Promise<PrivateRouteDefinition[]>;
10
+ declare function getKryoModuleRoutes(): Promise<PrivateRouteDefinition[]>;
11
+ declare function getApiModuleRoutes(): Promise<ApiRouteDefinition[]>;
12
+ declare function getModuleWidgets(area: string): Promise<ModuleWidget[]>;
13
+ declare function getExtensions(targetModule: string, point?: string): Promise<ModuleExtension[]>;
14
+ declare function hasExtension(targetModule: string, point?: string): Promise<boolean>;
15
+ //#endregion
16
+ export { getApiModuleRoutes, getExtensions, getKryoModuleNavigationGrouped, getKryoModuleRoutes, getKryoPathPrefix, getModuleNavigation, getModuleNavigationGrouped, getModuleWidgets, getPrivateModuleRoutes, getPublicModuleRoutes, hasExtension };
17
+ //# sourceMappingURL=ui.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.cts","names":[],"sources":["../../src/server/ui.ts"],"mappings":";;;iBAqDsB,0BAAA,CAA2B,IAAA,yBAA0B,OAAA,CAAA,MAAA,SAAA,gBAAA;AAAA,iBA6CrD,iBAAA,CAAA,GAAqB,OAAA;AAAA,iBAUrB,8BAAA,CACpB,IAAA,yBAA0B,OAAA,CAAA,MAAA,SAAA,gBAAA;AAAA,iBA4BN,mBAAA,CACpB,IAAA,aACC,OAAA,CAAQ,gBAAA;AAAA,iBA2CW,qBAAA,CAAA,GAAyB,OAAA,CAC7C,qBAAA;AAAA,iBA6BoB,sBAAA,CAAA,GAA0B,OAAA,CAC9C,sBAAA;AAAA,iBA6BoB,mBAAA,CAAA,GAAuB,OAAA,CAAQ,sBAAA;AAAA,iBAU/B,kBAAA,CAAA,GAAsB,OAAA,CAAQ,kBAAA;AAAA,iBAkB9B,gBAAA,CAAiB,IAAA,WAAY,OAAA,CAAA,YAAA;AAAA,iBAuB7B,aAAA,CAAc,YAAA,UAAsB,KAAA,YAAc,OAAA,CAAA,eAAA;AAAA,iBAyBlD,YAAA,CAAa,YAAA,UAAsB,KAAA,YAAc,OAAA"}
@@ -0,0 +1,17 @@
1
+ import { ApiRouteDefinition, ModuleExtension, ModuleNavElement, ModuleWidget, PrivateRouteDefinition, PublicRouteDefinition } from "../types.mjs";
2
+
3
+ //#region src/server/ui.d.ts
4
+ declare function getModuleNavigationGrouped(type: "admin" | "settings"): Promise<Record<string, ModuleNavElement[]>>;
5
+ declare function getKryoPathPrefix(): Promise<string>;
6
+ declare function getKryoModuleNavigationGrouped(type: "admin" | "settings"): Promise<Record<string, ModuleNavElement[]>>;
7
+ declare function getModuleNavigation(type: "public"): Promise<ModuleNavElement[]>;
8
+ declare function getPublicModuleRoutes(): Promise<PublicRouteDefinition[]>;
9
+ declare function getPrivateModuleRoutes(): Promise<PrivateRouteDefinition[]>;
10
+ declare function getKryoModuleRoutes(): Promise<PrivateRouteDefinition[]>;
11
+ declare function getApiModuleRoutes(): Promise<ApiRouteDefinition[]>;
12
+ declare function getModuleWidgets(area: string): Promise<ModuleWidget[]>;
13
+ declare function getExtensions(targetModule: string, point?: string): Promise<ModuleExtension[]>;
14
+ declare function hasExtension(targetModule: string, point?: string): Promise<boolean>;
15
+ //#endregion
16
+ export { getApiModuleRoutes, getExtensions, getKryoModuleNavigationGrouped, getKryoModuleRoutes, getKryoPathPrefix, getModuleNavigation, getModuleNavigationGrouped, getModuleWidgets, getPrivateModuleRoutes, getPublicModuleRoutes, hasExtension };
17
+ //# sourceMappingURL=ui.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.mts","names":[],"sources":["../../src/server/ui.ts"],"mappings":";;;iBAqDsB,0BAAA,CAA2B,IAAA,yBAA0B,OAAA,CAAA,MAAA,SAAA,gBAAA;AAAA,iBA6CrD,iBAAA,CAAA,GAAqB,OAAA;AAAA,iBAUrB,8BAAA,CACpB,IAAA,yBAA0B,OAAA,CAAA,MAAA,SAAA,gBAAA;AAAA,iBA4BN,mBAAA,CACpB,IAAA,aACC,OAAA,CAAQ,gBAAA;AAAA,iBA2CW,qBAAA,CAAA,GAAyB,OAAA,CAC7C,qBAAA;AAAA,iBA6BoB,sBAAA,CAAA,GAA0B,OAAA,CAC9C,sBAAA;AAAA,iBA6BoB,mBAAA,CAAA,GAAuB,OAAA,CAAQ,sBAAA;AAAA,iBAU/B,kBAAA,CAAA,GAAsB,OAAA,CAAQ,kBAAA;AAAA,iBAkB9B,gBAAA,CAAiB,IAAA,WAAY,OAAA,CAAA,YAAA;AAAA,iBAuB7B,aAAA,CAAc,YAAA,UAAsB,KAAA,YAAc,OAAA,CAAA,eAAA;AAAA,iBAyBlD,YAAA,CAAa,YAAA,UAAsB,KAAA,YAAc,OAAA"}
@@ -0,0 +1,178 @@
1
+ "use server";
2
+
3
+ import { getModuleConfig, getModuleInstance, getModules } from "./manage.mjs";
4
+ import { ensureSystemInitialized, getCurrentSession } from "@kryo/core/server";
5
+
6
+ //#region src/server/ui.ts
7
+ /**
8
+ * Helper to check and filter a navigation item based on roles and permissions.
9
+ * Returns the item (potentially with filtered sub-items) or null if access is denied.
10
+ */
11
+ function filterNavItem(item, userRoles, userPermissions) {
12
+ if (item.roles && item.roles.length > 0) {
13
+ if (!item.roles.some((role) => userRoles.includes(role))) return null;
14
+ }
15
+ if (item.permissions && item.permissions.length > 0) {
16
+ if (!item.permissions.every((perm) => userPermissions.includes(perm))) return null;
17
+ }
18
+ if (item.items && item.items.length > 0) {
19
+ const filteredSubItems = item.items.map((subItem) => filterNavItem(subItem, userRoles, userPermissions)).filter((subItem) => subItem !== null);
20
+ return {
21
+ ...item,
22
+ items: filteredSubItems
23
+ };
24
+ }
25
+ return item;
26
+ }
27
+ async function getModuleNavigationGrouped(type) {
28
+ const { user } = await getCurrentSession();
29
+ const userRoles = user?.roles || [];
30
+ const userPermissions = user?.permissions || [];
31
+ const active = (await getModules()).filter((m) => m.enabled);
32
+ const groups = {};
33
+ for (const mod of active) try {
34
+ const instanceNav = (await getModuleInstance(mod.id))?.navigation?.[type];
35
+ if (instanceNav) for (const [groupName, items] of Object.entries(instanceNav)) {
36
+ if (!groups[groupName]) groups[groupName] = [];
37
+ for (const rawItem of items) {
38
+ const item = filterNavItem(rawItem, userRoles, userPermissions);
39
+ if (item && !groups[groupName].some((existing) => existing.url === item.url)) groups[groupName].push(item);
40
+ }
41
+ }
42
+ } catch (_e) {
43
+ console.warn(`[Kernel:UI] Failed to load navigation for module ${mod.id}:`, _e);
44
+ }
45
+ return groups;
46
+ }
47
+ async function getKryoPathPrefix() {
48
+ try {
49
+ await ensureSystemInitialized();
50
+ return (await getModuleConfig("kryo-panel"))?.pathPrefix ?? "/kryo";
51
+ } catch (e) {
52
+ return "/kryo";
53
+ }
54
+ }
55
+ async function getKryoModuleNavigationGrouped(type) {
56
+ const groups = await getModuleNavigationGrouped(type);
57
+ const prefix = await getKryoPathPrefix();
58
+ const prefixUrl = (url) => {
59
+ if (url.startsWith(prefix)) return url;
60
+ return url === "/" ? prefix : `${prefix}${url}`;
61
+ };
62
+ const processItems = (items) => {
63
+ return items.map((item) => ({
64
+ ...item,
65
+ url: prefixUrl(item.url),
66
+ items: item.items ? processItems(item.items) : void 0
67
+ }));
68
+ };
69
+ const transformedGroups = {};
70
+ for (const [group, items] of Object.entries(groups)) transformedGroups[group] = processItems(items);
71
+ return transformedGroups;
72
+ }
73
+ async function getModuleNavigation(type) {
74
+ await ensureSystemInitialized();
75
+ const { user } = await getCurrentSession();
76
+ const userRoles = user?.roles || [];
77
+ const userPermissions = user?.permissions || [];
78
+ const active = (await getModules()).filter((m) => m.enabled);
79
+ const all = [];
80
+ for (const mod of active) try {
81
+ const instance = await getModuleInstance(mod.id);
82
+ if (instance?.navigation?.[type]) {
83
+ const items = instance.navigation[type];
84
+ for (const rawItem of items) {
85
+ const item = filterNavItem(rawItem, userRoles, userPermissions);
86
+ if (item) all.push(item);
87
+ }
88
+ }
89
+ } catch {}
90
+ return all;
91
+ }
92
+ async function getPublicModuleRoutes() {
93
+ await ensureSystemInitialized();
94
+ const active = (await getModules()).filter((m) => m.enabled);
95
+ const allRoutes = [];
96
+ for (const mod of active) try {
97
+ const instance = await getModuleInstance(mod.id);
98
+ if (instance?.routes?.public) allRoutes.push(...instance.routes.public);
99
+ } catch {}
100
+ return allRoutes;
101
+ }
102
+ async function getPrivateModuleRoutes() {
103
+ await ensureSystemInitialized();
104
+ const active = (await getModules()).filter((m) => m.enabled);
105
+ const allRoutes = [];
106
+ for (const mod of active) try {
107
+ const instance = await getModuleInstance(mod.id);
108
+ if (instance?.routes?.private) allRoutes.push(...instance.routes.private);
109
+ } catch {}
110
+ return allRoutes;
111
+ }
112
+ async function getKryoModuleRoutes() {
113
+ const routes = await getPrivateModuleRoutes();
114
+ const prefix = await getKryoPathPrefix();
115
+ return routes.map((route) => ({
116
+ ...route,
117
+ path: route.path === "/" ? prefix : `${prefix}${route.path}`
118
+ }));
119
+ }
120
+ async function getApiModuleRoutes() {
121
+ await ensureSystemInitialized();
122
+ const active = (await getModules()).filter((m) => m.enabled);
123
+ const allRoutes = [];
124
+ for (const mod of active) try {
125
+ const instance = await getModuleInstance(mod.id);
126
+ if (instance?.routes?.api) allRoutes.push(...instance.routes.api);
127
+ } catch {}
128
+ return allRoutes;
129
+ }
130
+ async function getModuleWidgets(area) {
131
+ await ensureSystemInitialized();
132
+ const active = (await getModules()).filter((m) => m.enabled);
133
+ const widgets = [];
134
+ for (const mod of active) try {
135
+ const instance = await getModuleInstance(mod.id);
136
+ if (instance?.widgets) {
137
+ const matching = instance.widgets.filter((w) => w.area === area);
138
+ widgets.push(...matching);
139
+ }
140
+ } catch (_e) {}
141
+ return widgets.sort((a, b) => (a.priority || 0) - (b.priority || 0));
142
+ }
143
+ async function getExtensions(targetModule, point) {
144
+ await ensureSystemInitialized();
145
+ const active = (await getModules()).filter((m) => m.enabled);
146
+ const extensions = [];
147
+ for (const mod of active) try {
148
+ const instance = await getModuleInstance(mod.id);
149
+ if (instance?.extensions) {
150
+ const matching = instance.extensions.filter((ext) => {
151
+ const isTarget = ext.targetModule === targetModule;
152
+ const isPoint = point ? ext.point === point : true;
153
+ return isTarget && isPoint;
154
+ });
155
+ extensions.push(...matching);
156
+ }
157
+ } catch (_e) {}
158
+ return extensions.sort((a, b) => (a.priority || 0) - (b.priority || 0));
159
+ }
160
+ async function hasExtension(targetModule, point) {
161
+ await ensureSystemInitialized();
162
+ const active = (await getModules()).filter((m) => m.enabled);
163
+ for (const mod of active) try {
164
+ const instance = await getModuleInstance(mod.id);
165
+ if (instance?.extensions) {
166
+ if (instance.extensions.filter((ext) => {
167
+ const isTarget = ext.targetModule === targetModule;
168
+ const isPoint = point ? ext.point === point : true;
169
+ return isTarget && isPoint;
170
+ }).length > 0) return true;
171
+ }
172
+ } catch (_e) {}
173
+ return false;
174
+ }
175
+
176
+ //#endregion
177
+ export { getApiModuleRoutes, getExtensions, getKryoModuleNavigationGrouped, getKryoModuleRoutes, getKryoPathPrefix, getModuleNavigation, getModuleNavigationGrouped, getModuleWidgets, getPrivateModuleRoutes, getPublicModuleRoutes, hasExtension };
178
+ //# sourceMappingURL=ui.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.mjs","names":[],"sources":["../../src/server/ui.ts"],"sourcesContent":["\"use server\";\n\nimport { ensureSystemInitialized, getCurrentSession } from \"@kryo/core/server\";\nimport type {\n ApiRouteDefinition,\n ModuleExtension,\n ModuleNavElement,\n ModuleNavigationGroupMap,\n ModuleWidget,\n PrivateRouteDefinition,\n PublicRouteDefinition,\n} from \"../types\";\nimport { getModuleConfig, getModuleInstance, getModules } from \"./manage\";\n\n/**\n * Helper to check and filter a navigation item based on roles and permissions.\n * Returns the item (potentially with filtered sub-items) or null if access is denied.\n */\nfunction filterNavItem(\n item: ModuleNavElement,\n userRoles: string[],\n userPermissions: string[],\n): ModuleNavElement | null {\n // 1. Check access for the item itself\n if (item.roles && item.roles.length > 0) {\n if (!item.roles.some((role) => userRoles.includes(role))) {\n return null;\n }\n }\n\n if (item.permissions && item.permissions.length > 0) {\n if (!item.permissions.every((perm) => userPermissions.includes(perm))) {\n return null;\n }\n }\n\n // 2. Recursively filter sub-items if they exist\n if (item.items && item.items.length > 0) {\n const filteredSubItems = item.items\n .map((subItem) =>\n filterNavItem(subItem as any, userRoles, userPermissions),\n )\n .filter((subItem): subItem is ModuleNavElement => subItem !== null);\n\n return {\n ...item,\n items: filteredSubItems as any,\n };\n }\n\n return item;\n}\n\nexport async function getModuleNavigationGrouped(type: \"admin\" | \"settings\") {\n // await ensureSystemInitialized();\n // const { getCurrentSession } = await import(\"../auth/session\");\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n\n const { user } = await getCurrentSession();\n const userRoles = user?.roles || [];\n const userPermissions = user?.permissions || [];\n\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const groups: Record<string, ModuleNavElement[]> = {};\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n // 1. From instance\n const instanceNav = instance?.navigation?.[type];\n if (instanceNav) {\n for (const [groupName, items] of Object.entries(\n instanceNav as ModuleNavigationGroupMap,\n )) {\n if (!groups[groupName]) groups[groupName] = [];\n for (const rawItem of items) {\n const item = filterNavItem(rawItem, userRoles, userPermissions);\n if (\n item &&\n !groups[groupName].some((existing) => existing.url === item.url)\n ) {\n groups[groupName].push(item);\n }\n }\n }\n }\n } catch (_e) {\n console.warn(\n `[Kernel:UI] Failed to load navigation for module ${mod.id}:`,\n _e,\n );\n }\n }\n return groups;\n}\n\nexport async function getKryoPathPrefix(): Promise<string> {\n try {\n await ensureSystemInitialized();\n const config = await getModuleConfig<{ pathPrefix: string }>(\"kryo-panel\");\n return config?.pathPrefix ?? \"/kryo\";\n } catch (e) {\n return \"/kryo\";\n }\n}\n\nexport async function getKryoModuleNavigationGrouped(\n type: \"admin\" | \"settings\",\n) {\n const groups = await getModuleNavigationGrouped(type);\n const prefix = await getKryoPathPrefix();\n\n const prefixUrl = (url: string) => {\n if (url.startsWith(prefix)) return url;\n return url === \"/\" ? prefix : `${prefix}${url}`;\n };\n\n const processItems = (items: ModuleNavElement[]): ModuleNavElement[] => {\n return items.map((item) => ({\n ...item,\n url: prefixUrl(item.url),\n items: item.items\n ? processItems(item.items as ModuleNavElement[])\n : undefined,\n })) as ModuleNavElement[];\n };\n\n const transformedGroups: Record<string, ModuleNavElement[]> = {};\n for (const [group, items] of Object.entries(groups)) {\n transformedGroups[group] = processItems(items);\n }\n\n return transformedGroups;\n}\n\nexport async function getModuleNavigation(\n type: \"public\",\n): Promise<ModuleNavElement[]> {\n await ensureSystemInitialized();\n // const { getCurrentSession } = await import(\"../auth/session\");\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n\n const { user } = await getCurrentSession();\n const userRoles = user?.roles || [];\n const userPermissions = user?.permissions || [];\n\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const all: ModuleNavElement[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n if (instance?.navigation?.[type]) {\n const items = instance.navigation[type] as ModuleNavElement[];\n for (const rawItem of items) {\n const item = filterNavItem(rawItem, userRoles, userPermissions);\n if (item) all.push(item);\n }\n }\n\n // if (!instance?.navigation?.[type]) {\n // const navModule = await import(`@/modules/${mod.id}/navigation`).catch(\n // () => null,\n // );\n // if (navModule?.navigation?.[type]) {\n // const items = navModule.navigation[type] as ModuleNavElement[];\n // for (const rawItem of items) {\n // const item = filterNavItem(rawItem, userRoles, userPermissions);\n // if (item) {\n // all.push(item);\n // }\n // }\n // }\n // }\n } catch {}\n }\n return all;\n}\n\nexport async function getPublicModuleRoutes(): Promise<\n PublicRouteDefinition[]\n> {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const allRoutes: PublicRouteDefinition[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n // 1. Try from instance (if pre-defined)\n if (instance?.routes?.public) {\n allRoutes.push(...instance.routes.public);\n } else {\n // 2. Try loading from a dedicated routes file (better for bundling)\n // const routesModule = await import(`@/modules/${mod.id}/routes`).catch(\n // () => null,\n // );\n // if (routesModule?.publicRoutes) {\n // allRoutes.push(...routesModule.publicRoutes);\n // }\n }\n } catch {}\n }\n return allRoutes;\n}\n\nexport async function getPrivateModuleRoutes(): Promise<\n PrivateRouteDefinition[]\n> {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const allRoutes: PrivateRouteDefinition[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n // 1. Try from instance\n if (instance?.routes?.private) {\n allRoutes.push(...instance.routes.private);\n } else {\n // 2. Try from routes file\n // const routesModule = await import(`@/modules/${mod.id}/routes`).catch(\n // () => null,\n // );\n // if (routesModule?.privateRoutes) {\n // allRoutes.push(...routesModule.privateRoutes);\n // }\n }\n } catch {}\n }\n return allRoutes;\n}\n\nexport async function getKryoModuleRoutes(): Promise<PrivateRouteDefinition[]> {\n const routes = await getPrivateModuleRoutes();\n const prefix = await getKryoPathPrefix();\n\n return routes.map((route) => ({\n ...route,\n path: route.path === \"/\" ? prefix : `${prefix}${route.path}`,\n }));\n}\n\nexport async function getApiModuleRoutes(): Promise<ApiRouteDefinition[]> {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const allRoutes: ApiRouteDefinition[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n if (instance?.routes?.api) {\n allRoutes.push(...instance.routes.api);\n }\n } catch {}\n }\n return allRoutes;\n}\n\nexport async function getModuleWidgets(area: string) {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const widgets: ModuleWidget[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n if (instance?.widgets) {\n const matching = instance.widgets.filter(\n (w: ModuleWidget) => w.area === area,\n );\n widgets.push(...matching);\n }\n } catch (_e) {}\n }\n\n return widgets.sort((a, b) => (a.priority || 0) - (b.priority || 0));\n}\n\nexport async function getExtensions(targetModule: string, point?: string) {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const extensions: ModuleExtension[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n if (instance?.extensions) {\n const matching = instance.extensions.filter((ext: ModuleExtension) => {\n const isTarget = ext.targetModule === targetModule;\n const isPoint = point ? ext.point === point : true;\n return isTarget && isPoint;\n });\n extensions.push(...matching);\n }\n } catch (_e) {}\n }\n\n return extensions.sort((a, b) => (a.priority || 0) - (b.priority || 0));\n}\n\nexport async function hasExtension(targetModule: string, point?: string) {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n if (instance?.extensions) {\n const matching = instance.extensions.filter((ext: ModuleExtension) => {\n const isTarget = ext.targetModule === targetModule;\n const isPoint = point ? ext.point === point : true;\n return isTarget && isPoint;\n });\n if (matching.length > 0) return true;\n }\n } catch (_e) {}\n }\n\n return false;\n}\n"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_types = require('./types.cjs');
3
+ const require_manage = require('./server/manage.cjs');
4
+ const require_ui = require('./server/ui.cjs');
5
+ const require_lifecycle = require('./server/lifecycle.cjs');
6
+ const require_registry = require('./server/registry.cjs');
7
+
8
+ exports.ModuleManifestSchema = require_types.ModuleManifestSchema;
9
+ exports.getApiModuleRoutes = require_ui.getApiModuleRoutes;
10
+ exports.getExtensions = require_ui.getExtensions;
11
+ exports.getKryoModuleNavigationGrouped = require_ui.getKryoModuleNavigationGrouped;
12
+ exports.getKryoModuleRoutes = require_ui.getKryoModuleRoutes;
13
+ exports.getKryoPathPrefix = require_ui.getKryoPathPrefix;
14
+ exports.getModuleConfig = require_manage.getModuleConfig;
15
+ exports.getModuleInstance = require_manage.getModuleInstance;
16
+ exports.getModuleNavigation = require_ui.getModuleNavigation;
17
+ exports.getModuleNavigationGrouped = require_ui.getModuleNavigationGrouped;
18
+ exports.getModuleStatus = require_manage.getModuleStatus;
19
+ exports.getModuleWidgets = require_ui.getModuleWidgets;
20
+ exports.getModules = require_manage.getModules;
21
+ exports.getPrivateModuleRoutes = require_ui.getPrivateModuleRoutes;
22
+ exports.getPublicModuleRoutes = require_ui.getPublicModuleRoutes;
23
+ exports.hasExtension = require_ui.hasExtension;
24
+ exports.initModules = require_registry.initModules;
25
+ exports.initOperationalModules = require_lifecycle.initOperationalModules;
26
+ exports.isModuleEnabled = require_manage.isModuleEnabled;
27
+ exports.pushModuleSchema = require_lifecycle.pushModuleSchema;
28
+ exports.registerModules = require_manage.registerModules;
29
+ exports.toggleModuleState = require_lifecycle.toggleModuleState;
30
+ exports.updateModuleConfig = require_manage.updateModuleConfig;
@@ -0,0 +1,6 @@
1
+ import { ApiRouteDefinition, IModule, ModuleExtension, ModuleManifest, ModuleManifestSchema, ModuleNavElement, ModuleNavigation, ModuleNavigationGroupMap, ModulePageProps, ModuleRouteDefinition, ModuleWidget, PrivateRouteDefinition, PublicRouteDefinition, SidebarGroupType, SidebarMenuItemType, SidebarMenuType, SystemEvent } from "./types.cjs";
2
+ import { getApiModuleRoutes, getExtensions, getKryoModuleNavigationGrouped, getKryoModuleRoutes, getKryoPathPrefix, getModuleNavigation, getModuleNavigationGrouped, getModuleWidgets, getPrivateModuleRoutes, getPublicModuleRoutes, hasExtension } from "./server/ui.cjs";
3
+ import { initOperationalModules, pushModuleSchema, toggleModuleState } from "./server/lifecycle.cjs";
4
+ import { getModuleConfig, getModuleInstance, getModuleStatus, getModules, isModuleEnabled, registerModules, updateModuleConfig } from "./server/manage.cjs";
5
+ import { initModules } from "./server/registry.cjs";
6
+ export { ApiRouteDefinition, IModule, ModuleExtension, ModuleManifest, ModuleManifestSchema, ModuleNavElement, ModuleNavigation, ModuleNavigationGroupMap, ModulePageProps, ModuleRouteDefinition, ModuleWidget, PrivateRouteDefinition, PublicRouteDefinition, SidebarGroupType, SidebarMenuItemType, SidebarMenuType, SystemEvent, getApiModuleRoutes, getExtensions, getKryoModuleNavigationGrouped, getKryoModuleRoutes, getKryoPathPrefix, getModuleConfig, getModuleInstance, getModuleNavigation, getModuleNavigationGrouped, getModuleStatus, getModuleWidgets, getModules, getPrivateModuleRoutes, getPublicModuleRoutes, hasExtension, initModules, initOperationalModules, isModuleEnabled, pushModuleSchema, registerModules, toggleModuleState, updateModuleConfig };
@@ -0,0 +1,6 @@
1
+ import { ApiRouteDefinition, IModule, ModuleExtension, ModuleManifest, ModuleManifestSchema, ModuleNavElement, ModuleNavigation, ModuleNavigationGroupMap, ModulePageProps, ModuleRouteDefinition, ModuleWidget, PrivateRouteDefinition, PublicRouteDefinition, SidebarGroupType, SidebarMenuItemType, SidebarMenuType, SystemEvent } from "./types.mjs";
2
+ import { getApiModuleRoutes, getExtensions, getKryoModuleNavigationGrouped, getKryoModuleRoutes, getKryoPathPrefix, getModuleNavigation, getModuleNavigationGrouped, getModuleWidgets, getPrivateModuleRoutes, getPublicModuleRoutes, hasExtension } from "./server/ui.mjs";
3
+ import { initOperationalModules, pushModuleSchema, toggleModuleState } from "./server/lifecycle.mjs";
4
+ import { getModuleConfig, getModuleInstance, getModuleStatus, getModules, isModuleEnabled, registerModules, updateModuleConfig } from "./server/manage.mjs";
5
+ import { initModules } from "./server/registry.mjs";
6
+ export { ApiRouteDefinition, IModule, ModuleExtension, ModuleManifest, ModuleManifestSchema, ModuleNavElement, ModuleNavigation, ModuleNavigationGroupMap, ModulePageProps, ModuleRouteDefinition, ModuleWidget, PrivateRouteDefinition, PublicRouteDefinition, SidebarGroupType, SidebarMenuItemType, SidebarMenuType, SystemEvent, getApiModuleRoutes, getExtensions, getKryoModuleNavigationGrouped, getKryoModuleRoutes, getKryoPathPrefix, getModuleConfig, getModuleInstance, getModuleNavigation, getModuleNavigationGrouped, getModuleStatus, getModuleWidgets, getModules, getPrivateModuleRoutes, getPublicModuleRoutes, hasExtension, initModules, initOperationalModules, isModuleEnabled, pushModuleSchema, registerModules, toggleModuleState, updateModuleConfig };
@@ -0,0 +1,7 @@
1
+ import { ModuleManifestSchema } from "./types.mjs";
2
+ import { getModuleConfig, getModuleInstance, getModuleStatus, getModules, isModuleEnabled, registerModules, updateModuleConfig } from "./server/manage.mjs";
3
+ import { getApiModuleRoutes, getExtensions, getKryoModuleNavigationGrouped, getKryoModuleRoutes, getKryoPathPrefix, getModuleNavigation, getModuleNavigationGrouped, getModuleWidgets, getPrivateModuleRoutes, getPublicModuleRoutes, hasExtension } from "./server/ui.mjs";
4
+ import { initOperationalModules, pushModuleSchema, toggleModuleState } from "./server/lifecycle.mjs";
5
+ import { initModules } from "./server/registry.mjs";
6
+
7
+ export { ModuleManifestSchema, getApiModuleRoutes, getExtensions, getKryoModuleNavigationGrouped, getKryoModuleRoutes, getKryoPathPrefix, getModuleConfig, getModuleInstance, getModuleNavigation, getModuleNavigationGrouped, getModuleStatus, getModuleWidgets, getModules, getPrivateModuleRoutes, getPublicModuleRoutes, hasExtension, initModules, initOperationalModules, isModuleEnabled, pushModuleSchema, registerModules, toggleModuleState, updateModuleConfig };
package/dist/types.cjs ADDED
@@ -0,0 +1,19 @@
1
+ const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
2
+ let zod = require("zod");
3
+
4
+ //#region src/types.ts
5
+ const ModuleManifestSchema = zod.z.object({
6
+ id: zod.z.string(),
7
+ name: zod.z.string(),
8
+ version: zod.z.string(),
9
+ description: zod.z.string().optional(),
10
+ dependencies: zod.z.array(zod.z.string()).default([]),
11
+ extends: zod.z.array(zod.z.string()).default([]),
12
+ enabled: zod.z.boolean().default(true),
13
+ system: zod.z.boolean().default(false),
14
+ npmDependencies: zod.z.array(zod.z.string()).optional(),
15
+ npmDevDependencies: zod.z.array(zod.z.string()).optional()
16
+ });
17
+
18
+ //#endregion
19
+ exports.ModuleManifestSchema = ModuleManifestSchema;