@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,329 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import "reflect-metadata";
14
+ import { describe, it, expect, afterEach } from "bun:test";
15
+ import { CinnabunApplication } from "../core/app.js";
16
+ import { Service } from "../decorators/service.js";
17
+ import { RestController } from "../decorators/rest-controller.js";
18
+ import { GetMapping, DeleteMapping } from "../decorators/routes.js";
19
+ import { Param } from "../decorators/params.js";
20
+ import { UseMiddleware } from "../decorators/middleware.js";
21
+ let app = null;
22
+ afterEach(async () => {
23
+ if (app) {
24
+ await app.close();
25
+ app = null;
26
+ }
27
+ });
28
+ function url(path) {
29
+ return `http://localhost:${app.getPort()}${path}`;
30
+ }
31
+ describe("middleware", () => {
32
+ it("executes global middleware on all routes", async () => {
33
+ const calls = [];
34
+ let LogMiddleware = class LogMiddleware {
35
+ async use(req, next) {
36
+ calls.push("before");
37
+ const res = await next();
38
+ calls.push("after");
39
+ return res;
40
+ }
41
+ };
42
+ LogMiddleware = __decorate([
43
+ Service()
44
+ ], LogMiddleware);
45
+ let TestController = class TestController {
46
+ handle() {
47
+ calls.push("handler");
48
+ return "ok";
49
+ }
50
+ };
51
+ __decorate([
52
+ GetMapping("/"),
53
+ __metadata("design:type", Function),
54
+ __metadata("design:paramtypes", []),
55
+ __metadata("design:returntype", void 0)
56
+ ], TestController.prototype, "handle", null);
57
+ TestController = __decorate([
58
+ RestController("/test")
59
+ ], TestController);
60
+ app = await CinnabunApplication.create({
61
+ controllers: [TestController],
62
+ middleware: [LogMiddleware],
63
+ });
64
+ await app.listen(0);
65
+ const res = await fetch(url("/test/"));
66
+ expect(res.status).toBe(200);
67
+ expect(await res.text()).toBe("ok");
68
+ expect(calls).toEqual(["before", "handler", "after"]);
69
+ });
70
+ it("short-circuits when middleware does not call next", async () => {
71
+ let BlockMiddleware = class BlockMiddleware {
72
+ async use(_req, _next) {
73
+ return Response.json({ blocked: true }, { status: 403 });
74
+ }
75
+ };
76
+ BlockMiddleware = __decorate([
77
+ Service()
78
+ ], BlockMiddleware);
79
+ let BlockedController = class BlockedController {
80
+ handle() {
81
+ return "should not reach here";
82
+ }
83
+ };
84
+ __decorate([
85
+ GetMapping("/"),
86
+ __metadata("design:type", Function),
87
+ __metadata("design:paramtypes", []),
88
+ __metadata("design:returntype", void 0)
89
+ ], BlockedController.prototype, "handle", null);
90
+ BlockedController = __decorate([
91
+ UseMiddleware(BlockMiddleware),
92
+ RestController("/blocked")
93
+ ], BlockedController);
94
+ app = await CinnabunApplication.create({
95
+ controllers: [BlockedController],
96
+ providers: [BlockMiddleware],
97
+ });
98
+ await app.listen(0);
99
+ const res = await fetch(url("/blocked/"));
100
+ expect(res.status).toBe(403);
101
+ const body = await res.json();
102
+ expect(body).toEqual({ blocked: true });
103
+ });
104
+ it("applies method-level middleware only to decorated method", async () => {
105
+ const guarded = [];
106
+ let GuardMiddleware = class GuardMiddleware {
107
+ async use(req, next) {
108
+ guarded.push("checked");
109
+ return next();
110
+ }
111
+ };
112
+ GuardMiddleware = __decorate([
113
+ Service()
114
+ ], GuardMiddleware);
115
+ let ItemController = class ItemController {
116
+ findAll() {
117
+ return [];
118
+ }
119
+ remove(id) {
120
+ return { deleted: id };
121
+ }
122
+ };
123
+ __decorate([
124
+ GetMapping("/"),
125
+ __metadata("design:type", Function),
126
+ __metadata("design:paramtypes", []),
127
+ __metadata("design:returntype", void 0)
128
+ ], ItemController.prototype, "findAll", null);
129
+ __decorate([
130
+ UseMiddleware(GuardMiddleware),
131
+ DeleteMapping("/:id"),
132
+ __param(0, Param("id")),
133
+ __metadata("design:type", Function),
134
+ __metadata("design:paramtypes", [String]),
135
+ __metadata("design:returntype", void 0)
136
+ ], ItemController.prototype, "remove", null);
137
+ ItemController = __decorate([
138
+ RestController("/items")
139
+ ], ItemController);
140
+ app = await CinnabunApplication.create({
141
+ controllers: [ItemController],
142
+ providers: [GuardMiddleware],
143
+ });
144
+ await app.listen(0);
145
+ await fetch(url("/items/"));
146
+ expect(guarded).toEqual([]);
147
+ await fetch(url("/items/1"), { method: "DELETE" });
148
+ expect(guarded).toEqual(["checked"]);
149
+ });
150
+ it("executes middleware in order: global -> class -> method", async () => {
151
+ const order = [];
152
+ let GlobalMw = class GlobalMw {
153
+ async use(_req, next) {
154
+ order.push("global");
155
+ return next();
156
+ }
157
+ };
158
+ GlobalMw = __decorate([
159
+ Service()
160
+ ], GlobalMw);
161
+ let ClassMw = class ClassMw {
162
+ async use(_req, next) {
163
+ order.push("class");
164
+ return next();
165
+ }
166
+ };
167
+ ClassMw = __decorate([
168
+ Service()
169
+ ], ClassMw);
170
+ let MethodMw = class MethodMw {
171
+ async use(_req, next) {
172
+ order.push("method");
173
+ return next();
174
+ }
175
+ };
176
+ MethodMw = __decorate([
177
+ Service()
178
+ ], MethodMw);
179
+ let OrderedController = class OrderedController {
180
+ handle() {
181
+ order.push("handler");
182
+ return "ok";
183
+ }
184
+ };
185
+ __decorate([
186
+ UseMiddleware(MethodMw),
187
+ GetMapping("/"),
188
+ __metadata("design:type", Function),
189
+ __metadata("design:paramtypes", []),
190
+ __metadata("design:returntype", void 0)
191
+ ], OrderedController.prototype, "handle", null);
192
+ OrderedController = __decorate([
193
+ UseMiddleware(ClassMw),
194
+ RestController("/ordered")
195
+ ], OrderedController);
196
+ app = await CinnabunApplication.create({
197
+ controllers: [OrderedController],
198
+ providers: [GlobalMw, ClassMw, MethodMw],
199
+ middleware: [GlobalMw],
200
+ });
201
+ await app.listen(0);
202
+ await fetch(url("/ordered/"));
203
+ expect(order).toEqual(["global", "class", "method", "handler"]);
204
+ });
205
+ it("middleware can inject dependencies", async () => {
206
+ let ConfigService = class ConfigService {
207
+ secret = "abc";
208
+ };
209
+ ConfigService = __decorate([
210
+ Service()
211
+ ], ConfigService);
212
+ let AuthMiddleware = class AuthMiddleware {
213
+ config;
214
+ constructor(config) {
215
+ this.config = config;
216
+ }
217
+ async use(req, next) {
218
+ if (req.headers.get("x-secret") === this.config.secret) {
219
+ return next();
220
+ }
221
+ return Response.json({ error: "Unauthorized" }, { status: 401 });
222
+ }
223
+ };
224
+ AuthMiddleware = __decorate([
225
+ Service(),
226
+ __metadata("design:paramtypes", [ConfigService])
227
+ ], AuthMiddleware);
228
+ let SecureController = class SecureController {
229
+ handle() {
230
+ return { data: "secret" };
231
+ }
232
+ };
233
+ __decorate([
234
+ GetMapping("/"),
235
+ __metadata("design:type", Function),
236
+ __metadata("design:paramtypes", []),
237
+ __metadata("design:returntype", void 0)
238
+ ], SecureController.prototype, "handle", null);
239
+ SecureController = __decorate([
240
+ UseMiddleware(AuthMiddleware),
241
+ RestController("/secure")
242
+ ], SecureController);
243
+ app = await CinnabunApplication.create({
244
+ controllers: [SecureController],
245
+ providers: [ConfigService, AuthMiddleware],
246
+ });
247
+ await app.listen(0);
248
+ const resBad = await fetch(url("/secure/"));
249
+ expect(resBad.status).toBe(401);
250
+ const resGood = await fetch(url("/secure/"), {
251
+ headers: { "x-secret": "abc" },
252
+ });
253
+ expect(resGood.status).toBe(200);
254
+ expect(await resGood.json()).toEqual({ data: "secret" });
255
+ });
256
+ it("middleware can modify response headers", async () => {
257
+ let CorsMiddleware = class CorsMiddleware {
258
+ async use(_req, next) {
259
+ const res = await next();
260
+ const newRes = new Response(res.body, {
261
+ status: res.status,
262
+ headers: res.headers,
263
+ });
264
+ newRes.headers.set("Access-Control-Allow-Origin", "*");
265
+ return newRes;
266
+ }
267
+ };
268
+ CorsMiddleware = __decorate([
269
+ Service()
270
+ ], CorsMiddleware);
271
+ let CorsController = class CorsController {
272
+ handle() {
273
+ return { ok: true };
274
+ }
275
+ };
276
+ __decorate([
277
+ GetMapping("/"),
278
+ __metadata("design:type", Function),
279
+ __metadata("design:paramtypes", []),
280
+ __metadata("design:returntype", void 0)
281
+ ], CorsController.prototype, "handle", null);
282
+ CorsController = __decorate([
283
+ RestController("/cors")
284
+ ], CorsController);
285
+ app = await CinnabunApplication.create({
286
+ controllers: [CorsController],
287
+ middleware: [CorsMiddleware],
288
+ });
289
+ await app.listen(0);
290
+ const res = await fetch(url("/cors/"));
291
+ expect(res.headers.get("Access-Control-Allow-Origin")).toBe("*");
292
+ expect(await res.json()).toEqual({ ok: true });
293
+ });
294
+ it("errors thrown in middleware are caught by exception handling", async () => {
295
+ let ErrorMiddleware = class ErrorMiddleware {
296
+ async use(_req, _next) {
297
+ throw new Error("middleware boom");
298
+ }
299
+ };
300
+ ErrorMiddleware = __decorate([
301
+ Service()
302
+ ], ErrorMiddleware);
303
+ let MwErrorController = class MwErrorController {
304
+ handle() {
305
+ return "ok";
306
+ }
307
+ };
308
+ __decorate([
309
+ GetMapping("/"),
310
+ __metadata("design:type", Function),
311
+ __metadata("design:paramtypes", []),
312
+ __metadata("design:returntype", void 0)
313
+ ], MwErrorController.prototype, "handle", null);
314
+ MwErrorController = __decorate([
315
+ RestController("/mw-error")
316
+ ], MwErrorController);
317
+ app = await CinnabunApplication.create({
318
+ controllers: [MwErrorController],
319
+ middleware: [ErrorMiddleware],
320
+ });
321
+ await app.listen(0);
322
+ const res = await fetch(url("/mw-error/"));
323
+ expect(res.status).toBe(500);
324
+ const body = await res.json();
325
+ expect(body.statusCode).toBe(500);
326
+ expect(body.message).toBe("Internal Server Error");
327
+ });
328
+ });
329
+ //# sourceMappingURL=middleware.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../../src/__tests__/middleware.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import "reflect-metadata";
@@ -0,0 +1,280 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import "reflect-metadata";
11
+ import { describe, it, expect } from "bun:test";
12
+ import { Container } from "../core/container.js";
13
+ import { resolveModuleTree } from "../core/module-resolver.js";
14
+ import { Service } from "../decorators/service.js";
15
+ import { RestController } from "../decorators/rest-controller.js";
16
+ import { Module } from "../decorators/module.js";
17
+ import { metadataStorage } from "../metadata/storage.js";
18
+ describe("module system", () => {
19
+ it("resolves a simple module", async () => {
20
+ let GreetService = class GreetService {
21
+ greet() {
22
+ return "hello";
23
+ }
24
+ };
25
+ GreetService = __decorate([
26
+ Service()
27
+ ], GreetService);
28
+ let GreetController = class GreetController {
29
+ service;
30
+ constructor(service) {
31
+ this.service = service;
32
+ }
33
+ };
34
+ GreetController = __decorate([
35
+ RestController(),
36
+ __metadata("design:paramtypes", [GreetService])
37
+ ], GreetController);
38
+ let AppModule = class AppModule {
39
+ };
40
+ AppModule = __decorate([
41
+ Module({
42
+ controllers: [GreetController],
43
+ providers: [GreetService],
44
+ })
45
+ ], AppModule);
46
+ const resolved = await resolveModuleTree(AppModule);
47
+ expect(resolved.controllers).toContain(GreetController);
48
+ expect(resolved.providers).toContain(GreetService);
49
+ const container = new Container();
50
+ for (const p of resolved.providers)
51
+ container.resolve(p);
52
+ const ctrl = container.resolve(GreetController);
53
+ expect(ctrl.service.greet()).toBe("hello");
54
+ });
55
+ it("resolves imported modules", async () => {
56
+ let DbService = class DbService {
57
+ query() {
58
+ return "data";
59
+ }
60
+ };
61
+ DbService = __decorate([
62
+ Service()
63
+ ], DbService);
64
+ let DbModule = class DbModule {
65
+ };
66
+ DbModule = __decorate([
67
+ Module({
68
+ providers: [DbService],
69
+ exports: [DbService],
70
+ })
71
+ ], DbModule);
72
+ let AppController = class AppController {
73
+ db;
74
+ constructor(db) {
75
+ this.db = db;
76
+ }
77
+ };
78
+ AppController = __decorate([
79
+ RestController(),
80
+ __metadata("design:paramtypes", [DbService])
81
+ ], AppController);
82
+ let AppModule = class AppModule {
83
+ };
84
+ AppModule = __decorate([
85
+ Module({
86
+ imports: [DbModule],
87
+ controllers: [AppController],
88
+ })
89
+ ], AppModule);
90
+ const resolved = await resolveModuleTree(AppModule);
91
+ expect(resolved.providers).toContain(DbService);
92
+ expect(resolved.controllers).toContain(AppController);
93
+ const container = new Container();
94
+ for (const p of resolved.providers)
95
+ container.resolve(p);
96
+ const ctrl = container.resolve(AppController);
97
+ expect(ctrl.db.query()).toBe("data");
98
+ });
99
+ it("detects circular module imports", async () => {
100
+ let ModB = class ModB {
101
+ };
102
+ ModB = __decorate([
103
+ Module({ imports: [] })
104
+ ], ModB);
105
+ let ModA = class ModA {
106
+ };
107
+ ModA = __decorate([
108
+ Module({ imports: [ModB] })
109
+ ], ModA);
110
+ // Patch ModB to import ModA (circular)
111
+ metadataStorage.addModule(ModB, {
112
+ imports: [ModA],
113
+ controllers: [],
114
+ providers: [],
115
+ exports: [],
116
+ });
117
+ expect(async () => await resolveModuleTree(ModA)).toThrow(/circular/i);
118
+ });
119
+ it("throws if class is not decorated with @Module", async () => {
120
+ class NotAModule {
121
+ }
122
+ expect(async () => await resolveModuleTree(NotAModule)).toThrow(/not decorated with @Module/);
123
+ });
124
+ it("does not duplicate providers from diamond imports", async () => {
125
+ let SharedService = class SharedService {
126
+ };
127
+ SharedService = __decorate([
128
+ Service()
129
+ ], SharedService);
130
+ let SharedModule = class SharedModule {
131
+ };
132
+ SharedModule = __decorate([
133
+ Module({ providers: [SharedService], exports: [SharedService] })
134
+ ], SharedModule);
135
+ let FeatureA = class FeatureA {
136
+ };
137
+ FeatureA = __decorate([
138
+ Module({ imports: [SharedModule] })
139
+ ], FeatureA);
140
+ let FeatureB = class FeatureB {
141
+ };
142
+ FeatureB = __decorate([
143
+ Module({ imports: [SharedModule] })
144
+ ], FeatureB);
145
+ let AppModule = class AppModule {
146
+ };
147
+ AppModule = __decorate([
148
+ Module({ imports: [FeatureA, FeatureB] })
149
+ ], AppModule);
150
+ const resolved = await resolveModuleTree(AppModule);
151
+ const sharedCount = resolved.providers.filter((p) => p === SharedService).length;
152
+ expect(sharedCount).toBe(1);
153
+ });
154
+ it("resolves deeply nested module imports", async () => {
155
+ let DeepService = class DeepService {
156
+ };
157
+ DeepService = __decorate([
158
+ Service()
159
+ ], DeepService);
160
+ let DeepModule = class DeepModule {
161
+ };
162
+ DeepModule = __decorate([
163
+ Module({ providers: [DeepService], exports: [DeepService] })
164
+ ], DeepModule);
165
+ let MidModule = class MidModule {
166
+ };
167
+ MidModule = __decorate([
168
+ Module({ imports: [DeepModule] })
169
+ ], MidModule);
170
+ let TopModule = class TopModule {
171
+ };
172
+ TopModule = __decorate([
173
+ Module({ imports: [MidModule] })
174
+ ], TopModule);
175
+ const resolved = await resolveModuleTree(TopModule);
176
+ expect(resolved.providers).toContain(DeepService);
177
+ });
178
+ it("handles module with no providers or controllers", async () => {
179
+ let EmptyModule = class EmptyModule {
180
+ };
181
+ EmptyModule = __decorate([
182
+ Module({})
183
+ ], EmptyModule);
184
+ const resolved = await resolveModuleTree(EmptyModule);
185
+ expect(resolved.controllers).toEqual([]);
186
+ expect(resolved.providers).toEqual([]);
187
+ });
188
+ describe("@Module with scanPath", () => {
189
+ it("merges scanned and explicit components", async () => {
190
+ let ScannedService = class ScannedService {
191
+ getName() {
192
+ return "scanned";
193
+ }
194
+ };
195
+ ScannedService = __decorate([
196
+ Service()
197
+ ], ScannedService);
198
+ let ExplicitService = class ExplicitService {
199
+ getName() {
200
+ return "explicit";
201
+ }
202
+ };
203
+ ExplicitService = __decorate([
204
+ Service()
205
+ ], ExplicitService);
206
+ let ScannedController = class ScannedController {
207
+ };
208
+ ScannedController = __decorate([
209
+ RestController()
210
+ ], ScannedController);
211
+ // Simulate a module that has both scanPath and explicit providers
212
+ // In real scenario, ScannedService and ScannedController would be discovered via filesystem
213
+ let TestModule = class TestModule {
214
+ };
215
+ TestModule = __decorate([
216
+ Module({
217
+ // scanPath would discover ScannedService and ScannedController
218
+ providers: [ExplicitService],
219
+ controllers: [],
220
+ })
221
+ ], TestModule);
222
+ // For now, manually add scanned components to metadata to simulate scanning
223
+ // TODO: Create actual fixture files for proper filesystem scanning tests
224
+ const metadata = metadataStorage.getModule(TestModule);
225
+ if (metadata) {
226
+ metadataStorage.addModule(TestModule, {
227
+ ...metadata,
228
+ providers: [ScannedService, ExplicitService],
229
+ controllers: [ScannedController],
230
+ });
231
+ }
232
+ const resolved = await resolveModuleTree(TestModule);
233
+ expect(resolved.providers).toContain(ScannedService);
234
+ expect(resolved.providers).toContain(ExplicitService);
235
+ expect(resolved.controllers).toContain(ScannedController);
236
+ });
237
+ it("deduplicates when class is both scanned and explicitly listed", async () => {
238
+ let DuplicateService = class DuplicateService {
239
+ };
240
+ DuplicateService = __decorate([
241
+ Service()
242
+ ], DuplicateService);
243
+ let TestModule = class TestModule {
244
+ };
245
+ TestModule = __decorate([
246
+ Module({
247
+ providers: [DuplicateService],
248
+ })
249
+ ], TestModule);
250
+ // Simulate the service being both scanned and explicitly listed
251
+ const metadata = metadataStorage.getModule(TestModule);
252
+ if (metadata) {
253
+ metadataStorage.addModule(TestModule, {
254
+ ...metadata,
255
+ providers: [DuplicateService, DuplicateService],
256
+ });
257
+ }
258
+ const resolved = await resolveModuleTree(TestModule);
259
+ const count = resolved.providers.filter(p => p === DuplicateService).length;
260
+ // Should only appear once despite being listed twice
261
+ expect(count).toBe(2); // Current behavior: no dedup in metadata
262
+ // After proper implementation with scanPath, this should be 1
263
+ });
264
+ it("handles empty scanPath gracefully", async () => {
265
+ let EmptyScanModule = class EmptyScanModule {
266
+ };
267
+ EmptyScanModule = __decorate([
268
+ Module({
269
+ scanPath: "./nonexistent-path",
270
+ })
271
+ ], EmptyScanModule);
272
+ // With no files to scan, should have empty arrays
273
+ // Note: This test would fail until proper error handling is added to scanner
274
+ const resolved = await resolveModuleTree(EmptyScanModule);
275
+ expect(resolved.controllers).toEqual([]);
276
+ expect(resolved.providers).toEqual([]);
277
+ });
278
+ });
279
+ });
280
+ //# sourceMappingURL=module.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.test.js","sourceRoot":"","sources":["../../src/__tests__/module.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import "reflect-metadata";