stratal 0.0.21 → 0.0.22

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 (246) hide show
  1. package/README.md +1 -1
  2. package/dist/{base-email.provider-CfQCA08m.mjs → base-email.provider-BWZHIjt8.mjs} +1 -1
  3. package/dist/{base-email.provider-CfQCA08m.mjs.map → base-email.provider-BWZHIjt8.mjs.map} +1 -1
  4. package/dist/bin/quarry.mjs +46 -109
  5. package/dist/bin/quarry.mjs.map +1 -1
  6. package/dist/cache/index.d.mts +6 -46
  7. package/dist/cache/index.d.mts.map +1 -1
  8. package/dist/cache/index.mjs +20 -67
  9. package/dist/cache/index.mjs.map +1 -1
  10. package/dist/{cache.service-DsnKuNyO.d.mts → cache.service-e34gV6tz.d.mts} +8 -8
  11. package/dist/{cache.service-DsnKuNyO.d.mts.map → cache.service-e34gV6tz.d.mts.map} +1 -1
  12. package/dist/{cache.tokens-B7Rw1C9Q.mjs → cache.tokens-ovi_c52J.mjs} +1 -1
  13. package/dist/{cache.tokens-B7Rw1C9Q.mjs.map → cache.tokens-ovi_c52J.mjs.map} +1 -1
  14. package/dist/{colors-DJaRDXoS.mjs → colors-axmupKdp.mjs} +1 -1
  15. package/dist/{colors-DJaRDXoS.mjs.map → colors-axmupKdp.mjs.map} +1 -1
  16. package/dist/{command-BgSlsS4M.mjs → command-BU4ApTo5.mjs} +2 -3
  17. package/dist/command-BU4ApTo5.mjs.map +1 -0
  18. package/dist/{command-Cmmf0oHX.d.mts → command-wXfvHbBZ.d.mts} +3 -2
  19. package/dist/command-wXfvHbBZ.d.mts.map +1 -0
  20. package/dist/config/index.d.mts +24 -11
  21. package/dist/config/index.d.mts.map +1 -1
  22. package/dist/config/index.mjs +31 -57
  23. package/dist/config/index.mjs.map +1 -1
  24. package/dist/{consumer-registry-B7yUNh0q.d.mts → consumer-registry-DHQtypr1.d.mts} +1 -1
  25. package/dist/{consumer-registry-B7yUNh0q.d.mts.map → consumer-registry-DHQtypr1.d.mts.map} +1 -1
  26. package/dist/container-storage-GpNNz79X.mjs +52 -0
  27. package/dist/container-storage-GpNNz79X.mjs.map +1 -0
  28. package/dist/{controller.decorator-B9vwn0zK.mjs → controller.decorator-DIUazNU7.mjs} +8 -8
  29. package/dist/controller.decorator-DIUazNU7.mjs.map +1 -0
  30. package/dist/cron/index.d.mts +26 -5
  31. package/dist/cron/index.d.mts.map +1 -1
  32. package/dist/cron/index.mjs +1 -1
  33. package/dist/{cron-manager-DQSK8uoV.mjs → cron-manager-9bpN9bu4.mjs} +35 -15
  34. package/dist/cron-manager-9bpN9bu4.mjs.map +1 -0
  35. package/dist/{cron-manager-CmTimEjf.d.mts → cron-manager-CSTIBPcM.d.mts} +6 -13
  36. package/dist/cron-manager-CSTIBPcM.d.mts.map +1 -0
  37. package/dist/decorate-HgTKAYK8.mjs +16 -0
  38. package/dist/deep-merge-C8NgcXw4.mjs +18 -0
  39. package/dist/deep-merge-C8NgcXw4.mjs.map +1 -0
  40. package/dist/di/index.d.mts +2 -2
  41. package/dist/di/index.mjs +4 -3
  42. package/dist/di-BO1QIb5H.mjs +415 -0
  43. package/dist/di-BO1QIb5H.mjs.map +1 -0
  44. package/dist/email/index.d.mts +14 -89
  45. package/dist/email/index.d.mts.map +1 -1
  46. package/dist/email/index.mjs +25 -125
  47. package/dist/email/index.mjs.map +1 -1
  48. package/dist/en-BPP6h6y5.mjs +202 -0
  49. package/dist/en-BPP6h6y5.mjs.map +1 -0
  50. package/dist/{env-D1rcZ8_r.d.mts → env-DKSbuBi5.d.mts} +1 -1
  51. package/dist/env-DKSbuBi5.d.mts.map +1 -0
  52. package/dist/errors/index.d.mts +2 -2
  53. package/dist/errors/index.mjs +4 -2
  54. package/dist/errors-BBZTnjdq.mjs +333 -0
  55. package/dist/errors-BBZTnjdq.mjs.map +1 -0
  56. package/dist/events/index.d.mts +2 -2
  57. package/dist/events/index.d.mts.map +1 -1
  58. package/dist/events/index.mjs +1 -1
  59. package/dist/{events-CzCV8jI8.mjs → events-D1KdDaiP.mjs} +11 -11
  60. package/dist/events-D1KdDaiP.mjs.map +1 -0
  61. package/dist/exception-context-B4kM-M53.mjs +429 -0
  62. package/dist/exception-context-B4kM-M53.mjs.map +1 -0
  63. package/dist/{gateway-context-CXmXtaUP.mjs → gateway-context-CFe6a9gz.mjs} +19 -31
  64. package/dist/gateway-context-CFe6a9gz.mjs.map +1 -0
  65. package/dist/guards/index.d.mts +3 -3
  66. package/dist/guards/index.d.mts.map +1 -1
  67. package/dist/guards/index.mjs +1 -1
  68. package/dist/{guards-DU1_J9YA.mjs → guards-Ced-uNIF.mjs} +6 -5
  69. package/dist/guards-Ced-uNIF.mjs.map +1 -0
  70. package/dist/{http-method.decorator-BrgHMdLQ.mjs → http-method.decorator-CdjKFJZZ.mjs} +7 -6
  71. package/dist/http-method.decorator-CdjKFJZZ.mjs.map +1 -0
  72. package/dist/i18n/index.d.mts +238 -3
  73. package/dist/i18n/index.d.mts.map +1 -0
  74. package/dist/i18n/index.mjs +39 -3
  75. package/dist/i18n/index.mjs.map +1 -0
  76. package/dist/i18n/messages/en/index.d.mts +2 -2
  77. package/dist/i18n/messages/en/index.mjs +2 -2
  78. package/dist/i18n/utils/index.d.mts +4 -26
  79. package/dist/i18n/utils/index.d.mts.map +1 -1
  80. package/dist/i18n/utils/index.mjs +2 -2
  81. package/dist/i18n/validation/index.d.mts +3 -2
  82. package/dist/i18n/validation/index.mjs +4 -2
  83. package/dist/i18n.module-BlXrtAlV.mjs +219 -0
  84. package/dist/i18n.module-BlXrtAlV.mjs.map +1 -0
  85. package/dist/i18n.tokens-hwRpmjRq.mjs +19 -0
  86. package/dist/i18n.tokens-hwRpmjRq.mjs.map +1 -0
  87. package/dist/{index-7-hU3GTV.d.mts → index-B4UBK-2T.d.mts} +1 -1
  88. package/dist/{index-7-hU3GTV.d.mts.map → index-B4UBK-2T.d.mts.map} +1 -1
  89. package/dist/index-BtlE9RuO.d.mts +124 -0
  90. package/dist/index-BtlE9RuO.d.mts.map +1 -0
  91. package/dist/{index-DUzWs0z7.d.mts → index-CW1YHSft.d.mts} +71 -167
  92. package/dist/index-CW1YHSft.d.mts.map +1 -0
  93. package/dist/{index-ByOyTmqf.d.mts → index-DEncMcC6.d.mts} +554 -2237
  94. package/dist/index-DEncMcC6.d.mts.map +1 -0
  95. package/dist/index-Dj5IMwtr.d.mts +44 -0
  96. package/dist/index-Dj5IMwtr.d.mts.map +1 -0
  97. package/dist/{index-C1KvMncZ.d.mts → index-KMgSCSM7.d.mts} +3 -108
  98. package/dist/index-KMgSCSM7.d.mts.map +1 -0
  99. package/dist/index.d.mts +5 -43
  100. package/dist/index.mjs +1 -1
  101. package/dist/{is-command-C6a7WTPw.mjs → is-command-CX5rAfZW.mjs} +2 -2
  102. package/dist/{is-command-C6a7WTPw.mjs.map → is-command-CX5rAfZW.mjs.map} +1 -1
  103. package/dist/{is-seeder-CebjZCDn.mjs → is-seeder-CYCtELlm.mjs} +1 -1
  104. package/dist/{is-seeder-CebjZCDn.mjs.map → is-seeder-CYCtELlm.mjs.map} +1 -1
  105. package/dist/logger/index.d.mts +2 -2
  106. package/dist/logger/index.mjs +170 -2
  107. package/dist/logger/index.mjs.map +1 -0
  108. package/dist/macroable/index.d.mts +1 -1
  109. package/dist/macroable/index.mjs +1 -1
  110. package/dist/{macroable-BmufBshB.mjs → macroable-DzlfzT50.mjs} +1 -1
  111. package/dist/{macroable-BmufBshB.mjs.map → macroable-DzlfzT50.mjs.map} +1 -1
  112. package/dist/metadata-BVkc4aUu.mjs +39 -0
  113. package/dist/metadata-BVkc4aUu.mjs.map +1 -0
  114. package/dist/module/index.d.mts +6 -24
  115. package/dist/module/index.d.mts.map +1 -1
  116. package/dist/module/index.mjs +2 -2
  117. package/dist/module-xYoHba6B.mjs +422 -0
  118. package/dist/module-xYoHba6B.mjs.map +1 -0
  119. package/dist/openapi/index.d.mts +3 -3
  120. package/dist/openapi/index.d.mts.map +1 -1
  121. package/dist/openapi/index.mjs +1 -2
  122. package/dist/openapi-C6lm0RmV.mjs +483 -0
  123. package/dist/openapi-C6lm0RmV.mjs.map +1 -0
  124. package/dist/{openapi.service-Bt9bCIrd.d.mts → openapi.service-CrLlsXAd.d.mts} +3 -3
  125. package/dist/openapi.service-CrLlsXAd.d.mts.map +1 -0
  126. package/dist/quarry/index.d.mts +5 -163
  127. package/dist/quarry/index.d.mts.map +1 -1
  128. package/dist/quarry/index.mjs +5 -5
  129. package/dist/quarry/runner.d.mts +184 -0
  130. package/dist/quarry/runner.d.mts.map +1 -0
  131. package/dist/quarry/runner.mjs +775 -0
  132. package/dist/quarry/runner.mjs.map +1 -0
  133. package/dist/quarry-registry-D4hIGScf.d.mts +69 -0
  134. package/dist/quarry-registry-D4hIGScf.d.mts.map +1 -0
  135. package/dist/quarry-registry-DkraZNwn.mjs +311 -0
  136. package/dist/quarry-registry-DkraZNwn.mjs.map +1 -0
  137. package/dist/queue/index.d.mts +3 -3
  138. package/dist/queue/index.mjs +26 -28
  139. package/dist/queue/index.mjs.map +1 -1
  140. package/dist/{queue.module-BhCjZp6H.mjs → queue.module-DeWJ0tQM.mjs} +59 -113
  141. package/dist/queue.module-DeWJ0tQM.mjs.map +1 -0
  142. package/dist/{r2-storage.provider-DuonKeYm.mjs → r2-storage.provider-Hfm6LdZQ.mjs} +5 -5
  143. package/dist/r2-storage.provider-Hfm6LdZQ.mjs.map +1 -0
  144. package/dist/{rate-limit.decorator-6qzNcSOt.mjs → rate-limit.decorator-D69zdZbp.mjs} +6 -11
  145. package/dist/rate-limit.decorator-D69zdZbp.mjs.map +1 -0
  146. package/dist/rate-limiter/index.d.mts +11 -50
  147. package/dist/rate-limiter/index.d.mts.map +1 -1
  148. package/dist/rate-limiter/index.mjs +16 -30
  149. package/dist/rate-limiter/index.mjs.map +1 -1
  150. package/dist/{resend.provider-DB4IlFjG.mjs → resend.provider-Ur6tU7fK.mjs} +7 -7
  151. package/dist/resend.provider-Ur6tU7fK.mjs.map +1 -0
  152. package/dist/router/index.d.mts +2 -2
  153. package/dist/router/index.mjs +8 -7
  154. package/dist/{i18n.module-CzXLW9Hy.mjs → router-Cy6DjkvP.mjs} +171 -851
  155. package/dist/router-Cy6DjkvP.mjs.map +1 -0
  156. package/dist/seeder/index.d.mts +6 -11
  157. package/dist/seeder/index.d.mts.map +1 -1
  158. package/dist/seeder/index.mjs +3 -3
  159. package/dist/{seeder-zoEfEw9i.mjs → seeder-BADTig4n.mjs} +14 -22
  160. package/dist/seeder-BADTig4n.mjs.map +1 -0
  161. package/dist/{signed-url-BQPbv2In.mjs → signed-url-BqUqt5dF.mjs} +1 -1
  162. package/dist/{signed-url-BQPbv2In.mjs.map → signed-url-BqUqt5dF.mjs.map} +1 -1
  163. package/dist/{smtp.provider-B6D7zuWX.mjs → smtp.provider-C129sNBT.mjs} +6 -6
  164. package/dist/smtp.provider-C129sNBT.mjs.map +1 -0
  165. package/dist/storage/index.d.mts +15 -39
  166. package/dist/storage/index.d.mts.map +1 -1
  167. package/dist/storage/index.mjs +3 -3
  168. package/dist/storage/providers/index.d.mts +2 -2
  169. package/dist/storage/providers/index.mjs +1 -1
  170. package/dist/{storage-D8CBP72Z.mjs → storage-BA3ppVYM.mjs} +65 -59
  171. package/dist/storage-BA3ppVYM.mjs.map +1 -0
  172. package/dist/{storage-provider.interface-Bd6vA4ak.d.mts → storage-provider.interface-DQMtT42e.d.mts} +2 -3
  173. package/dist/storage-provider.interface-DQMtT42e.d.mts.map +1 -0
  174. package/dist/storage.error-C6FY037a.mjs +8 -0
  175. package/dist/storage.error-C6FY037a.mjs.map +1 -0
  176. package/dist/{stratal-CNwpbSZl.mjs → stratal-Bdq4IdB3.mjs} +31 -185
  177. package/dist/stratal-Bdq4IdB3.mjs.map +1 -0
  178. package/dist/stratal-BsKmvP6J.d.mts +43 -0
  179. package/dist/stratal-BsKmvP6J.d.mts.map +1 -0
  180. package/dist/{types-cySNS_lp.d.mts → types-BaeHi67f.d.mts} +1 -1
  181. package/dist/types-BaeHi67f.d.mts.map +1 -0
  182. package/dist/{usage-generator-BUdlhnCK.mjs → usage-generator-DTqaUMR9.mjs} +6 -3
  183. package/dist/usage-generator-DTqaUMR9.mjs.map +1 -0
  184. package/dist/validation-DUzcjb8Q.mjs +49 -0
  185. package/dist/validation-DUzcjb8Q.mjs.map +1 -0
  186. package/dist/validation.context-XTysWJ3b.mjs +117 -0
  187. package/dist/validation.context-XTysWJ3b.mjs.map +1 -0
  188. package/dist/websocket/index.d.mts +7 -14
  189. package/dist/websocket/index.d.mts.map +1 -1
  190. package/dist/websocket/index.mjs +2 -2
  191. package/dist/workers/index.d.mts +2 -2
  192. package/dist/workers/index.mjs +3 -2
  193. package/dist/workers/index.mjs.map +1 -1
  194. package/dist/{index-Bnpfq6uk.d.mts → zod-DvWTfRpI.d.mts} +58 -133
  195. package/dist/zod-DvWTfRpI.d.mts.map +1 -0
  196. package/dist/zod-hMa3rSHV.mjs +72 -0
  197. package/dist/zod-hMa3rSHV.mjs.map +1 -0
  198. package/package.json +10 -10
  199. package/dist/command-BgSlsS4M.mjs.map +0 -1
  200. package/dist/command-Cmmf0oHX.d.mts.map +0 -1
  201. package/dist/controller.decorator-B9vwn0zK.mjs.map +0 -1
  202. package/dist/cron-manager-CmTimEjf.d.mts.map +0 -1
  203. package/dist/cron-manager-DQSK8uoV.mjs.map +0 -1
  204. package/dist/en-DSH_bhh6.mjs +0 -308
  205. package/dist/en-DSH_bhh6.mjs.map +0 -1
  206. package/dist/env-D1rcZ8_r.d.mts.map +0 -1
  207. package/dist/errors-COW9-Mar.mjs +0 -1739
  208. package/dist/errors-COW9-Mar.mjs.map +0 -1
  209. package/dist/errors-ORxu1-Bb.mjs +0 -74
  210. package/dist/errors-ORxu1-Bb.mjs.map +0 -1
  211. package/dist/events-CzCV8jI8.mjs.map +0 -1
  212. package/dist/gateway-context-CXmXtaUP.mjs.map +0 -1
  213. package/dist/guards-DU1_J9YA.mjs.map +0 -1
  214. package/dist/http-method.decorator-BrgHMdLQ.mjs.map +0 -1
  215. package/dist/i18n.module-CzXLW9Hy.mjs.map +0 -1
  216. package/dist/index-Bnpfq6uk.d.mts.map +0 -1
  217. package/dist/index-ByOyTmqf.d.mts.map +0 -1
  218. package/dist/index-C1KvMncZ.d.mts.map +0 -1
  219. package/dist/index-DBd_2wv8.d.mts +0 -263
  220. package/dist/index-DBd_2wv8.d.mts.map +0 -1
  221. package/dist/index-DUzWs0z7.d.mts.map +0 -1
  222. package/dist/index.d.mts.map +0 -1
  223. package/dist/logger-DlV7NtvD.mjs +0 -440
  224. package/dist/logger-DlV7NtvD.mjs.map +0 -1
  225. package/dist/module-BzLg57FK.mjs +0 -866
  226. package/dist/module-BzLg57FK.mjs.map +0 -1
  227. package/dist/openapi-tools.service-Zs-Ewv7F.mjs +0 -200
  228. package/dist/openapi-tools.service-Zs-Ewv7F.mjs.map +0 -1
  229. package/dist/openapi.service-Bt9bCIrd.d.mts.map +0 -1
  230. package/dist/quarry-registry-BwY2hOxm.mjs +0 -699
  231. package/dist/quarry-registry-BwY2hOxm.mjs.map +0 -1
  232. package/dist/queue.module-BhCjZp6H.mjs.map +0 -1
  233. package/dist/r2-storage.provider-DuonKeYm.mjs.map +0 -1
  234. package/dist/rate-limit.decorator-6qzNcSOt.mjs.map +0 -1
  235. package/dist/resend.provider-DB4IlFjG.mjs.map +0 -1
  236. package/dist/seeder-zoEfEw9i.mjs.map +0 -1
  237. package/dist/setup-CefZKV_e.mjs +0 -37
  238. package/dist/setup-CefZKV_e.mjs.map +0 -1
  239. package/dist/smtp.provider-B6D7zuWX.mjs.map +0 -1
  240. package/dist/storage-D8CBP72Z.mjs.map +0 -1
  241. package/dist/storage-provider.interface-Bd6vA4ak.d.mts.map +0 -1
  242. package/dist/stratal-CNwpbSZl.mjs.map +0 -1
  243. package/dist/types-cySNS_lp.d.mts.map +0 -1
  244. package/dist/usage-generator-BUdlhnCK.mjs.map +0 -1
  245. package/dist/validation-DtJwAv7O.mjs +0 -248
  246. package/dist/validation-DtJwAv7O.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.module-BlXrtAlV.mjs","names":[],"sources":["../src/i18n/services/i18n.service.ts","../src/i18n/messages/index.ts","../src/i18n/services/message-loader.service.ts","../src/i18n/services/message-registry.ts","../src/i18n/i18n.module.ts"],"sourcesContent":["import { inject } from '../../di'\nimport { Request } from '../../di/decorators'\nimport { ROUTER_TOKENS, type RouterContext } from '../../router'\nimport { I18N_TOKENS } from '../i18n.tokens'\nimport type { II18nService, MessageKeys, MessageParams } from '../i18n.types'\nimport type { MessageLoaderService } from './message-loader.service'\n\n@Request(I18N_TOKENS.I18nService)\nexport class I18nService implements II18nService {\n constructor(\n @inject(I18N_TOKENS.MessageLoader) private readonly loader: MessageLoaderService,\n @inject(ROUTER_TOKENS.RouterContext, { isOptional: true }) private readonly routerContext?: RouterContext\n ) {\n }\n\n t(key: MessageKeys, params?: MessageParams): string {\n return this.loader.translate(this.getLocale(), key, params as Record<string, unknown>)\n }\n\n getLocale(): string {\n return this.routerContext?.getLocale() ?? 'en'\n }\n}\n","/**\n * Core Messages\n *\n * Messages used by packages/modules infrastructure.\n * These are automatically merged with application-specific messages.\n */\n\nimport * as en from './en'\n\n/**\n * All locale messages\n * Explicitly import and export (no filesystem scanning - Cloudflare Workers compatible)\n */\nexport const messages = { en } as const\n\n/**\n * Type for all messages\n */\nexport type Messages = typeof messages\n\n/**\n * Get messages for all locales\n */\nexport function getMessages(): Record<string, Record<string, unknown>> {\n return messages\n}\n\n/**\n * Get available locales\n */\nexport function getLocales(): string[] {\n return Object.keys(messages)\n}\n","import IntlMessageFormat from 'intl-messageformat'\nimport { inject } from '../../di'\nimport { Singleton } from '../../di/decorators'\nimport type { I18nModuleOptions } from '../i18n.options'\nimport type { MessageKeyPrefix } from '../i18n.types'\nimport { I18N_TOKENS } from '../i18n.tokens'\nimport { getLocales, getMessages } from '../messages'\nimport { deepMerge } from '../utils/deep-merge'\nimport type { MessageRegistry } from './message-registry'\n\ntype CompiledMessages = Record<string, (params?: Record<string, unknown>) => string>\n\n@Singleton(I18N_TOKENS.MessageLoader)\nexport class MessageLoaderService {\n private readonly cache: Map<string, Record<string, unknown>>\n private readonly compiledCache: Map<string, CompiledMessages>\n private readonly locales: string[]\n private readonly defaultLocale: string\n\n constructor(\n @inject(I18N_TOKENS.MessageRegistry) private readonly registry: MessageRegistry,\n @inject(I18N_TOKENS.Options, { isOptional: true })\n private readonly options?: I18nModuleOptions\n ) {\n this.defaultLocale = this.options?.defaultLocale ?? 'en'\n this.cache = new Map()\n this.compiledCache = new Map()\n\n const coreMessages = getMessages()\n const coreLocales = getLocales()\n\n const registryMessages = this.registry.getMergedMessages()\n const registryLocales = Object.keys(registryMessages)\n\n const allLocales = [...new Set([...coreLocales, ...registryLocales])]\n this.locales = allLocales\n\n for (const locale of allLocales) {\n const coreLocaleMessages = coreMessages[locale] ?? {}\n const registryLocaleMessages = registryMessages[locale] ?? {}\n\n const merged = deepMerge(coreLocaleMessages, registryLocaleMessages)\n this.cache.set(locale, merged)\n }\n }\n\n translate(locale: string, key: string, params?: Record<string, unknown>): string {\n const compiled = this.getCompiledMessages(locale)\n const fn = compiled[key]\n if (!fn) return key\n return fn(params)\n }\n\n getMessages(locale: string): Record<string, unknown> {\n return this.cache.get(locale) ?? this.cache.get(this.defaultLocale) ?? {}\n }\n\n getAvailableLocales(): string[] {\n return this.locales\n }\n\n isLocaleSupported(locale: string): boolean {\n return this.cache.has(locale)\n }\n\n getDefaultLocale(): string {\n return this.defaultLocale\n }\n\n getFilteredMessages(\n locale: string,\n options?: { only?: MessageKeyPrefix[] }\n ): Record<string, string> {\n const messages = this.getMessages(locale)\n const flattened = this.flattenMessages(messages)\n\n if (!options?.only?.length) return flattened\n\n const result: Record<string, string> = {}\n for (const [key, value] of Object.entries(flattened)) {\n if (options.only.some((prefix) => key === prefix || key.startsWith(`${prefix}.`))) {\n result[key] = value\n }\n }\n return result\n }\n\n private getCompiledMessages(locale: string): CompiledMessages {\n const effectiveLocale = this.cache.has(locale) ? locale : this.defaultLocale\n\n const cached = this.compiledCache.get(effectiveLocale)\n if (cached) return cached\n\n const messages = this.cache.get(effectiveLocale) ?? {}\n const flattened = this.flattenMessages(messages)\n\n const compiled: CompiledMessages = {}\n for (const [key, value] of Object.entries(flattened)) {\n const msg = new IntlMessageFormat(value, effectiveLocale)\n compiled[key] = (params) => String(msg.format(params as Record<string, string | number | boolean>))\n }\n\n this.compiledCache.set(effectiveLocale, compiled)\n return compiled\n }\n\n private flattenMessages(\n messages: Record<string, unknown>,\n prefix = ''\n ): Record<string, string> {\n const result: Record<string, string> = {}\n\n for (const key of Object.keys(messages)) {\n const value = messages[key]\n const newKey = prefix ? `${prefix}.${key}` : key\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n Object.assign(result, this.flattenMessages(value as Record<string, unknown>, newKey))\n } else {\n result[newKey] = String(value)\n }\n }\n\n return result\n }\n}\n","import { Singleton } from '../../di/decorators'\nimport { I18N_TOKENS } from '../i18n.tokens'\nimport { deepMerge } from '../utils/deep-merge'\n\n/**\n * Global key for the shared contributions array.\n *\n * When stratal is installed via portal/symlink (e.g., in monorepos), bundlers\n * like esbuild may inline multiple copies of this module. Each copy gets its\n * own static class fields, so messages registered by one copy are invisible\n * to another. Using a `Symbol.for()` key on `globalThis` ensures all copies\n * share the same contributions array.\n */\nconst CONTRIBUTIONS_KEY = Symbol.for('stratal:i18n:message-registry:contributions')\n\ntype Contributions = Record<string, Record<string, unknown>>[]\n\nfunction getContributions(): Contributions {\n const g = globalThis as Record<symbol, unknown>\n g[CONTRIBUTIONS_KEY] ??= [];\n return g[CONTRIBUTIONS_KEY] as Contributions\n}\n\n/**\n * Message Registry\n *\n * Accumulates i18n messages from multiple `I18nModule.registerMessages()` calls.\n * Messages are collected statically (at module import time) and deep-merged\n * when `getMergedMessages()` is called by `MessageLoaderService`.\n *\n * Later registrations override earlier ones at leaf level.\n */\n@Singleton(I18N_TOKENS.MessageRegistry)\nexport class MessageRegistry {\n /**\n * Add messages (called statically by I18nModule.registerMessages)\n */\n static addMessages(messages: Record<string, Record<string, unknown>>): void {\n if (Boolean(messages) && typeof messages === 'object' && Object.keys(messages).length > 0) {\n getContributions().push(messages)\n }\n }\n\n /**\n * Get all messages deep-merged in registration order\n */\n getMergedMessages(): Record<string, Record<string, unknown>> {\n const merged: Record<string, Record<string, unknown>> = {}\n\n for (const contribution of getContributions()) {\n for (const locale of Object.keys(contribution)) {\n merged[locale] = deepMerge(\n (merged[locale] ?? {}),\n contribution[locale],\n )\n }\n }\n\n return merged\n }\n\n /**\n * Reset registry (for testing)\n * @internal\n */\n static reset(): void {\n (globalThis as Record<symbol, unknown>)[CONTRIBUTIONS_KEY] = []\n }\n}\n","import { Module } from '../module'\nimport type { DynamicModule, ModuleContext, OnInitialize } from '../module/types'\nimport type { I18nModuleOptions } from './i18n.options'\nimport { I18N_TOKENS } from './i18n.tokens'\nimport { I18nService } from './services/i18n.service'\nimport { MessageLoaderService } from './services/message-loader.service'\nimport { MessageRegistry } from './services/message-registry'\nimport { zodErrorMap } from './validation/validation.context'\nimport { z } from './validation/zod'\n\n@Module({\n providers: [\n { provide: I18N_TOKENS.MessageRegistry, useClass: MessageRegistry },\n { provide: I18N_TOKENS.MessageLoader, useClass: MessageLoaderService },\n { provide: I18N_TOKENS.I18nService, useClass: I18nService },\n ],\n})\nexport class I18nModule implements OnInitialize {\n onInitialize(_context: ModuleContext): void {\n z.config({ customError: zodErrorMap })\n }\n\n static forRoot(options: I18nModuleOptions = {}): DynamicModule {\n return {\n module: I18nModule,\n providers: [\n { provide: I18N_TOKENS.Options, useValue: options },\n ],\n }\n }\n\n static registerMessages(messages: Record<string, Record<string, unknown>>): DynamicModule {\n MessageRegistry.addMessages(messages)\n return {\n module: I18nModule,\n providers: [],\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ //#region src/i18n/i18n.tokens.ts
2
+ /**
3
+ * I18n Module DI Tokens
4
+ * Symbol-based tokens to avoid string collisions
5
+ */
6
+ const I18N_TOKENS = {
7
+ /** MessageLoaderService - loads and caches locale messages */
8
+ MessageLoader: Symbol.for("stratal:i18n:message:loader"),
9
+ /** I18nService - request-scoped translation service */
10
+ I18nService: Symbol.for("stratal:i18n:service"),
11
+ /** I18nModuleOptions - configuration options from forRoot() */
12
+ Options: Symbol.for("stratal:i18n:options"),
13
+ /** MessageRegistry - singleton accumulator for registerMessages() contributions */
14
+ MessageRegistry: Symbol.for("stratal:i18n:message:registry")
15
+ };
16
+ //#endregion
17
+ export { I18N_TOKENS as t };
18
+
19
+ //# sourceMappingURL=i18n.tokens-hwRpmjRq.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.tokens-hwRpmjRq.mjs","names":[],"sources":["../src/i18n/i18n.tokens.ts"],"sourcesContent":["/**\n * I18n Module DI Tokens\n * Symbol-based tokens to avoid string collisions\n */\n\nexport const I18N_TOKENS = {\n /** MessageLoaderService - loads and caches locale messages */\n MessageLoader: Symbol.for('stratal:i18n:message:loader'),\n /** I18nService - request-scoped translation service */\n I18nService: Symbol.for('stratal:i18n:service'),\n /** I18nModuleOptions - configuration options from forRoot() */\n Options: Symbol.for('stratal:i18n:options'),\n /** MessageRegistry - singleton accumulator for registerMessages() contributions */\n MessageRegistry: Symbol.for('stratal:i18n:message:registry'),\n} as const\n"],"mappings":";;;;;AAKA,MAAa,cAAc;;CAEzB,eAAe,OAAO,IAAI,8BAA8B;;CAExD,aAAa,OAAO,IAAI,uBAAuB;;CAE/C,SAAS,OAAO,IAAI,uBAAuB;;CAE3C,iBAAiB,OAAO,IAAI,gCAAgC;CAC7D"}
@@ -98,4 +98,4 @@ declare abstract class Macroable {
98
98
  }
99
99
  //#endregion
100
100
  export { MacroFunction as n, Macroable as t };
101
- //# sourceMappingURL=index-7-hU3GTV.d.mts.map
101
+ //# sourceMappingURL=index-B4UBK-2T.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-7-hU3GTV.d.mts","names":[],"sources":["../src/macroable/types.ts","../src/macroable/macroable.ts"],"mappings":";KACY,aAAA,IAAiB,IAAA,UAAc,IAAA;;;KCEtC,WAAA,oBAA+B,IAAA;;;;;;;;AAHQ;;;;;AA+B5C;;;;;;;;;;;;;;uBAAsB,SAAA;EAAA,CACnB,GAAA;EAwE8D;;;;EAAA,iBAnE9C,cAAA,EAAc,GAAA;;;;EAyFsB;;;EAAA,iBApFpC,UAAA,EAAU,GAAA;EAuFL;;;EAAA,iBAlFL,WAAA,EAAW,GAAA;EAqFsB;;;;EAAA,eA/EnC,UAAA;EAhBgB;;;;;;;;;EAAA,OA6BxB,KAAA,WAAgB,WAAA,kBAA6B,YAAA,CAAa,CAAA,EAAA,CAC/D,IAAA,EAAM,CAAA,EACN,IAAA,EAAM,CAAA,EACN,KAAA,EAAO,YAAA,CAAa,CAAA,EAAG,CAAA;EAAA,OAElB,KAAA,CAAM,IAAA,mBAAuB,KAAA;EALA;;;;;;;;;EAAA,OAsC7B,gBAAA,WAA2B,WAAA,kBAA6B,YAAA,CAAa,CAAA,EAAA,CAC1E,IAAA,EAAM,CAAA,EACN,IAAA,EAAM,CAAA,EACN,KAAA,EAAO,YAAA,CAAa,CAAA,EAAG,CAAA;EAAA,OAElB,gBAAA,CAAiB,IAAA,mBAAuB,KAAA;EAtCxC;;;;;;;EAAA,OAuDA,MAAA,WAAiB,WAAA,kBAA6B,YAAA,CAAa,CAAA,EAAA,CAChE,IAAA,EAAM,CAAA,EACN,IAAA,EAAM,CAAA,EACN,WAAA,GAAc,IAAA,EAAM,YAAA,CAAa,CAAA,MAAO,YAAA,CAAa,CAAA,EAAG,CAAA,GACxD,SAAA;EAAA,OAEK,MAAA,CAAO,IAAA,mBAAuB,WAAA,EAAa,aAAA,EAAe,SAAA;EA3BzD;;;;;EAAA,OA+DD,QAAA,CAAS,IAAA;EA7DS;;;;EAAA,OA2ElB,WAAA,CAAA"}
1
+ {"version":3,"file":"index-B4UBK-2T.d.mts","names":[],"sources":["../src/macroable/types.ts","../src/macroable/macroable.ts"],"mappings":";KACY,aAAA,IAAiB,IAAA,UAAc,IAAA;;;KCEtC,WAAA,oBAA+B,IAAA;;;;;;;;AAHQ;;;;;AA+B5C;;;;;;;;;;;;;;uBAAsB,SAAA;EAAA,CACnB,GAAA;EAwE8D;;;;EAAA,iBAnE9C,cAAA,EAAc,GAAA;;;;EAyFsB;;;EAAA,iBApFpC,UAAA,EAAU,GAAA;EAuFL;;;EAAA,iBAlFL,WAAA,EAAW,GAAA;EAqFsB;;;;EAAA,eA/EnC,UAAA;EAhBgB;;;;;;;;;EAAA,OA6BxB,KAAA,WAAgB,WAAA,kBAA6B,YAAA,CAAa,CAAA,EAAA,CAC/D,IAAA,EAAM,CAAA,EACN,IAAA,EAAM,CAAA,EACN,KAAA,EAAO,YAAA,CAAa,CAAA,EAAG,CAAA;EAAA,OAElB,KAAA,CAAM,IAAA,mBAAuB,KAAA;EALA;;;;;;;;;EAAA,OAsC7B,gBAAA,WAA2B,WAAA,kBAA6B,YAAA,CAAa,CAAA,EAAA,CAC1E,IAAA,EAAM,CAAA,EACN,IAAA,EAAM,CAAA,EACN,KAAA,EAAO,YAAA,CAAa,CAAA,EAAG,CAAA;EAAA,OAElB,gBAAA,CAAiB,IAAA,mBAAuB,KAAA;EAtCxC;;;;;;;EAAA,OAuDA,MAAA,WAAiB,WAAA,kBAA6B,YAAA,CAAa,CAAA,EAAA,CAChE,IAAA,EAAM,CAAA,EACN,IAAA,EAAM,CAAA,EACN,WAAA,GAAc,IAAA,EAAM,YAAA,CAAa,CAAA,MAAO,YAAA,CAAa,CAAA,EAAG,CAAA,GACxD,SAAA;EAAA,OAEK,MAAA,CAAO,IAAA,mBAAuB,WAAA,EAAa,aAAA,EAAe,SAAA;EA3BzD;;;;;EAAA,OA+DD,QAAA,CAAS,IAAA;EA7DS;;;;EAAA,OA2ElB,WAAA,CAAA"}
@@ -0,0 +1,124 @@
1
+ //#region src/logger/logger.tokens.d.ts
2
+ declare const LOGGER_TOKENS: {
3
+ readonly LoggerService: symbol;
4
+ readonly Formatter: symbol;
5
+ readonly LogLevelOptions: symbol;
6
+ };
7
+ //#endregion
8
+ //#region src/logger/contracts/log-level.d.ts
9
+ /**
10
+ * Log severity levels
11
+ * Ordered from least to most severe
12
+ */
13
+ declare enum LogLevel {
14
+ DEBUG = "debug",
15
+ INFO = "info",
16
+ WARN = "warn",
17
+ ERROR = "error"
18
+ }
19
+ /**
20
+ * Map log levels to numeric priorities (for filtering)
21
+ * Higher numbers = more severe = higher priority
22
+ */
23
+ declare const LOG_LEVEL_PRIORITY: Record<LogLevel, number>;
24
+ //#endregion
25
+ //#region src/logger/contracts/log-context.d.ts
26
+ /**
27
+ * Structured metadata attached to log entries
28
+ * Supports arbitrary key-value pairs for context enrichment
29
+ */
30
+ type LogContext = Record<string, unknown>;
31
+ /**
32
+ * Internal context automatically added by LoggerService
33
+ * Contains request metadata, etc.
34
+ */
35
+ interface InternalLogContext extends LogContext {
36
+ userId?: string;
37
+ timestamp: number;
38
+ }
39
+ //#endregion
40
+ //#region src/logger/contracts/log-entry.d.ts
41
+ /**
42
+ * Complete log entry structure passed to transports
43
+ * Combines message, level, and enriched context
44
+ */
45
+ interface LogEntry {
46
+ level: LogLevel;
47
+ message: string;
48
+ context: InternalLogContext;
49
+ error?: {
50
+ message: string;
51
+ stack?: string;
52
+ name?: string;
53
+ };
54
+ }
55
+ //#endregion
56
+ //#region src/logger/formatters/formatter.interface.d.ts
57
+ /**
58
+ * Formatter contract
59
+ * Transforms LogEntry into string representation for transport output
60
+ */
61
+ interface ILogFormatter {
62
+ /**
63
+ * Format log entry into string
64
+ * @param entry - Complete log entry with context
65
+ * @returns Formatted string ready for transport
66
+ */
67
+ format(entry: LogEntry): string;
68
+ }
69
+ //#endregion
70
+ //#region src/logger/services/logger.service.d.ts
71
+ declare class LoggerService {
72
+ private readonly logLevel;
73
+ private readonly formatter;
74
+ constructor(logLevel: LogLevel, formatter: ILogFormatter);
75
+ debug(message: string, context?: LogContext): void;
76
+ info(message: string, context?: LogContext): void;
77
+ warn(message: string, context?: LogContext): void;
78
+ error(message: string, error: Error, context?: LogContext): void;
79
+ error(message: string, context?: LogContext): void;
80
+ private log;
81
+ private writeToConsole;
82
+ private enrichContext;
83
+ private serializeError;
84
+ }
85
+ //#endregion
86
+ //#region src/logger/formatters/json-formatter.d.ts
87
+ /**
88
+ * JSON Formatter
89
+ *
90
+ * Produces structured JSON logs for production environments.
91
+ * Optimized for log aggregation systems (Cloudflare Analytics, Datadog, etc.)
92
+ *
93
+ * Output format:
94
+ * {
95
+ * "level": "info",
96
+ * "message": "User logged in",
97
+ * "timestamp": 1234567890,
98
+ * "userId": "user_456",
99
+ * "error": { "message": "...", "stack": "..." }
100
+ * }
101
+ */
102
+ declare class JsonFormatter implements ILogFormatter {
103
+ format(entry: LogEntry): string;
104
+ }
105
+ //#endregion
106
+ //#region src/logger/formatters/pretty-formatter.d.ts
107
+ /**
108
+ * Pretty Formatter
109
+ *
110
+ * Human-readable colored output for development environments.
111
+ * Uses ANSI color codes for terminal output.
112
+ *
113
+ * Output format:
114
+ * [2024-01-15 10:30:45] INFO: User logged in
115
+ * userId: user_456
116
+ */
117
+ declare class PrettyFormatter implements ILogFormatter {
118
+ private readonly colors;
119
+ private readonly reset;
120
+ format(entry: LogEntry): string;
121
+ }
122
+ //#endregion
123
+ export { InternalLogContext as a, LogLevel as c, LogEntry as i, LOGGER_TOKENS as l, JsonFormatter as n, LogContext as o, LoggerService as r, LOG_LEVEL_PRIORITY as s, PrettyFormatter as t };
124
+ //# sourceMappingURL=index-BtlE9RuO.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BtlE9RuO.d.mts","names":[],"sources":["../src/logger/logger.tokens.ts","../src/logger/contracts/log-level.ts","../src/logger/contracts/log-context.ts","../src/logger/contracts/log-entry.ts","../src/logger/formatters/formatter.interface.ts","../src/logger/services/logger.service.ts","../src/logger/formatters/json-formatter.ts","../src/logger/formatters/pretty-formatter.ts"],"mappings":";cAAa,aAAA;EAAA;;;;;;;AAAb;;;aCIY,QAAA;EACV,KAAA;EACA,IAAA;EACA,IAAA;EACA,KAAA;AAAA;;;;AAJF;cAWa,kBAAA,EAAoB,MAAA,CAAO,QAAA;;;;ADfxC;;;KEIY,UAAA,GAAa,MAAA;;;;;UAMR,kBAAA,SAA2B,UAAA;EAC1C,MAAA;EACA,SAAA;AAAA;;;;;;;UCLe,QAAA;EACf,KAAA,EAAO,QAAA;EACP,OAAA;EACA,OAAA,EAAS,kBAAA;EACT,KAAA;IACE,OAAA;IACA,KAAA;IACA,IAAA;EAAA;AAAA;;;AHdJ;;;;AAAA,UIMiB,aAAA;;;;;;EAMf,MAAA,CAAO,KAAA,EAAO,QAAA;AAAA;;;cCJH,aAAA;EAAA,iBAGQ,QAAA;EAAA,iBAGA,SAAA;cAHA,QAAA,EAAU,QAAA,EAGV,SAAA,EAAW,aAAA;EAG9B,KAAA,CAAM,OAAA,UAAiB,OAAA,GAAU,UAAA;EAIjC,IAAA,CAAK,OAAA,UAAiB,OAAA,GAAU,UAAA;EAIhC,IAAA,CAAK,OAAA,UAAiB,OAAA,GAAU,UAAA;EAIhC,KAAA,CAAM,OAAA,UAAiB,KAAA,EAAO,KAAA,EAAO,OAAA,GAAU,UAAA;EAC/C,KAAA,CAAM,OAAA,UAAiB,OAAA,GAAU,UAAA;EAAA,QAezB,GAAA;EAAA,QAqBA,cAAA;EAAA,QAiBA,aAAA;EAAA,QAOA,cAAA;AAAA;;;;;;;;;;;;;;AJtFV;;;;cKca,aAAA,YAAyB,aAAA;EACpC,MAAA,CAAO,KAAA,EAAO,QAAA;AAAA;;;;;;;;;;;;;cCLH,eAAA,YAA2B,aAAA;EAAA,iBACrB,MAAA;EAAA,iBAOA,KAAA;EAEjB,MAAA,CAAO,KAAA,EAAO,QAAA;AAAA"}
@@ -1,93 +1,30 @@
1
- import { d as ApplicationError, gn as AsyncModuleOptions, vn as DynamicModule } from "./index-ByOyTmqf.mjs";
2
- import { t as StratalEnv } from "./env-D1rcZ8_r.mjs";
3
- import { b as II18nService } from "./index-Bnpfq6uk.mjs";
4
- import { r as QueueMessage, t as ConsumerRegistry } from "./consumer-registry-B7yUNh0q.mjs";
1
+ import { Sn as AsyncModuleOptions, wn as DynamicModule, xr as ApplicationError } from "./index-DEncMcC6.mjs";
2
+ import { t as StratalEnv } from "./env-DKSbuBi5.mjs";
3
+ import { p as II18nService } from "./zod-DvWTfRpI.mjs";
4
+ import { r as LoggerService } from "./index-BtlE9RuO.mjs";
5
+ import { r as QueueMessage, t as ConsumerRegistry } from "./consumer-registry-DHQtypr1.mjs";
5
6
 
6
7
  //#region src/queue/queue-manager.d.ts
7
- /**
8
- * Queue Manager
9
- *
10
- * Singleton service for processing queue message batches.
11
- * Routes messages to consumers based on message type.
12
- *
13
- * **Message Routing:**
14
- * - Consumers declare message types they handle (e.g., ['email.send'])
15
- * - When a message arrives, consumers matching the message type are invoked
16
- * - A consumer can handle messages from ANY queue (routing is by type, not queue)
17
- *
18
- * **Note:** For sending messages to queues, use IQueueSender instances
19
- * obtained via @InjectQueue('queue-name') or module bindings.
20
- *
21
- * @example Processing a queue batch
22
- * ```typescript
23
- * // In Cloudflare Worker queue handler
24
- * await queueManager.processBatch('notifications-queue', batch)
25
- * ```
26
- */
27
8
  declare class QueueManager {
28
9
  private readonly registry;
29
- constructor(registry: ConsumerRegistry);
30
- /**
31
- * Process a batch of queue messages
32
- *
33
- * Routes messages to registered consumers based on message type.
34
- * Uses ConsumerRegistry to find matching consumers.
35
- *
36
- * @param _queueName - Name of the queue (for logging, not used for routing)
37
- * @param batch - Batch of messages from Cloudflare Queue
38
- */
39
- processBatch(_queueName: string, batch: MessageBatch): Promise<void>;
10
+ private readonly logger;
11
+ constructor(registry: ConsumerRegistry, logger: LoggerService);
12
+ processBatch(queueName: string, batch: MessageBatch): Promise<void>;
40
13
  }
41
14
  //#endregion
42
- //#region src/queue/queue-name.d.ts
15
+ //#region src/queue/queue-binding.d.ts
43
16
  /**
44
- * Queue Name Type System with Module Augmentation
45
- *
46
- * This file provides a type-safe queue naming system using module augmentation.
47
- * Applications augment the QueueNames interface to get autocomplete for queue names.
48
- *
49
- * @example In apps/backend/src/types/queues.ts:
50
- * ```typescript
51
- * declare module 'stratal' {
52
- * interface QueueNames {
53
- * 'notifications-queue': true
54
- * 'batch-notifications-queue': true
55
- * }
56
- * }
57
- * ```
58
- *
59
- * When QueueNames is augmented, QueueName provides autocomplete.
60
- * When not augmented, QueueName falls back to string for flexibility.
61
- */
62
- /**
63
- * Augmentable interface for queue names.
64
- *
65
- * Applications extend this interface via module augmentation to define
66
- * their queue names. The keys become the valid queue name union type.
67
- *
68
- * @example
69
- * ```typescript
70
- * // In your application's type declarations
71
- * declare module 'stratal' {
72
- * interface QueueNames {
73
- * 'notifications-queue': true
74
- * 'batch-notifications-queue': true
75
- * }
76
- * }
77
- * ```
17
+ * String keys of `StratalEnv` whose value type is `Queue`.
78
18
  */
79
- interface QueueNames {}
19
+ type QueueBindingFromEnv = Extract<{ [K in keyof StratalEnv]: StratalEnv[K] extends Queue ? K : never }[keyof StratalEnv], string>;
80
20
  /**
81
- * Queue name type - extracts keys from QueueNames or falls back to string.
21
+ * Type-safe queue binding identifier.
82
22
  *
83
- * When QueueNames is augmented with queue name keys, this type provides:
84
- * - Type safety: Only declared queue names are valid
85
- * - Autocomplete: IDE suggestions for available queue names
86
- *
87
- * When QueueNames is empty (not augmented), falls back to string
88
- * for flexibility during development or in non-typed contexts.
23
+ * Resolves to the union of `Queue`-typed binding keys on the augmented
24
+ * `StratalEnv`. Falls back to `string` when no `Queue` bindings are visible
25
+ * (e.g. library code compiled outside an app's env context).
89
26
  */
90
- type QueueName = keyof QueueNames extends never ? string : keyof QueueNames;
27
+ type QueueBinding = [QueueBindingFromEnv] extends [never] ? string : QueueBindingFromEnv;
91
28
  //#endregion
92
29
  //#region src/queue/queue-sender.interface.d.ts
93
30
  /**
@@ -149,7 +86,7 @@ interface IQueueSender {
149
86
  * @example Implementing a custom provider
150
87
  * ```typescript
151
88
  * export class CustomQueueProvider implements IQueueProvider {
152
- * async send<T>(queueName: string, message: QueueMessage<T>): Promise<void> {
89
+ * async send<T>(binding: string, message: QueueMessage<T>): Promise<void> {
153
90
  * // Custom implementation
154
91
  * }
155
92
  * }
@@ -160,30 +97,27 @@ interface IQueueProvider {
160
97
  * Send a message to a queue
161
98
  *
162
99
  * Provider handles the actual delivery mechanism:
163
- * - CloudflareQueueProvider: Resolves CF binding and calls queue.send()
100
+ * - CloudflareQueueProvider: Looks up the binding on env and calls queue.send()
164
101
  * - SyncQueueProvider: Finds matching consumers and calls handle() directly
165
102
  *
166
- * @param queueName - Queue name
103
+ * @param binding - Queue binding identifier
167
104
  * @param message - Complete message with id, timestamp, and metadata
168
105
  */
169
- send<T>(queueName: string, message: QueueMessage<T>): Promise<void>;
106
+ send<T>(binding: string, message: QueueMessage<T>): Promise<void>;
170
107
  }
171
108
  //#endregion
172
109
  //#region src/queue/providers/cloudflare-queue.provider.d.ts
173
110
  /**
174
111
  * Cloudflare Queue Provider
175
112
  *
176
- * Sends messages to Cloudflare Queues by resolving bindings from the environment.
177
- * Used in production environments where Cloudflare Workers handle queue processing.
178
- *
179
- * **Binding Resolution:**
180
- * Queue names are converted to binding names:
181
- * - `notifications-queue` → `NOTIFICATIONS_QUEUE`
113
+ * Sends messages to Cloudflare Queues by resolving the binding directly on
114
+ * the worker's `env`. Used in production environments where Cloudflare Workers
115
+ * handle queue processing.
182
116
  *
183
117
  * @example
184
118
  * ```typescript
185
119
  * const provider = new CloudflareQueueProvider(env)
186
- * await provider.send('notifications-queue', message)
120
+ * await provider.send('NOTIFICATIONS_QUEUE', message)
187
121
  * ```
188
122
  */
189
123
  declare class CloudflareQueueProvider implements IQueueProvider {
@@ -192,21 +126,11 @@ declare class CloudflareQueueProvider implements IQueueProvider {
192
126
  /**
193
127
  * Send a message to a Cloudflare Queue
194
128
  *
195
- * @param queueName - Queue name (e.g., 'notifications-queue')
129
+ * @param binding - Queue binding identifier (e.g., 'NOTIFICATIONS_QUEUE')
196
130
  * @param message - Complete message with id, timestamp, and payload
197
- * @throws {QueueBindingNotFoundError} If queue binding is not configured
198
- */
199
- send<T>(queueName: string, message: QueueMessage<T>): Promise<void>;
200
- /**
201
- * Resolve queue binding from Cloudflare environment
202
- *
203
- * Converts kebab-case queue name to UPPER_SNAKE_CASE binding name.
204
- *
205
- * @param queueName - Queue name (e.g., 'notifications-queue')
206
- * @returns Cloudflare Queue binding
207
- * @throws {QueueBindingNotFoundError} If binding not found in env
131
+ * @throws {QueueError} If the binding is not configured on env
208
132
  */
209
- private getQueue;
133
+ send<T>(binding: string, message: QueueMessage<T>): Promise<void>;
210
134
  }
211
135
  //#endregion
212
136
  //#region src/queue/providers/sync-queue.provider.d.ts
@@ -230,7 +154,7 @@ declare class CloudflareQueueProvider implements IQueueProvider {
230
154
  * @example Testing with sync provider
231
155
  * ```typescript
232
156
  * const provider = new SyncQueueProvider(registry)
233
- * await provider.send('notifications-queue', {
157
+ * await provider.send('NOTIFICATIONS_QUEUE', {
234
158
  * id: '123',
235
159
  * timestamp: Date.now(),
236
160
  * type: 'email.send',
@@ -248,19 +172,19 @@ declare class SyncQueueProvider implements IQueueProvider {
248
172
  * Finds all matching consumers by message type and calls their handle() method.
249
173
  * If any consumer throws, onError() is called and the error is re-thrown.
250
174
  *
251
- * @param _queueName - Queue name (not used for routing, consumers match by message type)
175
+ * @param _binding - Queue binding (not used for routing, consumers match by message type)
252
176
  * @param message - Complete message with id, timestamp, and payload
253
177
  * @throws Re-throws any error from consumer.handle() after calling onError()
254
178
  */
255
- send<T>(_queueName: string, message: QueueMessage<T>): Promise<void>;
179
+ send<T>(_binding: string, message: QueueMessage<T>): Promise<void>;
256
180
  }
257
181
  //#endregion
258
182
  //#region src/queue/queue-sender.d.ts
259
183
  /**
260
184
  * Queue Sender
261
185
  *
262
- * Implementation of IQueueSender bound to a specific queue name.
263
- * Created by QueueRegistry for each registered queue.
186
+ * Implementation of IQueueSender bound to a specific queue binding.
187
+ * Created by QueueRegistry for each registered binding.
264
188
  *
265
189
  * Automatically enriches messages with:
266
190
  * - `id`: UUID generated via crypto.randomUUID()
@@ -270,7 +194,7 @@ declare class SyncQueueProvider implements IQueueProvider {
270
194
  * @example
271
195
  * ```typescript
272
196
  * // Created by QueueRegistry, not directly instantiated
273
- * const sender = registry.getQueue('notifications-queue')
197
+ * const sender = registry.getQueue('NOTIFICATIONS_QUEUE')
274
198
  *
275
199
  * await sender.dispatch({
276
200
  * type: 'email.send',
@@ -279,10 +203,10 @@ declare class SyncQueueProvider implements IQueueProvider {
279
203
  * ```
280
204
  */
281
205
  declare class QueueSender implements IQueueSender {
282
- private readonly queueName;
206
+ private readonly binding;
283
207
  private readonly provider;
284
208
  private readonly i18n;
285
- constructor(queueName: string, provider: IQueueProvider, i18n: II18nService);
209
+ constructor(binding: string, provider: IQueueProvider, i18n: II18nService);
286
210
  /**
287
211
  * Dispatch a message to this queue.
288
212
  *
@@ -324,24 +248,26 @@ declare class QueueModule {
324
248
  */
325
249
  static forRootAsync(options: AsyncModuleOptions<QueueModuleOptions>): DynamicModule;
326
250
  /**
327
- * Register a queue for injection.
251
+ * Register a queue binding for injection.
328
252
  *
329
- * The queue name serves as both the identifier and the DI injection token.
330
- * Queue names are typed via module augmentation of QueueNames interface.
253
+ * The binding name doubles as the DI injection token and the
254
+ * `env`-lookup key. Binding names are typed against `StratalEnv`
255
+ * (autocomplete works once an app augments `StratalEnv` with its
256
+ * Cloudflare bindings).
331
257
  *
332
- * @param name - Queue name (typed with autocomplete if QueueNames is augmented)
258
+ * @param binding - Queue binding identifier (e.g. `NOTIFICATIONS_QUEUE`).
333
259
  * @returns Dynamic module that provides the queue sender
334
260
  *
335
261
  * @example
336
262
  * ```typescript
337
263
  * // In AppModule imports
338
- * QueueModule.registerQueue('notifications-queue')
264
+ * QueueModule.registerQueue('NOTIFICATIONS_QUEUE')
339
265
  *
340
- * // Then inject using the queue name
341
- * constructor(@InjectQueue('notifications-queue') private queue: IQueueSender) {}
266
+ * // Then inject using the binding name
267
+ * constructor(@InjectQueue('NOTIFICATIONS_QUEUE') private queue: IQueueSender) {}
342
268
  * ```
343
269
  */
344
- static registerQueue(name: QueueName): DynamicModule;
270
+ static registerQueue(binding: QueueBinding): DynamicModule;
345
271
  }
346
272
  //#endregion
347
273
  //#region src/queue/services/queue-provider-factory.d.ts
@@ -377,7 +303,7 @@ declare class QueueProviderFactory {
377
303
  * Create a queue provider based on module configuration
378
304
  *
379
305
  * @returns Queue provider instance
380
- * @throws {QueueProviderNotSupportedError} If provider type is not supported
306
+ * @throws {QueueError} If provider type is not supported
381
307
  */
382
308
  create(): IQueueProvider;
383
309
  }
@@ -387,10 +313,10 @@ declare class QueueProviderFactory {
387
313
  * Queue Registry
388
314
  *
389
315
  * Request-scoped factory service for creating QueueSender instances.
390
- * Caches senders per queue name within the request scope.
316
+ * Caches senders per binding within the request scope.
391
317
  *
392
318
  * This service is used internally by QueueModule.registerQueue() to provide
393
- * IQueueSender instances for each registered queue.
319
+ * IQueueSender instances for each registered binding.
394
320
  *
395
321
  * **Why request-scoped?**
396
322
  * - Needs access to I18nService for locale-aware message metadata
@@ -400,12 +326,12 @@ declare class QueueProviderFactory {
400
326
  * @example
401
327
  * ```typescript
402
328
  * // Used internally by QueueModule.registerQueue()
403
- * QueueModule.registerQueue('notifications-queue')
329
+ * QueueModule.registerQueue('NOTIFICATIONS_QUEUE')
404
330
  *
405
331
  * // The module creates a factory provider:
406
332
  * {
407
- * provide: 'notifications-queue',
408
- * useFactory: (registry: QueueRegistry) => registry.getQueue('notifications-queue'),
333
+ * provide: 'NOTIFICATIONS_QUEUE',
334
+ * useFactory: (registry: QueueRegistry) => registry.getQueue('NOTIFICATIONS_QUEUE'),
409
335
  * inject: [QUEUE_TOKENS.QueueRegistry],
410
336
  * }
411
337
  * ```
@@ -416,34 +342,34 @@ declare class QueueRegistry {
416
342
  private readonly senders;
417
343
  constructor(providerFactory: QueueProviderFactory, i18n: II18nService);
418
344
  /**
419
- * Get or create a QueueSender for the specified queue name.
345
+ * Get or create a QueueSender for the specified binding.
420
346
  *
421
- * Senders are cached per queue name within the request scope.
347
+ * Senders are cached per binding within the request scope.
422
348
  *
423
- * @param queueName - The queue name to get a sender for
424
- * @returns QueueSender bound to the specified queue
349
+ * @param binding - The queue binding to get a sender for
350
+ * @returns QueueSender bound to the specified binding
425
351
  */
426
- getQueue(queueName: string): IQueueSender;
352
+ getQueue(binding: string): IQueueSender;
427
353
  }
428
354
  //#endregion
429
355
  //#region src/queue/decorators/inject-queue.decorator.d.ts
430
356
  /**
431
- * Inject a queue sender by name.
357
+ * Inject a queue sender by binding name.
432
358
  *
433
- * Queue names are typed via module augmentation of QueueNames interface.
434
- * The queue name serves as both the identifier and the DI injection token.
359
+ * The binding name matches the `binding` field declared under `queues.producers`
360
+ * in `wrangler.jsonc` (e.g. `BACKGROUND_QUEUE`). Stratal looks the binding up
361
+ * directly on the worker's `env`; the underlying Cloudflare queue can be any
362
+ * env-specific name (e.g. `background-queue-dev`) without affecting code.
435
363
  *
436
- * @param name - Queue name (typed with autocomplete if QueueNames is augmented)
364
+ * @param binding - Queue binding identifier (typed against `StratalEnv`).
437
365
  * @returns Parameter decorator for constructor injection
438
366
  *
439
367
  * @example
440
368
  * ```typescript
441
- * // Direct injection by queue name
442
369
  * constructor(
443
- * @InjectQueue('notifications-queue') private queue: IQueueSender
370
+ * @InjectQueue('NOTIFICATIONS_QUEUE') private queue: IQueueSender
444
371
  * ) {}
445
372
  *
446
- * // Usage
447
373
  * await this.queue.dispatch({
448
374
  * type: 'email.send',
449
375
  * payload: { to: 'user@example.com', subject: 'Hello' }
@@ -451,11 +377,11 @@ declare class QueueRegistry {
451
377
  * ```
452
378
  *
453
379
  * @remarks
454
- * The queue must be registered via `QueueModule.registerQueue(name)` before injection.
455
- * For module-internal queue bindings (e.g., EmailModule), use `@inject(TOKEN)` with
456
- * `useExisting` provider binding instead.
380
+ * The binding must be registered via `QueueModule.registerQueue(binding)`
381
+ * before injection. For module-internal bindings (e.g. EmailModule),
382
+ * use `@inject(TOKEN)` with `useExisting` provider binding instead.
457
383
  */
458
- declare function InjectQueue(name: QueueName): ParameterDecorator;
384
+ declare function InjectQueue(binding: QueueBinding): ParameterDecorator;
459
385
  //#endregion
460
386
  //#region src/queue/queue.tokens.d.ts
461
387
  declare const QUEUE_TOKENS: {
@@ -465,30 +391,8 @@ declare const QUEUE_TOKENS: {
465
391
  };
466
392
  type QueueToken = (typeof QUEUE_TOKENS)[keyof typeof QUEUE_TOKENS];
467
393
  //#endregion
468
- //#region src/queue/errors/queue-binding-not-found.error.d.ts
469
- /**
470
- * QueueBindingNotFoundError
471
- *
472
- * Thrown when attempting to access a Cloudflare Queue binding that hasn't been configured.
473
- * This typically indicates that the queue binding is missing from wrangler.jsonc
474
- * or the environment variables are not properly set.
475
- */
476
- declare class QueueBindingNotFoundError extends ApplicationError {
477
- constructor(queueName: string, bindingName: string);
478
- }
479
- //#endregion
480
- //#region src/queue/errors/queue-provider-not-supported.error.d.ts
481
- /**
482
- * QueueProviderNotSupportedError
483
- *
484
- * Thrown when attempting to use a queue provider that is not supported.
485
- * Valid providers are: 'cloudflare', 'sync'
486
- *
487
- * This typically indicates an invalid QUEUE_PROVIDER environment variable.
488
- */
489
- declare class QueueProviderNotSupportedError extends ApplicationError {
490
- constructor(provider: string);
491
- }
394
+ //#region src/queue/queue.error.d.ts
395
+ declare class QueueError extends ApplicationError {}
492
396
  //#endregion
493
- export { QueueNames as _, InjectQueue as a, QueueModule as c, SyncQueueProvider as d, CloudflareQueueProvider as f, QueueName as g, IQueueSender as h, QueueToken as i, QueueModuleOptions as l, DispatchMessage as m, QueueBindingNotFoundError as n, QueueRegistry as o, IQueueProvider as p, QUEUE_TOKENS as r, QueueProviderFactory as s, QueueProviderNotSupportedError as t, QueueSender as u, QueueManager as v };
494
- //# sourceMappingURL=index-DUzWs0z7.d.mts.map
397
+ export { QueueRegistry as a, QueueModuleOptions as c, CloudflareQueueProvider as d, IQueueProvider as f, QueueManager as g, QueueBinding as h, InjectQueue as i, QueueSender as l, IQueueSender as m, QUEUE_TOKENS as n, QueueProviderFactory as o, DispatchMessage as p, QueueToken as r, QueueModule as s, QueueError as t, SyncQueueProvider as u };
398
+ //# sourceMappingURL=index-CW1YHSft.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CW1YHSft.d.mts","names":[],"sources":["../src/queue/queue-manager.ts","../src/queue/queue-binding.ts","../src/queue/queue-sender.interface.ts","../src/queue/providers/queue-provider.interface.ts","../src/queue/providers/cloudflare-queue.provider.ts","../src/queue/providers/sync-queue.provider.ts","../src/queue/queue-sender.ts","../src/queue/queue.module.ts","../src/queue/services/queue-provider-factory.ts","../src/queue/queue-registry.ts","../src/queue/decorators/inject-queue.decorator.ts","../src/queue/queue.tokens.ts","../src/queue/queue.error.ts"],"mappings":";;;;;;;cAQa,YAAA;EAAA,iBAE4C,QAAA;EAAA,iBACC,MAAA;cADD,QAAA,EAAU,gBAAA,EACT,MAAA,EAAQ,aAAA;EAG1D,YAAA,CAAa,SAAA,UAAmB,KAAA,EAAO,YAAA,GAAe,OAAA;AAAA;;;;;;KCUzD,mBAAA,GAAsB,OAAA,eACX,UAAA,GAAa,UAAA,CAAW,CAAA,UAAW,KAAA,GAAQ,CAAA,iBAAkB,UAAA;;;;;;;;KAWjE,YAAA,IAAgB,mBAAA,6BAExB,mBAAA;;;;;;;;;KC9BQ,eAAA,gBAA+B,IAAA,CAAK,YAAA,CAAa,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;UA0B5C,YAAA;EDVZ;;;;;;;;;;ECqBH,QAAA,IAAY,OAAA,EAAS,eAAA,CAAgB,CAAA,IAAK,OAAA;AAAA;;;;;;;;;AFtC5C;;;;;;;;;;;;;UGciB,cAAA;EHViD;;;;;;;;;;EGqBhE,IAAA,IAAQ,OAAA,UAAiB,OAAA,EAAS,YAAA,CAAa,CAAA,IAAK,OAAA;AAAA;;;;;;;AHzBtD;;;;;;;;;cIea,uBAAA,YAAmC,cAAA;EAAA,iBAEM,GAAA;cAAA,GAAA,EAAK,UAAA;EJdQ;;;;;;;EIwB3D,IAAA,GAAA,CAAQ,OAAA,UAAiB,OAAA,EAAS,YAAA,CAAa,CAAA,IAAK,OAAA;AAAA;;;;;;;AJ3B5D;;;;;;;;;;;;;;;;;;;;;;;;;cK8Ba,iBAAA,YAA6B,cAAA;EAAA,iBAEe,QAAA;cAAA,QAAA,EAAU,gBAAA;;;;;;;;;;;EAa3D,IAAA,GAAA,CAAQ,QAAA,UAAkB,OAAA,EAAS,YAAA,CAAa,CAAA,IAAK,OAAA;AAAA;;;;;;;AL7C7D;;;;;;;;;;;;;;;;;;cMoBa,WAAA,YAAuB,YAAA;EAAA,iBAEf,OAAA;EAAA,iBACA,QAAA;EAAA,iBACA,IAAA;cAFA,OAAA,UACA,QAAA,EAAU,cAAA,EACV,IAAA,EAAM,YAAA;;;;ALZa;;EKoBhC,QAAA,GAAA,CAAY,OAAA,EAAS,eAAA,CAAgB,CAAA,IAAK,OAAA;AAAA;;;;;;UCCjC,kBAAA;;ANrBuB;;;;EM2BtC,QAAA;AAAA;AAAA,cAUW,WAAA;EN/B8C;;;;;;;;;;;;;;;AAW3D;;;EAX2D,OMkDlD,YAAA,CAAa,OAAA,EAAS,kBAAA,CAAmB,kBAAA,IAAsB,aAAA;ENrCjD;;;;AC9BvB;;;;;;;;;;;;;;AA0BA;;EDIuB,OMsEd,aAAA,CAAc,OAAA,EAAS,YAAA,GAAe,aAAA;AAAA;;;;;;APrG/C;;;;;;;;;;;;;;;;;;;;cQ2Ba,oBAAA;EAAA,iBAEyC,GAAA;EAAA,iBACG,QAAA;EAAA,iBAC2B,OAAA;cAF9B,GAAA,EAAK,UAAA,EACF,QAAA,EAAU,gBAAA,EACiB,OAAA,GAAU,kBAAA;;APnBtD;;;;;EO4BtC,MAAA,CAAA,GAAU,cAAA;AAAA;;;;;;;ARxCZ;;;;;;;;;;;;;;;;;;;;;;;cS+Ba,aAAA;EAAA,iBAMyC,IAAA;EAAA,iBALnC,QAAA;EAAA,iBACA,OAAA;cAG4B,eAAA,EAAiB,oBAAA,EACV,IAAA,EAAM,YAAA;;;;;;;;;EAa1D,QAAA,CAAS,OAAA,WAAkB,YAAA;AAAA;;;;;;;;;ATlD7B;;;;;;;;;;;;;;;;;;;;;;iBUwBgB,WAAA,CAAY,OAAA,EAAS,YAAA,GAAe,kBAAA;;;cC/BvC,YAAA;EAAA;;;;KAMD,UAAA,WAAqB,YAAA,eAA2B,YAAA;;;cCJ/C,UAAA,SAAmB,gBAAA"}