@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.
Files changed (260) hide show
  1. package/dist/__tests__/autowired.test.d.ts +1 -0
  2. package/dist/__tests__/autowired.test.js +109 -0
  3. package/dist/__tests__/autowired.test.js.map +1 -0
  4. package/dist/__tests__/cinnabun-application.test.d.ts +1 -0
  5. package/dist/__tests__/cinnabun-application.test.js +96 -0
  6. package/dist/__tests__/cinnabun-application.test.js.map +1 -0
  7. package/dist/__tests__/cinnabun-factory.test.d.ts +1 -0
  8. package/dist/__tests__/cinnabun-factory.test.js +269 -0
  9. package/dist/__tests__/cinnabun-factory.test.js.map +1 -0
  10. package/dist/__tests__/circular-dependency.test.d.ts +1 -0
  11. package/dist/__tests__/circular-dependency.test.js +318 -0
  12. package/dist/__tests__/circular-dependency.test.js.map +1 -0
  13. package/dist/__tests__/compression.test.d.ts +1 -0
  14. package/dist/__tests__/compression.test.js +459 -0
  15. package/dist/__tests__/compression.test.js.map +1 -0
  16. package/dist/__tests__/config.test.d.ts +1 -0
  17. package/dist/__tests__/config.test.js +86 -0
  18. package/dist/__tests__/config.test.js.map +1 -0
  19. package/dist/__tests__/cors.test.d.ts +1 -0
  20. package/dist/__tests__/cors.test.js +575 -0
  21. package/dist/__tests__/cors.test.js.map +1 -0
  22. package/dist/__tests__/env-config.test.d.ts +1 -0
  23. package/dist/__tests__/env-config.test.js +367 -0
  24. package/dist/__tests__/env-config.test.js.map +1 -0
  25. package/dist/__tests__/exception.test.d.ts +1 -0
  26. package/dist/__tests__/exception.test.js +207 -0
  27. package/dist/__tests__/exception.test.js.map +1 -0
  28. package/dist/__tests__/guards-interceptors.test.d.ts +1 -0
  29. package/dist/__tests__/guards-interceptors.test.js +660 -0
  30. package/dist/__tests__/guards-interceptors.test.js.map +1 -0
  31. package/dist/__tests__/health-check.test.d.ts +1 -0
  32. package/dist/__tests__/health-check.test.js +240 -0
  33. package/dist/__tests__/health-check.test.js.map +1 -0
  34. package/dist/__tests__/http.test.d.ts +1 -0
  35. package/dist/__tests__/http.test.js +629 -0
  36. package/dist/__tests__/http.test.js.map +1 -0
  37. package/dist/__tests__/integration/e2e.test.d.ts +1 -0
  38. package/dist/__tests__/integration/e2e.test.js +192 -0
  39. package/dist/__tests__/integration/e2e.test.js.map +1 -0
  40. package/dist/__tests__/integration/performance.bench.d.ts +1 -0
  41. package/dist/__tests__/integration/performance.bench.js +129 -0
  42. package/dist/__tests__/integration/performance.bench.js.map +1 -0
  43. package/dist/__tests__/integration/validation.test.d.ts +1 -0
  44. package/dist/__tests__/integration/validation.test.js +133 -0
  45. package/dist/__tests__/integration/validation.test.js.map +1 -0
  46. package/dist/__tests__/lifecycle-management.test.d.ts +1 -0
  47. package/dist/__tests__/lifecycle-management.test.js +688 -0
  48. package/dist/__tests__/lifecycle-management.test.js.map +1 -0
  49. package/dist/__tests__/lifecycle.test.d.ts +1 -0
  50. package/dist/__tests__/lifecycle.test.js +196 -0
  51. package/dist/__tests__/lifecycle.test.js.map +1 -0
  52. package/dist/__tests__/logger.test.d.ts +1 -0
  53. package/dist/__tests__/logger.test.js +109 -0
  54. package/dist/__tests__/logger.test.js.map +1 -0
  55. package/dist/__tests__/middleware.test.d.ts +1 -0
  56. package/dist/__tests__/middleware.test.js +329 -0
  57. package/dist/__tests__/middleware.test.js.map +1 -0
  58. package/dist/__tests__/module.test.d.ts +1 -0
  59. package/dist/__tests__/module.test.js +280 -0
  60. package/dist/__tests__/module.test.js.map +1 -0
  61. package/dist/__tests__/plugin.test.d.ts +1 -0
  62. package/dist/__tests__/plugin.test.js +283 -0
  63. package/dist/__tests__/plugin.test.js.map +1 -0
  64. package/dist/__tests__/request-logger.test.d.ts +1 -0
  65. package/dist/__tests__/request-logger.test.js +342 -0
  66. package/dist/__tests__/request-logger.test.js.map +1 -0
  67. package/dist/__tests__/request-mapping.test.d.ts +1 -0
  68. package/dist/__tests__/request-mapping.test.js +201 -0
  69. package/dist/__tests__/request-mapping.test.js.map +1 -0
  70. package/dist/__tests__/routes.test.d.ts +1 -0
  71. package/dist/__tests__/routes.test.js +119 -0
  72. package/dist/__tests__/routes.test.js.map +1 -0
  73. package/dist/__tests__/scan-fixtures/controllers/hello.controller.d.ts +4 -0
  74. package/dist/__tests__/scan-fixtures/controllers/hello.controller.js +28 -0
  75. package/dist/__tests__/scan-fixtures/controllers/hello.controller.js.map +1 -0
  76. package/dist/__tests__/scan-fixtures/modules/feature.module.d.ts +6 -0
  77. package/dist/__tests__/scan-fixtures/modules/feature.module.js +28 -0
  78. package/dist/__tests__/scan-fixtures/modules/feature.module.js.map +1 -0
  79. package/dist/__tests__/scan-fixtures/services/greeting.service.d.ts +4 -0
  80. package/dist/__tests__/scan-fixtures/services/greeting.service.js +18 -0
  81. package/dist/__tests__/scan-fixtures/services/greeting.service.js.map +1 -0
  82. package/dist/__tests__/scanner.test.d.ts +1 -0
  83. package/dist/__tests__/scanner.test.js +49 -0
  84. package/dist/__tests__/scanner.test.js.map +1 -0
  85. package/dist/__tests__/validation.test.d.ts +1 -0
  86. package/dist/__tests__/validation.test.js +561 -0
  87. package/dist/__tests__/validation.test.js.map +1 -0
  88. package/dist/__tests__/websocket-auth.test.d.ts +1 -0
  89. package/dist/__tests__/websocket-auth.test.js +431 -0
  90. package/dist/__tests__/websocket-auth.test.js.map +1 -0
  91. package/dist/__tests__/websocket-decorators.test.d.ts +1 -0
  92. package/dist/__tests__/websocket-decorators.test.js +173 -0
  93. package/dist/__tests__/websocket-decorators.test.js.map +1 -0
  94. package/dist/__tests__/websocket-validation.test.d.ts +1 -0
  95. package/dist/__tests__/websocket-validation.test.js +827 -0
  96. package/dist/__tests__/websocket-validation.test.js.map +1 -0
  97. package/dist/__tests__/websocket.test.d.ts +1 -0
  98. package/dist/__tests__/websocket.test.js +415 -0
  99. package/dist/__tests__/websocket.test.js.map +1 -0
  100. package/dist/config/config.module.d.ts +2 -0
  101. package/dist/config/config.module.js +18 -0
  102. package/dist/config/config.module.js.map +1 -0
  103. package/dist/config/config.service.d.ts +15 -0
  104. package/dist/config/config.service.js +58 -0
  105. package/dist/config/config.service.js.map +1 -0
  106. package/dist/config/schemas.d.ts +107 -0
  107. package/dist/config/schemas.js +87 -0
  108. package/dist/config/schemas.js.map +1 -0
  109. package/dist/core/app.d.ts +44 -0
  110. package/dist/core/app.js +178 -0
  111. package/dist/core/app.js.map +1 -0
  112. package/dist/core/cinnabun-factory.d.ts +5 -0
  113. package/dist/core/cinnabun-factory.js +130 -0
  114. package/dist/core/cinnabun-factory.js.map +1 -0
  115. package/dist/core/config-loader.d.ts +2 -0
  116. package/dist/core/config-loader.js +76 -0
  117. package/dist/core/config-loader.js.map +1 -0
  118. package/dist/core/config.d.ts +12 -0
  119. package/dist/core/config.js +27 -0
  120. package/dist/core/config.js.map +1 -0
  121. package/dist/core/container.d.ts +10 -0
  122. package/dist/core/container.js +82 -0
  123. package/dist/core/container.js.map +1 -0
  124. package/dist/core/dependency-validator.d.ts +12 -0
  125. package/dist/core/dependency-validator.js +76 -0
  126. package/dist/core/dependency-validator.js.map +1 -0
  127. package/dist/core/guard.d.ts +3 -0
  128. package/dist/core/guard.js +2 -0
  129. package/dist/core/guard.js.map +1 -0
  130. package/dist/core/interceptor.d.ts +4 -0
  131. package/dist/core/interceptor.js +2 -0
  132. package/dist/core/interceptor.js.map +1 -0
  133. package/dist/core/logger.d.ts +15 -0
  134. package/dist/core/logger.js +71 -0
  135. package/dist/core/logger.js.map +1 -0
  136. package/dist/core/module-resolver.d.ts +6 -0
  137. package/dist/core/module-resolver.js +67 -0
  138. package/dist/core/module-resolver.js.map +1 -0
  139. package/dist/core/plugin.d.ts +12 -0
  140. package/dist/core/plugin.js +2 -0
  141. package/dist/core/plugin.js.map +1 -0
  142. package/dist/core/router.d.ts +38 -0
  143. package/dist/core/router.js +406 -0
  144. package/dist/core/router.js.map +1 -0
  145. package/dist/core/scanner.d.ts +7 -0
  146. package/dist/core/scanner.js +83 -0
  147. package/dist/core/scanner.js.map +1 -0
  148. package/dist/core/shutdown-manager.d.ts +15 -0
  149. package/dist/core/shutdown-manager.js +68 -0
  150. package/dist/core/shutdown-manager.js.map +1 -0
  151. package/dist/core/websocket-handler.d.ts +41 -0
  152. package/dist/core/websocket-handler.js +242 -0
  153. package/dist/core/websocket-handler.js.map +1 -0
  154. package/dist/decorators/autowired.d.ts +3 -0
  155. package/dist/decorators/autowired.js +11 -0
  156. package/dist/decorators/autowired.js.map +1 -0
  157. package/dist/decorators/cinnabun-application.d.ts +14 -0
  158. package/dist/decorators/cinnabun-application.js +17 -0
  159. package/dist/decorators/cinnabun-application.js.map +1 -0
  160. package/dist/decorators/lifecycle.d.ts +2 -0
  161. package/dist/decorators/lifecycle.js +12 -0
  162. package/dist/decorators/lifecycle.js.map +1 -0
  163. package/dist/decorators/middleware.d.ts +2 -0
  164. package/dist/decorators/middleware.js +12 -0
  165. package/dist/decorators/middleware.js.map +1 -0
  166. package/dist/decorators/module.d.ts +10 -0
  167. package/dist/decorators/module.js +13 -0
  168. package/dist/decorators/module.js.map +1 -0
  169. package/dist/decorators/on-shutdown.d.ts +1 -0
  170. package/dist/decorators/on-shutdown.js +10 -0
  171. package/dist/decorators/on-shutdown.js.map +1 -0
  172. package/dist/decorators/params.d.ts +6 -0
  173. package/dist/decorators/params.js +31 -0
  174. package/dist/decorators/params.js.map +1 -0
  175. package/dist/decorators/request-mapping.d.ts +7 -0
  176. package/dist/decorators/request-mapping.js +34 -0
  177. package/dist/decorators/request-mapping.js.map +1 -0
  178. package/dist/decorators/response.d.ts +2 -0
  179. package/dist/decorators/response.js +17 -0
  180. package/dist/decorators/response.js.map +1 -0
  181. package/dist/decorators/rest-controller.d.ts +1 -0
  182. package/dist/decorators/rest-controller.js +19 -0
  183. package/dist/decorators/rest-controller.js.map +1 -0
  184. package/dist/decorators/routes.d.ts +5 -0
  185. package/dist/decorators/routes.js +19 -0
  186. package/dist/decorators/routes.js.map +1 -0
  187. package/dist/decorators/service.d.ts +1 -0
  188. package/dist/decorators/service.js +7 -0
  189. package/dist/decorators/service.js.map +1 -0
  190. package/dist/decorators/use-guard.d.ts +2 -0
  191. package/dist/decorators/use-guard.js +12 -0
  192. package/dist/decorators/use-guard.js.map +1 -0
  193. package/dist/decorators/use-interceptor.d.ts +2 -0
  194. package/dist/decorators/use-interceptor.js +12 -0
  195. package/dist/decorators/use-interceptor.js.map +1 -0
  196. package/dist/decorators/validate.d.ts +12 -0
  197. package/dist/decorators/validate.js +7 -0
  198. package/dist/decorators/validate.js.map +1 -0
  199. package/dist/decorators/websocket.d.ts +9 -0
  200. package/dist/decorators/websocket.js +38 -0
  201. package/dist/decorators/websocket.js.map +1 -0
  202. package/dist/decorators/ws-event.d.ts +28 -0
  203. package/dist/decorators/ws-event.js +37 -0
  204. package/dist/decorators/ws-event.js.map +1 -0
  205. package/dist/decorators/ws-gateway.d.ts +18 -0
  206. package/dist/decorators/ws-gateway.js +24 -0
  207. package/dist/decorators/ws-gateway.js.map +1 -0
  208. package/dist/dev/index.d.ts +6 -0
  209. package/dist/dev/index.js +28 -0
  210. package/dist/dev/index.js.map +1 -0
  211. package/dist/exceptions/circular-dependency-error.d.ts +5 -0
  212. package/dist/exceptions/circular-dependency-error.js +16 -0
  213. package/dist/exceptions/circular-dependency-error.js.map +1 -0
  214. package/dist/exceptions/http-exception.d.ts +41 -0
  215. package/dist/exceptions/http-exception.js +96 -0
  216. package/dist/exceptions/http-exception.js.map +1 -0
  217. package/dist/guards/jwt-websocket.guard.d.ts +11 -0
  218. package/dist/guards/jwt-websocket.guard.js +37 -0
  219. package/dist/guards/jwt-websocket.guard.js.map +1 -0
  220. package/dist/guards/websocket-auth.guard.d.ts +16 -0
  221. package/dist/guards/websocket-auth.guard.js +43 -0
  222. package/dist/guards/websocket-auth.guard.js.map +1 -0
  223. package/dist/health/health-check.service.d.ts +45 -0
  224. package/dist/health/health-check.service.js +95 -0
  225. package/dist/health/health-check.service.js.map +1 -0
  226. package/dist/health/health.controller.d.ts +15 -0
  227. package/dist/health/health.controller.js +63 -0
  228. package/dist/health/health.controller.js.map +1 -0
  229. package/dist/health/health.module.d.ts +2 -0
  230. package/dist/health/health.module.js +20 -0
  231. package/dist/health/health.module.js.map +1 -0
  232. package/dist/index.d.ts +74 -11
  233. package/dist/index.js +54 -0
  234. package/dist/index.js.map +1 -0
  235. package/dist/metadata/storage.d.ts +171 -0
  236. package/dist/metadata/storage.js +257 -0
  237. package/dist/metadata/storage.js.map +1 -0
  238. package/dist/middleware/compression.middleware.d.ts +32 -0
  239. package/dist/middleware/compression.middleware.js +113 -0
  240. package/dist/middleware/compression.middleware.js.map +1 -0
  241. package/dist/middleware/cors.middleware.d.ts +18 -0
  242. package/dist/middleware/cors.middleware.js +79 -0
  243. package/dist/middleware/cors.middleware.js.map +1 -0
  244. package/dist/middleware/performance-tracker.middleware.d.ts +35 -0
  245. package/dist/middleware/performance-tracker.middleware.js +79 -0
  246. package/dist/middleware/performance-tracker.middleware.js.map +1 -0
  247. package/dist/middleware/request-logger.middleware.d.ts +32 -0
  248. package/dist/middleware/request-logger.middleware.js +125 -0
  249. package/dist/middleware/request-logger.middleware.js.map +1 -0
  250. package/dist/types/index.d.ts +14 -0
  251. package/dist/types/index.js +5 -0
  252. package/dist/types/index.js.map +1 -0
  253. package/dist/validation/helpers.d.ts +36 -0
  254. package/dist/validation/helpers.js +27 -0
  255. package/dist/validation/helpers.js.map +1 -0
  256. package/dist/websocket/error.d.ts +27 -0
  257. package/dist/websocket/error.js +38 -0
  258. package/dist/websocket/error.js.map +1 -0
  259. package/package.json +38 -5
  260. 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,3 @@
1
+ export interface Guard {
2
+ canActivate(req: Request): boolean | Promise<boolean>;
3
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/core/guard.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export interface Interceptor {
2
+ before?(req: Request): void | Promise<void>;
3
+ after?(req: Request, response: Response): Response | Promise<Response>;
4
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interceptor.js.map
@@ -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,6 @@
1
+ import { Constructor } from "../metadata/storage.js";
2
+ export interface ResolvedModule {
3
+ controllers: Constructor[];
4
+ providers: Constructor[];
5
+ }
6
+ export declare function resolveModuleTree(rootModule: Constructor): Promise<ResolvedModule>;
@@ -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":"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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin.js.map
@@ -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 {};