@cinnabun/core 0.0.1 → 0.0.2
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/__tests__/autowired.test.d.ts +1 -0
- package/dist/__tests__/autowired.test.js +109 -0
- package/dist/__tests__/autowired.test.js.map +1 -0
- package/dist/__tests__/cinnabun-application.test.d.ts +1 -0
- package/dist/__tests__/cinnabun-application.test.js +96 -0
- package/dist/__tests__/cinnabun-application.test.js.map +1 -0
- package/dist/__tests__/cinnabun-factory.test.d.ts +1 -0
- package/dist/__tests__/cinnabun-factory.test.js +269 -0
- package/dist/__tests__/cinnabun-factory.test.js.map +1 -0
- package/dist/__tests__/circular-dependency.test.d.ts +1 -0
- package/dist/__tests__/circular-dependency.test.js +318 -0
- package/dist/__tests__/circular-dependency.test.js.map +1 -0
- package/dist/__tests__/compression.test.d.ts +1 -0
- package/dist/__tests__/compression.test.js +459 -0
- package/dist/__tests__/compression.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +1 -0
- package/dist/__tests__/config.test.js +86 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/cors.test.d.ts +1 -0
- package/dist/__tests__/cors.test.js +575 -0
- package/dist/__tests__/cors.test.js.map +1 -0
- package/dist/__tests__/env-config.test.d.ts +1 -0
- package/dist/__tests__/env-config.test.js +367 -0
- package/dist/__tests__/env-config.test.js.map +1 -0
- package/dist/__tests__/exception.test.d.ts +1 -0
- package/dist/__tests__/exception.test.js +207 -0
- package/dist/__tests__/exception.test.js.map +1 -0
- package/dist/__tests__/guards-interceptors.test.d.ts +1 -0
- package/dist/__tests__/guards-interceptors.test.js +660 -0
- package/dist/__tests__/guards-interceptors.test.js.map +1 -0
- package/dist/__tests__/health-check.test.d.ts +1 -0
- package/dist/__tests__/health-check.test.js +240 -0
- package/dist/__tests__/health-check.test.js.map +1 -0
- package/dist/__tests__/http.test.d.ts +1 -0
- package/dist/__tests__/http.test.js +629 -0
- package/dist/__tests__/http.test.js.map +1 -0
- package/dist/__tests__/integration/e2e.test.d.ts +1 -0
- package/dist/__tests__/integration/e2e.test.js +192 -0
- package/dist/__tests__/integration/e2e.test.js.map +1 -0
- package/dist/__tests__/integration/performance.bench.d.ts +1 -0
- package/dist/__tests__/integration/performance.bench.js +129 -0
- package/dist/__tests__/integration/performance.bench.js.map +1 -0
- package/dist/__tests__/integration/validation.test.d.ts +1 -0
- package/dist/__tests__/integration/validation.test.js +133 -0
- package/dist/__tests__/integration/validation.test.js.map +1 -0
- package/dist/__tests__/lifecycle-management.test.d.ts +1 -0
- package/dist/__tests__/lifecycle-management.test.js +688 -0
- package/dist/__tests__/lifecycle-management.test.js.map +1 -0
- package/dist/__tests__/lifecycle.test.d.ts +1 -0
- package/dist/__tests__/lifecycle.test.js +196 -0
- package/dist/__tests__/lifecycle.test.js.map +1 -0
- package/dist/__tests__/logger.test.d.ts +1 -0
- package/dist/__tests__/logger.test.js +109 -0
- package/dist/__tests__/logger.test.js.map +1 -0
- package/dist/__tests__/middleware.test.d.ts +1 -0
- package/dist/__tests__/middleware.test.js +329 -0
- package/dist/__tests__/middleware.test.js.map +1 -0
- package/dist/__tests__/module.test.d.ts +1 -0
- package/dist/__tests__/module.test.js +280 -0
- package/dist/__tests__/module.test.js.map +1 -0
- package/dist/__tests__/plugin.test.d.ts +1 -0
- package/dist/__tests__/plugin.test.js +283 -0
- package/dist/__tests__/plugin.test.js.map +1 -0
- package/dist/__tests__/request-logger.test.d.ts +1 -0
- package/dist/__tests__/request-logger.test.js +342 -0
- package/dist/__tests__/request-logger.test.js.map +1 -0
- package/dist/__tests__/request-mapping.test.d.ts +1 -0
- package/dist/__tests__/request-mapping.test.js +201 -0
- package/dist/__tests__/request-mapping.test.js.map +1 -0
- package/dist/__tests__/routes.test.d.ts +1 -0
- package/dist/__tests__/routes.test.js +119 -0
- package/dist/__tests__/routes.test.js.map +1 -0
- package/dist/__tests__/scan-fixtures/controllers/hello.controller.d.ts +4 -0
- package/dist/__tests__/scan-fixtures/controllers/hello.controller.js +28 -0
- package/dist/__tests__/scan-fixtures/controllers/hello.controller.js.map +1 -0
- package/dist/__tests__/scan-fixtures/modules/feature.module.d.ts +6 -0
- package/dist/__tests__/scan-fixtures/modules/feature.module.js +28 -0
- package/dist/__tests__/scan-fixtures/modules/feature.module.js.map +1 -0
- package/dist/__tests__/scan-fixtures/services/greeting.service.d.ts +4 -0
- package/dist/__tests__/scan-fixtures/services/greeting.service.js +18 -0
- package/dist/__tests__/scan-fixtures/services/greeting.service.js.map +1 -0
- package/dist/__tests__/scanner.test.d.ts +1 -0
- package/dist/__tests__/scanner.test.js +49 -0
- package/dist/__tests__/scanner.test.js.map +1 -0
- package/dist/__tests__/validation.test.d.ts +1 -0
- package/dist/__tests__/validation.test.js +561 -0
- package/dist/__tests__/validation.test.js.map +1 -0
- package/dist/__tests__/websocket-auth.test.d.ts +1 -0
- package/dist/__tests__/websocket-auth.test.js +431 -0
- package/dist/__tests__/websocket-auth.test.js.map +1 -0
- package/dist/__tests__/websocket-decorators.test.d.ts +1 -0
- package/dist/__tests__/websocket-decorators.test.js +173 -0
- package/dist/__tests__/websocket-decorators.test.js.map +1 -0
- package/dist/__tests__/websocket-validation.test.d.ts +1 -0
- package/dist/__tests__/websocket-validation.test.js +827 -0
- package/dist/__tests__/websocket-validation.test.js.map +1 -0
- package/dist/__tests__/websocket.test.d.ts +1 -0
- package/dist/__tests__/websocket.test.js +415 -0
- package/dist/__tests__/websocket.test.js.map +1 -0
- package/dist/config/config.module.d.ts +2 -0
- package/dist/config/config.module.js +18 -0
- package/dist/config/config.module.js.map +1 -0
- package/dist/config/config.service.d.ts +15 -0
- package/dist/config/config.service.js +58 -0
- package/dist/config/config.service.js.map +1 -0
- package/dist/config/schemas.d.ts +107 -0
- package/dist/config/schemas.js +87 -0
- package/dist/config/schemas.js.map +1 -0
- package/dist/core/app.d.ts +44 -0
- package/dist/core/app.js +178 -0
- package/dist/core/app.js.map +1 -0
- package/dist/core/cinnabun-factory.d.ts +5 -0
- package/dist/core/cinnabun-factory.js +130 -0
- package/dist/core/cinnabun-factory.js.map +1 -0
- package/dist/core/config-loader.d.ts +2 -0
- package/dist/core/config-loader.js +76 -0
- package/dist/core/config-loader.js.map +1 -0
- package/dist/core/config.d.ts +12 -0
- package/dist/core/config.js +27 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/container.d.ts +10 -0
- package/dist/core/container.js +82 -0
- package/dist/core/container.js.map +1 -0
- package/dist/core/dependency-validator.d.ts +12 -0
- package/dist/core/dependency-validator.js +76 -0
- package/dist/core/dependency-validator.js.map +1 -0
- package/dist/core/guard.d.ts +3 -0
- package/dist/core/guard.js +2 -0
- package/dist/core/guard.js.map +1 -0
- package/dist/core/interceptor.d.ts +4 -0
- package/dist/core/interceptor.js +2 -0
- package/dist/core/interceptor.js.map +1 -0
- package/dist/core/logger.d.ts +15 -0
- package/dist/core/logger.js +71 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/module-resolver.d.ts +6 -0
- package/dist/core/module-resolver.js +67 -0
- package/dist/core/module-resolver.js.map +1 -0
- package/dist/core/plugin.d.ts +12 -0
- package/dist/core/plugin.js +2 -0
- package/dist/core/plugin.js.map +1 -0
- package/dist/core/router.d.ts +38 -0
- package/dist/core/router.js +406 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/scanner.d.ts +7 -0
- package/dist/core/scanner.js +83 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/shutdown-manager.d.ts +15 -0
- package/dist/core/shutdown-manager.js +68 -0
- package/dist/core/shutdown-manager.js.map +1 -0
- package/dist/core/websocket-handler.d.ts +41 -0
- package/dist/core/websocket-handler.js +242 -0
- package/dist/core/websocket-handler.js.map +1 -0
- package/dist/decorators/autowired.d.ts +3 -0
- package/dist/decorators/autowired.js +11 -0
- package/dist/decorators/autowired.js.map +1 -0
- package/dist/decorators/cinnabun-application.d.ts +14 -0
- package/dist/decorators/cinnabun-application.js +17 -0
- package/dist/decorators/cinnabun-application.js.map +1 -0
- package/dist/decorators/lifecycle.d.ts +2 -0
- package/dist/decorators/lifecycle.js +12 -0
- package/dist/decorators/lifecycle.js.map +1 -0
- package/dist/decorators/middleware.d.ts +2 -0
- package/dist/decorators/middleware.js +12 -0
- package/dist/decorators/middleware.js.map +1 -0
- package/dist/decorators/module.d.ts +10 -0
- package/dist/decorators/module.js +13 -0
- package/dist/decorators/module.js.map +1 -0
- package/dist/decorators/on-shutdown.d.ts +1 -0
- package/dist/decorators/on-shutdown.js +10 -0
- package/dist/decorators/on-shutdown.js.map +1 -0
- package/dist/decorators/params.d.ts +6 -0
- package/dist/decorators/params.js +31 -0
- package/dist/decorators/params.js.map +1 -0
- package/dist/decorators/request-mapping.d.ts +7 -0
- package/dist/decorators/request-mapping.js +34 -0
- package/dist/decorators/request-mapping.js.map +1 -0
- package/dist/decorators/response.d.ts +2 -0
- package/dist/decorators/response.js +17 -0
- package/dist/decorators/response.js.map +1 -0
- package/dist/decorators/rest-controller.d.ts +1 -0
- package/dist/decorators/rest-controller.js +19 -0
- package/dist/decorators/rest-controller.js.map +1 -0
- package/dist/decorators/routes.d.ts +5 -0
- package/dist/decorators/routes.js +19 -0
- package/dist/decorators/routes.js.map +1 -0
- package/dist/decorators/service.d.ts +1 -0
- package/dist/decorators/service.js +7 -0
- package/dist/decorators/service.js.map +1 -0
- package/dist/decorators/use-guard.d.ts +2 -0
- package/dist/decorators/use-guard.js +12 -0
- package/dist/decorators/use-guard.js.map +1 -0
- package/dist/decorators/use-interceptor.d.ts +2 -0
- package/dist/decorators/use-interceptor.js +12 -0
- package/dist/decorators/use-interceptor.js.map +1 -0
- package/dist/decorators/validate.d.ts +12 -0
- package/dist/decorators/validate.js +7 -0
- package/dist/decorators/validate.js.map +1 -0
- package/dist/decorators/websocket.d.ts +9 -0
- package/dist/decorators/websocket.js +38 -0
- package/dist/decorators/websocket.js.map +1 -0
- package/dist/decorators/ws-event.d.ts +28 -0
- package/dist/decorators/ws-event.js +37 -0
- package/dist/decorators/ws-event.js.map +1 -0
- package/dist/decorators/ws-gateway.d.ts +18 -0
- package/dist/decorators/ws-gateway.js +24 -0
- package/dist/decorators/ws-gateway.js.map +1 -0
- package/dist/dev/index.d.ts +6 -0
- package/dist/dev/index.js +28 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/exceptions/circular-dependency-error.d.ts +5 -0
- package/dist/exceptions/circular-dependency-error.js +16 -0
- package/dist/exceptions/circular-dependency-error.js.map +1 -0
- package/dist/exceptions/http-exception.d.ts +41 -0
- package/dist/exceptions/http-exception.js +96 -0
- package/dist/exceptions/http-exception.js.map +1 -0
- package/dist/guards/jwt-websocket.guard.d.ts +11 -0
- package/dist/guards/jwt-websocket.guard.js +37 -0
- package/dist/guards/jwt-websocket.guard.js.map +1 -0
- package/dist/guards/websocket-auth.guard.d.ts +16 -0
- package/dist/guards/websocket-auth.guard.js +43 -0
- package/dist/guards/websocket-auth.guard.js.map +1 -0
- package/dist/health/health-check.service.d.ts +45 -0
- package/dist/health/health-check.service.js +95 -0
- package/dist/health/health-check.service.js.map +1 -0
- package/dist/health/health.controller.d.ts +15 -0
- package/dist/health/health.controller.js +63 -0
- package/dist/health/health.controller.js.map +1 -0
- package/dist/health/health.module.d.ts +2 -0
- package/dist/health/health.module.js +20 -0
- package/dist/health/health.module.js.map +1 -0
- package/dist/index.d.ts +74 -11
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata/storage.d.ts +171 -0
- package/dist/metadata/storage.js +257 -0
- package/dist/metadata/storage.js.map +1 -0
- package/dist/middleware/compression.middleware.d.ts +32 -0
- package/dist/middleware/compression.middleware.js +113 -0
- package/dist/middleware/compression.middleware.js.map +1 -0
- package/dist/middleware/cors.middleware.d.ts +18 -0
- package/dist/middleware/cors.middleware.js +79 -0
- package/dist/middleware/cors.middleware.js.map +1 -0
- package/dist/middleware/performance-tracker.middleware.d.ts +35 -0
- package/dist/middleware/performance-tracker.middleware.js +79 -0
- package/dist/middleware/performance-tracker.middleware.js.map +1 -0
- package/dist/middleware/request-logger.middleware.d.ts +32 -0
- package/dist/middleware/request-logger.middleware.js +125 -0
- package/dist/middleware/request-logger.middleware.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/validation/helpers.d.ts +36 -0
- package/dist/validation/helpers.js +27 -0
- package/dist/validation/helpers.js.map +1 -0
- package/dist/websocket/error.d.ts +27 -0
- package/dist/websocket/error.js +38 -0
- package/dist/websocket/error.js.map +1 -0
- package/package.json +38 -5
- package/LICENSE +0 -9
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service for loading file-based configuration (cinnabun.config.ts)
|
|
3
|
+
* For environment variable validation, use ConfigService from config/config.service.ts
|
|
4
|
+
*/
|
|
5
|
+
export declare class FileConfigService {
|
|
6
|
+
private config;
|
|
7
|
+
constructor(config: Record<string, any>);
|
|
8
|
+
get<T>(path: string, defaultValue: T): T;
|
|
9
|
+
get<T>(path: string): T | undefined;
|
|
10
|
+
getOrThrow<T>(path: string): T;
|
|
11
|
+
getAll(): Record<string, any>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service for loading file-based configuration (cinnabun.config.ts)
|
|
3
|
+
* For environment variable validation, use ConfigService from config/config.service.ts
|
|
4
|
+
*/
|
|
5
|
+
export class FileConfigService {
|
|
6
|
+
config;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
get(path, defaultValue) {
|
|
11
|
+
const value = path
|
|
12
|
+
.split(".")
|
|
13
|
+
.reduce((obj, key) => obj?.[key], this.config);
|
|
14
|
+
return value ?? defaultValue;
|
|
15
|
+
}
|
|
16
|
+
getOrThrow(path) {
|
|
17
|
+
const value = this.get(path);
|
|
18
|
+
if (value === undefined) {
|
|
19
|
+
throw new Error(`Configuration key "${path}" is required but not found`);
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
getAll() {
|
|
24
|
+
return { ...this.config };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAsB;IAEpC,YAAY,MAA2B;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAID,GAAG,CAAI,IAAY,EAAE,YAAgB;QACnC,MAAM,KAAK,GAAG,IAAI;aACf,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,CAAC,GAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,OAAQ,KAAW,IAAI,YAAY,CAAC;IACtC,CAAC;IAED,UAAU,CAAI,IAAY;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAI,IAAI,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,6BAA6B,CACxD,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Constructor } from "../metadata/storage.js";
|
|
2
|
+
export declare class Container {
|
|
3
|
+
private instances;
|
|
4
|
+
resolve<T>(target: Constructor<T>, resolving?: Set<Constructor>): T;
|
|
5
|
+
registerInstance<T>(target: Constructor<T>, instance: T): void;
|
|
6
|
+
shutdown(): Promise<void>;
|
|
7
|
+
getProviders(): Array<{
|
|
8
|
+
name: string;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { metadataStorage } from "../metadata/storage.js";
|
|
2
|
+
import { Logger } from "./logger.js";
|
|
3
|
+
import { CircularDependencyError } from "../exceptions/circular-dependency-error.js";
|
|
4
|
+
export class Container {
|
|
5
|
+
instances = new Map();
|
|
6
|
+
resolve(target, resolving) {
|
|
7
|
+
if (this.instances.has(target)) {
|
|
8
|
+
return this.instances.get(target);
|
|
9
|
+
}
|
|
10
|
+
const chain = resolving ?? new Set();
|
|
11
|
+
if (chain.has(target)) {
|
|
12
|
+
const cycleChain = [...chain, target];
|
|
13
|
+
throw new CircularDependencyError(cycleChain);
|
|
14
|
+
}
|
|
15
|
+
chain.add(target);
|
|
16
|
+
const paramTypes = Reflect.getMetadata("design:paramtypes", target) || [];
|
|
17
|
+
const params = paramTypes.map((p) => {
|
|
18
|
+
if (p === Logger) {
|
|
19
|
+
return new Logger(target.name);
|
|
20
|
+
}
|
|
21
|
+
return this.resolve(p, chain);
|
|
22
|
+
});
|
|
23
|
+
const instance = new target(...params);
|
|
24
|
+
const injections = metadataStorage.getFieldInjectionsFor(target);
|
|
25
|
+
for (const injection of injections) {
|
|
26
|
+
if (injection.type === Logger) {
|
|
27
|
+
instance[injection.propertyKey] = new Logger(target.name);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
instance[injection.propertyKey] = this.resolve(injection.type, chain);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const postConstruct = metadataStorage.getPostConstruct(target);
|
|
34
|
+
if (postConstruct) {
|
|
35
|
+
instance[postConstruct]();
|
|
36
|
+
}
|
|
37
|
+
chain.delete(target);
|
|
38
|
+
this.instances.set(target, instance);
|
|
39
|
+
return instance;
|
|
40
|
+
}
|
|
41
|
+
registerInstance(target, instance) {
|
|
42
|
+
this.instances.set(target, instance);
|
|
43
|
+
}
|
|
44
|
+
async shutdown() {
|
|
45
|
+
const logger = new Logger("Container");
|
|
46
|
+
const errors = [];
|
|
47
|
+
// Execute all PreDestroy hooks in parallel
|
|
48
|
+
const shutdownPromises = Array.from(this.instances.entries()).map(async ([constructor, instance]) => {
|
|
49
|
+
const preDestroy = metadataStorage.getPreDestroy(constructor);
|
|
50
|
+
if (preDestroy) {
|
|
51
|
+
try {
|
|
52
|
+
await instance[preDestroy]();
|
|
53
|
+
logger.debug(`✓ ${constructor.name} PreDestroy completed`);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
logger.error(`✗ ${constructor.name} PreDestroy failed:`, error);
|
|
57
|
+
errors.push({
|
|
58
|
+
className: constructor.name,
|
|
59
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
await Promise.allSettled(shutdownPromises);
|
|
65
|
+
// Clear instances even if some PreDestroy hooks failed
|
|
66
|
+
this.instances.clear();
|
|
67
|
+
if (errors.length > 0) {
|
|
68
|
+
logger.warn(`Container shutdown completed with ${errors.length} PreDestroy error(s)`);
|
|
69
|
+
// Don't throw - let shutdown continue
|
|
70
|
+
// But log all errors for debugging
|
|
71
|
+
errors.forEach(({ className, error }) => {
|
|
72
|
+
logger.error(` • ${className}: ${error.message}`);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
getProviders() {
|
|
77
|
+
return Array.from(this.instances.keys()).map((constructor) => ({
|
|
78
|
+
name: constructor.name,
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/core/container.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Constructor } from "../metadata/storage.js";
|
|
2
|
+
export interface DependencyGraph {
|
|
3
|
+
[key: string]: string[];
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Detects cycles in dependency graph using Tarjan's algorithm
|
|
7
|
+
*/
|
|
8
|
+
export declare function detectCycles(providers: Constructor[]): Constructor[][];
|
|
9
|
+
/**
|
|
10
|
+
* Validates all providers for circular dependencies at startup
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateDependencies(providers: Constructor[]): void;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { metadataStorage } from "../metadata/storage.js";
|
|
2
|
+
import { CircularDependencyError } from "../exceptions/circular-dependency-error.js";
|
|
3
|
+
/**
|
|
4
|
+
* Detects cycles in dependency graph using Tarjan's algorithm
|
|
5
|
+
*/
|
|
6
|
+
export function detectCycles(providers) {
|
|
7
|
+
const graph = buildDependencyGraph(providers);
|
|
8
|
+
const cycles = [];
|
|
9
|
+
// Tarjan's strongly connected components algorithm
|
|
10
|
+
const index = new Map();
|
|
11
|
+
const lowLink = new Map();
|
|
12
|
+
const onStack = new Set();
|
|
13
|
+
const stack = [];
|
|
14
|
+
let indexCounter = 0;
|
|
15
|
+
function strongConnect(nodeName) {
|
|
16
|
+
index.set(nodeName, indexCounter);
|
|
17
|
+
lowLink.set(nodeName, indexCounter);
|
|
18
|
+
indexCounter++;
|
|
19
|
+
stack.push(nodeName);
|
|
20
|
+
onStack.add(nodeName);
|
|
21
|
+
const dependencies = graph[nodeName] || [];
|
|
22
|
+
for (const depName of dependencies) {
|
|
23
|
+
if (!index.has(depName)) {
|
|
24
|
+
strongConnect(depName);
|
|
25
|
+
lowLink.set(nodeName, Math.min(lowLink.get(nodeName), lowLink.get(depName)));
|
|
26
|
+
}
|
|
27
|
+
else if (onStack.has(depName)) {
|
|
28
|
+
lowLink.set(nodeName, Math.min(lowLink.get(nodeName), index.get(depName)));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// If nodeName is a root node, pop the stack and find SCC
|
|
32
|
+
if (lowLink.get(nodeName) === index.get(nodeName)) {
|
|
33
|
+
const component = [];
|
|
34
|
+
let w;
|
|
35
|
+
do {
|
|
36
|
+
w = stack.pop();
|
|
37
|
+
onStack.delete(w);
|
|
38
|
+
component.push(w);
|
|
39
|
+
} while (w !== nodeName);
|
|
40
|
+
// If component has more than 1 node, it's a cycle
|
|
41
|
+
if (component.length > 1) {
|
|
42
|
+
const constructors = component.map(name => providers.find(p => p.name === name)).filter(Boolean);
|
|
43
|
+
cycles.push(constructors);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
for (const nodeName of Object.keys(graph)) {
|
|
48
|
+
if (!index.has(nodeName)) {
|
|
49
|
+
strongConnect(nodeName);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return cycles;
|
|
53
|
+
}
|
|
54
|
+
function buildDependencyGraph(providers) {
|
|
55
|
+
const graph = {};
|
|
56
|
+
for (const provider of providers) {
|
|
57
|
+
const deps = metadataStorage.getConstructorParams(provider);
|
|
58
|
+
graph[provider.name] = deps.map(d => d.name);
|
|
59
|
+
}
|
|
60
|
+
return graph;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Validates all providers for circular dependencies at startup
|
|
64
|
+
*/
|
|
65
|
+
export function validateDependencies(providers) {
|
|
66
|
+
const cycles = detectCycles(providers);
|
|
67
|
+
if (cycles.length > 0) {
|
|
68
|
+
console.error(`\n⚠️ Found ${cycles.length} circular dependency cycle(s):\n`);
|
|
69
|
+
cycles.forEach((cycle, i) => {
|
|
70
|
+
console.error(`\n${i + 1}. ${cycle.map(c => c.name).join(" → ")}`);
|
|
71
|
+
});
|
|
72
|
+
console.error("\n");
|
|
73
|
+
throw new CircularDependencyError(cycles[0]);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=dependency-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-validator.js","sourceRoot":"","sources":["../../src/core/dependency-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/core/guard.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../src/core/interceptor.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type LogLevel = "debug" | "info" | "warn" | "error";
|
|
2
|
+
export declare class Logger {
|
|
3
|
+
private static globalLevel;
|
|
4
|
+
private static globalMetadata;
|
|
5
|
+
private context;
|
|
6
|
+
constructor(context?: string);
|
|
7
|
+
static setLevel(level: LogLevel): void;
|
|
8
|
+
static setGlobalMetadata(metadata: Record<string, any>): void;
|
|
9
|
+
private format;
|
|
10
|
+
debug(message: string, meta?: any): void;
|
|
11
|
+
info(message: string, meta?: any): void;
|
|
12
|
+
warn(message: string, meta?: any): void;
|
|
13
|
+
error(message: string, meta?: any): void;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const LEVEL_PRIORITY = {
|
|
2
|
+
debug: 0,
|
|
3
|
+
info: 1,
|
|
4
|
+
warn: 2,
|
|
5
|
+
error: 3,
|
|
6
|
+
};
|
|
7
|
+
export class Logger {
|
|
8
|
+
static globalLevel = "info";
|
|
9
|
+
static globalMetadata = {};
|
|
10
|
+
context;
|
|
11
|
+
constructor(context = "Cinnabun") {
|
|
12
|
+
this.context = context;
|
|
13
|
+
}
|
|
14
|
+
static setLevel(level) {
|
|
15
|
+
Logger.globalLevel = level;
|
|
16
|
+
}
|
|
17
|
+
static setGlobalMetadata(metadata) {
|
|
18
|
+
Logger.globalMetadata = { ...Logger.globalMetadata, ...metadata };
|
|
19
|
+
}
|
|
20
|
+
format(level, message, meta) {
|
|
21
|
+
const timestamp = new Date().toISOString();
|
|
22
|
+
const pid = process.pid;
|
|
23
|
+
const logObject = {
|
|
24
|
+
timestamp,
|
|
25
|
+
level,
|
|
26
|
+
context: this.context,
|
|
27
|
+
pid,
|
|
28
|
+
message,
|
|
29
|
+
...Logger.globalMetadata,
|
|
30
|
+
...meta,
|
|
31
|
+
};
|
|
32
|
+
// Pretty print in development
|
|
33
|
+
if (process.env.NODE_ENV !== "production") {
|
|
34
|
+
const color = {
|
|
35
|
+
debug: "\x1b[36m",
|
|
36
|
+
info: "\x1b[32m",
|
|
37
|
+
warn: "\x1b[33m",
|
|
38
|
+
error: "\x1b[31m",
|
|
39
|
+
}[level] || "";
|
|
40
|
+
const reset = "\x1b[0m";
|
|
41
|
+
return `${color}[${level.toUpperCase()}]${reset} ${timestamp} [${this.context}] ${message}${meta ? " " + JSON.stringify(meta, null, 2) : ""}`;
|
|
42
|
+
}
|
|
43
|
+
// JSON in production
|
|
44
|
+
return JSON.stringify(logObject);
|
|
45
|
+
}
|
|
46
|
+
debug(message, meta) {
|
|
47
|
+
if (LEVEL_PRIORITY["debug"] < LEVEL_PRIORITY[Logger.globalLevel]) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
console.log(this.format("debug", message, meta));
|
|
51
|
+
}
|
|
52
|
+
info(message, meta) {
|
|
53
|
+
if (LEVEL_PRIORITY["info"] < LEVEL_PRIORITY[Logger.globalLevel]) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
console.log(this.format("info", message, meta));
|
|
57
|
+
}
|
|
58
|
+
warn(message, meta) {
|
|
59
|
+
if (LEVEL_PRIORITY["warn"] < LEVEL_PRIORITY[Logger.globalLevel]) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
console.warn(this.format("warn", message, meta));
|
|
63
|
+
}
|
|
64
|
+
error(message, meta) {
|
|
65
|
+
if (LEVEL_PRIORITY["error"] < LEVEL_PRIORITY[Logger.globalLevel]) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
console.error(this.format("error", message, meta));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { metadataStorage } from "../metadata/storage.js";
|
|
2
|
+
import { scanComponents } from "./scanner.js";
|
|
3
|
+
// Detect if running in a bundled context using multiple heuristics
|
|
4
|
+
function isBundledContext() {
|
|
5
|
+
// Heuristic 1: Check if import.meta.url is not a file:// URL
|
|
6
|
+
// Bundled code often uses different URL schemes
|
|
7
|
+
if (!import.meta.url.startsWith('file://')) {
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
// Heuristic 2: Check if __bundlerContext exists (Bun bundler marker)
|
|
11
|
+
if (typeof globalThis.__bundlerContext !== 'undefined') {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
// Heuristic 3: Check if this is the main entry point
|
|
15
|
+
// In bundled contexts, module resolution differs from unbundled
|
|
16
|
+
if (import.meta.main === true) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
export async function resolveModuleTree(rootModule) {
|
|
22
|
+
const allControllers = [];
|
|
23
|
+
const allProviders = [];
|
|
24
|
+
const visited = new Set();
|
|
25
|
+
const visiting = new Set();
|
|
26
|
+
async function visit(mod) {
|
|
27
|
+
if (visited.has(mod))
|
|
28
|
+
return;
|
|
29
|
+
if (visiting.has(mod)) {
|
|
30
|
+
const chain = [...visiting, mod].map((c) => c.name).join(" -> ");
|
|
31
|
+
throw new Error(`Circular module import detected: ${chain}`);
|
|
32
|
+
}
|
|
33
|
+
const metadata = metadataStorage.getModule(mod);
|
|
34
|
+
if (!metadata) {
|
|
35
|
+
throw new Error(`${mod.name} is not decorated with @Module()`);
|
|
36
|
+
}
|
|
37
|
+
visiting.add(mod);
|
|
38
|
+
// Scan for components if scanPath is provided
|
|
39
|
+
let scannedControllers = [];
|
|
40
|
+
let scannedProviders = [];
|
|
41
|
+
if (metadata.scanPath && !isBundledContext()) {
|
|
42
|
+
const scanned = await scanComponents([metadata.scanPath]);
|
|
43
|
+
scannedControllers = scanned.controllers;
|
|
44
|
+
scannedProviders = scanned.providers;
|
|
45
|
+
}
|
|
46
|
+
// Recursively resolve imports
|
|
47
|
+
for (const imported of metadata.imports) {
|
|
48
|
+
await visit(imported);
|
|
49
|
+
}
|
|
50
|
+
visiting.delete(mod);
|
|
51
|
+
visited.add(mod);
|
|
52
|
+
// Merge scanned + explicit (with deduplication)
|
|
53
|
+
const allModuleControllers = [
|
|
54
|
+
...scannedControllers,
|
|
55
|
+
...metadata.controllers.filter(c => !scannedControllers.includes(c))
|
|
56
|
+
];
|
|
57
|
+
const allModuleProviders = [
|
|
58
|
+
...scannedProviders,
|
|
59
|
+
...metadata.providers.filter(p => !scannedProviders.includes(p))
|
|
60
|
+
];
|
|
61
|
+
allControllers.push(...allModuleControllers);
|
|
62
|
+
allProviders.push(...allModuleProviders);
|
|
63
|
+
}
|
|
64
|
+
await visit(rootModule);
|
|
65
|
+
return { controllers: allControllers, providers: allProviders };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=module-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-resolver.js","sourceRoot":"","sources":["../../src/core/module-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAe,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAO9C,mEAAmE;AACnE,SAAS,gBAAgB;IACvB,6DAA6D;IAC7D,gDAAgD;IAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qEAAqE;IACrE,IAAI,OAAQ,UAAkB,CAAC,gBAAgB,KAAK,WAAW,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qDAAqD;IACrD,gEAAgE;IAChE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAuB;IAC7D,MAAM,cAAc,GAAkB,EAAE,CAAC;IACzC,MAAM,YAAY,GAAkB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;IAExC,KAAK,UAAU,KAAK,CAAC,GAAgB;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO;QAE7B,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,GAAG,GAAG,CAAC,IAAI,kCAAkC,CAC9C,CAAC;QACJ,CAAC;QAED,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElB,8CAA8C;QAC9C,IAAI,kBAAkB,GAAkB,EAAE,CAAC;QAC3C,IAAI,gBAAgB,GAAkB,EAAE,CAAC;QAEzC,IAAI,QAAQ,CAAC,QAAQ,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1D,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;YACzC,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC;QACvC,CAAC;QAED,8BAA8B;QAC9B,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACxC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QAED,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEjB,gDAAgD;QAChD,MAAM,oBAAoB,GAAG;YAC3B,GAAG,kBAAkB;YACrB,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SACrE,CAAC;QAEF,MAAM,kBAAkB,GAAG;YACzB,GAAG,gBAAgB;YACnB,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SACjE,CAAC;QAEF,cAAc,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,CAAC;QAC7C,YAAY,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;IAExB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Container } from "./container.js";
|
|
2
|
+
import type { FileConfigService } from "./config.js";
|
|
3
|
+
export interface PluginContext {
|
|
4
|
+
container: Container;
|
|
5
|
+
config: FileConfigService;
|
|
6
|
+
}
|
|
7
|
+
export interface CinnabunPlugin {
|
|
8
|
+
name: string;
|
|
9
|
+
onInit?(context: PluginContext): void | Promise<void>;
|
|
10
|
+
onReady?(context: PluginContext): void | Promise<void>;
|
|
11
|
+
onShutdown?(context: PluginContext): void | Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/core/plugin.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type Constructor } from "../metadata/storage.js";
|
|
2
|
+
import type { Container } from "./container.js";
|
|
3
|
+
export interface Middleware {
|
|
4
|
+
use(req: Request, next: () => Promise<Response>): Promise<Response>;
|
|
5
|
+
}
|
|
6
|
+
interface RegisteredRoute {
|
|
7
|
+
httpMethod: string;
|
|
8
|
+
regex: RegExp;
|
|
9
|
+
paramNames: string[];
|
|
10
|
+
instance: any;
|
|
11
|
+
target: Constructor;
|
|
12
|
+
methodKey: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class Router {
|
|
15
|
+
private routes;
|
|
16
|
+
private globalMiddleware;
|
|
17
|
+
private container;
|
|
18
|
+
private timeout;
|
|
19
|
+
private routeCache;
|
|
20
|
+
private readonly cacheSize;
|
|
21
|
+
setContainer(container: Container): void;
|
|
22
|
+
setTimeout(timeout: number): void;
|
|
23
|
+
setGlobalMiddleware(middleware: (Constructor | Middleware)[]): void;
|
|
24
|
+
registerController(target: Constructor, instance: any): void;
|
|
25
|
+
match(method: string, pathname: string): {
|
|
26
|
+
route: RegisteredRoute;
|
|
27
|
+
pathParams: Record<string, string>;
|
|
28
|
+
} | null;
|
|
29
|
+
handle(req: Request): Promise<Response>;
|
|
30
|
+
private executeRouteWithMiddleware;
|
|
31
|
+
private executeRoute;
|
|
32
|
+
private handleError;
|
|
33
|
+
getRoutes(): Array<{
|
|
34
|
+
method: string;
|
|
35
|
+
path: string;
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
export {};
|