feat: add static Response.json (#1670)

* feat: add static Response.json

* fix: set content-type if it doesn't exist properly
This commit is contained in:
Khafra 2022-11-10 16:46:51 -05:00 committed by GitHub
parent c071406e19
commit 55a4870ae5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 52 additions and 0 deletions

1
@types/index.d.ts vendored
View File

@ -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 {

View File

@ -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(() => {

View File

@ -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';
}

View File

@ -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', () => {