glasswork 1.5.0 → 1.6.0

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/CHANGELOG.md +54 -1
  2. package/README.md +6 -2
  3. package/dist/audit/audit-logger.d.ts +6 -1
  4. package/dist/audit/audit-logger.d.ts.map +1 -1
  5. package/dist/audit/audit-logger.js +6 -1
  6. package/dist/audit/audit-logger.js.map +1 -1
  7. package/dist/auth/assert.d.ts +4 -0
  8. package/dist/auth/assert.d.ts.map +1 -1
  9. package/dist/auth/assert.js +7 -3
  10. package/dist/auth/assert.js.map +1 -1
  11. package/dist/auth/better-auth-provider.js +13 -4
  12. package/dist/auth/better-auth-provider.js.map +1 -1
  13. package/dist/auth/errors.d.ts +17 -0
  14. package/dist/auth/errors.d.ts.map +1 -0
  15. package/dist/auth/errors.js +23 -0
  16. package/dist/auth/errors.js.map +1 -0
  17. package/dist/auth/index.d.ts +2 -1
  18. package/dist/auth/index.d.ts.map +1 -1
  19. package/dist/auth/index.js +1 -0
  20. package/dist/auth/index.js.map +1 -1
  21. package/dist/auth/middleware.d.ts +13 -0
  22. package/dist/auth/middleware.d.ts.map +1 -1
  23. package/dist/auth/middleware.js +19 -8
  24. package/dist/auth/middleware.js.map +1 -1
  25. package/dist/auth/types.d.ts +4 -0
  26. package/dist/auth/types.d.ts.map +1 -1
  27. package/dist/config/providers.d.ts.map +1 -1
  28. package/dist/config/providers.js +5 -4
  29. package/dist/config/providers.js.map +1 -1
  30. package/dist/core/bootstrap.d.ts +2 -2
  31. package/dist/core/bootstrap.d.ts.map +1 -1
  32. package/dist/core/bootstrap.js +142 -68
  33. package/dist/core/bootstrap.js.map +1 -1
  34. package/dist/core/contract.d.ts +9 -2
  35. package/dist/core/contract.d.ts.map +1 -1
  36. package/dist/core/contract.js +2 -1
  37. package/dist/core/contract.js.map +1 -1
  38. package/dist/core/errors.d.ts +16 -0
  39. package/dist/core/errors.d.ts.map +1 -0
  40. package/dist/core/errors.js +31 -0
  41. package/dist/core/errors.js.map +1 -0
  42. package/dist/core/glasswork-config.d.ts +42 -0
  43. package/dist/core/glasswork-config.d.ts.map +1 -0
  44. package/dist/core/glasswork-config.js +2 -0
  45. package/dist/core/glasswork-config.js.map +1 -0
  46. package/dist/core/index.d.ts +6 -3
  47. package/dist/core/index.d.ts.map +1 -1
  48. package/dist/core/index.js +4 -2
  49. package/dist/core/index.js.map +1 -1
  50. package/dist/core/job-services.d.ts +16 -0
  51. package/dist/core/job-services.d.ts.map +1 -0
  52. package/dist/core/job-services.js +19 -0
  53. package/dist/core/job-services.js.map +1 -0
  54. package/dist/core/lifecycle.d.ts +29 -1
  55. package/dist/core/lifecycle.d.ts.map +1 -1
  56. package/dist/core/lifecycle.js +98 -15
  57. package/dist/core/lifecycle.js.map +1 -1
  58. package/dist/core/module-graph.d.ts +2 -0
  59. package/dist/core/module-graph.d.ts.map +1 -1
  60. package/dist/core/module-graph.js +63 -10
  61. package/dist/core/module-graph.js.map +1 -1
  62. package/dist/core/module-inspection.d.ts +44 -0
  63. package/dist/core/module-inspection.d.ts.map +1 -0
  64. package/dist/core/module-inspection.js +114 -0
  65. package/dist/core/module-inspection.js.map +1 -0
  66. package/dist/core/module-runtime.d.ts +8 -0
  67. package/dist/core/module-runtime.d.ts.map +1 -1
  68. package/dist/core/module-runtime.js +60 -6
  69. package/dist/core/module-runtime.js.map +1 -1
  70. package/dist/core/request-scope.js +1 -1
  71. package/dist/core/request-scope.js.map +1 -1
  72. package/dist/core/types.d.ts +98 -7
  73. package/dist/core/types.d.ts.map +1 -1
  74. package/dist/email/ses.d.ts +7 -0
  75. package/dist/email/ses.d.ts.map +1 -0
  76. package/dist/email/ses.js +6 -0
  77. package/dist/email/ses.js.map +1 -0
  78. package/dist/email/smtp.d.ts +7 -0
  79. package/dist/email/smtp.d.ts.map +1 -0
  80. package/dist/email/smtp.js +6 -0
  81. package/dist/email/smtp.js.map +1 -0
  82. package/dist/email/transports/ses-transport.d.ts.map +1 -1
  83. package/dist/email/transports/ses-transport.js +6 -4
  84. package/dist/email/transports/ses-transport.js.map +1 -1
  85. package/dist/email/transports/smtp-transport.d.ts +40 -0
  86. package/dist/email/transports/smtp-transport.d.ts.map +1 -0
  87. package/dist/email/transports/smtp-transport.js +67 -0
  88. package/dist/email/transports/smtp-transport.js.map +1 -0
  89. package/dist/http/error-handler.d.ts +7 -1
  90. package/dist/http/error-handler.d.ts.map +1 -1
  91. package/dist/http/error-handler.js +18 -6
  92. package/dist/http/error-handler.js.map +1 -1
  93. package/dist/http/error-response.dto.d.ts +6 -0
  94. package/dist/http/error-response.dto.d.ts.map +1 -1
  95. package/dist/http/error-response.dto.js +6 -0
  96. package/dist/http/error-response.dto.js.map +1 -1
  97. package/dist/http/errors.d.ts +12 -0
  98. package/dist/http/errors.d.ts.map +1 -1
  99. package/dist/http/errors.js +35 -23
  100. package/dist/http/errors.js.map +1 -1
  101. package/dist/http/index.d.ts +1 -1
  102. package/dist/http/index.d.ts.map +1 -1
  103. package/dist/http/index.js +1 -1
  104. package/dist/http/index.js.map +1 -1
  105. package/dist/http/route-authorization.d.ts.map +1 -1
  106. package/dist/http/route-authorization.js +3 -3
  107. package/dist/http/route-authorization.js.map +1 -1
  108. package/dist/http/route-helpers.d.ts +2 -1
  109. package/dist/http/route-helpers.d.ts.map +1 -1
  110. package/dist/http/route-helpers.js +29 -2
  111. package/dist/http/route-helpers.js.map +1 -1
  112. package/dist/http/route-openapi-context.d.ts +15 -1
  113. package/dist/http/route-openapi-context.d.ts.map +1 -1
  114. package/dist/http/route-openapi-context.js.map +1 -1
  115. package/dist/http/route-response.d.ts +6 -2
  116. package/dist/http/route-response.d.ts.map +1 -1
  117. package/dist/http/route-response.js +36 -16
  118. package/dist/http/route-response.js.map +1 -1
  119. package/dist/http/route-types.d.ts +12 -4
  120. package/dist/http/route-types.d.ts.map +1 -1
  121. package/dist/http/route-types.js.map +1 -1
  122. package/dist/http/route-validation.d.ts.map +1 -1
  123. package/dist/http/route-validation.js +21 -1
  124. package/dist/http/route-validation.js.map +1 -1
  125. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts +1 -0
  126. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts.map +1 -1
  127. package/dist/jobs/drivers/eventbridge-scheduler-driver.js +12 -2
  128. package/dist/jobs/drivers/eventbridge-scheduler-driver.js.map +1 -1
  129. package/dist/jobs/drivers/mock-driver.d.ts +4 -0
  130. package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
  131. package/dist/jobs/drivers/mock-driver.js +10 -3
  132. package/dist/jobs/drivers/mock-driver.js.map +1 -1
  133. package/dist/jobs/drivers/sqs-driver.d.ts +1 -1
  134. package/dist/jobs/drivers/sqs-driver.d.ts.map +1 -1
  135. package/dist/jobs/drivers/sqs-driver.js +8 -2
  136. package/dist/jobs/drivers/sqs-driver.js.map +1 -1
  137. package/dist/jobs/errors.d.ts +14 -1
  138. package/dist/jobs/errors.d.ts.map +1 -1
  139. package/dist/jobs/errors.js +19 -2
  140. package/dist/jobs/errors.js.map +1 -1
  141. package/dist/jobs/index.d.ts +3 -3
  142. package/dist/jobs/index.d.ts.map +1 -1
  143. package/dist/jobs/index.js +1 -1
  144. package/dist/jobs/index.js.map +1 -1
  145. package/dist/jobs/job-service.d.ts +46 -7
  146. package/dist/jobs/job-service.d.ts.map +1 -1
  147. package/dist/jobs/job-service.js +63 -9
  148. package/dist/jobs/job-service.js.map +1 -1
  149. package/dist/jobs/scheduler.d.ts +6 -0
  150. package/dist/jobs/scheduler.d.ts.map +1 -0
  151. package/dist/jobs/scheduler.js +6 -0
  152. package/dist/jobs/scheduler.js.map +1 -0
  153. package/dist/jobs/sqs.d.ts +7 -0
  154. package/dist/jobs/sqs.d.ts.map +1 -0
  155. package/dist/jobs/sqs.js +7 -0
  156. package/dist/jobs/sqs.js.map +1 -0
  157. package/dist/jobs/types.d.ts +6 -1
  158. package/dist/jobs/types.d.ts.map +1 -1
  159. package/dist/jobs/utils.d.ts +6 -0
  160. package/dist/jobs/utils.d.ts.map +1 -1
  161. package/dist/jobs/utils.js +8 -0
  162. package/dist/jobs/utils.js.map +1 -1
  163. package/dist/middleware/rate-limit.d.ts.map +1 -1
  164. package/dist/middleware/rate-limit.js +5 -4
  165. package/dist/middleware/rate-limit.js.map +1 -1
  166. package/dist/observability/exception-tracking.d.ts +23 -0
  167. package/dist/observability/exception-tracking.d.ts.map +1 -1
  168. package/dist/observability/exception-tracking.js +101 -6
  169. package/dist/observability/exception-tracking.js.map +1 -1
  170. package/dist/observability/index.d.ts +1 -1
  171. package/dist/observability/index.d.ts.map +1 -1
  172. package/dist/observability/index.js +1 -1
  173. package/dist/observability/index.js.map +1 -1
  174. package/dist/observability/sanitizers.d.ts.map +1 -1
  175. package/dist/observability/sanitizers.js +2 -0
  176. package/dist/observability/sanitizers.js.map +1 -1
  177. package/dist/openapi/drift.d.ts +17 -2
  178. package/dist/openapi/drift.d.ts.map +1 -1
  179. package/dist/openapi/drift.js +79 -5
  180. package/dist/openapi/drift.js.map +1 -1
  181. package/dist/openapi/openapi.d.ts.map +1 -1
  182. package/dist/openapi/openapi.js +2 -1
  183. package/dist/openapi/openapi.js.map +1 -1
  184. package/dist/utils/environment.d.ts +10 -2
  185. package/dist/utils/environment.d.ts.map +1 -1
  186. package/dist/utils/environment.js +20 -3
  187. package/dist/utils/environment.js.map +1 -1
  188. package/dist/utils/module-interop.d.ts +9 -0
  189. package/dist/utils/module-interop.d.ts.map +1 -0
  190. package/dist/utils/module-interop.js +16 -0
  191. package/dist/utils/module-interop.js.map +1 -0
  192. package/dist/utils/optional-dependency.d.ts +6 -0
  193. package/dist/utils/optional-dependency.d.ts.map +1 -0
  194. package/dist/utils/optional-dependency.js +16 -0
  195. package/dist/utils/optional-dependency.js.map +1 -0
  196. package/dist/utils/serialize-prisma-types.d.ts +51 -15
  197. package/dist/utils/serialize-prisma-types.d.ts.map +1 -1
  198. package/dist/utils/serialize-prisma-types.js +47 -16
  199. package/dist/utils/serialize-prisma-types.js.map +1 -1
  200. package/package.json +56 -12
@@ -0,0 +1,67 @@
1
+ import { optionalDependency } from '../../utils/optional-dependency.js';
2
+ const loadNodemailer = optionalDependency('nodemailer', 'SmtpTransport', () => import('nodemailer'));
3
+ /**
4
+ * SMTP transport backed by Nodemailer, for SMTP relays and local mail catchers such as
5
+ * Mailpit. Requires the `nodemailer` package.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { SmtpTransport } from 'glasswork/email/smtp';
10
+ *
11
+ * const transport = new SmtpTransport({ host: 'localhost', port: 1025 });
12
+ * ```
13
+ */
14
+ export class SmtpTransport {
15
+ name = 'smtp';
16
+ #options;
17
+ #transporter;
18
+ constructor(options) {
19
+ if (!options.transporter && !options.host && !options.nodemailer) {
20
+ throw new Error('SmtpTransport needs a transporter, a host or nodemailer options');
21
+ }
22
+ this.#options = options;
23
+ }
24
+ async send(message) {
25
+ const transporter = await this.#getTransporter();
26
+ const info = await transporter.sendMail({
27
+ from: message.from,
28
+ to: message.to,
29
+ cc: message.cc,
30
+ bcc: message.bcc,
31
+ replyTo: message.replyTo,
32
+ subject: message.subject,
33
+ html: message.html,
34
+ text: message.text,
35
+ headers: message.headers,
36
+ attachments: message.attachments?.map((attachment) => ({
37
+ filename: attachment.filename,
38
+ content: attachment.content,
39
+ contentType: attachment.contentType,
40
+ contentDisposition: attachment.disposition,
41
+ cid: attachment.contentId,
42
+ })),
43
+ });
44
+ return {
45
+ messageId: info.messageId ?? '',
46
+ success: (info.rejected?.length ?? 0) === 0,
47
+ metadata: { accepted: info.accepted, rejected: info.rejected, response: info.response },
48
+ };
49
+ }
50
+ /** Close a transporter this transport created. A transporter you passed in stays open. */
51
+ async close() {
52
+ const transporter = this.#transporter;
53
+ this.#transporter = undefined;
54
+ if (transporter)
55
+ (await transporter).close?.();
56
+ }
57
+ #getTransporter() {
58
+ if (this.#options.transporter)
59
+ return Promise.resolve(this.#options.transporter);
60
+ this.#transporter ??= loadNodemailer().then(({ createTransport }) => {
61
+ const { host, port, secure, auth, nodemailer } = this.#options;
62
+ return createTransport({ host, port, secure, auth, ...nodemailer });
63
+ });
64
+ return this.#transporter;
65
+ }
66
+ }
67
+ //# sourceMappingURL=smtp-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smtp-transport.js","sourceRoot":"","sources":["../../../src/email/transports/smtp-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAGxE,MAAM,cAAc,GAAG,kBAAkB,CACvC,YAAY,EACZ,eAAe,EACf,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAC3B,CAAC;AAuBF;;;;;;;;;;GAUG;AACH,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,MAAM,CAAC;IACd,QAAQ,CAAuB;IACxC,YAAY,CAAuC;IAEnD,YAAY,OAA6B;QACvC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAqB;QAC9B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;YACtC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBACrD,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,WAAW,EAAE,UAAU,CAAC,WAAW;gBACnC,kBAAkB,EAAE,UAAU,CAAC,WAAW;gBAC1C,GAAG,EAAE,UAAU,CAAC,SAAS;aAC1B,CAAC,CAAC;SACJ,CAAC,CAAC;QAEH,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;YAC/B,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC;YAC3C,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;SACxF,CAAC;IACJ,CAAC;IAED,0FAA0F;IAC1F,KAAK,CAAC,KAAK;QACT,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,IAAI,WAAW;YAAE,CAAC,MAAM,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;IACjD,CAAC;IAED,eAAe;QACb,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACjF,IAAI,CAAC,YAAY,KAAK,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE;YAClE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/D,OAAO,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF"}
@@ -13,9 +13,15 @@ interface ExceptionTracker {
13
13
  interface ExceptionTrackingConfig {
14
14
  trackStatusCodes: (statusCode: number) => boolean;
15
15
  }
16
- interface FormattedError {
16
+ /** What the error handler knows about a failed request, passed to `responseHandler`. */
17
+ export interface FormattedError {
18
+ /** Safe message for the response body. */
17
19
  message: string;
18
20
  statusCode: ContentfulStatusCode;
21
+ /** Stable machine-readable code, such as `not-found`. */
22
+ code: string;
23
+ /** The error that was thrown, for custom response handlers and logging. */
24
+ error: unknown;
19
25
  }
20
26
  interface ErrorHandlerOptions {
21
27
  /** Injected logger for all error paths, including error handler failures. */
@@ -1 +1 @@
1
- {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/http/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAElD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAoC,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGlG;;GAEG;AACH,UAAU,gBAAgB;IACxB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACzE;AAED;;GAEG;AACH,UAAU,uBAAuB;IAC/B,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;CACnD;AAKD,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,oBAAoB,CAAC;CAClC;AAED,UAAU,mBAAmB;IAC3B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5F;;;OAGG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAEpC;;;OAGG;IACH,cAAc,CAAC,EAAE,IAAI,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;CACpE;AAwID;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAoDlF;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,cAAuB,CAAC"}
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/http/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAElD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAoC,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGlG;;GAEG;AACH,UAAU,gBAAgB;IACxB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACzE;AAED;;GAEG;AACH,UAAU,uBAAuB;IAC/B,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;CACnD;AAKD,wFAAwF;AACxF,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,oBAAoB,CAAC;IACjC,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,mBAAmB;IAC3B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5F;;;OAGG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAEpC;;;OAGG;IACH,cAAc,CAAC,EAAE,IAAI,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;CACpE;AA4ID;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAyDlF;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,cAAuB,CAAC"}
@@ -1,13 +1,11 @@
1
1
  import { HTTPException } from 'hono/http-exception';
2
2
  import { createLogger, getDefaultLogLevel } from '../utils/logger.js';
3
- import { DomainException, getStatusCodeFromErrorCode } from './errors.js';
3
+ import { DomainException, getErrorCodeForStatus, getStatusCodeFromErrorCode } from './errors.js';
4
4
  /**
5
5
  * Default response handler - returns JSON error
6
6
  */
7
7
  function defaultResponseHandler(error, context) {
8
- return context.json({
9
- error: error.message,
10
- }, error.statusCode);
8
+ return context.json({ error: error.message, code: error.code }, error.statusCode);
11
9
  }
12
10
  /**
13
11
  * Track exception if configured and criteria are met.
@@ -46,6 +44,8 @@ function handleDomainException(err, context, logLevel, exceptionTracker, trackin
46
44
  const error = {
47
45
  message: err.message,
48
46
  statusCode: statusCode,
47
+ code: err.errorCode,
48
+ error: err,
49
49
  };
50
50
  // Log 5xx errors with stack trace (if log level allows)
51
51
  if (logLevel !== 'silent' && statusCode >= 500) {
@@ -64,6 +64,8 @@ function handleHTTPException(err, context, logLevel, exceptionTracker, trackingC
64
64
  const error = {
65
65
  message: err.message,
66
66
  statusCode: err.status,
67
+ code: getErrorCodeForStatus(err.status),
68
+ error: err,
67
69
  };
68
70
  // Log 5xx HTTP errors (if log level allows)
69
71
  if (logLevel !== 'silent' && err.status >= 500) {
@@ -84,7 +86,12 @@ function handleUnexpectedError(err, context, logLevel, exceptionTracker, trackin
84
86
  trackException(normalizedError, 500, context, exceptionTracker, trackingConfig, {
85
87
  unexpected: true,
86
88
  });
87
- return { message: 'Internal server error', statusCode: 500 };
89
+ return {
90
+ message: 'Internal server error',
91
+ statusCode: 500,
92
+ code: 'internal-server-error',
93
+ error: err,
94
+ };
88
95
  }
89
96
  /**
90
97
  * Create an error handler middleware for Hono
@@ -117,7 +124,12 @@ export function createErrorHandler(options = {}) {
117
124
  // Error handler itself threw - log and return generic error
118
125
  // Use error level logger for this critical error
119
126
  logger.error('Error in error handler:', handlerErr);
120
- error = { message: 'Internal server error', statusCode: 500 };
127
+ error = {
128
+ message: 'Internal server error',
129
+ statusCode: 500,
130
+ code: 'internal-server-error',
131
+ error: handlerErr,
132
+ };
121
133
  }
122
134
  return responseHandler(error, context);
123
135
  };
@@ -1 +1 @@
1
- {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/http/error-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/http/error-handler.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,10 @@ import { type InferOutput } from 'valibot';
19
19
  * ```
20
20
  */
21
21
  export declare const ErrorResponseDto: import("valibot").ObjectSchema<{
22
+ /** Human-readable message; may change between releases. */
22
23
  readonly error: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 1000, undefined>]>;
24
+ /** Stable machine-readable code for clients to translate, such as `not-found`. */
25
+ readonly code: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 100, undefined>]>;
23
26
  }, undefined>;
24
27
  export type ErrorResponse = InferOutput<typeof ErrorResponseDto>;
25
28
  /**
@@ -53,6 +56,7 @@ export type ValidationIssue = InferOutput<typeof ValidationIssueDto>;
53
56
  * ```json
54
57
  * {
55
58
  * "error": "Validation failed",
59
+ * "code": "validation-failed",
56
60
  * "issues": [
57
61
  * {
58
62
  * "message": "Invalid email",
@@ -64,6 +68,8 @@ export type ValidationIssue = InferOutput<typeof ValidationIssueDto>;
64
68
  */
65
69
  export declare const ValidationErrorResponseDto: import("valibot").ObjectSchema<{
66
70
  readonly error: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 1000, undefined>]>;
71
+ /** Always `validation-failed`. */
72
+ readonly code: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 100, undefined>]>;
67
73
  readonly issues: import("valibot").SchemaWithPipe<readonly [import("valibot").ArraySchema<import("valibot").ObjectSchema<{
68
74
  readonly message: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 500, undefined>]>;
69
75
  readonly path: import("valibot").SchemaWithPipe<readonly [import("valibot").ArraySchema<import("valibot").UnionSchema<[import("valibot").StringSchema<undefined>, import("valibot").NumberSchema<undefined>], undefined>, undefined>, import("valibot").MaxLengthAction<(string | number)[], 20, undefined>]>;
@@ -1 +1 @@
1
- {"version":3,"file":"error-response.dto.d.ts","sourceRoot":"","sources":["../../src/http/error-response.dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,WAAW,EAAkD,MAAM,SAAS,CAAC;AAElG;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,gBAAgB;;aAE3B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEjE;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;aAG7B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;aAGrC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,WAAW,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
1
+ {"version":3,"file":"error-response.dto.d.ts","sourceRoot":"","sources":["../../src/http/error-response.dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,WAAW,EAAkD,MAAM,SAAS,CAAC;AAElG;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,gBAAgB;IAC3B,2DAA2D;;IAE3D,kFAAkF;;aAElF,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEjE;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;aAG7B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,0BAA0B;;IAErC,kCAAkC;;;;;;;;;aAGlC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,WAAW,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
@@ -19,7 +19,10 @@ import { array, maxLength, number, object, pipe, string, union } from 'valibot';
19
19
  * ```
20
20
  */
21
21
  export const ErrorResponseDto = object({
22
+ /** Human-readable message; may change between releases. */
22
23
  error: pipe(string(), maxLength(1000)),
24
+ /** Stable machine-readable code for clients to translate, such as `not-found`. */
25
+ code: pipe(string(), maxLength(100)),
23
26
  });
24
27
  /**
25
28
  * Validation issue - simplified version of Valibot's internal structure
@@ -51,6 +54,7 @@ export const ValidationIssueDto = object({
51
54
  * ```json
52
55
  * {
53
56
  * "error": "Validation failed",
57
+ * "code": "validation-failed",
54
58
  * "issues": [
55
59
  * {
56
60
  * "message": "Invalid email",
@@ -62,6 +66,8 @@ export const ValidationIssueDto = object({
62
66
  */
63
67
  export const ValidationErrorResponseDto = object({
64
68
  error: pipe(string(), maxLength(1000)),
69
+ /** Always `validation-failed`. */
70
+ code: pipe(string(), maxLength(100)),
65
71
  issues: pipe(array(ValidationIssueDto), maxLength(100)),
66
72
  });
67
73
  //# sourceMappingURL=error-response.dto.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-response.dto.js","sourceRoot":"","sources":["../../src/http/error-response.dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAoB,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAElG;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;IACrC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;CACvC,CAAC,CAAC;AAIH;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;CAC9D,CAAC,CAAC;AAIH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;IAC/C,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CACxD,CAAC,CAAC"}
1
+ {"version":3,"file":"error-response.dto.js","sourceRoot":"","sources":["../../src/http/error-response.dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAoB,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAElG;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;IACrC,2DAA2D;IAC3D,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,kFAAkF;IAClF,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CACrC,CAAC,CAAC;AAIH;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;CAC9D,CAAC,CAAC;AAIH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;IAC/C,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,kCAAkC;IAClC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CACxD,CAAC,CAAC"}
@@ -8,6 +8,12 @@ export interface DomainExceptionOptions {
8
8
  * Set to true to force tracking, false to never track
9
9
  */
10
10
  track?: boolean;
11
+ /**
12
+ * Stable, machine-readable code for clients, returned as `code` in the error response.
13
+ * Defaults to the exception's category in kebab case, such as `not-found`. Clients
14
+ * translate codes; messages may change.
15
+ */
16
+ errorCode?: string;
11
17
  }
12
18
  /**
13
19
  * Base domain exception class for business logic errors.
@@ -33,8 +39,12 @@ export declare class DomainException extends Error {
33
39
  * If set, overrides default tracking rules based on status codes.
34
40
  */
35
41
  readonly track?: boolean;
42
+ /** Stable code for clients; see {@link DomainExceptionOptions.errorCode}. */
43
+ readonly errorCode: string;
36
44
  constructor(message: string, code: string, options?: DomainExceptionOptions);
37
45
  }
46
+ /** Turns an exception category such as `NOT_FOUND` into the default client code `not-found`. */
47
+ export declare function toErrorCode(category: string): string;
38
48
  /**
39
49
  * Standard HTTP exception classes
40
50
  */
@@ -102,4 +112,6 @@ export declare class GatewayTimeoutException extends DomainException {
102
112
  * Map error codes to HTTP status codes
103
113
  */
104
114
  export declare function getStatusCodeFromErrorCode(code: string): number;
115
+ /** Default client code for an HTTP status, such as `not-found` for 404. */
116
+ export declare function getErrorCodeForStatus(status: number): string;
105
117
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAStB,IAAI,EAAE,MAAM;IAR9B;;;OAGG;IACH,SAAgB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhC,YACE,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE,sBAAsB,EAKjC;CACF;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,YAAY,OAAO,SAAqB,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAEzE;CACF;AAED,qBAAa,qBAAsB,SAAQ,eAAe;IACxD,YAAY,OAAO,SAAiB,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAErE;CACF;AAED,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,YAAY,OAAO,SAAc,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAElE;CACF;AAED,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,YAAY,OAAO,SAAa,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAEjE;CACF;AAED,qBAAa,kBAAmB,SAAQ,eAAe;IACrD,YAAY,OAAO,SAAc,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAElE;CACF;AAED,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,YAAY,OAAO,SAAgB,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAEpE;CACF;AAED,qBAAa,wBAAyB,SAAQ,eAAe;IAC3D,YAAY,OAAO,SAAsB,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAE1E;CACF;AAED,qBAAa,yBAA0B,SAAQ,eAAe;IAC5D,YAAY,OAAO,SAAuB,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAE3E;CACF;AAED,qBAAa,uBAAwB,SAAQ,eAAe;IAC1D,YAAY,OAAO,SAAoB,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAExE;CACF;AAED,qBAAa,aAAc,SAAQ,eAAe;IAChD,YAAY,OAAO,SAAS,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAE7D;CACF;AAED,qBAAa,wBAAyB,SAAQ,eAAe;IAC3D,YAAY,OAAO,SAAsB,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAE1E;CACF;AAED,qBAAa,6BAA8B,SAAQ,eAAe;IAChE,YAAY,OAAO,SAA2B,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAE/E;CACF;AAED,qBAAa,4BAA6B,SAAQ,eAAe;IAC/D,YAAY,OAAO,SAAyB,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAE7E;CACF;AAED,qBAAa,eAAgB,SAAQ,eAAe;IAClD,YAAY,OAAO,SAAW,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAE/D;CACF;AAED,qBAAa,2BAA4B,SAAQ,eAAe;IAC9D,YAAY,OAAO,SAAwB,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAE5E;CACF;AAED,qBAAa,4BAA6B,SAAQ,eAAe;IAC/D,YAAY,OAAO,SAA0B,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAE9E;CACF;AAED,qBAAa,uBAAwB,SAAQ,eAAe;IAC1D,YAAY,OAAO,SAAoB,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAExE;CACF;AAED,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,YAAY,OAAO,SAAgB,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAEpE;CACF;AAED,qBAAa,2BAA4B,SAAQ,eAAe;IAC9D,YAAY,OAAO,SAAwB,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAE5E;CACF;AAED,qBAAa,uBAAwB,SAAQ,eAAe;IAC1D,YAAY,OAAO,SAAoB,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAExE;CACF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyB/D"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"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"}
@@ -22,13 +22,20 @@ export class DomainException extends Error {
22
22
  * If set, overrides default tracking rules based on status codes.
23
23
  */
24
24
  track;
25
+ /** Stable code for clients; see {@link DomainExceptionOptions.errorCode}. */
26
+ errorCode;
25
27
  constructor(message, code, options) {
26
28
  super(message);
27
29
  this.code = code;
28
30
  this.name = this.constructor.name;
29
31
  this.track = options?.track;
32
+ this.errorCode = options?.errorCode ?? toErrorCode(code);
30
33
  }
31
34
  }
35
+ /** Turns an exception category such as `NOT_FOUND` into the default client code `not-found`. */
36
+ export function toErrorCode(category) {
37
+ return category.toLowerCase().replaceAll('_', '-');
38
+ }
32
39
  /**
33
40
  * Standard HTTP exception classes
34
41
  */
@@ -132,32 +139,37 @@ export class GatewayTimeoutException extends DomainException {
132
139
  super(message, 'GATEWAY_TIMEOUT', options);
133
140
  }
134
141
  }
142
+ const STATUS_BY_CATEGORY = {
143
+ BAD_REQUEST: 400,
144
+ UNAUTHORIZED: 401,
145
+ FORBIDDEN: 403,
146
+ NOT_FOUND: 404,
147
+ METHOD_NOT_ALLOWED: 405,
148
+ REQUEST_TIMEOUT: 408,
149
+ CONFLICT: 409,
150
+ GONE: 410,
151
+ PRECONDITION_FAILED: 412,
152
+ PAYLOAD_TOO_LARGE: 413,
153
+ UNSUPPORTED_MEDIA_TYPE: 415,
154
+ VALIDATION_ERROR: 422,
155
+ UNPROCESSABLE_ENTITY: 422,
156
+ LOCKED: 423,
157
+ TOO_MANY_REQUESTS: 429,
158
+ INTERNAL_SERVER_ERROR: 500,
159
+ NOT_IMPLEMENTED: 501,
160
+ BAD_GATEWAY: 502,
161
+ SERVICE_UNAVAILABLE: 503,
162
+ GATEWAY_TIMEOUT: 504,
163
+ };
135
164
  /**
136
165
  * Map error codes to HTTP status codes
137
166
  */
138
167
  export function getStatusCodeFromErrorCode(code) {
139
- const codeMap = {
140
- BAD_REQUEST: 400,
141
- UNAUTHORIZED: 401,
142
- FORBIDDEN: 403,
143
- NOT_FOUND: 404,
144
- METHOD_NOT_ALLOWED: 405,
145
- REQUEST_TIMEOUT: 408,
146
- CONFLICT: 409,
147
- GONE: 410,
148
- PRECONDITION_FAILED: 412,
149
- PAYLOAD_TOO_LARGE: 413,
150
- UNSUPPORTED_MEDIA_TYPE: 415,
151
- VALIDATION_ERROR: 422,
152
- UNPROCESSABLE_ENTITY: 422,
153
- LOCKED: 423,
154
- TOO_MANY_REQUESTS: 429,
155
- INTERNAL_SERVER_ERROR: 500,
156
- NOT_IMPLEMENTED: 501,
157
- BAD_GATEWAY: 502,
158
- SERVICE_UNAVAILABLE: 503,
159
- GATEWAY_TIMEOUT: 504,
160
- };
161
- return codeMap[code] || 500;
168
+ return STATUS_BY_CATEGORY[code] || 500;
169
+ }
170
+ /** Default client code for an HTTP status, such as `not-found` for 404. */
171
+ export function getErrorCodeForStatus(status) {
172
+ const category = Object.entries(STATUS_BY_CATEGORY).find(([name, value]) => value === status && name !== 'VALIDATION_ERROR')?.[0];
173
+ return category ? toErrorCode(category) : `http-${status}`;
162
174
  }
163
175
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ export { Hono } from 'hono';
8
8
  export type { OpenAPIV3 } from 'openapi-types';
9
9
  export { createRateLimitMiddleware } from '../middleware/rate-limit.js';
10
10
  export { defaultOpenAPIComponents } from '../openapi/defaults.js';
11
- export { assertOpenAPIMatches, OpenAPIDriftError } from '../openapi/drift.js';
11
+ export { assertOpenAPIMatches, diffOpenAPI, type OpenAPIDifference, OpenAPIDriftError, writeOpenAPIDocument, } from '../openapi/drift.js';
12
12
  export { configureOpenAPI } from '../openapi/openapi.js';
13
13
  export { applyProcessors, createBuiltinProcessors, createCorsHeadersProcessor, createRateLimitHeadersProcessor, paginationHeadersProcessor, responseHeadersProcessor, } from '../openapi/openapi-processors.js';
14
14
  export { createErrorHandler, defaultErrorHandler } from './error-handler.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,oBAAoB,CAAC;AAE5B,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EACL,KAAK,aAAa,EAClB,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,0BAA0B,EAC1B,KAAK,eAAe,EACpB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,KAAK,sBAAsB,EAC3B,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,4BAA4B,EAC5B,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,oBAAoB,CAAC;AAE5B,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,KAAK,iBAAiB,EACtB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EACL,KAAK,aAAa,EAClB,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,0BAA0B,EAC1B,KAAK,eAAe,EACpB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,KAAK,sBAAsB,EAC3B,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,4BAA4B,EAC5B,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC"}
@@ -6,7 +6,7 @@ import '../hono-context.js';
6
6
  export { Hono } from 'hono';
7
7
  export { createRateLimitMiddleware } from '../middleware/rate-limit.js';
8
8
  export { defaultOpenAPIComponents } from '../openapi/defaults.js';
9
- export { assertOpenAPIMatches, OpenAPIDriftError } from '../openapi/drift.js';
9
+ export { assertOpenAPIMatches, diffOpenAPI, OpenAPIDriftError, writeOpenAPIDocument, } from '../openapi/drift.js';
10
10
  export { configureOpenAPI } from '../openapi/openapi.js';
11
11
  export { applyProcessors, createBuiltinProcessors, createCorsHeadersProcessor, createRateLimitHeadersProcessor, paginationHeadersProcessor, responseHeadersProcessor, } from '../openapi/openapi-processors.js';
12
12
  export { createErrorHandler, defaultErrorHandler } from './error-handler.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,oBAAoB,CAAC;AAG5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAEL,gBAAgB,EAEhB,0BAA0B,EAE1B,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAEf,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,4BAA4B,EAC5B,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AASrB,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,oBAAoB,CAAC;AAG5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EACL,oBAAoB,EACpB,WAAW,EAEX,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAEL,gBAAgB,EAEhB,0BAA0B,EAE1B,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAEf,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,4BAA4B,EAC5B,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AASrB,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"route-authorization.d.ts","sourceRoot":"","sources":["../../src/http/route-authorization.ts"],"names":[],"mappings":"AAEA,wBAAgB,yBAAyB,CACvC,SAAS,EAAE;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG;QAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,EACD,YAAY,EAAE,OAAO,GACpB,IAAI,CAuBN"}
1
+ {"version":3,"file":"route-authorization.d.ts","sourceRoot":"","sources":["../../src/http/route-authorization.ts"],"names":[],"mappings":"AAEA,wBAAgB,yBAAyB,CACvC,SAAS,EAAE;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG;QAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,EACD,YAAY,EAAE,OAAO,GACpB,IAAI,CAwBN"}
@@ -6,14 +6,14 @@ export function enforceRouteAuthorization(authorize, routeContext) {
6
6
  const isAuthenticated = routeContext.isAuthenticated ?? Boolean(user);
7
7
  const allowGuest = authorize.allowGuest ?? false;
8
8
  if (!isAuthenticated && !allowGuest) {
9
- throw new UnauthorizedException('Authentication required');
9
+ throw new UnauthorizedException('Authentication required', { errorCode: 'auth-required' });
10
10
  }
11
11
  const canAccess = ability?.can?.(authorize.action, authorize.subject);
12
12
  if (!canAccess) {
13
13
  if (!isAuthenticated) {
14
- throw new UnauthorizedException('Authentication required');
14
+ throw new UnauthorizedException('Authentication required', { errorCode: 'auth-required' });
15
15
  }
16
- throw new ForbiddenException(`You don't have permission to ${authorize.action} ${authorize.subject}`);
16
+ throw new ForbiddenException(`You don't have permission to ${authorize.action} ${authorize.subject}`, { errorCode: 'forbidden' });
17
17
  }
18
18
  }
19
19
  //# sourceMappingURL=route-authorization.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-authorization.js","sourceRoot":"","sources":["../../src/http/route-authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,UAAU,yBAAyB,CACvC,SAIC,EACD,YAAqB;IAErB,MAAM,OAAO,GAAI,YAA2E;SACzF,OAAO,CAAC;IACX,MAAM,IAAI,GAAI,YAA0C,CAAC,IAAI,CAAC;IAC9D,MAAM,eAAe,GAClB,YAA8C,CAAC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,KAAK,CAAC;IAEjD,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,OAAgB,CAAC,CAAC;IAE/E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,IAAI,kBAAkB,CAC1B,gCAAgC,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,CACxE,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"route-authorization.js","sourceRoot":"","sources":["../../src/http/route-authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,UAAU,yBAAyB,CACvC,SAIC,EACD,YAAqB;IAErB,MAAM,OAAO,GAAI,YAA2E;SACzF,OAAO,CAAC;IACX,MAAM,IAAI,GAAI,YAA0C,CAAC,IAAI,CAAC;IAC9D,MAAM,eAAe,GAClB,YAA8C,CAAC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,KAAK,CAAC;IAEjD,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,qBAAqB,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,OAAgB,CAAC,CAAC;IAE/E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,qBAAqB,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,IAAI,kBAAkB,CAC1B,gCAAgC,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,EACvE,EAAE,SAAS,EAAE,WAAW,EAAE,CAC3B,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { Context, Hono } from 'hono';
2
+ import type { ConfiguredStrictTypes } from '../core/glasswork-config.js';
2
3
  import type { RouteFactory, RouteHandlers } from '../core/types.js';
3
4
  import type { BoundRouteFunction, RouteConfig, STATUS_DESCRIPTIONS, ValibotSchema } from './route-types.js';
4
5
  export type { OpenAPIContext } from './route-openapi-context.js';
@@ -11,5 +12,5 @@ export declare function createRoutes<TServices = Record<string, unknown>, TConte
11
12
  /**
12
13
  * Create a route handler with validation and OpenAPI metadata.
13
14
  */
14
- export declare function route<TBody extends ValibotSchema | undefined = undefined, TQuery extends ValibotSchema | undefined = undefined, TParams extends ValibotSchema | undefined = undefined, TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>> = Record<never, never>, TPublic extends boolean = false, TStrictTypes extends boolean = false, TContextVariables extends object = Context['var']>(router: Hono, config: RouteConfig<TBody, TQuery, TParams, TResponses, TPublic, TStrictTypes, TContextVariables>): RouteHandlers;
15
+ export declare function route<TBody extends ValibotSchema | undefined = undefined, TQuery extends ValibotSchema | undefined = undefined, TParams extends ValibotSchema | undefined = undefined, TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>> = Record<never, never>, TPublic extends boolean = false, TStrictTypes extends boolean = ConfiguredStrictTypes, TContextVariables extends object = Context['var']>(router: Hono, config: RouteConfig<TBody, TQuery, TParams, TResponses, TPublic, TStrictTypes, TContextVariables>): RouteHandlers;
15
16
  //# sourceMappingURL=route-helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-helpers.d.ts","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAqB,MAAM,MAAM,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMpE,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACX,mBAAmB,EACnB,aAAa,EACd,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAClF,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,wBAAgB,YAAY,CAC1B,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,iBAAiB,SAAS,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,EAEjD,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,KAAK,IAAI,GACjG,YAAY,CAKd;AAED;;GAEG;AACH,wBAAgB,KAAK,CACnB,KAAK,SAAS,aAAa,GAAG,SAAS,GAAG,SAAS,EACnD,MAAM,SAAS,aAAa,GAAG,SAAS,GAAG,SAAS,EACpD,OAAO,SAAS,aAAa,GAAG,SAAS,GAAG,SAAS,EACrD,UAAU,SAAS,OAAO,CACxB,MAAM,CAAC,MAAM,OAAO,mBAAmB,EAAE,aAAa,GAAG,SAAS,CAAC,CACpE,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EACxB,OAAO,SAAS,OAAO,GAAG,KAAK,EAC/B,YAAY,SAAS,OAAO,GAAG,KAAK,EACpC,iBAAiB,SAAS,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,EAEjD,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,CAAC,GAChG,aAAa,CA0Cf"}
1
+ {"version":3,"file":"route-helpers.d.ts","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAqB,MAAM,MAAM,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOpE,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACX,mBAAmB,EACnB,aAAa,EACd,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAClF,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,wBAAgB,YAAY,CAC1B,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,iBAAiB,SAAS,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,EAEjD,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,KAAK,IAAI,GACjG,YAAY,CAKd;AAED;;GAEG;AACH,wBAAgB,KAAK,CACnB,KAAK,SAAS,aAAa,GAAG,SAAS,GAAG,SAAS,EACnD,MAAM,SAAS,aAAa,GAAG,SAAS,GAAG,SAAS,EACpD,OAAO,SAAS,aAAa,GAAG,SAAS,GAAG,SAAS,EACrD,UAAU,SAAS,OAAO,CACxB,MAAM,CAAC,MAAM,OAAO,mBAAmB,EAAE,aAAa,GAAG,SAAS,CAAC,CACpE,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EACxB,OAAO,SAAS,OAAO,GAAG,KAAK,EAC/B,YAAY,SAAS,OAAO,GAAG,qBAAqB,EACpD,iBAAiB,SAAS,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,EAEjD,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,CAAC,GAChG,aAAa,CAmDf"}
@@ -1,3 +1,4 @@
1
+ import { detectEnvironment } from '../utils/environment.js';
1
2
  import { enforceRouteAuthorization } from './route-authorization.js';
2
3
  import { buildRouteContext } from './route-context.js';
3
4
  import { buildOpenAPIMiddleware } from './route-openapi.js';
@@ -41,9 +42,35 @@ export function route(router, config) {
41
42
  if (config.authorize) {
42
43
  enforceRouteAuthorization(config.authorize, routeContext);
43
44
  }
44
- const result = await config.handler(routeContext);
45
- return handleResponse(result, config.responses, config.serialization, config.strictTypes, config.summary, c, routeContext.logger);
45
+ const statusTracking = trackExplicitStatus(c);
46
+ let result;
47
+ try {
48
+ result = await config.handler(routeContext);
49
+ }
50
+ finally {
51
+ statusTracking.stop();
52
+ }
53
+ return handleResponse(result, config.responses, config.serialization, openAPIContext.serialization, config.strictTypes ?? openAPIContext.strictTypes, config.summary, c, openAPIContext.environment ?? detectEnvironment(), routeContext.logger, statusTracking.status);
46
54
  });
47
55
  return middlewares;
48
56
  }
57
+ /**
58
+ * Hono keeps the status private and reports 200 until a response exists, so an explicit
59
+ * `context.status(200)` is indistinguishable from the default. Record the status the
60
+ * handler sets, and restore Hono's method once the handler has finished.
61
+ */
62
+ function trackExplicitStatus(c) {
63
+ const setStatus = c.status;
64
+ const tracking = {
65
+ status: undefined,
66
+ stop: () => {
67
+ c.status = setStatus;
68
+ },
69
+ };
70
+ c.status = (code) => {
71
+ tracking.status = code;
72
+ setStatus(code);
73
+ };
74
+ return tracking;
75
+ }
49
76
  //# sourceMappingURL=route-helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAOrD,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGxF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAUlF;;GAEG;AACH,MAAM,UAAU,YAAY,CAI1B,OAAkG;IAElG,OAAO,CAAC,MAAY,EAAE,QAAiC,EAAE,EAAE;QACzD,MAAM,UAAU,GAA0C,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5F,OAAO,CAAC,MAAM,EAAE,QAAqB,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAWnB,MAAY,EACZ,MAAiG;IAEjG,MAAM,WAAW,GAAwB,EAAE,CAAC;IAC5C,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAExD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,WAAW,CAAC,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,WAAW,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,WAAW,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAU,EAAE,EAAE;QACpC,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;QAClE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,yBAAyB,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAElD,OAAO,cAAc,CACnB,MAAM,EACN,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,OAAO,EACd,CAAC,EACD,YAAY,CAAC,MAAM,CACpB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,WAA4B,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAOrD,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGxF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAUlF;;GAEG;AACH,MAAM,UAAU,YAAY,CAI1B,OAAkG;IAElG,OAAO,CAAC,MAAY,EAAE,QAAiC,EAAE,EAAE;QACzD,MAAM,UAAU,GAA0C,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5F,OAAO,CAAC,MAAM,EAAE,QAAqB,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAWnB,MAAY,EACZ,MAAiG;IAEjG,MAAM,WAAW,GAAwB,EAAE,CAAC;IAC5C,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAExD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,WAAW,CAAC,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,WAAW,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,WAAW,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAU,EAAE,EAAE;QACpC,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;QAClE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,yBAAyB,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,cAAc,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,MAAkD,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC;gBAAS,CAAC;YACT,cAAc,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QAED,OAAO,cAAc,CACnB,MAAM,EACN,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,aAAa,EACpB,cAAc,CAAC,aAAa,EAC5B,MAAM,CAAC,WAAW,IAAI,cAAc,CAAC,WAAW,EAChD,MAAM,CAAC,OAAO,EACd,CAAC,EACD,cAAc,CAAC,WAAW,IAAI,iBAAiB,EAAE,EACjD,YAAY,CAAC,MAAM,EACnB,cAAc,CAAC,MAAM,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,WAA4B,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,CAAU;IACrC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,MAAM,QAAQ,GAAG;QACf,MAAM,EAAE,SAA+B;QACvC,IAAI,EAAE,GAAG,EAAE;YACT,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;QACvB,CAAC;KACF,CAAC;IACF,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE;QAClB,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import type { Hono } from 'hono';
2
- import type { OpenAPIResponseProcessor } from '../core/types.js';
2
+ import type { DecimalSerialization } from '../core/glasswork-config.js';
3
+ import type { Environment, OpenAPIResponseProcessor } from '../core/types.js';
3
4
  import type { PinoLogger } from '../observability/pino-logger.js';
5
+ import type { SerializationConfig } from '../utils/serialize-prisma-types.js';
4
6
  /**
5
7
  * OpenAPI context stored in Hono app context.
6
8
  * Set during bootstrap and used when defining routes.
@@ -15,6 +17,18 @@ export interface OpenAPIContext {
15
17
  pino?: PinoLogger;
16
18
  logger?: import('../utils/logger.js').Logger;
17
19
  sanitizers?: import('../observability/sanitizers.js').ObservabilitySanitizers;
20
+ /**
21
+ * Environment resolved by `bootstrap()`. Production rejects responses that match no
22
+ * declared schema. Routes outside bootstrap fall back to `detectEnvironment()`.
23
+ */
24
+ environment?: Environment;
25
+ /**
26
+ * Application-wide serialization built from the `serialization` bootstrap option. A route's
27
+ * own transformers run before its transformers. Routes outside bootstrap use the defaults.
28
+ */
29
+ serialization?: SerializationConfig<DecimalSerialization>;
30
+ /** `serialization.strictTypes` from bootstrap; a route's own `strictTypes` takes precedence. */
31
+ strictTypes?: boolean;
18
32
  }
19
33
  /**
20
34
  * Set the OpenAPI context for a Hono app instance.
@@ -1 +1 @@
1
- {"version":3,"file":"route-openapi-context.d.ts","sourceRoot":"","sources":["../../src/http/route-openapi-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,wBAAwB,EAAE,CAAC;IACvC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,oBAAoB,EAAE,MAAM,CAAC;IAC7C,UAAU,CAAC,EAAE,OAAO,gCAAgC,EAAE,uBAAuB,CAAC;CAC/E;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAE1E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,GAAG,cAAc,CAE3D"}
1
+ {"version":3,"file":"route-openapi-context.d.ts","sourceRoot":"","sources":["../../src/http/route-openapi-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,wBAAwB,EAAE,CAAC;IACvC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,oBAAoB,EAAE,MAAM,CAAC;IAC7C,UAAU,CAAC,EAAE,OAAO,gCAAgC,EAAE,uBAAuB,CAAC;IAC9E;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;OAGG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;IAC1D,gGAAgG;IAChG,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAE1E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,GAAG,cAAc,CAE3D"}
@@ -1 +1 @@
1
- {"version":3,"file":"route-openapi-context.js","sourceRoot":"","sources":["../../src/http/route-openapi-context.ts"],"names":[],"mappings":"AAoBA,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAwB,CAAC;AAE9D;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAS,EAAE,OAAuB;IAClE,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAS;IACzC,OAAO,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAChG,CAAC"}
1
+ {"version":3,"file":"route-openapi-context.js","sourceRoot":"","sources":["../../src/http/route-openapi-context.ts"],"names":[],"mappings":"AAkCA,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAwB,CAAC;AAE9D;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAS,EAAE,OAAuB;IAClE,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAS;IACzC,OAAO,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAChG,CAAC"}