importmap_mocha-rails 0.3.4 → 0.3.6

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.
@@ -1,13 +1,609 @@
1
- // src/interceptors/fetch/index.ts
2
- import { invariant as invariant2 } from "outvariant";
3
- import { DeferredPromise as DeferredPromise3 } from "@open-draft/deferred-promise";
1
+ // node_modules/.pnpm/outvariant@1.4.3/node_modules/outvariant/lib/index.mjs
2
+ var POSITIONALS_EXP = /(%?)(%([sdijo]))/g;
3
+ function serializePositional(positional, flag) {
4
+ switch (flag) {
5
+ case "s":
6
+ return positional;
7
+ case "d":
8
+ case "i":
9
+ return Number(positional);
10
+ case "j":
11
+ return JSON.stringify(positional);
12
+ case "o": {
13
+ if (typeof positional === "string") {
14
+ return positional;
15
+ }
16
+ const json = JSON.stringify(positional);
17
+ if (json === "{}" || json === "[]" || /^\[object .+?\]$/.test(json)) {
18
+ return positional;
19
+ }
20
+ return json;
21
+ }
22
+ }
23
+ }
24
+ function format(message, ...positionals) {
25
+ if (positionals.length === 0) {
26
+ return message;
27
+ }
28
+ let positionalIndex = 0;
29
+ let formattedMessage = message.replace(
30
+ POSITIONALS_EXP,
31
+ (match, isEscaped, _, flag) => {
32
+ const positional = positionals[positionalIndex];
33
+ const value = serializePositional(positional, flag);
34
+ if (!isEscaped) {
35
+ positionalIndex++;
36
+ return value;
37
+ }
38
+ return match;
39
+ }
40
+ );
41
+ if (positionalIndex < positionals.length) {
42
+ formattedMessage += ` ${positionals.slice(positionalIndex).join(" ")}`;
43
+ }
44
+ formattedMessage = formattedMessage.replace(/%{2,2}/g, "%");
45
+ return formattedMessage;
46
+ }
47
+ var STACK_FRAMES_TO_IGNORE = 2;
48
+ function cleanErrorStack(error2) {
49
+ if (!error2.stack) {
50
+ return;
51
+ }
52
+ const nextStack = error2.stack.split("\n");
53
+ nextStack.splice(1, STACK_FRAMES_TO_IGNORE);
54
+ error2.stack = nextStack.join("\n");
55
+ }
56
+ var InvariantError = class extends Error {
57
+ constructor(message, ...positionals) {
58
+ super(message);
59
+ this.message = message;
60
+ this.name = "Invariant Violation";
61
+ this.message = format(message, ...positionals);
62
+ cleanErrorStack(this);
63
+ }
64
+ };
65
+ var invariant = (predicate, message, ...positionals) => {
66
+ if (!predicate) {
67
+ throw new InvariantError(message, ...positionals);
68
+ }
69
+ };
70
+ invariant.as = (ErrorConstructor, predicate, message, ...positionals) => {
71
+ if (!predicate) {
72
+ const formatMessage = positionals.length === 0 ? message : format(message, ...positionals);
73
+ let error2;
74
+ try {
75
+ error2 = Reflect.construct(ErrorConstructor, [
76
+ formatMessage
77
+ ]);
78
+ } catch (err) {
79
+ error2 = ErrorConstructor(formatMessage);
80
+ }
81
+ throw error2;
82
+ }
83
+ };
84
+
85
+ // node_modules/.pnpm/@open-draft+deferred-promise@2.2.0/node_modules/@open-draft/deferred-promise/build/index.mjs
86
+ function createDeferredExecutor() {
87
+ const executor = (resolve, reject) => {
88
+ executor.state = "pending";
89
+ executor.resolve = (data) => {
90
+ if (executor.state !== "pending") {
91
+ return;
92
+ }
93
+ executor.result = data;
94
+ const onFulfilled = (value) => {
95
+ executor.state = "fulfilled";
96
+ return value;
97
+ };
98
+ return resolve(
99
+ data instanceof Promise ? data : Promise.resolve(data).then(onFulfilled)
100
+ );
101
+ };
102
+ executor.reject = (reason) => {
103
+ if (executor.state !== "pending") {
104
+ return;
105
+ }
106
+ queueMicrotask(() => {
107
+ executor.state = "rejected";
108
+ });
109
+ return reject(executor.rejectionReason = reason);
110
+ };
111
+ };
112
+ return executor;
113
+ }
114
+ var DeferredPromise = class extends Promise {
115
+ #executor;
116
+ resolve;
117
+ reject;
118
+ constructor(executor = null) {
119
+ const deferredExecutor = createDeferredExecutor();
120
+ super((originalResolve, originalReject) => {
121
+ deferredExecutor(originalResolve, originalReject);
122
+ executor?.(deferredExecutor.resolve, deferredExecutor.reject);
123
+ });
124
+ this.#executor = deferredExecutor;
125
+ this.resolve = this.#executor.resolve;
126
+ this.reject = this.#executor.reject;
127
+ }
128
+ get state() {
129
+ return this.#executor.state;
130
+ }
131
+ get rejectionReason() {
132
+ return this.#executor.rejectionReason;
133
+ }
134
+ then(onFulfilled, onRejected) {
135
+ return this.#decorate(super.then(onFulfilled, onRejected));
136
+ }
137
+ catch(onRejected) {
138
+ return this.#decorate(super.catch(onRejected));
139
+ }
140
+ finally(onfinally) {
141
+ return this.#decorate(super.finally(onfinally));
142
+ }
143
+ #decorate(promise) {
144
+ return Object.defineProperties(promise, {
145
+ resolve: { configurable: true, value: this.resolve },
146
+ reject: { configurable: true, value: this.reject }
147
+ });
148
+ }
149
+ };
4
150
 
5
151
  // src/glossary.ts
6
152
  var IS_PATCHED_MODULE = Symbol("isPatchedModule");
7
153
 
154
+ // node_modules/.pnpm/is-node-process@1.2.0/node_modules/is-node-process/lib/index.mjs
155
+ function isNodeProcess() {
156
+ if (typeof navigator !== "undefined" && navigator.product === "ReactNative") {
157
+ return true;
158
+ }
159
+ if (typeof process !== "undefined") {
160
+ const type = process.type;
161
+ if (type === "renderer" || type === "worker") {
162
+ return false;
163
+ }
164
+ return !!(process.versions && process.versions.node);
165
+ }
166
+ return false;
167
+ }
168
+
169
+ // node_modules/.pnpm/@open-draft+logger@0.3.0/node_modules/@open-draft/logger/lib/index.mjs
170
+ var __defProp = Object.defineProperty;
171
+ var __export = (target, all) => {
172
+ for (var name in all)
173
+ __defProp(target, name, { get: all[name], enumerable: true });
174
+ };
175
+ var colors_exports = {};
176
+ __export(colors_exports, {
177
+ blue: () => blue,
178
+ gray: () => gray,
179
+ green: () => green,
180
+ red: () => red,
181
+ yellow: () => yellow
182
+ });
183
+ function yellow(text) {
184
+ return `\x1B[33m${text}\x1B[0m`;
185
+ }
186
+ function blue(text) {
187
+ return `\x1B[34m${text}\x1B[0m`;
188
+ }
189
+ function gray(text) {
190
+ return `\x1B[90m${text}\x1B[0m`;
191
+ }
192
+ function red(text) {
193
+ return `\x1B[31m${text}\x1B[0m`;
194
+ }
195
+ function green(text) {
196
+ return `\x1B[32m${text}\x1B[0m`;
197
+ }
198
+ var IS_NODE = isNodeProcess();
199
+ var Logger = class {
200
+ constructor(name) {
201
+ this.name = name;
202
+ this.prefix = `[${this.name}]`;
203
+ const LOGGER_NAME = getVariable("DEBUG");
204
+ const LOGGER_LEVEL = getVariable("LOG_LEVEL");
205
+ const isLoggingEnabled = LOGGER_NAME === "1" || LOGGER_NAME === "true" || typeof LOGGER_NAME !== "undefined" && this.name.startsWith(LOGGER_NAME);
206
+ if (isLoggingEnabled) {
207
+ this.debug = isDefinedAndNotEquals(LOGGER_LEVEL, "debug") ? noop : this.debug;
208
+ this.info = isDefinedAndNotEquals(LOGGER_LEVEL, "info") ? noop : this.info;
209
+ this.success = isDefinedAndNotEquals(LOGGER_LEVEL, "success") ? noop : this.success;
210
+ this.warning = isDefinedAndNotEquals(LOGGER_LEVEL, "warning") ? noop : this.warning;
211
+ this.error = isDefinedAndNotEquals(LOGGER_LEVEL, "error") ? noop : this.error;
212
+ } else {
213
+ this.info = noop;
214
+ this.success = noop;
215
+ this.warning = noop;
216
+ this.error = noop;
217
+ this.only = noop;
218
+ }
219
+ }
220
+ prefix;
221
+ extend(domain) {
222
+ return new Logger(`${this.name}:${domain}`);
223
+ }
224
+ /**
225
+ * Print a debug message.
226
+ * @example
227
+ * logger.debug('no duplicates found, creating a document...')
228
+ */
229
+ debug(message, ...positionals) {
230
+ this.logEntry({
231
+ level: "debug",
232
+ message: gray(message),
233
+ positionals,
234
+ prefix: this.prefix,
235
+ colors: {
236
+ prefix: "gray"
237
+ }
238
+ });
239
+ }
240
+ /**
241
+ * Print an info message.
242
+ * @example
243
+ * logger.info('start parsing...')
244
+ */
245
+ info(message, ...positionals) {
246
+ this.logEntry({
247
+ level: "info",
248
+ message,
249
+ positionals,
250
+ prefix: this.prefix,
251
+ colors: {
252
+ prefix: "blue"
253
+ }
254
+ });
255
+ const performance2 = new PerformanceEntry();
256
+ return (message2, ...positionals2) => {
257
+ performance2.measure();
258
+ this.logEntry({
259
+ level: "info",
260
+ message: `${message2} ${gray(`${performance2.deltaTime}ms`)}`,
261
+ positionals: positionals2,
262
+ prefix: this.prefix,
263
+ colors: {
264
+ prefix: "blue"
265
+ }
266
+ });
267
+ };
268
+ }
269
+ /**
270
+ * Print a success message.
271
+ * @example
272
+ * logger.success('successfully created document')
273
+ */
274
+ success(message, ...positionals) {
275
+ this.logEntry({
276
+ level: "info",
277
+ message,
278
+ positionals,
279
+ prefix: `\u2714 ${this.prefix}`,
280
+ colors: {
281
+ timestamp: "green",
282
+ prefix: "green"
283
+ }
284
+ });
285
+ }
286
+ /**
287
+ * Print a warning.
288
+ * @example
289
+ * logger.warning('found legacy document format')
290
+ */
291
+ warning(message, ...positionals) {
292
+ this.logEntry({
293
+ level: "warning",
294
+ message,
295
+ positionals,
296
+ prefix: `\u26A0 ${this.prefix}`,
297
+ colors: {
298
+ timestamp: "yellow",
299
+ prefix: "yellow"
300
+ }
301
+ });
302
+ }
303
+ /**
304
+ * Print an error message.
305
+ * @example
306
+ * logger.error('something went wrong')
307
+ */
308
+ error(message, ...positionals) {
309
+ this.logEntry({
310
+ level: "error",
311
+ message,
312
+ positionals,
313
+ prefix: `\u2716 ${this.prefix}`,
314
+ colors: {
315
+ timestamp: "red",
316
+ prefix: "red"
317
+ }
318
+ });
319
+ }
320
+ /**
321
+ * Execute the given callback only when the logging is enabled.
322
+ * This is skipped in its entirety and has no runtime cost otherwise.
323
+ * This executes regardless of the log level.
324
+ * @example
325
+ * logger.only(() => {
326
+ * logger.info('additional info')
327
+ * })
328
+ */
329
+ only(callback) {
330
+ callback();
331
+ }
332
+ createEntry(level, message) {
333
+ return {
334
+ timestamp: /* @__PURE__ */ new Date(),
335
+ level,
336
+ message
337
+ };
338
+ }
339
+ logEntry(args) {
340
+ const {
341
+ level,
342
+ message,
343
+ prefix,
344
+ colors: customColors,
345
+ positionals = []
346
+ } = args;
347
+ const entry = this.createEntry(level, message);
348
+ const timestampColor = customColors?.timestamp || "gray";
349
+ const prefixColor = customColors?.prefix || "gray";
350
+ const colorize = {
351
+ timestamp: colors_exports[timestampColor],
352
+ prefix: colors_exports[prefixColor]
353
+ };
354
+ const write = this.getWriter(level);
355
+ write(
356
+ [colorize.timestamp(this.formatTimestamp(entry.timestamp))].concat(prefix != null ? colorize.prefix(prefix) : []).concat(serializeInput(message)).join(" "),
357
+ ...positionals.map(serializeInput)
358
+ );
359
+ }
360
+ formatTimestamp(timestamp) {
361
+ return `${timestamp.toLocaleTimeString(
362
+ "en-GB"
363
+ )}:${timestamp.getMilliseconds()}`;
364
+ }
365
+ getWriter(level) {
366
+ switch (level) {
367
+ case "debug":
368
+ case "success":
369
+ case "info": {
370
+ return log;
371
+ }
372
+ case "warning": {
373
+ return warn;
374
+ }
375
+ case "error": {
376
+ return error;
377
+ }
378
+ }
379
+ }
380
+ };
381
+ var PerformanceEntry = class {
382
+ startTime;
383
+ endTime;
384
+ deltaTime;
385
+ constructor() {
386
+ this.startTime = performance.now();
387
+ }
388
+ measure() {
389
+ this.endTime = performance.now();
390
+ const deltaTime = this.endTime - this.startTime;
391
+ this.deltaTime = deltaTime.toFixed(2);
392
+ }
393
+ };
394
+ var noop = () => void 0;
395
+ function log(message, ...positionals) {
396
+ if (IS_NODE) {
397
+ process.stdout.write(format(message, ...positionals) + "\n");
398
+ return;
399
+ }
400
+ console.log(message, ...positionals);
401
+ }
402
+ function warn(message, ...positionals) {
403
+ if (IS_NODE) {
404
+ process.stderr.write(format(message, ...positionals) + "\n");
405
+ return;
406
+ }
407
+ console.warn(message, ...positionals);
408
+ }
409
+ function error(message, ...positionals) {
410
+ if (IS_NODE) {
411
+ process.stderr.write(format(message, ...positionals) + "\n");
412
+ return;
413
+ }
414
+ console.error(message, ...positionals);
415
+ }
416
+ function getVariable(variableName) {
417
+ if (IS_NODE) {
418
+ return process.env[variableName];
419
+ }
420
+ return globalThis[variableName]?.toString();
421
+ }
422
+ function isDefinedAndNotEquals(value, expected) {
423
+ return value !== void 0 && value !== expected;
424
+ }
425
+ function serializeInput(message) {
426
+ if (typeof message === "undefined") {
427
+ return "undefined";
428
+ }
429
+ if (message === null) {
430
+ return "null";
431
+ }
432
+ if (typeof message === "string") {
433
+ return message;
434
+ }
435
+ if (typeof message === "object") {
436
+ return JSON.stringify(message);
437
+ }
438
+ return message.toString();
439
+ }
440
+
441
+ // node_modules/.pnpm/strict-event-emitter@0.5.1/node_modules/strict-event-emitter/lib/index.mjs
442
+ var MemoryLeakError = class extends Error {
443
+ constructor(emitter, type, count) {
444
+ super(
445
+ `Possible EventEmitter memory leak detected. ${count} ${type.toString()} listeners added. Use emitter.setMaxListeners() to increase limit`
446
+ );
447
+ this.emitter = emitter;
448
+ this.type = type;
449
+ this.count = count;
450
+ this.name = "MaxListenersExceededWarning";
451
+ }
452
+ };
453
+ var _Emitter = class {
454
+ static listenerCount(emitter, eventName) {
455
+ return emitter.listenerCount(eventName);
456
+ }
457
+ constructor() {
458
+ this.events = /* @__PURE__ */ new Map();
459
+ this.maxListeners = _Emitter.defaultMaxListeners;
460
+ this.hasWarnedAboutPotentialMemoryLeak = false;
461
+ }
462
+ _emitInternalEvent(internalEventName, eventName, listener) {
463
+ this.emit(
464
+ internalEventName,
465
+ ...[eventName, listener]
466
+ );
467
+ }
468
+ _getListeners(eventName) {
469
+ return Array.prototype.concat.apply([], this.events.get(eventName)) || [];
470
+ }
471
+ _removeListener(listeners, listener) {
472
+ const index = listeners.indexOf(listener);
473
+ if (index > -1) {
474
+ listeners.splice(index, 1);
475
+ }
476
+ return [];
477
+ }
478
+ _wrapOnceListener(eventName, listener) {
479
+ const onceListener = (...data) => {
480
+ this.removeListener(eventName, onceListener);
481
+ return listener.apply(this, data);
482
+ };
483
+ Object.defineProperty(onceListener, "name", { value: listener.name });
484
+ return onceListener;
485
+ }
486
+ setMaxListeners(maxListeners) {
487
+ this.maxListeners = maxListeners;
488
+ return this;
489
+ }
490
+ /**
491
+ * Returns the current max listener value for the `Emitter` which is
492
+ * either set by `emitter.setMaxListeners(n)` or defaults to
493
+ * `Emitter.defaultMaxListeners`.
494
+ */
495
+ getMaxListeners() {
496
+ return this.maxListeners;
497
+ }
498
+ /**
499
+ * Returns an array listing the events for which the emitter has registered listeners.
500
+ * The values in the array will be strings or Symbols.
501
+ */
502
+ eventNames() {
503
+ return Array.from(this.events.keys());
504
+ }
505
+ /**
506
+ * Synchronously calls each of the listeners registered for the event named `eventName`,
507
+ * in the order they were registered, passing the supplied arguments to each.
508
+ * Returns `true` if the event has listeners, `false` otherwise.
509
+ *
510
+ * @example
511
+ * const emitter = new Emitter<{ hello: [string] }>()
512
+ * emitter.emit('hello', 'John')
513
+ */
514
+ emit(eventName, ...data) {
515
+ const listeners = this._getListeners(eventName);
516
+ listeners.forEach((listener) => {
517
+ listener.apply(this, data);
518
+ });
519
+ return listeners.length > 0;
520
+ }
521
+ addListener(eventName, listener) {
522
+ this._emitInternalEvent("newListener", eventName, listener);
523
+ const nextListeners = this._getListeners(eventName).concat(listener);
524
+ this.events.set(eventName, nextListeners);
525
+ if (this.maxListeners > 0 && this.listenerCount(eventName) > this.maxListeners && !this.hasWarnedAboutPotentialMemoryLeak) {
526
+ this.hasWarnedAboutPotentialMemoryLeak = true;
527
+ const memoryLeakWarning = new MemoryLeakError(
528
+ this,
529
+ eventName,
530
+ this.listenerCount(eventName)
531
+ );
532
+ console.warn(memoryLeakWarning);
533
+ }
534
+ return this;
535
+ }
536
+ on(eventName, listener) {
537
+ return this.addListener(eventName, listener);
538
+ }
539
+ once(eventName, listener) {
540
+ return this.addListener(
541
+ eventName,
542
+ this._wrapOnceListener(eventName, listener)
543
+ );
544
+ }
545
+ prependListener(eventName, listener) {
546
+ const listeners = this._getListeners(eventName);
547
+ if (listeners.length > 0) {
548
+ const nextListeners = [listener].concat(listeners);
549
+ this.events.set(eventName, nextListeners);
550
+ } else {
551
+ this.events.set(eventName, listeners.concat(listener));
552
+ }
553
+ return this;
554
+ }
555
+ prependOnceListener(eventName, listener) {
556
+ return this.prependListener(
557
+ eventName,
558
+ this._wrapOnceListener(eventName, listener)
559
+ );
560
+ }
561
+ removeListener(eventName, listener) {
562
+ const listeners = this._getListeners(eventName);
563
+ if (listeners.length > 0) {
564
+ this._removeListener(listeners, listener);
565
+ this.events.set(eventName, listeners);
566
+ this._emitInternalEvent("removeListener", eventName, listener);
567
+ }
568
+ return this;
569
+ }
570
+ /**
571
+ * Alias for `emitter.removeListener()`.
572
+ *
573
+ * @example
574
+ * emitter.off('hello', listener)
575
+ */
576
+ off(eventName, listener) {
577
+ return this.removeListener(eventName, listener);
578
+ }
579
+ removeAllListeners(eventName) {
580
+ if (eventName) {
581
+ this.events.delete(eventName);
582
+ } else {
583
+ this.events.clear();
584
+ }
585
+ return this;
586
+ }
587
+ /**
588
+ * Returns a copy of the array of listeners for the event named `eventName`.
589
+ */
590
+ listeners(eventName) {
591
+ return Array.from(this._getListeners(eventName));
592
+ }
593
+ /**
594
+ * Returns the number of listeners listening to the event named `eventName`.
595
+ */
596
+ listenerCount(eventName) {
597
+ return this._getListeners(eventName).length;
598
+ }
599
+ rawListeners(eventName) {
600
+ return this.listeners(eventName);
601
+ }
602
+ };
603
+ var Emitter = _Emitter;
604
+ Emitter.defaultMaxListeners = 10;
605
+
8
606
  // src/Interceptor.ts
9
- import { Logger } from "@open-draft/logger";
10
- import { Emitter } from "strict-event-emitter";
11
607
  var INTERNAL_REQUEST_ID_HEADER_NAME = "x-interceptors-internal-request-id";
12
608
  function getGlobalSymbol(symbol) {
13
609
  return (
@@ -137,9 +733,8 @@ var Interceptor = class {
137
733
  this.readyState = "DISPOSED" /* DISPOSED */;
138
734
  }
139
735
  getInstance() {
140
- var _a;
141
736
  const instance = getGlobalSymbol(this.symbol);
142
- this.logger.info("retrieved global instance:", (_a = instance == null ? void 0 : instance.constructor) == null ? void 0 : _a.name);
737
+ this.logger.info("retrieved global instance:", instance?.constructor?.name);
143
738
  return instance;
144
739
  }
145
740
  setInstance() {
@@ -152,22 +747,19 @@ var Interceptor = class {
152
747
  }
153
748
  };
154
749
 
155
- // src/RequestController.ts
156
- import { invariant } from "outvariant";
157
- import { DeferredPromise } from "@open-draft/deferred-promise";
158
-
159
750
  // src/InterceptorError.ts
160
- var InterceptorError = class extends Error {
751
+ var InterceptorError = class _InterceptorError extends Error {
161
752
  constructor(message) {
162
753
  super(message);
163
754
  this.name = "InterceptorError";
164
- Object.setPrototypeOf(this, InterceptorError.prototype);
755
+ Object.setPrototypeOf(this, _InterceptorError.prototype);
165
756
  }
166
757
  };
167
758
 
168
759
  // src/RequestController.ts
169
760
  var kRequestHandled = Symbol("kRequestHandled");
170
761
  var kResponsePromise = Symbol("kResponsePromise");
762
+ kResponsePromise, kRequestHandled;
171
763
  var RequestController = class {
172
764
  constructor(request) {
173
765
  this.request = request;
@@ -198,7 +790,7 @@ var RequestController = class {
198
790
  * controller.errorWith()
199
791
  * controller.errorWith(new Error('Oops!'))
200
792
  */
201
- errorWith(error) {
793
+ errorWith(error2) {
202
794
  invariant.as(
203
795
  InterceptorError,
204
796
  !this[kRequestHandled],
@@ -207,10 +799,9 @@ var RequestController = class {
207
799
  this.request.url
208
800
  );
209
801
  this[kRequestHandled] = true;
210
- this[kResponsePromise].resolve(error);
802
+ this[kResponsePromise].resolve(error2);
211
803
  }
212
804
  };
213
- kResponsePromise, kRequestHandled;
214
805
 
215
806
  // src/utils/emitAsync.ts
216
807
  async function emitAsync(emitter, eventName, ...data) {
@@ -223,31 +814,29 @@ async function emitAsync(emitter, eventName, ...data) {
223
814
  }
224
815
  }
225
816
 
226
- // src/utils/handleRequest.ts
227
- import { DeferredPromise as DeferredPromise2 } from "@open-draft/deferred-promise";
228
- import { until } from "@open-draft/until";
817
+ // node_modules/.pnpm/@open-draft+until@2.1.0/node_modules/@open-draft/until/lib/index.mjs
818
+ var until = async (promise) => {
819
+ try {
820
+ const data = await promise().catch((error2) => {
821
+ throw error2;
822
+ });
823
+ return { error: null, data };
824
+ } catch (error2) {
825
+ return { error: error2, data: null };
826
+ }
827
+ };
229
828
 
230
829
  // src/utils/isPropertyAccessible.ts
231
830
  function isPropertyAccessible(obj, key) {
232
831
  try {
233
832
  obj[key];
234
833
  return true;
235
- } catch (e) {
834
+ } catch {
236
835
  return false;
237
836
  }
238
837
  }
239
838
 
240
839
  // src/utils/responseUtils.ts
241
- var RESPONSE_STATUS_CODES_WITHOUT_BODY = /* @__PURE__ */ new Set([
242
- 101,
243
- 103,
244
- 204,
245
- 205,
246
- 304
247
- ]);
248
- function isResponseWithoutBody(status) {
249
- return RESPONSE_STATUS_CODES_WITHOUT_BODY.has(status);
250
- }
251
840
  function createServerErrorResponse(body) {
252
841
  return new Response(
253
842
  JSON.stringify(
@@ -271,38 +860,38 @@ function isResponseError(response) {
271
860
  }
272
861
 
273
862
  // src/utils/isNodeLikeError.ts
274
- function isNodeLikeError(error) {
275
- if (error == null) {
863
+ function isNodeLikeError(error2) {
864
+ if (error2 == null) {
276
865
  return false;
277
866
  }
278
- if (!(error instanceof Error)) {
867
+ if (!(error2 instanceof Error)) {
279
868
  return false;
280
869
  }
281
- return "code" in error && "errno" in error;
870
+ return "code" in error2 && "errno" in error2;
282
871
  }
283
872
 
284
873
  // src/utils/handleRequest.ts
285
874
  async function handleRequest(options) {
286
- const handleResponse = (response) => {
875
+ const handleResponse = async (response) => {
287
876
  if (response instanceof Error) {
288
877
  options.onError(response);
289
878
  } else if (isResponseError(response)) {
290
879
  options.onRequestError(response);
291
880
  } else {
292
- options.onResponse(response);
881
+ await options.onResponse(response);
293
882
  }
294
883
  return true;
295
884
  };
296
- const handleResponseError = (error) => {
297
- if (error instanceof InterceptorError) {
885
+ const handleResponseError = async (error2) => {
886
+ if (error2 instanceof InterceptorError) {
298
887
  throw result.error;
299
888
  }
300
- if (isNodeLikeError(error)) {
301
- options.onError(error);
889
+ if (isNodeLikeError(error2)) {
890
+ options.onError(error2);
302
891
  return true;
303
892
  }
304
- if (error instanceof Response) {
305
- return handleResponse(error);
893
+ if (error2 instanceof Response) {
894
+ return await handleResponse(error2);
306
895
  }
307
896
  return false;
308
897
  };
@@ -314,15 +903,19 @@ async function handleRequest(options) {
314
903
  options.controller[kResponsePromise].resolve(void 0);
315
904
  }
316
905
  });
317
- const requestAbortPromise = new DeferredPromise2();
906
+ const requestAbortPromise = new DeferredPromise();
318
907
  if (options.request.signal) {
319
- options.request.signal.addEventListener(
320
- "abort",
321
- () => {
322
- requestAbortPromise.reject(options.request.signal.reason);
323
- },
324
- { once: true }
325
- );
908
+ if (options.request.signal.aborted) {
909
+ requestAbortPromise.reject(options.request.signal.reason);
910
+ } else {
911
+ options.request.signal.addEventListener(
912
+ "abort",
913
+ () => {
914
+ requestAbortPromise.reject(options.request.signal.reason);
915
+ },
916
+ { once: true }
917
+ );
918
+ }
326
919
  }
327
920
  const result = await until(async () => {
328
921
  const requestListtenersPromise = emitAsync(options.emitter, "request", {
@@ -344,7 +937,7 @@ async function handleRequest(options) {
344
937
  return true;
345
938
  }
346
939
  if (result.error) {
347
- if (handleResponseError(result.error)) {
940
+ if (await handleResponseError(result.error)) {
348
941
  return true;
349
942
  }
350
943
  if (options.emitter.listenerCount("unhandledException") > 0) {
@@ -395,17 +988,258 @@ function createRequestId() {
395
988
  return Math.random().toString(16).slice(2);
396
989
  }
397
990
 
991
+ // src/interceptors/fetch/utils/createNetworkError.ts
992
+ function createNetworkError(cause) {
993
+ return Object.assign(new TypeError("Failed to fetch"), {
994
+ cause
995
+ });
996
+ }
997
+
998
+ // src/interceptors/fetch/utils/followRedirect.ts
999
+ var REQUEST_BODY_HEADERS = [
1000
+ "content-encoding",
1001
+ "content-language",
1002
+ "content-location",
1003
+ "content-type",
1004
+ "content-length"
1005
+ ];
1006
+ var kRedirectCount = Symbol("kRedirectCount");
1007
+ async function followFetchRedirect(request, response) {
1008
+ if (response.status !== 303 && request.body != null) {
1009
+ return Promise.reject(createNetworkError());
1010
+ }
1011
+ const requestUrl = new URL(request.url);
1012
+ let locationUrl;
1013
+ try {
1014
+ locationUrl = new URL(response.headers.get("location"), request.url);
1015
+ } catch (error2) {
1016
+ return Promise.reject(createNetworkError(error2));
1017
+ }
1018
+ if (!(locationUrl.protocol === "http:" || locationUrl.protocol === "https:")) {
1019
+ return Promise.reject(
1020
+ createNetworkError("URL scheme must be a HTTP(S) scheme")
1021
+ );
1022
+ }
1023
+ if (Reflect.get(request, kRedirectCount) > 20) {
1024
+ return Promise.reject(createNetworkError("redirect count exceeded"));
1025
+ }
1026
+ Object.defineProperty(request, kRedirectCount, {
1027
+ value: (Reflect.get(request, kRedirectCount) || 0) + 1
1028
+ });
1029
+ if (request.mode === "cors" && (locationUrl.username || locationUrl.password) && !sameOrigin(requestUrl, locationUrl)) {
1030
+ return Promise.reject(
1031
+ createNetworkError('cross origin not allowed for request mode "cors"')
1032
+ );
1033
+ }
1034
+ const requestInit = {};
1035
+ if ([301, 302].includes(response.status) && request.method === "POST" || response.status === 303 && !["HEAD", "GET"].includes(request.method)) {
1036
+ requestInit.method = "GET";
1037
+ requestInit.body = null;
1038
+ REQUEST_BODY_HEADERS.forEach((headerName) => {
1039
+ request.headers.delete(headerName);
1040
+ });
1041
+ }
1042
+ if (!sameOrigin(requestUrl, locationUrl)) {
1043
+ request.headers.delete("authorization");
1044
+ request.headers.delete("proxy-authorization");
1045
+ request.headers.delete("cookie");
1046
+ request.headers.delete("host");
1047
+ }
1048
+ requestInit.headers = request.headers;
1049
+ return fetch(new Request(locationUrl, requestInit));
1050
+ }
1051
+ function sameOrigin(left, right) {
1052
+ if (left.origin === right.origin && left.origin === "null") {
1053
+ return true;
1054
+ }
1055
+ if (left.protocol === right.protocol && left.hostname === right.hostname && left.port === right.port) {
1056
+ return true;
1057
+ }
1058
+ return false;
1059
+ }
1060
+
1061
+ // src/interceptors/fetch/utils/brotli-decompress.browser.ts
1062
+ var BrotliDecompressionStream = class extends TransformStream {
1063
+ constructor() {
1064
+ console.warn(
1065
+ "[Interceptors]: Brotli decompression of response streams is not supported in the browser"
1066
+ );
1067
+ super({
1068
+ transform(chunk, controller) {
1069
+ controller.enqueue(chunk);
1070
+ }
1071
+ });
1072
+ }
1073
+ };
1074
+
1075
+ // src/interceptors/fetch/utils/decompression.ts
1076
+ var PipelineStream = class extends TransformStream {
1077
+ constructor(transformStreams, ...strategies) {
1078
+ super({}, ...strategies);
1079
+ const readable = [super.readable, ...transformStreams].reduce(
1080
+ (readable2, transform) => readable2.pipeThrough(transform)
1081
+ );
1082
+ Object.defineProperty(this, "readable", {
1083
+ get() {
1084
+ return readable;
1085
+ }
1086
+ });
1087
+ }
1088
+ };
1089
+ function parseContentEncoding(contentEncoding) {
1090
+ return contentEncoding.toLowerCase().split(",").map((coding) => coding.trim());
1091
+ }
1092
+ function createDecompressionStream(contentEncoding) {
1093
+ if (contentEncoding === "") {
1094
+ return null;
1095
+ }
1096
+ const codings = parseContentEncoding(contentEncoding);
1097
+ if (codings.length === 0) {
1098
+ return null;
1099
+ }
1100
+ const transformers = codings.reduceRight(
1101
+ (transformers2, coding) => {
1102
+ if (coding === "gzip" || coding === "x-gzip") {
1103
+ return transformers2.concat(new DecompressionStream("gzip"));
1104
+ } else if (coding === "deflate") {
1105
+ return transformers2.concat(new DecompressionStream("deflate"));
1106
+ } else if (coding === "br") {
1107
+ return transformers2.concat(new BrotliDecompressionStream());
1108
+ } else {
1109
+ transformers2.length = 0;
1110
+ }
1111
+ return transformers2;
1112
+ },
1113
+ []
1114
+ );
1115
+ return new PipelineStream(transformers);
1116
+ }
1117
+ function decompressResponse(response) {
1118
+ if (response.body === null) {
1119
+ return null;
1120
+ }
1121
+ const decompressionStream = createDecompressionStream(
1122
+ response.headers.get("content-encoding") || ""
1123
+ );
1124
+ if (!decompressionStream) {
1125
+ return null;
1126
+ }
1127
+ response.body.pipeTo(decompressionStream.writable);
1128
+ return decompressionStream.readable;
1129
+ }
1130
+
1131
+ // src/utils/hasConfigurableGlobal.ts
1132
+ function hasConfigurableGlobal(propertyName) {
1133
+ const descriptor = Object.getOwnPropertyDescriptor(globalThis, propertyName);
1134
+ if (typeof descriptor === "undefined") {
1135
+ return false;
1136
+ }
1137
+ if (typeof descriptor.get === "function" && typeof descriptor.get() === "undefined") {
1138
+ return false;
1139
+ }
1140
+ if (typeof descriptor.get === "undefined" && descriptor.value == null) {
1141
+ return false;
1142
+ }
1143
+ if (typeof descriptor.set === "undefined" && !descriptor.configurable) {
1144
+ console.error(
1145
+ `[MSW] Failed to apply interceptor: the global \`${propertyName}\` property is non-configurable. This is likely an issue with your environment. If you are using a framework, please open an issue about this in their repository.`
1146
+ );
1147
+ return false;
1148
+ }
1149
+ return true;
1150
+ }
1151
+
1152
+ // src/utils/fetchUtils.ts
1153
+ var FetchResponse = class _FetchResponse extends Response {
1154
+ static {
1155
+ /**
1156
+ * Response status codes for responses that cannot have body.
1157
+ * @see https://fetch.spec.whatwg.org/#statuses
1158
+ */
1159
+ this.STATUS_CODES_WITHOUT_BODY = [101, 103, 204, 205, 304];
1160
+ }
1161
+ static {
1162
+ this.STATUS_CODES_WITH_REDIRECT = [301, 302, 303, 307, 308];
1163
+ }
1164
+ static isConfigurableStatusCode(status) {
1165
+ return status >= 200 && status <= 599;
1166
+ }
1167
+ static isRedirectResponse(status) {
1168
+ return _FetchResponse.STATUS_CODES_WITH_REDIRECT.includes(status);
1169
+ }
1170
+ /**
1171
+ * Returns a boolean indicating whether the given response status
1172
+ * code represents a response that can have a body.
1173
+ */
1174
+ static isResponseWithBody(status) {
1175
+ return !_FetchResponse.STATUS_CODES_WITHOUT_BODY.includes(status);
1176
+ }
1177
+ static setUrl(url, response) {
1178
+ if (!url) {
1179
+ return;
1180
+ }
1181
+ if (response.url != "") {
1182
+ return;
1183
+ }
1184
+ Object.defineProperty(response, "url", {
1185
+ value: url,
1186
+ enumerable: true,
1187
+ configurable: true,
1188
+ writable: false
1189
+ });
1190
+ }
1191
+ /**
1192
+ * Parses the given raw HTTP headers into a Fetch API `Headers` instance.
1193
+ */
1194
+ static parseRawHeaders(rawHeaders) {
1195
+ const headers = new Headers();
1196
+ for (let line = 0; line < rawHeaders.length; line += 2) {
1197
+ headers.append(rawHeaders[line], rawHeaders[line + 1]);
1198
+ }
1199
+ return headers;
1200
+ }
1201
+ constructor(body, init = {}) {
1202
+ const status = init.status ?? 200;
1203
+ const safeStatus = _FetchResponse.isConfigurableStatusCode(status) ? status : 200;
1204
+ const finalBody = _FetchResponse.isResponseWithBody(status) ? body : null;
1205
+ super(finalBody, {
1206
+ ...init,
1207
+ status: safeStatus
1208
+ });
1209
+ if (status !== safeStatus) {
1210
+ const stateSymbol = Object.getOwnPropertySymbols(this).find(
1211
+ (symbol) => symbol.description === "state"
1212
+ );
1213
+ if (stateSymbol) {
1214
+ const state = Reflect.get(this, stateSymbol);
1215
+ Reflect.set(state, "status", status);
1216
+ } else {
1217
+ Object.defineProperty(this, "status", {
1218
+ value: status,
1219
+ enumerable: true,
1220
+ configurable: true,
1221
+ writable: false
1222
+ });
1223
+ }
1224
+ }
1225
+ _FetchResponse.setUrl(init.url, this);
1226
+ }
1227
+ };
1228
+
398
1229
  // src/interceptors/fetch/index.ts
399
- var _FetchInterceptor = class extends Interceptor {
1230
+ var FetchInterceptor = class _FetchInterceptor extends Interceptor {
1231
+ static {
1232
+ this.symbol = Symbol("fetch");
1233
+ }
400
1234
  constructor() {
401
1235
  super(_FetchInterceptor.symbol);
402
1236
  }
403
1237
  checkEnvironment() {
404
- return typeof globalThis !== "undefined" && typeof globalThis.fetch !== "undefined";
1238
+ return hasConfigurableGlobal("fetch");
405
1239
  }
406
1240
  async setup() {
407
1241
  const pureFetch = globalThis.fetch;
408
- invariant2(
1242
+ invariant(
409
1243
  !pureFetch[IS_PATCHED_MODULE],
410
1244
  'Failed to patch the "fetch" module: already patched.'
411
1245
  );
@@ -413,7 +1247,7 @@ var _FetchInterceptor = class extends Interceptor {
413
1247
  const requestId = createRequestId();
414
1248
  const resolvedInput = typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.origin) : input;
415
1249
  const request = new Request(resolvedInput, init);
416
- const responsePromise = new DeferredPromise3();
1250
+ const responsePromise = new DeferredPromise();
417
1251
  const controller = new RequestController(request);
418
1252
  this.logger.info("[%s] %s", request.method, request.url);
419
1253
  this.logger.info("awaiting for the mocked response...");
@@ -426,10 +1260,30 @@ var _FetchInterceptor = class extends Interceptor {
426
1260
  requestId,
427
1261
  emitter: this.emitter,
428
1262
  controller,
429
- onResponse: async (response) => {
1263
+ onResponse: async (rawResponse) => {
430
1264
  this.logger.info("received mocked response!", {
431
- response
1265
+ rawResponse
432
1266
  });
1267
+ const decompressedStream = decompressResponse(rawResponse);
1268
+ const response = decompressedStream === null ? rawResponse : new FetchResponse(decompressedStream, rawResponse);
1269
+ FetchResponse.setUrl(request.url, response);
1270
+ if (FetchResponse.isRedirectResponse(response.status)) {
1271
+ if (request.redirect === "error") {
1272
+ responsePromise.reject(createNetworkError("unexpected redirect"));
1273
+ return;
1274
+ }
1275
+ if (request.redirect === "follow") {
1276
+ followFetchRedirect(request, response).then(
1277
+ (response2) => {
1278
+ responsePromise.resolve(response2);
1279
+ },
1280
+ (reason) => {
1281
+ responsePromise.reject(reason);
1282
+ }
1283
+ );
1284
+ return;
1285
+ }
1286
+ }
433
1287
  if (this.emitter.listenerCount("response") > 0) {
434
1288
  this.logger.info('emitting the "response" event...');
435
1289
  await emitAsync(this.emitter, "response", {
@@ -442,21 +1296,15 @@ var _FetchInterceptor = class extends Interceptor {
442
1296
  requestId
443
1297
  });
444
1298
  }
445
- Object.defineProperty(response, "url", {
446
- writable: false,
447
- enumerable: true,
448
- configurable: false,
449
- value: request.url
450
- });
451
1299
  responsePromise.resolve(response);
452
1300
  },
453
1301
  onRequestError: (response) => {
454
1302
  this.logger.info("request has errored!", { response });
455
1303
  responsePromise.reject(createNetworkError(response));
456
1304
  },
457
- onError: (error) => {
458
- this.logger.info("request has been aborted!", { error });
459
- responsePromise.reject(error);
1305
+ onError: (error2) => {
1306
+ this.logger.info("request has been aborted!", { error: error2 });
1307
+ responsePromise.reject(error2);
460
1308
  }
461
1309
  });
462
1310
  if (isRequestHandled) {
@@ -466,12 +1314,12 @@ var _FetchInterceptor = class extends Interceptor {
466
1314
  this.logger.info(
467
1315
  "no mocked response received, performing request as-is..."
468
1316
  );
469
- return pureFetch(request).then((response) => {
1317
+ return pureFetch(request).then(async (response) => {
470
1318
  this.logger.info("original fetch performed", response);
471
1319
  if (this.emitter.listenerCount("response") > 0) {
472
1320
  this.logger.info('emitting the "response" event...');
473
1321
  const responseClone = response.clone();
474
- this.emitter.emit("response", {
1322
+ await emitAsync(this.emitter, "response", {
475
1323
  response: responseClone,
476
1324
  isMockedResponse: false,
477
1325
  request,
@@ -498,20 +1346,6 @@ var _FetchInterceptor = class extends Interceptor {
498
1346
  });
499
1347
  }
500
1348
  };
501
- var FetchInterceptor = _FetchInterceptor;
502
- FetchInterceptor.symbol = Symbol("fetch");
503
- function createNetworkError(cause) {
504
- return Object.assign(new TypeError("Failed to fetch"), {
505
- cause
506
- });
507
- }
508
-
509
- // src/interceptors/XMLHttpRequest/index.ts
510
- import { invariant as invariant4 } from "outvariant";
511
-
512
- // src/interceptors/XMLHttpRequest/XMLHttpRequestController.ts
513
- import { invariant as invariant3 } from "outvariant";
514
- import { isNodeProcess } from "is-node-process";
515
1349
 
516
1350
  // src/interceptors/XMLHttpRequest/utils/concatArrayBuffer.ts
517
1351
  function concatArrayBuffer(left, right) {
@@ -524,10 +1358,10 @@ function concatArrayBuffer(left, right) {
524
1358
  // src/interceptors/XMLHttpRequest/polyfills/EventPolyfill.ts
525
1359
  var EventPolyfill = class {
526
1360
  constructor(type, options) {
527
- this.AT_TARGET = 0;
528
- this.BUBBLING_PHASE = 0;
529
- this.CAPTURING_PHASE = 0;
530
1361
  this.NONE = 0;
1362
+ this.CAPTURING_PHASE = 1;
1363
+ this.AT_TARGET = 2;
1364
+ this.BUBBLING_PHASE = 3;
531
1365
  this.type = "";
532
1366
  this.srcElement = null;
533
1367
  this.currentTarget = null;
@@ -543,8 +1377,8 @@ var EventPolyfill = class {
543
1377
  this.cancelBubble = false;
544
1378
  this.returnValue = true;
545
1379
  this.type = type;
546
- this.target = (options == null ? void 0 : options.target) || null;
547
- this.currentTarget = (options == null ? void 0 : options.currentTarget) || null;
1380
+ this.target = options?.target || null;
1381
+ this.currentTarget = options?.currentTarget || null;
548
1382
  this.timeStamp = Date.now();
549
1383
  }
550
1384
  composedPath() {
@@ -568,10 +1402,10 @@ var EventPolyfill = class {
568
1402
  var ProgressEventPolyfill = class extends EventPolyfill {
569
1403
  constructor(type, init) {
570
1404
  super(type);
571
- this.lengthComputable = (init == null ? void 0 : init.lengthComputable) || false;
572
- this.composed = (init == null ? void 0 : init.composed) || false;
573
- this.loaded = (init == null ? void 0 : init.loaded) || 0;
574
- this.total = (init == null ? void 0 : init.total) || 0;
1405
+ this.lengthComputable = init?.lengthComputable || false;
1406
+ this.composed = init?.composed || false;
1407
+ this.loaded = init?.loaded || 0;
1408
+ this.total = init?.total || 0;
575
1409
  }
576
1410
  };
577
1411
 
@@ -590,8 +1424,8 @@ function createEvent(target, type, init) {
590
1424
  const ProgressEventClass = SUPPORTS_PROGRESS_EVENT ? ProgressEvent : ProgressEventPolyfill;
591
1425
  const event = progressEvents.includes(type) ? new ProgressEventClass(type, {
592
1426
  lengthComputable: true,
593
- loaded: (init == null ? void 0 : init.loaded) || 0,
594
- total: (init == null ? void 0 : init.total) || 0
1427
+ loaded: init?.loaded || 0,
1428
+ total: init?.total || 0
595
1429
  }) : new EventPolyfill(type, {
596
1430
  target,
597
1431
  currentTarget: target
@@ -649,7 +1483,7 @@ function optionsToProxyHandler(options) {
649
1483
  propertySource,
650
1484
  propertyName
651
1485
  );
652
- if (typeof (ownDescriptors == null ? void 0 : ownDescriptors.set) !== "undefined") {
1486
+ if (typeof ownDescriptors?.set !== "undefined") {
653
1487
  ownDescriptors.set.apply(target, [nextValue]);
654
1488
  return true;
655
1489
  }
@@ -708,8 +1542,9 @@ function parseJson(data) {
708
1542
 
709
1543
  // src/interceptors/XMLHttpRequest/utils/createResponse.ts
710
1544
  function createResponse(request, body) {
711
- const responseBodyOrNull = isResponseWithoutBody(request.status) ? null : body;
712
- return new Response(responseBodyOrNull, {
1545
+ const responseBodyOrNull = FetchResponse.isResponseWithBody(request.status) ? body : null;
1546
+ return new FetchResponse(responseBodyOrNull, {
1547
+ url: request.responseURL,
713
1548
  status: request.status,
714
1549
  statusText: request.statusText,
715
1550
  headers: createHeadersFromXMLHttpReqestHeaders(
@@ -731,16 +1566,30 @@ function createHeadersFromXMLHttpReqestHeaders(headersString) {
731
1566
  return headers;
732
1567
  }
733
1568
 
1569
+ // src/interceptors/XMLHttpRequest/utils/getBodyByteLength.ts
1570
+ async function getBodyByteLength(input) {
1571
+ const explicitContentLength = input.headers.get("content-length");
1572
+ if (explicitContentLength != null && explicitContentLength !== "") {
1573
+ return Number(explicitContentLength);
1574
+ }
1575
+ const buffer = await input.arrayBuffer();
1576
+ return buffer.byteLength;
1577
+ }
1578
+
734
1579
  // src/interceptors/XMLHttpRequest/XMLHttpRequestController.ts
735
- var IS_MOCKED_RESPONSE = Symbol("isMockedResponse");
736
- var IS_NODE = isNodeProcess();
1580
+ var kIsRequestHandled = Symbol("kIsRequestHandled");
1581
+ var IS_NODE2 = isNodeProcess();
1582
+ var kFetchRequest = Symbol("kFetchRequest");
1583
+ kIsRequestHandled, kFetchRequest;
737
1584
  var XMLHttpRequestController = class {
738
1585
  constructor(initialRequest, logger) {
739
1586
  this.initialRequest = initialRequest;
740
1587
  this.logger = logger;
741
1588
  this.method = "GET";
742
1589
  this.url = null;
1590
+ this[kIsRequestHandled] = false;
743
1591
  this.events = /* @__PURE__ */ new Map();
1592
+ this.uploadEvents = /* @__PURE__ */ new Map();
744
1593
  this.requestId = createRequestId();
745
1594
  this.requestHeaders = new Headers();
746
1595
  this.responseBuffer = new Uint8Array();
@@ -760,7 +1609,6 @@ var XMLHttpRequestController = class {
760
1609
  }
761
1610
  },
762
1611
  methodCall: ([methodName, args], invoke) => {
763
- var _a;
764
1612
  switch (methodName) {
765
1613
  case "open": {
766
1614
  const [method, url] = args;
@@ -789,9 +1637,6 @@ var XMLHttpRequestController = class {
789
1637
  }
790
1638
  case "send": {
791
1639
  const [body] = args;
792
- if (body != null) {
793
- this.requestBody = typeof body === "string" ? encodeBuffer(body) : body;
794
- }
795
1640
  this.request.addEventListener("load", () => {
796
1641
  if (typeof this.onResponse !== "undefined") {
797
1642
  const fetchResponse = createResponse(
@@ -805,24 +1650,26 @@ var XMLHttpRequestController = class {
805
1650
  );
806
1651
  this.onResponse.call(this, {
807
1652
  response: fetchResponse,
808
- isMockedResponse: IS_MOCKED_RESPONSE in this.request,
1653
+ isMockedResponse: this[kIsRequestHandled],
809
1654
  request: fetchRequest,
810
1655
  requestId: this.requestId
811
1656
  });
812
1657
  }
813
1658
  });
814
- const fetchRequest = this.toFetchApiRequest();
815
- const onceRequestSettled = ((_a = this.onRequest) == null ? void 0 : _a.call(this, {
1659
+ const requestBody = typeof body === "string" ? encodeBuffer(body) : body;
1660
+ const fetchRequest = this.toFetchApiRequest(requestBody);
1661
+ this[kFetchRequest] = fetchRequest.clone();
1662
+ const onceRequestSettled = this.onRequest?.call(this, {
816
1663
  request: fetchRequest,
817
1664
  requestId: this.requestId
818
- })) || Promise.resolve();
1665
+ }) || Promise.resolve();
819
1666
  onceRequestSettled.finally(() => {
820
- if (this.request.readyState < this.request.LOADING) {
1667
+ if (!this[kIsRequestHandled]) {
821
1668
  this.logger.info(
822
1669
  "request callback settled but request has not been handled (readystate %d), performing as-is...",
823
1670
  this.request.readyState
824
1671
  );
825
- if (IS_NODE) {
1672
+ if (IS_NODE2) {
826
1673
  this.request.setRequestHeader(
827
1674
  INTERNAL_REQUEST_ID_HEADER_NAME,
828
1675
  this.requestId
@@ -839,6 +1686,39 @@ var XMLHttpRequestController = class {
839
1686
  }
840
1687
  }
841
1688
  });
1689
+ define(
1690
+ this.request,
1691
+ "upload",
1692
+ createProxy(this.request.upload, {
1693
+ setProperty: ([propertyName, nextValue], invoke) => {
1694
+ switch (propertyName) {
1695
+ case "onloadstart":
1696
+ case "onprogress":
1697
+ case "onaboart":
1698
+ case "onerror":
1699
+ case "onload":
1700
+ case "ontimeout":
1701
+ case "onloadend": {
1702
+ const eventName = propertyName.slice(
1703
+ 2
1704
+ );
1705
+ this.registerUploadEvent(eventName, nextValue);
1706
+ }
1707
+ }
1708
+ return invoke();
1709
+ },
1710
+ methodCall: ([methodName, args], invoke) => {
1711
+ switch (methodName) {
1712
+ case "addEventListener": {
1713
+ const [eventName, listener] = args;
1714
+ this.registerUploadEvent(eventName, listener);
1715
+ this.logger.info("upload.addEventListener", eventName, listener);
1716
+ return invoke();
1717
+ }
1718
+ }
1719
+ }
1720
+ })
1721
+ );
842
1722
  }
843
1723
  registerEvent(eventName, listener) {
844
1724
  const prevEvents = this.events.get(eventName) || [];
@@ -846,17 +1726,44 @@ var XMLHttpRequestController = class {
846
1726
  this.events.set(eventName, nextEvents);
847
1727
  this.logger.info('registered event "%s"', eventName, listener);
848
1728
  }
1729
+ registerUploadEvent(eventName, listener) {
1730
+ const prevEvents = this.uploadEvents.get(eventName) || [];
1731
+ const nextEvents = prevEvents.concat(listener);
1732
+ this.uploadEvents.set(eventName, nextEvents);
1733
+ this.logger.info('registered upload event "%s"', eventName, listener);
1734
+ }
849
1735
  /**
850
1736
  * Responds to the current request with the given
851
1737
  * Fetch API `Response` instance.
852
1738
  */
853
- respondWith(response) {
1739
+ async respondWith(response) {
1740
+ this[kIsRequestHandled] = true;
1741
+ if (this[kFetchRequest]) {
1742
+ const totalRequestBodyLength = await getBodyByteLength(
1743
+ this[kFetchRequest]
1744
+ );
1745
+ this.trigger("loadstart", this.request.upload, {
1746
+ loaded: 0,
1747
+ total: totalRequestBodyLength
1748
+ });
1749
+ this.trigger("progress", this.request.upload, {
1750
+ loaded: totalRequestBodyLength,
1751
+ total: totalRequestBodyLength
1752
+ });
1753
+ this.trigger("load", this.request.upload, {
1754
+ loaded: totalRequestBodyLength,
1755
+ total: totalRequestBodyLength
1756
+ });
1757
+ this.trigger("loadend", this.request.upload, {
1758
+ loaded: totalRequestBodyLength,
1759
+ total: totalRequestBodyLength
1760
+ });
1761
+ }
854
1762
  this.logger.info(
855
1763
  "responding with a mocked response: %d %s",
856
1764
  response.status,
857
1765
  response.statusText
858
1766
  );
859
- define(this.request, IS_MOCKED_RESPONSE, true);
860
1767
  define(this.request, "status", response.status);
861
1768
  define(this.request, "statusText", response.statusText);
862
1769
  define(this.request, "responseURL", this.url.href);
@@ -911,14 +1818,9 @@ var XMLHttpRequestController = class {
911
1818
  get: () => this.responseXML
912
1819
  }
913
1820
  });
914
- const totalResponseBodyLength = response.headers.has("Content-Length") ? Number(response.headers.get("Content-Length")) : (
915
- /**
916
- * @todo Infer the response body length from the response body.
917
- */
918
- void 0
919
- );
1821
+ const totalResponseBodyLength = await getBodyByteLength(response.clone());
920
1822
  this.logger.info("calculated response body length", totalResponseBodyLength);
921
- this.trigger("loadstart", {
1823
+ this.trigger("loadstart", this.request, {
922
1824
  loaded: 0,
923
1825
  total: totalResponseBodyLength
924
1826
  });
@@ -927,11 +1829,11 @@ var XMLHttpRequestController = class {
927
1829
  const finalizeResponse = () => {
928
1830
  this.logger.info("finalizing the mocked response...");
929
1831
  this.setReadyState(this.request.DONE);
930
- this.trigger("load", {
1832
+ this.trigger("load", this.request, {
931
1833
  loaded: this.responseBuffer.byteLength,
932
1834
  total: totalResponseBodyLength
933
1835
  });
934
- this.trigger("loadend", {
1836
+ this.trigger("loadend", this.request, {
935
1837
  loaded: this.responseBuffer.byteLength,
936
1838
  total: totalResponseBodyLength
937
1839
  });
@@ -949,7 +1851,7 @@ var XMLHttpRequestController = class {
949
1851
  if (value) {
950
1852
  this.logger.info("read response body chunk:", value);
951
1853
  this.responseBuffer = concatArrayBuffer(this.responseBuffer, value);
952
- this.trigger("progress", {
1854
+ this.trigger("progress", this.request, {
953
1855
  loaded: this.responseBuffer.byteLength,
954
1856
  total: totalResponseBodyLength
955
1857
  });
@@ -1007,7 +1909,7 @@ var XMLHttpRequestController = class {
1007
1909
  }
1008
1910
  }
1009
1911
  get responseText() {
1010
- invariant3(
1912
+ invariant(
1011
1913
  this.request.responseType === "" || this.request.responseType === "text",
1012
1914
  "InvalidStateError: The object is in invalid state."
1013
1915
  );
@@ -1019,7 +1921,7 @@ var XMLHttpRequestController = class {
1019
1921
  return responseText;
1020
1922
  }
1021
1923
  get responseXML() {
1022
- invariant3(
1924
+ invariant(
1023
1925
  this.request.responseType === "" || this.request.responseType === "document",
1024
1926
  "InvalidStateError: The object is in invalid state."
1025
1927
  );
@@ -1041,11 +1943,12 @@ var XMLHttpRequestController = class {
1041
1943
  }
1042
1944
  return null;
1043
1945
  }
1044
- errorWith(error) {
1946
+ errorWith(error2) {
1947
+ this[kIsRequestHandled] = true;
1045
1948
  this.logger.info("responding with an error");
1046
1949
  this.setReadyState(this.request.DONE);
1047
- this.trigger("error");
1048
- this.trigger("loadend");
1950
+ this.trigger("error", this.request);
1951
+ this.trigger("loadend", this.request);
1049
1952
  }
1050
1953
  /**
1051
1954
  * Transitions this request's `readyState` to the given one.
@@ -1064,36 +1967,38 @@ var XMLHttpRequestController = class {
1064
1967
  this.logger.info("set readyState to: %d", nextReadyState);
1065
1968
  if (nextReadyState !== this.request.UNSENT) {
1066
1969
  this.logger.info('triggerring "readystatechange" event...');
1067
- this.trigger("readystatechange");
1970
+ this.trigger("readystatechange", this.request);
1068
1971
  }
1069
1972
  }
1070
1973
  /**
1071
1974
  * Triggers given event on the `XMLHttpRequest` instance.
1072
1975
  */
1073
- trigger(eventName, options) {
1074
- const callback = this.request[`on${eventName}`];
1075
- const event = createEvent(this.request, eventName, options);
1976
+ trigger(eventName, target, options) {
1977
+ const callback = target[`on${eventName}`];
1978
+ const event = createEvent(target, eventName, options);
1076
1979
  this.logger.info('trigger "%s"', eventName, options || "");
1077
1980
  if (typeof callback === "function") {
1078
1981
  this.logger.info('found a direct "%s" callback, calling...', eventName);
1079
- callback.call(this.request, event);
1982
+ callback.call(target, event);
1080
1983
  }
1081
- for (const [registeredEventName, listeners] of this.events) {
1984
+ const events = target instanceof XMLHttpRequestUpload ? this.uploadEvents : this.events;
1985
+ for (const [registeredEventName, listeners] of events) {
1082
1986
  if (registeredEventName === eventName) {
1083
1987
  this.logger.info(
1084
1988
  'found %d listener(s) for "%s" event, calling...',
1085
1989
  listeners.length,
1086
1990
  eventName
1087
1991
  );
1088
- listeners.forEach((listener) => listener.call(this.request, event));
1992
+ listeners.forEach((listener) => listener.call(target, event));
1089
1993
  }
1090
1994
  }
1091
1995
  }
1092
1996
  /**
1093
1997
  * Converts this `XMLHttpRequest` instance into a Fetch API `Request` instance.
1094
1998
  */
1095
- toFetchApiRequest() {
1999
+ toFetchApiRequest(body) {
1096
2000
  this.logger.info("converting request to a Fetch API Request...");
2001
+ const resolvedBody = body instanceof Document ? body.documentElement.innerText : body;
1097
2002
  const fetchRequest = new Request(this.url.href, {
1098
2003
  method: this.method,
1099
2004
  headers: this.requestHeaders,
@@ -1101,7 +2006,7 @@ var XMLHttpRequestController = class {
1101
2006
  * @see https://xhr.spec.whatwg.org/#cross-origin-credentials
1102
2007
  */
1103
2008
  credentials: this.request.withCredentials ? "include" : "same-origin",
1104
- body: ["GET", "HEAD"].includes(this.method) ? null : this.requestBody
2009
+ body: ["GET", "HEAD"].includes(this.method.toUpperCase()) ? null : resolvedBody
1105
2010
  });
1106
2011
  const proxyHeaders = createProxy(fetchRequest.headers, {
1107
2012
  methodCall: ([methodName, args], invoke) => {
@@ -1182,16 +2087,16 @@ function createXMLHttpRequestProxy({
1182
2087
  requestId,
1183
2088
  controller,
1184
2089
  emitter,
1185
- onResponse: (response) => {
1186
- this.respondWith(response);
2090
+ onResponse: async (response) => {
2091
+ await this.respondWith(response);
1187
2092
  },
1188
2093
  onRequestError: () => {
1189
2094
  this.errorWith(new TypeError("Network error"));
1190
2095
  },
1191
- onError: (error) => {
1192
- this.logger.info("request errored!", { error });
1193
- if (error instanceof Error) {
1194
- this.errorWith(error);
2096
+ onError: (error2) => {
2097
+ this.logger.info("request errored!", { error: error2 });
2098
+ if (error2 instanceof Error) {
2099
+ this.errorWith(error2);
1195
2100
  }
1196
2101
  }
1197
2102
  });
@@ -1225,18 +2130,21 @@ function createXMLHttpRequestProxy({
1225
2130
  }
1226
2131
 
1227
2132
  // src/interceptors/XMLHttpRequest/index.ts
1228
- var _XMLHttpRequestInterceptor = class extends Interceptor {
2133
+ var XMLHttpRequestInterceptor = class _XMLHttpRequestInterceptor extends Interceptor {
2134
+ static {
2135
+ this.interceptorSymbol = Symbol("xhr");
2136
+ }
1229
2137
  constructor() {
1230
2138
  super(_XMLHttpRequestInterceptor.interceptorSymbol);
1231
2139
  }
1232
2140
  checkEnvironment() {
1233
- return typeof globalThis.XMLHttpRequest !== "undefined";
2141
+ return hasConfigurableGlobal("XMLHttpRequest");
1234
2142
  }
1235
2143
  setup() {
1236
2144
  const logger = this.logger.extend("setup");
1237
2145
  logger.info('patching "XMLHttpRequest" module...');
1238
2146
  const PureXMLHttpRequest = globalThis.XMLHttpRequest;
1239
- invariant4(
2147
+ invariant(
1240
2148
  !PureXMLHttpRequest[IS_PATCHED_MODULE],
1241
2149
  'Failed to patch the "XMLHttpRequest" module: already patched.'
1242
2150
  );
@@ -1265,8 +2173,6 @@ var _XMLHttpRequestInterceptor = class extends Interceptor {
1265
2173
  });
1266
2174
  }
1267
2175
  };
1268
- var XMLHttpRequestInterceptor = _XMLHttpRequestInterceptor;
1269
- XMLHttpRequestInterceptor.interceptorSymbol = Symbol("xhr");
1270
2176
 
1271
2177
  // src/presets/browser.ts
1272
2178
  var browser_default = [