Skip to content

Commit af03280

Browse files
authored
feat!: export native fetch on the web (#53)
1 parent 2fde22b commit af03280

File tree

13 files changed

+85
-29
lines changed

13 files changed

+85
-29
lines changed

packages/fetch/package.json

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
{
22
"name": "@web-std/fetch",
3-
"version": "3.0.3",
4-
"description": "Web compatible Fetch API implementation for node.js",
5-
"main": "./dist/index.cjs",
6-
"module": "./src/index.js",
7-
"types": "./dist/src/index.d.ts",
3+
"version": "4.0.0",
4+
"description": "Web API compatible fetch implementation",
5+
"main": "./dist/lib.node.cjs",
6+
"module": "./src/lib.node.js",
7+
"types": "./dist/src/lib.node.d.ts",
88
"sideEffects": false,
99
"type": "module",
1010
"exports": {
1111
".": {
12-
"import": "./src/index.js",
13-
"require": "./dist/index.cjs",
14-
"types": "./dist/src/index.d.ts"
12+
"browser": "./src/lib.js",
13+
"require": "./dist/lib.node.cjs",
14+
"import": "./src/lib.node.js",
15+
"types": "./dist/src/lib.node.d.ts"
1516
},
1617
"./package.json": "./package.json",
1718
"./body": {
@@ -72,6 +73,10 @@
7273
},
7374
"homepage": "https://github.com/web-std/io",
7475
"devDependencies": {
76+
"@types/chai": "^4.3.0",
77+
"@types/mocha": "^9.1.0",
78+
"@types/chai-as-promised": "^7.1.5",
79+
"@types/chai-string": "^1.4.2",
7580
"abort-controller": "^3.0.0",
7681
"abortcontroller-polyfill": "^1.7.1",
7782
"busboy": "^0.3.1",

packages/fetch/rollup.config.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ import {builtinModules} from 'module';
22
import {dependencies} from './package.json';
33

44
export default {
5-
input: 'src/index.js',
5+
input: 'src/lib.node.js',
66
output: {
7-
file: 'dist/index.cjs',
7+
file: 'dist/lib.node.cjs',
88
format: 'cjs',
99
esModule: false,
1010
interop: false,
1111
sourcemap: true,
1212
preferConst: true,
1313
exports: 'named',
1414
// https://github.com/rollup/rollup/issues/1961#issuecomment-534977678
15-
intro: 'exports = module.exports = fetch;'
15+
outro: 'exports = module.exports = Object.assign(fetch, exports);'
1616
},
1717
external: [...builtinModules, ...Object.keys(dependencies)]
1818
};

packages/fetch/src/index.js renamed to packages/fetch/src/fetch.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import * as Stream from 'stream';
2323
import { ReadableStream, Blob, FormData } from './package.js';
2424

2525

26-
export {Headers, Request, Response, FetchError, AbortError, isRedirect, ReadableStream, Blob, FormData};
26+
export {Headers, Request, Response, ReadableStream, Blob, FormData};
2727

2828
const supportedSchemas = new Set(['data:', 'http:', 'https:']);
2929

@@ -34,7 +34,7 @@ const supportedSchemas = new Set(['data:', 'http:', 'https:']);
3434
* @param {RequestInit} [options_] - Fetch options
3535
* @return {Promise<import('./response').default>}
3636
*/
37-
export default async function fetch(url, options_ = {}) {
37+
async function fetch(url, options_ = {}) {
3838
return new Promise((resolve, reject) => {
3939
// Build request object
4040
const request = new Request(url, options_);
@@ -339,3 +339,6 @@ function fixResponseChunkedTransferBadEnding(request, errorCallback) {
339339
}
340340
});
341341
}
342+
343+
export default fetch
344+
export { fetch }

packages/fetch/src/lib.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
3+
// On the web we just export native fetch implementation
4+
export { ReadableStream, Blob, FormData } from './package.js';
5+
export const { Headers, Request, Response } = globalThis;
6+
export default globalThis.fetch
7+

packages/fetch/src/lib.node.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import * as WebFetch from "./fetch.js"
2+
3+
export { ReadableStream, Blob, FormData } from './package.js';
4+
// Electron-renderer should get the browser implementation instead of node
5+
// Browser configuration is not enough
6+
7+
// Marking export as a DOM File object instead of custom class.
8+
export const fetch = /** @type {typeof globalThis.fetch} */
9+
(typeof globalThis.fetch === "function" ? globalThis.fetch : WebFetch.fetch)
10+
11+
export const Headers = globalThis.Headers || WebFetch.Headers
12+
export const Request = globalThis.Request || WebFetch.Request
13+
export const Response = global.Response || WebFetch.Response
14+
15+
export default fetch

packages/fetch/test/commonjs/test-artifact.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
// @ts-nocheck
22

33
const assert = require('assert');
4-
const fetch = require('../../');
4+
const fetch = require('@web-std/fetch');
55
assert.strictEqual(
66
typeof fetch,
77
'function',
88
'default import must be a function'
99
);
1010

11-
const {Request, Response, Headers, FetchError, AbortError} = require('../../');
12-
assert.ok(new FetchError() instanceof Error, 'FetchError must be an Error');
13-
assert.ok(
14-
new AbortError() instanceof Error,
15-
'AbortError must be an extension of Error'
16-
);
11+
const {Request, Response, Headers} = require('@web-std/fetch');
12+
1713
assert.ok(
1814
new Request('https://www.test.com').headers instanceof Headers,
1915
'Request class is not exposing correct functionality'

packages/fetch/test/external-encoding.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import fetch from '../src/index.js';
1+
import fetch from '@web-std/fetch';
22
import chai from 'chai';
33

44
const {expect} = chai;

packages/fetch/test/headers.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import util from 'util';
2-
import {Headers} from '../src/index.js';
2+
import {Headers} from '@web-std/fetch';
33
import chai from 'chai';
44
import chaiIterator from 'chai-iterator';
55

packages/fetch/test/main.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,11 @@ const AbortControllerPolyfill = abortControllerPolyfill.AbortController;
2424
import {Blob} from '@web-std/blob';
2525

2626
import fetch, {
27-
FetchError,
2827
Headers,
2928
Request,
3029
Response
31-
} from '../src/index.js';
32-
import {FetchError as FetchErrorOrig} from '../src/errors/fetch-error.js';
30+
} from '@web-std/fetch';
31+
import {FetchError} from '../src/errors/fetch-error.js';
3332
import HeadersOrig, {fromRawHeaders} from '../src/headers.js';
3433
import RequestOrig from '../src/request.js';
3534
import ResponseOrig from '../src/response.js';
@@ -90,7 +89,6 @@ describe('node-fetch', () => {
9089
});
9190

9291
it('should expose Headers, Response and Request constructors', () => {
93-
expect(FetchError).to.equal(FetchErrorOrig);
9492
expect(Headers).to.equal(HeadersOrig);
9593
expect(Response).to.equal(ResponseOrig);
9694
expect(Request).to.equal(RequestOrig);

packages/fetch/test/request.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {Blob} from '@web-std/fetch';
88
import { ReadableStream } from '@web-std/fetch';
99

1010
import TestServer from './utils/server.js';
11-
import {Request} from '../src/index.js';
11+
import {Request} from '@web-std/fetch';
1212

1313
const {expect} = chai;
1414

0 commit comments

Comments
 (0)