stratal 0.0.17 → 0.0.19

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 (200) hide show
  1. package/README.md +8 -8
  2. package/dist/{base-email.provider-DypUAfWm.mjs → base-email.provider-mjynzewK.mjs} +1 -1
  3. package/dist/{base-email.provider-DypUAfWm.mjs.map → base-email.provider-mjynzewK.mjs.map} +1 -1
  4. package/dist/bin/cloudflare-workers-loader.mjs +33 -1
  5. package/dist/bin/cloudflare-workers-loader.mjs.map +1 -1
  6. package/dist/bin/quarry.mjs +169 -7
  7. package/dist/bin/quarry.mjs.map +1 -1
  8. package/dist/cache/index.d.mts +3 -2
  9. package/dist/cache/index.d.mts.map +1 -1
  10. package/dist/cache/index.mjs +3 -10
  11. package/dist/cache/index.mjs.map +1 -1
  12. package/dist/{colors-Y7WIFXs7.mjs → colors-DJaRDXoS.mjs} +1 -1
  13. package/dist/{colors-Y7WIFXs7.mjs.map → colors-DJaRDXoS.mjs.map} +1 -1
  14. package/dist/{command-B1CPgsrU.mjs → command-BgSlsS4M.mjs} +3 -3
  15. package/dist/command-BgSlsS4M.mjs.map +1 -0
  16. package/dist/{command-TnkPYWta.d.mts → command-DsQq56Lp.d.mts} +2 -2
  17. package/dist/{command-TnkPYWta.d.mts.map → command-DsQq56Lp.d.mts.map} +1 -1
  18. package/dist/config/index.d.mts +81 -37
  19. package/dist/config/index.d.mts.map +1 -1
  20. package/dist/config/index.mjs +135 -61
  21. package/dist/config/index.mjs.map +1 -1
  22. package/dist/{consumer-registry-Bymm6ff4.d.mts → consumer-registry-Doom7BEh.d.mts} +1 -1
  23. package/dist/{consumer-registry-Bymm6ff4.d.mts.map → consumer-registry-Doom7BEh.d.mts.map} +1 -1
  24. package/dist/controller.decorator-LZY9aHYG.mjs +66 -0
  25. package/dist/controller.decorator-LZY9aHYG.mjs.map +1 -0
  26. package/dist/cron/index.d.mts +4 -3
  27. package/dist/cron/index.d.mts.map +1 -1
  28. package/dist/cron/index.mjs +1 -3
  29. package/dist/{cron-manager-CFBamKKk.mjs → cron-manager-C30t9UZM.mjs} +29 -19
  30. package/dist/cron-manager-C30t9UZM.mjs.map +1 -0
  31. package/dist/{cron-manager-D7imGwUT.d.mts → cron-manager-RuPtFVLy.d.mts} +28 -14
  32. package/dist/cron-manager-RuPtFVLy.d.mts.map +1 -0
  33. package/dist/di/index.d.mts +2 -2
  34. package/dist/di/index.mjs +3 -3
  35. package/dist/email/index.d.mts +3 -3
  36. package/dist/email/index.mjs +87 -18
  37. package/dist/email/index.mjs.map +1 -1
  38. package/dist/{en-DaewN8hc.mjs → en-rHmW6vD9.mjs} +14 -31
  39. package/dist/en-rHmW6vD9.mjs.map +1 -0
  40. package/dist/env-CamWD-U1.d.mts +25 -0
  41. package/dist/env-CamWD-U1.d.mts.map +1 -0
  42. package/dist/errors/index.d.mts +2 -2
  43. package/dist/errors/index.mjs +2 -3
  44. package/dist/errors-B4pYgYON.mjs +1714 -0
  45. package/dist/errors-B4pYgYON.mjs.map +1 -0
  46. package/dist/{errors-DuAR5Wke.mjs → errors-BUyUfr2Z.mjs} +14 -7
  47. package/dist/errors-BUyUfr2Z.mjs.map +1 -0
  48. package/dist/events/index.d.mts +2 -2
  49. package/dist/events/index.mjs +1 -2
  50. package/dist/{events-CvUSgEuN.mjs → events-COKixqnG.mjs} +2 -2
  51. package/dist/{events-CvUSgEuN.mjs.map → events-COKixqnG.mjs.map} +1 -1
  52. package/dist/{gateway-context-CNOLkLUC.mjs → gateway-context-cqZ8wMoi.mjs} +4 -9
  53. package/dist/gateway-context-cqZ8wMoi.mjs.map +1 -0
  54. package/dist/guards/index.d.mts +14 -5
  55. package/dist/guards/index.d.mts.map +1 -1
  56. package/dist/guards/index.mjs +1 -1
  57. package/dist/{guards-DUk_Kzst.mjs → guards-DMbsAxSX.mjs} +1 -1
  58. package/dist/guards-DMbsAxSX.mjs.map +1 -0
  59. package/dist/http-method.decorator-BT3ufnz8.mjs +96 -0
  60. package/dist/http-method.decorator-BT3ufnz8.mjs.map +1 -0
  61. package/dist/i18n/index.d.mts +3 -3
  62. package/dist/i18n/index.mjs +3 -16
  63. package/dist/i18n/messages/en/index.d.mts +1 -1
  64. package/dist/i18n/messages/en/index.mjs +1 -1
  65. package/dist/i18n/utils/index.d.mts +30 -0
  66. package/dist/i18n/utils/index.d.mts.map +1 -0
  67. package/dist/i18n/utils/index.mjs +2 -0
  68. package/dist/i18n/validation/index.d.mts +1 -1
  69. package/dist/i18n/validation/index.mjs +1 -1
  70. package/dist/i18n.module-CI_prYFD.mjs +2340 -0
  71. package/dist/i18n.module-CI_prYFD.mjs.map +1 -0
  72. package/dist/{index-NGxg-KP_.d.mts → index-B437eK7p.d.mts} +59 -16
  73. package/dist/index-B437eK7p.d.mts.map +1 -0
  74. package/dist/{index-Dp6A5ywM.d.mts → index-CWRS7Ri3.d.mts} +1 -1
  75. package/dist/{index-Dp6A5ywM.d.mts.map → index-CWRS7Ri3.d.mts.map} +1 -1
  76. package/dist/{index-D_w_Rmtd.d.mts → index-DFhEeFfC.d.mts} +13 -30
  77. package/dist/{index-D_w_Rmtd.d.mts.map → index-DFhEeFfC.d.mts.map} +1 -1
  78. package/dist/index-DPFqRs8L.d.mts +4318 -0
  79. package/dist/index-DPFqRs8L.d.mts.map +1 -0
  80. package/dist/{index-DGRe6Yoa.d.mts → index-Dnqm9ZB6.d.mts} +5 -4
  81. package/dist/index-Dnqm9ZB6.d.mts.map +1 -0
  82. package/dist/index-SHx31sBJ.d.mts +101 -0
  83. package/dist/index-SHx31sBJ.d.mts.map +1 -0
  84. package/dist/index.d.mts +5 -3
  85. package/dist/index.d.mts.map +1 -1
  86. package/dist/index.mjs +1 -20
  87. package/dist/{is-command-DJVI6wEJ.mjs → is-command-C6a7WTPw.mjs} +2 -2
  88. package/dist/{is-command-DJVI6wEJ.mjs.map → is-command-C6a7WTPw.mjs.map} +1 -1
  89. package/dist/{is-seeder-D5MIEcdz.mjs → is-seeder-CebjZCDn.mjs} +1 -1
  90. package/dist/{is-seeder-D5MIEcdz.mjs.map → is-seeder-CebjZCDn.mjs.map} +1 -1
  91. package/dist/logger/index.d.mts +1 -1
  92. package/dist/logger/index.mjs +1 -1
  93. package/dist/{logger-CGT91VY6.mjs → logger-V6Ms3QnQ.mjs} +63 -45
  94. package/dist/logger-V6Ms3QnQ.mjs.map +1 -0
  95. package/dist/macroable/index.d.mts +2 -0
  96. package/dist/macroable/index.mjs +2 -0
  97. package/dist/macroable-BmufBshB.mjs +122 -0
  98. package/dist/macroable-BmufBshB.mjs.map +1 -0
  99. package/dist/module/index.d.mts +3 -4
  100. package/dist/module/index.d.mts.map +1 -1
  101. package/dist/module/index.mjs +1 -10
  102. package/dist/module-qGE_1duv.mjs +732 -0
  103. package/dist/module-qGE_1duv.mjs.map +1 -0
  104. package/dist/openapi/index.d.mts +3 -3
  105. package/dist/openapi/index.mjs +2 -15
  106. package/dist/{openapi-tools.service-B3TxYKoQ.mjs → openapi-tools.service-CYWGuhue.mjs} +4 -1
  107. package/dist/{openapi-tools.service-B3TxYKoQ.mjs.map → openapi-tools.service-CYWGuhue.mjs.map} +1 -1
  108. package/dist/{openapi.service-DGnX3Fc4.d.mts → openapi.service-Bv_NioM9.d.mts} +9 -17
  109. package/dist/openapi.service-Bv_NioM9.d.mts.map +1 -0
  110. package/dist/quarry/index.d.mts +26 -12
  111. package/dist/quarry/index.d.mts.map +1 -1
  112. package/dist/quarry/index.mjs +4 -8
  113. package/dist/{quarry-registry-B2rkO-JS.mjs → quarry-registry-DFfRRkA7.mjs} +45 -40
  114. package/dist/quarry-registry-DFfRRkA7.mjs.map +1 -0
  115. package/dist/queue/index.d.mts +2 -2
  116. package/dist/queue/index.mjs +3 -13
  117. package/dist/queue/index.mjs.map +1 -1
  118. package/dist/{queue.module-BtI8f4Jo.mjs → queue.module-P-G-nCYz.mjs} +39 -42
  119. package/dist/queue.module-P-G-nCYz.mjs.map +1 -0
  120. package/dist/r2-storage.provider-LdzK9tfG.mjs +244 -0
  121. package/dist/r2-storage.provider-LdzK9tfG.mjs.map +1 -0
  122. package/dist/{resend.provider-bXMEkdRJ.mjs → resend.provider-bwILp0WI.mjs} +2 -4
  123. package/dist/{resend.provider-bXMEkdRJ.mjs.map → resend.provider-bwILp0WI.mjs.map} +1 -1
  124. package/dist/router/index.d.mts +2 -2
  125. package/dist/router/index.mjs +7 -16
  126. package/dist/seeder/index.d.mts +3 -4
  127. package/dist/seeder/index.d.mts.map +1 -1
  128. package/dist/seeder/index.mjs +2 -6
  129. package/dist/{seeder-R7RXJC35.mjs → seeder-BcqIFa2X.mjs} +5 -5
  130. package/dist/{seeder-R7RXJC35.mjs.map → seeder-BcqIFa2X.mjs.map} +1 -1
  131. package/dist/setup-CtekcwuO.mjs +37 -0
  132. package/dist/setup-CtekcwuO.mjs.map +1 -0
  133. package/dist/signed-url-COX7cCWR.mjs +74 -0
  134. package/dist/signed-url-COX7cCWR.mjs.map +1 -0
  135. package/dist/{smtp.provider-DrbHQztF.mjs → smtp.provider-B07yuARi.mjs} +2 -4
  136. package/dist/{smtp.provider-DrbHQztF.mjs.map → smtp.provider-B07yuARi.mjs.map} +1 -1
  137. package/dist/storage/index.d.mts +39 -17
  138. package/dist/storage/index.d.mts.map +1 -1
  139. package/dist/storage/index.mjs +3 -14
  140. package/dist/storage/providers/index.d.mts +30 -69
  141. package/dist/storage/providers/index.d.mts.map +1 -1
  142. package/dist/storage/providers/index.mjs +2 -5
  143. package/dist/{storage-CZKHOhci.mjs → storage-P6X4h9So.mjs} +102 -29
  144. package/dist/storage-P6X4h9So.mjs.map +1 -0
  145. package/dist/{storage-provider.interface-0IqcdhBf.d.mts → storage-provider.interface-CC1nniHk.d.mts} +20 -15
  146. package/dist/storage-provider.interface-CC1nniHk.d.mts.map +1 -0
  147. package/dist/stratal-BCiwCFN9.mjs +533 -0
  148. package/dist/stratal-BCiwCFN9.mjs.map +1 -0
  149. package/dist/{types-DahElfUw.d.mts → types-DIWemRad.d.mts} +2 -2
  150. package/dist/types-DIWemRad.d.mts.map +1 -0
  151. package/dist/{usage-generator-CVIsENuE.mjs → usage-generator-MBcRo0Q2.mjs} +2 -2
  152. package/dist/{usage-generator-CVIsENuE.mjs.map → usage-generator-MBcRo0Q2.mjs.map} +1 -1
  153. package/dist/{validation-DQTC259A.mjs → validation-Dbg3ehdP.mjs} +2 -2
  154. package/dist/{validation-DQTC259A.mjs.map → validation-Dbg3ehdP.mjs.map} +1 -1
  155. package/dist/websocket/index.d.mts +3 -3
  156. package/dist/websocket/index.d.mts.map +1 -1
  157. package/dist/websocket/index.mjs +1 -4
  158. package/dist/workers/index.d.mts +2 -1
  159. package/dist/workers/index.d.mts.map +1 -1
  160. package/dist/workers/index.mjs +2 -20
  161. package/dist/workers/index.mjs.map +1 -1
  162. package/package.json +41 -50
  163. package/dist/application-DfPtIzxF.d.mts +0 -177
  164. package/dist/application-DfPtIzxF.d.mts.map +0 -1
  165. package/dist/command-B1CPgsrU.mjs.map +0 -1
  166. package/dist/cron-manager-CFBamKKk.mjs.map +0 -1
  167. package/dist/cron-manager-D7imGwUT.d.mts.map +0 -1
  168. package/dist/en-DaewN8hc.mjs.map +0 -1
  169. package/dist/errors-DSKapqD8.mjs +0 -707
  170. package/dist/errors-DSKapqD8.mjs.map +0 -1
  171. package/dist/errors-DuAR5Wke.mjs.map +0 -1
  172. package/dist/gateway-context-CNOLkLUC.mjs.map +0 -1
  173. package/dist/guards-DUk_Kzst.mjs.map +0 -1
  174. package/dist/i18n.module-Dn9SrFdS.mjs +0 -1841
  175. package/dist/i18n.module-Dn9SrFdS.mjs.map +0 -1
  176. package/dist/index-BFCxSp_f.d.mts +0 -2625
  177. package/dist/index-BFCxSp_f.d.mts.map +0 -1
  178. package/dist/index-DGRe6Yoa.d.mts.map +0 -1
  179. package/dist/index-NGxg-KP_.d.mts.map +0 -1
  180. package/dist/logger-CGT91VY6.mjs.map +0 -1
  181. package/dist/middleware/index.d.mts +0 -2
  182. package/dist/middleware/index.mjs +0 -5
  183. package/dist/middleware-Bl-b5pkt.mjs +0 -362
  184. package/dist/middleware-Bl-b5pkt.mjs.map +0 -1
  185. package/dist/module-registry-CmjBX6ol.d.mts +0 -121
  186. package/dist/module-registry-CmjBX6ol.d.mts.map +0 -1
  187. package/dist/module-tUtyVJ5E.mjs +0 -371
  188. package/dist/module-tUtyVJ5E.mjs.map +0 -1
  189. package/dist/openapi.service-DGnX3Fc4.d.mts.map +0 -1
  190. package/dist/quarry-registry-B2rkO-JS.mjs.map +0 -1
  191. package/dist/queue.module-BtI8f4Jo.mjs.map +0 -1
  192. package/dist/router-context-D9R1v2Ac.mjs +0 -267
  193. package/dist/router-context-D9R1v2Ac.mjs.map +0 -1
  194. package/dist/s3-storage.provider-CttzNnDR.mjs +0 -335
  195. package/dist/s3-storage.provider-CttzNnDR.mjs.map +0 -1
  196. package/dist/storage-CZKHOhci.mjs.map +0 -1
  197. package/dist/storage-provider.interface-0IqcdhBf.d.mts.map +0 -1
  198. package/dist/stratal-D5smIU1y.mjs +0 -315
  199. package/dist/stratal-D5smIU1y.mjs.map +0 -1
  200. package/dist/types-DahElfUw.d.mts.map +0 -1
@@ -0,0 +1,533 @@
1
+ import { A as Scope, D as runWithContainer, H as ApplicationError, V as ROUTER_TOKENS, g as DefaultExceptionHandler, i as createCronExceptionContext, j as Container, o as createQueueExceptionContext, r as createCliExceptionContext, t as StratalNotInitializedError } from "./errors-B4pYgYON.mjs";
2
+ import { a as __decorate, f as DI_TOKENS, i as LoggerService, n as PrettyFormatter, o as __decorateParam, r as JsonFormatter, s as __decorateMetadata, t as ConsoleTransport, u as LOGGER_TOKENS } from "./logger-V6Ms3QnQ.mjs";
3
+ import { a as getGroups, i as getGlobalMiddleware, r as getDefaultEntry, t as ModuleRegistry } from "./module-qGE_1duv.mjs";
4
+ import { r as getListenerHandlers, t as EventRegistry } from "./events-COKixqnG.mjs";
5
+ import { t as Command } from "./command-BgSlsS4M.mjs";
6
+ import { CacheModule } from "./cache/index.mjs";
7
+ import { t as CronManager } from "./cron-manager-C30t9UZM.mjs";
8
+ import { A as OpenAPIModule, c as LocalePathService, i as Uri, l as HonoApp, o as RouteRegistry, s as VersioningService, t as I18nModule, u as RouteRegistrationService } from "./i18n.module-CI_prYFD.mjs";
9
+ import { a as QueueListCommand, c as HelpCommand, d as ApiCommand, i as RouteListCommand, o as McpToolsCommand, r as ScheduleListCommand, s as McpServeCommand, t as QuarryRegistry, u as EventListCommand } from "./quarry-registry-DFfRRkA7.mjs";
10
+ import { t as QueueModule } from "./queue.module-P-G-nCYz.mjs";
11
+ import { i as SeederRegistry, n as DbSeedListCommand, r as SEEDER_TOKENS, t as DbSeedCommand } from "./seeder-BcqIFa2X.mjs";
12
+ import { container, inject, injectable } from "tsyringe";
13
+ import "reflect-metadata";
14
+ import { writeFileSync } from "node:fs";
15
+ import { resolve } from "node:path";
16
+ //#region src/quarry/commands/route-types.command.ts
17
+ let RouteTypesCommand = class RouteTypesCommand extends Command {
18
+ static command = "route:types {--output=src/stratal.d.ts : Output file path}";
19
+ static description = "Generate TypeScript types for named routes";
20
+ constructor(registry, localePathService) {
21
+ super();
22
+ this.registry = registry;
23
+ this.localePathService = localePathService;
24
+ }
25
+ handle() {
26
+ const outputPath = resolve(this.string("output") || "src/stratal.d.ts");
27
+ const namedRoutes = this.registry.named();
28
+ if (namedRoutes.length === 0) {
29
+ this.warn("No named routes found. Add name to your @Route() or @Get()/@Post() decorators.");
30
+ return 0;
31
+ }
32
+ writeFileSync(outputPath, this.generateDeclaration(namedRoutes), "utf-8");
33
+ this.info(`Generated route types for ${namedRoutes.length} named routes → ${outputPath}`);
34
+ }
35
+ /**
36
+ * Generate the StratalRouteMap declaration content.
37
+ */
38
+ generateDeclaration(routes) {
39
+ const localeConfig = this.localePathService.enabled ? this.localePathService.localePathConfig : null;
40
+ const localeType = localeConfig ? localeConfig.allLocales.map((l) => `'${l}'`).join(" | ") : null;
41
+ const localeOptional = localeConfig ? this.localePathService.prefixDefaultLocale !== true : false;
42
+ const entries = routes.filter((r) => r.name !== void 0).sort((a, b) => a.name.localeCompare(b.name)).map((route) => {
43
+ const paramEntries = [...route.paramNames.map((p) => `${p}: string`), ...route.domainParamNames.map((p) => `${p}: string`)];
44
+ if (localeType && route.localePaths?.length) {
45
+ const optionalMarker = localeOptional ? "?" : "";
46
+ paramEntries.push(`locale${optionalMarker}: StratalLocale`);
47
+ }
48
+ const indexSignature = localeType && route.localePaths?.length ? "[key: string]: string | StratalLocale | undefined" : "[key: string]: string | undefined";
49
+ paramEntries.push(indexSignature);
50
+ const paramsType = `{ ${paramEntries.join("; ")} }`;
51
+ return ` '${route.name}': { params: ${paramsType} }`;
52
+ }).join("\n");
53
+ const lines = ["// Auto-generated by `quarry route:types` — do not edit manually", "declare module 'stratal/router' {"];
54
+ if (localeType) {
55
+ lines.push(` type StratalLocale = ${localeType}`);
56
+ lines.push("");
57
+ }
58
+ lines.push(" interface StratalRouteMap {", entries, " }", "}");
59
+ return [
60
+ ...lines,
61
+ "",
62
+ "export {}",
63
+ ""
64
+ ].join("\n");
65
+ }
66
+ };
67
+ RouteTypesCommand = __decorate([
68
+ __decorateParam(0, inject(ROUTER_TOKENS.RouteRegistry)),
69
+ __decorateParam(1, inject(ROUTER_TOKENS.LocalePathService)),
70
+ __decorateMetadata("design:paramtypes", [Object, Object])
71
+ ], RouteTypesCommand);
72
+ //#endregion
73
+ //#region src/router/router-resolver.ts
74
+ /**
75
+ * Internal resolver that computes the effective Router config for each controller.
76
+ *
77
+ * Inheritance rules:
78
+ * - `middleware`: parent middleware runs first, then child (concatenated)
79
+ * - `prefix`: concatenated (parent + child)
80
+ * - `name`: concatenated (parent + child)
81
+ * - `domain`: child overrides parent
82
+ * - `version`: child overrides parent
83
+ * - `hideFromDocs`: child overrides parent
84
+ *
85
+ * @internal — not exported from stratal/router
86
+ */
87
+ var RouterResolver = class {
88
+ routers;
89
+ constructor(routers) {
90
+ this.routers = routers;
91
+ }
92
+ /**
93
+ * Resolve the effective config for a given controller class.
94
+ * Searches through all module routers to find the one owning this controller.
95
+ */
96
+ resolveForController(controller) {
97
+ for (const { router, controllers: moduleControllers } of this.routers) {
98
+ if (!moduleControllers.includes(controller)) continue;
99
+ for (const group of router[getGroups]()) if (group.controllers?.includes(controller)) return this.mergeEntries(router[getDefaultEntry](), group);
100
+ if (!new Set(router[getGroups]().flatMap((g) => g.controllers ?? [])).has(controller)) return this.entryToConfig(router[getDefaultEntry]());
101
+ }
102
+ return { middleware: [] };
103
+ }
104
+ /**
105
+ * Collect all global middleware registered via `router.use()` across all modules.
106
+ */
107
+ getGlobalMiddleware() {
108
+ const global = [];
109
+ for (const { router } of this.routers) global.push(...router[getGlobalMiddleware]());
110
+ return global;
111
+ }
112
+ /**
113
+ * Merge parent default entry with child group entry following inheritance rules.
114
+ */
115
+ mergeEntries(parent, child) {
116
+ return {
117
+ prefix: this.concatPrefixes(parent.prefix, child.prefix),
118
+ domain: child.domain ?? parent.domain,
119
+ name: this.concatNames(parent.name, child.name),
120
+ middleware: [...parent.middleware, ...child.middleware],
121
+ version: child.version ?? parent.version,
122
+ hideFromDocs: child.hideFromDocs ?? parent.hideFromDocs,
123
+ params: this.mergeParams(parent.params, child.params)
124
+ };
125
+ }
126
+ entryToConfig(entry) {
127
+ return {
128
+ prefix: entry.prefix,
129
+ domain: entry.domain,
130
+ name: entry.name,
131
+ middleware: [...entry.middleware],
132
+ version: entry.version,
133
+ hideFromDocs: entry.hideFromDocs,
134
+ params: entry.params
135
+ };
136
+ }
137
+ mergeParams(parent, child) {
138
+ if (!parent && !child) return void 0;
139
+ if (!parent) return child;
140
+ if (!child) return parent;
141
+ return parent.extend(child.shape);
142
+ }
143
+ concatPrefixes(parent, child) {
144
+ if (!parent && !child) return void 0;
145
+ if (!parent) return child;
146
+ if (!child) return parent;
147
+ return `${parent.endsWith("/") ? parent.slice(0, -1) : parent}${child.startsWith("/") ? child : `/${child}`}`;
148
+ }
149
+ concatNames(parent, child) {
150
+ if (!parent && !child) return void 0;
151
+ if (!parent) return child;
152
+ if (!child) return parent;
153
+ return `${parent}${child}`;
154
+ }
155
+ };
156
+ //#endregion
157
+ //#region src/application.ts
158
+ /**
159
+ * Application
160
+ *
161
+ * Main application class managing the two-tier container hierarchy:
162
+ * - Global Container: All services (singletons via tsyringe native)
163
+ * - Request Container: Child of global, context-enriched instances per request
164
+ *
165
+ * @example
166
+ * ```typescript
167
+ * const app = new Application({ module: AppModule, env, ctx })
168
+ * await app.initialize()
169
+ *
170
+ * // Access container via getter
171
+ * const service = app.container.resolve(MY_TOKEN)
172
+ *
173
+ * // Handle HTTP request (via HonoApp)
174
+ * // Handle queue batch
175
+ * await app.handleQueue(batch, 'my-queue')
176
+ * ```
177
+ */
178
+ var Application = class {
179
+ /**
180
+ * Unified Container - manages all DI operations
181
+ */
182
+ _container;
183
+ honoApp;
184
+ moduleRegistry;
185
+ consumerRegistry;
186
+ cronManager;
187
+ quarry;
188
+ initialized = false;
189
+ routingInitPromise = null;
190
+ handlerInitPromise = null;
191
+ env;
192
+ appConfig;
193
+ constructor({ env, ctx, ...config }) {
194
+ this.env = env;
195
+ this.appConfig = config;
196
+ ApplicationError.captureStackTraces = env.ENVIRONMENT !== "production";
197
+ this._container = new Container({ container: container.createChildContainer() });
198
+ this._container.registerValue(DI_TOKENS.Application, this);
199
+ this._container.registerValue(DI_TOKENS.CloudflareEnv, env);
200
+ this._container.registerValue(DI_TOKENS.ExecutionContext, ctx);
201
+ this.registerLoggerService();
202
+ this.registerCoreServices();
203
+ const logger = this._container.resolve(LOGGER_TOKENS.LoggerService);
204
+ this.moduleRegistry = new ModuleRegistry(this._container, logger);
205
+ this._container.registerValue(DI_TOKENS.ModuleRegistry, this.moduleRegistry);
206
+ }
207
+ /**
208
+ * Get the Container instance
209
+ */
210
+ get container() {
211
+ return this._container;
212
+ }
213
+ /**
214
+ * Lazily initialize routing and return the HonoApp instance.
215
+ *
216
+ * Routing (service registration, HonoApp resolution, route configuration)
217
+ * is deferred so that `scheduled` and `queue` handlers don't pay the CPU
218
+ * cost of route setup on cold start.
219
+ */
220
+ async ensureHono() {
221
+ await this.initializeRouting();
222
+ return this.honoApp;
223
+ }
224
+ /**
225
+ * Get the application configuration
226
+ */
227
+ get config() {
228
+ return this.appConfig;
229
+ }
230
+ async initialize() {
231
+ if (this.initialized) return;
232
+ await runWithContainer(this._container, () => this.initializeInternal());
233
+ }
234
+ async initializeInternal() {
235
+ this.moduleRegistry.registerAll([
236
+ I18nModule,
237
+ QueueModule,
238
+ CacheModule
239
+ ]);
240
+ this.moduleRegistry.register(this.appConfig.module);
241
+ await this.moduleRegistry.initialize();
242
+ this.initializeExceptionHandler();
243
+ this.consumerRegistry = this._container.resolve(DI_TOKENS.ConsumerRegistry);
244
+ this.cronManager = this._container.resolve(DI_TOKENS.Cron);
245
+ this.quarry = this._container.resolve(DI_TOKENS.Quarry);
246
+ this.registerCronJobs();
247
+ this.registerSeeders();
248
+ this.registerCommands();
249
+ this.initialized = true;
250
+ }
251
+ /**
252
+ * Register routing services as singletons in the container.
253
+ * Called after module initialization so I18N_TOKENS.Options is available.
254
+ */
255
+ registerRoutingServices() {
256
+ this._container.register(ROUTER_TOKENS.VersioningService, VersioningService, Scope.Singleton);
257
+ this._container.register(ROUTER_TOKENS.HonoApp, HonoApp, Scope.Singleton);
258
+ this._container.register(ROUTER_TOKENS.LocalePathService, LocalePathService, Scope.Singleton);
259
+ this._container.register(ROUTER_TOKENS.RouteRegistry, RouteRegistry, Scope.Singleton);
260
+ this._container.register(ROUTER_TOKENS.Uri, Uri, Scope.Request);
261
+ const routerConfigs = this.moduleRegistry.getAllRouterConfigs();
262
+ const routerResolver = routerConfigs.length > 0 ? new RouterResolver(routerConfigs) : null;
263
+ this._container.registerValue(ROUTER_TOKENS.RouterResolver, routerResolver);
264
+ this._container.register(RouteRegistrationService, RouteRegistrationService);
265
+ }
266
+ /**
267
+ * Wire up queue consumers and event listeners.
268
+ * Called lazily on first fetch/queue — not during scheduled handling.
269
+ */
270
+ initializeHandlers() {
271
+ this.handlerInitPromise ??= runWithContainer(this._container, () => {
272
+ this.registerQueueConsumers();
273
+ this.registerEventListeners();
274
+ return Promise.resolve();
275
+ });
276
+ return this.handlerInitPromise;
277
+ }
278
+ /**
279
+ * Register routing services, resolve HonoApp, and configure routes.
280
+ * Called lazily on first fetch — not during scheduled/queue handling.
281
+ */
282
+ initializeRouting() {
283
+ this.routingInitPromise ??= runWithContainer(this._container, async () => {
284
+ await this.initializeHandlers();
285
+ this.moduleRegistry.register(OpenAPIModule);
286
+ this.registerRoutingServices();
287
+ this.honoApp = this._container.resolve(ROUTER_TOKENS.HonoApp);
288
+ await this.honoApp.configure();
289
+ });
290
+ return this.routingInitPromise;
291
+ }
292
+ /**
293
+ * Resolve a service from the container
294
+ */
295
+ resolve(token) {
296
+ try {
297
+ return this._container.resolve(token);
298
+ } catch (error) {
299
+ const handler = this._container.resolve(DI_TOKENS.ExceptionHandler);
300
+ const ctx = createCliExceptionContext("resolve");
301
+ handler.handle(error, ctx);
302
+ throw error;
303
+ }
304
+ }
305
+ /**
306
+ * Handle queue batch processing
307
+ */
308
+ async handleQueue(batch, queueName) {
309
+ await this.initializeHandlers();
310
+ const locale = (batch.messages[0]?.body)?.metadata?.locale ?? "en";
311
+ const mockRouterContext = this.createMockRouterContext(locale);
312
+ await this._container.runInRequestScope(mockRouterContext, async (requestContainer) => {
313
+ try {
314
+ await requestContainer.resolve(DI_TOKENS.Queue).processBatch(queueName, batch);
315
+ } catch (error) {
316
+ await requestContainer.resolve(DI_TOKENS.ExceptionHandler).handle(error, createQueueExceptionContext(queueName));
317
+ throw error;
318
+ }
319
+ });
320
+ }
321
+ /**
322
+ * Handle scheduled cron trigger
323
+ */
324
+ async handleScheduled(controller) {
325
+ const mockRouterContext = this.createMockRouterContext("en");
326
+ await this._container.runInRequestScope(mockRouterContext, async (requestContainer) => {
327
+ try {
328
+ await this.cronManager.executeScheduled(controller, requestContainer);
329
+ } catch (error) {
330
+ await requestContainer.resolve(DI_TOKENS.ExceptionHandler).handle(error, createCronExceptionContext());
331
+ throw error;
332
+ }
333
+ });
334
+ }
335
+ /**
336
+ * Create mock RouterContext for queue/cron/seeder processing
337
+ */
338
+ createMockRouterContext(locale = "en") {
339
+ return {
340
+ getLocale: () => locale,
341
+ setLocale: () => {},
342
+ getContainer: () => this._container
343
+ };
344
+ }
345
+ async shutdown() {
346
+ if (!this.initialized) return;
347
+ this.initialized = false;
348
+ await this.moduleRegistry.shutdown();
349
+ this._container.resolve(LOGGER_TOKENS.LoggerService).info("Disposing container...");
350
+ await this._container.dispose();
351
+ }
352
+ /**
353
+ * Execute a command by name in a request-scoped container.
354
+ */
355
+ async handleCommand(name, input) {
356
+ await this.initializeRouting();
357
+ const mockContext = this.createMockRouterContext("en");
358
+ return this._container.runInRequestScope(mockContext, async () => {
359
+ return this.quarry.call(name, input);
360
+ });
361
+ }
362
+ registerCommands() {
363
+ const builtinCommands = [
364
+ HelpCommand,
365
+ DbSeedCommand,
366
+ DbSeedListCommand,
367
+ RouteListCommand,
368
+ RouteTypesCommand,
369
+ EventListCommand,
370
+ ScheduleListCommand,
371
+ QueueListCommand,
372
+ McpServeCommand,
373
+ McpToolsCommand,
374
+ ApiCommand
375
+ ];
376
+ for (const Cmd of builtinCommands) {
377
+ injectable()(Cmd);
378
+ this._container.register(Cmd, Cmd, Scope.Singleton);
379
+ this.quarry.register(Cmd);
380
+ }
381
+ const commands = this.moduleRegistry.getAllCommands();
382
+ if (commands.length === 0) return;
383
+ for (const CommandClass of commands) this.quarry.register(CommandClass);
384
+ }
385
+ registerSeeders() {
386
+ const seeders = this.moduleRegistry.getAllSeeders();
387
+ if (seeders.length === 0) return;
388
+ const registry = this._container.resolve(SEEDER_TOKENS.SeederRegistry);
389
+ for (const SeederClass of seeders) registry.register(SeederClass);
390
+ }
391
+ registerQueueConsumers() {
392
+ for (const ConsumerClass of this.moduleRegistry.getAllConsumers()) {
393
+ const consumer = this._container.resolve(ConsumerClass);
394
+ this.consumerRegistry.register(consumer);
395
+ }
396
+ }
397
+ registerCronJobs() {
398
+ for (const JobClass of this.moduleRegistry.getAllJobs()) {
399
+ const tempJob = this._container.resolve(JobClass);
400
+ this.cronManager.registerJob(tempJob.schedule, JobClass);
401
+ }
402
+ }
403
+ /**
404
+ * Auto-wire `@Listener()` classes with the EventRegistry.
405
+ */
406
+ registerEventListeners() {
407
+ const listeners = this.moduleRegistry.getAllListeners();
408
+ if (listeners.length === 0) return;
409
+ const eventRegistry = this._container.resolve(DI_TOKENS.EventRegistry);
410
+ for (const ListenerClass of listeners) {
411
+ const instance = this._container.resolve(ListenerClass);
412
+ const handlers = getListenerHandlers(ListenerClass);
413
+ for (const { methodName, event, options } of handlers) eventRegistry.on(event, instance[methodName].bind(instance), options);
414
+ }
415
+ }
416
+ /**
417
+ * Register LoggerService and dependencies
418
+ */
419
+ registerLoggerService() {
420
+ const logLevel = this.appConfig.logging?.level ?? "info";
421
+ const formatter = this.appConfig.logging?.formatter ?? "json";
422
+ this._container.registerValue(LOGGER_TOKENS.LogLevelOptions, logLevel);
423
+ this._container.when(() => formatter === "pretty").use(LOGGER_TOKENS.Formatter).give(PrettyFormatter).otherwise(JsonFormatter);
424
+ this._container.registerSingleton(LOGGER_TOKENS.ConsoleTransport, ConsoleTransport);
425
+ this._container.registerFactory(LOGGER_TOKENS.Transports, (c) => [c.resolve(LOGGER_TOKENS.ConsoleTransport)]);
426
+ this._container.registerSingleton(LOGGER_TOKENS.LoggerService, LoggerService);
427
+ }
428
+ /**
429
+ * Register core services with explicit scope
430
+ */
431
+ registerCoreServices() {
432
+ this._container.registerSingleton(DI_TOKENS.Cron, CronManager);
433
+ this._container.registerSingleton(DI_TOKENS.ExceptionHandler, this.appConfig.exceptionHandler ?? DefaultExceptionHandler);
434
+ this._container.registerSingleton(DI_TOKENS.EventRegistry, EventRegistry);
435
+ this._container.registerSingleton(DI_TOKENS.Quarry, QuarryRegistry);
436
+ this._container.registerValue(SEEDER_TOKENS.SeederRegistry, new SeederRegistry(this));
437
+ }
438
+ /**
439
+ * Initialize the ExceptionHandler: call register(), then module onException hooks.
440
+ */
441
+ initializeExceptionHandler() {
442
+ const handler = this._container.resolve(DI_TOKENS.ExceptionHandler);
443
+ handler.register();
444
+ this.moduleRegistry.configureExceptionHandlers(handler);
445
+ }
446
+ };
447
+ //#endregion
448
+ //#region src/stratal.ts
449
+ /**
450
+ * Stratal — Hono-style entry point for Cloudflare Workers.
451
+ *
452
+ * Eagerly bootstraps the Application at construction time, dynamically
453
+ * importing `cloudflare:workers` for env and waitUntil.
454
+ *
455
+ * @example
456
+ * ```typescript
457
+ * import { Stratal } from 'stratal'
458
+ * import { AppModule } from './app.module'
459
+ *
460
+ * export default new Stratal({ module: AppModule })
461
+ * ```
462
+ */
463
+ var Stratal = class Stratal {
464
+ app = null;
465
+ initPromise;
466
+ static _application = null;
467
+ static _generation = 0;
468
+ static _previousInstance = null;
469
+ constructor(config) {
470
+ this.fetch = this.fetch.bind(this);
471
+ this.queue = this.queue.bind(this);
472
+ this.scheduled = this.scheduled.bind(this);
473
+ const generation = ++Stratal._generation;
474
+ if (Stratal._previousInstance) Stratal._previousInstance.shutdown();
475
+ Stratal._previousInstance = this;
476
+ this.initPromise = this.prepareApp(config, generation);
477
+ Stratal._application = this.initPromise;
478
+ }
479
+ async fetch(request, env, ctx) {
480
+ return (await (await this.ensureReady()).ensureHono()).fetch(request, env, ctx);
481
+ }
482
+ async queue(batch) {
483
+ return (await this.ensureReady()).handleQueue(batch, batch.queue);
484
+ }
485
+ async scheduled(controller) {
486
+ return (await this.ensureReady()).handleScheduled(controller);
487
+ }
488
+ get hono() {
489
+ return this.initPromise.then((app) => app.ensureHono());
490
+ }
491
+ async shutdown() {
492
+ try {
493
+ this.app = await this.initPromise;
494
+ } catch {}
495
+ if (this.app) {
496
+ await this.app.shutdown();
497
+ this.app = null;
498
+ }
499
+ }
500
+ /**
501
+ * @internal
502
+ * Resolves the Application instance from the static singleton.
503
+ * Used by worker base classes (DurableObject, Workflow, WorkerEntrypoint)
504
+ * to access the DI container without going through Cloudflare RPC.
505
+ */
506
+ static resolveApplication() {
507
+ if (!Stratal._application) throw new StratalNotInitializedError();
508
+ return Stratal._application;
509
+ }
510
+ async ensureReady() {
511
+ this.app ??= await this.initPromise;
512
+ return this.app;
513
+ }
514
+ async prepareApp(config, generation) {
515
+ const { env, waitUntil } = await import("cloudflare:workers");
516
+ if (generation !== Stratal._generation) return new Promise(() => {});
517
+ const app = new Application({
518
+ ...config,
519
+ env,
520
+ ctx: { waitUntil }
521
+ });
522
+ await app.initialize();
523
+ if (generation !== Stratal._generation) {
524
+ await app.shutdown();
525
+ return new Promise(() => {});
526
+ }
527
+ return app;
528
+ }
529
+ };
530
+ //#endregion
531
+ export { Application as n, Stratal as t };
532
+
533
+ //# sourceMappingURL=stratal-BCiwCFN9.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stratal-BCiwCFN9.mjs","names":["internal.getGroups","internal.getDefaultEntry","internal.getGlobalMiddleware","tsyringeRootContainer"],"sources":["../src/quarry/commands/route-types.command.ts","../src/router/router-resolver.ts","../src/application.ts","../src/stratal.ts"],"sourcesContent":["import { writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { inject } from 'tsyringe'\nimport type { RouteRegistry, RegisteredRoute } from '../../router/route-registry'\nimport { ROUTER_TOKENS } from '../../router/router.tokens'\nimport type { LocalePathService } from '../../router/services/locale-path.service'\nimport { Command } from '../command'\n\n/**\n * Generate TypeScript types for named routes.\n *\n * Outputs a `stratal.d.ts` file with `StratalRouteMap` augmentation\n * that provides autocomplete and type-safe params for `route()` and `ctx.route()`.\n *\n * @example\n * ```bash\n * quarry route:types # → src/stratal.d.ts\n * quarry route:types --output=types/routes.d.ts\n * ```\n */\nexport class RouteTypesCommand extends Command {\n static command = 'route:types {--output=src/stratal.d.ts : Output file path}'\n static description = 'Generate TypeScript types for named routes'\n\n constructor(\n @inject(ROUTER_TOKENS.RouteRegistry) private registry: RouteRegistry,\n @inject(ROUTER_TOKENS.LocalePathService) private localePathService: LocalePathService,\n ) {\n super()\n }\n\n handle(): number | undefined {\n const outputPath = resolve(this.string('output') || 'src/stratal.d.ts')\n const namedRoutes = this.registry.named()\n\n if (namedRoutes.length === 0) {\n this.warn('No named routes found. Add name to your @Route() or @Get()/@Post() decorators.')\n return 0\n }\n\n const content = this.generateDeclaration(namedRoutes)\n writeFileSync(outputPath, content, 'utf-8')\n this.info(`Generated route types for ${namedRoutes.length} named routes → ${outputPath}`)\n\n return undefined\n }\n\n /**\n * Generate the StratalRouteMap declaration content.\n */\n private generateDeclaration(routes: RegisteredRoute[]): string {\n const localeConfig = this.localePathService.enabled ? this.localePathService.localePathConfig : null\n const localeType = localeConfig\n ? localeConfig.allLocales.map(l => `'${l}'`).join(' | ')\n : null\n const localeOptional = localeConfig ? this.localePathService.prefixDefaultLocale !== true : false\n\n const entries = routes\n .filter((r): r is RegisteredRoute & { name: string } => r.name !== undefined)\n .sort((a, b) => a.name.localeCompare(b.name))\n .map(route => {\n const paramEntries = [\n ...route.paramNames.map(p => `${p}: string`),\n ...route.domainParamNames.map(p => `${p}: string`),\n ]\n\n if (localeType && route.localePaths?.length) {\n const optionalMarker = localeOptional ? '?' : ''\n paramEntries.push(`locale${optionalMarker}: StratalLocale`)\n }\n\n // Extra keys become query-string params at runtime, so allow any\n // string key. Typed path/domain params above still take precedence.\n const indexSignature = localeType && route.localePaths?.length\n ? '[key: string]: string | StratalLocale | undefined'\n : '[key: string]: string | undefined'\n paramEntries.push(indexSignature)\n\n const paramsType = `{ ${paramEntries.join('; ')} }`\n return ` '${route.name}': { params: ${paramsType} }`\n })\n .join('\\n')\n\n const lines = [\n '// Auto-generated by `quarry route:types` — do not edit manually',\n \"declare module 'stratal/router' {\",\n ]\n\n if (localeType) {\n lines.push(` type StratalLocale = ${localeType}`)\n lines.push('')\n }\n\n lines.push(\n ' interface StratalRouteMap {',\n entries,\n ' }',\n '}',\n )\n\n return [\n ...lines,\n '',\n 'export {}',\n '',\n ].join('\\n')\n }\n}\n","import type { ZodObject } from '../i18n/validation'\nimport type { Constructor } from '../types'\nimport type { Middleware } from './middleware.interface'\nimport type { Router, RouterEntry } from './router'\nimport * as internal from './router.internals'\n\n/**\n * Resolved configuration for a single controller.\n * Merges Router default entry, sub-group overrides, and inheritance rules.\n */\nexport interface ResolvedRouterConfig {\n prefix?: string\n domain?: string\n name?: string\n middleware: Constructor<Middleware>[]\n version?: string | string[]\n hideFromDocs?: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ZodObject generics require any for flexible shape parameter\n params?: ZodObject<any>\n}\n\n/**\n * Internal resolver that computes the effective Router config for each controller.\n *\n * Inheritance rules:\n * - `middleware`: parent middleware runs first, then child (concatenated)\n * - `prefix`: concatenated (parent + child)\n * - `name`: concatenated (parent + child)\n * - `domain`: child overrides parent\n * - `version`: child overrides parent\n * - `hideFromDocs`: child overrides parent\n *\n * @internal — not exported from stratal/router\n */\nexport class RouterResolver {\n private readonly routers: { router: Router; controllers: Constructor[] }[]\n\n constructor(routers: { router: Router; controllers: Constructor[] }[]) {\n this.routers = routers\n }\n\n /**\n * Resolve the effective config for a given controller class.\n * Searches through all module routers to find the one owning this controller.\n */\n resolveForController(controller: Constructor): ResolvedRouterConfig {\n for (const { router, controllers: moduleControllers } of this.routers) {\n if (!moduleControllers.includes(controller)) continue\n\n // Check if controller is in a sub-group\n for (const group of router[internal.getGroups]()) {\n if (group.controllers?.includes(controller)) {\n return this.mergeEntries(router[internal.getDefaultEntry](), group)\n }\n }\n\n // Controller is in the default scope (not in any sub-group)\n // But only if it's not claimed by any sub-group in this module\n const groupedControllers = new Set(\n router[internal.getGroups]().flatMap(g => g.controllers ?? [])\n )\n if (!groupedControllers.has(controller)) {\n return this.entryToConfig(router[internal.getDefaultEntry]())\n }\n }\n\n // Controller not found in any module's router — return empty config\n return { middleware: [] }\n }\n\n /**\n * Collect all global middleware registered via `router.use()` across all modules.\n */\n getGlobalMiddleware(): Constructor<Middleware>[] {\n const global: Constructor<Middleware>[] = []\n for (const { router } of this.routers) {\n global.push(...router[internal.getGlobalMiddleware]())\n }\n return global\n }\n\n /**\n * Merge parent default entry with child group entry following inheritance rules.\n */\n private mergeEntries(parent: RouterEntry, child: RouterEntry): ResolvedRouterConfig {\n return {\n // Concatenate: parent prefix + child prefix\n prefix: this.concatPrefixes(parent.prefix, child.prefix),\n // Override: child domain wins\n domain: child.domain ?? parent.domain,\n // Concatenate: parent name + child name\n name: this.concatNames(parent.name, child.name),\n // Concatenate: parent middleware first, then child\n middleware: [...parent.middleware, ...child.middleware],\n // Override: child version wins\n version: child.version ?? parent.version,\n // Override: child hideFromDocs wins\n hideFromDocs: child.hideFromDocs ?? parent.hideFromDocs,\n // Extend: parent params extended with child params\n params: this.mergeParams(parent.params, child.params),\n }\n }\n\n private entryToConfig(entry: RouterEntry): ResolvedRouterConfig {\n return {\n prefix: entry.prefix,\n domain: entry.domain,\n name: entry.name,\n middleware: [...entry.middleware],\n version: entry.version,\n hideFromDocs: entry.hideFromDocs,\n params: entry.params,\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ZodObject generics require any for flexible shape parameter\n private mergeParams(parent?: ZodObject<any>, child?: ZodObject<any>): ZodObject<any> | undefined {\n if (!parent && !child) return undefined\n if (!parent) return child\n if (!child) return parent\n // oxlint-disable-next-line typescript/no-explicit-any\n return parent.extend(child.shape) as ZodObject<any>\n }\n\n private concatPrefixes(parent?: string, child?: string): string | undefined {\n if (!parent && !child) return undefined\n if (!parent) return child\n if (!child) return parent\n // Normalize: remove trailing slash from parent, ensure child starts with /\n const p = parent.endsWith('/') ? parent.slice(0, -1) : parent\n const c = child.startsWith('/') ? child : `/${child}`\n return `${p}${c}`\n }\n\n private concatNames(parent?: string, child?: string): string | undefined {\n if (!parent && !child) return undefined\n if (!parent) return child\n if (!child) return parent\n return `${parent}${child}`\n }\n}\n","import { injectable, container as tsyringeRootContainer } from 'tsyringe'\nimport { CacheModule } from './cache'\nimport type { CronJob } from './cron/cron-job'\nimport { CronManager } from './cron/cron-manager'\nimport { Container } from './di/container'\nimport { runWithContainer } from './di/container-storage'\nimport { DI_TOKENS } from './di/tokens'\nimport { Scope } from './di/types'\nimport { type StratalEnv } from './env'\nimport { ApplicationError } from './errors'\nimport { DefaultExceptionHandler } from './errors/default-exception-handler'\nimport { createCliExceptionContext, createCronExceptionContext, createQueueExceptionContext } from './errors/exception-context'\nimport type { ExceptionHandler } from './errors/exception-handler'\nimport type { EventHandler } from './events'\nimport { EventRegistry, getListenerHandlers } from './events'\nimport type { StratalExecutionContext } from './execution-context'\nimport { I18nModule } from './i18n/i18n.module'\nimport { ConsoleTransport, JsonFormatter, LOGGER_TOKENS, LoggerService, LogLevel, PrettyFormatter } from './logger'\nimport { ModuleRegistry } from './module/module-registry'\nimport type { DynamicModule, ModuleClass } from './module/types'\nimport { OpenAPIModule } from './openapi'\nimport type { Command } from './quarry/command'\nimport { ApiCommand } from './quarry/commands/api.command'\nimport { EventListCommand } from './quarry/commands/event-list.command'\nimport { HelpCommand } from './quarry/commands/help.command'\nimport { McpServeCommand } from './quarry/commands/mcp-serve.command'\nimport { McpToolsCommand } from './quarry/commands/mcp-tools.command'\nimport { QueueListCommand } from './quarry/commands/queue-list.command'\nimport { RouteListCommand } from './quarry/commands/route-list.command'\nimport { RouteTypesCommand } from './quarry/commands/route-types.command'\nimport { ScheduleListCommand } from './quarry/commands/schedule-list.command'\nimport { QuarryRegistry } from './quarry/quarry-registry'\nimport type { CommandInput, CommandResult } from './quarry/types'\nimport { type ConsumerRegistry } from './queue/consumer-registry'\nimport type { IQueueConsumer, QueueMessage } from './queue/queue-consumer'\nimport { type QueueManager } from './queue/queue-manager'\nimport { QueueModule } from './queue/queue.module'\nimport { type RouterContext } from './router'\nimport { HonoApp } from './router/hono-app'\nimport { RouteRegistry } from './router/route-registry'\nimport { RouterResolver } from './router/router-resolver'\nimport { ROUTER_TOKENS } from './router/router.tokens'\nimport { LocalePathService } from './router/services/locale-path.service'\nimport { RouteRegistrationService } from './router/services/route-registration.service'\nimport { VersioningService } from './router/services/versioning.service'\nimport type { VersioningOptions } from './router/types'\nimport { Uri } from './router/uri'\nimport { DbSeedCommand, DbSeedListCommand, SEEDER_TOKENS, SeederRegistry, type Seeder } from './seeder'\nimport type { Constructor } from './types'\n\nexport interface ApplicationConfig {\n /** Root application module */\n module: ModuleClass | DynamicModule\n /** Logging configuration. Defaults: level=INFO, formatter='json' */\n logging?: {\n level?: LogLevel\n formatter?: 'json' | 'pretty'\n }\n /**\n * API versioning configuration.\n * When provided, enables URI-based versioning for controllers.\n */\n versioning?: VersioningOptions\n /**\n * Custom exception handler class.\n *\n * Extend {@link ExceptionHandler} and override `register()` to configure\n * custom reporting, rendering, and post-processing of exceptions.\n *\n * When not provided, {@link DefaultExceptionHandler} is used (standard\n * severity-based logging and JSON error responses).\n *\n * @example\n * ```typescript\n * new Stratal({\n * module: AppModule,\n * exceptionHandler: AppExceptionHandler,\n * })\n * ```\n */\n exceptionHandler?: Constructor<ExceptionHandler>\n}\n\nexport interface ApplicationOptions extends ApplicationConfig {\n env: StratalEnv\n ctx: StratalExecutionContext\n}\n\n/**\n * Application\n *\n * Main application class managing the two-tier container hierarchy:\n * - Global Container: All services (singletons via tsyringe native)\n * - Request Container: Child of global, context-enriched instances per request\n *\n * @example\n * ```typescript\n * const app = new Application({ module: AppModule, env, ctx })\n * await app.initialize()\n *\n * // Access container via getter\n * const service = app.container.resolve(MY_TOKEN)\n *\n * // Handle HTTP request (via HonoApp)\n * // Handle queue batch\n * await app.handleQueue(batch, 'my-queue')\n * ```\n */\nexport class Application {\n /**\n * Unified Container - manages all DI operations\n */\n private _container: Container\n\n private honoApp!: HonoApp\n private moduleRegistry: ModuleRegistry\n private consumerRegistry!: ConsumerRegistry\n private cronManager!: CronManager\n private quarry!: QuarryRegistry\n private initialized = false\n private routingInitPromise: Promise<void> | null = null\n private handlerInitPromise: Promise<void> | null = null\n\n readonly env: StratalEnv\n private readonly appConfig: ApplicationConfig\n\n constructor({ env, ctx, ...config }: ApplicationOptions) {\n this.env = env\n this.appConfig = config\n\n ApplicationError.captureStackTraces = env.ENVIRONMENT !== 'production'\n\n // Create unified Container with explicit child container\n this._container = new Container({\n container: tsyringeRootContainer.createChildContainer()\n })\n\n // Register globally — env and ctx always available\n this._container.registerValue(DI_TOKENS.Application, this)\n this._container.registerValue(DI_TOKENS.CloudflareEnv, env)\n this._container.registerValue(DI_TOKENS.ExecutionContext, ctx)\n\n // Register core infrastructure inline\n this.registerLoggerService()\n this.registerCoreServices()\n\n // Create ModuleRegistry with our Container\n const logger = this._container.resolve<LoggerService>(LOGGER_TOKENS.LoggerService)\n this.moduleRegistry = new ModuleRegistry(this._container, logger)\n\n // Register ModuleRegistry in container so modules can access it in onInitialize\n this._container.registerValue(DI_TOKENS.ModuleRegistry, this.moduleRegistry)\n }\n\n /**\n * Get the Container instance\n */\n get container(): Container {\n return this._container\n }\n\n /**\n * Lazily initialize routing and return the HonoApp instance.\n *\n * Routing (service registration, HonoApp resolution, route configuration)\n * is deferred so that `scheduled` and `queue` handlers don't pay the CPU\n * cost of route setup on cold start.\n */\n async ensureHono(): Promise<HonoApp> {\n await this.initializeRouting()\n return this.honoApp\n }\n\n /**\n * Get the application configuration\n */\n get config(): ApplicationConfig {\n return this.appConfig\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) {\n return\n }\n\n // Wrap in AsyncLocalStorage so getContainer() works for route() and other standalone functions\n await runWithContainer(this._container, () => this.initializeInternal())\n }\n\n private async initializeInternal(): Promise<void> {\n // Phase 1: Register core infrastructure modules (internal)\n // OpenAPIModule is deferred to initializeRouting() (only needed for fetch)\n this.moduleRegistry.registerAll([\n I18nModule,\n QueueModule,\n CacheModule,\n ])\n\n // Phase 2: Register user's root module (traverses imports)\n this.moduleRegistry.register(this.appConfig.module)\n\n // Phase 3: Initialize all modules\n await this.moduleRegistry.initialize()\n\n // Phase 3.5: Initialize ExceptionHandler and call module onException hooks\n this.initializeExceptionHandler()\n\n // Phase 4: Resolve managers from container\n this.consumerRegistry = this._container.resolve<ConsumerRegistry>(DI_TOKENS.ConsumerRegistry)\n this.cronManager = this._container.resolve<CronManager>(DI_TOKENS.Cron)\n this.quarry = this._container.resolve<QuarryRegistry>(DI_TOKENS.Quarry)\n\n // Phase 5: Register cron jobs, seeders, and commands (cheap — stores class refs)\n // Queue consumers and event listeners are deferred (they resolve instances\n // from the container, which is expensive). Routing is also deferred.\n this.registerCronJobs()\n this.registerSeeders()\n this.registerCommands()\n\n this.initialized = true\n }\n\n /**\n * Register routing services as singletons in the container.\n * Called after module initialization so I18N_TOKENS.Options is available.\n */\n private registerRoutingServices(): void {\n // VersioningService — resolves version prefixes from appConfig.versioning\n this._container.register(ROUTER_TOKENS.VersioningService, VersioningService, Scope.Singleton)\n\n // HonoApp — the Hono application instance (must be before LocalePathService)\n this._container.register(ROUTER_TOKENS.HonoApp, HonoApp, Scope.Singleton)\n\n // LocalePathService — computes LocalePathConfig and applies locale middleware to HonoApp\n this._container.register(ROUTER_TOKENS.LocalePathService, LocalePathService, Scope.Singleton)\n\n // RouteRegistry — single source of truth, expands routes via services above\n this._container.register(ROUTER_TOKENS.RouteRegistry, RouteRegistry, Scope.Singleton)\n\n // Uri — URL generation service (request-scoped for access to RouterContext)\n this._container.register(ROUTER_TOKENS.Uri, Uri, Scope.Request)\n\n // RouterResolver — merges Router configs from modules\n const routerConfigs = this.moduleRegistry.getAllRouterConfigs()\n const routerResolver = routerConfigs.length > 0 ? new RouterResolver(routerConfigs) : null\n this._container.registerValue(ROUTER_TOKENS.RouterResolver, routerResolver)\n\n // RouteRegistrationService — transient, resolved in HonoApp.configure()\n this._container.register(RouteRegistrationService, RouteRegistrationService)\n }\n\n /**\n * Wire up queue consumers and event listeners.\n * Called lazily on first fetch/queue — not during scheduled handling.\n */\n private initializeHandlers(): Promise<void> {\n this.handlerInitPromise ??= runWithContainer(this._container, () => {\n this.registerQueueConsumers()\n this.registerEventListeners()\n return Promise.resolve()\n })\n return this.handlerInitPromise\n }\n\n /**\n * Register routing services, resolve HonoApp, and configure routes.\n * Called lazily on first fetch — not during scheduled/queue handling.\n */\n private initializeRouting(): Promise<void> {\n this.routingInitPromise ??= runWithContainer(this._container, async () => {\n await this.initializeHandlers()\n this.moduleRegistry.register(OpenAPIModule as unknown as ModuleClass)\n this.registerRoutingServices()\n this.honoApp = this._container.resolve<HonoApp>(ROUTER_TOKENS.HonoApp)\n await this.honoApp.configure()\n })\n return this.routingInitPromise\n }\n\n /**\n * Resolve a service from the container\n */\n resolve<T>(token: symbol): T {\n try {\n return this._container.resolve(token)\n } catch (error) {\n const handler = this._container.resolve<ExceptionHandler>(DI_TOKENS.ExceptionHandler)\n const ctx = createCliExceptionContext('resolve')\n // Fire-and-forget — reporting happens via waitUntil internally\n void handler.handle(error, ctx)\n throw error\n }\n }\n\n /**\n * Handle queue batch processing\n */\n async handleQueue(batch: MessageBatch, queueName: string): Promise<void> {\n await this.initializeHandlers()\n\n const firstMessage = batch.messages[0]?.body as QueueMessage | undefined\n const locale = firstMessage?.metadata?.locale ?? 'en'\n const mockRouterContext = this.createMockRouterContext(locale)\n\n await this._container.runInRequestScope(mockRouterContext, async (requestContainer) => {\n try {\n const queueManager = requestContainer.resolve<QueueManager>(DI_TOKENS.Queue)\n await queueManager.processBatch(queueName, batch)\n } catch (error) {\n const handler = requestContainer.resolve<ExceptionHandler>(DI_TOKENS.ExceptionHandler)\n await handler.handle(error, createQueueExceptionContext(queueName))\n throw error\n }\n })\n }\n\n /**\n * Handle scheduled cron trigger\n */\n async handleScheduled(controller: ScheduledController): Promise<void> {\n const mockRouterContext = this.createMockRouterContext('en')\n\n await this._container.runInRequestScope(mockRouterContext, async (requestContainer) => {\n try {\n await this.cronManager.executeScheduled(controller, requestContainer)\n } catch (error) {\n const handler = requestContainer.resolve<ExceptionHandler>(DI_TOKENS.ExceptionHandler)\n await handler.handle(error, createCronExceptionContext())\n throw error\n }\n })\n }\n\n /**\n * Create mock RouterContext for queue/cron/seeder processing\n */\n createMockRouterContext(locale = 'en'): RouterContext {\n return {\n getLocale: () => locale,\n setLocale: () => { /* no-op */ },\n getContainer: () => this._container,\n } as unknown as RouterContext\n }\n\n async shutdown(): Promise<void> {\n if (!this.initialized) return\n this.initialized = false\n\n await this.moduleRegistry.shutdown()\n\n const logger = this._container.resolve<LoggerService>(LOGGER_TOKENS.LoggerService)\n logger.info('Disposing container...')\n\n await this._container.dispose()\n }\n\n /**\n * Execute a command by name in a request-scoped container.\n */\n async handleCommand(name: string, input?: CommandInput): Promise<CommandResult> {\n await this.initializeRouting()\n const mockContext = this.createMockRouterContext('en')\n return this._container.runInRequestScope(mockContext, async () => {\n return this.quarry.call(name, input)\n })\n }\n\n private registerCommands(): void {\n // Built-in commands (always available)\n const builtinCommands: Constructor<Command>[] = [\n HelpCommand,\n DbSeedCommand, DbSeedListCommand,\n RouteListCommand, RouteTypesCommand, EventListCommand,\n ScheduleListCommand, QueueListCommand,\n McpServeCommand, McpToolsCommand, ApiCommand,\n ]\n for (const Cmd of builtinCommands) {\n injectable()(Cmd)\n this._container.register(Cmd, Cmd, Scope.Singleton)\n this.quarry.register(Cmd)\n }\n\n // User commands from modules\n const commands = this.moduleRegistry.getAllCommands()\n if (commands.length === 0) {\n return\n }\n\n for (const CommandClass of commands) {\n this.quarry.register(CommandClass as Constructor<Command>)\n }\n }\n\n private registerSeeders(): void {\n const seeders = this.moduleRegistry.getAllSeeders()\n if (seeders.length === 0) return\n const registry = this._container.resolve<SeederRegistry>(SEEDER_TOKENS.SeederRegistry)\n for (const SeederClass of seeders) {\n registry.register(SeederClass as Constructor<Seeder>)\n }\n }\n\n private registerQueueConsumers(): void {\n for (const ConsumerClass of this.moduleRegistry.getAllConsumers()) {\n const consumer = this._container.resolve(ConsumerClass) as IQueueConsumer\n this.consumerRegistry.register(consumer)\n }\n }\n\n private registerCronJobs(): void {\n for (const JobClass of this.moduleRegistry.getAllJobs()) {\n // Resolve temporarily to read the schedule property.\n // The delay() proxy on DB dependencies is created but never triggered\n // since we only access the schedule string.\n const tempJob = this._container.resolve(JobClass) as CronJob\n this.cronManager.registerJob(tempJob.schedule, JobClass as Constructor<CronJob>)\n }\n }\n\n /**\n * Auto-wire `@Listener()` classes with the EventRegistry.\n */\n private registerEventListeners(): void {\n const listeners = this.moduleRegistry.getAllListeners()\n if (listeners.length === 0) {\n return\n }\n\n const eventRegistry = this._container.resolve<EventRegistry>(DI_TOKENS.EventRegistry)\n\n for (const ListenerClass of listeners) {\n const instance = this._container.resolve(ListenerClass) as Record<string, ((...args: unknown[]) => unknown)>\n const handlers = getListenerHandlers(ListenerClass)\n\n for (const { methodName, event, options } of handlers) {\n eventRegistry.on(event, instance[methodName].bind(instance) as EventHandler, options)\n }\n }\n }\n\n /**\n * Register LoggerService and dependencies\n */\n private registerLoggerService(): void {\n const logLevel = this.appConfig.logging?.level ?? LogLevel.INFO\n const formatter = this.appConfig.logging?.formatter ?? 'json'\n\n this._container.registerValue(LOGGER_TOKENS.LogLevelOptions, logLevel)\n\n this._container\n .when(() => formatter === 'pretty')\n .use(LOGGER_TOKENS.Formatter)\n .give(PrettyFormatter)\n .otherwise(JsonFormatter)\n\n this._container.registerSingleton(LOGGER_TOKENS.ConsoleTransport, ConsoleTransport)\n this._container.registerFactory(LOGGER_TOKENS.Transports, (c) => [c.resolve(LOGGER_TOKENS.ConsoleTransport)])\n this._container.registerSingleton(LOGGER_TOKENS.LoggerService, LoggerService)\n }\n\n /**\n * Register core services with explicit scope\n */\n private registerCoreServices(): void {\n this._container.registerSingleton(DI_TOKENS.Cron, CronManager)\n this._container.registerSingleton(\n DI_TOKENS.ExceptionHandler,\n (this.appConfig.exceptionHandler ?? DefaultExceptionHandler) as Constructor,\n )\n this._container.registerSingleton(DI_TOKENS.EventRegistry, EventRegistry)\n this._container.registerSingleton(DI_TOKENS.Quarry, QuarryRegistry)\n this._container.registerValue(SEEDER_TOKENS.SeederRegistry, new SeederRegistry(this))\n }\n\n /**\n * Initialize the ExceptionHandler: call register(), then module onException hooks.\n */\n private initializeExceptionHandler(): void {\n const handler = this._container.resolve<ExceptionHandler>(DI_TOKENS.ExceptionHandler)\n handler.register()\n this.moduleRegistry.configureExceptionHandlers(handler)\n }\n}\n","import 'reflect-metadata'\n\nimport { Application, type ApplicationConfig } from './application'\nimport type { StratalEnv } from './env'\nimport { StratalNotInitializedError } from './errors'\nimport type { HonoApp } from './router/hono-app'\n\n/**\n * Stratal — Hono-style entry point for Cloudflare Workers.\n *\n * Eagerly bootstraps the Application at construction time, dynamically\n * importing `cloudflare:workers` for env and waitUntil.\n *\n * @example\n * ```typescript\n * import { Stratal } from 'stratal'\n * import { AppModule } from './app.module'\n *\n * export default new Stratal({ module: AppModule })\n * ```\n */\nexport class Stratal<Env extends StratalEnv = StratalEnv> {\n private app: Application | null = null\n private initPromise: Promise<Application>\n\n private static _application: Promise<Application> | null = null\n private static _generation = 0\n private static _previousInstance: Stratal | null = null\n\n constructor(config: ApplicationConfig) {\n this.fetch = this.fetch.bind(this)\n this.queue = this.queue.bind(this)\n this.scheduled = this.scheduled.bind(this)\n\n // Invalidate any in-flight initialization from a previous instance (Vite HMR reload)\n const generation = ++Stratal._generation\n\n if (Stratal._previousInstance) {\n void Stratal._previousInstance.shutdown()\n }\n Stratal._previousInstance = this\n\n this.initPromise = this.prepareApp(config, generation)\n Stratal._application = this.initPromise\n }\n\n async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {\n const app = await this.ensureReady()\n const hono = await app.ensureHono()\n return hono.fetch(request, env, ctx)\n }\n\n async queue(batch: MessageBatch): Promise<void> {\n const app = await this.ensureReady()\n return app.handleQueue(batch, batch.queue)\n }\n\n async scheduled(controller: ScheduledController): Promise<void> {\n const app = await this.ensureReady()\n return app.handleScheduled(controller)\n }\n\n get hono(): Promise<HonoApp> {\n return this.initPromise.then(app => app.ensureHono())\n }\n\n async shutdown(): Promise<void> {\n try { this.app = await this.initPromise } catch { /* ignore */ }\n if (this.app) {\n await this.app.shutdown()\n this.app = null\n }\n }\n\n /**\n * @internal\n * Resolves the Application instance from the static singleton.\n * Used by worker base classes (DurableObject, Workflow, WorkerEntrypoint)\n * to access the DI container without going through Cloudflare RPC.\n */\n static resolveApplication(): Promise<Application> {\n if (!Stratal._application) {\n throw new StratalNotInitializedError()\n }\n return Stratal._application\n }\n\n private async ensureReady(): Promise<Application> {\n this.app ??= await this.initPromise;\n return this.app\n }\n\n private async prepareApp(config: ApplicationConfig, generation: number): Promise<Application> {\n const { env, waitUntil } = await import('cloudflare:workers')\n\n // After async import, check if a newer instance has replaced us (Vite HMR reload)\n if (generation !== Stratal._generation) {\n return new Promise<Application>(() => {\n //\n }) // Never resolves — avoids cross-request promise warning\n }\n\n const app = new Application({ ...config, env: env as Env, ctx: { waitUntil } })\n await app.initialize()\n\n // Check again after initialization completes\n if (generation !== Stratal._generation) {\n await app.shutdown()\n return new Promise<Application>(() => {\n //\n })\n }\n\n return app\n }\n}\n"],"mappings":"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"}
@@ -13,7 +13,7 @@
13
13
  * ]
14
14
  * ```
15
15
  */
16
- type Constructor<T extends object = object> = new (...args: any[]) => T;
16
+ type Constructor<T = object> = new (...args: any[]) => T;
17
17
  //#endregion
18
18
  export { Constructor as t };
19
- //# sourceMappingURL=types-DahElfUw.d.mts.map
19
+ //# sourceMappingURL=types-DIWemRad.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-DIWemRad.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;AAeA;;;;;;;;;;;;;KAAY,WAAA,uBAAkC,IAAA,YAAgB,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./chunk-D1SwGrFN.mjs";
2
- import { i as dimWhite, n as cyan, r as dim, s as yellow, t as bold } from "./colors-Y7WIFXs7.mjs";
2
+ import { i as dimWhite, n as cyan, r as dim, s as yellow, t as bold } from "./colors-DJaRDXoS.mjs";
3
3
  //#region src/quarry/usage-generator.ts
4
4
  var usage_generator_exports = /* @__PURE__ */ __exportAll({
5
5
  generateListing: () => generateListing,
@@ -155,4 +155,4 @@ function formatTable(rows) {
155
155
  //#endregion
156
156
  export { usage_generator_exports as n, generateUsage as t };
157
157
 
158
- //# sourceMappingURL=usage-generator-CVIsENuE.mjs.map
158
+ //# sourceMappingURL=usage-generator-MBcRo0Q2.mjs.map