@arch-cadre/modules 0.0.25 → 0.0.26
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/dist/index.cjs +19 -5
- package/dist/index.d.cts +20 -4
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +20 -4
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +19 -4
- package/dist/index.mjs.map +1 -0
- package/dist/server.cjs +292 -19
- package/dist/server.d.cts +59 -7
- package/dist/server.d.cts.map +1 -0
- package/dist/server.d.mts +59 -7
- package/dist/server.d.mts.map +1 -0
- package/dist/server.mjs +280 -8
- package/dist/server.mjs.map +1 -0
- package/dist/ui-CCBvXMXH.cjs +441 -0
- package/dist/{types.d.cts → ui-CWGtK5lA.d.cts} +15 -2
- package/dist/ui-CWGtK5lA.d.cts.map +1 -0
- package/dist/{types.d.mts → ui-aeAUERbe.d.mts} +15 -2
- package/dist/ui-aeAUERbe.d.mts.map +1 -0
- package/dist/{server/ui.mjs → ui-lsiPxu_C.mjs} +129 -5
- package/dist/ui-lsiPxu_C.mjs.map +1 -0
- package/package.json +1 -1
- package/dist/_virtual/_rolldown/runtime.cjs +0 -29
- package/dist/client/extension-point.cjs +0 -20
- package/dist/client/extension-point.d.cts +0 -21
- package/dist/client/extension-point.d.cts.map +0 -1
- package/dist/client/extension-point.d.mts +0 -21
- package/dist/client/extension-point.d.mts.map +0 -1
- package/dist/client/extension-point.mjs +0 -20
- package/dist/client/extension-point.mjs.map +0 -1
- package/dist/client/widget-area.cjs +0 -20
- package/dist/client/widget-area.d.cts +0 -19
- package/dist/client/widget-area.d.cts.map +0 -1
- package/dist/client/widget-area.d.mts +0 -19
- package/dist/client/widget-area.d.mts.map +0 -1
- package/dist/client/widget-area.mjs +0 -20
- package/dist/client/widget-area.mjs.map +0 -1
- package/dist/server/lifecycle.cjs +0 -193
- package/dist/server/lifecycle.d.cts +0 -9
- package/dist/server/lifecycle.d.cts.map +0 -1
- package/dist/server/lifecycle.d.mts +0 -9
- package/dist/server/lifecycle.d.mts.map +0 -1
- package/dist/server/lifecycle.mjs +0 -189
- package/dist/server/lifecycle.mjs.map +0 -1
- package/dist/server/manage.cjs +0 -126
- package/dist/server/manage.d.cts +0 -31
- package/dist/server/manage.d.cts.map +0 -1
- package/dist/server/manage.d.mts +0 -31
- package/dist/server/manage.d.mts.map +0 -1
- package/dist/server/manage.mjs +0 -118
- package/dist/server/manage.mjs.map +0 -1
- package/dist/server/registry.cjs +0 -86
- package/dist/server/registry.d.cts +0 -5
- package/dist/server/registry.d.cts.map +0 -1
- package/dist/server/registry.d.mts +0 -5
- package/dist/server/registry.d.mts.map +0 -1
- package/dist/server/registry.mjs +0 -86
- package/dist/server/registry.mjs.map +0 -1
- package/dist/server/ui.cjs +0 -180
- package/dist/server/ui.d.cts +0 -17
- package/dist/server/ui.d.cts.map +0 -1
- package/dist/server/ui.d.mts +0 -17
- package/dist/server/ui.d.mts.map +0 -1
- package/dist/server/ui.mjs.map +0 -1
- package/dist/types.cjs +0 -19
- package/dist/types.d.cts.map +0 -1
- package/dist/types.d.mts.map +0 -1
- package/dist/types.mjs +0 -19
- package/dist/types.mjs.map +0 -1
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
11
|
+
key = keys[i];
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
13
|
+
__defProp(to, key, {
|
|
14
|
+
get: ((k) => from[k]).bind(null, key),
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
23
|
+
value: mod,
|
|
24
|
+
enumerable: true
|
|
25
|
+
}) : target, mod));
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
let _arch_cadre_core_server = require("@arch-cadre/core/server");
|
|
29
|
+
let node_fs_promises = require("node:fs/promises");
|
|
30
|
+
node_fs_promises = __toESM(node_fs_promises);
|
|
31
|
+
let node_path = require("node:path");
|
|
32
|
+
node_path = __toESM(node_path);
|
|
33
|
+
let _arch_cadre_core = require("@arch-cadre/core");
|
|
34
|
+
let drizzle_orm = require("drizzle-orm");
|
|
35
|
+
let zod = require("zod");
|
|
36
|
+
|
|
37
|
+
//#region src/types.ts
|
|
38
|
+
const ModuleManifestSchema = zod.z.object({
|
|
39
|
+
id: zod.z.string(),
|
|
40
|
+
name: zod.z.string(),
|
|
41
|
+
version: zod.z.string(),
|
|
42
|
+
description: zod.z.string().optional(),
|
|
43
|
+
dependencies: zod.z.array(zod.z.string()).default([]),
|
|
44
|
+
extends: zod.z.array(zod.z.string()).default([]),
|
|
45
|
+
enabled: zod.z.boolean().default(true),
|
|
46
|
+
system: zod.z.boolean().default(false),
|
|
47
|
+
npmDependencies: zod.z.array(zod.z.string()).optional(),
|
|
48
|
+
npmDevDependencies: zod.z.array(zod.z.string()).optional()
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
//#endregion
|
|
52
|
+
//#region src/server/manage.ts
|
|
53
|
+
const globalForModules = globalThis;
|
|
54
|
+
if (!globalForModules.__KRYO_REGISTERED_MODULES__) globalForModules.__KRYO_REGISTERED_MODULES__ = /* @__PURE__ */ new Map();
|
|
55
|
+
async function registerModules(modules) {
|
|
56
|
+
const store = globalForModules.__KRYO_REGISTERED_MODULES__;
|
|
57
|
+
for (const mod of modules) if (mod.manifest?.id) store.set(mod.manifest.id, mod);
|
|
58
|
+
}
|
|
59
|
+
async function getModules() {
|
|
60
|
+
try {
|
|
61
|
+
const modulesDir = await (0, _arch_cadre_core_server.getModulesDir)();
|
|
62
|
+
const manifests = [];
|
|
63
|
+
const entries = await node_fs_promises.default.readdir(modulesDir).catch(() => []);
|
|
64
|
+
for (const dir of entries) {
|
|
65
|
+
if (dir.startsWith(".")) continue;
|
|
66
|
+
try {
|
|
67
|
+
const content = await node_fs_promises.default.readFile(node_path.default.join(modulesDir, dir, "manifest.json"), "utf-8");
|
|
68
|
+
const manifest = ModuleManifestSchema.parse(JSON.parse(content));
|
|
69
|
+
manifests.push({
|
|
70
|
+
...manifest,
|
|
71
|
+
hasDocs: false
|
|
72
|
+
});
|
|
73
|
+
} catch {}
|
|
74
|
+
}
|
|
75
|
+
const store = globalForModules.__KRYO_REGISTERED_MODULES__;
|
|
76
|
+
for (const mod of store.values()) if (!manifests.some((m) => m.id === mod.manifest.id)) manifests.push({
|
|
77
|
+
...mod.manifest,
|
|
78
|
+
hasDocs: false
|
|
79
|
+
});
|
|
80
|
+
const dbModules = await _arch_cadre_core_server.db.select().from(_arch_cadre_core.systemModulesTable).catch(() => []);
|
|
81
|
+
const dbMap = new Map(dbModules.map((m) => [m.id, m]));
|
|
82
|
+
return manifests.map((mod) => {
|
|
83
|
+
const dbEntry = dbMap.get(mod.id);
|
|
84
|
+
return {
|
|
85
|
+
...mod,
|
|
86
|
+
enabled: mod.system ? true : dbEntry?.enabled ?? false,
|
|
87
|
+
installed: mod.system ? true : dbEntry?.installed ?? false,
|
|
88
|
+
lastStep: dbEntry?.lastStep,
|
|
89
|
+
hasDocs: mod.hasDocs
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
} catch {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function getModuleStatus(moduleId) {
|
|
97
|
+
try {
|
|
98
|
+
const [mod] = await _arch_cadre_core_server.db.select().from(_arch_cadre_core.systemModulesTable).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, moduleId));
|
|
99
|
+
return {
|
|
100
|
+
enabled: mod?.enabled,
|
|
101
|
+
installed: mod?.installed,
|
|
102
|
+
lastStep: mod?.lastStep
|
|
103
|
+
};
|
|
104
|
+
} catch {
|
|
105
|
+
return {
|
|
106
|
+
enabled: false,
|
|
107
|
+
installed: false,
|
|
108
|
+
lastStep: null
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function isModuleEnabled(moduleId) {
|
|
113
|
+
try {
|
|
114
|
+
const [mod] = await _arch_cadre_core_server.db.select().from(_arch_cadre_core.systemModulesTable).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, moduleId));
|
|
115
|
+
return !!mod?.enabled || !!mod?.system;
|
|
116
|
+
} catch {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async function getModuleInstance(moduleId) {
|
|
121
|
+
try {
|
|
122
|
+
const store = globalForModules.__KRYO_REGISTERED_MODULES__;
|
|
123
|
+
if (store.has(moduleId)) {
|
|
124
|
+
console.log(`[Kernel:Manage] Module "${moduleId}" found in registry.`);
|
|
125
|
+
return store.get(moduleId) || null;
|
|
126
|
+
}
|
|
127
|
+
console.log(`[Kernel:Manage] Module "${moduleId}" not in registry. Registry size: ${store.size}. Keys: ${Array.from(store.keys()).join(", ")}`);
|
|
128
|
+
if (!moduleId.startsWith(".") && !moduleId.startsWith("/")) try {
|
|
129
|
+
const mod = await import(`@arch-cadre/${moduleId}`);
|
|
130
|
+
console.log(`[Kernel:Manage] Module "${moduleId}" loaded via import().`);
|
|
131
|
+
return mod.default || mod || null;
|
|
132
|
+
} catch (e) {
|
|
133
|
+
console.warn(`[Kernel:Manage] Failed to import module "${moduleId} via import().": ${e.message}`);
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
} catch (error) {
|
|
137
|
+
console.error(`[Kernel:Manage] Error in getModuleInstance for "${moduleId}":`, error);
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function getModuleConfig(moduleId) {
|
|
142
|
+
try {
|
|
143
|
+
const [mod] = await _arch_cadre_core_server.db.select({ config: _arch_cadre_core.systemModulesTable.config }).from(_arch_cadre_core.systemModulesTable).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, moduleId));
|
|
144
|
+
if (!mod?.config) return null;
|
|
145
|
+
return JSON.parse(mod.config);
|
|
146
|
+
} catch {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async function updateModuleConfig(moduleId, config) {
|
|
151
|
+
try {
|
|
152
|
+
await _arch_cadre_core_server.db.update(_arch_cadre_core.systemModulesTable).set({ config: JSON.stringify(config) }).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, moduleId));
|
|
153
|
+
} catch (e) {
|
|
154
|
+
console.warn(`[Kernel:Manage] Failed to update config for ${moduleId}:`, e);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
//#endregion
|
|
159
|
+
//#region src/server/ui.ts
|
|
160
|
+
/**
|
|
161
|
+
* Helper to check and filter a navigation item based on roles and permissions.
|
|
162
|
+
* Returns the item (potentially with filtered sub-items) or null if access is denied.
|
|
163
|
+
*/
|
|
164
|
+
function filterNavItem(item, userRoles, userPermissions) {
|
|
165
|
+
if (item.roles && item.roles.length > 0) {
|
|
166
|
+
if (!item.roles.some((role) => userRoles.includes(role))) return null;
|
|
167
|
+
}
|
|
168
|
+
if (item.permissions && item.permissions.length > 0) {
|
|
169
|
+
if (!item.permissions.every((perm) => userPermissions.includes(perm))) return null;
|
|
170
|
+
}
|
|
171
|
+
if (item.items && item.items.length > 0) {
|
|
172
|
+
const filteredSubItems = item.items.map((subItem) => filterNavItem(subItem, userRoles, userPermissions)).filter((subItem) => subItem !== null);
|
|
173
|
+
return {
|
|
174
|
+
...item,
|
|
175
|
+
items: filteredSubItems
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return item;
|
|
179
|
+
}
|
|
180
|
+
async function getModuleNavigationGrouped(type) {
|
|
181
|
+
const { user } = await (0, _arch_cadre_core_server.getCurrentSession)();
|
|
182
|
+
const userRoles = user?.roles || [];
|
|
183
|
+
const userPermissions = user?.permissions || [];
|
|
184
|
+
const active = (await getModules()).filter((m) => m.enabled);
|
|
185
|
+
const groups = {};
|
|
186
|
+
for (const mod of active) try {
|
|
187
|
+
const instanceNav = (await getModuleInstance(mod.id))?.navigation?.[type];
|
|
188
|
+
if (instanceNav) for (const [groupName, items] of Object.entries(instanceNav)) {
|
|
189
|
+
if (!groups[groupName]) groups[groupName] = [];
|
|
190
|
+
for (const rawItem of items) {
|
|
191
|
+
const item = filterNavItem(rawItem, userRoles, userPermissions);
|
|
192
|
+
if (item && !groups[groupName].some((existing) => existing.url === item.url)) groups[groupName].push(item);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
} catch (_e) {
|
|
196
|
+
console.warn(`[Kernel:UI] Failed to load navigation for module ${mod.id}:`, _e);
|
|
197
|
+
}
|
|
198
|
+
return groups;
|
|
199
|
+
}
|
|
200
|
+
async function getKryoPathPrefix() {
|
|
201
|
+
try {
|
|
202
|
+
return (await getModuleConfig("kryo-panel"))?.pathPrefix ?? "/kryo";
|
|
203
|
+
} catch (_e) {
|
|
204
|
+
return "/kryo";
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async function getKryoModuleNavigationGrouped(type) {
|
|
208
|
+
const groups = await getModuleNavigationGrouped(type);
|
|
209
|
+
const prefix = await getKryoPathPrefix();
|
|
210
|
+
const prefixUrl = (url) => {
|
|
211
|
+
if (url.startsWith(prefix)) return url;
|
|
212
|
+
return url === "/" ? prefix : `${prefix}${url}`;
|
|
213
|
+
};
|
|
214
|
+
const processItems = (items) => {
|
|
215
|
+
return items.map((item) => ({
|
|
216
|
+
...item,
|
|
217
|
+
url: prefixUrl(item.url),
|
|
218
|
+
items: item.items ? processItems(item.items) : void 0
|
|
219
|
+
}));
|
|
220
|
+
};
|
|
221
|
+
const transformedGroups = {};
|
|
222
|
+
for (const [group, items] of Object.entries(groups)) transformedGroups[group] = processItems(items);
|
|
223
|
+
return transformedGroups;
|
|
224
|
+
}
|
|
225
|
+
async function getModuleNavigation(type) {
|
|
226
|
+
const { user } = await (0, _arch_cadre_core_server.getCurrentSession)();
|
|
227
|
+
const userRoles = user?.roles || [];
|
|
228
|
+
const userPermissions = user?.permissions || [];
|
|
229
|
+
const active = (await getModules()).filter((m) => m.enabled);
|
|
230
|
+
const all = [];
|
|
231
|
+
for (const mod of active) try {
|
|
232
|
+
const instance = await getModuleInstance(mod.id);
|
|
233
|
+
if (instance?.navigation?.[type]) {
|
|
234
|
+
const items = instance.navigation[type];
|
|
235
|
+
for (const rawItem of items) {
|
|
236
|
+
const item = filterNavItem(rawItem, userRoles, userPermissions);
|
|
237
|
+
if (item) all.push(item);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
} catch {}
|
|
241
|
+
return all;
|
|
242
|
+
}
|
|
243
|
+
async function getPublicModuleRoutes() {
|
|
244
|
+
const active = (await getModules()).filter((m) => m.enabled);
|
|
245
|
+
const allRoutes = [];
|
|
246
|
+
for (const mod of active) try {
|
|
247
|
+
const instance = await getModuleInstance(mod.id);
|
|
248
|
+
if (instance?.routes?.public) allRoutes.push(...instance.routes.public);
|
|
249
|
+
} catch {}
|
|
250
|
+
return allRoutes;
|
|
251
|
+
}
|
|
252
|
+
async function getPrivateModuleRoutes() {
|
|
253
|
+
const active = (await getModules()).filter((m) => m.enabled);
|
|
254
|
+
const allRoutes = [];
|
|
255
|
+
for (const mod of active) try {
|
|
256
|
+
const instance = await getModuleInstance(mod.id);
|
|
257
|
+
if (instance?.routes?.private) allRoutes.push(...instance.routes.private);
|
|
258
|
+
} catch {}
|
|
259
|
+
return allRoutes;
|
|
260
|
+
}
|
|
261
|
+
async function getKryoModuleRoutes() {
|
|
262
|
+
const routes = await getPrivateModuleRoutes();
|
|
263
|
+
const prefix = await getKryoPathPrefix();
|
|
264
|
+
return routes.map((route) => ({
|
|
265
|
+
...route,
|
|
266
|
+
path: route.path === "/" ? prefix : `${prefix}${route.path}`
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
269
|
+
async function getApiModuleRoutes() {
|
|
270
|
+
const active = (await getModules()).filter((m) => m.enabled);
|
|
271
|
+
const allRoutes = [];
|
|
272
|
+
for (const mod of active) try {
|
|
273
|
+
const instance = await getModuleInstance(mod.id);
|
|
274
|
+
if (instance?.routes?.api) allRoutes.push(...instance.routes.api);
|
|
275
|
+
} catch {}
|
|
276
|
+
return allRoutes;
|
|
277
|
+
}
|
|
278
|
+
async function getModuleWidgets(area) {
|
|
279
|
+
const active = (await getModules()).filter((m) => m.enabled);
|
|
280
|
+
const widgets = [];
|
|
281
|
+
for (const mod of active) try {
|
|
282
|
+
const instance = await getModuleInstance(mod.id);
|
|
283
|
+
if (instance?.widgets) {
|
|
284
|
+
const matching = instance.widgets.filter((w) => w.area === area);
|
|
285
|
+
widgets.push(...matching);
|
|
286
|
+
}
|
|
287
|
+
} catch (_e) {}
|
|
288
|
+
return widgets.sort((a, b) => (a.priority || 0) - (b.priority || 0));
|
|
289
|
+
}
|
|
290
|
+
async function getExtensions(targetModule, point) {
|
|
291
|
+
const active = (await getModules()).filter((m) => m.enabled);
|
|
292
|
+
const extensions = [];
|
|
293
|
+
for (const mod of active) try {
|
|
294
|
+
const instance = await getModuleInstance(mod.id);
|
|
295
|
+
if (instance?.extensions) {
|
|
296
|
+
const matching = instance.extensions.filter((ext) => {
|
|
297
|
+
const isTarget = ext.targetModule === targetModule;
|
|
298
|
+
const isPoint = point ? ext.point === point : true;
|
|
299
|
+
return isTarget && isPoint;
|
|
300
|
+
});
|
|
301
|
+
extensions.push(...matching);
|
|
302
|
+
}
|
|
303
|
+
} catch (_e) {}
|
|
304
|
+
return extensions.sort((a, b) => (a.priority || 0) - (b.priority || 0));
|
|
305
|
+
}
|
|
306
|
+
async function hasExtension(targetModule, point) {
|
|
307
|
+
const active = (await getModules()).filter((m) => m.enabled);
|
|
308
|
+
for (const mod of active) try {
|
|
309
|
+
const instance = await getModuleInstance(mod.id);
|
|
310
|
+
if (instance?.extensions) {
|
|
311
|
+
if (instance.extensions.filter((ext) => {
|
|
312
|
+
const isTarget = ext.targetModule === targetModule;
|
|
313
|
+
const isPoint = point ? ext.point === point : true;
|
|
314
|
+
return isTarget && isPoint;
|
|
315
|
+
}).length > 0) return true;
|
|
316
|
+
}
|
|
317
|
+
} catch (_e) {}
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
//#endregion
|
|
322
|
+
Object.defineProperty(exports, 'ModuleManifestSchema', {
|
|
323
|
+
enumerable: true,
|
|
324
|
+
get: function () {
|
|
325
|
+
return ModuleManifestSchema;
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
Object.defineProperty(exports, '__toESM', {
|
|
329
|
+
enumerable: true,
|
|
330
|
+
get: function () {
|
|
331
|
+
return __toESM;
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
Object.defineProperty(exports, 'getApiModuleRoutes', {
|
|
335
|
+
enumerable: true,
|
|
336
|
+
get: function () {
|
|
337
|
+
return getApiModuleRoutes;
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
Object.defineProperty(exports, 'getExtensions', {
|
|
341
|
+
enumerable: true,
|
|
342
|
+
get: function () {
|
|
343
|
+
return getExtensions;
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
Object.defineProperty(exports, 'getKryoModuleNavigationGrouped', {
|
|
347
|
+
enumerable: true,
|
|
348
|
+
get: function () {
|
|
349
|
+
return getKryoModuleNavigationGrouped;
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
Object.defineProperty(exports, 'getKryoModuleRoutes', {
|
|
353
|
+
enumerable: true,
|
|
354
|
+
get: function () {
|
|
355
|
+
return getKryoModuleRoutes;
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
Object.defineProperty(exports, 'getKryoPathPrefix', {
|
|
359
|
+
enumerable: true,
|
|
360
|
+
get: function () {
|
|
361
|
+
return getKryoPathPrefix;
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
Object.defineProperty(exports, 'getModuleConfig', {
|
|
365
|
+
enumerable: true,
|
|
366
|
+
get: function () {
|
|
367
|
+
return getModuleConfig;
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
Object.defineProperty(exports, 'getModuleInstance', {
|
|
371
|
+
enumerable: true,
|
|
372
|
+
get: function () {
|
|
373
|
+
return getModuleInstance;
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
Object.defineProperty(exports, 'getModuleNavigation', {
|
|
377
|
+
enumerable: true,
|
|
378
|
+
get: function () {
|
|
379
|
+
return getModuleNavigation;
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
Object.defineProperty(exports, 'getModuleNavigationGrouped', {
|
|
383
|
+
enumerable: true,
|
|
384
|
+
get: function () {
|
|
385
|
+
return getModuleNavigationGrouped;
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
Object.defineProperty(exports, 'getModuleStatus', {
|
|
389
|
+
enumerable: true,
|
|
390
|
+
get: function () {
|
|
391
|
+
return getModuleStatus;
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
Object.defineProperty(exports, 'getModuleWidgets', {
|
|
395
|
+
enumerable: true,
|
|
396
|
+
get: function () {
|
|
397
|
+
return getModuleWidgets;
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
Object.defineProperty(exports, 'getModules', {
|
|
401
|
+
enumerable: true,
|
|
402
|
+
get: function () {
|
|
403
|
+
return getModules;
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
Object.defineProperty(exports, 'getPrivateModuleRoutes', {
|
|
407
|
+
enumerable: true,
|
|
408
|
+
get: function () {
|
|
409
|
+
return getPrivateModuleRoutes;
|
|
410
|
+
}
|
|
411
|
+
});
|
|
412
|
+
Object.defineProperty(exports, 'getPublicModuleRoutes', {
|
|
413
|
+
enumerable: true,
|
|
414
|
+
get: function () {
|
|
415
|
+
return getPublicModuleRoutes;
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
Object.defineProperty(exports, 'hasExtension', {
|
|
419
|
+
enumerable: true,
|
|
420
|
+
get: function () {
|
|
421
|
+
return hasExtension;
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
Object.defineProperty(exports, 'isModuleEnabled', {
|
|
425
|
+
enumerable: true,
|
|
426
|
+
get: function () {
|
|
427
|
+
return isModuleEnabled;
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
Object.defineProperty(exports, 'registerModules', {
|
|
431
|
+
enumerable: true,
|
|
432
|
+
get: function () {
|
|
433
|
+
return registerModules;
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
Object.defineProperty(exports, 'updateModuleConfig', {
|
|
437
|
+
enumerable: true,
|
|
438
|
+
get: function () {
|
|
439
|
+
return updateModuleConfig;
|
|
440
|
+
}
|
|
441
|
+
});
|
|
@@ -113,5 +113,18 @@ interface ModuleNavigation {
|
|
|
113
113
|
globalRoutes?: (PublicRouteDefinition | PrivateRouteDefinition | ApiRouteDefinition)[];
|
|
114
114
|
}
|
|
115
115
|
//#endregion
|
|
116
|
-
|
|
117
|
-
|
|
116
|
+
//#region src/server/ui.d.ts
|
|
117
|
+
declare function getModuleNavigationGrouped(type: "admin" | "settings"): Promise<Record<string, ModuleNavElement[]>>;
|
|
118
|
+
declare function getKryoPathPrefix(): Promise<string>;
|
|
119
|
+
declare function getKryoModuleNavigationGrouped(type: "admin" | "settings"): Promise<Record<string, ModuleNavElement[]>>;
|
|
120
|
+
declare function getModuleNavigation(type: "public"): Promise<ModuleNavElement[]>;
|
|
121
|
+
declare function getPublicModuleRoutes(): Promise<PublicRouteDefinition[]>;
|
|
122
|
+
declare function getPrivateModuleRoutes(): Promise<PrivateRouteDefinition[]>;
|
|
123
|
+
declare function getKryoModuleRoutes(): Promise<PrivateRouteDefinition[]>;
|
|
124
|
+
declare function getApiModuleRoutes(): Promise<ApiRouteDefinition[]>;
|
|
125
|
+
declare function getModuleWidgets(area: string): Promise<ModuleWidget[]>;
|
|
126
|
+
declare function getExtensions(targetModule: string, point?: string): Promise<ModuleExtension[]>;
|
|
127
|
+
declare function hasExtension(targetModule: string, point?: string): Promise<boolean>;
|
|
128
|
+
//#endregion
|
|
129
|
+
export { PrivateRouteDefinition as C, SidebarMenuType as D, SidebarMenuItemType as E, SystemEvent as O, ModuleWidget as S, SidebarGroupType as T, ModuleNavElement as _, getKryoPathPrefix as a, ModulePageProps as b, getModuleWidgets as c, hasExtension as d, ApiRouteDefinition as f, ModuleManifestSchema as g, ModuleManifest as h, getKryoModuleRoutes as i, getPrivateModuleRoutes as l, ModuleExtension as m, getExtensions as n, getModuleNavigation as o, IModule as p, getKryoModuleNavigationGrouped as r, getModuleNavigationGrouped as s, getApiModuleRoutes as t, getPublicModuleRoutes as u, ModuleNavigation as v, PublicRouteDefinition as w, ModuleRouteDefinition as x, ModuleNavigationGroupMap as y };
|
|
130
|
+
//# sourceMappingURL=ui-CWGtK5lA.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-CWGtK5lA.d.cts","names":[],"sources":["../src/types.ts","../src/server/ui.ts"],"mappings":"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"}
|
|
@@ -113,5 +113,18 @@ interface ModuleNavigation {
|
|
|
113
113
|
globalRoutes?: (PublicRouteDefinition | PrivateRouteDefinition | ApiRouteDefinition)[];
|
|
114
114
|
}
|
|
115
115
|
//#endregion
|
|
116
|
-
|
|
117
|
-
|
|
116
|
+
//#region src/server/ui.d.ts
|
|
117
|
+
declare function getModuleNavigationGrouped(type: "admin" | "settings"): Promise<Record<string, ModuleNavElement[]>>;
|
|
118
|
+
declare function getKryoPathPrefix(): Promise<string>;
|
|
119
|
+
declare function getKryoModuleNavigationGrouped(type: "admin" | "settings"): Promise<Record<string, ModuleNavElement[]>>;
|
|
120
|
+
declare function getModuleNavigation(type: "public"): Promise<ModuleNavElement[]>;
|
|
121
|
+
declare function getPublicModuleRoutes(): Promise<PublicRouteDefinition[]>;
|
|
122
|
+
declare function getPrivateModuleRoutes(): Promise<PrivateRouteDefinition[]>;
|
|
123
|
+
declare function getKryoModuleRoutes(): Promise<PrivateRouteDefinition[]>;
|
|
124
|
+
declare function getApiModuleRoutes(): Promise<ApiRouteDefinition[]>;
|
|
125
|
+
declare function getModuleWidgets(area: string): Promise<ModuleWidget[]>;
|
|
126
|
+
declare function getExtensions(targetModule: string, point?: string): Promise<ModuleExtension[]>;
|
|
127
|
+
declare function hasExtension(targetModule: string, point?: string): Promise<boolean>;
|
|
128
|
+
//#endregion
|
|
129
|
+
export { PrivateRouteDefinition as C, SidebarMenuType as D, SidebarMenuItemType as E, SystemEvent as O, ModuleWidget as S, SidebarGroupType as T, ModuleNavElement as _, getKryoPathPrefix as a, ModulePageProps as b, getModuleWidgets as c, hasExtension as d, ApiRouteDefinition as f, ModuleManifestSchema as g, ModuleManifest as h, getKryoModuleRoutes as i, getPrivateModuleRoutes as l, ModuleExtension as m, getExtensions as n, getModuleNavigation as o, IModule as p, getKryoModuleNavigationGrouped as r, getModuleNavigationGrouped as s, getApiModuleRoutes as t, getPublicModuleRoutes as u, ModuleNavigation as v, PublicRouteDefinition as w, ModuleRouteDefinition as x, ModuleNavigationGroupMap as y };
|
|
130
|
+
//# sourceMappingURL=ui-aeAUERbe.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-aeAUERbe.d.mts","names":[],"sources":["../src/types.ts","../src/server/ui.ts"],"mappings":"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"}
|
|
@@ -1,8 +1,132 @@
|
|
|
1
|
-
"
|
|
1
|
+
import { db, getCurrentSession, getModulesDir } from "@arch-cadre/core/server";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { systemModulesTable } from "@arch-cadre/core";
|
|
5
|
+
import { eq } from "drizzle-orm";
|
|
6
|
+
import { z } from "zod";
|
|
2
7
|
|
|
3
|
-
|
|
4
|
-
|
|
8
|
+
//#region src/types.ts
|
|
9
|
+
const ModuleManifestSchema = z.object({
|
|
10
|
+
id: z.string(),
|
|
11
|
+
name: z.string(),
|
|
12
|
+
version: z.string(),
|
|
13
|
+
description: z.string().optional(),
|
|
14
|
+
dependencies: z.array(z.string()).default([]),
|
|
15
|
+
extends: z.array(z.string()).default([]),
|
|
16
|
+
enabled: z.boolean().default(true),
|
|
17
|
+
system: z.boolean().default(false),
|
|
18
|
+
npmDependencies: z.array(z.string()).optional(),
|
|
19
|
+
npmDevDependencies: z.array(z.string()).optional()
|
|
20
|
+
});
|
|
5
21
|
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/server/manage.ts
|
|
24
|
+
const globalForModules = globalThis;
|
|
25
|
+
if (!globalForModules.__KRYO_REGISTERED_MODULES__) globalForModules.__KRYO_REGISTERED_MODULES__ = /* @__PURE__ */ new Map();
|
|
26
|
+
async function registerModules(modules) {
|
|
27
|
+
const store = globalForModules.__KRYO_REGISTERED_MODULES__;
|
|
28
|
+
for (const mod of modules) if (mod.manifest?.id) store.set(mod.manifest.id, mod);
|
|
29
|
+
}
|
|
30
|
+
async function getModules() {
|
|
31
|
+
try {
|
|
32
|
+
const modulesDir = await getModulesDir();
|
|
33
|
+
const manifests = [];
|
|
34
|
+
const entries = await fs.readdir(modulesDir).catch(() => []);
|
|
35
|
+
for (const dir of entries) {
|
|
36
|
+
if (dir.startsWith(".")) continue;
|
|
37
|
+
try {
|
|
38
|
+
const content = await fs.readFile(path.join(modulesDir, dir, "manifest.json"), "utf-8");
|
|
39
|
+
const manifest = ModuleManifestSchema.parse(JSON.parse(content));
|
|
40
|
+
manifests.push({
|
|
41
|
+
...manifest,
|
|
42
|
+
hasDocs: false
|
|
43
|
+
});
|
|
44
|
+
} catch {}
|
|
45
|
+
}
|
|
46
|
+
const store = globalForModules.__KRYO_REGISTERED_MODULES__;
|
|
47
|
+
for (const mod of store.values()) if (!manifests.some((m) => m.id === mod.manifest.id)) manifests.push({
|
|
48
|
+
...mod.manifest,
|
|
49
|
+
hasDocs: false
|
|
50
|
+
});
|
|
51
|
+
const dbModules = await db.select().from(systemModulesTable).catch(() => []);
|
|
52
|
+
const dbMap = new Map(dbModules.map((m) => [m.id, m]));
|
|
53
|
+
return manifests.map((mod) => {
|
|
54
|
+
const dbEntry = dbMap.get(mod.id);
|
|
55
|
+
return {
|
|
56
|
+
...mod,
|
|
57
|
+
enabled: mod.system ? true : dbEntry?.enabled ?? false,
|
|
58
|
+
installed: mod.system ? true : dbEntry?.installed ?? false,
|
|
59
|
+
lastStep: dbEntry?.lastStep,
|
|
60
|
+
hasDocs: mod.hasDocs
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
} catch {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function getModuleStatus(moduleId) {
|
|
68
|
+
try {
|
|
69
|
+
const [mod] = await db.select().from(systemModulesTable).where(eq(systemModulesTable.id, moduleId));
|
|
70
|
+
return {
|
|
71
|
+
enabled: mod?.enabled,
|
|
72
|
+
installed: mod?.installed,
|
|
73
|
+
lastStep: mod?.lastStep
|
|
74
|
+
};
|
|
75
|
+
} catch {
|
|
76
|
+
return {
|
|
77
|
+
enabled: false,
|
|
78
|
+
installed: false,
|
|
79
|
+
lastStep: null
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function isModuleEnabled(moduleId) {
|
|
84
|
+
try {
|
|
85
|
+
const [mod] = await db.select().from(systemModulesTable).where(eq(systemModulesTable.id, moduleId));
|
|
86
|
+
return !!mod?.enabled || !!mod?.system;
|
|
87
|
+
} catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function getModuleInstance(moduleId) {
|
|
92
|
+
try {
|
|
93
|
+
const store = globalForModules.__KRYO_REGISTERED_MODULES__;
|
|
94
|
+
if (store.has(moduleId)) {
|
|
95
|
+
console.log(`[Kernel:Manage] Module "${moduleId}" found in registry.`);
|
|
96
|
+
return store.get(moduleId) || null;
|
|
97
|
+
}
|
|
98
|
+
console.log(`[Kernel:Manage] Module "${moduleId}" not in registry. Registry size: ${store.size}. Keys: ${Array.from(store.keys()).join(", ")}`);
|
|
99
|
+
if (!moduleId.startsWith(".") && !moduleId.startsWith("/")) try {
|
|
100
|
+
const mod = await import(`@arch-cadre/${moduleId}`);
|
|
101
|
+
console.log(`[Kernel:Manage] Module "${moduleId}" loaded via import().`);
|
|
102
|
+
return mod.default || mod || null;
|
|
103
|
+
} catch (e) {
|
|
104
|
+
console.warn(`[Kernel:Manage] Failed to import module "${moduleId} via import().": ${e.message}`);
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
} catch (error) {
|
|
108
|
+
console.error(`[Kernel:Manage] Error in getModuleInstance for "${moduleId}":`, error);
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function getModuleConfig(moduleId) {
|
|
113
|
+
try {
|
|
114
|
+
const [mod] = await db.select({ config: systemModulesTable.config }).from(systemModulesTable).where(eq(systemModulesTable.id, moduleId));
|
|
115
|
+
if (!mod?.config) return null;
|
|
116
|
+
return JSON.parse(mod.config);
|
|
117
|
+
} catch {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function updateModuleConfig(moduleId, config) {
|
|
122
|
+
try {
|
|
123
|
+
await db.update(systemModulesTable).set({ config: JSON.stringify(config) }).where(eq(systemModulesTable.id, moduleId));
|
|
124
|
+
} catch (e) {
|
|
125
|
+
console.warn(`[Kernel:Manage] Failed to update config for ${moduleId}:`, e);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
//#endregion
|
|
6
130
|
//#region src/server/ui.ts
|
|
7
131
|
/**
|
|
8
132
|
* Helper to check and filter a navigation item based on roles and permissions.
|
|
@@ -166,5 +290,5 @@ async function hasExtension(targetModule, point) {
|
|
|
166
290
|
}
|
|
167
291
|
|
|
168
292
|
//#endregion
|
|
169
|
-
export {
|
|
170
|
-
//# sourceMappingURL=ui.mjs.map
|
|
293
|
+
export { registerModules as _, getKryoPathPrefix as a, getModuleWidgets as c, hasExtension as d, getModuleConfig as f, isModuleEnabled as g, getModules as h, getKryoModuleRoutes as i, getPrivateModuleRoutes as l, getModuleStatus as m, getExtensions as n, getModuleNavigation as o, getModuleInstance as p, getKryoModuleNavigationGrouped as r, getModuleNavigationGrouped as s, getApiModuleRoutes as t, getPublicModuleRoutes as u, updateModuleConfig as v, ModuleManifestSchema as y };
|
|
294
|
+
//# sourceMappingURL=ui-lsiPxu_C.mjs.map
|