msw 2.0.12 → 2.0.13
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/lib/browser/index.d.mts +104 -0
- package/lib/browser/index.d.ts +1 -1
- package/lib/browser/index.js +1 -0
- package/lib/browser/index.js.map +1 -0
- package/lib/browser/index.mjs +1 -0
- package/lib/browser/index.mjs.map +1 -0
- package/lib/core/{GraphQLHandler-da09c680.d.ts → GraphQLHandler-SHlRCcy4.d.ts} +2 -2
- package/lib/core/GraphQLHandler-zlmUDnN6.d.mts +97 -0
- package/lib/core/HttpResponse.d.mts +2 -0
- package/lib/core/HttpResponse.d.ts +1 -1
- package/lib/core/HttpResponse.js +1 -0
- package/lib/core/HttpResponse.js.map +1 -0
- package/lib/core/HttpResponse.mjs +1 -0
- package/lib/core/HttpResponse.mjs.map +1 -0
- package/lib/core/{RequestHandler-25f9cfd1.d.ts → RequestHandler-rBDJQrEf.d.ts} +1 -1
- package/lib/core/RequestHandler-vxZdj6Tw.d.mts +179 -0
- package/lib/core/SetupApi.d.mts +26 -0
- package/lib/core/SetupApi.d.ts +1 -1
- package/lib/core/SetupApi.js +1 -0
- package/lib/core/SetupApi.js.map +1 -0
- package/lib/core/SetupApi.mjs +1 -0
- package/lib/core/SetupApi.mjs.map +1 -0
- package/lib/core/bypass.d.mts +16 -0
- package/lib/core/bypass.d.ts +1 -1
- package/lib/core/bypass.js +1 -0
- package/lib/core/bypass.js.map +1 -0
- package/lib/core/bypass.mjs +1 -0
- package/lib/core/bypass.mjs.map +1 -0
- package/lib/core/delay.d.mts +18 -0
- package/lib/core/delay.d.ts +1 -1
- package/lib/core/delay.js +1 -0
- package/lib/core/delay.js.map +1 -0
- package/lib/core/delay.mjs +1 -0
- package/lib/core/delay.mjs.map +1 -0
- package/lib/core/graphql.d.mts +109 -0
- package/lib/core/graphql.d.ts +3 -3
- package/lib/core/graphql.js +1 -0
- package/lib/core/graphql.js.map +1 -0
- package/lib/core/graphql.mjs +1 -0
- package/lib/core/graphql.mjs.map +1 -0
- package/lib/core/handlers/GraphQLHandler.d.mts +5 -0
- package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
- package/lib/core/handlers/GraphQLHandler.js +3 -2
- package/lib/core/handlers/GraphQLHandler.js.map +1 -0
- package/lib/core/handlers/GraphQLHandler.mjs +3 -2
- package/lib/core/handlers/GraphQLHandler.mjs.map +1 -0
- package/lib/core/handlers/HttpHandler.d.mts +62 -0
- package/lib/core/handlers/HttpHandler.d.ts +2 -2
- package/lib/core/handlers/HttpHandler.js +1 -0
- package/lib/core/handlers/HttpHandler.js.map +1 -0
- package/lib/core/handlers/HttpHandler.mjs +1 -0
- package/lib/core/handlers/HttpHandler.mjs.map +1 -0
- package/lib/core/handlers/RequestHandler.d.mts +2 -0
- package/lib/core/handlers/RequestHandler.d.ts +1 -1
- package/lib/core/handlers/RequestHandler.js +3 -2
- package/lib/core/handlers/RequestHandler.js.map +1 -0
- package/lib/core/handlers/RequestHandler.mjs +3 -2
- package/lib/core/handlers/RequestHandler.mjs.map +1 -0
- package/lib/core/http.d.mts +26 -0
- package/lib/core/http.d.ts +1 -1
- package/lib/core/http.js +1 -0
- package/lib/core/http.js.map +1 -0
- package/lib/core/http.mjs +1 -0
- package/lib/core/http.mjs.map +1 -0
- package/lib/core/index.d.mts +18 -0
- package/lib/core/index.d.ts +2 -2
- package/lib/core/index.js +1 -0
- package/lib/core/index.js.map +1 -0
- package/lib/core/index.mjs +1 -0
- package/lib/core/index.mjs.map +1 -0
- package/lib/core/passthrough.d.mts +17 -0
- package/lib/core/passthrough.js +1 -0
- package/lib/core/passthrough.js.map +1 -0
- package/lib/core/passthrough.mjs +1 -0
- package/lib/core/passthrough.mjs.map +1 -0
- package/lib/core/sharedOptions.d.mts +66 -0
- package/lib/core/sharedOptions.d.ts +2 -2
- package/lib/core/sharedOptions.js +1 -0
- package/lib/core/sharedOptions.js.map +1 -0
- package/lib/core/sharedOptions.mjs +1 -0
- package/lib/core/sharedOptions.mjs.map +1 -0
- package/lib/core/typeUtils.d.mts +7 -0
- package/lib/core/typeUtils.d.ts +1 -1
- package/lib/core/typeUtils.js +1 -0
- package/lib/core/typeUtils.js.map +1 -0
- package/lib/core/typeUtils.mjs +1 -0
- package/lib/core/typeUtils.mjs.map +1 -0
- package/lib/core/utils/HttpResponse/decorators.d.mts +12 -0
- package/lib/core/utils/HttpResponse/decorators.d.ts +2 -2
- package/lib/core/utils/HttpResponse/decorators.js +1 -0
- package/lib/core/utils/HttpResponse/decorators.js.map +1 -0
- package/lib/core/utils/HttpResponse/decorators.mjs +1 -0
- package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -0
- package/lib/core/utils/getResponse.d.mts +2 -0
- package/lib/core/utils/getResponse.d.ts +1 -1
- package/lib/core/utils/getResponse.js +1 -0
- package/lib/core/utils/getResponse.js.map +1 -0
- package/lib/core/utils/getResponse.mjs +1 -0
- package/lib/core/utils/getResponse.mjs.map +1 -0
- package/lib/core/utils/handleRequest.d.mts +37 -0
- package/lib/core/utils/handleRequest.d.ts +2 -2
- package/lib/core/utils/handleRequest.js +1 -0
- package/lib/core/utils/handleRequest.js.map +1 -0
- package/lib/core/utils/handleRequest.mjs +1 -0
- package/lib/core/utils/handleRequest.mjs.map +1 -0
- package/lib/core/utils/internal/Disposable.d.mts +7 -0
- package/lib/core/utils/internal/Disposable.d.ts +1 -1
- package/lib/core/utils/internal/Disposable.js +1 -0
- package/lib/core/utils/internal/Disposable.js.map +1 -0
- package/lib/core/utils/internal/Disposable.mjs +1 -0
- package/lib/core/utils/internal/Disposable.mjs.map +1 -0
- package/lib/core/utils/internal/checkGlobals.d.mts +3 -0
- package/lib/core/utils/internal/checkGlobals.js +1 -0
- package/lib/core/utils/internal/checkGlobals.js.map +1 -0
- package/lib/core/utils/internal/checkGlobals.mjs +1 -0
- package/lib/core/utils/internal/checkGlobals.mjs.map +1 -0
- package/lib/core/utils/internal/devUtils.d.mts +19 -0
- package/lib/core/utils/internal/devUtils.js +1 -0
- package/lib/core/utils/internal/devUtils.js.map +1 -0
- package/lib/core/utils/internal/devUtils.mjs +1 -0
- package/lib/core/utils/internal/devUtils.mjs.map +1 -0
- package/lib/core/utils/internal/getCallFrame.d.mts +6 -0
- package/lib/core/utils/internal/getCallFrame.js +1 -0
- package/lib/core/utils/internal/getCallFrame.js.map +1 -0
- package/lib/core/utils/internal/getCallFrame.mjs +1 -0
- package/lib/core/utils/internal/getCallFrame.mjs.map +1 -0
- package/lib/core/utils/internal/isIterable.d.mts +6 -0
- package/lib/core/utils/internal/isIterable.js +1 -0
- package/lib/core/utils/internal/isIterable.js.map +1 -0
- package/lib/core/utils/internal/isIterable.mjs +1 -0
- package/lib/core/utils/internal/isIterable.mjs.map +1 -0
- package/lib/core/utils/internal/isObject.d.mts +6 -0
- package/lib/core/utils/internal/isObject.js +1 -0
- package/lib/core/utils/internal/isObject.js.map +1 -0
- package/lib/core/utils/internal/isObject.mjs +1 -0
- package/lib/core/utils/internal/isObject.mjs.map +1 -0
- package/lib/core/utils/internal/isStringEqual.d.mts +6 -0
- package/lib/core/utils/internal/isStringEqual.js +1 -0
- package/lib/core/utils/internal/isStringEqual.js.map +1 -0
- package/lib/core/utils/internal/isStringEqual.mjs +1 -0
- package/lib/core/utils/internal/isStringEqual.mjs.map +1 -0
- package/lib/core/utils/internal/jsonParse.d.mts +7 -0
- package/lib/core/utils/internal/jsonParse.js +1 -0
- package/lib/core/utils/internal/jsonParse.js.map +1 -0
- package/lib/core/utils/internal/jsonParse.mjs +1 -0
- package/lib/core/utils/internal/jsonParse.mjs.map +1 -0
- package/lib/core/utils/internal/mergeRight.d.mts +7 -0
- package/lib/core/utils/internal/mergeRight.js +1 -0
- package/lib/core/utils/internal/mergeRight.js.map +1 -0
- package/lib/core/utils/internal/mergeRight.mjs +1 -0
- package/lib/core/utils/internal/mergeRight.mjs.map +1 -0
- package/lib/core/utils/internal/parseGraphQLRequest.d.mts +5 -0
- package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
- package/lib/core/utils/internal/parseGraphQLRequest.js +1 -0
- package/lib/core/utils/internal/parseGraphQLRequest.js.map +1 -0
- package/lib/core/utils/internal/parseGraphQLRequest.mjs +1 -0
- package/lib/core/utils/internal/parseGraphQLRequest.mjs.map +1 -0
- package/lib/core/utils/internal/parseMultipartData.d.mts +10 -0
- package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
- package/lib/core/utils/internal/parseMultipartData.js +1 -0
- package/lib/core/utils/internal/parseMultipartData.js.map +1 -0
- package/lib/core/utils/internal/parseMultipartData.mjs +1 -0
- package/lib/core/utils/internal/parseMultipartData.mjs.map +1 -0
- package/lib/core/utils/internal/pipeEvents.d.mts +8 -0
- package/lib/core/utils/internal/pipeEvents.js +1 -0
- package/lib/core/utils/internal/pipeEvents.js.map +1 -0
- package/lib/core/utils/internal/pipeEvents.mjs +1 -0
- package/lib/core/utils/internal/pipeEvents.mjs.map +1 -0
- package/lib/core/utils/internal/requestHandlerUtils.d.mts +8 -0
- package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
- package/lib/core/utils/internal/requestHandlerUtils.js +1 -0
- package/lib/core/utils/internal/requestHandlerUtils.js.map +1 -0
- package/lib/core/utils/internal/requestHandlerUtils.mjs +1 -0
- package/lib/core/utils/internal/requestHandlerUtils.mjs.map +1 -0
- package/lib/core/utils/internal/toReadonlyArray.d.mts +6 -0
- package/lib/core/utils/internal/toReadonlyArray.js +1 -0
- package/lib/core/utils/internal/toReadonlyArray.js.map +1 -0
- package/lib/core/utils/internal/toReadonlyArray.mjs +1 -0
- package/lib/core/utils/internal/toReadonlyArray.mjs.map +1 -0
- package/lib/core/utils/internal/tryCatch.d.mts +3 -0
- package/lib/core/utils/internal/tryCatch.js +1 -0
- package/lib/core/utils/internal/tryCatch.js.map +1 -0
- package/lib/core/utils/internal/tryCatch.mjs +1 -0
- package/lib/core/utils/internal/tryCatch.mjs.map +1 -0
- package/lib/core/utils/internal/uuidv4.d.mts +3 -0
- package/lib/core/utils/internal/uuidv4.js +1 -0
- package/lib/core/utils/internal/uuidv4.js.map +1 -0
- package/lib/core/utils/internal/uuidv4.mjs +1 -0
- package/lib/core/utils/internal/uuidv4.mjs.map +1 -0
- package/lib/core/utils/logging/getStatusCodeColor.d.mts +11 -0
- package/lib/core/utils/logging/getStatusCodeColor.js +1 -0
- package/lib/core/utils/logging/getStatusCodeColor.js.map +1 -0
- package/lib/core/utils/logging/getStatusCodeColor.mjs +1 -0
- package/lib/core/utils/logging/getStatusCodeColor.mjs.map +1 -0
- package/lib/core/utils/logging/getTimestamp.d.mts +6 -0
- package/lib/core/utils/logging/getTimestamp.js +1 -0
- package/lib/core/utils/logging/getTimestamp.js.map +1 -0
- package/lib/core/utils/logging/getTimestamp.mjs +1 -0
- package/lib/core/utils/logging/getTimestamp.mjs.map +1 -0
- package/lib/core/utils/logging/serializeRequest.d.mts +12 -0
- package/lib/core/utils/logging/serializeRequest.d.ts +1 -1
- package/lib/core/utils/logging/serializeRequest.js +1 -0
- package/lib/core/utils/logging/serializeRequest.js.map +1 -0
- package/lib/core/utils/logging/serializeRequest.mjs +1 -0
- package/lib/core/utils/logging/serializeRequest.mjs.map +1 -0
- package/lib/core/utils/logging/serializeResponse.d.mts +9 -0
- package/lib/core/utils/logging/serializeResponse.d.ts +1 -1
- package/lib/core/utils/logging/serializeResponse.js +1 -0
- package/lib/core/utils/logging/serializeResponse.js.map +1 -0
- package/lib/core/utils/logging/serializeResponse.mjs +1 -0
- package/lib/core/utils/logging/serializeResponse.mjs.map +1 -0
- package/lib/core/utils/matching/matchRequestUrl.d.mts +19 -0
- package/lib/core/utils/matching/matchRequestUrl.d.ts +1 -1
- package/lib/core/utils/matching/matchRequestUrl.js +1 -0
- package/lib/core/utils/matching/matchRequestUrl.js.map +1 -0
- package/lib/core/utils/matching/matchRequestUrl.mjs +1 -0
- package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -0
- package/lib/core/utils/matching/normalizePath.d.mts +12 -0
- package/lib/core/utils/matching/normalizePath.js +1 -0
- package/lib/core/utils/matching/normalizePath.js.map +1 -0
- package/lib/core/utils/matching/normalizePath.mjs +1 -0
- package/lib/core/utils/matching/normalizePath.mjs.map +1 -0
- package/lib/core/utils/request/getPublicUrlFromRequest.d.mts +7 -0
- package/lib/core/utils/request/getPublicUrlFromRequest.js +1 -0
- package/lib/core/utils/request/getPublicUrlFromRequest.js.map +1 -0
- package/lib/core/utils/request/getPublicUrlFromRequest.mjs +1 -0
- package/lib/core/utils/request/getPublicUrlFromRequest.mjs.map +1 -0
- package/lib/core/utils/request/getRequestCookies.d.mts +8 -0
- package/lib/core/utils/request/getRequestCookies.js +1 -0
- package/lib/core/utils/request/getRequestCookies.js.map +1 -0
- package/lib/core/utils/request/getRequestCookies.mjs +1 -0
- package/lib/core/utils/request/getRequestCookies.mjs.map +1 -0
- package/lib/core/utils/request/onUnhandledRequest.d.mts +12 -0
- package/lib/core/utils/request/onUnhandledRequest.d.ts +2 -2
- package/lib/core/utils/request/onUnhandledRequest.js +1 -0
- package/lib/core/utils/request/onUnhandledRequest.js.map +1 -0
- package/lib/core/utils/request/onUnhandledRequest.mjs +1 -0
- package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -0
- package/lib/core/utils/request/readResponseCookies.d.mts +3 -0
- package/lib/core/utils/request/readResponseCookies.js +1 -0
- package/lib/core/utils/request/readResponseCookies.js.map +1 -0
- package/lib/core/utils/request/readResponseCookies.mjs +1 -0
- package/lib/core/utils/request/readResponseCookies.mjs.map +1 -0
- package/lib/core/utils/toResponseInit.d.mts +3 -0
- package/lib/core/utils/toResponseInit.js +1 -0
- package/lib/core/utils/toResponseInit.js.map +1 -0
- package/lib/core/utils/toResponseInit.mjs +1 -0
- package/lib/core/utils/toResponseInit.mjs.map +1 -0
- package/lib/core/utils/url/cleanUrl.d.mts +7 -0
- package/lib/core/utils/url/cleanUrl.js +1 -0
- package/lib/core/utils/url/cleanUrl.js.map +1 -0
- package/lib/core/utils/url/cleanUrl.mjs +1 -0
- package/lib/core/utils/url/cleanUrl.mjs.map +1 -0
- package/lib/core/utils/url/getAbsoluteUrl.d.mts +6 -0
- package/lib/core/utils/url/getAbsoluteUrl.js +1 -0
- package/lib/core/utils/url/getAbsoluteUrl.js.map +1 -0
- package/lib/core/utils/url/getAbsoluteUrl.mjs +1 -0
- package/lib/core/utils/url/getAbsoluteUrl.mjs.map +1 -0
- package/lib/core/utils/url/isAbsoluteUrl.d.mts +6 -0
- package/lib/core/utils/url/isAbsoluteUrl.js +1 -0
- package/lib/core/utils/url/isAbsoluteUrl.js.map +1 -0
- package/lib/core/utils/url/isAbsoluteUrl.mjs +1 -0
- package/lib/core/utils/url/isAbsoluteUrl.mjs.map +1 -0
- package/lib/iife/index.js +20 -19
- package/lib/iife/index.js.map +1 -0
- package/lib/mockServiceWorker.js +1 -1
- package/lib/native/index.d.mts +75 -0
- package/lib/native/index.js +1 -0
- package/lib/native/index.js.map +1 -0
- package/lib/native/index.mjs +1 -0
- package/lib/native/index.mjs.map +1 -0
- package/lib/node/index.d.mts +75 -0
- package/lib/node/index.d.ts +1 -1
- package/lib/node/index.js +1 -0
- package/lib/node/index.js.map +1 -0
- package/lib/node/index.mjs +1 -0
- package/lib/node/index.mjs.map +1 -0
- package/package.json +5 -4
- package/src/browser/global.browser.d.ts +1 -0
- package/src/browser/index.ts +3 -0
- package/src/browser/setupWorker/glossary.ts +259 -0
- package/src/browser/setupWorker/setupWorker.node.test.ts +10 -0
- package/src/browser/setupWorker/setupWorker.ts +199 -0
- package/src/browser/setupWorker/start/createFallbackRequestListener.ts +67 -0
- package/src/browser/setupWorker/start/createFallbackStart.ts +21 -0
- package/src/browser/setupWorker/start/createRequestListener.ts +127 -0
- package/src/browser/setupWorker/start/createResponseListener.ts +58 -0
- package/src/browser/setupWorker/start/createStartHandler.ts +143 -0
- package/src/browser/setupWorker/start/utils/createMessageChannel.ts +32 -0
- package/src/browser/setupWorker/start/utils/enableMocking.ts +32 -0
- package/src/browser/setupWorker/start/utils/getWorkerByRegistration.ts +25 -0
- package/src/browser/setupWorker/start/utils/getWorkerInstance.ts +94 -0
- package/src/browser/setupWorker/start/utils/prepareStartHandler.test.ts +59 -0
- package/src/browser/setupWorker/start/utils/prepareStartHandler.ts +44 -0
- package/src/browser/setupWorker/start/utils/printStartMessage.test.ts +84 -0
- package/src/browser/setupWorker/start/utils/printStartMessage.ts +40 -0
- package/src/browser/setupWorker/start/utils/validateWorkerScope.ts +18 -0
- package/src/browser/setupWorker/stop/createFallbackStop.ts +11 -0
- package/src/browser/setupWorker/stop/createStop.ts +29 -0
- package/src/browser/setupWorker/stop/utils/printStopMessage.test.ts +26 -0
- package/src/browser/setupWorker/stop/utils/printStopMessage.ts +12 -0
- package/src/browser/tsconfig.browser.build.json +6 -0
- package/src/browser/tsconfig.browser.json +9 -0
- package/src/browser/utils/deferNetworkRequestsUntil.test.ts +48 -0
- package/src/browser/utils/deferNetworkRequestsUntil.ts +29 -0
- package/src/browser/utils/getAbsoluteWorkerUrl.test.ts +31 -0
- package/src/browser/utils/getAbsoluteWorkerUrl.ts +7 -0
- package/src/browser/utils/parseWorkerRequest.ts +15 -0
- package/src/browser/utils/pruneGetRequestBody.test.ts +53 -0
- package/src/browser/utils/pruneGetRequestBody.ts +21 -0
- package/src/browser/utils/requestIntegrityCheck.ts +23 -0
- package/src/browser/utils/supportsReadableStreamTransfer.ts +17 -0
- package/src/core/HttpResponse.test.ts +200 -0
- package/src/core/HttpResponse.ts +134 -0
- package/src/core/SetupApi.ts +95 -0
- package/src/core/bypass.test.ts +47 -0
- package/src/core/bypass.ts +36 -0
- package/src/core/delay.ts +70 -0
- package/src/core/graphql.test.ts +11 -0
- package/src/core/graphql.ts +138 -0
- package/src/core/handlers/GraphQLHandler.test.ts +820 -0
- package/src/core/handlers/GraphQLHandler.ts +263 -0
- package/src/core/handlers/HttpHandler.test.ts +218 -0
- package/src/core/handlers/HttpHandler.ts +169 -0
- package/src/core/handlers/RequestHandler.ts +338 -0
- package/src/core/http.test.ts +15 -0
- package/src/core/http.ts +51 -0
- package/src/core/index.ts +56 -0
- package/src/core/passthrough.test.ts +13 -0
- package/src/core/passthrough.ts +23 -0
- package/src/core/sharedOptions.ts +66 -0
- package/src/core/typeUtils.ts +20 -0
- package/src/core/utils/HttpResponse/decorators.ts +56 -0
- package/src/core/utils/getResponse.ts +55 -0
- package/src/core/utils/handleRequest.test.ts +554 -0
- package/src/core/utils/handleRequest.ts +132 -0
- package/src/core/utils/internal/Disposable.ts +9 -0
- package/src/core/utils/internal/checkGlobals.ts +17 -0
- package/src/core/utils/internal/devUtils.ts +31 -0
- package/src/core/utils/internal/getCallFrame.test.ts +154 -0
- package/src/core/utils/internal/getCallFrame.ts +35 -0
- package/src/core/utils/internal/isIterable.test.ts +23 -0
- package/src/core/utils/internal/isIterable.ts +12 -0
- package/src/core/utils/internal/isObject.test.ts +20 -0
- package/src/core/utils/internal/isObject.ts +6 -0
- package/src/core/utils/internal/isStringEqual.test.ts +45 -0
- package/src/core/utils/internal/isStringEqual.ts +6 -0
- package/src/core/utils/internal/jsonParse.test.ts +13 -0
- package/src/core/utils/internal/jsonParse.ts +13 -0
- package/src/core/utils/internal/mergeRight.test.ts +43 -0
- package/src/core/utils/internal/mergeRight.ts +27 -0
- package/src/core/utils/internal/parseGraphQLRequest.test.ts +99 -0
- package/src/core/utils/internal/parseGraphQLRequest.ts +205 -0
- package/src/core/utils/internal/parseMultipartData.test.ts +76 -0
- package/src/core/utils/internal/parseMultipartData.ts +104 -0
- package/src/core/utils/internal/pipeEvents.test.ts +14 -0
- package/src/core/utils/internal/pipeEvents.ts +25 -0
- package/src/core/utils/internal/requestHandlerUtils.ts +21 -0
- package/src/core/utils/internal/toReadonlyArray.test.ts +30 -0
- package/src/core/utils/internal/toReadonlyArray.ts +8 -0
- package/src/core/utils/internal/tryCatch.test.ts +29 -0
- package/src/core/utils/internal/tryCatch.ts +11 -0
- package/src/core/utils/internal/uuidv4.ts +3 -0
- package/src/core/utils/logging/getStatusCodeColor.test.ts +22 -0
- package/src/core/utils/logging/getStatusCodeColor.ts +20 -0
- package/src/core/utils/logging/getTimestamp.test.ts +18 -0
- package/src/core/utils/logging/getTimestamp.ts +12 -0
- package/src/core/utils/logging/serializeRequest.test.ts +23 -0
- package/src/core/utils/logging/serializeRequest.ts +23 -0
- package/src/core/utils/logging/serializeResponse.test.ts +77 -0
- package/src/core/utils/logging/serializeResponse.ts +31 -0
- package/src/core/utils/matching/matchRequestUrl.test.ts +114 -0
- package/src/core/utils/matching/matchRequestUrl.ts +73 -0
- package/src/core/utils/matching/normalizePath.node.test.ts +44 -0
- package/src/core/utils/matching/normalizePath.test.ts +50 -0
- package/src/core/utils/matching/normalizePath.ts +21 -0
- package/src/core/utils/request/getPublicUrlFromRequest.test.ts +26 -0
- package/src/core/utils/request/getPublicUrlFromRequest.ts +15 -0
- package/src/core/utils/request/getRequestCookies.node.test.ts +29 -0
- package/src/core/utils/request/getRequestCookies.test.ts +64 -0
- package/src/core/utils/request/getRequestCookies.ts +75 -0
- package/src/core/utils/request/onUnhandledRequest.test.ts +215 -0
- package/src/core/utils/request/onUnhandledRequest.ts +247 -0
- package/src/core/utils/request/readResponseCookies.ts +9 -0
- package/src/core/utils/toResponseInit.ts +7 -0
- package/src/core/utils/url/cleanUrl.test.ts +17 -0
- package/src/core/utils/url/cleanUrl.ts +12 -0
- package/src/core/utils/url/getAbsoluteUrl.node.test.ts +19 -0
- package/src/core/utils/url/getAbsoluteUrl.test.ts +29 -0
- package/src/core/utils/url/getAbsoluteUrl.ts +26 -0
- package/src/core/utils/url/isAbsoluteUrl.test.ts +32 -0
- package/src/core/utils/url/isAbsoluteUrl.ts +6 -0
- package/src/iife/index.ts +2 -0
- package/src/mockServiceWorker.js +287 -0
- package/src/native/index.ts +17 -0
- package/src/node/SetupServerApi.ts +113 -0
- package/src/node/glossary.ts +62 -0
- package/src/node/index.ts +3 -0
- package/src/node/setupServer.ts +21 -0
- package/src/node/utils/isNodeExceptionLike.ts +14 -0
- package/src/tsconfig.core.build.json +6 -0
- package/src/tsconfig.node.build.json +6 -0
- package/src/tsconfig.node.json +8 -0
- package/src/tsconfig.src.json +15 -0
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @vitest-environment jsdom
|
|
3
|
+
*/
|
|
4
|
+
import { Emitter } from 'strict-event-emitter'
|
|
5
|
+
import { LifeCycleEventsMap, SharedOptions } from '../sharedOptions'
|
|
6
|
+
import { RequestHandler } from '../handlers/RequestHandler'
|
|
7
|
+
import { http } from '../http'
|
|
8
|
+
import { handleRequest, HandleRequestOptions } from './handleRequest'
|
|
9
|
+
import { RequiredDeep } from '../typeUtils'
|
|
10
|
+
import { uuidv4 } from './internal/uuidv4'
|
|
11
|
+
import { HttpResponse } from '../HttpResponse'
|
|
12
|
+
import { passthrough } from '../passthrough'
|
|
13
|
+
|
|
14
|
+
const options: RequiredDeep<SharedOptions> = {
|
|
15
|
+
onUnhandledRequest: vi.fn(),
|
|
16
|
+
}
|
|
17
|
+
const handleRequestOptions: Partial<Record<keyof HandleRequestOptions, any>> = {
|
|
18
|
+
onPassthroughResponse: vi.fn(),
|
|
19
|
+
onMockedResponse: vi.fn(),
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function setup() {
|
|
23
|
+
const emitter = new Emitter<LifeCycleEventsMap>()
|
|
24
|
+
const listener = vi.fn()
|
|
25
|
+
|
|
26
|
+
const createMockListener = (name: string) => {
|
|
27
|
+
return (...args: any) => {
|
|
28
|
+
listener(name, ...args)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
emitter.on('request:start', createMockListener('request:start'))
|
|
33
|
+
emitter.on('request:match', createMockListener('request:match'))
|
|
34
|
+
emitter.on('request:unhandled', createMockListener('request:unhandled'))
|
|
35
|
+
emitter.on('request:end', createMockListener('request:end'))
|
|
36
|
+
emitter.on('response:mocked', createMockListener('response:mocked'))
|
|
37
|
+
emitter.on('response:bypass', createMockListener('response:bypass'))
|
|
38
|
+
|
|
39
|
+
const events = listener.mock.calls
|
|
40
|
+
return { emitter, events }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
vi.spyOn(global.console, 'warn').mockImplementation(() => void 0)
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
afterEach(() => {
|
|
48
|
+
vi.resetAllMocks()
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
test('returns undefined for a request with the "x-msw-intention" header equal to "bypass"', async () => {
|
|
52
|
+
const { emitter, events } = setup()
|
|
53
|
+
|
|
54
|
+
const requestId = uuidv4()
|
|
55
|
+
const request = new Request(new URL('http://localhost/user'), {
|
|
56
|
+
headers: new Headers({
|
|
57
|
+
'x-msw-intention': 'bypass',
|
|
58
|
+
}),
|
|
59
|
+
})
|
|
60
|
+
const handlers: Array<RequestHandler> = []
|
|
61
|
+
|
|
62
|
+
const result = await handleRequest(
|
|
63
|
+
request,
|
|
64
|
+
requestId,
|
|
65
|
+
handlers,
|
|
66
|
+
options,
|
|
67
|
+
emitter,
|
|
68
|
+
handleRequestOptions,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
expect(result).toBeUndefined()
|
|
72
|
+
expect(events).toEqual([
|
|
73
|
+
['request:start', { request, requestId }],
|
|
74
|
+
['request:end', { request, requestId }],
|
|
75
|
+
])
|
|
76
|
+
expect(options.onUnhandledRequest).not.toHaveBeenCalled()
|
|
77
|
+
expect(handleRequestOptions.onPassthroughResponse).toHaveBeenNthCalledWith(
|
|
78
|
+
1,
|
|
79
|
+
request,
|
|
80
|
+
)
|
|
81
|
+
expect(handleRequestOptions.onMockedResponse).not.toHaveBeenCalled()
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
test('does not bypass a request with "x-msw-intention" header set to arbitrary value', async () => {
|
|
85
|
+
const { emitter } = setup()
|
|
86
|
+
|
|
87
|
+
const request = new Request(new URL('http://localhost/user'), {
|
|
88
|
+
headers: new Headers({
|
|
89
|
+
'x-msw-intention': 'invalid',
|
|
90
|
+
}),
|
|
91
|
+
})
|
|
92
|
+
const handlers: Array<RequestHandler> = [
|
|
93
|
+
http.get('/user', () => {
|
|
94
|
+
return HttpResponse.text('hello world')
|
|
95
|
+
}),
|
|
96
|
+
]
|
|
97
|
+
|
|
98
|
+
const result = await handleRequest(
|
|
99
|
+
request,
|
|
100
|
+
uuidv4(),
|
|
101
|
+
handlers,
|
|
102
|
+
options,
|
|
103
|
+
emitter,
|
|
104
|
+
handleRequestOptions,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
expect(result).not.toBeUndefined()
|
|
108
|
+
expect(options.onUnhandledRequest).not.toHaveBeenCalled()
|
|
109
|
+
expect(handleRequestOptions.onMockedResponse).toHaveBeenCalledTimes(1)
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
test('reports request as unhandled when it has no matching request handlers', async () => {
|
|
113
|
+
const { emitter, events } = setup()
|
|
114
|
+
|
|
115
|
+
const requestId = uuidv4()
|
|
116
|
+
const request = new Request(new URL('http://localhost/user'))
|
|
117
|
+
const handlers: Array<RequestHandler> = []
|
|
118
|
+
|
|
119
|
+
const result = await handleRequest(
|
|
120
|
+
request,
|
|
121
|
+
requestId,
|
|
122
|
+
handlers,
|
|
123
|
+
options,
|
|
124
|
+
emitter,
|
|
125
|
+
handleRequestOptions,
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
expect(result).toBeUndefined()
|
|
129
|
+
expect(events).toEqual([
|
|
130
|
+
['request:start', { request, requestId }],
|
|
131
|
+
['request:unhandled', { request, requestId }],
|
|
132
|
+
['request:end', { request, requestId }],
|
|
133
|
+
])
|
|
134
|
+
expect(options.onUnhandledRequest).toHaveBeenNthCalledWith(1, request, {
|
|
135
|
+
warning: expect.any(Function),
|
|
136
|
+
error: expect.any(Function),
|
|
137
|
+
})
|
|
138
|
+
expect(handleRequestOptions.onPassthroughResponse).toHaveBeenNthCalledWith(
|
|
139
|
+
1,
|
|
140
|
+
request,
|
|
141
|
+
)
|
|
142
|
+
expect(handleRequestOptions.onMockedResponse).not.toHaveBeenCalled()
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
test('returns undefined on a request handler that returns no response', async () => {
|
|
146
|
+
const { emitter, events } = setup()
|
|
147
|
+
|
|
148
|
+
const requestId = uuidv4()
|
|
149
|
+
const request = new Request(new URL('http://localhost/user'))
|
|
150
|
+
const handlers: Array<RequestHandler> = [
|
|
151
|
+
http.get('/user', () => {
|
|
152
|
+
// Intentionally blank response resolver.
|
|
153
|
+
return
|
|
154
|
+
}),
|
|
155
|
+
]
|
|
156
|
+
|
|
157
|
+
const result = await handleRequest(
|
|
158
|
+
request,
|
|
159
|
+
requestId,
|
|
160
|
+
handlers,
|
|
161
|
+
options,
|
|
162
|
+
emitter,
|
|
163
|
+
handleRequestOptions,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
expect(result).toBeUndefined()
|
|
167
|
+
expect(events).toEqual([
|
|
168
|
+
['request:start', { request, requestId }],
|
|
169
|
+
['request:end', { request, requestId }],
|
|
170
|
+
])
|
|
171
|
+
expect(options.onUnhandledRequest).not.toHaveBeenCalled()
|
|
172
|
+
expect(handleRequestOptions.onPassthroughResponse).toHaveBeenNthCalledWith(
|
|
173
|
+
1,
|
|
174
|
+
request,
|
|
175
|
+
)
|
|
176
|
+
expect(handleRequestOptions.onMockedResponse).not.toHaveBeenCalled()
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* @note Returning undefined from a resolver no longer prints a warning.
|
|
180
|
+
*/
|
|
181
|
+
expect(console.warn).toHaveBeenCalledTimes(0)
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
test('returns the mocked response for a request with a matching request handler', async () => {
|
|
185
|
+
const { emitter, events } = setup()
|
|
186
|
+
|
|
187
|
+
const requestId = uuidv4()
|
|
188
|
+
const request = new Request(new URL('http://localhost/user'))
|
|
189
|
+
const mockedResponse = HttpResponse.json({ firstName: 'John' })
|
|
190
|
+
const handlers: Array<RequestHandler> = [
|
|
191
|
+
http.get('/user', () => {
|
|
192
|
+
return mockedResponse
|
|
193
|
+
}),
|
|
194
|
+
]
|
|
195
|
+
const lookupResult = {
|
|
196
|
+
handler: handlers[0],
|
|
197
|
+
response: mockedResponse,
|
|
198
|
+
request,
|
|
199
|
+
parsedResult: {
|
|
200
|
+
match: { matches: true, params: {} },
|
|
201
|
+
cookies: {},
|
|
202
|
+
},
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const result = await handleRequest(
|
|
206
|
+
request,
|
|
207
|
+
requestId,
|
|
208
|
+
handlers,
|
|
209
|
+
options,
|
|
210
|
+
emitter,
|
|
211
|
+
handleRequestOptions,
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
expect(result).toEqual(mockedResponse)
|
|
215
|
+
expect(events).toEqual([
|
|
216
|
+
['request:start', { request, requestId }],
|
|
217
|
+
['request:match', { request, requestId }],
|
|
218
|
+
['request:end', { request, requestId }],
|
|
219
|
+
])
|
|
220
|
+
expect(handleRequestOptions.onPassthroughResponse).not.toHaveBeenCalled()
|
|
221
|
+
|
|
222
|
+
expect(handleRequestOptions.onMockedResponse).toHaveBeenCalledTimes(1)
|
|
223
|
+
const [mockedResponseParam, lookupResultParam] =
|
|
224
|
+
handleRequestOptions.onMockedResponse.mock.calls[0]
|
|
225
|
+
|
|
226
|
+
expect(mockedResponseParam.status).toBe(mockedResponse.status)
|
|
227
|
+
expect(mockedResponseParam.statusText).toBe(mockedResponse.statusText)
|
|
228
|
+
expect(Object.fromEntries(mockedResponseParam.headers.entries())).toEqual(
|
|
229
|
+
Object.fromEntries(mockedResponse.headers.entries()),
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
expect(lookupResultParam).toEqual({
|
|
233
|
+
handler: lookupResult.handler,
|
|
234
|
+
parsedResult: lookupResult.parsedResult,
|
|
235
|
+
response: expect.objectContaining({
|
|
236
|
+
status: lookupResult.response.status,
|
|
237
|
+
statusText: lookupResult.response.statusText,
|
|
238
|
+
}),
|
|
239
|
+
})
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
test('returns a transformed response if the "transformResponse" option is provided', async () => {
|
|
243
|
+
const { emitter, events } = setup()
|
|
244
|
+
|
|
245
|
+
const requestId = uuidv4()
|
|
246
|
+
const request = new Request(new URL('http://localhost/user'))
|
|
247
|
+
const mockedResponse = HttpResponse.json({ firstName: 'John' })
|
|
248
|
+
const handlers: Array<RequestHandler> = [
|
|
249
|
+
http.get('/user', () => {
|
|
250
|
+
return mockedResponse
|
|
251
|
+
}),
|
|
252
|
+
]
|
|
253
|
+
const transformResponseImpelemntation = (response: Response): Response => {
|
|
254
|
+
return new Response('transformed', response)
|
|
255
|
+
}
|
|
256
|
+
const transformResponse = vi
|
|
257
|
+
.fn<[Response], Response>()
|
|
258
|
+
.mockImplementation(transformResponseImpelemntation)
|
|
259
|
+
const finalResponse = transformResponseImpelemntation(mockedResponse)
|
|
260
|
+
const lookupResult = {
|
|
261
|
+
handler: handlers[0],
|
|
262
|
+
response: mockedResponse,
|
|
263
|
+
request,
|
|
264
|
+
parsedResult: {
|
|
265
|
+
match: { matches: true, params: {} },
|
|
266
|
+
cookies: {},
|
|
267
|
+
},
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const result = await handleRequest(
|
|
271
|
+
request,
|
|
272
|
+
requestId,
|
|
273
|
+
handlers,
|
|
274
|
+
options,
|
|
275
|
+
emitter,
|
|
276
|
+
{
|
|
277
|
+
...handleRequestOptions,
|
|
278
|
+
transformResponse,
|
|
279
|
+
},
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
expect(result?.status).toEqual(finalResponse.status)
|
|
283
|
+
expect(result?.statusText).toEqual(finalResponse.statusText)
|
|
284
|
+
expect(Object.fromEntries(result!.headers.entries())).toEqual(
|
|
285
|
+
Object.fromEntries(mockedResponse.headers.entries()),
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
expect(events).toEqual([
|
|
289
|
+
['request:start', { request, requestId }],
|
|
290
|
+
['request:match', { request, requestId }],
|
|
291
|
+
['request:end', { request, requestId }],
|
|
292
|
+
])
|
|
293
|
+
expect(handleRequestOptions.onPassthroughResponse).not.toHaveBeenCalled()
|
|
294
|
+
|
|
295
|
+
expect(transformResponse).toHaveBeenCalledTimes(1)
|
|
296
|
+
const [responseParam] = transformResponse.mock.calls[0]
|
|
297
|
+
|
|
298
|
+
expect(responseParam.status).toBe(mockedResponse.status)
|
|
299
|
+
expect(responseParam.statusText).toBe(mockedResponse.statusText)
|
|
300
|
+
expect(Object.fromEntries(responseParam.headers.entries())).toEqual(
|
|
301
|
+
Object.fromEntries(mockedResponse.headers.entries()),
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
expect(handleRequestOptions.onMockedResponse).toHaveBeenCalledTimes(1)
|
|
305
|
+
const [mockedResponseParam, lookupResultParam] =
|
|
306
|
+
handleRequestOptions.onMockedResponse.mock.calls[0]
|
|
307
|
+
|
|
308
|
+
expect(mockedResponseParam.status).toBe(finalResponse.status)
|
|
309
|
+
expect(mockedResponseParam.statusText).toBe(finalResponse.statusText)
|
|
310
|
+
expect(Object.fromEntries(mockedResponseParam.headers.entries())).toEqual(
|
|
311
|
+
Object.fromEntries(mockedResponse.headers.entries()),
|
|
312
|
+
)
|
|
313
|
+
expect(await mockedResponseParam.text()).toBe('transformed')
|
|
314
|
+
|
|
315
|
+
expect(lookupResultParam).toEqual({
|
|
316
|
+
handler: lookupResult.handler,
|
|
317
|
+
parsedResult: lookupResult.parsedResult,
|
|
318
|
+
response: expect.objectContaining({
|
|
319
|
+
status: lookupResult.response.status,
|
|
320
|
+
statusText: lookupResult.response.statusText,
|
|
321
|
+
}),
|
|
322
|
+
})
|
|
323
|
+
})
|
|
324
|
+
|
|
325
|
+
it('returns undefined without warning on a passthrough request', async () => {
|
|
326
|
+
const { emitter, events } = setup()
|
|
327
|
+
|
|
328
|
+
const requestId = uuidv4()
|
|
329
|
+
const request = new Request(new URL('http://localhost/user'))
|
|
330
|
+
const handlers: Array<RequestHandler> = [
|
|
331
|
+
http.get('/user', () => {
|
|
332
|
+
return passthrough()
|
|
333
|
+
}),
|
|
334
|
+
]
|
|
335
|
+
|
|
336
|
+
const result = await handleRequest(
|
|
337
|
+
request,
|
|
338
|
+
requestId,
|
|
339
|
+
handlers,
|
|
340
|
+
options,
|
|
341
|
+
emitter,
|
|
342
|
+
handleRequestOptions,
|
|
343
|
+
)
|
|
344
|
+
|
|
345
|
+
expect(result).toBeUndefined()
|
|
346
|
+
expect(events).toEqual([
|
|
347
|
+
['request:start', { request, requestId }],
|
|
348
|
+
['request:end', { request, requestId }],
|
|
349
|
+
])
|
|
350
|
+
expect(options.onUnhandledRequest).not.toHaveBeenCalled()
|
|
351
|
+
expect(handleRequestOptions.onPassthroughResponse).toHaveBeenNthCalledWith(
|
|
352
|
+
1,
|
|
353
|
+
request,
|
|
354
|
+
)
|
|
355
|
+
expect(handleRequestOptions.onMockedResponse).not.toHaveBeenCalled()
|
|
356
|
+
})
|
|
357
|
+
|
|
358
|
+
it('marks the first matching one-time handler as used', async () => {
|
|
359
|
+
const { emitter } = setup()
|
|
360
|
+
|
|
361
|
+
const oneTimeHandler = http.get(
|
|
362
|
+
'/resource',
|
|
363
|
+
() => {
|
|
364
|
+
return HttpResponse.text('One-time')
|
|
365
|
+
},
|
|
366
|
+
{ once: true },
|
|
367
|
+
)
|
|
368
|
+
const anotherHandler = http.get('/resource', () => {
|
|
369
|
+
return HttpResponse.text('Another')
|
|
370
|
+
})
|
|
371
|
+
const handlers: Array<RequestHandler> = [oneTimeHandler, anotherHandler]
|
|
372
|
+
|
|
373
|
+
const requestId = uuidv4()
|
|
374
|
+
const request = new Request('http://localhost/resource')
|
|
375
|
+
const firstResult = await handleRequest(
|
|
376
|
+
request,
|
|
377
|
+
requestId,
|
|
378
|
+
handlers,
|
|
379
|
+
options,
|
|
380
|
+
emitter,
|
|
381
|
+
handleRequestOptions,
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
expect(await firstResult?.text()).toBe('One-time')
|
|
385
|
+
expect(oneTimeHandler.isUsed).toBe(true)
|
|
386
|
+
expect(anotherHandler.isUsed).toBe(false)
|
|
387
|
+
|
|
388
|
+
const secondResult = await handleRequest(
|
|
389
|
+
request,
|
|
390
|
+
requestId,
|
|
391
|
+
handlers,
|
|
392
|
+
options,
|
|
393
|
+
emitter,
|
|
394
|
+
handleRequestOptions,
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
expect(await secondResult?.text()).toBe('Another')
|
|
398
|
+
expect(anotherHandler.isUsed).toBe(true)
|
|
399
|
+
expect(oneTimeHandler.isUsed).toBe(true)
|
|
400
|
+
})
|
|
401
|
+
|
|
402
|
+
it('does not mark non-matching one-time handlers as used', async () => {
|
|
403
|
+
const { emitter } = setup()
|
|
404
|
+
|
|
405
|
+
const oneTimeHandler = http.get(
|
|
406
|
+
'/resource',
|
|
407
|
+
() => {
|
|
408
|
+
return HttpResponse.text('One-time')
|
|
409
|
+
},
|
|
410
|
+
{ once: true },
|
|
411
|
+
)
|
|
412
|
+
const anotherHandler = http.get(
|
|
413
|
+
'/another',
|
|
414
|
+
() => {
|
|
415
|
+
return HttpResponse.text('Another')
|
|
416
|
+
},
|
|
417
|
+
{ once: true },
|
|
418
|
+
)
|
|
419
|
+
const handlers: Array<RequestHandler> = [oneTimeHandler, anotherHandler]
|
|
420
|
+
|
|
421
|
+
const requestId = uuidv4()
|
|
422
|
+
const firstResult = await handleRequest(
|
|
423
|
+
new Request('http://localhost/another'),
|
|
424
|
+
requestId,
|
|
425
|
+
handlers,
|
|
426
|
+
options,
|
|
427
|
+
emitter,
|
|
428
|
+
handleRequestOptions,
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
expect(await firstResult?.text()).toBe('Another')
|
|
432
|
+
expect(oneTimeHandler.isUsed).toBe(false)
|
|
433
|
+
expect(anotherHandler.isUsed).toBe(true)
|
|
434
|
+
|
|
435
|
+
const secondResult = await handleRequest(
|
|
436
|
+
new Request('http://localhost/resource'),
|
|
437
|
+
requestId,
|
|
438
|
+
handlers,
|
|
439
|
+
options,
|
|
440
|
+
emitter,
|
|
441
|
+
handleRequestOptions,
|
|
442
|
+
)
|
|
443
|
+
|
|
444
|
+
expect(await secondResult?.text()).toBe('One-time')
|
|
445
|
+
expect(anotherHandler.isUsed).toBe(true)
|
|
446
|
+
expect(oneTimeHandler.isUsed).toBe(true)
|
|
447
|
+
})
|
|
448
|
+
|
|
449
|
+
it('handles parallel requests with one-time handlers', async () => {
|
|
450
|
+
const { emitter } = setup()
|
|
451
|
+
|
|
452
|
+
const oneTimeHandler = http.get(
|
|
453
|
+
'/resource',
|
|
454
|
+
() => {
|
|
455
|
+
return HttpResponse.text('One-time')
|
|
456
|
+
},
|
|
457
|
+
{ once: true },
|
|
458
|
+
)
|
|
459
|
+
const anotherHandler = http.get('/resource', () => {
|
|
460
|
+
return HttpResponse.text('Another')
|
|
461
|
+
})
|
|
462
|
+
const handlers: Array<RequestHandler> = [oneTimeHandler, anotherHandler]
|
|
463
|
+
|
|
464
|
+
const requestId = uuidv4()
|
|
465
|
+
const request = new Request('http://localhost/resource')
|
|
466
|
+
const firstResultPromise = handleRequest(
|
|
467
|
+
request,
|
|
468
|
+
requestId,
|
|
469
|
+
handlers,
|
|
470
|
+
options,
|
|
471
|
+
emitter,
|
|
472
|
+
handleRequestOptions,
|
|
473
|
+
)
|
|
474
|
+
const secondResultPromise = handleRequest(
|
|
475
|
+
request,
|
|
476
|
+
requestId,
|
|
477
|
+
handlers,
|
|
478
|
+
options,
|
|
479
|
+
emitter,
|
|
480
|
+
handleRequestOptions,
|
|
481
|
+
)
|
|
482
|
+
|
|
483
|
+
const firstResult = await firstResultPromise
|
|
484
|
+
const secondResult = await secondResultPromise
|
|
485
|
+
|
|
486
|
+
expect(await firstResult?.text()).toBe('One-time')
|
|
487
|
+
expect(await secondResult?.text()).toBe('Another')
|
|
488
|
+
expect(oneTimeHandler.isUsed).toBe(true)
|
|
489
|
+
expect(anotherHandler.isUsed).toBe(true)
|
|
490
|
+
})
|
|
491
|
+
|
|
492
|
+
describe('[Private] - resolutionContext - used for extensions', () => {
|
|
493
|
+
describe('#baseUrl', () => {
|
|
494
|
+
test('when defined, handle requests to that base url only defining pathnames in the handler', async () => {
|
|
495
|
+
const { emitter } = setup()
|
|
496
|
+
|
|
497
|
+
const baseUrl = 'http://this-base-url-works.com'
|
|
498
|
+
const handleRequestOptionsWithBaseUrl: HandleRequestOptions = {
|
|
499
|
+
...handleRequestOptions,
|
|
500
|
+
resolutionContext: { baseUrl },
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
const handler = http.get('/resource', () => {
|
|
504
|
+
return HttpResponse.text('Mocked response')
|
|
505
|
+
})
|
|
506
|
+
|
|
507
|
+
const handlers: Array<RequestHandler> = [handler]
|
|
508
|
+
|
|
509
|
+
const requestId = uuidv4()
|
|
510
|
+
const request = new Request(new URL('/resource', baseUrl))
|
|
511
|
+
const response = await handleRequest(
|
|
512
|
+
request,
|
|
513
|
+
requestId,
|
|
514
|
+
handlers,
|
|
515
|
+
options,
|
|
516
|
+
emitter,
|
|
517
|
+
handleRequestOptionsWithBaseUrl,
|
|
518
|
+
)
|
|
519
|
+
|
|
520
|
+
expect(await response?.text()).toBe('Mocked response')
|
|
521
|
+
})
|
|
522
|
+
|
|
523
|
+
test('when defined, do not handle requests to different base urls when defining pathnames in the handler', async () => {
|
|
524
|
+
const { emitter } = setup()
|
|
525
|
+
|
|
526
|
+
const baseUrl = 'http://this-base-url-works.com'
|
|
527
|
+
const handleRequestOptionsWithBaseUrl: HandleRequestOptions = {
|
|
528
|
+
...handleRequestOptions,
|
|
529
|
+
resolutionContext: { baseUrl },
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
const handler = http.get('/resource', () => {
|
|
533
|
+
return HttpResponse.text('Mocked response')
|
|
534
|
+
})
|
|
535
|
+
|
|
536
|
+
const handlers: Array<RequestHandler> = [handler]
|
|
537
|
+
|
|
538
|
+
const requestId = uuidv4()
|
|
539
|
+
const request = new Request(
|
|
540
|
+
new URL('/resource', `http://not-the-base-url.com`),
|
|
541
|
+
)
|
|
542
|
+
const response = await handleRequest(
|
|
543
|
+
request,
|
|
544
|
+
requestId,
|
|
545
|
+
handlers,
|
|
546
|
+
options,
|
|
547
|
+
emitter,
|
|
548
|
+
handleRequestOptionsWithBaseUrl,
|
|
549
|
+
)
|
|
550
|
+
|
|
551
|
+
expect(response).toBeUndefined()
|
|
552
|
+
})
|
|
553
|
+
})
|
|
554
|
+
})
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { until } from '@open-draft/until'
|
|
2
|
+
import { Emitter } from 'strict-event-emitter'
|
|
3
|
+
import { RequestHandler } from '../handlers/RequestHandler'
|
|
4
|
+
import { LifeCycleEventsMap, SharedOptions } from '../sharedOptions'
|
|
5
|
+
import { RequiredDeep } from '../typeUtils'
|
|
6
|
+
import { ResponseLookupResult, getResponse } from './getResponse'
|
|
7
|
+
import { onUnhandledRequest } from './request/onUnhandledRequest'
|
|
8
|
+
import { readResponseCookies } from './request/readResponseCookies'
|
|
9
|
+
|
|
10
|
+
export interface HandleRequestOptions {
|
|
11
|
+
/**
|
|
12
|
+
* `resolutionContext` is not part of the general public api
|
|
13
|
+
* but is exposed to aid in creating extensions like
|
|
14
|
+
* `@mswjs/http-middleware`.
|
|
15
|
+
*/
|
|
16
|
+
resolutionContext?: {
|
|
17
|
+
/**
|
|
18
|
+
* A base url to use when resolving relative urls.
|
|
19
|
+
* @note This is primarily used by the `@mswjs/http-middleware`
|
|
20
|
+
* to resolve relative urls in the context of the running server
|
|
21
|
+
*/
|
|
22
|
+
baseUrl?: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Transforms a `MockedResponse` instance returned from a handler
|
|
27
|
+
* to a response instance supported by the lower tooling (i.e. interceptors).
|
|
28
|
+
*/
|
|
29
|
+
transformResponse?(response: Response): Response
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Invoked whenever a request is performed as-is.
|
|
33
|
+
*/
|
|
34
|
+
onPassthroughResponse?(request: Request): void
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Invoked when the mocked response is ready to be sent.
|
|
38
|
+
*/
|
|
39
|
+
onMockedResponse?(
|
|
40
|
+
response: Response,
|
|
41
|
+
handler: RequiredDeep<ResponseLookupResult>,
|
|
42
|
+
): void
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export async function handleRequest(
|
|
46
|
+
request: Request,
|
|
47
|
+
requestId: string,
|
|
48
|
+
handlers: Array<RequestHandler>,
|
|
49
|
+
options: RequiredDeep<SharedOptions>,
|
|
50
|
+
emitter: Emitter<LifeCycleEventsMap>,
|
|
51
|
+
handleRequestOptions?: HandleRequestOptions,
|
|
52
|
+
): Promise<Response | undefined> {
|
|
53
|
+
emitter.emit('request:start', { request, requestId })
|
|
54
|
+
|
|
55
|
+
// Perform bypassed requests (i.e. issued via "ctx.fetch") as-is.
|
|
56
|
+
if (request.headers.get('x-msw-intention') === 'bypass') {
|
|
57
|
+
emitter.emit('request:end', { request, requestId })
|
|
58
|
+
handleRequestOptions?.onPassthroughResponse?.(request)
|
|
59
|
+
return
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Resolve a mocked response from the list of request handlers.
|
|
63
|
+
const lookupResult = await until(() => {
|
|
64
|
+
return getResponse(
|
|
65
|
+
request,
|
|
66
|
+
handlers,
|
|
67
|
+
handleRequestOptions?.resolutionContext,
|
|
68
|
+
)
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
if (lookupResult.error) {
|
|
72
|
+
// Allow developers to react to unhandled exceptions in request handlers.
|
|
73
|
+
emitter.emit('unhandledException', {
|
|
74
|
+
error: lookupResult.error,
|
|
75
|
+
request,
|
|
76
|
+
requestId,
|
|
77
|
+
})
|
|
78
|
+
throw lookupResult.error
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// If the handler lookup returned nothing, no request handler was found
|
|
82
|
+
// matching this request. Report the request as unhandled.
|
|
83
|
+
if (!lookupResult.data) {
|
|
84
|
+
await onUnhandledRequest(request, handlers, options.onUnhandledRequest)
|
|
85
|
+
emitter.emit('request:unhandled', { request, requestId })
|
|
86
|
+
emitter.emit('request:end', { request, requestId })
|
|
87
|
+
handleRequestOptions?.onPassthroughResponse?.(request)
|
|
88
|
+
return
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const { response } = lookupResult.data
|
|
92
|
+
|
|
93
|
+
// When the handled request returned no mocked response, warn the developer,
|
|
94
|
+
// as it may be an oversight on their part. Perform the request as-is.
|
|
95
|
+
if (!response) {
|
|
96
|
+
emitter.emit('request:end', { request, requestId })
|
|
97
|
+
handleRequestOptions?.onPassthroughResponse?.(request)
|
|
98
|
+
return
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Perform the request as-is when the developer explicitly returned "req.passthrough()".
|
|
102
|
+
// This produces no warning as the request was handled.
|
|
103
|
+
if (
|
|
104
|
+
response.status === 302 &&
|
|
105
|
+
response.headers.get('x-msw-intention') === 'passthrough'
|
|
106
|
+
) {
|
|
107
|
+
emitter.emit('request:end', { request, requestId })
|
|
108
|
+
handleRequestOptions?.onPassthroughResponse?.(request)
|
|
109
|
+
return
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Store all the received response cookies in the virtual cookie store.
|
|
113
|
+
readResponseCookies(request, response)
|
|
114
|
+
|
|
115
|
+
emitter.emit('request:match', { request, requestId })
|
|
116
|
+
|
|
117
|
+
const requiredLookupResult =
|
|
118
|
+
lookupResult.data as RequiredDeep<ResponseLookupResult>
|
|
119
|
+
|
|
120
|
+
const transformedResponse =
|
|
121
|
+
handleRequestOptions?.transformResponse?.(response) ||
|
|
122
|
+
(response as any as Response)
|
|
123
|
+
|
|
124
|
+
handleRequestOptions?.onMockedResponse?.(
|
|
125
|
+
transformedResponse,
|
|
126
|
+
requiredLookupResult,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
emitter.emit('request:end', { request, requestId })
|
|
130
|
+
|
|
131
|
+
return transformedResponse
|
|
132
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type DisposableSubscription = () => Promise<void> | void
|
|
2
|
+
|
|
3
|
+
export class Disposable {
|
|
4
|
+
protected subscriptions: Array<DisposableSubscription> = []
|
|
5
|
+
|
|
6
|
+
public async dispose() {
|
|
7
|
+
await Promise.all(this.subscriptions.map((subscription) => subscription()))
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { invariant } from 'outvariant'
|
|
2
|
+
import { devUtils } from './devUtils'
|
|
3
|
+
|
|
4
|
+
export function checkGlobals() {
|
|
5
|
+
/**
|
|
6
|
+
* MSW expects the "URL" constructor to be defined.
|
|
7
|
+
* It's not present in React Native so suggest a polyfill
|
|
8
|
+
* instead of failing silently.
|
|
9
|
+
* @see https://github.com/mswjs/msw/issues/1408
|
|
10
|
+
*/
|
|
11
|
+
invariant(
|
|
12
|
+
typeof URL !== 'undefined',
|
|
13
|
+
devUtils.formatMessage(
|
|
14
|
+
`Global "URL" class is not defined. This likely means that you're running MSW in an environment that doesn't support all Node.js standard API (e.g. React Native). If that's the case, please use an appropriate polyfill for the "URL" class, like "react-native-url-polyfill".`,
|
|
15
|
+
),
|
|
16
|
+
)
|
|
17
|
+
}
|