msw 0.0.0-fetch.rc-15 → 0.0.0-fetch.rc-17

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 (38) hide show
  1. package/README.md +13 -8
  2. package/lib/browser/index.d.ts +0 -6
  3. package/lib/browser/index.js +14 -32
  4. package/lib/browser/index.mjs +14 -32
  5. package/lib/core/NetworkError.d.ts +2 -2
  6. package/lib/core/SetupApi.d.ts +0 -1
  7. package/lib/core/handlers/GraphQLHandler.js +1 -1
  8. package/lib/core/handlers/GraphQLHandler.mjs +1 -1
  9. package/lib/core/handlers/{RestHandler.d.ts → HttpHandler.d.ts} +12 -12
  10. package/lib/core/handlers/{RestHandler.js → HttpHandler.js} +16 -16
  11. package/lib/core/handlers/{RestHandler.mjs → HttpHandler.mjs} +13 -13
  12. package/lib/core/{rest.d.ts → http.d.ts} +11 -11
  13. package/lib/core/{rest.js → http.js} +16 -16
  14. package/lib/core/http.mjs +22 -0
  15. package/lib/core/{rest.spec.js → http.spec.js} +3 -3
  16. package/lib/core/{rest.spec.mjs → http.spec.mjs} +3 -3
  17. package/lib/core/index.d.ts +2 -2
  18. package/lib/core/index.js +6 -6
  19. package/lib/core/index.mjs +6 -6
  20. package/lib/core/passthrough.d.ts +5 -2
  21. package/lib/core/sharedOptions.d.ts +45 -7
  22. package/lib/core/utils/handleRequest.js +13 -9
  23. package/lib/core/utils/handleRequest.mjs +13 -9
  24. package/lib/core/utils/internal/parseGraphQLRequest.js +4 -3
  25. package/lib/core/utils/internal/parseGraphQLRequest.mjs +4 -3
  26. package/lib/core/utils/request/onUnhandledRequest.js +14 -8
  27. package/lib/core/utils/request/onUnhandledRequest.mjs +15 -9
  28. package/lib/iife/index.js +97 -104
  29. package/lib/mockServiceWorker.js +1 -1
  30. package/lib/native/index.d.ts +0 -6
  31. package/lib/native/index.js +5 -13
  32. package/lib/native/index.mjs +5 -13
  33. package/lib/node/index.d.ts +0 -6
  34. package/lib/node/index.js +5 -13
  35. package/lib/node/index.mjs +5 -13
  36. package/package.json +2 -1
  37. package/lib/core/rest.mjs +0 -22
  38. /package/lib/core/{rest.spec.d.ts → http.spec.d.ts} +0 -0
@@ -1,8 +1,8 @@
1
1
  import { checkGlobals } from './utils/internal/checkGlobals.mjs';
2
2
  import { SetupApi } from './SetupApi.mjs';
3
3
  import { RequestHandler } from './handlers/RequestHandler.mjs';
4
- import { rest } from './rest.mjs';
5
- import { RestHandler, RESTMethods } from './handlers/RestHandler.mjs';
4
+ import { http } from './http.mjs';
5
+ import { HttpHandler, HttpMethods } from './handlers/HttpHandler.mjs';
6
6
  import { graphql } from './graphql.mjs';
7
7
  import { GraphQLHandler } from './handlers/GraphQLHandler.mjs';
8
8
  import { matchRequestUrl } from './utils/matching/matchRequestUrl.mjs';
@@ -16,15 +16,15 @@ import { NetworkError } from './NetworkError.mjs';
16
16
  checkGlobals();
17
17
  export {
18
18
  GraphQLHandler,
19
+ HttpHandler,
20
+ HttpMethods,
19
21
  NetworkError,
20
- RESTMethods,
21
22
  RequestHandler,
22
- RestHandler,
23
23
  SetupApi,
24
24
  bypass,
25
25
  cleanUrl,
26
26
  graphql,
27
+ http,
27
28
  matchRequestUrl,
28
- passthrough,
29
- rest
29
+ passthrough
30
30
  };
@@ -1,9 +1,12 @@
1
1
  /**
2
- * Instruct Mock Service Worker to perform this request as-is.
2
+ * Performs the captured request as-is.
3
+ *
4
+ * This stops request handler lookup so no other handlers
5
+ * can affect this request past this point.
3
6
  * Unlike `bypass()`, this will not trigger an additional request.
4
7
  *
5
8
  * @example
6
- * rest.get('/user', () => {
9
+ * http.get('/resource', () => {
7
10
  * return passthrough()
8
11
  * })
9
12
  */
@@ -15,13 +15,51 @@ interface SharedOptions {
15
15
  onUnhandledRequest?: UnhandledRequestStrategy;
16
16
  }
17
17
  type LifeCycleEventsMap = {
18
- 'request:start': [request: Request, requestId: string];
19
- 'request:match': [request: Request, requestId: string];
20
- 'request:unhandled': [request: Request, requestId: string];
21
- 'request:end': [request: Request, requestId: string];
22
- 'response:mocked': [response: Response, request: Request, requestId: string];
23
- 'response:bypass': [response: Response, request: Request, requestId: string];
24
- unhandledException: [error: Error, request: Request, requestId: string];
18
+ 'request:start': [
19
+ args: {
20
+ request: Request;
21
+ requestId: string;
22
+ }
23
+ ];
24
+ 'request:match': [
25
+ args: {
26
+ request: Request;
27
+ requestId: string;
28
+ }
29
+ ];
30
+ 'request:unhandled': [
31
+ args: {
32
+ request: Request;
33
+ requestId: string;
34
+ }
35
+ ];
36
+ 'request:end': [
37
+ args: {
38
+ request: Request;
39
+ requestId: string;
40
+ }
41
+ ];
42
+ 'response:mocked': [
43
+ args: {
44
+ response: Response;
45
+ request: Request;
46
+ requestId: string;
47
+ }
48
+ ];
49
+ 'response:bypass': [
50
+ args: {
51
+ response: Response;
52
+ request: Request;
53
+ requestId: string;
54
+ }
55
+ ];
56
+ unhandledException: [
57
+ args: {
58
+ error: Error;
59
+ request: Request;
60
+ requestId: string;
61
+ }
62
+ ];
25
63
  };
26
64
  type LifeCycleEventEmitter<EventsMap extends Record<string | symbol, any>> = Pick<Emitter<EventsMap>, 'on' | 'removeListener' | 'removeAllListeners'>;
27
65
 
@@ -48,9 +48,9 @@ var import_readResponseCookies = require("./request/readResponseCookies.js");
48
48
  function handleRequest(request, requestId, handlers, options, emitter, handleRequestOptions) {
49
49
  return __async(this, null, function* () {
50
50
  var _a, _b, _c, _d, _e, _f;
51
- emitter.emit("request:start", request, requestId);
51
+ emitter.emit("request:start", { request, requestId });
52
52
  if (request.headers.get("x-msw-intention") === "bypass") {
53
- emitter.emit("request:end", request, requestId);
53
+ emitter.emit("request:end", { request, requestId });
54
54
  (_a = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _a.call(handleRequestOptions, request);
55
55
  return;
56
56
  }
@@ -62,29 +62,33 @@ function handleRequest(request, requestId, handlers, options, emitter, handleReq
62
62
  );
63
63
  });
64
64
  if (lookupResult.error) {
65
- emitter.emit("unhandledException", lookupResult.error, request, requestId);
65
+ emitter.emit("unhandledException", {
66
+ error: lookupResult.error,
67
+ request,
68
+ requestId
69
+ });
66
70
  throw lookupResult.error;
67
71
  }
68
72
  if (!lookupResult.data) {
69
73
  yield (0, import_onUnhandledRequest.onUnhandledRequest)(request, handlers, options.onUnhandledRequest);
70
- emitter.emit("request:unhandled", request, requestId);
71
- emitter.emit("request:end", request, requestId);
74
+ emitter.emit("request:unhandled", { request, requestId });
75
+ emitter.emit("request:end", { request, requestId });
72
76
  (_b = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _b.call(handleRequestOptions, request);
73
77
  return;
74
78
  }
75
79
  const { response } = lookupResult.data;
76
80
  if (!response) {
77
- emitter.emit("request:end", request, requestId);
81
+ emitter.emit("request:end", { request, requestId });
78
82
  (_c = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _c.call(handleRequestOptions, request);
79
83
  return;
80
84
  }
81
85
  if (response.status === 302 && response.headers.get("x-msw-intention") === "passthrough") {
82
- emitter.emit("request:end", request, requestId);
86
+ emitter.emit("request:end", { request, requestId });
83
87
  (_d = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _d.call(handleRequestOptions, request);
84
88
  return;
85
89
  }
86
90
  (0, import_readResponseCookies.readResponseCookies)(request, response);
87
- emitter.emit("request:match", request, requestId);
91
+ emitter.emit("request:match", { request, requestId });
88
92
  const requiredLookupResult = lookupResult.data;
89
93
  const transformedResponse = ((_e = handleRequestOptions == null ? void 0 : handleRequestOptions.transformResponse) == null ? void 0 : _e.call(handleRequestOptions, response)) || response;
90
94
  (_f = handleRequestOptions == null ? void 0 : handleRequestOptions.onMockedResponse) == null ? void 0 : _f.call(
@@ -92,7 +96,7 @@ function handleRequest(request, requestId, handlers, options, emitter, handleReq
92
96
  transformedResponse,
93
97
  requiredLookupResult
94
98
  );
95
- emitter.emit("request:end", request, requestId);
99
+ emitter.emit("request:end", { request, requestId });
96
100
  return transformedResponse;
97
101
  });
98
102
  }
@@ -25,9 +25,9 @@ import { readResponseCookies } from './request/readResponseCookies.mjs';
25
25
  function handleRequest(request, requestId, handlers, options, emitter, handleRequestOptions) {
26
26
  return __async(this, null, function* () {
27
27
  var _a, _b, _c, _d, _e, _f;
28
- emitter.emit("request:start", request, requestId);
28
+ emitter.emit("request:start", { request, requestId });
29
29
  if (request.headers.get("x-msw-intention") === "bypass") {
30
- emitter.emit("request:end", request, requestId);
30
+ emitter.emit("request:end", { request, requestId });
31
31
  (_a = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _a.call(handleRequestOptions, request);
32
32
  return;
33
33
  }
@@ -39,29 +39,33 @@ function handleRequest(request, requestId, handlers, options, emitter, handleReq
39
39
  );
40
40
  });
41
41
  if (lookupResult.error) {
42
- emitter.emit("unhandledException", lookupResult.error, request, requestId);
42
+ emitter.emit("unhandledException", {
43
+ error: lookupResult.error,
44
+ request,
45
+ requestId
46
+ });
43
47
  throw lookupResult.error;
44
48
  }
45
49
  if (!lookupResult.data) {
46
50
  yield onUnhandledRequest(request, handlers, options.onUnhandledRequest);
47
- emitter.emit("request:unhandled", request, requestId);
48
- emitter.emit("request:end", request, requestId);
51
+ emitter.emit("request:unhandled", { request, requestId });
52
+ emitter.emit("request:end", { request, requestId });
49
53
  (_b = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _b.call(handleRequestOptions, request);
50
54
  return;
51
55
  }
52
56
  const { response } = lookupResult.data;
53
57
  if (!response) {
54
- emitter.emit("request:end", request, requestId);
58
+ emitter.emit("request:end", { request, requestId });
55
59
  (_c = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _c.call(handleRequestOptions, request);
56
60
  return;
57
61
  }
58
62
  if (response.status === 302 && response.headers.get("x-msw-intention") === "passthrough") {
59
- emitter.emit("request:end", request, requestId);
63
+ emitter.emit("request:end", { request, requestId });
60
64
  (_d = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _d.call(handleRequestOptions, request);
61
65
  return;
62
66
  }
63
67
  readResponseCookies(request, response);
64
- emitter.emit("request:match", request, requestId);
68
+ emitter.emit("request:match", { request, requestId });
65
69
  const requiredLookupResult = lookupResult.data;
66
70
  const transformedResponse = ((_e = handleRequestOptions == null ? void 0 : handleRequestOptions.transformResponse) == null ? void 0 : _e.call(handleRequestOptions, response)) || response;
67
71
  (_f = handleRequestOptions == null ? void 0 : handleRequestOptions.onMockedResponse) == null ? void 0 : _f.call(
@@ -69,7 +73,7 @@ function handleRequest(request, requestId, handlers, options, emitter, handleReq
69
73
  transformedResponse,
70
74
  requiredLookupResult
71
75
  );
72
- emitter.emit("request:end", request, requestId);
76
+ emitter.emit("request:end", { request, requestId });
73
77
  return transformedResponse;
74
78
  });
75
79
  }
@@ -103,9 +103,9 @@ function extractMultipartVariables(variables, map, files) {
103
103
  function getGraphQLInput(request) {
104
104
  return __async(this, null, function* () {
105
105
  var _a;
106
- const url = new URL(request.url);
107
106
  switch (request.method) {
108
107
  case "GET": {
108
+ const url = new URL(request.url);
109
109
  const query = url.searchParams.get("query");
110
110
  const variables = url.searchParams.get("variables") || "";
111
111
  return {
@@ -114,9 +114,10 @@ function getGraphQLInput(request) {
114
114
  };
115
115
  }
116
116
  case "POST": {
117
+ const requestClone = request.clone();
117
118
  if ((_a = request.headers.get("content-type")) == null ? void 0 : _a.includes("multipart/form-data")) {
118
119
  const responseJson = (0, import_parseMultipartData.parseMultipartData)(
119
- yield request.text(),
120
+ yield requestClone.text(),
120
121
  request.headers
121
122
  );
122
123
  if (!responseJson) {
@@ -140,7 +141,7 @@ function getGraphQLInput(request) {
140
141
  variables
141
142
  };
142
143
  }
143
- const requestJson = yield request.json().catch(() => null);
144
+ const requestJson = yield requestClone.json().catch(() => null);
144
145
  if (requestJson == null ? void 0 : requestJson.query) {
145
146
  const { query, variables } = requestJson;
146
147
  return {
@@ -80,9 +80,9 @@ function extractMultipartVariables(variables, map, files) {
80
80
  function getGraphQLInput(request) {
81
81
  return __async(this, null, function* () {
82
82
  var _a;
83
- const url = new URL(request.url);
84
83
  switch (request.method) {
85
84
  case "GET": {
85
+ const url = new URL(request.url);
86
86
  const query = url.searchParams.get("query");
87
87
  const variables = url.searchParams.get("variables") || "";
88
88
  return {
@@ -91,9 +91,10 @@ function getGraphQLInput(request) {
91
91
  };
92
92
  }
93
93
  case "POST": {
94
+ const requestClone = request.clone();
94
95
  if ((_a = request.headers.get("content-type")) == null ? void 0 : _a.includes("multipart/form-data")) {
95
96
  const responseJson = parseMultipartData(
96
- yield request.text(),
97
+ yield requestClone.text(),
97
98
  request.headers
98
99
  );
99
100
  if (!responseJson) {
@@ -117,7 +118,7 @@ function getGraphQLInput(request) {
117
118
  variables
118
119
  };
119
120
  }
120
- const requestJson = yield request.json().catch(() => null);
121
+ const requestJson = yield requestClone.json().catch(() => null);
121
122
  if (requestJson == null ? void 0 : requestJson.query) {
122
123
  const { query, variables } = requestJson;
123
124
  return {
@@ -64,8 +64,8 @@ const TYPE_MATCH_DELTA = 0.5;
64
64
  function groupHandlersByType(handlers) {
65
65
  return handlers.reduce(
66
66
  (groups, handler) => {
67
- if (handler instanceof import__.RestHandler) {
68
- groups.rest.push(handler);
67
+ if (handler instanceof import__.HttpHandler) {
68
+ groups.http.push(handler);
69
69
  }
70
70
  if (handler instanceof import__.GraphQLHandler) {
71
71
  groups.graphql.push(handler);
@@ -73,12 +73,12 @@ function groupHandlersByType(handlers) {
73
73
  return groups;
74
74
  },
75
75
  {
76
- rest: [],
76
+ http: [],
77
77
  graphql: []
78
78
  }
79
79
  );
80
80
  }
81
- function getRestHandlerScore() {
81
+ function getHttpHandlerScore() {
82
82
  return (request, handler) => {
83
83
  const { path, method } = handler.info;
84
84
  if (path instanceof RegExp || method instanceof RegExp) {
@@ -126,19 +126,25 @@ function onUnhandledRequest(request, handlers, strategy = "warn") {
126
126
  const parsedGraphQLQuery = yield (0, import_parseGraphQLRequest.parseGraphQLRequest)(request).catch(
127
127
  () => null
128
128
  );
129
+ const publicUrl = (0, import_getPublicUrlFromRequest.getPublicUrlFromRequest)(request);
129
130
  function generateHandlerSuggestion() {
130
131
  const handlerGroups = groupHandlersByType(handlers);
131
- const relevantHandlers = parsedGraphQLQuery ? handlerGroups.graphql : handlerGroups.rest;
132
+ const relevantHandlers = parsedGraphQLQuery ? handlerGroups.graphql : handlerGroups.http;
132
133
  const suggestedHandlers = getSuggestedHandler(
133
134
  request,
134
135
  relevantHandlers,
135
- parsedGraphQLQuery ? getGraphQLHandlerScore(parsedGraphQLQuery) : getRestHandlerScore()
136
+ parsedGraphQLQuery ? getGraphQLHandlerScore(parsedGraphQLQuery) : getHttpHandlerScore()
136
137
  );
137
138
  return suggestedHandlers.length > 0 ? getSuggestedHandlersMessage(suggestedHandlers) : "";
138
139
  }
140
+ function getGraphQLRequestHeader(parsedGraphQLRequest) {
141
+ if (!(parsedGraphQLRequest == null ? void 0 : parsedGraphQLRequest.operationName)) {
142
+ return `anonymous ${parsedGraphQLRequest == null ? void 0 : parsedGraphQLRequest.operationType} (${request.method} ${publicUrl})`;
143
+ }
144
+ return `${parsedGraphQLRequest.operationType} ${parsedGraphQLRequest.operationName} (${request.method} ${publicUrl})`;
145
+ }
139
146
  function generateUnhandledRequestMessage() {
140
- const publicUrl = (0, import_getPublicUrlFromRequest.getPublicUrlFromRequest)(request);
141
- const requestHeader = parsedGraphQLQuery ? `${parsedGraphQLQuery.operationType} ${parsedGraphQLQuery.operationName} (${request.method} ${publicUrl})` : `${request.method} ${publicUrl}`;
147
+ const requestHeader = parsedGraphQLQuery ? getGraphQLRequestHeader(parsedGraphQLQuery) : `${request.method} ${publicUrl}`;
142
148
  const handlerSuggestion = generateHandlerSuggestion();
143
149
  const messageTemplate = [
144
150
  `captured a request without a matching request handler:`,
@@ -19,7 +19,7 @@ var __async = (__this, __arguments, generator) => {
19
19
  });
20
20
  };
21
21
  import jsLevenshtein from "@bundled-es-modules/js-levenshtein";
22
- import { RestHandler, GraphQLHandler } from '../../index.mjs';
22
+ import { HttpHandler, GraphQLHandler } from '../../index.mjs';
23
23
  import {
24
24
  parseGraphQLRequest
25
25
  } from '../internal/parseGraphQLRequest.mjs';
@@ -33,8 +33,8 @@ const TYPE_MATCH_DELTA = 0.5;
33
33
  function groupHandlersByType(handlers) {
34
34
  return handlers.reduce(
35
35
  (groups, handler) => {
36
- if (handler instanceof RestHandler) {
37
- groups.rest.push(handler);
36
+ if (handler instanceof HttpHandler) {
37
+ groups.http.push(handler);
38
38
  }
39
39
  if (handler instanceof GraphQLHandler) {
40
40
  groups.graphql.push(handler);
@@ -42,12 +42,12 @@ function groupHandlersByType(handlers) {
42
42
  return groups;
43
43
  },
44
44
  {
45
- rest: [],
45
+ http: [],
46
46
  graphql: []
47
47
  }
48
48
  );
49
49
  }
50
- function getRestHandlerScore() {
50
+ function getHttpHandlerScore() {
51
51
  return (request, handler) => {
52
52
  const { path, method } = handler.info;
53
53
  if (path instanceof RegExp || method instanceof RegExp) {
@@ -95,19 +95,25 @@ function onUnhandledRequest(request, handlers, strategy = "warn") {
95
95
  const parsedGraphQLQuery = yield parseGraphQLRequest(request).catch(
96
96
  () => null
97
97
  );
98
+ const publicUrl = getPublicUrlFromRequest(request);
98
99
  function generateHandlerSuggestion() {
99
100
  const handlerGroups = groupHandlersByType(handlers);
100
- const relevantHandlers = parsedGraphQLQuery ? handlerGroups.graphql : handlerGroups.rest;
101
+ const relevantHandlers = parsedGraphQLQuery ? handlerGroups.graphql : handlerGroups.http;
101
102
  const suggestedHandlers = getSuggestedHandler(
102
103
  request,
103
104
  relevantHandlers,
104
- parsedGraphQLQuery ? getGraphQLHandlerScore(parsedGraphQLQuery) : getRestHandlerScore()
105
+ parsedGraphQLQuery ? getGraphQLHandlerScore(parsedGraphQLQuery) : getHttpHandlerScore()
105
106
  );
106
107
  return suggestedHandlers.length > 0 ? getSuggestedHandlersMessage(suggestedHandlers) : "";
107
108
  }
109
+ function getGraphQLRequestHeader(parsedGraphQLRequest) {
110
+ if (!(parsedGraphQLRequest == null ? void 0 : parsedGraphQLRequest.operationName)) {
111
+ return `anonymous ${parsedGraphQLRequest == null ? void 0 : parsedGraphQLRequest.operationType} (${request.method} ${publicUrl})`;
112
+ }
113
+ return `${parsedGraphQLRequest.operationType} ${parsedGraphQLRequest.operationName} (${request.method} ${publicUrl})`;
114
+ }
108
115
  function generateUnhandledRequestMessage() {
109
- const publicUrl = getPublicUrlFromRequest(request);
110
- const requestHeader = parsedGraphQLQuery ? `${parsedGraphQLQuery.operationType} ${parsedGraphQLQuery.operationName} (${request.method} ${publicUrl})` : `${request.method} ${publicUrl}`;
116
+ const requestHeader = parsedGraphQLQuery ? getGraphQLRequestHeader(parsedGraphQLQuery) : `${request.method} ${publicUrl}`;
111
117
  const handlerSuggestion = generateHandlerSuggestion();
112
118
  const messageTemplate = [
113
119
  `captured a request without a matching request handler:`,