msw 0.46.0 → 0.47.1

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.
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as ResponseTransformer, s as status, a as set, d as delay, f as fetch, b as RequestHandler, S as SetupWorkerApi, D as DefaultContext, c as DefaultBodyType, M as MockedRequest, e as ResponseResolver, g as ResponseResolutionContext, h as SerializedResponse, i as RequestHandlerDefaultInfo, j as MockedResponse, k as ResponseLookupResult, l as SharedOptions, m as ServerLifecycleEventsMap } from './glossary-c690f512.js';
2
- export { A as AsyncResponseResolverReturnType, c as DefaultBodyType, u as DefaultRequestMultipartBody, y as DelayMode, M as MockedRequest, H as MockedRequestInit, j as MockedResponse, z as RequestCache, E as RequestDestination, b as RequestHandler, B as RequestMode, F as RequestPriority, C as RequestRedirect, G as RequestReferrerPolicy, v as ResponseComposition, w as ResponseCompositionOptions, x as ResponseFunction, e as ResponseResolver, t as ResponseResolverReturnType, R as ResponseTransformer, S as SetupWorkerApi, l as SharedOptions, q as StartOptions, o as createResponseComposition, p as defaultContext, n as defaultResponse, r as response } from './glossary-c690f512.js';
1
+ import { R as ResponseTransformer, s as status, a as set, d as delay, f as fetch, b as RequestHandler, S as SetupWorkerApi, D as DefaultContext, c as DefaultBodyType, M as MockedRequest, e as ResponseResolver, g as ResponseResolutionContext, h as SerializedResponse, i as RequestHandlerDefaultInfo, j as MockedResponse, k as ResponseLookupResult, l as SharedOptions, m as ServerLifecycleEventsMap } from './glossary-3d04462e.js';
2
+ export { A as AsyncResponseResolverReturnType, c as DefaultBodyType, u as DefaultRequestMultipartBody, y as DelayMode, M as MockedRequest, H as MockedRequestInit, j as MockedResponse, z as RequestCache, E as RequestDestination, b as RequestHandler, B as RequestMode, F as RequestPriority, C as RequestRedirect, G as RequestReferrerPolicy, v as ResponseComposition, w as ResponseCompositionOptions, x as ResponseFunction, e as ResponseResolver, t as ResponseResolverReturnType, R as ResponseTransformer, S as SetupWorkerApi, l as SharedOptions, q as StartOptions, o as createResponseComposition, p as defaultContext, n as defaultResponse, r as response } from './glossary-3d04462e.js';
3
3
  import * as cookieUtils from 'cookie';
4
4
  import { GraphQLError, OperationTypeNode, DocumentNode } from 'graphql';
5
5
  import { StrictEventEmitter } from 'strict-event-emitter';
@@ -170,7 +170,7 @@ declare class RestHandler<RequestType extends MockedRequest<DefaultBodyType> = M
170
170
  parse(request: RequestType, resolutionContext?: ResponseResolutionContext): Match;
171
171
  protected getPublicRequest(request: RequestType, parsedResult: ParsedRestRequest): RestRequest<any, PathParams>;
172
172
  predicate(request: RequestType, parsedResult: ParsedRestRequest): boolean;
173
- log(request: RequestType, response: SerializedResponse): void;
173
+ log(request: RequestType, response: SerializedResponse<any>): void;
174
174
  }
175
175
 
176
176
  declare const rest: {
@@ -236,7 +236,7 @@ declare class GraphQLHandler<Request extends GraphQLRequest<any> = GraphQLReques
236
236
  parse(request: MockedRequest): ParsedGraphQLRequest<GraphQLVariables>;
237
237
  protected getPublicRequest(request: Request, parsedResult: ParsedGraphQLRequest): GraphQLRequest<any>;
238
238
  predicate(request: MockedRequest, parsedResult: ParsedGraphQLRequest): boolean;
239
- log(request: Request, response: SerializedResponse, handler: this, parsedRequest: ParsedGraphQLRequest): void;
239
+ log(request: Request, response: SerializedResponse<any>, parsedRequest: ParsedGraphQLRequest): void;
240
240
  }
241
241
 
242
242
  interface TypedDocumentNode<Result = {
@@ -343,11 +343,6 @@ interface HandleRequestOptions<ResponseType> {
343
343
  * Invoked when the mocked response is ready to be sent.
344
344
  */
345
345
  onMockedResponse?(response: ResponseType, handler: RequiredDeep<ResponseLookupResult>): void;
346
- /**
347
- * Invoked when the mocked response is sent.
348
- * Respects the response delay duration.
349
- */
350
- onMockedResponseSent?(response: ResponseType, handler: RequiredDeep<ResponseLookupResult>): void;
351
346
  }
352
347
  declare function handleRequest<ResponseType extends Record<string, any> = MockedResponse<string>>(request: MockedRequest, handlers: RequestHandler[], options: RequiredDeep<SharedOptions>, emitter: StrictEventEmitter<ServerLifecycleEventsMap>, handleRequestOptions?: HandleRequestOptions<ResponseType>): Promise<ResponseType | undefined>;
353
348
 
package/lib/index.js CHANGED
@@ -675,6 +675,9 @@ var getResponse = async (request, handlers, resolutionContext) => {
675
675
  // src/utils/request/onUnhandledRequest.ts
676
676
  var import_js_levenshtein = __toESM(require("js-levenshtein"));
677
677
 
678
+ // src/utils/internal/parseGraphQLRequest.ts
679
+ var import_graphql = require("graphql");
680
+
678
681
  // src/utils/request/getPublicUrlFromRequest.ts
679
682
  var getPublicUrlFromRequest = (request) => {
680
683
  return request.referrer.startsWith(request.url.origin) ? request.url.pathname : new URL(request.url.pathname, `${request.url.protocol}//${request.url.host}`).href;
@@ -693,8 +696,7 @@ function parseDocumentNode(node) {
693
696
  }
694
697
  function parseQuery(query) {
695
698
  try {
696
- const { parse: parse3 } = require("graphql");
697
- const ast = parse3(query);
699
+ const ast = (0, import_graphql.parse)(query);
698
700
  return parseDocumentNode(ast);
699
701
  } catch (error2) {
700
702
  return error2;
@@ -1089,10 +1091,7 @@ var RestHandler = class extends RequestHandler {
1089
1091
  const statusColor = getStatusCodeColor(response2.status);
1090
1092
  console.groupCollapsed(devUtils.formatMessage("%s %s %s (%c%s%c)"), getTimestamp(), request.method, publicUrl, `color:${statusColor}`, `${response2.status} ${response2.statusText}`, "color:inherit");
1091
1093
  console.log("Request", loggedRequest);
1092
- console.log("Handler:", {
1093
- mask: this.info.path,
1094
- resolver: this.resolver
1095
- });
1094
+ console.log("Handler:", this);
1096
1095
  console.log("Response", loggedResponse);
1097
1096
  console.groupEnd();
1098
1097
  }
@@ -1194,7 +1193,7 @@ Consider naming this operation or using "graphql.operation" request handler to i
1194
1193
  const hasMatchingOperationName = this.info.operationName instanceof RegExp ? this.info.operationName.test(parsedResult.operationName || "") : parsedResult.operationName === this.info.operationName;
1195
1194
  return hasMatchingUrl.matches && hasMatchingOperationType && hasMatchingOperationName;
1196
1195
  }
1197
- log(request, response2, handler, parsedRequest) {
1196
+ log(request, response2, parsedRequest) {
1198
1197
  const loggedRequest = prepareRequest(request);
1199
1198
  const loggedResponse = prepareResponse(response2);
1200
1199
  const statusColor = getStatusCodeColor(response2.status);
@@ -1325,7 +1324,7 @@ function readResponseCookies(request, response2) {
1325
1324
 
1326
1325
  // src/utils/handleRequest.ts
1327
1326
  async function handleRequest(request, handlers, options, emitter, handleRequestOptions) {
1328
- var _a, _b, _c, _d, _e, _f, _g;
1327
+ var _a, _b, _c, _d, _e, _f;
1329
1328
  emitter.emit("request:start", request);
1330
1329
  if (request.headers.get("x-msw-bypass") === "true") {
1331
1330
  emitter.emit("request:end", request);
@@ -1366,11 +1365,21 @@ async function handleRequest(request, handlers, options, emitter, handleRequestO
1366
1365
  const requiredLookupResult = lookupResult;
1367
1366
  const transformedResponse = ((_e = handleRequestOptions == null ? void 0 : handleRequestOptions.transformResponse) == null ? void 0 : _e.call(handleRequestOptions, response2)) || response2;
1368
1367
  (_f = handleRequestOptions == null ? void 0 : handleRequestOptions.onMockedResponse) == null ? void 0 : _f.call(handleRequestOptions, transformedResponse, requiredLookupResult);
1369
- (_g = handleRequestOptions == null ? void 0 : handleRequestOptions.onMockedResponseSent) == null ? void 0 : _g.call(handleRequestOptions, transformedResponse, requiredLookupResult);
1370
1368
  emitter.emit("request:end", request);
1371
1369
  return transformedResponse;
1372
1370
  }
1373
1371
 
1372
+ // src/utils/logging/serializeResponse.ts
1373
+ var import_headers_polyfill8 = require("headers-polyfill");
1374
+ function serializeResponse(source) {
1375
+ return {
1376
+ status: source.status,
1377
+ statusText: source.statusText,
1378
+ headers: (0, import_headers_polyfill8.flattenHeadersObject)((0, import_headers_polyfill8.headersToObject)(source.headers)),
1379
+ body: source.body
1380
+ };
1381
+ }
1382
+
1374
1383
  // src/setupWorker/start/createRequestListener.ts
1375
1384
  var createRequestListener = (context, options) => {
1376
1385
  return async (event, message) => {
@@ -1382,7 +1391,7 @@ var createRequestListener = (context, options) => {
1382
1391
  onPassthroughResponse() {
1383
1392
  messageChannel.postMessage("NOT_FOUND");
1384
1393
  },
1385
- async onMockedResponse(response2) {
1394
+ async onMockedResponse(response2, { handler, publicRequest, parsedRequest }) {
1386
1395
  if (response2.body instanceof ReadableStream) {
1387
1396
  throw new Error(devUtils.formatMessage('Failed to construct a mocked response with a "ReadableStream" body: mocked streams are not supported. Follow https://github.com/mswjs/msw/issues/1336 for more details.'));
1388
1397
  }
@@ -1392,12 +1401,11 @@ var createRequestListener = (context, options) => {
1392
1401
  messageChannel.postMessage("MOCK_RESPONSE", __spreadProps(__spreadValues({}, response2), {
1393
1402
  body: responseBody
1394
1403
  }), [responseBodyBuffer]);
1395
- },
1396
- onMockedResponseSent(response2, { handler, publicRequest, parsedRequest }) {
1397
- if (options.quiet) {
1398
- return;
1404
+ if (!options.quiet) {
1405
+ context.emitter.once("response:mocked", (response3) => {
1406
+ handler.log(publicRequest, serializeResponse(response3), parsedRequest);
1407
+ });
1399
1408
  }
1400
- handler.log(publicRequest, response2, handler, parsedRequest);
1401
1409
  }
1402
1410
  });
1403
1411
  } catch (error2) {
@@ -1623,11 +1631,44 @@ function prepareStartHandler(handler, context) {
1623
1631
  }
1624
1632
 
1625
1633
  // src/setupWorker/start/createFallbackRequestListener.ts
1626
- var import_interceptors3 = require("@mswjs/interceptors");
1634
+ var import_interceptors4 = require("@mswjs/interceptors");
1627
1635
  var import_fetch3 = require("@mswjs/interceptors/lib/interceptors/fetch");
1628
1636
  var import_XMLHttpRequest = require("@mswjs/interceptors/lib/interceptors/XMLHttpRequest");
1637
+
1638
+ // src/utils/request/createResponseFromIsomorphicResponse.ts
1639
+ var import_interceptors3 = require("@mswjs/interceptors");
1640
+ var noop = () => {
1641
+ throw new Error("Not implemented");
1642
+ };
1643
+ function createResponseFromIsomorphicResponse(response2) {
1644
+ return __spreadProps(__spreadValues({}, response2), {
1645
+ ok: response2.status >= 200 && response2.status < 300,
1646
+ url: "",
1647
+ type: "default",
1648
+ status: response2.status,
1649
+ statusText: response2.statusText,
1650
+ headers: response2.headers,
1651
+ body: new ReadableStream(),
1652
+ redirected: response2.headers.get("Location") != null,
1653
+ async text() {
1654
+ return response2.body || "";
1655
+ },
1656
+ async json() {
1657
+ return JSON.parse(response2.body || "");
1658
+ },
1659
+ async arrayBuffer() {
1660
+ return (0, import_interceptors3.encodeBuffer)(response2.body || "");
1661
+ },
1662
+ bodyUsed: false,
1663
+ formData: noop,
1664
+ blob: noop,
1665
+ clone: noop
1666
+ });
1667
+ }
1668
+
1669
+ // src/setupWorker/start/createFallbackRequestListener.ts
1629
1670
  function createFallbackRequestListener(context, options) {
1630
- const interceptor = new import_interceptors3.BatchInterceptor({
1671
+ const interceptor = new import_interceptors4.BatchInterceptor({
1631
1672
  name: "fallback",
1632
1673
  interceptors: [new import_fetch3.FetchInterceptor(), new import_XMLHttpRequest.XMLHttpRequestInterceptor()]
1633
1674
  });
@@ -1645,9 +1686,11 @@ function createFallbackRequestListener(context, options) {
1645
1686
  delay: response3.delay
1646
1687
  };
1647
1688
  },
1648
- onMockedResponseSent(response3, { handler, publicRequest, parsedRequest }) {
1689
+ onMockedResponse(_, { handler, publicRequest, parsedRequest }) {
1649
1690
  if (!options.quiet) {
1650
- handler.log(publicRequest, response3, handler, parsedRequest);
1691
+ context.emitter.once("response:mocked", (response3) => {
1692
+ handler.log(publicRequest, serializeResponse(response3), parsedRequest);
1693
+ });
1651
1694
  }
1652
1695
  }
1653
1696
  });
@@ -1655,6 +1698,17 @@ function createFallbackRequestListener(context, options) {
1655
1698
  request.respondWith(response2);
1656
1699
  }
1657
1700
  });
1701
+ interceptor.on("response", (request, response2) => {
1702
+ if (!request.id) {
1703
+ return;
1704
+ }
1705
+ const browserResponse = createResponseFromIsomorphicResponse(response2);
1706
+ if (response2.headers.get("x-powered-by") === "msw") {
1707
+ context.emitter.emit("response:mocked", browserResponse, request.id);
1708
+ } else {
1709
+ context.emitter.emit("response:bypass", browserResponse, request.id);
1710
+ }
1711
+ });
1658
1712
  interceptor.apply();
1659
1713
  return interceptor;
1660
1714
  }