msw 2.0.8 → 2.0.10

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 (37) hide show
  1. package/lib/browser/index.js +16 -13
  2. package/lib/browser/index.mjs +14 -11
  3. package/lib/core/{GraphQLHandler-d4787f91.d.ts → GraphQLHandler-907fc607.d.ts} +22 -8
  4. package/lib/core/HttpResponse.d.ts +1 -1
  5. package/lib/core/{RequestHandler-bb5cbb8f.d.ts → RequestHandler-50ddea0c.d.ts} +4 -0
  6. package/lib/core/SetupApi.d.ts +1 -1
  7. package/lib/core/SetupApi.js +14 -11
  8. package/lib/core/SetupApi.mjs +14 -11
  9. package/lib/core/graphql.d.ts +2 -2
  10. package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
  11. package/lib/core/handlers/GraphQLHandler.js +11 -13
  12. package/lib/core/handlers/GraphQLHandler.mjs +11 -13
  13. package/lib/core/handlers/HttpHandler.d.ts +1 -1
  14. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  15. package/lib/core/handlers/RequestHandler.js +4 -0
  16. package/lib/core/handlers/RequestHandler.mjs +4 -0
  17. package/lib/core/http.d.ts +1 -1
  18. package/lib/core/index.d.ts +2 -2
  19. package/lib/core/sharedOptions.d.ts +1 -1
  20. package/lib/core/utils/HttpResponse/decorators.d.ts +1 -1
  21. package/lib/core/utils/getResponse.d.ts +1 -1
  22. package/lib/core/utils/handleRequest.d.ts +9 -2
  23. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
  24. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  25. package/lib/core/utils/internal/pipeEvents.js +3 -2
  26. package/lib/core/utils/internal/pipeEvents.mjs +3 -2
  27. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  28. package/lib/core/utils/request/onUnhandledRequest.d.ts +1 -1
  29. package/lib/iife/index.js +88 -225
  30. package/lib/mockServiceWorker.js +4 -9
  31. package/lib/native/index.d.ts +1 -12
  32. package/lib/native/index.js +4 -58
  33. package/lib/native/index.mjs +4 -48
  34. package/lib/node/index.d.ts +1 -12
  35. package/lib/node/index.js +31 -54
  36. package/lib/node/index.mjs +31 -44
  37. package/package.json +4 -3
@@ -209,14 +209,7 @@ var WorkerChannel = class {
209
209
  }
210
210
  postMessage(event, ...rest) {
211
211
  const [data, transfer] = rest;
212
- this.port.postMessage(
213
- { type: event, data },
214
- {
215
- // @ts-ignore ReadableStream can be transferred
216
- // but TypeScript doesn't acknowledge that.
217
- transfer
218
- }
219
- );
212
+ this.port.postMessage({ type: event, data }, { transfer });
220
213
  }
221
214
  };
222
215
 
@@ -327,9 +320,9 @@ function requestIntegrityCheck(context, serviceWorker) {
327
320
  const { payload: actualChecksum } = yield context.events.once(
328
321
  "INTEGRITY_CHECK_RESPONSE"
329
322
  );
330
- if (actualChecksum !== "0877fcdc026242810f5bfde0d7178db4") {
323
+ if (actualChecksum !== "c5f7f8e188b673ea4e677df7ea3c5a39") {
331
324
  throw new Error(
332
- `Currently active Service Worker (${actualChecksum}) is behind the latest published one (${"0877fcdc026242810f5bfde0d7178db4"}).`
325
+ `Currently active Service Worker (${actualChecksum}) is behind the latest published one (${"c5f7f8e188b673ea4e677df7ea3c5a39"}).`
333
326
  );
334
327
  }
335
328
  return serviceWorker;
@@ -355,6 +348,7 @@ function deferNetworkRequestsUntil(predicatePromise) {
355
348
  }
356
349
 
357
350
  // src/browser/setupWorker/start/createResponseListener.ts
351
+ var import_interceptors = require("@mswjs/interceptors");
358
352
  function createResponseListener(context) {
359
353
  return (_, message) => {
360
354
  var _a;
@@ -362,7 +356,16 @@ function createResponseListener(context) {
362
356
  if ((_a = responseJson.type) == null ? void 0 : _a.includes("opaque")) {
363
357
  return;
364
358
  }
365
- const response = responseJson.status === 0 ? Response.error() : new Response(responseJson.body, responseJson);
359
+ const response = responseJson.status === 0 ? Response.error() : new Response(
360
+ /**
361
+ * Responses may be streams here, but when we create a response object
362
+ * with null-body status codes, like 204, 205, 304 Response will
363
+ * throw when passed a non-null body, so ensure it's null here
364
+ * for those codes
365
+ */
366
+ (0, import_interceptors.isResponseWithoutBody)(responseJson.status) ? null : responseJson.body,
367
+ responseJson
368
+ );
366
369
  context.emitter.emit(
367
370
  responseJson.isMockedResponse ? "response:mocked" : "response:bypass",
368
371
  {
@@ -527,12 +530,12 @@ var DEFAULT_START_OPTIONS = {
527
530
  };
528
531
 
529
532
  // src/browser/setupWorker/start/createFallbackRequestListener.ts
530
- var import_interceptors = require("@mswjs/interceptors");
533
+ var import_interceptors2 = require("@mswjs/interceptors");
531
534
  var import_fetch = require("@mswjs/interceptors/fetch");
532
535
  var import_XMLHttpRequest = require("@mswjs/interceptors/XMLHttpRequest");
533
536
  var import_handleRequest2 = require("../core/utils/handleRequest.js");
534
537
  function createFallbackRequestListener(context, options) {
535
- const interceptor = new import_interceptors.BatchInterceptor({
538
+ const interceptor = new import_interceptors2.BatchInterceptor({
536
539
  name: "fallback",
537
540
  interceptors: [new import_fetch.FetchInterceptor(), new import_XMLHttpRequest.XMLHttpRequestInterceptor()]
538
541
  });
@@ -185,14 +185,7 @@ var WorkerChannel = class {
185
185
  }
186
186
  postMessage(event, ...rest) {
187
187
  const [data, transfer] = rest;
188
- this.port.postMessage(
189
- { type: event, data },
190
- {
191
- // @ts-ignore ReadableStream can be transferred
192
- // but TypeScript doesn't acknowledge that.
193
- transfer
194
- }
195
- );
188
+ this.port.postMessage({ type: event, data }, { transfer });
196
189
  }
197
190
  };
198
191
 
@@ -303,9 +296,9 @@ function requestIntegrityCheck(context, serviceWorker) {
303
296
  const { payload: actualChecksum } = yield context.events.once(
304
297
  "INTEGRITY_CHECK_RESPONSE"
305
298
  );
306
- if (actualChecksum !== "0877fcdc026242810f5bfde0d7178db4") {
299
+ if (actualChecksum !== "c5f7f8e188b673ea4e677df7ea3c5a39") {
307
300
  throw new Error(
308
- `Currently active Service Worker (${actualChecksum}) is behind the latest published one (${"0877fcdc026242810f5bfde0d7178db4"}).`
301
+ `Currently active Service Worker (${actualChecksum}) is behind the latest published one (${"c5f7f8e188b673ea4e677df7ea3c5a39"}).`
309
302
  );
310
303
  }
311
304
  return serviceWorker;
@@ -331,6 +324,7 @@ function deferNetworkRequestsUntil(predicatePromise) {
331
324
  }
332
325
 
333
326
  // src/browser/setupWorker/start/createResponseListener.ts
327
+ import { isResponseWithoutBody } from "@mswjs/interceptors";
334
328
  function createResponseListener(context) {
335
329
  return (_, message) => {
336
330
  var _a;
@@ -338,7 +332,16 @@ function createResponseListener(context) {
338
332
  if ((_a = responseJson.type) == null ? void 0 : _a.includes("opaque")) {
339
333
  return;
340
334
  }
341
- const response = responseJson.status === 0 ? Response.error() : new Response(responseJson.body, responseJson);
335
+ const response = responseJson.status === 0 ? Response.error() : new Response(
336
+ /**
337
+ * Responses may be streams here, but when we create a response object
338
+ * with null-body status codes, like 204, 205, 304 Response will
339
+ * throw when passed a non-null body, so ensure it's null here
340
+ * for those codes
341
+ */
342
+ isResponseWithoutBody(responseJson.status) ? null : responseJson.body,
343
+ responseJson
344
+ );
342
345
  context.emitter.emit(
343
346
  responseJson.isMockedResponse ? "response:mocked" : "response:bypass",
344
347
  {
@@ -1,6 +1,6 @@
1
1
  import { OperationTypeNode, DocumentNode, GraphQLError } from 'graphql';
2
- import { g as RequestHandlerDefaultInfo, D as DefaultBodyType, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-bb5cbb8f.js';
3
- import { Path } from './utils/matching/matchRequestUrl.js';
2
+ import { g as RequestHandlerDefaultInfo, D as DefaultBodyType, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-50ddea0c.js';
3
+ import { Match, Path } from './utils/matching/matchRequestUrl.js';
4
4
 
5
5
  interface ParsedGraphQLQuery {
6
6
  operationType: OperationTypeNode;
@@ -31,6 +31,20 @@ interface GraphQLHandlerInfo extends RequestHandlerDefaultInfo {
31
31
  operationType: ExpectedOperationTypeNode;
32
32
  operationName: GraphQLHandlerNameSelector;
33
33
  }
34
+ type GraphQLRequestParsedResult = {
35
+ match: Match;
36
+ } & (ParsedGraphQLRequest<GraphQLVariables>
37
+ /**
38
+ * An empty version of the ParsedGraphQLRequest
39
+ * which simplifies the return type of the resolver
40
+ * when the request is to a non-matching endpoint
41
+ */
42
+ | {
43
+ operationType?: undefined;
44
+ operationName?: undefined;
45
+ query?: undefined;
46
+ variables?: undefined;
47
+ });
34
48
  type GraphQLResolverExtras<Variables extends GraphQLVariables> = {
35
49
  query: string;
36
50
  operationName: string;
@@ -47,19 +61,19 @@ interface GraphQLResponseBody<BodyType extends DefaultBodyType> {
47
61
  errors?: readonly Partial<GraphQLError>[] | null;
48
62
  }
49
63
  declare function isDocumentNode(value: DocumentNode | any): value is DocumentNode;
50
- declare class GraphQLHandler extends RequestHandler<GraphQLHandlerInfo, ParsedGraphQLRequest, GraphQLResolverExtras<any>> {
64
+ declare class GraphQLHandler extends RequestHandler<GraphQLHandlerInfo, GraphQLRequestParsedResult, GraphQLResolverExtras<any>> {
51
65
  private endpoint;
52
66
  constructor(operationType: ExpectedOperationTypeNode, operationName: GraphQLHandlerNameSelector, endpoint: Path, resolver: ResponseResolver<GraphQLResolverExtras<any>, any, any>, options?: RequestHandlerOptions);
53
67
  parse(args: {
54
68
  request: Request;
55
- }): Promise<ParsedGraphQLRequest<GraphQLVariables>>;
69
+ }): Promise<GraphQLRequestParsedResult>;
56
70
  predicate(args: {
57
71
  request: Request;
58
- parsedResult: ParsedGraphQLRequest<GraphQLVariables>;
72
+ parsedResult: GraphQLRequestParsedResult;
59
73
  }): boolean;
60
74
  protected extendResolverArgs(args: {
61
75
  request: Request;
62
- parsedResult: ParsedGraphQLRequest<GraphQLVariables>;
76
+ parsedResult: GraphQLRequestParsedResult;
63
77
  }): {
64
78
  query: string;
65
79
  operationName: string;
@@ -69,8 +83,8 @@ declare class GraphQLHandler extends RequestHandler<GraphQLHandlerInfo, ParsedGr
69
83
  log(args: {
70
84
  request: Request;
71
85
  response: Response;
72
- parsedResult: ParsedGraphQLRequest;
86
+ parsedResult: GraphQLRequestParsedResult;
73
87
  }): Promise<void>;
74
88
  }
75
89
 
76
- export { ExpectedOperationTypeNode as E, GraphQLHandler as G, ParsedGraphQLRequest as P, GraphQLVariables as a, GraphQLRequestBody as b, GraphQLJsonRequestBody as c, GraphQLHandlerNameSelector as d, GraphQLResolverExtras as e, GraphQLResponseBody as f, ParsedGraphQLQuery as g, GraphQLParsedOperationsMap as h, GraphQLMultipartRequestBody as i, parseGraphQLRequest as j, GraphQLHandlerInfo as k, isDocumentNode as l, parseDocumentNode as p };
90
+ export { ExpectedOperationTypeNode as E, GraphQLHandler as G, ParsedGraphQLRequest as P, GraphQLVariables as a, GraphQLRequestBody as b, GraphQLJsonRequestBody as c, GraphQLHandlerNameSelector as d, GraphQLResolverExtras as e, GraphQLResponseBody as f, ParsedGraphQLQuery as g, GraphQLParsedOperationsMap as h, GraphQLMultipartRequestBody as i, parseGraphQLRequest as j, GraphQLHandlerInfo as k, GraphQLRequestParsedResult as l, isDocumentNode as m, parseDocumentNode as p };
@@ -1,2 +1,2 @@
1
- export { f as HttpResponse, H as HttpResponseInit, S as StrictRequest, e as StrictResponse } from './RequestHandler-bb5cbb8f.js';
1
+ export { f as HttpResponse, H as HttpResponseInit, S as StrictRequest, e as StrictResponse } from './RequestHandler-50ddea0c.js';
2
2
  import './typeUtils.js';
@@ -149,6 +149,10 @@ declare abstract class RequestHandler<HandlerInfo extends RequestHandlerDefaultI
149
149
  }): Promise<ParsedResult>;
150
150
  /**
151
151
  * Test if this handler matches the given request.
152
+ *
153
+ * This method is not used internally but is exposed
154
+ * as a convenience method for consumers writing custom
155
+ * handlers.
152
156
  */
153
157
  test(args: {
154
158
  request: Request;
@@ -1,5 +1,5 @@
1
1
  import { EventMap, Emitter } from 'strict-event-emitter';
2
- import { R as RequestHandler, g as RequestHandlerDefaultInfo } from './RequestHandler-bb5cbb8f.js';
2
+ import { R as RequestHandler, g as RequestHandlerDefaultInfo } from './RequestHandler-50ddea0c.js';
3
3
  import { LifeCycleEventEmitter } from './sharedOptions.js';
4
4
  import { Disposable } from './utils/internal/Disposable.js';
5
5
  import './typeUtils.js';
@@ -30,7 +30,12 @@ var import_Disposable = require("./utils/internal/Disposable.js");
30
30
  class SetupApi extends import_Disposable.Disposable {
31
31
  constructor(...initialHandlers) {
32
32
  super();
33
- this.validateHandlers(...initialHandlers);
33
+ (0, import_outvariant.invariant)(
34
+ this.validateHandlers(initialHandlers),
35
+ import_devUtils.devUtils.formatMessage(
36
+ `Failed to apply given request handlers: invalid input. Did you forget to spread the request handlers Array?`
37
+ )
38
+ );
34
39
  this.initialHandlers = (0, import_toReadonlyArray.toReadonlyArray)(initialHandlers);
35
40
  this.currentHandlers = [...initialHandlers];
36
41
  this.emitter = new import_strict_event_emitter.Emitter();
@@ -42,18 +47,16 @@ class SetupApi extends import_Disposable.Disposable {
42
47
  this.publicEmitter.removeAllListeners();
43
48
  });
44
49
  }
45
- validateHandlers(...handlers) {
46
- for (const handler of handlers) {
47
- (0, import_outvariant.invariant)(
48
- !Array.isArray(handler),
49
- import_devUtils.devUtils.formatMessage(
50
- 'Failed to construct "%s" given an Array of request handlers. Make sure you spread the request handlers when calling the respective setup function.'
51
- ),
52
- this.constructor.name
53
- );
54
- }
50
+ validateHandlers(handlers) {
51
+ return handlers.every((handler) => !Array.isArray(handler));
55
52
  }
56
53
  use(...runtimeHandlers) {
54
+ (0, import_outvariant.invariant)(
55
+ this.validateHandlers(runtimeHandlers),
56
+ import_devUtils.devUtils.formatMessage(
57
+ `Failed to call "use()" with the given request handlers: invalid input. Did you forget to spread the array of request handlers?`
58
+ )
59
+ );
57
60
  this.currentHandlers.unshift(...runtimeHandlers);
58
61
  }
59
62
  restoreHandlers() {
@@ -7,7 +7,12 @@ import { Disposable } from './utils/internal/Disposable.mjs';
7
7
  class SetupApi extends Disposable {
8
8
  constructor(...initialHandlers) {
9
9
  super();
10
- this.validateHandlers(...initialHandlers);
10
+ invariant(
11
+ this.validateHandlers(initialHandlers),
12
+ devUtils.formatMessage(
13
+ `Failed to apply given request handlers: invalid input. Did you forget to spread the request handlers Array?`
14
+ )
15
+ );
11
16
  this.initialHandlers = toReadonlyArray(initialHandlers);
12
17
  this.currentHandlers = [...initialHandlers];
13
18
  this.emitter = new Emitter();
@@ -19,18 +24,16 @@ class SetupApi extends Disposable {
19
24
  this.publicEmitter.removeAllListeners();
20
25
  });
21
26
  }
22
- validateHandlers(...handlers) {
23
- for (const handler of handlers) {
24
- invariant(
25
- !Array.isArray(handler),
26
- devUtils.formatMessage(
27
- 'Failed to construct "%s" given an Array of request handlers. Make sure you spread the request handlers when calling the respective setup function.'
28
- ),
29
- this.constructor.name
30
- );
31
- }
27
+ validateHandlers(handlers) {
28
+ return handlers.every((handler) => !Array.isArray(handler));
32
29
  }
33
30
  use(...runtimeHandlers) {
31
+ invariant(
32
+ this.validateHandlers(runtimeHandlers),
33
+ devUtils.formatMessage(
34
+ `Failed to call "use()" with the given request handlers: invalid input. Did you forget to spread the array of request handlers?`
35
+ )
36
+ );
34
37
  this.currentHandlers.unshift(...runtimeHandlers);
35
38
  }
36
39
  restoreHandlers() {
@@ -1,6 +1,6 @@
1
1
  import { DocumentNode } from 'graphql';
2
- import { a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-bb5cbb8f.js';
3
- import { a as GraphQLVariables, d as GraphQLHandlerNameSelector, e as GraphQLResolverExtras, f as GraphQLResponseBody, G as GraphQLHandler } from './GraphQLHandler-d4787f91.js';
2
+ import { a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-50ddea0c.js';
3
+ import { a as GraphQLVariables, d as GraphQLHandlerNameSelector, e as GraphQLResolverExtras, f as GraphQLResponseBody, G as GraphQLHandler } from './GraphQLHandler-907fc607.js';
4
4
  import { Path } from './utils/matching/matchRequestUrl.js';
5
5
  import './typeUtils.js';
6
6
 
@@ -1,5 +1,5 @@
1
1
  import 'graphql';
2
- import '../RequestHandler-bb5cbb8f.js';
2
+ import '../RequestHandler-50ddea0c.js';
3
3
  import '../utils/matching/matchRequestUrl.js';
4
- export { E as ExpectedOperationTypeNode, G as GraphQLHandler, k as GraphQLHandlerInfo, d as GraphQLHandlerNameSelector, c as GraphQLJsonRequestBody, b as GraphQLRequestBody, e as GraphQLResolverExtras, f as GraphQLResponseBody, a as GraphQLVariables, l as isDocumentNode } from '../GraphQLHandler-d4787f91.js';
4
+ export { E as ExpectedOperationTypeNode, G as GraphQLHandler, k as GraphQLHandlerInfo, d as GraphQLHandlerNameSelector, c as GraphQLJsonRequestBody, b as GraphQLRequestBody, l as GraphQLRequestParsedResult, e as GraphQLResolverExtras, f as GraphQLResponseBody, a as GraphQLVariables, m as isDocumentNode } from '../GraphQLHandler-907fc607.js';
5
5
  import '../typeUtils.js';
@@ -89,6 +89,9 @@ class GraphQLHandler extends import_RequestHandler.RequestHandler {
89
89
  }
90
90
  parse(args) {
91
91
  return __async(this, null, function* () {
92
+ const match = (0, import_matchRequestUrl.matchRequestUrl)(new URL(args.request.url), this.endpoint);
93
+ if (!match.matches)
94
+ return { match };
92
95
  const parsedResult = yield (0, import_parseGraphQLRequest.parseGraphQLRequest)(args.request).catch(
93
96
  (error) => {
94
97
  console.error(error);
@@ -96,9 +99,10 @@ class GraphQLHandler extends import_RequestHandler.RequestHandler {
96
99
  }
97
100
  );
98
101
  if (typeof parsedResult === "undefined") {
99
- return void 0;
102
+ return { match };
100
103
  }
101
104
  return {
105
+ match,
102
106
  query: parsedResult.query,
103
107
  operationType: parsedResult.operationType,
104
108
  operationName: parsedResult.operationName,
@@ -107,7 +111,7 @@ class GraphQLHandler extends import_RequestHandler.RequestHandler {
107
111
  });
108
112
  }
109
113
  predicate(args) {
110
- if (!args.parsedResult) {
114
+ if (args.parsedResult.operationType === void 0) {
111
115
  return false;
112
116
  }
113
117
  if (!args.parsedResult.operationName && this.info.operationType !== "all") {
@@ -117,31 +121,25 @@ class GraphQLHandler extends import_RequestHandler.RequestHandler {
117
121
  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/#graphqloperationresolver`);
118
122
  return false;
119
123
  }
120
- const hasMatchingUrl = (0, import_matchRequestUrl.matchRequestUrl)(
121
- new URL(args.request.url),
122
- this.endpoint
123
- );
124
124
  const hasMatchingOperationType = this.info.operationType === "all" || args.parsedResult.operationType === this.info.operationType;
125
125
  const hasMatchingOperationName = this.info.operationName instanceof RegExp ? this.info.operationName.test(args.parsedResult.operationName || "") : args.parsedResult.operationName === this.info.operationName;
126
- return hasMatchingUrl.matches && hasMatchingOperationType && hasMatchingOperationName;
126
+ return args.parsedResult.match.matches && hasMatchingOperationType && hasMatchingOperationName;
127
127
  }
128
128
  extendResolverArgs(args) {
129
- var _a, _b, _c;
130
129
  const cookies = (0, import_getRequestCookies.getAllRequestCookies)(args.request);
131
130
  return {
132
- query: ((_a = args.parsedResult) == null ? void 0 : _a.query) || "",
133
- operationName: ((_b = args.parsedResult) == null ? void 0 : _b.operationName) || "",
134
- variables: ((_c = args.parsedResult) == null ? void 0 : _c.variables) || {},
131
+ query: args.parsedResult.query || "",
132
+ operationName: args.parsedResult.operationName || "",
133
+ variables: args.parsedResult.variables || {},
135
134
  cookies
136
135
  };
137
136
  }
138
137
  log(args) {
139
138
  return __async(this, null, function* () {
140
- var _a, _b, _c, _d;
141
139
  const loggedRequest = yield (0, import_serializeRequest.serializeRequest)(args.request);
142
140
  const loggedResponse = yield (0, import_serializeResponse.serializeResponse)(args.response);
143
141
  const statusColor = (0, import_getStatusCodeColor.getStatusCodeColor)(loggedResponse.status);
144
- const requestInfo = ((_a = args.parsedResult) == null ? void 0 : _a.operationName) ? `${(_b = args.parsedResult) == null ? void 0 : _b.operationType} ${(_c = args.parsedResult) == null ? void 0 : _c.operationName}` : `anonymous ${(_d = args.parsedResult) == null ? void 0 : _d.operationType}`;
142
+ const requestInfo = args.parsedResult.operationName ? `${args.parsedResult.operationType} ${args.parsedResult.operationName}` : `anonymous ${args.parsedResult.operationType}`;
145
143
  console.groupCollapsed(
146
144
  import_devUtils.devUtils.formatMessage(
147
145
  `${(0, import_getTimestamp.getTimestamp)()} ${requestInfo} (%c${loggedResponse.status} ${loggedResponse.statusText}%c)`
@@ -70,6 +70,9 @@ class GraphQLHandler extends RequestHandler {
70
70
  }
71
71
  parse(args) {
72
72
  return __async(this, null, function* () {
73
+ const match = matchRequestUrl(new URL(args.request.url), this.endpoint);
74
+ if (!match.matches)
75
+ return { match };
73
76
  const parsedResult = yield parseGraphQLRequest(args.request).catch(
74
77
  (error) => {
75
78
  console.error(error);
@@ -77,9 +80,10 @@ class GraphQLHandler extends RequestHandler {
77
80
  }
78
81
  );
79
82
  if (typeof parsedResult === "undefined") {
80
- return void 0;
83
+ return { match };
81
84
  }
82
85
  return {
86
+ match,
83
87
  query: parsedResult.query,
84
88
  operationType: parsedResult.operationType,
85
89
  operationName: parsedResult.operationName,
@@ -88,7 +92,7 @@ class GraphQLHandler extends RequestHandler {
88
92
  });
89
93
  }
90
94
  predicate(args) {
91
- if (!args.parsedResult) {
95
+ if (args.parsedResult.operationType === void 0) {
92
96
  return false;
93
97
  }
94
98
  if (!args.parsedResult.operationName && this.info.operationType !== "all") {
@@ -98,31 +102,25 @@ class GraphQLHandler extends RequestHandler {
98
102
  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/#graphqloperationresolver`);
99
103
  return false;
100
104
  }
101
- const hasMatchingUrl = matchRequestUrl(
102
- new URL(args.request.url),
103
- this.endpoint
104
- );
105
105
  const hasMatchingOperationType = this.info.operationType === "all" || args.parsedResult.operationType === this.info.operationType;
106
106
  const hasMatchingOperationName = this.info.operationName instanceof RegExp ? this.info.operationName.test(args.parsedResult.operationName || "") : args.parsedResult.operationName === this.info.operationName;
107
- return hasMatchingUrl.matches && hasMatchingOperationType && hasMatchingOperationName;
107
+ return args.parsedResult.match.matches && hasMatchingOperationType && hasMatchingOperationName;
108
108
  }
109
109
  extendResolverArgs(args) {
110
- var _a, _b, _c;
111
110
  const cookies = getAllRequestCookies(args.request);
112
111
  return {
113
- query: ((_a = args.parsedResult) == null ? void 0 : _a.query) || "",
114
- operationName: ((_b = args.parsedResult) == null ? void 0 : _b.operationName) || "",
115
- variables: ((_c = args.parsedResult) == null ? void 0 : _c.variables) || {},
112
+ query: args.parsedResult.query || "",
113
+ operationName: args.parsedResult.operationName || "",
114
+ variables: args.parsedResult.variables || {},
116
115
  cookies
117
116
  };
118
117
  }
119
118
  log(args) {
120
119
  return __async(this, null, function* () {
121
- var _a, _b, _c, _d;
122
120
  const loggedRequest = yield serializeRequest(args.request);
123
121
  const loggedResponse = yield serializeResponse(args.response);
124
122
  const statusColor = getStatusCodeColor(loggedResponse.status);
125
- const requestInfo = ((_a = args.parsedResult) == null ? void 0 : _a.operationName) ? `${(_b = args.parsedResult) == null ? void 0 : _b.operationType} ${(_c = args.parsedResult) == null ? void 0 : _c.operationName}` : `anonymous ${(_d = args.parsedResult) == null ? void 0 : _d.operationType}`;
123
+ const requestInfo = args.parsedResult.operationName ? `${args.parsedResult.operationType} ${args.parsedResult.operationName}` : `anonymous ${args.parsedResult.operationType}`;
126
124
  console.groupCollapsed(
127
125
  devUtils.formatMessage(
128
126
  `${getTimestamp()} ${requestInfo} (%c${loggedResponse.status} ${loggedResponse.statusText}%c)`
@@ -1,4 +1,4 @@
1
- import { g as RequestHandlerDefaultInfo, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions, i as ResponseResolutionContext } from '../RequestHandler-bb5cbb8f.js';
1
+ import { g as RequestHandlerDefaultInfo, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions, i as ResponseResolutionContext } from '../RequestHandler-50ddea0c.js';
2
2
  import { Path, Match, PathParams } from '../utils/matching/matchRequestUrl.js';
3
3
  import '../typeUtils.js';
4
4
 
@@ -1,2 +1,2 @@
1
- export { A as AsyncResponseResolverReturnType, D as DefaultBodyType, d as DefaultRequestMultipartBody, J as JsonBodyType, M as MaybeAsyncResponseResolverReturnType, R as RequestHandler, m as RequestHandlerArgs, g as RequestHandlerDefaultInfo, n as RequestHandlerExecutionResult, k as RequestHandlerInternalInfo, c as RequestHandlerOptions, a as ResponseResolver, l as ResponseResolverInfo, b as ResponseResolverReturnType } from '../RequestHandler-bb5cbb8f.js';
1
+ export { A as AsyncResponseResolverReturnType, D as DefaultBodyType, d as DefaultRequestMultipartBody, J as JsonBodyType, M as MaybeAsyncResponseResolverReturnType, R as RequestHandler, m as RequestHandlerArgs, g as RequestHandlerDefaultInfo, n as RequestHandlerExecutionResult, k as RequestHandlerInternalInfo, c as RequestHandlerOptions, a as ResponseResolver, l as ResponseResolverInfo, b as ResponseResolverReturnType } from '../RequestHandler-50ddea0c.js';
2
2
  import '../typeUtils.js';
@@ -82,6 +82,10 @@ class RequestHandler {
82
82
  }
83
83
  /**
84
84
  * Test if this handler matches the given request.
85
+ *
86
+ * This method is not used internally but is exposed
87
+ * as a convenience method for consumers writing custom
88
+ * handlers.
85
89
  */
86
90
  test(args) {
87
91
  return __async(this, null, function* () {
@@ -61,6 +61,10 @@ class RequestHandler {
61
61
  }
62
62
  /**
63
63
  * Test if this handler matches the given request.
64
+ *
65
+ * This method is not used internally but is exposed
66
+ * as a convenience method for consumers writing custom
67
+ * handlers.
64
68
  */
65
69
  test(args) {
66
70
  return __async(this, null, function* () {
@@ -1,4 +1,4 @@
1
- import { D as DefaultBodyType, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-bb5cbb8f.js';
1
+ import { D as DefaultBodyType, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-50ddea0c.js';
2
2
  import { HttpRequestResolverExtras, HttpHandler } from './handlers/HttpHandler.js';
3
3
  import { PathParams, Path } from './utils/matching/matchRequestUrl.js';
4
4
  import './typeUtils.js';
@@ -1,9 +1,9 @@
1
1
  export { SetupApi } from './SetupApi.js';
2
- export { A as AsyncResponseResolverReturnType, D as DefaultBodyType, d as DefaultRequestMultipartBody, f as HttpResponse, H as HttpResponseInit, J as JsonBodyType, R as RequestHandler, c as RequestHandlerOptions, a as ResponseResolver, b as ResponseResolverReturnType, S as StrictRequest, e as StrictResponse } from './RequestHandler-bb5cbb8f.js';
2
+ export { A as AsyncResponseResolverReturnType, D as DefaultBodyType, d as DefaultRequestMultipartBody, f as HttpResponse, H as HttpResponseInit, J as JsonBodyType, R as RequestHandler, c as RequestHandlerOptions, a as ResponseResolver, b as ResponseResolverReturnType, S as StrictRequest, e as StrictResponse } from './RequestHandler-50ddea0c.js';
3
3
  export { http } from './http.js';
4
4
  export { HttpHandler, HttpMethods, HttpRequestParsedResult, RequestQuery } from './handlers/HttpHandler.js';
5
5
  export { graphql } from './graphql.js';
6
- export { G as GraphQLHandler, c as GraphQLJsonRequestBody, b as GraphQLRequestBody, a as GraphQLVariables, P as ParsedGraphQLRequest } from './GraphQLHandler-d4787f91.js';
6
+ export { G as GraphQLHandler, c as GraphQLJsonRequestBody, b as GraphQLRequestBody, a as GraphQLVariables, P as ParsedGraphQLRequest } from './GraphQLHandler-907fc607.js';
7
7
  export { Match, Path, PathParams, matchRequestUrl } from './utils/matching/matchRequestUrl.js';
8
8
  export { HandleRequestOptions, handleRequest } from './utils/handleRequest.js';
9
9
  export { cleanUrl } from './utils/url/cleanUrl.js';
@@ -1,6 +1,6 @@
1
1
  import { Emitter } from 'strict-event-emitter';
2
2
  import { UnhandledRequestStrategy } from './utils/request/onUnhandledRequest.js';
3
- import './RequestHandler-bb5cbb8f.js';
3
+ import './RequestHandler-50ddea0c.js';
4
4
  import './typeUtils.js';
5
5
 
6
6
  interface SharedOptions {
@@ -1,4 +1,4 @@
1
- import { H as HttpResponseInit } from '../../RequestHandler-bb5cbb8f.js';
1
+ import { H as HttpResponseInit } from '../../RequestHandler-50ddea0c.js';
2
2
  import '../../typeUtils.js';
3
3
 
4
4
  interface HttpResponseDecoratedInit extends HttpResponseInit {
@@ -1,2 +1,2 @@
1
- export { h as ResponseLookupResult, i as ResponseResolutionContext, j as getResponse } from '../RequestHandler-bb5cbb8f.js';
1
+ export { h as ResponseLookupResult, i as ResponseResolutionContext, j as getResponse } from '../RequestHandler-50ddea0c.js';
2
2
  import '../typeUtils.js';
@@ -1,14 +1,21 @@
1
1
  import { Emitter } from 'strict-event-emitter';
2
- import { h as ResponseLookupResult, R as RequestHandler } from '../RequestHandler-bb5cbb8f.js';
2
+ import { h as ResponseLookupResult, R as RequestHandler } from '../RequestHandler-50ddea0c.js';
3
3
  import { SharedOptions, LifeCycleEventsMap } from '../sharedOptions.js';
4
4
  import { RequiredDeep } from '../typeUtils.js';
5
5
  import './request/onUnhandledRequest.js';
6
6
 
7
7
  interface HandleRequestOptions {
8
8
  /**
9
- * Options for the response resolution process.
9
+ * `resolutionContext` is not part of the general public api
10
+ * but is exposed to aid in creating extensions like
11
+ * `@mswjs/http-middleware`.
10
12
  */
11
13
  resolutionContext?: {
14
+ /**
15
+ * A base url to use when resolving relative urls.
16
+ * @note This is primarily used by the `@mswjs/http-middleware`
17
+ * to resolve relative urls in the context of the running server
18
+ */
12
19
  baseUrl?: string;
13
20
  };
14
21
  /**
@@ -1,5 +1,5 @@
1
1
  import 'graphql';
2
- export { i as GraphQLMultipartRequestBody, h as GraphQLParsedOperationsMap, g as ParsedGraphQLQuery, P as ParsedGraphQLRequest, p as parseDocumentNode, j as parseGraphQLRequest } from '../../GraphQLHandler-d4787f91.js';
3
- import '../../RequestHandler-bb5cbb8f.js';
2
+ export { i as GraphQLMultipartRequestBody, h as GraphQLParsedOperationsMap, g as ParsedGraphQLQuery, P as ParsedGraphQLRequest, p as parseDocumentNode, j as parseGraphQLRequest } from '../../GraphQLHandler-907fc607.js';
3
+ import '../../RequestHandler-50ddea0c.js';
4
4
  import '../../typeUtils.js';
5
5
  import '../matching/matchRequestUrl.js';
@@ -1,4 +1,4 @@
1
- import { d as DefaultRequestMultipartBody } from '../../RequestHandler-bb5cbb8f.js';
1
+ import { d as DefaultRequestMultipartBody } from '../../RequestHandler-50ddea0c.js';
2
2
  import '../../typeUtils.js';
3
3
 
4
4
  /**
@@ -26,9 +26,10 @@ function pipeEvents(source, destination) {
26
26
  if (rawEmit._isPiped) {
27
27
  return;
28
28
  }
29
- source.emit = function(event, ...data) {
29
+ const sourceEmit = function sourceEmit2(event, ...data) {
30
30
  destination.emit(event, ...data);
31
31
  return rawEmit.call(this, event, ...data);
32
32
  };
33
- source.emit._isPiped = true;
33
+ sourceEmit._isPiped = true;
34
+ source.emit = sourceEmit;
34
35
  }
@@ -3,11 +3,12 @@ function pipeEvents(source, destination) {
3
3
  if (rawEmit._isPiped) {
4
4
  return;
5
5
  }
6
- source.emit = function(event, ...data) {
6
+ const sourceEmit = function sourceEmit2(event, ...data) {
7
7
  destination.emit(event, ...data);
8
8
  return rawEmit.call(this, event, ...data);
9
9
  };
10
- source.emit._isPiped = true;
10
+ sourceEmit._isPiped = true;
11
+ source.emit = sourceEmit;
11
12
  }
12
13
  export {
13
14
  pipeEvents
@@ -1,4 +1,4 @@
1
- import { R as RequestHandler, g as RequestHandlerDefaultInfo, c as RequestHandlerOptions } from '../../RequestHandler-bb5cbb8f.js';
1
+ import { R as RequestHandler, g as RequestHandlerDefaultInfo, c as RequestHandlerOptions } from '../../RequestHandler-50ddea0c.js';
2
2
  import '../../typeUtils.js';
3
3
 
4
4
  declare function use(currentHandlers: Array<RequestHandler>, ...handlers: Array<RequestHandler>): void;
@@ -1,4 +1,4 @@
1
- import { R as RequestHandler } from '../../RequestHandler-bb5cbb8f.js';
1
+ import { R as RequestHandler } from '../../RequestHandler-50ddea0c.js';
2
2
  import '../../typeUtils.js';
3
3
 
4
4
  interface UnhandledRequestPrint {