fetch-nodeshim 0.2.1-canary-83f2b69271c3dc3d97aa9c6a60ae2ddbe62a46ae → 0.3.0-canary-4913c1df1c113e5c07d128c574512b23632ce954

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 CHANGED
@@ -1,6 +1,13 @@
1
1
  # minifetch
2
2
 
3
- ## 0.2.1-canary-83f2b69271c3dc3d97aa9c6a60ae2ddbe62a46ae
3
+ ## 0.3.0-canary-4913c1df1c113e5c07d128c574512b23632ce954
4
+
5
+ ### Minor Changes
6
+
7
+ - Add `Body` mixin as export
8
+ Submitted by [@kitten](https://github.com/kitten) (See [#6](https://github.com/kitten/fetch-nodeshim/pull/6))
9
+
10
+ ## 0.2.1
4
11
 
5
12
  ### Patch Changes
6
13
 
package/LICENSE.md CHANGED
@@ -1,6 +1,7 @@
1
1
  MIT License
2
2
 
3
3
  Copyright (c) Phil Pluckthun,
4
+ Copyright (c) 650 Industries, Inc. (aka Expo),
4
5
  Copyright (c) 2016 - 2020 Node Fetch Team,
5
6
  Copyright (c) Remix Software Inc. 2020-2021,
6
7
  Copyright (c) Shopify Inc. 2022-2024
@@ -1,4 +1,7 @@
1
1
  import * as buffer from 'node:buffer';
2
+ import * as buffer$1 from 'buffer';
3
+ import * as undici_types from 'undici-types';
4
+ import { Readable } from 'node:stream';
2
5
 
3
6
  type Or<T, U> = void extends T ? U : T;
4
7
  type HeadersInit = string[][] | Record<string, string | ReadonlyArray<string>> | _Headers;
@@ -9,7 +12,7 @@ interface _Iterable<T, TReturn = any, TNext = any>
9
12
  interface _AsyncIterable<T, TReturn = any, TNext = any>
10
13
  extends Or<AsyncIterable<T, TReturn, TNext>, globalThis.AsyncIterable<T, TReturn, TNext>> {}
11
14
  interface _ReadableStream<T = any> extends Or<ReadableStream<T>, globalThis.ReadableStream<T>> {}
12
- type BodyInit =
15
+ type BodyInit$1 =
13
16
  | ArrayBuffer
14
17
  | _Blob
15
18
  | NodeJS.ArrayBufferView
@@ -47,7 +50,7 @@ interface RequestClass extends Or<typeof Request, typeof globalThis.Request> {
47
50
  interface _Request extends Or<Request, globalThis.Request> {}
48
51
  declare const _Request: RequestClass;
49
52
  interface ResponseClass extends Or<typeof Response, typeof globalThis.Response> {
50
- new (body?: BodyInit, init?: _ResponseInit): _Response;
53
+ new (body?: BodyInit$1, init?: _ResponseInit): _Response;
51
54
  }
52
55
  interface _Response extends Or<Response, globalThis.Response> {}
53
56
  declare const _Response: ResponseClass;
@@ -66,9 +69,29 @@ declare function _fetch(
66
69
  requestInit?: _RequestInit
67
70
  ): Promise<_Response>;
68
71
 
72
+ type BodyInit = Exclude<RequestInit['body'], undefined | null> | FormDataPolyfill | Readable;
73
+ interface FormDataPolyfill extends Readable {
74
+ getBoundary(): string;
75
+ getLengthSync(): number;
76
+ hasKnownLength(): number;
77
+ }
78
+ declare const kBodyInternals: unique symbol;
79
+ declare class Body {
80
+ private [kBodyInternals];
81
+ constructor(init: BodyInit | null);
82
+ get body(): Uint8Array<ArrayBufferLike> | ReadableStream<any> | Readable | null;
83
+ get bodyUsed(): boolean;
84
+ arrayBuffer(): Promise<ArrayBuffer | Uint8Array<ArrayBufferLike>>;
85
+ formData(): Promise<undici_types.FormData>;
86
+ blob(): Promise<buffer$1.Blob>;
87
+ json(): Promise<any>;
88
+ text(): Promise<string>;
89
+ }
90
+
69
91
  export {
70
92
  _Blob as Blob,
71
- type BodyInit,
93
+ Body,
94
+ type BodyInit$1 as BodyInit,
72
95
  _File as File,
73
96
  _FormData as FormData,
74
97
  type FormDataEntryValue,
package/dist/minifetch.js CHANGED
@@ -10,13 +10,13 @@ var r = require("node:http");
10
10
 
11
11
  var n = require("node:url");
12
12
 
13
- var o = require("node:util/types");
13
+ var a = require("node:util/types");
14
14
 
15
- var a = require("node:crypto");
15
+ var o = require("node:crypto");
16
16
 
17
- var s = require("node:zlib");
17
+ var s = require("node:buffer");
18
18
 
19
- var i = require("node:buffer");
19
+ var i = require("node:zlib");
20
20
 
21
21
  function _interopNamespaceDefault(e) {
22
22
  var t = Object.create(null);
@@ -47,9 +47,33 @@ var c = _interopNamespaceDefault(s);
47
47
 
48
48
  var d = _interopNamespaceDefault(i);
49
49
 
50
- var p = "\r\n";
50
+ var p = globalThis.File || c.File;
51
51
 
52
- var y = "-".repeat(2);
52
+ if (void 0 === globalThis.File) {
53
+ globalThis.File = p;
54
+ }
55
+
56
+ var y = Blob;
57
+
58
+ var h = URLSearchParams;
59
+
60
+ var v = URL;
61
+
62
+ var b = Request;
63
+
64
+ var m = Response;
65
+
66
+ var g = Headers;
67
+
68
+ var w = FormData;
69
+
70
+ var T = "\r\n";
71
+
72
+ var L = "-".repeat(2);
73
+
74
+ var isReadable = t => e.Readable.isReadable(t);
75
+
76
+ var isReadableStream = e => "object" == typeof e && "function" == typeof e.getReader && "function" == typeof e.cancel && "function" == typeof e.tee;
53
77
 
54
78
  var isBlob = e => {
55
79
  if ("object" == typeof e && "function" == typeof e.arrayBuffer && "string" == typeof e.type && "function" == typeof e.stream && "function" == typeof e.constructor) {
@@ -61,18 +85,18 @@ var isBlob = e => {
61
85
  };
62
86
 
63
87
  var getFormHeader = (e, t, r) => {
64
- var n = `${y}${e}${p}`;
88
+ var n = `${L}${e}${T}`;
65
89
  n += `Content-Disposition: form-data; name="${t}"`;
66
90
  if (isBlob(r)) {
67
- n += `; filename="${r.name ?? "blob"}"${p}`;
91
+ n += `; filename="${r.name ?? "blob"}"${T}`;
68
92
  n += `Content-Type: ${r.type || "application/octet-stream"}`;
69
93
  }
70
- return `${n}${p}${p}`;
94
+ return `${n}${T}${T}`;
71
95
  };
72
96
 
73
- var getFormFooter = e => `${y}${e}${y}${p}${p}`;
97
+ var getFormFooter = e => `${L}${e}${L}${T}${T}`;
74
98
 
75
- var h = new TextEncoder;
99
+ var _ = new TextEncoder;
76
100
 
77
101
  var extractBody = t => {
78
102
  var r = null;
@@ -82,12 +106,12 @@ var extractBody = t => {
82
106
  n = null;
83
107
  s = 0;
84
108
  } else if ("string" == typeof t) {
85
- var i = h.encode(`${t}`);
109
+ var i = _.encode(`${t}`);
86
110
  r = "text/plain;charset=UTF-8";
87
111
  s = i.byteLength;
88
112
  n = i;
89
113
  } 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)) {
90
- var f = h.encode(t.toString());
114
+ var f = _.encode(t.toString());
91
115
  n = f;
92
116
  s = f.byteLength;
93
117
  r = "application/x-www-form-urlencoded;charset=UTF-8";
@@ -98,7 +122,7 @@ var extractBody = t => {
98
122
  } else if (t instanceof Uint8Array) {
99
123
  n = t;
100
124
  s = t.byteLength;
101
- } else if (o.isAnyArrayBuffer(t)) {
125
+ } else if (a.isAnyArrayBuffer(t)) {
102
126
  var l = new Uint8Array(t);
103
127
  n = l;
104
128
  s = l.byteLength;
@@ -106,27 +130,27 @@ var extractBody = t => {
106
130
  var u = new Uint8Array(t.buffer, t.byteOffset, t.byteLength);
107
131
  n = u;
108
132
  s = u.byteLength;
109
- } else if ((e => "object" == typeof e && "function" == typeof e.getReader && "function" == typeof e.cancel && "function" == typeof e.tee)(t)) {
133
+ } else if (isReadableStream(t)) {
110
134
  n = t;
111
135
  } 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)) {
112
- var c = `formdata-${a.randomBytes(8).toString("hex")}`;
136
+ var c = `formdata-${o.randomBytes(8).toString("hex")}`;
113
137
  r = `multipart/form-data; boundary=${c}`;
114
138
  s = ((e, t) => {
115
139
  var r = Buffer.byteLength(getFormFooter(t));
116
- for (var [n, o] of e) {
117
- r += Buffer.byteLength(getFormHeader(t, n, o)) + (isBlob(o) ? o.size : Buffer.byteLength(`${o}`)) + 2;
140
+ for (var [n, a] of e) {
141
+ r += Buffer.byteLength(getFormHeader(t, n, a)) + (isBlob(a) ? a.size : Buffer.byteLength(`${a}`)) + 2;
118
142
  }
119
143
  return r;
120
144
  })(t, c);
121
145
  n = e.Readable.from(async function* generatorOfFormData(e, t) {
122
146
  var r = new TextEncoder;
123
- for (var [n, o] of e) {
124
- if (isBlob(o)) {
125
- yield r.encode(getFormHeader(t, n, o));
126
- yield* o.stream();
127
- yield r.encode(p);
147
+ for (var [n, a] of e) {
148
+ if (isBlob(a)) {
149
+ yield r.encode(getFormHeader(t, n, a));
150
+ yield* a.stream();
151
+ yield r.encode(T);
128
152
  } else {
129
- yield r.encode(getFormHeader(t, n, o) + o + p);
153
+ yield r.encode(getFormHeader(t, n, a) + a + T);
130
154
  }
131
155
  }
132
156
  yield r.encode(getFormFooter(t));
@@ -135,12 +159,12 @@ var extractBody = t => {
135
159
  r = `multipart/form-data; boundary=${t.getBoundary()}`;
136
160
  s = t.hasKnownLength() ? t.getLengthSync() : null;
137
161
  n = t;
138
- } else if ((t => e.Readable.isReadable(t))(t)) {
162
+ } else if (isReadable(t)) {
139
163
  n = t;
140
164
  } else if ((e => "function" == typeof e[Symbol.asyncIterator] || "function" == typeof e[Symbol.iterator])(t)) {
141
165
  n = e.Readable.from(t);
142
166
  } else {
143
- var d = h.encode(`${t}`);
167
+ var d = _.encode(`${t}`);
144
168
  r = "text/plain;charset=UTF-8";
145
169
  n = d;
146
170
  s = d.byteLength;
@@ -152,6 +176,8 @@ var extractBody = t => {
152
176
  };
153
177
  };
154
178
 
179
+ var S = Symbol("kBodyInternals");
180
+
155
181
  class InflateStream extends e.Transform {
156
182
  constructor(e) {
157
183
  super();
@@ -163,7 +189,7 @@ class InflateStream extends e.Transform {
163
189
  r();
164
190
  return;
165
191
  }
166
- this._inflate = 8 == (15 & e[0]) ? c.createInflate(this._opts) : c.createInflateRaw(this._opts);
192
+ this._inflate = 8 == (15 & e[0]) ? d.createInflate(this._opts) : d.createInflateRaw(this._opts);
167
193
  this._inflate.on("data", this.push.bind(this));
168
194
  this._inflate.on("end", (() => this.push(null)));
169
195
  this._inflate.on("error", (e => this.destroy(e)));
@@ -179,26 +205,6 @@ class InflateStream extends e.Transform {
179
205
  }
180
206
  }
181
207
 
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
-
202
208
  var headersOfRawHeaders = e => {
203
209
  var t = new Headers;
204
210
  for (var r = 0; r < e.length; r += 2) {
@@ -220,7 +226,7 @@ var methodToHttpOption = e => {
220
226
  };
221
227
 
222
228
  var urlToHttpOptions = e => {
223
- var t = new g(e);
229
+ var t = new v(e);
224
230
  switch (t.protocol) {
225
231
  case "http:":
226
232
  case "https:":
@@ -233,8 +239,8 @@ var urlToHttpOptions = e => {
233
239
 
234
240
  async function _fetch(t, r) {
235
241
  var n = (e => null != e && "object" == typeof e && "body" in e)(t);
236
- var o = n ? t.url : t;
237
- var a = n ? t.body : r?.body || null;
242
+ var a = n ? t.url : t;
243
+ var o = n ? t.body : r?.body || null;
238
244
  var s = n ? t.signal : r?.signal || void 0;
239
245
  var i = (e => {
240
246
  switch (e) {
@@ -250,8 +256,8 @@ async function _fetch(t, r) {
250
256
  throw new TypeError(`Request constructor: ${e} is not an accepted type. Expected one of follow, manual, error.`);
251
257
  }
252
258
  })(n ? t.redirect : r?.redirect);
253
- var u = new g(o);
254
- var d = extractBody(a);
259
+ var u = new v(a);
260
+ var c = extractBody(o);
255
261
  var p = 0;
256
262
  var y = new Headers(r?.headers || (n ? t.headers : void 0));
257
263
  var h = {
@@ -261,88 +267,88 @@ async function _fetch(t, r) {
261
267
  };
262
268
  return await new Promise((function _call(t, r) {
263
269
  var n = h.method;
264
- var o = ("https:" === h.protocol ? f : l).request(h);
265
- o.on("response", (o => {
266
- o.setTimeout(0);
270
+ var a = ("https:" === h.protocol ? f : l).request(h);
271
+ a.on("response", (a => {
272
+ a.setTimeout(0);
267
273
  var f = {
268
- status: o.statusCode,
269
- statusText: o.statusMessage,
270
- headers: headersOfRawHeaders(o.rawHeaders)
274
+ status: a.statusCode,
275
+ statusText: a.statusMessage,
276
+ headers: headersOfRawHeaders(a.rawHeaders)
271
277
  };
272
- if (301 === (b = f.status) || 302 === b || 303 === b || 307 === b || 308 === b) {
278
+ if (301 === (g = f.status) || 302 === g || 303 === g || 307 === g || 308 === g) {
273
279
  var l = f.headers.get("Location");
274
- var v = null != l ? new g(l, u) : null;
280
+ var b = null != l ? new v(l, u) : null;
275
281
  if ("error" === i) {
276
282
  r(new Error("URI requested responds with a redirect, redirect mode is set to error"));
277
283
  return;
278
- } else if ("manual" === i && null !== v) {
279
- f.headers.set("Location", v.toString());
280
- } else if ("follow" === i && null !== v) {
284
+ } else if ("manual" === i && null !== b) {
285
+ f.headers.set("Location", b.toString());
286
+ } else if ("follow" === i && null !== b) {
281
287
  if (++p > 20) {
282
288
  r(new Error(`maximum redirect reached at: ${u}`));
283
289
  return;
284
- } else if ("http:" !== v.protocol && "https:" !== v.protocol) {
290
+ } else if ("http:" !== b.protocol && "https:" !== b.protocol) {
285
291
  r(new Error("URL scheme must be a HTTP(S) scheme"));
286
292
  return;
287
293
  }
288
294
  if (303 === f.status || (301 === f.status || 302 === f.status) && "POST" === n) {
289
- d = extractBody(null);
295
+ c = extractBody(null);
290
296
  h.method = "GET";
291
297
  y.delete("Content-Length");
292
- } else if (null != d.body && null == d.contentLength) {
298
+ } else if (null != c.body && null == c.contentLength) {
293
299
  r(new Error("Cannot follow redirect with a streamed body"));
294
300
  return;
295
301
  } else {
296
- d = extractBody(a);
302
+ c = extractBody(o);
297
303
  }
298
- Object.assign(h, urlToHttpOptions(u = v));
304
+ Object.assign(h, urlToHttpOptions(u = b));
299
305
  return _call(t, r);
300
306
  }
301
307
  }
302
- var b;
308
+ var g;
303
309
  var destroy = e => {
304
310
  s?.removeEventListener("abort", destroy);
305
311
  if (e) {
306
- o.destroy(s?.aborted ? s.reason : e);
312
+ a.destroy(s?.aborted ? s.reason : e);
307
313
  r(s?.aborted ? s.reason : e);
308
314
  }
309
315
  };
310
316
  s?.addEventListener("abort", destroy);
311
- var m = o;
312
- var w = f.headers.get("Content-Encoding")?.toLowerCase();
317
+ var w = a;
318
+ var T = f.headers.get("Content-Encoding")?.toLowerCase();
313
319
  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 => {
320
+ w = null;
321
+ } else if (null != T) {
322
+ f.headers.set("Content-Encoding", T);
323
+ w = e.pipeline(w, (t => {
318
324
  switch (t) {
319
325
  case "br":
320
- return c.createBrotliDecompress({
321
- flush: c.constants.BROTLI_OPERATION_FLUSH,
322
- finishFlush: c.constants.BROTLI_OPERATION_FLUSH
326
+ return d.createBrotliDecompress({
327
+ flush: d.constants.BROTLI_OPERATION_FLUSH,
328
+ finishFlush: d.constants.BROTLI_OPERATION_FLUSH
323
329
  });
324
330
 
325
331
  case "gzip":
326
332
  case "x-gzip":
327
- return c.createGunzip({
328
- flush: c.constants.Z_SYNC_FLUSH,
329
- finishFlush: c.constants.Z_SYNC_FLUSH
333
+ return d.createGunzip({
334
+ flush: d.constants.Z_SYNC_FLUSH,
335
+ finishFlush: d.constants.Z_SYNC_FLUSH
330
336
  });
331
337
 
332
338
  case "deflate":
333
339
  case "x-deflate":
334
340
  return new InflateStream({
335
- flush: c.constants.Z_SYNC_FLUSH,
336
- finishFlush: c.constants.Z_SYNC_FLUSH
341
+ flush: d.constants.Z_SYNC_FLUSH,
342
+ finishFlush: d.constants.Z_SYNC_FLUSH
337
343
  });
338
344
 
339
345
  default:
340
346
  return new e.PassThrough;
341
347
  }
342
- })(w), destroy);
348
+ })(T), destroy);
343
349
  }
344
350
  t(function createResponse(e, t, r) {
345
- var n = new L(e, t);
351
+ var n = new m(e, t);
346
352
  Object.defineProperty(n, "url", {
347
353
  value: r.url
348
354
  });
@@ -357,23 +363,23 @@ async function _fetch(t, r) {
357
363
  });
358
364
  }
359
365
  return n;
360
- }(m, f, {
366
+ }(w, f, {
361
367
  type: "default",
362
368
  url: u.toString(),
363
369
  redirected: p > 0
364
370
  }));
365
371
  }));
366
- o.on("error", r);
372
+ a.on("error", r);
367
373
  if (!y.has("Accept")) {
368
374
  y.set("Accept", "*/*");
369
375
  }
370
- if (d.contentType) {
371
- y.set("Content-Type", d.contentType);
376
+ if (c.contentType) {
377
+ y.set("Content-Type", c.contentType);
372
378
  }
373
- if (null == d.body && ("POST" === n || "PUT" === n)) {
379
+ if (null == c.body && ("POST" === n || "PUT" === n)) {
374
380
  y.set("Content-Length", "0");
375
- } else if (null != d.body && null != d.contentLength) {
376
- y.set("Content-Length", `${d.contentLength}`);
381
+ } else if (null != c.body && null != c.contentLength) {
382
+ y.set("Content-Length", `${c.contentLength}`);
377
383
  }
378
384
  ((e, t) => {
379
385
  if ("function" == typeof e.setHeaders) {
@@ -383,15 +389,15 @@ async function _fetch(t, r) {
383
389
  e.setHeader(r, n);
384
390
  }
385
391
  }
386
- })(o, y);
387
- if (null == d.body) {
388
- o.end();
389
- } else if (d.body instanceof Uint8Array) {
390
- o.write(d.body);
391
- o.end();
392
+ })(a, y);
393
+ if (null == c.body) {
394
+ a.end();
395
+ } else if (c.body instanceof Uint8Array) {
396
+ a.write(c.body);
397
+ a.end();
392
398
  } else {
393
- var v = d.body instanceof e.Stream ? d.body : e.Readable.fromWeb(d.body);
394
- e.pipeline(v, o, (e => {
399
+ var b = c.body instanceof e.Stream ? c.body : e.Readable.fromWeb(c.body);
400
+ e.pipeline(b, a, (e => {
395
401
  if (e) {
396
402
  r(e);
397
403
  }
@@ -400,21 +406,70 @@ async function _fetch(t, r) {
400
406
  }));
401
407
  }
402
408
 
403
- exports.Blob = b;
409
+ exports.Blob = y;
410
+
411
+ exports.Body = class Body {
412
+ constructor(e) {
413
+ this[S] = extractBody(e);
414
+ }
415
+ get body() {
416
+ return this[S].body;
417
+ }
418
+ get bodyUsed() {
419
+ var {body: t} = this[S];
420
+ if (isReadable(t)) {
421
+ return e.Readable.isDisturbed(t);
422
+ } else if (isReadableStream(t)) {
423
+ return t.locked;
424
+ } else {
425
+ return !1;
426
+ }
427
+ }
428
+ async arrayBuffer() {
429
+ var {body: e} = this[S];
430
+ return a.isAnyArrayBuffer(e) ? e : new m(this.body).arrayBuffer();
431
+ }
432
+ async formData() {
433
+ var {body: e, contentLength: t, contentType: r} = this[S];
434
+ var n = {};
435
+ if (t) {
436
+ n["Content-Length"] = t;
437
+ }
438
+ if (r) {
439
+ n["Content-Type"] = r;
440
+ }
441
+ return new m(e, {
442
+ headers: n
443
+ }).formData();
444
+ }
445
+ async blob() {
446
+ var {contentType: e} = this[S];
447
+ return new y([ await this.arrayBuffer() ], {
448
+ type: e ?? void 0
449
+ });
450
+ }
451
+ async json() {
452
+ var e = await this.text();
453
+ return JSON.parse(e);
454
+ }
455
+ async text() {
456
+ return (new TextDecoder).decode(await this.arrayBuffer());
457
+ }
458
+ };
404
459
 
405
- exports.File = v;
460
+ exports.File = p;
406
461
 
407
- exports.FormData = _;
462
+ exports.FormData = w;
408
463
 
409
- exports.Headers = T;
464
+ exports.Headers = g;
410
465
 
411
- exports.Request = w;
466
+ exports.Request = b;
412
467
 
413
- exports.Response = L;
468
+ exports.Response = m;
414
469
 
415
- exports.URL = g;
470
+ exports.URL = v;
416
471
 
417
- exports.URLSearchParams = m;
472
+ exports.URLSearchParams = h;
418
473
 
419
474
  exports.default = _fetch;
420
475