Skip to content

Commit 3d2c8e3

Browse files
committed
feat: response example
1 parent ab71bad commit 3d2c8e3

File tree

3 files changed

+26
-11
lines changed

3 files changed

+26
-11
lines changed

src/core/definer.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { customErrorTypes } from "~/types/error";
22
import type { HttpMethod } from "~/types/http";
33
import type { RouteHandler, RouteMethodHandler } from "~/types/next";
4-
import type { ResponseDefinition } from "~/types/response";
4+
import type { ResponseCollection } from "~/types/response";
55
import { parseRequestBody, resolveRequestBody } from "./body";
66
import { resolveParams } from "./params";
77
import parsePathParams from "./path-params";
@@ -40,6 +40,7 @@ type RouteOptions<
4040
RequestBodyOutput,
4141
Req extends Request,
4242
Res extends Response,
43+
ResponseDefinitions extends Record<string, unknown>,
4344
> = {
4445
operationId: string,
4546
method: Method,
@@ -52,7 +53,7 @@ type RouteOptions<
5253
source: ActionSource<PathParamsOutput, QueryParamsOutput, RequestBodyOutput>,
5354
request: Req
5455
) => Res | Promise<Res>,
55-
responses: Record<string, ResponseDefinition>,
56+
responses: ResponseCollection<ResponseDefinitions>,
5657
handleErrors?: (
5758
errorType: typeof customErrorTypes[number] | "UNKNOWN_ERROR",
5859
issues?: ZodIssue[]
@@ -64,9 +65,18 @@ type RouteOptions<
6465
} & (RouteWithBody<RequestBodyInput, RequestBodyOutput> | RouteWithoutBody);
6566

6667
function defineRoute<
67-
M extends HttpMethod, PPI, PPO, QPI, QPO, RBI, RBO, MwReq extends Request, MwRes extends Response,
68+
M extends HttpMethod,
69+
PPI,
70+
PPO,
71+
QPI,
72+
QPO,
73+
RBI,
74+
RBO,
75+
MwReq extends Request,
76+
MwRes extends Response,
77+
ResDef extends Record<string, unknown>,
6878
>(input: RouteOptions<
69-
M, PPI, PPO, QPI, QPO, RBI, RBO, MwReq, MwRes
79+
M, PPI, PPO, QPI, QPO, RBI, RBO, MwReq, MwRes, ResDef
7080
>) {
7181
const handler: RouteMethodHandler<PPI, MwReq, MwRes> = async (request, context) => {
7282
try {

src/core/responses.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ResponseDefinition } from "~/types/response";
1+
import type { ResponseCollection, ResponseDefinition } from "~/types/response";
22
import { resolveContent } from "./content";
33
import type { ResponseObject, ResponsesObject } from "@omer-x/openapi-types/response";
44

@@ -7,13 +7,13 @@ export function addBadRequest(queryParams?: unknown, requestBody?: unknown) {
77
return { description: "Bad Request" } as ResponseObject;
88
}
99

10-
export function bundleResponses(collection: Record<string, ResponseDefinition>) {
11-
return Object.entries(collection).reduce((result, [key, response]) => {
10+
export function bundleResponses<Defs extends Record<string, unknown>>(collection: ResponseCollection<Defs>) {
11+
return Object.entries(collection).reduce((result, [key, response]: [string, ResponseDefinition<unknown>]) => {
1212
return {
1313
...result,
1414
[key]: {
1515
description: response.description,
16-
content: resolveContent(response.content, response.isArray),
16+
content: resolveContent(response.content, response.isArray, false, response.example),
1717
} satisfies ResponseObject,
1818
};
1919
}, {}) as ResponsesObject;

src/types/response.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
import type { ZodType } from "zod";
1+
import type { ZodType, ZodTypeDef } from "zod";
22

3-
export type ResponseDefinition = {
3+
export type ResponseDefinition<O, I = O> = {
44
description: string,
5-
content?: ZodType | string,
65
isArray?: boolean,
6+
content?: ZodType<O, ZodTypeDef, I> | string,
7+
example?: NoInfer<O>,
8+
};
9+
10+
export type ResponseCollection<T extends Record<string, unknown>> = {
11+
[K in keyof T]: ResponseDefinition<T[K]>;
712
};

0 commit comments

Comments
 (0)