msw 2.4.3 → 2.4.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.
@@ -397,7 +397,7 @@ You can also automate this process and make the worker script update automatical
397
397
  }
398
398
  }
399
399
 
400
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-6HYIRFX2.mjs
400
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-6HYIRFX2.mjs
401
401
  var encoder = new TextEncoder();
402
402
  function encodeBuffer(text) {
403
403
  return encoder.encode(text);
@@ -413,7 +413,7 @@ function toArrayBuffer(array) {
413
413
  );
414
414
  }
415
415
 
416
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-OMISYKWR.mjs
416
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-XVPRNJO7.mjs
417
417
  var IS_PATCHED_MODULE = Symbol("isPatchedModule");
418
418
  function isPropertyAccessible(obj, key) {
419
419
  try {
@@ -430,6 +430,13 @@ var RESPONSE_STATUS_CODES_WITHOUT_BODY = /* @__PURE__ */ new Set([
430
430
  205,
431
431
  304
432
432
  ]);
433
+ var RESPONSE_STATUS_CODES_WITH_REDIRECT = /* @__PURE__ */ new Set([
434
+ 301,
435
+ 302,
436
+ 303,
437
+ 307,
438
+ 308
439
+ ]);
433
440
  function isResponseWithoutBody(status) {
434
441
  return RESPONSE_STATUS_CODES_WITHOUT_BODY.has(status);
435
442
  }
@@ -455,6 +462,90 @@ function isResponseError(response) {
455
462
  return isPropertyAccessible(response, "type") && response.type === "error";
456
463
  }
457
464
 
465
+ // node_modules/.pnpm/outvariant@1.4.3/node_modules/outvariant/lib/index.mjs
466
+ var POSITIONALS_EXP2 = /(%?)(%([sdijo]))/g;
467
+ function serializePositional2(positional, flag) {
468
+ switch (flag) {
469
+ case "s":
470
+ return positional;
471
+ case "d":
472
+ case "i":
473
+ return Number(positional);
474
+ case "j":
475
+ return JSON.stringify(positional);
476
+ case "o": {
477
+ if (typeof positional === "string") {
478
+ return positional;
479
+ }
480
+ const json = JSON.stringify(positional);
481
+ if (json === "{}" || json === "[]" || /^\[object .+?\]$/.test(json)) {
482
+ return positional;
483
+ }
484
+ return json;
485
+ }
486
+ }
487
+ }
488
+ function format2(message, ...positionals) {
489
+ if (positionals.length === 0) {
490
+ return message;
491
+ }
492
+ let positionalIndex = 0;
493
+ let formattedMessage = message.replace(
494
+ POSITIONALS_EXP2,
495
+ (match, isEscaped, _, flag) => {
496
+ const positional = positionals[positionalIndex];
497
+ const value = serializePositional2(positional, flag);
498
+ if (!isEscaped) {
499
+ positionalIndex++;
500
+ return value;
501
+ }
502
+ return match;
503
+ }
504
+ );
505
+ if (positionalIndex < positionals.length) {
506
+ formattedMessage += ` ${positionals.slice(positionalIndex).join(" ")}`;
507
+ }
508
+ formattedMessage = formattedMessage.replace(/%{2,2}/g, "%");
509
+ return formattedMessage;
510
+ }
511
+ var STACK_FRAMES_TO_IGNORE2 = 2;
512
+ function cleanErrorStack2(error2) {
513
+ if (!error2.stack) {
514
+ return;
515
+ }
516
+ const nextStack = error2.stack.split("\n");
517
+ nextStack.splice(1, STACK_FRAMES_TO_IGNORE2);
518
+ error2.stack = nextStack.join("\n");
519
+ }
520
+ var InvariantError2 = class extends Error {
521
+ constructor(message, ...positionals) {
522
+ super(message);
523
+ this.message = message;
524
+ this.name = "Invariant Violation";
525
+ this.message = format2(message, ...positionals);
526
+ cleanErrorStack2(this);
527
+ }
528
+ };
529
+ var invariant2 = (predicate, message, ...positionals) => {
530
+ if (!predicate) {
531
+ throw new InvariantError2(message, ...positionals);
532
+ }
533
+ };
534
+ invariant2.as = (ErrorConstructor, predicate, message, ...positionals) => {
535
+ if (!predicate) {
536
+ const formatMessage = positionals.length === 0 ? message : format2(message, ...positionals);
537
+ let error2;
538
+ try {
539
+ error2 = Reflect.construct(ErrorConstructor, [
540
+ formatMessage
541
+ ]);
542
+ } catch (err) {
543
+ error2 = ErrorConstructor(formatMessage);
544
+ }
545
+ throw error2;
546
+ }
547
+ };
548
+
458
549
  // node_modules/.pnpm/@open-draft+logger@0.3.0/node_modules/@open-draft/logger/lib/index.mjs
459
550
  var __defProp2 = Object.defineProperty;
460
551
  var __export2 = (target, all) => {
@@ -683,21 +774,21 @@ var PerformanceEntry = class {
683
774
  var noop = () => void 0;
684
775
  function log(message, ...positionals) {
685
776
  if (IS_NODE) {
686
- process.stdout.write(format(message, ...positionals) + "\n");
777
+ process.stdout.write(format2(message, ...positionals) + "\n");
687
778
  return;
688
779
  }
689
780
  console.log(message, ...positionals);
690
781
  }
691
782
  function warn(message, ...positionals) {
692
783
  if (IS_NODE) {
693
- process.stderr.write(format(message, ...positionals) + "\n");
784
+ process.stderr.write(format2(message, ...positionals) + "\n");
694
785
  return;
695
786
  }
696
787
  console.warn(message, ...positionals);
697
788
  }
698
789
  function error(message, ...positionals) {
699
790
  if (IS_NODE) {
700
- process.stderr.write(format(message, ...positionals) + "\n");
791
+ process.stderr.write(format2(message, ...positionals) + "\n");
701
792
  return;
702
793
  }
703
794
  console.error(message, ...positionals);
@@ -892,7 +983,7 @@ var _Emitter = class {
892
983
  var Emitter = _Emitter;
893
984
  Emitter.defaultMaxListeners = 10;
894
985
 
895
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-QED3Q6Z2.mjs
986
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-QED3Q6Z2.mjs
896
987
  var INTERNAL_REQUEST_ID_HEADER_NAME = "x-interceptors-internal-request-id";
897
988
  function getGlobalSymbol(symbol) {
898
989
  return (
@@ -1040,7 +1131,7 @@ function createRequestId() {
1040
1131
  return Math.random().toString(16).slice(2);
1041
1132
  }
1042
1133
 
1043
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/index.mjs
1134
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/index.mjs
1044
1135
  var BatchInterceptor = class extends Interceptor {
1045
1136
  constructor(options) {
1046
1137
  BatchInterceptor.symbol = Symbol(options.name);
@@ -1324,34 +1415,58 @@ var DeferredPromise = class extends Promise {
1324
1415
  }
1325
1416
  };
1326
1417
 
1327
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-OUWBQF3Z.mjs
1418
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-THPGBWJQ.mjs
1419
+ var InterceptorError = class extends Error {
1420
+ constructor(message) {
1421
+ super(message);
1422
+ this.name = "InterceptorError";
1423
+ Object.setPrototypeOf(this, InterceptorError.prototype);
1424
+ }
1425
+ };
1426
+ var kRequestHandled = Symbol("kRequestHandled");
1427
+ var kResponsePromise = Symbol("kResponsePromise");
1328
1428
  var RequestController = class {
1329
1429
  constructor(request) {
1330
1430
  this.request = request;
1331
- this.responsePromise = new DeferredPromise();
1431
+ this[kRequestHandled] = false;
1432
+ this[kResponsePromise] = new DeferredPromise();
1332
1433
  }
1434
+ /**
1435
+ * Respond to this request with the given `Response` instance.
1436
+ * @example
1437
+ * controller.respondWith(new Response())
1438
+ * controller.respondWith(Response.json({ id }))
1439
+ * controller.respondWith(Response.error())
1440
+ */
1333
1441
  respondWith(response) {
1334
- invariant(
1335
- this.responsePromise.state === "pending",
1336
- 'Failed to respond to "%s %s" request: the "request" event has already been responded to.',
1442
+ invariant2.as(
1443
+ InterceptorError,
1444
+ !this[kRequestHandled],
1445
+ 'Failed to respond to the "%s %s" request: the "request" event has already been handled.',
1337
1446
  this.request.method,
1338
1447
  this.request.url
1339
1448
  );
1340
- this.responsePromise.resolve(response);
1449
+ this[kRequestHandled] = true;
1450
+ this[kResponsePromise].resolve(response);
1451
+ }
1452
+ /**
1453
+ * Error this request with the given error.
1454
+ * @example
1455
+ * controller.errorWith()
1456
+ * controller.errorWith(new Error('Oops!'))
1457
+ */
1458
+ errorWith(error2) {
1459
+ invariant2.as(
1460
+ InterceptorError,
1461
+ !this[kRequestHandled],
1462
+ 'Failed to error the "%s %s" request: the "request" event has already been handled.',
1463
+ this.request.method,
1464
+ this.request.url
1465
+ );
1466
+ this[kRequestHandled] = true;
1467
+ this[kResponsePromise].resolve(error2);
1341
1468
  }
1342
1469
  };
1343
- function toInteractiveRequest(request) {
1344
- const requestController = new RequestController(request);
1345
- Reflect.set(
1346
- request,
1347
- "respondWith",
1348
- requestController.respondWith.bind(requestController)
1349
- );
1350
- return {
1351
- interactiveRequest: request,
1352
- requestController
1353
- };
1354
- }
1355
1470
  async function emitAsync(emitter, eventName, ...data) {
1356
1471
  const listners = emitter.listeners(eventName);
1357
1472
  if (listners.length === 0) {
@@ -1361,8 +1476,114 @@ async function emitAsync(emitter, eventName, ...data) {
1361
1476
  await listener.apply(emitter, data);
1362
1477
  }
1363
1478
  }
1479
+ function isNodeLikeError(error2) {
1480
+ if (error2 == null) {
1481
+ return false;
1482
+ }
1483
+ if (!(error2 instanceof Error)) {
1484
+ return false;
1485
+ }
1486
+ return "code" in error2 && "errno" in error2;
1487
+ }
1488
+ async function handleRequest2(options) {
1489
+ const handleResponse = async (response) => {
1490
+ if (response instanceof Error) {
1491
+ options.onError(response);
1492
+ } else if (isResponseError(response)) {
1493
+ options.onRequestError(response);
1494
+ } else {
1495
+ await options.onResponse(response);
1496
+ }
1497
+ return true;
1498
+ };
1499
+ const handleResponseError = async (error2) => {
1500
+ if (error2 instanceof InterceptorError) {
1501
+ throw result.error;
1502
+ }
1503
+ if (isNodeLikeError(error2)) {
1504
+ options.onError(error2);
1505
+ return true;
1506
+ }
1507
+ if (error2 instanceof Response) {
1508
+ return await handleResponse(error2);
1509
+ }
1510
+ return false;
1511
+ };
1512
+ options.emitter.once("request", ({ requestId: pendingRequestId }) => {
1513
+ if (pendingRequestId !== options.requestId) {
1514
+ return;
1515
+ }
1516
+ if (options.controller[kResponsePromise].state === "pending") {
1517
+ options.controller[kResponsePromise].resolve(void 0);
1518
+ }
1519
+ });
1520
+ const requestAbortPromise = new DeferredPromise();
1521
+ if (options.request.signal) {
1522
+ options.request.signal.addEventListener(
1523
+ "abort",
1524
+ () => {
1525
+ requestAbortPromise.reject(options.request.signal.reason);
1526
+ },
1527
+ { once: true }
1528
+ );
1529
+ }
1530
+ const result = await until(async () => {
1531
+ const requestListtenersPromise = emitAsync(options.emitter, "request", {
1532
+ requestId: options.requestId,
1533
+ request: options.request,
1534
+ controller: options.controller
1535
+ });
1536
+ await Promise.race([
1537
+ // Short-circuit the request handling promise if the request gets aborted.
1538
+ requestAbortPromise,
1539
+ requestListtenersPromise,
1540
+ options.controller[kResponsePromise]
1541
+ ]);
1542
+ const mockedResponse = await options.controller[kResponsePromise];
1543
+ return mockedResponse;
1544
+ });
1545
+ if (requestAbortPromise.state === "rejected") {
1546
+ options.onError(requestAbortPromise.rejectionReason);
1547
+ return true;
1548
+ }
1549
+ if (result.error) {
1550
+ if (await handleResponseError(result.error)) {
1551
+ return true;
1552
+ }
1553
+ if (options.emitter.listenerCount("unhandledException") > 0) {
1554
+ const unhandledExceptionController = new RequestController(
1555
+ options.request
1556
+ );
1557
+ await emitAsync(options.emitter, "unhandledException", {
1558
+ error: result.error,
1559
+ request: options.request,
1560
+ requestId: options.requestId,
1561
+ controller: unhandledExceptionController
1562
+ }).then(() => {
1563
+ if (unhandledExceptionController[kResponsePromise].state === "pending") {
1564
+ unhandledExceptionController[kResponsePromise].resolve(void 0);
1565
+ }
1566
+ });
1567
+ const nextResult = await until(
1568
+ () => unhandledExceptionController[kResponsePromise]
1569
+ );
1570
+ if (nextResult.error) {
1571
+ return handleResponseError(nextResult.error);
1572
+ }
1573
+ if (nextResult.data) {
1574
+ return handleResponse(nextResult.data);
1575
+ }
1576
+ }
1577
+ options.onResponse(createServerErrorResponse(result.error));
1578
+ return true;
1579
+ }
1580
+ if (result.data) {
1581
+ return handleResponse(result.data);
1582
+ }
1583
+ return false;
1584
+ }
1364
1585
 
1365
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-MAEPOYB6.mjs
1586
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-DZCGGRSJ.mjs
1366
1587
  function canParseUrl(url) {
1367
1588
  try {
1368
1589
  new URL(url);
@@ -1371,6 +1592,72 @@ function canParseUrl(url) {
1371
1592
  return false;
1372
1593
  }
1373
1594
  }
1595
+ function createNetworkError(cause) {
1596
+ return Object.assign(new TypeError("Failed to fetch"), {
1597
+ cause
1598
+ });
1599
+ }
1600
+ var REQUEST_BODY_HEADERS = [
1601
+ "content-encoding",
1602
+ "content-language",
1603
+ "content-location",
1604
+ "content-type",
1605
+ "content-length"
1606
+ ];
1607
+ var kRedirectCount = Symbol("kRedirectCount");
1608
+ async function followFetchRedirect(request, response) {
1609
+ if (response.status !== 303 && request.body != null) {
1610
+ return Promise.reject(createNetworkError());
1611
+ }
1612
+ const requestUrl = new URL(request.url);
1613
+ let locationUrl;
1614
+ try {
1615
+ locationUrl = new URL(response.headers.get("location"));
1616
+ } catch (error2) {
1617
+ return Promise.reject(createNetworkError(error2));
1618
+ }
1619
+ if (!(locationUrl.protocol === "http:" || locationUrl.protocol === "https:")) {
1620
+ return Promise.reject(
1621
+ createNetworkError("URL scheme must be a HTTP(S) scheme")
1622
+ );
1623
+ }
1624
+ if (Reflect.get(request, kRedirectCount) > 20) {
1625
+ return Promise.reject(createNetworkError("redirect count exceeded"));
1626
+ }
1627
+ Object.defineProperty(request, kRedirectCount, {
1628
+ value: (Reflect.get(request, kRedirectCount) || 0) + 1
1629
+ });
1630
+ if (request.mode === "cors" && (locationUrl.username || locationUrl.password) && !sameOrigin(requestUrl, locationUrl)) {
1631
+ return Promise.reject(
1632
+ createNetworkError('cross origin not allowed for request mode "cors"')
1633
+ );
1634
+ }
1635
+ const requestInit = {};
1636
+ if ([301, 302].includes(response.status) && request.method === "POST" || response.status === 303 && !["HEAD", "GET"].includes(request.method)) {
1637
+ requestInit.method = "GET";
1638
+ requestInit.body = null;
1639
+ REQUEST_BODY_HEADERS.forEach((headerName) => {
1640
+ request.headers.delete(headerName);
1641
+ });
1642
+ }
1643
+ if (!sameOrigin(requestUrl, locationUrl)) {
1644
+ request.headers.delete("authorization");
1645
+ request.headers.delete("proxy-authorization");
1646
+ request.headers.delete("cookie");
1647
+ request.headers.delete("host");
1648
+ }
1649
+ requestInit.headers = request.headers;
1650
+ return fetch(new Request(locationUrl, requestInit));
1651
+ }
1652
+ function sameOrigin(left, right) {
1653
+ if (left.origin === right.origin && left.origin === "null") {
1654
+ return true;
1655
+ }
1656
+ if (left.protocol === right.protocol && left.hostname === right.hostname && left.port === right.port) {
1657
+ return true;
1658
+ }
1659
+ return false;
1660
+ }
1374
1661
  var _FetchInterceptor = class extends Interceptor {
1375
1662
  constructor() {
1376
1663
  super(_FetchInterceptor.symbol);
@@ -1380,136 +1667,84 @@ var _FetchInterceptor = class extends Interceptor {
1380
1667
  }
1381
1668
  async setup() {
1382
1669
  const pureFetch = globalThis.fetch;
1383
- invariant(
1670
+ invariant2(
1384
1671
  !pureFetch[IS_PATCHED_MODULE],
1385
1672
  'Failed to patch the "fetch" module: already patched.'
1386
1673
  );
1387
1674
  globalThis.fetch = async (input, init) => {
1388
- var _a;
1389
1675
  const requestId = createRequestId();
1390
1676
  const resolvedInput = typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.origin) : input;
1391
1677
  const request = new Request(resolvedInput, init);
1678
+ const responsePromise = new DeferredPromise();
1679
+ const controller = new RequestController(request);
1392
1680
  this.logger.info("[%s] %s", request.method, request.url);
1393
- const { interactiveRequest, requestController } = toInteractiveRequest(request);
1681
+ this.logger.info("awaiting for the mocked response...");
1394
1682
  this.logger.info(
1395
- 'emitting the "request" event for %d listener(s)...',
1683
+ 'emitting the "request" event for %s listener(s)...',
1396
1684
  this.emitter.listenerCount("request")
1397
1685
  );
1398
- this.emitter.once("request", ({ requestId: pendingRequestId }) => {
1399
- if (pendingRequestId !== requestId) {
1400
- return;
1401
- }
1402
- if (requestController.responsePromise.state === "pending") {
1403
- requestController.responsePromise.resolve(void 0);
1404
- }
1405
- });
1406
- this.logger.info("awaiting for the mocked response...");
1407
- const signal = interactiveRequest.signal;
1408
- const requestAborted = new DeferredPromise();
1409
- if (signal) {
1410
- signal.addEventListener(
1411
- "abort",
1412
- () => {
1413
- requestAborted.reject(signal.reason);
1414
- },
1415
- { once: true }
1416
- );
1417
- }
1418
- const responsePromise = new DeferredPromise();
1419
- const respondWith = (response) => {
1420
- this.logger.info("responding with a mock response:", response);
1421
- if (this.emitter.listenerCount("response") > 0) {
1422
- this.logger.info('emitting the "response" event...');
1423
- const responseClone = response.clone();
1424
- this.emitter.emit("response", {
1425
- response: responseClone,
1426
- isMockedResponse: true,
1427
- request: interactiveRequest,
1428
- requestId
1429
- });
1430
- }
1431
- Object.defineProperty(response, "url", {
1432
- writable: false,
1433
- enumerable: true,
1434
- configurable: false,
1435
- value: request.url
1436
- });
1437
- responsePromise.resolve(response);
1438
- };
1439
- const errorWith = (reason) => {
1440
- responsePromise.reject(reason);
1441
- };
1442
- const resolverResult = await until(
1443
- async () => {
1444
- const listenersFinished = emitAsync(this.emitter, "request", {
1445
- request: interactiveRequest,
1446
- requestId
1686
+ const isRequestHandled = await handleRequest2({
1687
+ request,
1688
+ requestId,
1689
+ emitter: this.emitter,
1690
+ controller,
1691
+ onResponse: async (response) => {
1692
+ this.logger.info("received mocked response!", {
1693
+ response
1447
1694
  });
1448
- await Promise.race([
1449
- requestAborted,
1450
- // Put the listeners invocation Promise in the same race condition
1451
- // with the request abort Promise because otherwise awaiting the listeners
1452
- // would always yield some response (or undefined).
1453
- listenersFinished,
1454
- requestController.responsePromise
1455
- ]);
1456
- this.logger.info("all request listeners have been resolved!");
1457
- const mockedResponse2 = await requestController.responsePromise;
1458
- this.logger.info("event.respondWith called with:", mockedResponse2);
1459
- return mockedResponse2;
1460
- }
1461
- );
1462
- if (requestAborted.state === "rejected") {
1463
- this.logger.info(
1464
- "request has been aborted:",
1465
- requestAborted.rejectionReason
1466
- );
1467
- responsePromise.reject(requestAborted.rejectionReason);
1468
- return responsePromise;
1469
- }
1470
- if (resolverResult.error) {
1471
- this.logger.info(
1472
- "request listerner threw an error:",
1473
- resolverResult.error
1474
- );
1475
- if (resolverResult.error instanceof Response) {
1476
- if (isResponseError(resolverResult.error)) {
1477
- errorWith(createNetworkError(resolverResult.error));
1478
- } else {
1479
- respondWith(resolverResult.error);
1480
- }
1481
- }
1482
- if (this.emitter.listenerCount("unhandledException") > 0) {
1483
- await emitAsync(this.emitter, "unhandledException", {
1484
- error: resolverResult.error,
1485
- request,
1486
- requestId,
1487
- controller: {
1488
- respondWith,
1489
- errorWith
1695
+ if (RESPONSE_STATUS_CODES_WITH_REDIRECT.has(response.status)) {
1696
+ if (request.redirect === "error") {
1697
+ responsePromise.reject(createNetworkError("unexpected redirect"));
1698
+ return;
1699
+ }
1700
+ if (request.redirect === "follow") {
1701
+ followFetchRedirect(request, response).then(
1702
+ (response2) => {
1703
+ responsePromise.resolve(response2);
1704
+ },
1705
+ (reason) => {
1706
+ responsePromise.reject(reason);
1707
+ }
1708
+ );
1709
+ return;
1490
1710
  }
1491
- });
1492
- if (responsePromise.state !== "pending") {
1493
- return responsePromise;
1494
1711
  }
1712
+ if (this.emitter.listenerCount("response") > 0) {
1713
+ this.logger.info('emitting the "response" event...');
1714
+ await emitAsync(this.emitter, "response", {
1715
+ // Clone the mocked response for the "response" event listener.
1716
+ // This way, the listener can read the response and not lock its body
1717
+ // for the actual fetch consumer.
1718
+ response: response.clone(),
1719
+ isMockedResponse: true,
1720
+ request,
1721
+ requestId
1722
+ });
1723
+ }
1724
+ Object.defineProperty(response, "url", {
1725
+ writable: false,
1726
+ enumerable: true,
1727
+ configurable: false,
1728
+ value: request.url
1729
+ });
1730
+ responsePromise.resolve(response);
1731
+ },
1732
+ onRequestError: (response) => {
1733
+ this.logger.info("request has errored!", { response });
1734
+ responsePromise.reject(createNetworkError(response));
1735
+ },
1736
+ onError: (error2) => {
1737
+ this.logger.info("request has been aborted!", { error: error2 });
1738
+ responsePromise.reject(error2);
1495
1739
  }
1496
- respondWith(createServerErrorResponse(resolverResult.error));
1497
- return responsePromise;
1498
- }
1499
- const mockedResponse = resolverResult.data;
1500
- if (mockedResponse && !((_a = request.signal) == null ? void 0 : _a.aborted)) {
1501
- this.logger.info("received mocked response:", mockedResponse);
1502
- if (isResponseError(mockedResponse)) {
1503
- this.logger.info(
1504
- "received a network error response, rejecting the request promise..."
1505
- );
1506
- errorWith(createNetworkError(mockedResponse));
1507
- } else {
1508
- respondWith(mockedResponse);
1509
- }
1740
+ });
1741
+ if (isRequestHandled) {
1742
+ this.logger.info("request has been handled, returning mock promise...");
1510
1743
  return responsePromise;
1511
1744
  }
1512
- this.logger.info("no mocked response received!");
1745
+ this.logger.info(
1746
+ "no mocked response received, performing request as-is..."
1747
+ );
1513
1748
  return pureFetch(request).then((response) => {
1514
1749
  this.logger.info("original fetch performed", response);
1515
1750
  if (this.emitter.listenerCount("response") > 0) {
@@ -1518,7 +1753,7 @@ var _FetchInterceptor = class extends Interceptor {
1518
1753
  this.emitter.emit("response", {
1519
1754
  response: responseClone,
1520
1755
  isMockedResponse: false,
1521
- request: interactiveRequest,
1756
+ request,
1522
1757
  requestId
1523
1758
  });
1524
1759
  }
@@ -1544,13 +1779,8 @@ var _FetchInterceptor = class extends Interceptor {
1544
1779
  };
1545
1780
  var FetchInterceptor = _FetchInterceptor;
1546
1781
  FetchInterceptor.symbol = Symbol("fetch");
1547
- function createNetworkError(cause) {
1548
- return Object.assign(new TypeError("Failed to fetch"), {
1549
- cause
1550
- });
1551
- }
1552
1782
 
1553
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-732REFPX.mjs
1783
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-PRBA3ES4.mjs
1554
1784
  function concatArrayBuffer(left, right) {
1555
1785
  const result = new Uint8Array(left.byteLength + right.byteLength);
1556
1786
  result.set(left, 0);
@@ -1559,10 +1789,10 @@ function concatArrayBuffer(left, right) {
1559
1789
  }
1560
1790
  var EventPolyfill = class {
1561
1791
  constructor(type, options) {
1562
- this.AT_TARGET = 0;
1563
- this.BUBBLING_PHASE = 0;
1564
- this.CAPTURING_PHASE = 0;
1565
1792
  this.NONE = 0;
1793
+ this.CAPTURING_PHASE = 1;
1794
+ this.AT_TARGET = 2;
1795
+ this.BUBBLING_PHASE = 3;
1566
1796
  this.type = "";
1567
1797
  this.srcElement = null;
1568
1798
  this.currentTarget = null;
@@ -1735,15 +1965,26 @@ function createHeadersFromXMLHttpReqestHeaders(headersString) {
1735
1965
  }
1736
1966
  return headers;
1737
1967
  }
1738
- var IS_MOCKED_RESPONSE = Symbol("isMockedResponse");
1968
+ async function getBodyByteLength(input) {
1969
+ const explicitContentLength = input.headers.get("content-length");
1970
+ if (explicitContentLength != null && explicitContentLength !== "") {
1971
+ return Number(explicitContentLength);
1972
+ }
1973
+ const buffer = await input.arrayBuffer();
1974
+ return buffer.byteLength;
1975
+ }
1976
+ var kIsRequestHandled = Symbol("kIsRequestHandled");
1739
1977
  var IS_NODE2 = isNodeProcess();
1978
+ var kFetchRequest = Symbol("kFetchRequest");
1740
1979
  var XMLHttpRequestController = class {
1741
1980
  constructor(initialRequest, logger) {
1742
1981
  this.initialRequest = initialRequest;
1743
1982
  this.logger = logger;
1744
1983
  this.method = "GET";
1745
1984
  this.url = null;
1985
+ this[kIsRequestHandled] = false;
1746
1986
  this.events = /* @__PURE__ */ new Map();
1987
+ this.uploadEvents = /* @__PURE__ */ new Map();
1747
1988
  this.requestId = createRequestId();
1748
1989
  this.requestHeaders = new Headers();
1749
1990
  this.responseBuffer = new Uint8Array();
@@ -1792,9 +2033,6 @@ var XMLHttpRequestController = class {
1792
2033
  }
1793
2034
  case "send": {
1794
2035
  const [body] = args;
1795
- if (body != null) {
1796
- this.requestBody = typeof body === "string" ? encodeBuffer(body) : body;
1797
- }
1798
2036
  this.request.addEventListener("load", () => {
1799
2037
  if (typeof this.onResponse !== "undefined") {
1800
2038
  const fetchResponse = createResponse(
@@ -1808,19 +2046,21 @@ var XMLHttpRequestController = class {
1808
2046
  );
1809
2047
  this.onResponse.call(this, {
1810
2048
  response: fetchResponse,
1811
- isMockedResponse: IS_MOCKED_RESPONSE in this.request,
2049
+ isMockedResponse: this[kIsRequestHandled],
1812
2050
  request: fetchRequest,
1813
2051
  requestId: this.requestId
1814
2052
  });
1815
2053
  }
1816
2054
  });
1817
- const fetchRequest = this.toFetchApiRequest();
2055
+ const requestBody = typeof body === "string" ? encodeBuffer(body) : body;
2056
+ const fetchRequest = this.toFetchApiRequest(requestBody);
2057
+ this[kFetchRequest] = fetchRequest;
1818
2058
  const onceRequestSettled = ((_a = this.onRequest) == null ? void 0 : _a.call(this, {
1819
2059
  request: fetchRequest,
1820
2060
  requestId: this.requestId
1821
2061
  })) || Promise.resolve();
1822
2062
  onceRequestSettled.finally(() => {
1823
- if (this.request.readyState < this.request.LOADING) {
2063
+ if (!this[kIsRequestHandled]) {
1824
2064
  this.logger.info(
1825
2065
  "request callback settled but request has not been handled (readystate %d), performing as-is...",
1826
2066
  this.request.readyState
@@ -1842,6 +2082,39 @@ var XMLHttpRequestController = class {
1842
2082
  }
1843
2083
  }
1844
2084
  });
2085
+ define(
2086
+ this.request,
2087
+ "upload",
2088
+ createProxy(this.request.upload, {
2089
+ setProperty: ([propertyName, nextValue], invoke) => {
2090
+ switch (propertyName) {
2091
+ case "onloadstart":
2092
+ case "onprogress":
2093
+ case "onaboart":
2094
+ case "onerror":
2095
+ case "onload":
2096
+ case "ontimeout":
2097
+ case "onloadend": {
2098
+ const eventName = propertyName.slice(
2099
+ 2
2100
+ );
2101
+ this.registerUploadEvent(eventName, nextValue);
2102
+ }
2103
+ }
2104
+ return invoke();
2105
+ },
2106
+ methodCall: ([methodName, args], invoke) => {
2107
+ switch (methodName) {
2108
+ case "addEventListener": {
2109
+ const [eventName, listener] = args;
2110
+ this.registerUploadEvent(eventName, listener);
2111
+ this.logger.info("upload.addEventListener", eventName, listener);
2112
+ return invoke();
2113
+ }
2114
+ }
2115
+ }
2116
+ })
2117
+ );
1845
2118
  }
1846
2119
  registerEvent(eventName, listener) {
1847
2120
  const prevEvents = this.events.get(eventName) || [];
@@ -1849,17 +2122,44 @@ var XMLHttpRequestController = class {
1849
2122
  this.events.set(eventName, nextEvents);
1850
2123
  this.logger.info('registered event "%s"', eventName, listener);
1851
2124
  }
2125
+ registerUploadEvent(eventName, listener) {
2126
+ const prevEvents = this.uploadEvents.get(eventName) || [];
2127
+ const nextEvents = prevEvents.concat(listener);
2128
+ this.uploadEvents.set(eventName, nextEvents);
2129
+ this.logger.info('registered upload event "%s"', eventName, listener);
2130
+ }
1852
2131
  /**
1853
2132
  * Responds to the current request with the given
1854
2133
  * Fetch API `Response` instance.
1855
2134
  */
1856
- respondWith(response) {
2135
+ async respondWith(response) {
2136
+ this[kIsRequestHandled] = true;
2137
+ if (this[kFetchRequest]) {
2138
+ const totalRequestBodyLength = await getBodyByteLength(
2139
+ this[kFetchRequest].clone()
2140
+ );
2141
+ this.trigger("loadstart", this.request.upload, {
2142
+ loaded: 0,
2143
+ total: totalRequestBodyLength
2144
+ });
2145
+ this.trigger("progress", this.request.upload, {
2146
+ loaded: totalRequestBodyLength,
2147
+ total: totalRequestBodyLength
2148
+ });
2149
+ this.trigger("load", this.request.upload, {
2150
+ loaded: totalRequestBodyLength,
2151
+ total: totalRequestBodyLength
2152
+ });
2153
+ this.trigger("loadend", this.request.upload, {
2154
+ loaded: totalRequestBodyLength,
2155
+ total: totalRequestBodyLength
2156
+ });
2157
+ }
1857
2158
  this.logger.info(
1858
2159
  "responding with a mocked response: %d %s",
1859
2160
  response.status,
1860
2161
  response.statusText
1861
2162
  );
1862
- define(this.request, IS_MOCKED_RESPONSE, true);
1863
2163
  define(this.request, "status", response.status);
1864
2164
  define(this.request, "statusText", response.statusText);
1865
2165
  define(this.request, "responseURL", this.url.href);
@@ -1914,14 +2214,9 @@ var XMLHttpRequestController = class {
1914
2214
  get: () => this.responseXML
1915
2215
  }
1916
2216
  });
1917
- const totalResponseBodyLength = response.headers.has("Content-Length") ? Number(response.headers.get("Content-Length")) : (
1918
- /**
1919
- * @todo Infer the response body length from the response body.
1920
- */
1921
- void 0
1922
- );
2217
+ const totalResponseBodyLength = await getBodyByteLength(response.clone());
1923
2218
  this.logger.info("calculated response body length", totalResponseBodyLength);
1924
- this.trigger("loadstart", {
2219
+ this.trigger("loadstart", this.request, {
1925
2220
  loaded: 0,
1926
2221
  total: totalResponseBodyLength
1927
2222
  });
@@ -1930,11 +2225,11 @@ var XMLHttpRequestController = class {
1930
2225
  const finalizeResponse = () => {
1931
2226
  this.logger.info("finalizing the mocked response...");
1932
2227
  this.setReadyState(this.request.DONE);
1933
- this.trigger("load", {
2228
+ this.trigger("load", this.request, {
1934
2229
  loaded: this.responseBuffer.byteLength,
1935
2230
  total: totalResponseBodyLength
1936
2231
  });
1937
- this.trigger("loadend", {
2232
+ this.trigger("loadend", this.request, {
1938
2233
  loaded: this.responseBuffer.byteLength,
1939
2234
  total: totalResponseBodyLength
1940
2235
  });
@@ -1952,7 +2247,7 @@ var XMLHttpRequestController = class {
1952
2247
  if (value) {
1953
2248
  this.logger.info("read response body chunk:", value);
1954
2249
  this.responseBuffer = concatArrayBuffer(this.responseBuffer, value);
1955
- this.trigger("progress", {
2250
+ this.trigger("progress", this.request, {
1956
2251
  loaded: this.responseBuffer.byteLength,
1957
2252
  total: totalResponseBodyLength
1958
2253
  });
@@ -2010,7 +2305,7 @@ var XMLHttpRequestController = class {
2010
2305
  }
2011
2306
  }
2012
2307
  get responseText() {
2013
- invariant(
2308
+ invariant2(
2014
2309
  this.request.responseType === "" || this.request.responseType === "text",
2015
2310
  "InvalidStateError: The object is in invalid state."
2016
2311
  );
@@ -2022,7 +2317,7 @@ var XMLHttpRequestController = class {
2022
2317
  return responseText;
2023
2318
  }
2024
2319
  get responseXML() {
2025
- invariant(
2320
+ invariant2(
2026
2321
  this.request.responseType === "" || this.request.responseType === "document",
2027
2322
  "InvalidStateError: The object is in invalid state."
2028
2323
  );
@@ -2045,10 +2340,11 @@ var XMLHttpRequestController = class {
2045
2340
  return null;
2046
2341
  }
2047
2342
  errorWith(error2) {
2343
+ this[kIsRequestHandled] = true;
2048
2344
  this.logger.info("responding with an error");
2049
2345
  this.setReadyState(this.request.DONE);
2050
- this.trigger("error");
2051
- this.trigger("loadend");
2346
+ this.trigger("error", this.request);
2347
+ this.trigger("loadend", this.request);
2052
2348
  }
2053
2349
  /**
2054
2350
  * Transitions this request's `readyState` to the given one.
@@ -2067,36 +2363,38 @@ var XMLHttpRequestController = class {
2067
2363
  this.logger.info("set readyState to: %d", nextReadyState);
2068
2364
  if (nextReadyState !== this.request.UNSENT) {
2069
2365
  this.logger.info('triggerring "readystatechange" event...');
2070
- this.trigger("readystatechange");
2366
+ this.trigger("readystatechange", this.request);
2071
2367
  }
2072
2368
  }
2073
2369
  /**
2074
2370
  * Triggers given event on the `XMLHttpRequest` instance.
2075
2371
  */
2076
- trigger(eventName, options) {
2077
- const callback = this.request[`on${eventName}`];
2078
- const event = createEvent(this.request, eventName, options);
2372
+ trigger(eventName, target, options) {
2373
+ const callback = target[`on${eventName}`];
2374
+ const event = createEvent(target, eventName, options);
2079
2375
  this.logger.info('trigger "%s"', eventName, options || "");
2080
2376
  if (typeof callback === "function") {
2081
2377
  this.logger.info('found a direct "%s" callback, calling...', eventName);
2082
- callback.call(this.request, event);
2378
+ callback.call(target, event);
2083
2379
  }
2084
- for (const [registeredEventName, listeners] of this.events) {
2380
+ const events = target instanceof XMLHttpRequestUpload ? this.uploadEvents : this.events;
2381
+ for (const [registeredEventName, listeners] of events) {
2085
2382
  if (registeredEventName === eventName) {
2086
2383
  this.logger.info(
2087
2384
  'found %d listener(s) for "%s" event, calling...',
2088
2385
  listeners.length,
2089
2386
  eventName
2090
2387
  );
2091
- listeners.forEach((listener) => listener.call(this.request, event));
2388
+ listeners.forEach((listener) => listener.call(target, event));
2092
2389
  }
2093
2390
  }
2094
2391
  }
2095
2392
  /**
2096
2393
  * Converts this `XMLHttpRequest` instance into a Fetch API `Request` instance.
2097
2394
  */
2098
- toFetchApiRequest() {
2395
+ toFetchApiRequest(body) {
2099
2396
  this.logger.info("converting request to a Fetch API Request...");
2397
+ const resolvedBody = body instanceof Document ? body.documentElement.innerText : body;
2100
2398
  const fetchRequest = new Request(this.url.href, {
2101
2399
  method: this.method,
2102
2400
  headers: this.requestHeaders,
@@ -2104,7 +2402,7 @@ var XMLHttpRequestController = class {
2104
2402
  * @see https://xhr.spec.whatwg.org/#cross-origin-credentials
2105
2403
  */
2106
2404
  credentials: this.request.withCredentials ? "include" : "same-origin",
2107
- body: ["GET", "HEAD"].includes(this.method) ? null : this.requestBody
2405
+ body: ["GET", "HEAD"].includes(this.method.toUpperCase()) ? null : resolvedBody
2108
2406
  });
2109
2407
  const proxyHeaders = createProxy(fetchRequest.headers, {
2110
2408
  methodCall: ([methodName, args], invoke) => {
@@ -2172,81 +2470,35 @@ function createXMLHttpRequestProxy({
2172
2470
  logger
2173
2471
  );
2174
2472
  xhrRequestController.onRequest = async function({ request, requestId }) {
2175
- const { interactiveRequest, requestController } = toInteractiveRequest(request);
2473
+ const controller = new RequestController(request);
2176
2474
  this.logger.info("awaiting mocked response...");
2177
- emitter.once("request", ({ requestId: pendingRequestId }) => {
2178
- if (pendingRequestId !== requestId) {
2179
- return;
2180
- }
2181
- if (requestController.responsePromise.state === "pending") {
2182
- requestController.respondWith(void 0);
2183
- }
2184
- });
2185
- const resolverResult = await until(async () => {
2186
- this.logger.info(
2187
- 'emitting the "request" event for %s listener(s)...',
2188
- emitter.listenerCount("request")
2189
- );
2190
- await emitAsync(emitter, "request", {
2191
- request: interactiveRequest,
2192
- requestId
2193
- });
2194
- this.logger.info('all "request" listeners settled!');
2195
- const mockedResponse2 = await requestController.responsePromise;
2196
- this.logger.info("event.respondWith called with:", mockedResponse2);
2197
- return mockedResponse2;
2198
- });
2199
- if (resolverResult.error) {
2200
- this.logger.info(
2201
- "request listener threw an exception, aborting request...",
2202
- resolverResult.error
2203
- );
2204
- if (resolverResult.error instanceof Response) {
2205
- if (isResponseError(resolverResult.error)) {
2206
- xhrRequestController.errorWith(new TypeError("Network error"));
2207
- } else {
2208
- this.respondWith(resolverResult.error);
2209
- }
2210
- return;
2211
- }
2212
- if (emitter.listenerCount("unhandledException") > 0) {
2213
- await emitAsync(emitter, "unhandledException", {
2214
- error: resolverResult.error,
2215
- request,
2216
- requestId,
2217
- controller: {
2218
- respondWith: xhrRequestController.respondWith.bind(xhrRequestController),
2219
- errorWith: xhrRequestController.errorWith.bind(xhrRequestController)
2220
- }
2221
- });
2222
- if (originalRequest.readyState > XMLHttpRequest.OPENED) {
2223
- return;
2475
+ this.logger.info(
2476
+ 'emitting the "request" event for %s listener(s)...',
2477
+ emitter.listenerCount("request")
2478
+ );
2479
+ const isRequestHandled = await handleRequest2({
2480
+ request,
2481
+ requestId,
2482
+ controller,
2483
+ emitter,
2484
+ onResponse: async (response) => {
2485
+ await this.respondWith(response);
2486
+ },
2487
+ onRequestError: () => {
2488
+ this.errorWith(new TypeError("Network error"));
2489
+ },
2490
+ onError: (error2) => {
2491
+ this.logger.info("request errored!", { error: error2 });
2492
+ if (error2 instanceof Error) {
2493
+ this.errorWith(error2);
2224
2494
  }
2225
2495
  }
2226
- xhrRequestController.respondWith(
2227
- createServerErrorResponse(resolverResult.error)
2228
- );
2229
- return;
2230
- }
2231
- const mockedResponse = resolverResult.data;
2232
- if (typeof mockedResponse !== "undefined") {
2496
+ });
2497
+ if (!isRequestHandled) {
2233
2498
  this.logger.info(
2234
- "received mocked response: %d %s",
2235
- mockedResponse.status,
2236
- mockedResponse.statusText
2499
+ "no mocked response received, performing request as-is..."
2237
2500
  );
2238
- if (isResponseError(mockedResponse)) {
2239
- this.logger.info(
2240
- "received a network error response, rejecting the request promise..."
2241
- );
2242
- xhrRequestController.errorWith(new TypeError("Network error"));
2243
- return;
2244
- }
2245
- return xhrRequestController.respondWith(mockedResponse);
2246
2501
  }
2247
- this.logger.info(
2248
- "no mocked response received, performing request as-is..."
2249
- );
2250
2502
  };
2251
2503
  xhrRequestController.onResponse = async function({
2252
2504
  response,
@@ -2281,7 +2533,7 @@ var _XMLHttpRequestInterceptor = class extends Interceptor {
2281
2533
  const logger = this.logger.extend("setup");
2282
2534
  logger.info('patching "XMLHttpRequest" module...');
2283
2535
  const PureXMLHttpRequest = globalThis.XMLHttpRequest;
2284
- invariant(
2536
+ invariant2(
2285
2537
  !PureXMLHttpRequest[IS_PATCHED_MODULE],
2286
2538
  'Failed to patch the "XMLHttpRequest" module: already patched.'
2287
2539
  );
@@ -2320,7 +2572,7 @@ function createFallbackRequestListener(context, options) {
2320
2572
  name: "fallback",
2321
2573
  interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()]
2322
2574
  });
2323
- interceptor.on("request", async ({ request, requestId }) => {
2575
+ interceptor.on("request", async ({ request, requestId, controller }) => {
2324
2576
  const requestCloneForLogs = request.clone();
2325
2577
  const response = await (0, import_handleRequest2.handleRequest)(
2326
2578
  request,
@@ -2343,7 +2595,7 @@ function createFallbackRequestListener(context, options) {
2343
2595
  }
2344
2596
  );
2345
2597
  if (response) {
2346
- request.respondWith(response);
2598
+ controller.respondWith(response);
2347
2599
  }
2348
2600
  });
2349
2601
  interceptor.on(