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
@@ -1,707 +0,0 @@
1
- import { a as __decorate, d as Transient, g as DI_TOKENS, h as CONTAINER_TOKEN, o as __decorateParam, s as __decorateMetadata, u as LOGGER_TOKENS } from "./logger-CGT91VY6.mjs";
2
- import { Lifecycle, container as container$1, delay, inject, inject as inject$1, injectable as injectable$1, instancePerContainerCachingFactory as instancePerContainerCachingFactory$1, predicateAwareClassFactory, singleton } from "tsyringe";
3
- //#region src/errors/application-error.ts
4
- /**
5
- * ApplicationError
6
- *
7
- * Abstract base class for all application errors.
8
- * This class should never be used directly - always extend it to create specific error types.
9
- *
10
- * Features:
11
- * - Type-safe error codes from ERROR_CODES registry
12
- * - Type-safe message keys from i18n module
13
- * - Localized message keys (translated by GlobalErrorHandler)
14
- * - Structured metadata for logging and interpolation
15
- * - Proper Error prototype chain
16
- * - Automatic timestamp generation
17
- * - Serialization for RPC transmission
18
- *
19
- * Message Localization:
20
- * - Each error class passes an i18n key (e.g., 'errors.userNotFound') to super()
21
- * - `Error.message` contains the i18n key for useful stack traces and fallback display
22
- * - Metadata provides interpolation parameters (e.g., { userId: '123' })
23
- * - GlobalErrorHandler translates the message key using I18nService before sending response
24
- * - This ensures errors are localized based on the user's locale (from X-Locale header)
25
- */
26
- var ApplicationError = class ApplicationError extends Error {
27
- /**
28
- * Controls whether stack traces are captured.
29
- * Set to false in production to skip the expensive Error.captureStackTrace() call,
30
- * since stack traces are stripped from responses in production anyway.
31
- */
32
- static captureStackTraces = true;
33
- /**
34
- * Type-safe error code from ERROR_CODES registry
35
- * See error-codes.ts for the complete registry
36
- */
37
- code;
38
- /**
39
- * ISO timestamp when the error was created
40
- */
41
- timestamp;
42
- /**
43
- * Additional structured data about the error
44
- * Used for:
45
- * 1. Logging and debugging
46
- * 2. Message interpolation (e.g., { userId: '123', email: 'user@example.com' })
47
- */
48
- metadata;
49
- /**
50
- * @param i18nKey - Type-safe i18n message key (e.g., 'errors.userNotFound')
51
- * @param code - Type-safe error code from ERROR_CODES registry
52
- * @param metadata - Optional data for logging and interpolation
53
- */
54
- constructor(i18nKey, code, metadata) {
55
- super(i18nKey);
56
- Object.setPrototypeOf(this, new.target.prototype);
57
- this.name = this.constructor.name;
58
- this.code = code;
59
- this.timestamp = (/* @__PURE__ */ new Date()).toISOString();
60
- this.metadata = metadata;
61
- if (ApplicationError.captureStackTraces && Error.captureStackTrace) Error.captureStackTrace(this, this.constructor);
62
- }
63
- /**
64
- * Filter metadata to include only user-facing properties
65
- *
66
- * User-facing properties (validation/constraint errors):
67
- * - issues: Validation errors from SchemaValidationError
68
- * - fields: Constraint violation fields
69
- * - field: Single field constraint/foreign key
70
- *
71
- * Internal properties (excluded from response):
72
- * - path, method: Route debugging
73
- * - controllerName, reason: Controller errors
74
- * - details, etc.: Internal debugging info
75
- *
76
- * @param metadata - Raw metadata object
77
- * @returns Filtered metadata with only whitelisted properties
78
- */
79
- static filterMetadata(metadata) {
80
- if (!metadata) return void 0;
81
- const whitelist = [
82
- "issues",
83
- "fields",
84
- "field"
85
- ];
86
- const filtered = {};
87
- let hasUserFacingData = false;
88
- for (const key of whitelist) if (key in metadata && metadata[key] !== void 0) {
89
- filtered[key] = metadata[key];
90
- hasUserFacingData = true;
91
- }
92
- return hasUserFacingData ? filtered : void 0;
93
- }
94
- /**
95
- * Serialize error to ErrorResponse format for RPC transmission
96
- *
97
- * @param env - Environment (development | production)
98
- * @param translatedMessage - Optional translated message (from GlobalErrorHandler)
99
- * @returns ErrorResponse object suitable for JSON serialization
100
- */
101
- toErrorResponse(env, translatedMessage) {
102
- const message = translatedMessage ?? this.message;
103
- return {
104
- code: this.code,
105
- message,
106
- timestamp: this.timestamp,
107
- metadata: ApplicationError.filterMetadata(this.metadata),
108
- stack: env === "development" ? this.stack?.replace(this.message, message) : void 0
109
- };
110
- }
111
- /**
112
- * JSON serialization (used by JSON.stringify)
113
- * Defaults to development mode for backward compatibility
114
- * Note: This will use the untranslated message key - use GlobalErrorHandler for proper localization
115
- */
116
- toJSON() {
117
- return this.toErrorResponse("development");
118
- }
119
- };
120
- //#endregion
121
- //#region src/errors/error-response.ts
122
- /**
123
- * Type guard to check if an object is an ErrorResponse
124
- */
125
- function isErrorResponse(obj) {
126
- return typeof obj === "object" && obj !== null && "code" in obj && typeof obj.code === "number" && "message" in obj && typeof obj.message === "string" && "timestamp" in obj && typeof obj.timestamp === "string";
127
- }
128
- //#endregion
129
- //#region src/errors/error-codes.ts
130
- /**
131
- * Centralized Error Code Registry
132
- *
133
- * Error codes are organized by category with specific ranges:
134
- * - 1000-1999: Validation errors
135
- * - 2000-2999: Database errors (generic)
136
- * - 3000-3999: Authentication & Authorization
137
- * - 4000-4999: Resource errors
138
- * - 5000-5999: Domain-specific business logic (per module)
139
- * - 9000-9999: System/Internal errors
140
- * - 9000-9099: Router errors
141
- * - 9100-9199: Configuration errors
142
- * - 9200-9299: Infrastructure errors
143
- * - 9300-9399: I18n errors
144
- */
145
- const ERROR_CODES = {
146
- DATABASE: {
147
- GENERIC: 2e3,
148
- RECORD_NOT_FOUND: 2001,
149
- UNIQUE_CONSTRAINT: 2002,
150
- FOREIGN_KEY_CONSTRAINT: 2003,
151
- CONNECTION_FAILED: 2004,
152
- TIMEOUT: 2005,
153
- NULL_CONSTRAINT: 2006,
154
- TOO_MANY_CONNECTIONS: 2007,
155
- TRANSACTION_CONFLICT: 2008
156
- },
157
- AUTH: {
158
- INVALID_CREDENTIALS: 3e3,
159
- SESSION_EXPIRED: 3001,
160
- ACCOUNT_LOCKED: 3002,
161
- INVALID_TOKEN: 3003,
162
- CONTEXT_NOT_INITIALIZED: 3004,
163
- USER_NOT_AUTHENTICATED: 3005,
164
- EMAIL_NOT_VERIFIED: 3007,
165
- PASSWORD_TOO_SHORT: 3008,
166
- PASSWORD_TOO_LONG: 3009,
167
- ACCOUNT_ALREADY_EXISTS: 3010,
168
- FAILED_TO_CREATE_USER: 3011,
169
- FAILED_TO_CREATE_SESSION: 3012,
170
- FAILED_TO_UPDATE_USER: 3013,
171
- SOCIAL_ACCOUNT_LINKED: 3014,
172
- CANNOT_UNLINK_LAST_ACCOUNT: 3015
173
- },
174
- AUTHZ: {
175
- FORBIDDEN: 3100,
176
- ACCESS_DENIED: 3101,
177
- INSUFFICIENT_PERMISSIONS: 3102
178
- },
179
- RESOURCE: {
180
- NOT_FOUND: 4e3,
181
- ROUTE_NOT_FOUND: 4004,
182
- CONFLICT: 4100,
183
- ALREADY_EXISTS: 4101
184
- },
185
- VALIDATION: {
186
- GENERIC: 1e3,
187
- REQUIRED_FIELD: 1001,
188
- INVALID_FORMAT: 1002,
189
- SCHEMA_VALIDATION: 1003,
190
- REQUEST_VALIDATION: 1004
191
- },
192
- ROUTER: {
193
- CONTROLLER_REGISTRATION_ERROR: 9005,
194
- CONTROLLER_METHOD_NOT_FOUND: 9006,
195
- OPENAPI_ROUTE_REGISTRATION: 9008
196
- },
197
- I18N: {
198
- TRANSLATION_MISSING: 9300,
199
- LOCALE_NOT_SUPPORTED: 9301
200
- },
201
- SYSTEM: {
202
- INTERNAL_ERROR: 9e3,
203
- CONFIGURATION_ERROR: 9100,
204
- CONFIG_NOT_INITIALIZED: 9101,
205
- MODULE_ALREADY_REGISTERED: 9102,
206
- MODULE_CIRCULAR_DEPENDENCY: 9103,
207
- MODULE_DEPENDENCY_NOT_FOUND: 9104,
208
- INVALID_ERROR_CODE_RANGE: 9105,
209
- INVALID_MODULE_PROVIDER: 9106,
210
- CONFIG_MODULE_NOT_INITIALIZED: 9107,
211
- INFRASTRUCTURE_ERROR: 9200,
212
- EXECUTION_CONTEXT_NOT_INITIALIZED: 9201,
213
- REQUEST_CONTAINER_NOT_INITIALIZED: 9202,
214
- QUEUE_BINDING_NOT_FOUND: 9203,
215
- CRON_EXECUTION_FAILED: 9204,
216
- QUEUE_PROVIDER_NOT_SUPPORTED: 9205,
217
- WEBSOCKET_BODY_NOT_AVAILABLE: 9206,
218
- WEBSOCKET_DUPLICATE_EVENT_HANDLER: 9207,
219
- SEEDER_NAME_COLLISION: 9208,
220
- SEEDER_NOT_REGISTERED: 9209
221
- }
222
- };
223
- //#endregion
224
- //#region src/errors/get-http-status.ts
225
- /**
226
- * Maps error codes to HTTP status codes
227
- *
228
- * This utility is used by the frontend to set appropriate HTTP status codes
229
- * when returning errors from API routes.
230
- *
231
- * @param code - Numeric error code from ERROR_CODES registry
232
- * @returns HTTP status code (200-599)
233
- */
234
- function getHttpStatus(code) {
235
- if (code >= 1e3 && code < 2e3) return 400;
236
- if (code >= 2e3 && code < 3e3) {
237
- if (code === ERROR_CODES.DATABASE.RECORD_NOT_FOUND) return 404;
238
- if (code === ERROR_CODES.DATABASE.UNIQUE_CONSTRAINT) return 409;
239
- return 500;
240
- }
241
- if (code >= 3e3 && code < 3100) return 401;
242
- if (code >= 3100 && code < 3200) return 403;
243
- if (code >= 4e3 && code < 4100) return 404;
244
- if (code >= 4100 && code < 4200) return 409;
245
- if (code >= 5e3 && code < 6e3) {
246
- if (code === 5e3 || code === 5100 || code === 5200) return 404;
247
- return 422;
248
- }
249
- if (code >= 9e3) return 500;
250
- return 500;
251
- }
252
- //#endregion
253
- //#region src/router/router.tokens.ts
254
- /**
255
- * Dependency injection tokens for the router system
256
- */
257
- const ROUTER_TOKENS = { RouterContext: Symbol.for("stratal:router:context") };
258
- //#endregion
259
- //#region src/di/errors/conditional-binding-fallback.error.ts
260
- /**
261
- * ConditionalBindingFallbackError
262
- *
263
- * Thrown when a conditional binding predicate returns false but no fallback
264
- * implementation was provided and no existing registration exists for the token.
265
- *
266
- * This typically indicates a misconfiguration in the DI setup where:
267
- * - A `when().use().give()` chain was used without `otherwise()`
268
- * - AND the token wasn't previously registered
269
- * - AND the predicate evaluated to false at resolution time
270
- */
271
- var ConditionalBindingFallbackError = class extends ApplicationError {
272
- constructor(token) {
273
- super("errors.conditionalBindingFallback", ERROR_CODES.SYSTEM.INFRASTRUCTURE_ERROR, { token });
274
- }
275
- };
276
- //#endregion
277
- //#region src/di/errors/request-scope-operation-not-allowed.error.ts
278
- /**
279
- * RequestScopeOperationNotAllowedError
280
- *
281
- * Thrown when attempting to call a method that is not allowed on the current container scope.
282
- * - `createRequestScope()` and `runInRequestScope()` can only be called on global containers
283
- */
284
- var RequestScopeOperationNotAllowedError = class extends ApplicationError {
285
- constructor(methodName) {
286
- super("errors.requestScopeOperationNotAllowed", ERROR_CODES.SYSTEM.INFRASTRUCTURE_ERROR, { methodName });
287
- }
288
- };
289
- //#endregion
290
- //#region src/di/conditional-binding-builder.ts
291
- /**
292
- * Implementation of ConditionalBindingBuilder
293
- *
294
- * @internal
295
- */
296
- var ConditionalBindingBuilderImpl = class {
297
- constructor(tsyringeContainer, predicateContainer, predicate, options) {
298
- this.tsyringeContainer = tsyringeContainer;
299
- this.predicateContainer = predicateContainer;
300
- this.predicate = predicate;
301
- this.options = options;
302
- }
303
- use(token) {
304
- return new ConditionalBindingUseImpl(this.tsyringeContainer, this.predicateContainer, this.predicate, this.options, token);
305
- }
306
- };
307
- /**
308
- * Implementation of ConditionalBindingUse
309
- *
310
- * @internal
311
- */
312
- var ConditionalBindingUseImpl = class {
313
- constructor(tsyringeContainer, predicateContainer, predicate, options, token) {
314
- this.tsyringeContainer = tsyringeContainer;
315
- this.predicateContainer = predicateContainer;
316
- this.predicate = predicate;
317
- this.options = options;
318
- this.token = token;
319
- }
320
- give(trueImplementation) {
321
- const falseImplementation = this.getFallbackImplementation();
322
- this.registerWithPredicate(trueImplementation, falseImplementation);
323
- return { otherwise: (implementation) => {
324
- this.registerWithPredicate(trueImplementation, implementation);
325
- } };
326
- }
327
- /**
328
- * Get fallback implementation: existing registration or throw-on-resolve class
329
- */
330
- getFallbackImplementation() {
331
- if (this.tsyringeContainer.isRegistered(this.token)) {
332
- const existingInstance = this.tsyringeContainer.resolve(this.token);
333
- return class ExistingInstanceWrapper {
334
- static instance = existingInstance;
335
- constructor() {
336
- return ExistingInstanceWrapper.instance;
337
- }
338
- };
339
- }
340
- const tokenStr = typeof this.token === "symbol" ? this.token.description ?? "unknown" : typeof this.token === "function" ? this.token.name : String(this.token);
341
- return class NoFallbackError {
342
- constructor() {
343
- throw new ConditionalBindingFallbackError(tokenStr);
344
- }
345
- };
346
- }
347
- registerWithPredicate(trueImplementation, falseImplementation) {
348
- const { predicate, predicateContainer, options } = this;
349
- this.tsyringeContainer.register(this.token, { useFactory: predicateAwareClassFactory(() => predicate(predicateContainer), trueImplementation, falseImplementation, options.cache ?? false) });
350
- }
351
- };
352
- //#endregion
353
- //#region src/di/container.ts
354
- /**
355
- * Unified Container for DI management
356
- *
357
- * Manages the two-tier container hierarchy:
358
- * - Global scope: Singletons, base instances of request-scoped services
359
- * - Request scope: Context-enriched instances per HTTP request
360
- *
361
- * @example Basic registration
362
- * ```typescript
363
- * import { container as tsyringeRootContainer } from 'tsyringe'
364
- *
365
- * const container = new Container({
366
- * container: tsyringeRootContainer.createChildContainer()
367
- * })
368
- *
369
- * container.register(I18nService)
370
- * container.register(MY_TOKEN, MyService)
371
- * container.registerSingleton(ConfigService)
372
- * container.registerValue(MY_TOKEN, myInstance)
373
- * ```
374
- *
375
- * @example Request scope (automatic lifecycle)
376
- * ```typescript
377
- * await container.runInRequestScope(routerContext, async (requestContainer) => {
378
- * const i18n = requestContainer.resolve(I18N_TOKEN)
379
- * })
380
- * ```
381
- */
382
- var Container = class Container {
383
- container;
384
- isRequestScoped;
385
- constructor(options) {
386
- this.isRequestScoped = options.isRequestScoped ?? false;
387
- this.container = options.container;
388
- if (!this.isRequestScoped) this.container.register(CONTAINER_TOKEN, { useValue: this });
389
- }
390
- register(tokenOrClass, serviceClassOrScope, scope) {
391
- let token;
392
- let serviceClass;
393
- let lifecycle;
394
- if (typeof serviceClassOrScope === "function") {
395
- token = tokenOrClass;
396
- serviceClass = serviceClassOrScope;
397
- lifecycle = scope;
398
- } else {
399
- token = tokenOrClass;
400
- serviceClass = tokenOrClass;
401
- lifecycle = serviceClassOrScope;
402
- }
403
- if (lifecycle !== void 0) this.container.register(token, { useClass: serviceClass }, { lifecycle });
404
- else this.container.register(token, { useClass: serviceClass });
405
- }
406
- registerSingleton(tokenOrClass, serviceClass) {
407
- if (serviceClass !== void 0) this.container.registerSingleton(tokenOrClass, serviceClass);
408
- else {
409
- const targetClass = tokenOrClass;
410
- this.container.registerSingleton(targetClass, targetClass);
411
- }
412
- }
413
- /**
414
- * Register a value (instance) directly
415
- */
416
- registerValue(token, value) {
417
- this.container.register(token, { useValue: value });
418
- }
419
- /**
420
- * Register with factory function
421
- */
422
- registerFactory(token, factory) {
423
- this.container.register(token, { useFactory: () => factory(this) });
424
- }
425
- /**
426
- * Register an alias to an existing token
427
- */
428
- registerExisting(alias, target) {
429
- this.container.register(alias, { useToken: target });
430
- }
431
- /**
432
- * Resolve a service from the container
433
- */
434
- resolve(token) {
435
- return this.container.resolve(token);
436
- }
437
- /**
438
- * Check if a token is registered
439
- */
440
- isRegistered(token) {
441
- return this.container.isRegistered(token);
442
- }
443
- /**
444
- * Start a conditional binding with predicate evaluation
445
- */
446
- when(predicate, options = {}) {
447
- return new ConditionalBindingBuilderImpl(this.container, this, predicate, options);
448
- }
449
- /**
450
- * Replace a service registration with a decorated version
451
- */
452
- extend(token, decorator) {
453
- const decoratedInstance = decorator(this.container.resolve(token), this);
454
- this.container.register(token, { useValue: decoratedInstance });
455
- }
456
- /**
457
- * Run callback within request scope
458
- *
459
- * Creates a child container with fresh instances for services registered with `scope: Scope.Request`.
460
- * Callback receives the request-scoped container as argument.
461
- *
462
- * Can only be called on global container (not request-scoped).
463
- */
464
- async runInRequestScope(routerContext, callback) {
465
- if (this.isRequestScoped) throw new RequestScopeOperationNotAllowedError("runInRequestScope");
466
- const requestContainer = this.createRequestScope(routerContext);
467
- try {
468
- return await callback(requestContainer);
469
- } finally {
470
- await requestContainer.dispose();
471
- }
472
- }
473
- /**
474
- * Create request scope container
475
- *
476
- * Can only be called on global container (not request-scoped).
477
- */
478
- createRequestScope(routerContext) {
479
- if (this.isRequestScoped) throw new RequestScopeOperationNotAllowedError("createRequestScope");
480
- const childContainer = this.container.createChildContainer();
481
- childContainer.register(ROUTER_TOKENS.RouterContext, { useValue: routerContext });
482
- return new Container({
483
- container: childContainer,
484
- isRequestScoped: true
485
- });
486
- }
487
- /**
488
- * Get underlying tsyringe container
489
- */
490
- getTsyringeContainer() {
491
- return this.container;
492
- }
493
- dispose() {
494
- return this.container.dispose();
495
- }
496
- };
497
- //#endregion
498
- //#region src/di/types.ts
499
- /**
500
- * DI Type Definitions
501
- *
502
- * Core type definitions for the dependency injection system.
503
- * Simplified after removing LazyProxy - no more type wrappers needed.
504
- */
505
- /**
506
- * Service scope for DI registration
507
- *
508
- * Maps directly to tsyringe's Lifecycle enum.
509
- * Scope is specified at registration time via provider configuration,
510
- * not at class decoration time.
511
- *
512
- * @example
513
- * ```typescript
514
- * // In module providers:
515
- * { provide: MY_TOKEN, useClass: MyService, scope: Scope.Singleton }
516
- *
517
- * // In Application.ts:
518
- * container.register(MY_TOKEN, MyService, Scope.Request)
519
- * ```
520
- */
521
- let Scope = /* @__PURE__ */ function(Scope) {
522
- /** New instance per resolution (default) */
523
- Scope[Scope["Transient"] = Lifecycle.Transient] = "Transient";
524
- /** Single instance shared globally */
525
- Scope[Scope["Singleton"] = Lifecycle.Singleton] = "Singleton";
526
- /** New instance per child container (per request) */
527
- Scope[Scope["Request"] = Lifecycle.ContainerScoped] = "Request";
528
- return Scope;
529
- }({});
530
- //#endregion
531
- //#region src/i18n/i18n.tokens.ts
532
- /**
533
- * I18n Module DI Tokens
534
- * Symbol-based tokens to avoid string collisions
535
- */
536
- const I18N_TOKENS = {
537
- MessageLoader: Symbol.for("stratal:i18n:message:loader"),
538
- I18nService: Symbol.for("stratal:i18n:service"),
539
- Options: Symbol.for("stratal:i18n:options"),
540
- MessageRegistry: Symbol.for("stratal:i18n:message:registry")
541
- };
542
- //#endregion
543
- //#region src/errors/internal-error.ts
544
- /**
545
- * InternalError
546
- *
547
- * Represents an unexpected internal server error.
548
- * Used to wrap unknown errors that don't fit into specific error categories.
549
- *
550
- * This error is thrown when:
551
- * - An unexpected exception occurs
552
- * - An error type is not recognized
553
- * - A system-level failure happens
554
- */
555
- var InternalError = class extends ApplicationError {
556
- constructor(metadata) {
557
- super("errors.internalError", ERROR_CODES.SYSTEM.INTERNAL_ERROR, metadata);
558
- }
559
- };
560
- //#endregion
561
- //#region src/errors/is-application-error.ts
562
- /**
563
- * Type guard to check if an error is an ApplicationError
564
- *
565
- * @param error - The error to check
566
- * @returns True if the error is an ApplicationError instance
567
- */
568
- function isApplicationError(error) {
569
- return error instanceof ApplicationError;
570
- }
571
- //#endregion
572
- //#region src/errors/global-error-handler.ts
573
- let GlobalErrorHandler = class GlobalErrorHandler {
574
- environment;
575
- constructor(logger, i18n, env) {
576
- this.logger = logger;
577
- this.i18n = i18n;
578
- this.env = env;
579
- this.environment = this.env.ENVIRONMENT;
580
- }
581
- /**
582
- * Handle an error, log it, and serialize for response
583
- *
584
- * @param error - The error to handle
585
- * @returns Serialized ErrorResponse for RPC transmission
586
- */
587
- handle(error) {
588
- if (isApplicationError(error)) {
589
- const translatedMessage = this.translateError(error);
590
- this.log(error, translatedMessage);
591
- return error.toErrorResponse(this.environment, translatedMessage);
592
- }
593
- this.logUnexpectedError(error);
594
- const internalError = new InternalError({
595
- originalError: error instanceof Error ? error.message : String(error),
596
- stack: error instanceof Error ? error.stack : void 0
597
- });
598
- const translatedMessage = this.translateError(internalError);
599
- return internalError.toErrorResponse(this.environment, translatedMessage);
600
- }
601
- /**
602
- * Translate error message key using I18nService
603
- * Uses error metadata as interpolation parameters
604
- *
605
- * No try/catch - if translation fails, it's a bug that should fail loudly
606
- *
607
- * **Note**: This method is only called when isAvailable() returns true,
608
- * so the service is guaranteed to be resolved.
609
- *
610
- * @param error - ApplicationError with messageKey and metadata
611
- * @returns Translated message string
612
- */
613
- translateError(error) {
614
- const params = error.metadata;
615
- return this.i18n.t(error.message, params);
616
- }
617
- /**
618
- * Log an ApplicationError with appropriate severity
619
- */
620
- log(error, translatedMessage) {
621
- const severity = this.getSeverity(error.code);
622
- const logData = {
623
- code: error.code,
624
- message: translatedMessage,
625
- timestamp: error.timestamp,
626
- metadata: error.metadata,
627
- name: error.name
628
- };
629
- switch (severity) {
630
- case "error":
631
- this.logger.error("[ApplicationError]", logData);
632
- break;
633
- case "warn":
634
- this.logger.warn("[ApplicationError]", logData);
635
- break;
636
- case "info":
637
- this.logger.info("[ApplicationError]", logData);
638
- break;
639
- }
640
- }
641
- /**
642
- * Log an unexpected error
643
- */
644
- logUnexpectedError(error) {
645
- this.logger.error("[UnexpectedError]", {
646
- error: error instanceof Error ? {
647
- message: error.message,
648
- stack: error.stack,
649
- name: error.name
650
- } : String(error),
651
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
652
- });
653
- }
654
- /**
655
- * Determine log severity based on error code
656
- */
657
- getSeverity(code) {
658
- if (code >= 9e3) return "error";
659
- if (code >= 2e3 && code < 3e3) return "error";
660
- if (code >= 5e3 && code < 6e3) return "warn";
661
- if (code >= 1e3 && code < 2e3) return "info";
662
- if (code >= 3e3 && code < 5e3) return "warn";
663
- return "error";
664
- }
665
- };
666
- GlobalErrorHandler = __decorate([
667
- Transient(),
668
- __decorateParam(0, inject(LOGGER_TOKENS.LoggerService)),
669
- __decorateParam(1, inject(I18N_TOKENS.I18nService)),
670
- __decorateParam(2, inject(DI_TOKENS.CloudflareEnv)),
671
- __decorateMetadata("design:paramtypes", [
672
- Object,
673
- Object,
674
- Object
675
- ])
676
- ], GlobalErrorHandler);
677
- //#endregion
678
- //#region src/errors/request-container-not-initialized.error.ts
679
- /**
680
- * RequestContainerNotInitializedError
681
- *
682
- * Thrown when attempting to access the request-scoped container before it has been initialized.
683
- * This typically indicates that the RouterService middleware hasn't run yet,
684
- * or the router context is being accessed outside of a request lifecycle.
685
- */
686
- var RequestContainerNotInitializedError = class extends ApplicationError {
687
- constructor() {
688
- super("errors.requestContainerNotInitialized", ERROR_CODES.SYSTEM.REQUEST_CONTAINER_NOT_INITIALIZED);
689
- }
690
- };
691
- //#endregion
692
- //#region src/errors/stratal-not-initialized.error.ts
693
- /**
694
- * StratalNotInitializedError
695
- *
696
- * Thrown when attempting to resolve the Application instance before Stratal has been instantiated.
697
- * This typically indicates that the Stratal instance is not exported as the default export.
698
- */
699
- var StratalNotInitializedError = class extends ApplicationError {
700
- constructor() {
701
- super("errors.stratalNotInitialized", ERROR_CODES.SYSTEM.INFRASTRUCTURE_ERROR);
702
- }
703
- };
704
- //#endregion
705
- export { ApplicationError as S, ConditionalBindingFallbackError as _, InternalError as a, ERROR_CODES as b, Container as c, inject$1 as d, injectable$1 as f, RequestScopeOperationNotAllowedError as g, ConditionalBindingBuilderImpl as h, isApplicationError as i, container$1 as l, singleton as m, RequestContainerNotInitializedError as n, I18N_TOKENS as o, instancePerContainerCachingFactory$1 as p, GlobalErrorHandler as r, Scope as s, StratalNotInitializedError as t, delay as u, ROUTER_TOKENS as v, isErrorResponse as x, getHttpStatus as y };
706
-
707
- //# sourceMappingURL=errors-DSKapqD8.mjs.map