@velajs/vela 1.19.0 → 1.19.1

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 (449) hide show
  1. package/CHANGELOG.md +22 -14
  2. package/dist/configurable-module.builder-5FGMaXG6.js +91 -0
  3. package/dist/configurable-module.builder-5FGMaXG6.js.map +1 -0
  4. package/dist/container-BqUHID4l.js +645 -0
  5. package/dist/container-BqUHID4l.js.map +1 -0
  6. package/dist/cron-matcher-C9qv5OUA.js +113 -0
  7. package/dist/cron-matcher-C9qv5OUA.js.map +1 -0
  8. package/dist/decorate-GcSMAbKn.js +528 -0
  9. package/dist/decorate-GcSMAbKn.js.map +1 -0
  10. package/dist/decorators-C8YBFCIk.js +53 -0
  11. package/dist/decorators-C8YBFCIk.js.map +1 -0
  12. package/dist/define-module-NOyOZNXD.js +235 -0
  13. package/dist/define-module-NOyOZNXD.js.map +1 -0
  14. package/dist/discovery.service-BYm95SSD.js +368 -0
  15. package/dist/discovery.service-BYm95SSD.js.map +1 -0
  16. package/dist/discovery.service-Cpf1QcZ5.d.ts +648 -0
  17. package/dist/i18n/index.d.ts +138 -10
  18. package/dist/i18n/index.js +270 -8
  19. package/dist/i18n/index.js.map +1 -0
  20. package/dist/index-D72EQfcC.d.ts +430 -0
  21. package/dist/index-DhShDLCM.d.ts +2310 -0
  22. package/dist/index.d.ts +6 -70
  23. package/dist/index.js +14 -76
  24. package/dist/internal.d.ts +13 -17
  25. package/dist/internal.js +6 -19
  26. package/dist/live/index.d.ts +2 -12
  27. package/dist/live/index.js +826 -16
  28. package/dist/live/index.js.map +1 -0
  29. package/dist/metadata.registry-D1od8ZBt.d.ts +842 -0
  30. package/dist/plugin-ByBlVOve.js +1387 -0
  31. package/dist/plugin-ByBlVOve.js.map +1 -0
  32. package/dist/queue/index.d.ts +247 -10
  33. package/dist/queue/index.js +384 -12
  34. package/dist/queue/index.js.map +1 -0
  35. package/dist/request-context-C3nCGJNd.js +26 -0
  36. package/dist/request-context-C3nCGJNd.js.map +1 -0
  37. package/dist/route.manager-DRAZ5X04.js +991 -0
  38. package/dist/route.manager-DRAZ5X04.js.map +1 -0
  39. package/dist/schedule-node/index.d.ts +32 -3
  40. package/dist/schedule-node/index.js +97 -3
  41. package/dist/schedule-node/index.js.map +1 -0
  42. package/dist/schedule.registry-DVm7Jp5w.d.ts +55 -0
  43. package/dist/seeder/index.d.ts +75 -5
  44. package/dist/seeder/index.js +105 -4
  45. package/dist/seeder/index.js.map +1 -0
  46. package/dist/signed-url-CMmi0SIb.js +56 -0
  47. package/dist/signed-url-CMmi0SIb.js.map +1 -0
  48. package/dist/signed-url-DKhgja4U.d.ts +16 -0
  49. package/dist/src-eb5CI6Xn.js +2151 -0
  50. package/dist/src-eb5CI6Xn.js.map +1 -0
  51. package/dist/storage/index.d.ts +57 -4
  52. package/dist/storage/index.js +22 -5
  53. package/dist/storage/index.js.map +1 -0
  54. package/dist/streaming/index.d.ts +2 -2
  55. package/dist/streaming/index.js +2 -1
  56. package/dist/websocket/index.d.ts +3 -12
  57. package/dist/websocket/index.js +2 -16
  58. package/dist/websocket-DXmB-MWJ.js +697 -0
  59. package/dist/websocket-DXmB-MWJ.js.map +1 -0
  60. package/dist/websocket-node/index.d.ts +108 -6
  61. package/dist/websocket-node/index.js +228 -6
  62. package/dist/websocket-node/index.js.map +1 -0
  63. package/package.json +66 -53
  64. package/dist/__tests__/workers/entry.d.ts +0 -9
  65. package/dist/__tests__/workers-als/entry-als.d.ts +0 -9
  66. package/dist/application.d.ts +0 -104
  67. package/dist/application.js +0 -364
  68. package/dist/cache/cache.decorators.d.ts +0 -2
  69. package/dist/cache/cache.decorators.js +0 -4
  70. package/dist/cache/cache.interceptor.d.ts +0 -9
  71. package/dist/cache/cache.interceptor.js +0 -60
  72. package/dist/cache/cache.module.d.ts +0 -7
  73. package/dist/cache/cache.module.js +0 -58
  74. package/dist/cache/cache.service.d.ts +0 -9
  75. package/dist/cache/cache.service.js +0 -42
  76. package/dist/cache/cache.store.d.ts +0 -12
  77. package/dist/cache/cache.store.js +0 -51
  78. package/dist/cache/cache.tokens.d.ts +0 -6
  79. package/dist/cache/cache.tokens.js +0 -5
  80. package/dist/cache/cache.types.d.ts +0 -41
  81. package/dist/cache/cache.types.js +0 -1
  82. package/dist/cache/index.d.ts +0 -8
  83. package/dist/cache/index.js +0 -7
  84. package/dist/cache/tiered-cache.store.d.ts +0 -19
  85. package/dist/cache/tiered-cache.store.js +0 -40
  86. package/dist/config/config.module.d.ts +0 -19
  87. package/dist/config/config.module.js +0 -98
  88. package/dist/config/config.service.d.ts +0 -20
  89. package/dist/config/config.service.js +0 -43
  90. package/dist/config/config.store.d.ts +0 -46
  91. package/dist/config/config.store.js +0 -119
  92. package/dist/config/config.tokens.d.ts +0 -13
  93. package/dist/config/config.tokens.js +0 -14
  94. package/dist/config/config.types.d.ts +0 -41
  95. package/dist/config/config.types.js +0 -4
  96. package/dist/config/index.d.ts +0 -7
  97. package/dist/config/index.js +0 -5
  98. package/dist/config/register-as.d.ts +0 -52
  99. package/dist/config/register-as.js +0 -39
  100. package/dist/constants.d.ts +0 -44
  101. package/dist/constants.js +0 -46
  102. package/dist/container/container.d.ts +0 -154
  103. package/dist/container/container.js +0 -849
  104. package/dist/container/decorators.d.ts +0 -17
  105. package/dist/container/decorators.js +0 -57
  106. package/dist/container/disposable.d.ts +0 -5
  107. package/dist/container/disposable.js +0 -33
  108. package/dist/container/index.d.ts +0 -6
  109. package/dist/container/index.js +0 -5
  110. package/dist/container/mixin.d.ts +0 -24
  111. package/dist/container/mixin.js +0 -26
  112. package/dist/container/module-ref.d.ts +0 -21
  113. package/dist/container/module-ref.js +0 -48
  114. package/dist/container/types.d.ts +0 -154
  115. package/dist/container/types.js +0 -49
  116. package/dist/cors/cors.module.d.ts +0 -7
  117. package/dist/cors/cors.module.js +0 -37
  118. package/dist/cors/cors.tokens.d.ts +0 -3
  119. package/dist/cors/cors.tokens.js +0 -2
  120. package/dist/cors/cors.types.d.ts +0 -8
  121. package/dist/cors/cors.types.js +0 -1
  122. package/dist/cors/index.d.ts +0 -3
  123. package/dist/cors/index.js +0 -2
  124. package/dist/crypto/signed-url.d.ts +0 -12
  125. package/dist/crypto/signed-url.js +0 -60
  126. package/dist/discovery/discoverable.decorator.d.ts +0 -38
  127. package/dist/discovery/discoverable.decorator.js +0 -42
  128. package/dist/discovery/discovery.service.d.ts +0 -102
  129. package/dist/discovery/discovery.service.js +0 -177
  130. package/dist/discovery/index.d.ts +0 -2
  131. package/dist/discovery/index.js +0 -2
  132. package/dist/entrypoint/entrypoint.registry.d.ts +0 -42
  133. package/dist/entrypoint/entrypoint.registry.js +0 -112
  134. package/dist/entrypoint/entrypoint.types.d.ts +0 -41
  135. package/dist/entrypoint/entrypoint.types.js +0 -3
  136. package/dist/entrypoint/execution-context.d.ts +0 -15
  137. package/dist/entrypoint/execution-context.js +0 -21
  138. package/dist/entrypoint/execution-scope.d.ts +0 -21
  139. package/dist/entrypoint/execution-scope.js +0 -28
  140. package/dist/entrypoint/index.d.ts +0 -4
  141. package/dist/entrypoint/index.js +0 -4
  142. package/dist/errors/http-exception.d.ts +0 -63
  143. package/dist/errors/http-exception.js +0 -142
  144. package/dist/errors/index.d.ts +0 -1
  145. package/dist/errors/index.js +0 -1
  146. package/dist/event-emitter/event-emitter.decorators.d.ts +0 -1
  147. package/dist/event-emitter/event-emitter.decorators.js +0 -10
  148. package/dist/event-emitter/event-emitter.module.d.ts +0 -2
  149. package/dist/event-emitter/event-emitter.module.js +0 -23
  150. package/dist/event-emitter/event-emitter.service.d.ts +0 -13
  151. package/dist/event-emitter/event-emitter.service.js +0 -127
  152. package/dist/event-emitter/event-emitter.subscriber.d.ts +0 -9
  153. package/dist/event-emitter/event-emitter.subscriber.js +0 -45
  154. package/dist/event-emitter/event-emitter.tokens.d.ts +0 -1
  155. package/dist/event-emitter/event-emitter.tokens.js +0 -1
  156. package/dist/event-emitter/event-emitter.types.d.ts +0 -5
  157. package/dist/event-emitter/event-emitter.types.js +0 -1
  158. package/dist/event-emitter/index.d.ts +0 -6
  159. package/dist/event-emitter/index.js +0 -5
  160. package/dist/exceptions/errors.module.d.ts +0 -40
  161. package/dist/exceptions/errors.module.js +0 -46
  162. package/dist/exceptions/exception-handler.d.ts +0 -56
  163. package/dist/exceptions/exception-handler.js +0 -17
  164. package/dist/exceptions/index.d.ts +0 -6
  165. package/dist/exceptions/index.js +0 -3
  166. package/dist/exceptions/reporter.d.ts +0 -21
  167. package/dist/exceptions/reporter.js +0 -70
  168. package/dist/factory/adapter.d.ts +0 -36
  169. package/dist/factory/adapter.js +0 -18
  170. package/dist/factory/bootstrap.d.ts +0 -23
  171. package/dist/factory/bootstrap.js +0 -110
  172. package/dist/factory.d.ts +0 -16
  173. package/dist/factory.js +0 -36
  174. package/dist/fetch/fetch.module.d.ts +0 -7
  175. package/dist/fetch/fetch.module.js +0 -31
  176. package/dist/fetch/fetch.service.d.ts +0 -24
  177. package/dist/fetch/fetch.service.js +0 -145
  178. package/dist/fetch/fetch.types.d.ts +0 -24
  179. package/dist/fetch/fetch.types.js +0 -1
  180. package/dist/fetch/index.d.ts +0 -3
  181. package/dist/fetch/index.js +0 -2
  182. package/dist/health/health.http.d.ts +0 -14
  183. package/dist/health/health.http.js +0 -75
  184. package/dist/health/health.indicator.d.ts +0 -9
  185. package/dist/health/health.indicator.js +0 -32
  186. package/dist/health/health.module.d.ts +0 -2
  187. package/dist/health/health.module.js +0 -26
  188. package/dist/health/health.service.d.ts +0 -7
  189. package/dist/health/health.service.js +0 -69
  190. package/dist/health/health.types.d.ts +0 -15
  191. package/dist/health/health.types.js +0 -1
  192. package/dist/health/index.d.ts +0 -6
  193. package/dist/health/index.js +0 -4
  194. package/dist/http/ambient.d.ts +0 -17
  195. package/dist/http/ambient.js +0 -44
  196. package/dist/http/argument-resolver.d.ts +0 -10
  197. package/dist/http/argument-resolver.js +0 -89
  198. package/dist/http/decorators.d.ts +0 -198
  199. package/dist/http/decorators.js +0 -321
  200. package/dist/http/execution-context.d.ts +0 -8
  201. package/dist/http/execution-context.js +0 -35
  202. package/dist/http/handler-executor.d.ts +0 -20
  203. package/dist/http/handler-executor.js +0 -133
  204. package/dist/http/index.d.ts +0 -12
  205. package/dist/http/index.js +0 -7
  206. package/dist/http/instantiate.d.ts +0 -4
  207. package/dist/http/instantiate.js +0 -45
  208. package/dist/http/lazy-param.decorator.d.ts +0 -37
  209. package/dist/http/lazy-param.decorator.js +0 -117
  210. package/dist/http/request-container.d.ts +0 -16
  211. package/dist/http/request-container.js +0 -19
  212. package/dist/http/request-context.d.ts +0 -13
  213. package/dist/http/request-context.js +0 -22
  214. package/dist/http/response-mapper.d.ts +0 -8
  215. package/dist/http/response-mapper.js +0 -42
  216. package/dist/http/route-contributor.d.ts +0 -68
  217. package/dist/http/route-contributor.js +0 -22
  218. package/dist/http/route-map.d.ts +0 -30
  219. package/dist/http/route-map.js +0 -27
  220. package/dist/http/route.manager.d.ts +0 -92
  221. package/dist/http/route.manager.js +0 -481
  222. package/dist/http/types.d.ts +0 -37
  223. package/dist/http/types.js +0 -1
  224. package/dist/http/url/index.d.ts +0 -4
  225. package/dist/http/url/index.js +0 -3
  226. package/dist/http/url/signed-url.guard.d.ts +0 -27
  227. package/dist/http/url/signed-url.guard.js +0 -62
  228. package/dist/http/url/signing-secret.d.ts +0 -20
  229. package/dist/http/url/signing-secret.js +0 -24
  230. package/dist/http/url/url-generator.service.d.ts +0 -52
  231. package/dist/http/url/url-generator.service.js +0 -104
  232. package/dist/i18n/deep-merge.d.ts +0 -2
  233. package/dist/i18n/deep-merge.js +0 -15
  234. package/dist/i18n/i18n.middleware.d.ts +0 -15
  235. package/dist/i18n/i18n.middleware.js +0 -94
  236. package/dist/i18n/i18n.module.d.ts +0 -13
  237. package/dist/i18n/i18n.module.js +0 -69
  238. package/dist/i18n/i18n.options.d.ts +0 -30
  239. package/dist/i18n/i18n.options.js +0 -16
  240. package/dist/i18n/i18n.service.d.ts +0 -20
  241. package/dist/i18n/i18n.service.js +0 -49
  242. package/dist/i18n/i18n.tokens.d.ts +0 -6
  243. package/dist/i18n/i18n.tokens.js +0 -3
  244. package/dist/i18n/i18n.types.d.ts +0 -6
  245. package/dist/i18n/i18n.types.js +0 -1
  246. package/dist/i18n/message-loader.service.d.ts +0 -21
  247. package/dist/i18n/message-loader.service.js +0 -90
  248. package/dist/i18n/message-registry.d.ts +0 -16
  249. package/dist/i18n/message-registry.js +0 -49
  250. package/dist/lifecycle/index.d.ts +0 -20
  251. package/dist/lifecycle/index.js +0 -15
  252. package/dist/live/live.cursor.d.ts +0 -22
  253. package/dist/live/live.cursor.js +0 -56
  254. package/dist/live/live.decorators.d.ts +0 -32
  255. package/dist/live/live.decorators.js +0 -46
  256. package/dist/live/live.delta.d.ts +0 -15
  257. package/dist/live/live.delta.js +0 -51
  258. package/dist/live/live.engine.d.ts +0 -88
  259. package/dist/live/live.engine.js +0 -471
  260. package/dist/live/live.invalidation.d.ts +0 -45
  261. package/dist/live/live.invalidation.js +0 -99
  262. package/dist/live/live.module.d.ts +0 -28
  263. package/dist/live/live.module.js +0 -87
  264. package/dist/live/live.tokens.d.ts +0 -9
  265. package/dist/live/live.tokens.js +0 -8
  266. package/dist/live/live.types.d.ts +0 -138
  267. package/dist/live/live.types.js +0 -1
  268. package/dist/live/presence.d.ts +0 -44
  269. package/dist/live/presence.js +0 -130
  270. package/dist/metadata.d.ts +0 -10
  271. package/dist/metadata.js +0 -20
  272. package/dist/module/configurable-module.builder.d.ts +0 -56
  273. package/dist/module/configurable-module.builder.js +0 -84
  274. package/dist/module/configurable-module.types.d.ts +0 -93
  275. package/dist/module/configurable-module.types.js +0 -5
  276. package/dist/module/decorators.d.ts +0 -10
  277. package/dist/module/decorators.js +0 -47
  278. package/dist/module/define-module.d.ts +0 -112
  279. package/dist/module/define-module.js +0 -232
  280. package/dist/module/graph.d.ts +0 -10
  281. package/dist/module/graph.js +0 -35
  282. package/dist/module/index.d.ts +0 -10
  283. package/dist/module/index.js +0 -7
  284. package/dist/module/lazy-modules.d.ts +0 -82
  285. package/dist/module/lazy-modules.js +0 -231
  286. package/dist/module/lazy-provider.d.ts +0 -65
  287. package/dist/module/lazy-provider.js +0 -111
  288. package/dist/module/middleware.d.ts +0 -30
  289. package/dist/module/middleware.js +0 -67
  290. package/dist/module/module-loader.d.ts +0 -58
  291. package/dist/module/module-loader.js +0 -484
  292. package/dist/module/stable-hash.d.ts +0 -15
  293. package/dist/module/stable-hash.js +0 -52
  294. package/dist/module/types.d.ts +0 -1
  295. package/dist/module/types.js +0 -1
  296. package/dist/openapi/decorators.d.ts +0 -34
  297. package/dist/openapi/decorators.js +0 -66
  298. package/dist/openapi/document.d.ts +0 -3
  299. package/dist/openapi/document.js +0 -316
  300. package/dist/openapi/index.d.ts +0 -7
  301. package/dist/openapi/index.js +0 -6
  302. package/dist/openapi/redoc-ui.d.ts +0 -1
  303. package/dist/openapi/redoc-ui.js +0 -19
  304. package/dist/openapi/scalar-ui.d.ts +0 -1
  305. package/dist/openapi/scalar-ui.js +0 -19
  306. package/dist/openapi/swagger-ui.d.ts +0 -1
  307. package/dist/openapi/swagger-ui.js +0 -23
  308. package/dist/openapi/types.d.ts +0 -182
  309. package/dist/openapi/types.js +0 -4
  310. package/dist/openapi/zod-to-json-schema.d.ts +0 -4
  311. package/dist/openapi/zod-to-json-schema.js +0 -57
  312. package/dist/pipeline/app-providers.d.ts +0 -10
  313. package/dist/pipeline/app-providers.js +0 -43
  314. package/dist/pipeline/component.manager.d.ts +0 -25
  315. package/dist/pipeline/component.manager.js +0 -66
  316. package/dist/pipeline/decorators.d.ts +0 -10
  317. package/dist/pipeline/decorators.js +0 -42
  318. package/dist/pipeline/index.d.ts +0 -12
  319. package/dist/pipeline/index.js +0 -7
  320. package/dist/pipeline/pipeline-runner.d.ts +0 -31
  321. package/dist/pipeline/pipeline-runner.js +0 -40
  322. package/dist/pipeline/pipes.d.ts +0 -48
  323. package/dist/pipeline/pipes.js +0 -104
  324. package/dist/pipeline/reflector.d.ts +0 -86
  325. package/dist/pipeline/reflector.js +0 -121
  326. package/dist/pipeline/scoped-components.d.ts +0 -26
  327. package/dist/pipeline/scoped-components.js +0 -27
  328. package/dist/pipeline/tokens.d.ts +0 -57
  329. package/dist/pipeline/tokens.js +0 -47
  330. package/dist/pipeline/types.d.ts +0 -64
  331. package/dist/pipeline/types.js +0 -1
  332. package/dist/plugin/plugin.d.ts +0 -31
  333. package/dist/plugin/plugin.js +0 -111
  334. package/dist/queue/inline.driver.d.ts +0 -30
  335. package/dist/queue/inline.driver.js +0 -58
  336. package/dist/queue/queue.binding.d.ts +0 -23
  337. package/dist/queue/queue.binding.js +0 -60
  338. package/dist/queue/queue.client.d.ts +0 -20
  339. package/dist/queue/queue.client.js +0 -33
  340. package/dist/queue/queue.decorators.d.ts +0 -23
  341. package/dist/queue/queue.decorators.js +0 -46
  342. package/dist/queue/queue.dispatch.d.ts +0 -36
  343. package/dist/queue/queue.dispatch.js +0 -109
  344. package/dist/queue/queue.module.d.ts +0 -32
  345. package/dist/queue/queue.module.js +0 -80
  346. package/dist/queue/queue.tokens.d.ts +0 -21
  347. package/dist/queue/queue.tokens.js +0 -34
  348. package/dist/queue/queue.types.d.ts +0 -61
  349. package/dist/queue/queue.types.js +0 -4
  350. package/dist/registry/index.d.ts +0 -2
  351. package/dist/registry/index.js +0 -1
  352. package/dist/registry/metadata.registry.d.ts +0 -73
  353. package/dist/registry/metadata.registry.js +0 -357
  354. package/dist/registry/paths.d.ts +0 -3
  355. package/dist/registry/paths.js +0 -15
  356. package/dist/registry/types.d.ts +0 -116
  357. package/dist/registry/types.js +0 -1
  358. package/dist/registry/util.d.ts +0 -3
  359. package/dist/registry/util.js +0 -8
  360. package/dist/schedule/cron-matcher.d.ts +0 -2
  361. package/dist/schedule/cron-matcher.js +0 -62
  362. package/dist/schedule/index.d.ts +0 -8
  363. package/dist/schedule/index.js +0 -5
  364. package/dist/schedule/schedule.decorators.d.ts +0 -2
  365. package/dist/schedule/schedule.decorators.js +0 -18
  366. package/dist/schedule/schedule.module.d.ts +0 -9
  367. package/dist/schedule/schedule.module.js +0 -28
  368. package/dist/schedule/schedule.registry.d.ts +0 -23
  369. package/dist/schedule/schedule.registry.js +0 -63
  370. package/dist/schedule/schedule.tokens.d.ts +0 -2
  371. package/dist/schedule/schedule.tokens.js +0 -2
  372. package/dist/schedule/schedule.types.d.ts +0 -8
  373. package/dist/schedule/schedule.types.js +0 -1
  374. package/dist/schedule-node/schedule-node.module.d.ts +0 -9
  375. package/dist/schedule-node/schedule-node.module.js +0 -28
  376. package/dist/schedule-node/schedule.executor.d.ts +0 -19
  377. package/dist/schedule-node/schedule.executor.js +0 -112
  378. package/dist/seeder/seeder.decorator.d.ts +0 -7
  379. package/dist/seeder/seeder.decorator.js +0 -15
  380. package/dist/seeder/seeder.module.d.ts +0 -16
  381. package/dist/seeder/seeder.module.js +0 -44
  382. package/dist/seeder/seeder.registry.d.ts +0 -23
  383. package/dist/seeder/seeder.registry.js +0 -83
  384. package/dist/seeder/seeder.tokens.d.ts +0 -2
  385. package/dist/seeder/seeder.tokens.js +0 -1
  386. package/dist/seeder/seeder.types.d.ts +0 -20
  387. package/dist/seeder/seeder.types.js +0 -1
  388. package/dist/serialization/index.d.ts +0 -2
  389. package/dist/serialization/index.js +0 -2
  390. package/dist/serialization/serialize.decorator.d.ts +0 -6
  391. package/dist/serialization/serialize.decorator.js +0 -7
  392. package/dist/serialization/serializer.interceptor.d.ts +0 -4
  393. package/dist/serialization/serializer.interceptor.js +0 -16
  394. package/dist/services/index.d.ts +0 -2
  395. package/dist/services/index.js +0 -1
  396. package/dist/services/logger.d.ts +0 -59
  397. package/dist/services/logger.js +0 -159
  398. package/dist/storage/path-template.d.ts +0 -9
  399. package/dist/storage/path-template.js +0 -20
  400. package/dist/storage/storage.types.d.ts +0 -41
  401. package/dist/storage/storage.types.js +0 -5
  402. package/dist/throttler/index.d.ts +0 -6
  403. package/dist/throttler/index.js +0 -5
  404. package/dist/throttler/throttler.decorators.d.ts +0 -3
  405. package/dist/throttler/throttler.decorators.js +0 -4
  406. package/dist/throttler/throttler.guard.d.ts +0 -9
  407. package/dist/throttler/throttler.guard.js +0 -72
  408. package/dist/throttler/throttler.module.d.ts +0 -7
  409. package/dist/throttler/throttler.module.js +0 -41
  410. package/dist/throttler/throttler.storage.d.ts +0 -10
  411. package/dist/throttler/throttler.storage.js +0 -44
  412. package/dist/throttler/throttler.tokens.d.ts +0 -6
  413. package/dist/throttler/throttler.tokens.js +0 -5
  414. package/dist/throttler/throttler.types.d.ts +0 -25
  415. package/dist/throttler/throttler.types.js +0 -1
  416. package/dist/validation/create-zod-dto.d.ts +0 -13
  417. package/dist/validation/create-zod-dto.js +0 -18
  418. package/dist/validation/index.d.ts +0 -3
  419. package/dist/validation/index.js +0 -2
  420. package/dist/validation/validation.pipe.d.ts +0 -4
  421. package/dist/validation/validation.pipe.js +0 -19
  422. package/dist/websocket/websocket.decorators.d.ts +0 -47
  423. package/dist/websocket/websocket.decorators.js +0 -80
  424. package/dist/websocket/websocket.module.d.ts +0 -35
  425. package/dist/websocket/websocket.module.js +0 -63
  426. package/dist/websocket/websocket.tokens.d.ts +0 -30
  427. package/dist/websocket/websocket.tokens.js +0 -27
  428. package/dist/websocket/websocket.types.d.ts +0 -102
  429. package/dist/websocket/websocket.types.js +0 -4
  430. package/dist/websocket/ws-argument-resolver.d.ts +0 -13
  431. package/dist/websocket/ws-argument-resolver.js +0 -40
  432. package/dist/websocket/ws-dispatcher.d.ts +0 -54
  433. package/dist/websocket/ws-dispatcher.js +0 -343
  434. package/dist/websocket/ws-exception.d.ts +0 -25
  435. package/dist/websocket/ws-exception.js +0 -42
  436. package/dist/websocket/ws-execution-context.d.ts +0 -9
  437. package/dist/websocket/ws-execution-context.js +0 -24
  438. package/dist/websocket/ws-server.d.ts +0 -31
  439. package/dist/websocket/ws-server.js +0 -74
  440. package/dist/websocket/ws-sync.d.ts +0 -47
  441. package/dist/websocket/ws-sync.js +0 -74
  442. package/dist/websocket-node/node-ws-client.d.ts +0 -24
  443. package/dist/websocket-node/node-ws-client.js +0 -49
  444. package/dist/websocket-node/redis-live.d.ts +0 -24
  445. package/dist/websocket-node/redis-live.js +0 -57
  446. package/dist/websocket-node/redis-sync.d.ts +0 -33
  447. package/dist/websocket-node/redis-sync.js +0 -56
  448. package/dist/websocket-node/register-gateways.d.ts +0 -20
  449. package/dist/websocket-node/register-gateways.js +0 -61
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.manager-DRAZ5X04.js","names":["honoCtx"],"sources":["../src/metadata.ts","../src/registry/paths.ts","../src/http/instantiate.ts","../src/http/argument-resolver.ts","../src/http/route-contributor.ts","../src/http/execution-context.ts","../src/pipeline/pipeline-runner.ts","../src/pipeline/component.manager.ts","../src/pipeline/decorators.ts","../src/http/decorators.ts","../src/http/response-mapper.ts","../src/http/handler-executor.ts","../src/http/route.manager.ts"],"sourcesContent":["// Single funnel: every Reflect.* metadata write/read routes into MetadataRegistry.\n// SWC emits Reflect.metadata('design:paramtypes', ...) calls in compiled code;\n// the polyfill catches those and parks them in the registry alongside vela's typed slots.\n\nimport { MetadataRegistry } from './registry/metadata.registry';\n\ndeclare global {\n namespace Reflect {\n function defineMetadata(\n key: string,\n value: unknown,\n target: object,\n propertyKey?: string | symbol,\n ): void;\n function getMetadata(key: string, target: object, propertyKey?: string | symbol): unknown;\n function getOwnMetadata(key: string, target: object, propertyKey?: string | symbol): unknown;\n function metadata(\n key: string,\n value: unknown,\n ): (target: object, propertyKey?: string | symbol) => void;\n }\n}\n\nexport function defineMetadata(\n key: string,\n value: unknown,\n target: object,\n propertyKey?: string | symbol,\n): void {\n MetadataRegistry.setReflectMetadata(target, key, value, propertyKey);\n}\n\nexport function getMetadata<T = unknown>(\n key: string,\n target: object,\n propertyKey?: string | symbol,\n): T | undefined {\n return MetadataRegistry.getReflectMetadata<T>(target, key, propertyKey);\n}\n\nif (typeof Reflect.defineMetadata !== 'function') {\n Reflect.defineMetadata = defineMetadata;\n Reflect.getMetadata = getMetadata;\n Reflect.getOwnMetadata = getMetadata;\n Reflect.metadata = (key: string, value: unknown) => {\n return (target: object, propertyKey?: string | symbol) => {\n defineMetadata(key, value, target, propertyKey);\n };\n };\n}\n","// Single home for path manipulation. Used by route building, openapi docs,\n// and decorator metadata.\n\nexport function normalizePath(path: string): string {\n if (!path) return path;\n return path.startsWith('/') ? path : `/${path}`;\n}\n\nexport function joinPaths(prefix: string, path: string): string {\n const cleanPrefix = prefix.endsWith('/') ? prefix.slice(0, -1) : prefix;\n const cleanPath = path && !path.startsWith('/') ? `/${path}` : path;\n return `${cleanPrefix}${cleanPath}` || '/';\n}\n\n// Convert ':id' Hono syntax to '{id}' OpenAPI syntax.\nexport function toOpenApiPath(path: string): string {\n return path.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, '{$1}');\n}\n","import { getConstructorDependencies, getInjectMetadata } from '../container/decorators';\nimport type { Container } from '../container/container';\nimport type { Token, Type } from '../container/types';\n\n// Resolve a class/token through the container if registered, otherwise treat\n// the input as a plain instance. Used by RouteManager and HandlerExecutor to\n// materialize middleware, guards, pipes, interceptors, and filters per request.\n//\n// When the input is a class that is NOT registered in the container, we fall\n// back to `new clazz()` so plain parameterless helper classes (e.g. mixin\n// guards, ad-hoc `@UseGuards(LocalGuard)` references) keep working. That\n// fallback is unsafe for classes whose CONSTRUCTOR EXPECTS DEPENDENCIES,\n// because zero-arg construction would leave every injected slot `undefined`\n// — a silent failure mode that surfaces later as\n// `Cannot read properties of undefined (reading '...')` deep inside the\n// class. For those classes we throw a loud, actionable error instead.\n//\n// We treat \"expects dependencies\" as: any `@Inject(...)` parameter metadata\n// OR a non-empty `design:paramtypes` (the SWC/TS emit for any constructor\n// parameter). `@Injectable()` alone is NOT sufficient — `mixin()` and many\n// parameterless guards are `@Injectable()` and still safe to `new` directly.\nexport function instantiate<T>(classOrInstance: Type<T> | Token<T> | T, container: Container): T {\n if (typeof classOrInstance === 'function') {\n const clazz = classOrInstance as Type<T>;\n if (container.has(clazz)) {\n return container.resolve(clazz);\n }\n if (constructorExpectsDependencies(clazz)) {\n throw new Error(\n `Cannot instantiate ${clazz.name}: the class declares constructor ` +\n `dependencies (\\`@Inject(...)\\` parameters or typed constructor ` +\n `parameters), but no matching provider is registered in the ` +\n `container. Add it to a module's providers (and export it if used ` +\n `outside its declaring module) instead of relying on the bare ` +\n `\\`new\\` fallback, which would construct the class without ` +\n `honouring its dependency-injection metadata and leave every ` +\n `injected field \\`undefined\\`.`,\n );\n }\n return new clazz();\n }\n\n if (container.has(classOrInstance as Token<T>)) {\n return container.resolve(classOrInstance as Token<T>);\n }\n\n return classOrInstance as T;\n}\n\n// True when calling `new clazz()` would leave an injected slot `undefined`:\n// either the class has explicit `@Inject(...)` metadata, or it has any typed\n// constructor parameter (TS/SWC's `design:paramtypes` emit). Parameterless\n// `@Injectable()` classes return false — `new()` is safe for them.\nfunction constructorExpectsDependencies(clazz: Type<unknown>): boolean {\n if (getInjectMetadata(clazz).length > 0) return true;\n return getConstructorDependencies(clazz).length > 0;\n}\n\nexport function instantiateMany<T>(\n items: Array<Type<T> | Token<T> | T>,\n container: Container,\n): T[] {\n return items.map((item) => instantiate(item, container));\n}\n","import { getCookie } from 'hono/cookie';\nimport type { Context } from 'hono';\nimport { ParamType } from '../constants';\nimport type { Container } from '../container/container';\nimport type { Type } from '../container/types';\nimport type { ArgumentMetadata, PipeTransform } from '../pipeline/types';\nimport { instantiate } from './instantiate';\nimport type { ParamMetadata } from './types';\n\ntype ParamExtractor = (c: Context, param: ParamMetadata) => unknown | Promise<unknown>;\n\nconst PARAM_EXTRACTORS = new Map<ParamType, ParamExtractor>([\n [ParamType.PARAM, (c, p) => (p.name ? c.req.param(p.name) : c.req.param())],\n [ParamType.QUERY, (c, p) => (p.name ? c.req.query(p.name) : c.req.query())],\n [\n ParamType.BODY,\n async (c, p) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return undefined;\n }\n return p.name && body !== null && typeof body === 'object'\n ? (body as Record<string, unknown>)[p.name]\n : body;\n },\n ],\n [ParamType.HEADERS, (c, p) => (p.name ? c.req.header(p.name) : c.req.header())],\n [ParamType.REQUEST, (c) => c],\n [ParamType.RESPONSE, (c) => c],\n [ParamType.COOKIE, (c, p) => (p.name ? getCookie(c, p.name) : getCookie(c))],\n [ParamType.RAW_BODY, async (c) => new Uint8Array(await c.req.arrayBuffer())],\n]);\n\n// Pulls handler arguments from the request, applies shared pipes (global +\n// controller + method) and then per-param pipes. Empty paramMetadata returns\n// `[c]` to match the old direct-Hono-handler shape — a back-compat behavior\n// the framework's tests rely on.\nexport class ArgumentResolver {\n constructor(private readonly ipExtractor: (c: Context) => string | null) {}\n\n async extract(\n c: Context,\n paramMetadata: ParamMetadata[],\n pipes: PipeTransform[],\n requestContainer: Container,\n paramTypes?: unknown[],\n ): Promise<unknown[]> {\n if (paramMetadata.length === 0) {\n return [c];\n }\n\n const maxIndex = paramMetadata.at(-1)!.index;\n const args: unknown[] = new Array(maxIndex + 1).fill(undefined);\n\n for (const param of paramMetadata) {\n let value = await this.extractParam(c, param);\n\n const metadata: ArgumentMetadata = {\n type: param.type,\n data: param.name,\n metatype: (param.metatype ?? paramTypes?.[param.index]) as Type | undefined,\n };\n\n for (const pipe of pipes) {\n value = await pipe.transform(value, metadata);\n }\n\n if (param.pipes && param.pipes.length > 0) {\n for (const paramPipe of param.pipes) {\n const pipeInstance = instantiate<PipeTransform>(paramPipe, requestContainer);\n value = await pipeInstance.transform(value, metadata);\n }\n }\n\n args[param.index] = value;\n }\n\n return args;\n }\n\n private extractParam(c: Context, param: ParamMetadata): unknown | Promise<unknown> {\n if (param.type === ParamType.IP) return this.ipExtractor(c);\n const extractor = PARAM_EXTRACTORS.get(param.type as ParamType);\n if (extractor) return extractor(c, param);\n return param.factory ? param.factory(param.name, c) : undefined;\n }\n}\n","import type { Hono } from 'hono';\nimport type { Container } from '../container/container';\nimport type { Type } from '../container/types';\nimport type { OpenApiPathItem } from '../openapi/types';\nimport type { CanActivate } from '../pipeline/types';\n\n/**\n * Context passed to {@link RouteContributor.buildRoutes} for each controller\n * the contributor claims. The contributor receives the framework's resolved\n * view of the world so generated routes behave identically to hand-written\n * ones: same global prefix, same global guard instances, same path joining.\n */\nexport interface RouteContributorContext {\n /** The claimed controller class. */\n controller: Type;\n /** Controller-level prefix as registered with `@Controller(...)`. */\n controllerPrefix: string;\n /** The metadata value (under `claimsMetaKey`) that claimed this controller. */\n meta: unknown;\n /** Application-wide path prefix (e.g. `/api`), already normalized. */\n globalPrefix: string;\n /** Global guard instances, pre-resolved from the root container. */\n globalGuards: CanActivate[];\n /** The app's root container — resolve controller/services from here. */\n container: Container;\n /** Path joiner used by the framework — handles slash normalization. */\n joinPaths: (...parts: string[]) => string;\n}\n\n/** Context for {@link RouteContributor.buildOpenApiPaths}. */\nexport interface RouteContributorOpenApiContext {\n controller: Type;\n meta: unknown;\n /** Application-wide path prefix (e.g. `/api`), already normalized. */\n globalPrefix: string;\n /** Controller-level prefix as registered with `@Controller(...)`. */\n controllerPrefix: string;\n}\n\n/**\n * A route generator that claims controllers by class-level metadata and\n * mounts routes for them — the public extension point behind `@Crud()` (and\n * any future metadata-driven route generator: storage HTTP surfaces, admin\n * panels, RPC bridges).\n *\n * Register once at import time (`registerRouteContributor`); the framework\n * consults contributors during `RouteManager.build` — AFTER all explicit\n * `@Get`/`@Post` routes, so generated `/:id` catch-alls never shadow custom\n * routes — and during OpenAPI document generation.\n *\n * This contract exists instead of dynamic `import()` because esbuild leaves\n * `await import(variable)` as a runtime import Cloudflare Workers cannot\n * resolve.\n */\nexport interface RouteContributor {\n /** Stable identifier; re-registering the same id overwrites (HMR-friendly). */\n id: string;\n /** Class-level metadata key whose presence claims a controller. */\n claimsMetaKey: string;\n buildRoutes(app: Hono, ctx: RouteContributorContext): void | Promise<void>;\n buildOpenApiPaths?(ctx: RouteContributorOpenApiContext): Record<string, OpenApiPathItem>;\n}\n\n// Contributors register at import time (package side effect), so the store is\n// anchored on `globalThis` like MetadataRegistry state: a Vite HMR re-eval\n// reuses the same store instead of minting an empty one.\nconst STORE_KEY = Symbol.for('vela:route-contributors:v1');\n\nfunction store(): Map<string, RouteContributor> {\n const g = globalThis as unknown as Record<symbol, Map<string, RouteContributor> | undefined>;\n return (g[STORE_KEY] ??= new Map());\n}\n\n/** Register a contributor. Last registration per `id` wins. */\nexport function registerRouteContributor(contributor: RouteContributor): void {\n store().set(contributor.id, contributor);\n}\n\n/** All registered contributors (registration order). */\nexport function getRouteContributors(): RouteContributor[] {\n return [...store().values()];\n}\n\n/**\n * Reset all contributor registrations. Test-only.\n * @internal\n */\nexport function _resetRouteContributors(): void {\n store().clear();\n}\n","import type { Context } from 'hono';\nimport type { Type } from '../container/types';\nimport type { ExecutionContext } from '../pipeline/types';\n\n// Single source of ExecutionContext shape — used by the route pipeline AND\n// by createParamDecorator's deferred factory call.\nexport function buildExecutionContext(\n c: Context,\n controller: Type,\n handlerName: string | symbol,\n): ExecutionContext {\n return {\n getType: <T extends string = 'http'>() => 'http' as T,\n getClass: () => controller,\n getHandler: () => handlerName,\n getContext: <T = Context>() => c as T,\n getRequest: () => c.req.raw,\n switchToHttp: () => ({\n getRequest: <T = Request>() => c.req.raw as T,\n getResponse: <T = Context>() => c as T,\n }),\n switchToWs: () => {\n throw new Error(\n 'switchToWs() called on an HTTP ExecutionContext. This handler runs over HTTP, not a WebSocket gateway.',\n );\n },\n };\n}\n\n// Sentinel marker exposed via `ExecutionContext.getClass()` when the host is a\n// vela-attached middleware rather than a controller handler. Filters that\n// branch on the calling class (rare) can detect the middleware origin without\n// introducing a separate `getType()` value — `getType()` stays `'http'` for\n// NestJS parity.\nexport class VelaMiddlewareHost {}\n\n// Synthesizes an ExecutionContext for an exception thrown inside a\n// vela-attached middleware. There is no controller class or handler method\n// on the call stack at that point, so `getClass()` returns the\n// `VelaMiddlewareHost` marker and `getHandler()` returns the\n// `vela.middleware` symbol — both stable, comparable values that filter\n// authors can pattern-match against if needed.\nexport const VELA_MIDDLEWARE_HANDLER: unique symbol = Symbol.for('vela.middleware');\n\nexport function buildMiddlewareExecutionContext(c: Context): ExecutionContext {\n return buildExecutionContext(c, VelaMiddlewareHost as unknown as Type, VELA_MIDDLEWARE_HANDLER);\n}\n","import { ForbiddenException } from '../errors/http-exception';\nimport type { CallHandler, CanActivate, ExecutionContext, NestInterceptor } from './types';\n\nexport interface PipelineRunOptions {\n context: ExecutionContext;\n /** Pre-merged (global ++ scoped), pre-instantiated. */\n guards: CanActivate[];\n interceptors: NestInterceptor[];\n /** Extract handler arguments (pipes already bound inside the closure). */\n resolveArgs: () => Promise<unknown[]>;\n /** Call the actual handler. */\n invoke: (args: unknown[]) => Promise<unknown>;\n /**\n * HTTP runs argument extraction + pipes BEFORE guards (a deliberate vela\n * deviation — see handler-executor); WebSocket runs guards first. Default\n * false (guards first).\n */\n argsBeforeGuards?: boolean;\n /** Error thrown when a guard rejects (default `ForbiddenException`). */\n onGuardReject?: () => Error;\n}\n\n/**\n * The transport-agnostic guard → pipe → interceptor execution core shared by\n * the HTTP `HandlerExecutor` and the WebSocket `WsDispatcher` (and any future\n * entrypoint dispatcher: queue consumers, scheduled jobs, …). Exception\n * FILTERS stay with the caller — their terminal behavior is transport-specific\n * (HTTP maps to a Response, WS sends an error frame).\n */\nexport class PipelineRunner {\n static async run(options: PipelineRunOptions): Promise<unknown> {\n let args: unknown[] | undefined;\n\n if (options.argsBeforeGuards) {\n args = await options.resolveArgs();\n }\n\n for (const guard of options.guards) {\n const canActivate = await guard.canActivate(options.context);\n if (!canActivate) {\n throw options.onGuardReject?.() ?? new ForbiddenException();\n }\n }\n\n args ??= await options.resolveArgs();\n const resolvedArgs = args;\n\n return PipelineRunner.chainInterceptors(options.interceptors, options.context, () =>\n options.invoke(resolvedArgs),\n );\n }\n\n /** Interceptor onion — innermost is the core handler. */\n static async chainInterceptors(\n interceptors: NestInterceptor[],\n context: ExecutionContext,\n coreHandler: () => Promise<unknown>,\n ): Promise<unknown> {\n if (interceptors.length === 0) {\n return coreHandler();\n }\n\n let next: CallHandler = { handle: coreHandler };\n\n for (let i = interceptors.length - 1; i >= 0; i--) {\n const interceptor = interceptors[i];\n const currentNext = next;\n next = {\n handle: () => interceptor!.intercept(context, currentNext),\n };\n }\n\n return next.handle();\n }\n}\n","import type { Container } from '../container/container';\nimport type { Type } from '../container/types';\nimport { MetadataRegistry } from '../registry/metadata.registry';\nimport type {\n ComponentType,\n ComponentTypeMap,\n Constructor,\n FilterType,\n GuardType,\n InterceptorType,\n MiddlewareType,\n PipeType,\n} from '../registry/types';\nimport { PipelineRunner } from './pipeline-runner';\nimport type {\n ArgumentMetadata,\n CanActivate,\n ExceptionFilter,\n ExecutionContext,\n NestInterceptor,\n NestMiddleware,\n PipeTransform,\n} from './types';\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\n/**\n * Component registration + resolution for the controller/handler tiers.\n * App-wide (global) components have exactly ONE source: the per-app\n * `RouteManager` (`APP_*` provider tokens + `useGlobalX()`) — callers merge\n * `routeManager.getGlobalComponents()` with {@link getScopedComponents}.\n *\n * Stateless by design: no process-global container (two apps in one process\n * never cross-talk) — every `resolve*` takes the resolving container.\n */\nexport class ComponentManager {\n // Scoped registration: controller → handler\n\n static registerController<T extends ComponentType>(\n type: T,\n controller: Constructor,\n ...components: ComponentTypeMap[T][]\n ): void {\n for (const component of components) {\n MetadataRegistry.registerController(type, controller, component);\n }\n }\n\n static registerHandler<T extends ComponentType>(\n type: T,\n controller: Constructor,\n handlerName: string | symbol,\n ...components: ComponentTypeMap[T][]\n ): void {\n for (const component of components) {\n MetadataRegistry.registerHandler(type, controller, handlerName, component);\n }\n }\n\n // Scoped resolution: controller → handler. App-wide components come from\n // RouteManager (APP_* tokens + useGlobalX()) — merged by the caller.\n\n static getScopedComponents<T extends ComponentType>(\n type: T,\n controller: Constructor,\n handlerName: string | symbol,\n ): ComponentTypeMap[T][] {\n return [\n ...MetadataRegistry.getController(type, controller),\n ...MetadataRegistry.getHandler(type, controller, handlerName),\n ];\n }\n\n // Type-specific resolvers — explicit container, always.\n\n private static resolveAll<T>(\n items: Array<T | Type<T>>,\n methodKey: keyof T & string,\n container: Container,\n ): T[] {\n return items.map((item) =>\n isObject(item) && methodKey in item ? (item as T) : container.resolve(item as Type<T>),\n );\n }\n\n static resolveMiddleware(items: MiddlewareType[], container: Container): NestMiddleware[] {\n return this.resolveAll<NestMiddleware>(items, 'use', container);\n }\n\n static resolveGuards(items: GuardType[], container: Container): CanActivate[] {\n return this.resolveAll<CanActivate>(items, 'canActivate', container);\n }\n\n static resolvePipes(items: PipeType[], container: Container): PipeTransform[] {\n return this.resolveAll<PipeTransform>(items, 'transform', container);\n }\n\n static resolveInterceptors(items: InterceptorType[], container: Container): NestInterceptor[] {\n return this.resolveAll<NestInterceptor>(items, 'intercept', container);\n }\n\n static resolveFilters(items: FilterType[], container: Container): ExceptionFilter[] {\n return this.resolveAll<ExceptionFilter>(items, 'catch', container);\n }\n\n // Pipe execution\n\n static async executePipes(\n value: unknown,\n metadata: ArgumentMetadata,\n pipes: PipeTransform[],\n ): Promise<unknown> {\n let transformed = value;\n for (const pipe of pipes) {\n transformed = await pipe.transform(transformed, metadata);\n }\n return transformed;\n }\n\n // Interceptor chain (onion pattern) — canonical implementation lives in\n // PipelineRunner; kept here as a stable alias.\n\n static async runInterceptorChain(\n interceptors: NestInterceptor[],\n context: ExecutionContext,\n coreHandler: () => Promise<unknown>,\n ): Promise<unknown> {\n return PipelineRunner.chainInterceptors(interceptors, context, coreHandler);\n }\n}\n","import type { Type } from '../container/types';\nimport { ComponentManager } from './component.manager';\nimport { MetadataRegistry } from '../registry/metadata.registry';\nimport type { ComponentType, ComponentTypeMap, Constructor } from '../registry/types';\n\nfunction UseComponent<T extends ComponentType>(type: T, ...components: ComponentTypeMap[T][]) {\n return (target: object, propertyKey?: string | symbol) => {\n if (propertyKey !== undefined) {\n ComponentManager.registerHandler(\n type,\n target.constructor as Constructor,\n propertyKey,\n ...components,\n );\n } else {\n ComponentManager.registerController(type, target as Constructor, ...components);\n }\n };\n}\n\nexport function UseMiddleware(...middleware: ComponentTypeMap['middleware'][]) {\n return UseComponent('middleware', ...middleware);\n}\n\nexport function UseGuards(...guards: ComponentTypeMap['guard'][]) {\n return UseComponent('guard', ...guards);\n}\n\nexport function UsePipes(...pipes: ComponentTypeMap['pipe'][]) {\n return UseComponent('pipe', ...pipes);\n}\n\nexport function UseInterceptors(...interceptors: ComponentTypeMap['interceptor'][]) {\n return UseComponent('interceptor', ...interceptors);\n}\n\nexport function UseFilters(...filters: ComponentTypeMap['filter'][]) {\n return UseComponent('filter', ...filters);\n}\n\nexport function Catch(...exceptions: Type<Error>[]): ClassDecorator {\n return (target) => {\n MetadataRegistry.setCatchTypes(target as unknown as Constructor, exceptions);\n };\n}\n\nexport function getCatchTypes(filter: unknown): Type<Error>[] {\n const filterClass = (\n typeof filter === 'function' ? filter : (filter as object).constructor\n ) as Constructor;\n return MetadataRegistry.getCatchTypes(filterClass) ?? [];\n}\n\nexport function shouldFilterCatch(filter: unknown, exception: unknown): boolean {\n const catchTypes = getCatchTypes(filter);\n if (catchTypes.length === 0) {\n return true;\n }\n return catchTypes.some((type) => exception instanceof type);\n}\n","import { HttpMethod, ParamType, Scope } from '../constants';\nimport { MetadataRegistry } from '../registry/metadata.registry';\nimport { normalizePath } from '../registry/paths';\nimport type { Constructor, PipeType, Type } from '../registry/types';\nimport type { ControllerOptions } from './types';\nimport type { ExecutionContext } from '../pipeline/types';\nimport { buildExecutionContext } from './execution-context';\n\n/**\n * Marks a class as a controller.\n * Accepts a path string or an options object with `path` and `version`.\n *\n * @example\n * ```ts\n * @Controller('/users')\n * @Controller({ path: '/users', version: 1 })\n * @Controller({ path: '/users', version: [1, 2] })\n * ```\n */\nexport function Controller(pathOrOptions?: string | ControllerOptions): ClassDecorator {\n return (target) => {\n const ctor = target as unknown as Constructor;\n const path = typeof pathOrOptions === 'string' ? pathOrOptions : (pathOrOptions?.path ?? '');\n const version = typeof pathOrOptions === 'object' ? pathOrOptions?.version : undefined;\n\n MetadataRegistry.setControllerPath(ctor, normalizePath(path));\n\n if (version !== undefined) {\n MetadataRegistry.setControllerOptions(ctor, { version });\n }\n\n MetadataRegistry.markInjectable(ctor);\n MetadataRegistry.setScope(ctor, Scope.SINGLETON);\n };\n}\n\n/**\n * Override the version for a specific route method.\n *\n * @example\n * ```ts\n * @Controller({ prefix: '/users', version: 1 })\n * class UserController {\n * @Get()\n * listV1() { ... } // GET /v1/users\n *\n * @Version(2)\n * @Get()\n * listV2() { ... } // GET /v2/users\n * }\n * ```\n */\nexport function Version(version: number | number[]): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const ctor = target.constructor as Constructor;\n MetadataRegistry.setRouteVersion(ctor, propertyKey, version);\n\n // If route was already registered (decorator ran after @Get), patch it.\n const route = MetadataRegistry.getRoutes(ctor).find((r) => r.handlerName === propertyKey);\n if (route) {\n route.version = version;\n }\n };\n}\n\nexport function getRouteVersion(\n target: Constructor,\n propertyKey: string | symbol,\n): number | number[] | undefined {\n return MetadataRegistry.getRouteVersion(target, propertyKey);\n}\n\n/** Per-route options for the HTTP method decorators (`@Get`, `@Post`, …). */\nexport interface RouteOptions {\n /**\n * A stable, human-readable name for this route. Enables URL generation\n * (`UrlGeneratorService.urlFor(name, …)`), surfaces on `app.describeRoutes()`,\n * and — when set — becomes the OpenAPI `operationId`.\n */\n name?: string;\n}\n\nfunction createMethodDecorator(method: HttpMethod) {\n return (path = '', options?: RouteOptions): MethodDecorator => {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const ctor = target.constructor as Constructor;\n const normalizedPath = normalizePath(path);\n const version = MetadataRegistry.getRouteVersion(ctor, propertyKey);\n\n MetadataRegistry.addRoute(ctor, {\n method: method as string,\n path: normalizedPath,\n handlerName: propertyKey,\n ...(version !== undefined ? { version } : {}),\n ...(options?.name !== undefined ? { name: options.name } : {}),\n });\n };\n };\n}\n\nexport const Get = createMethodDecorator(HttpMethod.GET);\nexport const Post = createMethodDecorator(HttpMethod.POST);\nexport const Put = createMethodDecorator(HttpMethod.PUT);\nexport const Patch = createMethodDecorator(HttpMethod.PATCH);\nexport const Delete = createMethodDecorator(HttpMethod.DELETE);\nexport const Options = createMethodDecorator(HttpMethod.OPTIONS);\nexport const Head = createMethodDecorator(HttpMethod.HEAD);\nexport const All = createMethodDecorator(HttpMethod.ALL);\nexport const Sse = createMethodDecorator(HttpMethod.GET);\n\n// Parameter decorators\n\nconst CUSTOM_PARAM_TYPE = 'custom';\n\nfunction createBuiltinParamDecorator(type: ParamType) {\n return (nameOrPipe?: string | PipeType, ...pipes: PipeType[]): ParameterDecorator => {\n return (target: object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (propertyKey === undefined) {\n throw new Error('Parameter decorators can only be used on method parameters');\n }\n\n let name: string | undefined;\n let allPipes: PipeType[];\n\n if (typeof nameOrPipe === 'string') {\n name = nameOrPipe;\n allPipes = pipes;\n } else if (nameOrPipe !== undefined) {\n name = undefined;\n allPipes = [nameOrPipe, ...pipes];\n } else {\n name = undefined;\n allPipes = pipes;\n }\n\n MetadataRegistry.addParameter(target.constructor as Constructor, propertyKey, {\n index: parameterIndex,\n type,\n name,\n ...(allPipes.length > 0 ? { pipes: allPipes } : {}),\n });\n };\n };\n}\n\nexport const Param = createBuiltinParamDecorator(ParamType.PARAM);\nexport const Query = createBuiltinParamDecorator(ParamType.QUERY);\nexport const Body = createBuiltinParamDecorator(ParamType.BODY);\nexport const Headers = createBuiltinParamDecorator(ParamType.HEADERS);\nexport const Req = createBuiltinParamDecorator(ParamType.REQUEST);\n/**\n * Injects the Hono `Context` as the response handle.\n * In Hono, request and response state are unified in the `Context` object,\n * so `@Res()` and `@Req()` both return it.\n *\n * Use `c.header()`, `c.setCookie()`, `c.redirect()`, etc. for response control.\n *\n * @example\n * ```ts\n * @Get('/set-cookie')\n * handle(@Res() c: Context) {\n * c.setCookie('session', 'abc123', { httpOnly: true });\n * return { ok: true };\n * }\n * ```\n */\nexport const Res = createBuiltinParamDecorator(ParamType.RESPONSE);\nexport const Ip = createBuiltinParamDecorator(ParamType.IP);\nexport const Cookie = createBuiltinParamDecorator(ParamType.COOKIE);\n\n/**\n * Injects all cookies as a `Record<string, string>`, or a single cookie value by name.\n *\n * - `@Cookie()` — all cookies as an object\n * - `@Cookie('token')` — the value of the `token` cookie\n *\n * @example\n * ```ts\n * @Get('/me')\n * handle(@Cookie('session') session: string) { ... }\n * ```\n */\nexport const Cookies = Cookie;\n\n/**\n * Injects the raw request body as a `Uint8Array`.\n * Useful for webhook HMAC verification (Stripe, GitHub, etc.) where you\n * need the raw bytes before any JSON parsing.\n *\n * @example\n * ```ts\n * @Post('/webhook')\n * async handle(@RawBody() body: Uint8Array) {\n * const sig = new TextDecoder().decode(body);\n * // verify HMAC...\n * }\n * ```\n */\nexport function RawBody(): ParameterDecorator {\n return (target: object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (propertyKey === undefined) {\n throw new Error('Parameter decorators can only be used on method parameters');\n }\n MetadataRegistry.addParameter(target.constructor as Constructor, propertyKey, {\n index: parameterIndex,\n type: ParamType.RAW_BODY,\n });\n };\n}\n\n/**\n * Factory for creating custom parameter decorators.\n *\n * @example\n * ```ts\n * const CurrentUser = createParamDecorator(\n * (data: unknown, ctx: ExecutionContext) => {\n * const req = ctx.getRequest();\n * return req.headers.get('x-user-id');\n * }\n * );\n *\n * // Usage:\n * @Get()\n * handle(@CurrentUser() userId: string) { ... }\n *\n * // With data argument:\n * const Header = createParamDecorator(\n * (data: string, ctx: ExecutionContext) => {\n * return ctx.getRequest().headers.get(data);\n * }\n * );\n *\n * @Get()\n * handle(@Header('x-request-id') requestId: string) { ... }\n * ```\n */\nexport function createParamDecorator<TData = unknown>(\n factory: (data: TData, ctx: ExecutionContext) => unknown,\n): (data?: TData, ...pipes: PipeType[]) => ParameterDecorator {\n return (data?: TData, ...pipes: PipeType[]): ParameterDecorator => {\n return (target: object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (propertyKey === undefined) {\n throw new Error('Parameter decorators can only be used on method parameters');\n }\n\n MetadataRegistry.addParameter(target.constructor as Constructor, propertyKey, {\n index: parameterIndex,\n type: CUSTOM_PARAM_TYPE,\n name: undefined,\n factory: (_unused: unknown, ctx: unknown) => {\n const honoCtx = ctx as import('hono').Context;\n const execCtx = buildExecutionContext(honoCtx, target.constructor as Type, propertyKey);\n return factory(data as TData, execCtx);\n },\n ...(pipes.length > 0 ? { pipes } : {}),\n });\n };\n };\n}\n\n// Response decorators\n\n/**\n * Override the HTTP status code for a handler's response.\n *\n * @example\n * ```ts\n * @Post()\n * @HttpCode(201)\n * create(@Body() data: CreateDto) { return data; }\n * ```\n */\nexport function HttpCode(statusCode: number): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n MetadataRegistry.setHandlerHttpMeta(target.constructor as Constructor, propertyKey, {\n httpCode: statusCode,\n });\n };\n}\n\n/**\n * Set a response header declaratively.\n * Can be applied multiple times to set multiple headers.\n *\n * @example\n * ```ts\n * @Get()\n * @Header('Cache-Control', 'no-cache')\n * @Header('X-Custom', 'value')\n * handle() { return { ok: true }; }\n * ```\n */\nexport function Header(name: string, value: string): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n MetadataRegistry.setHandlerHttpMeta(target.constructor as Constructor, propertyKey, {\n responseHeaders: [[name, value]],\n });\n };\n}\n\n/**\n * Redirect to another URL. The handler's return value can override the URL.\n *\n * @example\n * ```ts\n * @Get('/old')\n * @Redirect('/new', 301)\n * handleOld() {}\n *\n * // Dynamic redirect — return { url, statusCode? } to override\n * @Get('/go')\n * @Redirect('/default')\n * handleGo(@Query('to') to?: string) {\n * if (to) return { url: to };\n * }\n * ```\n */\nexport function Redirect(url: string, statusCode = 302): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n MetadataRegistry.setHandlerHttpMeta(target.constructor as Constructor, propertyKey, {\n redirect: { url, statusCode },\n });\n };\n}\n\n// Metadata readers (used by RouteManager)\n\nexport function getHttpCode(target: Constructor, method: string | symbol): number | undefined {\n return MetadataRegistry.getHandlerHttpMeta(target, method)?.httpCode;\n}\n\nexport function getResponseHeaders(\n target: Constructor,\n method: string | symbol,\n): Array<[string, string]> {\n return MetadataRegistry.getHandlerHttpMeta(target, method)?.responseHeaders ?? [];\n}\n\nexport function getRedirect(\n target: Constructor,\n method: string | symbol,\n): { url: string; statusCode: number } | undefined {\n return MetadataRegistry.getHandlerHttpMeta(target, method)?.redirect;\n}\n\n/**\n * Composes multiple decorators into one. Applies them in order (top to bottom),\n * matching how stacked decorators behave when written separately.\n *\n * @example\n * ```ts\n * const Auth = (...roles: string[]) => applyDecorators(\n * UseGuards(JwtGuard, RolesGuard),\n * SetMetadata('roles', roles),\n * );\n *\n * @Auth('admin')\n * @Get('/admin')\n * handle() { ... }\n * ```\n */\n// Polymorphic signature: matches the shape of every decorator slot\n// (class, method, property, parameter) so a single composition can be applied\n// at any of them. TypeScript can't express \"this is one of N decorator types\"\n// natively; the union shape below is what every decorator definition reduces to.\nexport type ComposedDecorator = <T>(\n target: T,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor | number,\n) => void;\n\nexport function applyDecorators(\n ...decorators: Array<ClassDecorator | MethodDecorator | PropertyDecorator | ParameterDecorator>\n): ComposedDecorator {\n return ((\n target: object,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor | number,\n ) => {\n for (const decorator of decorators) {\n if (propertyKey === undefined && typeof descriptor !== 'number') {\n (decorator as ClassDecorator)(target as never);\n } else if (typeof descriptor === 'number') {\n (decorator as ParameterDecorator)(target, propertyKey!, descriptor);\n } else {\n (decorator as MethodDecorator)(target, propertyKey!, descriptor!);\n }\n }\n }) as ComposedDecorator;\n}\n\n// Helpers\n\nexport function isController(target: Constructor): boolean {\n return (\n MetadataRegistry.getControllerPath(target) !== '' ||\n MetadataRegistry.getRoutes(target).length > 0\n );\n}\n","import type { Context } from 'hono';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\n\ninterface RedirectOverride {\n url: string;\n statusCode?: number;\n}\n\nexport interface ResponseRedirect {\n url: string;\n statusCode: number;\n}\n\n// A handler returning `{ url, statusCode? }` may override the @Redirect-decorator\n// destination — kept identical to the previous inline behavior.\nfunction parseRedirectResult(result: unknown): RedirectOverride | undefined {\n if (typeof result !== 'object' || result === null) return undefined;\n if (!('url' in result)) return undefined;\n\n const obj = result as { url: unknown; statusCode?: unknown };\n if (typeof obj.url !== 'string') return undefined;\n\n return {\n url: obj.url,\n ...(typeof obj.statusCode === 'number' ? { statusCode: obj.statusCode } : {}),\n };\n}\n\n// Maps a controller return value to a Hono Response. `null`/`undefined` → 204\n// (empty body); strings → text; anything else → JSON. A pre-built Response\n// passes through unchanged.\nexport function mapResponse(c: Context, result: unknown, statusCode?: number): Response {\n if (result instanceof Response) {\n return result;\n }\n if (result === null || result === undefined) {\n return c.body(null, (statusCode ?? 204) as ContentfulStatusCode);\n }\n if (typeof result === 'string') {\n return c.text(result, (statusCode ?? 200) as ContentfulStatusCode);\n }\n return c.json(result as object, (statusCode ?? 200) as ContentfulStatusCode);\n}\n\n// Honors @Redirect on the handler. If the handler returned `{ url, statusCode? }`,\n// those override the decorator's defaults; otherwise the decorator wins.\nexport function mapRedirect(c: Context, result: unknown, redirect: ResponseRedirect): Response {\n const overrides = parseRedirectResult(result);\n const finalUrl = overrides?.url ?? redirect.url;\n const finalStatus = overrides?.statusCode ?? redirect.statusCode;\n return c.redirect(finalUrl, finalStatus as 301 | 302 | 303 | 307 | 308);\n}\n\nexport function applyResponseHeaders(\n response: Response,\n headers: Iterable<readonly [string, string]>,\n): void {\n for (const [name, value] of headers) {\n response.headers.set(name, value);\n }\n}\n","import { STATUS_TO_CODE, toErrorBody } from '@velajs/errors';\nimport type { Context } from 'hono';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport type { Container } from '../container/container';\nimport type { Token, Type } from '../container/types';\nimport { HttpException } from '../errors/http-exception';\nimport { resolveErrorReporter } from '../exceptions/reporter';\nimport { ComponentManager } from '../pipeline/component.manager';\nimport { shouldFilterCatch } from '../pipeline/decorators';\nimport { PipelineRunner } from '../pipeline/pipeline-runner';\nimport type {\n CanActivate,\n ExceptionFilter,\n ExecutionContext,\n NestInterceptor,\n PipeTransform,\n} from '../pipeline/types';\nimport type {\n FilterType,\n GuardType,\n InterceptorType,\n ParameterMetadata,\n PipeType,\n} from '../registry/types';\nimport type { ArgumentResolver } from './argument-resolver';\nimport { getHttpCode, getRedirect, getResponseHeaders } from './decorators';\nimport { buildExecutionContext } from './execution-context';\nimport { instantiateMany } from './instantiate';\nimport { applyResponseHeaders, mapRedirect, mapResponse } from './response-mapper';\nimport type { ParamMetadata, RouteMetadata } from './types';\n\nexport interface HandlerGlobals {\n guards: Array<GuardType | Token<CanActivate>>;\n pipes: Array<PipeType | Token<PipeTransform>>;\n interceptors: Array<InterceptorType | Token<NestInterceptor>>;\n filters: Array<FilterType | Token<ExceptionFilter>>;\n}\n\n// Builds the per-request closure that runs guards, pipes, interceptors, the\n// handler itself, and exception filters. Pure orchestration — Hono route\n// registration stays in RouteManager. Globals are read via a callback so\n// post-create additions (`useGlobalGuards`, etc.) propagate to subsequent\n// requests without rebuilding routes.\nexport class HandlerExecutor {\n constructor(\n private readonly argumentResolver: ArgumentResolver,\n private readonly getGlobals: () => HandlerGlobals,\n private readonly getRequestContainer: (c: Context) => Container,\n ) {}\n\n create(\n route: RouteMetadata,\n controller: Type,\n allParamMetadata: Map<string | symbol, ParameterMetadata[]>,\n ): (c: Context) => Promise<Response> {\n const paramMetadata = (allParamMetadata.get(route.handlerName) || []).sort(\n (a, b) => a.index - b.index,\n ) as ParamMetadata[];\n\n // Read param types once at build time for metatype population.\n // Routed via Reflect so the polyfill funnels both src-level and dist-level\n // consumers to the same registry (matters in tests that import from dist).\n const paramTypes = Reflect.getMetadata(\n 'design:paramtypes',\n controller.prototype,\n route.handlerName,\n ) as unknown[] | undefined;\n\n const methodGuards = ComponentManager.getScopedComponents(\n 'guard',\n controller,\n route.handlerName,\n );\n const methodPipes = ComponentManager.getScopedComponents('pipe', controller, route.handlerName);\n const methodInterceptors = ComponentManager.getScopedComponents(\n 'interceptor',\n controller,\n route.handlerName,\n );\n // Filters: reverse order (handler → controller → global) — closest to handler runs first\n const methodFilters = [\n ...ComponentManager.getScopedComponents('filter', controller, route.handlerName),\n ].reverse();\n\n const httpCode = getHttpCode(controller, route.handlerName);\n const responseHeaders = getResponseHeaders(controller, route.handlerName);\n const redirect = getRedirect(controller, route.handlerName);\n\n return async (c: Context) => {\n // Combine global + method at request time so post-create registrations propagate.\n const requestContainer = this.getRequestContainer(c);\n const globals = this.getGlobals();\n\n const guards = [\n ...instantiateMany<CanActivate>(globals.guards, requestContainer),\n ...instantiateMany<CanActivate>(methodGuards, requestContainer),\n ];\n const pipes = [\n ...instantiateMany<PipeTransform>(globals.pipes, requestContainer),\n ...instantiateMany<PipeTransform>(methodPipes, requestContainer),\n ];\n const interceptors = [\n ...instantiateMany<NestInterceptor>(globals.interceptors, requestContainer),\n ...instantiateMany<NestInterceptor>(methodInterceptors, requestContainer),\n ];\n const filters = [\n ...instantiateMany<ExceptionFilter>(methodFilters, requestContainer),\n ...instantiateMany<ExceptionFilter>(globals.filters, requestContainer),\n ];\n\n const executionContext: ExecutionContext = buildExecutionContext(\n c,\n controller,\n route.handlerName,\n );\n\n try {\n const instance = requestContainer.resolve(controller);\n\n const method = Reflect.get(instance, route.handlerName);\n if (typeof method !== 'function') {\n throw new Error(`Method ${String(route.handlerName)} not found on controller`);\n }\n\n // Args + pipes → guards → interceptor chain → handler, via the shared\n // runner. `argsBeforeGuards` preserves the deliberate vela HTTP order.\n const result = await PipelineRunner.run({\n context: executionContext,\n guards,\n interceptors,\n argsBeforeGuards: true,\n resolveArgs: () =>\n this.argumentResolver.extract(c, paramMetadata, pipes, requestContainer, paramTypes),\n invoke: async (args) => Reflect.apply(method, instance, args),\n });\n\n if (redirect) {\n return mapRedirect(c, result, redirect);\n }\n\n const response = mapResponse(c, result, httpCode);\n applyResponseHeaders(response, responseHeaders);\n return response;\n } catch (error) {\n const reporter = resolveErrorReporter(requestContainer);\n const source = `${controller.name}.${String(route.handlerName)}`;\n // Report FIRST, always — rendering (filters included) is a separate\n // concern; a filter claiming the error must not make it invisible.\n reporter.report(error, { edge: 'http', source });\n\n for (const filter of filters) {\n if (shouldFilterCatch(filter, error)) {\n try {\n const filtered = await filter.catch(error, executionContext);\n return mapResponse(c, filtered);\n } catch (filterError) {\n // A broken filter is itself a bug worth logs — then fall through\n // to the default render instead of silently dying here.\n reporter.report(filterError, {\n edge: 'http',\n source,\n note: 'exception filter threw',\n });\n break;\n }\n }\n }\n\n const rendered = reporter.render(error, executionContext);\n if (rendered instanceof Response) return rendered;\n if (rendered) return c.json(rendered.body, rendered.status as ContentfulStatusCode);\n\n if (error instanceof HttpException) {\n const status = error.getStatus() as ContentfulStatusCode;\n const raw = error.getRawResponse() ?? error.message;\n if (typeof raw === 'string') {\n return c.json(\n { error: { code: STATUS_TO_CODE[status] ?? 'internal', message: raw } },\n status,\n );\n }\n return c.json(raw, status); // object responses ship verbatim (crud envelope compat)\n }\n\n const { body, status } = toErrorBody(error, { catalog: reporter.catalog });\n return c.json(body, status as ContentfulStatusCode);\n }\n };\n }\n}\n","import { type Context, type MiddlewareHandler, type Next, Hono } from 'hono';\nimport { contextStorage } from 'hono/context-storage';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport { HttpMethod } from '../constants';\nimport { HttpException } from '../errors/http-exception';\nimport { getMetadata } from '../metadata';\nimport type { Container } from '../container/container';\nimport type { Token, Type } from '../container/types';\nimport type { MiddlewareRouteDefinition } from '../module/middleware';\nimport { joinPaths } from '../registry/paths';\nimport { ArgumentResolver } from './argument-resolver';\nimport { getRouteContributors } from './route-contributor';\nimport { buildMiddlewareExecutionContext } from './execution-context';\nimport { HandlerExecutor } from './handler-executor';\nimport { instantiate, instantiateMany } from './instantiate';\nimport { REQUEST_CONTEXT, createRequestContext } from './request-context';\nimport { mapResponse } from './response-mapper';\nimport { ComponentManager } from '../pipeline/component.manager';\nimport { shouldFilterCatch } from '../pipeline/decorators';\nimport type {\n CanActivate,\n ExceptionFilter,\n NestInterceptor,\n NestMiddleware,\n PipeTransform,\n} from '../pipeline/types';\nimport { MetadataRegistry } from '../registry/metadata.registry';\nimport type {\n FilterType,\n GuardType,\n InterceptorType,\n MiddlewareType,\n PipeType,\n} from '../registry/types';\nimport type { ControllerRegistration, RouteMetadata } from './types';\n\ntype MethodRegistrar = (\n app: Hono,\n path: string,\n h: (c: Context) => Response | Promise<Response>,\n) => void;\n\n/**\n * One explicit controller route as the framework registered it — recorded by\n * `build()` with the SAME composed path handed to Hono (global prefix +\n * version segment + controller prefix + route path), so introspection tooling\n * (`vela route list`) never re-derives composition. Contributed routes\n * (`RouteContributor`, e.g. `@velajs/crud`) mount directly on the Hono app\n * and are not described here — diff `app.getHonoApp().routes` for those.\n */\nexport interface RouteDescription {\n /** As declared on the handler — `@Head()` reports HEAD (Hono serves it under GET). */\n method: string;\n /** Fully composed path exactly as registered. */\n path: string;\n controller: string;\n handler: string;\n version?: number;\n /** Route name (`@Get(path, { name })`) — the URL-generation / `operationId` key. */\n name?: string;\n}\n\nexport interface RouteManagerOptions {\n getClientIp?: (c: Context) => string | null;\n middleware?: MiddlewareHandler[];\n globalPrefix?: string;\n /**\n * Opt into ambient request-container access (`getCurrentContainer()` /\n * `getCurrentRequestContext()`). Registers Hono's `contextStorage()` as the\n * first middleware. Off by default — the explicit child container is unchanged.\n */\n ambientContainer?: boolean;\n}\n\nconst defaultGetClientIp = (c: Context): string | null =>\n c.req.raw.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ??\n c.req.raw.headers.get('x-real-ip') ??\n null;\n\n// Mirror a response body stream, invoking `onDone` exactly once when it is fully\n// read, errors, or is cancelled. Lets request-scoped resources be disposed only\n// after the body has drained — never mid-stream.\nfunction disposeStreamWhenDone(\n body: ReadableStream<Uint8Array>,\n onDone: () => void,\n): ReadableStream<Uint8Array> {\n const reader = body.getReader();\n let finished = false;\n const finish = (): void => {\n if (!finished) {\n finished = true;\n onDone();\n }\n };\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n finish();\n return;\n }\n controller.enqueue(value);\n } catch (error) {\n controller.error(error);\n finish();\n }\n },\n cancel(reason) {\n finish();\n return reader.cancel(reason);\n },\n });\n}\n\nexport class RouteManager {\n private static readonly METHOD_REGISTRAR = new Map<string, MethodRegistrar>([\n [HttpMethod.GET, (app, p, h) => app.get(p, h)],\n [HttpMethod.POST, (app, p, h) => app.post(p, h)],\n [HttpMethod.PUT, (app, p, h) => app.put(p, h)],\n [HttpMethod.PATCH, (app, p, h) => app.patch(p, h)],\n [HttpMethod.DELETE, (app, p, h) => app.delete(p, h)],\n [HttpMethod.OPTIONS, (app, p, h) => app.options(p, h)],\n [\n HttpMethod.HEAD,\n (app, p, h) => app.get(p, (c, next) => (c.req.method === 'HEAD' ? h(c) : next())),\n ],\n [HttpMethod.ALL, (app, p, h) => app.all(p, h)],\n ]);\n\n private controllers: ControllerRegistration[] = [];\n private globalMiddleware: Array<MiddlewareType | Token<NestMiddleware>> = [];\n private globalPipes: Array<PipeType | Token<PipeTransform>> = [];\n private globalGuards: Array<GuardType | Token<CanActivate>> = [];\n private globalInterceptors: Array<InterceptorType | Token<NestInterceptor>> = [];\n private globalFilters: Array<FilterType | Token<ExceptionFilter>> = [];\n private globalPrefix = '';\n private consumerMiddlewareDefinitions: MiddlewareRouteDefinition[] = [];\n private routeDescriptions: RouteDescription[] = [];\n\n private readonly handlerExecutor: HandlerExecutor;\n private readonly ambientContainer: boolean;\n\n constructor(\n private container: Container,\n options: RouteManagerOptions = {},\n ) {\n this.ambientContainer = options.ambientContainer ?? false;\n const argumentResolver = new ArgumentResolver(options.getClientIp ?? defaultGetClientIp);\n this.handlerExecutor = new HandlerExecutor(\n argumentResolver,\n () => ({\n guards: this.globalGuards,\n pipes: this.globalPipes,\n interceptors: this.globalInterceptors,\n filters: this.globalFilters,\n }),\n (c) => this.getRequestContainer(c),\n );\n }\n\n /**\n * The global-tier components (`APP_*` provider tokens + imperative\n * `app.useGlobalX()` instances). Exposed so non-HTTP transports (the\n * WebSocket dispatcher) can apply the same app-wide guards/pipes/interceptors/\n * filters as HTTP routes, read live so late registrations propagate.\n */\n getGlobalComponents(): {\n guards: Array<GuardType | Token<CanActivate>>;\n pipes: Array<PipeType | Token<PipeTransform>>;\n interceptors: Array<InterceptorType | Token<NestInterceptor>>;\n filters: Array<FilterType | Token<ExceptionFilter>>;\n } {\n return {\n guards: this.globalGuards,\n pipes: this.globalPipes,\n interceptors: this.globalInterceptors,\n filters: this.globalFilters,\n };\n }\n\n registerConsumerMiddleware(definitions: MiddlewareRouteDefinition[]): this {\n this.consumerMiddlewareDefinitions.push(...definitions);\n return this;\n }\n\n setGlobalPrefix(prefix: string): this {\n this.globalPrefix = prefix && !prefix.startsWith('/') ? `/${prefix}` : prefix;\n return this;\n }\n\n useGlobalMiddleware(...middleware: MiddlewareType[]): this {\n this.globalMiddleware.push(...middleware);\n return this;\n }\n\n useGlobalMiddlewareTokens(...middlewareTokens: Array<Token<NestMiddleware>>): this {\n this.globalMiddleware.push(...middlewareTokens);\n return this;\n }\n\n useGlobalPipes(...pipes: PipeType[]): this {\n this.globalPipes.push(...pipes);\n return this;\n }\n\n useGlobalPipeTokens(...pipeTokens: Array<Token<PipeTransform>>): this {\n this.globalPipes.push(...pipeTokens);\n return this;\n }\n\n useGlobalGuards(...guards: GuardType[]): this {\n this.globalGuards.push(...guards);\n return this;\n }\n\n useGlobalGuardTokens(...guardTokens: Array<Token<CanActivate>>): this {\n this.globalGuards.push(...guardTokens);\n return this;\n }\n\n useGlobalInterceptors(...interceptors: InterceptorType[]): this {\n this.globalInterceptors.push(...interceptors);\n return this;\n }\n\n useGlobalInterceptorTokens(...interceptorTokens: Array<Token<NestInterceptor>>): this {\n this.globalInterceptors.push(...interceptorTokens);\n return this;\n }\n\n useGlobalFilters(...filters: FilterType[]): this {\n this.globalFilters.push(...filters);\n return this;\n }\n\n useGlobalFilterTokens(...filterTokens: Array<Token<ExceptionFilter>>): this {\n this.globalFilters.push(...filterTokens);\n return this;\n }\n\n private getMiddlewarePriority(entry: unknown): number {\n if (entry == null) return 0;\n if (typeof entry === 'function') {\n const p = (entry as { priority?: unknown }).priority;\n if (typeof p === 'number') return p;\n }\n if (typeof entry === 'object') {\n const inst = entry as { priority?: unknown; constructor?: { priority?: unknown } };\n if (typeof inst.priority === 'number') return inst.priority;\n if (typeof inst.constructor?.priority === 'number') return inst.constructor.priority;\n }\n // A token owned exclusively by unmaterialized lazy modules must not be\n // instantiate-probed here — the probe at route build would defeat the\n // module's deferral (i18n's APP_MIDDLEWARE). Default priority instead;\n // the middleware still materializes on its first request.\n if (this.container.isLazyPending(entry as Token)) return 0;\n try {\n const resolved = instantiate<NestMiddleware>(\n entry as MiddlewareType | Token<NestMiddleware>,\n this.container,\n );\n if (resolved && typeof resolved === 'object') {\n const p = (resolved as { priority?: unknown }).priority;\n if (typeof p === 'number') return p;\n const cp = (resolved as { constructor?: { priority?: unknown } }).constructor?.priority;\n if (typeof cp === 'number') return cp;\n }\n } catch {\n // Unresolvable at build time (e.g. request-scoped) — default 0\n }\n return 0;\n }\n\n private getRequestContainer(c: Context): Container {\n const existing = c.get('container') as Container | undefined;\n if (existing) {\n return existing;\n }\n\n const child = this.container.createChild();\n child.setRequestInstance(REQUEST_CONTEXT, createRequestContext(c));\n c.set('container', child);\n return child;\n }\n\n // Wraps an attached middleware so a thrown error flows through the\n // exception-filter chain instead of bypassing it on the way to Hono's\n // outer error handler. Mirrors the catch tail in HandlerExecutor — global\n // filters are the only scope reachable here, since per-handler filters\n // require a controller call frame that the middleware boundary lacks.\n // Non-throwing middleware paths (returning a Response, calling `next()`,\n // resolving a promise) are byte-identical to before — the wrapper only\n // intercepts thrown / rejected values.\n private wrapMiddlewareWithFilters(handler: MiddlewareHandler): MiddlewareHandler {\n return async (c, next) => {\n try {\n return await handler(c, next);\n } catch (error) {\n const response = await this.mapMiddlewareError(c, error);\n // Force-replace any handler-set response. A middleware that throws\n // *after* `await next()` has the handler's body already attached\n // to `c.res`; without overwriting it, Hono would emit the\n // pre-throw success response and the filter's render would be\n // dropped.\n c.res = response;\n return response;\n }\n };\n }\n\n private async mapMiddlewareError(c: Context, error: unknown): Promise<Response> {\n const requestContainer = this.getRequestContainer(c);\n const filters = instantiateMany<ExceptionFilter>(this.globalFilters, requestContainer);\n const host = buildMiddlewareExecutionContext(c);\n\n for (const filter of filters) {\n if (shouldFilterCatch(filter, error)) {\n try {\n const filtered = await filter.catch(error, host);\n return mapResponse(c, filtered);\n } catch {\n // Filter itself threw — fall through to default error mapping.\n break;\n }\n }\n }\n\n if (error instanceof HttpException) {\n const response = error.getResponse();\n const status = error.getStatus() as ContentfulStatusCode;\n return c.json(response, status);\n }\n\n // Non-HttpException with no catching filter: re-throw so Hono's\n // outer error handler produces the same default-500 response it\n // produced before this wrapping was introduced.\n throw error;\n }\n\n registerController(controller: Type): this {\n const prefix = MetadataRegistry.getControllerPath(controller);\n const options = MetadataRegistry.getControllerOptions(controller);\n const routes = MetadataRegistry.getRoutes(controller);\n\n // The ModuleLoader registers controllers in their owning module's bucket;\n // fall back to a `__root__` registration only for controllers that arrive\n // here outside the module-loading flow (test harnesses, custom adapters).\n if (!this.container.has(controller)) {\n this.container.register(controller);\n }\n\n this.controllers.push({\n controller,\n metadata: { prefix, version: options.version },\n routes: routes as RouteMetadata[],\n });\n\n return this;\n }\n\n /** The explicit controller routes recorded by the last `build()`. */\n getRouteDescriptions(): RouteDescription[] {\n return [...this.routeDescriptions];\n }\n\n /** The global prefix in effect (set at bootstrap; '' when none). */\n getGlobalPrefix(): string {\n return this.globalPrefix;\n }\n\n async build(): Promise<Hono> {\n const app = new Hono();\n this.routeDescriptions = [];\n\n // Outermost: dispose the per-request child container once the request is\n // fully done. Fast-paths out when the child has no request-scoped\n // disposables (the common case → zero overhead / no behavior change).\n // Streaming-safe: when a response body is present, disposal is deferred\n // until the body is fully read (or errors/cancels), never mid-stream.\n app.use('*', async (c: Context, next: Next) => {\n let threw = false;\n try {\n await next();\n } catch (error) {\n threw = true;\n throw error;\n } finally {\n const child = c.get('container') as Container | undefined;\n if (child?.hasDisposables()) {\n const body = threw ? null : (c.res?.body ?? null);\n if (body) {\n // Defer disposal to when the runtime finishes reading the body.\n c.res = new Response(\n disposeStreamWhenDone(body, () => void child.dispose()),\n {\n status: c.res.status,\n statusText: c.res.statusText,\n headers: c.res.headers,\n },\n );\n } else {\n // No body (or error path) — nothing streaming, dispose now.\n await child.dispose();\n }\n }\n }\n });\n\n // Opt-in ambient container: contextStorage() must be an early middleware so\n // getContext() is available to everything downstream.\n if (this.ambientContainer) {\n app.use('*', contextStorage());\n }\n\n // Sort global middleware by priority (lower runs first) with insertion\n // index as tiebreaker so equal priorities preserve registration order.\n const sortedGlobal = this.globalMiddleware\n .map((entry, index) => ({ entry, index, priority: this.getMiddlewarePriority(entry) }))\n .sort((a, b) => a.priority - b.priority || a.index - b.index);\n\n for (const { entry } of sortedGlobal) {\n app.use(\n '*',\n this.wrapMiddlewareWithFilters((c, next) => {\n const requestContainer = this.getRequestContainer(c);\n const resolved = instantiate<NestMiddleware>(entry, requestContainer);\n return resolved.use(c, next);\n }),\n );\n }\n\n const sortedConsumer = this.consumerMiddlewareDefinitions\n .map((def, index) => ({ def, index, priority: def.priority ?? 0 }))\n .sort((a, b) => a.priority - b.priority || a.index - b.index);\n\n for (const { def } of sortedConsumer) {\n const matchRoute = this.compileRouteMatcher(def.routes);\n const matchExclude = this.compileRouteMatcher(def.excludes);\n\n app.use(\n '*',\n this.wrapMiddlewareWithFilters((c, next) => {\n const path = c.req.path;\n const method = c.req.method;\n\n if (!matchRoute(path, method) || matchExclude(path, method)) return next();\n\n const requestContainer = this.getRequestContainer(c);\n const runChain = (index: number): Promise<void> => {\n if (index >= def.middleware.length) return next();\n const instance = instantiate<NestMiddleware>(def.middleware[index]!, requestContainer);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (instance.use(c, () => runChain(index + 1)) as Promise<any>).then(() => {});\n };\n\n return runChain(0);\n }),\n );\n }\n\n // First pass: register all custom routes (must come before CRUD /:id routes).\n for (const { controller, metadata, routes } of this.controllers) {\n if (routes.length > 0) {\n const allParamMetadata = MetadataRegistry.getParameters(controller);\n\n for (const route of routes) {\n const effectiveVersion = route.version ?? metadata.version;\n\n const versionedPaths = this.buildVersionedPaths(\n this.globalPrefix,\n metadata.prefix,\n route.path,\n effectiveVersion,\n );\n // Parallel to versionedPaths: buildVersionedPaths maps versions to\n // paths 1:1 in order, so index i of both arrays belongs together.\n const versionsForPaths: Array<number | undefined> =\n effectiveVersion === undefined\n ? [undefined]\n : Array.isArray(effectiveVersion)\n ? effectiveVersion\n : [effectiveVersion];\n\n // Scoped (controller/handler) middleware only — global middleware is\n // applied once by this manager's own global pass, never re-read here.\n const middlewareItems = ComponentManager.getScopedComponents(\n 'middleware',\n controller,\n route.handlerName,\n );\n const handler = this.handlerExecutor.create(route, controller, allParamMetadata);\n\n for (const [pathIndex, fullPath] of versionedPaths.entries()) {\n for (const middlewareItem of middlewareItems) {\n app.use(\n fullPath,\n this.wrapMiddlewareWithFilters((c, next) => {\n const requestContainer = this.getRequestContainer(c);\n const resolved = instantiate<NestMiddleware>(\n middlewareItem as Type<NestMiddleware> | NestMiddleware,\n requestContainer,\n );\n return resolved.use(c, next);\n }),\n );\n }\n this.registerRoute(app, route.method, fullPath, handler);\n this.routeDescriptions.push({\n method: String(route.method),\n path: fullPath || '/',\n controller: controller.name,\n handler: String(route.handlerName),\n version: versionsForPaths[pathIndex],\n ...(route.name !== undefined ? { name: route.name } : {}),\n });\n }\n }\n }\n }\n\n // Second pass: route contributors (generated routes registered last, so a\n // contributor's `/:id` catch-alls never shadow explicit routes). Each\n // contributor claims controllers by class-level metadata; `@velajs/crud`\n // registers one as an import side effect. The registry contract (instead\n // of dynamic `import()`) exists because esbuild leaves\n // `await import(variable)` as a runtime import Cloudflare Workers cannot\n // resolve.\n const contributors = getRouteContributors();\n for (const { controller, metadata, routes } of this.controllers) {\n for (const contributor of contributors) {\n const meta = getMetadata(contributor.claimsMetaKey, controller);\n if (meta === undefined) continue;\n\n await contributor.buildRoutes(app, {\n controller,\n controllerPrefix: metadata.prefix,\n meta,\n globalPrefix: this.globalPrefix,\n globalGuards: instantiateMany<CanActivate>(this.globalGuards, this.container),\n container: this.container,\n joinPaths,\n });\n }\n\n // DX warning for stale setups: @Crud() metadata but nothing produced a\n // route — native @velajs/crud (>=1.18) stamps real routes at decoration\n // time, and legacy bridges register a claiming contributor.\n if (\n getMetadata('vela:crud', controller) !== undefined &&\n routes.length === 0 &&\n !contributors.some((c) => c.claimsMetaKey === 'vela:crud')\n ) {\n console.warn(\n `[vela] ${controller.name} carries @Crud() metadata but produced no routes — ` +\n \"install and import '@velajs/crud' (>=1.18), or remove the decorator.\",\n );\n }\n }\n\n return app;\n }\n\n private registerRoute(\n app: Hono,\n method: HttpMethod | string,\n path: string,\n handler: (c: Context) => Response | Promise<Response>,\n ): void {\n const normalizedPath = path || '/';\n const registrar = RouteManager.METHOD_REGISTRAR.get(method);\n if (registrar) {\n registrar(app, normalizedPath, handler);\n } else {\n app.on(method, normalizedPath, handler);\n }\n }\n\n private buildVersionedPaths(\n globalPrefix: string,\n controllerPrefix: string,\n routePath: string,\n version?: number | number[],\n ): string[] {\n if (version === undefined) {\n return [joinPaths(globalPrefix, joinPaths(controllerPrefix, routePath))];\n }\n\n const versions = Array.isArray(version) ? version : [version];\n return versions.map((v) => {\n const versionSegment = `/v${v}`;\n return joinPaths(\n globalPrefix,\n joinPaths(versionSegment, joinPaths(controllerPrefix, routePath)),\n );\n });\n }\n\n private compilePathMatcher(routePath: string): (reqPath: string) => boolean {\n if (routePath === '*') return () => true;\n const norm = routePath.startsWith('/') ? routePath : `/${routePath}`;\n if (norm.endsWith('*')) {\n const prefix = norm.slice(0, -1);\n return (p) => p.startsWith(prefix);\n }\n return (p) => p === norm || p.startsWith(`${norm}/`);\n }\n\n private compileRouteMatcher(\n routes: Array<{ path: string; method?: HttpMethod }>,\n ): (path: string, method: string) => boolean {\n const matchers = routes.map((route) => {\n const matchPath = this.compilePathMatcher(route.path);\n return (path: string, method: string): boolean => {\n if (!matchPath(path)) return false;\n if (route.method && route.method !== HttpMethod.ALL) return method === route.method;\n return true;\n };\n });\n if (matchers.length === 0) return () => false;\n if (matchers.length === 1) return matchers[0]!;\n return (path, method) => matchers.some((m) => m(path, method));\n }\n\n getControllers(): ControllerRegistration[] {\n return [...this.controllers];\n }\n}\n"],"mappings":"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"}
@@ -1,3 +1,32 @@
1
- import '../metadata';
2
- export { ScheduleNodeModule } from './schedule-node.module';
3
- export { ScheduleExecutor } from './schedule.executor';
1
+ import { a as OnApplicationBootstrap, r as ScheduleRegistry, s as OnModuleDestroy } from "../schedule.registry-DVm7Jp5w.js";
2
+ import { P as Container, f as DynamicModule } from "../discovery.service-Cpf1QcZ5.js";
3
+ //#region src/schedule-node/schedule-node.module.d.ts
4
+ /**
5
+ * Zero-config module (Tier C): providers live on the `@Module` bag; the
6
+ * `forRoot()` static is NestJS-parity sugar returning the bare dynamic module
7
+ * (default key — repeated calls dedup).
8
+ */
9
+ declare class ScheduleNodeModule {
10
+ static forRoot(): DynamicModule;
11
+ }
12
+ //#endregion
13
+ //#region src/schedule-node/schedule.executor.d.ts
14
+ declare class ScheduleExecutor implements OnApplicationBootstrap, OnModuleDestroy {
15
+ private registry;
16
+ private container;
17
+ private intervalTimers;
18
+ private cronTimers;
19
+ private cronMatcherCache;
20
+ private lastCronMinute;
21
+ private running;
22
+ constructor(registry: ScheduleRegistry, container: Container);
23
+ onApplicationBootstrap(): void;
24
+ private scheduleInterval;
25
+ private scheduleCron;
26
+ private invoke;
27
+ private getMatcher;
28
+ onModuleDestroy(): void;
29
+ }
30
+ //#endregion
31
+ export { ScheduleExecutor, ScheduleNodeModule };
32
+ //# sourceMappingURL=index.d.ts.map
@@ -1,3 +1,97 @@
1
- import "../metadata.js";
2
- export { ScheduleNodeModule } from "./schedule-node.module.js";
3
- export { ScheduleExecutor } from "./schedule.executor.js";
1
+ import { a as Injectable, i as Inject, n as __decorateParam, r as __decorateMetadata, t as __decorate } from "../decorate-GcSMAbKn.js";
2
+ import { n as resolveErrorReporter } from "../discovery.service-BYm95SSD.js";
3
+ import { t as Container } from "../container-BqUHID4l.js";
4
+ import { n as Module } from "../decorators-C8YBFCIk.js";
5
+ import { n as ScheduleRegistry, t as parseCron } from "../cron-matcher-C9qv5OUA.js";
6
+ //#region src/schedule-node/schedule.executor.ts
7
+ let ScheduleExecutor = class ScheduleExecutor {
8
+ registry;
9
+ container;
10
+ intervalTimers = [];
11
+ cronTimers = [];
12
+ cronMatcherCache = /* @__PURE__ */ new Map();
13
+ lastCronMinute = /* @__PURE__ */ new Map();
14
+ running = true;
15
+ constructor(registry, container) {
16
+ this.registry = registry;
17
+ this.container = container;
18
+ }
19
+ onApplicationBootstrap() {
20
+ if (typeof setInterval !== "function") throw new Error("@velajs/vela/schedule-node requires Node or Bun. Use a platform cron adapter on edge runtimes (e.g. CloudflareApplication.scheduled).");
21
+ for (const job of this.registry.getIntervalJobs()) this.scheduleInterval(job.instance, job.methodName, job.ms);
22
+ const cronJobs = this.registry.getCronJobs();
23
+ for (let i = 0; i < cronJobs.length; i++) {
24
+ const job = cronJobs[i];
25
+ this.scheduleCron(job.instance, job.methodName, job.expression, i);
26
+ }
27
+ }
28
+ scheduleInterval(instance, methodName, ms) {
29
+ if (!this.running) return;
30
+ const timer = setInterval(() => {
31
+ this.invoke(instance, methodName);
32
+ }, ms);
33
+ this.intervalTimers.push(timer);
34
+ }
35
+ scheduleCron(instance, methodName, expression, index) {
36
+ if (!this.running) return;
37
+ const matcher = this.getMatcher(expression);
38
+ if (!matcher) return;
39
+ const jobKey = `${index}:${methodName}:${expression}`;
40
+ const timer = setInterval(() => {
41
+ const now = /* @__PURE__ */ new Date();
42
+ const minuteKey = Math.floor(now.getTime() / 6e4);
43
+ if (this.lastCronMinute.get(jobKey) === minuteKey) return;
44
+ if (!matcher(now)) return;
45
+ this.lastCronMinute.set(jobKey, minuteKey);
46
+ this.invoke(instance, methodName);
47
+ }, 1e3);
48
+ this.cronTimers.push(timer);
49
+ }
50
+ async invoke(instance, methodName) {
51
+ try {
52
+ const method = instance[methodName];
53
+ if (typeof method === "function") await method.call(instance);
54
+ } catch (err) {
55
+ resolveErrorReporter(this.container).report(err, {
56
+ edge: "schedule",
57
+ source: methodName
58
+ });
59
+ if (this.container.getDiagnostics() === "throw") throw err;
60
+ }
61
+ }
62
+ getMatcher(expression) {
63
+ if (this.cronMatcherCache.has(expression)) return this.cronMatcherCache.get(expression) ?? null;
64
+ const matcher = parseCron(expression);
65
+ this.cronMatcherCache.set(expression, matcher);
66
+ return matcher;
67
+ }
68
+ onModuleDestroy() {
69
+ this.running = false;
70
+ for (const timer of this.intervalTimers) clearInterval(timer);
71
+ for (const timer of this.cronTimers) clearInterval(timer);
72
+ this.intervalTimers = [];
73
+ this.cronTimers = [];
74
+ this.lastCronMinute.clear();
75
+ }
76
+ };
77
+ ScheduleExecutor = __decorate([
78
+ Injectable(),
79
+ __decorateParam(1, Inject(Container)),
80
+ __decorateMetadata("design:paramtypes", [typeof ScheduleRegistry === "undefined" ? Object : ScheduleRegistry, typeof Container === "undefined" ? Object : Container])
81
+ ], ScheduleExecutor);
82
+ //#endregion
83
+ //#region src/schedule-node/schedule-node.module.ts
84
+ var _ScheduleNodeModule;
85
+ let ScheduleNodeModule = _ScheduleNodeModule = class ScheduleNodeModule {
86
+ static forRoot() {
87
+ return { module: _ScheduleNodeModule };
88
+ }
89
+ };
90
+ ScheduleNodeModule = _ScheduleNodeModule = __decorate([Module({
91
+ providers: [ScheduleRegistry, ScheduleExecutor],
92
+ exports: [ScheduleRegistry, ScheduleExecutor]
93
+ })], ScheduleNodeModule);
94
+ //#endregion
95
+ export { ScheduleExecutor, ScheduleNodeModule };
96
+
97
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/schedule-node/schedule.executor.ts","../../src/schedule-node/schedule-node.module.ts"],"sourcesContent":["import { Inject, Injectable } from '../container/index';\nimport { Container } from '../container/container';\nimport { resolveErrorReporter } from '../exceptions/reporter';\nimport type { OnApplicationBootstrap, OnModuleDestroy } from '../lifecycle/index';\nimport { parseCron, type CronMatcher } from '../schedule/cron-matcher';\nimport { ScheduleRegistry } from '../schedule/schedule.registry';\n\n@Injectable()\nexport class ScheduleExecutor implements OnApplicationBootstrap, OnModuleDestroy {\n private intervalTimers: ReturnType<typeof setInterval>[] = [];\n private cronTimers: ReturnType<typeof setInterval>[] = [];\n private cronMatcherCache = new Map<string, CronMatcher | null>();\n private lastCronMinute = new Map<string, number>();\n private running = true;\n\n constructor(\n private registry: ScheduleRegistry,\n @Inject(Container) private container: Container,\n ) {}\n\n onApplicationBootstrap(): void {\n if (typeof setInterval !== 'function') {\n throw new Error(\n '@velajs/vela/schedule-node requires Node or Bun. Use a platform cron adapter on edge runtimes (e.g. CloudflareApplication.scheduled).',\n );\n }\n\n for (const job of this.registry.getIntervalJobs()) {\n this.scheduleInterval(job.instance, job.methodName, job.ms);\n }\n\n const cronJobs = this.registry.getCronJobs();\n for (let i = 0; i < cronJobs.length; i++) {\n const job = cronJobs[i];\n this.scheduleCron(job!.instance, job!.methodName, job!.expression, i);\n }\n }\n\n private scheduleInterval(instance: unknown, methodName: string, ms: number): void {\n if (!this.running) return;\n\n const timer = setInterval(() => {\n void this.invoke(instance, methodName);\n }, ms);\n this.intervalTimers.push(timer);\n }\n\n private scheduleCron(\n instance: unknown,\n methodName: string,\n expression: string,\n index: number,\n ): void {\n if (!this.running) return;\n\n const matcher = this.getMatcher(expression);\n if (!matcher) return;\n\n const jobKey = `${index}:${methodName}:${expression}`;\n const timer = setInterval(() => {\n const now = new Date();\n const minuteKey = Math.floor(now.getTime() / 60_000);\n\n if (this.lastCronMinute.get(jobKey) === minuteKey) return;\n if (!matcher(now)) return;\n\n this.lastCronMinute.set(jobKey, minuteKey);\n void this.invoke(instance, methodName);\n }, 1000);\n\n this.cronTimers.push(timer);\n }\n\n private async invoke(instance: unknown, methodName: string): Promise<void> {\n try {\n const method = (instance as Record<string, Function>)[methodName];\n if (typeof method === 'function') {\n await method.call(instance);\n }\n } catch (err) {\n // Report BEFORE the rethrow below — the exception handler sees every\n // scheduled-job error, and its default reporter logs it (unless silent),\n // replacing the previous bare console.warn.\n resolveErrorReporter(this.container).report(err, {\n edge: 'schedule',\n source: methodName,\n });\n // Runtime job error — keep the scheduler running by default. Users\n // can opt into rethrowing by setting diagnostics: 'throw'.\n const mode = this.container.getDiagnostics();\n if (mode === 'throw') throw err;\n }\n }\n\n private getMatcher(expression: string): CronMatcher | null {\n if (this.cronMatcherCache.has(expression)) {\n return this.cronMatcherCache.get(expression) ?? null;\n }\n const matcher = parseCron(expression);\n this.cronMatcherCache.set(expression, matcher);\n return matcher;\n }\n\n onModuleDestroy(): void {\n this.running = false;\n for (const timer of this.intervalTimers) clearInterval(timer);\n for (const timer of this.cronTimers) clearInterval(timer);\n this.intervalTimers = [];\n this.cronTimers = [];\n this.lastCronMinute.clear();\n }\n}\n","import { Module } from '../module/decorators';\nimport type { DynamicModule } from '../module/types';\nimport { ScheduleRegistry } from '../schedule/schedule.registry';\nimport { ScheduleExecutor } from './schedule.executor';\n\n/**\n * Zero-config module (Tier C): providers live on the `@Module` bag; the\n * `forRoot()` static is NestJS-parity sugar returning the bare dynamic module\n * (default key — repeated calls dedup).\n */\n@Module({\n providers: [ScheduleRegistry, ScheduleExecutor],\n exports: [ScheduleRegistry, ScheduleExecutor],\n})\nexport class ScheduleNodeModule {\n static forRoot(): DynamicModule {\n return { module: ScheduleNodeModule };\n }\n}\n"],"mappings":";;;;;;AAQO,IAAA,mBAAA,MAAM,iBAAoE;CAQrE;CACmB;CAR7B,iBAA2D,CAAC;CAC5D,aAAuD,CAAC;CACxD,mCAA2B,IAAI,IAAgC;CAC/D,iCAAyB,IAAI,IAAoB;CACjD,UAAkB;CAElB,YACE,UACA,WACA;EAFQ,KAAA,WAAA;EACmB,KAAA,YAAA;CAC1B;CAEH,yBAA+B;EAC7B,IAAI,OAAO,gBAAgB,YACzB,MAAM,IAAI,MACR,uIACF;EAGF,KAAK,MAAM,OAAO,KAAK,SAAS,gBAAgB,GAC9C,KAAK,iBAAiB,IAAI,UAAU,IAAI,YAAY,IAAI,EAAE;EAG5D,MAAM,WAAW,KAAK,SAAS,YAAY;EAC3C,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;GACxC,MAAM,MAAM,SAAS;GACrB,KAAK,aAAa,IAAK,UAAU,IAAK,YAAY,IAAK,YAAY,CAAC;EACtE;CACF;CAEA,iBAAyB,UAAmB,YAAoB,IAAkB;EAChF,IAAI,CAAC,KAAK,SAAS;EAEnB,MAAM,QAAQ,kBAAkB;GAC9B,KAAU,OAAO,UAAU,UAAU;EACvC,GAAG,EAAE;EACL,KAAK,eAAe,KAAK,KAAK;CAChC;CAEA,aACE,UACA,YACA,YACA,OACM;EACN,IAAI,CAAC,KAAK,SAAS;EAEnB,MAAM,UAAU,KAAK,WAAW,UAAU;EAC1C,IAAI,CAAC,SAAS;EAEd,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG;EACzC,MAAM,QAAQ,kBAAkB;GAC9B,MAAM,sBAAM,IAAI,KAAK;GACrB,MAAM,YAAY,KAAK,MAAM,IAAI,QAAQ,IAAI,GAAM;GAEnD,IAAI,KAAK,eAAe,IAAI,MAAM,MAAM,WAAW;GACnD,IAAI,CAAC,QAAQ,GAAG,GAAG;GAEnB,KAAK,eAAe,IAAI,QAAQ,SAAS;GACzC,KAAU,OAAO,UAAU,UAAU;EACvC,GAAG,GAAI;EAEP,KAAK,WAAW,KAAK,KAAK;CAC5B;CAEA,MAAc,OAAO,UAAmB,YAAmC;EACzE,IAAI;GACF,MAAM,SAAU,SAAsC;GACtD,IAAI,OAAO,WAAW,YACpB,MAAM,OAAO,KAAK,QAAQ;EAE9B,SAAS,KAAK;GAIZ,qBAAqB,KAAK,SAAS,CAAC,CAAC,OAAO,KAAK;IAC/C,MAAM;IACN,QAAQ;GACV,CAAC;GAID,IADa,KAAK,UAAU,eACrB,MAAM,SAAS,MAAM;EAC9B;CACF;CAEA,WAAmB,YAAwC;EACzD,IAAI,KAAK,iBAAiB,IAAI,UAAU,GACtC,OAAO,KAAK,iBAAiB,IAAI,UAAU,KAAK;EAElD,MAAM,UAAU,UAAU,UAAU;EACpC,KAAK,iBAAiB,IAAI,YAAY,OAAO;EAC7C,OAAO;CACT;CAEA,kBAAwB;EACtB,KAAK,UAAU;EACf,KAAK,MAAM,SAAS,KAAK,gBAAgB,cAAc,KAAK;EAC5D,KAAK,MAAM,SAAS,KAAK,YAAY,cAAc,KAAK;EACxD,KAAK,iBAAiB,CAAC;EACvB,KAAK,aAAa,CAAC;EACnB,KAAK,eAAe,MAAM;CAC5B;AACF;;CAxGC,WAAW;oBAUP,OAAO,SAAS,CAAA;;;;;;ACHd,IAAA,qBAAA,sBAAA,MAAM,mBAAmB;CAC9B,OAAO,UAAyB;EAC9B,OAAO,EAAE,QAAA,oBAA2B;CACtC;AACF;uDARC,OAAO;CACN,WAAW,CAAC,kBAAkB,gBAAgB;CAC9C,SAAS,CAAC,kBAAkB,gBAAgB;AAC9C,CAAC,CAAA,GAAA,kBAAA"}
@@ -0,0 +1,55 @@
1
+ import { i as DiscoveryService } from "./discovery.service-Cpf1QcZ5.js";
2
+ //#region src/metadata.d.ts
3
+ declare global {
4
+ namespace Reflect {
5
+ function defineMetadata(key: string, value: unknown, target: object, propertyKey?: string | symbol): void;
6
+ function getMetadata(key: string, target: object, propertyKey?: string | symbol): unknown;
7
+ function getOwnMetadata(key: string, target: object, propertyKey?: string | symbol): unknown;
8
+ function metadata(key: string, value: unknown): (target: object, propertyKey?: string | symbol) => void;
9
+ }
10
+ }
11
+ declare function defineMetadata(key: string, value: unknown, target: object, propertyKey?: string | symbol): void;
12
+ declare function getMetadata<T = unknown>(key: string, target: object, propertyKey?: string | symbol): T | undefined;
13
+ //#endregion
14
+ //#region src/lifecycle/index.d.ts
15
+ interface OnModuleInit {
16
+ onModuleInit(): void | Promise<void>;
17
+ }
18
+ interface OnApplicationBootstrap {
19
+ onApplicationBootstrap(): void | Promise<void>;
20
+ }
21
+ interface OnModuleDestroy {
22
+ onModuleDestroy(): void | Promise<void>;
23
+ }
24
+ interface OnApplicationShutdown {
25
+ onApplicationShutdown(signal?: string): void | Promise<void>;
26
+ }
27
+ interface BeforeApplicationShutdown {
28
+ beforeApplicationShutdown(signal?: string): void | Promise<void>;
29
+ }
30
+ //#endregion
31
+ //#region src/schedule/schedule.registry.d.ts
32
+ interface RegisteredCronJob {
33
+ expression: string;
34
+ methodName: string;
35
+ instance: unknown;
36
+ target: Function;
37
+ }
38
+ interface RegisteredIntervalJob {
39
+ ms: number;
40
+ methodName: string;
41
+ instance: unknown;
42
+ target: Function;
43
+ }
44
+ declare class ScheduleRegistry implements OnApplicationBootstrap {
45
+ private readonly discovery;
46
+ private cronJobs;
47
+ private intervalJobs;
48
+ constructor(discovery: DiscoveryService);
49
+ onApplicationBootstrap(): void;
50
+ getCronJobs(): RegisteredCronJob[];
51
+ getIntervalJobs(): RegisteredIntervalJob[];
52
+ }
53
+ //#endregion
54
+ export { OnApplicationBootstrap as a, OnModuleInit as c, BeforeApplicationShutdown as i, defineMetadata as l, RegisteredIntervalJob as n, OnApplicationShutdown as o, ScheduleRegistry as r, OnModuleDestroy as s, RegisteredCronJob as t, getMetadata as u };
55
+ //# sourceMappingURL=schedule.registry-DVm7Jp5w.d.ts.map
@@ -1,5 +1,75 @@
1
- export { Seeder } from './seeder.decorator';
2
- export { SeederRegistry } from './seeder.registry';
3
- export { SeederModule, runSeeders } from './seeder.module';
4
- export { SEEDER_METADATA } from './seeder.tokens';
5
- export type { Seeder as ISeeder, SeederMetadata, RegisteredSeeder, SeederResult, } from './seeder.types';
1
+ import { a as OnApplicationBootstrap } from "../schedule.registry-DVm7Jp5w.js";
2
+ import { P as Container, Z as Type } from "../discovery.service-Cpf1QcZ5.js";
3
+ import { E as VelaApplication } from "../metadata.registry-D1od8ZBt.js";
4
+ import { zt as ConfigurableModuleClassType } from "../index-DhShDLCM.js";
5
+ //#region src/seeder/seeder.types.d.ts
6
+ /** A database seeder. Implement `run()` and tag the class with `@Seeder()`. */
7
+ interface Seeder {
8
+ run(): void | Promise<void>;
9
+ }
10
+ interface SeederMetadata {
11
+ /** Display name (defaults to the class name). */
12
+ name?: string;
13
+ /** Ascending run order (default 0). */
14
+ order?: number;
15
+ }
16
+ interface RegisteredSeeder {
17
+ name: string;
18
+ order: number;
19
+ target: new (...args: any[]) => Seeder;
20
+ }
21
+ interface SeederResult {
22
+ name: string;
23
+ ok: boolean;
24
+ error?: unknown;
25
+ }
26
+ //#endregion
27
+ //#region src/seeder/seeder.decorator.d.ts
28
+ /**
29
+ * Mark a class as a seeder. Also marks it `@Injectable()` (singleton) so it only
30
+ * needs to be listed in a module's providers (or `SeederModule.forRoot({ seeders })`)
31
+ * to be discovered by {@link SeederRegistry} at bootstrap.
32
+ */
33
+ declare function Seeder$1(options?: SeederMetadata): ClassDecorator;
34
+ //#endregion
35
+ //#region src/seeder/seeder.registry.d.ts
36
+ /**
37
+ * Discovers `@Seeder()` providers at bootstrap and runs them on demand.
38
+ * Mirrors `ScheduleRegistry`'s discovery (scan container tokens → read metadata).
39
+ */
40
+ declare class SeederRegistry implements OnApplicationBootstrap {
41
+ private readonly container;
42
+ private seeders;
43
+ constructor(container: Container);
44
+ onApplicationBootstrap(): void;
45
+ /** Registered seeders in run order. */
46
+ list(): RegisteredSeeder[];
47
+ /**
48
+ * Run every seeder in order, each in its own request-scoped child container so
49
+ * request-scoped dependencies resolve. Returns a per-seeder result; when
50
+ * `stopOnError` is true (default) the run aborts on the first failure.
51
+ */
52
+ runAll(options?: {
53
+ stopOnError?: boolean;
54
+ }): Promise<SeederResult[]>;
55
+ }
56
+ //#endregion
57
+ //#region src/seeder/seeder.module.d.ts
58
+ interface SeederModuleOptions {
59
+ seeders?: Type[];
60
+ }
61
+ declare const ConfigurableModuleClass: ConfigurableModuleClassType<SeederModuleOptions, "forRoot", "create", {
62
+ isGlobal?: boolean;
63
+ }>;
64
+ declare class SeederModule extends ConfigurableModuleClass {}
65
+ /** Convenience runner: resolve the registry from a built app and run all seeders. */
66
+ declare function runSeeders(app: VelaApplication, options?: {
67
+ stopOnError?: boolean;
68
+ }): Promise<SeederResult[]>;
69
+ //#endregion
70
+ //#region src/seeder/seeder.tokens.d.ts
71
+ /** Custom class-metadata key for `@Seeder()` (read during bootstrap discovery). */
72
+ declare const SEEDER_METADATA = "vela:seeder";
73
+ //#endregion
74
+ export { type Seeder as ISeeder, type RegisteredSeeder, SEEDER_METADATA, Seeder$1 as Seeder, type SeederMetadata, SeederModule, SeederRegistry, type SeederResult, runSeeders };
75
+ //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,105 @@
1
- export { Seeder } from "./seeder.decorator.js";
2
- export { SeederRegistry } from "./seeder.registry.js";
3
- export { SeederModule, runSeeders } from "./seeder.module.js";
4
- export { SEEDER_METADATA } from "./seeder.tokens.js";
1
+ import { a as Injectable, i as Inject, k as MetadataRegistry, m as Scope, n as __decorateParam, r as __decorateMetadata, t as __decorate } from "../decorate-GcSMAbKn.js";
2
+ import { t as Container } from "../container-BqUHID4l.js";
3
+ import { n as Module } from "../decorators-C8YBFCIk.js";
4
+ import { n as defineModule, r as stableHash } from "../define-module-NOyOZNXD.js";
5
+ //#region src/seeder/seeder.tokens.ts
6
+ /** Custom class-metadata key for `@Seeder()` (read during bootstrap discovery). */
7
+ const SEEDER_METADATA = "vela:seeder";
8
+ //#endregion
9
+ //#region src/seeder/seeder.decorator.ts
10
+ /**
11
+ * Mark a class as a seeder. Also marks it `@Injectable()` (singleton) so it only
12
+ * needs to be listed in a module's providers (or `SeederModule.forRoot({ seeders })`)
13
+ * to be discovered by {@link SeederRegistry} at bootstrap.
14
+ */
15
+ function Seeder(options = {}) {
16
+ return (target) => {
17
+ const ctor = target;
18
+ MetadataRegistry.markInjectable(ctor);
19
+ MetadataRegistry.setScope(ctor, Scope.SINGLETON);
20
+ MetadataRegistry.setCustomClassMeta(target, SEEDER_METADATA, options);
21
+ };
22
+ }
23
+ //#endregion
24
+ //#region src/seeder/seeder.registry.ts
25
+ let SeederRegistry = class SeederRegistry {
26
+ container;
27
+ seeders = [];
28
+ constructor(container) {
29
+ this.container = container;
30
+ }
31
+ onApplicationBootstrap() {
32
+ for (const token of this.container.getTokens()) {
33
+ if (typeof token !== "function") continue;
34
+ const meta = MetadataRegistry.getCustomClassMeta(token, SEEDER_METADATA);
35
+ if (!meta) continue;
36
+ this.seeders.push({
37
+ target: token,
38
+ name: meta.name ?? token.name,
39
+ order: meta.order ?? 0
40
+ });
41
+ }
42
+ this.seeders.sort((a, b) => a.order - b.order);
43
+ }
44
+ /** Registered seeders in run order. */
45
+ list() {
46
+ return [...this.seeders];
47
+ }
48
+ /**
49
+ * Run every seeder in order, each in its own request-scoped child container so
50
+ * request-scoped dependencies resolve. Returns a per-seeder result; when
51
+ * `stopOnError` is true (default) the run aborts on the first failure.
52
+ */
53
+ async runAll(options = {}) {
54
+ const stopOnError = options.stopOnError ?? true;
55
+ const results = [];
56
+ for (const seeder of this.seeders) {
57
+ const child = this.container.createChild();
58
+ let failed = false;
59
+ try {
60
+ await child.resolve(seeder.target).run();
61
+ results.push({
62
+ name: seeder.name,
63
+ ok: true
64
+ });
65
+ } catch (error) {
66
+ results.push({
67
+ name: seeder.name,
68
+ ok: false,
69
+ error
70
+ });
71
+ failed = true;
72
+ } finally {
73
+ await child.dispose();
74
+ }
75
+ if (failed && stopOnError) break;
76
+ }
77
+ return results;
78
+ }
79
+ };
80
+ SeederRegistry = __decorate([
81
+ Injectable(),
82
+ __decorateParam(0, Inject(Container)),
83
+ __decorateMetadata("design:paramtypes", [typeof Container === "undefined" ? Object : Container])
84
+ ], SeederRegistry);
85
+ //#endregion
86
+ //#region src/seeder/seeder.module.ts
87
+ const { ConfigurableModuleClass } = defineModule({
88
+ name: "Seeder",
89
+ key: (options) => stableHash({ seeders: (options.seeders ?? []).map((s) => s.name) }),
90
+ setup: ({ options }) => ({ providers: [...options.seeders ?? []] })
91
+ });
92
+ let SeederModule = class SeederModule extends ConfigurableModuleClass {};
93
+ SeederModule = __decorate([Module({
94
+ lazy: true,
95
+ providers: [SeederRegistry],
96
+ exports: [SeederRegistry]
97
+ })], SeederModule);
98
+ /** Convenience runner: resolve the registry from a built app and run all seeders. */
99
+ function runSeeders(app, options) {
100
+ return app.get(SeederRegistry).runAll(options);
101
+ }
102
+ //#endregion
103
+ export { SEEDER_METADATA, Seeder, SeederModule, SeederRegistry, runSeeders };
104
+
105
+ //# sourceMappingURL=index.js.map