glasswork 0.13.3 → 1.0.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 (218) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +6 -2
  3. package/dist/auth/abilities.d.ts +9 -6
  4. package/dist/auth/abilities.d.ts.map +1 -1
  5. package/dist/auth/abilities.js +15 -19
  6. package/dist/auth/abilities.js.map +1 -1
  7. package/dist/auth/assert.d.ts +3 -3
  8. package/dist/auth/assert.d.ts.map +1 -1
  9. package/dist/auth/casl-bridge.d.ts +19 -0
  10. package/dist/auth/casl-bridge.d.ts.map +1 -0
  11. package/dist/auth/casl-bridge.js +29 -0
  12. package/dist/auth/casl-bridge.js.map +1 -0
  13. package/dist/auth/index.d.ts +1 -0
  14. package/dist/auth/index.d.ts.map +1 -1
  15. package/dist/auth/index.js +1 -0
  16. package/dist/auth/index.js.map +1 -1
  17. package/dist/auth/middleware.d.ts +3 -3
  18. package/dist/auth/middleware.d.ts.map +1 -1
  19. package/dist/auth/middleware.js +2 -2
  20. package/dist/auth/middleware.js.map +1 -1
  21. package/dist/auth/types.d.ts +2 -2
  22. package/dist/auth/types.d.ts.map +1 -1
  23. package/dist/config/index.d.ts +1 -1
  24. package/dist/config/index.js +1 -1
  25. package/dist/core/bootstrap.d.ts +0 -17
  26. package/dist/core/bootstrap.d.ts.map +1 -1
  27. package/dist/core/bootstrap.js +4 -240
  28. package/dist/core/bootstrap.js.map +1 -1
  29. package/dist/core/index.d.ts +19 -0
  30. package/dist/core/index.d.ts.map +1 -0
  31. package/dist/core/index.js +15 -0
  32. package/dist/core/index.js.map +1 -0
  33. package/dist/core/lifecycle.d.ts +7 -0
  34. package/dist/core/lifecycle.d.ts.map +1 -0
  35. package/dist/core/lifecycle.js +28 -0
  36. package/dist/core/lifecycle.js.map +1 -0
  37. package/dist/core/module-graph.d.ts +21 -0
  38. package/dist/core/module-graph.d.ts.map +1 -0
  39. package/dist/core/module-graph.js +169 -0
  40. package/dist/core/module-graph.js.map +1 -0
  41. package/dist/core/route-factory.d.ts +20 -0
  42. package/dist/core/route-factory.d.ts.map +1 -0
  43. package/dist/core/route-factory.js +2 -0
  44. package/dist/core/route-factory.js.map +1 -0
  45. package/dist/core/types.d.ts +4 -14
  46. package/dist/core/types.d.ts.map +1 -1
  47. package/dist/email/compiler/compile-templates.d.ts +3 -8
  48. package/dist/email/compiler/compile-templates.d.ts.map +1 -1
  49. package/dist/email/compiler/compile-templates.js +3 -3
  50. package/dist/email/compiler/compile-templates.js.map +1 -1
  51. package/dist/email/compiler/compiler.d.ts +5 -2
  52. package/dist/email/compiler/compiler.d.ts.map +1 -1
  53. package/dist/email/compiler/compiler.js +2 -21
  54. package/dist/email/compiler/compiler.js.map +1 -1
  55. package/dist/email/transports/ses-transport.d.ts.map +1 -1
  56. package/dist/email/transports/ses-transport.js +11 -18
  57. package/dist/email/transports/ses-transport.js.map +1 -1
  58. package/dist/email/webhooks/handler-factory.d.ts +1 -1
  59. package/dist/email/webhooks/handler-factory.js +1 -1
  60. package/dist/email/webhooks/notification-parser.d.ts +1 -1
  61. package/dist/email/webhooks/notification-parser.js +1 -1
  62. package/dist/email/webhooks/signature-verification.d.ts +1 -1
  63. package/dist/email/webhooks/signature-verification.js +1 -1
  64. package/dist/email/webhooks/subscription-handler.d.ts +1 -1
  65. package/dist/email/webhooks/subscription-handler.js +1 -1
  66. package/dist/hono-context.d.ts +13 -0
  67. package/dist/hono-context.d.ts.map +1 -0
  68. package/dist/hono-context.js +2 -0
  69. package/dist/hono-context.js.map +1 -0
  70. package/dist/http/index.d.ts +18 -0
  71. package/dist/http/index.d.ts.map +1 -0
  72. package/dist/http/index.js +15 -0
  73. package/dist/http/index.js.map +1 -0
  74. package/dist/http/route-authorization.d.ts +9 -0
  75. package/dist/http/route-authorization.d.ts.map +1 -0
  76. package/dist/http/route-authorization.js +19 -0
  77. package/dist/http/route-authorization.js.map +1 -0
  78. package/dist/http/route-context.d.ts +8 -0
  79. package/dist/http/route-context.d.ts.map +1 -0
  80. package/dist/http/route-context.js +26 -0
  81. package/dist/http/route-context.js.map +1 -0
  82. package/dist/http/route-helpers.d.ts +6 -419
  83. package/dist/http/route-helpers.d.ts.map +1 -1
  84. package/dist/http/route-helpers.js +7 -462
  85. package/dist/http/route-helpers.js.map +1 -1
  86. package/dist/http/route-openapi-context.d.ts +27 -0
  87. package/dist/http/route-openapi-context.d.ts.map +1 -0
  88. package/dist/http/route-openapi-context.js +16 -0
  89. package/dist/http/route-openapi-context.js.map +1 -0
  90. package/dist/http/route-openapi.d.ts +5 -0
  91. package/dist/http/route-openapi.d.ts.map +1 -0
  92. package/dist/http/route-openapi.js +112 -0
  93. package/dist/http/route-openapi.js.map +1 -0
  94. package/dist/http/route-response.d.ts +5 -0
  95. package/dist/http/route-response.d.ts.map +1 -0
  96. package/dist/http/route-response.js +78 -0
  97. package/dist/http/route-response.js.map +1 -0
  98. package/dist/http/route-types.d.ts +93 -0
  99. package/dist/http/route-types.d.ts.map +1 -0
  100. package/dist/http/route-types.js +22 -0
  101. package/dist/http/route-types.js.map +1 -0
  102. package/dist/http/route-validation.d.ts +11 -0
  103. package/dist/http/route-validation.d.ts.map +1 -0
  104. package/dist/http/route-validation.js +24 -0
  105. package/dist/http/route-validation.js.map +1 -0
  106. package/dist/index.d.ts +7 -45
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +5 -65
  109. package/dist/index.js.map +1 -1
  110. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts.map +1 -1
  111. package/dist/jobs/drivers/eventbridge-scheduler-driver.js +1 -3
  112. package/dist/jobs/drivers/eventbridge-scheduler-driver.js.map +1 -1
  113. package/dist/jobs/drivers/sqs-driver.d.ts +1 -1
  114. package/dist/jobs/drivers/sqs-driver.d.ts.map +1 -1
  115. package/dist/jobs/drivers/sqs-driver.js +1 -3
  116. package/dist/jobs/drivers/sqs-driver.js.map +1 -1
  117. package/dist/jobs/worker.d.ts.map +1 -1
  118. package/dist/jobs/worker.js +3 -14
  119. package/dist/jobs/worker.js.map +1 -1
  120. package/dist/list-query/builder.d.ts +26 -5
  121. package/dist/list-query/builder.d.ts.map +1 -1
  122. package/dist/list-query/builder.js +13 -9
  123. package/dist/list-query/builder.js.map +1 -1
  124. package/dist/list-query/casl.d.ts +20 -4
  125. package/dist/list-query/casl.d.ts.map +1 -1
  126. package/dist/list-query/casl.js +3 -12
  127. package/dist/list-query/casl.js.map +1 -1
  128. package/dist/list-query/index.d.ts +6 -1
  129. package/dist/list-query/index.d.ts.map +1 -1
  130. package/dist/list-query/index.js +4 -1
  131. package/dist/list-query/index.js.map +1 -1
  132. package/dist/list-query/list-params.d.ts +17 -0
  133. package/dist/list-query/list-params.d.ts.map +1 -0
  134. package/dist/list-query/list-params.js +2 -0
  135. package/dist/list-query/list-params.js.map +1 -0
  136. package/dist/list-query/prisma-executor.d.ts +63 -0
  137. package/dist/list-query/prisma-executor.d.ts.map +1 -0
  138. package/dist/list-query/prisma-executor.js +88 -0
  139. package/dist/list-query/prisma-executor.js.map +1 -0
  140. package/dist/list-query/schema-helpers.d.ts +20 -3
  141. package/dist/list-query/schema-helpers.d.ts.map +1 -1
  142. package/dist/list-query/schema-helpers.js +57 -4
  143. package/dist/list-query/schema-helpers.js.map +1 -1
  144. package/dist/list-query/sort-field-types.d.ts +21 -0
  145. package/dist/list-query/sort-field-types.d.ts.map +1 -0
  146. package/dist/list-query/sort-field-types.js +2 -0
  147. package/dist/list-query/sort-field-types.js.map +1 -0
  148. package/dist/list-query/unrestricted-schemas.d.ts +13 -0
  149. package/dist/list-query/unrestricted-schemas.d.ts.map +1 -0
  150. package/dist/list-query/unrestricted-schemas.js +9 -0
  151. package/dist/list-query/unrestricted-schemas.js.map +1 -0
  152. package/dist/list-query/validator.d.ts +2 -2
  153. package/dist/list-query/validator.d.ts.map +1 -1
  154. package/dist/observability/exception-tracking.d.ts +5 -4
  155. package/dist/observability/exception-tracking.d.ts.map +1 -1
  156. package/dist/observability/exception-tracking.js +4 -3
  157. package/dist/observability/exception-tracking.js.map +1 -1
  158. package/dist/observability/index.d.ts +8 -0
  159. package/dist/observability/index.d.ts.map +1 -0
  160. package/dist/observability/index.js +8 -0
  161. package/dist/observability/index.js.map +1 -0
  162. package/dist/observability/pino-logger.d.ts +3 -3
  163. package/dist/observability/pino-logger.js +3 -3
  164. package/dist/observability/request-context.d.ts +4 -4
  165. package/dist/observability/request-context.js +4 -4
  166. package/package.json +93 -53
  167. package/dist/authorization/ability-middleware.d.ts +0 -61
  168. package/dist/authorization/ability-middleware.d.ts.map +0 -1
  169. package/dist/authorization/ability-middleware.js +0 -74
  170. package/dist/authorization/ability-middleware.js.map +0 -1
  171. package/dist/authorization/index.d.ts +0 -46
  172. package/dist/authorization/index.d.ts.map +0 -1
  173. package/dist/authorization/index.js +0 -46
  174. package/dist/authorization/index.js.map +0 -1
  175. package/dist/authorization/route-helpers.d.ts +0 -106
  176. package/dist/authorization/route-helpers.d.ts.map +0 -1
  177. package/dist/authorization/route-helpers.js +0 -136
  178. package/dist/authorization/route-helpers.js.map +0 -1
  179. package/dist/authorization/service-proxy.d.ts +0 -59
  180. package/dist/authorization/service-proxy.d.ts.map +0 -1
  181. package/dist/authorization/service-proxy.js +0 -110
  182. package/dist/authorization/service-proxy.js.map +0 -1
  183. package/dist/authorization/types.d.ts +0 -58
  184. package/dist/authorization/types.d.ts.map +0 -1
  185. package/dist/authorization/types.js +0 -7
  186. package/dist/authorization/types.js.map +0 -1
  187. package/dist/hooks/authorization-hook.d.ts +0 -100
  188. package/dist/hooks/authorization-hook.d.ts.map +0 -1
  189. package/dist/hooks/authorization-hook.js +0 -93
  190. package/dist/hooks/authorization-hook.js.map +0 -1
  191. package/dist/hooks/index.d.ts +0 -54
  192. package/dist/hooks/index.d.ts.map +0 -1
  193. package/dist/hooks/index.js +0 -55
  194. package/dist/hooks/index.js.map +0 -1
  195. package/dist/hooks/service-hooks.d.ts +0 -82
  196. package/dist/hooks/service-hooks.d.ts.map +0 -1
  197. package/dist/hooks/service-hooks.js +0 -158
  198. package/dist/hooks/service-hooks.js.map +0 -1
  199. package/dist/hooks/types.d.ts +0 -151
  200. package/dist/hooks/types.d.ts.map +0 -1
  201. package/dist/hooks/types.js +0 -2
  202. package/dist/hooks/types.js.map +0 -1
  203. package/dist/openapi/hooks.d.ts +0 -14
  204. package/dist/openapi/hooks.d.ts.map +0 -1
  205. package/dist/openapi/hooks.js +0 -83
  206. package/dist/openapi/hooks.js.map +0 -1
  207. package/dist/openapi/openapi-transformer.d.ts +0 -13
  208. package/dist/openapi/openapi-transformer.d.ts.map +0 -1
  209. package/dist/openapi/openapi-transformer.js +0 -87
  210. package/dist/openapi/openapi-transformer.js.map +0 -1
  211. package/dist/utils/pagination.d.ts +0 -48
  212. package/dist/utils/pagination.d.ts.map +0 -1
  213. package/dist/utils/pagination.js +0 -42
  214. package/dist/utils/pagination.js.map +0 -1
  215. package/dist/utils/serialize-dates.d.ts +0 -27
  216. package/dist/utils/serialize-dates.d.ts.map +0 -1
  217. package/dist/utils/serialize-dates.js +0 -39
  218. package/dist/utils/serialize-dates.js.map +0 -1
@@ -1,200 +1,32 @@
1
- import { describeRoute as honoDescribeRoute, resolver, validator, } from 'hono-openapi';
2
- import { safeParseAsync } from 'valibot';
3
- import { createContextAwarePinoLogger } from '../observability/pino-logger.js';
4
- import { applyProcessors } from '../openapi/openapi-processors.js';
5
- import { getClientIp } from '../utils/get-client-ip.js';
6
- import { createLogger } from '../utils/logger.js';
7
- import { defaultConfig as defaultSerializationConfig, serializePrismaTypes, } from '../utils/serialize-prisma-types.js';
8
- import { ForbiddenException, UnauthorizedException } from './errors.js';
9
- /**
10
- * Logger instance for route helpers
11
- */
12
- const logger = createLogger('Routes');
13
- /**
14
- * Storage for OpenAPI context per Hono app instance.
15
- * Uses WeakMap to avoid memory leaks and support multiple app instances.
16
- */
17
- const openAPIContextMap = new WeakMap();
18
- /**
19
- * Set the OpenAPI context for a Hono app instance.
20
- * This is called during bootstrap and makes processors/schemes available to route definitions.
21
- *
22
- * @internal
23
- */
24
- export function setOpenAPIContext(app, context) {
25
- openAPIContextMap.set(app, context);
26
- }
27
- /**
28
- * Get the OpenAPI context for a Hono app instance.
29
- *
30
- * @internal
31
- */
32
- export function getOpenAPIContext(app) {
33
- return openAPIContextMap.get(app) ?? { processors: [], securitySchemes: [], pino: undefined };
34
- }
35
- /**
36
- * HTTP status codes with descriptions
37
- */
38
- const STATUS_DESCRIPTIONS = {
39
- 200: 'Success',
40
- 201: 'Created',
41
- 202: 'Accepted',
42
- 204: 'No Content',
43
- 301: 'Moved Permanently',
44
- 302: 'Found',
45
- 307: 'Temporary Redirect',
46
- 308: 'Permanent Redirect',
47
- 400: 'Bad Request',
48
- 401: 'Unauthorized',
49
- 403: 'Forbidden',
50
- 404: 'Not Found',
51
- 409: 'Conflict',
52
- 422: 'Unprocessable Entity',
53
- 429: 'Too Many Requests',
54
- 500: 'Internal Server Error',
55
- };
1
+ import { enforceRouteAuthorization } from './route-authorization.js';
2
+ import { buildRouteContext } from './route-context.js';
3
+ import { buildOpenAPIMiddleware } from './route-openapi.js';
4
+ import { getOpenAPIContext } from './route-openapi-context.js';
5
+ import { handleResponse } from './route-response.js';
6
+ import { createValidationMiddleware, hasPaginationFields } from './route-validation.js';
7
+ export { getOpenAPIContext, setOpenAPIContext } from './route-openapi-context.js';
56
8
  /**
57
9
  * Create routes with typed service injection and pre-bound route function.
58
- *
59
- * The `route` function passed to your factory is pre-bound to the router's
60
- * OpenAPI context, so you don't need to pass the router to every route call.
61
- *
62
- * @template TServices - The shape of services required by these routes
63
- *
64
- * @example
65
- * ```typescript
66
- * interface AuthRoutesServices {
67
- * authService: AuthService;
68
- * userService: UserService;
69
- * }
70
- *
71
- * export const authRoutes = createRoutes<AuthRoutesServices>((router, services, route) => {
72
- * // services.authService is typed as AuthService!
73
- * // route is pre-bound to this router's OpenAPI context
74
- * router.post('/login', ...route({
75
- * body: LoginDto,
76
- * responses: { 200: SessionDto },
77
- * handler: async ({ body }) => {
78
- * return services.authService.login(body);
79
- * }
80
- * }));
81
- * });
82
- * ```
83
10
  */
84
11
  export function createRoutes(factory) {
85
12
  return (router, services) => {
86
- // Create a bound route function for this router
87
13
  const boundRoute = (config) => route(router, config);
88
14
  factory(router, services, boundRoute);
89
15
  };
90
16
  }
91
- /**
92
- * Detect if a query schema includes pagination fields (page, pageSize).
93
- * Used to auto-detect pagination for OpenAPI documentation.
94
- */
95
- function hasPaginationFields(schema) {
96
- if (!schema)
97
- return false;
98
- // Check if schema has page or pageSize entries
99
- // This works for Valibot object schemas
100
- const schemaAny = schema;
101
- if (schemaAny.entries) {
102
- return 'page' in schemaAny.entries || 'pageSize' in schemaAny.entries;
103
- }
104
- return false;
105
- }
106
- /**
107
- * Create a validation middleware for request validation.
108
- * Returns 422 Unprocessable Entity on validation failure (instead of Hono's default 400).
109
- *
110
- * @param type - The validation target ('json' or 'form' for body, 'query', or 'param')
111
- * @param schema - The Valibot schema to validate against
112
- */
113
- function createValidationMiddleware(type, schema) {
114
- return validator(type, schema, (result, c) => {
115
- if (!result.success) {
116
- return c.json({ error: 'Validation failed', issues: result.error }, 422);
117
- }
118
- });
119
- }
120
17
  /**
121
18
  * Create a route handler with validation and OpenAPI metadata.
122
- *
123
- * Type inference works automatically:
124
- * - Body type is inferred from the `body` schema
125
- * - Return type is inferred as a union of all 2xx response schemas (200, 201, etc.)
126
- * - Response data is automatically validated and extra keys are stripped
127
- * - HTTP status code is automatically set based on which schema matches
128
- *
129
- * Response Validation & Status Code:
130
- * - Responses are parsed through their corresponding 2xx schema
131
- * - Extra keys not defined in the schema are automatically stripped
132
- * - The HTTP status code is automatically set based on which schema validates
133
- * - If multiple 2xx schemas are defined, each is tried in order (200, 201)
134
- * - The first schema that successfully validates determines the status code
135
- *
136
- * @param router - The Hono router instance (needed for OpenAPI context)
137
- * @param config - Route configuration
138
- *
139
- * @example
140
- * ```typescript
141
- * // Single response type
142
- * router.post('/session', ...route(router, {
143
- * body: StartSessionDto,
144
- * responses: { 200: StartSessionResponseDto },
145
- * handler: async ({ body }) => {
146
- * // body is typed as InferOutput<typeof StartSessionDto>
147
- * return { email: body.email }; // Must match StartSessionResponseDto
148
- * }
149
- * }))
150
- *
151
- * // Union response type (multiple 2xx responses with automatic status)
152
- * router.post('/login', ...route(router, {
153
- * body: LoginDto,
154
- * responses: {
155
- * 200: MfaRequiredDto, // Returns 200 if data matches this
156
- * 201: SessionDto // Returns 201 if data matches this
157
- * },
158
- * handler: async ({ body }) => {
159
- * // Return type is: MfaRequiredDto | SessionDto
160
- * // Status code is set automatically based on which schema matches!
161
- * if (needsMfa) return { mfaRequired: true, methods: ['totp'] }; // 200
162
- * return { sessionId: '123', token: 'abc' }; // 201
163
- * }
164
- * }))
165
- *
166
- * // With pagination (auto-detected from ListQuerySchema)
167
- * router.get('/users', ...route(router, {
168
- * query: ListQuerySchema, // Contains page, pageSize - pagination headers auto-added
169
- * responses: { 200: UsersResponseDto },
170
- * handler: async ({ query }) => { ... }
171
- * }))
172
- *
173
- * // With custom response headers
174
- * router.get('/data', ...route(router, {
175
- * openapi: {
176
- * responseHeaders: ['Api-Version', 'Server-Timing']
177
- * },
178
- * responses: { 200: DataDto },
179
- * handler: async () => { ... }
180
- * }))
181
- * ```
182
19
  */
183
20
  export function route(router, config) {
184
21
  const middlewares = [];
185
- // Get OpenAPI context from the router
186
22
  const openAPIContext = getOpenAPIContext(router);
187
- // Detect pagination from query schema
188
23
  const hasPagination = hasPaginationFields(config.query);
189
- // Add OpenAPI metadata
190
24
  if (!config.openapi?.exclude) {
191
25
  middlewares.push(buildOpenAPIMiddleware(config, openAPIContext, hasPagination));
192
26
  }
193
- // Add custom middleware (e.g., auth) before validation
194
27
  if (config.middleware) {
195
28
  middlewares.push(...config.middleware);
196
29
  }
197
- // Add validation middleware (returns 422 instead of Hono's default 400)
198
30
  if (config.body) {
199
31
  middlewares.push(createValidationMiddleware(config.bodyType || 'json', config.body));
200
32
  }
@@ -204,7 +36,6 @@ export function route(router, config) {
204
36
  if (config.params) {
205
37
  middlewares.push(createValidationMiddleware('param', config.params));
206
38
  }
207
- // Add handler wrapper
208
39
  middlewares.push(async (c) => {
209
40
  const routeContext = buildRouteContext(c, config, openAPIContext);
210
41
  if (config.authorize) {
@@ -213,292 +44,6 @@ export function route(router, config) {
213
44
  const result = await config.handler(routeContext);
214
45
  return handleResponse(result, config.responses, config.serialization, config.strictTypes, config.summary, c);
215
46
  });
216
- // Cast to RouteHandlers tuple type - we always have at least one handler (the final handler wrapper)
217
47
  return middlewares;
218
48
  }
219
- function enforceRouteAuthorization(authorize, routeContext) {
220
- const ability = routeContext
221
- .ability;
222
- const user = routeContext.user;
223
- const isAuthenticated = routeContext.isAuthenticated ?? Boolean(user);
224
- const allowGuest = authorize.allowGuest ?? false;
225
- if (!isAuthenticated && !allowGuest) {
226
- throw new UnauthorizedException('Authentication required');
227
- }
228
- const canAccess = ability?.can?.(authorize.action, authorize.subject);
229
- if (!canAccess) {
230
- if (!isAuthenticated) {
231
- throw new UnauthorizedException('Authentication required');
232
- }
233
- throw new ForbiddenException(`You don't have permission to ${authorize.action} ${authorize.subject}`);
234
- }
235
- }
236
- /**
237
- * Serialize response data with custom transformers and default Prisma type handling.
238
- *
239
- * @param data - The raw response data from the handler
240
- * @param serializationConfig - Optional custom serialization configuration
241
- * @returns Serialized data with Prisma types converted to JSON-safe types
242
- * @throws Error if circular reference or max depth is exceeded
243
- */
244
- function serializeResponseData(data, serializationConfig) {
245
- const config = serializationConfig
246
- ? {
247
- transformers: [
248
- ...(serializationConfig.transformers || []),
249
- ...defaultSerializationConfig.transformers,
250
- ],
251
- }
252
- : defaultSerializationConfig;
253
- return serializePrismaTypes(data, config);
254
- }
255
- /**
256
- * Handle response serialization and validation, including error handling.
257
- *
258
- * @param result - The raw result from the handler
259
- * @param responses - The response schemas configuration
260
- * @param serializationConfig - Optional custom serialization configuration
261
- * @param routeSummary - Route summary for logging
262
- * @param context - Hono context
263
- * @returns Response object or undefined if handled
264
- */
265
- async function handleResponse(result, responses, serializationConfig, strictTypes, routeSummary, context) {
266
- // If handler returned a Response, return it directly (for custom responses like text)
267
- if (result instanceof Response) {
268
- return result;
269
- }
270
- // Handle empty responses
271
- if (result === null || result === undefined) {
272
- context.status(204);
273
- return context.body(null);
274
- }
275
- // Serialize Prisma types and custom transformers
276
- let serializedResult;
277
- try {
278
- // Only serialize if strictTypes is disabled (default)
279
- // If strictTypes is true, we expect the handler to return exact types
280
- if (!strictTypes) {
281
- serializedResult = serializeResponseData(result, serializationConfig);
282
- }
283
- else {
284
- serializedResult = result;
285
- }
286
- }
287
- catch (error) {
288
- // Handle serialization errors (circular references, max depth exceeded)
289
- logger.error('Failed to serialize response data', {
290
- error: error instanceof Error ? error.message : String(error),
291
- route: routeSummary || 'unknown',
292
- });
293
- // In production, don't leak error details
294
- const errorMessage = process.env.NODE_ENV === 'production'
295
- ? 'Failed to serialize response data'
296
- : error instanceof Error
297
- ? error.message
298
- : String(error);
299
- return context.json({ error: 'Internal Server Error', message: errorMessage }, 500);
300
- }
301
- // Parse and validate response through schema
302
- const { data: parsedResult, statusCode } = await parseResponse(serializedResult, responses);
303
- // Set status code if determined by schema matching
304
- if (statusCode) {
305
- context.status(statusCode);
306
- }
307
- return context.json(parsedResult);
308
- }
309
- /**
310
- * Parse and validate response data through the appropriate success/redirect schema.
311
- * Tries each 2xx and 3xx schema in order until one successfully validates.
312
- * This automatically strips extra keys not defined in the schema and determines
313
- * the appropriate HTTP status code.
314
- *
315
- * @param data - The raw response data from the handler
316
- * @param responses - The response schemas configuration
317
- * @returns Object with parsed data and the matching status code
318
- */
319
- async function parseResponse(data, responses) {
320
- // If no response schemas defined, return data as-is
321
- if (!responses) {
322
- return { data };
323
- }
324
- // Try each success/redirect schema in order (2xx and 3xx codes)
325
- const successCodes = [
326
- 200, 201, 202, 204, 301, 302, 307, 308,
327
- ];
328
- for (const statusCode of successCodes) {
329
- const schema = responses[statusCode];
330
- if (!schema)
331
- continue;
332
- // Try to parse with this schema
333
- // Use async parse to support both sync and async schemas
334
- const result = await safeParseAsync(schema, data);
335
- if (result.success) {
336
- // Successfully parsed - return the validated data and matching status code
337
- return { data: result.output, statusCode };
338
- }
339
- }
340
- // No schema matched - this is a potential security issue in production
341
- if (process.env.NODE_ENV === 'production') {
342
- // In production, throw an error to prevent leaking unvalidated data
343
- // This could expose sensitive fields that should have been stripped
344
- logger.error('Response data does not match any defined success/redirect schema. ' +
345
- 'Refusing to return unvalidated data in production.');
346
- throw new Error('Response validation failed: Data does not match any defined response schema. ' +
347
- 'This prevents potentially sensitive data from being leaked.');
348
- }
349
- // In development, log a warning and return data as-is for debugging
350
- logger.warn('Response data does not match any defined success/redirect schema. ' +
351
- 'Data will be returned as-is without validation or key stripping. ' +
352
- 'This would throw an error in production.');
353
- return { data };
354
- }
355
- function buildOpenAPIMiddleware(config, openAPIContext, hasPagination) {
356
- const responses = buildOpenAPIResponses(config, openAPIContext, hasPagination);
357
- // Build security requirement based on security schemes from context
358
- // Public routes have no security, authenticated routes use all available schemes
359
- const security = config.public
360
- ? []
361
- : openAPIContext.securitySchemes.map((scheme) => ({ [scheme]: [] }));
362
- // Extract responseHeaders and exclude from openapi config to avoid passing it to hono-openapi
363
- const { responseHeaders: _responseHeaders, exclude: _exclude, docs, ...restOpenapi } = config.openapi ?? {};
364
- const openApiConfig = {
365
- operationId: config.operationId || config.summary,
366
- tags: config.tags,
367
- summary: config.summary,
368
- description: config.description,
369
- externalDocs: docs,
370
- responses: responses,
371
- security,
372
- ...restOpenapi,
373
- };
374
- return honoDescribeRoute(openApiConfig);
375
- }
376
- /**
377
- * Build default error responses based on route configuration.
378
- */
379
- function buildDefaultErrorResponses(config) {
380
- const hasValidation = !!(config.body || config.query || config.params);
381
- if (config.public) {
382
- return {
383
- 400: undefined,
384
- ...(hasValidation && { 422: undefined }),
385
- 429: undefined,
386
- 500: undefined,
387
- };
388
- }
389
- return {
390
- 400: undefined,
391
- 401: undefined,
392
- ...(hasValidation && { 422: undefined }),
393
- 429: undefined,
394
- 500: undefined,
395
- };
396
- }
397
- /**
398
- * Build response content for a single status code.
399
- */
400
- function buildResponseContent(schema, isErrorResponse) {
401
- if (schema) {
402
- return {
403
- content: {
404
- 'application/json': {
405
- schema: resolver(schema, {
406
- errorMode: 'ignore',
407
- }),
408
- },
409
- },
410
- };
411
- }
412
- if (isErrorResponse) {
413
- return {
414
- content: {
415
- 'application/json': {
416
- schema: { $ref: '#/components/schemas/ErrorResponse' },
417
- },
418
- },
419
- };
420
- }
421
- return {};
422
- }
423
- /**
424
- * Build binary response object for file download endpoints.
425
- */
426
- function buildBinaryResponse(binaryConfig) {
427
- const description = binaryConfig.description ??
428
- STATUS_DESCRIPTIONS[(binaryConfig.statusCode ?? 200)] ??
429
- 'File download';
430
- return {
431
- description,
432
- content: {
433
- [binaryConfig.contentType]: {
434
- schema: { type: 'string', format: 'binary' },
435
- },
436
- },
437
- };
438
- }
439
- function buildOpenAPIResponses(config, openAPIContext, hasPagination) {
440
- const responses = {};
441
- const defaultResponses = buildDefaultErrorResponses(config);
442
- const allResponses = { ...defaultResponses, ...(config.responses || {}) };
443
- const binaryResponse = config.openapi?.binaryResponse;
444
- const binaryStatusCode = String(binaryResponse?.statusCode ?? 200);
445
- if (binaryResponse) {
446
- responses[binaryStatusCode] = buildBinaryResponse(binaryResponse);
447
- }
448
- for (const [statusCode, schema] of Object.entries(allResponses)) {
449
- if (binaryResponse && statusCode === binaryStatusCode) {
450
- continue;
451
- }
452
- const code = Number(statusCode);
453
- const description = STATUS_DESCRIPTIONS[code] || 'Response';
454
- const isErrorResponse = code >= 400;
455
- let response = {
456
- description,
457
- ...buildResponseContent(schema, isErrorResponse && !schema),
458
- };
459
- const processorContext = {
460
- statusCode,
461
- hasPagination,
462
- routeConfig: {
463
- ...config,
464
- public: config.public,
465
- tags: config.tags,
466
- summary: config.summary,
467
- openapi: config.openapi,
468
- },
469
- };
470
- response = applyProcessors(response, processorContext, openAPIContext.processors);
471
- responses[statusCode] = response;
472
- }
473
- return responses;
474
- }
475
- /**
476
- * Build the route context for a handler.
477
- * Creates a context-aware logger using the route's first tag or operationId as the service name.
478
- */
479
- function buildRouteContext(c, config, openAPIContext) {
480
- const req = c.req;
481
- // Create a context-aware logger for this route
482
- // Use first tag, operationId, or 'Route' as the service name
483
- const serviceName = config.tags?.[0] || config.operationId || 'Route';
484
- const routeLogger = openAPIContext.pino
485
- ? createContextAwarePinoLogger({ pino: openAPIContext.pino, service: serviceName })
486
- : createLogger(serviceName); // Uses default level (silent in test mode when no pino configured)
487
- // Spread all context variables (from ContextVariableMap)
488
- // This includes session, ability, role, and any other middleware-added variables
489
- // Return with TSessionRequired=false to allow undefined session
490
- // The type will be narrowed at the call site based on the route's public setting
491
- return {
492
- ...c.var,
493
- body: req.valid(config.bodyType || 'json'),
494
- query: req.valid('query'),
495
- params: req.valid('param'),
496
- services: c.get('services') || {},
497
- session: c.get('session'),
498
- ip: getClientIp(c),
499
- userAgent: c.req.header('user-agent'),
500
- logger: routeLogger,
501
- context: c,
502
- };
503
- }
504
49
  //# sourceMappingURL=route-helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"AAGA,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;AAQrD,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,CAC1B,OAA+E;IAE/E,OAAO,CAAC,MAAY,EAAE,QAAiC,EAAE,EAAE;QACzD,MAAM,UAAU,GAAuB,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzE,OAAO,CAAC,MAAM,EAAE,QAAqB,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC;AAID;;GAEG;AACH,MAAM,UAAU,KAAK,CAUnB,MAAY,EACZ,MAA8E;IAE9E,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,CACjC,YAKC,CACF,CAAC;QAEF,OAAO,cAAc,CACnB,MAAM,EACN,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,OAAO,EACd,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,WAA4B,CAAC;AACtC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { Hono } from 'hono';
2
+ import type { OpenAPIResponseProcessor } from '../core/types.js';
3
+ import type { PinoLogger } from '../observability/pino-logger.js';
4
+ /**
5
+ * OpenAPI context stored in Hono app context.
6
+ * Set during bootstrap and used when defining routes.
7
+ */
8
+ export interface OpenAPIContext {
9
+ processors: OpenAPIResponseProcessor[];
10
+ securitySchemes: string[];
11
+ /**
12
+ * Pino logger instance for creating context-aware loggers in route handlers.
13
+ * When set, enables `logger` property in RouteContext.
14
+ */
15
+ pino?: PinoLogger;
16
+ }
17
+ /**
18
+ * Set the OpenAPI context for a Hono app instance.
19
+ * @internal
20
+ */
21
+ export declare function setOpenAPIContext(app: Hono, context: OpenAPIContext): void;
22
+ /**
23
+ * Get the OpenAPI context for a Hono app instance.
24
+ * @internal
25
+ */
26
+ export declare function getOpenAPIContext(app: Hono): OpenAPIContext;
27
+ //# sourceMappingURL=route-openapi-context.d.ts.map
@@ -0,0 +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;CACnB;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"}
@@ -0,0 +1,16 @@
1
+ const openAPIContextMap = new WeakMap();
2
+ /**
3
+ * Set the OpenAPI context for a Hono app instance.
4
+ * @internal
5
+ */
6
+ export function setOpenAPIContext(app, context) {
7
+ openAPIContextMap.set(app, context);
8
+ }
9
+ /**
10
+ * Get the OpenAPI context for a Hono app instance.
11
+ * @internal
12
+ */
13
+ export function getOpenAPIContext(app) {
14
+ return openAPIContextMap.get(app) ?? { processors: [], securitySchemes: [], pino: undefined };
15
+ }
16
+ //# sourceMappingURL=route-openapi-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-openapi-context.js","sourceRoot":"","sources":["../../src/http/route-openapi-context.ts"],"names":[],"mappings":"AAkBA,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"}
@@ -0,0 +1,5 @@
1
+ import type { MiddlewareHandler } from 'hono';
2
+ import type { OpenAPIContext } from './route-openapi-context.js';
3
+ import { type RouteConfig, STATUS_DESCRIPTIONS, type ValibotSchema } from './route-types.js';
4
+ export declare function buildOpenAPIMiddleware<TBody extends ValibotSchema | undefined, TQuery extends ValibotSchema | undefined, TParams extends ValibotSchema | undefined, TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>>, TPublic extends boolean, TStrictTypes extends boolean>(config: RouteConfig<TBody, TQuery, TParams, TResponses, TPublic, TStrictTypes>, openAPIContext: OpenAPIContext, hasPagination: boolean): MiddlewareHandler;
5
+ //# sourceMappingURL=route-openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-openapi.d.ts","sourceRoot":"","sources":["../../src/http/route-openapi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAS9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,KAAK,WAAW,EAEhB,mBAAmB,EACnB,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAsH1B,wBAAgB,sBAAsB,CACpC,KAAK,SAAS,aAAa,GAAG,SAAS,EACvC,MAAM,SAAS,aAAa,GAAG,SAAS,EACxC,OAAO,SAAS,aAAa,GAAG,SAAS,EACzC,UAAU,SAAS,OAAO,CAAC,MAAM,CAAC,MAAM,OAAO,mBAAmB,EAAE,aAAa,GAAG,SAAS,CAAC,CAAC,EAC/F,OAAO,SAAS,OAAO,EACvB,YAAY,SAAS,OAAO,EAE5B,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,EAC9E,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,OAAO,GACrB,iBAAiB,CA0BnB"}