msw 2.0.12 → 2.0.14
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-JB4bsrLF.d.ts} +4 -2
- package/lib/core/GraphQLHandler-mT-MmgeB.d.mts +99 -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-YiqamK0M.d.mts +179 -0
- package/lib/core/{RequestHandler-25f9cfd1.d.ts → RequestHandler-rmY-HeFN.d.ts} +4 -4
- 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 +111 -0
- package/lib/core/graphql.d.ts +11 -9
- 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 +8 -6
- package/lib/core/handlers/GraphQLHandler.js.map +1 -0
- package/lib/core/handlers/GraphQLHandler.mjs +8 -6
- 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 +28 -0
- package/lib/core/http.d.ts +13 -11
- 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 +4 -4
- 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 +25 -23
- 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 +146 -0
- package/src/core/handlers/GraphQLHandler.test.ts +835 -0
- package/src/core/handlers/GraphQLHandler.ts +266 -0
- package/src/core/handlers/HttpHandler.test.ts +218 -0
- package/src/core/handlers/HttpHandler.ts +169 -0
- package/src/core/handlers/RequestHandler.ts +343 -0
- package/src/core/http.test.ts +15 -0
- package/src/core/http.ts +64 -0
- package/src/core/index.ts +59 -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,23 @@
|
|
|
1
|
+
import type { SetupWorkerInternalContext } from '../setupWorker/glossary'
|
|
2
|
+
|
|
3
|
+
export async function requestIntegrityCheck(
|
|
4
|
+
context: SetupWorkerInternalContext,
|
|
5
|
+
serviceWorker: ServiceWorker,
|
|
6
|
+
): Promise<ServiceWorker> {
|
|
7
|
+
// Signal Service Worker to report back its integrity
|
|
8
|
+
context.workerChannel.send('INTEGRITY_CHECK_REQUEST')
|
|
9
|
+
|
|
10
|
+
const { payload: actualChecksum } = await context.events.once(
|
|
11
|
+
'INTEGRITY_CHECK_RESPONSE',
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
// Compare the response from the Service Worker and the
|
|
15
|
+
// global variable set during the build.
|
|
16
|
+
if (actualChecksum !== SERVICE_WORKER_CHECKSUM) {
|
|
17
|
+
throw new Error(
|
|
18
|
+
`Currently active Service Worker (${actualChecksum}) is behind the latest published one (${SERVICE_WORKER_CHECKSUM}).`,
|
|
19
|
+
)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return serviceWorker
|
|
23
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns a boolean indicating whether the current browser
|
|
3
|
+
* supports `ReadableStream` as a `Transferable` when posting
|
|
4
|
+
* messages.
|
|
5
|
+
*/
|
|
6
|
+
export function supportsReadableStreamTransfer() {
|
|
7
|
+
try {
|
|
8
|
+
const stream = new ReadableStream({
|
|
9
|
+
start: (controller) => controller.close(),
|
|
10
|
+
})
|
|
11
|
+
const message = new MessageChannel()
|
|
12
|
+
message.port1.postMessage(stream, [stream])
|
|
13
|
+
return true
|
|
14
|
+
} catch (error) {
|
|
15
|
+
return false
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @vitest-environment node
|
|
3
|
+
*/
|
|
4
|
+
import { TextEncoder } from 'util'
|
|
5
|
+
import { HttpResponse } from './HttpResponse'
|
|
6
|
+
|
|
7
|
+
it('creates a plain response', async () => {
|
|
8
|
+
const response = new HttpResponse(null, { status: 301 })
|
|
9
|
+
expect(response.status).toBe(301)
|
|
10
|
+
expect(response.statusText).toBe('Moved Permanently')
|
|
11
|
+
expect(response.body).toBe(null)
|
|
12
|
+
expect(await response.text()).toBe('')
|
|
13
|
+
expect(Object.fromEntries(response.headers.entries())).toEqual({})
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
describe('HttpResponse.text()', () => {
|
|
17
|
+
it('creates a text response', async () => {
|
|
18
|
+
const response = HttpResponse.text('hello world', { status: 201 })
|
|
19
|
+
|
|
20
|
+
expect(response.status).toBe(201)
|
|
21
|
+
expect(response.statusText).toBe('Created')
|
|
22
|
+
expect(response.body).toBeInstanceOf(ReadableStream)
|
|
23
|
+
expect(await response.text()).toBe('hello world')
|
|
24
|
+
expect(Object.fromEntries(response.headers.entries())).toEqual({
|
|
25
|
+
'content-type': 'text/plain',
|
|
26
|
+
})
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
it('allows overriding the "Content-Type" response header', async () => {
|
|
30
|
+
const response = HttpResponse.text('hello world', {
|
|
31
|
+
headers: {
|
|
32
|
+
'Content-Type': 'text/plain; charset=utf-8',
|
|
33
|
+
},
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
expect(response.status).toBe(200)
|
|
37
|
+
expect(response.statusText).toBe('OK')
|
|
38
|
+
expect(response.body).toBeInstanceOf(ReadableStream)
|
|
39
|
+
expect(await response.text()).toBe('hello world')
|
|
40
|
+
expect(Object.fromEntries(response.headers.entries())).toEqual({
|
|
41
|
+
'content-type': 'text/plain; charset=utf-8',
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
describe('HttpResponse.json()', () => {
|
|
47
|
+
it('creates a json response given an object', async () => {
|
|
48
|
+
const response = HttpResponse.json({ firstName: 'John' })
|
|
49
|
+
|
|
50
|
+
expect(response.status).toBe(200)
|
|
51
|
+
expect(response.statusText).toBe('OK')
|
|
52
|
+
expect(response.body).toBeInstanceOf(ReadableStream)
|
|
53
|
+
expect(await response.json()).toEqual({ firstName: 'John' })
|
|
54
|
+
expect(Object.fromEntries(response.headers.entries())).toEqual({
|
|
55
|
+
'content-type': 'application/json',
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('creates a json response given an array', async () => {
|
|
60
|
+
const response = HttpResponse.json([1, 2, 3])
|
|
61
|
+
|
|
62
|
+
expect(response.status).toBe(200)
|
|
63
|
+
expect(response.statusText).toBe('OK')
|
|
64
|
+
expect(response.body).toBeInstanceOf(ReadableStream)
|
|
65
|
+
expect(await response.json()).toEqual([1, 2, 3])
|
|
66
|
+
expect(Object.fromEntries(response.headers.entries())).toEqual({
|
|
67
|
+
'content-type': 'application/json',
|
|
68
|
+
})
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
it('creates a json response given a plain string', async () => {
|
|
72
|
+
const response = HttpResponse.json(`"hello"`)
|
|
73
|
+
|
|
74
|
+
expect(response.status).toBe(200)
|
|
75
|
+
expect(response.statusText).toBe('OK')
|
|
76
|
+
expect(response.body).toBeInstanceOf(ReadableStream)
|
|
77
|
+
expect(await response.json()).toBe(`"hello"`)
|
|
78
|
+
expect(Object.fromEntries(response.headers.entries())).toEqual({
|
|
79
|
+
'content-type': 'application/json',
|
|
80
|
+
})
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it('creates a json response given a number', async () => {
|
|
84
|
+
const response = HttpResponse.json(123)
|
|
85
|
+
|
|
86
|
+
expect(response.status).toBe(200)
|
|
87
|
+
expect(response.statusText).toBe('OK')
|
|
88
|
+
expect(response.body).toBeInstanceOf(ReadableStream)
|
|
89
|
+
expect(await response.json()).toBe(123)
|
|
90
|
+
expect(Object.fromEntries(response.headers.entries())).toEqual({
|
|
91
|
+
'content-type': 'application/json',
|
|
92
|
+
})
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it('creates a json response given a json ReadableStream', async () => {
|
|
96
|
+
const encoder = new TextEncoder()
|
|
97
|
+
const stream = new ReadableStream({
|
|
98
|
+
start(controller) {
|
|
99
|
+
controller.enqueue(encoder.encode(`{"firstName`))
|
|
100
|
+
controller.enqueue(encoder.encode(`":"John`))
|
|
101
|
+
controller.enqueue(encoder.encode(`"}`))
|
|
102
|
+
controller.close()
|
|
103
|
+
},
|
|
104
|
+
})
|
|
105
|
+
const response = HttpResponse.json(stream)
|
|
106
|
+
|
|
107
|
+
expect(response.status).toBe(200)
|
|
108
|
+
expect(response.statusText).toBe('OK')
|
|
109
|
+
expect(response.body).toBeInstanceOf(ReadableStream)
|
|
110
|
+
// A ReadableStream instance is not a valid body init
|
|
111
|
+
// for the "Response.json()" static method. It gets serialized
|
|
112
|
+
// into a plain object.
|
|
113
|
+
expect(await response.json()).toEqual({})
|
|
114
|
+
expect(Object.fromEntries(response.headers.entries())).toEqual({
|
|
115
|
+
'content-type': 'application/json',
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
it('allows overriding the "Content-Type" response header', async () => {
|
|
120
|
+
const response = HttpResponse.json(
|
|
121
|
+
{ a: 1 },
|
|
122
|
+
{
|
|
123
|
+
headers: {
|
|
124
|
+
'Content-Type': 'application/hal+json',
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
expect(response.status).toBe(200)
|
|
130
|
+
expect(response.statusText).toBe('OK')
|
|
131
|
+
expect(response.body).toBeInstanceOf(ReadableStream)
|
|
132
|
+
expect(await response.json()).toEqual({ a: 1 })
|
|
133
|
+
expect(Object.fromEntries(response.headers.entries())).toEqual({
|
|
134
|
+
'content-type': 'application/hal+json',
|
|
135
|
+
})
|
|
136
|
+
})
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
describe('HttpResponse.xml()', () => {
|
|
140
|
+
it('creates an xml response', async () => {
|
|
141
|
+
const response = HttpResponse.xml('<user name="John" />')
|
|
142
|
+
|
|
143
|
+
expect(response.status).toBe(200)
|
|
144
|
+
expect(response.statusText).toBe('OK')
|
|
145
|
+
expect(response.body).toBeInstanceOf(ReadableStream)
|
|
146
|
+
expect(await response.text()).toBe('<user name="John" />')
|
|
147
|
+
expect(Object.fromEntries(response.headers.entries())).toEqual({
|
|
148
|
+
'content-type': 'text/xml',
|
|
149
|
+
})
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
it('allows overriding the "Content-Type" response header', async () => {
|
|
153
|
+
const response = HttpResponse.xml('<user name="John" />', {
|
|
154
|
+
headers: {
|
|
155
|
+
'Content-Type': 'text/xml; charset=utf-8',
|
|
156
|
+
},
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
expect(response.status).toBe(200)
|
|
160
|
+
expect(response.statusText).toBe('OK')
|
|
161
|
+
expect(response.body).toBeInstanceOf(ReadableStream)
|
|
162
|
+
expect(await response.text()).toBe('<user name="John" />')
|
|
163
|
+
expect(Object.fromEntries(response.headers.entries())).toEqual({
|
|
164
|
+
'content-type': 'text/xml; charset=utf-8',
|
|
165
|
+
})
|
|
166
|
+
})
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
it('creates an array buffer response', async () => {
|
|
170
|
+
const buffer = new TextEncoder().encode('hello world')
|
|
171
|
+
const response = HttpResponse.arrayBuffer(buffer)
|
|
172
|
+
|
|
173
|
+
expect(response.status).toBe(200)
|
|
174
|
+
expect(response.statusText).toBe('OK')
|
|
175
|
+
expect(response.body).toBeInstanceOf(ReadableStream)
|
|
176
|
+
|
|
177
|
+
const responseData = await response.arrayBuffer()
|
|
178
|
+
expect(responseData).toEqual(buffer.buffer)
|
|
179
|
+
expect(Object.fromEntries(response.headers.entries())).toEqual({
|
|
180
|
+
'content-length': '11',
|
|
181
|
+
})
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
it('creates a form data response', async () => {
|
|
185
|
+
const formData = new FormData()
|
|
186
|
+
formData.append('firstName', 'John')
|
|
187
|
+
const response = HttpResponse.formData(formData)
|
|
188
|
+
|
|
189
|
+
expect(response.status).toBe(200)
|
|
190
|
+
expect(response.statusText).toBe('OK')
|
|
191
|
+
expect(response.body).toBeInstanceOf(ReadableStream)
|
|
192
|
+
|
|
193
|
+
const responseData = await response.formData()
|
|
194
|
+
expect(responseData.get('firstName')).toBe('John')
|
|
195
|
+
expect(Object.fromEntries(response.headers.entries())).toEqual({
|
|
196
|
+
'content-type': expect.stringContaining(
|
|
197
|
+
'multipart/form-data; boundary=----',
|
|
198
|
+
),
|
|
199
|
+
})
|
|
200
|
+
})
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import type { DefaultBodyType, JsonBodyType } from './handlers/RequestHandler'
|
|
2
|
+
import {
|
|
3
|
+
decorateResponse,
|
|
4
|
+
normalizeResponseInit,
|
|
5
|
+
} from './utils/HttpResponse/decorators'
|
|
6
|
+
|
|
7
|
+
export interface HttpResponseInit extends ResponseInit {
|
|
8
|
+
type?: ResponseType
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
declare const bodyType: unique symbol
|
|
12
|
+
|
|
13
|
+
export interface StrictRequest<BodyType extends DefaultBodyType>
|
|
14
|
+
extends Request {
|
|
15
|
+
json(): Promise<BodyType>
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Opaque `Response` type that supports strict body type.
|
|
20
|
+
*/
|
|
21
|
+
export interface StrictResponse<BodyType extends DefaultBodyType>
|
|
22
|
+
extends Response {
|
|
23
|
+
readonly [bodyType]: BodyType
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A drop-in replacement for the standard `Response` class
|
|
28
|
+
* to allow additional features, like mocking the response `Set-Cookie` header.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* new HttpResponse('Hello world', { status: 201 })
|
|
32
|
+
* HttpResponse.json({ name: 'John' })
|
|
33
|
+
* HttpResponse.formData(form)
|
|
34
|
+
*
|
|
35
|
+
* @see {@link https://mswjs.io/docs/api/http-response `HttpResponse` API reference}
|
|
36
|
+
*/
|
|
37
|
+
export class HttpResponse extends Response {
|
|
38
|
+
constructor(body?: BodyInit | null, init?: HttpResponseInit) {
|
|
39
|
+
const responseInit = normalizeResponseInit(init)
|
|
40
|
+
super(body, responseInit)
|
|
41
|
+
decorateResponse(this, responseInit)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Create a `Response` with a `Content-Type: "text/plain"` body.
|
|
46
|
+
* @example
|
|
47
|
+
* HttpResponse.text('hello world')
|
|
48
|
+
* HttpResponse.text('Error', { status: 500 })
|
|
49
|
+
*/
|
|
50
|
+
static text<BodyType extends string>(
|
|
51
|
+
body?: BodyType | null,
|
|
52
|
+
init?: HttpResponseInit,
|
|
53
|
+
): StrictResponse<BodyType> {
|
|
54
|
+
const responseInit = normalizeResponseInit(init)
|
|
55
|
+
|
|
56
|
+
if (!responseInit.headers.has('Content-Type')) {
|
|
57
|
+
responseInit.headers.set('Content-Type', 'text/plain')
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return new HttpResponse(body, responseInit) as StrictResponse<BodyType>
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Create a `Response` with a `Content-Type: "application/json"` body.
|
|
65
|
+
* @example
|
|
66
|
+
* HttpResponse.json({ firstName: 'John' })
|
|
67
|
+
* HttpResponse.json({ error: 'Not Authorized' }, { status: 401 })
|
|
68
|
+
*/
|
|
69
|
+
static json<BodyType extends JsonBodyType>(
|
|
70
|
+
body?: BodyType | null,
|
|
71
|
+
init?: HttpResponseInit,
|
|
72
|
+
): StrictResponse<BodyType> {
|
|
73
|
+
const responseInit = normalizeResponseInit(init)
|
|
74
|
+
|
|
75
|
+
if (!responseInit.headers.has('Content-Type')) {
|
|
76
|
+
responseInit.headers.set('Content-Type', 'application/json')
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return new HttpResponse(
|
|
80
|
+
JSON.stringify(body),
|
|
81
|
+
responseInit,
|
|
82
|
+
) as StrictResponse<BodyType>
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Create a `Response` with a `Content-Type: "application/xml"` body.
|
|
87
|
+
* @example
|
|
88
|
+
* HttpResponse.xml(`<user name="John" />`)
|
|
89
|
+
* HttpResponse.xml(`<article id="abc-123" />`, { status: 201 })
|
|
90
|
+
*/
|
|
91
|
+
static xml<BodyType extends string>(
|
|
92
|
+
body?: BodyType | null,
|
|
93
|
+
init?: HttpResponseInit,
|
|
94
|
+
): Response {
|
|
95
|
+
const responseInit = normalizeResponseInit(init)
|
|
96
|
+
|
|
97
|
+
if (!responseInit.headers.has('Content-Type')) {
|
|
98
|
+
responseInit.headers.set('Content-Type', 'text/xml')
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return new HttpResponse(body, responseInit)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Create a `Response` with an `ArrayBuffer` body.
|
|
106
|
+
* @example
|
|
107
|
+
* const buffer = new ArrayBuffer(3)
|
|
108
|
+
* const view = new Uint8Array(buffer)
|
|
109
|
+
* view.set([1, 2, 3])
|
|
110
|
+
*
|
|
111
|
+
* HttpResponse.arrayBuffer(buffer)
|
|
112
|
+
*/
|
|
113
|
+
static arrayBuffer(body?: ArrayBuffer, init?: HttpResponseInit): Response {
|
|
114
|
+
const responseInit = normalizeResponseInit(init)
|
|
115
|
+
|
|
116
|
+
if (body) {
|
|
117
|
+
responseInit.headers.set('Content-Length', body.byteLength.toString())
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return new HttpResponse(body, responseInit)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Create a `Response` with a `FormData` body.
|
|
125
|
+
* @example
|
|
126
|
+
* const data = new FormData()
|
|
127
|
+
* data.set('name', 'Alice')
|
|
128
|
+
*
|
|
129
|
+
* HttpResponse.formData(data)
|
|
130
|
+
*/
|
|
131
|
+
static formData(body?: FormData, init?: HttpResponseInit): Response {
|
|
132
|
+
return new HttpResponse(body, normalizeResponseInit(init))
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { invariant } from 'outvariant'
|
|
2
|
+
import { EventMap, Emitter } from 'strict-event-emitter'
|
|
3
|
+
import {
|
|
4
|
+
RequestHandler,
|
|
5
|
+
RequestHandlerDefaultInfo,
|
|
6
|
+
} from './handlers/RequestHandler'
|
|
7
|
+
import { LifeCycleEventEmitter } from './sharedOptions'
|
|
8
|
+
import { devUtils } from './utils/internal/devUtils'
|
|
9
|
+
import { pipeEvents } from './utils/internal/pipeEvents'
|
|
10
|
+
import { toReadonlyArray } from './utils/internal/toReadonlyArray'
|
|
11
|
+
import { Disposable } from './utils/internal/Disposable'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Generic class for the mock API setup.
|
|
15
|
+
*/
|
|
16
|
+
export abstract class SetupApi<EventsMap extends EventMap> extends Disposable {
|
|
17
|
+
protected initialHandlers: ReadonlyArray<RequestHandler>
|
|
18
|
+
protected currentHandlers: Array<RequestHandler>
|
|
19
|
+
protected readonly emitter: Emitter<EventsMap>
|
|
20
|
+
protected readonly publicEmitter: Emitter<EventsMap>
|
|
21
|
+
|
|
22
|
+
public readonly events: LifeCycleEventEmitter<EventsMap>
|
|
23
|
+
|
|
24
|
+
constructor(...initialHandlers: Array<RequestHandler>) {
|
|
25
|
+
super()
|
|
26
|
+
|
|
27
|
+
invariant(
|
|
28
|
+
this.validateHandlers(initialHandlers),
|
|
29
|
+
devUtils.formatMessage(
|
|
30
|
+
`Failed to apply given request handlers: invalid input. Did you forget to spread the request handlers Array?`,
|
|
31
|
+
),
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
this.initialHandlers = toReadonlyArray(initialHandlers)
|
|
35
|
+
this.currentHandlers = [...initialHandlers]
|
|
36
|
+
|
|
37
|
+
this.emitter = new Emitter<EventsMap>()
|
|
38
|
+
this.publicEmitter = new Emitter<EventsMap>()
|
|
39
|
+
pipeEvents(this.emitter, this.publicEmitter)
|
|
40
|
+
|
|
41
|
+
this.events = this.createLifeCycleEvents()
|
|
42
|
+
|
|
43
|
+
this.subscriptions.push(() => {
|
|
44
|
+
this.emitter.removeAllListeners()
|
|
45
|
+
this.publicEmitter.removeAllListeners()
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private validateHandlers(handlers: ReadonlyArray<RequestHandler>): boolean {
|
|
50
|
+
// Guard against incorrect call signature of the setup API.
|
|
51
|
+
return handlers.every((handler) => !Array.isArray(handler))
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public use(...runtimeHandlers: Array<RequestHandler>): void {
|
|
55
|
+
invariant(
|
|
56
|
+
this.validateHandlers(runtimeHandlers),
|
|
57
|
+
devUtils.formatMessage(
|
|
58
|
+
`Failed to call "use()" with the given request handlers: invalid input. Did you forget to spread the array of request handlers?`,
|
|
59
|
+
),
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
this.currentHandlers.unshift(...runtimeHandlers)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public restoreHandlers(): void {
|
|
66
|
+
this.currentHandlers.forEach((handler) => {
|
|
67
|
+
handler.isUsed = false
|
|
68
|
+
})
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public resetHandlers(...nextHandlers: Array<RequestHandler>): void {
|
|
72
|
+
this.currentHandlers =
|
|
73
|
+
nextHandlers.length > 0 ? [...nextHandlers] : [...this.initialHandlers]
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public listHandlers(): ReadonlyArray<
|
|
77
|
+
RequestHandler<RequestHandlerDefaultInfo, any, any>
|
|
78
|
+
> {
|
|
79
|
+
return toReadonlyArray(this.currentHandlers)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private createLifeCycleEvents(): LifeCycleEventEmitter<EventsMap> {
|
|
83
|
+
return {
|
|
84
|
+
on: (...args: any[]) => {
|
|
85
|
+
return (this.publicEmitter.on as any)(...args)
|
|
86
|
+
},
|
|
87
|
+
removeListener: (...args: any[]) => {
|
|
88
|
+
return (this.publicEmitter.removeListener as any)(...args)
|
|
89
|
+
},
|
|
90
|
+
removeAllListeners: (...args: any[]) => {
|
|
91
|
+
return this.publicEmitter.removeAllListeners(...args)
|
|
92
|
+
},
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @vitest-environment jsdom
|
|
3
|
+
*/
|
|
4
|
+
import { bypass } from './bypass'
|
|
5
|
+
|
|
6
|
+
it('returns bypassed request given a request url string', async () => {
|
|
7
|
+
const request = bypass('https://api.example.com/resource')
|
|
8
|
+
|
|
9
|
+
// Relative URLs are rebased against the current location.
|
|
10
|
+
expect(request.method).toBe('GET')
|
|
11
|
+
expect(request.url).toBe('https://api.example.com/resource')
|
|
12
|
+
expect(Object.fromEntries(request.headers.entries())).toEqual({
|
|
13
|
+
'x-msw-intention': 'bypass',
|
|
14
|
+
})
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
it('returns bypassed request given a request url', async () => {
|
|
18
|
+
const request = bypass(new URL('/resource', 'https://api.example.com'))
|
|
19
|
+
|
|
20
|
+
expect(request.url).toBe('https://api.example.com/resource')
|
|
21
|
+
expect(Object.fromEntries(request.headers)).toEqual({
|
|
22
|
+
'x-msw-intention': 'bypass',
|
|
23
|
+
})
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('returns bypassed request given request instance', async () => {
|
|
27
|
+
const original = new Request('http://localhost/resource', {
|
|
28
|
+
method: 'POST',
|
|
29
|
+
headers: {
|
|
30
|
+
'X-My-Header': 'value',
|
|
31
|
+
},
|
|
32
|
+
body: 'hello world',
|
|
33
|
+
})
|
|
34
|
+
const request = bypass(original)
|
|
35
|
+
|
|
36
|
+
expect(request.method).toBe('POST')
|
|
37
|
+
expect(request.url).toBe('http://localhost/resource')
|
|
38
|
+
|
|
39
|
+
const bypassedRequestBody = await request.text()
|
|
40
|
+
expect(original.bodyUsed).toBe(false)
|
|
41
|
+
|
|
42
|
+
expect(bypassedRequestBody).toEqual(await original.text())
|
|
43
|
+
expect(Object.fromEntries(request.headers.entries())).toEqual({
|
|
44
|
+
...Object.fromEntries(original.headers.entries()),
|
|
45
|
+
'x-msw-intention': 'bypass',
|
|
46
|
+
})
|
|
47
|
+
})
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { invariant } from 'outvariant'
|
|
2
|
+
|
|
3
|
+
export type BypassRequestInput = string | URL | Request
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Creates a `Request` instance that will always be ignored by MSW.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* import { bypass } from 'msw'
|
|
10
|
+
*
|
|
11
|
+
* fetch(bypass('/resource'))
|
|
12
|
+
* fetch(bypass(new URL('/resource', 'https://example.com)))
|
|
13
|
+
* fetch(bypass(new Request('https://example.com/resource')))
|
|
14
|
+
*
|
|
15
|
+
* @see {@link https://mswjs.io/docs/api/bypass `bypass()` API reference}
|
|
16
|
+
*/
|
|
17
|
+
export function bypass(input: BypassRequestInput, init?: RequestInit): Request {
|
|
18
|
+
const request = input instanceof Request ? input : new Request(input, init)
|
|
19
|
+
|
|
20
|
+
invariant(
|
|
21
|
+
!request.bodyUsed,
|
|
22
|
+
'Failed to create a bypassed request to "%s %s": given request instance already has its body read. Make sure to clone the intercepted request if you wish to read its body before bypassing it.',
|
|
23
|
+
request.method,
|
|
24
|
+
request.url,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
const requestClone = request.clone()
|
|
28
|
+
|
|
29
|
+
// Set the internal header that would instruct MSW
|
|
30
|
+
// to bypass this request from any further request matching.
|
|
31
|
+
// Unlike "passthrough()", bypass is meant for performing
|
|
32
|
+
// additional requests within pending request resolution.
|
|
33
|
+
requestClone.headers.set('x-msw-intention', 'bypass')
|
|
34
|
+
|
|
35
|
+
return requestClone
|
|
36
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { isNodeProcess } from 'is-node-process'
|
|
2
|
+
|
|
3
|
+
export const SET_TIMEOUT_MAX_ALLOWED_INT = 2147483647
|
|
4
|
+
export const MIN_SERVER_RESPONSE_TIME = 100
|
|
5
|
+
export const MAX_SERVER_RESPONSE_TIME = 400
|
|
6
|
+
export const NODE_SERVER_RESPONSE_TIME = 5
|
|
7
|
+
|
|
8
|
+
function getRealisticResponseTime(): number {
|
|
9
|
+
if (isNodeProcess()) {
|
|
10
|
+
return NODE_SERVER_RESPONSE_TIME
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return Math.floor(
|
|
14
|
+
Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) +
|
|
15
|
+
MIN_SERVER_RESPONSE_TIME,
|
|
16
|
+
)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type DelayMode = 'real' | 'infinite'
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Delays the response by the given duration (ms).
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* await delay() // emulate realistic server response time
|
|
26
|
+
* await delay(1200) // delay response by 1200ms
|
|
27
|
+
* await delay('infinite') // delay response infinitely
|
|
28
|
+
*
|
|
29
|
+
* @see {@link https://mswjs.io/docs/api/delay `delay()` API reference}
|
|
30
|
+
*/
|
|
31
|
+
export async function delay(
|
|
32
|
+
durationOrMode?: DelayMode | number,
|
|
33
|
+
): Promise<void> {
|
|
34
|
+
let delayTime: number
|
|
35
|
+
|
|
36
|
+
if (typeof durationOrMode === 'string') {
|
|
37
|
+
switch (durationOrMode) {
|
|
38
|
+
case 'infinite': {
|
|
39
|
+
// Using `Infinity` as a delay value executes the response timeout immediately.
|
|
40
|
+
// Instead, use the maximum allowed integer for `setTimeout`.
|
|
41
|
+
delayTime = SET_TIMEOUT_MAX_ALLOWED_INT
|
|
42
|
+
break
|
|
43
|
+
}
|
|
44
|
+
case 'real': {
|
|
45
|
+
delayTime = getRealisticResponseTime()
|
|
46
|
+
break
|
|
47
|
+
}
|
|
48
|
+
default: {
|
|
49
|
+
throw new Error(
|
|
50
|
+
`Failed to delay a response: unknown delay mode "${durationOrMode}". Please make sure you provide one of the supported modes ("real", "infinite") or a number.`,
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
} else if (typeof durationOrMode === 'undefined') {
|
|
55
|
+
// Use random realistic server response time when no explicit delay duration was provided.
|
|
56
|
+
delayTime = getRealisticResponseTime()
|
|
57
|
+
} else {
|
|
58
|
+
// Guard against passing values like `Infinity` or `Number.MAX_VALUE`
|
|
59
|
+
// as the response delay duration. They don't produce the result you may expect.
|
|
60
|
+
if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) {
|
|
61
|
+
throw new Error(
|
|
62
|
+
`Failed to delay a response: provided delay duration (${durationOrMode}) exceeds the maximum allowed duration for "setTimeout" (${SET_TIMEOUT_MAX_ALLOWED_INT}). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the "infinite" delay mode to delay the response indefinitely.`,
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
delayTime = durationOrMode
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return new Promise((resolve) => setTimeout(resolve, delayTime))
|
|
70
|
+
}
|