@mobtakronio/capskit 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/index.cjs +19 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -51,16 +51,16 @@ import { createCapsKit } from '@mobtakronio/capskit';
|
|
|
51
51
|
import { Elysia } from 'elysia';
|
|
52
52
|
import * as path from 'path';
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
// Simplified initialization: starts, auto-loads built-ins, and builds router in one call!
|
|
55
|
+
const { router, capskit } = await createCapsKit({
|
|
56
|
+
capsuleDirs: [path.resolve('./custom-capsules')],
|
|
57
|
+
boot: {
|
|
58
|
+
action: 'http.buildRouter',
|
|
59
|
+
payload: { adapter: 'elysia' }
|
|
60
|
+
},
|
|
56
61
|
dependencies: { db: myDatabase }
|
|
57
62
|
});
|
|
58
63
|
|
|
59
|
-
await capskit.start();
|
|
60
|
-
|
|
61
|
-
// Mount to Elysia automatically!
|
|
62
|
-
const { router } = await capskit.call('http.buildRouter', { adapter: 'elysia' });
|
|
63
|
-
|
|
64
64
|
new Elysia()
|
|
65
65
|
.use(router)
|
|
66
66
|
.listen(3000);
|
package/dist/index.cjs
CHANGED
|
@@ -38,6 +38,7 @@ module.exports = __toCommonJS(index_exports);
|
|
|
38
38
|
|
|
39
39
|
// src/kernel/platform.ts
|
|
40
40
|
var path2 = __toESM(require("path"), 1);
|
|
41
|
+
var import_url = require("url");
|
|
41
42
|
|
|
42
43
|
// src/kernel/loader.ts
|
|
43
44
|
var fs = __toESM(require("fs"), 1);
|
|
@@ -76,6 +77,7 @@ async function loadCapsules(capsulesDir) {
|
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
// src/kernel/platform.ts
|
|
80
|
+
var import_meta = {};
|
|
79
81
|
var CapsKit = class {
|
|
80
82
|
constructor(config) {
|
|
81
83
|
this.config = config;
|
|
@@ -90,6 +92,16 @@ var CapsKit = class {
|
|
|
90
92
|
eventRegistry = /* @__PURE__ */ new Map();
|
|
91
93
|
dependencies = {};
|
|
92
94
|
async start() {
|
|
95
|
+
try {
|
|
96
|
+
const currentDir = path2.dirname((0, import_url.fileURLToPath)(import_meta.url));
|
|
97
|
+
const builtinDir = path2.resolve(currentDir, "../capsules");
|
|
98
|
+
const builtinManifests = await loadCapsules(builtinDir);
|
|
99
|
+
for (const manifest of builtinManifests) {
|
|
100
|
+
this.registerCapsule(manifest);
|
|
101
|
+
}
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.warn("[CapsKit] Could not auto-load built-in capsules:", error);
|
|
104
|
+
}
|
|
93
105
|
if (this.config.capsuleDirs) {
|
|
94
106
|
for (const dir of this.config.capsuleDirs) {
|
|
95
107
|
const absoluteDir = path2.resolve(dir);
|
|
@@ -99,6 +111,10 @@ var CapsKit = class {
|
|
|
99
111
|
}
|
|
100
112
|
}
|
|
101
113
|
}
|
|
114
|
+
if (this.config.boot) {
|
|
115
|
+
return await this.call(this.config.boot.action, this.config.boot.payload || {});
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
102
118
|
}
|
|
103
119
|
registerCapsule(manifest) {
|
|
104
120
|
this.validateDependencies(manifest);
|
|
@@ -202,7 +218,9 @@ var CapsKit = class {
|
|
|
202
218
|
}
|
|
203
219
|
};
|
|
204
220
|
async function createCapsKit(config) {
|
|
205
|
-
|
|
221
|
+
const kit = new CapsKit(config);
|
|
222
|
+
const bootResult = await kit.start();
|
|
223
|
+
return Object.assign(bootResult || {}, { capskit: kit });
|
|
206
224
|
}
|
|
207
225
|
// Annotate the CommonJS export names for ESM import in node:
|
|
208
226
|
0 && (module.exports = {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/kernel/platform.ts","../src/kernel/loader.ts"],"sourcesContent":["export * from './kernel/platform';\r\nexport { loadCapsules } from './kernel/loader';\r\nexport * from './types';\r\n","import { ActionHandler, ICapsKit, CapsKitConfig, CapsuleManifest, ActionInterceptor, ActionContext, ActionDefinition } from '../types';\r\nimport * as path from 'path';\r\nimport { loadCapsules } from './loader';\r\n\r\nexport class CapsKit implements ICapsKit {\r\n private actions = new Map<string, ActionDefinition>();\r\n private manifests = new Map<string, CapsuleManifest>();\r\n private interceptors: ActionInterceptor[] = [];\r\n private eventRegistry = new Map<string, string[]>();\r\n private dependencies: Record<string, any> = {};\r\n\r\n constructor(private config: CapsKitConfig) {\r\n this.dependencies = {\r\n ...config.dependencies,\r\n capskit: this\r\n };\r\n }\r\n\r\n async start(): Promise<void> {\r\n if (this.config.capsuleDirs) {\r\n for (const dir of this.config.capsuleDirs) {\r\n const absoluteDir = path.resolve(dir);\r\n const manifests = await loadCapsules(absoluteDir);\r\n \r\n for (const manifest of manifests) {\r\n this.registerCapsule(manifest);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private registerCapsule(manifest: CapsuleManifest) {\r\n this.validateDependencies(manifest);\r\n this.manifests.set(manifest.name, manifest);\r\n\r\n for (const [actionName, definition] of Object.entries(manifest.actions)) {\r\n const fullName = `${manifest.name}.${actionName}`;\r\n if (typeof definition.handler === 'function') {\r\n this.actions.set(fullName, definition);\r\n } else {\r\n // In a real implementation, we would dynamic import here based on string path\r\n }\r\n }\r\n\r\n if (manifest.events?.subscribes) {\r\n for (const sub of manifest.events.subscribes) {\r\n const targetAction = `${manifest.name}.${sub.action}`;\r\n const existing = this.eventRegistry.get(sub.event) || [];\r\n existing.push(targetAction);\r\n this.eventRegistry.set(sub.event, existing);\r\n }\r\n }\r\n }\r\n\r\n private validateDependencies(manifest: CapsuleManifest) {\r\n if (manifest.requires) {\r\n for (const dep of manifest.requires) {\r\n if (!this.dependencies[dep]) {\r\n throw new Error(`Capsule \"${manifest.name}\" requires dependency \"${dep}\" which is not provided.`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n addInterceptor(interceptor: ActionInterceptor): void {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n async call(actionName: string, payload: any): Promise<any> {\r\n const actionDef = this.actions.get(actionName);\r\n if (!actionDef) {\r\n throw new Error(`Action \"${actionName}\" not found.`);\r\n }\r\n\r\n const handler = actionDef.handler as ActionHandler;\r\n\r\n const context: ActionContext = {\r\n params: payload?.params,\r\n body: payload?.body,\r\n query: payload?.query,\r\n deps: this.dependencies,\r\n emit: this.emit.bind(this),\r\n call: this.call.bind(this),\r\n use: this.use.bind(this)\r\n };\r\n\r\n let index = -1;\r\n const dispatch = async (i: number): Promise<any> => {\r\n if (i <= index) throw new Error('next() called multiple times');\r\n index = i;\r\n if (i === this.interceptors.length) {\r\n \r\n if (actionDef.pre) {\r\n for (const hook of actionDef.pre) {\r\n await hook(payload, context);\r\n }\r\n }\r\n\r\n let result = await handler(payload, context);\r\n\r\n if (actionDef.post) {\r\n for (const hook of actionDef.post) {\r\n const hookResult = await hook(payload, result, context);\r\n if (hookResult !== undefined) {\r\n result = hookResult;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n const interceptor = this.interceptors[i];\r\n return interceptor(actionName, payload, context, () => dispatch(i + 1));\r\n };\r\n\r\n return dispatch(0);\r\n }\r\n\r\n use<TCapsule = any>(capsuleName: string): TCapsule {\r\n return new Proxy({}, {\r\n get: (_, actionName: string | symbol) => {\r\n return async (payload: any) => {\r\n const actionPath = `${capsuleName}.${String(actionName)}`;\r\n return this.call(actionPath, payload);\r\n };\r\n }\r\n }) as TCapsule;\r\n }\r\n\r\n describe(capsuleName: string): CapsuleManifest | undefined {\r\n return this.manifests.get(capsuleName);\r\n }\r\n\r\n emit(event: string, data: any): void {\r\n // Basic event emission (can be expanded with adapters later)\r\n console.log(`[Event Bus] Emitted: ${event}`);\r\n \r\n // Asynchronously dispatch to all registered subscribers\r\n const subscribers = this.eventRegistry.get(event);\r\n if (subscribers) {\r\n for (const actionName of subscribers) {\r\n // Fire and forget, but catch errors to avoid unhandled promises\r\n this.call(actionName, data).catch(err => {\r\n console.error(`[Event Bus] Subscriber action ${actionName} failed handling event ${event}:`, err);\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Helper for internal registry access (used by system capsule later)\r\n getManifests() {\r\n return Array.from(this.manifests.values());\r\n }\r\n}\r\n\r\nexport async function createCapsKit(config: CapsKitConfig): Promise<CapsKit> {\r\n return new CapsKit(config);\r\n}\r\n","import { CapsuleManifest } from '../types';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport async function loadCapsules(capsulesDir: string): Promise<CapsuleManifest[]> {\r\n const manifests: CapsuleManifest[] = [];\r\n\r\n if (!fs.existsSync(capsulesDir)) {\r\n return manifests;\r\n }\r\n\r\n const entries = fs.readdirSync(capsulesDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n if (entry.isDirectory()) {\r\n const manifestPath = path.join(capsulesDir, entry.name, 'manifest.ts');\r\n const manifestJsPath = path.join(capsulesDir, entry.name, 'manifest.js');\r\n \r\n let finalPath = '';\r\n if (fs.existsSync(manifestPath)) {\r\n finalPath = manifestPath;\r\n } else if (fs.existsSync(manifestJsPath)) {\r\n finalPath = manifestJsPath;\r\n }\r\n\r\n if (finalPath) {\r\n try {\r\n console.log(finalPath)\r\n // In Windows, absolute paths must be prefixed with file:// for dynamic import()\r\n const module = await import(`file://${finalPath}`);\r\n const manifest = module.service || module.manifest || module.default;\r\n if (manifest) {\r\n manifests.push(manifest);\r\n }\r\n } catch (error) {\r\n console.error(`Failed to load manifest at ${finalPath}:`, error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return manifests;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,IAAAA,QAAsB;;;ACAtB,SAAoB;AACpB,WAAsB;AAEtB,eAAsB,aAAa,aAAiD;AAClF,QAAM,YAA+B,CAAC;AAEtC,MAAI,CAAI,cAAW,WAAW,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,UAAa,eAAY,aAAa,EAAE,eAAe,KAAK,CAAC;AAEnE,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,eAAoB,UAAK,aAAa,MAAM,MAAM,aAAa;AACrE,YAAM,iBAAsB,UAAK,aAAa,MAAM,MAAM,aAAa;AAEvE,UAAI,YAAY;AAChB,UAAO,cAAW,YAAY,GAAG;AAC/B,oBAAY;AAAA,MACd,WAAc,cAAW,cAAc,GAAG;AACxC,oBAAY;AAAA,MACd;AAEA,UAAI,WAAW;AACb,YAAI;AACA,kBAAQ,IAAI,SAAS;AAEvB,gBAAMC,UAAS,MAAM,OAAO,UAAU,SAAS;AAC/C,gBAAM,WAAWA,QAAO,WAAWA,QAAO,YAAYA,QAAO;AAC7D,cAAI,UAAU;AACZ,sBAAU,KAAK,QAAQ;AAAA,UACzB;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,MAAM,8BAA8B,SAAS,KAAK,KAAK;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ADtCO,IAAM,UAAN,MAAkC;AAAA,EAOvC,YAAoB,QAAuB;AAAvB;AAClB,SAAK,eAAe;AAAA,MAClB,GAAG,OAAO;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAXQ,UAAU,oBAAI,IAA8B;AAAA,EAC5C,YAAY,oBAAI,IAA6B;AAAA,EAC7C,eAAoC,CAAC;AAAA,EACrC,gBAAgB,oBAAI,IAAsB;AAAA,EAC1C,eAAoC,CAAC;AAAA,EAS7C,MAAM,QAAuB;AAC3B,QAAI,KAAK,OAAO,aAAa;AAC3B,iBAAW,OAAO,KAAK,OAAO,aAAa;AACzC,cAAM,cAAmB,cAAQ,GAAG;AACpC,cAAM,YAAY,MAAM,aAAa,WAAW;AAEhD,mBAAW,YAAY,WAAW;AAChC,eAAK,gBAAgB,QAAQ;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAgB,UAA2B;AACjD,SAAK,qBAAqB,QAAQ;AAClC,SAAK,UAAU,IAAI,SAAS,MAAM,QAAQ;AAE1C,eAAW,CAAC,YAAY,UAAU,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AACvE,YAAM,WAAW,GAAG,SAAS,IAAI,IAAI,UAAU;AAC/C,UAAI,OAAO,WAAW,YAAY,YAAY;AAC5C,aAAK,QAAQ,IAAI,UAAU,UAAU;AAAA,MACvC,OAAO;AAAA,MAEP;AAAA,IACF;AAEA,QAAI,SAAS,QAAQ,YAAY;AAC/B,iBAAW,OAAO,SAAS,OAAO,YAAY;AAC5C,cAAM,eAAe,GAAG,SAAS,IAAI,IAAI,IAAI,MAAM;AACnD,cAAM,WAAW,KAAK,cAAc,IAAI,IAAI,KAAK,KAAK,CAAC;AACvD,iBAAS,KAAK,YAAY;AAC1B,aAAK,cAAc,IAAI,IAAI,OAAO,QAAQ;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAAqB,UAA2B;AACtD,QAAI,SAAS,UAAU;AACrB,iBAAW,OAAO,SAAS,UAAU;AACnC,YAAI,CAAC,KAAK,aAAa,GAAG,GAAG;AAC3B,gBAAM,IAAI,MAAM,YAAY,SAAS,IAAI,0BAA0B,GAAG,0BAA0B;AAAA,QAClG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,aAAsC;AACnD,SAAK,aAAa,KAAK,WAAW;AAAA,EACpC;AAAA,EAEA,MAAM,KAAK,YAAoB,SAA4B;AACzD,UAAM,YAAY,KAAK,QAAQ,IAAI,UAAU;AAC7C,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,WAAW,UAAU,cAAc;AAAA,IACrD;AAEA,UAAM,UAAU,UAAU;AAE1B,UAAM,UAAyB;AAAA,MAC7B,QAAQ,SAAS;AAAA,MACjB,MAAM,SAAS;AAAA,MACf,OAAO,SAAS;AAAA,MAChB,MAAM,KAAK;AAAA,MACX,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,MACzB,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,MACzB,KAAK,KAAK,IAAI,KAAK,IAAI;AAAA,IACzB;AAEA,QAAI,QAAQ;AACZ,UAAM,WAAW,OAAO,MAA4B;AAClD,UAAI,KAAK,MAAO,OAAM,IAAI,MAAM,8BAA8B;AAC9D,cAAQ;AACR,UAAI,MAAM,KAAK,aAAa,QAAQ;AAElC,YAAI,UAAU,KAAK;AACjB,qBAAW,QAAQ,UAAU,KAAK;AAChC,kBAAM,KAAK,SAAS,OAAO;AAAA,UAC7B;AAAA,QACF;AAEA,YAAI,SAAS,MAAM,QAAQ,SAAS,OAAO;AAE3C,YAAI,UAAU,MAAM;AAClB,qBAAW,QAAQ,UAAU,MAAM;AACjC,kBAAM,aAAa,MAAM,KAAK,SAAS,QAAQ,OAAO;AACtD,gBAAI,eAAe,QAAW;AAC5B,uBAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AACA,YAAM,cAAc,KAAK,aAAa,CAAC;AACvC,aAAO,YAAY,YAAY,SAAS,SAAS,MAAM,SAAS,IAAI,CAAC,CAAC;AAAA,IACxE;AAEA,WAAO,SAAS,CAAC;AAAA,EACnB;AAAA,EAEA,IAAoB,aAA+B;AACjD,WAAO,IAAI,MAAM,CAAC,GAAG;AAAA,MACnB,KAAK,CAAC,GAAG,eAAgC;AACvC,eAAO,OAAO,YAAiB;AAC7B,gBAAM,aAAa,GAAG,WAAW,IAAI,OAAO,UAAU,CAAC;AACvD,iBAAO,KAAK,KAAK,YAAY,OAAO;AAAA,QACtC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,SAAS,aAAkD;AACzD,WAAO,KAAK,UAAU,IAAI,WAAW;AAAA,EACvC;AAAA,EAEA,KAAK,OAAe,MAAiB;AAEnC,YAAQ,IAAI,wBAAwB,KAAK,EAAE;AAG3C,UAAM,cAAc,KAAK,cAAc,IAAI,KAAK;AAChD,QAAI,aAAa;AACf,iBAAW,cAAc,aAAa;AAEpC,aAAK,KAAK,YAAY,IAAI,EAAE,MAAM,SAAO;AACvC,kBAAQ,MAAM,iCAAiC,UAAU,0BAA0B,KAAK,KAAK,GAAG;AAAA,QAClG,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,eAAe;AACb,WAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,EAC3C;AACF;AAEA,eAAsB,cAAc,QAAyC;AAC3E,SAAO,IAAI,QAAQ,MAAM;AAC3B;","names":["path","module"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/kernel/platform.ts","../src/kernel/loader.ts"],"sourcesContent":["export * from './kernel/platform';\r\nexport { loadCapsules } from './kernel/loader';\r\nexport * from './types';\r\n","import { ActionHandler, ICapsKit, CapsKitConfig, CapsuleManifest, ActionInterceptor, ActionContext, ActionDefinition } from '../types';\r\nimport * as path from 'path';\r\nimport { fileURLToPath } from 'url';\r\nimport { loadCapsules } from './loader';\r\n\r\nexport class CapsKit implements ICapsKit {\r\n private actions = new Map<string, ActionDefinition>();\r\n private manifests = new Map<string, CapsuleManifest>();\r\n private interceptors: ActionInterceptor[] = [];\r\n private eventRegistry = new Map<string, string[]>();\r\n private dependencies: Record<string, any> = {};\r\n\r\n constructor(private config: CapsKitConfig) {\r\n this.dependencies = {\r\n ...config.dependencies,\r\n capskit: this\r\n };\r\n }\r\n\r\n async start(): Promise<any> {\r\n // 1. Auto-load built-in capsules\r\n try {\r\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\r\n const builtinDir = path.resolve(currentDir, '../capsules');\r\n const builtinManifests = await loadCapsules(builtinDir);\r\n for (const manifest of builtinManifests) {\r\n this.registerCapsule(manifest);\r\n }\r\n } catch (error) {\r\n console.warn('[CapsKit] Could not auto-load built-in capsules:', error);\r\n }\r\n\r\n // 2. Load custom capsules from config\r\n if (this.config.capsuleDirs) {\r\n for (const dir of this.config.capsuleDirs) {\r\n const absoluteDir = path.resolve(dir);\r\n const manifests = await loadCapsules(absoluteDir);\r\n \r\n for (const manifest of manifests) {\r\n this.registerCapsule(manifest);\r\n }\r\n }\r\n }\r\n\r\n // 3. Execute boot action if specified\r\n if (this.config.boot) {\r\n return await this.call(this.config.boot.action, this.config.boot.payload || {});\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private registerCapsule(manifest: CapsuleManifest) {\r\n this.validateDependencies(manifest);\r\n this.manifests.set(manifest.name, manifest);\r\n\r\n for (const [actionName, definition] of Object.entries(manifest.actions)) {\r\n const fullName = `${manifest.name}.${actionName}`;\r\n if (typeof definition.handler === 'function') {\r\n this.actions.set(fullName, definition);\r\n } else {\r\n // In a real implementation, we would dynamic import here based on string path\r\n }\r\n }\r\n\r\n if (manifest.events?.subscribes) {\r\n for (const sub of manifest.events.subscribes) {\r\n const targetAction = `${manifest.name}.${sub.action}`;\r\n const existing = this.eventRegistry.get(sub.event) || [];\r\n existing.push(targetAction);\r\n this.eventRegistry.set(sub.event, existing);\r\n }\r\n }\r\n }\r\n\r\n private validateDependencies(manifest: CapsuleManifest) {\r\n if (manifest.requires) {\r\n for (const dep of manifest.requires) {\r\n if (!this.dependencies[dep]) {\r\n throw new Error(`Capsule \"${manifest.name}\" requires dependency \"${dep}\" which is not provided.`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n addInterceptor(interceptor: ActionInterceptor): void {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n async call(actionName: string, payload: any): Promise<any> {\r\n const actionDef = this.actions.get(actionName);\r\n if (!actionDef) {\r\n throw new Error(`Action \"${actionName}\" not found.`);\r\n }\r\n\r\n const handler = actionDef.handler as ActionHandler;\r\n\r\n const context: ActionContext = {\r\n params: payload?.params,\r\n body: payload?.body,\r\n query: payload?.query,\r\n deps: this.dependencies,\r\n emit: this.emit.bind(this),\r\n call: this.call.bind(this),\r\n use: this.use.bind(this)\r\n };\r\n\r\n let index = -1;\r\n const dispatch = async (i: number): Promise<any> => {\r\n if (i <= index) throw new Error('next() called multiple times');\r\n index = i;\r\n if (i === this.interceptors.length) {\r\n \r\n if (actionDef.pre) {\r\n for (const hook of actionDef.pre) {\r\n await hook(payload, context);\r\n }\r\n }\r\n\r\n let result = await handler(payload, context);\r\n\r\n if (actionDef.post) {\r\n for (const hook of actionDef.post) {\r\n const hookResult = await hook(payload, result, context);\r\n if (hookResult !== undefined) {\r\n result = hookResult;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n const interceptor = this.interceptors[i];\r\n return interceptor(actionName, payload, context, () => dispatch(i + 1));\r\n };\r\n\r\n return dispatch(0);\r\n }\r\n\r\n use<TCapsule = any>(capsuleName: string): TCapsule {\r\n return new Proxy({}, {\r\n get: (_, actionName: string | symbol) => {\r\n return async (payload: any) => {\r\n const actionPath = `${capsuleName}.${String(actionName)}`;\r\n return this.call(actionPath, payload);\r\n };\r\n }\r\n }) as TCapsule;\r\n }\r\n\r\n describe(capsuleName: string): CapsuleManifest | undefined {\r\n return this.manifests.get(capsuleName);\r\n }\r\n\r\n emit(event: string, data: any): void {\r\n // Basic event emission (can be expanded with adapters later)\r\n console.log(`[Event Bus] Emitted: ${event}`);\r\n \r\n // Asynchronously dispatch to all registered subscribers\r\n const subscribers = this.eventRegistry.get(event);\r\n if (subscribers) {\r\n for (const actionName of subscribers) {\r\n // Fire and forget, but catch errors to avoid unhandled promises\r\n this.call(actionName, data).catch(err => {\r\n console.error(`[Event Bus] Subscriber action ${actionName} failed handling event ${event}:`, err);\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Helper for internal registry access (used by system capsule later)\r\n getManifests() {\r\n return Array.from(this.manifests.values());\r\n }\r\n}\r\n\r\nexport async function createCapsKit(config: CapsKitConfig): Promise<any> {\r\n const kit = new CapsKit(config);\r\n const bootResult = await kit.start();\r\n \r\n // Return boot results merged with the kit instance for convenience\r\n return Object.assign(bootResult || {}, { capskit: kit });\r\n}\r\n\r\n","import { CapsuleManifest } from '../types';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport async function loadCapsules(capsulesDir: string): Promise<CapsuleManifest[]> {\r\n const manifests: CapsuleManifest[] = [];\r\n\r\n if (!fs.existsSync(capsulesDir)) {\r\n return manifests;\r\n }\r\n\r\n const entries = fs.readdirSync(capsulesDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n if (entry.isDirectory()) {\r\n const manifestPath = path.join(capsulesDir, entry.name, 'manifest.ts');\r\n const manifestJsPath = path.join(capsulesDir, entry.name, 'manifest.js');\r\n \r\n let finalPath = '';\r\n if (fs.existsSync(manifestPath)) {\r\n finalPath = manifestPath;\r\n } else if (fs.existsSync(manifestJsPath)) {\r\n finalPath = manifestJsPath;\r\n }\r\n\r\n if (finalPath) {\r\n try {\r\n console.log(finalPath)\r\n // In Windows, absolute paths must be prefixed with file:// for dynamic import()\r\n const module = await import(`file://${finalPath}`);\r\n const manifest = module.service || module.manifest || module.default;\r\n if (manifest) {\r\n manifests.push(manifest);\r\n }\r\n } catch (error) {\r\n console.error(`Failed to load manifest at ${finalPath}:`, error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return manifests;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,IAAAA,QAAsB;AACtB,iBAA8B;;;ACD9B,SAAoB;AACpB,WAAsB;AAEtB,eAAsB,aAAa,aAAiD;AAClF,QAAM,YAA+B,CAAC;AAEtC,MAAI,CAAI,cAAW,WAAW,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,UAAa,eAAY,aAAa,EAAE,eAAe,KAAK,CAAC;AAEnE,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,eAAoB,UAAK,aAAa,MAAM,MAAM,aAAa;AACrE,YAAM,iBAAsB,UAAK,aAAa,MAAM,MAAM,aAAa;AAEvE,UAAI,YAAY;AAChB,UAAO,cAAW,YAAY,GAAG;AAC/B,oBAAY;AAAA,MACd,WAAc,cAAW,cAAc,GAAG;AACxC,oBAAY;AAAA,MACd;AAEA,UAAI,WAAW;AACb,YAAI;AACA,kBAAQ,IAAI,SAAS;AAEvB,gBAAMC,UAAS,MAAM,OAAO,UAAU,SAAS;AAC/C,gBAAM,WAAWA,QAAO,WAAWA,QAAO,YAAYA,QAAO;AAC7D,cAAI,UAAU;AACZ,sBAAU,KAAK,QAAQ;AAAA,UACzB;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,MAAM,8BAA8B,SAAS,KAAK,KAAK;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AD1CA;AAKO,IAAM,UAAN,MAAkC;AAAA,EAOvC,YAAoB,QAAuB;AAAvB;AAClB,SAAK,eAAe;AAAA,MAClB,GAAG,OAAO;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAXQ,UAAU,oBAAI,IAA8B;AAAA,EAC5C,YAAY,oBAAI,IAA6B;AAAA,EAC7C,eAAoC,CAAC;AAAA,EACrC,gBAAgB,oBAAI,IAAsB;AAAA,EAC1C,eAAoC,CAAC;AAAA,EAS7C,MAAM,QAAsB;AAE1B,QAAI;AACF,YAAM,aAAkB,kBAAQ,0BAAc,YAAY,GAAG,CAAC;AAC9D,YAAM,aAAkB,cAAQ,YAAY,aAAa;AACzD,YAAM,mBAAmB,MAAM,aAAa,UAAU;AACtD,iBAAW,YAAY,kBAAkB;AACvC,aAAK,gBAAgB,QAAQ;AAAA,MAC/B;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,KAAK,oDAAoD,KAAK;AAAA,IACxE;AAGA,QAAI,KAAK,OAAO,aAAa;AAC3B,iBAAW,OAAO,KAAK,OAAO,aAAa;AACzC,cAAM,cAAmB,cAAQ,GAAG;AACpC,cAAM,YAAY,MAAM,aAAa,WAAW;AAEhD,mBAAW,YAAY,WAAW;AAChC,eAAK,gBAAgB,QAAQ;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,OAAO,MAAM;AACpB,aAAO,MAAM,KAAK,KAAK,KAAK,OAAO,KAAK,QAAQ,KAAK,OAAO,KAAK,WAAW,CAAC,CAAC;AAAA,IAChF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,UAA2B;AACjD,SAAK,qBAAqB,QAAQ;AAClC,SAAK,UAAU,IAAI,SAAS,MAAM,QAAQ;AAE1C,eAAW,CAAC,YAAY,UAAU,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AACvE,YAAM,WAAW,GAAG,SAAS,IAAI,IAAI,UAAU;AAC/C,UAAI,OAAO,WAAW,YAAY,YAAY;AAC5C,aAAK,QAAQ,IAAI,UAAU,UAAU;AAAA,MACvC,OAAO;AAAA,MAEP;AAAA,IACF;AAEA,QAAI,SAAS,QAAQ,YAAY;AAC/B,iBAAW,OAAO,SAAS,OAAO,YAAY;AAC5C,cAAM,eAAe,GAAG,SAAS,IAAI,IAAI,IAAI,MAAM;AACnD,cAAM,WAAW,KAAK,cAAc,IAAI,IAAI,KAAK,KAAK,CAAC;AACvD,iBAAS,KAAK,YAAY;AAC1B,aAAK,cAAc,IAAI,IAAI,OAAO,QAAQ;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAAqB,UAA2B;AACtD,QAAI,SAAS,UAAU;AACrB,iBAAW,OAAO,SAAS,UAAU;AACnC,YAAI,CAAC,KAAK,aAAa,GAAG,GAAG;AAC3B,gBAAM,IAAI,MAAM,YAAY,SAAS,IAAI,0BAA0B,GAAG,0BAA0B;AAAA,QAClG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,aAAsC;AACnD,SAAK,aAAa,KAAK,WAAW;AAAA,EACpC;AAAA,EAEA,MAAM,KAAK,YAAoB,SAA4B;AACzD,UAAM,YAAY,KAAK,QAAQ,IAAI,UAAU;AAC7C,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,WAAW,UAAU,cAAc;AAAA,IACrD;AAEA,UAAM,UAAU,UAAU;AAE1B,UAAM,UAAyB;AAAA,MAC7B,QAAQ,SAAS;AAAA,MACjB,MAAM,SAAS;AAAA,MACf,OAAO,SAAS;AAAA,MAChB,MAAM,KAAK;AAAA,MACX,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,MACzB,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,MACzB,KAAK,KAAK,IAAI,KAAK,IAAI;AAAA,IACzB;AAEA,QAAI,QAAQ;AACZ,UAAM,WAAW,OAAO,MAA4B;AAClD,UAAI,KAAK,MAAO,OAAM,IAAI,MAAM,8BAA8B;AAC9D,cAAQ;AACR,UAAI,MAAM,KAAK,aAAa,QAAQ;AAElC,YAAI,UAAU,KAAK;AACjB,qBAAW,QAAQ,UAAU,KAAK;AAChC,kBAAM,KAAK,SAAS,OAAO;AAAA,UAC7B;AAAA,QACF;AAEA,YAAI,SAAS,MAAM,QAAQ,SAAS,OAAO;AAE3C,YAAI,UAAU,MAAM;AAClB,qBAAW,QAAQ,UAAU,MAAM;AACjC,kBAAM,aAAa,MAAM,KAAK,SAAS,QAAQ,OAAO;AACtD,gBAAI,eAAe,QAAW;AAC5B,uBAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AACA,YAAM,cAAc,KAAK,aAAa,CAAC;AACvC,aAAO,YAAY,YAAY,SAAS,SAAS,MAAM,SAAS,IAAI,CAAC,CAAC;AAAA,IACxE;AAEA,WAAO,SAAS,CAAC;AAAA,EACnB;AAAA,EAEA,IAAoB,aAA+B;AACjD,WAAO,IAAI,MAAM,CAAC,GAAG;AAAA,MACnB,KAAK,CAAC,GAAG,eAAgC;AACvC,eAAO,OAAO,YAAiB;AAC7B,gBAAM,aAAa,GAAG,WAAW,IAAI,OAAO,UAAU,CAAC;AACvD,iBAAO,KAAK,KAAK,YAAY,OAAO;AAAA,QACtC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,SAAS,aAAkD;AACzD,WAAO,KAAK,UAAU,IAAI,WAAW;AAAA,EACvC;AAAA,EAEA,KAAK,OAAe,MAAiB;AAEnC,YAAQ,IAAI,wBAAwB,KAAK,EAAE;AAG3C,UAAM,cAAc,KAAK,cAAc,IAAI,KAAK;AAChD,QAAI,aAAa;AACf,iBAAW,cAAc,aAAa;AAEpC,aAAK,KAAK,YAAY,IAAI,EAAE,MAAM,SAAO;AACvC,kBAAQ,MAAM,iCAAiC,UAAU,0BAA0B,KAAK,KAAK,GAAG;AAAA,QAClG,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,eAAe;AACb,WAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,EAC3C;AACF;AAEA,eAAsB,cAAc,QAAqC;AACvE,QAAM,MAAM,IAAI,QAAQ,MAAM;AAC9B,QAAM,aAAa,MAAM,IAAI,MAAM;AAGnC,SAAO,OAAO,OAAO,cAAc,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC;AACzD;","names":["path","module"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -41,9 +41,13 @@ interface RouteDefinition {
|
|
|
41
41
|
interface CapsKitConfig {
|
|
42
42
|
capsuleDirs?: string[];
|
|
43
43
|
dependencies?: Record<string, any>;
|
|
44
|
+
boot?: {
|
|
45
|
+
action: string;
|
|
46
|
+
payload?: any;
|
|
47
|
+
};
|
|
44
48
|
}
|
|
45
49
|
interface ICapsKit {
|
|
46
|
-
start(): Promise<
|
|
50
|
+
start(): Promise<any>;
|
|
47
51
|
call(actionName: string, payload: any): Promise<any>;
|
|
48
52
|
use<TCapsule = any>(capsuleName: string): TCapsule;
|
|
49
53
|
describe(capsuleName: string): CapsuleManifest | undefined;
|
|
@@ -59,7 +63,7 @@ declare class CapsKit implements ICapsKit {
|
|
|
59
63
|
private eventRegistry;
|
|
60
64
|
private dependencies;
|
|
61
65
|
constructor(config: CapsKitConfig);
|
|
62
|
-
start(): Promise<
|
|
66
|
+
start(): Promise<any>;
|
|
63
67
|
private registerCapsule;
|
|
64
68
|
private validateDependencies;
|
|
65
69
|
addInterceptor(interceptor: ActionInterceptor): void;
|
|
@@ -69,7 +73,7 @@ declare class CapsKit implements ICapsKit {
|
|
|
69
73
|
emit(event: string, data: any): void;
|
|
70
74
|
getManifests(): CapsuleManifest[];
|
|
71
75
|
}
|
|
72
|
-
declare function createCapsKit(config: CapsKitConfig): Promise<
|
|
76
|
+
declare function createCapsKit(config: CapsKitConfig): Promise<any>;
|
|
73
77
|
|
|
74
78
|
declare function loadCapsules(capsulesDir: string): Promise<CapsuleManifest[]>;
|
|
75
79
|
|
package/dist/index.d.ts
CHANGED
|
@@ -41,9 +41,13 @@ interface RouteDefinition {
|
|
|
41
41
|
interface CapsKitConfig {
|
|
42
42
|
capsuleDirs?: string[];
|
|
43
43
|
dependencies?: Record<string, any>;
|
|
44
|
+
boot?: {
|
|
45
|
+
action: string;
|
|
46
|
+
payload?: any;
|
|
47
|
+
};
|
|
44
48
|
}
|
|
45
49
|
interface ICapsKit {
|
|
46
|
-
start(): Promise<
|
|
50
|
+
start(): Promise<any>;
|
|
47
51
|
call(actionName: string, payload: any): Promise<any>;
|
|
48
52
|
use<TCapsule = any>(capsuleName: string): TCapsule;
|
|
49
53
|
describe(capsuleName: string): CapsuleManifest | undefined;
|
|
@@ -59,7 +63,7 @@ declare class CapsKit implements ICapsKit {
|
|
|
59
63
|
private eventRegistry;
|
|
60
64
|
private dependencies;
|
|
61
65
|
constructor(config: CapsKitConfig);
|
|
62
|
-
start(): Promise<
|
|
66
|
+
start(): Promise<any>;
|
|
63
67
|
private registerCapsule;
|
|
64
68
|
private validateDependencies;
|
|
65
69
|
addInterceptor(interceptor: ActionInterceptor): void;
|
|
@@ -69,7 +73,7 @@ declare class CapsKit implements ICapsKit {
|
|
|
69
73
|
emit(event: string, data: any): void;
|
|
70
74
|
getManifests(): CapsuleManifest[];
|
|
71
75
|
}
|
|
72
|
-
declare function createCapsKit(config: CapsKitConfig): Promise<
|
|
76
|
+
declare function createCapsKit(config: CapsKitConfig): Promise<any>;
|
|
73
77
|
|
|
74
78
|
declare function loadCapsules(capsulesDir: string): Promise<CapsuleManifest[]>;
|
|
75
79
|
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/kernel/platform.ts
|
|
2
2
|
import * as path2 from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
3
4
|
|
|
4
5
|
// src/kernel/loader.ts
|
|
5
6
|
import * as fs from "fs";
|
|
@@ -52,6 +53,16 @@ var CapsKit = class {
|
|
|
52
53
|
eventRegistry = /* @__PURE__ */ new Map();
|
|
53
54
|
dependencies = {};
|
|
54
55
|
async start() {
|
|
56
|
+
try {
|
|
57
|
+
const currentDir = path2.dirname(fileURLToPath(import.meta.url));
|
|
58
|
+
const builtinDir = path2.resolve(currentDir, "../capsules");
|
|
59
|
+
const builtinManifests = await loadCapsules(builtinDir);
|
|
60
|
+
for (const manifest of builtinManifests) {
|
|
61
|
+
this.registerCapsule(manifest);
|
|
62
|
+
}
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.warn("[CapsKit] Could not auto-load built-in capsules:", error);
|
|
65
|
+
}
|
|
55
66
|
if (this.config.capsuleDirs) {
|
|
56
67
|
for (const dir of this.config.capsuleDirs) {
|
|
57
68
|
const absoluteDir = path2.resolve(dir);
|
|
@@ -61,6 +72,10 @@ var CapsKit = class {
|
|
|
61
72
|
}
|
|
62
73
|
}
|
|
63
74
|
}
|
|
75
|
+
if (this.config.boot) {
|
|
76
|
+
return await this.call(this.config.boot.action, this.config.boot.payload || {});
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
64
79
|
}
|
|
65
80
|
registerCapsule(manifest) {
|
|
66
81
|
this.validateDependencies(manifest);
|
|
@@ -164,7 +179,9 @@ var CapsKit = class {
|
|
|
164
179
|
}
|
|
165
180
|
};
|
|
166
181
|
async function createCapsKit(config) {
|
|
167
|
-
|
|
182
|
+
const kit = new CapsKit(config);
|
|
183
|
+
const bootResult = await kit.start();
|
|
184
|
+
return Object.assign(bootResult || {}, { capskit: kit });
|
|
168
185
|
}
|
|
169
186
|
export {
|
|
170
187
|
CapsKit,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/kernel/platform.ts","../src/kernel/loader.ts"],"sourcesContent":["import { ActionHandler, ICapsKit, CapsKitConfig, CapsuleManifest, ActionInterceptor, ActionContext, ActionDefinition } from '../types';\r\nimport * as path from 'path';\r\nimport { loadCapsules } from './loader';\r\n\r\nexport class CapsKit implements ICapsKit {\r\n private actions = new Map<string, ActionDefinition>();\r\n private manifests = new Map<string, CapsuleManifest>();\r\n private interceptors: ActionInterceptor[] = [];\r\n private eventRegistry = new Map<string, string[]>();\r\n private dependencies: Record<string, any> = {};\r\n\r\n constructor(private config: CapsKitConfig) {\r\n this.dependencies = {\r\n ...config.dependencies,\r\n capskit: this\r\n };\r\n }\r\n\r\n async start(): Promise<void> {\r\n if (this.config.capsuleDirs) {\r\n for (const dir of this.config.capsuleDirs) {\r\n const absoluteDir = path.resolve(dir);\r\n const manifests = await loadCapsules(absoluteDir);\r\n \r\n for (const manifest of manifests) {\r\n this.registerCapsule(manifest);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private registerCapsule(manifest: CapsuleManifest) {\r\n this.validateDependencies(manifest);\r\n this.manifests.set(manifest.name, manifest);\r\n\r\n for (const [actionName, definition] of Object.entries(manifest.actions)) {\r\n const fullName = `${manifest.name}.${actionName}`;\r\n if (typeof definition.handler === 'function') {\r\n this.actions.set(fullName, definition);\r\n } else {\r\n // In a real implementation, we would dynamic import here based on string path\r\n }\r\n }\r\n\r\n if (manifest.events?.subscribes) {\r\n for (const sub of manifest.events.subscribes) {\r\n const targetAction = `${manifest.name}.${sub.action}`;\r\n const existing = this.eventRegistry.get(sub.event) || [];\r\n existing.push(targetAction);\r\n this.eventRegistry.set(sub.event, existing);\r\n }\r\n }\r\n }\r\n\r\n private validateDependencies(manifest: CapsuleManifest) {\r\n if (manifest.requires) {\r\n for (const dep of manifest.requires) {\r\n if (!this.dependencies[dep]) {\r\n throw new Error(`Capsule \"${manifest.name}\" requires dependency \"${dep}\" which is not provided.`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n addInterceptor(interceptor: ActionInterceptor): void {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n async call(actionName: string, payload: any): Promise<any> {\r\n const actionDef = this.actions.get(actionName);\r\n if (!actionDef) {\r\n throw new Error(`Action \"${actionName}\" not found.`);\r\n }\r\n\r\n const handler = actionDef.handler as ActionHandler;\r\n\r\n const context: ActionContext = {\r\n params: payload?.params,\r\n body: payload?.body,\r\n query: payload?.query,\r\n deps: this.dependencies,\r\n emit: this.emit.bind(this),\r\n call: this.call.bind(this),\r\n use: this.use.bind(this)\r\n };\r\n\r\n let index = -1;\r\n const dispatch = async (i: number): Promise<any> => {\r\n if (i <= index) throw new Error('next() called multiple times');\r\n index = i;\r\n if (i === this.interceptors.length) {\r\n \r\n if (actionDef.pre) {\r\n for (const hook of actionDef.pre) {\r\n await hook(payload, context);\r\n }\r\n }\r\n\r\n let result = await handler(payload, context);\r\n\r\n if (actionDef.post) {\r\n for (const hook of actionDef.post) {\r\n const hookResult = await hook(payload, result, context);\r\n if (hookResult !== undefined) {\r\n result = hookResult;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n const interceptor = this.interceptors[i];\r\n return interceptor(actionName, payload, context, () => dispatch(i + 1));\r\n };\r\n\r\n return dispatch(0);\r\n }\r\n\r\n use<TCapsule = any>(capsuleName: string): TCapsule {\r\n return new Proxy({}, {\r\n get: (_, actionName: string | symbol) => {\r\n return async (payload: any) => {\r\n const actionPath = `${capsuleName}.${String(actionName)}`;\r\n return this.call(actionPath, payload);\r\n };\r\n }\r\n }) as TCapsule;\r\n }\r\n\r\n describe(capsuleName: string): CapsuleManifest | undefined {\r\n return this.manifests.get(capsuleName);\r\n }\r\n\r\n emit(event: string, data: any): void {\r\n // Basic event emission (can be expanded with adapters later)\r\n console.log(`[Event Bus] Emitted: ${event}`);\r\n \r\n // Asynchronously dispatch to all registered subscribers\r\n const subscribers = this.eventRegistry.get(event);\r\n if (subscribers) {\r\n for (const actionName of subscribers) {\r\n // Fire and forget, but catch errors to avoid unhandled promises\r\n this.call(actionName, data).catch(err => {\r\n console.error(`[Event Bus] Subscriber action ${actionName} failed handling event ${event}:`, err);\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Helper for internal registry access (used by system capsule later)\r\n getManifests() {\r\n return Array.from(this.manifests.values());\r\n }\r\n}\r\n\r\nexport async function createCapsKit(config: CapsKitConfig): Promise<CapsKit> {\r\n return new CapsKit(config);\r\n}\r\n","import { CapsuleManifest } from '../types';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport async function loadCapsules(capsulesDir: string): Promise<CapsuleManifest[]> {\r\n const manifests: CapsuleManifest[] = [];\r\n\r\n if (!fs.existsSync(capsulesDir)) {\r\n return manifests;\r\n }\r\n\r\n const entries = fs.readdirSync(capsulesDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n if (entry.isDirectory()) {\r\n const manifestPath = path.join(capsulesDir, entry.name, 'manifest.ts');\r\n const manifestJsPath = path.join(capsulesDir, entry.name, 'manifest.js');\r\n \r\n let finalPath = '';\r\n if (fs.existsSync(manifestPath)) {\r\n finalPath = manifestPath;\r\n } else if (fs.existsSync(manifestJsPath)) {\r\n finalPath = manifestJsPath;\r\n }\r\n\r\n if (finalPath) {\r\n try {\r\n console.log(finalPath)\r\n // In Windows, absolute paths must be prefixed with file:// for dynamic import()\r\n const module = await import(`file://${finalPath}`);\r\n const manifest = module.service || module.manifest || module.default;\r\n if (manifest) {\r\n manifests.push(manifest);\r\n }\r\n } catch (error) {\r\n console.error(`Failed to load manifest at ${finalPath}:`, error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return manifests;\r\n}\r\n"],"mappings":"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","names":["path"]}
|
|
1
|
+
{"version":3,"sources":["../src/kernel/platform.ts","../src/kernel/loader.ts"],"sourcesContent":["import { ActionHandler, ICapsKit, CapsKitConfig, CapsuleManifest, ActionInterceptor, ActionContext, ActionDefinition } from '../types';\r\nimport * as path from 'path';\r\nimport { fileURLToPath } from 'url';\r\nimport { loadCapsules } from './loader';\r\n\r\nexport class CapsKit implements ICapsKit {\r\n private actions = new Map<string, ActionDefinition>();\r\n private manifests = new Map<string, CapsuleManifest>();\r\n private interceptors: ActionInterceptor[] = [];\r\n private eventRegistry = new Map<string, string[]>();\r\n private dependencies: Record<string, any> = {};\r\n\r\n constructor(private config: CapsKitConfig) {\r\n this.dependencies = {\r\n ...config.dependencies,\r\n capskit: this\r\n };\r\n }\r\n\r\n async start(): Promise<any> {\r\n // 1. Auto-load built-in capsules\r\n try {\r\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\r\n const builtinDir = path.resolve(currentDir, '../capsules');\r\n const builtinManifests = await loadCapsules(builtinDir);\r\n for (const manifest of builtinManifests) {\r\n this.registerCapsule(manifest);\r\n }\r\n } catch (error) {\r\n console.warn('[CapsKit] Could not auto-load built-in capsules:', error);\r\n }\r\n\r\n // 2. Load custom capsules from config\r\n if (this.config.capsuleDirs) {\r\n for (const dir of this.config.capsuleDirs) {\r\n const absoluteDir = path.resolve(dir);\r\n const manifests = await loadCapsules(absoluteDir);\r\n \r\n for (const manifest of manifests) {\r\n this.registerCapsule(manifest);\r\n }\r\n }\r\n }\r\n\r\n // 3. Execute boot action if specified\r\n if (this.config.boot) {\r\n return await this.call(this.config.boot.action, this.config.boot.payload || {});\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private registerCapsule(manifest: CapsuleManifest) {\r\n this.validateDependencies(manifest);\r\n this.manifests.set(manifest.name, manifest);\r\n\r\n for (const [actionName, definition] of Object.entries(manifest.actions)) {\r\n const fullName = `${manifest.name}.${actionName}`;\r\n if (typeof definition.handler === 'function') {\r\n this.actions.set(fullName, definition);\r\n } else {\r\n // In a real implementation, we would dynamic import here based on string path\r\n }\r\n }\r\n\r\n if (manifest.events?.subscribes) {\r\n for (const sub of manifest.events.subscribes) {\r\n const targetAction = `${manifest.name}.${sub.action}`;\r\n const existing = this.eventRegistry.get(sub.event) || [];\r\n existing.push(targetAction);\r\n this.eventRegistry.set(sub.event, existing);\r\n }\r\n }\r\n }\r\n\r\n private validateDependencies(manifest: CapsuleManifest) {\r\n if (manifest.requires) {\r\n for (const dep of manifest.requires) {\r\n if (!this.dependencies[dep]) {\r\n throw new Error(`Capsule \"${manifest.name}\" requires dependency \"${dep}\" which is not provided.`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n addInterceptor(interceptor: ActionInterceptor): void {\r\n this.interceptors.push(interceptor);\r\n }\r\n\r\n async call(actionName: string, payload: any): Promise<any> {\r\n const actionDef = this.actions.get(actionName);\r\n if (!actionDef) {\r\n throw new Error(`Action \"${actionName}\" not found.`);\r\n }\r\n\r\n const handler = actionDef.handler as ActionHandler;\r\n\r\n const context: ActionContext = {\r\n params: payload?.params,\r\n body: payload?.body,\r\n query: payload?.query,\r\n deps: this.dependencies,\r\n emit: this.emit.bind(this),\r\n call: this.call.bind(this),\r\n use: this.use.bind(this)\r\n };\r\n\r\n let index = -1;\r\n const dispatch = async (i: number): Promise<any> => {\r\n if (i <= index) throw new Error('next() called multiple times');\r\n index = i;\r\n if (i === this.interceptors.length) {\r\n \r\n if (actionDef.pre) {\r\n for (const hook of actionDef.pre) {\r\n await hook(payload, context);\r\n }\r\n }\r\n\r\n let result = await handler(payload, context);\r\n\r\n if (actionDef.post) {\r\n for (const hook of actionDef.post) {\r\n const hookResult = await hook(payload, result, context);\r\n if (hookResult !== undefined) {\r\n result = hookResult;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n const interceptor = this.interceptors[i];\r\n return interceptor(actionName, payload, context, () => dispatch(i + 1));\r\n };\r\n\r\n return dispatch(0);\r\n }\r\n\r\n use<TCapsule = any>(capsuleName: string): TCapsule {\r\n return new Proxy({}, {\r\n get: (_, actionName: string | symbol) => {\r\n return async (payload: any) => {\r\n const actionPath = `${capsuleName}.${String(actionName)}`;\r\n return this.call(actionPath, payload);\r\n };\r\n }\r\n }) as TCapsule;\r\n }\r\n\r\n describe(capsuleName: string): CapsuleManifest | undefined {\r\n return this.manifests.get(capsuleName);\r\n }\r\n\r\n emit(event: string, data: any): void {\r\n // Basic event emission (can be expanded with adapters later)\r\n console.log(`[Event Bus] Emitted: ${event}`);\r\n \r\n // Asynchronously dispatch to all registered subscribers\r\n const subscribers = this.eventRegistry.get(event);\r\n if (subscribers) {\r\n for (const actionName of subscribers) {\r\n // Fire and forget, but catch errors to avoid unhandled promises\r\n this.call(actionName, data).catch(err => {\r\n console.error(`[Event Bus] Subscriber action ${actionName} failed handling event ${event}:`, err);\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Helper for internal registry access (used by system capsule later)\r\n getManifests() {\r\n return Array.from(this.manifests.values());\r\n }\r\n}\r\n\r\nexport async function createCapsKit(config: CapsKitConfig): Promise<any> {\r\n const kit = new CapsKit(config);\r\n const bootResult = await kit.start();\r\n \r\n // Return boot results merged with the kit instance for convenience\r\n return Object.assign(bootResult || {}, { capskit: kit });\r\n}\r\n\r\n","import { CapsuleManifest } from '../types';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport async function loadCapsules(capsulesDir: string): Promise<CapsuleManifest[]> {\r\n const manifests: CapsuleManifest[] = [];\r\n\r\n if (!fs.existsSync(capsulesDir)) {\r\n return manifests;\r\n }\r\n\r\n const entries = fs.readdirSync(capsulesDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n if (entry.isDirectory()) {\r\n const manifestPath = path.join(capsulesDir, entry.name, 'manifest.ts');\r\n const manifestJsPath = path.join(capsulesDir, entry.name, 'manifest.js');\r\n \r\n let finalPath = '';\r\n if (fs.existsSync(manifestPath)) {\r\n finalPath = manifestPath;\r\n } else if (fs.existsSync(manifestJsPath)) {\r\n finalPath = manifestJsPath;\r\n }\r\n\r\n if (finalPath) {\r\n try {\r\n console.log(finalPath)\r\n // In Windows, absolute paths must be prefixed with file:// for dynamic import()\r\n const module = await import(`file://${finalPath}`);\r\n const manifest = module.service || module.manifest || module.default;\r\n if (manifest) {\r\n manifests.push(manifest);\r\n }\r\n } catch (error) {\r\n console.error(`Failed to load manifest at ${finalPath}:`, error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return manifests;\r\n}\r\n"],"mappings":"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","names":["path"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mobtakronio/capskit",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "The Universal Capability Kernel - A framework-agnostic runtime for pure business logic.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -40,4 +40,4 @@
|
|
|
40
40
|
"vitepress": "^1.6.4",
|
|
41
41
|
"vue": "^3.5.30"
|
|
42
42
|
}
|
|
43
|
-
}
|
|
43
|
+
}
|