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.
- checksums.yaml +4 -4
- data/README.md +41 -0
- data/app/assets/javascripts/importmap_mocha.js +36 -0
- data/app/views/importmap_mocha/test/index.html.erb +6 -3
- data/config/importmap.rb +0 -7
- data/lib/importmap_mocha/version.rb +1 -1
- data/vendor/javascripts/@mswjs--interceptors--presets--browser.js +1051 -145
- data/vendor/javascripts/@mswjs--interceptors.js +618 -20
- data/vendor/javascripts/chai.js +4 -3
- data/vendor/javascripts/mocha.js +136 -43
- data/vendor/stylesheets/mocha.css +45 -19
- metadata +10 -29
- data/vendor/javascripts/@open-draft--deferred-promise.js +0 -2
- data/vendor/javascripts/@open-draft--logger.js +0 -2
- data/vendor/javascripts/@open-draft--until.js +0 -2
- data/vendor/javascripts/is-node-process.js +0 -2
- data/vendor/javascripts/outvariant.js +0 -2
- data/vendor/javascripts/strict-event-emitter.js +0 -2
@@ -1,13 +1,609 @@
|
|
1
|
-
//
|
2
|
-
|
3
|
-
|
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:",
|
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,
|
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(
|
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(
|
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
|
-
//
|
227
|
-
|
228
|
-
|
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
|
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(
|
275
|
-
if (
|
863
|
+
function isNodeLikeError(error2) {
|
864
|
+
if (error2 == null) {
|
276
865
|
return false;
|
277
866
|
}
|
278
|
-
if (!(
|
867
|
+
if (!(error2 instanceof Error)) {
|
279
868
|
return false;
|
280
869
|
}
|
281
|
-
return "code" in
|
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 = (
|
297
|
-
if (
|
885
|
+
const handleResponseError = async (error2) => {
|
886
|
+
if (error2 instanceof InterceptorError) {
|
298
887
|
throw result.error;
|
299
888
|
}
|
300
|
-
if (isNodeLikeError(
|
301
|
-
options.onError(
|
889
|
+
if (isNodeLikeError(error2)) {
|
890
|
+
options.onError(error2);
|
302
891
|
return true;
|
303
892
|
}
|
304
|
-
if (
|
305
|
-
return handleResponse(
|
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
|
906
|
+
const requestAbortPromise = new DeferredPromise();
|
318
907
|
if (options.request.signal) {
|
319
|
-
options.request.signal.
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
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
|
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
|
1238
|
+
return hasConfigurableGlobal("fetch");
|
405
1239
|
}
|
406
1240
|
async setup() {
|
407
1241
|
const pureFetch = globalThis.fetch;
|
408
|
-
|
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
|
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 (
|
1263
|
+
onResponse: async (rawResponse) => {
|
430
1264
|
this.logger.info("received mocked response!", {
|
431
|
-
|
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: (
|
458
|
-
this.logger.info("request has been aborted!", { error });
|
459
|
-
responsePromise.reject(
|
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
|
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 =
|
547
|
-
this.currentTarget =
|
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 =
|
572
|
-
this.composed =
|
573
|
-
this.loaded =
|
574
|
-
this.total =
|
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:
|
594
|
-
total:
|
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
|
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 =
|
712
|
-
return new
|
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
|
736
|
-
var
|
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:
|
1653
|
+
isMockedResponse: this[kIsRequestHandled],
|
809
1654
|
request: fetchRequest,
|
810
1655
|
requestId: this.requestId
|
811
1656
|
});
|
812
1657
|
}
|
813
1658
|
});
|
814
|
-
const
|
815
|
-
const
|
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
|
-
})
|
1665
|
+
}) || Promise.resolve();
|
819
1666
|
onceRequestSettled.finally(() => {
|
820
|
-
if (this
|
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 (
|
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 =
|
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
|
-
|
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
|
-
|
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(
|
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 =
|
1075
|
-
const event = createEvent(
|
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(
|
1982
|
+
callback.call(target, event);
|
1080
1983
|
}
|
1081
|
-
|
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(
|
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 :
|
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: (
|
1192
|
-
this.logger.info("request errored!", { error });
|
1193
|
-
if (
|
1194
|
-
this.errorWith(
|
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
|
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
|
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
|
-
|
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 = [
|