From 54462d015719df65659e850e1ef4485a5d7c75ba Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Tue, 16 Nov 2021 10:27:32 +0100 Subject: [PATCH 1/2] NextResponse: add `.json` static method --- .../server/web/spec-extension/response.ts | 6 +++ test/unit/web-runtime/next-response.test.ts | 54 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 test/unit/web-runtime/next-response.test.ts diff --git a/packages/next/server/web/spec-extension/response.ts b/packages/next/server/web/spec-extension/response.ts index dabf3827d4ef21f..4cb0958b49ec1a9 100644 --- a/packages/next/server/web/spec-extension/response.ts +++ b/packages/next/server/web/spec-extension/response.ts @@ -63,6 +63,12 @@ export class NextResponse extends Response { return this.cookie(name, '', { expires: new Date(1), path: '/', ...opts }) } + static json(body: BodyInit | null) { + return new NextResponse(JSON.stringify(body), { + headers: { 'content-type': 'application/json' }, + }) + } + static redirect(url: string | NextURL, status = 302) { if (!REDIRECTS.has(status)) { throw new RangeError( diff --git a/test/unit/web-runtime/next-response.test.ts b/test/unit/web-runtime/next-response.test.ts new file mode 100644 index 000000000000000..f56ff68c88c166a --- /dev/null +++ b/test/unit/web-runtime/next-response.test.ts @@ -0,0 +1,54 @@ +/* eslint-env jest */ + +import { Blob, File, FormData } from 'next/dist/compiled/formdata-node' +import { Crypto } from 'next/dist/server/web/sandbox/polyfills' +import { Response } from 'next/dist/server/web/spec-compliant/response' +import { Headers } from 'next/dist/server/web/spec-compliant/headers' +import * as streams from 'web-streams-polyfill/ponyfill' + +beforeAll(() => { + global['Blob'] = Blob + global['crypto'] = new Crypto() + global['File'] = File + global['FormData'] = FormData + global['Headers'] = Headers + global['ReadableStream'] = streams.ReadableStream + global['TransformStream'] = streams.TransformStream + global['Response'] = Response +}) + +afterAll(() => { + delete global['Blob'] + delete global['crypto'] + delete global['File'] + delete global['Headers'] + delete global['FormData'] + delete global['ReadableStream'] + delete global['TransformStream'] +}) + +const toJSON = async (response) => ({ + body: await response.json(), + contentType: response.headers.get('content-type'), +}) + +it('automatically parses and formats JSON', async () => { + const { NextResponse } = await import( + 'next/dist/server/web/spec-extension/response' + ) + + expect(await toJSON(NextResponse.json({ message: 'hello!' }))).toMatchObject({ + contentType: 'application/json', + body: { message: 'hello!' }, + }) + + expect(await toJSON(NextResponse.json(null))).toMatchObject({ + contentType: 'application/json', + body: null, + }) + + expect(await toJSON(NextResponse.json(''))).toMatchObject({ + contentType: 'application/json', + body: '', + }) +}) From 2bb9478d53ab7e875f1c018a8f829d247d8e4d11 Mon Sep 17 00:00:00 2001 From: "jj@jjsweb.site" Date: Tue, 16 Nov 2021 11:15:44 -0600 Subject: [PATCH 2/2] fix type error --- packages/next/server/web/spec-extension/response.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/server/web/spec-extension/response.ts b/packages/next/server/web/spec-extension/response.ts index 4cb0958b49ec1a9..dff46ef005c5afa 100644 --- a/packages/next/server/web/spec-extension/response.ts +++ b/packages/next/server/web/spec-extension/response.ts @@ -63,7 +63,7 @@ export class NextResponse extends Response { return this.cookie(name, '', { expires: new Date(1), path: '/', ...opts }) } - static json(body: BodyInit | null) { + static json(body: any) { return new NextResponse(JSON.stringify(body), { headers: { 'content-type': 'application/json' }, })