@whatwg-node/fetch
Version:
Cross Platform Smart Fetch Ponyfill
101 lines (88 loc) • 3.27 kB
JavaScript
const shouldSkipPonyfill = require('./shouldSkipPonyfill');
let newNodeFetch;
module.exports = function createNodePonyfill(opts = {}) {
const ponyfills = {};
ponyfills.URLPattern = globalThis.URLPattern;
// We call this previously to patch `Bun`
if (!ponyfills.URLPattern) {
const urlPatternModule = require('urlpattern-polyfill');
ponyfills.URLPattern = urlPatternModule.URLPattern;
}
if (opts.skipPonyfill || shouldSkipPonyfill()) {
return {
fetch: globalThis.fetch,
Headers: globalThis.Headers,
Request: globalThis.Request,
Response: globalThis.Response,
FormData: globalThis.FormData,
ReadableStream: globalThis.ReadableStream,
WritableStream: globalThis.WritableStream,
TransformStream: globalThis.TransformStream,
CompressionStream: globalThis.CompressionStream,
DecompressionStream: globalThis.DecompressionStream,
TextDecoderStream: globalThis.TextDecoderStream,
TextEncoderStream: globalThis.TextEncoderStream,
Blob: globalThis.Blob,
File: globalThis.File,
crypto: globalThis.crypto,
btoa: globalThis.btoa,
TextEncoder: globalThis.TextEncoder,
TextDecoder: globalThis.TextDecoder,
URLPattern: ponyfills.URLPattern,
URL: globalThis.URL,
URLSearchParams: globalThis.URLSearchParams
};
}
newNodeFetch ||= require('@whatwg-node/node-fetch');
ponyfills.fetch = newNodeFetch.fetch;
ponyfills.Request = newNodeFetch.Request;
ponyfills.Response = newNodeFetch.Response;
ponyfills.Headers = newNodeFetch.Headers;
ponyfills.FormData = newNodeFetch.FormData;
ponyfills.ReadableStream = newNodeFetch.ReadableStream;
ponyfills.URL = newNodeFetch.URL;
ponyfills.URLSearchParams = newNodeFetch.URLSearchParams;
ponyfills.WritableStream = newNodeFetch.WritableStream;
ponyfills.TransformStream = newNodeFetch.TransformStream;
ponyfills.CompressionStream = newNodeFetch.CompressionStream;
ponyfills.DecompressionStream = newNodeFetch.DecompressionStream;
ponyfills.TextDecoderStream = newNodeFetch.TextDecoderStream;
ponyfills.TextEncoderStream = newNodeFetch.TextEncoderStream;
ponyfills.Blob = newNodeFetch.Blob;
ponyfills.File = newNodeFetch.File;
ponyfills.crypto = globalThis.crypto;
ponyfills.btoa = newNodeFetch.btoa;
ponyfills.TextEncoder = newNodeFetch.TextEncoder;
ponyfills.TextDecoder = newNodeFetch.TextDecoder;
if (opts.formDataLimits) {
ponyfills.Body = class Body extends newNodeFetch.Body {
constructor(body, userOpts) {
super(body, {
formDataLimits: opts.formDataLimits,
...userOpts,
});
}
}
ponyfills.Request = class Request extends newNodeFetch.Request {
constructor(input, userOpts) {
super(input, {
formDataLimits: opts.formDataLimits,
...userOpts,
});
}
}
ponyfills.Response = class Response extends newNodeFetch.Response {
constructor(body, userOpts) {
super(body, {
formDataLimits: opts.formDataLimits,
...userOpts,
});
}
}
}
if (!ponyfills.crypto) {
const cryptoModule = require("crypto");
ponyfills.crypto = cryptoModule.webcrypto;
}
return ponyfills;
}