msw 2.0.11 → 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-907fc607.d.ts → GraphQLHandler-SHlRCcy4.d.ts} +9 -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-50ddea0c.d.ts → RequestHandler-rBDJQrEf.d.ts} +3 -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 +28 -8
- package/lib/core/handlers/GraphQLHandler.js.map +1 -0
- package/lib/core/handlers/GraphQLHandler.mjs +28 -8
- 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 +19 -4
- package/lib/core/handlers/RequestHandler.js.map +1 -0
- package/lib/core/handlers/RequestHandler.mjs +19 -4
- 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 +59 -25
- 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.d.ts +0 -1
- package/lib/native/index.js +1 -3
- package/lib/native/index.js.map +1 -0
- package/lib/native/index.mjs +1 -3
- package/lib/native/index.mjs.map +1 -0
- package/lib/node/index.d.mts +75 -0
- package/lib/node/index.d.ts +1 -2
- package/lib/node/index.js +2 -35
- package/lib/node/index.js.map +1 -0
- package/lib/node/index.mjs +2 -35
- package/lib/node/index.mjs.map +1 -0
- package/package.json +6 -5
- 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,259 @@
|
|
|
1
|
+
import { Emitter } from 'strict-event-emitter'
|
|
2
|
+
import {
|
|
3
|
+
LifeCycleEventEmitter,
|
|
4
|
+
LifeCycleEventsMap,
|
|
5
|
+
SharedOptions,
|
|
6
|
+
} from '~/core/sharedOptions'
|
|
7
|
+
import { ServiceWorkerMessage } from './start/utils/createMessageChannel'
|
|
8
|
+
import {
|
|
9
|
+
RequestHandler,
|
|
10
|
+
RequestHandlerDefaultInfo,
|
|
11
|
+
} from '~/core/handlers/RequestHandler'
|
|
12
|
+
import type { HttpRequestEventMap, Interceptor } from '@mswjs/interceptors'
|
|
13
|
+
import { Path } from '~/core/utils/matching/matchRequestUrl'
|
|
14
|
+
import { RequiredDeep } from '~/core/typeUtils'
|
|
15
|
+
|
|
16
|
+
export type ResolvedPath = Path | URL
|
|
17
|
+
|
|
18
|
+
type RequestWithoutMethods = Omit<
|
|
19
|
+
Request,
|
|
20
|
+
| 'text'
|
|
21
|
+
| 'body'
|
|
22
|
+
| 'json'
|
|
23
|
+
| 'blob'
|
|
24
|
+
| 'arrayBuffer'
|
|
25
|
+
| 'formData'
|
|
26
|
+
| 'clone'
|
|
27
|
+
| 'signal'
|
|
28
|
+
| 'isHistoryNavigation'
|
|
29
|
+
| 'isReloadNavigation'
|
|
30
|
+
>
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Request representation received from the worker message event.
|
|
34
|
+
*/
|
|
35
|
+
export interface ServiceWorkerIncomingRequest extends RequestWithoutMethods {
|
|
36
|
+
/**
|
|
37
|
+
* Unique ID of the request generated once the request is
|
|
38
|
+
* intercepted by the "fetch" event in the Service Worker.
|
|
39
|
+
*/
|
|
40
|
+
id: string
|
|
41
|
+
body?: ArrayBuffer | null
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export type ServiceWorkerIncomingResponse = Pick<
|
|
45
|
+
Response,
|
|
46
|
+
'type' | 'ok' | 'status' | 'statusText' | 'body' | 'headers' | 'redirected'
|
|
47
|
+
> & {
|
|
48
|
+
requestId: string
|
|
49
|
+
isMockedResponse: boolean
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Map of the events that can be received from the Service Worker.
|
|
54
|
+
*/
|
|
55
|
+
export interface ServiceWorkerIncomingEventsMap {
|
|
56
|
+
MOCKING_ENABLED: boolean
|
|
57
|
+
INTEGRITY_CHECK_RESPONSE: string
|
|
58
|
+
KEEPALIVE_RESPONSE: never
|
|
59
|
+
REQUEST: ServiceWorkerIncomingRequest
|
|
60
|
+
RESPONSE: ServiceWorkerIncomingResponse
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Map of the events that can be sent to the Service Worker
|
|
65
|
+
* from any execution context.
|
|
66
|
+
*/
|
|
67
|
+
export type ServiceWorkerOutgoingEventTypes =
|
|
68
|
+
| 'MOCK_ACTIVATE'
|
|
69
|
+
| 'MOCK_DEACTIVATE'
|
|
70
|
+
| 'INTEGRITY_CHECK_REQUEST'
|
|
71
|
+
| 'KEEPALIVE_REQUEST'
|
|
72
|
+
| 'CLIENT_CLOSED'
|
|
73
|
+
|
|
74
|
+
export interface StringifiedResponse extends ResponseInit {
|
|
75
|
+
body: string | ArrayBuffer | ReadableStream<Uint8Array> | null
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Map of the events that can be sent to the Service Worker
|
|
80
|
+
* only as a part of a single `fetch` event handler.
|
|
81
|
+
*/
|
|
82
|
+
export interface ServiceWorkerFetchEventMap {
|
|
83
|
+
MOCK_RESPONSE(payload: StringifiedResponse): void
|
|
84
|
+
MOCK_RESPONSE_START(payload: StringifiedResponse): void
|
|
85
|
+
|
|
86
|
+
MOCK_NOT_FOUND(): void
|
|
87
|
+
NETWORK_ERROR(payload: { name: string; message: string }): void
|
|
88
|
+
INTERNAL_ERROR(payload: { status: number; body: string }): void
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface ServiceWorkerBroadcastChannelMessageMap {
|
|
92
|
+
MOCK_RESPONSE_CHUNK(payload: Uint8Array): void
|
|
93
|
+
MOCK_RESPONSE_END(): void
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface StrictEventListener<EventType extends Event> {
|
|
97
|
+
(event: EventType): void
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface SetupWorkerInternalContext {
|
|
101
|
+
isMockingEnabled: boolean
|
|
102
|
+
startOptions: RequiredDeep<StartOptions>
|
|
103
|
+
worker: ServiceWorker | null
|
|
104
|
+
registration: ServiceWorkerRegistration | null
|
|
105
|
+
requestHandlers: Array<RequestHandler>
|
|
106
|
+
emitter: Emitter<LifeCycleEventsMap>
|
|
107
|
+
keepAliveInterval?: number
|
|
108
|
+
workerChannel: {
|
|
109
|
+
/**
|
|
110
|
+
* Adds a Service Worker event listener.
|
|
111
|
+
*/
|
|
112
|
+
on<EventType extends keyof ServiceWorkerIncomingEventsMap>(
|
|
113
|
+
eventType: EventType,
|
|
114
|
+
callback: (
|
|
115
|
+
event: MessageEvent,
|
|
116
|
+
message: ServiceWorkerMessage<
|
|
117
|
+
EventType,
|
|
118
|
+
ServiceWorkerIncomingEventsMap[EventType]
|
|
119
|
+
>,
|
|
120
|
+
) => void,
|
|
121
|
+
): void
|
|
122
|
+
send<EventType extends ServiceWorkerOutgoingEventTypes>(
|
|
123
|
+
eventType: EventType,
|
|
124
|
+
): void
|
|
125
|
+
}
|
|
126
|
+
events: {
|
|
127
|
+
/**
|
|
128
|
+
* Adds an event listener on the given target.
|
|
129
|
+
* Returns a clean-up function that removes that listener.
|
|
130
|
+
*/
|
|
131
|
+
addListener<EventType extends Event>(
|
|
132
|
+
target: EventTarget,
|
|
133
|
+
eventType: string,
|
|
134
|
+
callback: StrictEventListener<EventType>,
|
|
135
|
+
): () => void
|
|
136
|
+
/**
|
|
137
|
+
* Removes all currently attached listeners.
|
|
138
|
+
*/
|
|
139
|
+
removeAllListeners(): void
|
|
140
|
+
/**
|
|
141
|
+
* Awaits a given message type from the Service Worker.
|
|
142
|
+
*/
|
|
143
|
+
once<EventType extends keyof ServiceWorkerIncomingEventsMap>(
|
|
144
|
+
eventType: EventType,
|
|
145
|
+
): Promise<
|
|
146
|
+
ServiceWorkerMessage<EventType, ServiceWorkerIncomingEventsMap[EventType]>
|
|
147
|
+
>
|
|
148
|
+
}
|
|
149
|
+
supports: {
|
|
150
|
+
serviceWorkerApi: boolean
|
|
151
|
+
readableStreamTransfer: boolean
|
|
152
|
+
}
|
|
153
|
+
fallbackInterceptor?: Interceptor<HttpRequestEventMap>
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export type ServiceWorkerInstanceTuple = [
|
|
157
|
+
ServiceWorker | null,
|
|
158
|
+
ServiceWorkerRegistration,
|
|
159
|
+
]
|
|
160
|
+
|
|
161
|
+
export type FindWorker = (
|
|
162
|
+
scriptUrl: string,
|
|
163
|
+
mockServiceWorkerUrl: string,
|
|
164
|
+
) => boolean
|
|
165
|
+
|
|
166
|
+
export interface StartOptions extends SharedOptions {
|
|
167
|
+
/**
|
|
168
|
+
* Service Worker registration options.
|
|
169
|
+
*/
|
|
170
|
+
serviceWorker?: {
|
|
171
|
+
/**
|
|
172
|
+
* Custom url to the worker script.
|
|
173
|
+
* @default "/mockServiceWorker.js"
|
|
174
|
+
*/
|
|
175
|
+
url?: string
|
|
176
|
+
options?: RegistrationOptions
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Disables the logging of the intercepted requests
|
|
181
|
+
* into browser's console.
|
|
182
|
+
* @default false
|
|
183
|
+
*/
|
|
184
|
+
quiet?: boolean
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Defers any network requests until the Service Worker
|
|
188
|
+
* instance is activated.
|
|
189
|
+
* @default true
|
|
190
|
+
*/
|
|
191
|
+
waitUntilReady?: boolean
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* A custom lookup function to find a Mock Service Worker in the list
|
|
195
|
+
* of all registered Service Workers on the page.
|
|
196
|
+
*/
|
|
197
|
+
findWorker?: FindWorker
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export type StartReturnType = Promise<ServiceWorkerRegistration | undefined>
|
|
201
|
+
export type StartHandler = (
|
|
202
|
+
options: RequiredDeep<StartOptions>,
|
|
203
|
+
initialOptions: StartOptions,
|
|
204
|
+
) => StartReturnType
|
|
205
|
+
export type StopHandler = () => void
|
|
206
|
+
|
|
207
|
+
export interface SetupWorker {
|
|
208
|
+
/**
|
|
209
|
+
* Registers and activates the mock Service Worker.
|
|
210
|
+
*
|
|
211
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker/start `worker.start()` API reference}
|
|
212
|
+
*/
|
|
213
|
+
start: (options?: StartOptions) => StartReturnType
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Stops requests interception for the current client.
|
|
217
|
+
*
|
|
218
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker/stop `worker.stop()` API reference}
|
|
219
|
+
*/
|
|
220
|
+
stop: StopHandler
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Prepends given request handlers to the list of existing handlers.
|
|
224
|
+
* @param {RequestHandler[]} handlers List of runtime request handlers.
|
|
225
|
+
*
|
|
226
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker/use `worker.use()` API reference}
|
|
227
|
+
*/
|
|
228
|
+
use: (...handlers: RequestHandler[]) => void
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Marks all request handlers that respond using `res.once()` as unused.
|
|
232
|
+
*
|
|
233
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker/restore-handlers `worker.restoreHandlers()` API reference}
|
|
234
|
+
*/
|
|
235
|
+
restoreHandlers: () => void
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Resets request handlers to the initial list given to the `setupWorker` call, or to the explicit next request handlers list, if given.
|
|
239
|
+
* @param {RequestHandler[]} nextHandlers List of the new initial request handlers.
|
|
240
|
+
*
|
|
241
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker/reset-handlers `worker.resetHandlers()` API reference}
|
|
242
|
+
*/
|
|
243
|
+
resetHandlers: (...nextHandlers: RequestHandler[]) => void
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Returns a readonly list of currently active request handlers.
|
|
247
|
+
*
|
|
248
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker/list-handlers `worker.listHandlers()` API reference}
|
|
249
|
+
*/
|
|
250
|
+
listHandlers(): ReadonlyArray<RequestHandler<RequestHandlerDefaultInfo, any>>
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Life-cycle events.
|
|
254
|
+
* Life-cycle events allow you to subscribe to the internal library events occurring during the request/response handling.
|
|
255
|
+
*
|
|
256
|
+
* @see {@link https://mswjs.io/docs/api/life-cycle-events Life-cycle Events API reference}
|
|
257
|
+
*/
|
|
258
|
+
events: LifeCycleEventEmitter<LifeCycleEventsMap>
|
|
259
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @vitest-environment node
|
|
3
|
+
*/
|
|
4
|
+
import { setupWorker } from './setupWorker'
|
|
5
|
+
|
|
6
|
+
test('returns an error when run in a Node.js environment', () => {
|
|
7
|
+
expect(setupWorker).toThrow(
|
|
8
|
+
'[MSW] Failed to execute `setupWorker` in a non-browser environment',
|
|
9
|
+
)
|
|
10
|
+
})
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { invariant } from 'outvariant'
|
|
2
|
+
import { isNodeProcess } from 'is-node-process'
|
|
3
|
+
import {
|
|
4
|
+
SetupWorkerInternalContext,
|
|
5
|
+
ServiceWorkerIncomingEventsMap,
|
|
6
|
+
StartReturnType,
|
|
7
|
+
StopHandler,
|
|
8
|
+
StartHandler,
|
|
9
|
+
StartOptions,
|
|
10
|
+
} from './glossary'
|
|
11
|
+
import { createStartHandler } from './start/createStartHandler'
|
|
12
|
+
import { createStop } from './stop/createStop'
|
|
13
|
+
import { ServiceWorkerMessage } from './start/utils/createMessageChannel'
|
|
14
|
+
import { RequestHandler } from '~/core/handlers/RequestHandler'
|
|
15
|
+
import { DEFAULT_START_OPTIONS } from './start/utils/prepareStartHandler'
|
|
16
|
+
import { createFallbackStart } from './start/createFallbackStart'
|
|
17
|
+
import { createFallbackStop } from './stop/createFallbackStop'
|
|
18
|
+
import { devUtils } from '~/core/utils/internal/devUtils'
|
|
19
|
+
import { SetupApi } from '~/core/SetupApi'
|
|
20
|
+
import { mergeRight } from '~/core/utils/internal/mergeRight'
|
|
21
|
+
import { LifeCycleEventsMap } from '~/core/sharedOptions'
|
|
22
|
+
import { SetupWorker } from './glossary'
|
|
23
|
+
import { supportsReadableStreamTransfer } from '../utils/supportsReadableStreamTransfer'
|
|
24
|
+
|
|
25
|
+
interface Listener {
|
|
26
|
+
target: EventTarget
|
|
27
|
+
eventType: string
|
|
28
|
+
callback: EventListenerOrEventListenerObject
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class SetupWorkerApi
|
|
32
|
+
extends SetupApi<LifeCycleEventsMap>
|
|
33
|
+
implements SetupWorker
|
|
34
|
+
{
|
|
35
|
+
private context: SetupWorkerInternalContext
|
|
36
|
+
private startHandler: StartHandler = null as any
|
|
37
|
+
private stopHandler: StopHandler = null as any
|
|
38
|
+
private listeners: Array<Listener>
|
|
39
|
+
|
|
40
|
+
constructor(...handlers: Array<RequestHandler>) {
|
|
41
|
+
super(...handlers)
|
|
42
|
+
|
|
43
|
+
invariant(
|
|
44
|
+
!isNodeProcess(),
|
|
45
|
+
devUtils.formatMessage(
|
|
46
|
+
'Failed to execute `setupWorker` in a non-browser environment. Consider using `setupServer` for Node.js environment instead.',
|
|
47
|
+
),
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
this.listeners = []
|
|
51
|
+
this.context = this.createWorkerContext()
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private createWorkerContext(): SetupWorkerInternalContext {
|
|
55
|
+
const context: SetupWorkerInternalContext = {
|
|
56
|
+
// Mocking is not considered enabled until the worker
|
|
57
|
+
// signals back the successful activation event.
|
|
58
|
+
isMockingEnabled: false,
|
|
59
|
+
startOptions: null as any,
|
|
60
|
+
worker: null,
|
|
61
|
+
registration: null,
|
|
62
|
+
requestHandlers: this.currentHandlers,
|
|
63
|
+
emitter: this.emitter,
|
|
64
|
+
workerChannel: {
|
|
65
|
+
on: (eventType, callback) => {
|
|
66
|
+
this.context.events.addListener<
|
|
67
|
+
MessageEvent<ServiceWorkerMessage<typeof eventType, any>>
|
|
68
|
+
>(navigator.serviceWorker, 'message', (event) => {
|
|
69
|
+
// Avoid messages broadcasted from unrelated workers.
|
|
70
|
+
if (event.source !== this.context.worker) {
|
|
71
|
+
return
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const message = event.data
|
|
75
|
+
|
|
76
|
+
if (!message) {
|
|
77
|
+
return
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (message.type === eventType) {
|
|
81
|
+
callback(event, message)
|
|
82
|
+
}
|
|
83
|
+
})
|
|
84
|
+
},
|
|
85
|
+
send: (type) => {
|
|
86
|
+
this.context.worker?.postMessage(type)
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
events: {
|
|
90
|
+
addListener: (target, eventType, callback) => {
|
|
91
|
+
target.addEventListener(eventType, callback as EventListener)
|
|
92
|
+
this.listeners.push({
|
|
93
|
+
eventType,
|
|
94
|
+
target,
|
|
95
|
+
callback: callback as EventListener,
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
return () => {
|
|
99
|
+
target.removeEventListener(eventType, callback as EventListener)
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
removeAllListeners: () => {
|
|
103
|
+
for (const { target, eventType, callback } of this.listeners) {
|
|
104
|
+
target.removeEventListener(eventType, callback)
|
|
105
|
+
}
|
|
106
|
+
this.listeners = []
|
|
107
|
+
},
|
|
108
|
+
once: (eventType) => {
|
|
109
|
+
const bindings: Array<() => void> = []
|
|
110
|
+
|
|
111
|
+
return new Promise<
|
|
112
|
+
ServiceWorkerMessage<
|
|
113
|
+
typeof eventType,
|
|
114
|
+
ServiceWorkerIncomingEventsMap[typeof eventType]
|
|
115
|
+
>
|
|
116
|
+
>((resolve, reject) => {
|
|
117
|
+
const handleIncomingMessage = (event: MessageEvent) => {
|
|
118
|
+
try {
|
|
119
|
+
const message = event.data
|
|
120
|
+
|
|
121
|
+
if (message.type === eventType) {
|
|
122
|
+
resolve(message)
|
|
123
|
+
}
|
|
124
|
+
} catch (error) {
|
|
125
|
+
reject(error)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
bindings.push(
|
|
130
|
+
this.context.events.addListener(
|
|
131
|
+
navigator.serviceWorker,
|
|
132
|
+
'message',
|
|
133
|
+
handleIncomingMessage,
|
|
134
|
+
),
|
|
135
|
+
this.context.events.addListener(
|
|
136
|
+
navigator.serviceWorker,
|
|
137
|
+
'messageerror',
|
|
138
|
+
reject,
|
|
139
|
+
),
|
|
140
|
+
)
|
|
141
|
+
}).finally(() => {
|
|
142
|
+
bindings.forEach((unbind) => unbind())
|
|
143
|
+
})
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
supports: {
|
|
147
|
+
serviceWorkerApi:
|
|
148
|
+
!('serviceWorker' in navigator) || location.protocol === 'file:',
|
|
149
|
+
readableStreamTransfer: supportsReadableStreamTransfer(),
|
|
150
|
+
},
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* @todo Not sure I like this but "this.currentHandlers"
|
|
155
|
+
* updates never bubble to "this.context.requestHandlers".
|
|
156
|
+
*/
|
|
157
|
+
Object.defineProperties(context, {
|
|
158
|
+
requestHandlers: {
|
|
159
|
+
get: () => this.currentHandlers,
|
|
160
|
+
},
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
this.startHandler = context.supports.serviceWorkerApi
|
|
164
|
+
? createFallbackStart(context)
|
|
165
|
+
: createStartHandler(context)
|
|
166
|
+
|
|
167
|
+
this.stopHandler = context.supports.serviceWorkerApi
|
|
168
|
+
? createFallbackStop(context)
|
|
169
|
+
: createStop(context)
|
|
170
|
+
|
|
171
|
+
return context
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
public async start(options: StartOptions = {}): StartReturnType {
|
|
175
|
+
this.context.startOptions = mergeRight(
|
|
176
|
+
DEFAULT_START_OPTIONS,
|
|
177
|
+
options,
|
|
178
|
+
) as SetupWorkerInternalContext['startOptions']
|
|
179
|
+
|
|
180
|
+
return await this.startHandler(this.context.startOptions, options)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
public stop(): void {
|
|
184
|
+
super.dispose()
|
|
185
|
+
this.context.events.removeAllListeners()
|
|
186
|
+
this.context.emitter.removeAllListeners()
|
|
187
|
+
this.stopHandler()
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Sets up a requests interception in the browser with the given request handlers.
|
|
193
|
+
* @param {RequestHandler[]} handlers List of request handlers.
|
|
194
|
+
*
|
|
195
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker `setupWorker()` API reference}
|
|
196
|
+
*/
|
|
197
|
+
export function setupWorker(...handlers: Array<RequestHandler>): SetupWorker {
|
|
198
|
+
return new SetupWorkerApi(...handlers)
|
|
199
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Interceptor,
|
|
3
|
+
BatchInterceptor,
|
|
4
|
+
HttpRequestEventMap,
|
|
5
|
+
} from '@mswjs/interceptors'
|
|
6
|
+
import { FetchInterceptor } from '@mswjs/interceptors/fetch'
|
|
7
|
+
import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest'
|
|
8
|
+
import { SetupWorkerInternalContext, StartOptions } from '../glossary'
|
|
9
|
+
import type { RequiredDeep } from '~/core/typeUtils'
|
|
10
|
+
import { handleRequest } from '~/core/utils/handleRequest'
|
|
11
|
+
|
|
12
|
+
export function createFallbackRequestListener(
|
|
13
|
+
context: SetupWorkerInternalContext,
|
|
14
|
+
options: RequiredDeep<StartOptions>,
|
|
15
|
+
): Interceptor<HttpRequestEventMap> {
|
|
16
|
+
const interceptor = new BatchInterceptor({
|
|
17
|
+
name: 'fallback',
|
|
18
|
+
interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()],
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
interceptor.on('request', async ({ request, requestId }) => {
|
|
22
|
+
const requestCloneForLogs = request.clone()
|
|
23
|
+
|
|
24
|
+
const response = await handleRequest(
|
|
25
|
+
request,
|
|
26
|
+
requestId,
|
|
27
|
+
context.requestHandlers,
|
|
28
|
+
options,
|
|
29
|
+
context.emitter,
|
|
30
|
+
{
|
|
31
|
+
onMockedResponse(_, { handler, parsedResult }) {
|
|
32
|
+
if (!options.quiet) {
|
|
33
|
+
context.emitter.once('response:mocked', ({ response }) => {
|
|
34
|
+
handler.log({
|
|
35
|
+
request: requestCloneForLogs,
|
|
36
|
+
response,
|
|
37
|
+
parsedResult,
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
if (response) {
|
|
46
|
+
request.respondWith(response)
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
interceptor.on(
|
|
51
|
+
'response',
|
|
52
|
+
({ response, isMockedResponse, request, requestId }) => {
|
|
53
|
+
context.emitter.emit(
|
|
54
|
+
isMockedResponse ? 'response:mocked' : 'response:bypass',
|
|
55
|
+
{
|
|
56
|
+
response,
|
|
57
|
+
request,
|
|
58
|
+
requestId,
|
|
59
|
+
},
|
|
60
|
+
)
|
|
61
|
+
},
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
interceptor.apply()
|
|
65
|
+
|
|
66
|
+
return interceptor
|
|
67
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createFallbackRequestListener } from './createFallbackRequestListener'
|
|
2
|
+
import { SetupWorkerInternalContext, StartHandler } from '../glossary'
|
|
3
|
+
import { printStartMessage } from './utils/printStartMessage'
|
|
4
|
+
|
|
5
|
+
export function createFallbackStart(
|
|
6
|
+
context: SetupWorkerInternalContext,
|
|
7
|
+
): StartHandler {
|
|
8
|
+
return async function start(options) {
|
|
9
|
+
context.fallbackInterceptor = createFallbackRequestListener(
|
|
10
|
+
context,
|
|
11
|
+
options,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
printStartMessage({
|
|
15
|
+
message: 'Mocking enabled (fallback mode).',
|
|
16
|
+
quiet: options.quiet,
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
return undefined
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import {
|
|
2
|
+
StartOptions,
|
|
3
|
+
SetupWorkerInternalContext,
|
|
4
|
+
ServiceWorkerIncomingEventsMap,
|
|
5
|
+
} from '../glossary'
|
|
6
|
+
import {
|
|
7
|
+
ServiceWorkerMessage,
|
|
8
|
+
WorkerChannel,
|
|
9
|
+
} from './utils/createMessageChannel'
|
|
10
|
+
import { parseWorkerRequest } from '../../utils/parseWorkerRequest'
|
|
11
|
+
import { handleRequest } from '~/core/utils/handleRequest'
|
|
12
|
+
import { RequiredDeep } from '~/core/typeUtils'
|
|
13
|
+
import { devUtils } from '~/core/utils/internal/devUtils'
|
|
14
|
+
import { toResponseInit } from '~/core/utils/toResponseInit'
|
|
15
|
+
|
|
16
|
+
export const createRequestListener = (
|
|
17
|
+
context: SetupWorkerInternalContext,
|
|
18
|
+
options: RequiredDeep<StartOptions>,
|
|
19
|
+
) => {
|
|
20
|
+
return async (
|
|
21
|
+
event: MessageEvent,
|
|
22
|
+
message: ServiceWorkerMessage<
|
|
23
|
+
'REQUEST',
|
|
24
|
+
ServiceWorkerIncomingEventsMap['REQUEST']
|
|
25
|
+
>,
|
|
26
|
+
) => {
|
|
27
|
+
const messageChannel = new WorkerChannel(event.ports[0])
|
|
28
|
+
|
|
29
|
+
const requestId = message.payload.id
|
|
30
|
+
const request = parseWorkerRequest(message.payload)
|
|
31
|
+
const requestCloneForLogs = request.clone()
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
await handleRequest(
|
|
35
|
+
request,
|
|
36
|
+
requestId,
|
|
37
|
+
context.requestHandlers,
|
|
38
|
+
options,
|
|
39
|
+
context.emitter,
|
|
40
|
+
{
|
|
41
|
+
onPassthroughResponse() {
|
|
42
|
+
messageChannel.postMessage('NOT_FOUND')
|
|
43
|
+
},
|
|
44
|
+
async onMockedResponse(response, { handler, parsedResult }) {
|
|
45
|
+
// Clone the mocked response so its body could be read
|
|
46
|
+
// to buffer to be sent to the worker and also in the
|
|
47
|
+
// ".log()" method of the request handler.
|
|
48
|
+
const responseClone = response.clone()
|
|
49
|
+
const responseCloneForLogs = response.clone()
|
|
50
|
+
const responseInit = toResponseInit(response)
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @note Safari doesn't support transferring a "ReadableStream".
|
|
54
|
+
* Check that the browser supports that before sending it to the worker.
|
|
55
|
+
*/
|
|
56
|
+
if (context.supports.readableStreamTransfer) {
|
|
57
|
+
const responseStreamOrNull = response.body
|
|
58
|
+
|
|
59
|
+
messageChannel.postMessage(
|
|
60
|
+
'MOCK_RESPONSE',
|
|
61
|
+
{
|
|
62
|
+
...responseInit,
|
|
63
|
+
body: responseStreamOrNull,
|
|
64
|
+
},
|
|
65
|
+
responseStreamOrNull ? [responseStreamOrNull] : undefined,
|
|
66
|
+
)
|
|
67
|
+
} else {
|
|
68
|
+
/**
|
|
69
|
+
* @note If we are here, this means the current environment doesn't
|
|
70
|
+
* support "ReadableStream" as transferable. In that case,
|
|
71
|
+
* attempt to read the non-empty response body as ArrayBuffer, if it's not empty.
|
|
72
|
+
* @see https://github.com/mswjs/msw/issues/1827
|
|
73
|
+
*/
|
|
74
|
+
const responseBufferOrNull =
|
|
75
|
+
response.body === null
|
|
76
|
+
? null
|
|
77
|
+
: await responseClone.arrayBuffer()
|
|
78
|
+
|
|
79
|
+
messageChannel.postMessage('MOCK_RESPONSE', {
|
|
80
|
+
...responseInit,
|
|
81
|
+
body: responseBufferOrNull,
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (!options.quiet) {
|
|
86
|
+
context.emitter.once('response:mocked', () => {
|
|
87
|
+
handler.log({
|
|
88
|
+
request: requestCloneForLogs,
|
|
89
|
+
response: responseCloneForLogs,
|
|
90
|
+
parsedResult,
|
|
91
|
+
})
|
|
92
|
+
})
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
)
|
|
97
|
+
} catch (error) {
|
|
98
|
+
if (error instanceof Error) {
|
|
99
|
+
devUtils.error(
|
|
100
|
+
`Uncaught exception in the request handler for "%s %s":
|
|
101
|
+
|
|
102
|
+
%s
|
|
103
|
+
|
|
104
|
+
This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/recipes/mocking-error-responses`,
|
|
105
|
+
request.method,
|
|
106
|
+
request.url,
|
|
107
|
+
error.stack ?? error,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
// Treat all other exceptions in a request handler as unintended,
|
|
111
|
+
// alerting that there is a problem that needs fixing.
|
|
112
|
+
messageChannel.postMessage('MOCK_RESPONSE', {
|
|
113
|
+
status: 500,
|
|
114
|
+
statusText: 'Request Handler Error',
|
|
115
|
+
headers: {
|
|
116
|
+
'Content-Type': 'application/json',
|
|
117
|
+
},
|
|
118
|
+
body: JSON.stringify({
|
|
119
|
+
name: error.name,
|
|
120
|
+
message: error.message,
|
|
121
|
+
stack: error.stack,
|
|
122
|
+
}),
|
|
123
|
+
})
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|