msw 2.1.2 → 2.1.4

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 (99) hide show
  1. package/README.md +5 -5
  2. package/lib/browser/index.js +1757 -27
  3. package/lib/browser/index.js.map +1 -1
  4. package/lib/browser/index.mjs +1751 -23
  5. package/lib/browser/index.mjs.map +1 -1
  6. package/lib/core/{GraphQLHandler-2guuZL5R.d.ts → GraphQLHandler-eJejgV5u.d.ts} +1 -1
  7. package/lib/core/{GraphQLHandler-fe5IYUg3.d.mts → GraphQLHandler-rZ7XkeDz.d.mts} +1 -1
  8. package/lib/core/HttpResponse.d.mts +1 -1
  9. package/lib/core/HttpResponse.d.ts +1 -1
  10. package/lib/core/{RequestHandler-TRh8Eh4H.d.ts → RequestHandler-CwjkprZE.d.ts} +8 -6
  11. package/lib/core/{RequestHandler-nfjVJ8Tp.d.mts → RequestHandler-MAVTMsma.d.mts} +8 -6
  12. package/lib/core/SetupApi.d.mts +1 -1
  13. package/lib/core/SetupApi.d.ts +1 -1
  14. package/lib/core/getResponse.d.mts +13 -0
  15. package/lib/core/getResponse.d.ts +13 -0
  16. package/lib/core/getResponse.js +34 -0
  17. package/lib/core/getResponse.js.map +1 -0
  18. package/lib/core/getResponse.mjs +14 -0
  19. package/lib/core/getResponse.mjs.map +1 -0
  20. package/lib/core/graphql.d.mts +2 -2
  21. package/lib/core/graphql.d.ts +2 -2
  22. package/lib/core/handlers/GraphQLHandler.d.mts +2 -2
  23. package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
  24. package/lib/core/handlers/HttpHandler.d.mts +1 -1
  25. package/lib/core/handlers/HttpHandler.d.ts +1 -1
  26. package/lib/core/handlers/HttpHandler.js.map +1 -1
  27. package/lib/core/handlers/HttpHandler.mjs.map +1 -1
  28. package/lib/core/handlers/RequestHandler.d.mts +1 -1
  29. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  30. package/lib/core/handlers/RequestHandler.js.map +1 -1
  31. package/lib/core/handlers/RequestHandler.mjs.map +1 -1
  32. package/lib/core/http.d.mts +1 -1
  33. package/lib/core/http.d.ts +1 -1
  34. package/lib/core/index.d.mts +3 -2
  35. package/lib/core/index.d.ts +3 -2
  36. package/lib/core/index.js +2 -0
  37. package/lib/core/index.js.map +1 -1
  38. package/lib/core/index.mjs +2 -0
  39. package/lib/core/index.mjs.map +1 -1
  40. package/lib/core/sharedOptions.d.mts +0 -2
  41. package/lib/core/sharedOptions.d.ts +0 -2
  42. package/lib/core/utils/HttpResponse/decorators.d.mts +1 -1
  43. package/lib/core/utils/HttpResponse/decorators.d.ts +1 -1
  44. package/lib/core/utils/executeHandlers.d.mts +2 -0
  45. package/lib/core/utils/executeHandlers.d.ts +2 -0
  46. package/lib/core/utils/{getResponse.js → executeHandlers.js} +6 -6
  47. package/lib/core/utils/executeHandlers.js.map +1 -0
  48. package/lib/core/utils/{getResponse.mjs → executeHandlers.mjs} +3 -3
  49. package/lib/core/utils/executeHandlers.mjs.map +1 -0
  50. package/lib/core/utils/handleRequest.d.mts +2 -2
  51. package/lib/core/utils/handleRequest.d.ts +2 -2
  52. package/lib/core/utils/handleRequest.js +3 -3
  53. package/lib/core/utils/handleRequest.js.map +1 -1
  54. package/lib/core/utils/handleRequest.mjs +3 -3
  55. package/lib/core/utils/handleRequest.mjs.map +1 -1
  56. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +2 -2
  57. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
  58. package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
  59. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  60. package/lib/core/utils/internal/randomId.d.mts +3 -0
  61. package/lib/core/utils/internal/randomId.d.ts +3 -0
  62. package/lib/core/utils/internal/{uuidv4.js → randomId.js} +6 -6
  63. package/lib/core/utils/internal/randomId.js.map +1 -0
  64. package/lib/core/utils/internal/randomId.mjs +7 -0
  65. package/lib/core/utils/internal/randomId.mjs.map +1 -0
  66. package/lib/core/utils/internal/requestHandlerUtils.d.mts +1 -1
  67. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  68. package/lib/core/utils/request/onUnhandledRequest.d.mts +1 -4
  69. package/lib/core/utils/request/onUnhandledRequest.d.ts +1 -4
  70. package/lib/core/utils/request/onUnhandledRequest.js +9 -113
  71. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -1
  72. package/lib/core/utils/request/onUnhandledRequest.mjs +9 -105
  73. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -1
  74. package/lib/iife/index.js +29 -216
  75. package/lib/iife/index.js.map +1 -1
  76. package/lib/mockServiceWorker.js +1 -1
  77. package/package.json +1 -4
  78. package/src/core/getResponse.test.ts +63 -0
  79. package/src/core/getResponse.ts +23 -0
  80. package/src/core/handlers/GraphQLHandler.test.ts +4 -4
  81. package/src/core/handlers/HttpHandler.test.ts +5 -5
  82. package/src/core/handlers/HttpHandler.ts +1 -1
  83. package/src/core/handlers/RequestHandler.ts +1 -1
  84. package/src/core/index.ts +1 -0
  85. package/src/core/utils/{getResponse.ts → executeHandlers.ts} +7 -5
  86. package/src/core/utils/handleRequest.test.ts +14 -14
  87. package/src/core/utils/handleRequest.ts +5 -5
  88. package/src/core/utils/internal/{uuidv4.ts → randomId.ts} +1 -1
  89. package/src/core/utils/request/onUnhandledRequest.test.ts +5 -101
  90. package/src/core/utils/request/onUnhandledRequest.ts +3 -182
  91. package/lib/core/utils/getResponse.d.mts +0 -2
  92. package/lib/core/utils/getResponse.d.ts +0 -2
  93. package/lib/core/utils/getResponse.js.map +0 -1
  94. package/lib/core/utils/getResponse.mjs.map +0 -1
  95. package/lib/core/utils/internal/uuidv4.d.mts +0 -3
  96. package/lib/core/utils/internal/uuidv4.d.ts +0 -3
  97. package/lib/core/utils/internal/uuidv4.js.map +0 -1
  98. package/lib/core/utils/internal/uuidv4.mjs +0 -7
  99. package/lib/core/utils/internal/uuidv4.mjs.map +0 -1
@@ -1,20 +1,6 @@
1
- import jsLevenshtein from '@bundled-es-modules/js-levenshtein'
2
- import { RequestHandler, HttpHandler, GraphQLHandler } from '../..'
3
- import {
4
- ParsedGraphQLQuery,
5
- ParsedGraphQLRequest,
6
- parseGraphQLRequest,
7
- } from '../internal/parseGraphQLRequest'
8
1
  import { getPublicUrlFromRequest } from './getPublicUrlFromRequest'
9
- import { isStringEqual } from '../internal/isStringEqual'
10
2
  import { devUtils } from '../internal/devUtils'
11
3
 
12
- const getStringMatchScore = jsLevenshtein
13
-
14
- const MAX_MATCH_SCORE = 3
15
- const MAX_SUGGESTION_COUNT = 4
16
- const TYPE_MATCH_DELTA = 0.5
17
-
18
4
  export interface UnhandledRequestPrint {
19
5
  warning(): void
20
6
  error(): void
@@ -31,183 +17,18 @@ export type UnhandledRequestStrategy =
31
17
  | 'error'
32
18
  | UnhandledRequestCallback
33
19
 
34
- interface RequestHandlerGroups {
35
- http: Array<HttpHandler>
36
- graphql: Array<GraphQLHandler>
37
- }
38
-
39
- function groupHandlersByType(
40
- handlers: Array<RequestHandler>,
41
- ): RequestHandlerGroups {
42
- return handlers.reduce<RequestHandlerGroups>(
43
- (groups, handler) => {
44
- if (handler instanceof HttpHandler) {
45
- groups.http.push(handler)
46
- }
47
-
48
- if (handler instanceof GraphQLHandler) {
49
- groups.graphql.push(handler)
50
- }
51
-
52
- return groups
53
- },
54
- {
55
- http: [],
56
- graphql: [],
57
- },
58
- )
59
- }
60
-
61
- type RequestHandlerSuggestion = [number, RequestHandler]
62
-
63
- type ScoreGetterFn<RequestHandlerType extends RequestHandler> = (
64
- request: Request,
65
- handler: RequestHandlerType,
66
- ) => number
67
-
68
- function getHttpHandlerScore(): ScoreGetterFn<HttpHandler> {
69
- return (request, handler) => {
70
- const { path, method } = handler.info
71
-
72
- if (path instanceof RegExp || method instanceof RegExp) {
73
- return Infinity
74
- }
75
-
76
- const hasSameMethod = isStringEqual(request.method, method)
77
-
78
- // Always treat a handler with the same method as a more similar one.
79
- const methodScoreDelta = hasSameMethod ? TYPE_MATCH_DELTA : 0
80
- const requestPublicUrl = getPublicUrlFromRequest(request)
81
- const score = getStringMatchScore(requestPublicUrl, path)
82
-
83
- return score - methodScoreDelta
84
- }
85
- }
86
-
87
- function getGraphQLHandlerScore(
88
- parsedQuery: ParsedGraphQLQuery,
89
- ): ScoreGetterFn<GraphQLHandler> {
90
- return (_, handler) => {
91
- if (typeof parsedQuery.operationName === 'undefined') {
92
- return Infinity
93
- }
94
-
95
- const { operationType, operationName } = handler.info
96
-
97
- if (typeof operationName !== 'string') {
98
- return Infinity
99
- }
100
-
101
- const hasSameOperationType = parsedQuery.operationType === operationType
102
- // Always treat a handler with the same operation type as a more similar one.
103
- const operationTypeScoreDelta = hasSameOperationType ? TYPE_MATCH_DELTA : 0
104
- const score = getStringMatchScore(parsedQuery.operationName, operationName)
105
-
106
- return score - operationTypeScoreDelta
107
- }
108
- }
109
-
110
- function getSuggestedHandler(
111
- request: Request,
112
- handlers: Array<HttpHandler> | Array<GraphQLHandler>,
113
- getScore: ScoreGetterFn<HttpHandler> | ScoreGetterFn<GraphQLHandler>,
114
- ): Array<RequestHandler> {
115
- const suggestedHandlers = (handlers as Array<RequestHandler>)
116
- .reduce<Array<RequestHandlerSuggestion>>((suggestions, handler) => {
117
- const score = getScore(request, handler as any)
118
- return suggestions.concat([[score, handler]])
119
- }, [])
120
- .sort(([leftScore], [rightScore]) => leftScore - rightScore)
121
- .filter(([score]) => score <= MAX_MATCH_SCORE)
122
- .slice(0, MAX_SUGGESTION_COUNT)
123
- .map(([, handler]) => handler)
124
-
125
- return suggestedHandlers
126
- }
127
-
128
- function getSuggestedHandlersMessage(handlers: RequestHandler[]) {
129
- if (handlers.length > 1) {
130
- return `\
131
- Did you mean to request one of the following resources instead?
132
-
133
- ${handlers.map((handler) => ` • ${handler.info.header}`).join('\n')}`
134
- }
135
-
136
- return `Did you mean to request "${handlers[0].info.header}" instead?`
137
- }
138
-
139
20
  export async function onUnhandledRequest(
140
21
  request: Request,
141
- handlers: Array<RequestHandler>,
142
22
  strategy: UnhandledRequestStrategy = 'warn',
143
23
  ): Promise<void> {
144
- const parsedGraphQLQuery = await parseGraphQLRequest(request).catch(
145
- () => null,
146
- )
147
24
  const publicUrl = getPublicUrlFromRequest(request)
148
-
149
- function generateHandlerSuggestion(): string {
150
- /**
151
- * @note Ignore exceptions during GraphQL request parsing because at this point
152
- * we cannot assume the unhandled request is a valid GraphQL request.
153
- * If the GraphQL parsing fails, just don't treat it as a GraphQL request.
154
- */
155
- const handlerGroups = groupHandlersByType(handlers)
156
- const relevantHandlers = parsedGraphQLQuery
157
- ? handlerGroups.graphql
158
- : handlerGroups.http
159
-
160
- const suggestedHandlers = getSuggestedHandler(
161
- request,
162
- relevantHandlers,
163
- parsedGraphQLQuery
164
- ? getGraphQLHandlerScore(parsedGraphQLQuery)
165
- : getHttpHandlerScore(),
166
- )
167
-
168
- return suggestedHandlers.length > 0
169
- ? getSuggestedHandlersMessage(suggestedHandlers)
170
- : ''
171
- }
172
-
173
- function getGraphQLRequestHeader(
174
- parsedGraphQLRequest: ParsedGraphQLRequest<any>,
175
- ): string {
176
- if (!parsedGraphQLRequest?.operationName) {
177
- return `anonymous ${parsedGraphQLRequest?.operationType} (${request.method} ${publicUrl})`
178
- }
179
-
180
- return `${parsedGraphQLRequest.operationType} ${parsedGraphQLRequest.operationName} (${request.method} ${publicUrl})`
181
- }
182
-
183
- function generateUnhandledRequestMessage(): string {
184
- const requestHeader = parsedGraphQLQuery
185
- ? getGraphQLRequestHeader(parsedGraphQLQuery)
186
- : `${request.method} ${publicUrl}`
187
- const handlerSuggestion = generateHandlerSuggestion()
188
-
189
- const messageTemplate = [
190
- `intercepted a request without a matching request handler:`,
191
- ` \u2022 ${requestHeader}`,
192
- handlerSuggestion,
193
- `\
194
- If you still wish to intercept this unhandled request, please create a request handler for it.
195
- Read more: https://mswjs.io/docs/getting-started/mocks\
196
- `,
197
- ].filter(Boolean)
198
- return messageTemplate.join('\n\n')
199
- }
25
+ const unhandledRequestMessage = `intercepted a request without a matching request handler:\n\n \u2022 ${request.method} ${publicUrl}\n\nIf you still wish to intercept this unhandled request, please create a request handler for it.\nRead more: https://mswjs.io/docs/getting-started/mocks`
200
26
 
201
27
  function applyStrategy(strategy: UnhandledRequestStrategy) {
202
- // Generate handler suggestions only when applying the strategy.
203
- // This saves bandwidth for scenarios when developers opt-out
204
- // from the default unhandled request handling strategy.
205
- const message = generateUnhandledRequestMessage()
206
-
207
28
  switch (strategy) {
208
29
  case 'error': {
209
30
  // Print a developer-friendly error.
210
- devUtils.error('Error: %s', message)
31
+ devUtils.error('Error: %s', unhandledRequestMessage)
211
32
 
212
33
  // Throw an exception to halt request processing and not perform the original request.
213
34
  throw new Error(
@@ -218,7 +39,7 @@ Read more: https://mswjs.io/docs/getting-started/mocks\
218
39
  }
219
40
 
220
41
  case 'warn': {
221
- devUtils.warn('Warning: %s', message)
42
+ devUtils.warn('Warning: %s', unhandledRequestMessage)
222
43
  break
223
44
  }
224
45
 
@@ -1,2 +0,0 @@
1
- export { h as ResponseLookupResult, i as ResponseResolutionContext, j as getResponse } from '../RequestHandler-nfjVJ8Tp.mjs';
2
- import '../typeUtils.mjs';
@@ -1,2 +0,0 @@
1
- export { h as ResponseLookupResult, i as ResponseResolutionContext, j as getResponse } from '../RequestHandler-TRh8Eh4H.js';
2
- import '../typeUtils.js';
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/utils/getResponse.ts"],"sourcesContent":["import {\n RequestHandler,\n RequestHandlerExecutionResult,\n} from '../handlers/RequestHandler'\n\nexport interface ResponseLookupResult {\n handler: RequestHandler\n parsedResult?: any\n response?: Response\n}\n\nexport interface ResponseResolutionContext {\n baseUrl?: string\n}\n\n/**\n * Returns a mocked response for a given request using following request handlers.\n */\nexport const getResponse = async <Handler extends Array<RequestHandler>>({\n request,\n requestId,\n handlers,\n resolutionContext,\n}: {\n request: Request\n requestId: string\n handlers: Handler\n resolutionContext?: ResponseResolutionContext\n}): Promise<ResponseLookupResult | null> => {\n let matchingHandler: RequestHandler | null = null\n let result: RequestHandlerExecutionResult<any> | null = null\n\n for (const handler of handlers) {\n result = await handler.run({ request, requestId, resolutionContext })\n\n // If the handler produces some result for this request,\n // it automatically becomes matching.\n if (result !== null) {\n matchingHandler = handler\n }\n\n // Stop the lookup if this handler returns a mocked response.\n // If it doesn't, it will still be considered the last matching\n // handler until any of them returns a response. This way we can\n // distinguish between fallthrough handlers without responses\n // and the lack of a matching handler.\n if (result?.response) {\n break\n }\n }\n\n if (matchingHandler) {\n return {\n handler: matchingHandler,\n parsedResult: result?.parsedResult,\n response: result?.response,\n }\n }\n\n return null\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBO,MAAM,cAAc,OAA8C;AAAA,EACvE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAK4C;AAC1C,MAAI,kBAAyC;AAC7C,MAAI,SAAoD;AAExD,aAAW,WAAW,UAAU;AAC9B,aAAS,MAAM,QAAQ,IAAI,EAAE,SAAS,WAAW,kBAAkB,CAAC;AAIpE,QAAI,WAAW,MAAM;AACnB,wBAAkB;AAAA,IACpB;AAOA,QAAI,QAAQ,UAAU;AACpB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,iBAAiB;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc,QAAQ;AAAA,MACtB,UAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/utils/getResponse.ts"],"sourcesContent":["import {\n RequestHandler,\n RequestHandlerExecutionResult,\n} from '../handlers/RequestHandler'\n\nexport interface ResponseLookupResult {\n handler: RequestHandler\n parsedResult?: any\n response?: Response\n}\n\nexport interface ResponseResolutionContext {\n baseUrl?: string\n}\n\n/**\n * Returns a mocked response for a given request using following request handlers.\n */\nexport const getResponse = async <Handler extends Array<RequestHandler>>({\n request,\n requestId,\n handlers,\n resolutionContext,\n}: {\n request: Request\n requestId: string\n handlers: Handler\n resolutionContext?: ResponseResolutionContext\n}): Promise<ResponseLookupResult | null> => {\n let matchingHandler: RequestHandler | null = null\n let result: RequestHandlerExecutionResult<any> | null = null\n\n for (const handler of handlers) {\n result = await handler.run({ request, requestId, resolutionContext })\n\n // If the handler produces some result for this request,\n // it automatically becomes matching.\n if (result !== null) {\n matchingHandler = handler\n }\n\n // Stop the lookup if this handler returns a mocked response.\n // If it doesn't, it will still be considered the last matching\n // handler until any of them returns a response. This way we can\n // distinguish between fallthrough handlers without responses\n // and the lack of a matching handler.\n if (result?.response) {\n break\n }\n }\n\n if (matchingHandler) {\n return {\n handler: matchingHandler,\n parsedResult: result?.parsedResult,\n response: result?.response,\n }\n }\n\n return null\n}\n"],"mappings":"AAkBO,MAAM,cAAc,OAA8C;AAAA,EACvE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAK4C;AAC1C,MAAI,kBAAyC;AAC7C,MAAI,SAAoD;AAExD,aAAW,WAAW,UAAU;AAC9B,aAAS,MAAM,QAAQ,IAAI,EAAE,SAAS,WAAW,kBAAkB,CAAC;AAIpE,QAAI,WAAW,MAAM;AACnB,wBAAkB;AAAA,IACpB;AAOA,QAAI,QAAQ,UAAU;AACpB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,iBAAiB;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc,QAAQ;AAAA,MACtB,UAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -1,3 +0,0 @@
1
- declare function uuidv4(): string;
2
-
3
- export { uuidv4 };
@@ -1,3 +0,0 @@
1
- declare function uuidv4(): string;
2
-
3
- export { uuidv4 };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/core/utils/internal/uuidv4.ts"],"sourcesContent":["export function uuidv4(): string {\n return Math.random().toString(16).slice(2)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,SAAS,SAAiB;AAC/B,SAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAC3C;","names":[]}
@@ -1,7 +0,0 @@
1
- function uuidv4() {
2
- return Math.random().toString(16).slice(2);
3
- }
4
- export {
5
- uuidv4
6
- };
7
- //# sourceMappingURL=uuidv4.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/core/utils/internal/uuidv4.ts"],"sourcesContent":["export function uuidv4(): string {\n return Math.random().toString(16).slice(2)\n}\n"],"mappings":"AAAO,SAAS,SAAiB;AAC/B,SAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAC3C;","names":[]}