msw 2.4.3 → 2.4.4

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.
@@ -370,7 +370,7 @@ You can also automate this process and make the worker script update automatical
370
370
  }
371
371
  }
372
372
 
373
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-6HYIRFX2.mjs
373
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-6HYIRFX2.mjs
374
374
  var encoder = new TextEncoder();
375
375
  function encodeBuffer(text) {
376
376
  return encoder.encode(text);
@@ -386,7 +386,7 @@ function toArrayBuffer(array) {
386
386
  );
387
387
  }
388
388
 
389
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-OMISYKWR.mjs
389
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-XVPRNJO7.mjs
390
390
  var IS_PATCHED_MODULE = Symbol("isPatchedModule");
391
391
  function isPropertyAccessible(obj, key) {
392
392
  try {
@@ -403,6 +403,13 @@ var RESPONSE_STATUS_CODES_WITHOUT_BODY = /* @__PURE__ */ new Set([
403
403
  205,
404
404
  304
405
405
  ]);
406
+ var RESPONSE_STATUS_CODES_WITH_REDIRECT = /* @__PURE__ */ new Set([
407
+ 301,
408
+ 302,
409
+ 303,
410
+ 307,
411
+ 308
412
+ ]);
406
413
  function isResponseWithoutBody(status) {
407
414
  return RESPONSE_STATUS_CODES_WITHOUT_BODY.has(status);
408
415
  }
@@ -428,6 +435,90 @@ function isResponseError(response) {
428
435
  return isPropertyAccessible(response, "type") && response.type === "error";
429
436
  }
430
437
 
438
+ // node_modules/.pnpm/outvariant@1.4.3/node_modules/outvariant/lib/index.mjs
439
+ var POSITIONALS_EXP2 = /(%?)(%([sdijo]))/g;
440
+ function serializePositional2(positional, flag) {
441
+ switch (flag) {
442
+ case "s":
443
+ return positional;
444
+ case "d":
445
+ case "i":
446
+ return Number(positional);
447
+ case "j":
448
+ return JSON.stringify(positional);
449
+ case "o": {
450
+ if (typeof positional === "string") {
451
+ return positional;
452
+ }
453
+ const json = JSON.stringify(positional);
454
+ if (json === "{}" || json === "[]" || /^\[object .+?\]$/.test(json)) {
455
+ return positional;
456
+ }
457
+ return json;
458
+ }
459
+ }
460
+ }
461
+ function format2(message, ...positionals) {
462
+ if (positionals.length === 0) {
463
+ return message;
464
+ }
465
+ let positionalIndex = 0;
466
+ let formattedMessage = message.replace(
467
+ POSITIONALS_EXP2,
468
+ (match, isEscaped, _, flag) => {
469
+ const positional = positionals[positionalIndex];
470
+ const value = serializePositional2(positional, flag);
471
+ if (!isEscaped) {
472
+ positionalIndex++;
473
+ return value;
474
+ }
475
+ return match;
476
+ }
477
+ );
478
+ if (positionalIndex < positionals.length) {
479
+ formattedMessage += ` ${positionals.slice(positionalIndex).join(" ")}`;
480
+ }
481
+ formattedMessage = formattedMessage.replace(/%{2,2}/g, "%");
482
+ return formattedMessage;
483
+ }
484
+ var STACK_FRAMES_TO_IGNORE2 = 2;
485
+ function cleanErrorStack2(error2) {
486
+ if (!error2.stack) {
487
+ return;
488
+ }
489
+ const nextStack = error2.stack.split("\n");
490
+ nextStack.splice(1, STACK_FRAMES_TO_IGNORE2);
491
+ error2.stack = nextStack.join("\n");
492
+ }
493
+ var InvariantError2 = class extends Error {
494
+ constructor(message, ...positionals) {
495
+ super(message);
496
+ this.message = message;
497
+ this.name = "Invariant Violation";
498
+ this.message = format2(message, ...positionals);
499
+ cleanErrorStack2(this);
500
+ }
501
+ };
502
+ var invariant2 = (predicate, message, ...positionals) => {
503
+ if (!predicate) {
504
+ throw new InvariantError2(message, ...positionals);
505
+ }
506
+ };
507
+ invariant2.as = (ErrorConstructor, predicate, message, ...positionals) => {
508
+ if (!predicate) {
509
+ const formatMessage = positionals.length === 0 ? message : format2(message, ...positionals);
510
+ let error2;
511
+ try {
512
+ error2 = Reflect.construct(ErrorConstructor, [
513
+ formatMessage
514
+ ]);
515
+ } catch (err) {
516
+ error2 = ErrorConstructor(formatMessage);
517
+ }
518
+ throw error2;
519
+ }
520
+ };
521
+
431
522
  // node_modules/.pnpm/@open-draft+logger@0.3.0/node_modules/@open-draft/logger/lib/index.mjs
432
523
  var __defProp = Object.defineProperty;
433
524
  var __export = (target, all) => {
@@ -656,21 +747,21 @@ var PerformanceEntry = class {
656
747
  var noop = () => void 0;
657
748
  function log(message, ...positionals) {
658
749
  if (IS_NODE) {
659
- process.stdout.write(format(message, ...positionals) + "\n");
750
+ process.stdout.write(format2(message, ...positionals) + "\n");
660
751
  return;
661
752
  }
662
753
  console.log(message, ...positionals);
663
754
  }
664
755
  function warn(message, ...positionals) {
665
756
  if (IS_NODE) {
666
- process.stderr.write(format(message, ...positionals) + "\n");
757
+ process.stderr.write(format2(message, ...positionals) + "\n");
667
758
  return;
668
759
  }
669
760
  console.warn(message, ...positionals);
670
761
  }
671
762
  function error(message, ...positionals) {
672
763
  if (IS_NODE) {
673
- process.stderr.write(format(message, ...positionals) + "\n");
764
+ process.stderr.write(format2(message, ...positionals) + "\n");
674
765
  return;
675
766
  }
676
767
  console.error(message, ...positionals);
@@ -865,7 +956,7 @@ var _Emitter = class {
865
956
  var Emitter = _Emitter;
866
957
  Emitter.defaultMaxListeners = 10;
867
958
 
868
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-QED3Q6Z2.mjs
959
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-QED3Q6Z2.mjs
869
960
  var INTERNAL_REQUEST_ID_HEADER_NAME = "x-interceptors-internal-request-id";
870
961
  function getGlobalSymbol(symbol) {
871
962
  return (
@@ -1013,7 +1104,7 @@ function createRequestId() {
1013
1104
  return Math.random().toString(16).slice(2);
1014
1105
  }
1015
1106
 
1016
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/index.mjs
1107
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/index.mjs
1017
1108
  var BatchInterceptor = class extends Interceptor {
1018
1109
  constructor(options) {
1019
1110
  BatchInterceptor.symbol = Symbol(options.name);
@@ -1297,34 +1388,58 @@ var DeferredPromise = class extends Promise {
1297
1388
  }
1298
1389
  };
1299
1390
 
1300
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-OUWBQF3Z.mjs
1391
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-THPGBWJQ.mjs
1392
+ var InterceptorError = class extends Error {
1393
+ constructor(message) {
1394
+ super(message);
1395
+ this.name = "InterceptorError";
1396
+ Object.setPrototypeOf(this, InterceptorError.prototype);
1397
+ }
1398
+ };
1399
+ var kRequestHandled = Symbol("kRequestHandled");
1400
+ var kResponsePromise = Symbol("kResponsePromise");
1301
1401
  var RequestController = class {
1302
1402
  constructor(request) {
1303
1403
  this.request = request;
1304
- this.responsePromise = new DeferredPromise();
1404
+ this[kRequestHandled] = false;
1405
+ this[kResponsePromise] = new DeferredPromise();
1305
1406
  }
1407
+ /**
1408
+ * Respond to this request with the given `Response` instance.
1409
+ * @example
1410
+ * controller.respondWith(new Response())
1411
+ * controller.respondWith(Response.json({ id }))
1412
+ * controller.respondWith(Response.error())
1413
+ */
1306
1414
  respondWith(response) {
1307
- invariant(
1308
- this.responsePromise.state === "pending",
1309
- 'Failed to respond to "%s %s" request: the "request" event has already been responded to.',
1415
+ invariant2.as(
1416
+ InterceptorError,
1417
+ !this[kRequestHandled],
1418
+ 'Failed to respond to the "%s %s" request: the "request" event has already been handled.',
1310
1419
  this.request.method,
1311
1420
  this.request.url
1312
1421
  );
1313
- this.responsePromise.resolve(response);
1422
+ this[kRequestHandled] = true;
1423
+ this[kResponsePromise].resolve(response);
1424
+ }
1425
+ /**
1426
+ * Error this request with the given error.
1427
+ * @example
1428
+ * controller.errorWith()
1429
+ * controller.errorWith(new Error('Oops!'))
1430
+ */
1431
+ errorWith(error2) {
1432
+ invariant2.as(
1433
+ InterceptorError,
1434
+ !this[kRequestHandled],
1435
+ 'Failed to error the "%s %s" request: the "request" event has already been handled.',
1436
+ this.request.method,
1437
+ this.request.url
1438
+ );
1439
+ this[kRequestHandled] = true;
1440
+ this[kResponsePromise].resolve(error2);
1314
1441
  }
1315
1442
  };
1316
- function toInteractiveRequest(request) {
1317
- const requestController = new RequestController(request);
1318
- Reflect.set(
1319
- request,
1320
- "respondWith",
1321
- requestController.respondWith.bind(requestController)
1322
- );
1323
- return {
1324
- interactiveRequest: request,
1325
- requestController
1326
- };
1327
- }
1328
1443
  async function emitAsync(emitter, eventName, ...data) {
1329
1444
  const listners = emitter.listeners(eventName);
1330
1445
  if (listners.length === 0) {
@@ -1334,8 +1449,114 @@ async function emitAsync(emitter, eventName, ...data) {
1334
1449
  await listener.apply(emitter, data);
1335
1450
  }
1336
1451
  }
1452
+ function isNodeLikeError(error2) {
1453
+ if (error2 == null) {
1454
+ return false;
1455
+ }
1456
+ if (!(error2 instanceof Error)) {
1457
+ return false;
1458
+ }
1459
+ return "code" in error2 && "errno" in error2;
1460
+ }
1461
+ async function handleRequest2(options) {
1462
+ const handleResponse = async (response) => {
1463
+ if (response instanceof Error) {
1464
+ options.onError(response);
1465
+ } else if (isResponseError(response)) {
1466
+ options.onRequestError(response);
1467
+ } else {
1468
+ await options.onResponse(response);
1469
+ }
1470
+ return true;
1471
+ };
1472
+ const handleResponseError = async (error2) => {
1473
+ if (error2 instanceof InterceptorError) {
1474
+ throw result.error;
1475
+ }
1476
+ if (isNodeLikeError(error2)) {
1477
+ options.onError(error2);
1478
+ return true;
1479
+ }
1480
+ if (error2 instanceof Response) {
1481
+ return await handleResponse(error2);
1482
+ }
1483
+ return false;
1484
+ };
1485
+ options.emitter.once("request", ({ requestId: pendingRequestId }) => {
1486
+ if (pendingRequestId !== options.requestId) {
1487
+ return;
1488
+ }
1489
+ if (options.controller[kResponsePromise].state === "pending") {
1490
+ options.controller[kResponsePromise].resolve(void 0);
1491
+ }
1492
+ });
1493
+ const requestAbortPromise = new DeferredPromise();
1494
+ if (options.request.signal) {
1495
+ options.request.signal.addEventListener(
1496
+ "abort",
1497
+ () => {
1498
+ requestAbortPromise.reject(options.request.signal.reason);
1499
+ },
1500
+ { once: true }
1501
+ );
1502
+ }
1503
+ const result = await until(async () => {
1504
+ const requestListtenersPromise = emitAsync(options.emitter, "request", {
1505
+ requestId: options.requestId,
1506
+ request: options.request,
1507
+ controller: options.controller
1508
+ });
1509
+ await Promise.race([
1510
+ // Short-circuit the request handling promise if the request gets aborted.
1511
+ requestAbortPromise,
1512
+ requestListtenersPromise,
1513
+ options.controller[kResponsePromise]
1514
+ ]);
1515
+ const mockedResponse = await options.controller[kResponsePromise];
1516
+ return mockedResponse;
1517
+ });
1518
+ if (requestAbortPromise.state === "rejected") {
1519
+ options.onError(requestAbortPromise.rejectionReason);
1520
+ return true;
1521
+ }
1522
+ if (result.error) {
1523
+ if (await handleResponseError(result.error)) {
1524
+ return true;
1525
+ }
1526
+ if (options.emitter.listenerCount("unhandledException") > 0) {
1527
+ const unhandledExceptionController = new RequestController(
1528
+ options.request
1529
+ );
1530
+ await emitAsync(options.emitter, "unhandledException", {
1531
+ error: result.error,
1532
+ request: options.request,
1533
+ requestId: options.requestId,
1534
+ controller: unhandledExceptionController
1535
+ }).then(() => {
1536
+ if (unhandledExceptionController[kResponsePromise].state === "pending") {
1537
+ unhandledExceptionController[kResponsePromise].resolve(void 0);
1538
+ }
1539
+ });
1540
+ const nextResult = await until(
1541
+ () => unhandledExceptionController[kResponsePromise]
1542
+ );
1543
+ if (nextResult.error) {
1544
+ return handleResponseError(nextResult.error);
1545
+ }
1546
+ if (nextResult.data) {
1547
+ return handleResponse(nextResult.data);
1548
+ }
1549
+ }
1550
+ options.onResponse(createServerErrorResponse(result.error));
1551
+ return true;
1552
+ }
1553
+ if (result.data) {
1554
+ return handleResponse(result.data);
1555
+ }
1556
+ return false;
1557
+ }
1337
1558
 
1338
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-MAEPOYB6.mjs
1559
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-DZCGGRSJ.mjs
1339
1560
  function canParseUrl(url) {
1340
1561
  try {
1341
1562
  new URL(url);
@@ -1344,6 +1565,72 @@ function canParseUrl(url) {
1344
1565
  return false;
1345
1566
  }
1346
1567
  }
1568
+ function createNetworkError(cause) {
1569
+ return Object.assign(new TypeError("Failed to fetch"), {
1570
+ cause
1571
+ });
1572
+ }
1573
+ var REQUEST_BODY_HEADERS = [
1574
+ "content-encoding",
1575
+ "content-language",
1576
+ "content-location",
1577
+ "content-type",
1578
+ "content-length"
1579
+ ];
1580
+ var kRedirectCount = Symbol("kRedirectCount");
1581
+ async function followFetchRedirect(request, response) {
1582
+ if (response.status !== 303 && request.body != null) {
1583
+ return Promise.reject(createNetworkError());
1584
+ }
1585
+ const requestUrl = new URL(request.url);
1586
+ let locationUrl;
1587
+ try {
1588
+ locationUrl = new URL(response.headers.get("location"));
1589
+ } catch (error2) {
1590
+ return Promise.reject(createNetworkError(error2));
1591
+ }
1592
+ if (!(locationUrl.protocol === "http:" || locationUrl.protocol === "https:")) {
1593
+ return Promise.reject(
1594
+ createNetworkError("URL scheme must be a HTTP(S) scheme")
1595
+ );
1596
+ }
1597
+ if (Reflect.get(request, kRedirectCount) > 20) {
1598
+ return Promise.reject(createNetworkError("redirect count exceeded"));
1599
+ }
1600
+ Object.defineProperty(request, kRedirectCount, {
1601
+ value: (Reflect.get(request, kRedirectCount) || 0) + 1
1602
+ });
1603
+ if (request.mode === "cors" && (locationUrl.username || locationUrl.password) && !sameOrigin(requestUrl, locationUrl)) {
1604
+ return Promise.reject(
1605
+ createNetworkError('cross origin not allowed for request mode "cors"')
1606
+ );
1607
+ }
1608
+ const requestInit = {};
1609
+ if ([301, 302].includes(response.status) && request.method === "POST" || response.status === 303 && !["HEAD", "GET"].includes(request.method)) {
1610
+ requestInit.method = "GET";
1611
+ requestInit.body = null;
1612
+ REQUEST_BODY_HEADERS.forEach((headerName) => {
1613
+ request.headers.delete(headerName);
1614
+ });
1615
+ }
1616
+ if (!sameOrigin(requestUrl, locationUrl)) {
1617
+ request.headers.delete("authorization");
1618
+ request.headers.delete("proxy-authorization");
1619
+ request.headers.delete("cookie");
1620
+ request.headers.delete("host");
1621
+ }
1622
+ requestInit.headers = request.headers;
1623
+ return fetch(new Request(locationUrl, requestInit));
1624
+ }
1625
+ function sameOrigin(left, right) {
1626
+ if (left.origin === right.origin && left.origin === "null") {
1627
+ return true;
1628
+ }
1629
+ if (left.protocol === right.protocol && left.hostname === right.hostname && left.port === right.port) {
1630
+ return true;
1631
+ }
1632
+ return false;
1633
+ }
1347
1634
  var _FetchInterceptor = class extends Interceptor {
1348
1635
  constructor() {
1349
1636
  super(_FetchInterceptor.symbol);
@@ -1353,136 +1640,84 @@ var _FetchInterceptor = class extends Interceptor {
1353
1640
  }
1354
1641
  async setup() {
1355
1642
  const pureFetch = globalThis.fetch;
1356
- invariant(
1643
+ invariant2(
1357
1644
  !pureFetch[IS_PATCHED_MODULE],
1358
1645
  'Failed to patch the "fetch" module: already patched.'
1359
1646
  );
1360
1647
  globalThis.fetch = async (input, init) => {
1361
- var _a;
1362
1648
  const requestId = createRequestId();
1363
1649
  const resolvedInput = typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.origin) : input;
1364
1650
  const request = new Request(resolvedInput, init);
1651
+ const responsePromise = new DeferredPromise();
1652
+ const controller = new RequestController(request);
1365
1653
  this.logger.info("[%s] %s", request.method, request.url);
1366
- const { interactiveRequest, requestController } = toInteractiveRequest(request);
1654
+ this.logger.info("awaiting for the mocked response...");
1367
1655
  this.logger.info(
1368
- 'emitting the "request" event for %d listener(s)...',
1656
+ 'emitting the "request" event for %s listener(s)...',
1369
1657
  this.emitter.listenerCount("request")
1370
1658
  );
1371
- this.emitter.once("request", ({ requestId: pendingRequestId }) => {
1372
- if (pendingRequestId !== requestId) {
1373
- return;
1374
- }
1375
- if (requestController.responsePromise.state === "pending") {
1376
- requestController.responsePromise.resolve(void 0);
1377
- }
1378
- });
1379
- this.logger.info("awaiting for the mocked response...");
1380
- const signal = interactiveRequest.signal;
1381
- const requestAborted = new DeferredPromise();
1382
- if (signal) {
1383
- signal.addEventListener(
1384
- "abort",
1385
- () => {
1386
- requestAborted.reject(signal.reason);
1387
- },
1388
- { once: true }
1389
- );
1390
- }
1391
- const responsePromise = new DeferredPromise();
1392
- const respondWith = (response) => {
1393
- this.logger.info("responding with a mock response:", response);
1394
- if (this.emitter.listenerCount("response") > 0) {
1395
- this.logger.info('emitting the "response" event...');
1396
- const responseClone = response.clone();
1397
- this.emitter.emit("response", {
1398
- response: responseClone,
1399
- isMockedResponse: true,
1400
- request: interactiveRequest,
1401
- requestId
1402
- });
1403
- }
1404
- Object.defineProperty(response, "url", {
1405
- writable: false,
1406
- enumerable: true,
1407
- configurable: false,
1408
- value: request.url
1409
- });
1410
- responsePromise.resolve(response);
1411
- };
1412
- const errorWith = (reason) => {
1413
- responsePromise.reject(reason);
1414
- };
1415
- const resolverResult = await until(
1416
- async () => {
1417
- const listenersFinished = emitAsync(this.emitter, "request", {
1418
- request: interactiveRequest,
1419
- requestId
1659
+ const isRequestHandled = await handleRequest2({
1660
+ request,
1661
+ requestId,
1662
+ emitter: this.emitter,
1663
+ controller,
1664
+ onResponse: async (response) => {
1665
+ this.logger.info("received mocked response!", {
1666
+ response
1420
1667
  });
1421
- await Promise.race([
1422
- requestAborted,
1423
- // Put the listeners invocation Promise in the same race condition
1424
- // with the request abort Promise because otherwise awaiting the listeners
1425
- // would always yield some response (or undefined).
1426
- listenersFinished,
1427
- requestController.responsePromise
1428
- ]);
1429
- this.logger.info("all request listeners have been resolved!");
1430
- const mockedResponse2 = await requestController.responsePromise;
1431
- this.logger.info("event.respondWith called with:", mockedResponse2);
1432
- return mockedResponse2;
1433
- }
1434
- );
1435
- if (requestAborted.state === "rejected") {
1436
- this.logger.info(
1437
- "request has been aborted:",
1438
- requestAborted.rejectionReason
1439
- );
1440
- responsePromise.reject(requestAborted.rejectionReason);
1441
- return responsePromise;
1442
- }
1443
- if (resolverResult.error) {
1444
- this.logger.info(
1445
- "request listerner threw an error:",
1446
- resolverResult.error
1447
- );
1448
- if (resolverResult.error instanceof Response) {
1449
- if (isResponseError(resolverResult.error)) {
1450
- errorWith(createNetworkError(resolverResult.error));
1451
- } else {
1452
- respondWith(resolverResult.error);
1453
- }
1454
- }
1455
- if (this.emitter.listenerCount("unhandledException") > 0) {
1456
- await emitAsync(this.emitter, "unhandledException", {
1457
- error: resolverResult.error,
1458
- request,
1459
- requestId,
1460
- controller: {
1461
- respondWith,
1462
- errorWith
1668
+ if (RESPONSE_STATUS_CODES_WITH_REDIRECT.has(response.status)) {
1669
+ if (request.redirect === "error") {
1670
+ responsePromise.reject(createNetworkError("unexpected redirect"));
1671
+ return;
1672
+ }
1673
+ if (request.redirect === "follow") {
1674
+ followFetchRedirect(request, response).then(
1675
+ (response2) => {
1676
+ responsePromise.resolve(response2);
1677
+ },
1678
+ (reason) => {
1679
+ responsePromise.reject(reason);
1680
+ }
1681
+ );
1682
+ return;
1463
1683
  }
1464
- });
1465
- if (responsePromise.state !== "pending") {
1466
- return responsePromise;
1467
1684
  }
1685
+ if (this.emitter.listenerCount("response") > 0) {
1686
+ this.logger.info('emitting the "response" event...');
1687
+ await emitAsync(this.emitter, "response", {
1688
+ // Clone the mocked response for the "response" event listener.
1689
+ // This way, the listener can read the response and not lock its body
1690
+ // for the actual fetch consumer.
1691
+ response: response.clone(),
1692
+ isMockedResponse: true,
1693
+ request,
1694
+ requestId
1695
+ });
1696
+ }
1697
+ Object.defineProperty(response, "url", {
1698
+ writable: false,
1699
+ enumerable: true,
1700
+ configurable: false,
1701
+ value: request.url
1702
+ });
1703
+ responsePromise.resolve(response);
1704
+ },
1705
+ onRequestError: (response) => {
1706
+ this.logger.info("request has errored!", { response });
1707
+ responsePromise.reject(createNetworkError(response));
1708
+ },
1709
+ onError: (error2) => {
1710
+ this.logger.info("request has been aborted!", { error: error2 });
1711
+ responsePromise.reject(error2);
1468
1712
  }
1469
- respondWith(createServerErrorResponse(resolverResult.error));
1470
- return responsePromise;
1471
- }
1472
- const mockedResponse = resolverResult.data;
1473
- if (mockedResponse && !((_a = request.signal) == null ? void 0 : _a.aborted)) {
1474
- this.logger.info("received mocked response:", mockedResponse);
1475
- if (isResponseError(mockedResponse)) {
1476
- this.logger.info(
1477
- "received a network error response, rejecting the request promise..."
1478
- );
1479
- errorWith(createNetworkError(mockedResponse));
1480
- } else {
1481
- respondWith(mockedResponse);
1482
- }
1713
+ });
1714
+ if (isRequestHandled) {
1715
+ this.logger.info("request has been handled, returning mock promise...");
1483
1716
  return responsePromise;
1484
1717
  }
1485
- this.logger.info("no mocked response received!");
1718
+ this.logger.info(
1719
+ "no mocked response received, performing request as-is..."
1720
+ );
1486
1721
  return pureFetch(request).then((response) => {
1487
1722
  this.logger.info("original fetch performed", response);
1488
1723
  if (this.emitter.listenerCount("response") > 0) {
@@ -1491,7 +1726,7 @@ var _FetchInterceptor = class extends Interceptor {
1491
1726
  this.emitter.emit("response", {
1492
1727
  response: responseClone,
1493
1728
  isMockedResponse: false,
1494
- request: interactiveRequest,
1729
+ request,
1495
1730
  requestId
1496
1731
  });
1497
1732
  }
@@ -1517,13 +1752,8 @@ var _FetchInterceptor = class extends Interceptor {
1517
1752
  };
1518
1753
  var FetchInterceptor = _FetchInterceptor;
1519
1754
  FetchInterceptor.symbol = Symbol("fetch");
1520
- function createNetworkError(cause) {
1521
- return Object.assign(new TypeError("Failed to fetch"), {
1522
- cause
1523
- });
1524
- }
1525
1755
 
1526
- // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-732REFPX.mjs
1756
+ // node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-PRBA3ES4.mjs
1527
1757
  function concatArrayBuffer(left, right) {
1528
1758
  const result = new Uint8Array(left.byteLength + right.byteLength);
1529
1759
  result.set(left, 0);
@@ -1532,10 +1762,10 @@ function concatArrayBuffer(left, right) {
1532
1762
  }
1533
1763
  var EventPolyfill = class {
1534
1764
  constructor(type, options) {
1535
- this.AT_TARGET = 0;
1536
- this.BUBBLING_PHASE = 0;
1537
- this.CAPTURING_PHASE = 0;
1538
1765
  this.NONE = 0;
1766
+ this.CAPTURING_PHASE = 1;
1767
+ this.AT_TARGET = 2;
1768
+ this.BUBBLING_PHASE = 3;
1539
1769
  this.type = "";
1540
1770
  this.srcElement = null;
1541
1771
  this.currentTarget = null;
@@ -1708,15 +1938,26 @@ function createHeadersFromXMLHttpReqestHeaders(headersString) {
1708
1938
  }
1709
1939
  return headers;
1710
1940
  }
1711
- var IS_MOCKED_RESPONSE = Symbol("isMockedResponse");
1941
+ async function getBodyByteLength(input) {
1942
+ const explicitContentLength = input.headers.get("content-length");
1943
+ if (explicitContentLength != null && explicitContentLength !== "") {
1944
+ return Number(explicitContentLength);
1945
+ }
1946
+ const buffer = await input.arrayBuffer();
1947
+ return buffer.byteLength;
1948
+ }
1949
+ var kIsRequestHandled = Symbol("kIsRequestHandled");
1712
1950
  var IS_NODE2 = isNodeProcess();
1951
+ var kFetchRequest = Symbol("kFetchRequest");
1713
1952
  var XMLHttpRequestController = class {
1714
1953
  constructor(initialRequest, logger) {
1715
1954
  this.initialRequest = initialRequest;
1716
1955
  this.logger = logger;
1717
1956
  this.method = "GET";
1718
1957
  this.url = null;
1958
+ this[kIsRequestHandled] = false;
1719
1959
  this.events = /* @__PURE__ */ new Map();
1960
+ this.uploadEvents = /* @__PURE__ */ new Map();
1720
1961
  this.requestId = createRequestId();
1721
1962
  this.requestHeaders = new Headers();
1722
1963
  this.responseBuffer = new Uint8Array();
@@ -1765,9 +2006,6 @@ var XMLHttpRequestController = class {
1765
2006
  }
1766
2007
  case "send": {
1767
2008
  const [body] = args;
1768
- if (body != null) {
1769
- this.requestBody = typeof body === "string" ? encodeBuffer(body) : body;
1770
- }
1771
2009
  this.request.addEventListener("load", () => {
1772
2010
  if (typeof this.onResponse !== "undefined") {
1773
2011
  const fetchResponse = createResponse(
@@ -1781,19 +2019,21 @@ var XMLHttpRequestController = class {
1781
2019
  );
1782
2020
  this.onResponse.call(this, {
1783
2021
  response: fetchResponse,
1784
- isMockedResponse: IS_MOCKED_RESPONSE in this.request,
2022
+ isMockedResponse: this[kIsRequestHandled],
1785
2023
  request: fetchRequest,
1786
2024
  requestId: this.requestId
1787
2025
  });
1788
2026
  }
1789
2027
  });
1790
- const fetchRequest = this.toFetchApiRequest();
2028
+ const requestBody = typeof body === "string" ? encodeBuffer(body) : body;
2029
+ const fetchRequest = this.toFetchApiRequest(requestBody);
2030
+ this[kFetchRequest] = fetchRequest;
1791
2031
  const onceRequestSettled = ((_a = this.onRequest) == null ? void 0 : _a.call(this, {
1792
2032
  request: fetchRequest,
1793
2033
  requestId: this.requestId
1794
2034
  })) || Promise.resolve();
1795
2035
  onceRequestSettled.finally(() => {
1796
- if (this.request.readyState < this.request.LOADING) {
2036
+ if (!this[kIsRequestHandled]) {
1797
2037
  this.logger.info(
1798
2038
  "request callback settled but request has not been handled (readystate %d), performing as-is...",
1799
2039
  this.request.readyState
@@ -1815,6 +2055,39 @@ var XMLHttpRequestController = class {
1815
2055
  }
1816
2056
  }
1817
2057
  });
2058
+ define(
2059
+ this.request,
2060
+ "upload",
2061
+ createProxy(this.request.upload, {
2062
+ setProperty: ([propertyName, nextValue], invoke) => {
2063
+ switch (propertyName) {
2064
+ case "onloadstart":
2065
+ case "onprogress":
2066
+ case "onaboart":
2067
+ case "onerror":
2068
+ case "onload":
2069
+ case "ontimeout":
2070
+ case "onloadend": {
2071
+ const eventName = propertyName.slice(
2072
+ 2
2073
+ );
2074
+ this.registerUploadEvent(eventName, nextValue);
2075
+ }
2076
+ }
2077
+ return invoke();
2078
+ },
2079
+ methodCall: ([methodName, args], invoke) => {
2080
+ switch (methodName) {
2081
+ case "addEventListener": {
2082
+ const [eventName, listener] = args;
2083
+ this.registerUploadEvent(eventName, listener);
2084
+ this.logger.info("upload.addEventListener", eventName, listener);
2085
+ return invoke();
2086
+ }
2087
+ }
2088
+ }
2089
+ })
2090
+ );
1818
2091
  }
1819
2092
  registerEvent(eventName, listener) {
1820
2093
  const prevEvents = this.events.get(eventName) || [];
@@ -1822,17 +2095,44 @@ var XMLHttpRequestController = class {
1822
2095
  this.events.set(eventName, nextEvents);
1823
2096
  this.logger.info('registered event "%s"', eventName, listener);
1824
2097
  }
2098
+ registerUploadEvent(eventName, listener) {
2099
+ const prevEvents = this.uploadEvents.get(eventName) || [];
2100
+ const nextEvents = prevEvents.concat(listener);
2101
+ this.uploadEvents.set(eventName, nextEvents);
2102
+ this.logger.info('registered upload event "%s"', eventName, listener);
2103
+ }
1825
2104
  /**
1826
2105
  * Responds to the current request with the given
1827
2106
  * Fetch API `Response` instance.
1828
2107
  */
1829
- respondWith(response) {
2108
+ async respondWith(response) {
2109
+ this[kIsRequestHandled] = true;
2110
+ if (this[kFetchRequest]) {
2111
+ const totalRequestBodyLength = await getBodyByteLength(
2112
+ this[kFetchRequest].clone()
2113
+ );
2114
+ this.trigger("loadstart", this.request.upload, {
2115
+ loaded: 0,
2116
+ total: totalRequestBodyLength
2117
+ });
2118
+ this.trigger("progress", this.request.upload, {
2119
+ loaded: totalRequestBodyLength,
2120
+ total: totalRequestBodyLength
2121
+ });
2122
+ this.trigger("load", this.request.upload, {
2123
+ loaded: totalRequestBodyLength,
2124
+ total: totalRequestBodyLength
2125
+ });
2126
+ this.trigger("loadend", this.request.upload, {
2127
+ loaded: totalRequestBodyLength,
2128
+ total: totalRequestBodyLength
2129
+ });
2130
+ }
1830
2131
  this.logger.info(
1831
2132
  "responding with a mocked response: %d %s",
1832
2133
  response.status,
1833
2134
  response.statusText
1834
2135
  );
1835
- define(this.request, IS_MOCKED_RESPONSE, true);
1836
2136
  define(this.request, "status", response.status);
1837
2137
  define(this.request, "statusText", response.statusText);
1838
2138
  define(this.request, "responseURL", this.url.href);
@@ -1887,14 +2187,9 @@ var XMLHttpRequestController = class {
1887
2187
  get: () => this.responseXML
1888
2188
  }
1889
2189
  });
1890
- const totalResponseBodyLength = response.headers.has("Content-Length") ? Number(response.headers.get("Content-Length")) : (
1891
- /**
1892
- * @todo Infer the response body length from the response body.
1893
- */
1894
- void 0
1895
- );
2190
+ const totalResponseBodyLength = await getBodyByteLength(response.clone());
1896
2191
  this.logger.info("calculated response body length", totalResponseBodyLength);
1897
- this.trigger("loadstart", {
2192
+ this.trigger("loadstart", this.request, {
1898
2193
  loaded: 0,
1899
2194
  total: totalResponseBodyLength
1900
2195
  });
@@ -1903,11 +2198,11 @@ var XMLHttpRequestController = class {
1903
2198
  const finalizeResponse = () => {
1904
2199
  this.logger.info("finalizing the mocked response...");
1905
2200
  this.setReadyState(this.request.DONE);
1906
- this.trigger("load", {
2201
+ this.trigger("load", this.request, {
1907
2202
  loaded: this.responseBuffer.byteLength,
1908
2203
  total: totalResponseBodyLength
1909
2204
  });
1910
- this.trigger("loadend", {
2205
+ this.trigger("loadend", this.request, {
1911
2206
  loaded: this.responseBuffer.byteLength,
1912
2207
  total: totalResponseBodyLength
1913
2208
  });
@@ -1925,7 +2220,7 @@ var XMLHttpRequestController = class {
1925
2220
  if (value) {
1926
2221
  this.logger.info("read response body chunk:", value);
1927
2222
  this.responseBuffer = concatArrayBuffer(this.responseBuffer, value);
1928
- this.trigger("progress", {
2223
+ this.trigger("progress", this.request, {
1929
2224
  loaded: this.responseBuffer.byteLength,
1930
2225
  total: totalResponseBodyLength
1931
2226
  });
@@ -1983,7 +2278,7 @@ var XMLHttpRequestController = class {
1983
2278
  }
1984
2279
  }
1985
2280
  get responseText() {
1986
- invariant(
2281
+ invariant2(
1987
2282
  this.request.responseType === "" || this.request.responseType === "text",
1988
2283
  "InvalidStateError: The object is in invalid state."
1989
2284
  );
@@ -1995,7 +2290,7 @@ var XMLHttpRequestController = class {
1995
2290
  return responseText;
1996
2291
  }
1997
2292
  get responseXML() {
1998
- invariant(
2293
+ invariant2(
1999
2294
  this.request.responseType === "" || this.request.responseType === "document",
2000
2295
  "InvalidStateError: The object is in invalid state."
2001
2296
  );
@@ -2018,10 +2313,11 @@ var XMLHttpRequestController = class {
2018
2313
  return null;
2019
2314
  }
2020
2315
  errorWith(error2) {
2316
+ this[kIsRequestHandled] = true;
2021
2317
  this.logger.info("responding with an error");
2022
2318
  this.setReadyState(this.request.DONE);
2023
- this.trigger("error");
2024
- this.trigger("loadend");
2319
+ this.trigger("error", this.request);
2320
+ this.trigger("loadend", this.request);
2025
2321
  }
2026
2322
  /**
2027
2323
  * Transitions this request's `readyState` to the given one.
@@ -2040,36 +2336,38 @@ var XMLHttpRequestController = class {
2040
2336
  this.logger.info("set readyState to: %d", nextReadyState);
2041
2337
  if (nextReadyState !== this.request.UNSENT) {
2042
2338
  this.logger.info('triggerring "readystatechange" event...');
2043
- this.trigger("readystatechange");
2339
+ this.trigger("readystatechange", this.request);
2044
2340
  }
2045
2341
  }
2046
2342
  /**
2047
2343
  * Triggers given event on the `XMLHttpRequest` instance.
2048
2344
  */
2049
- trigger(eventName, options) {
2050
- const callback = this.request[`on${eventName}`];
2051
- const event = createEvent(this.request, eventName, options);
2345
+ trigger(eventName, target, options) {
2346
+ const callback = target[`on${eventName}`];
2347
+ const event = createEvent(target, eventName, options);
2052
2348
  this.logger.info('trigger "%s"', eventName, options || "");
2053
2349
  if (typeof callback === "function") {
2054
2350
  this.logger.info('found a direct "%s" callback, calling...', eventName);
2055
- callback.call(this.request, event);
2351
+ callback.call(target, event);
2056
2352
  }
2057
- for (const [registeredEventName, listeners] of this.events) {
2353
+ const events = target instanceof XMLHttpRequestUpload ? this.uploadEvents : this.events;
2354
+ for (const [registeredEventName, listeners] of events) {
2058
2355
  if (registeredEventName === eventName) {
2059
2356
  this.logger.info(
2060
2357
  'found %d listener(s) for "%s" event, calling...',
2061
2358
  listeners.length,
2062
2359
  eventName
2063
2360
  );
2064
- listeners.forEach((listener) => listener.call(this.request, event));
2361
+ listeners.forEach((listener) => listener.call(target, event));
2065
2362
  }
2066
2363
  }
2067
2364
  }
2068
2365
  /**
2069
2366
  * Converts this `XMLHttpRequest` instance into a Fetch API `Request` instance.
2070
2367
  */
2071
- toFetchApiRequest() {
2368
+ toFetchApiRequest(body) {
2072
2369
  this.logger.info("converting request to a Fetch API Request...");
2370
+ const resolvedBody = body instanceof Document ? body.documentElement.innerText : body;
2073
2371
  const fetchRequest = new Request(this.url.href, {
2074
2372
  method: this.method,
2075
2373
  headers: this.requestHeaders,
@@ -2077,7 +2375,7 @@ var XMLHttpRequestController = class {
2077
2375
  * @see https://xhr.spec.whatwg.org/#cross-origin-credentials
2078
2376
  */
2079
2377
  credentials: this.request.withCredentials ? "include" : "same-origin",
2080
- body: ["GET", "HEAD"].includes(this.method) ? null : this.requestBody
2378
+ body: ["GET", "HEAD"].includes(this.method.toUpperCase()) ? null : resolvedBody
2081
2379
  });
2082
2380
  const proxyHeaders = createProxy(fetchRequest.headers, {
2083
2381
  methodCall: ([methodName, args], invoke) => {
@@ -2145,81 +2443,35 @@ function createXMLHttpRequestProxy({
2145
2443
  logger
2146
2444
  );
2147
2445
  xhrRequestController.onRequest = async function({ request, requestId }) {
2148
- const { interactiveRequest, requestController } = toInteractiveRequest(request);
2446
+ const controller = new RequestController(request);
2149
2447
  this.logger.info("awaiting mocked response...");
2150
- emitter.once("request", ({ requestId: pendingRequestId }) => {
2151
- if (pendingRequestId !== requestId) {
2152
- return;
2153
- }
2154
- if (requestController.responsePromise.state === "pending") {
2155
- requestController.respondWith(void 0);
2156
- }
2157
- });
2158
- const resolverResult = await until(async () => {
2159
- this.logger.info(
2160
- 'emitting the "request" event for %s listener(s)...',
2161
- emitter.listenerCount("request")
2162
- );
2163
- await emitAsync(emitter, "request", {
2164
- request: interactiveRequest,
2165
- requestId
2166
- });
2167
- this.logger.info('all "request" listeners settled!');
2168
- const mockedResponse2 = await requestController.responsePromise;
2169
- this.logger.info("event.respondWith called with:", mockedResponse2);
2170
- return mockedResponse2;
2171
- });
2172
- if (resolverResult.error) {
2173
- this.logger.info(
2174
- "request listener threw an exception, aborting request...",
2175
- resolverResult.error
2176
- );
2177
- if (resolverResult.error instanceof Response) {
2178
- if (isResponseError(resolverResult.error)) {
2179
- xhrRequestController.errorWith(new TypeError("Network error"));
2180
- } else {
2181
- this.respondWith(resolverResult.error);
2182
- }
2183
- return;
2184
- }
2185
- if (emitter.listenerCount("unhandledException") > 0) {
2186
- await emitAsync(emitter, "unhandledException", {
2187
- error: resolverResult.error,
2188
- request,
2189
- requestId,
2190
- controller: {
2191
- respondWith: xhrRequestController.respondWith.bind(xhrRequestController),
2192
- errorWith: xhrRequestController.errorWith.bind(xhrRequestController)
2193
- }
2194
- });
2195
- if (originalRequest.readyState > XMLHttpRequest.OPENED) {
2196
- return;
2448
+ this.logger.info(
2449
+ 'emitting the "request" event for %s listener(s)...',
2450
+ emitter.listenerCount("request")
2451
+ );
2452
+ const isRequestHandled = await handleRequest2({
2453
+ request,
2454
+ requestId,
2455
+ controller,
2456
+ emitter,
2457
+ onResponse: async (response) => {
2458
+ await this.respondWith(response);
2459
+ },
2460
+ onRequestError: () => {
2461
+ this.errorWith(new TypeError("Network error"));
2462
+ },
2463
+ onError: (error2) => {
2464
+ this.logger.info("request errored!", { error: error2 });
2465
+ if (error2 instanceof Error) {
2466
+ this.errorWith(error2);
2197
2467
  }
2198
2468
  }
2199
- xhrRequestController.respondWith(
2200
- createServerErrorResponse(resolverResult.error)
2201
- );
2202
- return;
2203
- }
2204
- const mockedResponse = resolverResult.data;
2205
- if (typeof mockedResponse !== "undefined") {
2469
+ });
2470
+ if (!isRequestHandled) {
2206
2471
  this.logger.info(
2207
- "received mocked response: %d %s",
2208
- mockedResponse.status,
2209
- mockedResponse.statusText
2472
+ "no mocked response received, performing request as-is..."
2210
2473
  );
2211
- if (isResponseError(mockedResponse)) {
2212
- this.logger.info(
2213
- "received a network error response, rejecting the request promise..."
2214
- );
2215
- xhrRequestController.errorWith(new TypeError("Network error"));
2216
- return;
2217
- }
2218
- return xhrRequestController.respondWith(mockedResponse);
2219
2474
  }
2220
- this.logger.info(
2221
- "no mocked response received, performing request as-is..."
2222
- );
2223
2475
  };
2224
2476
  xhrRequestController.onResponse = async function({
2225
2477
  response,
@@ -2254,7 +2506,7 @@ var _XMLHttpRequestInterceptor = class extends Interceptor {
2254
2506
  const logger = this.logger.extend("setup");
2255
2507
  logger.info('patching "XMLHttpRequest" module...');
2256
2508
  const PureXMLHttpRequest = globalThis.XMLHttpRequest;
2257
- invariant(
2509
+ invariant2(
2258
2510
  !PureXMLHttpRequest[IS_PATCHED_MODULE],
2259
2511
  'Failed to patch the "XMLHttpRequest" module: already patched.'
2260
2512
  );
@@ -2287,15 +2539,15 @@ var XMLHttpRequestInterceptor = _XMLHttpRequestInterceptor;
2287
2539
  XMLHttpRequestInterceptor.interceptorSymbol = Symbol("xhr");
2288
2540
 
2289
2541
  // src/browser/setupWorker/start/createFallbackRequestListener.ts
2290
- import { handleRequest as handleRequest2 } from '../core/utils/handleRequest.mjs';
2542
+ import { handleRequest as handleRequest3 } from '../core/utils/handleRequest.mjs';
2291
2543
  function createFallbackRequestListener(context, options) {
2292
2544
  const interceptor = new BatchInterceptor({
2293
2545
  name: "fallback",
2294
2546
  interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()]
2295
2547
  });
2296
- interceptor.on("request", async ({ request, requestId }) => {
2548
+ interceptor.on("request", async ({ request, requestId, controller }) => {
2297
2549
  const requestCloneForLogs = request.clone();
2298
- const response = await handleRequest2(
2550
+ const response = await handleRequest3(
2299
2551
  request,
2300
2552
  requestId,
2301
2553
  context.getRequestHandlers(),
@@ -2316,7 +2568,7 @@ function createFallbackRequestListener(context, options) {
2316
2568
  }
2317
2569
  );
2318
2570
  if (response) {
2319
- request.respondWith(response);
2571
+ controller.respondWith(response);
2320
2572
  }
2321
2573
  });
2322
2574
  interceptor.on(