stratal 0.0.21 → 0.0.23

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 (296) hide show
  1. package/README.md +2 -2
  2. package/dist/bin/cloudflare-workers-loader.mjs +80 -7
  3. package/dist/bin/cloudflare-workers-loader.mjs.map +1 -1
  4. package/dist/bin/quarry.mjs +84 -160
  5. package/dist/bin/quarry.mjs.map +1 -1
  6. package/dist/cache/index.d.mts +8 -46
  7. package/dist/cache/index.d.mts.map +1 -1
  8. package/dist/cache/index.mjs +134 -97
  9. package/dist/cache/index.mjs.map +1 -1
  10. package/dist/{cache.service-DsnKuNyO.d.mts → cache.service-uElmBtdS.d.mts} +29 -39
  11. package/dist/cache.service-uElmBtdS.d.mts.map +1 -0
  12. package/dist/{command-BgSlsS4M.mjs → command-BvmUAPPQ.mjs} +15 -4
  13. package/dist/command-BvmUAPPQ.mjs.map +1 -0
  14. package/dist/{command-Cmmf0oHX.d.mts → command-CPhFHjG3.d.mts} +3 -2
  15. package/dist/command-CPhFHjG3.d.mts.map +1 -0
  16. package/dist/command-not-found.error-ONAZ2Bpk.mjs +14 -0
  17. package/dist/command-not-found.error-ONAZ2Bpk.mjs.map +1 -0
  18. package/dist/config/index.d.mts +24 -11
  19. package/dist/config/index.d.mts.map +1 -1
  20. package/dist/config/index.mjs +32 -57
  21. package/dist/config/index.mjs.map +1 -1
  22. package/dist/{consumer-registry-B7yUNh0q.d.mts → consumer-registry-D3iMTSdy.d.mts} +54 -22
  23. package/dist/consumer-registry-D3iMTSdy.d.mts.map +1 -0
  24. package/dist/container-storage-BmOJ4_Na.mjs +52 -0
  25. package/dist/container-storage-BmOJ4_Na.mjs.map +1 -0
  26. package/dist/{controller.decorator-B9vwn0zK.mjs → controller.decorator-C5UVeJS3.mjs} +8 -8
  27. package/dist/controller.decorator-C5UVeJS3.mjs.map +1 -0
  28. package/dist/cron/index.d.mts +103 -7
  29. package/dist/cron/index.d.mts.map +1 -1
  30. package/dist/cron/index.mjs +2 -2
  31. package/dist/cron-job-NesZRk8F.d.mts +58 -0
  32. package/dist/cron-job-NesZRk8F.d.mts.map +1 -0
  33. package/dist/{cron-manager-DQSK8uoV.mjs → cron.module-Bgzq5hiT.mjs} +47 -17
  34. package/dist/cron.module-Bgzq5hiT.mjs.map +1 -0
  35. package/dist/decorate-CuAoSZvs.mjs +16 -0
  36. package/dist/deep-merge-ByiAOZ3r.mjs +18 -0
  37. package/dist/deep-merge-ByiAOZ3r.mjs.map +1 -0
  38. package/dist/di/index.d.mts +2 -2
  39. package/dist/di/index.mjs +4 -3
  40. package/dist/di-DseMn-z9.mjs +524 -0
  41. package/dist/di-DseMn-z9.mjs.map +1 -0
  42. package/dist/email/index.d.mts +40 -122
  43. package/dist/email/index.d.mts.map +1 -1
  44. package/dist/email/index.mjs +446 -131
  45. package/dist/email/index.mjs.map +1 -1
  46. package/dist/en-CDZBMcc1.mjs +202 -0
  47. package/dist/en-CDZBMcc1.mjs.map +1 -0
  48. package/dist/{env-D1rcZ8_r.d.mts → env-ug22bJj7.d.mts} +1 -1
  49. package/dist/env-ug22bJj7.d.mts.map +1 -0
  50. package/dist/errors/index.d.mts +2 -2
  51. package/dist/errors/index.mjs +4 -2
  52. package/dist/errors-mXYxG0XB.mjs +333 -0
  53. package/dist/errors-mXYxG0XB.mjs.map +1 -0
  54. package/dist/events/index.d.mts +14 -3
  55. package/dist/events/index.d.mts.map +1 -1
  56. package/dist/events/index.mjs +2 -2
  57. package/dist/{events-CzCV8jI8.mjs → events-BXJGZjpG.mjs} +23 -13
  58. package/dist/events-BXJGZjpG.mjs.map +1 -0
  59. package/dist/exception-context-kEoMFwze.mjs +429 -0
  60. package/dist/exception-context-kEoMFwze.mjs.map +1 -0
  61. package/dist/{gateway-context-CXmXtaUP.mjs → gateway-context-TMu_AlJt.mjs} +38 -31
  62. package/dist/gateway-context-TMu_AlJt.mjs.map +1 -0
  63. package/dist/guards/index.d.mts +3 -3
  64. package/dist/guards/index.d.mts.map +1 -1
  65. package/dist/guards/index.mjs +1 -1
  66. package/dist/{guards-DU1_J9YA.mjs → guards-DALPXy3_.mjs} +6 -5
  67. package/dist/guards-DALPXy3_.mjs.map +1 -0
  68. package/dist/hono-app-CvV3hOfT.mjs +161 -0
  69. package/dist/hono-app-CvV3hOfT.mjs.map +1 -0
  70. package/dist/{http-method.decorator-BrgHMdLQ.mjs → http-method.decorator-ByWZb9DO.mjs} +7 -6
  71. package/dist/http-method.decorator-ByWZb9DO.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-DRQAZoSZ.mjs +222 -0
  84. package/dist/i18n.module-DRQAZoSZ.mjs.map +1 -0
  85. package/dist/i18n.tokens-CZ_v8oyS.mjs +19 -0
  86. package/dist/i18n.tokens-CZ_v8oyS.mjs.map +1 -0
  87. package/dist/{index-7-hU3GTV.d.mts → index-0ItCjaqw.d.mts} +1 -1
  88. package/dist/index-0ItCjaqw.d.mts.map +1 -0
  89. package/dist/index-B5JBRcWD.d.mts +544 -0
  90. package/dist/index-B5JBRcWD.d.mts.map +1 -0
  91. package/dist/index-BUt92sAE.d.mts +124 -0
  92. package/dist/index-BUt92sAE.d.mts.map +1 -0
  93. package/dist/{index-ByOyTmqf.d.mts → index-B_JoEl3V.d.mts} +751 -2229
  94. package/dist/index-B_JoEl3V.d.mts.map +1 -0
  95. package/dist/index-DtBNIFuP.d.mts +42 -0
  96. package/dist/index-DtBNIFuP.d.mts.map +1 -0
  97. package/dist/{index-C1KvMncZ.d.mts → index-HgOLNruQ.d.mts} +3 -108
  98. package/dist/index-HgOLNruQ.d.mts.map +1 -0
  99. package/dist/index.d.mts +6 -43
  100. package/dist/index.mjs +3 -2
  101. package/dist/{is-command-C6a7WTPw.mjs → is-command-CEPO9n8c.mjs} +2 -2
  102. package/dist/{is-command-C6a7WTPw.mjs.map → is-command-CEPO9n8c.mjs.map} +1 -1
  103. package/dist/{is-seeder-CebjZCDn.mjs → is-seeder-Gvh_AM71.mjs} +1 -1
  104. package/dist/{is-seeder-CebjZCDn.mjs.map → is-seeder-Gvh_AM71.mjs.map} +1 -1
  105. package/dist/lazy-module-loader-Ib383jH_.d.mts +60 -0
  106. package/dist/lazy-module-loader-Ib383jH_.d.mts.map +1 -0
  107. package/dist/locale-path.service-D-dHiIPc.mjs +165 -0
  108. package/dist/locale-path.service-D-dHiIPc.mjs.map +1 -0
  109. package/dist/locale-url-nZrZxqJP.mjs +44 -0
  110. package/dist/locale-url-nZrZxqJP.mjs.map +1 -0
  111. package/dist/locale-url.service-C2EWmGdq.mjs +41 -0
  112. package/dist/locale-url.service-C2EWmGdq.mjs.map +1 -0
  113. package/dist/logger/index.d.mts +2 -2
  114. package/dist/logger/index.mjs +170 -2
  115. package/dist/logger/index.mjs.map +1 -0
  116. package/dist/macroable/index.d.mts +2 -2
  117. package/dist/macroable/index.mjs +1 -1
  118. package/dist/{macroable-BmufBshB.mjs → macroable-cvDTFZ_A.mjs} +1 -1
  119. package/dist/{macroable-BmufBshB.mjs.map → macroable-cvDTFZ_A.mjs.map} +1 -1
  120. package/dist/metadata-DzzprcID.mjs +39 -0
  121. package/dist/metadata-DzzprcID.mjs.map +1 -0
  122. package/dist/module/index.d.mts +7 -24
  123. package/dist/module/index.d.mts.map +1 -1
  124. package/dist/module/index.mjs +10 -2
  125. package/dist/module/index.mjs.map +1 -0
  126. package/dist/module-registry-Dm-pqHd3.mjs +554 -0
  127. package/dist/module-registry-Dm-pqHd3.mjs.map +1 -0
  128. package/dist/module.decorator-CYHY6pG5.mjs +19 -0
  129. package/dist/module.decorator-CYHY6pG5.mjs.map +1 -0
  130. package/dist/openapi/index.d.mts +44 -8
  131. package/dist/openapi/index.d.mts.map +1 -1
  132. package/dist/openapi/index.mjs +3 -3
  133. package/dist/openapi-CstuTM8S.mjs +309 -0
  134. package/dist/openapi-CstuTM8S.mjs.map +1 -0
  135. package/dist/{openapi-tools.service-Zs-Ewv7F.mjs → openapi-tools.service-BC5EC3R3.mjs} +8 -2
  136. package/dist/openapi-tools.service-BC5EC3R3.mjs.map +1 -0
  137. package/dist/{openapi.service-Bt9bCIrd.d.mts → openapi.service-YhTiJ1bO.d.mts} +3 -3
  138. package/dist/openapi.service-YhTiJ1bO.d.mts.map +1 -0
  139. package/dist/quarry/index.d.mts +14 -163
  140. package/dist/quarry/index.d.mts.map +1 -1
  141. package/dist/quarry/index.mjs +6 -5
  142. package/dist/quarry/runner.d.mts +184 -0
  143. package/dist/quarry/runner.d.mts.map +1 -0
  144. package/dist/quarry/runner.mjs +945 -0
  145. package/dist/quarry/runner.mjs.map +1 -0
  146. package/dist/quarry-registry-CXg0RFXq.d.mts +69 -0
  147. package/dist/quarry-registry-CXg0RFXq.d.mts.map +1 -0
  148. package/dist/quarry.module-BuRPGMDm.mjs +312 -0
  149. package/dist/quarry.module-BuRPGMDm.mjs.map +1 -0
  150. package/dist/queue/index.d.mts +3 -3
  151. package/dist/queue/index.mjs +57 -48
  152. package/dist/queue/index.mjs.map +1 -1
  153. package/dist/queue.module-nddvxzCB.mjs +613 -0
  154. package/dist/queue.module-nddvxzCB.mjs.map +1 -0
  155. package/dist/queue.tokens-DjHnFmre.mjs +11 -0
  156. package/dist/queue.tokens-DjHnFmre.mjs.map +1 -0
  157. package/dist/{r2-storage.provider-DuonKeYm.mjs → r2-storage.provider-DCxQt9dD.mjs} +6 -6
  158. package/dist/r2-storage.provider-DCxQt9dD.mjs.map +1 -0
  159. package/dist/{rate-limit.decorator-6qzNcSOt.mjs → rate-limit.decorator-BPAie_p3.mjs} +6 -11
  160. package/dist/rate-limit.decorator-BPAie_p3.mjs.map +1 -0
  161. package/dist/rate-limiter/index.d.mts +11 -50
  162. package/dist/rate-limiter/index.d.mts.map +1 -1
  163. package/dist/rate-limiter/index.mjs +33 -42
  164. package/dist/rate-limiter/index.mjs.map +1 -1
  165. package/dist/route-name-DGoBOfPg.mjs +171 -0
  166. package/dist/route-name-DGoBOfPg.mjs.map +1 -0
  167. package/dist/route-registration.service-D6vSwiKP.mjs +918 -0
  168. package/dist/route-registration.service-D6vSwiKP.mjs.map +1 -0
  169. package/dist/route-registry-CYqLp2Nj.mjs +123 -0
  170. package/dist/route-registry-CYqLp2Nj.mjs.map +1 -0
  171. package/dist/router/index.d.mts +2 -2
  172. package/dist/router/index.mjs +18 -7
  173. package/dist/router-CWGBD-Bg.mjs +78 -0
  174. package/dist/router-CWGBD-Bg.mjs.map +1 -0
  175. package/dist/router-resolver-D4YlPNlm.mjs +88 -0
  176. package/dist/router-resolver-D4YlPNlm.mjs.map +1 -0
  177. package/dist/seeder/index.d.mts +16 -11
  178. package/dist/seeder/index.d.mts.map +1 -1
  179. package/dist/seeder/index.mjs +5 -3
  180. package/dist/seeder-7ubkms-Y.mjs +81 -0
  181. package/dist/seeder-7ubkms-Y.mjs.map +1 -0
  182. package/dist/seeder-registry-CyUmKsJq.mjs +57 -0
  183. package/dist/seeder-registry-CyUmKsJq.mjs.map +1 -0
  184. package/dist/seeder.module-CYYwk3Qk.mjs +15 -0
  185. package/dist/seeder.module-CYYwk3Qk.mjs.map +1 -0
  186. package/dist/{signed-url-BQPbv2In.mjs → signed-url-DIU0sK_6.mjs} +1 -1
  187. package/dist/{signed-url-BQPbv2In.mjs.map → signed-url-DIU0sK_6.mjs.map} +1 -1
  188. package/dist/storage/index.d.mts +15 -39
  189. package/dist/storage/index.d.mts.map +1 -1
  190. package/dist/storage/index.mjs +3 -3
  191. package/dist/storage/providers/index.d.mts +2 -2
  192. package/dist/storage/providers/index.d.mts.map +1 -1
  193. package/dist/storage/providers/index.mjs +1 -1
  194. package/dist/{storage-D8CBP72Z.mjs → storage-MDZypIE9.mjs} +66 -59
  195. package/dist/storage-MDZypIE9.mjs.map +1 -0
  196. package/dist/{storage-provider.interface-Bd6vA4ak.d.mts → storage-provider.interface-ClUwxz4S.d.mts} +2 -3
  197. package/dist/storage-provider.interface-ClUwxz4S.d.mts.map +1 -0
  198. package/dist/storage.error-Dnib4VHc.mjs +8 -0
  199. package/dist/storage.error-Dnib4VHc.mjs.map +1 -0
  200. package/dist/stratal-DL9M38_s.mjs +383 -0
  201. package/dist/stratal-DL9M38_s.mjs.map +1 -0
  202. package/dist/stratal-DwDJPY9N.d.mts +43 -0
  203. package/dist/stratal-DwDJPY9N.d.mts.map +1 -0
  204. package/dist/tiered-cache.service-Dv3BhxxE.d.mts +79 -0
  205. package/dist/tiered-cache.service-Dv3BhxxE.d.mts.map +1 -0
  206. package/dist/trailing-slash-CFyw8nYu.mjs +34 -0
  207. package/dist/trailing-slash-CFyw8nYu.mjs.map +1 -0
  208. package/dist/{types-cySNS_lp.d.mts → types-CmV_9xBD.d.mts} +1 -1
  209. package/dist/types-CmV_9xBD.d.mts.map +1 -0
  210. package/dist/uri-h7Q8Jug9.mjs +251 -0
  211. package/dist/uri-h7Q8Jug9.mjs.map +1 -0
  212. package/dist/{usage-generator-BUdlhnCK.mjs → usage-generator-DAWYasuP.mjs} +7 -4
  213. package/dist/usage-generator-DAWYasuP.mjs.map +1 -0
  214. package/dist/validation-CpOjviyT.mjs +49 -0
  215. package/dist/validation-CpOjviyT.mjs.map +1 -0
  216. package/dist/validation.context-CRvmrhq7.mjs +117 -0
  217. package/dist/validation.context-CRvmrhq7.mjs.map +1 -0
  218. package/dist/versioning.service-C6aHky8-.mjs +36 -0
  219. package/dist/versioning.service-C6aHky8-.mjs.map +1 -0
  220. package/dist/websocket/index.d.mts +16 -14
  221. package/dist/websocket/index.d.mts.map +1 -1
  222. package/dist/websocket/index.mjs +2 -2
  223. package/dist/workers/index.d.mts +2 -2
  224. package/dist/workers/index.d.mts.map +1 -1
  225. package/dist/workers/index.mjs +3 -2
  226. package/dist/workers/index.mjs.map +1 -1
  227. package/dist/zod-eKqqhZ5_.mjs +72 -0
  228. package/dist/zod-eKqqhZ5_.mjs.map +1 -0
  229. package/dist/{index-Bnpfq6uk.d.mts → zod-wecrEVAs.d.mts} +63 -133
  230. package/dist/zod-wecrEVAs.d.mts.map +1 -0
  231. package/package.json +28 -39
  232. package/dist/base-email.provider-CfQCA08m.mjs +0 -42
  233. package/dist/base-email.provider-CfQCA08m.mjs.map +0 -1
  234. package/dist/cache.service-DsnKuNyO.d.mts.map +0 -1
  235. package/dist/cache.tokens-B7Rw1C9Q.mjs +0 -6
  236. package/dist/cache.tokens-B7Rw1C9Q.mjs.map +0 -1
  237. package/dist/colors-DJaRDXoS.mjs +0 -16
  238. package/dist/colors-DJaRDXoS.mjs.map +0 -1
  239. package/dist/command-BgSlsS4M.mjs.map +0 -1
  240. package/dist/command-Cmmf0oHX.d.mts.map +0 -1
  241. package/dist/consumer-registry-B7yUNh0q.d.mts.map +0 -1
  242. package/dist/controller.decorator-B9vwn0zK.mjs.map +0 -1
  243. package/dist/cron-manager-CmTimEjf.d.mts +0 -131
  244. package/dist/cron-manager-CmTimEjf.d.mts.map +0 -1
  245. package/dist/cron-manager-DQSK8uoV.mjs.map +0 -1
  246. package/dist/en-DSH_bhh6.mjs +0 -308
  247. package/dist/en-DSH_bhh6.mjs.map +0 -1
  248. package/dist/env-D1rcZ8_r.d.mts.map +0 -1
  249. package/dist/errors-COW9-Mar.mjs +0 -1739
  250. package/dist/errors-COW9-Mar.mjs.map +0 -1
  251. package/dist/errors-ORxu1-Bb.mjs +0 -74
  252. package/dist/errors-ORxu1-Bb.mjs.map +0 -1
  253. package/dist/events-CzCV8jI8.mjs.map +0 -1
  254. package/dist/gateway-context-CXmXtaUP.mjs.map +0 -1
  255. package/dist/guards-DU1_J9YA.mjs.map +0 -1
  256. package/dist/http-method.decorator-BrgHMdLQ.mjs.map +0 -1
  257. package/dist/i18n.module-CzXLW9Hy.mjs +0 -2532
  258. package/dist/i18n.module-CzXLW9Hy.mjs.map +0 -1
  259. package/dist/index-7-hU3GTV.d.mts.map +0 -1
  260. package/dist/index-Bnpfq6uk.d.mts.map +0 -1
  261. package/dist/index-ByOyTmqf.d.mts.map +0 -1
  262. package/dist/index-C1KvMncZ.d.mts.map +0 -1
  263. package/dist/index-DBd_2wv8.d.mts +0 -263
  264. package/dist/index-DBd_2wv8.d.mts.map +0 -1
  265. package/dist/index-DUzWs0z7.d.mts +0 -494
  266. package/dist/index-DUzWs0z7.d.mts.map +0 -1
  267. package/dist/index.d.mts.map +0 -1
  268. package/dist/logger-DlV7NtvD.mjs +0 -440
  269. package/dist/logger-DlV7NtvD.mjs.map +0 -1
  270. package/dist/module-BzLg57FK.mjs +0 -866
  271. package/dist/module-BzLg57FK.mjs.map +0 -1
  272. package/dist/openapi-tools.service-Zs-Ewv7F.mjs.map +0 -1
  273. package/dist/openapi.service-Bt9bCIrd.d.mts.map +0 -1
  274. package/dist/quarry-registry-BwY2hOxm.mjs +0 -699
  275. package/dist/quarry-registry-BwY2hOxm.mjs.map +0 -1
  276. package/dist/queue.module-BhCjZp6H.mjs +0 -409
  277. package/dist/queue.module-BhCjZp6H.mjs.map +0 -1
  278. package/dist/r2-storage.provider-DuonKeYm.mjs.map +0 -1
  279. package/dist/rate-limit.decorator-6qzNcSOt.mjs.map +0 -1
  280. package/dist/resend.provider-DB4IlFjG.mjs +0 -68
  281. package/dist/resend.provider-DB4IlFjG.mjs.map +0 -1
  282. package/dist/seeder-zoEfEw9i.mjs +0 -138
  283. package/dist/seeder-zoEfEw9i.mjs.map +0 -1
  284. package/dist/setup-CefZKV_e.mjs +0 -37
  285. package/dist/setup-CefZKV_e.mjs.map +0 -1
  286. package/dist/smtp.provider-B6D7zuWX.mjs +0 -76
  287. package/dist/smtp.provider-B6D7zuWX.mjs.map +0 -1
  288. package/dist/storage-D8CBP72Z.mjs.map +0 -1
  289. package/dist/storage-provider.interface-Bd6vA4ak.d.mts.map +0 -1
  290. package/dist/stratal-CNwpbSZl.mjs +0 -535
  291. package/dist/stratal-CNwpbSZl.mjs.map +0 -1
  292. package/dist/types-cySNS_lp.d.mts.map +0 -1
  293. package/dist/usage-generator-BUdlhnCK.mjs.map +0 -1
  294. package/dist/validation-DtJwAv7O.mjs +0 -248
  295. package/dist/validation-DtJwAv7O.mjs.map +0 -1
  296. /package/dist/{chunk-D1SwGrFN.mjs → chunk-BBjsoOtd.mjs} +0 -0
@@ -1,440 +0,0 @@
1
- import { inject, injectable } from "tsyringe";
2
- //#region src/di/decorators/inject-param.decorator.ts
3
- /**
4
- * Metadata key for storing parameter injection information
5
- */
6
- const INJECT_PARAM_METADATA_KEY = Symbol.for("stratal:inject:param");
7
- /**
8
- * Mark a method parameter for DI injection
9
- *
10
- * The parameter will be resolved from the request-scoped container
11
- * when the controller method is invoked.
12
- *
13
- * @param token - DI token to resolve (class or symbol)
14
- *
15
- * @example With class token
16
- * ```typescript
17
- * async show(
18
- * ctx: RouterContext,
19
- * @InjectParam(UserService) userService: UserService
20
- * ) { }
21
- * ```
22
- *
23
- * @example With symbol token
24
- * ```typescript
25
- * async show(
26
- * ctx: RouterContext,
27
- * @InjectParam(DI_TOKENS.Cache) cache: ICacheService
28
- * ) { }
29
- * ```
30
- */
31
- function InjectParam(token) {
32
- return (target, propertyKey, parameterIndex) => {
33
- if (propertyKey === void 0) throw new Error("@InjectParam can only be used on method parameters, not constructor parameters");
34
- const existingInjections = Reflect.getMetadata(INJECT_PARAM_METADATA_KEY, target, propertyKey) ?? [];
35
- existingInjections.push({
36
- index: parameterIndex,
37
- token
38
- });
39
- Reflect.defineMetadata(INJECT_PARAM_METADATA_KEY, existingInjections, target, propertyKey);
40
- };
41
- }
42
- /**
43
- * Get method parameter injections
44
- *
45
- * @param target - Controller prototype
46
- * @param propertyKey - Method name
47
- * @returns Array of parameter injections sorted by index
48
- */
49
- function getMethodInjections(target, propertyKey) {
50
- return (Reflect.getMetadata(INJECT_PARAM_METADATA_KEY, target, propertyKey) ?? []).sort((a, b) => a.index - b.index);
51
- }
52
- //#endregion
53
- //#region src/di/decorators.ts
54
- /**
55
- * DI Decorators
56
- *
57
- * Provides decorators for dependency injection:
58
- * - @Transient: Mark classes as injectable (lifecycle controlled at registration)
59
- * - @InjectParam: Inject dependencies into method parameters
60
- *
61
- * Lifecycle (Singleton, Request, Transient) is controlled at registration time
62
- * via the `scope` property in module providers or Container.register().
63
- */
64
- /**
65
- * Mark a class as injectable
66
- *
67
- * This decorator wraps tsyringe's `@injectable` decorator and optionally
68
- * associates a token with the class. The actual lifecycle (Singleton, Request,
69
- * Transient) is determined at registration time, not decoration time.
70
- *
71
- * **Lifecycle Control:**
72
- * - Use `scope: Scope.Singleton` in module providers for singleton
73
- * - Use `scope: Scope.Request` in module providers for request-scoped
74
- * - Default is Transient (new instance per resolution)
75
- *
76
- * @param token - Optional DI token for service resolution
77
- *
78
- * @example Basic usage (no token)
79
- * ```typescript
80
- * @Transient()
81
- * export class UserService {
82
- * constructor(@inject(DI_TOKENS.Database) private db: DatabaseService) {}
83
- * }
84
- *
85
- * // In module:
86
- * @Module({
87
- * providers: [UserService] // Transient by default
88
- * })
89
- * ```
90
- *
91
- * @example With token
92
- * ```typescript
93
- * @Transient(DI_TOKENS.ConnectionManager)
94
- * export class ConnectionManager implements Disposable {
95
- * // ...
96
- * }
97
- *
98
- * // In Application.ts:
99
- * container.register(DI_TOKENS.ConnectionManager, ConnectionManager, Scope.Request)
100
- * ```
101
- *
102
- * @example Singleton via provider scope
103
- * ```typescript
104
- * @Transient()
105
- * export class ConsumerRegistry {
106
- * // ...
107
- * }
108
- *
109
- * // In module:
110
- * @Module({
111
- * providers: [
112
- * { provide: DI_TOKENS.ConsumerRegistry, useClass: ConsumerRegistry, scope: Scope.Singleton }
113
- * ]
114
- * })
115
- * ```
116
- */
117
- function Transient(token) {
118
- return function(target) {
119
- const targetConstructor = target;
120
- injectable({ token })(targetConstructor);
121
- return target;
122
- };
123
- }
124
- //#endregion
125
- //#region src/di/tokens.ts
126
- /**
127
- * Token for the Container instance
128
- * Used for injecting the Container into services that need dynamic resolution
129
- */
130
- const CONTAINER_TOKEN = Symbol.for("stratal:di:container");
131
- const DI_TOKENS = {
132
- CloudflareEnv: Symbol.for("stratal:cloudflare:env"),
133
- ExecutionContext: Symbol.for("stratal:execution:context"),
134
- Container: CONTAINER_TOKEN,
135
- Application: Symbol.for("stratal:application"),
136
- ModuleRegistry: Symbol.for("stratal:module:registry"),
137
- ExceptionHandler: Symbol.for("stratal:exception:handler"),
138
- Database: Symbol.for("stratal:database:service"),
139
- Queue: Symbol.for("stratal:queue:manager"),
140
- ConsumerRegistry: Symbol.for("stratal:consumer:registry"),
141
- Cron: Symbol.for("stratal:cron:manager"),
142
- EventRegistry: Symbol.for("stratal:event:registry"),
143
- Quarry: Symbol.for("stratal:quarry"),
144
- /**
145
- * AuthContext: Use for services that need user authentication (userId).
146
- */
147
- AuthContext: Symbol.for("stratal:auth:context"),
148
- DurableObjectState: Symbol.for("stratal:durable:object:state"),
149
- DurableObjectId: Symbol.for("stratal:durable:object:id")
150
- };
151
- //#endregion
152
- //#region src/logger/logger.tokens.ts
153
- /**
154
- * Dependency Injection Tokens for Logger Module
155
- *
156
- * Symbol-based tokens ensure type-safe dependency injection
157
- * and prevent naming collisions.
158
- */
159
- const LOGGER_TOKENS = {
160
- /**
161
- * Main logger service facade
162
- */
163
- LoggerService: Symbol.for("stratal:logger:service"),
164
- /**
165
- * Log formatter (JSON or Pretty)
166
- */
167
- Formatter: Symbol.for("stratal:logger:formatter"),
168
- /**
169
- * Array of active transports
170
- */
171
- Transports: Symbol.for("stratal:logger:transports"),
172
- /**
173
- * Individual transport tokens (for factory registration)
174
- */
175
- ConsoleTransport: Symbol.for("stratal:logger:console:transport"),
176
- /**
177
- * Configured log level for filtering
178
- */
179
- LogLevelOptions: Symbol.for("stratal:logger:log:level:options")
180
- };
181
- //#endregion
182
- //#region src/logger/contracts/log-level.ts
183
- /**
184
- * Log severity levels
185
- * Ordered from least to most severe
186
- */
187
- let LogLevel = /* @__PURE__ */ function(LogLevel) {
188
- LogLevel["DEBUG"] = "debug";
189
- LogLevel["INFO"] = "info";
190
- LogLevel["WARN"] = "warn";
191
- LogLevel["ERROR"] = "error";
192
- return LogLevel;
193
- }({});
194
- /**
195
- * Map log levels to numeric priorities (for filtering)
196
- * Higher numbers = more severe = higher priority
197
- */
198
- const LOG_LEVEL_PRIORITY = {
199
- ["debug"]: 0,
200
- ["info"]: 1,
201
- ["warn"]: 2,
202
- ["error"]: 3
203
- };
204
- //#endregion
205
- //#region \0@oxc-project+runtime@0.129.0/helpers/decorateMetadata.js
206
- function __decorateMetadata(k, v) {
207
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
208
- }
209
- //#endregion
210
- //#region \0@oxc-project+runtime@0.129.0/helpers/decorateParam.js
211
- function __decorateParam(paramIndex, decorator) {
212
- return function(target, key) {
213
- decorator(target, key, paramIndex);
214
- };
215
- }
216
- //#endregion
217
- //#region \0@oxc-project+runtime@0.129.0/helpers/decorate.js
218
- function __decorate(decorators, target, key, desc) {
219
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
220
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
221
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
222
- return c > 3 && r && Object.defineProperty(target, key, r), r;
223
- }
224
- //#endregion
225
- //#region src/logger/services/logger.service.ts
226
- var _ref, _ref2;
227
- let LoggerService = class LoggerService {
228
- logLevel;
229
- executionContext;
230
- formatter;
231
- transports;
232
- constructor(logLevel, executionContext, formatter, transports) {
233
- this.logLevel = logLevel;
234
- this.executionContext = executionContext;
235
- this.formatter = formatter;
236
- this.transports = transports;
237
- }
238
- /**
239
- * Log debug message (development only)
240
- */
241
- debug(message, context) {
242
- this.log("debug", message, context);
243
- }
244
- /**
245
- * Log info message
246
- */
247
- info(message, context) {
248
- this.log("info", message, context);
249
- }
250
- /**
251
- * Log warning message
252
- */
253
- warn(message, context) {
254
- this.log("warn", message, context);
255
- }
256
- /**
257
- * Log error message
258
- * Accepts Error object or custom context
259
- */
260
- error(message, contextOrError) {
261
- let context;
262
- let error;
263
- if (contextOrError instanceof Error) error = contextOrError;
264
- else context = contextOrError;
265
- this.log("error", message, context, error);
266
- }
267
- /**
268
- * Core logging implementation
269
- * Enriches context, formats message, dispatches to transports
270
- * Uses ctx.waitUntil() for async non-blocking processing
271
- */
272
- log(level, message, userContext, error) {
273
- if (LOG_LEVEL_PRIORITY[level] < LOG_LEVEL_PRIORITY[this.logLevel]) return;
274
- const entry = {
275
- level,
276
- message,
277
- context: this.enrichContext(userContext ?? {}),
278
- error: error ? this.serializeError(error) : void 0
279
- };
280
- const formatted = this.formatter.format(entry);
281
- const writePromises = this.transports.map((transport) => transport.write(entry, formatted).catch((err) => {
282
- console.error(`Transport ${transport.name} failed:`, err);
283
- }));
284
- const allWrites = Promise.all(writePromises);
285
- try {
286
- this.executionContext.waitUntil(allWrites);
287
- } catch (error) {
288
- if (!(error instanceof Error) || !error.message.includes("global scope")) throw error;
289
- }
290
- }
291
- /**
292
- * Enrich log context with request info and timestamp
293
- * Context enrichment can be extended by application modules
294
- */
295
- enrichContext(userContext) {
296
- return {
297
- ...userContext,
298
- timestamp: Date.now()
299
- };
300
- }
301
- /**
302
- * Serialize Error object for transport
303
- */
304
- serializeError(error) {
305
- return {
306
- message: error.message,
307
- stack: error.stack,
308
- name: error.name
309
- };
310
- }
311
- };
312
- LoggerService = __decorate([
313
- Transient(),
314
- __decorateParam(0, inject(LOGGER_TOKENS.LogLevelOptions)),
315
- __decorateParam(1, inject(DI_TOKENS.ExecutionContext)),
316
- __decorateParam(2, inject(LOGGER_TOKENS.Formatter)),
317
- __decorateParam(3, inject(LOGGER_TOKENS.Transports)),
318
- __decorateMetadata("design:paramtypes", [
319
- typeof (_ref = typeof LogLevel !== "undefined" && LogLevel) === "function" ? _ref : Object,
320
- typeof (_ref2 = typeof globalThis !== "undefined" && globalThis.ExecutionContext) === "function" ? _ref2 : Object,
321
- Object,
322
- Array
323
- ])
324
- ], LoggerService);
325
- //#endregion
326
- //#region src/logger/formatters/json-formatter.ts
327
- /**
328
- * JSON Formatter
329
- *
330
- * Produces structured JSON logs for production environments.
331
- * Optimized for log aggregation systems (Cloudflare Analytics, Datadog, etc.)
332
- *
333
- * Output format:
334
- * {
335
- * "level": "info",
336
- * "message": "User logged in",
337
- * "timestamp": 1234567890,
338
- * "userId": "user_456",
339
- * "error": { "message": "...", "stack": "..." }
340
- * }
341
- */
342
- var JsonFormatter = class {
343
- format(entry) {
344
- const output = {
345
- level: entry.level,
346
- message: entry.message,
347
- ...entry.context,
348
- ...entry.error && { error: entry.error }
349
- };
350
- return JSON.stringify(output);
351
- }
352
- };
353
- //#endregion
354
- //#region src/logger/formatters/pretty-formatter.ts
355
- /**
356
- * Pretty Formatter
357
- *
358
- * Human-readable colored output for development environments.
359
- * Uses ANSI color codes for terminal output.
360
- *
361
- * Output format:
362
- * [2024-01-15 10:30:45] INFO: User logged in
363
- * userId: user_456
364
- */
365
- var PrettyFormatter = class {
366
- colors = {
367
- ["debug"]: "\x1B[36m",
368
- ["info"]: "\x1B[32m",
369
- ["warn"]: "\x1B[33m",
370
- ["error"]: "\x1B[31m"
371
- };
372
- reset = "\x1B[0m";
373
- format(entry) {
374
- let output = `${this.colors[entry.level]}[${new Date(entry.context.timestamp).toISOString()}] ${entry.level.toUpperCase().padEnd(5)}${this.reset}: ${entry.message}`;
375
- const { timestamp: _, ...contextWithoutTimestamp } = entry.context;
376
- const contextEntries = Object.entries(contextWithoutTimestamp);
377
- if (contextEntries.length > 0) {
378
- output += "\n";
379
- contextEntries.forEach(([key, value]) => {
380
- output += ` ${key}: ${JSON.stringify(value)}\n`;
381
- });
382
- }
383
- if (entry.error?.stack) output += `\n${entry.error.stack}\n`;
384
- return output.trimEnd();
385
- }
386
- };
387
- //#endregion
388
- //#region src/logger/transports/base-transport.ts
389
- /**
390
- * Base Transport
391
- *
392
- * Abstract base class providing shared transport logic.
393
- * Reduces code duplication across transport implementations.
394
- */
395
- var BaseTransport = class {
396
- /**
397
- * Handle transport errors gracefully
398
- * Logs to console.error as fallback to prevent log loss
399
- *
400
- * @param error - Error that occurred during write
401
- * @param entry - Log entry that failed
402
- */
403
- handleError(error, entry) {
404
- console.error(`[${this.name}] Failed to write log:`, {
405
- error: error instanceof Error ? error.message : String(error),
406
- logMessage: entry.message,
407
- level: entry.level
408
- });
409
- }
410
- };
411
- //#endregion
412
- //#region src/logger/transports/console-transport.ts
413
- let ConsoleTransport = class ConsoleTransport extends BaseTransport {
414
- name = "console";
415
- write(entry, formatted) {
416
- try {
417
- this.getConsoleMethod(entry.level)(formatted);
418
- } catch (error) {
419
- this.handleError(error, entry);
420
- }
421
- return Promise.resolve();
422
- }
423
- /**
424
- * Map log level to console method
425
- */
426
- getConsoleMethod(level) {
427
- switch (level) {
428
- case "debug": return console.debug;
429
- case "info": return console.info;
430
- case "warn": return console.warn;
431
- case "error": return console.error;
432
- default: return console.log;
433
- }
434
- }
435
- };
436
- ConsoleTransport = __decorate([Transient(LOGGER_TOKENS.ConsoleTransport)], ConsoleTransport);
437
- //#endregion
438
- export { __decorate as a, LOG_LEVEL_PRIORITY as c, CONTAINER_TOKEN as d, DI_TOKENS as f, getMethodInjections as g, InjectParam as h, LoggerService as i, LogLevel as l, INJECT_PARAM_METADATA_KEY as m, PrettyFormatter as n, __decorateParam as o, Transient as p, JsonFormatter as r, __decorateMetadata as s, ConsoleTransport as t, LOGGER_TOKENS as u };
439
-
440
- //# sourceMappingURL=logger-DlV7NtvD.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger-DlV7NtvD.mjs","names":[],"sources":["../src/di/decorators/inject-param.decorator.ts","../src/di/decorators.ts","../src/di/tokens.ts","../src/logger/logger.tokens.ts","../src/logger/contracts/log-level.ts","../src/logger/services/logger.service.ts","../src/logger/formatters/json-formatter.ts","../src/logger/formatters/pretty-formatter.ts","../src/logger/transports/base-transport.ts","../src/logger/transports/console-transport.ts"],"sourcesContent":["/**\n * Method Parameter Injection Decorator\n *\n * Enables DI for controller method parameters. Parameters marked with\n * @InjectParam(token) are resolved from the request-scoped container\n * at method invocation time.\n *\n * @example\n * ```typescript\n * @Route({ response: userSchema })\n * async show(\n * ctx: RouterContext,\n * @InjectParam(UserService) userService: UserService,\n * @InjectParam(CacheService) cache: CacheService\n * ): Promise<Response> {\n * // userService and cache auto-resolved from request container\n * }\n * ```\n */\nimport type InjectionToken from 'tsyringe/dist/typings/providers/injection-token'\n\n/**\n * Metadata key for storing parameter injection information\n */\nexport const INJECT_PARAM_METADATA_KEY = Symbol.for('stratal:inject:param')\n\n/**\n * Describes a parameter injection\n */\nexport interface ParamInjection {\n /** Parameter index in the method signature (0-based) */\n index: number\n /** DI token to resolve */\n token: InjectionToken\n}\n\n/**\n * Mark a method parameter for DI injection\n *\n * The parameter will be resolved from the request-scoped container\n * when the controller method is invoked.\n *\n * @param token - DI token to resolve (class or symbol)\n *\n * @example With class token\n * ```typescript\n * async show(\n * ctx: RouterContext,\n * @InjectParam(UserService) userService: UserService\n * ) { }\n * ```\n *\n * @example With symbol token\n * ```typescript\n * async show(\n * ctx: RouterContext,\n * @InjectParam(DI_TOKENS.Cache) cache: ICacheService\n * ) { }\n * ```\n */\nexport function InjectParam<T>(token: InjectionToken<T>): ParameterDecorator {\n return (target: object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (propertyKey === undefined) {\n throw new Error('@InjectParam can only be used on method parameters, not constructor parameters')\n }\n\n const existingInjections: ParamInjection[] =\n (Reflect.getMetadata(INJECT_PARAM_METADATA_KEY, target, propertyKey) as ParamInjection[] | undefined) ?? []\n\n existingInjections.push({\n index: parameterIndex,\n token,\n })\n\n Reflect.defineMetadata(INJECT_PARAM_METADATA_KEY, existingInjections, target, propertyKey)\n }\n}\n\n/**\n * Get method parameter injections\n *\n * @param target - Controller prototype\n * @param propertyKey - Method name\n * @returns Array of parameter injections sorted by index\n */\nexport function getMethodInjections(target: object, propertyKey: string | symbol): ParamInjection[] {\n const injections: ParamInjection[] =\n (Reflect.getMetadata(INJECT_PARAM_METADATA_KEY, target, propertyKey) as ParamInjection[] | undefined) ?? []\n\n return injections.sort((a, b) => a.index - b.index)\n}\n","/**\n * DI Decorators\n *\n * Provides decorators for dependency injection:\n * - @Transient: Mark classes as injectable (lifecycle controlled at registration)\n * - @InjectParam: Inject dependencies into method parameters\n *\n * Lifecycle (Singleton, Request, Transient) is controlled at registration time\n * via the `scope` property in module providers or Container.register().\n */\nimport { injectable } from 'tsyringe'\nimport type InjectionToken from 'tsyringe/dist/typings/providers/injection-token'\n\n// Re-export method parameter injection\nexport {\n InjectParam,\n getMethodInjections,\n type ParamInjection,\n INJECT_PARAM_METADATA_KEY,\n} from './decorators/inject-param.decorator'\n\n/**\n * Mark a class as injectable\n *\n * This decorator wraps tsyringe's `@injectable` decorator and optionally\n * associates a token with the class. The actual lifecycle (Singleton, Request,\n * Transient) is determined at registration time, not decoration time.\n *\n * **Lifecycle Control:**\n * - Use `scope: Scope.Singleton` in module providers for singleton\n * - Use `scope: Scope.Request` in module providers for request-scoped\n * - Default is Transient (new instance per resolution)\n *\n * @param token - Optional DI token for service resolution\n *\n * @example Basic usage (no token)\n * ```typescript\n * @Transient()\n * export class UserService {\n * constructor(@inject(DI_TOKENS.Database) private db: DatabaseService) {}\n * }\n *\n * // In module:\n * @Module({\n * providers: [UserService] // Transient by default\n * })\n * ```\n *\n * @example With token\n * ```typescript\n * @Transient(DI_TOKENS.ConnectionManager)\n * export class ConnectionManager implements Disposable {\n * // ...\n * }\n *\n * // In Application.ts:\n * container.register(DI_TOKENS.ConnectionManager, ConnectionManager, Scope.Request)\n * ```\n *\n * @example Singleton via provider scope\n * ```typescript\n * @Transient()\n * export class ConsumerRegistry {\n * // ...\n * }\n *\n * // In module:\n * @Module({\n * providers: [\n * { provide: DI_TOKENS.ConsumerRegistry, useClass: ConsumerRegistry, scope: Scope.Singleton }\n * ]\n * })\n * ```\n */\nexport function Transient<T>(token?: InjectionToken<T>) {\n return function <TFunction extends abstract new (...args: never[]) => unknown>(target: TFunction): TFunction {\n const targetConstructor = target as unknown as new (...args: unknown[]) => T\n injectable<T>({ token })(targetConstructor)\n return target\n }\n}\n","/**\n * Token for the Container instance\n * Used for injecting the Container into services that need dynamic resolution\n */\nexport const CONTAINER_TOKEN = Symbol.for('stratal:di:container')\n\nexport const DI_TOKENS = {\n // Cloudflare\n CloudflareEnv: Symbol.for('stratal:cloudflare:env'),\n ExecutionContext: Symbol.for('stratal:execution:context'),\n\n // Infrastructure\n Container: CONTAINER_TOKEN,\n Application: Symbol.for('stratal:application'),\n ModuleRegistry: Symbol.for('stratal:module:registry'),\n ExceptionHandler: Symbol.for('stratal:exception:handler'),\n Database: Symbol.for('stratal:database:service'),\n Queue: Symbol.for('stratal:queue:manager'),\n ConsumerRegistry: Symbol.for('stratal:consumer:registry'),\n Cron: Symbol.for('stratal:cron:manager'),\n EventRegistry: Symbol.for('stratal:event:registry'),\n Quarry: Symbol.for('stratal:quarry'),\n\n // Context\n /**\n * AuthContext: Use for services that need user authentication (userId).\n */\n AuthContext: Symbol.for('stratal:auth:context'),\n\n // Workers\n DurableObjectState: Symbol.for('stratal:durable:object:state'),\n DurableObjectId: Symbol.for('stratal:durable:object:id'),\n} as const\n\nexport type DIToken = typeof DI_TOKENS[keyof typeof DI_TOKENS]\n","/**\n * Dependency Injection Tokens for Logger Module\n *\n * Symbol-based tokens ensure type-safe dependency injection\n * and prevent naming collisions.\n */\nexport const LOGGER_TOKENS = {\n /**\n * Main logger service facade\n */\n LoggerService: Symbol.for('stratal:logger:service'),\n\n /**\n * Log formatter (JSON or Pretty)\n */\n Formatter: Symbol.for('stratal:logger:formatter'),\n\n /**\n * Array of active transports\n */\n Transports: Symbol.for('stratal:logger:transports'),\n\n /**\n * Individual transport tokens (for factory registration)\n */\n ConsoleTransport: Symbol.for('stratal:logger:console:transport'),\n\n /**\n * Configured log level for filtering\n */\n LogLevelOptions: Symbol.for('stratal:logger:log:level:options'),\n} as const\n","/**\n * Log severity levels\n * Ordered from least to most severe\n */\nexport enum LogLevel {\n DEBUG = 'debug',\n INFO = 'info',\n WARN = 'warn',\n ERROR = 'error',\n}\n\n/**\n * Map log levels to numeric priorities (for filtering)\n * Higher numbers = more severe = higher priority\n */\nexport const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n [LogLevel.DEBUG]: 0,\n [LogLevel.INFO]: 1,\n [LogLevel.WARN]: 2,\n [LogLevel.ERROR]: 3,\n}\n","import { inject } from 'tsyringe'\nimport { Transient } from '../../di/decorators'\nimport { DI_TOKENS } from '../../di/tokens'\nimport type { InternalLogContext, LogContext, LogEntry } from '../contracts'\nimport { LOG_LEVEL_PRIORITY, LogLevel } from '../contracts/log-level'\nimport type { ILogFormatter } from '../formatters/formatter.interface'\nimport { LOGGER_TOKENS } from '../logger.tokens'\nimport type { ILogTransport } from '../transports/transport.interface'\n\n/**\n * Logger Service\n *\n * Main logging facade.\n *\n * **Features:**\n * - Async logging via ctx.waitUntil() for non-blocking performance\n * - Multi-transport support (console, future Sentry/Cloudflare Analytics)\n * - Configurable formatters (JSON production, Pretty development)\n * - Log level filtering based on environment\n *\n * **Architecture:**\n * - Transports and formatters injected via DI\n *\n * @example Basic usage\n * ```typescript\n * @Transient()\n * export class UserService {\n * constructor(\n * @inject(LOGGER_TOKENS.LoggerService)\n * private readonly logger: LoggerService\n * ) {}\n *\n * async createUser(input: CreateUserInput) {\n * this.logger.info('Creating user', { email: input.email })\n * }\n * }\n * ```\n */\n@Transient()\nexport class LoggerService {\n constructor(\n @inject(LOGGER_TOKENS.LogLevelOptions)\n private readonly logLevel: LogLevel,\n\n @inject(DI_TOKENS.ExecutionContext)\n private readonly executionContext: globalThis.ExecutionContext,\n\n @inject(LOGGER_TOKENS.Formatter)\n private readonly formatter: ILogFormatter,\n\n @inject(LOGGER_TOKENS.Transports)\n private readonly transports: ILogTransport[],\n ) { }\n\n /**\n * Log debug message (development only)\n */\n debug(message: string, context?: LogContext): void {\n this.log(LogLevel.DEBUG, message, context)\n }\n\n /**\n * Log info message\n */\n info(message: string, context?: LogContext): void {\n this.log(LogLevel.INFO, message, context)\n }\n\n /**\n * Log warning message\n */\n warn(message: string, context?: LogContext): void {\n this.log(LogLevel.WARN, message, context)\n }\n\n /**\n * Log error message\n * Accepts Error object or custom context\n */\n error(message: string, contextOrError?: LogContext | Error): void {\n let context: LogContext | undefined\n let error: Error | undefined\n\n if (contextOrError instanceof Error) {\n error = contextOrError\n } else {\n context = contextOrError\n }\n\n this.log(LogLevel.ERROR, message, context, error)\n }\n\n /**\n * Core logging implementation\n * Enriches context, formats message, dispatches to transports\n * Uses ctx.waitUntil() for async non-blocking processing\n */\n private log(\n level: LogLevel,\n message: string,\n userContext?: LogContext,\n error?: Error\n ): void {\n // Filter by configured log level\n if (LOG_LEVEL_PRIORITY[level] < LOG_LEVEL_PRIORITY[this.logLevel]) {\n return\n }\n\n // Build complete log entry with enriched context\n const entry: LogEntry = {\n level,\n message,\n context: this.enrichContext(userContext ?? {}),\n error: error ? this.serializeError(error) : undefined,\n }\n\n // Format once for all transports\n const formatted = this.formatter.format(entry)\n\n // Dispatch to all transports asynchronously\n const writePromises = this.transports.map(transport =>\n transport.write(entry, formatted).catch((err: unknown) => {\n // Swallow transport errors to prevent log failure from crashing app\n console.error(`Transport ${transport.name} failed:`, err)\n })\n )\n\n // Use waitUntil to ensure logs complete even after response sent\n const allWrites = Promise.all(writePromises)\n try {\n this.executionContext.waitUntil(allWrites)\n } catch (error) {\n if (!(error instanceof Error) || !error.message.includes('global scope')) {\n throw error\n }\n }\n }\n\n /**\n * Enrich log context with request info and timestamp\n * Context enrichment can be extended by application modules\n */\n private enrichContext(userContext: LogContext): InternalLogContext {\n return {\n ...userContext,\n timestamp: Date.now(),\n }\n }\n\n /**\n * Serialize Error object for transport\n */\n private serializeError(error: Error): { message: string; stack?: string; name?: string } {\n return {\n message: error.message,\n stack: error.stack,\n name: error.name,\n }\n }\n}\n","import type { LogEntry } from '../contracts'\nimport type { ILogFormatter } from './formatter.interface'\n\n/**\n * JSON Formatter\n *\n * Produces structured JSON logs for production environments.\n * Optimized for log aggregation systems (Cloudflare Analytics, Datadog, etc.)\n *\n * Output format:\n * {\n * \"level\": \"info\",\n * \"message\": \"User logged in\",\n * \"timestamp\": 1234567890,\n * \"userId\": \"user_456\",\n * \"error\": { \"message\": \"...\", \"stack\": \"...\" }\n * }\n */\nexport class JsonFormatter implements ILogFormatter {\n format(entry: LogEntry): string {\n const output = {\n level: entry.level,\n message: entry.message,\n ...entry.context,\n ...(entry.error && { error: entry.error }),\n }\n\n return JSON.stringify(output)\n }\n}\n","import type { LogEntry } from '../contracts'\nimport { LogLevel } from '../contracts'\nimport type { ILogFormatter } from './formatter.interface'\n\n/**\n * Pretty Formatter\n *\n * Human-readable colored output for development environments.\n * Uses ANSI color codes for terminal output.\n *\n * Output format:\n * [2024-01-15 10:30:45] INFO: User logged in\n * userId: user_456\n */\nexport class PrettyFormatter implements ILogFormatter {\n private readonly colors: Record<LogLevel, string> = {\n [LogLevel.DEBUG]: '\\x1b[36m', // Cyan\n [LogLevel.INFO]: '\\x1b[32m', // Green\n [LogLevel.WARN]: '\\x1b[33m', // Yellow\n [LogLevel.ERROR]: '\\x1b[31m', // Red\n }\n\n private readonly reset = '\\x1b[0m'\n\n format(entry: LogEntry): string {\n const color = this.colors[entry.level]\n const timestamp = new Date(entry.context.timestamp).toISOString()\n const levelStr = entry.level.toUpperCase().padEnd(5)\n\n let output = `${color}[${timestamp}] ${levelStr}${this.reset}: ${entry.message}`\n\n // Add context (exclude timestamp)\n const { timestamp: _, ...contextWithoutTimestamp } = entry.context\n const contextEntries = Object.entries(contextWithoutTimestamp)\n\n if (contextEntries.length > 0) {\n output += '\\n'\n contextEntries.forEach(([key, value]) => {\n output += ` ${key}: ${JSON.stringify(value)}\\n`\n })\n }\n\n // Add error stack if present\n if (entry.error?.stack) {\n output += `\\n${entry.error.stack}\\n`\n }\n\n return output.trimEnd()\n }\n}\n","import type { ILogTransport } from './transport.interface'\nimport type { LogEntry } from '../contracts'\n\n/**\n * Base Transport\n *\n * Abstract base class providing shared transport logic.\n * Reduces code duplication across transport implementations.\n */\nexport abstract class BaseTransport implements ILogTransport {\n abstract readonly name: string\n\n /**\n * Write log entry - must be implemented by concrete transports\n */\n abstract write(entry: LogEntry, formatted: string): Promise<void>\n\n /**\n * Handle transport errors gracefully\n * Logs to console.error as fallback to prevent log loss\n *\n * @param error - Error that occurred during write\n * @param entry - Log entry that failed\n */\n protected handleError(error: unknown, entry: LogEntry): void {\n console.error(`[${this.name}] Failed to write log:`, {\n error: error instanceof Error ? error.message : String(error),\n logMessage: entry.message,\n level: entry.level,\n })\n }\n}\n","import { Transient } from '../../di/decorators'\nimport { LOGGER_TOKENS } from '../logger.tokens'\nimport { BaseTransport } from './base-transport'\nimport type { LogEntry } from '../contracts'\nimport { LogLevel } from '../contracts'\n\n/**\n * Console Transport\n *\n * Writes logs to console using appropriate console methods.\n * Maps log levels to console.debug, console.info, console.warn, console.error.\n *\n * Thread-safe for Cloudflare Workers environment.\n */\n@Transient(LOGGER_TOKENS.ConsoleTransport)\nexport class ConsoleTransport extends BaseTransport {\n readonly name = 'console'\n\n write(entry: LogEntry, formatted: string): Promise<void> {\n try {\n const consoleMethod = this.getConsoleMethod(entry.level)\n consoleMethod(formatted)\n } catch (error) {\n this.handleError(error, entry)\n }\n\n return Promise.resolve()\n }\n\n /**\n * Map log level to console method\n */\n private getConsoleMethod(level: LogLevel): typeof console.log {\n switch (level) {\n case LogLevel.DEBUG:\n return console.debug\n case LogLevel.INFO:\n return console.info\n case LogLevel.WARN:\n return console.warn\n case LogLevel.ERROR:\n return console.error\n default:\n return console.log\n }\n }\n}\n"],"mappings":"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"}