msw 0.39.2 → 0.40.0

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.
@@ -52,7 +52,7 @@ function __awaiter(thisArg, _arguments, P, generator) {
52
52
 
53
53
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
54
54
 
55
- var lib$3 = {exports: {}};
55
+ var lib$4 = {exports: {}};
56
56
 
57
57
  (function (module, exports) {
58
58
  (function (global, factory) {
@@ -75,9 +75,9 @@ var lib$3 = {exports: {}};
75
75
  Object.defineProperty(exports, '__esModule', { value: true });
76
76
 
77
77
  })));
78
- }(lib$3, lib$3.exports));
78
+ }(lib$4, lib$4.exports));
79
79
 
80
- var lib$2 = {};
80
+ var lib$3 = {};
81
81
 
82
82
  var StrictEventEmitter$1 = {};
83
83
 
@@ -147,7 +147,7 @@ exports.__esModule = true;
147
147
  exports.StrictEventEmitter = void 0;
148
148
  var StrictEventEmitter_1 = StrictEventEmitter$1;
149
149
  __createBinding(exports, StrictEventEmitter_1, "StrictEventEmitter");
150
- }(lib$2));
150
+ }(lib$3));
151
151
 
152
152
  function use(currentHandlers, ...handlers) {
153
153
  currentHandlers.unshift(...handlers);
@@ -161,20 +161,7 @@ function resetHandlers(initialHandlers, ...nextHandlers) {
161
161
  return nextHandlers.length > 0 ? [...nextHandlers] : [...initialHandlers];
162
162
  }
163
163
 
164
- /**
165
- * Parses a given value into a JSON.
166
- * Does not throw an exception on an invalid JSON string.
167
- */
168
- function jsonParse(value) {
169
- try {
170
- return JSON.parse(value);
171
- }
172
- catch (error) {
173
- return undefined;
174
- }
175
- }
176
-
177
- var lib$1 = {};
164
+ var lib$2 = {};
178
165
 
179
166
  var Headers = {};
180
167
 
@@ -663,49 +650,460 @@ function flattenHeadersList(list) {
663
650
  return [name, [].concat(values).join('; ')];
664
651
  });
665
652
  }
666
- flattenHeadersList$1.flattenHeadersList = flattenHeadersList;
667
-
668
- var flattenHeadersObject$1 = {};
653
+ flattenHeadersList$1.flattenHeadersList = flattenHeadersList;
654
+
655
+ var flattenHeadersObject$1 = {};
656
+
657
+ Object.defineProperty(flattenHeadersObject$1, "__esModule", { value: true });
658
+ flattenHeadersObject$1.flattenHeadersObject = void 0;
659
+ var reduceHeadersObject_1 = reduceHeadersObject$1;
660
+ function flattenHeadersObject(headersObject) {
661
+ return reduceHeadersObject_1.reduceHeadersObject(headersObject, function (headers, name, value) {
662
+ headers[name] = [].concat(value).join('; ');
663
+ return headers;
664
+ }, {});
665
+ }
666
+ flattenHeadersObject$1.flattenHeadersObject = flattenHeadersObject;
667
+
668
+ (function (exports) {
669
+ Object.defineProperty(exports, "__esModule", { value: true });
670
+ exports.flattenHeadersObject = exports.flattenHeadersList = exports.reduceHeadersObject = exports.objectToHeaders = exports.listToHeaders = exports.stringToHeaders = exports.headersToObject = exports.headersToList = exports.headersToString = exports.Headers = void 0;
671
+ var Headers_1 = Headers;
672
+ Object.defineProperty(exports, "Headers", { enumerable: true, get: function () { return Headers_1.default; } });
673
+ var headersToString_1 = headersToString$1;
674
+ Object.defineProperty(exports, "headersToString", { enumerable: true, get: function () { return headersToString_1.headersToString; } });
675
+ var headersToList_1 = headersToList$1;
676
+ Object.defineProperty(exports, "headersToList", { enumerable: true, get: function () { return headersToList_1.headersToList; } });
677
+ var headersToObject_1 = headersToObject$1;
678
+ Object.defineProperty(exports, "headersToObject", { enumerable: true, get: function () { return headersToObject_1.headersToObject; } });
679
+ var stringToHeaders_1 = stringToHeaders$1;
680
+ Object.defineProperty(exports, "stringToHeaders", { enumerable: true, get: function () { return stringToHeaders_1.stringToHeaders; } });
681
+ var listToHeaders_1 = listToHeaders$1;
682
+ Object.defineProperty(exports, "listToHeaders", { enumerable: true, get: function () { return listToHeaders_1.listToHeaders; } });
683
+ var objectToHeaders_1 = objectToHeaders$1;
684
+ Object.defineProperty(exports, "objectToHeaders", { enumerable: true, get: function () { return objectToHeaders_1.objectToHeaders; } });
685
+ var reduceHeadersObject_1 = reduceHeadersObject$1;
686
+ Object.defineProperty(exports, "reduceHeadersObject", { enumerable: true, get: function () { return reduceHeadersObject_1.reduceHeadersObject; } });
687
+ var flattenHeadersList_1 = flattenHeadersList$1;
688
+ Object.defineProperty(exports, "flattenHeadersList", { enumerable: true, get: function () { return flattenHeadersList_1.flattenHeadersList; } });
689
+ var flattenHeadersObject_1 = flattenHeadersObject$1;
690
+ Object.defineProperty(exports, "flattenHeadersObject", { enumerable: true, get: function () { return flattenHeadersObject_1.flattenHeadersObject; } });
691
+ }(lib$2));
692
+
693
+ /**
694
+ * Composes a given list of functions into a new function that
695
+ * executes from right to left.
696
+ */
697
+ function compose(...fns) {
698
+ return (...args) => {
699
+ return fns.reduceRight((leftFn, rightFn) => {
700
+ return leftFn instanceof Promise
701
+ ? Promise.resolve(leftFn).then(rightFn)
702
+ : rightFn(leftFn);
703
+ }, args[0]);
704
+ };
705
+ }
706
+
707
+ class NetworkError extends Error {
708
+ constructor(message) {
709
+ super(message);
710
+ this.name = 'NetworkError';
711
+ }
712
+ }
713
+
714
+ const defaultResponse = {
715
+ status: 200,
716
+ statusText: 'OK',
717
+ body: null,
718
+ delay: 0,
719
+ once: false,
720
+ passthrough: false,
721
+ };
722
+ const defaultResponseTransformers = [];
723
+ function createResponseComposition(responseOverrides, defaultTransformers = defaultResponseTransformers) {
724
+ return (...transformers) => __awaiter(this, void 0, void 0, function* () {
725
+ const initialResponse = Object.assign({}, defaultResponse, {
726
+ headers: new lib$2.Headers({
727
+ 'x-powered-by': 'msw',
728
+ }),
729
+ }, responseOverrides);
730
+ const resolvedTransformers = [
731
+ ...defaultTransformers,
732
+ ...transformers,
733
+ ].filter(Boolean);
734
+ const resolvedResponse = resolvedTransformers.length > 0
735
+ ? compose(...resolvedTransformers)(initialResponse)
736
+ : initialResponse;
737
+ return resolvedResponse;
738
+ });
739
+ }
740
+ const response = Object.assign(createResponseComposition(), {
741
+ once: createResponseComposition({ once: true }),
742
+ networkError(message) {
743
+ throw new NetworkError(message);
744
+ },
745
+ });
746
+
747
+ const BUILD_FRAME = /(node_modules)?[\/\\]lib[\/\\](umd|esm|iief|cjs)[\/\\]|^[^\/\\]*$/;
748
+ /**
749
+ * Return the stack trace frame of a function's invocation.
750
+ */
751
+ function getCallFrame(error) {
752
+ // In <IE11, new Error may return an undefined stack
753
+ const stack = error.stack;
754
+ if (!stack) {
755
+ return;
756
+ }
757
+ const frames = stack.split('\n').slice(1);
758
+ // Get the first frame that doesn't reference the library's internal trace.
759
+ // Assume that frame is the invocation frame.
760
+ const declarationFrame = frames.find((frame) => {
761
+ return !BUILD_FRAME.test(frame);
762
+ });
763
+ if (!declarationFrame) {
764
+ return;
765
+ }
766
+ // Extract file reference from the stack frame.
767
+ const declarationPath = declarationFrame
768
+ .replace(/\s*at [^()]*\(([^)]+)\)/, '$1')
769
+ .replace(/^@/, '');
770
+ return declarationPath;
771
+ }
772
+
773
+ /**
774
+ * Determines if the given function is an iterator.
775
+ */
776
+ function isIterable(fn) {
777
+ if (!fn) {
778
+ return false;
779
+ }
780
+ return typeof fn[Symbol.iterator] == 'function';
781
+ }
782
+
783
+ var statuses = {
784
+ "100": "Continue",
785
+ "101": "Switching Protocols",
786
+ "102": "Processing",
787
+ "103": "Early Hints",
788
+ "200": "OK",
789
+ "201": "Created",
790
+ "202": "Accepted",
791
+ "203": "Non-Authoritative Information",
792
+ "204": "No Content",
793
+ "205": "Reset Content",
794
+ "206": "Partial Content",
795
+ "207": "Multi-Status",
796
+ "208": "Already Reported",
797
+ "226": "IM Used",
798
+ "300": "Multiple Choices",
799
+ "301": "Moved Permanently",
800
+ "302": "Found",
801
+ "303": "See Other",
802
+ "304": "Not Modified",
803
+ "305": "Use Proxy",
804
+ "307": "Temporary Redirect",
805
+ "308": "Permanent Redirect",
806
+ "400": "Bad Request",
807
+ "401": "Unauthorized",
808
+ "402": "Payment Required",
809
+ "403": "Forbidden",
810
+ "404": "Not Found",
811
+ "405": "Method Not Allowed",
812
+ "406": "Not Acceptable",
813
+ "407": "Proxy Authentication Required",
814
+ "408": "Request Timeout",
815
+ "409": "Conflict",
816
+ "410": "Gone",
817
+ "411": "Length Required",
818
+ "412": "Precondition Failed",
819
+ "413": "Payload Too Large",
820
+ "414": "URI Too Long",
821
+ "415": "Unsupported Media Type",
822
+ "416": "Range Not Satisfiable",
823
+ "417": "Expectation Failed",
824
+ "418": "I'm a Teapot",
825
+ "421": "Misdirected Request",
826
+ "422": "Unprocessable Entity",
827
+ "423": "Locked",
828
+ "424": "Failed Dependency",
829
+ "425": "Too Early",
830
+ "426": "Upgrade Required",
831
+ "428": "Precondition Required",
832
+ "429": "Too Many Requests",
833
+ "431": "Request Header Fields Too Large",
834
+ "451": "Unavailable For Legal Reasons",
835
+ "500": "Internal Server Error",
836
+ "501": "Not Implemented",
837
+ "502": "Bad Gateway",
838
+ "503": "Service Unavailable",
839
+ "504": "Gateway Timeout",
840
+ "505": "HTTP Version Not Supported",
841
+ "506": "Variant Also Negotiates",
842
+ "507": "Insufficient Storage",
843
+ "508": "Loop Detected",
844
+ "509": "Bandwidth Limit Exceeded",
845
+ "510": "Not Extended",
846
+ "511": "Network Authentication Required"
847
+ };
848
+
849
+ /**
850
+ * Sets a response status code and text.
851
+ * @example
852
+ * res(ctx.status(301))
853
+ * res(ctx.status(400, 'Custom status text'))
854
+ * @see {@link https://mswjs.io/docs/api/context/status `ctx.status()`}
855
+ */
856
+ const status = (statusCode, statusText) => {
857
+ return (res) => {
858
+ res.status = statusCode;
859
+ res.statusText =
860
+ statusText || statuses[String(statusCode)];
861
+ return res;
862
+ };
863
+ };
864
+
865
+ /**
866
+ * Sets one or multiple response headers.
867
+ * @example
868
+ * ctx.set('Content-Type', 'text/plain')
869
+ * ctx.set({
870
+ * 'Accept': 'application/javascript',
871
+ * 'Content-Type': "text/plain"
872
+ * })
873
+ * @see {@link https://mswjs.io/docs/api/context/set `ctx.set()`}
874
+ */
875
+ function set(...args) {
876
+ return (res) => {
877
+ const [name, value] = args;
878
+ if (typeof name === 'string') {
879
+ res.headers.append(name, value);
880
+ }
881
+ else {
882
+ const headers = lib$2.objectToHeaders(name);
883
+ headers.forEach((value, name) => {
884
+ res.headers.append(name, value);
885
+ });
886
+ }
887
+ return res;
888
+ };
889
+ }
890
+
891
+ const SET_TIMEOUT_MAX_ALLOWED_INT = 2147483647;
892
+ const MIN_SERVER_RESPONSE_TIME = 100;
893
+ const MAX_SERVER_RESPONSE_TIME = 400;
894
+ const NODE_SERVER_RESPONSE_TIME = 5;
895
+ const getRandomServerResponseTime = () => {
896
+ if (lib$4.exports.isNodeProcess()) {
897
+ return NODE_SERVER_RESPONSE_TIME;
898
+ }
899
+ return Math.floor(Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) +
900
+ MIN_SERVER_RESPONSE_TIME);
901
+ };
902
+ /**
903
+ * Delays the response by the given duration (ms).
904
+ * @example
905
+ * res(ctx.delay(1200)) // delay response by 1200ms
906
+ * res(ctx.delay()) // emulate realistic server response time
907
+ * res(ctx.delay('infinite')) // delay response infinitely
908
+ * @see {@link https://mswjs.io/docs/api/context/delay `ctx.delay()`}
909
+ */
910
+ const delay = (durationOrMode) => {
911
+ return (res) => {
912
+ let delayTime;
913
+ if (typeof durationOrMode === 'string') {
914
+ switch (durationOrMode) {
915
+ case 'infinite': {
916
+ // Using `Infinity` as a delay value executes the response timeout immediately.
917
+ // Instead, use the maximum allowed integer for `setTimeout`.
918
+ delayTime = SET_TIMEOUT_MAX_ALLOWED_INT;
919
+ break;
920
+ }
921
+ case 'real': {
922
+ delayTime = getRandomServerResponseTime();
923
+ break;
924
+ }
925
+ default: {
926
+ throw new Error(`Failed to delay a response: unknown delay mode "${durationOrMode}". Please make sure you provide one of the supported modes ("real", "infinite") or a number to "ctx.delay".`);
927
+ }
928
+ }
929
+ }
930
+ else if (typeof durationOrMode === 'undefined') {
931
+ // Use random realistic server response time when no explicit delay duration was provided.
932
+ delayTime = getRandomServerResponseTime();
933
+ }
934
+ else {
935
+ // Guard against passing values like `Infinity` or `Number.MAX_VALUE`
936
+ // as the response delay duration. They don't produce the result you may expect.
937
+ if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) {
938
+ throw new Error(`Failed to delay a response: provided delay duration (${durationOrMode}) exceeds the maximum allowed duration for "setTimeout" (${SET_TIMEOUT_MAX_ALLOWED_INT}). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the "infinite" delay mode to delay the response indefinitely.`);
939
+ }
940
+ delayTime = durationOrMode;
941
+ }
942
+ res.delay = delayTime;
943
+ return res;
944
+ };
945
+ };
946
+
947
+ const useFetch = lib$4.exports.isNodeProcess() ? require('node-fetch') : window.fetch;
948
+ const augmentRequestInit = (requestInit) => {
949
+ const headers = new lib$2.Headers(requestInit.headers);
950
+ headers.set('x-msw-bypass', 'true');
951
+ return Object.assign(Object.assign({}, requestInit), { headers: headers.all() });
952
+ };
953
+ const createFetchRequestParameters = (input) => {
954
+ const { body, method } = input;
955
+ const requestParameters = Object.assign(Object.assign({}, input), { body: undefined });
956
+ if (['GET', 'HEAD'].includes(method)) {
957
+ return requestParameters;
958
+ }
959
+ if (typeof body === 'object' ||
960
+ typeof body === 'number' ||
961
+ typeof body === 'boolean') {
962
+ requestParameters.body = JSON.stringify(body);
963
+ }
964
+ else {
965
+ requestParameters.body = body;
966
+ }
967
+ return requestParameters;
968
+ };
969
+ /**
970
+ * Performs a bypassed request inside a request handler.
971
+ * @example
972
+ * const originalResponse = await ctx.fetch(req)
973
+ * @see {@link https://mswjs.io/docs/api/context/fetch `ctx.fetch()`}
974
+ */
975
+ const fetch = (input, requestInit = {}) => {
976
+ if (typeof input === 'string') {
977
+ return useFetch(input, augmentRequestInit(requestInit));
978
+ }
979
+ const requestParameters = createFetchRequestParameters(input);
980
+ const derivedRequestInit = augmentRequestInit(requestParameters);
981
+ return useFetch(input.url.href, derivedRequestInit);
982
+ };
983
+
984
+ const defaultContext = {
985
+ status,
986
+ set,
987
+ delay,
988
+ fetch,
989
+ };
990
+ class RequestHandler {
991
+ constructor(options) {
992
+ this.shouldSkip = false;
993
+ this.ctx = options.ctx || defaultContext;
994
+ this.resolver = options.resolver;
995
+ const callFrame = getCallFrame(new Error());
996
+ this.info = Object.assign(Object.assign({}, options.info), { callFrame });
997
+ }
998
+ /**
999
+ * Parse the captured request to extract additional information from it.
1000
+ * Parsed result is then exposed to other methods of this request handler.
1001
+ */
1002
+ parse(_request, _resolutionContext) {
1003
+ return null;
1004
+ }
1005
+ /**
1006
+ * Test if this handler matches the given request.
1007
+ */
1008
+ test(request, resolutionContext) {
1009
+ return this.predicate(request, this.parse(request, resolutionContext), resolutionContext);
1010
+ }
1011
+ /**
1012
+ * Derive the publicly exposed request (`req`) instance of the response resolver
1013
+ * from the captured request and its parsed result.
1014
+ */
1015
+ getPublicRequest(request, _parsedResult) {
1016
+ return request;
1017
+ }
1018
+ markAsSkipped(shouldSkip = true) {
1019
+ this.shouldSkip = shouldSkip;
1020
+ }
1021
+ /**
1022
+ * Execute this request handler and produce a mocked response
1023
+ * using the given resolver function.
1024
+ */
1025
+ run(request, resolutionContext) {
1026
+ return __awaiter(this, void 0, void 0, function* () {
1027
+ if (this.shouldSkip) {
1028
+ return null;
1029
+ }
1030
+ const parsedResult = this.parse(request, resolutionContext);
1031
+ const shouldIntercept = this.predicate(request, parsedResult, resolutionContext);
1032
+ if (!shouldIntercept) {
1033
+ return null;
1034
+ }
1035
+ const publicRequest = this.getPublicRequest(request, parsedResult);
1036
+ // Create a response extraction wrapper around the resolver
1037
+ // since it can be both an async function and a generator.
1038
+ const executeResolver = this.wrapResolver(this.resolver);
1039
+ const mockedResponse = yield executeResolver(publicRequest, response, this.ctx);
1040
+ return this.createExecutionResult(parsedResult, publicRequest, mockedResponse);
1041
+ });
1042
+ }
1043
+ wrapResolver(resolver) {
1044
+ return (req, res, ctx) => __awaiter(this, void 0, void 0, function* () {
1045
+ const result = this.resolverGenerator || (yield resolver(req, res, ctx));
1046
+ if (isIterable(result)) {
1047
+ const { value, done } = result[Symbol.iterator]().next();
1048
+ const nextResponse = yield value;
1049
+ // If the generator is done and there is no next value,
1050
+ // return the previous generator's value.
1051
+ if (!nextResponse && done) {
1052
+ return this.resolverGeneratorResult;
1053
+ }
1054
+ if (!this.resolverGenerator) {
1055
+ this.resolverGenerator = result;
1056
+ }
1057
+ this.resolverGeneratorResult = nextResponse;
1058
+ return nextResponse;
1059
+ }
1060
+ return result;
1061
+ });
1062
+ }
1063
+ createExecutionResult(parsedResult, request, response) {
1064
+ return {
1065
+ handler: this,
1066
+ parsedResult: parsedResult || null,
1067
+ request,
1068
+ response: response || null,
1069
+ };
1070
+ }
1071
+ }
1072
+ /**
1073
+ * Bypass this intercepted request.
1074
+ * This will make a call to the actual endpoint requested.
1075
+ */
1076
+ function passthrough() {
1077
+ // Constructing a dummy "101 Continue" mocked response
1078
+ // to keep the return type of the resolver consistent.
1079
+ return {
1080
+ status: 101,
1081
+ statusText: 'Continue',
1082
+ headers: new lib$2.Headers(),
1083
+ body: null,
1084
+ // Setting "passthrough" to true will signal the response pipeline
1085
+ // to perform this intercepted request as-is.
1086
+ passthrough: true,
1087
+ once: false,
1088
+ };
1089
+ }
669
1090
 
670
- Object.defineProperty(flattenHeadersObject$1, "__esModule", { value: true });
671
- flattenHeadersObject$1.flattenHeadersObject = void 0;
672
- var reduceHeadersObject_1 = reduceHeadersObject$1;
673
- function flattenHeadersObject(headersObject) {
674
- return reduceHeadersObject_1.reduceHeadersObject(headersObject, function (headers, name, value) {
675
- headers[name] = [].concat(value).join('; ');
676
- return headers;
677
- }, {});
1091
+ /**
1092
+ * Parses a given value into a JSON.
1093
+ * Does not throw an exception on an invalid JSON string.
1094
+ */
1095
+ function jsonParse(value) {
1096
+ try {
1097
+ return JSON.parse(value);
1098
+ }
1099
+ catch (error) {
1100
+ return undefined;
1101
+ }
678
1102
  }
679
- flattenHeadersObject$1.flattenHeadersObject = flattenHeadersObject;
680
-
681
- (function (exports) {
682
- Object.defineProperty(exports, "__esModule", { value: true });
683
- exports.flattenHeadersObject = exports.flattenHeadersList = exports.reduceHeadersObject = exports.objectToHeaders = exports.listToHeaders = exports.stringToHeaders = exports.headersToObject = exports.headersToList = exports.headersToString = exports.Headers = void 0;
684
- var Headers_1 = Headers;
685
- Object.defineProperty(exports, "Headers", { enumerable: true, get: function () { return Headers_1.default; } });
686
- var headersToString_1 = headersToString$1;
687
- Object.defineProperty(exports, "headersToString", { enumerable: true, get: function () { return headersToString_1.headersToString; } });
688
- var headersToList_1 = headersToList$1;
689
- Object.defineProperty(exports, "headersToList", { enumerable: true, get: function () { return headersToList_1.headersToList; } });
690
- var headersToObject_1 = headersToObject$1;
691
- Object.defineProperty(exports, "headersToObject", { enumerable: true, get: function () { return headersToObject_1.headersToObject; } });
692
- var stringToHeaders_1 = stringToHeaders$1;
693
- Object.defineProperty(exports, "stringToHeaders", { enumerable: true, get: function () { return stringToHeaders_1.stringToHeaders; } });
694
- var listToHeaders_1 = listToHeaders$1;
695
- Object.defineProperty(exports, "listToHeaders", { enumerable: true, get: function () { return listToHeaders_1.listToHeaders; } });
696
- var objectToHeaders_1 = objectToHeaders$1;
697
- Object.defineProperty(exports, "objectToHeaders", { enumerable: true, get: function () { return objectToHeaders_1.objectToHeaders; } });
698
- var reduceHeadersObject_1 = reduceHeadersObject$1;
699
- Object.defineProperty(exports, "reduceHeadersObject", { enumerable: true, get: function () { return reduceHeadersObject_1.reduceHeadersObject; } });
700
- var flattenHeadersList_1 = flattenHeadersList$1;
701
- Object.defineProperty(exports, "flattenHeadersList", { enumerable: true, get: function () { return flattenHeadersList_1.flattenHeadersList; } });
702
- var flattenHeadersObject_1 = flattenHeadersObject$1;
703
- Object.defineProperty(exports, "flattenHeadersObject", { enumerable: true, get: function () { return flattenHeadersObject_1.flattenHeadersObject; } });
704
- }(lib$1));
705
1103
 
706
1104
  function parseContentHeaders(headersString) {
707
1105
  var _a, _b;
708
- const headers = lib$1.stringToHeaders(headersString);
1106
+ const headers = lib$2.stringToHeaders(headersString);
709
1107
  const contentType = headers.get('content-type') || 'text/plain';
710
1108
  const disposition = headers.get('content-disposition');
711
1109
  if (!disposition) {
@@ -1084,12 +1482,39 @@ function parseIsomorphicRequest(request) {
1084
1482
  integrity: '',
1085
1483
  destination: 'document',
1086
1484
  bodyUsed: false,
1485
+ passthrough,
1087
1486
  };
1088
1487
  // Attach all the cookies from the virtual cookie store.
1089
1488
  setRequestCookies(mockedRequest);
1090
1489
  return mockedRequest;
1091
1490
  }
1092
1491
 
1492
+ var lib$1 = {};
1493
+
1494
+ var until$1 = {};
1495
+
1496
+ Object.defineProperty(until$1, "__esModule", { value: true });
1497
+ /**
1498
+ * Gracefully handles a given Promise factory.
1499
+ * @example
1500
+ * cosnt [error, data] = await until(() => asyncAction())
1501
+ */
1502
+ until$1.until = async (promise) => {
1503
+ try {
1504
+ const data = await promise().catch((error) => {
1505
+ throw error;
1506
+ });
1507
+ return [null, data];
1508
+ }
1509
+ catch (error) {
1510
+ return [error, null];
1511
+ }
1512
+ };
1513
+
1514
+ Object.defineProperty(lib$1, "__esModule", { value: true });
1515
+ var until_1 = until$1;
1516
+ var until = lib$1.until = until_1.until;
1517
+
1093
1518
  /**
1094
1519
  * Returns a mocked response for a given request using following request handlers.
1095
1520
  */
@@ -4828,114 +5253,6 @@ function isStringEqual(actual, expected) {
4828
5253
  return actual.toLowerCase() === expected.toLowerCase();
4829
5254
  }
4830
5255
 
4831
- var statuses = {
4832
- "100": "Continue",
4833
- "101": "Switching Protocols",
4834
- "102": "Processing",
4835
- "103": "Early Hints",
4836
- "200": "OK",
4837
- "201": "Created",
4838
- "202": "Accepted",
4839
- "203": "Non-Authoritative Information",
4840
- "204": "No Content",
4841
- "205": "Reset Content",
4842
- "206": "Partial Content",
4843
- "207": "Multi-Status",
4844
- "208": "Already Reported",
4845
- "226": "IM Used",
4846
- "300": "Multiple Choices",
4847
- "301": "Moved Permanently",
4848
- "302": "Found",
4849
- "303": "See Other",
4850
- "304": "Not Modified",
4851
- "305": "Use Proxy",
4852
- "307": "Temporary Redirect",
4853
- "308": "Permanent Redirect",
4854
- "400": "Bad Request",
4855
- "401": "Unauthorized",
4856
- "402": "Payment Required",
4857
- "403": "Forbidden",
4858
- "404": "Not Found",
4859
- "405": "Method Not Allowed",
4860
- "406": "Not Acceptable",
4861
- "407": "Proxy Authentication Required",
4862
- "408": "Request Timeout",
4863
- "409": "Conflict",
4864
- "410": "Gone",
4865
- "411": "Length Required",
4866
- "412": "Precondition Failed",
4867
- "413": "Payload Too Large",
4868
- "414": "URI Too Long",
4869
- "415": "Unsupported Media Type",
4870
- "416": "Range Not Satisfiable",
4871
- "417": "Expectation Failed",
4872
- "418": "I'm a Teapot",
4873
- "421": "Misdirected Request",
4874
- "422": "Unprocessable Entity",
4875
- "423": "Locked",
4876
- "424": "Failed Dependency",
4877
- "425": "Too Early",
4878
- "426": "Upgrade Required",
4879
- "428": "Precondition Required",
4880
- "429": "Too Many Requests",
4881
- "431": "Request Header Fields Too Large",
4882
- "451": "Unavailable For Legal Reasons",
4883
- "500": "Internal Server Error",
4884
- "501": "Not Implemented",
4885
- "502": "Bad Gateway",
4886
- "503": "Service Unavailable",
4887
- "504": "Gateway Timeout",
4888
- "505": "HTTP Version Not Supported",
4889
- "506": "Variant Also Negotiates",
4890
- "507": "Insufficient Storage",
4891
- "508": "Loop Detected",
4892
- "509": "Bandwidth Limit Exceeded",
4893
- "510": "Not Extended",
4894
- "511": "Network Authentication Required"
4895
- };
4896
-
4897
- /**
4898
- * Sets a response status code and text.
4899
- * @example
4900
- * res(ctx.status(301))
4901
- * res(ctx.status(400, 'Custom status text'))
4902
- * @see {@link https://mswjs.io/docs/api/context/status `ctx.status()`}
4903
- */
4904
- const status = (statusCode, statusText) => {
4905
- return (res) => {
4906
- res.status = statusCode;
4907
- res.statusText =
4908
- statusText || statuses[String(statusCode)];
4909
- return res;
4910
- };
4911
- };
4912
-
4913
- /**
4914
- * Sets one or multiple response headers.
4915
- * @example
4916
- * ctx.set('Content-Type', 'text/plain')
4917
- * ctx.set({
4918
- * 'Accept': 'application/javascript',
4919
- * 'Content-Type': "text/plain"
4920
- * })
4921
- * @see {@link https://mswjs.io/docs/api/context/set `ctx.set()`}
4922
- */
4923
- function set(...args) {
4924
- return (res) => {
4925
- const [name, value] = args;
4926
- if (typeof name === 'string') {
4927
- res.headers.append(name, value);
4928
- }
4929
- else {
4930
- const headers = lib$1.objectToHeaders(name);
4931
- headers.forEach((value, name) => {
4932
- res.headers.append(name, value);
4933
- });
4934
- }
4935
- return res;
4936
- };
4937
- }
4938
-
4939
5256
  /**
4940
5257
  * Sets a given cookie on the mocked response.
4941
5258
  * @example res(ctx.cookie('name', 'value'))
@@ -5005,95 +5322,39 @@ function mergeRight(left, right) {
5005
5322
  const json = (body) => {
5006
5323
  return (res) => {
5007
5324
  res.headers.set('Content-Type', 'application/json');
5008
- res.body = JSON.stringify(body);
5009
- return res;
5010
- };
5011
- };
5012
-
5013
- /**
5014
- * Sets a given payload as a GraphQL response body.
5015
- * @example
5016
- * res(ctx.data({ user: { firstName: 'John' }}))
5017
- * @see {@link https://mswjs.io/docs/api/context/data `ctx.data()`}
5018
- */
5019
- const data = (payload) => {
5020
- return (res) => {
5021
- const prevBody = jsonParse(res.body) || {};
5022
- const nextBody = mergeRight(prevBody, { data: payload });
5023
- return json(nextBody)(res);
5024
- };
5025
- };
5026
-
5027
- /**
5028
- * Sets the GraphQL extensions on a given response.
5029
- * @example
5030
- * res(ctx.extensions({ tracing: { version: 1 }}))
5031
- * @see {@link https://mswjs.io/docs/api/context/extensions `ctx.extensions()`}
5032
- */
5033
- const extensions = (payload) => {
5034
- return (res) => {
5035
- const prevBody = jsonParse(res.body) || {};
5036
- const nextBody = mergeRight(prevBody, { extensions: payload });
5037
- return json(nextBody)(res);
5038
- };
5039
- };
5040
-
5041
- const SET_TIMEOUT_MAX_ALLOWED_INT = 2147483647;
5042
- const MIN_SERVER_RESPONSE_TIME = 100;
5043
- const MAX_SERVER_RESPONSE_TIME = 400;
5044
- const NODE_SERVER_RESPONSE_TIME = 5;
5045
- const getRandomServerResponseTime = () => {
5046
- if (lib$3.exports.isNodeProcess()) {
5047
- return NODE_SERVER_RESPONSE_TIME;
5048
- }
5049
- return Math.floor(Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) +
5050
- MIN_SERVER_RESPONSE_TIME);
5051
- };
5052
- /**
5053
- * Delays the response by the given duration (ms).
5054
- * @example
5055
- * res(ctx.delay(1200)) // delay response by 1200ms
5056
- * res(ctx.delay()) // emulate realistic server response time
5057
- * res(ctx.delay('infinite')) // delay response infinitely
5058
- * @see {@link https://mswjs.io/docs/api/context/delay `ctx.delay()`}
5059
- */
5060
- const delay = (durationOrMode) => {
5061
- return (res) => {
5062
- let delayTime;
5063
- if (typeof durationOrMode === 'string') {
5064
- switch (durationOrMode) {
5065
- case 'infinite': {
5066
- // Using `Infinity` as a delay value executes the response timeout immediately.
5067
- // Instead, use the maximum allowed integer for `setTimeout`.
5068
- delayTime = SET_TIMEOUT_MAX_ALLOWED_INT;
5069
- break;
5070
- }
5071
- case 'real': {
5072
- delayTime = getRandomServerResponseTime();
5073
- break;
5074
- }
5075
- default: {
5076
- throw new Error(`Failed to delay a response: unknown delay mode "${durationOrMode}". Please make sure you provide one of the supported modes ("real", "infinite") or a number to "ctx.delay".`);
5077
- }
5078
- }
5079
- }
5080
- else if (typeof durationOrMode === 'undefined') {
5081
- // Use random realistic server response time when no explicit delay duration was provided.
5082
- delayTime = getRandomServerResponseTime();
5083
- }
5084
- else {
5085
- // Guard against passing values like `Infinity` or `Number.MAX_VALUE`
5086
- // as the response delay duration. They don't produce the result you may expect.
5087
- if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) {
5088
- throw new Error(`Failed to delay a response: provided delay duration (${durationOrMode}) exceeds the maximum allowed duration for "setTimeout" (${SET_TIMEOUT_MAX_ALLOWED_INT}). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the "infinite" delay mode to delay the response indefinitely.`);
5089
- }
5090
- delayTime = durationOrMode;
5091
- }
5092
- res.delay = delayTime;
5325
+ res.body = JSON.stringify(body);
5093
5326
  return res;
5094
5327
  };
5095
5328
  };
5096
5329
 
5330
+ /**
5331
+ * Sets a given payload as a GraphQL response body.
5332
+ * @example
5333
+ * res(ctx.data({ user: { firstName: 'John' }}))
5334
+ * @see {@link https://mswjs.io/docs/api/context/data `ctx.data()`}
5335
+ */
5336
+ const data = (payload) => {
5337
+ return (res) => {
5338
+ const prevBody = jsonParse(res.body) || {};
5339
+ const nextBody = mergeRight(prevBody, { data: payload });
5340
+ return json(nextBody)(res);
5341
+ };
5342
+ };
5343
+
5344
+ /**
5345
+ * Sets the GraphQL extensions on a given response.
5346
+ * @example
5347
+ * res(ctx.extensions({ tracing: { version: 1 }}))
5348
+ * @see {@link https://mswjs.io/docs/api/context/extensions `ctx.extensions()`}
5349
+ */
5350
+ const extensions = (payload) => {
5351
+ return (res) => {
5352
+ const prevBody = jsonParse(res.body) || {};
5353
+ const nextBody = mergeRight(prevBody, { extensions: payload });
5354
+ return json(nextBody)(res);
5355
+ };
5356
+ };
5357
+
5097
5358
  /**
5098
5359
  * Sets a given list of GraphQL errors on the mocked response.
5099
5360
  * @example res(ctx.errors([{ message: 'Unauthorized' }]))
@@ -5110,43 +5371,6 @@ const errors = (errorsList) => {
5110
5371
  };
5111
5372
  };
5112
5373
 
5113
- const useFetch = lib$3.exports.isNodeProcess() ? require('node-fetch') : window.fetch;
5114
- const augmentRequestInit = (requestInit) => {
5115
- const headers = new lib$1.Headers(requestInit.headers);
5116
- headers.set('x-msw-bypass', 'true');
5117
- return Object.assign(Object.assign({}, requestInit), { headers: headers.all() });
5118
- };
5119
- const createFetchRequestParameters = (input) => {
5120
- const { body, method } = input;
5121
- const requestParameters = Object.assign(Object.assign({}, input), { body: undefined });
5122
- if (['GET', 'HEAD'].includes(method)) {
5123
- return requestParameters;
5124
- }
5125
- if (typeof body === 'object' ||
5126
- typeof body === 'number' ||
5127
- typeof body === 'boolean') {
5128
- requestParameters.body = JSON.stringify(body);
5129
- }
5130
- else {
5131
- requestParameters.body = body;
5132
- }
5133
- return requestParameters;
5134
- };
5135
- /**
5136
- * Performs a bypassed request inside a request handler.
5137
- * @example
5138
- * const originalResponse = await ctx.fetch(req)
5139
- * @see {@link https://mswjs.io/docs/api/context/fetch `ctx.fetch()`}
5140
- */
5141
- const fetch = (input, requestInit = {}) => {
5142
- if (typeof input === 'string') {
5143
- return useFetch(input, augmentRequestInit(requestInit));
5144
- }
5145
- const requestParameters = createFetchRequestParameters(input);
5146
- const derivedRequestInit = augmentRequestInit(requestParameters);
5147
- return useFetch(input.url.href, derivedRequestInit);
5148
- };
5149
-
5150
5374
  /**
5151
5375
  * Sets a textual response body. Appends a `Content-Type: text/plain`
5152
5376
  * header on the mocked response.
@@ -5218,7 +5442,7 @@ function prepareRequest(request) {
5218
5442
  * Formats a mocked response for introspection in the browser's console.
5219
5443
  */
5220
5444
  function prepareResponse(res) {
5221
- const responseHeaders = lib$1.objectToHeaders(res.headers);
5445
+ const responseHeaders = lib$2.objectToHeaders(res.headers);
5222
5446
  return Object.assign(Object.assign({}, res), {
5223
5447
  // Parse a response JSON body for preview in the logs
5224
5448
  body: parseBody(res.body, responseHeaders) });
@@ -5662,184 +5886,6 @@ function matchRequestUrl(url, path, baseUrl) {
5662
5886
  };
5663
5887
  }
5664
5888
 
5665
- /**
5666
- * Composes a given list of functions into a new function that
5667
- * executes from right to left.
5668
- */
5669
- function compose(...fns) {
5670
- return (...args) => {
5671
- return fns.reduceRight((leftFn, rightFn) => {
5672
- return leftFn instanceof Promise
5673
- ? Promise.resolve(leftFn).then(rightFn)
5674
- : rightFn(leftFn);
5675
- }, args[0]);
5676
- };
5677
- }
5678
-
5679
- class NetworkError extends Error {
5680
- constructor(message) {
5681
- super(message);
5682
- this.name = 'NetworkError';
5683
- }
5684
- }
5685
-
5686
- const defaultResponse = {
5687
- status: 200,
5688
- statusText: 'OK',
5689
- body: null,
5690
- delay: 0,
5691
- once: false,
5692
- };
5693
- const defaultResponseTransformers = [];
5694
- function createResponseComposition(responseOverrides, defaultTransformers = defaultResponseTransformers) {
5695
- return (...transformers) => __awaiter(this, void 0, void 0, function* () {
5696
- const initialResponse = Object.assign({}, defaultResponse, {
5697
- headers: new lib$1.Headers({
5698
- 'x-powered-by': 'msw',
5699
- }),
5700
- }, responseOverrides);
5701
- const resolvedTransformers = [
5702
- ...defaultTransformers,
5703
- ...transformers,
5704
- ].filter(Boolean);
5705
- const resolvedResponse = resolvedTransformers.length > 0
5706
- ? compose(...resolvedTransformers)(initialResponse)
5707
- : initialResponse;
5708
- return resolvedResponse;
5709
- });
5710
- }
5711
- const response = Object.assign(createResponseComposition(), {
5712
- once: createResponseComposition({ once: true }),
5713
- networkError(message) {
5714
- throw new NetworkError(message);
5715
- },
5716
- });
5717
-
5718
- const BUILD_FRAME = /(node_modules)?[\/\\]lib[\/\\](umd|esm|iief|cjs)[\/\\]|^[^\/\\]*$/;
5719
- /**
5720
- * Return the stack trace frame of a function's invocation.
5721
- */
5722
- function getCallFrame(error) {
5723
- // In <IE11, new Error may return an undefined stack
5724
- const stack = error.stack;
5725
- if (!stack) {
5726
- return;
5727
- }
5728
- const frames = stack.split('\n').slice(1);
5729
- // Get the first frame that doesn't reference the library's internal trace.
5730
- // Assume that frame is the invocation frame.
5731
- const declarationFrame = frames.find((frame) => {
5732
- return !BUILD_FRAME.test(frame);
5733
- });
5734
- if (!declarationFrame) {
5735
- return;
5736
- }
5737
- // Extract file reference from the stack frame.
5738
- const declarationPath = declarationFrame
5739
- .replace(/\s*at [^()]*\(([^)]+)\)/, '$1')
5740
- .replace(/^@/, '');
5741
- return declarationPath;
5742
- }
5743
-
5744
- /**
5745
- * Determines if the given function is an iterator.
5746
- */
5747
- function isIterable(fn) {
5748
- if (!fn) {
5749
- return false;
5750
- }
5751
- return typeof fn[Symbol.iterator] == 'function';
5752
- }
5753
-
5754
- const defaultContext = {
5755
- status,
5756
- set,
5757
- delay,
5758
- fetch,
5759
- };
5760
- class RequestHandler {
5761
- constructor(options) {
5762
- this.shouldSkip = false;
5763
- this.ctx = options.ctx || defaultContext;
5764
- this.resolver = options.resolver;
5765
- const callFrame = getCallFrame(new Error());
5766
- this.info = Object.assign(Object.assign({}, options.info), { callFrame });
5767
- }
5768
- /**
5769
- * Parse the captured request to extract additional information from it.
5770
- * Parsed result is then exposed to other methods of this request handler.
5771
- */
5772
- parse(_request, _resolutionContext) {
5773
- return null;
5774
- }
5775
- /**
5776
- * Test if this handler matches the given request.
5777
- */
5778
- test(request, resolutionContext) {
5779
- return this.predicate(request, this.parse(request, resolutionContext), resolutionContext);
5780
- }
5781
- /**
5782
- * Derive the publicly exposed request (`req`) instance of the response resolver
5783
- * from the captured request and its parsed result.
5784
- */
5785
- getPublicRequest(request, _parsedResult) {
5786
- return request;
5787
- }
5788
- markAsSkipped(shouldSkip = true) {
5789
- this.shouldSkip = shouldSkip;
5790
- }
5791
- /**
5792
- * Execute this request handler and produce a mocked response
5793
- * using the given resolver function.
5794
- */
5795
- run(request, resolutionContext) {
5796
- return __awaiter(this, void 0, void 0, function* () {
5797
- if (this.shouldSkip) {
5798
- return null;
5799
- }
5800
- const parsedResult = this.parse(request, resolutionContext);
5801
- const shouldIntercept = this.predicate(request, parsedResult, resolutionContext);
5802
- if (!shouldIntercept) {
5803
- return null;
5804
- }
5805
- const publicRequest = this.getPublicRequest(request, parsedResult);
5806
- // Create a response extraction wrapper around the resolver
5807
- // since it can be both an async function and a generator.
5808
- const executeResolver = this.wrapResolver(this.resolver);
5809
- const mockedResponse = yield executeResolver(publicRequest, response, this.ctx);
5810
- return this.createExecutionResult(parsedResult, publicRequest, mockedResponse);
5811
- });
5812
- }
5813
- wrapResolver(resolver) {
5814
- return (req, res, ctx) => __awaiter(this, void 0, void 0, function* () {
5815
- const result = this.resolverGenerator || (yield resolver(req, res, ctx));
5816
- if (isIterable(result)) {
5817
- const { value, done } = result[Symbol.iterator]().next();
5818
- const nextResponse = yield value;
5819
- // If the generator is done and there is no next value,
5820
- // return the previous generator's value.
5821
- if (!nextResponse && done) {
5822
- return this.resolverGeneratorResult;
5823
- }
5824
- if (!this.resolverGenerator) {
5825
- this.resolverGenerator = result;
5826
- }
5827
- this.resolverGeneratorResult = nextResponse;
5828
- return nextResponse;
5829
- }
5830
- return result;
5831
- });
5832
- }
5833
- createExecutionResult(parsedResult, request, response) {
5834
- return {
5835
- handler: this,
5836
- parsedResult: parsedResult || null,
5837
- request,
5838
- response: response || null,
5839
- };
5840
- }
5841
- }
5842
-
5843
5889
  var RESTMethods;
5844
5890
  (function (RESTMethods) {
5845
5891
  RESTMethods["HEAD"] = "HEAD";
@@ -5850,17 +5896,11 @@ var RESTMethods;
5850
5896
  RESTMethods["OPTIONS"] = "OPTIONS";
5851
5897
  RESTMethods["DELETE"] = "DELETE";
5852
5898
  })(RESTMethods || (RESTMethods = {}));
5853
- const restContext = {
5854
- set,
5855
- status,
5856
- cookie,
5899
+ const restContext = Object.assign(Object.assign({}, defaultContext), { cookie,
5857
5900
  body,
5858
5901
  text,
5859
5902
  json,
5860
- xml,
5861
- delay,
5862
- fetch,
5863
- };
5903
+ xml });
5864
5904
  /**
5865
5905
  * Request handler for REST API requests.
5866
5906
  * Provides request matching based on method and URL.
@@ -5931,16 +5971,10 @@ function tryCatch(fn, onException) {
5931
5971
  }
5932
5972
  }
5933
5973
 
5934
- const graphqlContext = {
5935
- set,
5936
- status,
5937
- delay,
5938
- fetch,
5939
- data,
5974
+ const graphqlContext = Object.assign(Object.assign({}, defaultContext), { data,
5940
5975
  extensions,
5941
5976
  errors,
5942
- cookie,
5943
- };
5977
+ cookie });
5944
5978
  function isDocumentNode(value) {
5945
5979
  if (value == null) {
5946
5980
  return false;
@@ -6160,17 +6194,24 @@ function readResponseCookies(request, response) {
6160
6194
  }
6161
6195
 
6162
6196
  function handleRequest(request, handlers, options, emitter, handleRequestOptions) {
6163
- var _a, _b, _c;
6197
+ var _a, _b, _c, _d;
6164
6198
  return __awaiter(this, void 0, void 0, function* () {
6165
6199
  emitter.emit('request:start', request);
6166
6200
  // Perform bypassed requests (i.e. issued via "ctx.fetch") as-is.
6167
6201
  if (request.headers.get('x-msw-bypass') === 'true') {
6168
6202
  emitter.emit('request:end', request);
6169
- (_a = handleRequestOptions === null || handleRequestOptions === void 0 ? void 0 : handleRequestOptions.onBypassResponse) === null || _a === void 0 ? void 0 : _a.call(handleRequestOptions, request);
6203
+ (_a = handleRequestOptions === null || handleRequestOptions === void 0 ? void 0 : handleRequestOptions.onPassthroughResponse) === null || _a === void 0 ? void 0 : _a.call(handleRequestOptions, request);
6170
6204
  return;
6171
6205
  }
6172
6206
  // Resolve a mocked response from the list of request handlers.
6173
- const lookupResult = yield getResponse(request, handlers, handleRequestOptions === null || handleRequestOptions === void 0 ? void 0 : handleRequestOptions.resolutionContext);
6207
+ const [lookupError, lookupResult] = yield until(() => {
6208
+ return getResponse(request, handlers, handleRequestOptions === null || handleRequestOptions === void 0 ? void 0 : handleRequestOptions.resolutionContext);
6209
+ });
6210
+ if (lookupError) {
6211
+ // Allow developers to react to unhandled exceptions in request handlers.
6212
+ emitter.emit('unhandledException', lookupError, request);
6213
+ throw lookupError;
6214
+ }
6174
6215
  const { handler, response } = lookupResult;
6175
6216
  // When there's no handler for the request, consider it unhandled.
6176
6217
  // Allow the developer to react to such cases.
@@ -6178,7 +6219,7 @@ function handleRequest(request, handlers, options, emitter, handleRequestOptions
6178
6219
  onUnhandledRequest(request, handlers, options.onUnhandledRequest);
6179
6220
  emitter.emit('request:unhandled', request);
6180
6221
  emitter.emit('request:end', request);
6181
- (_b = handleRequestOptions === null || handleRequestOptions === void 0 ? void 0 : handleRequestOptions.onBypassResponse) === null || _b === void 0 ? void 0 : _b.call(handleRequestOptions, request);
6222
+ (_b = handleRequestOptions === null || handleRequestOptions === void 0 ? void 0 : handleRequestOptions.onPassthroughResponse) === null || _b === void 0 ? void 0 : _b.call(handleRequestOptions, request);
6182
6223
  return;
6183
6224
  }
6184
6225
  // When the handled request returned no mocked response, warn the developer,
@@ -6191,7 +6232,14 @@ Expected response resolver to return a mocked response Object, but got %s. The o
6191
6232
  %s\
6192
6233
  `, response, handler.info.header, handler.info.callFrame);
6193
6234
  emitter.emit('request:end', request);
6194
- (_c = handleRequestOptions === null || handleRequestOptions === void 0 ? void 0 : handleRequestOptions.onBypassResponse) === null || _c === void 0 ? void 0 : _c.call(handleRequestOptions, request);
6235
+ (_c = handleRequestOptions === null || handleRequestOptions === void 0 ? void 0 : handleRequestOptions.onPassthroughResponse) === null || _c === void 0 ? void 0 : _c.call(handleRequestOptions, request);
6236
+ return;
6237
+ }
6238
+ // When the developer explicitly returned "req.passthrough()" do not warn them.
6239
+ // Perform the request as-is.
6240
+ if (response.passthrough) {
6241
+ emitter.emit('request:end', request);
6242
+ (_d = handleRequestOptions === null || handleRequestOptions === void 0 ? void 0 : handleRequestOptions.onPassthroughResponse) === null || _d === void 0 ? void 0 : _d.call(handleRequestOptions, request);
6195
6243
  return;
6196
6244
  }
6197
6245
  // Store all the received response cookies in the virtual cookie store.
@@ -6238,8 +6286,8 @@ const DEFAULT_LISTEN_OPTIONS = {
6238
6286
  * Useful to generate identical API using different patches to request issuing modules.
6239
6287
  */
6240
6288
  function createSetupServer(...interceptors$1) {
6241
- const emitter = new lib$2.StrictEventEmitter();
6242
- const publicEmitter = new lib$2.StrictEventEmitter();
6289
+ const emitter = new lib$3.StrictEventEmitter();
6290
+ const publicEmitter = new lib$3.StrictEventEmitter();
6243
6291
  pipeEvents(emitter, publicEmitter);
6244
6292
  return function setupServer(...requestHandlers) {
6245
6293
  requestHandlers.forEach((handler) => {
@@ -6250,7 +6298,7 @@ function createSetupServer(...interceptors$1) {
6250
6298
  // so it could be modified at a runtime.
6251
6299
  let currentHandlers = [...requestHandlers];
6252
6300
  // Error when attempting to run this function in a browser environment.
6253
- if (!lib$3.exports.isNodeProcess()) {
6301
+ if (!lib$4.exports.isNodeProcess()) {
6254
6302
  throw new Error(devUtils.formatMessage('Failed to execute `setupServer` in the environment that is not Node.js (i.e. a browser). Consider using `setupWorker` instead.'));
6255
6303
  }
6256
6304
  let resolvedOptions = {};