msw 2.0.12 → 2.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/browser/index.d.mts +104 -0
- package/lib/browser/index.d.ts +1 -1
- package/lib/browser/index.js +1 -0
- package/lib/browser/index.js.map +1 -0
- package/lib/browser/index.mjs +1 -0
- package/lib/browser/index.mjs.map +1 -0
- package/lib/core/{GraphQLHandler-da09c680.d.ts → GraphQLHandler-SHlRCcy4.d.ts} +2 -2
- package/lib/core/GraphQLHandler-zlmUDnN6.d.mts +97 -0
- package/lib/core/HttpResponse.d.mts +2 -0
- package/lib/core/HttpResponse.d.ts +1 -1
- package/lib/core/HttpResponse.js +1 -0
- package/lib/core/HttpResponse.js.map +1 -0
- package/lib/core/HttpResponse.mjs +1 -0
- package/lib/core/HttpResponse.mjs.map +1 -0
- package/lib/core/{RequestHandler-25f9cfd1.d.ts → RequestHandler-rBDJQrEf.d.ts} +1 -1
- package/lib/core/RequestHandler-vxZdj6Tw.d.mts +179 -0
- package/lib/core/SetupApi.d.mts +26 -0
- package/lib/core/SetupApi.d.ts +1 -1
- package/lib/core/SetupApi.js +1 -0
- package/lib/core/SetupApi.js.map +1 -0
- package/lib/core/SetupApi.mjs +1 -0
- package/lib/core/SetupApi.mjs.map +1 -0
- package/lib/core/bypass.d.mts +16 -0
- package/lib/core/bypass.d.ts +1 -1
- package/lib/core/bypass.js +1 -0
- package/lib/core/bypass.js.map +1 -0
- package/lib/core/bypass.mjs +1 -0
- package/lib/core/bypass.mjs.map +1 -0
- package/lib/core/delay.d.mts +18 -0
- package/lib/core/delay.d.ts +1 -1
- package/lib/core/delay.js +1 -0
- package/lib/core/delay.js.map +1 -0
- package/lib/core/delay.mjs +1 -0
- package/lib/core/delay.mjs.map +1 -0
- package/lib/core/graphql.d.mts +109 -0
- package/lib/core/graphql.d.ts +3 -3
- package/lib/core/graphql.js +1 -0
- package/lib/core/graphql.js.map +1 -0
- package/lib/core/graphql.mjs +1 -0
- package/lib/core/graphql.mjs.map +1 -0
- package/lib/core/handlers/GraphQLHandler.d.mts +5 -0
- package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
- package/lib/core/handlers/GraphQLHandler.js +3 -2
- package/lib/core/handlers/GraphQLHandler.js.map +1 -0
- package/lib/core/handlers/GraphQLHandler.mjs +3 -2
- package/lib/core/handlers/GraphQLHandler.mjs.map +1 -0
- package/lib/core/handlers/HttpHandler.d.mts +62 -0
- package/lib/core/handlers/HttpHandler.d.ts +2 -2
- package/lib/core/handlers/HttpHandler.js +1 -0
- package/lib/core/handlers/HttpHandler.js.map +1 -0
- package/lib/core/handlers/HttpHandler.mjs +1 -0
- package/lib/core/handlers/HttpHandler.mjs.map +1 -0
- package/lib/core/handlers/RequestHandler.d.mts +2 -0
- package/lib/core/handlers/RequestHandler.d.ts +1 -1
- package/lib/core/handlers/RequestHandler.js +3 -2
- package/lib/core/handlers/RequestHandler.js.map +1 -0
- package/lib/core/handlers/RequestHandler.mjs +3 -2
- package/lib/core/handlers/RequestHandler.mjs.map +1 -0
- package/lib/core/http.d.mts +26 -0
- package/lib/core/http.d.ts +1 -1
- package/lib/core/http.js +1 -0
- package/lib/core/http.js.map +1 -0
- package/lib/core/http.mjs +1 -0
- package/lib/core/http.mjs.map +1 -0
- package/lib/core/index.d.mts +18 -0
- package/lib/core/index.d.ts +2 -2
- package/lib/core/index.js +1 -0
- package/lib/core/index.js.map +1 -0
- package/lib/core/index.mjs +1 -0
- package/lib/core/index.mjs.map +1 -0
- package/lib/core/passthrough.d.mts +17 -0
- package/lib/core/passthrough.js +1 -0
- package/lib/core/passthrough.js.map +1 -0
- package/lib/core/passthrough.mjs +1 -0
- package/lib/core/passthrough.mjs.map +1 -0
- package/lib/core/sharedOptions.d.mts +66 -0
- package/lib/core/sharedOptions.d.ts +2 -2
- package/lib/core/sharedOptions.js +1 -0
- package/lib/core/sharedOptions.js.map +1 -0
- package/lib/core/sharedOptions.mjs +1 -0
- package/lib/core/sharedOptions.mjs.map +1 -0
- package/lib/core/typeUtils.d.mts +7 -0
- package/lib/core/typeUtils.d.ts +1 -1
- package/lib/core/typeUtils.js +1 -0
- package/lib/core/typeUtils.js.map +1 -0
- package/lib/core/typeUtils.mjs +1 -0
- package/lib/core/typeUtils.mjs.map +1 -0
- package/lib/core/utils/HttpResponse/decorators.d.mts +12 -0
- package/lib/core/utils/HttpResponse/decorators.d.ts +2 -2
- package/lib/core/utils/HttpResponse/decorators.js +1 -0
- package/lib/core/utils/HttpResponse/decorators.js.map +1 -0
- package/lib/core/utils/HttpResponse/decorators.mjs +1 -0
- package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -0
- package/lib/core/utils/getResponse.d.mts +2 -0
- package/lib/core/utils/getResponse.d.ts +1 -1
- package/lib/core/utils/getResponse.js +1 -0
- package/lib/core/utils/getResponse.js.map +1 -0
- package/lib/core/utils/getResponse.mjs +1 -0
- package/lib/core/utils/getResponse.mjs.map +1 -0
- package/lib/core/utils/handleRequest.d.mts +37 -0
- package/lib/core/utils/handleRequest.d.ts +2 -2
- package/lib/core/utils/handleRequest.js +1 -0
- package/lib/core/utils/handleRequest.js.map +1 -0
- package/lib/core/utils/handleRequest.mjs +1 -0
- package/lib/core/utils/handleRequest.mjs.map +1 -0
- package/lib/core/utils/internal/Disposable.d.mts +7 -0
- package/lib/core/utils/internal/Disposable.d.ts +1 -1
- package/lib/core/utils/internal/Disposable.js +1 -0
- package/lib/core/utils/internal/Disposable.js.map +1 -0
- package/lib/core/utils/internal/Disposable.mjs +1 -0
- package/lib/core/utils/internal/Disposable.mjs.map +1 -0
- package/lib/core/utils/internal/checkGlobals.d.mts +3 -0
- package/lib/core/utils/internal/checkGlobals.js +1 -0
- package/lib/core/utils/internal/checkGlobals.js.map +1 -0
- package/lib/core/utils/internal/checkGlobals.mjs +1 -0
- package/lib/core/utils/internal/checkGlobals.mjs.map +1 -0
- package/lib/core/utils/internal/devUtils.d.mts +19 -0
- package/lib/core/utils/internal/devUtils.js +1 -0
- package/lib/core/utils/internal/devUtils.js.map +1 -0
- package/lib/core/utils/internal/devUtils.mjs +1 -0
- package/lib/core/utils/internal/devUtils.mjs.map +1 -0
- package/lib/core/utils/internal/getCallFrame.d.mts +6 -0
- package/lib/core/utils/internal/getCallFrame.js +1 -0
- package/lib/core/utils/internal/getCallFrame.js.map +1 -0
- package/lib/core/utils/internal/getCallFrame.mjs +1 -0
- package/lib/core/utils/internal/getCallFrame.mjs.map +1 -0
- package/lib/core/utils/internal/isIterable.d.mts +6 -0
- package/lib/core/utils/internal/isIterable.js +1 -0
- package/lib/core/utils/internal/isIterable.js.map +1 -0
- package/lib/core/utils/internal/isIterable.mjs +1 -0
- package/lib/core/utils/internal/isIterable.mjs.map +1 -0
- package/lib/core/utils/internal/isObject.d.mts +6 -0
- package/lib/core/utils/internal/isObject.js +1 -0
- package/lib/core/utils/internal/isObject.js.map +1 -0
- package/lib/core/utils/internal/isObject.mjs +1 -0
- package/lib/core/utils/internal/isObject.mjs.map +1 -0
- package/lib/core/utils/internal/isStringEqual.d.mts +6 -0
- package/lib/core/utils/internal/isStringEqual.js +1 -0
- package/lib/core/utils/internal/isStringEqual.js.map +1 -0
- package/lib/core/utils/internal/isStringEqual.mjs +1 -0
- package/lib/core/utils/internal/isStringEqual.mjs.map +1 -0
- package/lib/core/utils/internal/jsonParse.d.mts +7 -0
- package/lib/core/utils/internal/jsonParse.js +1 -0
- package/lib/core/utils/internal/jsonParse.js.map +1 -0
- package/lib/core/utils/internal/jsonParse.mjs +1 -0
- package/lib/core/utils/internal/jsonParse.mjs.map +1 -0
- package/lib/core/utils/internal/mergeRight.d.mts +7 -0
- package/lib/core/utils/internal/mergeRight.js +1 -0
- package/lib/core/utils/internal/mergeRight.js.map +1 -0
- package/lib/core/utils/internal/mergeRight.mjs +1 -0
- package/lib/core/utils/internal/mergeRight.mjs.map +1 -0
- package/lib/core/utils/internal/parseGraphQLRequest.d.mts +5 -0
- package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
- package/lib/core/utils/internal/parseGraphQLRequest.js +1 -0
- package/lib/core/utils/internal/parseGraphQLRequest.js.map +1 -0
- package/lib/core/utils/internal/parseGraphQLRequest.mjs +1 -0
- package/lib/core/utils/internal/parseGraphQLRequest.mjs.map +1 -0
- package/lib/core/utils/internal/parseMultipartData.d.mts +10 -0
- package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
- package/lib/core/utils/internal/parseMultipartData.js +1 -0
- package/lib/core/utils/internal/parseMultipartData.js.map +1 -0
- package/lib/core/utils/internal/parseMultipartData.mjs +1 -0
- package/lib/core/utils/internal/parseMultipartData.mjs.map +1 -0
- package/lib/core/utils/internal/pipeEvents.d.mts +8 -0
- package/lib/core/utils/internal/pipeEvents.js +1 -0
- package/lib/core/utils/internal/pipeEvents.js.map +1 -0
- package/lib/core/utils/internal/pipeEvents.mjs +1 -0
- package/lib/core/utils/internal/pipeEvents.mjs.map +1 -0
- package/lib/core/utils/internal/requestHandlerUtils.d.mts +8 -0
- package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
- package/lib/core/utils/internal/requestHandlerUtils.js +1 -0
- package/lib/core/utils/internal/requestHandlerUtils.js.map +1 -0
- package/lib/core/utils/internal/requestHandlerUtils.mjs +1 -0
- package/lib/core/utils/internal/requestHandlerUtils.mjs.map +1 -0
- package/lib/core/utils/internal/toReadonlyArray.d.mts +6 -0
- package/lib/core/utils/internal/toReadonlyArray.js +1 -0
- package/lib/core/utils/internal/toReadonlyArray.js.map +1 -0
- package/lib/core/utils/internal/toReadonlyArray.mjs +1 -0
- package/lib/core/utils/internal/toReadonlyArray.mjs.map +1 -0
- package/lib/core/utils/internal/tryCatch.d.mts +3 -0
- package/lib/core/utils/internal/tryCatch.js +1 -0
- package/lib/core/utils/internal/tryCatch.js.map +1 -0
- package/lib/core/utils/internal/tryCatch.mjs +1 -0
- package/lib/core/utils/internal/tryCatch.mjs.map +1 -0
- package/lib/core/utils/internal/uuidv4.d.mts +3 -0
- package/lib/core/utils/internal/uuidv4.js +1 -0
- package/lib/core/utils/internal/uuidv4.js.map +1 -0
- package/lib/core/utils/internal/uuidv4.mjs +1 -0
- package/lib/core/utils/internal/uuidv4.mjs.map +1 -0
- package/lib/core/utils/logging/getStatusCodeColor.d.mts +11 -0
- package/lib/core/utils/logging/getStatusCodeColor.js +1 -0
- package/lib/core/utils/logging/getStatusCodeColor.js.map +1 -0
- package/lib/core/utils/logging/getStatusCodeColor.mjs +1 -0
- package/lib/core/utils/logging/getStatusCodeColor.mjs.map +1 -0
- package/lib/core/utils/logging/getTimestamp.d.mts +6 -0
- package/lib/core/utils/logging/getTimestamp.js +1 -0
- package/lib/core/utils/logging/getTimestamp.js.map +1 -0
- package/lib/core/utils/logging/getTimestamp.mjs +1 -0
- package/lib/core/utils/logging/getTimestamp.mjs.map +1 -0
- package/lib/core/utils/logging/serializeRequest.d.mts +12 -0
- package/lib/core/utils/logging/serializeRequest.d.ts +1 -1
- package/lib/core/utils/logging/serializeRequest.js +1 -0
- package/lib/core/utils/logging/serializeRequest.js.map +1 -0
- package/lib/core/utils/logging/serializeRequest.mjs +1 -0
- package/lib/core/utils/logging/serializeRequest.mjs.map +1 -0
- package/lib/core/utils/logging/serializeResponse.d.mts +9 -0
- package/lib/core/utils/logging/serializeResponse.d.ts +1 -1
- package/lib/core/utils/logging/serializeResponse.js +1 -0
- package/lib/core/utils/logging/serializeResponse.js.map +1 -0
- package/lib/core/utils/logging/serializeResponse.mjs +1 -0
- package/lib/core/utils/logging/serializeResponse.mjs.map +1 -0
- package/lib/core/utils/matching/matchRequestUrl.d.mts +19 -0
- package/lib/core/utils/matching/matchRequestUrl.d.ts +1 -1
- package/lib/core/utils/matching/matchRequestUrl.js +1 -0
- package/lib/core/utils/matching/matchRequestUrl.js.map +1 -0
- package/lib/core/utils/matching/matchRequestUrl.mjs +1 -0
- package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -0
- package/lib/core/utils/matching/normalizePath.d.mts +12 -0
- package/lib/core/utils/matching/normalizePath.js +1 -0
- package/lib/core/utils/matching/normalizePath.js.map +1 -0
- package/lib/core/utils/matching/normalizePath.mjs +1 -0
- package/lib/core/utils/matching/normalizePath.mjs.map +1 -0
- package/lib/core/utils/request/getPublicUrlFromRequest.d.mts +7 -0
- package/lib/core/utils/request/getPublicUrlFromRequest.js +1 -0
- package/lib/core/utils/request/getPublicUrlFromRequest.js.map +1 -0
- package/lib/core/utils/request/getPublicUrlFromRequest.mjs +1 -0
- package/lib/core/utils/request/getPublicUrlFromRequest.mjs.map +1 -0
- package/lib/core/utils/request/getRequestCookies.d.mts +8 -0
- package/lib/core/utils/request/getRequestCookies.js +1 -0
- package/lib/core/utils/request/getRequestCookies.js.map +1 -0
- package/lib/core/utils/request/getRequestCookies.mjs +1 -0
- package/lib/core/utils/request/getRequestCookies.mjs.map +1 -0
- package/lib/core/utils/request/onUnhandledRequest.d.mts +12 -0
- package/lib/core/utils/request/onUnhandledRequest.d.ts +2 -2
- package/lib/core/utils/request/onUnhandledRequest.js +1 -0
- package/lib/core/utils/request/onUnhandledRequest.js.map +1 -0
- package/lib/core/utils/request/onUnhandledRequest.mjs +1 -0
- package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -0
- package/lib/core/utils/request/readResponseCookies.d.mts +3 -0
- package/lib/core/utils/request/readResponseCookies.js +1 -0
- package/lib/core/utils/request/readResponseCookies.js.map +1 -0
- package/lib/core/utils/request/readResponseCookies.mjs +1 -0
- package/lib/core/utils/request/readResponseCookies.mjs.map +1 -0
- package/lib/core/utils/toResponseInit.d.mts +3 -0
- package/lib/core/utils/toResponseInit.js +1 -0
- package/lib/core/utils/toResponseInit.js.map +1 -0
- package/lib/core/utils/toResponseInit.mjs +1 -0
- package/lib/core/utils/toResponseInit.mjs.map +1 -0
- package/lib/core/utils/url/cleanUrl.d.mts +7 -0
- package/lib/core/utils/url/cleanUrl.js +1 -0
- package/lib/core/utils/url/cleanUrl.js.map +1 -0
- package/lib/core/utils/url/cleanUrl.mjs +1 -0
- package/lib/core/utils/url/cleanUrl.mjs.map +1 -0
- package/lib/core/utils/url/getAbsoluteUrl.d.mts +6 -0
- package/lib/core/utils/url/getAbsoluteUrl.js +1 -0
- package/lib/core/utils/url/getAbsoluteUrl.js.map +1 -0
- package/lib/core/utils/url/getAbsoluteUrl.mjs +1 -0
- package/lib/core/utils/url/getAbsoluteUrl.mjs.map +1 -0
- package/lib/core/utils/url/isAbsoluteUrl.d.mts +6 -0
- package/lib/core/utils/url/isAbsoluteUrl.js +1 -0
- package/lib/core/utils/url/isAbsoluteUrl.js.map +1 -0
- package/lib/core/utils/url/isAbsoluteUrl.mjs +1 -0
- package/lib/core/utils/url/isAbsoluteUrl.mjs.map +1 -0
- package/lib/iife/index.js +20 -19
- package/lib/iife/index.js.map +1 -0
- package/lib/mockServiceWorker.js +1 -1
- package/lib/native/index.d.mts +75 -0
- package/lib/native/index.js +1 -0
- package/lib/native/index.js.map +1 -0
- package/lib/native/index.mjs +1 -0
- package/lib/native/index.mjs.map +1 -0
- package/lib/node/index.d.mts +75 -0
- package/lib/node/index.d.ts +1 -1
- package/lib/node/index.js +1 -0
- package/lib/node/index.js.map +1 -0
- package/lib/node/index.mjs +1 -0
- package/lib/node/index.mjs.map +1 -0
- package/package.json +5 -4
- package/src/browser/global.browser.d.ts +1 -0
- package/src/browser/index.ts +3 -0
- package/src/browser/setupWorker/glossary.ts +259 -0
- package/src/browser/setupWorker/setupWorker.node.test.ts +10 -0
- package/src/browser/setupWorker/setupWorker.ts +199 -0
- package/src/browser/setupWorker/start/createFallbackRequestListener.ts +67 -0
- package/src/browser/setupWorker/start/createFallbackStart.ts +21 -0
- package/src/browser/setupWorker/start/createRequestListener.ts +127 -0
- package/src/browser/setupWorker/start/createResponseListener.ts +58 -0
- package/src/browser/setupWorker/start/createStartHandler.ts +143 -0
- package/src/browser/setupWorker/start/utils/createMessageChannel.ts +32 -0
- package/src/browser/setupWorker/start/utils/enableMocking.ts +32 -0
- package/src/browser/setupWorker/start/utils/getWorkerByRegistration.ts +25 -0
- package/src/browser/setupWorker/start/utils/getWorkerInstance.ts +94 -0
- package/src/browser/setupWorker/start/utils/prepareStartHandler.test.ts +59 -0
- package/src/browser/setupWorker/start/utils/prepareStartHandler.ts +44 -0
- package/src/browser/setupWorker/start/utils/printStartMessage.test.ts +84 -0
- package/src/browser/setupWorker/start/utils/printStartMessage.ts +40 -0
- package/src/browser/setupWorker/start/utils/validateWorkerScope.ts +18 -0
- package/src/browser/setupWorker/stop/createFallbackStop.ts +11 -0
- package/src/browser/setupWorker/stop/createStop.ts +29 -0
- package/src/browser/setupWorker/stop/utils/printStopMessage.test.ts +26 -0
- package/src/browser/setupWorker/stop/utils/printStopMessage.ts +12 -0
- package/src/browser/tsconfig.browser.build.json +6 -0
- package/src/browser/tsconfig.browser.json +9 -0
- package/src/browser/utils/deferNetworkRequestsUntil.test.ts +48 -0
- package/src/browser/utils/deferNetworkRequestsUntil.ts +29 -0
- package/src/browser/utils/getAbsoluteWorkerUrl.test.ts +31 -0
- package/src/browser/utils/getAbsoluteWorkerUrl.ts +7 -0
- package/src/browser/utils/parseWorkerRequest.ts +15 -0
- package/src/browser/utils/pruneGetRequestBody.test.ts +53 -0
- package/src/browser/utils/pruneGetRequestBody.ts +21 -0
- package/src/browser/utils/requestIntegrityCheck.ts +23 -0
- package/src/browser/utils/supportsReadableStreamTransfer.ts +17 -0
- package/src/core/HttpResponse.test.ts +200 -0
- package/src/core/HttpResponse.ts +134 -0
- package/src/core/SetupApi.ts +95 -0
- package/src/core/bypass.test.ts +47 -0
- package/src/core/bypass.ts +36 -0
- package/src/core/delay.ts +70 -0
- package/src/core/graphql.test.ts +11 -0
- package/src/core/graphql.ts +138 -0
- package/src/core/handlers/GraphQLHandler.test.ts +820 -0
- package/src/core/handlers/GraphQLHandler.ts +263 -0
- package/src/core/handlers/HttpHandler.test.ts +218 -0
- package/src/core/handlers/HttpHandler.ts +169 -0
- package/src/core/handlers/RequestHandler.ts +338 -0
- package/src/core/http.test.ts +15 -0
- package/src/core/http.ts +51 -0
- package/src/core/index.ts +56 -0
- package/src/core/passthrough.test.ts +13 -0
- package/src/core/passthrough.ts +23 -0
- package/src/core/sharedOptions.ts +66 -0
- package/src/core/typeUtils.ts +20 -0
- package/src/core/utils/HttpResponse/decorators.ts +56 -0
- package/src/core/utils/getResponse.ts +55 -0
- package/src/core/utils/handleRequest.test.ts +554 -0
- package/src/core/utils/handleRequest.ts +132 -0
- package/src/core/utils/internal/Disposable.ts +9 -0
- package/src/core/utils/internal/checkGlobals.ts +17 -0
- package/src/core/utils/internal/devUtils.ts +31 -0
- package/src/core/utils/internal/getCallFrame.test.ts +154 -0
- package/src/core/utils/internal/getCallFrame.ts +35 -0
- package/src/core/utils/internal/isIterable.test.ts +23 -0
- package/src/core/utils/internal/isIterable.ts +12 -0
- package/src/core/utils/internal/isObject.test.ts +20 -0
- package/src/core/utils/internal/isObject.ts +6 -0
- package/src/core/utils/internal/isStringEqual.test.ts +45 -0
- package/src/core/utils/internal/isStringEqual.ts +6 -0
- package/src/core/utils/internal/jsonParse.test.ts +13 -0
- package/src/core/utils/internal/jsonParse.ts +13 -0
- package/src/core/utils/internal/mergeRight.test.ts +43 -0
- package/src/core/utils/internal/mergeRight.ts +27 -0
- package/src/core/utils/internal/parseGraphQLRequest.test.ts +99 -0
- package/src/core/utils/internal/parseGraphQLRequest.ts +205 -0
- package/src/core/utils/internal/parseMultipartData.test.ts +76 -0
- package/src/core/utils/internal/parseMultipartData.ts +104 -0
- package/src/core/utils/internal/pipeEvents.test.ts +14 -0
- package/src/core/utils/internal/pipeEvents.ts +25 -0
- package/src/core/utils/internal/requestHandlerUtils.ts +21 -0
- package/src/core/utils/internal/toReadonlyArray.test.ts +30 -0
- package/src/core/utils/internal/toReadonlyArray.ts +8 -0
- package/src/core/utils/internal/tryCatch.test.ts +29 -0
- package/src/core/utils/internal/tryCatch.ts +11 -0
- package/src/core/utils/internal/uuidv4.ts +3 -0
- package/src/core/utils/logging/getStatusCodeColor.test.ts +22 -0
- package/src/core/utils/logging/getStatusCodeColor.ts +20 -0
- package/src/core/utils/logging/getTimestamp.test.ts +18 -0
- package/src/core/utils/logging/getTimestamp.ts +12 -0
- package/src/core/utils/logging/serializeRequest.test.ts +23 -0
- package/src/core/utils/logging/serializeRequest.ts +23 -0
- package/src/core/utils/logging/serializeResponse.test.ts +77 -0
- package/src/core/utils/logging/serializeResponse.ts +31 -0
- package/src/core/utils/matching/matchRequestUrl.test.ts +114 -0
- package/src/core/utils/matching/matchRequestUrl.ts +73 -0
- package/src/core/utils/matching/normalizePath.node.test.ts +44 -0
- package/src/core/utils/matching/normalizePath.test.ts +50 -0
- package/src/core/utils/matching/normalizePath.ts +21 -0
- package/src/core/utils/request/getPublicUrlFromRequest.test.ts +26 -0
- package/src/core/utils/request/getPublicUrlFromRequest.ts +15 -0
- package/src/core/utils/request/getRequestCookies.node.test.ts +29 -0
- package/src/core/utils/request/getRequestCookies.test.ts +64 -0
- package/src/core/utils/request/getRequestCookies.ts +75 -0
- package/src/core/utils/request/onUnhandledRequest.test.ts +215 -0
- package/src/core/utils/request/onUnhandledRequest.ts +247 -0
- package/src/core/utils/request/readResponseCookies.ts +9 -0
- package/src/core/utils/toResponseInit.ts +7 -0
- package/src/core/utils/url/cleanUrl.test.ts +17 -0
- package/src/core/utils/url/cleanUrl.ts +12 -0
- package/src/core/utils/url/getAbsoluteUrl.node.test.ts +19 -0
- package/src/core/utils/url/getAbsoluteUrl.test.ts +29 -0
- package/src/core/utils/url/getAbsoluteUrl.ts +26 -0
- package/src/core/utils/url/isAbsoluteUrl.test.ts +32 -0
- package/src/core/utils/url/isAbsoluteUrl.ts +6 -0
- package/src/iife/index.ts +2 -0
- package/src/mockServiceWorker.js +287 -0
- package/src/native/index.ts +17 -0
- package/src/node/SetupServerApi.ts +113 -0
- package/src/node/glossary.ts +62 -0
- package/src/node/index.ts +3 -0
- package/src/node/setupServer.ts +21 -0
- package/src/node/utils/isNodeExceptionLike.ts +14 -0
- package/src/tsconfig.core.build.json +6 -0
- package/src/tsconfig.node.build.json +6 -0
- package/src/tsconfig.node.json +8 -0
- package/src/tsconfig.src.json +15 -0
|
@@ -0,0 +1,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
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ServiceWorkerIncomingEventsMap,
|
|
3
|
+
SetupWorkerInternalContext,
|
|
4
|
+
} from '../glossary'
|
|
5
|
+
import { ServiceWorkerMessage } from './utils/createMessageChannel'
|
|
6
|
+
import { isResponseWithoutBody } from '@mswjs/interceptors'
|
|
7
|
+
|
|
8
|
+
export function createResponseListener(context: SetupWorkerInternalContext) {
|
|
9
|
+
return (
|
|
10
|
+
_: MessageEvent,
|
|
11
|
+
message: ServiceWorkerMessage<
|
|
12
|
+
'RESPONSE',
|
|
13
|
+
ServiceWorkerIncomingEventsMap['RESPONSE']
|
|
14
|
+
>,
|
|
15
|
+
) => {
|
|
16
|
+
const { payload: responseJson } = message
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* CORS requests with `mode: "no-cors"` result in "opaque" responses.
|
|
20
|
+
* That kind of responses cannot be manipulated in JavaScript due
|
|
21
|
+
* to the security considerations.
|
|
22
|
+
* @see https://fetch.spec.whatwg.org/#concept-filtered-response-opaque
|
|
23
|
+
* @see https://github.com/mswjs/msw/issues/529
|
|
24
|
+
*/
|
|
25
|
+
if (responseJson.type?.includes('opaque')) {
|
|
26
|
+
return
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const response =
|
|
30
|
+
responseJson.status === 0
|
|
31
|
+
? Response.error()
|
|
32
|
+
: new Response(
|
|
33
|
+
/**
|
|
34
|
+
* Responses may be streams here, but when we create a response object
|
|
35
|
+
* with null-body status codes, like 204, 205, 304 Response will
|
|
36
|
+
* throw when passed a non-null body, so ensure it's null here
|
|
37
|
+
* for those codes
|
|
38
|
+
*/
|
|
39
|
+
isResponseWithoutBody(responseJson.status)
|
|
40
|
+
? null
|
|
41
|
+
: responseJson.body,
|
|
42
|
+
responseJson,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
context.emitter.emit(
|
|
46
|
+
responseJson.isMockedResponse ? 'response:mocked' : 'response:bypass',
|
|
47
|
+
{
|
|
48
|
+
response,
|
|
49
|
+
/**
|
|
50
|
+
* @todo @fixme In this context, we don't know anything about
|
|
51
|
+
* the request.
|
|
52
|
+
*/
|
|
53
|
+
request: null as any,
|
|
54
|
+
requestId: responseJson.requestId,
|
|
55
|
+
},
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { until } from '@open-draft/until'
|
|
2
|
+
import { devUtils } from '~/core/utils/internal/devUtils'
|
|
3
|
+
import { getWorkerInstance } from './utils/getWorkerInstance'
|
|
4
|
+
import { enableMocking } from './utils/enableMocking'
|
|
5
|
+
import { SetupWorkerInternalContext, StartHandler } from '../glossary'
|
|
6
|
+
import { createRequestListener } from './createRequestListener'
|
|
7
|
+
import { requestIntegrityCheck } from '../../utils/requestIntegrityCheck'
|
|
8
|
+
import { deferNetworkRequestsUntil } from '../../utils/deferNetworkRequestsUntil'
|
|
9
|
+
import { createResponseListener } from './createResponseListener'
|
|
10
|
+
import { validateWorkerScope } from './utils/validateWorkerScope'
|
|
11
|
+
|
|
12
|
+
export const createStartHandler = (
|
|
13
|
+
context: SetupWorkerInternalContext,
|
|
14
|
+
): StartHandler => {
|
|
15
|
+
return function start(options, customOptions) {
|
|
16
|
+
const startWorkerInstance = async () => {
|
|
17
|
+
// Remove all previously existing event listeners.
|
|
18
|
+
// This way none of the listeners persists between Fast refresh
|
|
19
|
+
// of the application's code.
|
|
20
|
+
context.events.removeAllListeners()
|
|
21
|
+
|
|
22
|
+
// Handle requests signaled by the worker.
|
|
23
|
+
context.workerChannel.on(
|
|
24
|
+
'REQUEST',
|
|
25
|
+
createRequestListener(context, options),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
// Handle responses signaled by the worker.
|
|
29
|
+
context.workerChannel.on('RESPONSE', createResponseListener(context))
|
|
30
|
+
|
|
31
|
+
const instance = await getWorkerInstance(
|
|
32
|
+
options.serviceWorker.url,
|
|
33
|
+
options.serviceWorker.options,
|
|
34
|
+
options.findWorker,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
const [worker, registration] = instance
|
|
38
|
+
|
|
39
|
+
if (!worker) {
|
|
40
|
+
const missingWorkerMessage = customOptions?.findWorker
|
|
41
|
+
? devUtils.formatMessage(
|
|
42
|
+
`Failed to locate the Service Worker registration using a custom "findWorker" predicate.
|
|
43
|
+
|
|
44
|
+
Please ensure that the custom predicate properly locates the Service Worker registration at "%s".
|
|
45
|
+
More details: https://mswjs.io/docs/api/setup-worker/start#findworker
|
|
46
|
+
`,
|
|
47
|
+
options.serviceWorker.url,
|
|
48
|
+
)
|
|
49
|
+
: devUtils.formatMessage(
|
|
50
|
+
`Failed to locate the Service Worker registration.
|
|
51
|
+
|
|
52
|
+
This most likely means that the worker script URL "%s" cannot resolve against the actual public hostname (%s). This may happen if your application runs behind a proxy, or has a dynamic hostname.
|
|
53
|
+
|
|
54
|
+
Please consider using a custom "serviceWorker.url" option to point to the actual worker script location, or a custom "findWorker" option to resolve the Service Worker registration manually. More details: https://mswjs.io/docs/api/setup-worker/start`,
|
|
55
|
+
options.serviceWorker.url,
|
|
56
|
+
location.host,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
throw new Error(missingWorkerMessage)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
context.worker = worker
|
|
63
|
+
context.registration = registration
|
|
64
|
+
|
|
65
|
+
context.events.addListener(window, 'beforeunload', () => {
|
|
66
|
+
if (worker.state !== 'redundant') {
|
|
67
|
+
// Notify the Service Worker that this client has closed.
|
|
68
|
+
// Internally, it's similar to disabling the mocking, only
|
|
69
|
+
// client close event has a handler that self-terminates
|
|
70
|
+
// the Service Worker when there are no open clients.
|
|
71
|
+
context.workerChannel.send('CLIENT_CLOSED')
|
|
72
|
+
}
|
|
73
|
+
// Make sure we're always clearing the interval - there are reports that not doing this can
|
|
74
|
+
// cause memory leaks in headless browser environments.
|
|
75
|
+
window.clearInterval(context.keepAliveInterval)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
// Check if the active Service Worker is the latest published one
|
|
79
|
+
const integrityCheckResult = await until(() =>
|
|
80
|
+
requestIntegrityCheck(context, worker),
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
if (integrityCheckResult.error) {
|
|
84
|
+
devUtils.error(`\
|
|
85
|
+
Detected outdated Service Worker: ${integrityCheckResult.error.message}
|
|
86
|
+
|
|
87
|
+
The mocking is still enabled, but it's highly recommended that you update your Service Worker by running:
|
|
88
|
+
|
|
89
|
+
$ npx msw init <PUBLIC_DIR>
|
|
90
|
+
|
|
91
|
+
This is necessary to ensure that the Service Worker is in sync with the library to guarantee its stability.
|
|
92
|
+
If this message still persists after updating, please report an issue: https://github.com/open-draft/msw/issues\
|
|
93
|
+
`)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
context.keepAliveInterval = window.setInterval(
|
|
97
|
+
() => context.workerChannel.send('KEEPALIVE_REQUEST'),
|
|
98
|
+
5000,
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
// Warn the user when loading the page that lies outside
|
|
102
|
+
// of the worker's scope.
|
|
103
|
+
validateWorkerScope(registration, context.startOptions)
|
|
104
|
+
|
|
105
|
+
return registration
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const workerRegistration = startWorkerInstance().then(
|
|
109
|
+
async (registration) => {
|
|
110
|
+
const pendingInstance = registration.installing || registration.waiting
|
|
111
|
+
|
|
112
|
+
// Wait until the worker is activated.
|
|
113
|
+
// Assume the worker is already activated if there's no pending registration
|
|
114
|
+
// (i.e. when reloading the page after a successful activation).
|
|
115
|
+
if (pendingInstance) {
|
|
116
|
+
await new Promise<void>((resolve) => {
|
|
117
|
+
pendingInstance.addEventListener('statechange', () => {
|
|
118
|
+
if (pendingInstance.state === 'activated') {
|
|
119
|
+
return resolve()
|
|
120
|
+
}
|
|
121
|
+
})
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Print the activation message only after the worker has been activated.
|
|
126
|
+
await enableMocking(context, options).catch((error) => {
|
|
127
|
+
throw new Error(`Failed to enable mocking: ${error?.message}`)
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
return registration
|
|
131
|
+
},
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
// Defer any network requests until the Service Worker instance is ready.
|
|
135
|
+
// This prevents a race condition between the Service Worker registration
|
|
136
|
+
// and application's runtime requests (i.e. requests on mount).
|
|
137
|
+
if (options.waitUntilReady) {
|
|
138
|
+
deferNetworkRequestsUntil(workerRegistration)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return workerRegistration
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {
|
|
2
|
+
StringifiedResponse,
|
|
3
|
+
ServiceWorkerIncomingEventsMap,
|
|
4
|
+
} from '../../glossary'
|
|
5
|
+
|
|
6
|
+
export interface ServiceWorkerMessage<
|
|
7
|
+
EventType extends keyof ServiceWorkerIncomingEventsMap,
|
|
8
|
+
EventPayload,
|
|
9
|
+
> {
|
|
10
|
+
type: EventType
|
|
11
|
+
payload: EventPayload
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface WorkerChannelEventsMap {
|
|
15
|
+
MOCK_RESPONSE: [
|
|
16
|
+
data: StringifiedResponse,
|
|
17
|
+
transfer?: [ReadableStream<Uint8Array>],
|
|
18
|
+
]
|
|
19
|
+
NOT_FOUND: []
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class WorkerChannel {
|
|
23
|
+
constructor(private readonly port: MessagePort) {}
|
|
24
|
+
|
|
25
|
+
public postMessage<Event extends keyof WorkerChannelEventsMap>(
|
|
26
|
+
event: Event,
|
|
27
|
+
...rest: WorkerChannelEventsMap[Event]
|
|
28
|
+
): void {
|
|
29
|
+
const [data, transfer] = rest
|
|
30
|
+
this.port.postMessage({ type: event, data }, { transfer })
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { devUtils } from '~/core/utils/internal/devUtils'
|
|
2
|
+
import { StartOptions, SetupWorkerInternalContext } from '../../glossary'
|
|
3
|
+
import { printStartMessage } from './printStartMessage'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Signals the worker to enable the interception of requests.
|
|
7
|
+
*/
|
|
8
|
+
export async function enableMocking(
|
|
9
|
+
context: SetupWorkerInternalContext,
|
|
10
|
+
options: StartOptions,
|
|
11
|
+
) {
|
|
12
|
+
context.workerChannel.send('MOCK_ACTIVATE')
|
|
13
|
+
await context.events.once('MOCKING_ENABLED')
|
|
14
|
+
|
|
15
|
+
// Warn the developer on multiple "worker.start()" calls.
|
|
16
|
+
// While this will not affect the worker in any way,
|
|
17
|
+
// it likely indicates an issue with the developer's code.
|
|
18
|
+
if (context.isMockingEnabled) {
|
|
19
|
+
devUtils.warn(
|
|
20
|
+
`Found a redundant "worker.start()" call. Note that starting the worker while mocking is already enabled will have no effect. Consider removing this "worker.start()" call.`,
|
|
21
|
+
)
|
|
22
|
+
return
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
context.isMockingEnabled = true
|
|
26
|
+
|
|
27
|
+
printStartMessage({
|
|
28
|
+
quiet: options.quiet,
|
|
29
|
+
workerScope: context.registration?.scope,
|
|
30
|
+
workerUrl: context.worker?.scriptURL,
|
|
31
|
+
})
|
|
32
|
+
}
|