msw 2.0.11 → 2.0.12

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.
@@ -1,5 +1,5 @@
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-50ddea0c.js';
2
+ import { g as RequestHandlerDefaultInfo, D as DefaultBodyType, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-25f9cfd1.js';
3
3
  import { Match, Path } from './utils/matching/matchRequestUrl.js';
4
4
 
5
5
  interface ParsedGraphQLQuery {
@@ -63,7 +63,14 @@ interface GraphQLResponseBody<BodyType extends DefaultBodyType> {
63
63
  declare function isDocumentNode(value: DocumentNode | any): value is DocumentNode;
64
64
  declare class GraphQLHandler extends RequestHandler<GraphQLHandlerInfo, GraphQLRequestParsedResult, GraphQLResolverExtras<any>> {
65
65
  private endpoint;
66
+ static parsedRequestCache: WeakMap<Request, ParsedGraphQLRequest<GraphQLVariables>>;
66
67
  constructor(operationType: ExpectedOperationTypeNode, operationName: GraphQLHandlerNameSelector, endpoint: Path, resolver: ResponseResolver<GraphQLResolverExtras<any>, any, any>, options?: RequestHandlerOptions);
68
+ /**
69
+ * Parses the request body, once per request, cached across all
70
+ * GraphQL handlers. This is done to avoid multiple parsing of the
71
+ * request body, which each requires a clone of the request.
72
+ */
73
+ parseGraphQLRequestOrGetFromCache(request: Request): Promise<ParsedGraphQLRequest<GraphQLVariables>>;
67
74
  parse(args: {
68
75
  request: Request;
69
76
  }): Promise<GraphQLRequestParsedResult>;
@@ -1,2 +1,2 @@
1
- export { f as HttpResponse, H as HttpResponseInit, S as StrictRequest, e as StrictResponse } from './RequestHandler-50ddea0c.js';
1
+ export { f as HttpResponse, H as HttpResponseInit, S as StrictRequest, e as StrictResponse } from './RequestHandler-25f9cfd1.js';
2
2
  import './typeUtils.js';
@@ -112,6 +112,7 @@ interface RequestHandlerExecutionResult<ParsedResult extends Record<string, unkn
112
112
  response?: Response;
113
113
  }
114
114
  declare abstract class RequestHandler<HandlerInfo extends RequestHandlerDefaultInfo = RequestHandlerDefaultInfo, ParsedResult extends Record<string, any> | undefined = any, ResolverExtras extends Record<string, unknown> = any, HandlerOptions extends RequestHandlerOptions = RequestHandlerOptions> {
115
+ static cache: WeakMap<StrictRequest<DefaultBodyType>, StrictRequest<DefaultBodyType>>;
115
116
  info: HandlerInfo & RequestHandlerInternalInfo;
116
117
  /**
117
118
  * Indicates whether this request handler has been used
@@ -162,6 +163,7 @@ declare abstract class RequestHandler<HandlerInfo extends RequestHandlerDefaultI
162
163
  request: Request;
163
164
  parsedResult: ParsedResult;
164
165
  }): ResolverExtras;
166
+ private cloneRequestOrGetFromCache;
165
167
  /**
166
168
  * Execute this request handler and produce a mocked response
167
169
  * using the given resolver function.
@@ -1,5 +1,5 @@
1
1
  import { EventMap, Emitter } from 'strict-event-emitter';
2
- import { R as RequestHandler, g as RequestHandlerDefaultInfo } from './RequestHandler-50ddea0c.js';
2
+ import { R as RequestHandler, g as RequestHandlerDefaultInfo } from './RequestHandler-25f9cfd1.js';
3
3
  import { LifeCycleEventEmitter } from './sharedOptions.js';
4
4
  import { Disposable } from './utils/internal/Disposable.js';
5
5
  import './typeUtils.js';
@@ -1,6 +1,6 @@
1
1
  import { DocumentNode } from 'graphql';
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';
2
+ import { a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-25f9cfd1.js';
3
+ import { a as GraphQLVariables, d as GraphQLHandlerNameSelector, e as GraphQLResolverExtras, f as GraphQLResponseBody, G as GraphQLHandler } from './GraphQLHandler-da09c680.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-50ddea0c.js';
2
+ import '../RequestHandler-25f9cfd1.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, l as GraphQLRequestParsedResult, e as GraphQLResolverExtras, f as GraphQLResponseBody, a as GraphQLVariables, m as isDocumentNode } from '../GraphQLHandler-907fc607.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-da09c680.js';
5
5
  import '../typeUtils.js';
@@ -58,7 +58,7 @@ function isDocumentNode(value) {
58
58
  }
59
59
  return typeof value === "object" && "kind" in value && "definitions" in value;
60
60
  }
61
- class GraphQLHandler extends import_RequestHandler.RequestHandler {
61
+ const _GraphQLHandler = class extends import_RequestHandler.RequestHandler {
62
62
  constructor(operationType, operationName, endpoint, resolver, options) {
63
63
  let resolvedOperationName = operationName;
64
64
  if (isDocumentNode(operationName)) {
@@ -87,16 +87,33 @@ class GraphQLHandler extends import_RequestHandler.RequestHandler {
87
87
  });
88
88
  this.endpoint = endpoint;
89
89
  }
90
+ /**
91
+ * Parses the request body, once per request, cached across all
92
+ * GraphQL handlers. This is done to avoid multiple parsing of the
93
+ * request body, which each requires a clone of the request.
94
+ */
95
+ parseGraphQLRequestOrGetFromCache(request) {
96
+ return __async(this, null, function* () {
97
+ if (!_GraphQLHandler.parsedRequestCache.has(request)) {
98
+ _GraphQLHandler.parsedRequestCache.set(
99
+ request,
100
+ yield (0, import_parseGraphQLRequest.parseGraphQLRequest)(request).catch((error) => {
101
+ console.error(error);
102
+ return void 0;
103
+ })
104
+ );
105
+ }
106
+ return _GraphQLHandler.parsedRequestCache.get(request);
107
+ });
108
+ }
90
109
  parse(args) {
91
110
  return __async(this, null, function* () {
92
111
  const match = (0, import_matchRequestUrl.matchRequestUrl)(new URL(args.request.url), this.endpoint);
93
- if (!match.matches)
112
+ if (!match.matches) {
94
113
  return { match };
95
- const parsedResult = yield (0, import_parseGraphQLRequest.parseGraphQLRequest)(args.request).catch(
96
- (error) => {
97
- console.error(error);
98
- return void 0;
99
- }
114
+ }
115
+ const parsedResult = yield this.parseGraphQLRequestOrGetFromCache(
116
+ args.request
100
117
  );
101
118
  if (typeof parsedResult === "undefined") {
102
119
  return { match };
@@ -153,4 +170,6 @@ Consider naming this operation or using "graphql.operation()" request handler to
153
170
  console.groupEnd();
154
171
  });
155
172
  }
156
- }
173
+ };
174
+ let GraphQLHandler = _GraphQLHandler;
175
+ GraphQLHandler.parsedRequestCache = /* @__PURE__ */ new WeakMap();
@@ -39,7 +39,7 @@ function isDocumentNode(value) {
39
39
  }
40
40
  return typeof value === "object" && "kind" in value && "definitions" in value;
41
41
  }
42
- class GraphQLHandler extends RequestHandler {
42
+ const _GraphQLHandler = class extends RequestHandler {
43
43
  constructor(operationType, operationName, endpoint, resolver, options) {
44
44
  let resolvedOperationName = operationName;
45
45
  if (isDocumentNode(operationName)) {
@@ -68,16 +68,33 @@ class GraphQLHandler extends RequestHandler {
68
68
  });
69
69
  this.endpoint = endpoint;
70
70
  }
71
+ /**
72
+ * Parses the request body, once per request, cached across all
73
+ * GraphQL handlers. This is done to avoid multiple parsing of the
74
+ * request body, which each requires a clone of the request.
75
+ */
76
+ parseGraphQLRequestOrGetFromCache(request) {
77
+ return __async(this, null, function* () {
78
+ if (!_GraphQLHandler.parsedRequestCache.has(request)) {
79
+ _GraphQLHandler.parsedRequestCache.set(
80
+ request,
81
+ yield parseGraphQLRequest(request).catch((error) => {
82
+ console.error(error);
83
+ return void 0;
84
+ })
85
+ );
86
+ }
87
+ return _GraphQLHandler.parsedRequestCache.get(request);
88
+ });
89
+ }
71
90
  parse(args) {
72
91
  return __async(this, null, function* () {
73
92
  const match = matchRequestUrl(new URL(args.request.url), this.endpoint);
74
- if (!match.matches)
93
+ if (!match.matches) {
75
94
  return { match };
76
- const parsedResult = yield parseGraphQLRequest(args.request).catch(
77
- (error) => {
78
- console.error(error);
79
- return void 0;
80
- }
95
+ }
96
+ const parsedResult = yield this.parseGraphQLRequestOrGetFromCache(
97
+ args.request
81
98
  );
82
99
  if (typeof parsedResult === "undefined") {
83
100
  return { match };
@@ -134,7 +151,9 @@ Consider naming this operation or using "graphql.operation()" request handler to
134
151
  console.groupEnd();
135
152
  });
136
153
  }
137
- }
154
+ };
155
+ let GraphQLHandler = _GraphQLHandler;
156
+ GraphQLHandler.parsedRequestCache = /* @__PURE__ */ new WeakMap();
138
157
  export {
139
158
  GraphQLHandler,
140
159
  isDocumentNode
@@ -1,4 +1,4 @@
1
- import { g as RequestHandlerDefaultInfo, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions, i as ResponseResolutionContext } from '../RequestHandler-50ddea0c.js';
1
+ import { g as RequestHandlerDefaultInfo, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions, i as ResponseResolutionContext } from '../RequestHandler-25f9cfd1.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-50ddea0c.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-25f9cfd1.js';
2
2
  import '../typeUtils.js';
@@ -61,7 +61,7 @@ module.exports = __toCommonJS(RequestHandler_exports);
61
61
  var import_outvariant = require("outvariant");
62
62
  var import_getCallFrame = require("../utils/internal/getCallFrame.js");
63
63
  var import_isIterable = require("../utils/internal/isIterable.js");
64
- class RequestHandler {
64
+ const _RequestHandler = class {
65
65
  constructor(args) {
66
66
  this.resolver = args.resolver;
67
67
  this.options = args.options;
@@ -103,6 +103,18 @@ class RequestHandler {
103
103
  extendResolverArgs(_args) {
104
104
  return {};
105
105
  }
106
+ // Clone the request instance before it's passed to the handler phases
107
+ // and the response resolver so we can always read it for logging.
108
+ // We only clone it once per request to avoid unnecessary overhead.
109
+ cloneRequestOrGetFromCache(request) {
110
+ const existingClone = _RequestHandler.cache.get(request);
111
+ if (typeof existingClone !== "undefined") {
112
+ return existingClone;
113
+ }
114
+ const clonedRequest = request.clone();
115
+ _RequestHandler.cache.set(request, clonedRequest);
116
+ return clonedRequest;
117
+ }
106
118
  /**
107
119
  * Execute this request handler and produce a mocked response
108
120
  * using the given resolver function.
@@ -113,7 +125,7 @@ class RequestHandler {
113
125
  if (this.isUsed && ((_a = this.options) == null ? void 0 : _a.once)) {
114
126
  return null;
115
127
  }
116
- const mainRequestRef = args.request.clone();
128
+ const requestClone = this.cloneRequestOrGetFromCache(args.request);
117
129
  const parsedResult = yield this.parse({
118
130
  request: args.request,
119
131
  resolutionContext: args.resolutionContext
@@ -141,7 +153,7 @@ class RequestHandler {
141
153
  const executionResult = this.createExecutionResult({
142
154
  // Pass the cloned request to the result so that logging
143
155
  // and other consumers could read its body once more.
144
- request: mainRequestRef,
156
+ request: requestClone,
145
157
  response: mockedResponse,
146
158
  parsedResult
147
159
  });
@@ -184,4 +196,6 @@ class RequestHandler {
184
196
  parsedResult: args.parsedResult
185
197
  };
186
198
  }
187
- }
199
+ };
200
+ let RequestHandler = _RequestHandler;
201
+ RequestHandler.cache = /* @__PURE__ */ new WeakMap();
@@ -40,7 +40,7 @@ var __async = (__this, __arguments, generator) => {
40
40
  import { invariant } from "outvariant";
41
41
  import { getCallFrame } from '../utils/internal/getCallFrame.mjs';
42
42
  import { isIterable } from '../utils/internal/isIterable.mjs';
43
- class RequestHandler {
43
+ const _RequestHandler = class {
44
44
  constructor(args) {
45
45
  this.resolver = args.resolver;
46
46
  this.options = args.options;
@@ -82,6 +82,18 @@ class RequestHandler {
82
82
  extendResolverArgs(_args) {
83
83
  return {};
84
84
  }
85
+ // Clone the request instance before it's passed to the handler phases
86
+ // and the response resolver so we can always read it for logging.
87
+ // We only clone it once per request to avoid unnecessary overhead.
88
+ cloneRequestOrGetFromCache(request) {
89
+ const existingClone = _RequestHandler.cache.get(request);
90
+ if (typeof existingClone !== "undefined") {
91
+ return existingClone;
92
+ }
93
+ const clonedRequest = request.clone();
94
+ _RequestHandler.cache.set(request, clonedRequest);
95
+ return clonedRequest;
96
+ }
85
97
  /**
86
98
  * Execute this request handler and produce a mocked response
87
99
  * using the given resolver function.
@@ -92,7 +104,7 @@ class RequestHandler {
92
104
  if (this.isUsed && ((_a = this.options) == null ? void 0 : _a.once)) {
93
105
  return null;
94
106
  }
95
- const mainRequestRef = args.request.clone();
107
+ const requestClone = this.cloneRequestOrGetFromCache(args.request);
96
108
  const parsedResult = yield this.parse({
97
109
  request: args.request,
98
110
  resolutionContext: args.resolutionContext
@@ -120,7 +132,7 @@ class RequestHandler {
120
132
  const executionResult = this.createExecutionResult({
121
133
  // Pass the cloned request to the result so that logging
122
134
  // and other consumers could read its body once more.
123
- request: mainRequestRef,
135
+ request: requestClone,
124
136
  response: mockedResponse,
125
137
  parsedResult
126
138
  });
@@ -163,7 +175,9 @@ class RequestHandler {
163
175
  parsedResult: args.parsedResult
164
176
  };
165
177
  }
166
- }
178
+ };
179
+ let RequestHandler = _RequestHandler;
180
+ RequestHandler.cache = /* @__PURE__ */ new WeakMap();
167
181
  export {
168
182
  RequestHandler
169
183
  };
@@ -1,4 +1,4 @@
1
- import { D as DefaultBodyType, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-50ddea0c.js';
1
+ import { D as DefaultBodyType, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-25f9cfd1.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-50ddea0c.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-25f9cfd1.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-907fc607.js';
6
+ export { G as GraphQLHandler, c as GraphQLJsonRequestBody, b as GraphQLRequestBody, a as GraphQLVariables, P as ParsedGraphQLRequest } from './GraphQLHandler-da09c680.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-50ddea0c.js';
3
+ import './RequestHandler-25f9cfd1.js';
4
4
  import './typeUtils.js';
5
5
 
6
6
  interface SharedOptions {
@@ -1,4 +1,4 @@
1
- import { H as HttpResponseInit } from '../../RequestHandler-50ddea0c.js';
1
+ import { H as HttpResponseInit } from '../../RequestHandler-25f9cfd1.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-50ddea0c.js';
1
+ export { h as ResponseLookupResult, i as ResponseResolutionContext, j as getResponse } from '../RequestHandler-25f9cfd1.js';
2
2
  import '../typeUtils.js';
@@ -1,5 +1,5 @@
1
1
  import { Emitter } from 'strict-event-emitter';
2
- import { h as ResponseLookupResult, R as RequestHandler } from '../RequestHandler-50ddea0c.js';
2
+ import { h as ResponseLookupResult, R as RequestHandler } from '../RequestHandler-25f9cfd1.js';
3
3
  import { SharedOptions, LifeCycleEventsMap } from '../sharedOptions.js';
4
4
  import { RequiredDeep } from '../typeUtils.js';
5
5
  import './request/onUnhandledRequest.js';
@@ -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-907fc607.js';
3
- import '../../RequestHandler-50ddea0c.js';
2
+ export { i as GraphQLMultipartRequestBody, h as GraphQLParsedOperationsMap, g as ParsedGraphQLQuery, P as ParsedGraphQLRequest, p as parseDocumentNode, j as parseGraphQLRequest } from '../../GraphQLHandler-da09c680.js';
3
+ import '../../RequestHandler-25f9cfd1.js';
4
4
  import '../../typeUtils.js';
5
5
  import '../matching/matchRequestUrl.js';
@@ -1,4 +1,4 @@
1
- import { d as DefaultRequestMultipartBody } from '../../RequestHandler-50ddea0c.js';
1
+ import { d as DefaultRequestMultipartBody } from '../../RequestHandler-25f9cfd1.js';
2
2
  import '../../typeUtils.js';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { R as RequestHandler, g as RequestHandlerDefaultInfo, c as RequestHandlerOptions } from '../../RequestHandler-50ddea0c.js';
1
+ import { R as RequestHandler, g as RequestHandlerDefaultInfo, c as RequestHandlerOptions } from '../../RequestHandler-25f9cfd1.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-50ddea0c.js';
1
+ import { R as RequestHandler } from '../../RequestHandler-25f9cfd1.js';
2
2
  import '../../typeUtils.js';
3
3
 
4
4
  interface UnhandledRequestPrint {
package/lib/iife/index.js CHANGED
@@ -507,7 +507,7 @@ var MockServiceWorker = (() => {
507
507
  }
508
508
 
509
509
  // src/core/handlers/RequestHandler.ts
510
- var RequestHandler = class {
510
+ var _RequestHandler = class {
511
511
  constructor(args) {
512
512
  this.resolver = args.resolver;
513
513
  this.options = args.options;
@@ -549,6 +549,18 @@ var MockServiceWorker = (() => {
549
549
  extendResolverArgs(_args) {
550
550
  return {};
551
551
  }
552
+ // Clone the request instance before it's passed to the handler phases
553
+ // and the response resolver so we can always read it for logging.
554
+ // We only clone it once per request to avoid unnecessary overhead.
555
+ cloneRequestOrGetFromCache(request) {
556
+ const existingClone = _RequestHandler.cache.get(request);
557
+ if (typeof existingClone !== "undefined") {
558
+ return existingClone;
559
+ }
560
+ const clonedRequest = request.clone();
561
+ _RequestHandler.cache.set(request, clonedRequest);
562
+ return clonedRequest;
563
+ }
552
564
  /**
553
565
  * Execute this request handler and produce a mocked response
554
566
  * using the given resolver function.
@@ -559,7 +571,7 @@ var MockServiceWorker = (() => {
559
571
  if (this.isUsed && ((_a3 = this.options) == null ? void 0 : _a3.once)) {
560
572
  return null;
561
573
  }
562
- const mainRequestRef = args.request.clone();
574
+ const requestClone = this.cloneRequestOrGetFromCache(args.request);
563
575
  const parsedResult = yield this.parse({
564
576
  request: args.request,
565
577
  resolutionContext: args.resolutionContext
@@ -587,7 +599,7 @@ var MockServiceWorker = (() => {
587
599
  const executionResult = this.createExecutionResult({
588
600
  // Pass the cloned request to the result so that logging
589
601
  // and other consumers could read its body once more.
590
- request: mainRequestRef,
602
+ request: requestClone,
591
603
  response: mockedResponse,
592
604
  parsedResult
593
605
  });
@@ -631,6 +643,8 @@ var MockServiceWorker = (() => {
631
643
  };
632
644
  }
633
645
  };
646
+ var RequestHandler = _RequestHandler;
647
+ RequestHandler.cache = /* @__PURE__ */ new WeakMap();
634
648
 
635
649
  // src/core/utils/internal/isStringEqual.ts
636
650
  function isStringEqual(actual, expected) {
@@ -5632,7 +5646,7 @@ spurious results.`);
5632
5646
  }
5633
5647
  return typeof value === "object" && "kind" in value && "definitions" in value;
5634
5648
  }
5635
- var GraphQLHandler = class extends RequestHandler {
5649
+ var _GraphQLHandler = class extends RequestHandler {
5636
5650
  constructor(operationType, operationName, endpoint, resolver, options) {
5637
5651
  let resolvedOperationName = operationName;
5638
5652
  if (isDocumentNode(operationName)) {
@@ -5661,16 +5675,33 @@ spurious results.`);
5661
5675
  });
5662
5676
  this.endpoint = endpoint;
5663
5677
  }
5678
+ /**
5679
+ * Parses the request body, once per request, cached across all
5680
+ * GraphQL handlers. This is done to avoid multiple parsing of the
5681
+ * request body, which each requires a clone of the request.
5682
+ */
5683
+ parseGraphQLRequestOrGetFromCache(request) {
5684
+ return __async(this, null, function* () {
5685
+ if (!_GraphQLHandler.parsedRequestCache.has(request)) {
5686
+ _GraphQLHandler.parsedRequestCache.set(
5687
+ request,
5688
+ yield parseGraphQLRequest(request).catch((error3) => {
5689
+ console.error(error3);
5690
+ return void 0;
5691
+ })
5692
+ );
5693
+ }
5694
+ return _GraphQLHandler.parsedRequestCache.get(request);
5695
+ });
5696
+ }
5664
5697
  parse(args) {
5665
5698
  return __async(this, null, function* () {
5666
5699
  const match2 = matchRequestUrl(new URL(args.request.url), this.endpoint);
5667
- if (!match2.matches)
5700
+ if (!match2.matches) {
5668
5701
  return { match: match2 };
5669
- const parsedResult = yield parseGraphQLRequest(args.request).catch(
5670
- (error3) => {
5671
- console.error(error3);
5672
- return void 0;
5673
- }
5702
+ }
5703
+ const parsedResult = yield this.parseGraphQLRequestOrGetFromCache(
5704
+ args.request
5674
5705
  );
5675
5706
  if (typeof parsedResult === "undefined") {
5676
5707
  return { match: match2 };
@@ -5728,6 +5759,8 @@ Consider naming this operation or using "graphql.operation()" request handler to
5728
5759
  });
5729
5760
  }
5730
5761
  };
5762
+ var GraphQLHandler = _GraphQLHandler;
5763
+ GraphQLHandler.parsedRequestCache = /* @__PURE__ */ new WeakMap();
5731
5764
 
5732
5765
  // src/core/graphql.ts
5733
5766
  function createScopedGraphQLHandler(operationType, url) {
@@ -2,7 +2,7 @@
2
2
  /* tslint:disable */
3
3
 
4
4
  /**
5
- * Mock Service Worker (2.0.11).
5
+ * Mock Service Worker (2.0.12).
6
6
  * @see https://github.com/mswjs/msw
7
7
  * - Please do NOT modify this file.
8
8
  * - Please do NOT serve this file on production.
@@ -62,7 +62,6 @@ declare class SetupServerApi extends SetupApi<LifeCycleEventsMap> implements Set
62
62
  private init;
63
63
  listen(options?: Partial<SharedOptions>): void;
64
64
  close(): void;
65
- protected onRequest(request: Request): void;
66
65
  }
67
66
 
68
67
  /**
@@ -70,7 +70,6 @@ var SetupServerApi = class extends import_SetupApi.SetupApi {
70
70
  */
71
71
  init() {
72
72
  this.interceptor.on("request", (_0) => __async(this, [_0], function* ({ request, requestId }) {
73
- this.onRequest(request);
74
73
  const response = yield (0, import_handleRequest.handleRequest)(
75
74
  request,
76
75
  requestId,
@@ -119,8 +118,6 @@ var SetupServerApi = class extends import_SetupApi.SetupApi {
119
118
  close() {
120
119
  this.dispose();
121
120
  }
122
- onRequest(request) {
123
- }
124
121
  };
125
122
 
126
123
  // src/native/index.ts
@@ -50,7 +50,6 @@ var SetupServerApi = class extends SetupApi {
50
50
  */
51
51
  init() {
52
52
  this.interceptor.on("request", (_0) => __async(this, [_0], function* ({ request, requestId }) {
53
- this.onRequest(request);
54
53
  const response = yield handleRequest(
55
54
  request,
56
55
  requestId,
@@ -99,8 +98,6 @@ var SetupServerApi = class extends SetupApi {
99
98
  close() {
100
99
  this.dispose();
101
100
  }
102
- onRequest(request) {
103
- }
104
101
  };
105
102
 
106
103
  // src/native/index.ts
@@ -62,7 +62,6 @@ declare class SetupServerApi extends SetupApi<LifeCycleEventsMap> implements Set
62
62
  private init;
63
63
  listen(options?: Partial<SharedOptions>): void;
64
64
  close(): void;
65
- protected onRequest(request: Request): void;
66
65
  }
67
66
 
68
67
  /**
package/lib/node/index.js CHANGED
@@ -70,7 +70,6 @@ var SetupServerApi = class extends import_SetupApi.SetupApi {
70
70
  */
71
71
  init() {
72
72
  this.interceptor.on("request", (_0) => __async(this, [_0], function* ({ request, requestId }) {
73
- this.onRequest(request);
74
73
  const response = yield (0, import_handleRequest.handleRequest)(
75
74
  request,
76
75
  requestId,
@@ -119,47 +118,14 @@ var SetupServerApi = class extends import_SetupApi.SetupApi {
119
118
  close() {
120
119
  this.dispose();
121
120
  }
122
- onRequest(request) {
123
- }
124
121
  };
125
122
 
126
123
  // src/node/setupServer.ts
127
124
  var import_ClientRequest = require("@mswjs/interceptors/ClientRequest");
128
125
  var import_XMLHttpRequest = require("@mswjs/interceptors/XMLHttpRequest");
129
126
  var import_fetch = require("@mswjs/interceptors/fetch");
130
- var import_node_events = require("events");
131
-
132
- // src/node/utils/isNodeExceptionLike.ts
133
- function isNodeExceptionLike(error) {
134
- return !!error && typeof error === "object" && "code" in error;
135
- }
136
-
137
- // src/node/setupServer.ts
138
- var SetupServerApi2 = class extends SetupServerApi {
139
- /**
140
- * Bump the maximum number of event listeners on the
141
- * request's "AbortSignal". This prepares the request
142
- * for each request handler cloning it at least once.
143
- * Note that cloning a request automatically appends a
144
- * new "abort" event listener to the parent request's
145
- * "AbortController" so if the parent aborts, all the
146
- * clones are automatically aborted.
147
- */
148
- onRequest(request) {
149
- try {
150
- (0, import_node_events.setMaxListeners)(
151
- Math.max(import_node_events.defaultMaxListeners, this.currentHandlers.length),
152
- request.signal
153
- );
154
- } catch (error) {
155
- if (!(isNodeExceptionLike(error) && error.code === "ERR_INVALID_ARG_TYPE")) {
156
- throw error;
157
- }
158
- }
159
- }
160
- };
161
127
  var setupServer = (...handlers) => {
162
- return new SetupServerApi2(
128
+ return new SetupServerApi(
163
129
  [import_ClientRequest.ClientRequestInterceptor, import_XMLHttpRequest.XMLHttpRequestInterceptor, import_fetch.FetchInterceptor],
164
130
  ...handlers
165
131
  );
@@ -47,7 +47,6 @@ var SetupServerApi = class extends SetupApi {
47
47
  */
48
48
  init() {
49
49
  this.interceptor.on("request", (_0) => __async(this, [_0], function* ({ request, requestId }) {
50
- this.onRequest(request);
51
50
  const response = yield handleRequest(
52
51
  request,
53
52
  requestId,
@@ -96,47 +95,14 @@ var SetupServerApi = class extends SetupApi {
96
95
  close() {
97
96
  this.dispose();
98
97
  }
99
- onRequest(request) {
100
- }
101
98
  };
102
99
 
103
100
  // src/node/setupServer.ts
104
101
  import { ClientRequestInterceptor } from "@mswjs/interceptors/ClientRequest";
105
102
  import { XMLHttpRequestInterceptor } from "@mswjs/interceptors/XMLHttpRequest";
106
103
  import { FetchInterceptor } from "@mswjs/interceptors/fetch";
107
- import { defaultMaxListeners, setMaxListeners } from "events";
108
-
109
- // src/node/utils/isNodeExceptionLike.ts
110
- function isNodeExceptionLike(error) {
111
- return !!error && typeof error === "object" && "code" in error;
112
- }
113
-
114
- // src/node/setupServer.ts
115
- var SetupServerApi2 = class extends SetupServerApi {
116
- /**
117
- * Bump the maximum number of event listeners on the
118
- * request's "AbortSignal". This prepares the request
119
- * for each request handler cloning it at least once.
120
- * Note that cloning a request automatically appends a
121
- * new "abort" event listener to the parent request's
122
- * "AbortController" so if the parent aborts, all the
123
- * clones are automatically aborted.
124
- */
125
- onRequest(request) {
126
- try {
127
- setMaxListeners(
128
- Math.max(defaultMaxListeners, this.currentHandlers.length),
129
- request.signal
130
- );
131
- } catch (error) {
132
- if (!(isNodeExceptionLike(error) && error.code === "ERR_INVALID_ARG_TYPE")) {
133
- throw error;
134
- }
135
- }
136
- }
137
- };
138
104
  var setupServer = (...handlers) => {
139
- return new SetupServerApi2(
105
+ return new SetupServerApi(
140
106
  [ClientRequestInterceptor, XMLHttpRequestInterceptor, FetchInterceptor],
141
107
  ...handlers
142
108
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "msw",
3
- "version": "2.0.11",
3
+ "version": "2.0.12",
4
4
  "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.",
5
5
  "main": "./lib/core/index.js",
6
6
  "module": "./lib/core/index.mjs",
@@ -167,7 +167,7 @@
167
167
  "webpack-http-server": "^0.5.0"
168
168
  },
169
169
  "peerDependencies": {
170
- "typescript": ">= 4.7.x <= 5.2.x"
170
+ "typescript": ">= 4.7.x <= 5.3.x"
171
171
  },
172
172
  "peerDependenciesMeta": {
173
173
  "typescript": {