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
@@ -0,0 +1,44 @@
1
+ //#region src/router/locale-url.ts
2
+ /**
3
+ * Pure helpers for locale-aware URL path manipulation.
4
+ *
5
+ * Each function takes config explicitly so it can run anywhere (no DI, no request
6
+ * context). For ergonomic DI-driven access, see {@link LocaleUrlService} which
7
+ * binds these to the resolved {@link LocalePathService} config.
8
+ */
9
+ /**
10
+ * Whether a locale should be URL-prefixed under the given config.
11
+ *
12
+ * - No config → always prefix (caller didn't opt into locale-aware URLs).
13
+ * - `prefixDefaultLocale: true` → every locale, including the default, is prefixed.
14
+ * - Otherwise → only non-default locales are prefixed.
15
+ */
16
+ function shouldPrefixLocale(locale, config) {
17
+ if (!config) return true;
18
+ if (config.prefixDefaultLocale === true) return true;
19
+ return locale !== config.defaultLocale;
20
+ }
21
+ /**
22
+ * Prepend `/{locale}` to a pathname, respecting `prefixDefaultLocale`.
23
+ * Returns the pathname unchanged when the locale shouldn't be prefixed.
24
+ */
25
+ function applyLocalePrefix(pathname, locale, config) {
26
+ if (!shouldPrefixLocale(locale, config)) return pathname;
27
+ return pathname === "/" ? `/${locale}` : `/${locale}${pathname}`;
28
+ }
29
+ /**
30
+ * Strip a known-locale prefix from the start of a pathname.
31
+ * Returns the pathname unchanged if the first segment isn't in `knownLocales`.
32
+ */
33
+ function stripLocalePrefix(pathname, knownLocales) {
34
+ const segments = pathname.split("/").filter(Boolean);
35
+ if (segments.length > 0 && knownLocales.includes(segments[0])) {
36
+ const rest = segments.slice(1).join("/");
37
+ return rest ? `/${rest}` : "/";
38
+ }
39
+ return pathname;
40
+ }
41
+ //#endregion
42
+ export { shouldPrefixLocale as n, stripLocalePrefix as r, applyLocalePrefix as t };
43
+
44
+ //# sourceMappingURL=locale-url-nZrZxqJP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale-url-nZrZxqJP.mjs","names":[],"sources":["../src/router/locale-url.ts"],"sourcesContent":["import type { LocaleUrlConfig } from './types'\n\n/**\n * Pure helpers for locale-aware URL path manipulation.\n *\n * Each function takes config explicitly so it can run anywhere (no DI, no request\n * context). For ergonomic DI-driven access, see {@link LocaleUrlService} which\n * binds these to the resolved {@link LocalePathService} config.\n */\n\n/**\n * Whether a locale should be URL-prefixed under the given config.\n *\n * - No config → always prefix (caller didn't opt into locale-aware URLs).\n * - `prefixDefaultLocale: true` → every locale, including the default, is prefixed.\n * - Otherwise → only non-default locales are prefixed.\n */\nexport function shouldPrefixLocale(locale: string, config: LocaleUrlConfig | undefined): boolean {\n if (!config) return true\n if (config.prefixDefaultLocale === true) return true\n return locale !== config.defaultLocale\n}\n\n/**\n * Prepend `/{locale}` to a pathname, respecting `prefixDefaultLocale`.\n * Returns the pathname unchanged when the locale shouldn't be prefixed.\n */\nexport function applyLocalePrefix(pathname: string, locale: string, config: LocaleUrlConfig | undefined): string {\n if (!shouldPrefixLocale(locale, config)) return pathname\n return pathname === '/' ? `/${locale}` : `/${locale}${pathname}`\n}\n\n/**\n * Strip a known-locale prefix from the start of a pathname.\n * Returns the pathname unchanged if the first segment isn't in `knownLocales`.\n */\nexport function stripLocalePrefix(pathname: string, knownLocales: readonly string[]): string {\n const segments = pathname.split('/').filter(Boolean)\n if (segments.length > 0 && knownLocales.includes(segments[0])) {\n const rest = segments.slice(1).join('/')\n return rest ? `/${rest}` : '/'\n }\n return pathname\n}\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,SAAgB,mBAAmB,QAAgB,QAA8C;CAC/F,IAAI,CAAC,QAAQ,OAAO;CACpB,IAAI,OAAO,wBAAwB,MAAM,OAAO;CAChD,OAAO,WAAW,OAAO;AAC3B;;;;;AAMA,SAAgB,kBAAkB,UAAkB,QAAgB,QAA6C;CAC/G,IAAI,CAAC,mBAAmB,QAAQ,MAAM,GAAG,OAAO;CAChD,OAAO,aAAa,MAAM,IAAI,WAAW,IAAI,SAAS;AACxD;;;;;AAMA,SAAgB,kBAAkB,UAAkB,cAAyC;CAC3F,MAAM,WAAW,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;CACnD,IAAI,SAAS,SAAS,KAAK,aAAa,SAAS,SAAS,EAAE,GAAG;EAC7D,MAAM,OAAO,SAAS,MAAM,CAAC,EAAE,KAAK,GAAG;EACvC,OAAO,OAAO,IAAI,SAAS;CAC7B;CACA,OAAO;AACT"}
@@ -0,0 +1,41 @@
1
+ import { t as __exportAll } from "./chunk-BBjsoOtd.mjs";
2
+ import { d as inject, s as Singleton, v as ROUTER_TOKENS } from "./di-DseMn-z9.mjs";
3
+ import { n as __decorateParam, t as __decorate } from "./decorate-CuAoSZvs.mjs";
4
+ import { n as shouldPrefixLocale, r as stripLocalePrefix, t as applyLocalePrefix } from "./locale-url-nZrZxqJP.mjs";
5
+ //#region src/router/services/locale-url.service.ts
6
+ var locale_url_service_exports = /* @__PURE__ */ __exportAll({ LocaleUrlService: () => LocaleUrlService });
7
+ let LocaleUrlService = class LocaleUrlService {
8
+ localePath;
9
+ constructor(localePath) {
10
+ this.localePath = localePath;
11
+ }
12
+ /** Whether path-based locale detection is enabled — i.e., locales have URL-distinct path variants. */
13
+ get pathEnabled() {
14
+ return this.localePath.enabled;
15
+ }
16
+ /** Whether the given locale should get a URL prefix under the current config. */
17
+ shouldPrefix(locale) {
18
+ return shouldPrefixLocale(locale, this.toUrlConfig());
19
+ }
20
+ /** Prepend `/{locale}` to a pathname, respecting `prefixDefaultLocale`. */
21
+ applyPrefix(pathname, locale) {
22
+ return applyLocalePrefix(pathname, locale, this.toUrlConfig());
23
+ }
24
+ /** Strip a known-locale prefix from the start of a pathname. */
25
+ stripPrefix(pathname) {
26
+ return stripLocalePrefix(pathname, this.localePath.localePathConfig?.allLocales ?? []);
27
+ }
28
+ toUrlConfig() {
29
+ const config = this.localePath.localePathConfig;
30
+ if (!config) return void 0;
31
+ return {
32
+ defaultLocale: config.defaultLocale,
33
+ prefixDefaultLocale: this.localePath.prefixDefaultLocale
34
+ };
35
+ }
36
+ };
37
+ LocaleUrlService = __decorate([Singleton(), __decorateParam(0, inject(ROUTER_TOKENS.LocalePathService))], LocaleUrlService);
38
+ //#endregion
39
+ export { locale_url_service_exports as n, LocaleUrlService as t };
40
+
41
+ //# sourceMappingURL=locale-url.service-C2EWmGdq.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale-url.service-C2EWmGdq.mjs","names":[],"sources":["../src/router/services/locale-url.service.ts"],"sourcesContent":["import { inject } from '../../di'\nimport { Singleton } from '../../di/decorators'\nimport { applyLocalePrefix, shouldPrefixLocale, stripLocalePrefix } from '../locale-url'\nimport { ROUTER_TOKENS } from '../router.tokens'\nimport type { LocaleUrlConfig } from '../types'\nimport { type LocalePathService } from './locale-path.service'\n\n/**\n * DI-friendly wrapper around the pure locale-url helpers.\n *\n * Binds {@link LocalePathService} config so consumers can call `applyPrefix`,\n * `stripPrefix`, and `shouldPrefix` without passing config every time.\n *\n * Useful for canonical URL generation, sitemap builders, redirect middleware,\n * hreflang link emission, and anywhere else a request handler needs to compute\n * locale-aware path variants.\n */\n@Singleton()\nexport class LocaleUrlService {\n constructor(\n @inject(ROUTER_TOKENS.LocalePathService) private readonly localePath: LocalePathService,\n ) { }\n\n /** Whether path-based locale detection is enabled — i.e., locales have URL-distinct path variants. */\n get pathEnabled(): boolean {\n return this.localePath.enabled\n }\n\n /** Whether the given locale should get a URL prefix under the current config. */\n shouldPrefix(locale: string): boolean {\n return shouldPrefixLocale(locale, this.toUrlConfig())\n }\n\n /** Prepend `/{locale}` to a pathname, respecting `prefixDefaultLocale`. */\n applyPrefix(pathname: string, locale: string): string {\n return applyLocalePrefix(pathname, locale, this.toUrlConfig())\n }\n\n /** Strip a known-locale prefix from the start of a pathname. */\n stripPrefix(pathname: string): string {\n const known = this.localePath.localePathConfig?.allLocales ?? []\n return stripLocalePrefix(pathname, known)\n }\n\n private toUrlConfig(): LocaleUrlConfig | undefined {\n const config = this.localePath.localePathConfig\n if (!config) return undefined\n return { defaultLocale: config.defaultLocale, prefixDefaultLocale: this.localePath.prefixDefaultLocale }\n }\n}\n"],"mappings":";;;;;;AAkBO,IAAA,mBAAA,MAAM,iBAAiB;CAEgC;CAD5D,YACE,YACA;EAD0D,KAAA,aAAA;CACxD;;CAGJ,IAAI,cAAuB;EACzB,OAAO,KAAK,WAAW;CACzB;;CAGA,aAAa,QAAyB;EACpC,OAAO,mBAAmB,QAAQ,KAAK,YAAY,CAAC;CACtD;;CAGA,YAAY,UAAkB,QAAwB;EACpD,OAAO,kBAAkB,UAAU,QAAQ,KAAK,YAAY,CAAC;CAC/D;;CAGA,YAAY,UAA0B;EAEpC,OAAO,kBAAkB,UADX,KAAK,WAAW,kBAAkB,cAAc,CAAC,CACvB;CAC1C;CAEA,cAAmD;EACjD,MAAM,SAAS,KAAK,WAAW;EAC/B,IAAI,CAAC,QAAQ,OAAO,KAAA;EACpB,OAAO;GAAE,eAAe,OAAO;GAAe,qBAAqB,KAAK,WAAW;EAAoB;CACzG;AACF;+BAhCC,UAAU,GAAA,gBAAA,GAGN,OAAO,cAAc,iBAAiB,CAAA,CAAA,GAAA,gBAAA"}
@@ -1,2 +1,2 @@
1
- import { a as LogEntry, c as LOG_LEVEL_PRIORITY, i as LoggerService, l as LogLevel, n as PrettyFormatter, o as InternalLogContext, r as JsonFormatter, s as LogContext, t as ConsoleTransport, u as LOGGER_TOKENS } from "../index-DBd_2wv8.mjs";
2
- export { ConsoleTransport, InternalLogContext, JsonFormatter, LOGGER_TOKENS, LOG_LEVEL_PRIORITY, LogContext, LogEntry, LogLevel, LoggerService, PrettyFormatter };
1
+ import { a as InternalLogContext, c as LogLevel, i as LogEntry, l as LOGGER_TOKENS, n as JsonFormatter, o as LogContext, r as LoggerService, s as LOG_LEVEL_PRIORITY, t as PrettyFormatter } from "../index-BUt92sAE.mjs";
2
+ export { InternalLogContext, JsonFormatter, LOGGER_TOKENS, LOG_LEVEL_PRIORITY, LogContext, LogEntry, LogLevel, LoggerService, PrettyFormatter };
@@ -1,2 +1,170 @@
1
- import { c as LOG_LEVEL_PRIORITY, i as LoggerService, l as LogLevel, n as PrettyFormatter, r as JsonFormatter, t as ConsoleTransport, u as LOGGER_TOKENS } from "../logger-DlV7NtvD.mjs";
2
- export { ConsoleTransport, JsonFormatter, LOGGER_TOKENS, LOG_LEVEL_PRIORITY, LogLevel, LoggerService, PrettyFormatter };
1
+ import { c as Transient, d as inject } from "../di-DseMn-z9.mjs";
2
+ import { n as __decorateParam, t as __decorate } from "../decorate-CuAoSZvs.mjs";
3
+ //#region src/logger/logger.tokens.ts
4
+ const LOGGER_TOKENS = {
5
+ LoggerService: Symbol.for("stratal:logger:service"),
6
+ Formatter: Symbol.for("stratal:logger:formatter"),
7
+ LogLevelOptions: Symbol.for("stratal:logger:log:level:options")
8
+ };
9
+ //#endregion
10
+ //#region src/logger/contracts/log-level.ts
11
+ /**
12
+ * Log severity levels
13
+ * Ordered from least to most severe
14
+ */
15
+ let LogLevel = /* @__PURE__ */ function(LogLevel) {
16
+ LogLevel["DEBUG"] = "debug";
17
+ LogLevel["INFO"] = "info";
18
+ LogLevel["WARN"] = "warn";
19
+ LogLevel["ERROR"] = "error";
20
+ return LogLevel;
21
+ }({});
22
+ /**
23
+ * Map log levels to numeric priorities (for filtering)
24
+ * Higher numbers = more severe = higher priority
25
+ */
26
+ const LOG_LEVEL_PRIORITY = {
27
+ ["debug"]: 0,
28
+ ["info"]: 1,
29
+ ["warn"]: 2,
30
+ ["error"]: 3
31
+ };
32
+ //#endregion
33
+ //#region src/logger/services/logger.service.ts
34
+ let LoggerService = class LoggerService {
35
+ logLevel;
36
+ formatter;
37
+ constructor(logLevel, formatter) {
38
+ this.logLevel = logLevel;
39
+ this.formatter = formatter;
40
+ }
41
+ debug(message, context) {
42
+ this.log("debug", message, context);
43
+ }
44
+ info(message, context) {
45
+ this.log("info", message, context);
46
+ }
47
+ warn(message, context) {
48
+ this.log("warn", message, context);
49
+ }
50
+ error(message, errorOrContext, maybeContext) {
51
+ let context;
52
+ let error;
53
+ if (errorOrContext instanceof Error) {
54
+ error = errorOrContext;
55
+ context = maybeContext;
56
+ } else context = errorOrContext;
57
+ this.log("error", message, context, error);
58
+ }
59
+ log(level, message, userContext, error) {
60
+ if (LOG_LEVEL_PRIORITY[level] < LOG_LEVEL_PRIORITY[this.logLevel]) return;
61
+ const entry = {
62
+ level,
63
+ message,
64
+ context: this.enrichContext(userContext ?? {}),
65
+ error: error ? this.serializeError(error) : void 0
66
+ };
67
+ const formatted = this.formatter.format(entry);
68
+ this.writeToConsole(level, formatted);
69
+ }
70
+ writeToConsole(level, formatted) {
71
+ switch (level) {
72
+ case "debug":
73
+ console.debug(formatted);
74
+ break;
75
+ case "info":
76
+ console.info(formatted);
77
+ break;
78
+ case "warn":
79
+ console.warn(formatted);
80
+ break;
81
+ case "error":
82
+ console.error(formatted);
83
+ break;
84
+ }
85
+ }
86
+ enrichContext(userContext) {
87
+ return {
88
+ ...userContext,
89
+ timestamp: Date.now()
90
+ };
91
+ }
92
+ serializeError(error) {
93
+ return {
94
+ message: error.message,
95
+ stack: error.stack,
96
+ name: error.name
97
+ };
98
+ }
99
+ };
100
+ LoggerService = __decorate([
101
+ Transient(),
102
+ __decorateParam(0, inject(LOGGER_TOKENS.LogLevelOptions)),
103
+ __decorateParam(1, inject(LOGGER_TOKENS.Formatter))
104
+ ], LoggerService);
105
+ //#endregion
106
+ //#region src/logger/formatters/json-formatter.ts
107
+ /**
108
+ * JSON Formatter
109
+ *
110
+ * Produces structured JSON logs for production environments.
111
+ * Optimized for log aggregation systems (Cloudflare Analytics, Datadog, etc.)
112
+ *
113
+ * Output format:
114
+ * {
115
+ * "level": "info",
116
+ * "message": "User logged in",
117
+ * "timestamp": 1234567890,
118
+ * "userId": "user_456",
119
+ * "error": { "message": "...", "stack": "..." }
120
+ * }
121
+ */
122
+ var JsonFormatter = class {
123
+ format(entry) {
124
+ const output = {
125
+ level: entry.level,
126
+ message: entry.message,
127
+ ...entry.context,
128
+ ...entry.error && { error: entry.error }
129
+ };
130
+ return JSON.stringify(output);
131
+ }
132
+ };
133
+ //#endregion
134
+ //#region src/logger/formatters/pretty-formatter.ts
135
+ /**
136
+ * Pretty Formatter
137
+ *
138
+ * Human-readable colored output for development environments.
139
+ * Uses ANSI color codes for terminal output.
140
+ *
141
+ * Output format:
142
+ * [2024-01-15 10:30:45] INFO: User logged in
143
+ * userId: user_456
144
+ */
145
+ var PrettyFormatter = class {
146
+ colors = {
147
+ ["debug"]: "\x1B[36m",
148
+ ["info"]: "\x1B[32m",
149
+ ["warn"]: "\x1B[33m",
150
+ ["error"]: "\x1B[31m"
151
+ };
152
+ reset = "\x1B[0m";
153
+ format(entry) {
154
+ let output = `${this.colors[entry.level]}[${new Date(entry.context.timestamp).toISOString()}] ${entry.level.toUpperCase().padEnd(5)}${this.reset}: ${entry.message}`;
155
+ const { timestamp: _, ...contextWithoutTimestamp } = entry.context;
156
+ const contextEntries = Object.entries(contextWithoutTimestamp);
157
+ if (contextEntries.length > 0) {
158
+ output += "\n";
159
+ contextEntries.forEach(([key, value]) => {
160
+ output += ` ${key}: ${JSON.stringify(value)}\n`;
161
+ });
162
+ }
163
+ if (entry.error?.stack) output += `\n${entry.error.stack}\n`;
164
+ return output.trimEnd();
165
+ }
166
+ };
167
+ //#endregion
168
+ export { JsonFormatter, LOGGER_TOKENS, LOG_LEVEL_PRIORITY, LogLevel, LoggerService, PrettyFormatter };
169
+
170
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../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"],"sourcesContent":["export const LOGGER_TOKENS = {\n LoggerService: Symbol.for('stratal:logger:service'),\n Formatter: Symbol.for('stratal:logger:formatter'),\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 '../../di'\nimport { Transient } from '../../di/decorators'\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'\n\n@Transient()\nexport class LoggerService {\n constructor(\n @inject(LOGGER_TOKENS.LogLevelOptions)\n private readonly logLevel: LogLevel,\n\n @inject(LOGGER_TOKENS.Formatter)\n private readonly formatter: ILogFormatter,\n ) { }\n\n debug(message: string, context?: LogContext): void {\n this.log(LogLevel.DEBUG, message, context)\n }\n\n info(message: string, context?: LogContext): void {\n this.log(LogLevel.INFO, message, context)\n }\n\n warn(message: string, context?: LogContext): void {\n this.log(LogLevel.WARN, message, context)\n }\n\n error(message: string, error: Error, context?: LogContext): void\n error(message: string, context?: LogContext): void\n error(message: string, errorOrContext?: Error | LogContext, maybeContext?: LogContext): void {\n let context: LogContext | undefined\n let error: Error | undefined\n\n if (errorOrContext instanceof Error) {\n error = errorOrContext\n context = maybeContext\n } else {\n context = errorOrContext\n }\n\n this.log(LogLevel.ERROR, message, context, error)\n }\n\n private log(\n level: LogLevel,\n message: string,\n userContext?: LogContext,\n error?: Error\n ): void {\n if (LOG_LEVEL_PRIORITY[level] < LOG_LEVEL_PRIORITY[this.logLevel]) {\n return\n }\n\n const entry: LogEntry = {\n level,\n message,\n context: this.enrichContext(userContext ?? {}),\n error: error ? this.serializeError(error) : undefined,\n }\n\n const formatted = this.formatter.format(entry)\n this.writeToConsole(level, formatted)\n }\n\n private writeToConsole(level: LogLevel, formatted: string): void {\n switch (level) {\n case LogLevel.DEBUG:\n console.debug(formatted)\n break\n case LogLevel.INFO:\n console.info(formatted)\n break\n case LogLevel.WARN:\n console.warn(formatted)\n break\n case LogLevel.ERROR:\n console.error(formatted)\n break\n }\n }\n\n private enrichContext(userContext: LogContext): InternalLogContext {\n return {\n ...userContext,\n timestamp: Date.now(),\n }\n }\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"],"mappings":";;;AAAA,MAAa,gBAAgB;CAC3B,eAAe,OAAO,IAAI,wBAAwB;CAClD,WAAW,OAAO,IAAI,0BAA0B;CAChD,iBAAiB,OAAO,IAAI,kCAAkC;AAChE;;;;;;;ACAA,IAAY,WAAL,yBAAA,UAAA;CACL,SAAA,WAAA;CACA,SAAA,UAAA;CACA,SAAA,UAAA;CACA,SAAA,WAAA;;AACF,EAAA,CAAA,CAAA;;;;;AAMA,MAAa,qBAA+C;YACxC;WACD;WACA;YACC;AACpB;;;ACZO,IAAA,gBAAA,MAAM,cAAc;CAGN;CAGA;CALnB,YACE,UAGA,WAEA;EAJiB,KAAA,WAAA;EAGA,KAAA,YAAA;CACf;CAEJ,MAAM,SAAiB,SAA4B;EACjD,KAAK,IAAA,SAAoB,SAAS,OAAO;CAC3C;CAEA,KAAK,SAAiB,SAA4B;EAChD,KAAK,IAAA,QAAmB,SAAS,OAAO;CAC1C;CAEA,KAAK,SAAiB,SAA4B;EAChD,KAAK,IAAA,QAAmB,SAAS,OAAO;CAC1C;CAIA,MAAM,SAAiB,gBAAqC,cAAiC;EAC3F,IAAI;EACJ,IAAI;EAEJ,IAAI,0BAA0B,OAAO;GACnC,QAAQ;GACR,UAAU;EACZ,OACE,UAAU;EAGZ,KAAK,IAAA,SAAoB,SAAS,SAAS,KAAK;CAClD;CAEA,IACE,OACA,SACA,aACA,OACM;EACN,IAAI,mBAAmB,SAAS,mBAAmB,KAAK,WACtD;EAGF,MAAM,QAAkB;GACtB;GACA;GACA,SAAS,KAAK,cAAc,eAAe,CAAC,CAAC;GAC7C,OAAO,QAAQ,KAAK,eAAe,KAAK,IAAI,KAAA;EAC9C;EAEA,MAAM,YAAY,KAAK,UAAU,OAAO,KAAK;EAC7C,KAAK,eAAe,OAAO,SAAS;CACtC;CAEA,eAAuB,OAAiB,WAAyB;EAC/D,QAAQ,OAAR;GACE,KAAA;IACE,QAAQ,MAAM,SAAS;IACvB;GACF,KAAA;IACE,QAAQ,KAAK,SAAS;IACtB;GACF,KAAA;IACE,QAAQ,KAAK,SAAS;IACtB;GACF,KAAA;IACE,QAAQ,MAAM,SAAS;IACvB;EACJ;CACF;CAEA,cAAsB,aAA6C;EACjE,OAAO;GACL,GAAG;GACH,WAAW,KAAK,IAAI;EACtB;CACF;CAEA,eAAuB,OAAkE;EACvF,OAAO;GACL,SAAS,MAAM;GACf,OAAO,MAAM;GACb,MAAM,MAAM;EACd;CACF;AACF;;CA1FC,UAAU;oBAGN,OAAO,cAAc,eAAe,CAAA;oBAGpC,OAAO,cAAc,SAAS,CAAA;;;;;;;;;;;;;;;;;;;ACKnC,IAAa,gBAAb,MAAoD;CAClD,OAAO,OAAyB;EAC9B,MAAM,SAAS;GACb,OAAO,MAAM;GACb,SAAS,MAAM;GACf,GAAG,MAAM;GACT,GAAI,MAAM,SAAS,EAAE,OAAO,MAAM,MAAM;EAC1C;EAEA,OAAO,KAAK,UAAU,MAAM;CAC9B;AACF;;;;;;;;;;;;;ACfA,IAAa,kBAAb,MAAsD;CACpD,SAAoD;aAChC;YACD;YACA;aACC;CACpB;CAEA,QAAyB;CAEzB,OAAO,OAAyB;EAK9B,IAAI,SAAS,GAJC,KAAK,OAAO,MAAM,OAIV,GAHJ,IAAI,KAAK,MAAM,QAAQ,SAAS,EAAE,YAGnB,EAAE,IAFlB,MAAM,MAAM,YAAY,EAAE,OAAO,CAEJ,IAAI,KAAK,MAAM,IAAI,MAAM;EAGvE,MAAM,EAAE,WAAW,GAAG,GAAG,4BAA4B,MAAM;EAC3D,MAAM,iBAAiB,OAAO,QAAQ,uBAAuB;EAE7D,IAAI,eAAe,SAAS,GAAG;GAC7B,UAAU;GACV,eAAe,SAAS,CAAC,KAAK,WAAW;IACvC,UAAU,KAAK,IAAI,IAAI,KAAK,UAAU,KAAK,EAAE;GAC/C,CAAC;EACH;EAGA,IAAI,MAAM,OAAO,OACf,UAAU,KAAK,MAAM,MAAM,MAAM;EAGnC,OAAO,OAAO,QAAQ;CACxB;AACF"}
@@ -1,2 +1,2 @@
1
- import { n as MacroFunction, t as Macroable } from "../index-7-hU3GTV.mjs";
2
- export { MacroFunction, Macroable };
1
+ import { n as MacroFunction, t as Macroable } from "../index-0ItCjaqw.mjs";
2
+ export { type MacroFunction, Macroable };
@@ -1,2 +1,2 @@
1
- import { t as Macroable } from "../macroable-BmufBshB.mjs";
1
+ import { t as Macroable } from "../macroable-cvDTFZ_A.mjs";
2
2
  export { Macroable };
@@ -119,4 +119,4 @@ var Macroable = class {
119
119
  //#endregion
120
120
  export { Macroable as t };
121
121
 
122
- //# sourceMappingURL=macroable-BmufBshB.mjs.map
122
+ //# sourceMappingURL=macroable-cvDTFZ_A.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"macroable-BmufBshB.mjs","names":[],"sources":["../src/macroable/macroable.ts"],"sourcesContent":["import type { MacroFunction } from './types'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor = abstract new (...args: any[]) => any\n\n/**\n * Abstract base class for adding macros, instance properties, and getters\n * to classes at runtime.\n *\n * Inspired by [@poppinss/macroable](https://github.com/poppinss/macroable)\n * and Laravel's Macroable trait.\n *\n * @example\n * ```typescript\n * // Register a macro\n * RouterContext.macro('flash', function (this: RouterContext, key: string, value: unknown) {\n * const session = this.getContainer().resolve(SessionService)\n * session.flash(key, value)\n * })\n *\n * // Register a getter\n * RouterContext.getter('requestId', function (this: RouterContext) {\n * return this.header('x-request-id') ?? crypto.randomUUID()\n * }, true)\n *\n * // Register a per-instance property (safe for destructuring)\n * RouterContext.instanceProperty('getUser', function (this: RouterContext) {\n * return this.getContainer().resolve(AuthContext).user\n * })\n * ```\n */\nexport abstract class Macroable {\n [key: string | symbol]: unknown\n /**\n * Per-instance properties. Each entry is applied and bound\n * to `this` inside the constructor so destructuring stays safe.\n */\n protected static instanceMacros = new Set<{ key: string | symbol; value: unknown }>()\n\n /**\n * Names registered via macro() — used by hasMacro() and flushMacros().\n */\n protected static macroNames = new Set<string | symbol>()\n\n /**\n * Names registered via getter() — used by hasMacro() and flushMacros().\n */\n protected static getterNames = new Set<string | symbol>()\n\n /**\n * Original prototype values saved before macro() overrides them.\n * Used by flushMacros() to restore native methods.\n */\n private static _originals = new Map<string | symbol, { existed: boolean; value: unknown }>()\n\n // ── Macros (prototype-level) ──────────────────────────────\n\n /**\n * Register a macro on the class prototype.\n * Can override existing methods.\n *\n * When the name matches an existing property, the value type is auto-derived.\n *\n * @param name - Method or property name\n * @param value - Function or value to assign\n */\n static macro<T extends Constructor, K extends keyof InstanceType<T>>(\n this: T,\n name: K,\n value: InstanceType<T>[K],\n ): void\n static macro(name: string | symbol, value: unknown): void\n static macro(name: string | symbol, value: unknown): void {\n if (!Object.prototype.hasOwnProperty.call(this, 'macroNames')) {\n this.macroNames = new Set(this.macroNames)\n }\n if (!Object.prototype.hasOwnProperty.call(this, '_originals')) {\n this._originals = new Map(this._originals)\n }\n\n // Save the original value before first override so flushMacros() can restore it\n if (!this._originals.has(name)) {\n const existed = Object.prototype.hasOwnProperty.call(this.prototype, name)\n this._originals.set(name, {\n existed,\n value: existed ? (this.prototype as Record<string | symbol, unknown>)[name] : undefined,\n })\n }\n\n this.macroNames.add(name);\n (this.prototype as Record<string | symbol, unknown>)[name] = value\n }\n\n // ── Instance properties (bound per-instance) ─────────────\n\n /**\n * Register a per-instance property that is bound to `this`\n * in the constructor. Safe for destructuring.\n *\n * When the name matches an existing property, the value type is auto-derived.\n *\n * @param name - Property name\n * @param value - Function (will be bound) or value\n */\n static instanceProperty<T extends Constructor, K extends keyof InstanceType<T>>(\n this: T,\n name: K,\n value: InstanceType<T>[K],\n ): void\n static instanceProperty(name: string | symbol, value: unknown): void\n static instanceProperty(name: string | symbol, value: unknown): void {\n if (!Object.prototype.hasOwnProperty.call(this, 'instanceMacros')) {\n this.instanceMacros = new Set(this.instanceMacros)\n }\n this.instanceMacros.add({ key: name, value })\n }\n\n // ── Getters (Object.defineProperty on prototype) ──────────\n\n /**\n * Register a computed getter on the class prototype.\n *\n * @param name - Property name\n * @param accumulator - Function that computes the value (called with instance as `this`)\n * @param singleton - If true, cache the value after first access\n */\n static getter<T extends Constructor, K extends keyof InstanceType<T>>(\n this: T,\n name: K,\n accumulator: (this: InstanceType<T>) => InstanceType<T>[K],\n singleton?: boolean,\n ): void\n static getter(name: string | symbol, accumulator: MacroFunction, singleton?: boolean): void\n static getter(\n name: string | symbol,\n accumulator: MacroFunction,\n singleton = false,\n ): void {\n if (!Object.prototype.hasOwnProperty.call(this, 'getterNames')) {\n this.getterNames = new Set(this.getterNames)\n }\n this.getterNames.add(name)\n\n Object.defineProperty(this.prototype, name, {\n get(): unknown {\n const value: unknown = accumulator.call(this)\n if (singleton) {\n Object.defineProperty(this, name, {\n value,\n configurable: false,\n enumerable: false,\n writable: false,\n })\n }\n return value\n },\n configurable: true,\n enumerable: false,\n })\n }\n\n // ── Introspection ─────────────────────────────────────────\n\n /**\n * Check if a macro, instance property, or getter is registered.\n *\n * @param name - Name to check\n */\n static hasMacro(name: string | symbol): boolean {\n return (\n this.macroNames.has(name) ||\n [...this.instanceMacros].some((m) => m.key === name) ||\n this.getterNames.has(name)\n )\n }\n\n // ── Cleanup ───────────────────────────────────────────────\n\n /**\n * Remove all macros, instance properties, and getters\n * registered on this class. Does not affect parent classes.\n */\n static flushMacros(): void {\n const proto = this.prototype as Record<string | symbol, unknown>\n\n // Restore original prototype values or delete if they didn't exist before\n for (const name of this.macroNames) {\n const original = this._originals.get(name)\n if (original?.existed) {\n proto[name] = original.value\n } else {\n Reflect.deleteProperty(proto, name)\n }\n }\n for (const name of this.getterNames) {\n Reflect.deleteProperty(proto, name)\n }\n\n if (Object.prototype.hasOwnProperty.call(this, 'macroNames')) {\n this.macroNames.clear()\n }\n if (Object.prototype.hasOwnProperty.call(this, 'instanceMacros')) {\n this.instanceMacros.clear()\n }\n if (Object.prototype.hasOwnProperty.call(this, 'getterNames')) {\n this.getterNames.clear()\n }\n if (Object.prototype.hasOwnProperty.call(this, '_originals')) {\n this._originals.clear()\n }\n }\n\n // ── Constructor (applies instance properties) ─────────────\n\n constructor() {\n const Constructor = this.constructor as typeof Macroable\n const self = this as Record<string | symbol, unknown>\n Constructor.instanceMacros.forEach(({ key, value }) => {\n if (typeof value === 'function') {\n self[key] = value.bind(this)\n } else {\n self[key] = value\n }\n })\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,IAAsB,YAAtB,MAAgC;;;;;CAM9B,OAAiB,iCAAiB,IAAI,KAA+C;;;;CAKrF,OAAiB,6BAAa,IAAI,KAAsB;;;;CAKxD,OAAiB,8BAAc,IAAI,KAAsB;;;;;CAMzD,OAAe,6BAAa,IAAI,KAA4D;CAmB5F,OAAO,MAAM,MAAuB,OAAsB;EACxD,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,aAAa,EAC3D,KAAK,aAAa,IAAI,IAAI,KAAK,WAAW;EAE5C,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,aAAa,EAC3D,KAAK,aAAa,IAAI,IAAI,KAAK,WAAW;EAI5C,IAAI,CAAC,KAAK,WAAW,IAAI,KAAK,EAAE;GAC9B,MAAM,UAAU,OAAO,UAAU,eAAe,KAAK,KAAK,WAAW,KAAK;GAC1E,KAAK,WAAW,IAAI,MAAM;IACxB;IACA,OAAO,UAAW,KAAK,UAA+C,QAAQ,KAAA;IAC/E,CAAC;;EAGJ,KAAK,WAAW,IAAI,KAAK;EACzB,KAAM,UAA+C,QAAQ;;CAoB/D,OAAO,iBAAiB,MAAuB,OAAsB;EACnE,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,iBAAiB,EAC/D,KAAK,iBAAiB,IAAI,IAAI,KAAK,eAAe;EAEpD,KAAK,eAAe,IAAI;GAAE,KAAK;GAAM;GAAO,CAAC;;CAmB/C,OAAO,OACL,MACA,aACA,YAAY,OACN;EACN,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,cAAc,EAC5D,KAAK,cAAc,IAAI,IAAI,KAAK,YAAY;EAE9C,KAAK,YAAY,IAAI,KAAK;EAE1B,OAAO,eAAe,KAAK,WAAW,MAAM;GAC1C,MAAe;IACb,MAAM,QAAiB,YAAY,KAAK,KAAK;IAC7C,IAAI,WACF,OAAO,eAAe,MAAM,MAAM;KAChC;KACA,cAAc;KACd,YAAY;KACZ,UAAU;KACX,CAAC;IAEJ,OAAO;;GAET,cAAc;GACd,YAAY;GACb,CAAC;;;;;;;CAUJ,OAAO,SAAS,MAAgC;EAC9C,OACE,KAAK,WAAW,IAAI,KAAK,IACzB,CAAC,GAAG,KAAK,eAAe,CAAC,MAAM,MAAM,EAAE,QAAQ,KAAK,IACpD,KAAK,YAAY,IAAI,KAAK;;;;;;CAU9B,OAAO,cAAoB;EACzB,MAAM,QAAQ,KAAK;EAGnB,KAAK,MAAM,QAAQ,KAAK,YAAY;GAClC,MAAM,WAAW,KAAK,WAAW,IAAI,KAAK;GAC1C,IAAI,UAAU,SACZ,MAAM,QAAQ,SAAS;QAEvB,QAAQ,eAAe,OAAO,KAAK;;EAGvC,KAAK,MAAM,QAAQ,KAAK,aACtB,QAAQ,eAAe,OAAO,KAAK;EAGrC,IAAI,OAAO,UAAU,eAAe,KAAK,MAAM,aAAa,EAC1D,KAAK,WAAW,OAAO;EAEzB,IAAI,OAAO,UAAU,eAAe,KAAK,MAAM,iBAAiB,EAC9D,KAAK,eAAe,OAAO;EAE7B,IAAI,OAAO,UAAU,eAAe,KAAK,MAAM,cAAc,EAC3D,KAAK,YAAY,OAAO;EAE1B,IAAI,OAAO,UAAU,eAAe,KAAK,MAAM,aAAa,EAC1D,KAAK,WAAW,OAAO;;CAM3B,cAAc;EACZ,MAAM,cAAc,KAAK;EACzB,MAAM,OAAO;EACb,YAAY,eAAe,SAAS,EAAE,KAAK,YAAY;GACrD,IAAI,OAAO,UAAU,YACnB,KAAK,OAAO,MAAM,KAAK,KAAK;QAE5B,KAAK,OAAO;IAEd"}
1
+ {"version":3,"file":"macroable-cvDTFZ_A.mjs","names":[],"sources":["../src/macroable/macroable.ts"],"sourcesContent":["import type { MacroFunction } from './types'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor = abstract new (...args: any[]) => any\n\n/**\n * Abstract base class for adding macros, instance properties, and getters\n * to classes at runtime.\n *\n * Inspired by [@poppinss/macroable](https://github.com/poppinss/macroable)\n * and Laravel's Macroable trait.\n *\n * @example\n * ```typescript\n * // Register a macro\n * RouterContext.macro('flash', function (this: RouterContext, key: string, value: unknown) {\n * const session = this.getContainer().resolve(SessionService)\n * session.flash(key, value)\n * })\n *\n * // Register a getter\n * RouterContext.getter('requestId', function (this: RouterContext) {\n * return this.header('x-request-id') ?? crypto.randomUUID()\n * }, true)\n *\n * // Register a per-instance property (safe for destructuring)\n * RouterContext.instanceProperty('getUser', function (this: RouterContext) {\n * return this.getContainer().resolve(AuthContext).user\n * })\n * ```\n */\nexport abstract class Macroable {\n [key: string | symbol]: unknown\n /**\n * Per-instance properties. Each entry is applied and bound\n * to `this` inside the constructor so destructuring stays safe.\n */\n protected static instanceMacros = new Set<{ key: string | symbol; value: unknown }>()\n\n /**\n * Names registered via macro() — used by hasMacro() and flushMacros().\n */\n protected static macroNames = new Set<string | symbol>()\n\n /**\n * Names registered via getter() — used by hasMacro() and flushMacros().\n */\n protected static getterNames = new Set<string | symbol>()\n\n /**\n * Original prototype values saved before macro() overrides them.\n * Used by flushMacros() to restore native methods.\n */\n private static _originals = new Map<string | symbol, { existed: boolean; value: unknown }>()\n\n // ── Macros (prototype-level) ──────────────────────────────\n\n /**\n * Register a macro on the class prototype.\n * Can override existing methods.\n *\n * When the name matches an existing property, the value type is auto-derived.\n *\n * @param name - Method or property name\n * @param value - Function or value to assign\n */\n static macro<T extends Constructor, K extends keyof InstanceType<T>>(\n this: T,\n name: K,\n value: InstanceType<T>[K],\n ): void\n static macro(name: string | symbol, value: unknown): void\n static macro(name: string | symbol, value: unknown): void {\n if (!Object.prototype.hasOwnProperty.call(this, 'macroNames')) {\n this.macroNames = new Set(this.macroNames)\n }\n if (!Object.prototype.hasOwnProperty.call(this, '_originals')) {\n this._originals = new Map(this._originals)\n }\n\n // Save the original value before first override so flushMacros() can restore it\n if (!this._originals.has(name)) {\n const existed = Object.prototype.hasOwnProperty.call(this.prototype, name)\n this._originals.set(name, {\n existed,\n value: existed ? (this.prototype as Record<string | symbol, unknown>)[name] : undefined,\n })\n }\n\n this.macroNames.add(name);\n (this.prototype as Record<string | symbol, unknown>)[name] = value\n }\n\n // ── Instance properties (bound per-instance) ─────────────\n\n /**\n * Register a per-instance property that is bound to `this`\n * in the constructor. Safe for destructuring.\n *\n * When the name matches an existing property, the value type is auto-derived.\n *\n * @param name - Property name\n * @param value - Function (will be bound) or value\n */\n static instanceProperty<T extends Constructor, K extends keyof InstanceType<T>>(\n this: T,\n name: K,\n value: InstanceType<T>[K],\n ): void\n static instanceProperty(name: string | symbol, value: unknown): void\n static instanceProperty(name: string | symbol, value: unknown): void {\n if (!Object.prototype.hasOwnProperty.call(this, 'instanceMacros')) {\n this.instanceMacros = new Set(this.instanceMacros)\n }\n this.instanceMacros.add({ key: name, value })\n }\n\n // ── Getters (Object.defineProperty on prototype) ──────────\n\n /**\n * Register a computed getter on the class prototype.\n *\n * @param name - Property name\n * @param accumulator - Function that computes the value (called with instance as `this`)\n * @param singleton - If true, cache the value after first access\n */\n static getter<T extends Constructor, K extends keyof InstanceType<T>>(\n this: T,\n name: K,\n accumulator: (this: InstanceType<T>) => InstanceType<T>[K],\n singleton?: boolean,\n ): void\n static getter(name: string | symbol, accumulator: MacroFunction, singleton?: boolean): void\n static getter(\n name: string | symbol,\n accumulator: MacroFunction,\n singleton = false,\n ): void {\n if (!Object.prototype.hasOwnProperty.call(this, 'getterNames')) {\n this.getterNames = new Set(this.getterNames)\n }\n this.getterNames.add(name)\n\n Object.defineProperty(this.prototype, name, {\n get(): unknown {\n const value: unknown = accumulator.call(this)\n if (singleton) {\n Object.defineProperty(this, name, {\n value,\n configurable: false,\n enumerable: false,\n writable: false,\n })\n }\n return value\n },\n configurable: true,\n enumerable: false,\n })\n }\n\n // ── Introspection ─────────────────────────────────────────\n\n /**\n * Check if a macro, instance property, or getter is registered.\n *\n * @param name - Name to check\n */\n static hasMacro(name: string | symbol): boolean {\n return (\n this.macroNames.has(name) ||\n [...this.instanceMacros].some((m) => m.key === name) ||\n this.getterNames.has(name)\n )\n }\n\n // ── Cleanup ───────────────────────────────────────────────\n\n /**\n * Remove all macros, instance properties, and getters\n * registered on this class. Does not affect parent classes.\n */\n static flushMacros(): void {\n const proto = this.prototype as Record<string | symbol, unknown>\n\n // Restore original prototype values or delete if they didn't exist before\n for (const name of this.macroNames) {\n const original = this._originals.get(name)\n if (original?.existed) {\n proto[name] = original.value\n } else {\n Reflect.deleteProperty(proto, name)\n }\n }\n for (const name of this.getterNames) {\n Reflect.deleteProperty(proto, name)\n }\n\n if (Object.prototype.hasOwnProperty.call(this, 'macroNames')) {\n this.macroNames.clear()\n }\n if (Object.prototype.hasOwnProperty.call(this, 'instanceMacros')) {\n this.instanceMacros.clear()\n }\n if (Object.prototype.hasOwnProperty.call(this, 'getterNames')) {\n this.getterNames.clear()\n }\n if (Object.prototype.hasOwnProperty.call(this, '_originals')) {\n this._originals.clear()\n }\n }\n\n // ── Constructor (applies instance properties) ─────────────\n\n constructor() {\n const Constructor = this.constructor as typeof Macroable\n const self = this as Record<string | symbol, unknown>\n Constructor.instanceMacros.forEach(({ key, value }) => {\n if (typeof value === 'function') {\n self[key] = value.bind(this)\n } else {\n self[key] = value\n }\n })\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,IAAsB,YAAtB,MAAgC;;;;;CAM9B,OAAiB,iCAAiB,IAAI,IAA8C;;;;CAKpF,OAAiB,6BAAa,IAAI,IAAqB;;;;CAKvD,OAAiB,8BAAc,IAAI,IAAqB;;;;;CAMxD,OAAe,6BAAa,IAAI,IAA2D;CAmB3F,OAAO,MAAM,MAAuB,OAAsB;EACxD,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,YAAY,GAC1D,KAAK,aAAa,IAAI,IAAI,KAAK,UAAU;EAE3C,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,YAAY,GAC1D,KAAK,aAAa,IAAI,IAAI,KAAK,UAAU;EAI3C,IAAI,CAAC,KAAK,WAAW,IAAI,IAAI,GAAG;GAC9B,MAAM,UAAU,OAAO,UAAU,eAAe,KAAK,KAAK,WAAW,IAAI;GACzE,KAAK,WAAW,IAAI,MAAM;IACxB;IACA,OAAO,UAAW,KAAK,UAA+C,QAAQ,KAAA;GAChF,CAAC;EACH;EAEA,KAAK,WAAW,IAAI,IAAI;EACxB,KAAM,UAA+C,QAAQ;CAC/D;CAmBA,OAAO,iBAAiB,MAAuB,OAAsB;EACnE,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,gBAAgB,GAC9D,KAAK,iBAAiB,IAAI,IAAI,KAAK,cAAc;EAEnD,KAAK,eAAe,IAAI;GAAE,KAAK;GAAM;EAAM,CAAC;CAC9C;CAkBA,OAAO,OACL,MACA,aACA,YAAY,OACN;EACN,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,aAAa,GAC3D,KAAK,cAAc,IAAI,IAAI,KAAK,WAAW;EAE7C,KAAK,YAAY,IAAI,IAAI;EAEzB,OAAO,eAAe,KAAK,WAAW,MAAM;GAC1C,MAAe;IACb,MAAM,QAAiB,YAAY,KAAK,IAAI;IAC5C,IAAI,WACF,OAAO,eAAe,MAAM,MAAM;KAChC;KACA,cAAc;KACd,YAAY;KACZ,UAAU;IACZ,CAAC;IAEH,OAAO;GACT;GACA,cAAc;GACd,YAAY;EACd,CAAC;CACH;;;;;;CASA,OAAO,SAAS,MAAgC;EAC9C,OACE,KAAK,WAAW,IAAI,IAAI,KACxB,CAAC,GAAG,KAAK,cAAc,EAAE,MAAM,MAAM,EAAE,QAAQ,IAAI,KACnD,KAAK,YAAY,IAAI,IAAI;CAE7B;;;;;CAQA,OAAO,cAAoB;EACzB,MAAM,QAAQ,KAAK;EAGnB,KAAK,MAAM,QAAQ,KAAK,YAAY;GAClC,MAAM,WAAW,KAAK,WAAW,IAAI,IAAI;GACzC,IAAI,UAAU,SACZ,MAAM,QAAQ,SAAS;QAEvB,QAAQ,eAAe,OAAO,IAAI;EAEtC;EACA,KAAK,MAAM,QAAQ,KAAK,aACtB,QAAQ,eAAe,OAAO,IAAI;EAGpC,IAAI,OAAO,UAAU,eAAe,KAAK,MAAM,YAAY,GACzD,KAAK,WAAW,MAAM;EAExB,IAAI,OAAO,UAAU,eAAe,KAAK,MAAM,gBAAgB,GAC7D,KAAK,eAAe,MAAM;EAE5B,IAAI,OAAO,UAAU,eAAe,KAAK,MAAM,aAAa,GAC1D,KAAK,YAAY,MAAM;EAEzB,IAAI,OAAO,UAAU,eAAe,KAAK,MAAM,YAAY,GACzD,KAAK,WAAW,MAAM;CAE1B;CAIA,cAAc;EACZ,MAAM,cAAc,KAAK;EACzB,MAAM,OAAO;EACb,YAAY,eAAe,SAAS,EAAE,KAAK,YAAY;GACrD,IAAI,OAAO,UAAU,YACnB,KAAK,OAAO,MAAM,KAAK,IAAI;QAE3B,KAAK,OAAO;EAEhB,CAAC;CACH;AACF"}
@@ -0,0 +1,39 @@
1
+ //#region src/di/metadata.ts
2
+ const STORE_KEY = Symbol.for("stratal:metadata:store");
3
+ const g = globalThis;
4
+ const store = g[STORE_KEY] ?? (g[STORE_KEY] = /* @__PURE__ */ new WeakMap());
5
+ function getKeyTarget(target, propertyKey) {
6
+ if (propertyKey === void 0) return target;
7
+ let propMap = store.get(target);
8
+ if (!propMap) {
9
+ propMap = /* @__PURE__ */ new Map();
10
+ store.set(target, propMap);
11
+ }
12
+ let propTarget = propMap.get(propertyKey);
13
+ if (!propTarget) {
14
+ propTarget = Object.create(null);
15
+ propMap.set(propertyKey, propTarget);
16
+ }
17
+ return propTarget;
18
+ }
19
+ function defineMetadata(key, value, target, propertyKey) {
20
+ const resolved = getKeyTarget(target, propertyKey);
21
+ let meta = store.get(resolved);
22
+ if (!meta) {
23
+ meta = /* @__PURE__ */ new Map();
24
+ store.set(resolved, meta);
25
+ }
26
+ meta.set(key, value);
27
+ }
28
+ function getMetadata(key, target, propertyKey) {
29
+ const resolved = getKeyTarget(target, propertyKey);
30
+ return store.get(resolved)?.get(key);
31
+ }
32
+ function hasMetadata(key, target, propertyKey) {
33
+ const resolved = getKeyTarget(target, propertyKey);
34
+ return store.get(resolved)?.has(key) ?? false;
35
+ }
36
+ //#endregion
37
+ export { getMetadata as n, hasMetadata as r, defineMetadata as t };
38
+
39
+ //# sourceMappingURL=metadata-DzzprcID.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-DzzprcID.mjs","names":[],"sources":["../src/di/metadata.ts"],"sourcesContent":["type MetadataTarget = object | string | symbol\n\nconst STORE_KEY = Symbol.for('stratal:metadata:store')\nconst g = globalThis as Record<symbol, unknown>\nconst store: WeakMap<object, Map<MetadataTarget, unknown>> =\n (g[STORE_KEY] as WeakMap<object, Map<MetadataTarget, unknown>>) ??\n (g[STORE_KEY] = new WeakMap<object, Map<MetadataTarget, unknown>>())\n\nfunction getKeyTarget(target: object, propertyKey?: string | symbol): object {\n if (propertyKey === undefined) return target\n let propMap = store.get(target)\n if (!propMap) {\n propMap = new Map()\n store.set(target, propMap)\n }\n let propTarget = propMap.get(propertyKey) as object | undefined\n if (!propTarget) {\n propTarget = Object.create(null) as object\n propMap.set(propertyKey, propTarget)\n }\n return propTarget\n}\n\nexport function defineMetadata(key: symbol, value: unknown, target: object, propertyKey?: string | symbol): void {\n const resolved = getKeyTarget(target, propertyKey)\n let meta = store.get(resolved)\n if (!meta) {\n meta = new Map()\n store.set(resolved, meta)\n }\n meta.set(key, value)\n}\n\nexport function getMetadata<T = unknown>(key: symbol, target: object, propertyKey?: string | symbol): T | undefined {\n const resolved = getKeyTarget(target, propertyKey)\n return store.get(resolved)?.get(key) as T | undefined\n}\n\nexport function hasMetadata(key: symbol, target: object, propertyKey?: string | symbol): boolean {\n const resolved = getKeyTarget(target, propertyKey)\n return store.get(resolved)?.has(key) ?? false\n}\n"],"mappings":";AAEA,MAAM,YAAY,OAAO,IAAI,wBAAwB;AACrD,MAAM,IAAI;AACV,MAAM,QACH,EAAE,eACF,EAAE,6BAAa,IAAI,QAA8C;AAEpE,SAAS,aAAa,QAAgB,aAAuC;CAC3E,IAAI,gBAAgB,KAAA,GAAW,OAAO;CACtC,IAAI,UAAU,MAAM,IAAI,MAAM;CAC9B,IAAI,CAAC,SAAS;EACZ,0BAAU,IAAI,IAAI;EAClB,MAAM,IAAI,QAAQ,OAAO;CAC3B;CACA,IAAI,aAAa,QAAQ,IAAI,WAAW;CACxC,IAAI,CAAC,YAAY;EACf,aAAa,OAAO,OAAO,IAAI;EAC/B,QAAQ,IAAI,aAAa,UAAU;CACrC;CACA,OAAO;AACT;AAEA,SAAgB,eAAe,KAAa,OAAgB,QAAgB,aAAqC;CAC/G,MAAM,WAAW,aAAa,QAAQ,WAAW;CACjD,IAAI,OAAO,MAAM,IAAI,QAAQ;CAC7B,IAAI,CAAC,MAAM;EACT,uBAAO,IAAI,IAAI;EACf,MAAM,IAAI,UAAU,IAAI;CAC1B;CACA,KAAK,IAAI,KAAK,KAAK;AACrB;AAEA,SAAgB,YAAyB,KAAa,QAAgB,aAA8C;CAClH,MAAM,WAAW,aAAa,QAAQ,WAAW;CACjD,OAAO,MAAM,IAAI,QAAQ,GAAG,IAAI,GAAG;AACrC;AAEA,SAAgB,YAAY,KAAa,QAAgB,aAAwC;CAC/F,MAAM,WAAW,aAAa,QAAQ,WAAW;CACjD,OAAO,MAAM,IAAI,QAAQ,GAAG,IAAI,GAAG,KAAK;AAC1C"}
@@ -1,32 +1,15 @@
1
- import { $t as ModuleRegistry, An as ValueProvider, Cn as ModuleContext, Dn as OnShutdown, En as OnInitialize, On as Provider, Sn as ModuleClass, Tn as OnException, _n as ClassProvider, bn as FactoryProvider, gn as AsyncModuleOptions, kn as RegistryEntry, vn as DynamicModule, wn as ModuleOptions, xn as InjectionToken, yn as ExistingProvider } from "../index-ByOyTmqf.mjs";
2
- import { t as Constructor } from "../types-cySNS_lp.mjs";
1
+ import { An as ExistingProvider, Dn as AsyncModuleOptions, Dr as ApplicationError, Fn as OnException, Hn as InjectionToken, In as OnInitialize, Ln as OnShutdown, Mn as ModuleClass, Nn as ModuleContext, On as ClassProvider, Pn as ModuleOptions, Rn as Provider, jn as FactoryProvider, kn as DynamicModule, ln as ModuleRegistry, zn as ValueProvider } from "../index-B_JoEl3V.mjs";
2
+ import { t as Constructor } from "../types-CmV_9xBD.mjs";
3
+ import { n as ModuleRef, t as LazyModuleLoader } from "../lazy-module-loader-Ib383jH_.mjs";
3
4
 
5
+ //#region src/module/module.error.d.ts
6
+ declare class ModuleError extends ApplicationError {}
7
+ //#endregion
4
8
  //#region src/module/module.decorator.d.ts
5
9
  declare const MODULE_OPTIONS_KEY: unique symbol;
6
- /**
7
- * `@Module` decorator - defines a module with imports, providers, controllers, consumers, jobs
8
- *
9
- * Uses tsyringe's `@registry` internally to auto-register providers when module is imported.
10
- *
11
- * @example
12
- * ```typescript
13
- * @Module({
14
- * imports: [OtherModule],
15
- * providers: [MyService, MyRepository],
16
- * controllers: [MyController],
17
- * })
18
- * export class MyModule {}
19
- * ```
20
- */
21
10
  declare function Module(options: ModuleOptions): <TFunction extends abstract new (...args: never[]) => unknown>(target: TFunction) => TFunction;
22
- /**
23
- * Get module options from decorated class
24
- */
25
11
  declare function getModuleOptions(target: Constructor): ModuleOptions | undefined;
26
- /**
27
- * Check if a class is decorated with `@Module`
28
- */
29
12
  declare function isModuleClass(target: unknown): target is Constructor;
30
13
  //#endregion
31
- export { AsyncModuleOptions, ClassProvider, DynamicModule, ExistingProvider, FactoryProvider, InjectionToken, MODULE_OPTIONS_KEY, Module, ModuleClass, ModuleContext, ModuleOptions, ModuleRegistry, OnException, OnInitialize, OnShutdown, Provider, RegistryEntry, ValueProvider, getModuleOptions, isModuleClass };
14
+ export { AsyncModuleOptions, ClassProvider, DynamicModule, ExistingProvider, FactoryProvider, type InjectionToken, LazyModuleLoader, MODULE_OPTIONS_KEY, Module, ModuleClass, ModuleContext, ModuleError, ModuleOptions, ModuleRef, ModuleRegistry, OnException, OnInitialize, OnShutdown, Provider, ValueProvider, getModuleOptions, isModuleClass };
32
15
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/module/module.decorator.ts"],"mappings":";;;;cAea,kBAAA;AAyBb;;;;;;;;;;;;;;;AAAA,iBAAgB,MAAA,CAAO,OAAA,EAAS,aAAA,uCACa,IAAA,uBAA2B,MAAA,EAAQ,SAAA,KAAY,SAAA;;AAmB5F;;iBAAgB,gBAAA,CAAiB,MAAA,EAAQ,WAAA,GAAc,aAAA;;;;iBAOvC,aAAA,CAAc,MAAA,YAAkB,MAAA,IAAU,WAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/module/module.error.ts","../../src/module/module.decorator.ts"],"mappings":";;;;;cAEa,WAAA,SAAoB,gBAAgB;;;cCEpC,kBAAA;AAAA,iBAEG,MAAA,CAAO,OAAA,EAAS,aAAA,uCACa,IAAA,uBAA2B,MAAA,EAAQ,SAAA,KAAY,SAAA;AAAA,iBAM5E,gBAAA,CAAiB,MAAA,EAAQ,WAAA,GAAc,aAAa;AAAA,iBAIpD,aAAA,CAAc,MAAA,YAAkB,MAAA,IAAU,WAAW"}
@@ -1,2 +1,10 @@
1
- import { A as getModuleOptions, O as MODULE_OPTIONS_KEY, j as isModuleClass, k as Module, t as ModuleRegistry } from "../module-BzLg57FK.mjs";
2
- export { MODULE_OPTIONS_KEY, Module, ModuleRegistry, getModuleOptions, isModuleClass };
1
+ import { a as ApplicationError } from "../container-storage-BmOJ4_Na.mjs";
2
+ import "../errors-mXYxG0XB.mjs";
3
+ import { i as isModuleClass, n as Module, r as getModuleOptions, t as MODULE_OPTIONS_KEY } from "../module.decorator-CYHY6pG5.mjs";
4
+ import { d as LazyModuleLoader, f as ModuleRef, t as ModuleRegistry } from "../module-registry-Dm-pqHd3.mjs";
5
+ //#region src/module/module.error.ts
6
+ var ModuleError = class extends ApplicationError {};
7
+ //#endregion
8
+ export { LazyModuleLoader, MODULE_OPTIONS_KEY, Module, ModuleError, ModuleRef, ModuleRegistry, getModuleOptions, isModuleClass };
9
+
10
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/module/module.error.ts"],"sourcesContent":["import { ApplicationError } from '../errors'\n\nexport class ModuleError extends ApplicationError {}\n"],"mappings":";;;;;AAEA,IAAa,cAAb,cAAiC,iBAAiB,CAAC"}