@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,257 @@
1
+ class MetadataStorage {
2
+ providers = new Set();
3
+ fieldInjections = [];
4
+ constructorParams = new Map();
5
+ // Lifecycle hooks
6
+ postConstructMethods = new Map();
7
+ preDestroyMethods = new Map();
8
+ shutdownHooks = new Map();
9
+ // Module system
10
+ modules = new Map();
11
+ // Routes
12
+ routes = [];
13
+ controllerPaths = new Map();
14
+ // Request params
15
+ params = [];
16
+ // Application metadata
17
+ appMetadata = new Map();
18
+ // Middleware
19
+ middlewareEntries = [];
20
+ // Response metadata
21
+ httpCodes = new Map();
22
+ responseHeaders = [];
23
+ // WebSocket
24
+ wsBrokerMetadata = new Map();
25
+ messageMappings = [];
26
+ sendToMappings = [];
27
+ subscribeMappings = [];
28
+ wsGateways = new Map();
29
+ wsEvents = new Map();
30
+ // Guards
31
+ guardEntries = [];
32
+ // Interceptors
33
+ interceptorEntries = [];
34
+ // Validation
35
+ validationSchemas = new Map();
36
+ addProvider(target, params) {
37
+ this.providers.add(target);
38
+ if (params) {
39
+ this.constructorParams.set(target, params);
40
+ }
41
+ }
42
+ addFieldInjection(target, propertyKey, type) {
43
+ this.fieldInjections.push({ target, propertyKey, type });
44
+ }
45
+ getFieldInjectionsFor(target) {
46
+ return this.fieldInjections.filter((i) => i.target === target);
47
+ }
48
+ getConstructorParams(target) {
49
+ return this.constructorParams.get(target) || [];
50
+ }
51
+ // Lifecycle hooks
52
+ addPostConstruct(target, methodKey) {
53
+ if (this.postConstructMethods.has(target)) {
54
+ throw new Error(`@PostConstruct() used multiple times in ${target.name}. Only one method allowed.`);
55
+ }
56
+ this.postConstructMethods.set(target, methodKey);
57
+ }
58
+ addPreDestroy(target, methodKey) {
59
+ if (this.preDestroyMethods.has(target)) {
60
+ throw new Error(`@PreDestroy() used multiple times in ${target.name}. Only one method allowed.`);
61
+ }
62
+ this.preDestroyMethods.set(target, methodKey);
63
+ }
64
+ getPostConstruct(target) {
65
+ return this.postConstructMethods.get(target);
66
+ }
67
+ getPreDestroy(target) {
68
+ return this.preDestroyMethods.get(target);
69
+ }
70
+ addShutdownHook(target, hook) {
71
+ const existing = this.shutdownHooks.get(target) || [];
72
+ existing.push(hook);
73
+ this.shutdownHooks.set(target, existing);
74
+ }
75
+ getShutdownHooks(target) {
76
+ return this.shutdownHooks.get(target) || [];
77
+ }
78
+ // Module system
79
+ addModule(target, metadata) {
80
+ this.modules.set(target, metadata);
81
+ }
82
+ getModule(target) {
83
+ return this.modules.get(target);
84
+ }
85
+ // Routes
86
+ addRoute(route) {
87
+ this.routes.push(route);
88
+ }
89
+ setControllerPath(target, path) {
90
+ this.controllerPaths.set(target, path);
91
+ }
92
+ getControllerPath(target) {
93
+ return this.controllerPaths.get(target) || "";
94
+ }
95
+ getRoutesFor(target) {
96
+ return this.routes.filter((r) => r.target === target);
97
+ }
98
+ // Request params
99
+ addParam(param) {
100
+ this.params.push(param);
101
+ }
102
+ getParamsFor(target, methodKey) {
103
+ return this.params
104
+ .filter((p) => p.target === target && p.methodKey === methodKey)
105
+ .sort((a, b) => a.parameterIndex - b.parameterIndex);
106
+ }
107
+ // Application metadata
108
+ setAppMetadata(target, meta) {
109
+ this.appMetadata.set(target, meta);
110
+ }
111
+ getAppMetadata(target) {
112
+ return this.appMetadata.get(target);
113
+ }
114
+ // Middleware
115
+ addMiddleware(target, middleware, methodKey) {
116
+ this.middlewareEntries.push({ target, methodKey, middleware });
117
+ }
118
+ getMiddlewareFor(target, methodKey) {
119
+ const classLevel = this.middlewareEntries
120
+ .filter((m) => m.target === target && !m.methodKey)
121
+ .flatMap((m) => m.middleware);
122
+ const methodLevel = this.middlewareEntries
123
+ .filter((m) => m.target === target && m.methodKey === methodKey)
124
+ .flatMap((m) => m.middleware);
125
+ return [...classLevel, ...methodLevel];
126
+ }
127
+ // Response metadata
128
+ setHttpCode(target, methodKey, code) {
129
+ this.httpCodes.set(`${target.name}.${methodKey}`, code);
130
+ }
131
+ getHttpCode(target, methodKey) {
132
+ return this.httpCodes.get(`${target.name}.${methodKey}`);
133
+ }
134
+ addResponseHeader(meta) {
135
+ this.responseHeaders.push(meta);
136
+ }
137
+ getResponseHeaders(target, methodKey) {
138
+ return this.responseHeaders.filter((h) => h.target === target && h.methodKey === methodKey);
139
+ }
140
+ // WebSocket
141
+ setWsBrokerMetadata(target, meta) {
142
+ this.wsBrokerMetadata.set(target, meta);
143
+ }
144
+ getWsBrokerMetadata(target) {
145
+ return this.wsBrokerMetadata.get(target);
146
+ }
147
+ addMessageMapping(mapping) {
148
+ this.messageMappings.push(mapping);
149
+ }
150
+ getMessageMappingsFor(target) {
151
+ return this.messageMappings.filter((m) => m.target === target);
152
+ }
153
+ addSendTo(mapping) {
154
+ this.sendToMappings.push(mapping);
155
+ }
156
+ getSendTo(target, methodKey) {
157
+ return this.sendToMappings.find((m) => m.target === target && m.methodKey === methodKey)?.topic;
158
+ }
159
+ addSubscribeMapping(mapping) {
160
+ this.subscribeMappings.push(mapping);
161
+ }
162
+ getSubscribeMappingsFor(target) {
163
+ return this.subscribeMappings.filter((m) => m.target === target);
164
+ }
165
+ addWsGateway(target, path) {
166
+ this.wsGateways.set(target, path);
167
+ }
168
+ getWsGatewayPath(target) {
169
+ return this.wsGateways.get(target);
170
+ }
171
+ getAllWsGateways() {
172
+ return this.wsGateways;
173
+ }
174
+ addWsEvent(target, metadata) {
175
+ const existing = this.wsEvents.get(target) || [];
176
+ existing.push(metadata);
177
+ this.wsEvents.set(target, existing);
178
+ }
179
+ getWsEvents(target) {
180
+ return this.wsEvents.get(target) || [];
181
+ }
182
+ getAllWsEventHandlers() {
183
+ return this.wsEvents;
184
+ }
185
+ // Guards
186
+ addGuard(target, guards, methodKey) {
187
+ this.guardEntries.push({ target, methodKey, guards });
188
+ }
189
+ getGuardsFor(target, methodKey) {
190
+ const classLevel = this.guardEntries
191
+ .filter((g) => g.target === target && !g.methodKey)
192
+ .flatMap((g) => g.guards);
193
+ const methodLevel = this.guardEntries
194
+ .filter((g) => g.target === target && g.methodKey === methodKey)
195
+ .flatMap((g) => g.guards);
196
+ return [...classLevel, ...methodLevel];
197
+ }
198
+ // Interceptors
199
+ addInterceptor(target, interceptors, methodKey) {
200
+ this.interceptorEntries.push({ target, methodKey, interceptors });
201
+ }
202
+ getInterceptorsFor(target, methodKey) {
203
+ const classLevel = this.interceptorEntries
204
+ .filter((i) => i.target === target && !i.methodKey)
205
+ .flatMap((i) => i.interceptors);
206
+ const methodLevel = this.interceptorEntries
207
+ .filter((i) => i.target === target && i.methodKey === methodKey)
208
+ .flatMap((i) => i.interceptors);
209
+ return [...classLevel, ...methodLevel];
210
+ }
211
+ // Validation
212
+ setValidationSchema(target, methodKey, schema) {
213
+ this.validationSchemas.set(`${target.name}.${methodKey}`, schema);
214
+ }
215
+ getValidationSchema(target, methodKey) {
216
+ return this.validationSchemas.get(`${target.name}.${methodKey}`);
217
+ }
218
+ reset() {
219
+ // Clear all data structures
220
+ this.providers.clear();
221
+ this.fieldInjections = [];
222
+ this.constructorParams.clear();
223
+ // Lifecycle hooks
224
+ this.postConstructMethods.clear();
225
+ this.preDestroyMethods.clear();
226
+ this.shutdownHooks.clear();
227
+ // Module system
228
+ this.modules.clear();
229
+ // Routes
230
+ this.routes = [];
231
+ this.controllerPaths.clear();
232
+ // Request params
233
+ this.params = [];
234
+ // Application metadata
235
+ this.appMetadata.clear();
236
+ // Middleware
237
+ this.middlewareEntries = [];
238
+ // Response metadata
239
+ this.httpCodes.clear();
240
+ this.responseHeaders = [];
241
+ // WebSocket
242
+ this.wsBrokerMetadata.clear();
243
+ this.messageMappings = [];
244
+ this.sendToMappings = [];
245
+ this.subscribeMappings = [];
246
+ this.wsGateways.clear();
247
+ this.wsEvents.clear();
248
+ // Guards
249
+ this.guardEntries = [];
250
+ // Interceptors
251
+ this.interceptorEntries = [];
252
+ // Validation
253
+ this.validationSchemas.clear();
254
+ }
255
+ }
256
+ export const metadataStorage = new MetadataStorage();
257
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/metadata/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Middleware } from "../core/router.js";
2
+ export interface CompressionOptions {
3
+ /**
4
+ * Minimum response size to compress (bytes)
5
+ * Default: 1024 (1KB)
6
+ */
7
+ threshold?: number;
8
+ /**
9
+ * Compression level (0-9)
10
+ * Default: 6
11
+ */
12
+ level?: number;
13
+ /**
14
+ * MIME types to compress
15
+ * Default: text/*, application/json, application/javascript, application/xml
16
+ */
17
+ filter?: (contentType: string) => boolean;
18
+ /**
19
+ * Prefer Brotli over Gzip when supported
20
+ * Default: true
21
+ */
22
+ preferBrotli?: boolean;
23
+ }
24
+ export declare class CompressionMiddleware implements Middleware {
25
+ private options;
26
+ constructor(options?: CompressionOptions);
27
+ use(req: Request, next: () => Promise<Response>): Promise<Response>;
28
+ private getCompressionMethod;
29
+ private shouldCompress;
30
+ private compressResponse;
31
+ private defaultFilter;
32
+ }
@@ -0,0 +1,113 @@
1
+ import { gzipSync, brotliCompressSync, constants } from "node:zlib";
2
+ export class CompressionMiddleware {
3
+ options;
4
+ constructor(options = {}) {
5
+ this.options = {
6
+ threshold: options.threshold ?? 1024,
7
+ level: options.level ?? 6,
8
+ filter: options.filter ?? this.defaultFilter,
9
+ preferBrotli: options.preferBrotli ?? true,
10
+ };
11
+ }
12
+ async use(req, next) {
13
+ const response = await next();
14
+ // Get Accept-Encoding header
15
+ const acceptEncoding = req.headers.get("accept-encoding") || "";
16
+ // Determine compression method
17
+ const compressionMethod = this.getCompressionMethod(acceptEncoding);
18
+ if (!compressionMethod) {
19
+ return response; // Client doesn't support compression
20
+ }
21
+ // Check if we should compress this response
22
+ if (!this.shouldCompress(response)) {
23
+ return response;
24
+ }
25
+ // Compress the response
26
+ return await this.compressResponse(response, compressionMethod);
27
+ }
28
+ getCompressionMethod(acceptEncoding) {
29
+ const encodings = acceptEncoding.toLowerCase().split(",").map((e) => e.trim());
30
+ if (this.options.preferBrotli && encodings.includes("br")) {
31
+ return "br";
32
+ }
33
+ if (encodings.includes("gzip")) {
34
+ return "gzip";
35
+ }
36
+ return null;
37
+ }
38
+ shouldCompress(response) {
39
+ // Don't compress if already compressed
40
+ if (response.headers.get("content-encoding")) {
41
+ return false;
42
+ }
43
+ // Check content type
44
+ const contentType = response.headers.get("content-type") || "";
45
+ if (!this.options.filter(contentType)) {
46
+ return false;
47
+ }
48
+ // Check content length (if available)
49
+ const contentLength = response.headers.get("content-length");
50
+ if (contentLength) {
51
+ const length = parseInt(contentLength, 10);
52
+ if (length < this.options.threshold) {
53
+ return false;
54
+ }
55
+ }
56
+ return true;
57
+ }
58
+ async compressResponse(response, method) {
59
+ // Read response body
60
+ const arrayBuffer = await response.arrayBuffer();
61
+ const buffer = Buffer.from(arrayBuffer);
62
+ // Check size threshold after reading
63
+ if (buffer.length < this.options.threshold) {
64
+ // Too small - return uncompressed but with new Response (body was consumed)
65
+ return new Response(buffer, {
66
+ status: response.status,
67
+ statusText: response.statusText,
68
+ headers: response.headers,
69
+ });
70
+ }
71
+ // Compress
72
+ const compressed = method === "br"
73
+ ? brotliCompressSync(buffer, {
74
+ params: {
75
+ [constants.BROTLI_PARAM_QUALITY]: this.options.level,
76
+ },
77
+ })
78
+ : gzipSync(buffer, { level: this.options.level });
79
+ // Only use compressed version if it's actually smaller
80
+ if (compressed.length >= buffer.length) {
81
+ // Compression didn't help - return uncompressed
82
+ return new Response(buffer, {
83
+ status: response.status,
84
+ statusText: response.statusText,
85
+ headers: response.headers,
86
+ });
87
+ }
88
+ // Create new response with compressed body
89
+ const headers = new Headers(response.headers);
90
+ headers.set("content-encoding", method);
91
+ headers.set("content-length", compressed.length.toString());
92
+ headers.delete("content-md5"); // Invalidate MD5 if present
93
+ headers.set("vary", "Accept-Encoding");
94
+ return new Response(compressed, {
95
+ status: response.status,
96
+ statusText: response.statusText,
97
+ headers,
98
+ });
99
+ }
100
+ defaultFilter(contentType) {
101
+ const compressibleTypes = [
102
+ "text/",
103
+ "application/json",
104
+ "application/javascript",
105
+ "application/xml",
106
+ "application/x-javascript",
107
+ "application/ecmascript",
108
+ "application/ld+json",
109
+ ];
110
+ return compressibleTypes.some((type) => contentType.includes(type));
111
+ }
112
+ }
113
+ //# sourceMappingURL=compression.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.middleware.js","sourceRoot":"","sources":["../../src/middleware/compression.middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Middleware } from "../core/router.js";
2
+ export interface CorsOptions {
3
+ origin?: string | string[] | ((origin: string) => boolean);
4
+ methods?: string[];
5
+ allowedHeaders?: string[];
6
+ exposedHeaders?: string[];
7
+ credentials?: boolean;
8
+ maxAge?: number;
9
+ preflightContinue?: boolean;
10
+ }
11
+ export declare class CorsMiddleware implements Middleware {
12
+ private options;
13
+ constructor(options?: CorsOptions);
14
+ use(req: Request, next: () => Promise<Response>): Promise<Response>;
15
+ private handlePreflight;
16
+ private addCorsHeaders;
17
+ private getAllowedOrigin;
18
+ }
@@ -0,0 +1,79 @@
1
+ export class CorsMiddleware {
2
+ options;
3
+ constructor(options = {}) {
4
+ this.options = {
5
+ origin: options.origin ?? "*",
6
+ methods: options.methods ?? ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
7
+ allowedHeaders: options.allowedHeaders ?? ["Content-Type", "Authorization"],
8
+ exposedHeaders: options.exposedHeaders ?? [],
9
+ credentials: options.credentials ?? false,
10
+ maxAge: options.maxAge ?? 86400,
11
+ preflightContinue: options.preflightContinue ?? false,
12
+ };
13
+ }
14
+ async use(req, next) {
15
+ const origin = req.headers.get("origin") || "";
16
+ // Handle preflight request
17
+ if (req.method === "OPTIONS") {
18
+ return this.handlePreflight(origin);
19
+ }
20
+ // Handle actual request
21
+ const response = await next();
22
+ return this.addCorsHeaders(response, origin);
23
+ }
24
+ handlePreflight(origin) {
25
+ const headers = new Headers();
26
+ // Set CORS headers
27
+ headers.set("Access-Control-Allow-Origin", this.getAllowedOrigin(origin));
28
+ headers.set("Access-Control-Allow-Methods", this.options.methods.join(", "));
29
+ headers.set("Access-Control-Allow-Headers", this.options.allowedHeaders.join(", "));
30
+ if (this.options.exposedHeaders.length > 0) {
31
+ headers.set("Access-Control-Expose-Headers", this.options.exposedHeaders.join(", "));
32
+ }
33
+ if (this.options.credentials) {
34
+ headers.set("Access-Control-Allow-Credentials", "true");
35
+ }
36
+ headers.set("Access-Control-Max-Age", this.options.maxAge.toString());
37
+ // Preflight response (204 No Content)
38
+ return new Response(null, {
39
+ status: 204,
40
+ headers,
41
+ });
42
+ }
43
+ addCorsHeaders(response, origin) {
44
+ const headers = new Headers(response.headers);
45
+ headers.set("Access-Control-Allow-Origin", this.getAllowedOrigin(origin));
46
+ if (this.options.exposedHeaders.length > 0) {
47
+ headers.set("Access-Control-Expose-Headers", this.options.exposedHeaders.join(", "));
48
+ }
49
+ if (this.options.credentials) {
50
+ headers.set("Access-Control-Allow-Credentials", "true");
51
+ }
52
+ return new Response(response.body, {
53
+ status: response.status,
54
+ statusText: response.statusText,
55
+ headers,
56
+ });
57
+ }
58
+ getAllowedOrigin(origin) {
59
+ const { origin: allowedOrigin } = this.options;
60
+ // Wildcard
61
+ if (allowedOrigin === "*") {
62
+ return "*";
63
+ }
64
+ // String match
65
+ if (typeof allowedOrigin === "string") {
66
+ return allowedOrigin === origin ? origin : "null";
67
+ }
68
+ // Array match
69
+ if (Array.isArray(allowedOrigin)) {
70
+ return allowedOrigin.includes(origin) ? origin : "null";
71
+ }
72
+ // Function match
73
+ if (typeof allowedOrigin === "function") {
74
+ return allowedOrigin(origin) ? origin : "null";
75
+ }
76
+ return "null";
77
+ }
78
+ }
79
+ //# sourceMappingURL=cors.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.middleware.js","sourceRoot":"","sources":["../../src/middleware/cors.middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Middleware } from "../core/router.js";
2
+ export interface PerformanceMetrics {
3
+ path: string;
4
+ method: string;
5
+ duration: number;
6
+ status: number;
7
+ timestamp: number;
8
+ }
9
+ export declare class PerformanceTrackerMiddleware implements Middleware {
10
+ private slowRequestThreshold;
11
+ private logger;
12
+ private metrics;
13
+ private readonly maxMetrics;
14
+ /**
15
+ * Slow request threshold in milliseconds
16
+ */
17
+ constructor(slowRequestThreshold?: number);
18
+ use(req: Request, next: () => Promise<Response>): Promise<Response>;
19
+ /**
20
+ * Get metrics for a specific path
21
+ */
22
+ getMetrics(path?: string): PerformanceMetrics[];
23
+ /**
24
+ * Get average response time for a path
25
+ */
26
+ getAverageResponseTime(path?: string): number;
27
+ /**
28
+ * Get percentile response time
29
+ */
30
+ getPercentile(percentile: number, path?: string): number;
31
+ /**
32
+ * Clear metrics
33
+ */
34
+ clear(): void;
35
+ }
@@ -0,0 +1,79 @@
1
+ import { Logger } from "../core/logger.js";
2
+ export class PerformanceTrackerMiddleware {
3
+ slowRequestThreshold;
4
+ logger = new Logger("Performance");
5
+ metrics = [];
6
+ maxMetrics = 1000;
7
+ /**
8
+ * Slow request threshold in milliseconds
9
+ */
10
+ constructor(slowRequestThreshold = 1000) {
11
+ this.slowRequestThreshold = slowRequestThreshold;
12
+ }
13
+ async use(req, next) {
14
+ const url = new URL(req.url);
15
+ const startTime = performance.now();
16
+ const response = await next();
17
+ const duration = performance.now() - startTime;
18
+ // Record metrics
19
+ const metric = {
20
+ path: url.pathname,
21
+ method: req.method,
22
+ duration: Math.round(duration),
23
+ status: response.status,
24
+ timestamp: Date.now(),
25
+ };
26
+ this.metrics.push(metric);
27
+ // Keep only recent metrics
28
+ if (this.metrics.length > this.maxMetrics) {
29
+ this.metrics.shift();
30
+ }
31
+ // Log slow requests
32
+ if (duration > this.slowRequestThreshold) {
33
+ this.logger.warn("Slow request detected", {
34
+ method: req.method,
35
+ path: url.pathname,
36
+ duration: `${Math.round(duration)}ms`,
37
+ threshold: `${this.slowRequestThreshold}ms`,
38
+ });
39
+ }
40
+ return response;
41
+ }
42
+ /**
43
+ * Get metrics for a specific path
44
+ */
45
+ getMetrics(path) {
46
+ if (path) {
47
+ return this.metrics.filter((m) => m.path === path);
48
+ }
49
+ return [...this.metrics];
50
+ }
51
+ /**
52
+ * Get average response time for a path
53
+ */
54
+ getAverageResponseTime(path) {
55
+ const metrics = path ? this.metrics.filter((m) => m.path === path) : this.metrics;
56
+ if (metrics.length === 0)
57
+ return 0;
58
+ const total = metrics.reduce((sum, m) => sum + m.duration, 0);
59
+ return Math.round(total / metrics.length);
60
+ }
61
+ /**
62
+ * Get percentile response time
63
+ */
64
+ getPercentile(percentile, path) {
65
+ const metrics = path ? this.metrics.filter((m) => m.path === path) : this.metrics;
66
+ if (metrics.length === 0)
67
+ return 0;
68
+ const sorted = metrics.map((m) => m.duration).sort((a, b) => a - b);
69
+ const index = Math.ceil((percentile / 100) * sorted.length) - 1;
70
+ return sorted[index];
71
+ }
72
+ /**
73
+ * Clear metrics
74
+ */
75
+ clear() {
76
+ this.metrics = [];
77
+ }
78
+ }
79
+ //# sourceMappingURL=performance-tracker.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance-tracker.middleware.js","sourceRoot":"","sources":["../../src/middleware/performance-tracker.middleware.ts"],"names":[],"mappings":"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"}