From 9942b41d428b445ff74f868a6a6eaa9dac6b2806 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Wed, 11 May 2022 22:55:34 +0200 Subject: [PATCH] feat: add `AbortController` --- README.md | 6 +++--- package.json | 1 + pnpm-lock.yaml | 14 ++++++++++++++ src/index.ts | 3 +++ src/native.ts | 1 + src/polyfill.ts | 3 +++ test/index.test.ts | 2 +- 7 files changed, 26 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 160ccd2..88424e7 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ A redistribution of [node-fetch v3](https://github.com/node-fetch/node-fetch) fo **Features:** -✅ Prefer to **native globals** when available (`fetch`, `Blob`, `File`, `FormData`, `Headers`, `Request`, and `Response`) (See Node.js [experimental fetch](https://nodejs.org/dist/latest-v17.x/docs/api/cli.html#--experimental-fetch)) +✅ Prefer to **native globals** when available (See Node.js [experimental fetch](https://nodejs.org/dist/latest-v17.x/docs/api/cli.html#--experimental-fetch)) ✅ Compact build and less install size with **zero dependencies** [![][packagephobia-s-src]][packagephobia-s-href] vs [![][packagephobia-s-alt-src]][packagephobia-s-alt-href] @@ -54,10 +54,10 @@ More named exports: ```js // ESM -import { fetch, Blob, FormData, Headers, Request, Response } from 'node-fetch-native' +import { fetch, Blob, FormData, Headers, Request, Response, AbortController } from 'node-fetch-native' // CommonJS -const { fetch, Blob, FormData, Headers, Request, Response } = require('node-fetch-native') +const { fetch, Blob, FormData, Headers, Request, Response, AbortController } = require('node-fetch-native') ``` ## Polyfill support diff --git a/package.json b/package.json index d673b74..69d0144 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ }, "devDependencies": { "@nuxtjs/eslint-config-typescript": "latest", + "abort-controller": "^3.0.0", "c8": "latest", "eslint": "latest", "node-fetch": "^3.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a2b40c1..618d0cb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2,6 +2,7 @@ lockfileVersion: 5.4 specifiers: '@nuxtjs/eslint-config-typescript': latest + abort-controller: ^3.0.0 c8: latest eslint: latest node-fetch: ^3.2.4 @@ -12,6 +13,7 @@ specifiers: devDependencies: '@nuxtjs/eslint-config-typescript': 10.0.0_hcfsmds2fshutdssjqluwm76uu + abort-controller: 3.0.0 c8: 7.11.2 eslint: 8.15.0 node-fetch: 3.2.4 @@ -613,6 +615,13 @@ packages: through: 2.3.8 dev: true + /abort-controller/3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: true + /acorn-jsx/5.3.2_acorn@8.7.1: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1982,6 +1991,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /event-target-shim/5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: true + /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true diff --git a/src/index.ts b/src/index.ts index f0804f0..41b5a72 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,6 +7,8 @@ import _fetch, { Response as _Response } from 'node-fetch' +import _AbortController from 'abort-controller' + export const fetch = globalThis.fetch || _fetch export default fetch @@ -16,6 +18,7 @@ export const FormData = globalThis.FormData || _FormData export const Headers = globalThis.Headers || _Headers export const Request = globalThis.Request || _Request export const Response = globalThis.Response || _Response +export const AbortController = globalThis.AbortController || _AbortController export { AbortError, diff --git a/src/native.ts b/src/native.ts index fc6c5a9..87333d8 100644 --- a/src/native.ts +++ b/src/native.ts @@ -4,6 +4,7 @@ export const FormData = globalThis.FormData export const Headers = globalThis.Headers export const Request = globalThis.Request export const Response = globalThis.Response +export const AbortController = globalThis.AbortController export const fetch = globalThis.fetch || (() => { throw new Error('global fetch is not available!') }) export default fetch diff --git a/src/polyfill.ts b/src/polyfill.ts index bf0497f..3032080 100644 --- a/src/polyfill.ts +++ b/src/polyfill.ts @@ -7,6 +7,8 @@ import _fetch, { Response as _Response } from 'node-fetch' +import _AbortController from 'abort-controller' + globalThis.fetch = globalThis.fetch || _fetch as unknown as typeof globalThis.fetch globalThis.Blob = globalThis.Blob || _Blob @@ -15,3 +17,4 @@ globalThis.FormData = globalThis.FormData || _FormData globalThis.Headers = globalThis.Headers || _Headers globalThis.Request = globalThis.Request || _Request as unknown as typeof globalThis.Request globalThis.Response = globalThis.Response || _Response as unknown as typeof globalThis.Response +globalThis.AbortController = globalThis.AbortController || _AbortController as unknown as typeof globalThis.AbortController diff --git a/test/index.test.ts b/test/index.test.ts index a4d269a..991f96b 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -9,7 +9,7 @@ import defaultESM from '../dist/index.mjs' const require = createRequire(import.meta.url) const libCJS = require('../lib/index.cjs') -const expectedExports = ['fetch', 'Blob', 'FormData', 'Headers', 'Request', 'Response'] +const expectedExports = ['fetch', 'Blob', 'FormData', 'Headers', 'Request', 'Response', 'AbortController'] const suites = [ { name: 'cjs', defaultExport: libCJS, exports: libCJS },