msw 0.40.2 → 0.42.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.
Files changed (118) hide show
  1. package/config/constants.js +1 -3
  2. package/config/scripts/postinstall.js +32 -25
  3. package/lib/glossary-58eca5a8.d.ts +332 -0
  4. package/lib/iife/index.js +10911 -21
  5. package/lib/iife/index.js.map +1 -0
  6. package/lib/index.d.ts +353 -0
  7. package/lib/index.js +1875 -0
  8. package/lib/index.js.map +1 -0
  9. package/lib/{esm/mockServiceWorker.js → mockServiceWorker.js} +1 -1
  10. package/lib/native/index.d.ts +9 -0
  11. package/lib/native/index.js +1304 -0
  12. package/lib/native/index.mjs +1291 -0
  13. package/lib/node/index.d.ts +15 -0
  14. package/lib/node/index.js +1312 -0
  15. package/lib/node/index.js.map +1 -0
  16. package/lib/node/index.mjs +1297 -0
  17. package/lib/node/index.mjs.map +1 -0
  18. package/native/package.json +3 -2
  19. package/node/package.json +3 -2
  20. package/package.json +14 -24
  21. package/lib/esm/errors-deps.js +0 -74
  22. package/lib/esm/fetch-deps.js +0 -1005
  23. package/lib/esm/graphql-deps.js +0 -3545
  24. package/lib/esm/graphql.js +0 -5
  25. package/lib/esm/index-deps.js +0 -21
  26. package/lib/esm/index.js +0 -1731
  27. package/lib/esm/index2.js +0 -3
  28. package/lib/esm/matchRequestUrl-deps.js +0 -992
  29. package/lib/esm/rest-deps.js +0 -103
  30. package/lib/esm/rest.js +0 -5
  31. package/lib/esm/xml-deps.js +0 -44
  32. package/lib/iife/mockServiceWorker.js +0 -338
  33. package/lib/types/context/body.d.ts +0 -9
  34. package/lib/types/context/cookie.d.ts +0 -7
  35. package/lib/types/context/data.d.ts +0 -8
  36. package/lib/types/context/delay.d.ts +0 -15
  37. package/lib/types/context/errors.d.ts +0 -8
  38. package/lib/types/context/extensions.d.ts +0 -8
  39. package/lib/types/context/fetch.d.ts +0 -9
  40. package/lib/types/context/index.d.ts +0 -12
  41. package/lib/types/context/json.d.ts +0 -12
  42. package/lib/types/context/set.d.ts +0 -18
  43. package/lib/types/context/status.d.ts +0 -9
  44. package/lib/types/context/text.d.ts +0 -8
  45. package/lib/types/context/xml.d.ts +0 -9
  46. package/lib/types/graphql.d.ts +0 -74
  47. package/lib/types/handlers/GraphQLHandler.d.ts +0 -39
  48. package/lib/types/handlers/RequestHandler.d.ts +0 -103
  49. package/lib/types/handlers/RestHandler.d.ts +0 -47
  50. package/lib/types/index.d.ts +0 -26
  51. package/lib/types/native/index.d.ts +0 -1
  52. package/lib/types/node/createSetupServer.d.ts +0 -8
  53. package/lib/types/node/glossary.d.ts +0 -38
  54. package/lib/types/node/index.d.ts +0 -2
  55. package/lib/types/node/setupServer.d.ts +0 -6
  56. package/lib/types/response.d.ts +0 -35
  57. package/lib/types/rest.d.ts +0 -13
  58. package/lib/types/setupWorker/glossary.d.ts +0 -161
  59. package/lib/types/setupWorker/setupWorker.d.ts +0 -9
  60. package/lib/types/setupWorker/start/createFallbackStart.d.ts +0 -2
  61. package/lib/types/setupWorker/start/createStartHandler.d.ts +0 -2
  62. package/lib/types/setupWorker/start/utils/enableMocking.d.ts +0 -5
  63. package/lib/types/setupWorker/start/utils/getWorkerByRegistration.d.ts +0 -6
  64. package/lib/types/setupWorker/start/utils/getWorkerInstance.d.ts +0 -6
  65. package/lib/types/setupWorker/start/utils/prepareStartHandler.d.ts +0 -9
  66. package/lib/types/setupWorker/start/utils/printStartMessage.d.ts +0 -10
  67. package/lib/types/setupWorker/start/utils/validateWorkerScope.d.ts +0 -2
  68. package/lib/types/setupWorker/stop/createFallbackStop.d.ts +0 -2
  69. package/lib/types/setupWorker/stop/createStop.d.ts +0 -2
  70. package/lib/types/setupWorker/stop/utils/printStopMessage.d.ts +0 -3
  71. package/lib/types/sharedOptions.d.ts +0 -24
  72. package/lib/types/typeUtils.d.ts +0 -7
  73. package/lib/types/utils/NetworkError.d.ts +0 -3
  74. package/lib/types/utils/createBroadcastChannel.d.ts +0 -18
  75. package/lib/types/utils/deferNetworkRequestsUntil.d.ts +0 -6
  76. package/lib/types/utils/getResponse.d.ts +0 -15
  77. package/lib/types/utils/handleRequest.d.ts +0 -34
  78. package/lib/types/utils/internal/compose.d.ts +0 -14
  79. package/lib/types/utils/internal/devUtils.d.ts +0 -18
  80. package/lib/types/utils/internal/getCallFrame.d.ts +0 -4
  81. package/lib/types/utils/internal/isIterable.d.ts +0 -4
  82. package/lib/types/utils/internal/isObject.d.ts +0 -4
  83. package/lib/types/utils/internal/isStringEqual.d.ts +0 -4
  84. package/lib/types/utils/internal/jsonParse.d.ts +0 -5
  85. package/lib/types/utils/internal/mergeRight.d.ts +0 -5
  86. package/lib/types/utils/internal/parseGraphQLRequest.d.ts +0 -23
  87. package/lib/types/utils/internal/parseMultipartData.d.ts +0 -6
  88. package/lib/types/utils/internal/pipeEvents.d.ts +0 -6
  89. package/lib/types/utils/internal/requestHandlerUtils.d.ts +0 -4
  90. package/lib/types/utils/internal/requestIntegrityCheck.d.ts +0 -2
  91. package/lib/types/utils/internal/tryCatch.d.ts +0 -1
  92. package/lib/types/utils/internal/uuidv4.d.ts +0 -1
  93. package/lib/types/utils/logging/getStatusCodeColor.d.ts +0 -9
  94. package/lib/types/utils/logging/getTimestamp.d.ts +0 -4
  95. package/lib/types/utils/logging/prepareRequest.d.ts +0 -23
  96. package/lib/types/utils/logging/prepareResponse.d.ts +0 -10
  97. package/lib/types/utils/matching/matchRequestUrl.d.ts +0 -17
  98. package/lib/types/utils/matching/normalizePath.d.ts +0 -9
  99. package/lib/types/utils/request/getPublicUrlFromRequest.d.ts +0 -6
  100. package/lib/types/utils/request/getRequestCookies.d.ts +0 -7
  101. package/lib/types/utils/request/onUnhandledRequest.d.ts +0 -8
  102. package/lib/types/utils/request/parseBody.d.ts +0 -5
  103. package/lib/types/utils/request/parseIsomorphicRequest.d.ts +0 -6
  104. package/lib/types/utils/request/parseWorkerRequest.d.ts +0 -7
  105. package/lib/types/utils/request/pruneGetRequestBody.d.ts +0 -7
  106. package/lib/types/utils/request/readResponseCookies.d.ts +0 -3
  107. package/lib/types/utils/request/setRequestCookies.d.ts +0 -9
  108. package/lib/types/utils/url/cleanUrl.d.ts +0 -5
  109. package/lib/types/utils/url/getAbsoluteUrl.d.ts +0 -4
  110. package/lib/types/utils/url/getAbsoluteWorkerUrl.d.ts +0 -5
  111. package/lib/types/utils/url/isAbsoluteUrl.d.ts +0 -4
  112. package/lib/types/utils/worker/createFallbackRequestListener.d.ts +0 -4
  113. package/lib/types/utils/worker/createRequestListener.d.ts +0 -4
  114. package/lib/types/utils/worker/createResponseListener.d.ts +0 -3
  115. package/lib/umd/index.js +0 -31617
  116. package/lib/umd/mockServiceWorker.js +0 -338
  117. package/native/lib/index.js +0 -6384
  118. package/node/lib/index.js +0 -8276
@@ -0,0 +1,1291 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
21
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
22
+ }) : x)(function(x) {
23
+ if (typeof require !== "undefined")
24
+ return require.apply(this, arguments);
25
+ throw new Error('Dynamic require of "' + x + '" is not supported');
26
+ });
27
+ var __objRest = (source, exclude) => {
28
+ var target = {};
29
+ for (var prop in source)
30
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
31
+ target[prop] = source[prop];
32
+ if (source != null && __getOwnPropSymbols)
33
+ for (var prop of __getOwnPropSymbols(source)) {
34
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
35
+ target[prop] = source[prop];
36
+ }
37
+ return target;
38
+ };
39
+
40
+ // src/native/index.ts
41
+ import { XMLHttpRequestInterceptor } from "@mswjs/interceptors/lib/interceptors/XMLHttpRequest";
42
+
43
+ // src/node/createSetupServer.ts
44
+ import { bold } from "chalk";
45
+ import { isNodeProcess as isNodeProcess3 } from "is-node-process";
46
+ import { StrictEventEmitter } from "strict-event-emitter";
47
+ import {
48
+ BatchInterceptor
49
+ } from "@mswjs/interceptors";
50
+
51
+ // src/utils/internal/requestHandlerUtils.ts
52
+ function use(currentHandlers, ...handlers) {
53
+ currentHandlers.unshift(...handlers);
54
+ }
55
+ function restoreHandlers(handlers) {
56
+ handlers.forEach((handler) => {
57
+ handler.markAsSkipped(false);
58
+ });
59
+ }
60
+ function resetHandlers(initialHandlers, ...nextHandlers) {
61
+ return nextHandlers.length > 0 ? [...nextHandlers] : [...initialHandlers];
62
+ }
63
+
64
+ // src/handlers/RequestHandler.ts
65
+ import { Headers as Headers3 } from "headers-polyfill";
66
+
67
+ // src/response.ts
68
+ import { Headers } from "headers-polyfill";
69
+
70
+ // src/utils/internal/compose.ts
71
+ function compose(...fns) {
72
+ return (...args) => {
73
+ return fns.reduceRight((leftFn, rightFn) => {
74
+ return leftFn instanceof Promise ? Promise.resolve(leftFn).then(rightFn) : rightFn(leftFn);
75
+ }, args[0]);
76
+ };
77
+ }
78
+
79
+ // src/utils/NetworkError.ts
80
+ var NetworkError = class extends Error {
81
+ constructor(message) {
82
+ super(message);
83
+ this.name = "NetworkError";
84
+ }
85
+ };
86
+
87
+ // src/response.ts
88
+ var defaultResponse = {
89
+ status: 200,
90
+ statusText: "OK",
91
+ body: null,
92
+ delay: 0,
93
+ once: false,
94
+ passthrough: false
95
+ };
96
+ var defaultResponseTransformers = [];
97
+ function createResponseComposition(responseOverrides, defaultTransformers = defaultResponseTransformers) {
98
+ return async (...transformers) => {
99
+ const initialResponse = Object.assign({}, defaultResponse, {
100
+ headers: new Headers({
101
+ "x-powered-by": "msw"
102
+ })
103
+ }, responseOverrides);
104
+ const resolvedTransformers = [
105
+ ...defaultTransformers,
106
+ ...transformers
107
+ ].filter(Boolean);
108
+ const resolvedResponse = resolvedTransformers.length > 0 ? compose(...resolvedTransformers)(initialResponse) : initialResponse;
109
+ return resolvedResponse;
110
+ };
111
+ }
112
+ var response = Object.assign(createResponseComposition(), {
113
+ once: createResponseComposition({ once: true }),
114
+ networkError(message) {
115
+ throw new NetworkError(message);
116
+ }
117
+ });
118
+
119
+ // src/utils/internal/getCallFrame.ts
120
+ var SOURCE_FRAME = /\/msw\/src\/(.+)/;
121
+ var BUILD_FRAME = /(node_modules)?[\/\\]lib[\/\\](umd|esm|iief|cjs)[\/\\]|^[^\/\\]*$/;
122
+ function getCallFrame(error2) {
123
+ const stack = error2.stack;
124
+ if (!stack) {
125
+ return;
126
+ }
127
+ const frames = stack.split("\n").slice(1);
128
+ const declarationFrame = frames.find((frame) => {
129
+ return !(SOURCE_FRAME.test(frame) || BUILD_FRAME.test(frame));
130
+ });
131
+ if (!declarationFrame) {
132
+ return;
133
+ }
134
+ const declarationPath = declarationFrame.replace(/\s*at [^()]*\(([^)]+)\)/, "$1").replace(/^@/, "");
135
+ return declarationPath;
136
+ }
137
+
138
+ // src/utils/internal/isIterable.ts
139
+ function isIterable(fn) {
140
+ if (!fn) {
141
+ return false;
142
+ }
143
+ return typeof fn[Symbol.iterator] == "function";
144
+ }
145
+
146
+ // src/context/status.ts
147
+ import statuses from "statuses/codes.json";
148
+ var status = (statusCode, statusText) => {
149
+ return (res) => {
150
+ res.status = statusCode;
151
+ res.statusText = statusText || statuses[String(statusCode)];
152
+ return res;
153
+ };
154
+ };
155
+
156
+ // src/context/set.ts
157
+ import { objectToHeaders } from "headers-polyfill";
158
+ function set(...args) {
159
+ return (res) => {
160
+ const [name, value] = args;
161
+ if (typeof name === "string") {
162
+ res.headers.append(name, value);
163
+ } else {
164
+ const headers = objectToHeaders(name);
165
+ headers.forEach((value2, name2) => {
166
+ res.headers.append(name2, value2);
167
+ });
168
+ }
169
+ return res;
170
+ };
171
+ }
172
+
173
+ // src/context/delay.ts
174
+ import { isNodeProcess } from "is-node-process";
175
+ var SET_TIMEOUT_MAX_ALLOWED_INT = 2147483647;
176
+ var MIN_SERVER_RESPONSE_TIME = 100;
177
+ var MAX_SERVER_RESPONSE_TIME = 400;
178
+ var NODE_SERVER_RESPONSE_TIME = 5;
179
+ var getRandomServerResponseTime = () => {
180
+ if (isNodeProcess()) {
181
+ return NODE_SERVER_RESPONSE_TIME;
182
+ }
183
+ return Math.floor(Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) + MIN_SERVER_RESPONSE_TIME);
184
+ };
185
+ var delay = (durationOrMode) => {
186
+ return (res) => {
187
+ let delayTime;
188
+ if (typeof durationOrMode === "string") {
189
+ switch (durationOrMode) {
190
+ case "infinite": {
191
+ delayTime = SET_TIMEOUT_MAX_ALLOWED_INT;
192
+ break;
193
+ }
194
+ case "real": {
195
+ delayTime = getRandomServerResponseTime();
196
+ break;
197
+ }
198
+ default: {
199
+ 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".`);
200
+ }
201
+ }
202
+ } else if (typeof durationOrMode === "undefined") {
203
+ delayTime = getRandomServerResponseTime();
204
+ } else {
205
+ if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) {
206
+ 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.`);
207
+ }
208
+ delayTime = durationOrMode;
209
+ }
210
+ res.delay = delayTime;
211
+ return res;
212
+ };
213
+ };
214
+
215
+ // src/context/fetch.ts
216
+ import { isNodeProcess as isNodeProcess2 } from "is-node-process";
217
+ import { Headers as Headers2 } from "headers-polyfill";
218
+ var useFetch = isNodeProcess2() ? __require("node-fetch") : window.fetch;
219
+ var augmentRequestInit = (requestInit) => {
220
+ const headers = new Headers2(requestInit.headers);
221
+ headers.set("x-msw-bypass", "true");
222
+ return __spreadProps(__spreadValues({}, requestInit), {
223
+ headers: headers.all()
224
+ });
225
+ };
226
+ var createFetchRequestParameters = (input) => {
227
+ const { body: body2, method } = input;
228
+ const requestParameters = __spreadProps(__spreadValues({}, input), {
229
+ body: void 0
230
+ });
231
+ if (["GET", "HEAD"].includes(method)) {
232
+ return requestParameters;
233
+ }
234
+ if (typeof body2 === "object" || typeof body2 === "number" || typeof body2 === "boolean") {
235
+ requestParameters.body = JSON.stringify(body2);
236
+ } else {
237
+ requestParameters.body = body2;
238
+ }
239
+ return requestParameters;
240
+ };
241
+ var fetch = (input, requestInit = {}) => {
242
+ if (typeof input === "string") {
243
+ return useFetch(input, augmentRequestInit(requestInit));
244
+ }
245
+ const requestParameters = createFetchRequestParameters(input);
246
+ const derivedRequestInit = augmentRequestInit(requestParameters);
247
+ return useFetch(input.url.href, derivedRequestInit);
248
+ };
249
+
250
+ // src/handlers/RequestHandler.ts
251
+ var defaultContext = {
252
+ status,
253
+ set,
254
+ delay,
255
+ fetch
256
+ };
257
+ var RequestHandler = class {
258
+ constructor(options) {
259
+ this.shouldSkip = false;
260
+ this.ctx = options.ctx || defaultContext;
261
+ this.resolver = options.resolver;
262
+ const callFrame = getCallFrame(new Error());
263
+ this.info = __spreadProps(__spreadValues({}, options.info), {
264
+ callFrame
265
+ });
266
+ }
267
+ parse(_request, _resolutionContext) {
268
+ return null;
269
+ }
270
+ test(request, resolutionContext) {
271
+ return this.predicate(request, this.parse(request, resolutionContext), resolutionContext);
272
+ }
273
+ getPublicRequest(request, _parsedResult) {
274
+ return request;
275
+ }
276
+ markAsSkipped(shouldSkip = true) {
277
+ this.shouldSkip = shouldSkip;
278
+ }
279
+ async run(request, resolutionContext) {
280
+ if (this.shouldSkip) {
281
+ return null;
282
+ }
283
+ const parsedResult = this.parse(request, resolutionContext);
284
+ const shouldIntercept = this.predicate(request, parsedResult, resolutionContext);
285
+ if (!shouldIntercept) {
286
+ return null;
287
+ }
288
+ const publicRequest = this.getPublicRequest(request, parsedResult);
289
+ const executeResolver = this.wrapResolver(this.resolver);
290
+ const mockedResponse = await executeResolver(publicRequest, response, this.ctx);
291
+ return this.createExecutionResult(parsedResult, publicRequest, mockedResponse);
292
+ }
293
+ wrapResolver(resolver) {
294
+ return async (req, res, ctx) => {
295
+ const result = this.resolverGenerator || await resolver(req, res, ctx);
296
+ if (isIterable(result)) {
297
+ const { value, done } = result[Symbol.iterator]().next();
298
+ const nextResponse = await value;
299
+ if (!nextResponse && done) {
300
+ return this.resolverGeneratorResult;
301
+ }
302
+ if (!this.resolverGenerator) {
303
+ this.resolverGenerator = result;
304
+ }
305
+ this.resolverGeneratorResult = nextResponse;
306
+ return nextResponse;
307
+ }
308
+ return result;
309
+ };
310
+ }
311
+ createExecutionResult(parsedResult, request, response2) {
312
+ return {
313
+ handler: this,
314
+ parsedResult: parsedResult || null,
315
+ request,
316
+ response: response2 || null
317
+ };
318
+ }
319
+ };
320
+ function passthrough() {
321
+ return {
322
+ status: 101,
323
+ statusText: "Continue",
324
+ headers: new Headers3(),
325
+ body: null,
326
+ passthrough: true,
327
+ once: false
328
+ };
329
+ }
330
+
331
+ // src/utils/internal/jsonParse.ts
332
+ function jsonParse(value) {
333
+ try {
334
+ return JSON.parse(value);
335
+ } catch (error2) {
336
+ return void 0;
337
+ }
338
+ }
339
+
340
+ // src/utils/internal/parseMultipartData.ts
341
+ import { stringToHeaders } from "headers-polyfill";
342
+ function parseContentHeaders(headersString) {
343
+ var _a, _b;
344
+ const headers = stringToHeaders(headersString);
345
+ const contentType = headers.get("content-type") || "text/plain";
346
+ const disposition = headers.get("content-disposition");
347
+ if (!disposition) {
348
+ throw new Error('"Content-Disposition" header is required.');
349
+ }
350
+ const directives = disposition.split(";").reduce((acc, chunk) => {
351
+ const [name2, ...rest] = chunk.trim().split("=");
352
+ acc[name2] = rest.join("=");
353
+ return acc;
354
+ }, {});
355
+ const name = (_a = directives.name) == null ? void 0 : _a.slice(1, -1);
356
+ const filename = (_b = directives.filename) == null ? void 0 : _b.slice(1, -1);
357
+ return {
358
+ name,
359
+ filename,
360
+ contentType
361
+ };
362
+ }
363
+ function parseMultipartData(data2, headers) {
364
+ const contentType = headers == null ? void 0 : headers.get("content-type");
365
+ if (!contentType) {
366
+ return void 0;
367
+ }
368
+ const [, ...directives] = contentType.split(/; */);
369
+ const boundary = directives.filter((d) => d.startsWith("boundary=")).map((s) => s.replace(/^boundary=/, ""))[0];
370
+ if (!boundary) {
371
+ return void 0;
372
+ }
373
+ const boundaryRegExp = new RegExp(`--+${boundary}`);
374
+ const fields = data2.split(boundaryRegExp).filter((chunk) => chunk.startsWith("\r\n") && chunk.endsWith("\r\n")).map((chunk) => chunk.trimStart().replace(/\r\n$/, ""));
375
+ if (!fields.length) {
376
+ return void 0;
377
+ }
378
+ const parsedBody = {};
379
+ try {
380
+ for (const field of fields) {
381
+ const [contentHeaders, ...rest] = field.split("\r\n\r\n");
382
+ const contentBody = rest.join("\r\n\r\n");
383
+ const { contentType: contentType2, filename, name } = parseContentHeaders(contentHeaders);
384
+ const value = filename === void 0 ? contentBody : new File([contentBody], filename, { type: contentType2 });
385
+ const parsedValue = parsedBody[name];
386
+ if (parsedValue === void 0) {
387
+ parsedBody[name] = value;
388
+ } else if (Array.isArray(parsedValue)) {
389
+ parsedBody[name] = [...parsedValue, value];
390
+ } else {
391
+ parsedBody[name] = [parsedValue, value];
392
+ }
393
+ }
394
+ return parsedBody;
395
+ } catch (error2) {
396
+ return void 0;
397
+ }
398
+ }
399
+
400
+ // src/utils/request/parseBody.ts
401
+ function parseBody(body2, headers) {
402
+ var _a;
403
+ if (!body2) {
404
+ return body2;
405
+ }
406
+ const contentType = ((_a = headers == null ? void 0 : headers.get("content-type")) == null ? void 0 : _a.toLowerCase()) || "";
407
+ const hasMultipartContent = contentType.startsWith("multipart/form-data");
408
+ if (hasMultipartContent && typeof body2 !== "object") {
409
+ return parseMultipartData(body2.toString(), headers) || body2;
410
+ }
411
+ const hasJsonContent = contentType.includes("json");
412
+ if (hasJsonContent && typeof body2 !== "object") {
413
+ return jsonParse(body2.toString()) || body2;
414
+ }
415
+ return body2;
416
+ }
417
+
418
+ // src/utils/request/setRequestCookies.ts
419
+ import * as cookieUtils2 from "cookie";
420
+ import { store } from "@mswjs/cookies";
421
+
422
+ // src/utils/request/getRequestCookies.ts
423
+ import * as cookieUtils from "cookie";
424
+ function getAllCookies() {
425
+ return cookieUtils.parse(document.cookie);
426
+ }
427
+ function getRequestCookies(request) {
428
+ if (typeof document === "undefined" || typeof location === "undefined") {
429
+ return {};
430
+ }
431
+ switch (request.credentials) {
432
+ case "same-origin": {
433
+ return location.origin === request.url.origin ? getAllCookies() : {};
434
+ }
435
+ case "include": {
436
+ return getAllCookies();
437
+ }
438
+ default: {
439
+ return {};
440
+ }
441
+ }
442
+ }
443
+
444
+ // src/utils/request/setRequestCookies.ts
445
+ function setRequestCookies(request) {
446
+ var _a;
447
+ const requestCookiesString = request.headers.get("cookie");
448
+ store.hydrate();
449
+ const cookiesFromStore = Array.from((_a = store.get(__spreadProps(__spreadValues({}, request), { url: request.url.toString() }))) == null ? void 0 : _a.entries()).reduce((cookies, [name, { value }]) => {
450
+ return Object.assign(cookies, { [name.trim()]: value });
451
+ }, {});
452
+ const cookiesFromDocument = getRequestCookies(request);
453
+ const forwardedCookies = __spreadValues(__spreadValues({}, cookiesFromDocument), cookiesFromStore);
454
+ for (const [name, value] of Object.entries(forwardedCookies)) {
455
+ request.headers.append("cookie", `${name}=${value}`);
456
+ }
457
+ const ownCookies = requestCookiesString ? cookieUtils2.parse(requestCookiesString) : {};
458
+ request.cookies = __spreadValues(__spreadValues(__spreadValues({}, request.cookies), forwardedCookies), ownCookies);
459
+ }
460
+
461
+ // src/utils/request/parseIsomorphicRequest.ts
462
+ function parseIsomorphicRequest(request) {
463
+ const mockedRequest = {
464
+ id: request.id,
465
+ url: request.url,
466
+ method: request.method,
467
+ body: parseBody(request.body, request.headers),
468
+ credentials: request.credentials || "same-origin",
469
+ headers: request.headers,
470
+ cookies: {},
471
+ redirect: "manual",
472
+ referrer: "",
473
+ keepalive: false,
474
+ cache: "default",
475
+ mode: "cors",
476
+ referrerPolicy: "no-referrer",
477
+ integrity: "",
478
+ destination: "document",
479
+ bodyUsed: false,
480
+ passthrough
481
+ };
482
+ setRequestCookies(mockedRequest);
483
+ return mockedRequest;
484
+ }
485
+
486
+ // src/utils/handleRequest.ts
487
+ import { until } from "@open-draft/until";
488
+
489
+ // src/utils/getResponse.ts
490
+ var getResponse = async (request, handlers, resolutionContext) => {
491
+ const relevantHandlers = handlers.filter((handler) => {
492
+ return handler.test(request, resolutionContext);
493
+ });
494
+ if (relevantHandlers.length === 0) {
495
+ return {
496
+ handler: void 0,
497
+ response: void 0
498
+ };
499
+ }
500
+ const result = await relevantHandlers.reduce(async (executionResult, handler) => {
501
+ const previousResults = await executionResult;
502
+ if (!!(previousResults == null ? void 0 : previousResults.response)) {
503
+ return executionResult;
504
+ }
505
+ const result2 = await handler.run(request, resolutionContext);
506
+ if (result2 === null || result2.handler.shouldSkip) {
507
+ return null;
508
+ }
509
+ if (!result2.response) {
510
+ return {
511
+ request: result2.request,
512
+ handler: result2.handler,
513
+ response: void 0,
514
+ parsedResult: result2.parsedResult
515
+ };
516
+ }
517
+ if (result2.response.once) {
518
+ handler.markAsSkipped(true);
519
+ }
520
+ return result2;
521
+ }, Promise.resolve(null));
522
+ if (!result) {
523
+ return {
524
+ handler: void 0,
525
+ response: void 0
526
+ };
527
+ }
528
+ return {
529
+ handler: result.handler,
530
+ publicRequest: result.request,
531
+ parsedRequest: result.parsedResult,
532
+ response: result.response
533
+ };
534
+ };
535
+
536
+ // src/utils/internal/devUtils.ts
537
+ import { format } from "outvariant";
538
+ var LIBRARY_PREFIX = "[MSW]";
539
+ function formatMessage(message, ...positionals) {
540
+ const interpolatedMessage = format(message, ...positionals);
541
+ return `${LIBRARY_PREFIX} ${interpolatedMessage}`;
542
+ }
543
+ function warn(message, ...positionals) {
544
+ console.warn(formatMessage(message, ...positionals));
545
+ }
546
+ function error(message, ...positionals) {
547
+ console.error(formatMessage(message, ...positionals));
548
+ }
549
+ var devUtils = {
550
+ formatMessage,
551
+ warn,
552
+ error
553
+ };
554
+
555
+ // src/utils/request/onUnhandledRequest.ts
556
+ import getStringMatchScore from "js-levenshtein";
557
+
558
+ // src/utils/internal/parseGraphQLRequest.ts
559
+ import {
560
+ parse as parse3
561
+ } from "graphql";
562
+
563
+ // src/utils/request/getPublicUrlFromRequest.ts
564
+ var getPublicUrlFromRequest = (request) => {
565
+ return request.referrer.startsWith(request.url.origin) ? request.url.pathname : new URL(request.url.pathname, `${request.url.protocol}//${request.url.host}`).href;
566
+ };
567
+
568
+ // src/utils/internal/parseGraphQLRequest.ts
569
+ function parseDocumentNode(node) {
570
+ var _a;
571
+ const operationDef = node.definitions.find((def) => {
572
+ return def.kind === "OperationDefinition";
573
+ });
574
+ return {
575
+ operationType: operationDef == null ? void 0 : operationDef.operation,
576
+ operationName: (_a = operationDef == null ? void 0 : operationDef.name) == null ? void 0 : _a.value
577
+ };
578
+ }
579
+ function parseQuery(query) {
580
+ try {
581
+ const ast = parse3(query);
582
+ return parseDocumentNode(ast);
583
+ } catch (error2) {
584
+ return error2;
585
+ }
586
+ }
587
+ function extractMultipartVariables(variables, map, files) {
588
+ const operations = { variables };
589
+ for (const [key, pathArray] of Object.entries(map)) {
590
+ if (!(key in files)) {
591
+ throw new Error(`Given files do not have a key '${key}' .`);
592
+ }
593
+ for (const dotPath of pathArray) {
594
+ const [lastPath, ...reversedPaths] = dotPath.split(".").reverse();
595
+ const paths = reversedPaths.reverse();
596
+ let target = operations;
597
+ for (const path of paths) {
598
+ if (!(path in target)) {
599
+ throw new Error(`Property '${paths}' is not in operations.`);
600
+ }
601
+ target = target[path];
602
+ }
603
+ target[lastPath] = files[key];
604
+ }
605
+ }
606
+ return operations.variables;
607
+ }
608
+ function getGraphQLInput(request) {
609
+ var _a, _b;
610
+ switch (request.method) {
611
+ case "GET": {
612
+ const query = request.url.searchParams.get("query");
613
+ const variables = request.url.searchParams.get("variables") || "";
614
+ return {
615
+ query,
616
+ variables: jsonParse(variables)
617
+ };
618
+ }
619
+ case "POST": {
620
+ if ((_a = request.body) == null ? void 0 : _a.query) {
621
+ const { query, variables } = request.body;
622
+ return {
623
+ query,
624
+ variables
625
+ };
626
+ }
627
+ if ((_b = request.body) == null ? void 0 : _b.operations) {
628
+ const _c = request.body, { operations, map } = _c, files = __objRest(_c, ["operations", "map"]);
629
+ const parsedOperations = jsonParse(operations) || {};
630
+ if (!parsedOperations.query) {
631
+ return null;
632
+ }
633
+ const parsedMap = jsonParse(map || "") || {};
634
+ const variables = parsedOperations.variables ? extractMultipartVariables(parsedOperations.variables, parsedMap, files) : {};
635
+ return {
636
+ query: parsedOperations.query,
637
+ variables
638
+ };
639
+ }
640
+ }
641
+ default:
642
+ return null;
643
+ }
644
+ }
645
+ function parseGraphQLRequest(request) {
646
+ const input = getGraphQLInput(request);
647
+ if (!input || !input.query) {
648
+ return void 0;
649
+ }
650
+ const { query, variables } = input;
651
+ const parsedResult = parseQuery(query);
652
+ if (parsedResult instanceof Error) {
653
+ const requestPublicUrl = getPublicUrlFromRequest(request);
654
+ throw new Error(devUtils.formatMessage('Failed to intercept a GraphQL request to "%s %s": cannot parse query. See the error message from the parser below.\n\n%s', request.method, requestPublicUrl, parsedResult.message));
655
+ }
656
+ return {
657
+ operationType: parsedResult.operationType,
658
+ operationName: parsedResult.operationName,
659
+ variables
660
+ };
661
+ }
662
+
663
+ // src/utils/internal/isStringEqual.ts
664
+ function isStringEqual(actual, expected) {
665
+ return actual.toLowerCase() === expected.toLowerCase();
666
+ }
667
+
668
+ // src/context/cookie.ts
669
+ import * as cookieUtils3 from "cookie";
670
+ var cookie = (name, value, options) => {
671
+ return (res) => {
672
+ const serializedCookie = cookieUtils3.serialize(name, value, options);
673
+ res.headers.set("Set-Cookie", serializedCookie);
674
+ if (typeof document !== "undefined") {
675
+ document.cookie = serializedCookie;
676
+ }
677
+ return res;
678
+ };
679
+ };
680
+
681
+ // src/context/body.ts
682
+ var body = (value) => {
683
+ return (res) => {
684
+ res.body = value;
685
+ return res;
686
+ };
687
+ };
688
+
689
+ // src/utils/internal/isObject.ts
690
+ function isObject(value) {
691
+ return value != null && typeof value === "object" && !Array.isArray(value);
692
+ }
693
+
694
+ // src/utils/internal/mergeRight.ts
695
+ function mergeRight(left, right) {
696
+ return Object.entries(right).reduce((result, [key, rightValue]) => {
697
+ const leftValue = result[key];
698
+ if (Array.isArray(leftValue) && Array.isArray(rightValue)) {
699
+ result[key] = leftValue.concat(rightValue);
700
+ return result;
701
+ }
702
+ if (isObject(leftValue) && isObject(rightValue)) {
703
+ result[key] = mergeRight(leftValue, rightValue);
704
+ return result;
705
+ }
706
+ result[key] = rightValue;
707
+ return result;
708
+ }, Object.assign({}, left));
709
+ }
710
+
711
+ // src/context/json.ts
712
+ var json = (body2) => {
713
+ return (res) => {
714
+ res.headers.set("Content-Type", "application/json");
715
+ res.body = JSON.stringify(body2);
716
+ return res;
717
+ };
718
+ };
719
+
720
+ // src/context/data.ts
721
+ var data = (payload) => {
722
+ return (res) => {
723
+ const prevBody = jsonParse(res.body) || {};
724
+ const nextBody = mergeRight(prevBody, { data: payload });
725
+ return json(nextBody)(res);
726
+ };
727
+ };
728
+
729
+ // src/context/extensions.ts
730
+ var extensions = (payload) => {
731
+ return (res) => {
732
+ const prevBody = jsonParse(res.body) || {};
733
+ const nextBody = mergeRight(prevBody, { extensions: payload });
734
+ return json(nextBody)(res);
735
+ };
736
+ };
737
+
738
+ // src/context/errors.ts
739
+ var errors = (errorsList) => {
740
+ return (res) => {
741
+ if (errorsList == null) {
742
+ return res;
743
+ }
744
+ const prevBody = jsonParse(res.body) || {};
745
+ const nextBody = mergeRight(prevBody, { errors: errorsList });
746
+ return json(nextBody)(res);
747
+ };
748
+ };
749
+
750
+ // src/context/text.ts
751
+ var text = (body2) => {
752
+ return (res) => {
753
+ res.headers.set("Content-Type", "text/plain");
754
+ res.body = body2;
755
+ return res;
756
+ };
757
+ };
758
+
759
+ // src/context/xml.ts
760
+ var xml = (body2) => {
761
+ return (res) => {
762
+ res.headers.set("Content-Type", "text/xml");
763
+ res.body = body2;
764
+ return res;
765
+ };
766
+ };
767
+
768
+ // src/utils/logging/getStatusCodeColor.ts
769
+ function getStatusCodeColor(status2) {
770
+ if (status2 < 300) {
771
+ return "#69AB32" /* Success */;
772
+ }
773
+ if (status2 < 400) {
774
+ return "#F0BB4B" /* Warning */;
775
+ }
776
+ return "#E95F5D" /* Danger */;
777
+ }
778
+
779
+ // src/utils/logging/getTimestamp.ts
780
+ function getTimestamp() {
781
+ const now = new Date();
782
+ return [now.getHours(), now.getMinutes(), now.getSeconds()].map(String).map((chunk) => chunk.slice(0, 2)).map((chunk) => chunk.padStart(2, "0")).join(":");
783
+ }
784
+
785
+ // src/utils/logging/prepareRequest.ts
786
+ function prepareRequest(request) {
787
+ return __spreadProps(__spreadValues({}, request), {
788
+ headers: request.headers.all()
789
+ });
790
+ }
791
+
792
+ // src/utils/logging/prepareResponse.ts
793
+ import { objectToHeaders as objectToHeaders2 } from "headers-polyfill";
794
+ function prepareResponse(res) {
795
+ const responseHeaders = objectToHeaders2(res.headers);
796
+ return __spreadProps(__spreadValues({}, res), {
797
+ body: parseBody(res.body, responseHeaders)
798
+ });
799
+ }
800
+
801
+ // src/utils/matching/matchRequestUrl.ts
802
+ import { match } from "path-to-regexp";
803
+ import { getCleanUrl } from "@mswjs/interceptors/lib/utils/getCleanUrl";
804
+
805
+ // src/utils/url/cleanUrl.ts
806
+ var REDUNDANT_CHARACTERS_EXP = /[\?|#].*$/g;
807
+ function getSearchParams(path) {
808
+ return new URL(`/${path}`, "http://localhost").searchParams;
809
+ }
810
+ function cleanUrl(path) {
811
+ return path.replace(REDUNDANT_CHARACTERS_EXP, "");
812
+ }
813
+
814
+ // src/utils/url/isAbsoluteUrl.ts
815
+ function isAbsoluteUrl(url) {
816
+ return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
817
+ }
818
+
819
+ // src/utils/url/getAbsoluteUrl.ts
820
+ function getAbsoluteUrl(path, baseUrl) {
821
+ if (isAbsoluteUrl(path)) {
822
+ return path;
823
+ }
824
+ if (path.startsWith("*")) {
825
+ return path;
826
+ }
827
+ const origin = baseUrl || typeof document !== "undefined" && document.baseURI;
828
+ return origin ? decodeURI(new URL(encodeURI(path), origin).href) : path;
829
+ }
830
+
831
+ // src/utils/matching/normalizePath.ts
832
+ function normalizePath(path, baseUrl) {
833
+ if (path instanceof RegExp) {
834
+ return path;
835
+ }
836
+ const maybeAbsoluteUrl = getAbsoluteUrl(path, baseUrl);
837
+ return cleanUrl(maybeAbsoluteUrl);
838
+ }
839
+
840
+ // src/utils/matching/matchRequestUrl.ts
841
+ function coercePath(path) {
842
+ return path.replace(/([:a-zA-Z_-]*)(\*{1,2})+/g, (_, parameterName, wildcard) => {
843
+ const expression = "(.*)";
844
+ if (!parameterName) {
845
+ return expression;
846
+ }
847
+ return parameterName.startsWith(":") ? `${parameterName}${wildcard}` : `${parameterName}${expression}`;
848
+ }).replace(/([^\/])(:)(?=\d+)/, "$1\\$2").replace(/^([^\/]+)(:)(?=\/\/)/, "$1\\$2");
849
+ }
850
+ function matchRequestUrl(url, path, baseUrl) {
851
+ const normalizedPath = normalizePath(path, baseUrl);
852
+ const cleanPath = typeof normalizedPath === "string" ? coercePath(normalizedPath) : normalizedPath;
853
+ const cleanUrl2 = getCleanUrl(url);
854
+ const result = match(cleanPath, { decode: decodeURIComponent })(cleanUrl2);
855
+ const params = result && result.params || {};
856
+ return {
857
+ matches: result !== false,
858
+ params
859
+ };
860
+ }
861
+
862
+ // src/handlers/RestHandler.ts
863
+ var restContext = __spreadProps(__spreadValues({}, defaultContext), {
864
+ cookie,
865
+ body,
866
+ text,
867
+ json,
868
+ xml
869
+ });
870
+ var RestHandler = class extends RequestHandler {
871
+ constructor(method, path, resolver) {
872
+ super({
873
+ info: {
874
+ header: `${method} ${path}`,
875
+ path,
876
+ method
877
+ },
878
+ ctx: restContext,
879
+ resolver
880
+ });
881
+ this.checkRedundantQueryParameters();
882
+ }
883
+ checkRedundantQueryParameters() {
884
+ const { method, path } = this.info;
885
+ if (path instanceof RegExp) {
886
+ return;
887
+ }
888
+ const url = cleanUrl(path);
889
+ if (url === path) {
890
+ return;
891
+ }
892
+ const searchParams = getSearchParams(path);
893
+ const queryParams = [];
894
+ searchParams.forEach((_, paramName) => {
895
+ queryParams.push(paramName);
896
+ });
897
+ devUtils.warn(`Found a redundant usage of query parameters in the request handler URL for "${method} ${path}". Please match against a path instead and access query parameters in the response resolver function using "req.url.searchParams".`);
898
+ }
899
+ parse(request, resolutionContext) {
900
+ return matchRequestUrl(request.url, this.info.path, resolutionContext == null ? void 0 : resolutionContext.baseUrl);
901
+ }
902
+ getPublicRequest(request, parsedResult) {
903
+ return __spreadProps(__spreadValues({}, request), {
904
+ params: parsedResult.params || {}
905
+ });
906
+ }
907
+ predicate(request, parsedResult) {
908
+ const matchesMethod = this.info.method instanceof RegExp ? this.info.method.test(request.method) : isStringEqual(this.info.method, request.method);
909
+ return matchesMethod && parsedResult.matches;
910
+ }
911
+ log(request, response2) {
912
+ const publicUrl = getPublicUrlFromRequest(request);
913
+ const loggedRequest = prepareRequest(request);
914
+ const loggedResponse = prepareResponse(response2);
915
+ const statusColor = getStatusCodeColor(response2.status);
916
+ console.groupCollapsed(devUtils.formatMessage("%s %s %s (%c%s%c)"), getTimestamp(), request.method, publicUrl, `color:${statusColor}`, `${response2.status} ${response2.statusText}`, "color:inherit");
917
+ console.log("Request", loggedRequest);
918
+ console.log("Handler:", {
919
+ mask: this.info.path,
920
+ resolver: this.resolver
921
+ });
922
+ console.log("Response", loggedResponse);
923
+ console.groupEnd();
924
+ }
925
+ };
926
+
927
+ // src/utils/internal/tryCatch.ts
928
+ function tryCatch(fn, onException) {
929
+ try {
930
+ const result = fn();
931
+ return result;
932
+ } catch (error2) {
933
+ onException == null ? void 0 : onException(error2);
934
+ }
935
+ }
936
+
937
+ // src/handlers/GraphQLHandler.ts
938
+ var graphqlContext = __spreadProps(__spreadValues({}, defaultContext), {
939
+ data,
940
+ extensions,
941
+ errors,
942
+ cookie
943
+ });
944
+ function isDocumentNode(value) {
945
+ if (value == null) {
946
+ return false;
947
+ }
948
+ return typeof value === "object" && "kind" in value && "definitions" in value;
949
+ }
950
+ var GraphQLHandler = class extends RequestHandler {
951
+ constructor(operationType, operationName, endpoint, resolver) {
952
+ let resolvedOperationName = operationName;
953
+ if (isDocumentNode(operationName)) {
954
+ const parsedNode = parseDocumentNode(operationName);
955
+ if (parsedNode.operationType !== operationType) {
956
+ throw new Error(`Failed to create a GraphQL handler: provided a DocumentNode with a mismatched operation type (expected "${operationType}", but got "${parsedNode.operationType}").`);
957
+ }
958
+ if (!parsedNode.operationName) {
959
+ throw new Error(`Failed to create a GraphQL handler: provided a DocumentNode with no operation name.`);
960
+ }
961
+ resolvedOperationName = parsedNode.operationName;
962
+ }
963
+ const header = operationType === "all" ? `${operationType} (origin: ${endpoint.toString()})` : `${operationType} ${resolvedOperationName} (origin: ${endpoint.toString()})`;
964
+ super({
965
+ info: {
966
+ header,
967
+ operationType,
968
+ operationName: resolvedOperationName
969
+ },
970
+ ctx: graphqlContext,
971
+ resolver
972
+ });
973
+ this.endpoint = endpoint;
974
+ }
975
+ parse(request) {
976
+ return tryCatch(() => parseGraphQLRequest(request), (error2) => console.error(error2.message));
977
+ }
978
+ getPublicRequest(request, parsedResult) {
979
+ return __spreadProps(__spreadValues({}, request), {
980
+ variables: (parsedResult == null ? void 0 : parsedResult.variables) || {}
981
+ });
982
+ }
983
+ predicate(request, parsedResult) {
984
+ if (!parsedResult) {
985
+ return false;
986
+ }
987
+ if (!parsedResult.operationName && this.info.operationType !== "all") {
988
+ const publicUrl = getPublicUrlFromRequest(request);
989
+ devUtils.warn(`Failed to intercept a GraphQL request at "${request.method} ${publicUrl}": anonymous GraphQL operations are not supported.
990
+
991
+ Consider naming this operation or using "graphql.operation" request handler to intercept GraphQL requests regardless of their operation name/type. Read more: https://mswjs.io/docs/api/graphql/operation `);
992
+ return false;
993
+ }
994
+ const hasMatchingUrl = matchRequestUrl(request.url, this.endpoint);
995
+ const hasMatchingOperationType = this.info.operationType === "all" || parsedResult.operationType === this.info.operationType;
996
+ const hasMatchingOperationName = this.info.operationName instanceof RegExp ? this.info.operationName.test(parsedResult.operationName || "") : parsedResult.operationName === this.info.operationName;
997
+ return hasMatchingUrl.matches && hasMatchingOperationType && hasMatchingOperationName;
998
+ }
999
+ log(request, response2, handler, parsedRequest) {
1000
+ const loggedRequest = prepareRequest(request);
1001
+ const loggedResponse = prepareResponse(response2);
1002
+ const statusColor = getStatusCodeColor(response2.status);
1003
+ const requestInfo = (parsedRequest == null ? void 0 : parsedRequest.operationName) ? `${parsedRequest == null ? void 0 : parsedRequest.operationType} ${parsedRequest == null ? void 0 : parsedRequest.operationName}` : `anonymous ${parsedRequest == null ? void 0 : parsedRequest.operationType}`;
1004
+ console.groupCollapsed(devUtils.formatMessage("%s %s (%c%s%c)"), getTimestamp(), `${requestInfo}`, `color:${statusColor}`, `${response2.status} ${response2.statusText}`, "color:inherit");
1005
+ console.log("Request:", loggedRequest);
1006
+ console.log("Handler:", this);
1007
+ console.log("Response:", loggedResponse);
1008
+ console.groupEnd();
1009
+ }
1010
+ };
1011
+
1012
+ // src/utils/request/onUnhandledRequest.ts
1013
+ var MAX_MATCH_SCORE = 3;
1014
+ var MAX_SUGGESTION_COUNT = 4;
1015
+ var TYPE_MATCH_DELTA = 0.5;
1016
+ function groupHandlersByType(handlers) {
1017
+ return handlers.reduce((groups, handler) => {
1018
+ if (handler instanceof RestHandler) {
1019
+ groups.rest.push(handler);
1020
+ }
1021
+ if (handler instanceof GraphQLHandler) {
1022
+ groups.graphql.push(handler);
1023
+ }
1024
+ return groups;
1025
+ }, {
1026
+ rest: [],
1027
+ graphql: []
1028
+ });
1029
+ }
1030
+ function getRestHandlerScore() {
1031
+ return (request, handler) => {
1032
+ const { path, method } = handler.info;
1033
+ if (path instanceof RegExp || method instanceof RegExp) {
1034
+ return Infinity;
1035
+ }
1036
+ const hasSameMethod = isStringEqual(request.method, method);
1037
+ const methodScoreDelta = hasSameMethod ? TYPE_MATCH_DELTA : 0;
1038
+ const requestPublicUrl = getPublicUrlFromRequest(request);
1039
+ const score = getStringMatchScore(requestPublicUrl, path);
1040
+ return score - methodScoreDelta;
1041
+ };
1042
+ }
1043
+ function getGraphQLHandlerScore(parsedQuery) {
1044
+ return (_, handler) => {
1045
+ if (typeof parsedQuery.operationName === "undefined") {
1046
+ return Infinity;
1047
+ }
1048
+ const { operationType, operationName } = handler.info;
1049
+ if (typeof operationName !== "string") {
1050
+ return Infinity;
1051
+ }
1052
+ const hasSameOperationType = parsedQuery.operationType === operationType;
1053
+ const operationTypeScoreDelta = hasSameOperationType ? TYPE_MATCH_DELTA : 0;
1054
+ const score = getStringMatchScore(parsedQuery.operationName, operationName);
1055
+ return score - operationTypeScoreDelta;
1056
+ };
1057
+ }
1058
+ function getSuggestedHandler(request, handlers, getScore) {
1059
+ const suggestedHandlers = handlers.reduce((suggestions, handler) => {
1060
+ const score = getScore(request, handler);
1061
+ return suggestions.concat([[score, handler]]);
1062
+ }, []).sort(([leftScore], [rightScore]) => leftScore - rightScore).filter(([score]) => score <= MAX_MATCH_SCORE).slice(0, MAX_SUGGESTION_COUNT).map(([, handler]) => handler);
1063
+ return suggestedHandlers;
1064
+ }
1065
+ function getSuggestedHandlersMessage(handlers) {
1066
+ if (handlers.length > 1) {
1067
+ return `Did you mean to request one of the following resources instead?
1068
+
1069
+ ${handlers.map((handler) => ` \u2022 ${handler.info.header}`).join("\n")}`;
1070
+ }
1071
+ return `Did you mean to request "${handlers[0].info.header}" instead?`;
1072
+ }
1073
+ function onUnhandledRequest(request, handlers, strategy = "warn") {
1074
+ const parsedGraphQLQuery = tryCatch(() => parseGraphQLRequest(request));
1075
+ function generateHandlerSuggestion() {
1076
+ const handlerGroups = groupHandlersByType(handlers);
1077
+ const relevantHandlers = parsedGraphQLQuery ? handlerGroups.graphql : handlerGroups.rest;
1078
+ const suggestedHandlers = getSuggestedHandler(request, relevantHandlers, parsedGraphQLQuery ? getGraphQLHandlerScore(parsedGraphQLQuery) : getRestHandlerScore());
1079
+ return suggestedHandlers.length > 0 ? getSuggestedHandlersMessage(suggestedHandlers) : "";
1080
+ }
1081
+ function generateUnhandledRequestMessage() {
1082
+ const publicUrl = getPublicUrlFromRequest(request);
1083
+ const requestHeader = parsedGraphQLQuery ? `${parsedGraphQLQuery.operationType} ${parsedGraphQLQuery.operationName} (${request.method} ${publicUrl})` : `${request.method} ${publicUrl}`;
1084
+ const handlerSuggestion = generateHandlerSuggestion();
1085
+ const messageTemplate = [
1086
+ `captured a request without a matching request handler:`,
1087
+ ` \u2022 ${requestHeader}`,
1088
+ handlerSuggestion,
1089
+ `If you still wish to intercept this unhandled request, please create a request handler for it.
1090
+ Read more: https://mswjs.io/docs/getting-started/mocks`
1091
+ ].filter(Boolean);
1092
+ return messageTemplate.join("\n\n");
1093
+ }
1094
+ function applyStrategy(strategy2) {
1095
+ const message = generateUnhandledRequestMessage();
1096
+ switch (strategy2) {
1097
+ case "error": {
1098
+ devUtils.error("Error: %s", message);
1099
+ throw new Error(devUtils.formatMessage('Cannot bypass a request when using the "error" strategy for the "onUnhandledRequest" option.'));
1100
+ }
1101
+ case "warn": {
1102
+ devUtils.warn("Warning: %s", message);
1103
+ break;
1104
+ }
1105
+ case "bypass":
1106
+ break;
1107
+ default:
1108
+ throw new Error(devUtils.formatMessage('Failed to react to an unhandled request: unknown strategy "%s". Please provide one of the supported strategies ("bypass", "warn", "error") or a custom callback function as the value of the "onUnhandledRequest" option.', strategy2));
1109
+ }
1110
+ }
1111
+ if (typeof strategy === "function") {
1112
+ strategy(request, {
1113
+ warning: applyStrategy.bind(null, "warn"),
1114
+ error: applyStrategy.bind(null, "error")
1115
+ });
1116
+ return;
1117
+ }
1118
+ applyStrategy(strategy);
1119
+ }
1120
+
1121
+ // src/utils/request/readResponseCookies.ts
1122
+ import { store as store2 } from "@mswjs/cookies";
1123
+ function readResponseCookies(request, response2) {
1124
+ store2.add(__spreadProps(__spreadValues({}, request), { url: request.url.toString() }), response2);
1125
+ store2.persist();
1126
+ }
1127
+
1128
+ // src/utils/handleRequest.ts
1129
+ async function handleRequest(request, handlers, options, emitter, handleRequestOptions) {
1130
+ var _a, _b, _c, _d;
1131
+ emitter.emit("request:start", request);
1132
+ if (request.headers.get("x-msw-bypass") === "true") {
1133
+ emitter.emit("request:end", request);
1134
+ (_a = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _a.call(handleRequestOptions, request);
1135
+ return;
1136
+ }
1137
+ const [lookupError, lookupResult] = await until(() => {
1138
+ return getResponse(request, handlers, handleRequestOptions == null ? void 0 : handleRequestOptions.resolutionContext);
1139
+ });
1140
+ if (lookupError) {
1141
+ emitter.emit("unhandledException", lookupError, request);
1142
+ throw lookupError;
1143
+ }
1144
+ const { handler, response: response2 } = lookupResult;
1145
+ if (!handler) {
1146
+ onUnhandledRequest(request, handlers, options.onUnhandledRequest);
1147
+ emitter.emit("request:unhandled", request);
1148
+ emitter.emit("request:end", request);
1149
+ (_b = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _b.call(handleRequestOptions, request);
1150
+ return;
1151
+ }
1152
+ if (!response2) {
1153
+ devUtils.warn(`Expected response resolver to return a mocked response Object, but got %s. The original response is going to be used instead.
1154
+
1155
+ \u2022 %s
1156
+ %s`, response2, handler.info.header, handler.info.callFrame);
1157
+ emitter.emit("request:end", request);
1158
+ (_c = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _c.call(handleRequestOptions, request);
1159
+ return;
1160
+ }
1161
+ if (response2.passthrough) {
1162
+ emitter.emit("request:end", request);
1163
+ (_d = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _d.call(handleRequestOptions, request);
1164
+ return;
1165
+ }
1166
+ readResponseCookies(request, response2);
1167
+ emitter.emit("request:match", request);
1168
+ return new Promise((resolve) => {
1169
+ var _a2, _b2, _c2;
1170
+ const requiredLookupResult = lookupResult;
1171
+ const transformedResponse = ((_a2 = handleRequestOptions == null ? void 0 : handleRequestOptions.transformResponse) == null ? void 0 : _a2.call(handleRequestOptions, response2)) || response2;
1172
+ (_b2 = handleRequestOptions == null ? void 0 : handleRequestOptions.onMockedResponse) == null ? void 0 : _b2.call(handleRequestOptions, transformedResponse, requiredLookupResult);
1173
+ setTimeout(() => {
1174
+ var _a3;
1175
+ (_a3 = handleRequestOptions == null ? void 0 : handleRequestOptions.onMockedResponseSent) == null ? void 0 : _a3.call(handleRequestOptions, transformedResponse, requiredLookupResult);
1176
+ emitter.emit("request:end", request);
1177
+ resolve(transformedResponse);
1178
+ }, (_c2 = response2.delay) != null ? _c2 : 0);
1179
+ });
1180
+ }
1181
+
1182
+ // src/utils/internal/pipeEvents.ts
1183
+ function pipeEvents(source, destination) {
1184
+ const rawEmit = source.emit;
1185
+ if (rawEmit._isPiped) {
1186
+ return;
1187
+ }
1188
+ source.emit = function(event, ...data2) {
1189
+ destination.emit(event, ...data2);
1190
+ return rawEmit.call(this, event, ...data2);
1191
+ };
1192
+ source.emit._isPiped = true;
1193
+ }
1194
+
1195
+ // src/node/createSetupServer.ts
1196
+ var DEFAULT_LISTEN_OPTIONS = {
1197
+ onUnhandledRequest: "warn"
1198
+ };
1199
+ function createSetupServer(...interceptors) {
1200
+ const emitter = new StrictEventEmitter();
1201
+ const publicEmitter = new StrictEventEmitter();
1202
+ pipeEvents(emitter, publicEmitter);
1203
+ return function setupServer2(...requestHandlers) {
1204
+ requestHandlers.forEach((handler) => {
1205
+ if (Array.isArray(handler))
1206
+ throw new Error(devUtils.formatMessage('Failed to call "setupServer" given an Array of request handlers (setupServer([a, b])), expected to receive each handler individually: setupServer(a, b).'));
1207
+ });
1208
+ let currentHandlers = [...requestHandlers];
1209
+ if (!isNodeProcess3()) {
1210
+ 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."));
1211
+ }
1212
+ let resolvedOptions = {};
1213
+ const interceptor = new BatchInterceptor({
1214
+ name: "setup-server",
1215
+ interceptors
1216
+ });
1217
+ interceptor.on("request", async function setupServerListener(request) {
1218
+ const mockedRequest = parseIsomorphicRequest(request);
1219
+ const response2 = await handleRequest(mockedRequest, currentHandlers, resolvedOptions, emitter, {
1220
+ transformResponse(response3) {
1221
+ return {
1222
+ status: response3.status,
1223
+ statusText: response3.statusText,
1224
+ headers: response3.headers.all(),
1225
+ body: response3.body
1226
+ };
1227
+ }
1228
+ });
1229
+ if (response2) {
1230
+ request.respondWith(response2);
1231
+ }
1232
+ return;
1233
+ });
1234
+ interceptor.on("response", (request, response2) => {
1235
+ if (!request.id) {
1236
+ return;
1237
+ }
1238
+ if (response2.headers.get("x-powered-by") === "msw") {
1239
+ emitter.emit("response:mocked", response2, request.id);
1240
+ } else {
1241
+ emitter.emit("response:bypass", response2, request.id);
1242
+ }
1243
+ });
1244
+ return {
1245
+ listen(options) {
1246
+ resolvedOptions = mergeRight(DEFAULT_LISTEN_OPTIONS, options || {});
1247
+ interceptor.apply();
1248
+ },
1249
+ use(...handlers) {
1250
+ use(currentHandlers, ...handlers);
1251
+ },
1252
+ restoreHandlers() {
1253
+ restoreHandlers(currentHandlers);
1254
+ },
1255
+ resetHandlers(...nextHandlers) {
1256
+ currentHandlers = resetHandlers(requestHandlers, ...nextHandlers);
1257
+ },
1258
+ printHandlers() {
1259
+ currentHandlers.forEach((handler) => {
1260
+ const { header, callFrame } = handler.info;
1261
+ const pragma = handler.info.hasOwnProperty("operationType") ? "[graphql]" : "[rest]";
1262
+ console.log(`${bold(`${pragma} ${header}`)}
1263
+ Declaration: ${callFrame}
1264
+ `);
1265
+ });
1266
+ },
1267
+ events: {
1268
+ on(...args) {
1269
+ return publicEmitter.on(...args);
1270
+ },
1271
+ removeListener(...args) {
1272
+ return publicEmitter.removeListener(...args);
1273
+ },
1274
+ removeAllListeners(...args) {
1275
+ return publicEmitter.removeAllListeners(...args);
1276
+ }
1277
+ },
1278
+ close() {
1279
+ emitter.removeAllListeners();
1280
+ publicEmitter.removeAllListeners();
1281
+ interceptor.dispose();
1282
+ }
1283
+ };
1284
+ };
1285
+ }
1286
+
1287
+ // src/native/index.ts
1288
+ var setupServer = createSetupServer(new XMLHttpRequestInterceptor());
1289
+ export {
1290
+ setupServer
1291
+ };