msw 0.36.0 → 0.36.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.
- package/README.md +42 -5
- package/lib/esm/RequestHandler-deps.js +33 -9
- package/lib/esm/index.js +14 -25
- package/lib/esm/mockServiceWorker.js +1 -1
- package/lib/esm/rest-deps.js +0 -1
- package/lib/iife/index.js +3 -3
- package/lib/iife/mockServiceWorker.js +1 -1
- package/lib/types/handlers/GraphQLHandler.d.ts +2 -2
- package/lib/types/handlers/RequestHandler.d.ts +7 -7
- package/lib/types/handlers/RestHandler.d.ts +2 -2
- package/lib/types/native/index.d.ts +1 -1
- package/lib/types/node/setupServer.d.ts +1 -1
- package/lib/types/utils/getResponse.d.ts +1 -1
- package/lib/types/utils/handleRequest.d.ts +1 -1
- package/lib/types/utils/internal/requestHandlerUtils.d.ts +1 -1
- package/lib/types/utils/matching/matchRequestUrl.d.ts +1 -1
- package/lib/types/utils/request/onUnhandledRequest.d.ts +1 -2
- package/lib/types/utils/url/isAbsoluteUrl.d.ts +4 -0
- package/lib/umd/index.js +49 -37
- package/lib/umd/mockServiceWorker.js +1 -1
- package/native/lib/index.js +50 -39
- package/node/lib/index.js +50 -39
- package/package.json +1 -1
|
@@ -7,7 +7,7 @@ import { fetch } from '../context/fetch';
|
|
|
7
7
|
import { errors } from '../context/errors';
|
|
8
8
|
import { GraphQLPayloadContext } from '../typeUtils';
|
|
9
9
|
import { cookie } from '../context/cookie';
|
|
10
|
-
import { MockedRequest, RequestHandler, ResponseResolver } from './RequestHandler';
|
|
10
|
+
import { MockedRequest, RequestHandler, RequestHandlerDefaultInfo, ResponseResolver } from './RequestHandler';
|
|
11
11
|
import { Path } from '../utils/matching/matchRequestUrl';
|
|
12
12
|
import { ParsedGraphQLRequest, GraphQLMultipartRequestBody } from '../utils/internal/parseGraphQLRequest';
|
|
13
13
|
export declare type ExpectedOperationTypeNode = OperationTypeNode | 'all';
|
|
@@ -24,7 +24,7 @@ export declare type GraphQLContext<QueryType extends Record<string, unknown>> =
|
|
|
24
24
|
};
|
|
25
25
|
export declare const graphqlContext: GraphQLContext<any>;
|
|
26
26
|
export declare type GraphQLVariables = Record<string, any>;
|
|
27
|
-
export interface GraphQLHandlerInfo {
|
|
27
|
+
export interface GraphQLHandlerInfo extends RequestHandlerDefaultInfo {
|
|
28
28
|
operationType: ExpectedOperationTypeNode;
|
|
29
29
|
operationName: GraphQLHandlerNameSelector;
|
|
30
30
|
}
|
|
@@ -29,19 +29,19 @@ export interface MockedRequest<Body = DefaultRequestBody> {
|
|
|
29
29
|
body: Body;
|
|
30
30
|
bodyUsed: Request['bodyUsed'];
|
|
31
31
|
}
|
|
32
|
-
interface RequestHandlerDefaultInfo {
|
|
32
|
+
export interface RequestHandlerDefaultInfo {
|
|
33
|
+
header: string;
|
|
34
|
+
}
|
|
35
|
+
export interface RequestHandlerInternalInfo {
|
|
33
36
|
callFrame?: string;
|
|
34
37
|
}
|
|
35
|
-
declare type RequestHandlerInfo<ExtraInfo extends Record<string, any>> = {
|
|
36
|
-
header: string;
|
|
37
|
-
} & ExtraInfo;
|
|
38
38
|
declare type ContextMap = Record<string, (...args: any[]) => any>;
|
|
39
39
|
export declare type ResponseResolverReturnType<ReturnType> = ReturnType | undefined | void;
|
|
40
40
|
export declare type MaybeAsyncResponseResolverReturnType<ReturnType> = ResponseResolverReturnType<ReturnType> | Promise<ResponseResolverReturnType<ReturnType>>;
|
|
41
41
|
export declare type AsyncResponseResolverReturnType<ReturnType> = MaybeAsyncResponseResolverReturnType<ReturnType> | Generator<MaybeAsyncResponseResolverReturnType<ReturnType>, MaybeAsyncResponseResolverReturnType<ReturnType>, MaybeAsyncResponseResolverReturnType<ReturnType>>;
|
|
42
42
|
export declare type ResponseResolver<RequestType = MockedRequest, ContextType = typeof defaultContext, BodyType = any> = (req: RequestType, res: ResponseComposition<BodyType>, context: ContextType) => AsyncResponseResolverReturnType<MockedResponse<BodyType>>;
|
|
43
43
|
export interface RequestHandlerOptions<HandlerInfo> {
|
|
44
|
-
info:
|
|
44
|
+
info: HandlerInfo;
|
|
45
45
|
resolver: ResponseResolver<any, any>;
|
|
46
46
|
ctx?: ContextMap;
|
|
47
47
|
}
|
|
@@ -51,8 +51,8 @@ export interface RequestHandlerExecutionResult<PublicRequestType> {
|
|
|
51
51
|
request: PublicRequestType;
|
|
52
52
|
response?: MockedResponse;
|
|
53
53
|
}
|
|
54
|
-
export declare abstract class RequestHandler<HandlerInfo extends
|
|
55
|
-
info:
|
|
54
|
+
export declare abstract class RequestHandler<HandlerInfo extends RequestHandlerDefaultInfo = RequestHandlerDefaultInfo, Request extends MockedRequest = MockedRequest, ParsedResult = any, PublicRequest extends MockedRequest = Request> {
|
|
55
|
+
info: HandlerInfo & RequestHandlerInternalInfo;
|
|
56
56
|
shouldSkip: boolean;
|
|
57
57
|
private ctx;
|
|
58
58
|
private resolverGenerator?;
|
|
@@ -2,9 +2,9 @@ import { body, cookie, delay, fetch, json, set, status, text, xml } from '../con
|
|
|
2
2
|
import { SerializedResponse } from '../setupWorker/glossary';
|
|
3
3
|
import { ResponseResolutionContext } from '../utils/getResponse';
|
|
4
4
|
import { Match, Path, PathParams } from '../utils/matching/matchRequestUrl';
|
|
5
|
-
import { DefaultRequestBody, MockedRequest, RequestHandler, ResponseResolver } from './RequestHandler';
|
|
5
|
+
import { DefaultRequestBody, MockedRequest, RequestHandler, RequestHandlerDefaultInfo, ResponseResolver } from './RequestHandler';
|
|
6
6
|
declare type RestHandlerMethod = string | RegExp;
|
|
7
|
-
interface RestHandlerInfo {
|
|
7
|
+
export interface RestHandlerInfo extends RequestHandlerDefaultInfo {
|
|
8
8
|
method: RestHandlerMethod;
|
|
9
9
|
path: Path;
|
|
10
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const setupServer: (...requestHandlers: import("..").RequestHandler<
|
|
1
|
+
export declare const setupServer: (...requestHandlers: import("..").RequestHandler<import("../handlers/RequestHandler").RequestHandlerDefaultInfo, import("..").MockedRequest<import("..").DefaultRequestBody>, any, import("..").MockedRequest<import("..").DefaultRequestBody>>[]) => import("../node").SetupServerApi;
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* @param {RequestHandler[]} requestHandlers List of request handlers.
|
|
4
4
|
* @see {@link https://mswjs.io/docs/api/setup-server `setupServer`}
|
|
5
5
|
*/
|
|
6
|
-
export declare const setupServer: (...requestHandlers: import("..").RequestHandler<
|
|
6
|
+
export declare const setupServer: (...requestHandlers: import("..").RequestHandler<import("../handlers/RequestHandler").RequestHandlerDefaultInfo, import("..").MockedRequest<import("..").DefaultRequestBody>, any, import("..").MockedRequest<import("..").DefaultRequestBody>>[]) => import("./glossary").SetupServerApi;
|
|
@@ -12,4 +12,4 @@ export interface ResponseResolutionContext {
|
|
|
12
12
|
/**
|
|
13
13
|
* Returns a mocked response for a given request using following request handlers.
|
|
14
14
|
*/
|
|
15
|
-
export declare const getResponse: <Request_1 extends MockedRequest<import("../handlers/RequestHandler").DefaultRequestBody>, Handler extends RequestHandler<
|
|
15
|
+
export declare const getResponse: <Request_1 extends MockedRequest<import("../handlers/RequestHandler").DefaultRequestBody>, Handler extends RequestHandler<import("../handlers/RequestHandler").RequestHandlerDefaultInfo, MockedRequest<import("../handlers/RequestHandler").DefaultRequestBody>, any, MockedRequest<import("../handlers/RequestHandler").DefaultRequestBody>>[]>(request: Request_1, handlers: Handler, resolutionContext?: ResponseResolutionContext | undefined) => Promise<ResponseLookupResult>;
|
|
@@ -14,7 +14,7 @@ export interface HandleRequestOptions<ResponseType> {
|
|
|
14
14
|
};
|
|
15
15
|
/**
|
|
16
16
|
* Transforms a `MockedResponse` instance returned from a handler
|
|
17
|
-
* to a response instance
|
|
17
|
+
* to a response instance supported by the lower tooling (i.e. interceptors).
|
|
18
18
|
*/
|
|
19
19
|
transformResponse?(response: MockedResponse<string>): ResponseType;
|
|
20
20
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { RequestHandler } from '../../handlers/RequestHandler';
|
|
2
2
|
export declare function use(currentHandlers: RequestHandler[], ...handlers: RequestHandler[]): void;
|
|
3
3
|
export declare function restoreHandlers(handlers: RequestHandler[]): void;
|
|
4
|
-
export declare function resetHandlers(initialHandlers: RequestHandler[], ...nextHandlers: RequestHandler[]): RequestHandler<
|
|
4
|
+
export declare function resetHandlers(initialHandlers: RequestHandler[], ...nextHandlers: RequestHandler[]): RequestHandler<import("../../handlers/RequestHandler").RequestHandlerDefaultInfo, import("../../handlers/RequestHandler").MockedRequest<import("../../handlers/RequestHandler").DefaultRequestBody>, any, import("../../handlers/RequestHandler").MockedRequest<import("../../handlers/RequestHandler").DefaultRequestBody>>[];
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { MockedRequest, RequestHandler } from '../../handlers/RequestHandler';
|
|
2
|
-
declare type UnhandledRequestCallback = (request: MockedRequest) => void;
|
|
2
|
+
export declare type UnhandledRequestCallback = (request: MockedRequest) => void;
|
|
3
3
|
export declare type UnhandledRequestStrategy = 'bypass' | 'warn' | 'error' | UnhandledRequestCallback;
|
|
4
4
|
export declare function onUnhandledRequest(request: MockedRequest, handlers: RequestHandler[], strategy?: UnhandledRequestStrategy): void;
|
|
5
|
-
export {};
|
package/lib/umd/index.js
CHANGED
|
@@ -22885,12 +22885,23 @@ Invalid value has been removed from localStorage to prevent subsequent failed pa
|
|
|
22885
22885
|
return path.replace(REDUNDANT_CHARACTERS_EXP, '');
|
|
22886
22886
|
}
|
|
22887
22887
|
|
|
22888
|
+
/**
|
|
22889
|
+
* Determines if the given URL string is an absolute URL.
|
|
22890
|
+
*/
|
|
22891
|
+
function isAbsoluteUrl(url) {
|
|
22892
|
+
return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
|
|
22893
|
+
}
|
|
22894
|
+
|
|
22888
22895
|
/**
|
|
22889
22896
|
* Returns an absolute URL based on the given path.
|
|
22890
22897
|
*/
|
|
22891
22898
|
function getAbsoluteUrl(path, baseUrl) {
|
|
22892
|
-
//
|
|
22893
|
-
if (
|
|
22899
|
+
// already absolute URL
|
|
22900
|
+
if (isAbsoluteUrl(path)) {
|
|
22901
|
+
return path;
|
|
22902
|
+
}
|
|
22903
|
+
// Ignore path with pattern start with *
|
|
22904
|
+
if (path.startsWith('*')) {
|
|
22894
22905
|
return path;
|
|
22895
22906
|
}
|
|
22896
22907
|
// Resolve a relative request URL against a given custom "baseUrl"
|
|
@@ -22924,18 +22935,31 @@ Invalid value has been removed from localStorage to prevent subsequent failed pa
|
|
|
22924
22935
|
*/
|
|
22925
22936
|
function coercePath(path) {
|
|
22926
22937
|
return (path
|
|
22927
|
-
/**
|
|
22928
|
-
* Escape the protocol so that "path-to-regexp" could match
|
|
22929
|
-
* absolute URL.
|
|
22930
|
-
* @see https://github.com/pillarjs/path-to-regexp/issues/259
|
|
22931
|
-
*/
|
|
22932
|
-
.replace(/^([^\/]+)(:)(?=\/\/)/g, '$1\\$2')
|
|
22933
22938
|
/**
|
|
22934
22939
|
* Replace wildcards ("*") with unnamed capturing groups
|
|
22935
22940
|
* because "path-to-regexp" doesn't support wildcards.
|
|
22936
22941
|
* Ignore path parameter' modifiers (i.e. ":name*").
|
|
22937
22942
|
*/
|
|
22938
|
-
.replace(/(
|
|
22943
|
+
.replace(/([:a-zA-Z_-]*)(\*{1,2})+/g, (_, parameterName, wildcard) => {
|
|
22944
|
+
const expression = '(.*)';
|
|
22945
|
+
if (!parameterName) {
|
|
22946
|
+
return expression;
|
|
22947
|
+
}
|
|
22948
|
+
return parameterName.startsWith(':')
|
|
22949
|
+
? `${parameterName}${wildcard}`
|
|
22950
|
+
: `${parameterName}${expression}`;
|
|
22951
|
+
})
|
|
22952
|
+
/**
|
|
22953
|
+
* Escape the port so that "path-to-regexp" can match
|
|
22954
|
+
* absolute URLs including port numbers.
|
|
22955
|
+
*/
|
|
22956
|
+
.replace(/([^\/])(:)(?=\d+)/, '$1\\$2')
|
|
22957
|
+
/**
|
|
22958
|
+
* Escape the protocol so that "path-to-regexp" could match
|
|
22959
|
+
* absolute URL.
|
|
22960
|
+
* @see https://github.com/pillarjs/path-to-regexp/issues/259
|
|
22961
|
+
*/
|
|
22962
|
+
.replace(/^([^\/]+)(:)(?=\/\/)/, '$1\\$2'));
|
|
22939
22963
|
}
|
|
22940
22964
|
/**
|
|
22941
22965
|
* Returns the result of matching given request URL against a mask.
|
|
@@ -23188,7 +23212,6 @@ Invalid value has been removed from localStorage to prevent subsequent failed pa
|
|
|
23188
23212
|
const matchesMethod = this.info.method instanceof RegExp
|
|
23189
23213
|
? this.info.method.test(request.method)
|
|
23190
23214
|
: isStringEqual(this.info.method, request.method);
|
|
23191
|
-
// console.log({ request, matchesMethod, parsedResult })
|
|
23192
23215
|
return matchesMethod && parsedResult.matches;
|
|
23193
23216
|
}
|
|
23194
23217
|
log(request, response) {
|
|
@@ -23321,10 +23344,10 @@ Consider naming this operation or using "graphql.operation" request handler to i
|
|
|
23321
23344
|
graphql: [],
|
|
23322
23345
|
});
|
|
23323
23346
|
}
|
|
23324
|
-
function
|
|
23347
|
+
function getRestHandlerScore() {
|
|
23325
23348
|
return (request, handler) => {
|
|
23326
23349
|
const { path, method } = handler.info;
|
|
23327
|
-
if (path instanceof RegExp) {
|
|
23350
|
+
if (path instanceof RegExp || method instanceof RegExp) {
|
|
23328
23351
|
return Infinity;
|
|
23329
23352
|
}
|
|
23330
23353
|
const hasSameMethod = isStringEqual(request.method, method);
|
|
@@ -23335,12 +23358,15 @@ Consider naming this operation or using "graphql.operation" request handler to i
|
|
|
23335
23358
|
return score - methodScoreDelta;
|
|
23336
23359
|
};
|
|
23337
23360
|
}
|
|
23338
|
-
function
|
|
23361
|
+
function getGraphQLHandlerScore(parsedQuery) {
|
|
23339
23362
|
return (_, handler) => {
|
|
23340
23363
|
if (typeof parsedQuery.operationName === 'undefined') {
|
|
23341
23364
|
return Infinity;
|
|
23342
23365
|
}
|
|
23343
23366
|
const { operationType, operationName } = handler.info;
|
|
23367
|
+
if (typeof operationName !== 'string') {
|
|
23368
|
+
return Infinity;
|
|
23369
|
+
}
|
|
23344
23370
|
const hasSameOperationType = parsedQuery.operationType === operationType;
|
|
23345
23371
|
// Always treat a handler with the same operation type as a more similar one.
|
|
23346
23372
|
const operationTypeScoreDelta = hasSameOperationType ? TYPE_MATCH_DELTA : 0;
|
|
@@ -23350,16 +23376,12 @@ Consider naming this operation or using "graphql.operation" request handler to i
|
|
|
23350
23376
|
}
|
|
23351
23377
|
function getSuggestedHandler(request, handlers, getScore) {
|
|
23352
23378
|
const suggestedHandlers = handlers
|
|
23353
|
-
.reduce((
|
|
23379
|
+
.reduce((suggestions, handler) => {
|
|
23354
23380
|
const score = getScore(request, handler);
|
|
23355
|
-
return
|
|
23381
|
+
return suggestions.concat([[score, handler]]);
|
|
23356
23382
|
}, [])
|
|
23357
|
-
.sort(([leftScore], [rightScore]) =>
|
|
23358
|
-
|
|
23359
|
-
})
|
|
23360
|
-
.filter(([score]) => {
|
|
23361
|
-
return score <= MAX_MATCH_SCORE;
|
|
23362
|
-
})
|
|
23383
|
+
.sort(([leftScore], [rightScore]) => leftScore - rightScore)
|
|
23384
|
+
.filter(([score]) => score <= MAX_MATCH_SCORE)
|
|
23363
23385
|
.slice(0, MAX_SUGGESTION_COUNT)
|
|
23364
23386
|
.map(([, handler]) => handler);
|
|
23365
23387
|
return suggestedHandlers;
|
|
@@ -23389,8 +23411,8 @@ ${handlers.map((handler) => ` • ${handler.info.header}`).join('\n')}`;
|
|
|
23389
23411
|
? handlerGroups.graphql
|
|
23390
23412
|
: handlerGroups.rest;
|
|
23391
23413
|
const suggestedHandlers = getSuggestedHandler(request, relevantHandlers, parsedGraphQLQuery
|
|
23392
|
-
?
|
|
23393
|
-
:
|
|
23414
|
+
? getGraphQLHandlerScore(parsedGraphQLQuery)
|
|
23415
|
+
: getRestHandlerScore());
|
|
23394
23416
|
const handlerSuggestion = suggestedHandlers.length > 0
|
|
23395
23417
|
? getSuggestedHandlersMessage(suggestedHandlers)
|
|
23396
23418
|
: '';
|
|
@@ -23413,7 +23435,7 @@ Read more: https://mswjs.io/docs/getting-started/mocks\
|
|
|
23413
23435
|
// Print a developer-friendly error.
|
|
23414
23436
|
devUtils.error('Error: %s', message);
|
|
23415
23437
|
// Throw an exception to halt request processing and not perform the original request.
|
|
23416
|
-
throw new Error('Cannot bypass a request when using the "error" strategy for the "onUnhandledRequest" option.');
|
|
23438
|
+
throw new Error(devUtils.formatMessage('Cannot bypass a request when using the "error" strategy for the "onUnhandledRequest" option.'));
|
|
23417
23439
|
}
|
|
23418
23440
|
case 'warn': {
|
|
23419
23441
|
devUtils.warn('Warning: %s', message);
|
|
@@ -24003,14 +24025,14 @@ If this message still persists after updating, please report an issue: https://g
|
|
|
24003
24025
|
|
|
24004
24026
|
Object.defineProperty(uuid, "__esModule", { value: true });
|
|
24005
24027
|
uuid.uuidv4 = void 0;
|
|
24006
|
-
function uuidv4
|
|
24028
|
+
function uuidv4() {
|
|
24007
24029
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
24008
24030
|
var r = (Math.random() * 16) | 0;
|
|
24009
24031
|
var v = c == 'x' ? r : (r & 0x3) | 0x8;
|
|
24010
24032
|
return v.toString(16);
|
|
24011
24033
|
});
|
|
24012
24034
|
}
|
|
24013
|
-
uuid.uuidv4 = uuidv4
|
|
24035
|
+
uuid.uuidv4 = uuidv4;
|
|
24014
24036
|
|
|
24015
24037
|
var browser = {exports: {}};
|
|
24016
24038
|
|
|
@@ -28288,22 +28310,12 @@ If this message still persists after updating, please report an issue: https://g
|
|
|
28288
28310
|
};
|
|
28289
28311
|
interceptXMLHttpRequest_1 = XMLHttpRequest.interceptXMLHttpRequest = interceptXMLHttpRequest;
|
|
28290
28312
|
|
|
28291
|
-
function uuidv4() {
|
|
28292
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
28293
|
-
const r = (Math.random() * 16) | 0;
|
|
28294
|
-
const v = c == 'x' ? r : (r & 0x3) | 0x8;
|
|
28295
|
-
return v.toString(16);
|
|
28296
|
-
});
|
|
28297
|
-
}
|
|
28298
|
-
|
|
28299
28313
|
/**
|
|
28300
28314
|
* Converts a given isomorphic request to a `MockedRequest` instance.
|
|
28301
28315
|
*/
|
|
28302
28316
|
function parseIsomorphicRequest(request) {
|
|
28303
|
-
const requestId = uuidv4();
|
|
28304
|
-
request.headers.set('x-msw-request-id', requestId);
|
|
28305
28317
|
const mockedRequest = {
|
|
28306
|
-
id:
|
|
28318
|
+
id: request.id,
|
|
28307
28319
|
url: request.url,
|
|
28308
28320
|
method: request.method,
|
|
28309
28321
|
body: parseBody(request.body, request.headers),
|
package/native/lib/index.js
CHANGED
|
@@ -362,14 +362,6 @@ function tryDecode(str, decode) {
|
|
|
362
362
|
}
|
|
363
363
|
}
|
|
364
364
|
|
|
365
|
-
function uuidv4() {
|
|
366
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
367
|
-
const r = (Math.random() * 16) | 0;
|
|
368
|
-
const v = c == 'x' ? r : (r & 0x3) | 0x8;
|
|
369
|
-
return v.toString(16);
|
|
370
|
-
});
|
|
371
|
-
}
|
|
372
|
-
|
|
373
365
|
/**
|
|
374
366
|
* Parses a given value into a JSON.
|
|
375
367
|
* Does not throw an exception on an invalid JSON string.
|
|
@@ -1048,10 +1040,8 @@ function setRequestCookies(request) {
|
|
|
1048
1040
|
* Converts a given isomorphic request to a `MockedRequest` instance.
|
|
1049
1041
|
*/
|
|
1050
1042
|
function parseIsomorphicRequest(request) {
|
|
1051
|
-
const requestId = uuidv4();
|
|
1052
|
-
request.headers.set('x-msw-request-id', requestId);
|
|
1053
1043
|
const mockedRequest = {
|
|
1054
|
-
id:
|
|
1044
|
+
id: request.id,
|
|
1055
1045
|
url: request.url,
|
|
1056
1046
|
method: request.method,
|
|
1057
1047
|
body: parseBody(request.body, request.headers),
|
|
@@ -5387,12 +5377,23 @@ function cleanUrl(path) {
|
|
|
5387
5377
|
return path.replace(REDUNDANT_CHARACTERS_EXP, '');
|
|
5388
5378
|
}
|
|
5389
5379
|
|
|
5380
|
+
/**
|
|
5381
|
+
* Determines if the given URL string is an absolute URL.
|
|
5382
|
+
*/
|
|
5383
|
+
function isAbsoluteUrl(url) {
|
|
5384
|
+
return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
|
|
5385
|
+
}
|
|
5386
|
+
|
|
5390
5387
|
/**
|
|
5391
5388
|
* Returns an absolute URL based on the given path.
|
|
5392
5389
|
*/
|
|
5393
5390
|
function getAbsoluteUrl(path, baseUrl) {
|
|
5394
|
-
//
|
|
5395
|
-
if (
|
|
5391
|
+
// already absolute URL
|
|
5392
|
+
if (isAbsoluteUrl(path)) {
|
|
5393
|
+
return path;
|
|
5394
|
+
}
|
|
5395
|
+
// Ignore path with pattern start with *
|
|
5396
|
+
if (path.startsWith('*')) {
|
|
5396
5397
|
return path;
|
|
5397
5398
|
}
|
|
5398
5399
|
// Resolve a relative request URL against a given custom "baseUrl"
|
|
@@ -5426,18 +5427,31 @@ function normalizePath(path, baseUrl) {
|
|
|
5426
5427
|
*/
|
|
5427
5428
|
function coercePath(path) {
|
|
5428
5429
|
return (path
|
|
5429
|
-
/**
|
|
5430
|
-
* Escape the protocol so that "path-to-regexp" could match
|
|
5431
|
-
* absolute URL.
|
|
5432
|
-
* @see https://github.com/pillarjs/path-to-regexp/issues/259
|
|
5433
|
-
*/
|
|
5434
|
-
.replace(/^([^\/]+)(:)(?=\/\/)/g, '$1\\$2')
|
|
5435
5430
|
/**
|
|
5436
5431
|
* Replace wildcards ("*") with unnamed capturing groups
|
|
5437
5432
|
* because "path-to-regexp" doesn't support wildcards.
|
|
5438
5433
|
* Ignore path parameter' modifiers (i.e. ":name*").
|
|
5439
5434
|
*/
|
|
5440
|
-
.replace(/(
|
|
5435
|
+
.replace(/([:a-zA-Z_-]*)(\*{1,2})+/g, (_, parameterName, wildcard) => {
|
|
5436
|
+
const expression = '(.*)';
|
|
5437
|
+
if (!parameterName) {
|
|
5438
|
+
return expression;
|
|
5439
|
+
}
|
|
5440
|
+
return parameterName.startsWith(':')
|
|
5441
|
+
? `${parameterName}${wildcard}`
|
|
5442
|
+
: `${parameterName}${expression}`;
|
|
5443
|
+
})
|
|
5444
|
+
/**
|
|
5445
|
+
* Escape the port so that "path-to-regexp" can match
|
|
5446
|
+
* absolute URLs including port numbers.
|
|
5447
|
+
*/
|
|
5448
|
+
.replace(/([^\/])(:)(?=\d+)/, '$1\\$2')
|
|
5449
|
+
/**
|
|
5450
|
+
* Escape the protocol so that "path-to-regexp" could match
|
|
5451
|
+
* absolute URL.
|
|
5452
|
+
* @see https://github.com/pillarjs/path-to-regexp/issues/259
|
|
5453
|
+
*/
|
|
5454
|
+
.replace(/^([^\/]+)(:)(?=\/\/)/, '$1\\$2'));
|
|
5441
5455
|
}
|
|
5442
5456
|
/**
|
|
5443
5457
|
* Returns the result of matching given request URL against a mask.
|
|
@@ -5697,7 +5711,6 @@ class RestHandler extends RequestHandler {
|
|
|
5697
5711
|
const matchesMethod = this.info.method instanceof RegExp
|
|
5698
5712
|
? this.info.method.test(request.method)
|
|
5699
5713
|
: isStringEqual(this.info.method, request.method);
|
|
5700
|
-
// console.log({ request, matchesMethod, parsedResult })
|
|
5701
5714
|
return matchesMethod && parsedResult.matches;
|
|
5702
5715
|
}
|
|
5703
5716
|
log(request, response) {
|
|
@@ -5830,10 +5843,10 @@ function groupHandlersByType(handlers) {
|
|
|
5830
5843
|
graphql: [],
|
|
5831
5844
|
});
|
|
5832
5845
|
}
|
|
5833
|
-
function
|
|
5846
|
+
function getRestHandlerScore() {
|
|
5834
5847
|
return (request, handler) => {
|
|
5835
5848
|
const { path, method } = handler.info;
|
|
5836
|
-
if (path instanceof RegExp) {
|
|
5849
|
+
if (path instanceof RegExp || method instanceof RegExp) {
|
|
5837
5850
|
return Infinity;
|
|
5838
5851
|
}
|
|
5839
5852
|
const hasSameMethod = isStringEqual(request.method, method);
|
|
@@ -5844,12 +5857,15 @@ function getScoreForRestHandler() {
|
|
|
5844
5857
|
return score - methodScoreDelta;
|
|
5845
5858
|
};
|
|
5846
5859
|
}
|
|
5847
|
-
function
|
|
5860
|
+
function getGraphQLHandlerScore(parsedQuery) {
|
|
5848
5861
|
return (_, handler) => {
|
|
5849
5862
|
if (typeof parsedQuery.operationName === 'undefined') {
|
|
5850
5863
|
return Infinity;
|
|
5851
5864
|
}
|
|
5852
5865
|
const { operationType, operationName } = handler.info;
|
|
5866
|
+
if (typeof operationName !== 'string') {
|
|
5867
|
+
return Infinity;
|
|
5868
|
+
}
|
|
5853
5869
|
const hasSameOperationType = parsedQuery.operationType === operationType;
|
|
5854
5870
|
// Always treat a handler with the same operation type as a more similar one.
|
|
5855
5871
|
const operationTypeScoreDelta = hasSameOperationType ? TYPE_MATCH_DELTA : 0;
|
|
@@ -5859,16 +5875,12 @@ function getScoreForGraphQLHandler(parsedQuery) {
|
|
|
5859
5875
|
}
|
|
5860
5876
|
function getSuggestedHandler(request, handlers, getScore) {
|
|
5861
5877
|
const suggestedHandlers = handlers
|
|
5862
|
-
.reduce((
|
|
5878
|
+
.reduce((suggestions, handler) => {
|
|
5863
5879
|
const score = getScore(request, handler);
|
|
5864
|
-
return
|
|
5880
|
+
return suggestions.concat([[score, handler]]);
|
|
5865
5881
|
}, [])
|
|
5866
|
-
.sort(([leftScore], [rightScore]) =>
|
|
5867
|
-
|
|
5868
|
-
})
|
|
5869
|
-
.filter(([score]) => {
|
|
5870
|
-
return score <= MAX_MATCH_SCORE;
|
|
5871
|
-
})
|
|
5882
|
+
.sort(([leftScore], [rightScore]) => leftScore - rightScore)
|
|
5883
|
+
.filter(([score]) => score <= MAX_MATCH_SCORE)
|
|
5872
5884
|
.slice(0, MAX_SUGGESTION_COUNT)
|
|
5873
5885
|
.map(([, handler]) => handler);
|
|
5874
5886
|
return suggestedHandlers;
|
|
@@ -5898,8 +5910,8 @@ function onUnhandledRequest(request, handlers, strategy = 'warn') {
|
|
|
5898
5910
|
? handlerGroups.graphql
|
|
5899
5911
|
: handlerGroups.rest;
|
|
5900
5912
|
const suggestedHandlers = getSuggestedHandler(request, relevantHandlers, parsedGraphQLQuery
|
|
5901
|
-
?
|
|
5902
|
-
:
|
|
5913
|
+
? getGraphQLHandlerScore(parsedGraphQLQuery)
|
|
5914
|
+
: getRestHandlerScore());
|
|
5903
5915
|
const handlerSuggestion = suggestedHandlers.length > 0
|
|
5904
5916
|
? getSuggestedHandlersMessage(suggestedHandlers)
|
|
5905
5917
|
: '';
|
|
@@ -5922,7 +5934,7 @@ Read more: https://mswjs.io/docs/getting-started/mocks\
|
|
|
5922
5934
|
// Print a developer-friendly error.
|
|
5923
5935
|
devUtils.error('Error: %s', message);
|
|
5924
5936
|
// Throw an exception to halt request processing and not perform the original request.
|
|
5925
|
-
throw new Error('Cannot bypass a request when using the "error" strategy for the "onUnhandledRequest" option.');
|
|
5937
|
+
throw new Error(devUtils.formatMessage('Cannot bypass a request when using the "error" strategy for the "onUnhandledRequest" option.'));
|
|
5926
5938
|
}
|
|
5927
5939
|
case 'warn': {
|
|
5928
5940
|
devUtils.warn('Warning: %s', message);
|
|
@@ -6054,15 +6066,14 @@ function createSetupServer(...interceptors$1) {
|
|
|
6054
6066
|
},
|
|
6055
6067
|
});
|
|
6056
6068
|
interceptor.on('response', (request, response) => {
|
|
6057
|
-
|
|
6058
|
-
if (!requestId) {
|
|
6069
|
+
if (!request.id) {
|
|
6059
6070
|
return;
|
|
6060
6071
|
}
|
|
6061
6072
|
if (response.headers.get('x-powered-by') === 'msw') {
|
|
6062
|
-
emitter.emit('response:mocked', response,
|
|
6073
|
+
emitter.emit('response:mocked', response, request.id);
|
|
6063
6074
|
}
|
|
6064
6075
|
else {
|
|
6065
|
-
emitter.emit('response:bypass', response,
|
|
6076
|
+
emitter.emit('response:bypass', response, request.id);
|
|
6066
6077
|
}
|
|
6067
6078
|
});
|
|
6068
6079
|
return {
|