@deployforme/core 1.0.0

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.
@@ -0,0 +1,7 @@
1
+ import { RuntimeContext, HttpAdapter, Logger, DependencyContainer } from './types';
2
+ export declare class DefaultLogger implements Logger {
3
+ log(message: string): void;
4
+ error(message: string): void;
5
+ warn(message: string): void;
6
+ }
7
+ export declare function createRuntimeContext(http: HttpAdapter, container?: DependencyContainer, logger?: Logger): RuntimeContext;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultLogger = void 0;
4
+ exports.createRuntimeContext = createRuntimeContext;
5
+ class DefaultLogger {
6
+ log(message) {
7
+ console.log(`[Deploy4Me] ${message}`);
8
+ }
9
+ error(message) {
10
+ console.error(`[Deploy4Me] ERROR: ${message}`);
11
+ }
12
+ warn(message) {
13
+ console.warn(`[Deploy4Me] WARN: ${message}`);
14
+ }
15
+ }
16
+ exports.DefaultLogger = DefaultLogger;
17
+ function createRuntimeContext(http, container, logger) {
18
+ return {
19
+ http,
20
+ container,
21
+ logger: logger || new DefaultLogger()
22
+ };
23
+ }
@@ -0,0 +1,5 @@
1
+ export { Kernel } from './kernel';
2
+ export { ModuleRegistry } from './module-registry';
3
+ export { ModuleLoader } from './loader';
4
+ export { createRuntimeContext, DefaultLogger } from './context';
5
+ export * from './types';
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.DefaultLogger = exports.createRuntimeContext = exports.ModuleLoader = exports.ModuleRegistry = exports.Kernel = void 0;
18
+ var kernel_1 = require("./kernel");
19
+ Object.defineProperty(exports, "Kernel", { enumerable: true, get: function () { return kernel_1.Kernel; } });
20
+ var module_registry_1 = require("./module-registry");
21
+ Object.defineProperty(exports, "ModuleRegistry", { enumerable: true, get: function () { return module_registry_1.ModuleRegistry; } });
22
+ var loader_1 = require("./loader");
23
+ Object.defineProperty(exports, "ModuleLoader", { enumerable: true, get: function () { return loader_1.ModuleLoader; } });
24
+ var context_1 = require("./context");
25
+ Object.defineProperty(exports, "createRuntimeContext", { enumerable: true, get: function () { return context_1.createRuntimeContext; } });
26
+ Object.defineProperty(exports, "DefaultLogger", { enumerable: true, get: function () { return context_1.DefaultLogger; } });
27
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,13 @@
1
+ import { RuntimeContext } from './types';
2
+ export declare class Kernel {
3
+ private registry;
4
+ private loader;
5
+ private context;
6
+ private routeTracker;
7
+ constructor(context: RuntimeContext);
8
+ load(modulePath: string): Promise<void>;
9
+ unload(moduleName: string): Promise<void>;
10
+ reload(modulePath: string): Promise<void>;
11
+ list(): import("./types").ModuleMetadata[];
12
+ get(moduleName: string): import("./types").ModuleMetadata | undefined;
13
+ }
package/dist/kernel.js ADDED
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Kernel = void 0;
4
+ const module_registry_1 = require("./module-registry");
5
+ const loader_1 = require("./loader");
6
+ class Kernel {
7
+ constructor(context) {
8
+ this.routeTracker = new Map();
9
+ this.context = context;
10
+ this.registry = new module_registry_1.ModuleRegistry();
11
+ this.loader = new loader_1.ModuleLoader();
12
+ }
13
+ async load(modulePath) {
14
+ const module = await this.loader.load(modulePath);
15
+ // Unload existing module if present
16
+ if (this.registry.has(module.name)) {
17
+ await this.unload(module.name);
18
+ }
19
+ this.context.logger?.log(`Loading module: ${module.name}@${module.version}`);
20
+ // Track routes registered during module.register()
21
+ const routeIds = [];
22
+ const originalRegister = this.context.http.registerRoute.bind(this.context.http);
23
+ this.context.http.registerRoute = (definition) => {
24
+ routeIds.push(definition.id);
25
+ originalRegister(definition);
26
+ };
27
+ // Register module
28
+ module.register(this.context);
29
+ // Restore original registerRoute
30
+ this.context.http.registerRoute = originalRegister;
31
+ // Store in registry
32
+ this.registry.register(module, routeIds);
33
+ this.routeTracker.set(module.name, routeIds);
34
+ this.context.logger?.log(`Module loaded: ${module.name} (${routeIds.length} routes)`);
35
+ }
36
+ async unload(moduleName) {
37
+ const metadata = this.registry.get(moduleName);
38
+ if (!metadata) {
39
+ this.context.logger?.warn(`Module not found: ${moduleName}`);
40
+ return;
41
+ }
42
+ this.context.logger?.log(`Unloading module: ${moduleName}`);
43
+ // Call dispose if exists
44
+ if (metadata.module.dispose) {
45
+ metadata.module.dispose();
46
+ }
47
+ // Unregister all routes
48
+ const routeIds = this.routeTracker.get(moduleName) || [];
49
+ for (const routeId of routeIds) {
50
+ this.context.http.unregisterRoute(routeId);
51
+ }
52
+ // Remove from registry
53
+ this.registry.unregister(moduleName);
54
+ this.routeTracker.delete(moduleName);
55
+ this.context.logger?.log(`Module unloaded: ${moduleName}`);
56
+ }
57
+ async reload(modulePath) {
58
+ await this.load(modulePath);
59
+ }
60
+ list() {
61
+ return this.registry.list();
62
+ }
63
+ get(moduleName) {
64
+ return this.registry.get(moduleName);
65
+ }
66
+ }
67
+ exports.Kernel = Kernel;
@@ -0,0 +1,6 @@
1
+ import { RuntimeModule } from './types';
2
+ export declare class ModuleLoader {
3
+ load(modulePath: string): Promise<RuntimeModule>;
4
+ private clearCache;
5
+ private isValidModule;
6
+ }
package/dist/loader.js ADDED
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ModuleLoader = void 0;
37
+ const path = __importStar(require("path"));
38
+ class ModuleLoader {
39
+ async load(modulePath) {
40
+ const resolvedPath = path.resolve(modulePath);
41
+ // Clear require cache for hot reload
42
+ this.clearCache(resolvedPath);
43
+ const moduleExport = require(resolvedPath);
44
+ const module = moduleExport.default || moduleExport;
45
+ if (!this.isValidModule(module)) {
46
+ throw new Error(`Invalid module at ${modulePath}: must implement RuntimeModule interface`);
47
+ }
48
+ return module;
49
+ }
50
+ clearCache(modulePath) {
51
+ delete require.cache[require.resolve(modulePath)];
52
+ }
53
+ isValidModule(obj) {
54
+ return (obj &&
55
+ typeof obj.name === 'string' &&
56
+ typeof obj.version === 'string' &&
57
+ typeof obj.register === 'function');
58
+ }
59
+ }
60
+ exports.ModuleLoader = ModuleLoader;
@@ -0,0 +1,9 @@
1
+ import { ModuleMetadata, RuntimeModule } from './types';
2
+ export declare class ModuleRegistry {
3
+ private modules;
4
+ register(module: RuntimeModule, routeIds: string[]): void;
5
+ unregister(name: string): ModuleMetadata | undefined;
6
+ get(name: string): ModuleMetadata | undefined;
7
+ has(name: string): boolean;
8
+ list(): ModuleMetadata[];
9
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ModuleRegistry = void 0;
4
+ class ModuleRegistry {
5
+ constructor() {
6
+ this.modules = new Map();
7
+ }
8
+ register(module, routeIds) {
9
+ this.modules.set(module.name, {
10
+ module,
11
+ version: module.version,
12
+ registeredRoutes: routeIds,
13
+ loadedAt: new Date()
14
+ });
15
+ }
16
+ unregister(name) {
17
+ const metadata = this.modules.get(name);
18
+ if (metadata) {
19
+ this.modules.delete(name);
20
+ }
21
+ return metadata;
22
+ }
23
+ get(name) {
24
+ return this.modules.get(name);
25
+ }
26
+ has(name) {
27
+ return this.modules.has(name);
28
+ }
29
+ list() {
30
+ return Array.from(this.modules.values());
31
+ }
32
+ }
33
+ exports.ModuleRegistry = ModuleRegistry;
@@ -0,0 +1,37 @@
1
+ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
2
+ export interface RouteDefinition {
3
+ id: string;
4
+ method: HttpMethod;
5
+ path: string;
6
+ handler: Function;
7
+ }
8
+ export interface HttpAdapter {
9
+ registerRoute(definition: RouteDefinition): void;
10
+ unregisterRoute(id: string): void;
11
+ }
12
+ export interface Logger {
13
+ log(message: string): void;
14
+ error(message: string): void;
15
+ warn(message: string): void;
16
+ }
17
+ export interface DependencyContainer {
18
+ get<T>(token: string): T;
19
+ register<T>(token: string, value: T): void;
20
+ }
21
+ export interface RuntimeContext {
22
+ http: HttpAdapter;
23
+ container?: DependencyContainer;
24
+ logger?: Logger;
25
+ }
26
+ export interface RuntimeModule {
27
+ name: string;
28
+ version: string;
29
+ register(context: RuntimeContext): void;
30
+ dispose?(): void;
31
+ }
32
+ export interface ModuleMetadata {
33
+ module: RuntimeModule;
34
+ version: string;
35
+ registeredRoutes: string[];
36
+ loadedAt: Date;
37
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@deployforme/core",
3
+ "version": "1.0.0",
4
+ "description": "Framework-agnostic runtime module management kernel",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "keywords": ["deploy4me", "hot-reload", "module-loading", "zero-downtime"],
8
+ "author": "Your Name <your.email@example.com>",
9
+ "license": "MIT",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/yourusername/deploy4me.git",
13
+ "directory": "packages/core"
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "dev": "tsc --watch",
22
+ "prepublishOnly": "pnpm build"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^20.0.0",
26
+ "typescript": "^5.3.0"
27
+ }
28
+ }