glasswork 0.2.1 → 0.2.3
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.
|
@@ -37,15 +37,15 @@ export type ValibotSchema = BaseSchema<unknown, unknown, BaseIssue<unknown>> | B
|
|
|
37
37
|
*/
|
|
38
38
|
type InferSchemaType<T> = T extends ValibotSchema ? InferOutput<T> : never;
|
|
39
39
|
/**
|
|
40
|
-
* Helper type to extract and create a union of all 2xx response types
|
|
40
|
+
* Helper type to extract and create a union of all 2xx and 3xx response types
|
|
41
41
|
*/
|
|
42
42
|
type InferResponseUnion<TResponses> = {
|
|
43
|
-
[K in keyof TResponses]: K extends 200 | 201 ? TResponses[K] extends ValibotSchema ? InferOutput<TResponses[K]> : never : never;
|
|
43
|
+
[K in keyof TResponses]: K extends 200 | 201 | 202 | 204 | 301 | 302 | 307 | 308 ? TResponses[K] extends ValibotSchema ? InferOutput<TResponses[K]> : never : never;
|
|
44
44
|
}[keyof TResponses];
|
|
45
45
|
/**
|
|
46
|
-
* Helper type to infer the response type from all 2xx status code schemas
|
|
47
|
-
* Returns a union type of all defined
|
|
48
|
-
* Falls back to unknown if no
|
|
46
|
+
* Helper type to infer the response type from all 2xx and 3xx status code schemas
|
|
47
|
+
* Returns a union type of all defined success/redirect responses (200, 201, 202, 204, 301, 302, 307, 308)
|
|
48
|
+
* Falls back to unknown if no success/redirect responses are defined
|
|
49
49
|
*/
|
|
50
50
|
type InferResponseType<TResponses> = InferResponseUnion<TResponses> extends never ? unknown : InferResponseUnion<TResponses>;
|
|
51
51
|
/**
|
|
@@ -54,7 +54,12 @@ type InferResponseType<TResponses> = InferResponseUnion<TResponses> extends neve
|
|
|
54
54
|
declare const STATUS_DESCRIPTIONS: {
|
|
55
55
|
readonly 200: "Success";
|
|
56
56
|
readonly 201: "Created";
|
|
57
|
+
readonly 202: "Accepted";
|
|
57
58
|
readonly 204: "No Content";
|
|
59
|
+
readonly 301: "Moved Permanently";
|
|
60
|
+
readonly 302: "Found";
|
|
61
|
+
readonly 307: "Temporary Redirect";
|
|
62
|
+
readonly 308: "Permanent Redirect";
|
|
58
63
|
readonly 400: "Bad Request";
|
|
59
64
|
readonly 401: "Unauthorized";
|
|
60
65
|
readonly 403: "Forbidden";
|
|
@@ -165,6 +170,15 @@ export interface RouteContext<TBody = never, TSessionRequired extends boolean =
|
|
|
165
170
|
* Type inference works automatically:
|
|
166
171
|
* - Body type is inferred from the `body` schema
|
|
167
172
|
* - Return type is inferred as a union of all 2xx response schemas (200, 201, etc.)
|
|
173
|
+
* - Response data is automatically validated and extra keys are stripped
|
|
174
|
+
* - HTTP status code is automatically set based on which schema matches
|
|
175
|
+
*
|
|
176
|
+
* Response Validation & Status Code:
|
|
177
|
+
* - Responses are parsed through their corresponding 2xx schema
|
|
178
|
+
* - Extra keys not defined in the schema are automatically stripped
|
|
179
|
+
* - The HTTP status code is automatically set based on which schema validates
|
|
180
|
+
* - If multiple 2xx schemas are defined, each is tried in order (200, 201)
|
|
181
|
+
* - The first schema that successfully validates determines the status code
|
|
168
182
|
*
|
|
169
183
|
* @example
|
|
170
184
|
* ```typescript
|
|
@@ -178,17 +192,29 @@ export interface RouteContext<TBody = never, TSessionRequired extends boolean =
|
|
|
178
192
|
* }
|
|
179
193
|
* })
|
|
180
194
|
*
|
|
181
|
-
* // Union response type (multiple 2xx responses)
|
|
195
|
+
* // Union response type (multiple 2xx responses with automatic status)
|
|
182
196
|
* route({
|
|
183
197
|
* body: LoginDto,
|
|
184
198
|
* responses: {
|
|
185
|
-
* 200: MfaRequiredDto,
|
|
186
|
-
* 201: SessionDto
|
|
199
|
+
* 200: MfaRequiredDto, // Returns 200 if data matches this
|
|
200
|
+
* 201: SessionDto // Returns 201 if data matches this
|
|
187
201
|
* },
|
|
188
202
|
* handler: async ({ body }) => {
|
|
189
203
|
* // Return type is: MfaRequiredDto | SessionDto
|
|
190
|
-
*
|
|
191
|
-
* return {
|
|
204
|
+
* // Status code is set automatically based on which schema matches!
|
|
205
|
+
* if (needsMfa) return { mfaRequired: true, methods: ['totp'] }; // 200
|
|
206
|
+
* return { sessionId: '123', token: 'abc' }; // 201
|
|
207
|
+
* }
|
|
208
|
+
* })
|
|
209
|
+
*
|
|
210
|
+
* // Automatic key stripping (useful with Prisma)
|
|
211
|
+
* route({
|
|
212
|
+
* responses: { 200: UserDto },
|
|
213
|
+
* handler: async ({ services }) => {
|
|
214
|
+
* const user = await prisma.user.findUnique({ ... });
|
|
215
|
+
* // user might have { id, email, password, createdAt, ... }
|
|
216
|
+
* // But only fields in UserDto will be returned
|
|
217
|
+
* return user; // Extra keys stripped, returns 200
|
|
192
218
|
* }
|
|
193
219
|
* })
|
|
194
220
|
* ```
|
|
@@ -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,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"route-helpers.d.ts","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { describeRoute as honoDescribeRoute } from 'hono-openapi';
|
|
2
2
|
import { resolver, validator } from 'hono-openapi/valibot';
|
|
3
|
+
import { safeParseAsync } from 'valibot';
|
|
3
4
|
import { getClientIp } from '../utils/get-client-ip.js';
|
|
5
|
+
import { createLogger } from '../utils/logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Logger instance for route helpers
|
|
8
|
+
*/
|
|
9
|
+
const logger = createLogger('Routes');
|
|
4
10
|
/**
|
|
5
11
|
* Global storage for OpenAPI response hooks.
|
|
6
12
|
* Set during bootstrap and used when defining routes.
|
|
@@ -52,7 +58,12 @@ export function getGlobalSecuritySchemes() {
|
|
|
52
58
|
const STATUS_DESCRIPTIONS = {
|
|
53
59
|
200: 'Success',
|
|
54
60
|
201: 'Created',
|
|
61
|
+
202: 'Accepted',
|
|
55
62
|
204: 'No Content',
|
|
63
|
+
301: 'Moved Permanently',
|
|
64
|
+
302: 'Found',
|
|
65
|
+
307: 'Temporary Redirect',
|
|
66
|
+
308: 'Permanent Redirect',
|
|
56
67
|
400: 'Bad Request',
|
|
57
68
|
401: 'Unauthorized',
|
|
58
69
|
403: 'Forbidden',
|
|
@@ -90,6 +101,15 @@ export function createRoutes(factory) {
|
|
|
90
101
|
* Type inference works automatically:
|
|
91
102
|
* - Body type is inferred from the `body` schema
|
|
92
103
|
* - Return type is inferred as a union of all 2xx response schemas (200, 201, etc.)
|
|
104
|
+
* - Response data is automatically validated and extra keys are stripped
|
|
105
|
+
* - HTTP status code is automatically set based on which schema matches
|
|
106
|
+
*
|
|
107
|
+
* Response Validation & Status Code:
|
|
108
|
+
* - Responses are parsed through their corresponding 2xx schema
|
|
109
|
+
* - Extra keys not defined in the schema are automatically stripped
|
|
110
|
+
* - The HTTP status code is automatically set based on which schema validates
|
|
111
|
+
* - If multiple 2xx schemas are defined, each is tried in order (200, 201)
|
|
112
|
+
* - The first schema that successfully validates determines the status code
|
|
93
113
|
*
|
|
94
114
|
* @example
|
|
95
115
|
* ```typescript
|
|
@@ -103,17 +123,29 @@ export function createRoutes(factory) {
|
|
|
103
123
|
* }
|
|
104
124
|
* })
|
|
105
125
|
*
|
|
106
|
-
* // Union response type (multiple 2xx responses)
|
|
126
|
+
* // Union response type (multiple 2xx responses with automatic status)
|
|
107
127
|
* route({
|
|
108
128
|
* body: LoginDto,
|
|
109
129
|
* responses: {
|
|
110
|
-
* 200: MfaRequiredDto,
|
|
111
|
-
* 201: SessionDto
|
|
130
|
+
* 200: MfaRequiredDto, // Returns 200 if data matches this
|
|
131
|
+
* 201: SessionDto // Returns 201 if data matches this
|
|
112
132
|
* },
|
|
113
133
|
* handler: async ({ body }) => {
|
|
114
134
|
* // Return type is: MfaRequiredDto | SessionDto
|
|
115
|
-
*
|
|
116
|
-
* return {
|
|
135
|
+
* // Status code is set automatically based on which schema matches!
|
|
136
|
+
* if (needsMfa) return { mfaRequired: true, methods: ['totp'] }; // 200
|
|
137
|
+
* return { sessionId: '123', token: 'abc' }; // 201
|
|
138
|
+
* }
|
|
139
|
+
* })
|
|
140
|
+
*
|
|
141
|
+
* // Automatic key stripping (useful with Prisma)
|
|
142
|
+
* route({
|
|
143
|
+
* responses: { 200: UserDto },
|
|
144
|
+
* handler: async ({ services }) => {
|
|
145
|
+
* const user = await prisma.user.findUnique({ ... });
|
|
146
|
+
* // user might have { id, email, password, createdAt, ... }
|
|
147
|
+
* // But only fields in UserDto will be returned
|
|
148
|
+
* return user; // Extra keys stripped, returns 200
|
|
117
149
|
* }
|
|
118
150
|
* })
|
|
119
151
|
* ```
|
|
@@ -163,10 +195,55 @@ export function route(config) {
|
|
|
163
195
|
c.status(204);
|
|
164
196
|
return c.body(null);
|
|
165
197
|
}
|
|
166
|
-
|
|
198
|
+
// Parse and validate response through schema (strips extra keys and determines status code)
|
|
199
|
+
const { data: parsedResult, statusCode } = await parseResponse(result, config.responses);
|
|
200
|
+
// Automatically set the status code based on which schema matched
|
|
201
|
+
if (statusCode) {
|
|
202
|
+
c.status(statusCode);
|
|
203
|
+
}
|
|
204
|
+
return c.json(parsedResult);
|
|
167
205
|
});
|
|
168
206
|
return middlewares;
|
|
169
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* Parse and validate response data through the appropriate success/redirect schema.
|
|
210
|
+
* Tries each 2xx and 3xx schema in order until one successfully validates.
|
|
211
|
+
* This automatically strips extra keys not defined in the schema and determines
|
|
212
|
+
* the appropriate HTTP status code.
|
|
213
|
+
*
|
|
214
|
+
* @param data - The raw response data from the handler
|
|
215
|
+
* @param responses - The response schemas configuration
|
|
216
|
+
* @returns Object with parsed data and the matching status code
|
|
217
|
+
*/
|
|
218
|
+
async function parseResponse(data, responses) {
|
|
219
|
+
// If no response schemas defined, return data as-is
|
|
220
|
+
if (!responses) {
|
|
221
|
+
return { data };
|
|
222
|
+
}
|
|
223
|
+
// Try each success/redirect schema in order (2xx and 3xx codes)
|
|
224
|
+
const successCodes = [
|
|
225
|
+
200, 201, 202, 204, 301, 302, 307, 308,
|
|
226
|
+
];
|
|
227
|
+
for (const statusCode of successCodes) {
|
|
228
|
+
const schema = responses[statusCode];
|
|
229
|
+
if (!schema)
|
|
230
|
+
continue;
|
|
231
|
+
// Try to parse with this schema
|
|
232
|
+
// Use async parse to support both sync and async schemas
|
|
233
|
+
const result = await safeParseAsync(schema, data);
|
|
234
|
+
if (result.success) {
|
|
235
|
+
// Successfully parsed - return the validated data and matching status code
|
|
236
|
+
return { data: result.output, statusCode };
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// No schema matched - return original data without status code
|
|
240
|
+
// In development, we might want to warn about this
|
|
241
|
+
if (process.env.NODE_ENV === 'development') {
|
|
242
|
+
logger.warn('Response data does not match any defined success/redirect schema. ' +
|
|
243
|
+
'Data will be returned as-is without validation or key stripping.');
|
|
244
|
+
}
|
|
245
|
+
return { data };
|
|
246
|
+
}
|
|
170
247
|
function buildOpenAPIMiddleware(config) {
|
|
171
248
|
const responses = buildOpenAPIResponses(config);
|
|
172
249
|
// Build security requirement based on global security schemes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"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"}
|