Skip to content

Commit c2f8c8e

Browse files
authored
fix: response JSON with status 201 (#30)
1 parent b6f1948 commit c2f8c8e

2 files changed

Lines changed: 63 additions & 5 deletions

File tree

src/endpoint.test.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,51 @@ describe("response", () => {
366366
test: "response",
367367
});
368368
});
369+
370+
it("should return a js object response with 201 status", async () => {
371+
const endpoint = createEndpoint(
372+
"/path",
373+
{
374+
method: "POST",
375+
status: 201,
376+
},
377+
async (ctx) => {
378+
return ctx.json(
379+
{ test: "response" },
380+
{
381+
status: 201,
382+
},
383+
);
384+
},
385+
);
386+
const response = await endpoint({
387+
asResponse: true,
388+
});
389+
await expect(response.json()).resolves.toMatchObject({
390+
test: "response",
391+
});
392+
expect(response.status).toBe(201);
393+
});
394+
});
395+
396+
it("should return a js object response (asResponse)", async () => {
397+
const endpoint = createEndpoint(
398+
"/path",
399+
{
400+
method: "POST",
401+
status: 200,
402+
},
403+
async (ctx) => {
404+
return ctx.json({ test: "response" });
405+
},
406+
);
407+
const response = await endpoint({
408+
asResponse: true,
409+
});
410+
await expect(response.json()).resolves.toMatchObject({
411+
test: "response",
412+
});
413+
expect(response.status).toBe(200);
369414
});
370415

371416
describe("as-response", () => {

src/to-response.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,16 @@ function isJSONSerializable(value: any) {
2424
);
2525
}
2626

27+
export type JSONResponse = {
28+
body: Record<string, any>;
29+
routerResponse: ResponseInit | undefined;
30+
_flag: "json";
31+
};
32+
33+
function isJSONResponse(value: any): value is JSONResponse {
34+
return "_flag" in value && value._flag === "json";
35+
}
36+
2737
export function toResponse(data?: any, init?: ResponseInit): Response {
2838
if (data instanceof Response) {
2939
if (init?.headers instanceof Headers) {
@@ -33,19 +43,22 @@ export function toResponse(data?: any, init?: ResponseInit): Response {
3343
}
3444
return data;
3545
}
36-
if (data?._flag === "json") {
46+
if (isJSONResponse(data)) {
47+
const body = data.body;
3748
const routerResponse = data.routerResponse;
3849
if (routerResponse instanceof Response) {
3950
return routerResponse;
4051
}
41-
return toResponse(data.body, {
42-
headers: data.headers,
43-
status: data.status,
52+
return toResponse(body, {
53+
...routerResponse,
54+
headers: init?.headers ?? routerResponse?.headers,
55+
status: init?.status ?? routerResponse?.status,
56+
statusText: init?.statusText ?? routerResponse?.statusText,
4457
});
4558
}
4659
if (isAPIError(data)) {
4760
return toResponse(data.body, {
48-
status: data.statusCode,
61+
status: init?.status ?? data.statusCode,
4962
statusText: data.status.toString(),
5063
headers: init?.headers || data.headers,
5164
});

0 commit comments

Comments
 (0)