fetch-nodeshim 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/minifetch.d.ts +85 -2
- package/dist/minifetch.js +104 -64
- package/dist/minifetch.js.map +1 -1
- package/dist/minifetch.mjs +122 -100
- package/dist/minifetch.mjs.map +1 -1
- package/package.json +9 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# minifetch
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Add web standard type/globals re-exports and polyfill `File` from `node:buffer`
|
|
8
|
+
Submitted by [@kitten](https://github.com/kitten) (See [#1](https://github.com/kitten/fetch-nodeshim/pull/1))
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- Add missing constructor type overloads and add missing `Blob` re-export
|
|
13
|
+
Submitted by [@kitten](https://github.com/kitten) (See [#2](https://github.com/kitten/fetch-nodeshim/pull/2))
|
|
14
|
+
|
|
3
15
|
## 0.1.0
|
|
4
16
|
|
|
5
17
|
Initial Release.
|
package/dist/minifetch.d.ts
CHANGED
|
@@ -1,3 +1,86 @@
|
|
|
1
|
-
|
|
1
|
+
import * as buffer from 'node:buffer';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
type Or<T, U> = void extends T ? U : T;
|
|
4
|
+
type HeadersInit = string[][] | Record<string, string | ReadonlyArray<string>> | _Headers;
|
|
5
|
+
type FormDataEntryValue = string | _File;
|
|
6
|
+
type RequestInfo = string | _URL | _Request;
|
|
7
|
+
interface _Iterable<T, TReturn = any, TNext = any>
|
|
8
|
+
extends Or<Iterable<T, TReturn, TNext>, globalThis.Iterable<T, TReturn, TNext>> {}
|
|
9
|
+
interface _AsyncIterable<T, TReturn = any, TNext = any>
|
|
10
|
+
extends Or<AsyncIterable<T, TReturn, TNext>, globalThis.AsyncIterable<T, TReturn, TNext>> {}
|
|
11
|
+
interface _ReadableStream<T = any> extends Or<ReadableStream<T>, globalThis.ReadableStream<T>> {}
|
|
12
|
+
type BodyInit =
|
|
13
|
+
| ArrayBuffer
|
|
14
|
+
| _Blob
|
|
15
|
+
| NodeJS.ArrayBufferView
|
|
16
|
+
| _URLSearchParams
|
|
17
|
+
| _ReadableStream
|
|
18
|
+
| _AsyncIterable<Uint8Array>
|
|
19
|
+
| _FormData
|
|
20
|
+
| _Iterable<Uint8Array>
|
|
21
|
+
| null
|
|
22
|
+
| string;
|
|
23
|
+
interface FileClass extends Or<typeof globalThis.File, typeof buffer.File> {}
|
|
24
|
+
interface _File extends _Blob, Or<File, globalThis.File> {
|
|
25
|
+
readonly name: string;
|
|
26
|
+
readonly lastModified: number;
|
|
27
|
+
}
|
|
28
|
+
interface _File extends Or<globalThis.File, buffer.File> {}
|
|
29
|
+
declare const _File: FileClass;
|
|
30
|
+
interface _RequestInit extends Or<RequestInit, globalThis.RequestInit> {
|
|
31
|
+
duplex?: 'half';
|
|
32
|
+
}
|
|
33
|
+
interface _ResponseInit extends Or<ResponseInit, globalThis.ResponseInit> {}
|
|
34
|
+
interface BlobClass extends Or<typeof Blob, typeof globalThis.Blob> {}
|
|
35
|
+
interface _Blob extends Or<Blob, globalThis.Blob> {}
|
|
36
|
+
declare const _Blob: BlobClass;
|
|
37
|
+
interface URLSearchParamsClass
|
|
38
|
+
extends Or<typeof URLSearchParams, typeof globalThis.URLSearchParams> {}
|
|
39
|
+
interface _URLSearchParams extends Or<URLSearchParams, globalThis.URLSearchParams> {}
|
|
40
|
+
declare const _URLSearchParams: URLSearchParamsClass;
|
|
41
|
+
interface URLClass extends Or<typeof URL, typeof globalThis.URL> {}
|
|
42
|
+
interface _URL extends Or<URL, globalThis.URL> {}
|
|
43
|
+
declare const _URL: URLClass;
|
|
44
|
+
interface RequestClass extends Or<typeof Request, typeof globalThis.Request> {
|
|
45
|
+
new (input: RequestInfo, init?: _RequestInit | Or<RequestInit, globalThis.RequestInit>): _Request;
|
|
46
|
+
}
|
|
47
|
+
interface _Request extends Or<Request, globalThis.Request> {}
|
|
48
|
+
declare const _Request: RequestClass;
|
|
49
|
+
interface ResponseClass extends Or<typeof Response, typeof globalThis.Response> {
|
|
50
|
+
new (body?: BodyInit, init?: _ResponseInit): _Response;
|
|
51
|
+
}
|
|
52
|
+
interface _Response extends Or<Response, globalThis.Response> {}
|
|
53
|
+
declare const _Response: ResponseClass;
|
|
54
|
+
interface HeadersClass extends Or<typeof Headers, typeof globalThis.Headers> {
|
|
55
|
+
new (init?: HeadersInit): _Headers;
|
|
56
|
+
}
|
|
57
|
+
interface _Headers extends Or<Headers, globalThis.Headers> {}
|
|
58
|
+
declare const _Headers: HeadersClass;
|
|
59
|
+
interface FormDataClass extends Or<typeof FormData, typeof globalThis.FormData> {}
|
|
60
|
+
interface _FormData
|
|
61
|
+
extends Or<FormData & _Iterable<[string, FormDataEntryValue]>, globalThis.FormData> {}
|
|
62
|
+
declare const _FormData: FormDataClass;
|
|
63
|
+
|
|
64
|
+
declare function _fetch(
|
|
65
|
+
input: string | _URL | _Request,
|
|
66
|
+
requestInit?: _RequestInit
|
|
67
|
+
): Promise<_Response>;
|
|
68
|
+
|
|
69
|
+
export {
|
|
70
|
+
_Blob as Blob,
|
|
71
|
+
type BodyInit,
|
|
72
|
+
_File as File,
|
|
73
|
+
_FormData as FormData,
|
|
74
|
+
type FormDataEntryValue,
|
|
75
|
+
_Headers as Headers,
|
|
76
|
+
type HeadersInit,
|
|
77
|
+
_Request as Request,
|
|
78
|
+
type RequestInfo,
|
|
79
|
+
type _RequestInit as RequestInit,
|
|
80
|
+
_Response as Response,
|
|
81
|
+
type _ResponseInit as ResponseInit,
|
|
82
|
+
_URL as URL,
|
|
83
|
+
_URLSearchParams as URLSearchParams,
|
|
84
|
+
_fetch as default,
|
|
85
|
+
_fetch as fetch,
|
|
86
|
+
};
|
package/dist/minifetch.js
CHANGED
|
@@ -16,6 +16,8 @@ var a = require("node:crypto");
|
|
|
16
16
|
|
|
17
17
|
var s = require("node:zlib");
|
|
18
18
|
|
|
19
|
+
var i = require("node:buffer");
|
|
20
|
+
|
|
19
21
|
function _interopNamespaceDefault(e) {
|
|
20
22
|
var t = Object.create(null);
|
|
21
23
|
if (e) {
|
|
@@ -35,17 +37,19 @@ function _interopNamespaceDefault(e) {
|
|
|
35
37
|
return t;
|
|
36
38
|
}
|
|
37
39
|
|
|
38
|
-
var
|
|
40
|
+
var f = _interopNamespaceDefault(t);
|
|
41
|
+
|
|
42
|
+
var l = _interopNamespaceDefault(r);
|
|
39
43
|
|
|
40
|
-
var
|
|
44
|
+
var u = _interopNamespaceDefault(n);
|
|
41
45
|
|
|
42
|
-
var
|
|
46
|
+
var c = _interopNamespaceDefault(s);
|
|
43
47
|
|
|
44
|
-
var
|
|
48
|
+
var d = _interopNamespaceDefault(i);
|
|
45
49
|
|
|
46
|
-
var
|
|
50
|
+
var p = "\r\n";
|
|
47
51
|
|
|
48
|
-
var
|
|
52
|
+
var y = "-".repeat(2);
|
|
49
53
|
|
|
50
54
|
var isBlob = e => {
|
|
51
55
|
if ("object" == typeof e && "function" == typeof e.arrayBuffer && "string" == typeof e.type && "function" == typeof e.stream && "function" == typeof e.constructor) {
|
|
@@ -57,18 +61,18 @@ var isBlob = e => {
|
|
|
57
61
|
};
|
|
58
62
|
|
|
59
63
|
var getFormHeader = (e, t, r) => {
|
|
60
|
-
var n = `${
|
|
64
|
+
var n = `${y}${e}${p}`;
|
|
61
65
|
n += `Content-Disposition: form-data; name="${t}"`;
|
|
62
66
|
if (isBlob(r)) {
|
|
63
|
-
n += `; filename="${r.name ?? "blob"}"${
|
|
67
|
+
n += `; filename="${r.name ?? "blob"}"${p}`;
|
|
64
68
|
n += `Content-Type: ${r.type || "application/octet-stream"}`;
|
|
65
69
|
}
|
|
66
|
-
return `${n}${
|
|
70
|
+
return `${n}${p}${p}`;
|
|
67
71
|
};
|
|
68
72
|
|
|
69
|
-
var getFormFooter = e => `${
|
|
73
|
+
var getFormFooter = e => `${y}${e}${y}${p}${p}`;
|
|
70
74
|
|
|
71
|
-
var
|
|
75
|
+
var h = new TextEncoder;
|
|
72
76
|
|
|
73
77
|
var extractBody = t => {
|
|
74
78
|
var r = null;
|
|
@@ -78,12 +82,12 @@ var extractBody = t => {
|
|
|
78
82
|
n = null;
|
|
79
83
|
s = 0;
|
|
80
84
|
} else if ("string" == typeof t) {
|
|
81
|
-
var i =
|
|
85
|
+
var i = h.encode(`${t}`);
|
|
82
86
|
r = "text/plain;charset=UTF-8";
|
|
83
87
|
s = i.byteLength;
|
|
84
88
|
n = i;
|
|
85
89
|
} else if ((e => "object" == typeof e && "function" == typeof e.append && "function" == typeof e.delete && "function" == typeof e.get && "function" == typeof e.getAll && "function" == typeof e.has && "function" == typeof e.set && "function" == typeof e.sort && "URLSearchParams" === e[Symbol.toStringTag])(t)) {
|
|
86
|
-
var f =
|
|
90
|
+
var f = h.encode(t.toString());
|
|
87
91
|
n = f;
|
|
88
92
|
s = f.byteLength;
|
|
89
93
|
r = "application/x-www-form-urlencoded;charset=UTF-8";
|
|
@@ -105,28 +109,28 @@ var extractBody = t => {
|
|
|
105
109
|
} else if ((e => "object" == typeof e && "function" == typeof e.getReader && "function" == typeof e.cancel && "function" == typeof e.tee)(t)) {
|
|
106
110
|
n = t;
|
|
107
111
|
} else if ((e => "object" == typeof e && "function" == typeof e.append && "function" == typeof e.set && "function" == typeof e.get && "function" == typeof e.getAll && "function" == typeof e.delete && "function" == typeof e.keys && "function" == typeof e.values && "function" == typeof e.entries && "function" == typeof e.constructor && "FormData" === e[Symbol.toStringTag])(t)) {
|
|
108
|
-
var
|
|
109
|
-
r = `multipart/form-data; boundary=${
|
|
112
|
+
var c = `formdata-${a.randomBytes(8).toString("hex")}`;
|
|
113
|
+
r = `multipart/form-data; boundary=${c}`;
|
|
110
114
|
s = ((e, t) => {
|
|
111
115
|
var r = Buffer.byteLength(getFormFooter(t));
|
|
112
116
|
for (var [n, o] of e) {
|
|
113
117
|
r += Buffer.byteLength(getFormHeader(t, n, o)) + (isBlob(o) ? o.size : Buffer.byteLength(`${o}`)) + 2;
|
|
114
118
|
}
|
|
115
119
|
return r;
|
|
116
|
-
})(t,
|
|
120
|
+
})(t, c);
|
|
117
121
|
n = e.Readable.from(async function* generatorOfFormData(e, t) {
|
|
118
122
|
var r = new TextEncoder;
|
|
119
123
|
for (var [n, o] of e) {
|
|
120
124
|
if (isBlob(o)) {
|
|
121
125
|
yield r.encode(getFormHeader(t, n, o));
|
|
122
126
|
yield* o.stream();
|
|
123
|
-
yield r.encode(
|
|
127
|
+
yield r.encode(p);
|
|
124
128
|
} else {
|
|
125
|
-
yield r.encode(getFormHeader(t, n, o) + o +
|
|
129
|
+
yield r.encode(getFormHeader(t, n, o) + o + p);
|
|
126
130
|
}
|
|
127
131
|
}
|
|
128
132
|
yield r.encode(getFormFooter(t));
|
|
129
|
-
}(t,
|
|
133
|
+
}(t, c));
|
|
130
134
|
} else if ((t => "function" == typeof t.getBoundary && "function" == typeof t.hasKnownLength && "function" == typeof t.getLengthSync && e.Readable.isReadable(t))(t)) {
|
|
131
135
|
r = `multipart/form-data; boundary=${t.getBoundary()}`;
|
|
132
136
|
s = t.hasKnownLength() ? t.getLengthSync() : null;
|
|
@@ -136,10 +140,10 @@ var extractBody = t => {
|
|
|
136
140
|
} else if ((e => "function" == typeof e[Symbol.asyncIterator] || "function" == typeof e[Symbol.iterator])(t)) {
|
|
137
141
|
n = e.Readable.from(t);
|
|
138
142
|
} else {
|
|
139
|
-
var
|
|
143
|
+
var d = h.encode(`${t}`);
|
|
140
144
|
r = "text/plain;charset=UTF-8";
|
|
141
|
-
n =
|
|
142
|
-
s =
|
|
145
|
+
n = d;
|
|
146
|
+
s = d.byteLength;
|
|
143
147
|
}
|
|
144
148
|
return {
|
|
145
149
|
contentLength: s,
|
|
@@ -159,7 +163,7 @@ class InflateStream extends e.Transform {
|
|
|
159
163
|
r();
|
|
160
164
|
return;
|
|
161
165
|
}
|
|
162
|
-
this._inflate = 8 == (15 & e[0]) ?
|
|
166
|
+
this._inflate = 8 == (15 & e[0]) ? c.createInflate(this._opts) : c.createInflateRaw(this._opts);
|
|
163
167
|
this._inflate.on("data", this.push.bind(this));
|
|
164
168
|
this._inflate.on("end", (() => this.push(null)));
|
|
165
169
|
this._inflate.on("error", (e => this.destroy(e)));
|
|
@@ -175,6 +179,26 @@ class InflateStream extends e.Transform {
|
|
|
175
179
|
}
|
|
176
180
|
}
|
|
177
181
|
|
|
182
|
+
var v = globalThis.File || d.File;
|
|
183
|
+
|
|
184
|
+
if (void 0 === globalThis.File) {
|
|
185
|
+
globalThis.File = v;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
var b = Blob;
|
|
189
|
+
|
|
190
|
+
var m = URLSearchParams;
|
|
191
|
+
|
|
192
|
+
var g = URL;
|
|
193
|
+
|
|
194
|
+
var w = Request;
|
|
195
|
+
|
|
196
|
+
var L = Response;
|
|
197
|
+
|
|
198
|
+
var T = Headers;
|
|
199
|
+
|
|
200
|
+
var _ = FormData;
|
|
201
|
+
|
|
178
202
|
var headersOfRawHeaders = e => {
|
|
179
203
|
var t = new Headers;
|
|
180
204
|
for (var r = 0; r < e.length; r += 2) {
|
|
@@ -196,23 +220,23 @@ var methodToHttpOption = e => {
|
|
|
196
220
|
};
|
|
197
221
|
|
|
198
222
|
var urlToHttpOptions = e => {
|
|
199
|
-
var t = new
|
|
223
|
+
var t = new g(e);
|
|
200
224
|
switch (t.protocol) {
|
|
201
225
|
case "http:":
|
|
202
226
|
case "https:":
|
|
203
|
-
return
|
|
227
|
+
return u.urlToHttpOptions(t);
|
|
204
228
|
|
|
205
229
|
default:
|
|
206
230
|
throw new TypeError(`URL scheme "${t.protocol}" is not supported.`);
|
|
207
231
|
}
|
|
208
232
|
};
|
|
209
233
|
|
|
210
|
-
async function
|
|
234
|
+
async function _fetch(t, r) {
|
|
211
235
|
var n = (e => null != e && "object" == typeof e && "body" in e)(t);
|
|
212
236
|
var o = n ? t.url : t;
|
|
213
237
|
var a = n ? t.body : r?.body || null;
|
|
214
238
|
var s = n ? t.signal : r?.signal || void 0;
|
|
215
|
-
var
|
|
239
|
+
var i = (e => {
|
|
216
240
|
switch (e) {
|
|
217
241
|
case "follow":
|
|
218
242
|
case "manual":
|
|
@@ -226,42 +250,42 @@ async function fetch(t, r) {
|
|
|
226
250
|
throw new TypeError(`Request constructor: ${e} is not an accepted type. Expected one of follow, manual, error.`);
|
|
227
251
|
}
|
|
228
252
|
})(n ? t.redirect : r?.redirect);
|
|
229
|
-
var
|
|
253
|
+
var u = new g(o);
|
|
230
254
|
var d = extractBody(a);
|
|
231
255
|
var p = 0;
|
|
232
256
|
var y = new Headers(r?.headers || (n ? t.headers : void 0));
|
|
233
257
|
var h = {
|
|
234
|
-
...urlToHttpOptions(
|
|
258
|
+
...urlToHttpOptions(u),
|
|
235
259
|
method: methodToHttpOption(n ? t.method : r?.method),
|
|
236
260
|
signal: s
|
|
237
261
|
};
|
|
238
|
-
return await new Promise((function
|
|
262
|
+
return await new Promise((function _call(t, r) {
|
|
239
263
|
var n = h.method;
|
|
240
|
-
var o = ("https:" === h.protocol ?
|
|
264
|
+
var o = ("https:" === h.protocol ? f : l).request(h);
|
|
241
265
|
o.on("response", (o => {
|
|
242
266
|
o.setTimeout(0);
|
|
243
|
-
var
|
|
267
|
+
var f = {
|
|
244
268
|
status: o.statusCode,
|
|
245
269
|
statusText: o.statusMessage,
|
|
246
270
|
headers: headersOfRawHeaders(o.rawHeaders)
|
|
247
271
|
};
|
|
248
|
-
if (301 === (b =
|
|
249
|
-
var
|
|
250
|
-
var v = null !=
|
|
251
|
-
if ("error" ===
|
|
272
|
+
if (301 === (b = f.status) || 302 === b || 303 === b || 307 === b || 308 === b) {
|
|
273
|
+
var l = f.headers.get("Location");
|
|
274
|
+
var v = null != l ? new g(l, u) : null;
|
|
275
|
+
if ("error" === i) {
|
|
252
276
|
r(new Error("URI requested responds with a redirect, redirect mode is set to error"));
|
|
253
277
|
return;
|
|
254
|
-
} else if ("manual" ===
|
|
255
|
-
|
|
256
|
-
} else if ("follow" ===
|
|
278
|
+
} else if ("manual" === i && null !== v) {
|
|
279
|
+
f.headers.set("Location", v.toString());
|
|
280
|
+
} else if ("follow" === i && null !== v) {
|
|
257
281
|
if (++p > 20) {
|
|
258
|
-
r(new Error(`maximum redirect reached at: ${
|
|
282
|
+
r(new Error(`maximum redirect reached at: ${u}`));
|
|
259
283
|
return;
|
|
260
284
|
} else if ("http:" !== v.protocol && "https:" !== v.protocol) {
|
|
261
285
|
r(new Error("URL scheme must be a HTTP(S) scheme"));
|
|
262
286
|
return;
|
|
263
287
|
}
|
|
264
|
-
if (303 ===
|
|
288
|
+
if (303 === f.status || (301 === f.status || 302 === f.status) && "POST" === n) {
|
|
265
289
|
d = extractBody(null);
|
|
266
290
|
h.method = "GET";
|
|
267
291
|
y.delete("Content-Length");
|
|
@@ -271,8 +295,8 @@ async function fetch(t, r) {
|
|
|
271
295
|
} else {
|
|
272
296
|
d = extractBody(a);
|
|
273
297
|
}
|
|
274
|
-
Object.assign(h, urlToHttpOptions(
|
|
275
|
-
return
|
|
298
|
+
Object.assign(h, urlToHttpOptions(u = v));
|
|
299
|
+
return _call(t, r);
|
|
276
300
|
}
|
|
277
301
|
}
|
|
278
302
|
var b;
|
|
@@ -284,41 +308,41 @@ async function fetch(t, r) {
|
|
|
284
308
|
}
|
|
285
309
|
};
|
|
286
310
|
s?.addEventListener("abort", destroy);
|
|
287
|
-
var
|
|
288
|
-
var
|
|
289
|
-
if ("HEAD" === n || 204 ===
|
|
290
|
-
|
|
291
|
-
} else if (null !=
|
|
292
|
-
|
|
293
|
-
|
|
311
|
+
var m = o;
|
|
312
|
+
var w = f.headers.get("Content-Encoding")?.toLowerCase();
|
|
313
|
+
if ("HEAD" === n || 204 === f.status || 304 === f.status) {
|
|
314
|
+
m = null;
|
|
315
|
+
} else if (null != w) {
|
|
316
|
+
f.headers.set("Content-Encoding", w);
|
|
317
|
+
m = e.pipeline(m, (t => {
|
|
294
318
|
switch (t) {
|
|
295
319
|
case "br":
|
|
296
|
-
return
|
|
297
|
-
flush:
|
|
298
|
-
finishFlush:
|
|
320
|
+
return c.createBrotliDecompress({
|
|
321
|
+
flush: c.constants.BROTLI_OPERATION_FLUSH,
|
|
322
|
+
finishFlush: c.constants.BROTLI_OPERATION_FLUSH
|
|
299
323
|
});
|
|
300
324
|
|
|
301
325
|
case "gzip":
|
|
302
326
|
case "x-gzip":
|
|
303
|
-
return
|
|
304
|
-
flush:
|
|
305
|
-
finishFlush:
|
|
327
|
+
return c.createGunzip({
|
|
328
|
+
flush: c.constants.Z_SYNC_FLUSH,
|
|
329
|
+
finishFlush: c.constants.Z_SYNC_FLUSH
|
|
306
330
|
});
|
|
307
331
|
|
|
308
332
|
case "deflate":
|
|
309
333
|
case "x-deflate":
|
|
310
334
|
return new InflateStream({
|
|
311
|
-
flush:
|
|
312
|
-
finishFlush:
|
|
335
|
+
flush: c.constants.Z_SYNC_FLUSH,
|
|
336
|
+
finishFlush: c.constants.Z_SYNC_FLUSH
|
|
313
337
|
});
|
|
314
338
|
|
|
315
339
|
default:
|
|
316
340
|
return new e.PassThrough;
|
|
317
341
|
}
|
|
318
|
-
})(
|
|
342
|
+
})(w), destroy);
|
|
319
343
|
}
|
|
320
344
|
t(function createResponse(e, t, r) {
|
|
321
|
-
var n = new
|
|
345
|
+
var n = new L(e, t);
|
|
322
346
|
Object.defineProperty(n, "url", {
|
|
323
347
|
value: r.url
|
|
324
348
|
});
|
|
@@ -333,9 +357,9 @@ async function fetch(t, r) {
|
|
|
333
357
|
});
|
|
334
358
|
}
|
|
335
359
|
return n;
|
|
336
|
-
}(
|
|
360
|
+
}(m, f, {
|
|
337
361
|
type: "default",
|
|
338
|
-
url:
|
|
362
|
+
url: u.toString(),
|
|
339
363
|
redirected: p > 0
|
|
340
364
|
}));
|
|
341
365
|
}));
|
|
@@ -376,7 +400,23 @@ async function fetch(t, r) {
|
|
|
376
400
|
}));
|
|
377
401
|
}
|
|
378
402
|
|
|
379
|
-
exports.
|
|
403
|
+
exports.Blob = b;
|
|
404
|
+
|
|
405
|
+
exports.File = v;
|
|
406
|
+
|
|
407
|
+
exports.FormData = _;
|
|
408
|
+
|
|
409
|
+
exports.Headers = T;
|
|
410
|
+
|
|
411
|
+
exports.Request = w;
|
|
412
|
+
|
|
413
|
+
exports.Response = L;
|
|
414
|
+
|
|
415
|
+
exports.URL = g;
|
|
416
|
+
|
|
417
|
+
exports.URLSearchParams = m;
|
|
418
|
+
|
|
419
|
+
exports.default = _fetch;
|
|
380
420
|
|
|
381
|
-
exports.fetch =
|
|
421
|
+
exports.fetch = _fetch;
|
|
382
422
|
//# sourceMappingURL=minifetch.js.map
|
package/dist/minifetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minifetch.js","sources":["../src/body.ts","../src/encoding.ts","../src/fetch.ts"],"sourcesContent":["import { Readable } from 'node:stream';\nimport { isAnyArrayBuffer } from 'node:util/types';\nimport { randomBytes } from 'node:crypto';\n\nexport type BodyInit =\n | Exclude<RequestInit['body'], undefined | null>\n | FormDataPolyfill\n | Readable;\n\nexport interface BodyState {\n contentLength: number | null;\n contentType: string | null;\n body: Readable | ReadableStream | Uint8Array | null;\n}\n\ninterface FormDataPolyfill extends Readable {\n getBoundary(): string;\n getLengthSync(): number;\n hasKnownLength(): number;\n}\n\nconst CRLF = '\\r\\n';\nconst CRLF_LENGTH = 2;\nconst BOUNDARY = '-'.repeat(2);\n\nconst isReadable = (object: any): object is Readable =>\n Readable.isReadable(object);\n\nconst isIterable = (\n object: any\n): object is AsyncIterable<any> | Iterable<any> =>\n typeof object[Symbol.asyncIterator] === 'function' ||\n typeof object[Symbol.iterator] === 'function';\n\nconst isMultipartFormDataStream = (object: any): object is FormDataPolyfill =>\n typeof object.getBoundary === 'function' &&\n typeof object.hasKnownLength === 'function' &&\n typeof object.getLengthSync === 'function' &&\n Readable.isReadable(object);\n\nconst isFormData = (object: any): object is FormData =>\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.set === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.keys === 'function' &&\n typeof object.values === 'function' &&\n typeof object.entries === 'function' &&\n typeof object.constructor === 'function' &&\n object[Symbol.toStringTag] === 'FormData';\n\nconst isURLSearchParameters = (object: any): object is URLSearchParams =>\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.has === 'function' &&\n typeof object.set === 'function' &&\n typeof object.sort === 'function' &&\n object[Symbol.toStringTag] === 'URLSearchParams';\n\nconst isReadableStream = (object: any): object is ReadableStream =>\n typeof object === 'object' &&\n typeof object.getReader === 'function' &&\n typeof object.cancel === 'function' &&\n typeof object.tee === 'function';\n\nconst isBlob = (object: any): object is Blob => {\n if (\n typeof object === 'object' &&\n typeof object.arrayBuffer === 'function' &&\n typeof object.type === 'string' &&\n typeof object.stream === 'function' &&\n typeof object.constructor === 'function'\n ) {\n const tag = object[Symbol.toStringTag];\n return tag.startsWith('Blob') || tag.startsWith('File');\n } else {\n return false;\n }\n};\n\nconst makeFormBoundary = (): string =>\n `formdata-${randomBytes(8).toString('hex')}`;\n\nconst getFormHeader = (\n boundary: string,\n name: string,\n field: File | Blob | string\n): string => {\n let header = `${BOUNDARY}${boundary}${CRLF}`;\n header += `Content-Disposition: form-data; name=\"${name}\"`;\n if (isBlob(field)) {\n header += `; filename=\"${(field as File).name ?? 'blob'}\"${CRLF}`;\n header += `Content-Type: ${field.type || 'application/octet-stream'}`;\n }\n return `${header}${CRLF}${CRLF}`;\n};\n\nconst getFormFooter = (boundary: string) =>\n `${BOUNDARY}${boundary}${BOUNDARY}${CRLF}${CRLF}`;\n\nexport const getFormDataLength = (form: FormData, boundary: string) => {\n let length = Buffer.byteLength(getFormFooter(boundary));\n for (const [name, value] of form)\n length +=\n Buffer.byteLength(getFormHeader(boundary, name, value)) +\n (isBlob(value) ? value.size : Buffer.byteLength(`${value}`)) +\n CRLF_LENGTH;\n return length;\n};\n\nasync function* generatorOfFormData(\n form: FormData,\n boundary: string\n): AsyncGenerator<ArrayBufferLike> {\n const encoder = new TextEncoder();\n for (const [name, value] of form) {\n if (isBlob(value)) {\n yield encoder.encode(getFormHeader(boundary, name, value));\n yield* value.stream();\n yield encoder.encode(CRLF);\n } else {\n yield encoder.encode(getFormHeader(boundary, name, value) + value + CRLF);\n }\n }\n yield encoder.encode(getFormFooter(boundary));\n}\n\nconst encoder = new TextEncoder();\n\nexport const extractBody = (object: BodyInit | null): BodyState => {\n let type: string | null = null;\n let body: Readable | ReadableStream | Uint8Array | null;\n let size: number | null = null;\n if (object == null) {\n body = null;\n size = 0;\n } else if (typeof object === 'string') {\n const bytes = encoder.encode(`${object}`);\n type = 'text/plain;charset=UTF-8';\n size = bytes.byteLength;\n body = bytes;\n } else if (isURLSearchParameters(object)) {\n const bytes = encoder.encode(object.toString());\n body = bytes;\n size = bytes.byteLength;\n type = 'application/x-www-form-urlencoded;charset=UTF-8';\n } else if (isBlob(object)) {\n size = object.size;\n type = object.type || null;\n body = object.stream();\n } else if (object instanceof Uint8Array) {\n body = object;\n size = object.byteLength;\n } else if (isAnyArrayBuffer(object)) {\n const bytes = new Uint8Array(object);\n body = bytes;\n size = bytes.byteLength;\n } else if (ArrayBuffer.isView(object)) {\n const bytes = new Uint8Array(\n object.buffer,\n object.byteOffset,\n object.byteLength\n );\n body = bytes;\n size = bytes.byteLength;\n } else if (isReadableStream(object)) {\n body = object;\n } else if (isFormData(object)) {\n const boundary = makeFormBoundary();\n type = `multipart/form-data; boundary=${boundary}`;\n size = getFormDataLength(object, boundary);\n body = Readable.from(generatorOfFormData(object, boundary));\n } else if (isMultipartFormDataStream(object)) {\n type = `multipart/form-data; boundary=${object.getBoundary()}`;\n size = object.hasKnownLength() ? object.getLengthSync() : null;\n body = object as Readable;\n } else if (isReadable(object)) {\n body = object as Readable;\n } else if (isIterable(object)) {\n body = Readable.from(object);\n } else {\n const bytes = encoder.encode(`${object}`);\n type = 'text/plain;charset=UTF-8';\n body = bytes;\n size = bytes.byteLength;\n }\n return {\n contentLength: size,\n contentType: type,\n body,\n };\n};\n","import { PassThrough, Transform, TransformCallback } from 'node:stream';\nimport * as zlib from 'node:zlib';\n\n/** @see https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2 */\ntype Encoding = 'gzip' | 'x-gzip' | 'deflate' | 'x-deflate' | 'br' | {};\n\n/** @see https://github.com/nodejs/undici/pull/2650 */\nclass InflateStream extends Transform {\n _opts?: zlib.ZlibOptions;\n _inflate?: Transform;\n\n constructor(opts?: zlib.ZlibOptions) {\n super();\n this._opts = opts;\n }\n\n _transform(\n chunk: Buffer,\n encoding: BufferEncoding,\n callback: TransformCallback\n ) {\n if (!this._inflate) {\n if (chunk.length === 0) {\n callback();\n return;\n }\n this._inflate =\n (chunk[0] & 0x0f) === 0x08\n ? zlib.createInflate(this._opts)\n : zlib.createInflateRaw(this._opts);\n this._inflate.on('data', this.push.bind(this));\n this._inflate.on('end', () => this.push(null));\n this._inflate.on('error', err => this.destroy(err));\n }\n this._inflate.write(chunk, encoding, callback);\n }\n\n _final(callback: TransformCallback) {\n if (this._inflate) {\n this._inflate.end();\n this._inflate = undefined;\n }\n callback();\n }\n}\n\nexport const createContentDecoder = (encoding: Encoding | {}) => {\n // See: https://github.com/nodejs/undici/blob/008187b/lib/web/fetch/index.js#L2138-L2160\n switch (encoding) {\n case 'br':\n return zlib.createBrotliDecompress({\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH,\n });\n case 'gzip':\n case 'x-gzip':\n return zlib.createGunzip({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n case 'deflate':\n case 'x-deflate':\n return new InflateStream({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n default:\n return new PassThrough();\n }\n};\n","import { Stream, Readable, pipeline } from 'node:stream';\nimport * as https from 'node:https';\nimport * as http from 'node:http';\nimport * as url from 'node:url';\n\nimport { extractBody } from './body';\nimport { createContentDecoder } from './encoding';\n\n/** Maximum allowed redirects (matching Chromium's limit) */\nconst MAX_REDIRECTS = 20;\n\n/** Convert Node.js raw headers array to Headers */\nconst headersOfRawHeaders = (rawHeaders: readonly string[]): Headers => {\n const headers = new Headers();\n for (let i = 0; i < rawHeaders.length; i += 2)\n headers.set(rawHeaders[i], rawHeaders[i + 1]);\n return headers;\n};\n\n/** Assign Headers to a Node.js OutgoingMessage (request) */\nconst assignOutgoingMessageHeaders = (\n outgoing: http.OutgoingMessage,\n headers: Headers\n) => {\n if (typeof outgoing.setHeaders === 'function') {\n outgoing.setHeaders(headers);\n } else {\n for (const [key, value] of headers) outgoing.setHeader(key, value);\n }\n};\n\n/** Normalize methods and disallow special methods */\nconst toRedirectOption = (\n redirect: string | undefined\n): 'follow' | 'manual' | 'error' => {\n switch (redirect) {\n case 'follow':\n case 'manual':\n case 'error':\n return redirect;\n case undefined:\n return 'follow';\n default:\n throw new TypeError(\n `Request constructor: ${redirect} is not an accepted type. Expected one of follow, manual, error.`\n );\n }\n};\n\n/** Normalize methods and disallow special methods */\nconst methodToHttpOption = (method: string | undefined): string => {\n switch (method) {\n case 'CONNECT':\n case 'TRACE':\n case 'TRACK':\n throw new TypeError(\n `Failed to construct 'Request': '${method}' HTTP method is unsupported.`\n );\n default:\n return method ? method.toUpperCase() : 'GET';\n }\n};\n\n/** Convert URL to Node.js HTTP request options and disallow unsupported protocols */\nconst urlToHttpOptions = (input: URL) => {\n const _url = new URL(input);\n switch (_url.protocol) {\n // TODO: 'file:' and 'data:' support\n case 'http:':\n case 'https:':\n return url.urlToHttpOptions(_url);\n default:\n throw new TypeError(`URL scheme \"${_url.protocol}\" is not supported.`);\n }\n};\n\n/** Returns if `input` is a Request object */\nconst isRequest = (input: any): input is Request =>\n input != null && typeof input === 'object' && 'body' in input;\n\n/** Returns if status `code` is a redirect code */\nconst isRedirectCode = (\n code: number | undefined\n): code is 301 | 302 | 303 | 307 | 308 =>\n code === 301 || code === 302 || code === 303 || code === 307 || code === 308;\n\nfunction createResponse(\n body: ConstructorParameters<typeof Response>[0] | null,\n init: ResponseInit,\n params: {\n url: string;\n redirected: boolean;\n type: 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect';\n }\n) {\n const response = new Response(body, init);\n Object.defineProperty(response, 'url', { value: params.url });\n if (params.type !== 'default')\n Object.defineProperty(response, 'type', { value: params.type });\n if (params.redirected)\n Object.defineProperty(response, 'redirected', { value: params.redirected });\n return response;\n}\n\nexport async function fetch(\n input: string | URL | Request,\n requestInit?: RequestInit\n): Promise<Response> {\n const initFromRequest = isRequest(input);\n const initUrl = initFromRequest ? input.url : input;\n const initBody = initFromRequest ? input.body : requestInit?.body || null;\n const signal = initFromRequest\n ? input.signal\n : requestInit?.signal || undefined;\n const redirect = toRedirectOption(\n initFromRequest ? input.redirect : requestInit?.redirect\n );\n\n let requestUrl = new URL(initUrl);\n let requestBody = extractBody(initBody);\n let redirects = 0;\n\n const requestHeaders = new Headers(\n requestInit?.headers || (initFromRequest ? input.headers : undefined)\n );\n const requestOptions = {\n ...urlToHttpOptions(requestUrl),\n method: methodToHttpOption(\n initFromRequest ? input.method : requestInit?.method\n ),\n signal,\n } satisfies http.RequestOptions;\n\n function _fetch(\n resolve: (response: Response | Promise<Response>) => void,\n reject: (reason?: any) => void\n ) {\n const method = requestOptions.method;\n const protocol = requestOptions.protocol === 'https:' ? https : http;\n const outgoing = protocol.request(requestOptions);\n\n outgoing.on('response', incoming => {\n incoming.setTimeout(0); // Forcefully disable timeout\n\n const init = {\n status: incoming.statusCode,\n statusText: incoming.statusMessage,\n headers: headersOfRawHeaders(incoming.rawHeaders),\n } satisfies ResponseInit;\n\n if (isRedirectCode(init.status)) {\n const location = init.headers.get('Location');\n const locationURL =\n location != null ? new URL(location, requestUrl) : null;\n if (redirect === 'error') {\n // TODO: do we need a special Error instance here?\n reject(\n new Error(\n 'URI requested responds with a redirect, redirect mode is set to error'\n )\n );\n return;\n } else if (redirect === 'manual' && locationURL !== null) {\n init.headers.set('Location', locationURL.toString());\n } else if (redirect === 'follow' && locationURL !== null) {\n if (++redirects > MAX_REDIRECTS) {\n reject(new Error(`maximum redirect reached at: ${requestUrl}`));\n return;\n } else if (\n locationURL.protocol !== 'http:' &&\n locationURL.protocol !== 'https:'\n ) {\n // TODO: do we need a special Error instance here?\n reject(new Error('URL scheme must be a HTTP(S) scheme'));\n return;\n }\n\n if (\n init.status === 303 ||\n ((init.status === 301 || init.status === 302) && method === 'POST')\n ) {\n requestBody = extractBody(null);\n requestOptions.method = 'GET';\n requestHeaders.delete('Content-Length');\n } else if (\n requestBody.body != null &&\n requestBody.contentLength == null\n ) {\n reject(new Error('Cannot follow redirect with a streamed body'));\n return;\n } else {\n requestBody = extractBody(initBody);\n }\n\n Object.assign(\n requestOptions,\n urlToHttpOptions((requestUrl = locationURL))\n );\n return _fetch(resolve, reject);\n }\n }\n\n const destroy = (reason?: any) => {\n signal?.removeEventListener('abort', destroy);\n if (reason) {\n incoming.destroy(signal?.aborted ? signal.reason : reason);\n reject(signal?.aborted ? signal.reason : reason);\n }\n };\n\n signal?.addEventListener('abort', destroy);\n\n let body: Readable | null = incoming;\n const encoding = init.headers.get('Content-Encoding')?.toLowerCase();\n if (method === 'HEAD' || init.status === 204 || init.status === 304) {\n body = null;\n } else if (encoding != null) {\n init.headers.set('Content-Encoding', encoding);\n body = pipeline(body, createContentDecoder(encoding), destroy);\n }\n\n resolve(\n createResponse(body, init, {\n type: 'default',\n url: requestUrl.toString(),\n redirected: redirects > 0,\n })\n );\n });\n\n outgoing.on('error', reject);\n\n if (!requestHeaders.has('Accept')) requestHeaders.set('Accept', '*/*');\n if (requestBody.contentType)\n requestHeaders.set('Content-Type', requestBody.contentType);\n\n if (requestBody.body == null && (method === 'POST' || method === 'PUT')) {\n requestHeaders.set('Content-Length', '0');\n } else if (requestBody.body != null && requestBody.contentLength != null) {\n requestHeaders.set('Content-Length', `${requestBody.contentLength}`);\n }\n\n assignOutgoingMessageHeaders(outgoing, requestHeaders);\n\n if (requestBody.body == null) {\n outgoing.end();\n } else if (requestBody.body instanceof Uint8Array) {\n outgoing.write(requestBody.body);\n outgoing.end();\n } else {\n const body =\n requestBody.body instanceof Stream\n ? requestBody.body\n : Readable.fromWeb(requestBody.body);\n pipeline(body, outgoing, error => {\n if (error) reject(error);\n });\n }\n }\n\n return await new Promise(_fetch);\n}\n"],"names":["CRLF","BOUNDARY","repeat","isBlob","object","arrayBuffer","type","stream","constructor","tag","Symbol","toStringTag","startsWith","getFormHeader","boundary","name","field","header","getFormFooter","encoder","TextEncoder","extractBody","body","size","bytes","encode","byteLength","append","delete","get","getAll","has","set","sort","isURLSearchParameters","toString","Uint8Array","isAnyArrayBuffer","ArrayBuffer","isView","buffer","byteOffset","getReader","cancel","tee","isReadableStream","keys","values","entries","isFormData","randomBytes","getFormDataLength","form","length","Buffer","value","Readable","from","async","generatorOfFormData","getBoundary","hasKnownLength","getLengthSync","isReadable","isMultipartFormDataStream","asyncIterator","iterator","isIterable","contentLength","contentType","InflateStream","Transform","opts","super","this","_opts","_transform","chunk","encoding","callback","_inflate","zlib","createInflate","createInflateRaw","on","push","bind","err","destroy","write","_final","end","undefined","headersOfRawHeaders","rawHeaders","headers","Headers","i","methodToHttpOption","method","TypeError","toUpperCase","urlToHttpOptions","input","_url","URL","protocol","url","fetch","requestInit","initFromRequest","isRequest","initUrl","initBody","signal","redirect","toRedirectOption","requestUrl","requestBody","redirects","requestHeaders","requestOptions","Promise","_fetch","resolve","reject","outgoing","https","http","request","incoming","setTimeout","init","status","statusCode","statusText","statusMessage","code","location","locationURL","Error","Object","assign","reason","removeEventListener","aborted","addEventListener","toLowerCase","pipeline","createBrotliDecompress","flush","constants","BROTLI_OPERATION_FLUSH","finishFlush","createGunzip","Z_SYNC_FLUSH","PassThrough","createContentDecoder","createResponse","params","response","Response","defineProperty","redirected","assignOutgoingMessageHeaders","setHeaders","key","setHeader","Stream","fromWeb","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"minifetch.js","sources":["../src/body.ts","../src/encoding.ts","../src/webstd.ts","../src/fetch.ts"],"sourcesContent":["import { Readable } from 'node:stream';\nimport { isAnyArrayBuffer } from 'node:util/types';\nimport { randomBytes } from 'node:crypto';\nimport { Blob, FormData, URLSearchParams } from './webstd';\n\nexport type BodyInit =\n | Exclude<RequestInit['body'], undefined | null>\n | FormDataPolyfill\n | Readable;\n\nexport interface BodyState {\n contentLength: number | null;\n contentType: string | null;\n body: Readable | ReadableStream | Uint8Array | null;\n}\n\ninterface FormDataPolyfill extends Readable {\n getBoundary(): string;\n getLengthSync(): number;\n hasKnownLength(): number;\n}\n\nconst CRLF = '\\r\\n';\nconst CRLF_LENGTH = 2;\nconst BOUNDARY = '-'.repeat(2);\n\nconst isReadable = (object: any): object is Readable =>\n Readable.isReadable(object);\n\nconst isIterable = (\n object: any\n): object is AsyncIterable<any> | Iterable<any> =>\n typeof object[Symbol.asyncIterator] === 'function' ||\n typeof object[Symbol.iterator] === 'function';\n\nconst isMultipartFormDataStream = (object: any): object is FormDataPolyfill =>\n typeof object.getBoundary === 'function' &&\n typeof object.hasKnownLength === 'function' &&\n typeof object.getLengthSync === 'function' &&\n Readable.isReadable(object);\n\nconst isFormData = (object: any): object is FormData =>\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.set === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.keys === 'function' &&\n typeof object.values === 'function' &&\n typeof object.entries === 'function' &&\n typeof object.constructor === 'function' &&\n object[Symbol.toStringTag] === 'FormData';\n\nconst isURLSearchParameters = (object: any): object is URLSearchParams =>\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.has === 'function' &&\n typeof object.set === 'function' &&\n typeof object.sort === 'function' &&\n object[Symbol.toStringTag] === 'URLSearchParams';\n\nconst isReadableStream = (object: any): object is ReadableStream =>\n typeof object === 'object' &&\n typeof object.getReader === 'function' &&\n typeof object.cancel === 'function' &&\n typeof object.tee === 'function';\n\nconst isBlob = (object: any): object is Blob => {\n if (\n typeof object === 'object' &&\n typeof object.arrayBuffer === 'function' &&\n typeof object.type === 'string' &&\n typeof object.stream === 'function' &&\n typeof object.constructor === 'function'\n ) {\n const tag = object[Symbol.toStringTag];\n return tag.startsWith('Blob') || tag.startsWith('File');\n } else {\n return false;\n }\n};\n\nconst makeFormBoundary = (): string =>\n `formdata-${randomBytes(8).toString('hex')}`;\n\nconst getFormHeader = (\n boundary: string,\n name: string,\n field: File | Blob | string\n): string => {\n let header = `${BOUNDARY}${boundary}${CRLF}`;\n header += `Content-Disposition: form-data; name=\"${name}\"`;\n if (isBlob(field)) {\n header += `; filename=\"${(field as File).name ?? 'blob'}\"${CRLF}`;\n header += `Content-Type: ${field.type || 'application/octet-stream'}`;\n }\n return `${header}${CRLF}${CRLF}`;\n};\n\nconst getFormFooter = (boundary: string) =>\n `${BOUNDARY}${boundary}${BOUNDARY}${CRLF}${CRLF}`;\n\nexport const getFormDataLength = (form: FormData, boundary: string) => {\n let length = Buffer.byteLength(getFormFooter(boundary));\n for (const [name, value] of form)\n length +=\n Buffer.byteLength(getFormHeader(boundary, name, value)) +\n (isBlob(value) ? value.size : Buffer.byteLength(`${value}`)) +\n CRLF_LENGTH;\n return length;\n};\n\nasync function* generatorOfFormData(\n form: FormData,\n boundary: string\n): AsyncGenerator<ArrayBufferLike> {\n const encoder = new TextEncoder();\n for (const [name, value] of form) {\n if (isBlob(value)) {\n yield encoder.encode(getFormHeader(boundary, name, value));\n yield* value.stream();\n yield encoder.encode(CRLF);\n } else {\n yield encoder.encode(getFormHeader(boundary, name, value) + value + CRLF);\n }\n }\n yield encoder.encode(getFormFooter(boundary));\n}\n\nconst encoder = new TextEncoder();\n\nexport const extractBody = (object: BodyInit | null): BodyState => {\n let type: string | null = null;\n let body: Readable | ReadableStream | Uint8Array | null;\n let size: number | null = null;\n if (object == null) {\n body = null;\n size = 0;\n } else if (typeof object === 'string') {\n const bytes = encoder.encode(`${object}`);\n type = 'text/plain;charset=UTF-8';\n size = bytes.byteLength;\n body = bytes;\n } else if (isURLSearchParameters(object)) {\n const bytes = encoder.encode(object.toString());\n body = bytes;\n size = bytes.byteLength;\n type = 'application/x-www-form-urlencoded;charset=UTF-8';\n } else if (isBlob(object)) {\n size = object.size;\n type = object.type || null;\n body = object.stream();\n } else if (object instanceof Uint8Array) {\n body = object;\n size = object.byteLength;\n } else if (isAnyArrayBuffer(object)) {\n const bytes = new Uint8Array(object);\n body = bytes;\n size = bytes.byteLength;\n } else if (ArrayBuffer.isView(object)) {\n const bytes = new Uint8Array(\n object.buffer,\n object.byteOffset,\n object.byteLength\n );\n body = bytes;\n size = bytes.byteLength;\n } else if (isReadableStream(object)) {\n body = object;\n } else if (isFormData(object)) {\n const boundary = makeFormBoundary();\n type = `multipart/form-data; boundary=${boundary}`;\n size = getFormDataLength(object, boundary);\n body = Readable.from(generatorOfFormData(object, boundary));\n } else if (isMultipartFormDataStream(object)) {\n type = `multipart/form-data; boundary=${object.getBoundary()}`;\n size = object.hasKnownLength() ? object.getLengthSync() : null;\n body = object as Readable;\n } else if (isReadable(object)) {\n body = object as Readable;\n } else if (isIterable(object)) {\n body = Readable.from(object);\n } else {\n const bytes = encoder.encode(`${object}`);\n type = 'text/plain;charset=UTF-8';\n body = bytes;\n size = bytes.byteLength;\n }\n return {\n contentLength: size,\n contentType: type,\n body,\n };\n};\n","import { PassThrough, Transform, TransformCallback } from 'node:stream';\nimport * as zlib from 'node:zlib';\n\n/** @see https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2 */\ntype Encoding = 'gzip' | 'x-gzip' | 'deflate' | 'x-deflate' | 'br' | {};\n\n/** @see https://github.com/nodejs/undici/pull/2650 */\nclass InflateStream extends Transform {\n _opts?: zlib.ZlibOptions;\n _inflate?: Transform;\n\n constructor(opts?: zlib.ZlibOptions) {\n super();\n this._opts = opts;\n }\n\n _transform(\n chunk: Buffer,\n encoding: BufferEncoding,\n callback: TransformCallback\n ) {\n if (!this._inflate) {\n if (chunk.length === 0) {\n callback();\n return;\n }\n this._inflate =\n (chunk[0] & 0x0f) === 0x08\n ? zlib.createInflate(this._opts)\n : zlib.createInflateRaw(this._opts);\n this._inflate.on('data', this.push.bind(this));\n this._inflate.on('end', () => this.push(null));\n this._inflate.on('error', err => this.destroy(err));\n }\n this._inflate.write(chunk, encoding, callback);\n }\n\n _final(callback: TransformCallback) {\n if (this._inflate) {\n this._inflate.end();\n this._inflate = undefined;\n }\n callback();\n }\n}\n\nexport const createContentDecoder = (encoding: Encoding | {}) => {\n // See: https://github.com/nodejs/undici/blob/008187b/lib/web/fetch/index.js#L2138-L2160\n switch (encoding) {\n case 'br':\n return zlib.createBrotliDecompress({\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH,\n });\n case 'gzip':\n case 'x-gzip':\n return zlib.createGunzip({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n case 'deflate':\n case 'x-deflate':\n return new InflateStream({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n default:\n return new PassThrough();\n }\n};\n","import * as buffer from 'node:buffer';\n\ntype Or<T, U> = void extends T ? U : T;\n\nexport type HeadersInit =\n | string[][]\n | Record<string, string | ReadonlyArray<string>>\n | _Headers;\n\nexport type FormDataEntryValue = string | _File;\n\nexport type RequestInfo = string | _URL | _Request;\n\ninterface _Iterable<T, TReturn = any, TNext = any>\n extends Or<\n Iterable<T, TReturn, TNext>,\n globalThis.Iterable<T, TReturn, TNext>\n > {}\ninterface _AsyncIterable<T, TReturn = any, TNext = any>\n extends Or<\n AsyncIterable<T, TReturn, TNext>,\n globalThis.AsyncIterable<T, TReturn, TNext>\n > {}\ninterface _ReadableStream<T = any>\n extends Or<ReadableStream<T>, globalThis.ReadableStream<T>> {}\n\n// NOTE: AsyncIterable<Uint8Array> is left out\nexport type BodyInit =\n | ArrayBuffer\n | _Blob\n | NodeJS.ArrayBufferView\n | _URLSearchParams\n | _ReadableStream\n | _AsyncIterable<Uint8Array>\n | _FormData\n | _Iterable<Uint8Array>\n | null\n | string;\n\n// See: https://nodejs.org/docs/latest-v20.x/api/globals.html#class-file\n// The `File` global was only added in Node.js 20\ninterface _File extends _Blob, Or<File, globalThis.File> {\n readonly name: string;\n readonly lastModified: number;\n}\ninterface _File extends Or<globalThis.File, buffer.File> {}\ninterface FileClass extends Or<typeof globalThis.File, typeof buffer.File> {}\nconst _File: FileClass = globalThis.File || buffer.File;\nif (typeof globalThis.File === 'undefined') {\n globalThis.File = _File;\n}\n\n// There be dragons here.\n// This is complex because of overlapping definitions in lib.dom, @types/node, and undici-types\n// Some types define and overload constructor interfaces with type interfaces\n// Here, we have to account for global differences and split the overloads apart\n\ninterface _RequestInit extends Or<RequestInit, globalThis.RequestInit> {\n duplex?: 'half';\n}\ninterface _ResponseInit extends Or<ResponseInit, globalThis.ResponseInit> {}\n\ninterface _Blob extends Or<Blob, globalThis.Blob> {}\ninterface BlobClass extends Or<typeof Blob, typeof globalThis.Blob> {}\nconst _Blob: BlobClass = Blob;\n\ninterface _URLSearchParams\n extends Or<URLSearchParams, globalThis.URLSearchParams> {}\ninterface URLSearchParamsClass\n extends Or<typeof URLSearchParams, typeof globalThis.URLSearchParams> {}\nconst _URLSearchParams: URLSearchParamsClass = URLSearchParams as any;\n\ninterface _URL extends Or<URL, globalThis.URL> {}\ninterface URLClass extends Or<typeof URL, typeof globalThis.URL> {}\nconst _URL: URLClass = URL;\n\ninterface _Request extends Or<Request, globalThis.Request> {}\ninterface RequestClass extends Or<typeof Request, typeof globalThis.Request> {\n new (\n input: RequestInfo,\n init?: _RequestInit | Or<RequestInit, globalThis.RequestInit>\n ): _Request;\n}\nconst _Request: RequestClass = Request;\n\ninterface _Response extends Or<Response, globalThis.Response> {}\ninterface ResponseClass\n extends Or<typeof Response, typeof globalThis.Response> {\n new (body?: BodyInit, init?: _ResponseInit): _Response;\n}\nconst _Response: ResponseClass = Response;\n\ninterface _Headers extends Or<Headers, globalThis.Headers> {}\ninterface HeadersClass extends Or<typeof Headers, typeof globalThis.Headers> {\n new (init?: HeadersInit): _Headers;\n}\nconst _Headers: HeadersClass = Headers;\n\ninterface _FormData\n extends Or<\n FormData & _Iterable<[string, FormDataEntryValue]>,\n globalThis.FormData\n > {}\ninterface FormDataClass\n extends Or<typeof FormData, typeof globalThis.FormData> {}\nconst _FormData: FormDataClass = FormData;\n\nexport {\n type _RequestInit as RequestInit,\n type _ResponseInit as ResponseInit,\n _Blob as Blob,\n _File as File,\n _URL as URL,\n _URLSearchParams as URLSearchParams,\n _Request as Request,\n _Response as Response,\n _Headers as Headers,\n _FormData as FormData,\n};\n","import { Stream, Readable, pipeline } from 'node:stream';\nimport * as https from 'node:https';\nimport * as http from 'node:http';\nimport * as url from 'node:url';\n\nimport { extractBody } from './body';\nimport { createContentDecoder } from './encoding';\nimport { URL, Request, RequestInit, Response } from './webstd';\n\n/** Maximum allowed redirects (matching Chromium's limit) */\nconst MAX_REDIRECTS = 20;\n\n/** Convert Node.js raw headers array to Headers */\nconst headersOfRawHeaders = (rawHeaders: readonly string[]): Headers => {\n const headers = new Headers();\n for (let i = 0; i < rawHeaders.length; i += 2)\n headers.set(rawHeaders[i], rawHeaders[i + 1]);\n return headers;\n};\n\n/** Assign Headers to a Node.js OutgoingMessage (request) */\nconst assignOutgoingMessageHeaders = (\n outgoing: http.OutgoingMessage,\n headers: Headers\n) => {\n if (typeof outgoing.setHeaders === 'function') {\n outgoing.setHeaders(headers);\n } else {\n for (const [key, value] of headers) outgoing.setHeader(key, value);\n }\n};\n\n/** Normalize methods and disallow special methods */\nconst toRedirectOption = (\n redirect: string | undefined\n): 'follow' | 'manual' | 'error' => {\n switch (redirect) {\n case 'follow':\n case 'manual':\n case 'error':\n return redirect;\n case undefined:\n return 'follow';\n default:\n throw new TypeError(\n `Request constructor: ${redirect} is not an accepted type. Expected one of follow, manual, error.`\n );\n }\n};\n\n/** Normalize methods and disallow special methods */\nconst methodToHttpOption = (method: string | undefined): string => {\n switch (method) {\n case 'CONNECT':\n case 'TRACE':\n case 'TRACK':\n throw new TypeError(\n `Failed to construct 'Request': '${method}' HTTP method is unsupported.`\n );\n default:\n return method ? method.toUpperCase() : 'GET';\n }\n};\n\n/** Convert URL to Node.js HTTP request options and disallow unsupported protocols */\nconst urlToHttpOptions = (input: URL) => {\n const _url = new URL(input);\n switch (_url.protocol) {\n // TODO: 'file:' and 'data:' support\n case 'http:':\n case 'https:':\n return url.urlToHttpOptions(_url);\n default:\n throw new TypeError(`URL scheme \"${_url.protocol}\" is not supported.`);\n }\n};\n\n/** Returns if `input` is a Request object */\nconst isRequest = (input: any): input is Request =>\n input != null && typeof input === 'object' && 'body' in input;\n\n/** Returns if status `code` is a redirect code */\nconst isRedirectCode = (\n code: number | undefined\n): code is 301 | 302 | 303 | 307 | 308 =>\n code === 301 || code === 302 || code === 303 || code === 307 || code === 308;\n\nfunction createResponse(\n body: ConstructorParameters<typeof Response>[0] | null,\n init: ResponseInit,\n params: {\n url: string;\n redirected: boolean;\n type: 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect';\n }\n) {\n const response = new Response(body, init);\n Object.defineProperty(response, 'url', { value: params.url });\n if (params.type !== 'default')\n Object.defineProperty(response, 'type', { value: params.type });\n if (params.redirected)\n Object.defineProperty(response, 'redirected', { value: params.redirected });\n return response;\n}\n\nasync function _fetch(\n input: string | URL | Request,\n requestInit?: RequestInit\n): Promise<Response> {\n const initFromRequest = isRequest(input);\n const initUrl = initFromRequest ? input.url : input;\n const initBody = initFromRequest ? input.body : requestInit?.body || null;\n const signal = initFromRequest\n ? input.signal\n : requestInit?.signal || undefined;\n const redirect = toRedirectOption(\n initFromRequest ? input.redirect : requestInit?.redirect\n );\n\n let requestUrl = new URL(initUrl);\n let requestBody = extractBody(initBody);\n let redirects = 0;\n\n const requestHeaders = new Headers(\n requestInit?.headers || (initFromRequest ? input.headers : undefined)\n );\n const requestOptions = {\n ...urlToHttpOptions(requestUrl),\n method: methodToHttpOption(\n initFromRequest ? input.method : requestInit?.method\n ),\n signal,\n } satisfies http.RequestOptions;\n\n function _call(\n resolve: (response: Response | Promise<Response>) => void,\n reject: (reason?: any) => void\n ) {\n const method = requestOptions.method;\n const protocol = requestOptions.protocol === 'https:' ? https : http;\n const outgoing = protocol.request(requestOptions);\n\n outgoing.on('response', incoming => {\n incoming.setTimeout(0); // Forcefully disable timeout\n\n const init = {\n status: incoming.statusCode,\n statusText: incoming.statusMessage,\n headers: headersOfRawHeaders(incoming.rawHeaders),\n } satisfies ResponseInit;\n\n if (isRedirectCode(init.status)) {\n const location = init.headers.get('Location');\n const locationURL =\n location != null ? new URL(location, requestUrl) : null;\n if (redirect === 'error') {\n // TODO: do we need a special Error instance here?\n reject(\n new Error(\n 'URI requested responds with a redirect, redirect mode is set to error'\n )\n );\n return;\n } else if (redirect === 'manual' && locationURL !== null) {\n init.headers.set('Location', locationURL.toString());\n } else if (redirect === 'follow' && locationURL !== null) {\n if (++redirects > MAX_REDIRECTS) {\n reject(new Error(`maximum redirect reached at: ${requestUrl}`));\n return;\n } else if (\n locationURL.protocol !== 'http:' &&\n locationURL.protocol !== 'https:'\n ) {\n // TODO: do we need a special Error instance here?\n reject(new Error('URL scheme must be a HTTP(S) scheme'));\n return;\n }\n\n if (\n init.status === 303 ||\n ((init.status === 301 || init.status === 302) && method === 'POST')\n ) {\n requestBody = extractBody(null);\n requestOptions.method = 'GET';\n requestHeaders.delete('Content-Length');\n } else if (\n requestBody.body != null &&\n requestBody.contentLength == null\n ) {\n reject(new Error('Cannot follow redirect with a streamed body'));\n return;\n } else {\n requestBody = extractBody(initBody);\n }\n\n Object.assign(\n requestOptions,\n urlToHttpOptions((requestUrl = locationURL))\n );\n return _call(resolve, reject);\n }\n }\n\n const destroy = (reason?: any) => {\n signal?.removeEventListener('abort', destroy);\n if (reason) {\n incoming.destroy(signal?.aborted ? signal.reason : reason);\n reject(signal?.aborted ? signal.reason : reason);\n }\n };\n\n signal?.addEventListener('abort', destroy);\n\n let body: Readable | null = incoming;\n const encoding = init.headers.get('Content-Encoding')?.toLowerCase();\n if (method === 'HEAD' || init.status === 204 || init.status === 304) {\n body = null;\n } else if (encoding != null) {\n init.headers.set('Content-Encoding', encoding);\n body = pipeline(body, createContentDecoder(encoding), destroy);\n }\n\n resolve(\n createResponse(body, init, {\n type: 'default',\n url: requestUrl.toString(),\n redirected: redirects > 0,\n })\n );\n });\n\n outgoing.on('error', reject);\n\n if (!requestHeaders.has('Accept')) requestHeaders.set('Accept', '*/*');\n if (requestBody.contentType)\n requestHeaders.set('Content-Type', requestBody.contentType);\n\n if (requestBody.body == null && (method === 'POST' || method === 'PUT')) {\n requestHeaders.set('Content-Length', '0');\n } else if (requestBody.body != null && requestBody.contentLength != null) {\n requestHeaders.set('Content-Length', `${requestBody.contentLength}`);\n }\n\n assignOutgoingMessageHeaders(outgoing, requestHeaders);\n\n if (requestBody.body == null) {\n outgoing.end();\n } else if (requestBody.body instanceof Uint8Array) {\n outgoing.write(requestBody.body);\n outgoing.end();\n } else {\n const body =\n requestBody.body instanceof Stream\n ? requestBody.body\n : Readable.fromWeb(requestBody.body);\n pipeline(body, outgoing, error => {\n if (error) reject(error);\n });\n }\n }\n\n return await new Promise(_call);\n}\n\nexport { _fetch as fetch };\n"],"names":["CRLF","BOUNDARY","repeat","isBlob","object","arrayBuffer","type","stream","constructor","tag","Symbol","toStringTag","startsWith","getFormHeader","boundary","name","field","header","getFormFooter","encoder","TextEncoder","extractBody","body","size","bytes","encode","byteLength","append","delete","get","getAll","has","set","sort","isURLSearchParameters","toString","Uint8Array","isAnyArrayBuffer","ArrayBuffer","isView","buffer","byteOffset","getReader","cancel","tee","isReadableStream","keys","values","entries","isFormData","randomBytes","getFormDataLength","form","length","Buffer","value","Readable","from","async","generatorOfFormData","getBoundary","hasKnownLength","getLengthSync","isReadable","isMultipartFormDataStream","asyncIterator","iterator","isIterable","contentLength","contentType","InflateStream","Transform","opts","super","this","_opts","_transform","chunk","encoding","callback","_inflate","zlib","createInflate","createInflateRaw","on","push","bind","err","destroy","write","_final","end","undefined","_File","globalThis","File","_Blob","Blob","_URLSearchParams","URLSearchParams","_URL","URL","_Request","Request","_Response","Response","_Headers","Headers","_FormData","FormData","headersOfRawHeaders","rawHeaders","headers","i","methodToHttpOption","method","TypeError","toUpperCase","urlToHttpOptions","input","_url","protocol","url","_fetch","requestInit","initFromRequest","isRequest","initUrl","initBody","signal","redirect","toRedirectOption","requestUrl","requestBody","redirects","requestHeaders","requestOptions","Promise","_call","resolve","reject","outgoing","https","http","request","incoming","setTimeout","init","status","statusCode","statusText","statusMessage","code","location","locationURL","Error","Object","assign","reason","removeEventListener","aborted","addEventListener","toLowerCase","pipeline","createBrotliDecompress","flush","constants","BROTLI_OPERATION_FLUSH","finishFlush","createGunzip","Z_SYNC_FLUSH","PassThrough","createContentDecoder","createResponse","params","response","defineProperty","redirected","assignOutgoingMessageHeaders","setHeaders","key","setHeader","Stream","fromWeb","error"],"mappings":"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"}
|
package/dist/minifetch.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Readable as e, PassThrough as t, Transform as
|
|
1
|
+
import { Readable as e, PassThrough as t, Transform as r, pipeline as n, Stream as o } from "node:stream";
|
|
2
2
|
|
|
3
3
|
import * as a from "node:https";
|
|
4
4
|
|
|
@@ -12,9 +12,11 @@ import { randomBytes as l } from "node:crypto";
|
|
|
12
12
|
|
|
13
13
|
import * as c from "node:zlib";
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
import * as u from "node:buffer";
|
|
16
16
|
|
|
17
|
-
var d = "
|
|
17
|
+
var d = "\r\n";
|
|
18
|
+
|
|
19
|
+
var p = "-".repeat(2);
|
|
18
20
|
|
|
19
21
|
var isBlob = e => {
|
|
20
22
|
if ("object" == typeof e && "function" == typeof e.arrayBuffer && "string" == typeof e.type && "function" == typeof e.stream && "function" == typeof e.constructor) {
|
|
@@ -25,107 +27,107 @@ var isBlob = e => {
|
|
|
25
27
|
}
|
|
26
28
|
};
|
|
27
29
|
|
|
28
|
-
var getFormHeader = (e, t,
|
|
29
|
-
var
|
|
30
|
-
|
|
31
|
-
if (isBlob(
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
var getFormHeader = (e, t, r) => {
|
|
31
|
+
var n = `${p}${e}${d}`;
|
|
32
|
+
n += `Content-Disposition: form-data; name="${t}"`;
|
|
33
|
+
if (isBlob(r)) {
|
|
34
|
+
n += `; filename="${r.name ?? "blob"}"${d}`;
|
|
35
|
+
n += `Content-Type: ${r.type || "application/octet-stream"}`;
|
|
34
36
|
}
|
|
35
|
-
return `${
|
|
37
|
+
return `${n}${d}${d}`;
|
|
36
38
|
};
|
|
37
39
|
|
|
38
|
-
var getFormFooter = e => `${
|
|
40
|
+
var getFormFooter = e => `${p}${e}${p}${d}${d}`;
|
|
39
41
|
|
|
40
|
-
var
|
|
42
|
+
var y = new TextEncoder;
|
|
41
43
|
|
|
42
44
|
var extractBody = t => {
|
|
43
|
-
var
|
|
44
|
-
var
|
|
45
|
+
var r = null;
|
|
46
|
+
var n;
|
|
45
47
|
var o = null;
|
|
46
48
|
if (null == t) {
|
|
47
|
-
|
|
49
|
+
n = null;
|
|
48
50
|
o = 0;
|
|
49
51
|
} else if ("string" == typeof t) {
|
|
50
|
-
var a =
|
|
51
|
-
|
|
52
|
+
var a = y.encode(`${t}`);
|
|
53
|
+
r = "text/plain;charset=UTF-8";
|
|
52
54
|
o = a.byteLength;
|
|
53
|
-
|
|
55
|
+
n = a;
|
|
54
56
|
} else if ((e => "object" == typeof e && "function" == typeof e.append && "function" == typeof e.delete && "function" == typeof e.get && "function" == typeof e.getAll && "function" == typeof e.has && "function" == typeof e.set && "function" == typeof e.sort && "URLSearchParams" === e[Symbol.toStringTag])(t)) {
|
|
55
|
-
var s =
|
|
56
|
-
|
|
57
|
+
var s = y.encode(t.toString());
|
|
58
|
+
n = s;
|
|
57
59
|
o = s.byteLength;
|
|
58
|
-
|
|
60
|
+
r = "application/x-www-form-urlencoded;charset=UTF-8";
|
|
59
61
|
} else if (isBlob(t)) {
|
|
60
62
|
o = t.size;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
+
r = t.type || null;
|
|
64
|
+
n = t.stream();
|
|
63
65
|
} else if (t instanceof Uint8Array) {
|
|
64
|
-
|
|
66
|
+
n = t;
|
|
65
67
|
o = t.byteLength;
|
|
66
68
|
} else if (f(t)) {
|
|
67
69
|
var i = new Uint8Array(t);
|
|
68
|
-
|
|
70
|
+
n = i;
|
|
69
71
|
o = i.byteLength;
|
|
70
72
|
} else if (ArrayBuffer.isView(t)) {
|
|
71
73
|
var c = new Uint8Array(t.buffer, t.byteOffset, t.byteLength);
|
|
72
|
-
|
|
74
|
+
n = c;
|
|
73
75
|
o = c.byteLength;
|
|
74
76
|
} else if ((e => "object" == typeof e && "function" == typeof e.getReader && "function" == typeof e.cancel && "function" == typeof e.tee)(t)) {
|
|
75
|
-
|
|
77
|
+
n = t;
|
|
76
78
|
} else if ((e => "object" == typeof e && "function" == typeof e.append && "function" == typeof e.set && "function" == typeof e.get && "function" == typeof e.getAll && "function" == typeof e.delete && "function" == typeof e.keys && "function" == typeof e.values && "function" == typeof e.entries && "function" == typeof e.constructor && "FormData" === e[Symbol.toStringTag])(t)) {
|
|
77
|
-
var
|
|
78
|
-
|
|
79
|
+
var u = `formdata-${l(8).toString("hex")}`;
|
|
80
|
+
r = `multipart/form-data; boundary=${u}`;
|
|
79
81
|
o = ((e, t) => {
|
|
80
|
-
var
|
|
81
|
-
for (var [
|
|
82
|
-
|
|
82
|
+
var r = Buffer.byteLength(getFormFooter(t));
|
|
83
|
+
for (var [n, o] of e) {
|
|
84
|
+
r += Buffer.byteLength(getFormHeader(t, n, o)) + (isBlob(o) ? o.size : Buffer.byteLength(`${o}`)) + 2;
|
|
83
85
|
}
|
|
84
|
-
return
|
|
85
|
-
})(t,
|
|
86
|
-
|
|
87
|
-
var
|
|
88
|
-
for (var [
|
|
86
|
+
return r;
|
|
87
|
+
})(t, u);
|
|
88
|
+
n = e.from(async function* generatorOfFormData(e, t) {
|
|
89
|
+
var r = new TextEncoder;
|
|
90
|
+
for (var [n, o] of e) {
|
|
89
91
|
if (isBlob(o)) {
|
|
90
|
-
yield
|
|
92
|
+
yield r.encode(getFormHeader(t, n, o));
|
|
91
93
|
yield* o.stream();
|
|
92
|
-
yield
|
|
94
|
+
yield r.encode(d);
|
|
93
95
|
} else {
|
|
94
|
-
yield
|
|
96
|
+
yield r.encode(getFormHeader(t, n, o) + o + d);
|
|
95
97
|
}
|
|
96
98
|
}
|
|
97
|
-
yield
|
|
98
|
-
}(t,
|
|
99
|
+
yield r.encode(getFormFooter(t));
|
|
100
|
+
}(t, u));
|
|
99
101
|
} else if ((t => "function" == typeof t.getBoundary && "function" == typeof t.hasKnownLength && "function" == typeof t.getLengthSync && e.isReadable(t))(t)) {
|
|
100
|
-
|
|
102
|
+
r = `multipart/form-data; boundary=${t.getBoundary()}`;
|
|
101
103
|
o = t.hasKnownLength() ? t.getLengthSync() : null;
|
|
102
|
-
|
|
104
|
+
n = t;
|
|
103
105
|
} else if ((t => e.isReadable(t))(t)) {
|
|
104
|
-
|
|
106
|
+
n = t;
|
|
105
107
|
} else if ((e => "function" == typeof e[Symbol.asyncIterator] || "function" == typeof e[Symbol.iterator])(t)) {
|
|
106
|
-
|
|
108
|
+
n = e.from(t);
|
|
107
109
|
} else {
|
|
108
|
-
var
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
o =
|
|
110
|
+
var p = y.encode(`${t}`);
|
|
111
|
+
r = "text/plain;charset=UTF-8";
|
|
112
|
+
n = p;
|
|
113
|
+
o = p.byteLength;
|
|
112
114
|
}
|
|
113
115
|
return {
|
|
114
116
|
contentLength: o,
|
|
115
|
-
contentType:
|
|
116
|
-
body:
|
|
117
|
+
contentType: r,
|
|
118
|
+
body: n
|
|
117
119
|
};
|
|
118
120
|
};
|
|
119
121
|
|
|
120
|
-
class InflateStream extends
|
|
122
|
+
class InflateStream extends r {
|
|
121
123
|
constructor(e) {
|
|
122
124
|
super();
|
|
123
125
|
this._opts = e;
|
|
124
126
|
}
|
|
125
|
-
_transform(e, t,
|
|
127
|
+
_transform(e, t, r) {
|
|
126
128
|
if (!this._inflate) {
|
|
127
129
|
if (0 === e.length) {
|
|
128
|
-
|
|
130
|
+
r();
|
|
129
131
|
return;
|
|
130
132
|
}
|
|
131
133
|
this._inflate = 8 == (15 & e[0]) ? c.createInflate(this._opts) : c.createInflateRaw(this._opts);
|
|
@@ -133,7 +135,7 @@ class InflateStream extends n {
|
|
|
133
135
|
this._inflate.on("end", (() => this.push(null)));
|
|
134
136
|
this._inflate.on("error", (e => this.destroy(e)));
|
|
135
137
|
}
|
|
136
|
-
this._inflate.write(e, t,
|
|
138
|
+
this._inflate.write(e, t, r);
|
|
137
139
|
}
|
|
138
140
|
_final(e) {
|
|
139
141
|
if (this._inflate) {
|
|
@@ -144,10 +146,30 @@ class InflateStream extends n {
|
|
|
144
146
|
}
|
|
145
147
|
}
|
|
146
148
|
|
|
149
|
+
var h = globalThis.File || u.File;
|
|
150
|
+
|
|
151
|
+
if (void 0 === globalThis.File) {
|
|
152
|
+
globalThis.File = h;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
var m = Blob;
|
|
156
|
+
|
|
157
|
+
var v = URLSearchParams;
|
|
158
|
+
|
|
159
|
+
var b = URL;
|
|
160
|
+
|
|
161
|
+
var g = Request;
|
|
162
|
+
|
|
163
|
+
var w = Response;
|
|
164
|
+
|
|
165
|
+
var L = Headers;
|
|
166
|
+
|
|
167
|
+
var T = FormData;
|
|
168
|
+
|
|
147
169
|
var headersOfRawHeaders = e => {
|
|
148
170
|
var t = new Headers;
|
|
149
|
-
for (var
|
|
150
|
-
t.set(e[
|
|
171
|
+
for (var r = 0; r < e.length; r += 2) {
|
|
172
|
+
t.set(e[r], e[r + 1]);
|
|
151
173
|
}
|
|
152
174
|
return t;
|
|
153
175
|
};
|
|
@@ -165,7 +187,7 @@ var methodToHttpOption = e => {
|
|
|
165
187
|
};
|
|
166
188
|
|
|
167
189
|
var urlToHttpOptions = e => {
|
|
168
|
-
var t = new
|
|
190
|
+
var t = new b(e);
|
|
169
191
|
switch (t.protocol) {
|
|
170
192
|
case "http:":
|
|
171
193
|
case "https:":
|
|
@@ -176,11 +198,11 @@ var urlToHttpOptions = e => {
|
|
|
176
198
|
}
|
|
177
199
|
};
|
|
178
200
|
|
|
179
|
-
async function
|
|
180
|
-
var f = (e => null != e && "object" == typeof e && "body" in e)(
|
|
181
|
-
var l = f ?
|
|
182
|
-
var u = f ?
|
|
183
|
-
var d = f ?
|
|
201
|
+
async function _fetch(r, i) {
|
|
202
|
+
var f = (e => null != e && "object" == typeof e && "body" in e)(r);
|
|
203
|
+
var l = f ? r.url : r;
|
|
204
|
+
var u = f ? r.body : i?.body || null;
|
|
205
|
+
var d = f ? r.signal : i?.signal || void 0;
|
|
184
206
|
var p = (e => {
|
|
185
207
|
switch (e) {
|
|
186
208
|
case "follow":
|
|
@@ -194,19 +216,19 @@ async function fetch(n, i) {
|
|
|
194
216
|
default:
|
|
195
217
|
throw new TypeError(`Request constructor: ${e} is not an accepted type. Expected one of follow, manual, error.`);
|
|
196
218
|
}
|
|
197
|
-
})(f ?
|
|
198
|
-
var y = new
|
|
219
|
+
})(f ? r.redirect : i?.redirect);
|
|
220
|
+
var y = new b(l);
|
|
199
221
|
var h = extractBody(u);
|
|
200
222
|
var m = 0;
|
|
201
|
-
var v = new Headers(i?.headers || (f ?
|
|
202
|
-
var
|
|
223
|
+
var v = new Headers(i?.headers || (f ? r.headers : void 0));
|
|
224
|
+
var g = {
|
|
203
225
|
...urlToHttpOptions(y),
|
|
204
|
-
method: methodToHttpOption(f ?
|
|
226
|
+
method: methodToHttpOption(f ? r.method : i?.method),
|
|
205
227
|
signal: d
|
|
206
228
|
};
|
|
207
|
-
return await new Promise((function
|
|
208
|
-
var f =
|
|
209
|
-
var l = ("https:" ===
|
|
229
|
+
return await new Promise((function _call(r, i) {
|
|
230
|
+
var f = g.method;
|
|
231
|
+
var l = ("https:" === g.protocol ? a : s).request(g);
|
|
210
232
|
l.on("response", (e => {
|
|
211
233
|
e.setTimeout(0);
|
|
212
234
|
var o = {
|
|
@@ -216,7 +238,7 @@ async function fetch(n, i) {
|
|
|
216
238
|
};
|
|
217
239
|
if (301 === (l = o.status) || 302 === l || 303 === l || 307 === l || 308 === l) {
|
|
218
240
|
var a = o.headers.get("Location");
|
|
219
|
-
var s = null != a ? new
|
|
241
|
+
var s = null != a ? new b(a, y) : null;
|
|
220
242
|
if ("error" === p) {
|
|
221
243
|
i(new Error("URI requested responds with a redirect, redirect mode is set to error"));
|
|
222
244
|
return;
|
|
@@ -232,7 +254,7 @@ async function fetch(n, i) {
|
|
|
232
254
|
}
|
|
233
255
|
if (303 === o.status || (301 === o.status || 302 === o.status) && "POST" === f) {
|
|
234
256
|
h = extractBody(null);
|
|
235
|
-
|
|
257
|
+
g.method = "GET";
|
|
236
258
|
v.delete("Content-Length");
|
|
237
259
|
} else if (null != h.body && null == h.contentLength) {
|
|
238
260
|
i(new Error("Cannot follow redirect with a streamed body"));
|
|
@@ -240,8 +262,8 @@ async function fetch(n, i) {
|
|
|
240
262
|
} else {
|
|
241
263
|
h = extractBody(u);
|
|
242
264
|
}
|
|
243
|
-
Object.assign(
|
|
244
|
-
return
|
|
265
|
+
Object.assign(g, urlToHttpOptions(y = s));
|
|
266
|
+
return _call(r, i);
|
|
245
267
|
}
|
|
246
268
|
}
|
|
247
269
|
var l;
|
|
@@ -253,13 +275,13 @@ async function fetch(n, i) {
|
|
|
253
275
|
}
|
|
254
276
|
};
|
|
255
277
|
d?.addEventListener("abort", destroy);
|
|
256
|
-
var
|
|
257
|
-
var
|
|
278
|
+
var L = e;
|
|
279
|
+
var T = o.headers.get("Content-Encoding")?.toLowerCase();
|
|
258
280
|
if ("HEAD" === f || 204 === o.status || 304 === o.status) {
|
|
259
|
-
|
|
260
|
-
} else if (null !=
|
|
261
|
-
o.headers.set("Content-Encoding",
|
|
262
|
-
|
|
281
|
+
L = null;
|
|
282
|
+
} else if (null != T) {
|
|
283
|
+
o.headers.set("Content-Encoding", T);
|
|
284
|
+
L = n(L, (e => {
|
|
263
285
|
switch (e) {
|
|
264
286
|
case "br":
|
|
265
287
|
return c.createBrotliDecompress({
|
|
@@ -284,25 +306,25 @@ async function fetch(n, i) {
|
|
|
284
306
|
default:
|
|
285
307
|
return new t;
|
|
286
308
|
}
|
|
287
|
-
})(
|
|
309
|
+
})(T), destroy);
|
|
288
310
|
}
|
|
289
|
-
|
|
290
|
-
var
|
|
291
|
-
Object.defineProperty(
|
|
292
|
-
value:
|
|
311
|
+
r(function createResponse(e, t, r) {
|
|
312
|
+
var n = new w(e, t);
|
|
313
|
+
Object.defineProperty(n, "url", {
|
|
314
|
+
value: r.url
|
|
293
315
|
});
|
|
294
|
-
if ("default" !==
|
|
295
|
-
Object.defineProperty(
|
|
296
|
-
value:
|
|
316
|
+
if ("default" !== r.type) {
|
|
317
|
+
Object.defineProperty(n, "type", {
|
|
318
|
+
value: r.type
|
|
297
319
|
});
|
|
298
320
|
}
|
|
299
|
-
if (
|
|
300
|
-
Object.defineProperty(
|
|
301
|
-
value:
|
|
321
|
+
if (r.redirected) {
|
|
322
|
+
Object.defineProperty(n, "redirected", {
|
|
323
|
+
value: r.redirected
|
|
302
324
|
});
|
|
303
325
|
}
|
|
304
|
-
return
|
|
305
|
-
}(
|
|
326
|
+
return n;
|
|
327
|
+
}(L, o, {
|
|
306
328
|
type: "default",
|
|
307
329
|
url: y.toString(),
|
|
308
330
|
redirected: m > 0
|
|
@@ -324,8 +346,8 @@ async function fetch(n, i) {
|
|
|
324
346
|
if ("function" == typeof e.setHeaders) {
|
|
325
347
|
e.setHeaders(t);
|
|
326
348
|
} else {
|
|
327
|
-
for (var [
|
|
328
|
-
e.setHeader(
|
|
349
|
+
for (var [r, n] of t) {
|
|
350
|
+
e.setHeader(r, n);
|
|
329
351
|
}
|
|
330
352
|
}
|
|
331
353
|
})(l, v);
|
|
@@ -335,8 +357,8 @@ async function fetch(n, i) {
|
|
|
335
357
|
l.write(h.body);
|
|
336
358
|
l.end();
|
|
337
359
|
} else {
|
|
338
|
-
var
|
|
339
|
-
|
|
360
|
+
var L = h.body instanceof o ? h.body : e.fromWeb(h.body);
|
|
361
|
+
n(L, l, (e => {
|
|
340
362
|
if (e) {
|
|
341
363
|
i(e);
|
|
342
364
|
}
|
|
@@ -345,5 +367,5 @@ async function fetch(n, i) {
|
|
|
345
367
|
}));
|
|
346
368
|
}
|
|
347
369
|
|
|
348
|
-
export {
|
|
370
|
+
export { m as Blob, h as File, T as FormData, L as Headers, g as Request, w as Response, b as URL, v as URLSearchParams, _fetch as default, _fetch as fetch };
|
|
349
371
|
//# sourceMappingURL=minifetch.mjs.map
|
package/dist/minifetch.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minifetch.mjs","sources":["../src/body.ts","../src/encoding.ts","../src/fetch.ts"],"sourcesContent":["import { Readable } from 'node:stream';\nimport { isAnyArrayBuffer } from 'node:util/types';\nimport { randomBytes } from 'node:crypto';\n\nexport type BodyInit =\n | Exclude<RequestInit['body'], undefined | null>\n | FormDataPolyfill\n | Readable;\n\nexport interface BodyState {\n contentLength: number | null;\n contentType: string | null;\n body: Readable | ReadableStream | Uint8Array | null;\n}\n\ninterface FormDataPolyfill extends Readable {\n getBoundary(): string;\n getLengthSync(): number;\n hasKnownLength(): number;\n}\n\nconst CRLF = '\\r\\n';\nconst CRLF_LENGTH = 2;\nconst BOUNDARY = '-'.repeat(2);\n\nconst isReadable = (object: any): object is Readable =>\n Readable.isReadable(object);\n\nconst isIterable = (\n object: any\n): object is AsyncIterable<any> | Iterable<any> =>\n typeof object[Symbol.asyncIterator] === 'function' ||\n typeof object[Symbol.iterator] === 'function';\n\nconst isMultipartFormDataStream = (object: any): object is FormDataPolyfill =>\n typeof object.getBoundary === 'function' &&\n typeof object.hasKnownLength === 'function' &&\n typeof object.getLengthSync === 'function' &&\n Readable.isReadable(object);\n\nconst isFormData = (object: any): object is FormData =>\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.set === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.keys === 'function' &&\n typeof object.values === 'function' &&\n typeof object.entries === 'function' &&\n typeof object.constructor === 'function' &&\n object[Symbol.toStringTag] === 'FormData';\n\nconst isURLSearchParameters = (object: any): object is URLSearchParams =>\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.has === 'function' &&\n typeof object.set === 'function' &&\n typeof object.sort === 'function' &&\n object[Symbol.toStringTag] === 'URLSearchParams';\n\nconst isReadableStream = (object: any): object is ReadableStream =>\n typeof object === 'object' &&\n typeof object.getReader === 'function' &&\n typeof object.cancel === 'function' &&\n typeof object.tee === 'function';\n\nconst isBlob = (object: any): object is Blob => {\n if (\n typeof object === 'object' &&\n typeof object.arrayBuffer === 'function' &&\n typeof object.type === 'string' &&\n typeof object.stream === 'function' &&\n typeof object.constructor === 'function'\n ) {\n const tag = object[Symbol.toStringTag];\n return tag.startsWith('Blob') || tag.startsWith('File');\n } else {\n return false;\n }\n};\n\nconst makeFormBoundary = (): string =>\n `formdata-${randomBytes(8).toString('hex')}`;\n\nconst getFormHeader = (\n boundary: string,\n name: string,\n field: File | Blob | string\n): string => {\n let header = `${BOUNDARY}${boundary}${CRLF}`;\n header += `Content-Disposition: form-data; name=\"${name}\"`;\n if (isBlob(field)) {\n header += `; filename=\"${(field as File).name ?? 'blob'}\"${CRLF}`;\n header += `Content-Type: ${field.type || 'application/octet-stream'}`;\n }\n return `${header}${CRLF}${CRLF}`;\n};\n\nconst getFormFooter = (boundary: string) =>\n `${BOUNDARY}${boundary}${BOUNDARY}${CRLF}${CRLF}`;\n\nexport const getFormDataLength = (form: FormData, boundary: string) => {\n let length = Buffer.byteLength(getFormFooter(boundary));\n for (const [name, value] of form)\n length +=\n Buffer.byteLength(getFormHeader(boundary, name, value)) +\n (isBlob(value) ? value.size : Buffer.byteLength(`${value}`)) +\n CRLF_LENGTH;\n return length;\n};\n\nasync function* generatorOfFormData(\n form: FormData,\n boundary: string\n): AsyncGenerator<ArrayBufferLike> {\n const encoder = new TextEncoder();\n for (const [name, value] of form) {\n if (isBlob(value)) {\n yield encoder.encode(getFormHeader(boundary, name, value));\n yield* value.stream();\n yield encoder.encode(CRLF);\n } else {\n yield encoder.encode(getFormHeader(boundary, name, value) + value + CRLF);\n }\n }\n yield encoder.encode(getFormFooter(boundary));\n}\n\nconst encoder = new TextEncoder();\n\nexport const extractBody = (object: BodyInit | null): BodyState => {\n let type: string | null = null;\n let body: Readable | ReadableStream | Uint8Array | null;\n let size: number | null = null;\n if (object == null) {\n body = null;\n size = 0;\n } else if (typeof object === 'string') {\n const bytes = encoder.encode(`${object}`);\n type = 'text/plain;charset=UTF-8';\n size = bytes.byteLength;\n body = bytes;\n } else if (isURLSearchParameters(object)) {\n const bytes = encoder.encode(object.toString());\n body = bytes;\n size = bytes.byteLength;\n type = 'application/x-www-form-urlencoded;charset=UTF-8';\n } else if (isBlob(object)) {\n size = object.size;\n type = object.type || null;\n body = object.stream();\n } else if (object instanceof Uint8Array) {\n body = object;\n size = object.byteLength;\n } else if (isAnyArrayBuffer(object)) {\n const bytes = new Uint8Array(object);\n body = bytes;\n size = bytes.byteLength;\n } else if (ArrayBuffer.isView(object)) {\n const bytes = new Uint8Array(\n object.buffer,\n object.byteOffset,\n object.byteLength\n );\n body = bytes;\n size = bytes.byteLength;\n } else if (isReadableStream(object)) {\n body = object;\n } else if (isFormData(object)) {\n const boundary = makeFormBoundary();\n type = `multipart/form-data; boundary=${boundary}`;\n size = getFormDataLength(object, boundary);\n body = Readable.from(generatorOfFormData(object, boundary));\n } else if (isMultipartFormDataStream(object)) {\n type = `multipart/form-data; boundary=${object.getBoundary()}`;\n size = object.hasKnownLength() ? object.getLengthSync() : null;\n body = object as Readable;\n } else if (isReadable(object)) {\n body = object as Readable;\n } else if (isIterable(object)) {\n body = Readable.from(object);\n } else {\n const bytes = encoder.encode(`${object}`);\n type = 'text/plain;charset=UTF-8';\n body = bytes;\n size = bytes.byteLength;\n }\n return {\n contentLength: size,\n contentType: type,\n body,\n };\n};\n","import { PassThrough, Transform, TransformCallback } from 'node:stream';\nimport * as zlib from 'node:zlib';\n\n/** @see https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2 */\ntype Encoding = 'gzip' | 'x-gzip' | 'deflate' | 'x-deflate' | 'br' | {};\n\n/** @see https://github.com/nodejs/undici/pull/2650 */\nclass InflateStream extends Transform {\n _opts?: zlib.ZlibOptions;\n _inflate?: Transform;\n\n constructor(opts?: zlib.ZlibOptions) {\n super();\n this._opts = opts;\n }\n\n _transform(\n chunk: Buffer,\n encoding: BufferEncoding,\n callback: TransformCallback\n ) {\n if (!this._inflate) {\n if (chunk.length === 0) {\n callback();\n return;\n }\n this._inflate =\n (chunk[0] & 0x0f) === 0x08\n ? zlib.createInflate(this._opts)\n : zlib.createInflateRaw(this._opts);\n this._inflate.on('data', this.push.bind(this));\n this._inflate.on('end', () => this.push(null));\n this._inflate.on('error', err => this.destroy(err));\n }\n this._inflate.write(chunk, encoding, callback);\n }\n\n _final(callback: TransformCallback) {\n if (this._inflate) {\n this._inflate.end();\n this._inflate = undefined;\n }\n callback();\n }\n}\n\nexport const createContentDecoder = (encoding: Encoding | {}) => {\n // See: https://github.com/nodejs/undici/blob/008187b/lib/web/fetch/index.js#L2138-L2160\n switch (encoding) {\n case 'br':\n return zlib.createBrotliDecompress({\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH,\n });\n case 'gzip':\n case 'x-gzip':\n return zlib.createGunzip({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n case 'deflate':\n case 'x-deflate':\n return new InflateStream({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n default:\n return new PassThrough();\n }\n};\n","import { Stream, Readable, pipeline } from 'node:stream';\nimport * as https from 'node:https';\nimport * as http from 'node:http';\nimport * as url from 'node:url';\n\nimport { extractBody } from './body';\nimport { createContentDecoder } from './encoding';\n\n/** Maximum allowed redirects (matching Chromium's limit) */\nconst MAX_REDIRECTS = 20;\n\n/** Convert Node.js raw headers array to Headers */\nconst headersOfRawHeaders = (rawHeaders: readonly string[]): Headers => {\n const headers = new Headers();\n for (let i = 0; i < rawHeaders.length; i += 2)\n headers.set(rawHeaders[i], rawHeaders[i + 1]);\n return headers;\n};\n\n/** Assign Headers to a Node.js OutgoingMessage (request) */\nconst assignOutgoingMessageHeaders = (\n outgoing: http.OutgoingMessage,\n headers: Headers\n) => {\n if (typeof outgoing.setHeaders === 'function') {\n outgoing.setHeaders(headers);\n } else {\n for (const [key, value] of headers) outgoing.setHeader(key, value);\n }\n};\n\n/** Normalize methods and disallow special methods */\nconst toRedirectOption = (\n redirect: string | undefined\n): 'follow' | 'manual' | 'error' => {\n switch (redirect) {\n case 'follow':\n case 'manual':\n case 'error':\n return redirect;\n case undefined:\n return 'follow';\n default:\n throw new TypeError(\n `Request constructor: ${redirect} is not an accepted type. Expected one of follow, manual, error.`\n );\n }\n};\n\n/** Normalize methods and disallow special methods */\nconst methodToHttpOption = (method: string | undefined): string => {\n switch (method) {\n case 'CONNECT':\n case 'TRACE':\n case 'TRACK':\n throw new TypeError(\n `Failed to construct 'Request': '${method}' HTTP method is unsupported.`\n );\n default:\n return method ? method.toUpperCase() : 'GET';\n }\n};\n\n/** Convert URL to Node.js HTTP request options and disallow unsupported protocols */\nconst urlToHttpOptions = (input: URL) => {\n const _url = new URL(input);\n switch (_url.protocol) {\n // TODO: 'file:' and 'data:' support\n case 'http:':\n case 'https:':\n return url.urlToHttpOptions(_url);\n default:\n throw new TypeError(`URL scheme \"${_url.protocol}\" is not supported.`);\n }\n};\n\n/** Returns if `input` is a Request object */\nconst isRequest = (input: any): input is Request =>\n input != null && typeof input === 'object' && 'body' in input;\n\n/** Returns if status `code` is a redirect code */\nconst isRedirectCode = (\n code: number | undefined\n): code is 301 | 302 | 303 | 307 | 308 =>\n code === 301 || code === 302 || code === 303 || code === 307 || code === 308;\n\nfunction createResponse(\n body: ConstructorParameters<typeof Response>[0] | null,\n init: ResponseInit,\n params: {\n url: string;\n redirected: boolean;\n type: 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect';\n }\n) {\n const response = new Response(body, init);\n Object.defineProperty(response, 'url', { value: params.url });\n if (params.type !== 'default')\n Object.defineProperty(response, 'type', { value: params.type });\n if (params.redirected)\n Object.defineProperty(response, 'redirected', { value: params.redirected });\n return response;\n}\n\nexport async function fetch(\n input: string | URL | Request,\n requestInit?: RequestInit\n): Promise<Response> {\n const initFromRequest = isRequest(input);\n const initUrl = initFromRequest ? input.url : input;\n const initBody = initFromRequest ? input.body : requestInit?.body || null;\n const signal = initFromRequest\n ? input.signal\n : requestInit?.signal || undefined;\n const redirect = toRedirectOption(\n initFromRequest ? input.redirect : requestInit?.redirect\n );\n\n let requestUrl = new URL(initUrl);\n let requestBody = extractBody(initBody);\n let redirects = 0;\n\n const requestHeaders = new Headers(\n requestInit?.headers || (initFromRequest ? input.headers : undefined)\n );\n const requestOptions = {\n ...urlToHttpOptions(requestUrl),\n method: methodToHttpOption(\n initFromRequest ? input.method : requestInit?.method\n ),\n signal,\n } satisfies http.RequestOptions;\n\n function _fetch(\n resolve: (response: Response | Promise<Response>) => void,\n reject: (reason?: any) => void\n ) {\n const method = requestOptions.method;\n const protocol = requestOptions.protocol === 'https:' ? https : http;\n const outgoing = protocol.request(requestOptions);\n\n outgoing.on('response', incoming => {\n incoming.setTimeout(0); // Forcefully disable timeout\n\n const init = {\n status: incoming.statusCode,\n statusText: incoming.statusMessage,\n headers: headersOfRawHeaders(incoming.rawHeaders),\n } satisfies ResponseInit;\n\n if (isRedirectCode(init.status)) {\n const location = init.headers.get('Location');\n const locationURL =\n location != null ? new URL(location, requestUrl) : null;\n if (redirect === 'error') {\n // TODO: do we need a special Error instance here?\n reject(\n new Error(\n 'URI requested responds with a redirect, redirect mode is set to error'\n )\n );\n return;\n } else if (redirect === 'manual' && locationURL !== null) {\n init.headers.set('Location', locationURL.toString());\n } else if (redirect === 'follow' && locationURL !== null) {\n if (++redirects > MAX_REDIRECTS) {\n reject(new Error(`maximum redirect reached at: ${requestUrl}`));\n return;\n } else if (\n locationURL.protocol !== 'http:' &&\n locationURL.protocol !== 'https:'\n ) {\n // TODO: do we need a special Error instance here?\n reject(new Error('URL scheme must be a HTTP(S) scheme'));\n return;\n }\n\n if (\n init.status === 303 ||\n ((init.status === 301 || init.status === 302) && method === 'POST')\n ) {\n requestBody = extractBody(null);\n requestOptions.method = 'GET';\n requestHeaders.delete('Content-Length');\n } else if (\n requestBody.body != null &&\n requestBody.contentLength == null\n ) {\n reject(new Error('Cannot follow redirect with a streamed body'));\n return;\n } else {\n requestBody = extractBody(initBody);\n }\n\n Object.assign(\n requestOptions,\n urlToHttpOptions((requestUrl = locationURL))\n );\n return _fetch(resolve, reject);\n }\n }\n\n const destroy = (reason?: any) => {\n signal?.removeEventListener('abort', destroy);\n if (reason) {\n incoming.destroy(signal?.aborted ? signal.reason : reason);\n reject(signal?.aborted ? signal.reason : reason);\n }\n };\n\n signal?.addEventListener('abort', destroy);\n\n let body: Readable | null = incoming;\n const encoding = init.headers.get('Content-Encoding')?.toLowerCase();\n if (method === 'HEAD' || init.status === 204 || init.status === 304) {\n body = null;\n } else if (encoding != null) {\n init.headers.set('Content-Encoding', encoding);\n body = pipeline(body, createContentDecoder(encoding), destroy);\n }\n\n resolve(\n createResponse(body, init, {\n type: 'default',\n url: requestUrl.toString(),\n redirected: redirects > 0,\n })\n );\n });\n\n outgoing.on('error', reject);\n\n if (!requestHeaders.has('Accept')) requestHeaders.set('Accept', '*/*');\n if (requestBody.contentType)\n requestHeaders.set('Content-Type', requestBody.contentType);\n\n if (requestBody.body == null && (method === 'POST' || method === 'PUT')) {\n requestHeaders.set('Content-Length', '0');\n } else if (requestBody.body != null && requestBody.contentLength != null) {\n requestHeaders.set('Content-Length', `${requestBody.contentLength}`);\n }\n\n assignOutgoingMessageHeaders(outgoing, requestHeaders);\n\n if (requestBody.body == null) {\n outgoing.end();\n } else if (requestBody.body instanceof Uint8Array) {\n outgoing.write(requestBody.body);\n outgoing.end();\n } else {\n const body =\n requestBody.body instanceof Stream\n ? requestBody.body\n : Readable.fromWeb(requestBody.body);\n pipeline(body, outgoing, error => {\n if (error) reject(error);\n });\n }\n }\n\n return await new Promise(_fetch);\n}\n"],"names":["CRLF","BOUNDARY","repeat","isBlob","object","arrayBuffer","type","stream","constructor","tag","Symbol","toStringTag","startsWith","getFormHeader","boundary","name","field","header","getFormFooter","encoder","TextEncoder","extractBody","body","size","bytes","encode","byteLength","append","delete","get","getAll","has","set","sort","isURLSearchParameters","toString","Uint8Array","isAnyArrayBuffer","ArrayBuffer","isView","buffer","byteOffset","getReader","cancel","tee","isReadableStream","keys","values","entries","isFormData","randomBytes","getFormDataLength","form","length","Buffer","value","Readable","from","async","generatorOfFormData","getBoundary","hasKnownLength","getLengthSync","isReadable","isMultipartFormDataStream","asyncIterator","iterator","isIterable","contentLength","contentType","InflateStream","Transform","opts","super","this","_opts","_transform","chunk","encoding","callback","_inflate","zlib","createInflate","createInflateRaw","on","push","bind","err","destroy","write","_final","end","undefined","headersOfRawHeaders","rawHeaders","headers","Headers","i","methodToHttpOption","method","TypeError","toUpperCase","urlToHttpOptions","input","_url","URL","protocol","url","fetch","requestInit","initFromRequest","isRequest","initUrl","initBody","signal","redirect","toRedirectOption","requestUrl","requestBody","redirects","requestHeaders","requestOptions","Promise","_fetch","resolve","reject","outgoing","https","http","request","incoming","setTimeout","init","status","statusCode","statusText","statusMessage","code","location","locationURL","Error","Object","assign","reason","removeEventListener","aborted","addEventListener","toLowerCase","pipeline","createBrotliDecompress","flush","constants","BROTLI_OPERATION_FLUSH","finishFlush","createGunzip","Z_SYNC_FLUSH","PassThrough","createContentDecoder","createResponse","params","response","Response","defineProperty","redirected","assignOutgoingMessageHeaders","setHeaders","key","setHeader","Stream","fromWeb","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"minifetch.mjs","sources":["../src/body.ts","../src/encoding.ts","../src/webstd.ts","../src/fetch.ts"],"sourcesContent":["import { Readable } from 'node:stream';\nimport { isAnyArrayBuffer } from 'node:util/types';\nimport { randomBytes } from 'node:crypto';\nimport { Blob, FormData, URLSearchParams } from './webstd';\n\nexport type BodyInit =\n | Exclude<RequestInit['body'], undefined | null>\n | FormDataPolyfill\n | Readable;\n\nexport interface BodyState {\n contentLength: number | null;\n contentType: string | null;\n body: Readable | ReadableStream | Uint8Array | null;\n}\n\ninterface FormDataPolyfill extends Readable {\n getBoundary(): string;\n getLengthSync(): number;\n hasKnownLength(): number;\n}\n\nconst CRLF = '\\r\\n';\nconst CRLF_LENGTH = 2;\nconst BOUNDARY = '-'.repeat(2);\n\nconst isReadable = (object: any): object is Readable =>\n Readable.isReadable(object);\n\nconst isIterable = (\n object: any\n): object is AsyncIterable<any> | Iterable<any> =>\n typeof object[Symbol.asyncIterator] === 'function' ||\n typeof object[Symbol.iterator] === 'function';\n\nconst isMultipartFormDataStream = (object: any): object is FormDataPolyfill =>\n typeof object.getBoundary === 'function' &&\n typeof object.hasKnownLength === 'function' &&\n typeof object.getLengthSync === 'function' &&\n Readable.isReadable(object);\n\nconst isFormData = (object: any): object is FormData =>\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.set === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.keys === 'function' &&\n typeof object.values === 'function' &&\n typeof object.entries === 'function' &&\n typeof object.constructor === 'function' &&\n object[Symbol.toStringTag] === 'FormData';\n\nconst isURLSearchParameters = (object: any): object is URLSearchParams =>\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.has === 'function' &&\n typeof object.set === 'function' &&\n typeof object.sort === 'function' &&\n object[Symbol.toStringTag] === 'URLSearchParams';\n\nconst isReadableStream = (object: any): object is ReadableStream =>\n typeof object === 'object' &&\n typeof object.getReader === 'function' &&\n typeof object.cancel === 'function' &&\n typeof object.tee === 'function';\n\nconst isBlob = (object: any): object is Blob => {\n if (\n typeof object === 'object' &&\n typeof object.arrayBuffer === 'function' &&\n typeof object.type === 'string' &&\n typeof object.stream === 'function' &&\n typeof object.constructor === 'function'\n ) {\n const tag = object[Symbol.toStringTag];\n return tag.startsWith('Blob') || tag.startsWith('File');\n } else {\n return false;\n }\n};\n\nconst makeFormBoundary = (): string =>\n `formdata-${randomBytes(8).toString('hex')}`;\n\nconst getFormHeader = (\n boundary: string,\n name: string,\n field: File | Blob | string\n): string => {\n let header = `${BOUNDARY}${boundary}${CRLF}`;\n header += `Content-Disposition: form-data; name=\"${name}\"`;\n if (isBlob(field)) {\n header += `; filename=\"${(field as File).name ?? 'blob'}\"${CRLF}`;\n header += `Content-Type: ${field.type || 'application/octet-stream'}`;\n }\n return `${header}${CRLF}${CRLF}`;\n};\n\nconst getFormFooter = (boundary: string) =>\n `${BOUNDARY}${boundary}${BOUNDARY}${CRLF}${CRLF}`;\n\nexport const getFormDataLength = (form: FormData, boundary: string) => {\n let length = Buffer.byteLength(getFormFooter(boundary));\n for (const [name, value] of form)\n length +=\n Buffer.byteLength(getFormHeader(boundary, name, value)) +\n (isBlob(value) ? value.size : Buffer.byteLength(`${value}`)) +\n CRLF_LENGTH;\n return length;\n};\n\nasync function* generatorOfFormData(\n form: FormData,\n boundary: string\n): AsyncGenerator<ArrayBufferLike> {\n const encoder = new TextEncoder();\n for (const [name, value] of form) {\n if (isBlob(value)) {\n yield encoder.encode(getFormHeader(boundary, name, value));\n yield* value.stream();\n yield encoder.encode(CRLF);\n } else {\n yield encoder.encode(getFormHeader(boundary, name, value) + value + CRLF);\n }\n }\n yield encoder.encode(getFormFooter(boundary));\n}\n\nconst encoder = new TextEncoder();\n\nexport const extractBody = (object: BodyInit | null): BodyState => {\n let type: string | null = null;\n let body: Readable | ReadableStream | Uint8Array | null;\n let size: number | null = null;\n if (object == null) {\n body = null;\n size = 0;\n } else if (typeof object === 'string') {\n const bytes = encoder.encode(`${object}`);\n type = 'text/plain;charset=UTF-8';\n size = bytes.byteLength;\n body = bytes;\n } else if (isURLSearchParameters(object)) {\n const bytes = encoder.encode(object.toString());\n body = bytes;\n size = bytes.byteLength;\n type = 'application/x-www-form-urlencoded;charset=UTF-8';\n } else if (isBlob(object)) {\n size = object.size;\n type = object.type || null;\n body = object.stream();\n } else if (object instanceof Uint8Array) {\n body = object;\n size = object.byteLength;\n } else if (isAnyArrayBuffer(object)) {\n const bytes = new Uint8Array(object);\n body = bytes;\n size = bytes.byteLength;\n } else if (ArrayBuffer.isView(object)) {\n const bytes = new Uint8Array(\n object.buffer,\n object.byteOffset,\n object.byteLength\n );\n body = bytes;\n size = bytes.byteLength;\n } else if (isReadableStream(object)) {\n body = object;\n } else if (isFormData(object)) {\n const boundary = makeFormBoundary();\n type = `multipart/form-data; boundary=${boundary}`;\n size = getFormDataLength(object, boundary);\n body = Readable.from(generatorOfFormData(object, boundary));\n } else if (isMultipartFormDataStream(object)) {\n type = `multipart/form-data; boundary=${object.getBoundary()}`;\n size = object.hasKnownLength() ? object.getLengthSync() : null;\n body = object as Readable;\n } else if (isReadable(object)) {\n body = object as Readable;\n } else if (isIterable(object)) {\n body = Readable.from(object);\n } else {\n const bytes = encoder.encode(`${object}`);\n type = 'text/plain;charset=UTF-8';\n body = bytes;\n size = bytes.byteLength;\n }\n return {\n contentLength: size,\n contentType: type,\n body,\n };\n};\n","import { PassThrough, Transform, TransformCallback } from 'node:stream';\nimport * as zlib from 'node:zlib';\n\n/** @see https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2 */\ntype Encoding = 'gzip' | 'x-gzip' | 'deflate' | 'x-deflate' | 'br' | {};\n\n/** @see https://github.com/nodejs/undici/pull/2650 */\nclass InflateStream extends Transform {\n _opts?: zlib.ZlibOptions;\n _inflate?: Transform;\n\n constructor(opts?: zlib.ZlibOptions) {\n super();\n this._opts = opts;\n }\n\n _transform(\n chunk: Buffer,\n encoding: BufferEncoding,\n callback: TransformCallback\n ) {\n if (!this._inflate) {\n if (chunk.length === 0) {\n callback();\n return;\n }\n this._inflate =\n (chunk[0] & 0x0f) === 0x08\n ? zlib.createInflate(this._opts)\n : zlib.createInflateRaw(this._opts);\n this._inflate.on('data', this.push.bind(this));\n this._inflate.on('end', () => this.push(null));\n this._inflate.on('error', err => this.destroy(err));\n }\n this._inflate.write(chunk, encoding, callback);\n }\n\n _final(callback: TransformCallback) {\n if (this._inflate) {\n this._inflate.end();\n this._inflate = undefined;\n }\n callback();\n }\n}\n\nexport const createContentDecoder = (encoding: Encoding | {}) => {\n // See: https://github.com/nodejs/undici/blob/008187b/lib/web/fetch/index.js#L2138-L2160\n switch (encoding) {\n case 'br':\n return zlib.createBrotliDecompress({\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH,\n });\n case 'gzip':\n case 'x-gzip':\n return zlib.createGunzip({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n case 'deflate':\n case 'x-deflate':\n return new InflateStream({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n default:\n return new PassThrough();\n }\n};\n","import * as buffer from 'node:buffer';\n\ntype Or<T, U> = void extends T ? U : T;\n\nexport type HeadersInit =\n | string[][]\n | Record<string, string | ReadonlyArray<string>>\n | _Headers;\n\nexport type FormDataEntryValue = string | _File;\n\nexport type RequestInfo = string | _URL | _Request;\n\ninterface _Iterable<T, TReturn = any, TNext = any>\n extends Or<\n Iterable<T, TReturn, TNext>,\n globalThis.Iterable<T, TReturn, TNext>\n > {}\ninterface _AsyncIterable<T, TReturn = any, TNext = any>\n extends Or<\n AsyncIterable<T, TReturn, TNext>,\n globalThis.AsyncIterable<T, TReturn, TNext>\n > {}\ninterface _ReadableStream<T = any>\n extends Or<ReadableStream<T>, globalThis.ReadableStream<T>> {}\n\n// NOTE: AsyncIterable<Uint8Array> is left out\nexport type BodyInit =\n | ArrayBuffer\n | _Blob\n | NodeJS.ArrayBufferView\n | _URLSearchParams\n | _ReadableStream\n | _AsyncIterable<Uint8Array>\n | _FormData\n | _Iterable<Uint8Array>\n | null\n | string;\n\n// See: https://nodejs.org/docs/latest-v20.x/api/globals.html#class-file\n// The `File` global was only added in Node.js 20\ninterface _File extends _Blob, Or<File, globalThis.File> {\n readonly name: string;\n readonly lastModified: number;\n}\ninterface _File extends Or<globalThis.File, buffer.File> {}\ninterface FileClass extends Or<typeof globalThis.File, typeof buffer.File> {}\nconst _File: FileClass = globalThis.File || buffer.File;\nif (typeof globalThis.File === 'undefined') {\n globalThis.File = _File;\n}\n\n// There be dragons here.\n// This is complex because of overlapping definitions in lib.dom, @types/node, and undici-types\n// Some types define and overload constructor interfaces with type interfaces\n// Here, we have to account for global differences and split the overloads apart\n\ninterface _RequestInit extends Or<RequestInit, globalThis.RequestInit> {\n duplex?: 'half';\n}\ninterface _ResponseInit extends Or<ResponseInit, globalThis.ResponseInit> {}\n\ninterface _Blob extends Or<Blob, globalThis.Blob> {}\ninterface BlobClass extends Or<typeof Blob, typeof globalThis.Blob> {}\nconst _Blob: BlobClass = Blob;\n\ninterface _URLSearchParams\n extends Or<URLSearchParams, globalThis.URLSearchParams> {}\ninterface URLSearchParamsClass\n extends Or<typeof URLSearchParams, typeof globalThis.URLSearchParams> {}\nconst _URLSearchParams: URLSearchParamsClass = URLSearchParams as any;\n\ninterface _URL extends Or<URL, globalThis.URL> {}\ninterface URLClass extends Or<typeof URL, typeof globalThis.URL> {}\nconst _URL: URLClass = URL;\n\ninterface _Request extends Or<Request, globalThis.Request> {}\ninterface RequestClass extends Or<typeof Request, typeof globalThis.Request> {\n new (\n input: RequestInfo,\n init?: _RequestInit | Or<RequestInit, globalThis.RequestInit>\n ): _Request;\n}\nconst _Request: RequestClass = Request;\n\ninterface _Response extends Or<Response, globalThis.Response> {}\ninterface ResponseClass\n extends Or<typeof Response, typeof globalThis.Response> {\n new (body?: BodyInit, init?: _ResponseInit): _Response;\n}\nconst _Response: ResponseClass = Response;\n\ninterface _Headers extends Or<Headers, globalThis.Headers> {}\ninterface HeadersClass extends Or<typeof Headers, typeof globalThis.Headers> {\n new (init?: HeadersInit): _Headers;\n}\nconst _Headers: HeadersClass = Headers;\n\ninterface _FormData\n extends Or<\n FormData & _Iterable<[string, FormDataEntryValue]>,\n globalThis.FormData\n > {}\ninterface FormDataClass\n extends Or<typeof FormData, typeof globalThis.FormData> {}\nconst _FormData: FormDataClass = FormData;\n\nexport {\n type _RequestInit as RequestInit,\n type _ResponseInit as ResponseInit,\n _Blob as Blob,\n _File as File,\n _URL as URL,\n _URLSearchParams as URLSearchParams,\n _Request as Request,\n _Response as Response,\n _Headers as Headers,\n _FormData as FormData,\n};\n","import { Stream, Readable, pipeline } from 'node:stream';\nimport * as https from 'node:https';\nimport * as http from 'node:http';\nimport * as url from 'node:url';\n\nimport { extractBody } from './body';\nimport { createContentDecoder } from './encoding';\nimport { URL, Request, RequestInit, Response } from './webstd';\n\n/** Maximum allowed redirects (matching Chromium's limit) */\nconst MAX_REDIRECTS = 20;\n\n/** Convert Node.js raw headers array to Headers */\nconst headersOfRawHeaders = (rawHeaders: readonly string[]): Headers => {\n const headers = new Headers();\n for (let i = 0; i < rawHeaders.length; i += 2)\n headers.set(rawHeaders[i], rawHeaders[i + 1]);\n return headers;\n};\n\n/** Assign Headers to a Node.js OutgoingMessage (request) */\nconst assignOutgoingMessageHeaders = (\n outgoing: http.OutgoingMessage,\n headers: Headers\n) => {\n if (typeof outgoing.setHeaders === 'function') {\n outgoing.setHeaders(headers);\n } else {\n for (const [key, value] of headers) outgoing.setHeader(key, value);\n }\n};\n\n/** Normalize methods and disallow special methods */\nconst toRedirectOption = (\n redirect: string | undefined\n): 'follow' | 'manual' | 'error' => {\n switch (redirect) {\n case 'follow':\n case 'manual':\n case 'error':\n return redirect;\n case undefined:\n return 'follow';\n default:\n throw new TypeError(\n `Request constructor: ${redirect} is not an accepted type. Expected one of follow, manual, error.`\n );\n }\n};\n\n/** Normalize methods and disallow special methods */\nconst methodToHttpOption = (method: string | undefined): string => {\n switch (method) {\n case 'CONNECT':\n case 'TRACE':\n case 'TRACK':\n throw new TypeError(\n `Failed to construct 'Request': '${method}' HTTP method is unsupported.`\n );\n default:\n return method ? method.toUpperCase() : 'GET';\n }\n};\n\n/** Convert URL to Node.js HTTP request options and disallow unsupported protocols */\nconst urlToHttpOptions = (input: URL) => {\n const _url = new URL(input);\n switch (_url.protocol) {\n // TODO: 'file:' and 'data:' support\n case 'http:':\n case 'https:':\n return url.urlToHttpOptions(_url);\n default:\n throw new TypeError(`URL scheme \"${_url.protocol}\" is not supported.`);\n }\n};\n\n/** Returns if `input` is a Request object */\nconst isRequest = (input: any): input is Request =>\n input != null && typeof input === 'object' && 'body' in input;\n\n/** Returns if status `code` is a redirect code */\nconst isRedirectCode = (\n code: number | undefined\n): code is 301 | 302 | 303 | 307 | 308 =>\n code === 301 || code === 302 || code === 303 || code === 307 || code === 308;\n\nfunction createResponse(\n body: ConstructorParameters<typeof Response>[0] | null,\n init: ResponseInit,\n params: {\n url: string;\n redirected: boolean;\n type: 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect';\n }\n) {\n const response = new Response(body, init);\n Object.defineProperty(response, 'url', { value: params.url });\n if (params.type !== 'default')\n Object.defineProperty(response, 'type', { value: params.type });\n if (params.redirected)\n Object.defineProperty(response, 'redirected', { value: params.redirected });\n return response;\n}\n\nasync function _fetch(\n input: string | URL | Request,\n requestInit?: RequestInit\n): Promise<Response> {\n const initFromRequest = isRequest(input);\n const initUrl = initFromRequest ? input.url : input;\n const initBody = initFromRequest ? input.body : requestInit?.body || null;\n const signal = initFromRequest\n ? input.signal\n : requestInit?.signal || undefined;\n const redirect = toRedirectOption(\n initFromRequest ? input.redirect : requestInit?.redirect\n );\n\n let requestUrl = new URL(initUrl);\n let requestBody = extractBody(initBody);\n let redirects = 0;\n\n const requestHeaders = new Headers(\n requestInit?.headers || (initFromRequest ? input.headers : undefined)\n );\n const requestOptions = {\n ...urlToHttpOptions(requestUrl),\n method: methodToHttpOption(\n initFromRequest ? input.method : requestInit?.method\n ),\n signal,\n } satisfies http.RequestOptions;\n\n function _call(\n resolve: (response: Response | Promise<Response>) => void,\n reject: (reason?: any) => void\n ) {\n const method = requestOptions.method;\n const protocol = requestOptions.protocol === 'https:' ? https : http;\n const outgoing = protocol.request(requestOptions);\n\n outgoing.on('response', incoming => {\n incoming.setTimeout(0); // Forcefully disable timeout\n\n const init = {\n status: incoming.statusCode,\n statusText: incoming.statusMessage,\n headers: headersOfRawHeaders(incoming.rawHeaders),\n } satisfies ResponseInit;\n\n if (isRedirectCode(init.status)) {\n const location = init.headers.get('Location');\n const locationURL =\n location != null ? new URL(location, requestUrl) : null;\n if (redirect === 'error') {\n // TODO: do we need a special Error instance here?\n reject(\n new Error(\n 'URI requested responds with a redirect, redirect mode is set to error'\n )\n );\n return;\n } else if (redirect === 'manual' && locationURL !== null) {\n init.headers.set('Location', locationURL.toString());\n } else if (redirect === 'follow' && locationURL !== null) {\n if (++redirects > MAX_REDIRECTS) {\n reject(new Error(`maximum redirect reached at: ${requestUrl}`));\n return;\n } else if (\n locationURL.protocol !== 'http:' &&\n locationURL.protocol !== 'https:'\n ) {\n // TODO: do we need a special Error instance here?\n reject(new Error('URL scheme must be a HTTP(S) scheme'));\n return;\n }\n\n if (\n init.status === 303 ||\n ((init.status === 301 || init.status === 302) && method === 'POST')\n ) {\n requestBody = extractBody(null);\n requestOptions.method = 'GET';\n requestHeaders.delete('Content-Length');\n } else if (\n requestBody.body != null &&\n requestBody.contentLength == null\n ) {\n reject(new Error('Cannot follow redirect with a streamed body'));\n return;\n } else {\n requestBody = extractBody(initBody);\n }\n\n Object.assign(\n requestOptions,\n urlToHttpOptions((requestUrl = locationURL))\n );\n return _call(resolve, reject);\n }\n }\n\n const destroy = (reason?: any) => {\n signal?.removeEventListener('abort', destroy);\n if (reason) {\n incoming.destroy(signal?.aborted ? signal.reason : reason);\n reject(signal?.aborted ? signal.reason : reason);\n }\n };\n\n signal?.addEventListener('abort', destroy);\n\n let body: Readable | null = incoming;\n const encoding = init.headers.get('Content-Encoding')?.toLowerCase();\n if (method === 'HEAD' || init.status === 204 || init.status === 304) {\n body = null;\n } else if (encoding != null) {\n init.headers.set('Content-Encoding', encoding);\n body = pipeline(body, createContentDecoder(encoding), destroy);\n }\n\n resolve(\n createResponse(body, init, {\n type: 'default',\n url: requestUrl.toString(),\n redirected: redirects > 0,\n })\n );\n });\n\n outgoing.on('error', reject);\n\n if (!requestHeaders.has('Accept')) requestHeaders.set('Accept', '*/*');\n if (requestBody.contentType)\n requestHeaders.set('Content-Type', requestBody.contentType);\n\n if (requestBody.body == null && (method === 'POST' || method === 'PUT')) {\n requestHeaders.set('Content-Length', '0');\n } else if (requestBody.body != null && requestBody.contentLength != null) {\n requestHeaders.set('Content-Length', `${requestBody.contentLength}`);\n }\n\n assignOutgoingMessageHeaders(outgoing, requestHeaders);\n\n if (requestBody.body == null) {\n outgoing.end();\n } else if (requestBody.body instanceof Uint8Array) {\n outgoing.write(requestBody.body);\n outgoing.end();\n } else {\n const body =\n requestBody.body instanceof Stream\n ? requestBody.body\n : Readable.fromWeb(requestBody.body);\n pipeline(body, outgoing, error => {\n if (error) reject(error);\n });\n }\n }\n\n return await new Promise(_call);\n}\n\nexport { _fetch as fetch };\n"],"names":["CRLF","BOUNDARY","repeat","isBlob","object","arrayBuffer","type","stream","constructor","tag","Symbol","toStringTag","startsWith","getFormHeader","boundary","name","field","header","getFormFooter","encoder","TextEncoder","extractBody","body","size","bytes","encode","byteLength","append","delete","get","getAll","has","set","sort","isURLSearchParameters","toString","Uint8Array","isAnyArrayBuffer","ArrayBuffer","isView","buffer","byteOffset","getReader","cancel","tee","isReadableStream","keys","values","entries","isFormData","randomBytes","getFormDataLength","form","length","Buffer","value","Readable","from","async","generatorOfFormData","getBoundary","hasKnownLength","getLengthSync","isReadable","isMultipartFormDataStream","asyncIterator","iterator","isIterable","contentLength","contentType","InflateStream","Transform","opts","super","this","_opts","_transform","chunk","encoding","callback","_inflate","zlib","createInflate","createInflateRaw","on","push","bind","err","destroy","write","_final","end","undefined","_File","globalThis","File","_Blob","Blob","_URLSearchParams","URLSearchParams","_URL","URL","_Request","Request","_Response","Response","_Headers","Headers","_FormData","FormData","headersOfRawHeaders","rawHeaders","headers","i","methodToHttpOption","method","TypeError","toUpperCase","urlToHttpOptions","input","_url","protocol","url","_fetch","requestInit","initFromRequest","isRequest","initUrl","initBody","signal","redirect","toRedirectOption","requestUrl","requestBody","redirects","requestHeaders","requestOptions","Promise","_call","resolve","reject","outgoing","https","http","request","incoming","setTimeout","init","status","statusCode","statusText","statusMessage","code","location","locationURL","Error","Object","assign","reason","removeEventListener","aborted","addEventListener","toLowerCase","pipeline","createBrotliDecompress","flush","constants","BROTLI_OPERATION_FLUSH","finishFlush","createGunzip","Z_SYNC_FLUSH","PassThrough","createContentDecoder","createResponse","params","response","defineProperty","redirected","assignOutgoingMessageHeaders","setHeaders","key","setHeader","Stream","fromWeb","error"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fetch-nodeshim",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A Node.js fetch shim using built-in Request, Response, and Headers (but without native fetch)",
|
|
5
5
|
"author": "Phil Pluckthun <phil@kitten.sh>",
|
|
6
6
|
"source": "./src/index.ts",
|
|
@@ -41,6 +41,8 @@
|
|
|
41
41
|
"@rollup/plugin-commonjs": "^28.0.2",
|
|
42
42
|
"@rollup/plugin-node-resolve": "^16.0.0",
|
|
43
43
|
"@rollup/plugin-terser": "^0.4.4",
|
|
44
|
+
"@types-internal/node-18": "npm:@types/node@^18.19.0",
|
|
45
|
+
"@types-internal/node-20": "npm:@types/node@^20.17.0",
|
|
44
46
|
"@types/node": "^22.12.0",
|
|
45
47
|
"busboy": "^0.3.1",
|
|
46
48
|
"dotenv": "^16.4.7",
|
|
@@ -53,14 +55,18 @@
|
|
|
53
55
|
"rollup-plugin-cjs-check": "^1.0.3",
|
|
54
56
|
"rollup-plugin-dts": "^6.1.1",
|
|
55
57
|
"typescript": "^5.7.3",
|
|
56
|
-
"undici-types": "^
|
|
58
|
+
"undici-types": "^6.20.0",
|
|
57
59
|
"vitest": "^3.0.4"
|
|
58
60
|
},
|
|
59
61
|
"scripts": {
|
|
60
62
|
"test": "vitest test",
|
|
61
63
|
"test:run": "vitest test --run",
|
|
62
|
-
"check": "tsc --noEmit",
|
|
63
64
|
"build": "rollup -c ./scripts/rollup.config.mjs",
|
|
65
|
+
"postbuild": "tsc --noEmit ./dist/minifetch.d.ts",
|
|
66
|
+
"check": "tsc --noEmit",
|
|
67
|
+
"check:node18": "tsc --noEmit -p ./tsconfig-node18.json",
|
|
68
|
+
"check:node20": "tsc --noEmit -p ./tsconfig-node20.json",
|
|
69
|
+
"check:all": "run-s check check:node18 check:node20",
|
|
64
70
|
"clean": "rimraf dist node_modules/.cache",
|
|
65
71
|
"changeset:version": "changeset version && pnpm install --lockfile-only",
|
|
66
72
|
"changeset:publish": "changeset publish"
|