msw 0.33.2 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/lib/esm/RequestHandler-deps.js +447 -82
  2. package/lib/esm/errors-deps.js +15 -1
  3. package/lib/esm/fetch-deps.js +9 -5
  4. package/lib/esm/graphql-deps.js +15 -10
  5. package/lib/esm/graphql.js +1 -0
  6. package/lib/esm/index-deps.js +2 -1
  7. package/lib/esm/index.js +90 -3880
  8. package/lib/esm/index2.js +1 -1
  9. package/lib/esm/mockServiceWorker.js +21 -12
  10. package/lib/esm/rest-deps.js +8 -15
  11. package/lib/esm/rest.js +1 -0
  12. package/lib/iife/index.js +3 -3
  13. package/lib/iife/mockServiceWorker.js +21 -12
  14. package/lib/types/context/data.d.ts +2 -3
  15. package/lib/types/context/extensions.d.ts +8 -0
  16. package/lib/types/context/index.d.ts +1 -0
  17. package/lib/types/graphql.d.ts +2 -1
  18. package/lib/types/handlers/GraphQLHandler.d.ts +5 -4
  19. package/lib/types/handlers/RequestHandler.d.ts +1 -1
  20. package/lib/types/handlers/RestHandler.d.ts +8 -10
  21. package/lib/types/index.d.ts +17 -7
  22. package/lib/types/node/glossary.d.ts +4 -14
  23. package/lib/types/node/index.d.ts +1 -1
  24. package/lib/types/rest.d.ts +10 -9
  25. package/lib/types/setupWorker/glossary.d.ts +16 -26
  26. package/lib/types/setupWorker/start/utils/prepareStartHandler.d.ts +3 -3
  27. package/lib/types/sharedOptions.d.ts +12 -1
  28. package/lib/types/typeUtils.d.ts +5 -3
  29. package/lib/types/utils/handleRequest.d.ts +4 -4
  30. package/lib/types/utils/internal/getCallFrame.d.ts +1 -1
  31. package/lib/types/utils/internal/jsonParse.d.ts +2 -2
  32. package/lib/types/utils/internal/pipeEvents.d.ts +6 -0
  33. package/lib/types/utils/logging/prepareResponse.d.ts +1 -1
  34. package/lib/types/utils/matching/matchRequestUrl.d.ts +12 -2
  35. package/lib/types/utils/matching/normalizePath.d.ts +1 -1
  36. package/lib/types/utils/request/parseBody.d.ts +2 -2
  37. package/lib/types/utils/request/parseWorkerRequest.d.ts +2 -2
  38. package/lib/types/utils/worker/createFallbackRequestListener.d.ts +2 -1
  39. package/lib/types/utils/worker/createRequestListener.d.ts +2 -1
  40. package/lib/umd/index.js +1131 -249
  41. package/lib/umd/mockServiceWorker.js +21 -12
  42. package/native/lib/index.js +551 -508
  43. package/node/lib/index.js +553 -510
  44. package/package.json +19 -19
@@ -2,13 +2,13 @@
2
2
  /* tslint:disable */
3
3
 
4
4
  /**
5
- * Mock Service Worker (0.33.2).
5
+ * Mock Service Worker (0.36.0).
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.
9
9
  */
10
10
 
11
- const INTEGRITY_CHECKSUM = 'a615cd395ea10f948a628bce3857a385'
11
+ const INTEGRITY_CHECKSUM = '02f4ad4a2797f85668baf196e553d929'
12
12
  const bypassHeaderName = 'x-msw-bypass'
13
13
  const activeClientIds = new Set()
14
14
 
@@ -83,11 +83,11 @@ self.addEventListener('message', async function (event) {
83
83
  }
84
84
  })
85
85
 
86
- // Resolve the "master" client for the given event.
86
+ // Resolve the "main" client for the given event.
87
87
  // Client that issues a request doesn't necessarily equal the client
88
88
  // that registered the worker. It's with the latter the worker should
89
89
  // communicate with during the response resolving phase.
90
- async function resolveMasterClient(event) {
90
+ async function resolveMainClient(event) {
91
91
  const client = await self.clients.get(event.clientId)
92
92
 
93
93
  if (client.frameType === 'top-level') {
@@ -109,7 +109,7 @@ async function resolveMasterClient(event) {
109
109
  }
110
110
 
111
111
  async function handleRequest(event, requestId) {
112
- const client = await resolveMasterClient(event)
112
+ const client = await resolveMainClient(event)
113
113
  const response = await getResponse(event, client, requestId)
114
114
 
115
115
  // Send back the response clone for the "response:*" life-cycle events.
@@ -221,13 +221,11 @@ async function getResponse(event, client, requestId) {
221
221
 
222
222
  console.error(
223
223
  `\
224
- [MSW] Request handler function for "%s %s" has thrown the following exception:
224
+ [MSW] Uncaught exception in the request handler for "%s %s":
225
225
 
226
- ${parsedBody.errorType}: ${parsedBody.message}
227
- (see more detailed error stack trace in the mocked response body)
226
+ ${parsedBody.location}
228
227
 
229
- This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error.
230
- If you wish to mock an error response, please refer to this guide: https://mswjs.io/docs/recipes/mocking-error-responses\
228
+ This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/recipes/mocking-error-responses\
231
229
  `,
232
230
  request.method,
233
231
  request.url,
@@ -271,11 +269,22 @@ self.addEventListener('fetch', function (event) {
271
269
 
272
270
  return event.respondWith(
273
271
  handleRequest(event, requestId).catch((error) => {
272
+ if (error.name === 'NetworkError') {
273
+ console.warn(
274
+ '[MSW] Successfully emulated a network error for the "%s %s" request.',
275
+ request.method,
276
+ request.url,
277
+ )
278
+ return
279
+ }
280
+
281
+ // At this point, any exception indicates an issue with the original request/response.
274
282
  console.error(
275
- '[MSW] Failed to mock a "%s" request to "%s": %s',
283
+ `\
284
+ [MSW] Caught an exception from the "%s %s" request (%s). This is probably not a problem with Mock Service Worker. There is likely an additional logging output above.`,
276
285
  request.method,
277
286
  request.url,
278
- error,
287
+ `${error.name}: ${error.message}`,
279
288
  )
280
289
  }),
281
290
  )
@@ -1,9 +1,8 @@
1
- import { ResponseTransformer } from '../response';
2
- export declare type DataContext<T> = (payload: T) => ResponseTransformer;
1
+ import { GraphQLPayloadContext } from '../typeUtils';
3
2
  /**
4
3
  * Sets a given payload as a GraphQL response body.
5
4
  * @example
6
5
  * res(ctx.data({ user: { firstName: 'John' }}))
7
6
  * @see {@link https://mswjs.io/docs/api/context/data `ctx.data()`}
8
7
  */
9
- export declare const data: DataContext<Record<string, unknown>>;
8
+ export declare const data: GraphQLPayloadContext<Record<string, unknown>>;
@@ -0,0 +1,8 @@
1
+ import { GraphQLPayloadContext } from '../typeUtils';
2
+ /**
3
+ * Sets the GraphQL extensions on a given response.
4
+ * @example
5
+ * res(ctx.extensions({ tracing: { version: 1 }}))
6
+ * @see {@link https://mswjs.io/docs/api/context/extensions `ctx.extensions()`}
7
+ */
8
+ export declare const extensions: GraphQLPayloadContext<Record<string, unknown>>;
@@ -3,6 +3,7 @@ export { set } from './set';
3
3
  export { cookie } from './cookie';
4
4
  export { body } from './body';
5
5
  export { data } from './data';
6
+ export { extensions } from './extensions';
6
7
  export { delay } from './delay';
7
8
  export { errors } from './errors';
8
9
  export { fetch } from './fetch';
@@ -1,12 +1,13 @@
1
1
  import { DocumentNode } from 'graphql';
2
- import { Path } from 'node-match-path';
3
2
  import { ResponseResolver } from './handlers/RequestHandler';
4
3
  import { GraphQLHandler, GraphQLContext, GraphQLRequest, GraphQLVariables, GraphQLHandlerNameSelector } from './handlers/GraphQLHandler';
4
+ import { Path } from './utils/matching/matchRequestUrl';
5
5
  export interface TypedDocumentNode<Result = {
6
6
  [key: string]: any;
7
7
  }, Variables = {
8
8
  [key: string]: any;
9
9
  }> extends DocumentNode {
10
+ __apiType?: (variables: Variables) => Result;
10
11
  __resultType?: Result;
11
12
  __variablesType?: Variables;
12
13
  }
@@ -1,23 +1,24 @@
1
1
  import { DocumentNode, OperationTypeNode } from 'graphql';
2
- import { Path } from 'node-match-path';
3
2
  import { SerializedResponse } from '../setupWorker/glossary';
4
3
  import { set } from '../context/set';
5
4
  import { status } from '../context/status';
6
5
  import { delay } from '../context/delay';
7
6
  import { fetch } from '../context/fetch';
8
- import { DataContext } from '../context/data';
9
7
  import { errors } from '../context/errors';
8
+ import { GraphQLPayloadContext } from '../typeUtils';
10
9
  import { cookie } from '../context/cookie';
11
10
  import { MockedRequest, RequestHandler, ResponseResolver } from './RequestHandler';
11
+ import { Path } from '../utils/matching/matchRequestUrl';
12
12
  import { ParsedGraphQLRequest, GraphQLMultipartRequestBody } from '../utils/internal/parseGraphQLRequest';
13
13
  export declare type ExpectedOperationTypeNode = OperationTypeNode | 'all';
14
14
  export declare type GraphQLHandlerNameSelector = DocumentNode | RegExp | string;
15
- export declare type GraphQLContext<QueryType> = {
15
+ export declare type GraphQLContext<QueryType extends Record<string, unknown>> = {
16
16
  set: typeof set;
17
17
  status: typeof status;
18
18
  delay: typeof delay;
19
19
  fetch: typeof fetch;
20
- data: DataContext<QueryType>;
20
+ data: GraphQLPayloadContext<QueryType>;
21
+ extensions: GraphQLPayloadContext<QueryType>;
21
22
  errors: typeof errors;
22
23
  cookie: typeof cookie;
23
24
  };
@@ -10,7 +10,7 @@ export declare const defaultContext: {
10
10
  fetch: (input: string | MockedRequest<DefaultRequestBody>, requestInit?: RequestInit) => Promise<Response>;
11
11
  };
12
12
  export declare type DefaultRequestMultipartBody = Record<string, string | File | (string | File)[]>;
13
- export declare type DefaultRequestBody = Record<string, any> | DefaultRequestMultipartBody | string | undefined;
13
+ export declare type DefaultRequestBody = Record<string, any> | DefaultRequestMultipartBody | string | number | undefined;
14
14
  export interface MockedRequest<Body = DefaultRequestBody> {
15
15
  id: string;
16
16
  url: URL;
@@ -1,10 +1,11 @@
1
- import { Match, Path } from 'node-match-path';
2
1
  import { body, cookie, delay, fetch, json, set, status, text, xml } from '../context';
3
2
  import { SerializedResponse } from '../setupWorker/glossary';
4
3
  import { ResponseResolutionContext } from '../utils/getResponse';
4
+ import { Match, Path, PathParams } from '../utils/matching/matchRequestUrl';
5
5
  import { DefaultRequestBody, MockedRequest, RequestHandler, ResponseResolver } from './RequestHandler';
6
+ declare type RestHandlerMethod = string | RegExp;
6
7
  interface RestHandlerInfo {
7
- method: string;
8
+ method: RestHandlerMethod;
8
9
  path: Path;
9
10
  }
10
11
  export declare enum RESTMethods {
@@ -28,13 +29,10 @@ export declare type RestContext = {
28
29
  fetch: typeof fetch;
29
30
  };
30
31
  export declare const restContext: RestContext;
31
- export declare type RequestParams = {
32
- [paramName: string]: any;
33
- };
34
32
  export declare type RequestQuery = {
35
- [queryName: string]: any;
33
+ [queryName: string]: string;
36
34
  };
37
- export interface RestRequest<BodyType extends DefaultRequestBody = DefaultRequestBody, ParamsType extends RequestParams = Record<string, any>> extends MockedRequest<BodyType> {
35
+ export interface RestRequest<BodyType extends DefaultRequestBody = DefaultRequestBody, ParamsType extends PathParams = PathParams> extends MockedRequest<BodyType> {
38
36
  params: ParamsType;
39
37
  }
40
38
  export declare type ParsedRestRequest = Match;
@@ -42,11 +40,11 @@ export declare type ParsedRestRequest = Match;
42
40
  * Request handler for REST API requests.
43
41
  * Provides request matching based on method and URL.
44
42
  */
45
- export declare class RestHandler<RequestType extends MockedRequest<DefaultRequestBody> = MockedRequest<DefaultRequestBody>> extends RequestHandler<RestHandlerInfo, RequestType, ParsedRestRequest, RestRequest<RequestParams>> {
46
- constructor(method: string, path: Path, resolver: ResponseResolver<any, any>);
43
+ export declare class RestHandler<RequestType extends MockedRequest<DefaultRequestBody> = MockedRequest<DefaultRequestBody>> extends RequestHandler<RestHandlerInfo, RequestType, ParsedRestRequest, RestRequest<RequestType extends MockedRequest<infer RequestBodyType> ? RequestBodyType : any, PathParams>> {
44
+ constructor(method: RestHandlerMethod, path: Path, resolver: ResponseResolver<any, any>);
47
45
  private checkRedundantQueryParameters;
48
46
  parse(request: RequestType, resolutionContext?: ResponseResolutionContext): Match;
49
- protected getPublicRequest(request: RequestType, parsedResult: ParsedRestRequest): RestRequest<any, RequestParams>;
47
+ protected getPublicRequest(request: RequestType, parsedResult: ParsedRestRequest): RestRequest<any, PathParams>;
50
48
  predicate(request: RequestType, parsedResult: ParsedRestRequest): boolean;
51
49
  log(request: RequestType, response: SerializedResponse): void;
52
50
  }
@@ -1,16 +1,26 @@
1
1
  import * as context from './context';
2
2
  export { context };
3
3
  export { setupWorker } from './setupWorker/setupWorker';
4
- export { SetupWorkerApi } from './setupWorker/glossary';
5
- export { response, defaultResponse, createResponseComposition, MockedResponse, ResponseTransformer, ResponseComposition, ResponseCompositionOptions, ResponseFunction, } from './response';
6
- export { RequestHandler, MockedRequest, ResponseResolver, ResponseResolverReturnType, AsyncResponseResolverReturnType, DefaultRequestBody, DefaultRequestMultipartBody, defaultContext, } from './handlers/RequestHandler';
4
+ export { response, defaultResponse, createResponseComposition, } from './response';
5
+ export { RequestHandler, defaultContext } from './handlers/RequestHandler';
7
6
  export { rest } from './rest';
8
- export { RestHandler, RESTMethods, RestContext, RequestParams, RequestQuery, RestRequest, ParsedRestRequest, restContext, } from './handlers/RestHandler';
7
+ export { RestHandler, RESTMethods, restContext } from './handlers/RestHandler';
9
8
  export { graphql } from './graphql';
10
- export { GraphQLHandler, GraphQLContext, GraphQLVariables, GraphQLRequest, GraphQLRequestBody, GraphQLJsonRequestBody, graphqlContext, } from './handlers/GraphQLHandler';
9
+ export { GraphQLHandler, graphqlContext } from './handlers/GraphQLHandler';
11
10
  export { matchRequestUrl } from './utils/matching/matchRequestUrl';
12
11
  export { compose } from './utils/internal/compose';
13
- export { DelayMode } from './context/delay';
14
- export { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest';
15
12
  export * from './utils/handleRequest';
16
13
  export * from './utils/request/parseIsomorphicRequest';
14
+ export { cleanUrl } from './utils/url/cleanUrl';
15
+ /**
16
+ * Type definitions.
17
+ */
18
+ export type { SetupWorkerApi, StartOptions } from './setupWorker/glossary';
19
+ export type { SharedOptions } from './sharedOptions';
20
+ export type { MockedRequest, ResponseResolver, ResponseResolverReturnType, AsyncResponseResolverReturnType, DefaultRequestBody, DefaultRequestMultipartBody, } from './handlers/RequestHandler';
21
+ export type { MockedResponse, ResponseTransformer, ResponseComposition, ResponseCompositionOptions, ResponseFunction, } from './response';
22
+ export type { RestContext, RequestQuery, RestRequest, ParsedRestRequest, } from './handlers/RestHandler';
23
+ export type { GraphQLContext, GraphQLVariables, GraphQLRequest, GraphQLRequestBody, GraphQLJsonRequestBody, } from './handlers/GraphQLHandler';
24
+ export type { Path, PathParams, Match } from './utils/matching/matchRequestUrl';
25
+ export type { DelayMode } from './context/delay';
26
+ export { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest';
@@ -1,15 +1,8 @@
1
1
  import { PartialDeep } from 'type-fest';
2
2
  import { IsomorphicResponse } from '@mswjs/interceptors';
3
- import { MockedRequest, RequestHandler } from '../handlers/RequestHandler';
4
- import { SharedOptions } from '../sharedOptions';
5
- export interface ServerLifecycleEventsMap {
6
- 'request:start': (request: MockedRequest) => void;
7
- 'request:match': (request: MockedRequest) => void;
8
- 'request:unhandled': (request: MockedRequest) => void;
9
- 'request:end': (request: MockedRequest) => void;
10
- 'response:mocked': (response: IsomorphicResponse, requestId: string) => void;
11
- 'response:bypass': (response: IsomorphicResponse, requestId: string) => void;
12
- }
3
+ import { RequestHandler } from '../handlers/RequestHandler';
4
+ import { LifeCycleEventEmitter, LifeCycleEventsMap, SharedOptions } from '../sharedOptions';
5
+ export declare type ServerLifecycleEventsMap = LifeCycleEventsMap<IsomorphicResponse>;
13
6
  export interface SetupServerApi {
14
7
  /**
15
8
  * Starts requests interception based on the previously provided request handlers.
@@ -41,8 +34,5 @@ export interface SetupServerApi {
41
34
  * @see {@link https://mswjs.io/docs/api/setup-server/print-handlers `server.print-handlers()`}
42
35
  */
43
36
  printHandlers(): void;
44
- /**
45
- * Attaches a listener to one of the life-cycle events.
46
- */
47
- on<EventType extends keyof ServerLifecycleEventsMap>(eventType: EventType, listener: ServerLifecycleEventsMap[EventType]): void;
37
+ events: LifeCycleEventEmitter<ServerLifecycleEventsMap>;
48
38
  }
@@ -1,2 +1,2 @@
1
1
  export { setupServer } from './setupServer';
2
- export { SetupServerApi } from './glossary';
2
+ export type { SetupServerApi } from './glossary';
@@ -1,12 +1,13 @@
1
- import { Path } from 'node-match-path';
2
1
  import { DefaultRequestBody, ResponseResolver } from './handlers/RequestHandler';
3
- import { RestContext, RestHandler, RestRequest, RequestParams } from './handlers/RestHandler';
2
+ import { RestContext, RestHandler, RestRequest } from './handlers/RestHandler';
3
+ import { Path, PathParams } from './utils/matching/matchRequestUrl';
4
4
  export declare const rest: {
5
- head: <RequestBodyType extends DefaultRequestBody = DefaultRequestBody, ResponseBody extends DefaultRequestBody = any, Params extends RequestParams = RequestParams>(path: Path, resolver: ResponseResolver<RestRequest<RequestBodyType, Params>, RestContext, ResponseBody>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
6
- get: <RequestBodyType extends DefaultRequestBody = DefaultRequestBody, ResponseBody extends DefaultRequestBody = any, Params extends RequestParams = RequestParams>(path: Path, resolver: ResponseResolver<RestRequest<RequestBodyType, Params>, RestContext, ResponseBody>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
7
- post: <RequestBodyType extends DefaultRequestBody = DefaultRequestBody, ResponseBody extends DefaultRequestBody = any, Params extends RequestParams = RequestParams>(path: Path, resolver: ResponseResolver<RestRequest<RequestBodyType, Params>, RestContext, ResponseBody>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
8
- put: <RequestBodyType extends DefaultRequestBody = DefaultRequestBody, ResponseBody extends DefaultRequestBody = any, Params extends RequestParams = RequestParams>(path: Path, resolver: ResponseResolver<RestRequest<RequestBodyType, Params>, RestContext, ResponseBody>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
9
- delete: <RequestBodyType extends DefaultRequestBody = DefaultRequestBody, ResponseBody extends DefaultRequestBody = any, Params extends RequestParams = RequestParams>(path: Path, resolver: ResponseResolver<RestRequest<RequestBodyType, Params>, RestContext, ResponseBody>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
10
- patch: <RequestBodyType extends DefaultRequestBody = DefaultRequestBody, ResponseBody extends DefaultRequestBody = any, Params extends RequestParams = RequestParams>(path: Path, resolver: ResponseResolver<RestRequest<RequestBodyType, Params>, RestContext, ResponseBody>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
11
- options: <RequestBodyType extends DefaultRequestBody = DefaultRequestBody, ResponseBody extends DefaultRequestBody = any, Params extends RequestParams = RequestParams>(path: Path, resolver: ResponseResolver<RestRequest<RequestBodyType, Params>, RestContext, ResponseBody>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
5
+ all: <RequestBodyType extends DefaultRequestBody = DefaultRequestBody, Params extends PathParams = PathParams, ResponseBody extends DefaultRequestBody = DefaultRequestBody>(path: Path, resolver: ResponseResolver<RestRequest<RequestBodyType, Params>, RestContext, ResponseBody>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
6
+ head: <RequestBodyType_1 extends DefaultRequestBody = DefaultRequestBody, Params_1 extends PathParams = PathParams, ResponseBody_1 extends DefaultRequestBody = DefaultRequestBody>(path: Path, resolver: ResponseResolver<RestRequest<never, Params_1>, RestContext, ResponseBody_1>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
7
+ get: <RequestBodyType_2 extends DefaultRequestBody = DefaultRequestBody, Params_2 extends PathParams = PathParams, ResponseBody_2 extends DefaultRequestBody = DefaultRequestBody>(path: Path, resolver: ResponseResolver<RestRequest<never, Params_2>, RestContext, ResponseBody_2>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
8
+ post: <RequestBodyType_3 extends DefaultRequestBody = DefaultRequestBody, Params_3 extends PathParams = PathParams, ResponseBody_3 extends DefaultRequestBody = DefaultRequestBody>(path: Path, resolver: ResponseResolver<RestRequest<RequestBodyType_3, Params_3>, RestContext, ResponseBody_3>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
9
+ put: <RequestBodyType_4 extends DefaultRequestBody = DefaultRequestBody, Params_4 extends PathParams = PathParams, ResponseBody_4 extends DefaultRequestBody = DefaultRequestBody>(path: Path, resolver: ResponseResolver<RestRequest<RequestBodyType_4, Params_4>, RestContext, ResponseBody_4>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
10
+ delete: <RequestBodyType_5 extends DefaultRequestBody = DefaultRequestBody, Params_5 extends PathParams = PathParams, ResponseBody_5 extends DefaultRequestBody = DefaultRequestBody>(path: Path, resolver: ResponseResolver<RestRequest<RequestBodyType_5, Params_5>, RestContext, ResponseBody_5>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
11
+ patch: <RequestBodyType_6 extends DefaultRequestBody = DefaultRequestBody, Params_6 extends PathParams = PathParams, ResponseBody_6 extends DefaultRequestBody = DefaultRequestBody>(path: Path, resolver: ResponseResolver<RestRequest<RequestBodyType_6, Params_6>, RestContext, ResponseBody_6>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
12
+ options: <RequestBodyType_7 extends DefaultRequestBody = DefaultRequestBody, Params_7 extends PathParams = PathParams, ResponseBody_7 extends DefaultRequestBody = DefaultRequestBody>(path: Path, resolver: ResponseResolver<RestRequest<RequestBodyType_7, Params_7>, RestContext, ResponseBody_7>) => RestHandler<import("./handlers/RequestHandler").MockedRequest<DefaultRequestBody>>;
12
13
  };
@@ -1,11 +1,11 @@
1
- import { Path } from 'node-match-path';
2
- import { PartialDeep } from 'type-fest';
3
1
  import { FlatHeadersObject } from 'headers-utils';
4
2
  import { StrictEventEmitter } from 'strict-event-emitter';
5
- import { SharedOptions } from '../sharedOptions';
3
+ import { LifeCycleEventEmitter, LifeCycleEventsMap, SharedOptions } from '../sharedOptions';
6
4
  import { ServiceWorkerMessage } from '../utils/createBroadcastChannel';
7
- import { MockedRequest, RequestHandler } from '../handlers/RequestHandler';
5
+ import { RequestHandler } from '../handlers/RequestHandler';
8
6
  import { InterceptorApi } from '@mswjs/interceptors';
7
+ import { Path } from '../utils/matching/matchRequestUrl';
8
+ import { RequiredDeep } from '../typeUtils';
9
9
  export declare type ResolvedPath = Path | URL;
10
10
  declare type RequestWithoutMethods = Omit<Request, 'text' | 'body' | 'json' | 'blob' | 'arrayBuffer' | 'formData' | 'clone' | 'signal' | 'isHistoryNavigation' | 'isReloadNavigation'>;
11
11
  /**
@@ -45,16 +45,9 @@ export declare type ServiceWorkerOutgoingEventTypes = 'MOCK_ACTIVATE' | 'MOCK_DE
45
45
  * only as a part of a single `fetch` event handler.
46
46
  */
47
47
  export declare type ServiceWorkerFetchEventTypes = 'MOCK_SUCCESS' | 'MOCK_NOT_FOUND' | 'NETWORK_ERROR' | 'INTERNAL_ERROR';
48
- export interface WorkerLifecycleEventsMap {
49
- 'request:start': (request: MockedRequest) => void;
50
- 'request:match': (request: MockedRequest) => void;
51
- 'request:unhandled': (request: MockedRequest) => void;
52
- 'request:end': (request: MockedRequest) => void;
53
- 'response:mocked': (response: Response, requestId: string) => void;
54
- 'response:bypass': (response: Response, requestId: string) => void;
55
- }
48
+ export declare type WorkerLifecycleEventsMap = LifeCycleEventsMap<Response>;
56
49
  export interface SetupWorkerInternalContext {
57
- startOptions?: StartOptions;
50
+ startOptions?: RequiredDeep<StartOptions>;
58
51
  worker: ServiceWorker | null;
59
52
  registration: ServiceWorkerRegistration | null;
60
53
  requestHandlers: RequestHandler[];
@@ -72,7 +65,7 @@ export interface SetupWorkerInternalContext {
72
65
  * Adds an event listener on the given target.
73
66
  * Returns a clean-up function that removes that listener.
74
67
  */
75
- addListener<E extends Event>(target: EventTarget, eventType: string, listener: (event: E) => void): () => void;
68
+ addListener<EventType extends Event = Event>(target: EventTarget, eventType: string, listener: (event: EventType) => void): () => void;
76
69
  /**
77
70
  * Removes all currently attached listeners.
78
71
  */
@@ -94,25 +87,25 @@ export interface StartOptions extends SharedOptions {
94
87
  /**
95
88
  * Service Worker instance options.
96
89
  */
97
- serviceWorker: {
98
- url: string;
99
- options: RegistrationOptions;
90
+ serviceWorker?: {
91
+ url?: string;
92
+ options?: RegistrationOptions;
100
93
  };
101
94
  /**
102
95
  * Disables the logging of captured requests
103
96
  * into browser's console.
104
97
  */
105
- quiet: boolean;
98
+ quiet?: boolean;
106
99
  /**
107
100
  * Defers any network requests until the Service Worker
108
101
  * instance is ready. Defaults to `true`.
109
102
  */
110
- waitUntilReady: boolean;
103
+ waitUntilReady?: boolean;
111
104
  /**
112
105
  * A custom lookup function to find a Mock Service Worker in the list
113
106
  * of all registered Service Workers on the page.
114
107
  */
115
- findWorker: FindWorker;
108
+ findWorker?: FindWorker;
116
109
  }
117
110
  export interface SerializedResponse<BodyType = any> {
118
111
  status: number;
@@ -121,14 +114,14 @@ export interface SerializedResponse<BodyType = any> {
121
114
  body: BodyType;
122
115
  }
123
116
  export declare type StartReturnType = Promise<ServiceWorkerRegistration | undefined>;
124
- export declare type StartHandler = (options: StartOptions, initialOptions: PartialDeep<StartOptions>) => StartReturnType;
117
+ export declare type StartHandler = (options: RequiredDeep<StartOptions>, initialOptions: StartOptions) => StartReturnType;
125
118
  export declare type StopHandler = () => void;
126
119
  export interface SetupWorkerApi {
127
120
  /**
128
121
  * Registers and activates the mock Service Worker.
129
122
  * @see {@link https://mswjs.io/docs/api/setup-worker/start `worker.start()`}
130
123
  */
131
- start: (options?: PartialDeep<StartOptions>) => StartReturnType;
124
+ start: (options?: StartOptions) => StartReturnType;
132
125
  /**
133
126
  * Stops requests interception for the current client.
134
127
  * @see {@link https://mswjs.io/docs/api/setup-worker/stop `worker.stop()`}
@@ -156,9 +149,6 @@ export interface SetupWorkerApi {
156
149
  * @see {@link https://mswjs.io/docs/api/setup-worker/print-handlers `worker.printHandlers()`}
157
150
  */
158
151
  printHandlers: () => void;
159
- /**
160
- * Attaches a listener to one of the life-cycle events.
161
- */
162
- on<EventType extends keyof WorkerLifecycleEventsMap>(eventType: EventType, listener: WorkerLifecycleEventsMap[EventType]): void;
152
+ events: LifeCycleEventEmitter<WorkerLifecycleEventsMap>;
163
153
  }
164
154
  export {};
@@ -1,9 +1,9 @@
1
- import { PartialDeep } from 'type-fest';
1
+ import { RequiredDeep } from '../../../typeUtils';
2
2
  import { SetupWorkerApi, SetupWorkerInternalContext, StartHandler, StartOptions } from '../../glossary';
3
- export declare const DEFAULT_START_OPTIONS: StartOptions;
3
+ export declare const DEFAULT_START_OPTIONS: RequiredDeep<StartOptions>;
4
4
  /**
5
5
  * Returns resolved worker start options, merging the default options
6
6
  * with the given custom options.
7
7
  */
8
- export declare function resolveStartOptions(initialOptions?: PartialDeep<StartOptions>): StartOptions;
8
+ export declare function resolveStartOptions(initialOptions?: StartOptions): RequiredDeep<StartOptions>;
9
9
  export declare function prepareStartHandler(handler: StartHandler, context: SetupWorkerInternalContext): SetupWorkerApi['start'];
@@ -1,3 +1,5 @@
1
+ import { StrictEventEmitter } from 'strict-event-emitter';
2
+ import { MockedRequest } from './handlers/RequestHandler';
1
3
  import { UnhandledRequestStrategy } from './utils/request/onUnhandledRequest';
2
4
  export interface SharedOptions {
3
5
  /**
@@ -8,5 +10,14 @@ export interface SharedOptions {
8
10
  * @example worker.start({ onUnhandledRequest: 'warn' })
9
11
  * @example server.listen({ onUnhandledRequest: 'error' })
10
12
  */
11
- onUnhandledRequest: UnhandledRequestStrategy;
13
+ onUnhandledRequest?: UnhandledRequestStrategy;
12
14
  }
15
+ export interface LifeCycleEventsMap<ResponseType> {
16
+ 'request:start': (request: MockedRequest) => void;
17
+ 'request:match': (request: MockedRequest) => void;
18
+ 'request:unhandled': (request: MockedRequest) => void;
19
+ 'request:end': (request: MockedRequest) => void;
20
+ 'response:mocked': (response: ResponseType, requestId: string) => void;
21
+ 'response:bypass': (response: ResponseType, requestId: string) => void;
22
+ }
23
+ export declare type LifeCycleEventEmitter<ResponseType> = Pick<StrictEventEmitter<ResponseType>, 'on' | 'removeListener' | 'removeAllListeners'>;
@@ -1,5 +1,7 @@
1
+ import { ResponseTransformer } from './response';
1
2
  declare type Fn = (...arg: any[]) => any;
2
- export declare type DeepRequired<T, U extends Record<string, any> | Fn | undefined = undefined> = T extends Record<string, any> ? {
3
- [P in keyof T]-?: NonNullable<T[P]> extends NonNullable<U | Fn> ? NonNullable<T[P]> : DeepRequired<NonNullable<T[P]>, U>;
4
- } : T;
3
+ export declare type RequiredDeep<Type, U extends Record<string, unknown> | Fn | undefined = undefined> = Type extends Fn ? Type : Type extends Record<string, any> ? {
4
+ [Key in keyof Type]-?: NonNullable<Type[Key]> extends NonNullable<U> ? NonNullable<Type[Key]> : RequiredDeep<NonNullable<Type[Key]>, U>;
5
+ } : Type;
6
+ export declare type GraphQLPayloadContext<QueryType extends Record<string, unknown>> = (payload: QueryType) => ResponseTransformer;
5
7
  export {};
@@ -3,7 +3,7 @@ import { MockedRequest, RequestHandler } from '../handlers/RequestHandler';
3
3
  import { ServerLifecycleEventsMap } from '../node/glossary';
4
4
  import { MockedResponse } from '../response';
5
5
  import { SharedOptions } from '../sharedOptions';
6
- import { DeepRequired } from '../typeUtils';
6
+ import { RequiredDeep } from '../typeUtils';
7
7
  import { ResponseLookupResult } from './getResponse';
8
8
  export interface HandleRequestOptions<ResponseType> {
9
9
  /**
@@ -24,11 +24,11 @@ export interface HandleRequestOptions<ResponseType> {
24
24
  /**
25
25
  * Invoked when the mocked response is ready to be sent.
26
26
  */
27
- onMockedResponse?(response: ResponseType, handler: DeepRequired<ResponseLookupResult>): void;
27
+ onMockedResponse?(response: ResponseType, handler: RequiredDeep<ResponseLookupResult>): void;
28
28
  /**
29
29
  * Invoked when the mocked response is sent.
30
30
  * Respects the response delay duration.
31
31
  */
32
- onMockedResponseSent?(response: ResponseType, handler: DeepRequired<ResponseLookupResult>): void;
32
+ onMockedResponseSent?(response: ResponseType, handler: RequiredDeep<ResponseLookupResult>): void;
33
33
  }
34
- export declare function handleRequest<ResponseType extends Record<string, any> = MockedResponse<string>>(request: MockedRequest, handlers: RequestHandler[], options: SharedOptions, emitter: StrictEventEmitter<ServerLifecycleEventsMap>, handleRequestOptions?: HandleRequestOptions<ResponseType>): Promise<ResponseType | undefined>;
34
+ export 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>;
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Return the stack trace frame of a function's invocation.
3
3
  */
4
- export declare function getCallFrame(): string | undefined;
4
+ export declare function getCallFrame(error: Error): string | undefined;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Parses a given string into a JSON.
2
+ * Parses a given value into a JSON.
3
3
  * Does not throw an exception on an invalid JSON string.
4
4
  */
5
- export declare function jsonParse<T extends Record<string, any>>(str: string): T | undefined;
5
+ export declare function jsonParse<ValueType extends Record<string, any>>(value: any): ValueType | undefined;
@@ -0,0 +1,6 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from 'stream';
3
+ /**
4
+ * Pipes all emitted events from one emitter to another.
5
+ */
6
+ export declare function pipeEvents(source: EventEmitter, destination: EventEmitter): void;
@@ -3,7 +3,7 @@ import { SerializedResponse } from '../../setupWorker/glossary';
3
3
  * Formats a mocked response for introspection in the browser's console.
4
4
  */
5
5
  export declare function prepareResponse(res: SerializedResponse<any>): {
6
- body: string | Record<string, any> | undefined;
6
+ body: string | number | Record<string, any> | undefined;
7
7
  status: number;
8
8
  statusText: string;
9
9
  headers: import("headers-utils").FlatHeadersObject;
@@ -1,5 +1,15 @@
1
- import { Path, match } from 'node-match-path';
1
+ export declare type Path = string | RegExp;
2
+ export declare type PathParams = Record<string, string | string[]>;
3
+ export interface Match {
4
+ matches: boolean;
5
+ params?: PathParams;
6
+ }
7
+ /**
8
+ * Coerce a path supported by MSW into a path
9
+ * supported by "path-to-regexp".
10
+ */
11
+ export declare function coercePath(path: string): string;
2
12
  /**
3
13
  * Returns the result of matching given request URL against a mask.
4
14
  */
5
- export declare function matchRequestUrl(url: URL, path: Path, baseUrl?: string): ReturnType<typeof match>;
15
+ export declare function matchRequestUrl(url: URL, path: Path, baseUrl?: string): Match;
@@ -1,4 +1,4 @@
1
- import { Path } from 'node-match-path';
1
+ import type { Path } from './matchRequestUrl';
2
2
  /**
3
3
  * Normalizes a given request handler path:
4
4
  * - Preserves RegExp.
@@ -1,5 +1,5 @@
1
1
  import { MockedRequest } from '../../handlers/RequestHandler';
2
2
  /**
3
- * Parses a given request/response body based on the `Content-Type` header.
3
+ * Parses a given request/response body based on the "Content-Type" header.
4
4
  */
5
- export declare function parseBody(body?: MockedRequest['body'], headers?: Headers): string | Record<string, any> | undefined;
5
+ export declare function parseBody(body?: MockedRequest['body'], headers?: Headers): string | number | Record<string, any> | undefined;
@@ -1,7 +1,7 @@
1
- import { MockedRequest } from '../../handlers/RequestHandler';
1
+ import { RestRequest } from '../../handlers/RestHandler';
2
2
  import { ServiceWorkerIncomingRequest } from '../../setupWorker/glossary';
3
3
  /**
4
4
  * Converts a given request received from the Service Worker
5
5
  * into a `MockedRequest` instance.
6
6
  */
7
- export declare function parseWorkerRequest(rawRequest: ServiceWorkerIncomingRequest): MockedRequest;
7
+ export declare function parseWorkerRequest(rawRequest: ServiceWorkerIncomingRequest): RestRequest;
@@ -1,3 +1,4 @@
1
1
  import { InterceptorApi } from '@mswjs/interceptors';
2
2
  import { SetupWorkerInternalContext, StartOptions } from '../../setupWorker/glossary';
3
- export declare function createFallbackRequestListener(context: SetupWorkerInternalContext, options: StartOptions): InterceptorApi;
3
+ import { RequiredDeep } from '../../typeUtils';
4
+ export declare function createFallbackRequestListener(context: SetupWorkerInternalContext, options: RequiredDeep<StartOptions>): InterceptorApi;
@@ -1,3 +1,4 @@
1
1
  import { StartOptions, SetupWorkerInternalContext, ServiceWorkerIncomingEventsMap } from '../../setupWorker/glossary';
2
2
  import { ServiceWorkerMessage } from '../createBroadcastChannel';
3
- export declare const createRequestListener: (context: SetupWorkerInternalContext, options: StartOptions) => (event: MessageEvent, message: ServiceWorkerMessage<'REQUEST', ServiceWorkerIncomingEventsMap['REQUEST']>) => Promise<void>;
3
+ import { RequiredDeep } from '../../typeUtils';
4
+ export declare const createRequestListener: (context: SetupWorkerInternalContext, options: RequiredDeep<StartOptions>) => (event: MessageEvent, message: ServiceWorkerMessage<'REQUEST', ServiceWorkerIncomingEventsMap['REQUEST']>) => Promise<void>;