importmap_mocha-rails 0.3.4 → 0.3.5
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/app/views/importmap_mocha/test/index.html.erb +1 -0
- data/config/importmap.rb +0 -7
- data/lib/importmap_mocha/version.rb +1 -1
- data/vendor/javascripts/@mswjs--interceptors--presets--browser.js +966 -126
- data/vendor/javascripts/@mswjs--interceptors.js +540 -7
- data/vendor/javascripts/chai.js +4 -3
- data/vendor/javascripts/mocha.js +77 -29
- data/vendor/stylesheets/mocha.css +45 -19
- metadata +11 -30
- 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,16 +814,24 @@ 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
|
}
|
@@ -245,6 +844,13 @@ var RESPONSE_STATUS_CODES_WITHOUT_BODY = /* @__PURE__ */ new Set([
|
|
245
844
|
205,
|
246
845
|
304
|
247
846
|
]);
|
847
|
+
var RESPONSE_STATUS_CODES_WITH_REDIRECT = /* @__PURE__ */ new Set([
|
848
|
+
301,
|
849
|
+
302,
|
850
|
+
303,
|
851
|
+
307,
|
852
|
+
308
|
853
|
+
]);
|
248
854
|
function isResponseWithoutBody(status) {
|
249
855
|
return RESPONSE_STATUS_CODES_WITHOUT_BODY.has(status);
|
250
856
|
}
|
@@ -271,38 +877,38 @@ function isResponseError(response) {
|
|
271
877
|
}
|
272
878
|
|
273
879
|
// src/utils/isNodeLikeError.ts
|
274
|
-
function isNodeLikeError(
|
275
|
-
if (
|
880
|
+
function isNodeLikeError(error2) {
|
881
|
+
if (error2 == null) {
|
276
882
|
return false;
|
277
883
|
}
|
278
|
-
if (!(
|
884
|
+
if (!(error2 instanceof Error)) {
|
279
885
|
return false;
|
280
886
|
}
|
281
|
-
return "code" in
|
887
|
+
return "code" in error2 && "errno" in error2;
|
282
888
|
}
|
283
889
|
|
284
890
|
// src/utils/handleRequest.ts
|
285
891
|
async function handleRequest(options) {
|
286
|
-
const handleResponse = (response) => {
|
892
|
+
const handleResponse = async (response) => {
|
287
893
|
if (response instanceof Error) {
|
288
894
|
options.onError(response);
|
289
895
|
} else if (isResponseError(response)) {
|
290
896
|
options.onRequestError(response);
|
291
897
|
} else {
|
292
|
-
options.onResponse(response);
|
898
|
+
await options.onResponse(response);
|
293
899
|
}
|
294
900
|
return true;
|
295
901
|
};
|
296
|
-
const handleResponseError = (
|
297
|
-
if (
|
902
|
+
const handleResponseError = async (error2) => {
|
903
|
+
if (error2 instanceof InterceptorError) {
|
298
904
|
throw result.error;
|
299
905
|
}
|
300
|
-
if (isNodeLikeError(
|
301
|
-
options.onError(
|
906
|
+
if (isNodeLikeError(error2)) {
|
907
|
+
options.onError(error2);
|
302
908
|
return true;
|
303
909
|
}
|
304
|
-
if (
|
305
|
-
return handleResponse(
|
910
|
+
if (error2 instanceof Response) {
|
911
|
+
return await handleResponse(error2);
|
306
912
|
}
|
307
913
|
return false;
|
308
914
|
};
|
@@ -314,7 +920,7 @@ async function handleRequest(options) {
|
|
314
920
|
options.controller[kResponsePromise].resolve(void 0);
|
315
921
|
}
|
316
922
|
});
|
317
|
-
const requestAbortPromise = new
|
923
|
+
const requestAbortPromise = new DeferredPromise();
|
318
924
|
if (options.request.signal) {
|
319
925
|
options.request.signal.addEventListener(
|
320
926
|
"abort",
|
@@ -344,7 +950,7 @@ async function handleRequest(options) {
|
|
344
950
|
return true;
|
345
951
|
}
|
346
952
|
if (result.error) {
|
347
|
-
if (handleResponseError(result.error)) {
|
953
|
+
if (await handleResponseError(result.error)) {
|
348
954
|
return true;
|
349
955
|
}
|
350
956
|
if (options.emitter.listenerCount("unhandledException") > 0) {
|
@@ -395,17 +1001,175 @@ function createRequestId() {
|
|
395
1001
|
return Math.random().toString(16).slice(2);
|
396
1002
|
}
|
397
1003
|
|
1004
|
+
// src/interceptors/fetch/utils/createNetworkError.ts
|
1005
|
+
function createNetworkError(cause) {
|
1006
|
+
return Object.assign(new TypeError("Failed to fetch"), {
|
1007
|
+
cause
|
1008
|
+
});
|
1009
|
+
}
|
1010
|
+
|
1011
|
+
// src/interceptors/fetch/utils/followRedirect.ts
|
1012
|
+
var REQUEST_BODY_HEADERS = [
|
1013
|
+
"content-encoding",
|
1014
|
+
"content-language",
|
1015
|
+
"content-location",
|
1016
|
+
"content-type",
|
1017
|
+
"content-length"
|
1018
|
+
];
|
1019
|
+
var kRedirectCount = Symbol("kRedirectCount");
|
1020
|
+
async function followFetchRedirect(request, response) {
|
1021
|
+
if (response.status !== 303 && request.body != null) {
|
1022
|
+
return Promise.reject(createNetworkError());
|
1023
|
+
}
|
1024
|
+
const requestUrl = new URL(request.url);
|
1025
|
+
let locationUrl;
|
1026
|
+
try {
|
1027
|
+
locationUrl = new URL(response.headers.get("location"), request.url);
|
1028
|
+
} catch (error2) {
|
1029
|
+
return Promise.reject(createNetworkError(error2));
|
1030
|
+
}
|
1031
|
+
if (!(locationUrl.protocol === "http:" || locationUrl.protocol === "https:")) {
|
1032
|
+
return Promise.reject(
|
1033
|
+
createNetworkError("URL scheme must be a HTTP(S) scheme")
|
1034
|
+
);
|
1035
|
+
}
|
1036
|
+
if (Reflect.get(request, kRedirectCount) > 20) {
|
1037
|
+
return Promise.reject(createNetworkError("redirect count exceeded"));
|
1038
|
+
}
|
1039
|
+
Object.defineProperty(request, kRedirectCount, {
|
1040
|
+
value: (Reflect.get(request, kRedirectCount) || 0) + 1
|
1041
|
+
});
|
1042
|
+
if (request.mode === "cors" && (locationUrl.username || locationUrl.password) && !sameOrigin(requestUrl, locationUrl)) {
|
1043
|
+
return Promise.reject(
|
1044
|
+
createNetworkError('cross origin not allowed for request mode "cors"')
|
1045
|
+
);
|
1046
|
+
}
|
1047
|
+
const requestInit = {};
|
1048
|
+
if ([301, 302].includes(response.status) && request.method === "POST" || response.status === 303 && !["HEAD", "GET"].includes(request.method)) {
|
1049
|
+
requestInit.method = "GET";
|
1050
|
+
requestInit.body = null;
|
1051
|
+
REQUEST_BODY_HEADERS.forEach((headerName) => {
|
1052
|
+
request.headers.delete(headerName);
|
1053
|
+
});
|
1054
|
+
}
|
1055
|
+
if (!sameOrigin(requestUrl, locationUrl)) {
|
1056
|
+
request.headers.delete("authorization");
|
1057
|
+
request.headers.delete("proxy-authorization");
|
1058
|
+
request.headers.delete("cookie");
|
1059
|
+
request.headers.delete("host");
|
1060
|
+
}
|
1061
|
+
requestInit.headers = request.headers;
|
1062
|
+
return fetch(new Request(locationUrl, requestInit));
|
1063
|
+
}
|
1064
|
+
function sameOrigin(left, right) {
|
1065
|
+
if (left.origin === right.origin && left.origin === "null") {
|
1066
|
+
return true;
|
1067
|
+
}
|
1068
|
+
if (left.protocol === right.protocol && left.hostname === right.hostname && left.port === right.port) {
|
1069
|
+
return true;
|
1070
|
+
}
|
1071
|
+
return false;
|
1072
|
+
}
|
1073
|
+
|
1074
|
+
// src/interceptors/fetch/utils/brotli-decompress.browser.ts
|
1075
|
+
var BrotliDecompressionStream = class extends TransformStream {
|
1076
|
+
constructor() {
|
1077
|
+
console.warn(
|
1078
|
+
"[Interceptors]: Brotli decompression of response streams is not supported in the browser"
|
1079
|
+
);
|
1080
|
+
super({
|
1081
|
+
transform(chunk, controller) {
|
1082
|
+
controller.enqueue(chunk);
|
1083
|
+
}
|
1084
|
+
});
|
1085
|
+
}
|
1086
|
+
};
|
1087
|
+
|
1088
|
+
// src/interceptors/fetch/utils/decompression.ts
|
1089
|
+
var PipelineStream = class extends TransformStream {
|
1090
|
+
constructor(transformStreams, ...strategies) {
|
1091
|
+
super({}, ...strategies);
|
1092
|
+
const readable = [super.readable, ...transformStreams].reduce(
|
1093
|
+
(readable2, transform) => readable2.pipeThrough(transform)
|
1094
|
+
);
|
1095
|
+
Object.defineProperty(this, "readable", {
|
1096
|
+
get() {
|
1097
|
+
return readable;
|
1098
|
+
}
|
1099
|
+
});
|
1100
|
+
}
|
1101
|
+
};
|
1102
|
+
function parseContentEncoding(contentEncoding) {
|
1103
|
+
return contentEncoding.toLowerCase().split(",").map((coding) => coding.trim());
|
1104
|
+
}
|
1105
|
+
function createDecompressionStream(contentEncoding) {
|
1106
|
+
if (contentEncoding === "") {
|
1107
|
+
return null;
|
1108
|
+
}
|
1109
|
+
const codings = parseContentEncoding(contentEncoding);
|
1110
|
+
if (codings.length === 0) {
|
1111
|
+
return null;
|
1112
|
+
}
|
1113
|
+
const transformers = codings.reduceRight(
|
1114
|
+
(transformers2, coding) => {
|
1115
|
+
if (coding === "gzip" || coding === "x-gzip") {
|
1116
|
+
return transformers2.concat(new DecompressionStream("gzip"));
|
1117
|
+
} else if (coding === "deflate") {
|
1118
|
+
return transformers2.concat(new DecompressionStream("deflate"));
|
1119
|
+
} else if (coding === "br") {
|
1120
|
+
return transformers2.concat(new BrotliDecompressionStream());
|
1121
|
+
} else {
|
1122
|
+
transformers2.length = 0;
|
1123
|
+
}
|
1124
|
+
return transformers2;
|
1125
|
+
},
|
1126
|
+
[]
|
1127
|
+
);
|
1128
|
+
return new PipelineStream(transformers);
|
1129
|
+
}
|
1130
|
+
function decompressResponse(response) {
|
1131
|
+
if (response.body === null) {
|
1132
|
+
return null;
|
1133
|
+
}
|
1134
|
+
const decompressionStream = createDecompressionStream(
|
1135
|
+
response.headers.get("content-encoding") || ""
|
1136
|
+
);
|
1137
|
+
if (!decompressionStream) {
|
1138
|
+
return null;
|
1139
|
+
}
|
1140
|
+
response.body.pipeTo(decompressionStream.writable);
|
1141
|
+
return decompressionStream.readable;
|
1142
|
+
}
|
1143
|
+
|
1144
|
+
// src/utils/hasConfigurableGlobal.ts
|
1145
|
+
function hasConfigurableGlobal(propertyName) {
|
1146
|
+
const descriptor = Object.getOwnPropertyDescriptor(globalThis, propertyName);
|
1147
|
+
if (typeof descriptor === "undefined") {
|
1148
|
+
return false;
|
1149
|
+
}
|
1150
|
+
if (typeof descriptor.set === "undefined" && !descriptor.configurable) {
|
1151
|
+
console.error(
|
1152
|
+
`[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.`
|
1153
|
+
);
|
1154
|
+
return false;
|
1155
|
+
}
|
1156
|
+
return true;
|
1157
|
+
}
|
1158
|
+
|
398
1159
|
// src/interceptors/fetch/index.ts
|
399
|
-
var
|
1160
|
+
var FetchInterceptor = class _FetchInterceptor extends Interceptor {
|
1161
|
+
static {
|
1162
|
+
this.symbol = Symbol("fetch");
|
1163
|
+
}
|
400
1164
|
constructor() {
|
401
1165
|
super(_FetchInterceptor.symbol);
|
402
1166
|
}
|
403
1167
|
checkEnvironment() {
|
404
|
-
return
|
1168
|
+
return hasConfigurableGlobal("fetch");
|
405
1169
|
}
|
406
1170
|
async setup() {
|
407
1171
|
const pureFetch = globalThis.fetch;
|
408
|
-
|
1172
|
+
invariant(
|
409
1173
|
!pureFetch[IS_PATCHED_MODULE],
|
410
1174
|
'Failed to patch the "fetch" module: already patched.'
|
411
1175
|
);
|
@@ -413,7 +1177,7 @@ var _FetchInterceptor = class extends Interceptor {
|
|
413
1177
|
const requestId = createRequestId();
|
414
1178
|
const resolvedInput = typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.origin) : input;
|
415
1179
|
const request = new Request(resolvedInput, init);
|
416
|
-
const responsePromise = new
|
1180
|
+
const responsePromise = new DeferredPromise();
|
417
1181
|
const controller = new RequestController(request);
|
418
1182
|
this.logger.info("[%s] %s", request.method, request.url);
|
419
1183
|
this.logger.info("awaiting for the mocked response...");
|
@@ -426,9 +1190,34 @@ var _FetchInterceptor = class extends Interceptor {
|
|
426
1190
|
requestId,
|
427
1191
|
emitter: this.emitter,
|
428
1192
|
controller,
|
429
|
-
onResponse: async (
|
1193
|
+
onResponse: async (rawResponse) => {
|
430
1194
|
this.logger.info("received mocked response!", {
|
431
|
-
|
1195
|
+
rawResponse
|
1196
|
+
});
|
1197
|
+
const decompressedStream = decompressResponse(rawResponse);
|
1198
|
+
const response = decompressedStream === null ? rawResponse : new Response(decompressedStream, rawResponse);
|
1199
|
+
if (RESPONSE_STATUS_CODES_WITH_REDIRECT.has(response.status)) {
|
1200
|
+
if (request.redirect === "error") {
|
1201
|
+
responsePromise.reject(createNetworkError("unexpected redirect"));
|
1202
|
+
return;
|
1203
|
+
}
|
1204
|
+
if (request.redirect === "follow") {
|
1205
|
+
followFetchRedirect(request, response).then(
|
1206
|
+
(response2) => {
|
1207
|
+
responsePromise.resolve(response2);
|
1208
|
+
},
|
1209
|
+
(reason) => {
|
1210
|
+
responsePromise.reject(reason);
|
1211
|
+
}
|
1212
|
+
);
|
1213
|
+
return;
|
1214
|
+
}
|
1215
|
+
}
|
1216
|
+
Object.defineProperty(response, "url", {
|
1217
|
+
writable: false,
|
1218
|
+
enumerable: true,
|
1219
|
+
configurable: false,
|
1220
|
+
value: request.url
|
432
1221
|
});
|
433
1222
|
if (this.emitter.listenerCount("response") > 0) {
|
434
1223
|
this.logger.info('emitting the "response" event...');
|
@@ -442,21 +1231,15 @@ var _FetchInterceptor = class extends Interceptor {
|
|
442
1231
|
requestId
|
443
1232
|
});
|
444
1233
|
}
|
445
|
-
Object.defineProperty(response, "url", {
|
446
|
-
writable: false,
|
447
|
-
enumerable: true,
|
448
|
-
configurable: false,
|
449
|
-
value: request.url
|
450
|
-
});
|
451
1234
|
responsePromise.resolve(response);
|
452
1235
|
},
|
453
1236
|
onRequestError: (response) => {
|
454
1237
|
this.logger.info("request has errored!", { response });
|
455
1238
|
responsePromise.reject(createNetworkError(response));
|
456
1239
|
},
|
457
|
-
onError: (
|
458
|
-
this.logger.info("request has been aborted!", { error });
|
459
|
-
responsePromise.reject(
|
1240
|
+
onError: (error2) => {
|
1241
|
+
this.logger.info("request has been aborted!", { error: error2 });
|
1242
|
+
responsePromise.reject(error2);
|
460
1243
|
}
|
461
1244
|
});
|
462
1245
|
if (isRequestHandled) {
|
@@ -466,12 +1249,12 @@ var _FetchInterceptor = class extends Interceptor {
|
|
466
1249
|
this.logger.info(
|
467
1250
|
"no mocked response received, performing request as-is..."
|
468
1251
|
);
|
469
|
-
return pureFetch(request).then((response) => {
|
1252
|
+
return pureFetch(request).then(async (response) => {
|
470
1253
|
this.logger.info("original fetch performed", response);
|
471
1254
|
if (this.emitter.listenerCount("response") > 0) {
|
472
1255
|
this.logger.info('emitting the "response" event...');
|
473
1256
|
const responseClone = response.clone();
|
474
|
-
this.emitter
|
1257
|
+
await emitAsync(this.emitter, "response", {
|
475
1258
|
response: responseClone,
|
476
1259
|
isMockedResponse: false,
|
477
1260
|
request,
|
@@ -498,20 +1281,6 @@ var _FetchInterceptor = class extends Interceptor {
|
|
498
1281
|
});
|
499
1282
|
}
|
500
1283
|
};
|
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
1284
|
|
516
1285
|
// src/interceptors/XMLHttpRequest/utils/concatArrayBuffer.ts
|
517
1286
|
function concatArrayBuffer(left, right) {
|
@@ -524,10 +1293,10 @@ function concatArrayBuffer(left, right) {
|
|
524
1293
|
// src/interceptors/XMLHttpRequest/polyfills/EventPolyfill.ts
|
525
1294
|
var EventPolyfill = class {
|
526
1295
|
constructor(type, options) {
|
527
|
-
this.AT_TARGET = 0;
|
528
|
-
this.BUBBLING_PHASE = 0;
|
529
|
-
this.CAPTURING_PHASE = 0;
|
530
1296
|
this.NONE = 0;
|
1297
|
+
this.CAPTURING_PHASE = 1;
|
1298
|
+
this.AT_TARGET = 2;
|
1299
|
+
this.BUBBLING_PHASE = 3;
|
531
1300
|
this.type = "";
|
532
1301
|
this.srcElement = null;
|
533
1302
|
this.currentTarget = null;
|
@@ -543,8 +1312,8 @@ var EventPolyfill = class {
|
|
543
1312
|
this.cancelBubble = false;
|
544
1313
|
this.returnValue = true;
|
545
1314
|
this.type = type;
|
546
|
-
this.target =
|
547
|
-
this.currentTarget =
|
1315
|
+
this.target = options?.target || null;
|
1316
|
+
this.currentTarget = options?.currentTarget || null;
|
548
1317
|
this.timeStamp = Date.now();
|
549
1318
|
}
|
550
1319
|
composedPath() {
|
@@ -568,10 +1337,10 @@ var EventPolyfill = class {
|
|
568
1337
|
var ProgressEventPolyfill = class extends EventPolyfill {
|
569
1338
|
constructor(type, init) {
|
570
1339
|
super(type);
|
571
|
-
this.lengthComputable =
|
572
|
-
this.composed =
|
573
|
-
this.loaded =
|
574
|
-
this.total =
|
1340
|
+
this.lengthComputable = init?.lengthComputable || false;
|
1341
|
+
this.composed = init?.composed || false;
|
1342
|
+
this.loaded = init?.loaded || 0;
|
1343
|
+
this.total = init?.total || 0;
|
575
1344
|
}
|
576
1345
|
};
|
577
1346
|
|
@@ -590,8 +1359,8 @@ function createEvent(target, type, init) {
|
|
590
1359
|
const ProgressEventClass = SUPPORTS_PROGRESS_EVENT ? ProgressEvent : ProgressEventPolyfill;
|
591
1360
|
const event = progressEvents.includes(type) ? new ProgressEventClass(type, {
|
592
1361
|
lengthComputable: true,
|
593
|
-
loaded:
|
594
|
-
total:
|
1362
|
+
loaded: init?.loaded || 0,
|
1363
|
+
total: init?.total || 0
|
595
1364
|
}) : new EventPolyfill(type, {
|
596
1365
|
target,
|
597
1366
|
currentTarget: target
|
@@ -649,7 +1418,7 @@ function optionsToProxyHandler(options) {
|
|
649
1418
|
propertySource,
|
650
1419
|
propertyName
|
651
1420
|
);
|
652
|
-
if (typeof
|
1421
|
+
if (typeof ownDescriptors?.set !== "undefined") {
|
653
1422
|
ownDescriptors.set.apply(target, [nextValue]);
|
654
1423
|
return true;
|
655
1424
|
}
|
@@ -731,16 +1500,30 @@ function createHeadersFromXMLHttpReqestHeaders(headersString) {
|
|
731
1500
|
return headers;
|
732
1501
|
}
|
733
1502
|
|
1503
|
+
// src/interceptors/XMLHttpRequest/utils/getBodyByteLength.ts
|
1504
|
+
async function getBodyByteLength(input) {
|
1505
|
+
const explicitContentLength = input.headers.get("content-length");
|
1506
|
+
if (explicitContentLength != null && explicitContentLength !== "") {
|
1507
|
+
return Number(explicitContentLength);
|
1508
|
+
}
|
1509
|
+
const buffer = await input.arrayBuffer();
|
1510
|
+
return buffer.byteLength;
|
1511
|
+
}
|
1512
|
+
|
734
1513
|
// src/interceptors/XMLHttpRequest/XMLHttpRequestController.ts
|
735
|
-
var
|
736
|
-
var
|
1514
|
+
var kIsRequestHandled = Symbol("kIsRequestHandled");
|
1515
|
+
var IS_NODE2 = isNodeProcess();
|
1516
|
+
var kFetchRequest = Symbol("kFetchRequest");
|
1517
|
+
kIsRequestHandled, kFetchRequest;
|
737
1518
|
var XMLHttpRequestController = class {
|
738
1519
|
constructor(initialRequest, logger) {
|
739
1520
|
this.initialRequest = initialRequest;
|
740
1521
|
this.logger = logger;
|
741
1522
|
this.method = "GET";
|
742
1523
|
this.url = null;
|
1524
|
+
this[kIsRequestHandled] = false;
|
743
1525
|
this.events = /* @__PURE__ */ new Map();
|
1526
|
+
this.uploadEvents = /* @__PURE__ */ new Map();
|
744
1527
|
this.requestId = createRequestId();
|
745
1528
|
this.requestHeaders = new Headers();
|
746
1529
|
this.responseBuffer = new Uint8Array();
|
@@ -760,7 +1543,6 @@ var XMLHttpRequestController = class {
|
|
760
1543
|
}
|
761
1544
|
},
|
762
1545
|
methodCall: ([methodName, args], invoke) => {
|
763
|
-
var _a;
|
764
1546
|
switch (methodName) {
|
765
1547
|
case "open": {
|
766
1548
|
const [method, url] = args;
|
@@ -789,9 +1571,6 @@ var XMLHttpRequestController = class {
|
|
789
1571
|
}
|
790
1572
|
case "send": {
|
791
1573
|
const [body] = args;
|
792
|
-
if (body != null) {
|
793
|
-
this.requestBody = typeof body === "string" ? encodeBuffer(body) : body;
|
794
|
-
}
|
795
1574
|
this.request.addEventListener("load", () => {
|
796
1575
|
if (typeof this.onResponse !== "undefined") {
|
797
1576
|
const fetchResponse = createResponse(
|
@@ -805,24 +1584,26 @@ var XMLHttpRequestController = class {
|
|
805
1584
|
);
|
806
1585
|
this.onResponse.call(this, {
|
807
1586
|
response: fetchResponse,
|
808
|
-
isMockedResponse:
|
1587
|
+
isMockedResponse: this[kIsRequestHandled],
|
809
1588
|
request: fetchRequest,
|
810
1589
|
requestId: this.requestId
|
811
1590
|
});
|
812
1591
|
}
|
813
1592
|
});
|
814
|
-
const
|
815
|
-
const
|
1593
|
+
const requestBody = typeof body === "string" ? encodeBuffer(body) : body;
|
1594
|
+
const fetchRequest = this.toFetchApiRequest(requestBody);
|
1595
|
+
this[kFetchRequest] = fetchRequest.clone();
|
1596
|
+
const onceRequestSettled = this.onRequest?.call(this, {
|
816
1597
|
request: fetchRequest,
|
817
1598
|
requestId: this.requestId
|
818
|
-
})
|
1599
|
+
}) || Promise.resolve();
|
819
1600
|
onceRequestSettled.finally(() => {
|
820
|
-
if (this
|
1601
|
+
if (!this[kIsRequestHandled]) {
|
821
1602
|
this.logger.info(
|
822
1603
|
"request callback settled but request has not been handled (readystate %d), performing as-is...",
|
823
1604
|
this.request.readyState
|
824
1605
|
);
|
825
|
-
if (
|
1606
|
+
if (IS_NODE2) {
|
826
1607
|
this.request.setRequestHeader(
|
827
1608
|
INTERNAL_REQUEST_ID_HEADER_NAME,
|
828
1609
|
this.requestId
|
@@ -839,6 +1620,39 @@ var XMLHttpRequestController = class {
|
|
839
1620
|
}
|
840
1621
|
}
|
841
1622
|
});
|
1623
|
+
define(
|
1624
|
+
this.request,
|
1625
|
+
"upload",
|
1626
|
+
createProxy(this.request.upload, {
|
1627
|
+
setProperty: ([propertyName, nextValue], invoke) => {
|
1628
|
+
switch (propertyName) {
|
1629
|
+
case "onloadstart":
|
1630
|
+
case "onprogress":
|
1631
|
+
case "onaboart":
|
1632
|
+
case "onerror":
|
1633
|
+
case "onload":
|
1634
|
+
case "ontimeout":
|
1635
|
+
case "onloadend": {
|
1636
|
+
const eventName = propertyName.slice(
|
1637
|
+
2
|
1638
|
+
);
|
1639
|
+
this.registerUploadEvent(eventName, nextValue);
|
1640
|
+
}
|
1641
|
+
}
|
1642
|
+
return invoke();
|
1643
|
+
},
|
1644
|
+
methodCall: ([methodName, args], invoke) => {
|
1645
|
+
switch (methodName) {
|
1646
|
+
case "addEventListener": {
|
1647
|
+
const [eventName, listener] = args;
|
1648
|
+
this.registerUploadEvent(eventName, listener);
|
1649
|
+
this.logger.info("upload.addEventListener", eventName, listener);
|
1650
|
+
return invoke();
|
1651
|
+
}
|
1652
|
+
}
|
1653
|
+
}
|
1654
|
+
})
|
1655
|
+
);
|
842
1656
|
}
|
843
1657
|
registerEvent(eventName, listener) {
|
844
1658
|
const prevEvents = this.events.get(eventName) || [];
|
@@ -846,17 +1660,44 @@ var XMLHttpRequestController = class {
|
|
846
1660
|
this.events.set(eventName, nextEvents);
|
847
1661
|
this.logger.info('registered event "%s"', eventName, listener);
|
848
1662
|
}
|
1663
|
+
registerUploadEvent(eventName, listener) {
|
1664
|
+
const prevEvents = this.uploadEvents.get(eventName) || [];
|
1665
|
+
const nextEvents = prevEvents.concat(listener);
|
1666
|
+
this.uploadEvents.set(eventName, nextEvents);
|
1667
|
+
this.logger.info('registered upload event "%s"', eventName, listener);
|
1668
|
+
}
|
849
1669
|
/**
|
850
1670
|
* Responds to the current request with the given
|
851
1671
|
* Fetch API `Response` instance.
|
852
1672
|
*/
|
853
|
-
respondWith(response) {
|
1673
|
+
async respondWith(response) {
|
1674
|
+
this[kIsRequestHandled] = true;
|
1675
|
+
if (this[kFetchRequest]) {
|
1676
|
+
const totalRequestBodyLength = await getBodyByteLength(
|
1677
|
+
this[kFetchRequest]
|
1678
|
+
);
|
1679
|
+
this.trigger("loadstart", this.request.upload, {
|
1680
|
+
loaded: 0,
|
1681
|
+
total: totalRequestBodyLength
|
1682
|
+
});
|
1683
|
+
this.trigger("progress", this.request.upload, {
|
1684
|
+
loaded: totalRequestBodyLength,
|
1685
|
+
total: totalRequestBodyLength
|
1686
|
+
});
|
1687
|
+
this.trigger("load", this.request.upload, {
|
1688
|
+
loaded: totalRequestBodyLength,
|
1689
|
+
total: totalRequestBodyLength
|
1690
|
+
});
|
1691
|
+
this.trigger("loadend", this.request.upload, {
|
1692
|
+
loaded: totalRequestBodyLength,
|
1693
|
+
total: totalRequestBodyLength
|
1694
|
+
});
|
1695
|
+
}
|
854
1696
|
this.logger.info(
|
855
1697
|
"responding with a mocked response: %d %s",
|
856
1698
|
response.status,
|
857
1699
|
response.statusText
|
858
1700
|
);
|
859
|
-
define(this.request, IS_MOCKED_RESPONSE, true);
|
860
1701
|
define(this.request, "status", response.status);
|
861
1702
|
define(this.request, "statusText", response.statusText);
|
862
1703
|
define(this.request, "responseURL", this.url.href);
|
@@ -911,14 +1752,9 @@ var XMLHttpRequestController = class {
|
|
911
1752
|
get: () => this.responseXML
|
912
1753
|
}
|
913
1754
|
});
|
914
|
-
const totalResponseBodyLength =
|
915
|
-
/**
|
916
|
-
* @todo Infer the response body length from the response body.
|
917
|
-
*/
|
918
|
-
void 0
|
919
|
-
);
|
1755
|
+
const totalResponseBodyLength = await getBodyByteLength(response.clone());
|
920
1756
|
this.logger.info("calculated response body length", totalResponseBodyLength);
|
921
|
-
this.trigger("loadstart", {
|
1757
|
+
this.trigger("loadstart", this.request, {
|
922
1758
|
loaded: 0,
|
923
1759
|
total: totalResponseBodyLength
|
924
1760
|
});
|
@@ -927,11 +1763,11 @@ var XMLHttpRequestController = class {
|
|
927
1763
|
const finalizeResponse = () => {
|
928
1764
|
this.logger.info("finalizing the mocked response...");
|
929
1765
|
this.setReadyState(this.request.DONE);
|
930
|
-
this.trigger("load", {
|
1766
|
+
this.trigger("load", this.request, {
|
931
1767
|
loaded: this.responseBuffer.byteLength,
|
932
1768
|
total: totalResponseBodyLength
|
933
1769
|
});
|
934
|
-
this.trigger("loadend", {
|
1770
|
+
this.trigger("loadend", this.request, {
|
935
1771
|
loaded: this.responseBuffer.byteLength,
|
936
1772
|
total: totalResponseBodyLength
|
937
1773
|
});
|
@@ -949,7 +1785,7 @@ var XMLHttpRequestController = class {
|
|
949
1785
|
if (value) {
|
950
1786
|
this.logger.info("read response body chunk:", value);
|
951
1787
|
this.responseBuffer = concatArrayBuffer(this.responseBuffer, value);
|
952
|
-
this.trigger("progress", {
|
1788
|
+
this.trigger("progress", this.request, {
|
953
1789
|
loaded: this.responseBuffer.byteLength,
|
954
1790
|
total: totalResponseBodyLength
|
955
1791
|
});
|
@@ -1007,7 +1843,7 @@ var XMLHttpRequestController = class {
|
|
1007
1843
|
}
|
1008
1844
|
}
|
1009
1845
|
get responseText() {
|
1010
|
-
|
1846
|
+
invariant(
|
1011
1847
|
this.request.responseType === "" || this.request.responseType === "text",
|
1012
1848
|
"InvalidStateError: The object is in invalid state."
|
1013
1849
|
);
|
@@ -1019,7 +1855,7 @@ var XMLHttpRequestController = class {
|
|
1019
1855
|
return responseText;
|
1020
1856
|
}
|
1021
1857
|
get responseXML() {
|
1022
|
-
|
1858
|
+
invariant(
|
1023
1859
|
this.request.responseType === "" || this.request.responseType === "document",
|
1024
1860
|
"InvalidStateError: The object is in invalid state."
|
1025
1861
|
);
|
@@ -1041,11 +1877,12 @@ var XMLHttpRequestController = class {
|
|
1041
1877
|
}
|
1042
1878
|
return null;
|
1043
1879
|
}
|
1044
|
-
errorWith(
|
1880
|
+
errorWith(error2) {
|
1881
|
+
this[kIsRequestHandled] = true;
|
1045
1882
|
this.logger.info("responding with an error");
|
1046
1883
|
this.setReadyState(this.request.DONE);
|
1047
|
-
this.trigger("error");
|
1048
|
-
this.trigger("loadend");
|
1884
|
+
this.trigger("error", this.request);
|
1885
|
+
this.trigger("loadend", this.request);
|
1049
1886
|
}
|
1050
1887
|
/**
|
1051
1888
|
* Transitions this request's `readyState` to the given one.
|
@@ -1064,36 +1901,38 @@ var XMLHttpRequestController = class {
|
|
1064
1901
|
this.logger.info("set readyState to: %d", nextReadyState);
|
1065
1902
|
if (nextReadyState !== this.request.UNSENT) {
|
1066
1903
|
this.logger.info('triggerring "readystatechange" event...');
|
1067
|
-
this.trigger("readystatechange");
|
1904
|
+
this.trigger("readystatechange", this.request);
|
1068
1905
|
}
|
1069
1906
|
}
|
1070
1907
|
/**
|
1071
1908
|
* Triggers given event on the `XMLHttpRequest` instance.
|
1072
1909
|
*/
|
1073
|
-
trigger(eventName, options) {
|
1074
|
-
const callback =
|
1075
|
-
const event = createEvent(
|
1910
|
+
trigger(eventName, target, options) {
|
1911
|
+
const callback = target[`on${eventName}`];
|
1912
|
+
const event = createEvent(target, eventName, options);
|
1076
1913
|
this.logger.info('trigger "%s"', eventName, options || "");
|
1077
1914
|
if (typeof callback === "function") {
|
1078
1915
|
this.logger.info('found a direct "%s" callback, calling...', eventName);
|
1079
|
-
callback.call(
|
1916
|
+
callback.call(target, event);
|
1080
1917
|
}
|
1081
|
-
|
1918
|
+
const events = target instanceof XMLHttpRequestUpload ? this.uploadEvents : this.events;
|
1919
|
+
for (const [registeredEventName, listeners] of events) {
|
1082
1920
|
if (registeredEventName === eventName) {
|
1083
1921
|
this.logger.info(
|
1084
1922
|
'found %d listener(s) for "%s" event, calling...',
|
1085
1923
|
listeners.length,
|
1086
1924
|
eventName
|
1087
1925
|
);
|
1088
|
-
listeners.forEach((listener) => listener.call(
|
1926
|
+
listeners.forEach((listener) => listener.call(target, event));
|
1089
1927
|
}
|
1090
1928
|
}
|
1091
1929
|
}
|
1092
1930
|
/**
|
1093
1931
|
* Converts this `XMLHttpRequest` instance into a Fetch API `Request` instance.
|
1094
1932
|
*/
|
1095
|
-
toFetchApiRequest() {
|
1933
|
+
toFetchApiRequest(body) {
|
1096
1934
|
this.logger.info("converting request to a Fetch API Request...");
|
1935
|
+
const resolvedBody = body instanceof Document ? body.documentElement.innerText : body;
|
1097
1936
|
const fetchRequest = new Request(this.url.href, {
|
1098
1937
|
method: this.method,
|
1099
1938
|
headers: this.requestHeaders,
|
@@ -1101,7 +1940,7 @@ var XMLHttpRequestController = class {
|
|
1101
1940
|
* @see https://xhr.spec.whatwg.org/#cross-origin-credentials
|
1102
1941
|
*/
|
1103
1942
|
credentials: this.request.withCredentials ? "include" : "same-origin",
|
1104
|
-
body: ["GET", "HEAD"].includes(this.method) ? null :
|
1943
|
+
body: ["GET", "HEAD"].includes(this.method.toUpperCase()) ? null : resolvedBody
|
1105
1944
|
});
|
1106
1945
|
const proxyHeaders = createProxy(fetchRequest.headers, {
|
1107
1946
|
methodCall: ([methodName, args], invoke) => {
|
@@ -1182,16 +2021,16 @@ function createXMLHttpRequestProxy({
|
|
1182
2021
|
requestId,
|
1183
2022
|
controller,
|
1184
2023
|
emitter,
|
1185
|
-
onResponse: (response) => {
|
1186
|
-
this.respondWith(response);
|
2024
|
+
onResponse: async (response) => {
|
2025
|
+
await this.respondWith(response);
|
1187
2026
|
},
|
1188
2027
|
onRequestError: () => {
|
1189
2028
|
this.errorWith(new TypeError("Network error"));
|
1190
2029
|
},
|
1191
|
-
onError: (
|
1192
|
-
this.logger.info("request errored!", { error });
|
1193
|
-
if (
|
1194
|
-
this.errorWith(
|
2030
|
+
onError: (error2) => {
|
2031
|
+
this.logger.info("request errored!", { error: error2 });
|
2032
|
+
if (error2 instanceof Error) {
|
2033
|
+
this.errorWith(error2);
|
1195
2034
|
}
|
1196
2035
|
}
|
1197
2036
|
});
|
@@ -1225,18 +2064,21 @@ function createXMLHttpRequestProxy({
|
|
1225
2064
|
}
|
1226
2065
|
|
1227
2066
|
// src/interceptors/XMLHttpRequest/index.ts
|
1228
|
-
var
|
2067
|
+
var XMLHttpRequestInterceptor = class _XMLHttpRequestInterceptor extends Interceptor {
|
2068
|
+
static {
|
2069
|
+
this.interceptorSymbol = Symbol("xhr");
|
2070
|
+
}
|
1229
2071
|
constructor() {
|
1230
2072
|
super(_XMLHttpRequestInterceptor.interceptorSymbol);
|
1231
2073
|
}
|
1232
2074
|
checkEnvironment() {
|
1233
|
-
return
|
2075
|
+
return hasConfigurableGlobal("XMLHttpRequest");
|
1234
2076
|
}
|
1235
2077
|
setup() {
|
1236
2078
|
const logger = this.logger.extend("setup");
|
1237
2079
|
logger.info('patching "XMLHttpRequest" module...');
|
1238
2080
|
const PureXMLHttpRequest = globalThis.XMLHttpRequest;
|
1239
|
-
|
2081
|
+
invariant(
|
1240
2082
|
!PureXMLHttpRequest[IS_PATCHED_MODULE],
|
1241
2083
|
'Failed to patch the "XMLHttpRequest" module: already patched.'
|
1242
2084
|
);
|
@@ -1265,8 +2107,6 @@ var _XMLHttpRequestInterceptor = class extends Interceptor {
|
|
1265
2107
|
});
|
1266
2108
|
}
|
1267
2109
|
};
|
1268
|
-
var XMLHttpRequestInterceptor = _XMLHttpRequestInterceptor;
|
1269
|
-
XMLHttpRequestInterceptor.interceptorSymbol = Symbol("xhr");
|
1270
2110
|
|
1271
2111
|
// src/presets/browser.ts
|
1272
2112
|
var browser_default = [
|