msw 0.42.3 → 0.44.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.
@@ -60,441 +60,19 @@ var import_XMLHttpRequest = require("@mswjs/interceptors/lib/interceptors/XMLHtt
60
60
  var import_chalk = require("chalk");
61
61
  var import_is_node_process3 = require("is-node-process");
62
62
  var import_strict_event_emitter = require("strict-event-emitter");
63
- var import_interceptors = require("@mswjs/interceptors");
64
-
65
- // src/utils/internal/requestHandlerUtils.ts
66
- function use(currentHandlers, ...handlers) {
67
- currentHandlers.unshift(...handlers);
68
- }
69
- function restoreHandlers(handlers) {
70
- handlers.forEach((handler) => {
71
- handler.markAsSkipped(false);
72
- });
73
- }
74
- function resetHandlers(initialHandlers, ...nextHandlers) {
75
- return nextHandlers.length > 0 ? [...nextHandlers] : [...initialHandlers];
76
- }
77
-
78
- // src/handlers/RequestHandler.ts
79
- var import_headers_polyfill4 = require("headers-polyfill");
80
-
81
- // src/response.ts
82
- var import_headers_polyfill = require("headers-polyfill");
83
-
84
- // src/utils/internal/compose.ts
85
- function compose(...fns) {
86
- return (...args) => {
87
- return fns.reduceRight((leftFn, rightFn) => {
88
- return leftFn instanceof Promise ? Promise.resolve(leftFn).then(rightFn) : rightFn(leftFn);
89
- }, args[0]);
90
- };
91
- }
92
-
93
- // src/utils/NetworkError.ts
94
- var NetworkError = class extends Error {
95
- constructor(message) {
96
- super(message);
97
- this.name = "NetworkError";
98
- }
99
- };
100
-
101
- // src/response.ts
102
- var defaultResponse = {
103
- status: 200,
104
- statusText: "OK",
105
- body: null,
106
- delay: 0,
107
- once: false,
108
- passthrough: false
109
- };
110
- var defaultResponseTransformers = [];
111
- function createResponseComposition(responseOverrides, defaultTransformers = defaultResponseTransformers) {
112
- return async (...transformers) => {
113
- const initialResponse = Object.assign({}, defaultResponse, {
114
- headers: new import_headers_polyfill.Headers({
115
- "x-powered-by": "msw"
116
- })
117
- }, responseOverrides);
118
- const resolvedTransformers = [
119
- ...defaultTransformers,
120
- ...transformers
121
- ].filter(Boolean);
122
- const resolvedResponse = resolvedTransformers.length > 0 ? compose(...resolvedTransformers)(initialResponse) : initialResponse;
123
- return resolvedResponse;
124
- };
125
- }
126
- var response = Object.assign(createResponseComposition(), {
127
- once: createResponseComposition({ once: true }),
128
- networkError(message) {
129
- throw new NetworkError(message);
130
- }
131
- });
132
-
133
- // src/utils/internal/getCallFrame.ts
134
- var SOURCE_FRAME = /\/msw\/src\/(.+)/;
135
- var BUILD_FRAME = /(node_modules)?[\/\\]lib[\/\\](umd|esm|iief|cjs)[\/\\]|^[^\/\\]*$/;
136
- function getCallFrame(error2) {
137
- const stack = error2.stack;
138
- if (!stack) {
139
- return;
140
- }
141
- const frames = stack.split("\n").slice(1);
142
- const declarationFrame = frames.find((frame) => {
143
- return !(SOURCE_FRAME.test(frame) || BUILD_FRAME.test(frame));
144
- });
145
- if (!declarationFrame) {
146
- return;
147
- }
148
- const declarationPath = declarationFrame.replace(/\s*at [^()]*\(([^)]+)\)/, "$1").replace(/^@/, "");
149
- return declarationPath;
150
- }
151
-
152
- // src/utils/internal/isIterable.ts
153
- function isIterable(fn) {
154
- if (!fn) {
155
- return false;
156
- }
157
- return typeof fn[Symbol.iterator] == "function";
158
- }
159
-
160
- // src/context/status.ts
161
- var import_codes = __toESM(require("statuses/codes.json"));
162
- var status = (statusCode, statusText) => {
163
- return (res) => {
164
- res.status = statusCode;
165
- res.statusText = statusText || import_codes.default[String(statusCode)];
166
- return res;
167
- };
168
- };
169
-
170
- // src/context/set.ts
171
- var import_headers_polyfill2 = require("headers-polyfill");
172
- function set(...args) {
173
- return (res) => {
174
- const [name, value] = args;
175
- if (typeof name === "string") {
176
- res.headers.append(name, value);
177
- } else {
178
- const headers = (0, import_headers_polyfill2.objectToHeaders)(name);
179
- headers.forEach((value2, name2) => {
180
- res.headers.append(name2, value2);
181
- });
182
- }
183
- return res;
184
- };
185
- }
186
-
187
- // src/context/delay.ts
188
- var import_is_node_process = require("is-node-process");
189
- var SET_TIMEOUT_MAX_ALLOWED_INT = 2147483647;
190
- var MIN_SERVER_RESPONSE_TIME = 100;
191
- var MAX_SERVER_RESPONSE_TIME = 400;
192
- var NODE_SERVER_RESPONSE_TIME = 5;
193
- var getRandomServerResponseTime = () => {
194
- if ((0, import_is_node_process.isNodeProcess)()) {
195
- return NODE_SERVER_RESPONSE_TIME;
196
- }
197
- return Math.floor(Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) + MIN_SERVER_RESPONSE_TIME);
198
- };
199
- var delay = (durationOrMode) => {
200
- return (res) => {
201
- let delayTime;
202
- if (typeof durationOrMode === "string") {
203
- switch (durationOrMode) {
204
- case "infinite": {
205
- delayTime = SET_TIMEOUT_MAX_ALLOWED_INT;
206
- break;
207
- }
208
- case "real": {
209
- delayTime = getRandomServerResponseTime();
210
- break;
211
- }
212
- default: {
213
- 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".`);
214
- }
215
- }
216
- } else if (typeof durationOrMode === "undefined") {
217
- delayTime = getRandomServerResponseTime();
218
- } else {
219
- if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) {
220
- 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.`);
221
- }
222
- delayTime = durationOrMode;
223
- }
224
- res.delay = delayTime;
225
- return res;
226
- };
227
- };
228
-
229
- // src/context/fetch.ts
230
- var import_is_node_process2 = require("is-node-process");
231
- var import_headers_polyfill3 = require("headers-polyfill");
232
- var useFetch = (0, import_is_node_process2.isNodeProcess)() ? require("node-fetch") : window.fetch;
233
- var augmentRequestInit = (requestInit) => {
234
- const headers = new import_headers_polyfill3.Headers(requestInit.headers);
235
- headers.set("x-msw-bypass", "true");
236
- return __spreadProps(__spreadValues({}, requestInit), {
237
- headers: headers.all()
238
- });
239
- };
240
- var createFetchRequestParameters = (input) => {
241
- const { body: body2, method } = input;
242
- const requestParameters = __spreadProps(__spreadValues({}, input), {
243
- body: void 0
244
- });
245
- if (["GET", "HEAD"].includes(method)) {
246
- return requestParameters;
247
- }
248
- if (typeof body2 === "object" || typeof body2 === "number" || typeof body2 === "boolean") {
249
- requestParameters.body = JSON.stringify(body2);
250
- } else {
251
- requestParameters.body = body2;
252
- }
253
- return requestParameters;
254
- };
255
- var fetch = (input, requestInit = {}) => {
256
- if (typeof input === "string") {
257
- return useFetch(input, augmentRequestInit(requestInit));
258
- }
259
- const requestParameters = createFetchRequestParameters(input);
260
- const derivedRequestInit = augmentRequestInit(requestParameters);
261
- return useFetch(input.url.href, derivedRequestInit);
262
- };
263
-
264
- // src/handlers/RequestHandler.ts
265
- var defaultContext = {
266
- status,
267
- set,
268
- delay,
269
- fetch
270
- };
271
- var RequestHandler = class {
272
- constructor(options) {
273
- this.shouldSkip = false;
274
- this.ctx = options.ctx || defaultContext;
275
- this.resolver = options.resolver;
276
- const callFrame = getCallFrame(new Error());
277
- this.info = __spreadProps(__spreadValues({}, options.info), {
278
- callFrame
279
- });
280
- }
281
- parse(_request, _resolutionContext) {
282
- return null;
283
- }
284
- test(request, resolutionContext) {
285
- return this.predicate(request, this.parse(request, resolutionContext), resolutionContext);
286
- }
287
- getPublicRequest(request, _parsedResult) {
288
- return request;
289
- }
290
- markAsSkipped(shouldSkip = true) {
291
- this.shouldSkip = shouldSkip;
292
- }
293
- async run(request, resolutionContext) {
294
- if (this.shouldSkip) {
295
- return null;
296
- }
297
- const parsedResult = this.parse(request, resolutionContext);
298
- const shouldIntercept = this.predicate(request, parsedResult, resolutionContext);
299
- if (!shouldIntercept) {
300
- return null;
301
- }
302
- const publicRequest = this.getPublicRequest(request, parsedResult);
303
- const executeResolver = this.wrapResolver(this.resolver);
304
- const mockedResponse = await executeResolver(publicRequest, response, this.ctx);
305
- return this.createExecutionResult(parsedResult, publicRequest, mockedResponse);
306
- }
307
- wrapResolver(resolver) {
308
- return async (req, res, ctx) => {
309
- const result = this.resolverGenerator || await resolver(req, res, ctx);
310
- if (isIterable(result)) {
311
- const { value, done } = result[Symbol.iterator]().next();
312
- const nextResponse = await value;
313
- if (!nextResponse && done) {
314
- return this.resolverGeneratorResult;
315
- }
316
- if (!this.resolverGenerator) {
317
- this.resolverGenerator = result;
318
- }
319
- this.resolverGeneratorResult = nextResponse;
320
- return nextResponse;
321
- }
322
- return result;
323
- };
324
- }
325
- createExecutionResult(parsedResult, request, response2) {
326
- return {
327
- handler: this,
328
- parsedResult: parsedResult || null,
329
- request,
330
- response: response2 || null
331
- };
332
- }
333
- };
334
- function passthrough() {
335
- return {
336
- status: 101,
337
- statusText: "Continue",
338
- headers: new import_headers_polyfill4.Headers(),
339
- body: null,
340
- passthrough: true,
341
- once: false
342
- };
343
- }
344
-
345
- // src/utils/internal/jsonParse.ts
346
- function jsonParse(value) {
347
- try {
348
- return JSON.parse(value);
349
- } catch (error2) {
350
- return void 0;
351
- }
352
- }
353
-
354
- // src/utils/internal/parseMultipartData.ts
355
- var import_headers_polyfill5 = require("headers-polyfill");
356
- function parseContentHeaders(headersString) {
357
- var _a, _b;
358
- const headers = (0, import_headers_polyfill5.stringToHeaders)(headersString);
359
- const contentType = headers.get("content-type") || "text/plain";
360
- const disposition = headers.get("content-disposition");
361
- if (!disposition) {
362
- throw new Error('"Content-Disposition" header is required.');
363
- }
364
- const directives = disposition.split(";").reduce((acc, chunk) => {
365
- const [name2, ...rest] = chunk.trim().split("=");
366
- acc[name2] = rest.join("=");
367
- return acc;
368
- }, {});
369
- const name = (_a = directives.name) == null ? void 0 : _a.slice(1, -1);
370
- const filename = (_b = directives.filename) == null ? void 0 : _b.slice(1, -1);
371
- return {
372
- name,
373
- filename,
374
- contentType
375
- };
376
- }
377
- function parseMultipartData(data2, headers) {
378
- const contentType = headers == null ? void 0 : headers.get("content-type");
379
- if (!contentType) {
380
- return void 0;
381
- }
382
- const [, ...directives] = contentType.split(/; */);
383
- const boundary = directives.filter((d) => d.startsWith("boundary=")).map((s) => s.replace(/^boundary=/, ""))[0];
384
- if (!boundary) {
385
- return void 0;
386
- }
387
- const boundaryRegExp = new RegExp(`--+${boundary}`);
388
- const fields = data2.split(boundaryRegExp).filter((chunk) => chunk.startsWith("\r\n") && chunk.endsWith("\r\n")).map((chunk) => chunk.trimStart().replace(/\r\n$/, ""));
389
- if (!fields.length) {
390
- return void 0;
391
- }
392
- const parsedBody = {};
393
- try {
394
- for (const field2 of fields) {
395
- const [contentHeaders, ...rest] = field2.split("\r\n\r\n");
396
- const contentBody = rest.join("\r\n\r\n");
397
- const { contentType: contentType2, filename, name } = parseContentHeaders(contentHeaders);
398
- const value = filename === void 0 ? contentBody : new File([contentBody], filename, { type: contentType2 });
399
- const parsedValue = parsedBody[name];
400
- if (parsedValue === void 0) {
401
- parsedBody[name] = value;
402
- } else if (Array.isArray(parsedValue)) {
403
- parsedBody[name] = [...parsedValue, value];
404
- } else {
405
- parsedBody[name] = [parsedValue, value];
406
- }
407
- }
408
- return parsedBody;
409
- } catch (error2) {
410
- return void 0;
411
- }
412
- }
413
-
414
- // src/utils/request/parseBody.ts
415
- function parseBody(body2, headers) {
416
- var _a;
417
- if (!body2) {
418
- return body2;
419
- }
420
- const contentType = ((_a = headers == null ? void 0 : headers.get("content-type")) == null ? void 0 : _a.toLowerCase()) || "";
421
- const hasMultipartContent = contentType.startsWith("multipart/form-data");
422
- if (hasMultipartContent && typeof body2 !== "object") {
423
- return parseMultipartData(body2.toString(), headers) || body2;
424
- }
425
- const hasJsonContent = contentType.includes("json");
426
- if (hasJsonContent && typeof body2 !== "object") {
427
- return jsonParse(body2.toString()) || body2;
428
- }
429
- return body2;
430
- }
63
+ var import_interceptors2 = require("@mswjs/interceptors");
431
64
 
432
- // src/utils/request/setRequestCookies.ts
433
- var cookieUtils2 = __toESM(require("cookie"));
434
- var import_cookies = require("@mswjs/cookies");
435
-
436
- // src/utils/request/getRequestCookies.ts
437
- var cookieUtils = __toESM(require("cookie"));
438
- function getAllCookies() {
439
- return cookieUtils.parse(document.cookie);
440
- }
441
- function getRequestCookies(request) {
442
- if (typeof document === "undefined" || typeof location === "undefined") {
443
- return {};
444
- }
445
- switch (request.credentials) {
446
- case "same-origin": {
447
- return location.origin === request.url.origin ? getAllCookies() : {};
448
- }
449
- case "include": {
450
- return getAllCookies();
451
- }
452
- default: {
453
- return {};
454
- }
455
- }
65
+ // src/utils/internal/requestHandlerUtils.ts
66
+ function use(currentHandlers, ...handlers) {
67
+ currentHandlers.unshift(...handlers);
456
68
  }
457
-
458
- // src/utils/request/setRequestCookies.ts
459
- function setRequestCookies(request) {
460
- var _a;
461
- const requestCookiesString = request.headers.get("cookie");
462
- import_cookies.store.hydrate();
463
- const cookiesFromStore = Array.from((_a = import_cookies.store.get(__spreadProps(__spreadValues({}, request), { url: request.url.toString() }))) == null ? void 0 : _a.entries()).reduce((cookies, [name, { value }]) => {
464
- return Object.assign(cookies, { [name.trim()]: value });
465
- }, {});
466
- const cookiesFromDocument = getRequestCookies(request);
467
- const forwardedCookies = __spreadValues(__spreadValues({}, cookiesFromDocument), cookiesFromStore);
468
- for (const [name, value] of Object.entries(forwardedCookies)) {
469
- request.headers.append("cookie", `${name}=${value}`);
470
- }
471
- const ownCookies = requestCookiesString ? cookieUtils2.parse(requestCookiesString) : {};
472
- request.cookies = __spreadValues(__spreadValues(__spreadValues({}, request.cookies), forwardedCookies), ownCookies);
69
+ function restoreHandlers(handlers) {
70
+ handlers.forEach((handler) => {
71
+ handler.markAsSkipped(false);
72
+ });
473
73
  }
474
-
475
- // src/utils/request/parseIsomorphicRequest.ts
476
- function parseIsomorphicRequest(request) {
477
- const mockedRequest = {
478
- id: request.id,
479
- url: request.url,
480
- method: request.method,
481
- body: parseBody(request.body, request.headers),
482
- credentials: request.credentials || "same-origin",
483
- headers: request.headers,
484
- cookies: {},
485
- redirect: "manual",
486
- referrer: "",
487
- keepalive: false,
488
- cache: "default",
489
- mode: "cors",
490
- referrerPolicy: "no-referrer",
491
- integrity: "",
492
- destination: "document",
493
- bodyUsed: false,
494
- passthrough
495
- };
496
- setRequestCookies(mockedRequest);
497
- return mockedRequest;
74
+ function resetHandlers(initialHandlers, ...nextHandlers) {
75
+ return nextHandlers.length > 0 ? [...nextHandlers] : [...initialHandlers];
498
76
  }
499
77
 
500
78
  // src/utils/handleRequest.ts
@@ -577,6 +155,15 @@ var getPublicUrlFromRequest = (request) => {
577
155
  return request.referrer.startsWith(request.url.origin) ? request.url.pathname : new URL(request.url.pathname, `${request.url.protocol}//${request.url.host}`).href;
578
156
  };
579
157
 
158
+ // src/utils/internal/jsonParse.ts
159
+ function jsonParse(value) {
160
+ try {
161
+ return JSON.parse(value);
162
+ } catch (error2) {
163
+ return void 0;
164
+ }
165
+ }
166
+
580
167
  // src/utils/internal/parseGraphQLRequest.ts
581
168
  function parseDocumentNode(node) {
582
169
  var _a;
@@ -677,12 +264,39 @@ function isStringEqual(actual, expected) {
677
264
  return actual.toLowerCase() === expected.toLowerCase();
678
265
  }
679
266
 
267
+ // src/context/status.ts
268
+ var import_codes = __toESM(require("statuses/codes.json"));
269
+ var status = (statusCode, statusText) => {
270
+ return (res) => {
271
+ res.status = statusCode;
272
+ res.statusText = statusText || import_codes.default[String(statusCode)];
273
+ return res;
274
+ };
275
+ };
276
+
277
+ // src/context/set.ts
278
+ var import_headers_polyfill = require("headers-polyfill");
279
+ function set(...args) {
280
+ return (res) => {
281
+ const [name, value] = args;
282
+ if (typeof name === "string") {
283
+ res.headers.append(name, value);
284
+ } else {
285
+ const headers = (0, import_headers_polyfill.objectToHeaders)(name);
286
+ headers.forEach((value2, name2) => {
287
+ res.headers.append(name2, value2);
288
+ });
289
+ }
290
+ return res;
291
+ };
292
+ }
293
+
680
294
  // src/context/cookie.ts
681
- var cookieUtils3 = __toESM(require("cookie"));
295
+ var cookieUtils = __toESM(require("cookie"));
682
296
  var cookie = (name, value, options) => {
683
297
  return (res) => {
684
- const serializedCookie = cookieUtils3.serialize(name, value, options);
685
- res.headers.set("Set-Cookie", serializedCookie);
298
+ const serializedCookie = cookieUtils.serialize(name, value, options);
299
+ res.headers.append("Set-Cookie", serializedCookie);
686
300
  if (typeof document !== "undefined") {
687
301
  document.cookie = serializedCookie;
688
302
  }
@@ -747,6 +361,48 @@ var extensions = (payload) => {
747
361
  };
748
362
  };
749
363
 
364
+ // src/context/delay.ts
365
+ var import_is_node_process = require("is-node-process");
366
+ var SET_TIMEOUT_MAX_ALLOWED_INT = 2147483647;
367
+ var MIN_SERVER_RESPONSE_TIME = 100;
368
+ var MAX_SERVER_RESPONSE_TIME = 400;
369
+ var NODE_SERVER_RESPONSE_TIME = 5;
370
+ var getRandomServerResponseTime = () => {
371
+ if ((0, import_is_node_process.isNodeProcess)()) {
372
+ return NODE_SERVER_RESPONSE_TIME;
373
+ }
374
+ return Math.floor(Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) + MIN_SERVER_RESPONSE_TIME);
375
+ };
376
+ var delay = (durationOrMode) => {
377
+ return (res) => {
378
+ let delayTime;
379
+ if (typeof durationOrMode === "string") {
380
+ switch (durationOrMode) {
381
+ case "infinite": {
382
+ delayTime = SET_TIMEOUT_MAX_ALLOWED_INT;
383
+ break;
384
+ }
385
+ case "real": {
386
+ delayTime = getRandomServerResponseTime();
387
+ break;
388
+ }
389
+ default: {
390
+ 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".`);
391
+ }
392
+ }
393
+ } else if (typeof durationOrMode === "undefined") {
394
+ delayTime = getRandomServerResponseTime();
395
+ } else {
396
+ if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) {
397
+ 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.`);
398
+ }
399
+ delayTime = durationOrMode;
400
+ }
401
+ res.delay = delayTime;
402
+ return res;
403
+ };
404
+ };
405
+
750
406
  // src/context/errors.ts
751
407
  var errors = (errorsList) => {
752
408
  return (res) => {
@@ -759,6 +415,41 @@ var errors = (errorsList) => {
759
415
  };
760
416
  };
761
417
 
418
+ // src/context/fetch.ts
419
+ var import_is_node_process2 = require("is-node-process");
420
+ var import_headers_polyfill2 = require("headers-polyfill");
421
+ var useFetch = (0, import_is_node_process2.isNodeProcess)() ? require("node-fetch") : window.fetch;
422
+ var augmentRequestInit = (requestInit) => {
423
+ const headers = new import_headers_polyfill2.Headers(requestInit.headers);
424
+ headers.set("x-msw-bypass", "true");
425
+ return __spreadProps(__spreadValues({}, requestInit), {
426
+ headers: headers.all()
427
+ });
428
+ };
429
+ var createFetchRequestParameters = (input) => {
430
+ const { body: body2, method } = input;
431
+ const requestParameters = __spreadProps(__spreadValues({}, input), {
432
+ body: void 0
433
+ });
434
+ if (["GET", "HEAD"].includes(method)) {
435
+ return requestParameters;
436
+ }
437
+ if (typeof body2 === "object" || typeof body2 === "number" || typeof body2 === "boolean") {
438
+ requestParameters.body = JSON.stringify(body2);
439
+ } else {
440
+ requestParameters.body = body2;
441
+ }
442
+ return requestParameters;
443
+ };
444
+ var fetch = (input, requestInit = {}) => {
445
+ if (typeof input === "string") {
446
+ return useFetch(input, augmentRequestInit(requestInit));
447
+ }
448
+ const requestParameters = createFetchRequestParameters(input);
449
+ const derivedRequestInit = augmentRequestInit(requestParameters);
450
+ return useFetch(input.url.href, derivedRequestInit);
451
+ };
452
+
762
453
  // src/context/text.ts
763
454
  var text = (body2) => {
764
455
  return (res) => {
@@ -782,29 +473,110 @@ function getStatusCodeColor(status2) {
782
473
  if (status2 < 300) {
783
474
  return "#69AB32" /* Success */;
784
475
  }
785
- if (status2 < 400) {
786
- return "#F0BB4B" /* Warning */;
476
+ if (status2 < 400) {
477
+ return "#F0BB4B" /* Warning */;
478
+ }
479
+ return "#E95F5D" /* Danger */;
480
+ }
481
+
482
+ // src/utils/logging/getTimestamp.ts
483
+ function getTimestamp() {
484
+ const now = new Date();
485
+ return [now.getHours(), now.getMinutes(), now.getSeconds()].map(String).map((chunk) => chunk.slice(0, 2)).map((chunk) => chunk.padStart(2, "0")).join(":");
486
+ }
487
+
488
+ // src/utils/logging/prepareRequest.ts
489
+ function prepareRequest(request) {
490
+ return __spreadProps(__spreadValues({}, request), {
491
+ body: request.body,
492
+ headers: request.headers.all()
493
+ });
494
+ }
495
+
496
+ // src/utils/logging/prepareResponse.ts
497
+ var import_headers_polyfill4 = require("headers-polyfill");
498
+
499
+ // src/utils/internal/parseMultipartData.ts
500
+ var import_headers_polyfill3 = require("headers-polyfill");
501
+ function parseContentHeaders(headersString) {
502
+ var _a, _b;
503
+ const headers = (0, import_headers_polyfill3.stringToHeaders)(headersString);
504
+ const contentType = headers.get("content-type") || "text/plain";
505
+ const disposition = headers.get("content-disposition");
506
+ if (!disposition) {
507
+ throw new Error('"Content-Disposition" header is required.');
508
+ }
509
+ const directives = disposition.split(";").reduce((acc, chunk) => {
510
+ const [name2, ...rest] = chunk.trim().split("=");
511
+ acc[name2] = rest.join("=");
512
+ return acc;
513
+ }, {});
514
+ const name = (_a = directives.name) == null ? void 0 : _a.slice(1, -1);
515
+ const filename = (_b = directives.filename) == null ? void 0 : _b.slice(1, -1);
516
+ return {
517
+ name,
518
+ filename,
519
+ contentType
520
+ };
521
+ }
522
+ function parseMultipartData(data2, headers) {
523
+ const contentType = headers == null ? void 0 : headers.get("content-type");
524
+ if (!contentType) {
525
+ return void 0;
526
+ }
527
+ const [, ...directives] = contentType.split(/; */);
528
+ const boundary = directives.filter((d) => d.startsWith("boundary=")).map((s) => s.replace(/^boundary=/, ""))[0];
529
+ if (!boundary) {
530
+ return void 0;
531
+ }
532
+ const boundaryRegExp = new RegExp(`--+${boundary}`);
533
+ const fields = data2.split(boundaryRegExp).filter((chunk) => chunk.startsWith("\r\n") && chunk.endsWith("\r\n")).map((chunk) => chunk.trimStart().replace(/\r\n$/, ""));
534
+ if (!fields.length) {
535
+ return void 0;
536
+ }
537
+ const parsedBody = {};
538
+ try {
539
+ for (const field2 of fields) {
540
+ const [contentHeaders, ...rest] = field2.split("\r\n\r\n");
541
+ const contentBody = rest.join("\r\n\r\n");
542
+ const { contentType: contentType2, filename, name } = parseContentHeaders(contentHeaders);
543
+ const value = filename === void 0 ? contentBody : new File([contentBody], filename, { type: contentType2 });
544
+ const parsedValue = parsedBody[name];
545
+ if (parsedValue === void 0) {
546
+ parsedBody[name] = value;
547
+ } else if (Array.isArray(parsedValue)) {
548
+ parsedBody[name] = [...parsedValue, value];
549
+ } else {
550
+ parsedBody[name] = [parsedValue, value];
551
+ }
552
+ }
553
+ return parsedBody;
554
+ } catch (error2) {
555
+ return void 0;
787
556
  }
788
- return "#E95F5D" /* Danger */;
789
- }
790
-
791
- // src/utils/logging/getTimestamp.ts
792
- function getTimestamp() {
793
- const now = new Date();
794
- return [now.getHours(), now.getMinutes(), now.getSeconds()].map(String).map((chunk) => chunk.slice(0, 2)).map((chunk) => chunk.padStart(2, "0")).join(":");
795
557
  }
796
558
 
797
- // src/utils/logging/prepareRequest.ts
798
- function prepareRequest(request) {
799
- return __spreadProps(__spreadValues({}, request), {
800
- headers: request.headers.all()
801
- });
559
+ // src/utils/request/parseBody.ts
560
+ function parseBody(body2, headers) {
561
+ var _a;
562
+ if (!body2) {
563
+ return body2;
564
+ }
565
+ const contentType = ((_a = headers == null ? void 0 : headers.get("content-type")) == null ? void 0 : _a.toLowerCase()) || "";
566
+ const hasMultipartContent = contentType.startsWith("multipart/form-data");
567
+ if (hasMultipartContent && typeof body2 !== "object") {
568
+ return parseMultipartData(body2.toString(), headers) || body2;
569
+ }
570
+ const hasJsonContent = contentType.includes("json");
571
+ if (hasJsonContent && typeof body2 !== "object") {
572
+ return jsonParse(body2.toString()) || body2;
573
+ }
574
+ return body2;
802
575
  }
803
576
 
804
577
  // src/utils/logging/prepareResponse.ts
805
- var import_headers_polyfill6 = require("headers-polyfill");
806
578
  function prepareResponse(res) {
807
- const responseHeaders = (0, import_headers_polyfill6.objectToHeaders)(res.headers);
579
+ const responseHeaders = (0, import_headers_polyfill4.objectToHeaders)(res.headers);
808
580
  return __spreadProps(__spreadValues({}, res), {
809
581
  body: parseBody(res.body, responseHeaders)
810
582
  });
@@ -871,6 +643,248 @@ function matchRequestUrl(url, path, baseUrl) {
871
643
  };
872
644
  }
873
645
 
646
+ // src/utils/request/MockedRequest.ts
647
+ var cookieUtils3 = __toESM(require("cookie"));
648
+ var import_cookies = require("@mswjs/cookies");
649
+ var import_interceptors = require("@mswjs/interceptors");
650
+ var import_bufferUtils = require("@mswjs/interceptors/lib/utils/bufferUtils");
651
+ var import_lib = require("headers-polyfill/lib");
652
+
653
+ // src/utils/request/getRequestCookies.ts
654
+ var cookieUtils2 = __toESM(require("cookie"));
655
+ function getAllCookies() {
656
+ return cookieUtils2.parse(document.cookie);
657
+ }
658
+ function getRequestCookies(request) {
659
+ if (typeof document === "undefined" || typeof location === "undefined") {
660
+ return {};
661
+ }
662
+ switch (request.credentials) {
663
+ case "same-origin": {
664
+ return location.origin === request.url.origin ? getAllCookies() : {};
665
+ }
666
+ case "include": {
667
+ return getAllCookies();
668
+ }
669
+ default: {
670
+ return {};
671
+ }
672
+ }
673
+ }
674
+
675
+ // src/utils/request/MockedRequest.ts
676
+ var MockedRequest = class extends import_interceptors.IsomorphicRequest {
677
+ constructor(input, init = {}) {
678
+ var __super = (...args) => {
679
+ super(...args);
680
+ };
681
+ if (input instanceof import_interceptors.IsomorphicRequest) {
682
+ __super(input);
683
+ } else {
684
+ __super(input, init);
685
+ }
686
+ if (init.id) {
687
+ this.id = init.id;
688
+ }
689
+ this.cache = init.cache || "default";
690
+ this.destination = init.destination || "";
691
+ this.integrity = init.integrity || "";
692
+ this.keepalive = init.keepalive || false;
693
+ this.mode = init.mode || "cors";
694
+ this.priority = init.priority || "auto";
695
+ this.redirect = init.redirect || "follow";
696
+ this.referrer = init.referrer || "";
697
+ this.referrerPolicy = init.referrerPolicy || "no-referrer";
698
+ this.cookies = init.cookies || this.getCookies();
699
+ }
700
+ get body() {
701
+ const text2 = (0, import_bufferUtils.decodeBuffer)(this["_body"]);
702
+ const body2 = parseBody(text2, this.headers);
703
+ if (isStringEqual(this.method, "GET") && body2 === "") {
704
+ return void 0;
705
+ }
706
+ return body2;
707
+ }
708
+ passthrough() {
709
+ return {
710
+ status: 101,
711
+ statusText: "Continue",
712
+ headers: new import_lib.Headers(),
713
+ body: null,
714
+ passthrough: true,
715
+ once: false
716
+ };
717
+ }
718
+ getCookies() {
719
+ var _a;
720
+ const requestCookiesString = this.headers.get("cookie");
721
+ const ownCookies = requestCookiesString ? cookieUtils3.parse(requestCookiesString) : {};
722
+ import_cookies.store.hydrate();
723
+ const cookiesFromStore = Array.from((_a = import_cookies.store.get(__spreadProps(__spreadValues({}, this), { url: this.url.href }))) == null ? void 0 : _a.entries()).reduce((cookies, [name, { value }]) => {
724
+ return Object.assign(cookies, { [name.trim()]: value });
725
+ }, {});
726
+ const cookiesFromDocument = getRequestCookies(this);
727
+ const forwardedCookies = __spreadValues(__spreadValues({}, cookiesFromDocument), cookiesFromStore);
728
+ for (const [name, value] of Object.entries(forwardedCookies)) {
729
+ this.headers.append("cookie", `${name}=${value}`);
730
+ }
731
+ return __spreadValues(__spreadValues({}, forwardedCookies), ownCookies);
732
+ }
733
+ };
734
+
735
+ // src/handlers/RequestHandler.ts
736
+ var import_headers_polyfill6 = require("headers-polyfill");
737
+
738
+ // src/response.ts
739
+ var import_headers_polyfill5 = require("headers-polyfill");
740
+
741
+ // src/utils/internal/compose.ts
742
+ function compose(...fns) {
743
+ return (...args) => {
744
+ return fns.reduceRight((leftFn, rightFn) => {
745
+ return leftFn instanceof Promise ? Promise.resolve(leftFn).then(rightFn) : rightFn(leftFn);
746
+ }, args[0]);
747
+ };
748
+ }
749
+
750
+ // src/utils/NetworkError.ts
751
+ var NetworkError = class extends Error {
752
+ constructor(message) {
753
+ super(message);
754
+ this.name = "NetworkError";
755
+ }
756
+ };
757
+
758
+ // src/response.ts
759
+ var defaultResponse = {
760
+ status: 200,
761
+ statusText: "OK",
762
+ body: null,
763
+ delay: 0,
764
+ once: false,
765
+ passthrough: false
766
+ };
767
+ var defaultResponseTransformers = [];
768
+ function createResponseComposition(responseOverrides, defaultTransformers = defaultResponseTransformers) {
769
+ return async (...transformers) => {
770
+ const initialResponse = Object.assign({}, defaultResponse, {
771
+ headers: new import_headers_polyfill5.Headers({
772
+ "x-powered-by": "msw"
773
+ })
774
+ }, responseOverrides);
775
+ const resolvedTransformers = [
776
+ ...defaultTransformers,
777
+ ...transformers
778
+ ].filter(Boolean);
779
+ const resolvedResponse = resolvedTransformers.length > 0 ? compose(...resolvedTransformers)(initialResponse) : initialResponse;
780
+ return resolvedResponse;
781
+ };
782
+ }
783
+ var response = Object.assign(createResponseComposition(), {
784
+ once: createResponseComposition({ once: true }),
785
+ networkError(message) {
786
+ throw new NetworkError(message);
787
+ }
788
+ });
789
+
790
+ // src/utils/internal/getCallFrame.ts
791
+ var SOURCE_FRAME = /\/msw\/src\/(.+)/;
792
+ var BUILD_FRAME = /(node_modules)?[\/\\]lib[\/\\](umd|esm|iief|cjs)[\/\\]|^[^\/\\]*$/;
793
+ function getCallFrame(error2) {
794
+ const stack = error2.stack;
795
+ if (!stack) {
796
+ return;
797
+ }
798
+ const frames = stack.split("\n").slice(1);
799
+ const declarationFrame = frames.find((frame) => {
800
+ return !(SOURCE_FRAME.test(frame) || BUILD_FRAME.test(frame));
801
+ });
802
+ if (!declarationFrame) {
803
+ return;
804
+ }
805
+ const declarationPath = declarationFrame.replace(/\s*at [^()]*\(([^)]+)\)/, "$1").replace(/^@/, "");
806
+ return declarationPath;
807
+ }
808
+
809
+ // src/utils/internal/isIterable.ts
810
+ function isIterable(fn) {
811
+ if (!fn) {
812
+ return false;
813
+ }
814
+ return typeof fn[Symbol.iterator] == "function";
815
+ }
816
+
817
+ // src/handlers/RequestHandler.ts
818
+ var defaultContext = {
819
+ status,
820
+ set,
821
+ delay,
822
+ fetch
823
+ };
824
+ var RequestHandler = class {
825
+ constructor(options) {
826
+ this.shouldSkip = false;
827
+ this.ctx = options.ctx || defaultContext;
828
+ this.resolver = options.resolver;
829
+ const callFrame = getCallFrame(new Error());
830
+ this.info = __spreadProps(__spreadValues({}, options.info), {
831
+ callFrame
832
+ });
833
+ }
834
+ parse(_request, _resolutionContext) {
835
+ return null;
836
+ }
837
+ test(request, resolutionContext) {
838
+ return this.predicate(request, this.parse(request, resolutionContext), resolutionContext);
839
+ }
840
+ getPublicRequest(request, _parsedResult) {
841
+ return request;
842
+ }
843
+ markAsSkipped(shouldSkip = true) {
844
+ this.shouldSkip = shouldSkip;
845
+ }
846
+ async run(request, resolutionContext) {
847
+ if (this.shouldSkip) {
848
+ return null;
849
+ }
850
+ const parsedResult = this.parse(request, resolutionContext);
851
+ const shouldIntercept = this.predicate(request, parsedResult, resolutionContext);
852
+ if (!shouldIntercept) {
853
+ return null;
854
+ }
855
+ const publicRequest = this.getPublicRequest(request, parsedResult);
856
+ const executeResolver = this.wrapResolver(this.resolver);
857
+ const mockedResponse = await executeResolver(publicRequest, response, this.ctx);
858
+ return this.createExecutionResult(parsedResult, publicRequest, mockedResponse);
859
+ }
860
+ wrapResolver(resolver) {
861
+ return async (req, res, ctx) => {
862
+ const result = this.resolverGenerator || await resolver(req, res, ctx);
863
+ if (isIterable(result)) {
864
+ const { value, done } = result[Symbol.iterator]().next();
865
+ const nextResponse = await value;
866
+ if (!nextResponse && done) {
867
+ return this.resolverGeneratorResult;
868
+ }
869
+ if (!this.resolverGenerator) {
870
+ this.resolverGenerator = result;
871
+ }
872
+ this.resolverGeneratorResult = nextResponse;
873
+ return nextResponse;
874
+ }
875
+ return result;
876
+ };
877
+ }
878
+ createExecutionResult(parsedResult, request, response2) {
879
+ return {
880
+ handler: this,
881
+ parsedResult: parsedResult || null,
882
+ request,
883
+ response: response2 || null
884
+ };
885
+ }
886
+ };
887
+
874
888
  // src/handlers/RestHandler.ts
875
889
  var restContext = __spreadProps(__spreadValues({}, defaultContext), {
876
890
  cookie,
@@ -879,6 +893,15 @@ var restContext = __spreadProps(__spreadValues({}, defaultContext), {
879
893
  json,
880
894
  xml
881
895
  });
896
+ var RestRequest = class extends MockedRequest {
897
+ constructor(request, params) {
898
+ super(request.url, __spreadProps(__spreadValues({}, request), {
899
+ body: request["_body"]
900
+ }));
901
+ this.params = params;
902
+ this.id = request.id;
903
+ }
904
+ };
882
905
  var RestHandler = class extends RequestHandler {
883
906
  constructor(method, path, resolver) {
884
907
  super({
@@ -912,9 +935,7 @@ var RestHandler = class extends RequestHandler {
912
935
  return matchRequestUrl(request.url, this.info.path, resolutionContext == null ? void 0 : resolutionContext.baseUrl);
913
936
  }
914
937
  getPublicRequest(request, parsedResult) {
915
- return __spreadProps(__spreadValues({}, request), {
916
- params: parsedResult.params || {}
917
- });
938
+ return new RestRequest(request, parsedResult.params || {});
918
939
  }
919
940
  predicate(request, parsedResult) {
920
941
  const matchesMethod = this.info.method instanceof RegExp ? this.info.method.test(request.method) : isStringEqual(this.info.method, request.method);
@@ -977,6 +998,14 @@ function isDocumentNode(value) {
977
998
  }
978
999
  return typeof value === "object" && "kind" in value && "definitions" in value;
979
1000
  }
1001
+ var GraphQLRequest = class extends MockedRequest {
1002
+ constructor(request, variables) {
1003
+ super(request.url, __spreadProps(__spreadValues({}, request), {
1004
+ body: request["_body"]
1005
+ }));
1006
+ this.variables = variables;
1007
+ }
1008
+ };
980
1009
  var GraphQLHandler = class extends RequestHandler {
981
1010
  constructor(operationType, operationName, endpoint, resolver) {
982
1011
  let resolvedOperationName = operationName;
@@ -1006,9 +1035,7 @@ var GraphQLHandler = class extends RequestHandler {
1006
1035
  return tryCatch(() => parseGraphQLRequest(request), (error2) => console.error(error2.message));
1007
1036
  }
1008
1037
  getPublicRequest(request, parsedResult) {
1009
- return __spreadProps(__spreadValues({}, request), {
1010
- variables: (parsedResult == null ? void 0 : parsedResult.variables) || {}
1011
- });
1038
+ return new GraphQLRequest(request, (parsedResult == null ? void 0 : parsedResult.variables) || {});
1012
1039
  }
1013
1040
  predicate(request, parsedResult) {
1014
1041
  if (!parsedResult) {
@@ -1234,12 +1261,12 @@ function createSetupServer(...interceptors) {
1234
1261
  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."));
1235
1262
  }
1236
1263
  let resolvedOptions = {};
1237
- const interceptor = new import_interceptors.BatchInterceptor({
1264
+ const interceptor = new import_interceptors2.BatchInterceptor({
1238
1265
  name: "setup-server",
1239
1266
  interceptors: interceptors.map((Interceptor2) => new Interceptor2())
1240
1267
  });
1241
1268
  interceptor.on("request", async function setupServerListener(request) {
1242
- const mockedRequest = parseIsomorphicRequest(request);
1269
+ const mockedRequest = new MockedRequest(request);
1243
1270
  const response2 = await handleRequest(mockedRequest, currentHandlers, resolvedOptions, emitter, {
1244
1271
  transformResponse(response3) {
1245
1272
  return {