Skip to content

Commit

Permalink
feat: add static Response.json (#1670)
Browse files Browse the repository at this point in the history
* feat: add static Response.json

* fix: set content-type if it doesn't exist properly
  • Loading branch information
KhafraDev committed Nov 10, 2022
1 parent c071406 commit 55a4870
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 0 deletions.
1 change: 1 addition & 0 deletions @types/index.d.ts
Expand Up @@ -196,6 +196,7 @@ export class Response extends BodyMixin {

static error(): Response;
static redirect(url: string, status?: number): Response;
static json(data: any, init?: ResponseInit): Response;
}

export class FetchError extends Error {
Expand Down
5 changes: 5 additions & 0 deletions @types/index.test-d.ts
Expand Up @@ -93,6 +93,11 @@ async function run() {

expectType<Response>(Response.redirect('https://google.com'));
expectType<Response>(Response.redirect('https://google.com', 301));

expectType<Response>(Response.json({foo: 'bar'}));
expectType<Response>(Response.json({foo: 'bar'}, {
status: 301
}));
}

run().finally(() => {
Expand Down
19 changes: 19 additions & 0 deletions src/response.js
Expand Up @@ -124,6 +124,25 @@ export default class Response extends Body {
return response;
}

static json(data = undefined, init = {}) {
const body = JSON.stringify(data);

if (body === undefined) {
throw new TypeError('data is not JSON serializable');
}

const headers = new Headers(init && init.headers);

if (!headers.has('content-type')) {
headers.set('content-type', 'application/json');
}

return new Response(body, {
...init,
headers
});
}

get [Symbol.toStringTag]() {
return 'Response';
}
Expand Down
27 changes: 27 additions & 0 deletions test/main.js
Expand Up @@ -2281,6 +2281,33 @@ describe('node-fetch', () => {
const res = await fetch(url);
expect(res.url).to.equal(`${base}m%C3%B6bius`);
});

it('static Response.json should work', async () => {
const response = Response.json({foo: 'bar'});
expect(response.status).to.equal(200);
expect(response.headers.get('content-type')).to.equal('application/json');
expect(await response.text()).to.equal(JSON.stringify({foo: 'bar'}));

const response1 = Response.json(null, {
status: 301,
statusText: 'node-fetch',
headers: {
'Content-Type': 'text/plain'
}
});

expect(response1.headers.get('content-type')).to.equal('text/plain');
expect(response1.status).to.equal(301);
expect(response1.statusText).to.equal('node-fetch');

const response2 = Response.json(null, {
headers: {
'CoNtEnT-TypE': 'text/plain'
}
});

expect(response2.headers.get('content-type')).to.equal('text/plain');
});
});

describe('node-fetch using IPv6', () => {
Expand Down

0 comments on commit 55a4870

Please sign in to comment.