msw 0.20.5 → 0.21.3

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 (74) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +1 -1
  3. package/lib/esm/fetch-deps.js +26 -23
  4. package/lib/esm/graphql.js +92 -79
  5. package/lib/esm/index.js +90 -44
  6. package/lib/esm/{matchRequest-deps.js → matchRequestUrl-deps.js} +29 -17
  7. package/lib/esm/mockServiceWorker.js +8 -1
  8. package/lib/esm/rest-deps.js +27 -18
  9. package/lib/esm/rest.js +1 -1
  10. package/lib/esm/xml-deps.js +3 -3
  11. package/lib/types/LiveStorage.d.ts +17 -0
  12. package/lib/types/context/body.d.ts +2 -2
  13. package/lib/types/context/errors.d.ts +3 -1
  14. package/lib/types/context/fetch.d.ts +2 -2
  15. package/lib/types/context/json.d.ts +5 -3
  16. package/lib/types/context/text.d.ts +2 -2
  17. package/lib/types/context/xml.d.ts +2 -2
  18. package/lib/types/graphql.d.ts +8 -10
  19. package/lib/types/index.d.ts +3 -3
  20. package/lib/types/native/index.d.ts +7 -1
  21. package/lib/types/node/createSetupServer.d.ts +29 -0
  22. package/lib/types/node/setupServer.d.ts +4 -24
  23. package/lib/types/response.d.ts +10 -7
  24. package/lib/types/rest.d.ts +158 -16
  25. package/lib/types/setupWorker/glossary.d.ts +14 -4
  26. package/lib/types/setupWorker/start/utils/getWorkerByRegistration.d.ts +2 -1
  27. package/lib/types/setupWorker/start/utils/getWorkerInstance.d.ts +2 -2
  28. package/lib/types/sharedOptions.d.ts +1 -1
  29. package/lib/types/utils/getResponse.d.ts +2 -2
  30. package/lib/types/utils/handlers/requestHandler.d.ts +74 -0
  31. package/lib/types/utils/{requestHandlerUtils.d.ts → handlers/requestHandlerUtils.d.ts} +2 -2
  32. package/lib/types/utils/{isNodeProcess.d.ts → internal/isNodeProcess.d.ts} +1 -0
  33. package/lib/types/utils/{isStringEqual.d.ts → internal/isStringEqual.d.ts} +0 -0
  34. package/lib/types/utils/{jsonParse.d.ts → internal/jsonParse.d.ts} +0 -0
  35. package/lib/types/utils/internal/mergeRight.d.ts +5 -0
  36. package/lib/types/utils/{logger → logging}/getStatusCodeColor.d.ts +0 -0
  37. package/lib/types/utils/{logger → logging}/getTimestamp.d.ts +0 -0
  38. package/lib/types/utils/{logger → logging}/prepareRequest.d.ts +3 -3
  39. package/lib/types/utils/{logger → logging}/prepareResponse.d.ts +2 -2
  40. package/lib/types/utils/matching/{matchRequest.d.ts → matchRequestUrl.d.ts} +0 -0
  41. package/lib/types/utils/request/getPublicUrlFromRequest.d.ts +6 -0
  42. package/lib/types/utils/request/getRequestCookies.d.ts +1 -1
  43. package/lib/types/{onUnhandledRequest.d.ts → utils/request/onUnhandledRequest.d.ts} +1 -1
  44. package/lib/types/utils/request/parseBody.d.ts +5 -0
  45. package/lib/types/utils/url/getAbsoluteUrl.d.ts +6 -0
  46. package/lib/types/utils/{getAbsoluteWorkerUrl.d.ts → url/getAbsoluteWorkerUrl.d.ts} +0 -0
  47. package/lib/types/utils/url/getUrlByMask.d.ts +5 -0
  48. package/lib/umd/index.js +696 -613
  49. package/lib/umd/mockServiceWorker.js +8 -1
  50. package/native/index.js +1508 -133
  51. package/node/context/delay.d.ts +11 -0
  52. package/node/context/fetch.d.ts +8 -0
  53. package/node/context/set.d.ts +2 -0
  54. package/node/context/status.d.ts +2 -0
  55. package/node/index.js +1507 -133
  56. package/node/node/createSetupServer.d.ts +29 -0
  57. package/node/node/index.d.ts +5 -0
  58. package/node/node/setupServer.d.ts +7 -0
  59. package/node/response.d.ts +25 -0
  60. package/node/utils/NetworkError.d.ts +3 -0
  61. package/node/utils/getResponse.d.ts +14 -0
  62. package/{lib/types → node/utils}/handlers/requestHandler.d.ts +13 -12
  63. package/node/utils/handlers/requestHandlerUtils.d.ts +4 -0
  64. package/node/utils/internal/compose.d.ts +5 -0
  65. package/node/utils/internal/isNodeProcess.d.ts +5 -0
  66. package/node/utils/internal/jsonParse.d.ts +5 -0
  67. package/node/utils/request/getPublicUrlFromRequest.d.ts +6 -0
  68. package/node/utils/request/onUnhandledRequest.d.ts +5 -0
  69. package/node/utils/request/parseBody.d.ts +5 -0
  70. package/package.json +34 -29
  71. package/lib/types/utils/getJsonBody.d.ts +0 -5
  72. package/lib/types/utils/request/parseRequestBody.d.ts +0 -2
  73. package/lib/types/utils/resolveMask.d.ts +0 -6
  74. package/lib/types/utils/resolveRelativeUrl.d.ts +0 -6
@@ -0,0 +1,29 @@
1
+ import { Interceptor } from 'node-request-interceptor';
2
+ import { RequestHandlersList } from '../setupWorker/glossary';
3
+ import { SharedOptions } from '../sharedOptions';
4
+ /**
5
+ * Creates a `setupServer` API using given request interceptors.
6
+ * Useful to generate identical API using different patches to request issuing modules.
7
+ */
8
+ export declare function createSetupServer(...interceptors: Interceptor[]): (...requestHandlers: RequestHandlersList) => {
9
+ /**
10
+ * Enables requests interception based on the previously provided mock definition.
11
+ */
12
+ listen(options?: SharedOptions | undefined): void;
13
+ /**
14
+ * Prepends given request handlers to the list of existing handlers.
15
+ */
16
+ use(...handlers: RequestHandlersList): void;
17
+ /**
18
+ * Marks all request handlers that respond using `res.once()` as unused.
19
+ */
20
+ restoreHandlers(): void;
21
+ /**
22
+ * Resets request handlers to the initial list given to the `setupServer` call, or to the explicit next request handlers list, if given.
23
+ */
24
+ resetHandlers(...nextHandlers: RequestHandlersList): void;
25
+ /**
26
+ * Stops requests interception by restoring all augmented modules.
27
+ */
28
+ close(): void;
29
+ };
@@ -0,0 +1,5 @@
1
+ export { setupServer } from './setupServer'
2
+
3
+ declare module 'types/context/body.d.ts' {
4
+ export const body: string
5
+ }
@@ -0,0 +1,7 @@
1
+ export declare const setupServer: (...requestHandlers: import("../setupWorker/glossary").RequestHandlersList) => {
2
+ listen(options?: import("../sharedOptions").SharedOptions | undefined): void;
3
+ use(...handlers: import("../setupWorker/glossary").RequestHandlersList): void;
4
+ restoreHandlers(): void;
5
+ resetHandlers(...nextHandlers: import("../setupWorker/glossary").RequestHandlersList): void;
6
+ close(): void;
7
+ };
@@ -0,0 +1,25 @@
1
+ import { Headers } from 'headers-utils';
2
+ export interface MockedResponse<BodyType = any> {
3
+ body: BodyType;
4
+ status: number;
5
+ statusText: string;
6
+ headers: Headers;
7
+ once: boolean;
8
+ delay?: number;
9
+ }
10
+ export declare type ResponseTransformer<BodyType = any> = (res: MockedResponse<BodyType>) => MockedResponse<BodyType>;
11
+ declare type ResponseFunction<BodyType = any> = (...transformers: ResponseTransformer<BodyType>[]) => MockedResponse<BodyType>;
12
+ export declare type ResponseComposition<BodyType = any> = ResponseFunction<BodyType> & {
13
+ /**
14
+ * Respond using a given mocked response to the first captured request.
15
+ * Does not affect any subsequent captured requests.
16
+ */
17
+ once: ResponseFunction<BodyType>;
18
+ networkError: (message: string) => void;
19
+ };
20
+ export declare const defaultResponse: Omit<MockedResponse, 'headers'>;
21
+ export declare const response: ResponseFunction<any> & {
22
+ once: ResponseFunction<any>;
23
+ networkError(message: string): never;
24
+ };
25
+ export {};
@@ -0,0 +1,3 @@
1
+ export declare class NetworkError extends Error {
2
+ constructor(message: string);
3
+ }
@@ -0,0 +1,14 @@
1
+ import { RequestHandlersList } from '../setupWorker/glossary';
2
+ import { RequestHandler, MockedRequest } from './handlers/requestHandler';
3
+ import { MockedResponse } from '../response';
4
+ interface ResponsePayload {
5
+ response: MockedResponse | null;
6
+ handler: RequestHandler<any, any> | null;
7
+ publicRequest?: any;
8
+ parsedRequest?: any;
9
+ }
10
+ /**
11
+ * Returns a mocked response for a given request using following request handlers.
12
+ */
13
+ export declare const getResponse: <R extends MockedRequest<import("./handlers/requestHandler").DefaultRequestBodyType>, H extends RequestHandlersList>(req: R, handlers: H) => Promise<ResponsePayload>;
14
+ export {};
@@ -1,14 +1,15 @@
1
1
  import { Headers } from 'headers-utils';
2
- import { ResponseWithSerializedHeaders } from '../setupWorker/glossary';
3
- import { ResponseComposition, MockedResponse } from '../response';
4
- import { set } from '../context/set';
2
+ import { ResponseWithSerializedHeaders } from '../../setupWorker/glossary';
3
+ import { ResponseComposition, MockedResponse } from '../../response';
4
+ import { set } from '../../context/set';
5
5
  export declare const defaultContext: {
6
- status: (statusCode: number, statusText?: string | undefined) => import("../response").ResponseTransformer;
6
+ status: (statusCode: number, statusText?: string | undefined) => import("../../response").ResponseTransformer<any>;
7
7
  set: typeof set;
8
- delay: (durationMs?: number | undefined) => import("../response").ResponseTransformer;
9
- fetch: <ResponseType_1 = any>(input: string | MockedRequest, requestInit?: RequestInit) => Promise<ResponseType_1>;
8
+ delay: (durationMs?: number | undefined) => import("../../response").ResponseTransformer<any>;
9
+ fetch: (input: string | MockedRequest<DefaultRequestBodyType>, requestInit?: RequestInit) => Promise<Response>;
10
10
  };
11
- export interface MockedRequest {
11
+ export declare type DefaultRequestBodyType = Record<string, any> | string | undefined;
12
+ export interface MockedRequest<BodyType = DefaultRequestBodyType> {
12
13
  url: URL;
13
14
  method: Request['method'];
14
15
  headers: Headers;
@@ -22,7 +23,7 @@ export interface MockedRequest {
22
23
  redirect: Request['redirect'];
23
24
  referrer: Request['referrer'];
24
25
  referrerPolicy: Request['referrerPolicy'];
25
- body: Record<string, any> | string | undefined;
26
+ body: BodyType;
26
27
  bodyUsed: Request['bodyUsed'];
27
28
  params: RequestParams;
28
29
  }
@@ -34,8 +35,8 @@ export declare type RequestParams = {
34
35
  };
35
36
  export declare type ResponseResolverReturnType<R> = R | undefined | void;
36
37
  export declare type AsyncResponseResolverReturnType<R> = Promise<ResponseResolverReturnType<R>> | ResponseResolverReturnType<R>;
37
- export declare type ResponseResolver<RequestType = MockedRequest, ContextType = typeof defaultContext> = (req: RequestType, res: ResponseComposition, context: ContextType) => AsyncResponseResolverReturnType<MockedResponse>;
38
- export interface RequestHandler<RequestType = MockedRequest, ContextType = typeof defaultContext, ParsedRequest = any, PublicRequest = RequestType> {
38
+ export declare type ResponseResolver<RequestType = MockedRequest, ContextType = typeof defaultContext, BodyType = any> = (req: RequestType, res: ResponseComposition<BodyType>, context: ContextType) => AsyncResponseResolverReturnType<MockedResponse<BodyType>>;
39
+ export interface RequestHandler<RequestType = MockedRequest, ContextType = typeof defaultContext, ParsedRequest = any, PublicRequest = RequestType, ResponseBodyType = any> {
39
40
  /**
40
41
  * Parses a captured request to retrieve additional
41
42
  * information meant for internal usage in the request handler.
@@ -52,7 +53,7 @@ export interface RequestHandler<RequestType = MockedRequest, ContextType = typeo
52
53
  /**
53
54
  * Returns a mocked response object to the captured request.
54
55
  */
55
- resolver: ResponseResolver<RequestType, ContextType>;
56
+ resolver: ResponseResolver<RequestType, ContextType, ResponseBodyType>;
56
57
  /**
57
58
  * Returns a map of context utility functions available
58
59
  * under the `ctx` argument of request handler.
@@ -62,7 +63,7 @@ export interface RequestHandler<RequestType = MockedRequest, ContextType = typeo
62
63
  * Prints out a mocked request/response information
63
64
  * upon each request capture into browser's console.
64
65
  */
65
- log: (req: PublicRequest, res: ResponseWithSerializedHeaders, handler: RequestHandler<RequestType, ContextType>, parsedRequest: ParsedRequest) => void;
66
+ log: (req: PublicRequest, res: ResponseWithSerializedHeaders, handler: RequestHandler<RequestType, ContextType, ParsedRequest, PublicRequest, ResponseBodyType>, parsedRequest: ParsedRequest) => void;
66
67
  /**
67
68
  * Describes whether this request handler should be skipped
68
69
  * when dealing with any subsequent matching requests.
@@ -0,0 +1,4 @@
1
+ import { RequestHandlersList } from '../../setupWorker/glossary';
2
+ export declare function use(currentHandlers: RequestHandlersList, ...handlers: RequestHandlersList): void;
3
+ export declare function restoreHandlers(handlers: RequestHandlersList): void;
4
+ export declare function resetHandlers(initialHandlers: RequestHandlersList, ...nextHandlers: RequestHandlersList): import("./requestHandler").RequestHandler<any, any, any, any, any>[];
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Composes a given list of functions into a new function that
3
+ * executes from right to left.
4
+ */
5
+ export declare function compose(...funcs: Array<(...args: any[]) => any>): (...args: any[]) => any;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Returns a boolean indicating if the current process is running in NodeJS environment.
3
+ * @see https://github.com/mswjs/msw/pull/255
4
+ */
5
+ export declare function isNodeProcess(): boolean | undefined;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Parses a given string into a JSON.
3
+ * Does not throw an exception on an invalid JSON string.
4
+ */
5
+ export declare function jsonParse<T extends Record<string, any>>(str: string): T | undefined;
@@ -0,0 +1,6 @@
1
+ import { MockedRequest } from '../handlers/requestHandler';
2
+ /**
3
+ * Returns a relative URL if the given request URL is relative to the current origin.
4
+ * Otherwise returns an absolute URL.
5
+ */
6
+ export declare const getPublicUrlFromRequest: (request: MockedRequest) => string;
@@ -0,0 +1,5 @@
1
+ import { MockedRequest } from '../handlers/requestHandler';
2
+ declare type UnhandledRequestCallback = (req: MockedRequest) => void;
3
+ export declare type OnUnhandledRequest = 'bypass' | 'warn' | 'error' | UnhandledRequestCallback;
4
+ export declare function onUnhandledRequest(request: MockedRequest, onUnhandledRequest?: OnUnhandledRequest): void;
5
+ export {};
@@ -0,0 +1,5 @@
1
+ import { MockedRequest } from '../handlers/requestHandler';
2
+ /**
3
+ * Parses a given request/response body based on the `Content-Type` header.
4
+ */
5
+ export declare function parseBody(body?: MockedRequest['body'], headers?: Headers): import("../handlers/requestHandler").DefaultRequestBodyType;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "msw",
3
- "version": "0.20.5",
4
- "description": "Client-side API mocking using Service Workers.",
3
+ "version": "0.21.3",
4
+ "description": "Seamless REST/GraphQL API mocking library for browser and Node.",
5
5
  "main": "lib/umd/index.js",
6
6
  "module": "lib/esm/index.js",
7
7
  "types": "lib/types",
@@ -11,13 +11,13 @@
11
11
  "scripts": {
12
12
  "start": "cross-env NODE_ENV=development rollup -c rollup.config.ts -w",
13
13
  "clean": "rimraf lib node/**/*.js",
14
- "lint": "eslint '{cli,config,src,test}/**/*.ts'",
14
+ "lint": "eslint \"{cli,config,src,test}/**/*.ts\"",
15
15
  "build": "yarn clean && cross-env NODE_ENV=production rollup -c rollup.config.ts",
16
16
  "test": "yarn test:unit && yarn test:integration",
17
17
  "test:unit": "cross-env BABEL_ENV=test jest --runInBand",
18
- "test:integration": "node --max_old_space_size=8000 node_modules/.bin/jest --config=test/jest.config.js --runInBand",
18
+ "test:integration": "node --max_old_space_size=8000 node_modules/jest/bin/jest.js --config=test/jest.config.js --runInBand",
19
19
  "test:smoke": "config/scripts/smoke.sh",
20
- "test:focused": "node_modules/.bin/ts-node --project=test/tsconfig.json test/focusedTest.ts",
20
+ "test:focused": "node node_modules/ts-node/dist/bin.js --project=test/tsconfig.json test/focusedTest.ts",
21
21
  "prepublishOnly": "yarn lint && yarn test:unit && yarn build && yarn test:integration"
22
22
  },
23
23
  "husky": {
@@ -64,52 +64,57 @@
64
64
  "@open-draft/until": "^1.0.3",
65
65
  "@types/cookie": "^0.4.0",
66
66
  "chalk": "^4.1.0",
67
+ "chokidar": "^3.4.2",
67
68
  "cookie": "^0.4.1",
68
69
  "graphql": "^15.3.0",
69
70
  "headers-utils": "^1.2.0",
70
- "node-fetch": "^2.6.0",
71
+ "node-fetch": "^2.6.1",
71
72
  "node-match-path": "^0.4.4",
72
- "node-request-interceptor": "^0.3.5",
73
+ "node-request-interceptor": "^0.5.1",
73
74
  "statuses": "^2.0.0",
74
- "yargs": "^15.4.1"
75
+ "yargs": "^16.0.3"
75
76
  },
76
77
  "devDependencies": {
77
- "@babel/core": "^7.10.5",
78
- "@babel/preset-env": "^7.10.4",
79
- "@rollup/plugin-commonjs": "^14.0.0",
78
+ "@babel/core": "^7.11.6",
79
+ "@babel/preset-env": "^7.11.5",
80
+ "@rollup/plugin-commonjs": "^15.0.0",
80
81
  "@rollup/plugin-inject": "^4.0.2",
81
82
  "@rollup/plugin-json": "^4.1.0",
82
- "@rollup/plugin-node-resolve": "^8.4.0",
83
+ "@rollup/plugin-node-resolve": "^9.0.0",
83
84
  "@rollup/plugin-replace": "^2.3.3",
84
- "@types/jest": "^26.0.7",
85
- "@types/node": "^14.0.27",
85
+ "@types/express": "^4.17.8",
86
+ "@types/fs-extra": "^9.0.1",
87
+ "@types/jest": "^26.0.13",
88
+ "@types/node": "^14.6.4",
86
89
  "@types/node-fetch": "^2.5.7",
87
- "@types/puppeteer": "^3.0.1",
90
+ "@types/puppeteer": "^3.0.2",
88
91
  "@types/webpack-dev-server": "^3.11.0",
89
- "@typescript-eslint/eslint-plugin": "^3.7.1",
90
- "@typescript-eslint/parser": "^3.7.1",
92
+ "@typescript-eslint/eslint-plugin": "^4.1.0",
93
+ "@typescript-eslint/parser": "^4.1.0",
91
94
  "apollo-fetch": "^0.7.0",
92
95
  "babel-loader": "^8.1.0",
93
96
  "babel-minify": "^0.5.1",
94
97
  "cross-env": "^7.0.0",
95
- "eslint": "^7.5.0",
98
+ "eslint": "^7.8.1",
96
99
  "eslint-config-prettier": "^6.11.0",
97
100
  "eslint-plugin-prettier": "^3.1.4",
98
- "html-webpack-plugin": "^4.3.0",
99
- "husky": "^4.2.5",
101
+ "express": "^4.17.1",
102
+ "fs-extra": "^9.0.1",
103
+ "html-webpack-plugin": "^4.4.1",
104
+ "husky": "^4.3.0",
100
105
  "ignore-loader": "^0.1.2",
101
- "jest": "^26.1.0",
102
- "lint-staged": "^10.2.11",
103
- "prettier": "^2.0.5",
106
+ "jest": "^26.4.2",
107
+ "lint-staged": "^10.3.0",
108
+ "prettier": "^2.1.1",
104
109
  "puppeteer": "^5.2.1",
105
110
  "regenerator-runtime": "^0.13.7",
106
111
  "rimraf": "^3.0.2",
107
- "rollup": "^2.23.0",
108
- "rollup-plugin-typescript2": "^0.27.1",
109
- "ts-jest": "^26.1.4",
110
- "ts-loader": "^8.0.1",
111
- "ts-node": "^8.10.2",
112
- "typescript": "^3.9.7",
112
+ "rollup": "^2.26.11",
113
+ "rollup-plugin-typescript2": "^0.27.2",
114
+ "ts-jest": "^26.3.0",
115
+ "ts-loader": "^8.0.3",
116
+ "ts-node": "^9.0.0",
117
+ "typescript": "^4.0.2",
113
118
  "url-loader": "^4.1.0",
114
119
  "webpack": "^4.44.1",
115
120
  "webpack-cli": "^3.3.12",
@@ -1,5 +0,0 @@
1
- /**
2
- * Returns a parsed JSON from a given valid body string,
3
- * otherwise returns a given body string as-is.
4
- */
5
- export declare function getJsonBody(body: string): string | Record<string, any>;
@@ -1,2 +0,0 @@
1
- import { MockedRequest } from '../../handlers/requestHandler';
2
- export declare function parseRequestBody(body?: MockedRequest['body'], headers?: MockedRequest['headers']): string | Record<string, any> | undefined;
@@ -1,6 +0,0 @@
1
- import { Mask } from '../setupWorker/glossary';
2
- /**
3
- * Converts a given request handler mask into a URL, if given a valid URL string.
4
- * Otherwise, returns the mask as-is.
5
- */
6
- export declare function resolveMask(mask: Mask): URL | RegExp | string;
@@ -1,6 +0,0 @@
1
- import { Mask } from '../setupWorker/glossary';
2
- /**
3
- * Resolves a relative URL to the absolute URL with the same hostname.
4
- * Ignores regular expressions.
5
- */
6
- export declare const resolveRelativeUrl: <T extends Mask>(mask: T) => T;