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 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/handlers/GraphQLHandler.ts"],"sourcesContent":["import type { DocumentNode, GraphQLError, OperationTypeNode } from 'graphql'\nimport {\n DefaultBodyType,\n RequestHandler,\n RequestHandlerDefaultInfo,\n RequestHandlerOptions,\n ResponseResolver,\n} from './RequestHandler'\nimport { getTimestamp } from '../utils/logging/getTimestamp'\nimport { getStatusCodeColor } from '../utils/logging/getStatusCodeColor'\nimport { serializeRequest } from '../utils/logging/serializeRequest'\nimport { serializeResponse } from '../utils/logging/serializeResponse'\nimport { Match, matchRequestUrl, Path } from '../utils/matching/matchRequestUrl'\nimport {\n ParsedGraphQLRequest,\n GraphQLMultipartRequestBody,\n parseGraphQLRequest,\n parseDocumentNode,\n} from '../utils/internal/parseGraphQLRequest'\nimport { getPublicUrlFromRequest } from '../utils/request/getPublicUrlFromRequest'\nimport { devUtils } from '../utils/internal/devUtils'\nimport { getAllRequestCookies } from '../utils/request/getRequestCookies'\n\nexport type ExpectedOperationTypeNode = OperationTypeNode | 'all'\nexport type GraphQLHandlerNameSelector = DocumentNode | RegExp | string\n\nexport type GraphQLVariables = Record<string, any>\n\nexport interface GraphQLHandlerInfo extends RequestHandlerDefaultInfo {\n operationType: ExpectedOperationTypeNode\n operationName: GraphQLHandlerNameSelector\n}\n\nexport type GraphQLRequestParsedResult = {\n match: Match\n} & (\n | ParsedGraphQLRequest<GraphQLVariables>\n /**\n * An empty version of the ParsedGraphQLRequest\n * which simplifies the return type of the resolver\n * when the request is to a non-matching endpoint\n */\n | {\n operationType?: undefined\n operationName?: undefined\n query?: undefined\n variables?: undefined\n }\n)\n\nexport type GraphQLResolverExtras<Variables extends GraphQLVariables> = {\n query: string\n operationName: string\n variables: Variables\n cookies: Record<string, string>\n}\n\nexport type GraphQLRequestBody<VariablesType extends GraphQLVariables> =\n | GraphQLJsonRequestBody<VariablesType>\n | GraphQLMultipartRequestBody\n | Record<string, any>\n | undefined\n\nexport interface GraphQLJsonRequestBody<Variables extends GraphQLVariables> {\n query: string\n variables?: Variables\n}\n\nexport interface GraphQLResponseBody<BodyType extends DefaultBodyType> {\n data?: BodyType | null\n errors?: readonly Partial<GraphQLError>[] | null\n}\n\nexport function isDocumentNode(\n value: DocumentNode | any,\n): value is DocumentNode {\n if (value == null) {\n return false\n }\n\n return typeof value === 'object' && 'kind' in value && 'definitions' in value\n}\n\nexport class GraphQLHandler extends RequestHandler<\n GraphQLHandlerInfo,\n GraphQLRequestParsedResult,\n GraphQLResolverExtras<any>\n> {\n private endpoint: Path\n\n static parsedRequestCache = new WeakMap<\n Request,\n ParsedGraphQLRequest<GraphQLVariables>\n >()\n\n constructor(\n operationType: ExpectedOperationTypeNode,\n operationName: GraphQLHandlerNameSelector,\n endpoint: Path,\n resolver: ResponseResolver<GraphQLResolverExtras<any>, any, any>,\n options?: RequestHandlerOptions,\n ) {\n let resolvedOperationName = operationName\n\n if (isDocumentNode(operationName)) {\n const parsedNode = parseDocumentNode(operationName)\n\n if (parsedNode.operationType !== operationType) {\n throw new Error(\n `Failed to create a GraphQL handler: provided a DocumentNode with a mismatched operation type (expected \"${operationType}\", but got \"${parsedNode.operationType}\").`,\n )\n }\n\n if (!parsedNode.operationName) {\n throw new Error(\n `Failed to create a GraphQL handler: provided a DocumentNode with no operation name.`,\n )\n }\n\n resolvedOperationName = parsedNode.operationName\n }\n\n const header =\n operationType === 'all'\n ? `${operationType} (origin: ${endpoint.toString()})`\n : `${operationType} ${resolvedOperationName} (origin: ${endpoint.toString()})`\n\n super({\n info: {\n header,\n operationType,\n operationName: resolvedOperationName,\n },\n resolver,\n options,\n })\n\n this.endpoint = endpoint\n }\n\n /**\n * Parses the request body, once per request, cached across all\n * GraphQL handlers. This is done to avoid multiple parsing of the\n * request body, which each requires a clone of the request.\n */\n async parseGraphQLRequestOrGetFromCache(\n request: Request,\n ): Promise<ParsedGraphQLRequest<GraphQLVariables>> {\n if (!GraphQLHandler.parsedRequestCache.has(request)) {\n GraphQLHandler.parsedRequestCache.set(\n request,\n await parseGraphQLRequest(request).catch((error) => {\n console.error(error)\n return undefined\n }),\n )\n }\n\n return GraphQLHandler.parsedRequestCache.get(request)\n }\n\n async parse(args: { request: Request }): Promise<GraphQLRequestParsedResult> {\n /**\n * If the request doesn't match a specified endpoint, there's no\n * need to parse it since there's no case where we would handle this\n */\n const match = matchRequestUrl(new URL(args.request.url), this.endpoint)\n if (!match.matches) {\n return { match }\n }\n\n const parsedResult = await this.parseGraphQLRequestOrGetFromCache(\n args.request,\n )\n\n if (typeof parsedResult === 'undefined') {\n return { match }\n }\n\n return {\n match,\n query: parsedResult.query,\n operationType: parsedResult.operationType,\n operationName: parsedResult.operationName,\n variables: parsedResult.variables,\n }\n }\n\n predicate(args: {\n request: Request\n parsedResult: GraphQLRequestParsedResult\n }) {\n if (args.parsedResult.operationType === undefined) {\n return false\n }\n\n if (!args.parsedResult.operationName && this.info.operationType !== 'all') {\n const publicUrl = getPublicUrlFromRequest(args.request)\n\n devUtils.warn(`\\\nFailed to intercept a GraphQL request at \"${args.request.method} ${publicUrl}\": anonymous GraphQL operations are not supported.\n\nConsider naming this operation or using \"graphql.operation()\" request handler to intercept GraphQL requests regardless of their operation name/type. Read more: https://mswjs.io/docs/api/graphql/#graphqloperationresolver`)\n return false\n }\n\n const hasMatchingOperationType =\n this.info.operationType === 'all' ||\n args.parsedResult.operationType === this.info.operationType\n\n const hasMatchingOperationName =\n this.info.operationName instanceof RegExp\n ? this.info.operationName.test(args.parsedResult.operationName || '')\n : args.parsedResult.operationName === this.info.operationName\n\n return (\n args.parsedResult.match.matches &&\n hasMatchingOperationType &&\n hasMatchingOperationName\n )\n }\n\n protected extendResolverArgs(args: {\n request: Request\n parsedResult: GraphQLRequestParsedResult\n }) {\n const cookies = getAllRequestCookies(args.request)\n\n return {\n query: args.parsedResult.query || '',\n operationName: args.parsedResult.operationName || '',\n variables: args.parsedResult.variables || {},\n cookies,\n }\n }\n\n async log(args: {\n request: Request\n response: Response\n parsedResult: GraphQLRequestParsedResult\n }) {\n const loggedRequest = await serializeRequest(args.request)\n const loggedResponse = await serializeResponse(args.response)\n const statusColor = getStatusCodeColor(loggedResponse.status)\n const requestInfo = args.parsedResult.operationName\n ? `${args.parsedResult.operationType} ${args.parsedResult.operationName}`\n : `anonymous ${args.parsedResult.operationType}`\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp()} ${requestInfo} (%c${loggedResponse.status} ${\n loggedResponse.statusText\n }%c)`,\n ),\n `color:${statusColor}`,\n 'color:inherit',\n )\n console.log('Request:', loggedRequest)\n console.log('Handler:', this)\n console.log('Response:', loggedResponse)\n console.groupEnd()\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -39,7 +39,7 @@ function isDocumentNode(value) {
|
|
|
39
39
|
}
|
|
40
40
|
return typeof value === "object" && "kind" in value && "definitions" in value;
|
|
41
41
|
}
|
|
42
|
-
class
|
|
42
|
+
const _GraphQLHandler = class _GraphQLHandler extends RequestHandler {
|
|
43
43
|
constructor(operationType, operationName, endpoint, resolver, options) {
|
|
44
44
|
let resolvedOperationName = operationName;
|
|
45
45
|
if (isDocumentNode(operationName)) {
|
|
@@ -68,16 +68,33 @@ class GraphQLHandler extends RequestHandler {
|
|
|
68
68
|
});
|
|
69
69
|
this.endpoint = endpoint;
|
|
70
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Parses the request body, once per request, cached across all
|
|
73
|
+
* GraphQL handlers. This is done to avoid multiple parsing of the
|
|
74
|
+
* request body, which each requires a clone of the request.
|
|
75
|
+
*/
|
|
76
|
+
parseGraphQLRequestOrGetFromCache(request) {
|
|
77
|
+
return __async(this, null, function* () {
|
|
78
|
+
if (!_GraphQLHandler.parsedRequestCache.has(request)) {
|
|
79
|
+
_GraphQLHandler.parsedRequestCache.set(
|
|
80
|
+
request,
|
|
81
|
+
yield parseGraphQLRequest(request).catch((error) => {
|
|
82
|
+
console.error(error);
|
|
83
|
+
return void 0;
|
|
84
|
+
})
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
return _GraphQLHandler.parsedRequestCache.get(request);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
71
90
|
parse(args) {
|
|
72
91
|
return __async(this, null, function* () {
|
|
73
92
|
const match = matchRequestUrl(new URL(args.request.url), this.endpoint);
|
|
74
|
-
if (!match.matches)
|
|
93
|
+
if (!match.matches) {
|
|
75
94
|
return { match };
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
return void 0;
|
|
80
|
-
}
|
|
95
|
+
}
|
|
96
|
+
const parsedResult = yield this.parseGraphQLRequestOrGetFromCache(
|
|
97
|
+
args.request
|
|
81
98
|
);
|
|
82
99
|
if (typeof parsedResult === "undefined") {
|
|
83
100
|
return { match };
|
|
@@ -134,8 +151,11 @@ Consider naming this operation or using "graphql.operation()" request handler to
|
|
|
134
151
|
console.groupEnd();
|
|
135
152
|
});
|
|
136
153
|
}
|
|
137
|
-
}
|
|
154
|
+
};
|
|
155
|
+
_GraphQLHandler.parsedRequestCache = /* @__PURE__ */ new WeakMap();
|
|
156
|
+
let GraphQLHandler = _GraphQLHandler;
|
|
138
157
|
export {
|
|
139
158
|
GraphQLHandler,
|
|
140
159
|
isDocumentNode
|
|
141
160
|
};
|
|
161
|
+
//# sourceMappingURL=GraphQLHandler.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/handlers/GraphQLHandler.ts"],"sourcesContent":["import type { DocumentNode, GraphQLError, OperationTypeNode } from 'graphql'\nimport {\n DefaultBodyType,\n RequestHandler,\n RequestHandlerDefaultInfo,\n RequestHandlerOptions,\n ResponseResolver,\n} from './RequestHandler'\nimport { getTimestamp } from '../utils/logging/getTimestamp'\nimport { getStatusCodeColor } from '../utils/logging/getStatusCodeColor'\nimport { serializeRequest } from '../utils/logging/serializeRequest'\nimport { serializeResponse } from '../utils/logging/serializeResponse'\nimport { Match, matchRequestUrl, Path } from '../utils/matching/matchRequestUrl'\nimport {\n ParsedGraphQLRequest,\n GraphQLMultipartRequestBody,\n parseGraphQLRequest,\n parseDocumentNode,\n} from '../utils/internal/parseGraphQLRequest'\nimport { getPublicUrlFromRequest } from '../utils/request/getPublicUrlFromRequest'\nimport { devUtils } from '../utils/internal/devUtils'\nimport { getAllRequestCookies } from '../utils/request/getRequestCookies'\n\nexport type ExpectedOperationTypeNode = OperationTypeNode | 'all'\nexport type GraphQLHandlerNameSelector = DocumentNode | RegExp | string\n\nexport type GraphQLVariables = Record<string, any>\n\nexport interface GraphQLHandlerInfo extends RequestHandlerDefaultInfo {\n operationType: ExpectedOperationTypeNode\n operationName: GraphQLHandlerNameSelector\n}\n\nexport type GraphQLRequestParsedResult = {\n match: Match\n} & (\n | ParsedGraphQLRequest<GraphQLVariables>\n /**\n * An empty version of the ParsedGraphQLRequest\n * which simplifies the return type of the resolver\n * when the request is to a non-matching endpoint\n */\n | {\n operationType?: undefined\n operationName?: undefined\n query?: undefined\n variables?: undefined\n }\n)\n\nexport type GraphQLResolverExtras<Variables extends GraphQLVariables> = {\n query: string\n operationName: string\n variables: Variables\n cookies: Record<string, string>\n}\n\nexport type GraphQLRequestBody<VariablesType extends GraphQLVariables> =\n | GraphQLJsonRequestBody<VariablesType>\n | GraphQLMultipartRequestBody\n | Record<string, any>\n | undefined\n\nexport interface GraphQLJsonRequestBody<Variables extends GraphQLVariables> {\n query: string\n variables?: Variables\n}\n\nexport interface GraphQLResponseBody<BodyType extends DefaultBodyType> {\n data?: BodyType | null\n errors?: readonly Partial<GraphQLError>[] | null\n}\n\nexport function isDocumentNode(\n value: DocumentNode | any,\n): value is DocumentNode {\n if (value == null) {\n return false\n }\n\n return typeof value === 'object' && 'kind' in value && 'definitions' in value\n}\n\nexport class GraphQLHandler extends RequestHandler<\n GraphQLHandlerInfo,\n GraphQLRequestParsedResult,\n GraphQLResolverExtras<any>\n> {\n private endpoint: Path\n\n static parsedRequestCache = new WeakMap<\n Request,\n ParsedGraphQLRequest<GraphQLVariables>\n >()\n\n constructor(\n operationType: ExpectedOperationTypeNode,\n operationName: GraphQLHandlerNameSelector,\n endpoint: Path,\n resolver: ResponseResolver<GraphQLResolverExtras<any>, any, any>,\n options?: RequestHandlerOptions,\n ) {\n let resolvedOperationName = operationName\n\n if (isDocumentNode(operationName)) {\n const parsedNode = parseDocumentNode(operationName)\n\n if (parsedNode.operationType !== operationType) {\n throw new Error(\n `Failed to create a GraphQL handler: provided a DocumentNode with a mismatched operation type (expected \"${operationType}\", but got \"${parsedNode.operationType}\").`,\n )\n }\n\n if (!parsedNode.operationName) {\n throw new Error(\n `Failed to create a GraphQL handler: provided a DocumentNode with no operation name.`,\n )\n }\n\n resolvedOperationName = parsedNode.operationName\n }\n\n const header =\n operationType === 'all'\n ? `${operationType} (origin: ${endpoint.toString()})`\n : `${operationType} ${resolvedOperationName} (origin: ${endpoint.toString()})`\n\n super({\n info: {\n header,\n operationType,\n operationName: resolvedOperationName,\n },\n resolver,\n options,\n })\n\n this.endpoint = endpoint\n }\n\n /**\n * Parses the request body, once per request, cached across all\n * GraphQL handlers. This is done to avoid multiple parsing of the\n * request body, which each requires a clone of the request.\n */\n async parseGraphQLRequestOrGetFromCache(\n request: Request,\n ): Promise<ParsedGraphQLRequest<GraphQLVariables>> {\n if (!GraphQLHandler.parsedRequestCache.has(request)) {\n GraphQLHandler.parsedRequestCache.set(\n request,\n await parseGraphQLRequest(request).catch((error) => {\n console.error(error)\n return undefined\n }),\n )\n }\n\n return GraphQLHandler.parsedRequestCache.get(request)\n }\n\n async parse(args: { request: Request }): Promise<GraphQLRequestParsedResult> {\n /**\n * If the request doesn't match a specified endpoint, there's no\n * need to parse it since there's no case where we would handle this\n */\n const match = matchRequestUrl(new URL(args.request.url), this.endpoint)\n if (!match.matches) {\n return { match }\n }\n\n const parsedResult = await this.parseGraphQLRequestOrGetFromCache(\n args.request,\n )\n\n if (typeof parsedResult === 'undefined') {\n return { match }\n }\n\n return {\n match,\n query: parsedResult.query,\n operationType: parsedResult.operationType,\n operationName: parsedResult.operationName,\n variables: parsedResult.variables,\n }\n }\n\n predicate(args: {\n request: Request\n parsedResult: GraphQLRequestParsedResult\n }) {\n if (args.parsedResult.operationType === undefined) {\n return false\n }\n\n if (!args.parsedResult.operationName && this.info.operationType !== 'all') {\n const publicUrl = getPublicUrlFromRequest(args.request)\n\n devUtils.warn(`\\\nFailed to intercept a GraphQL request at \"${args.request.method} ${publicUrl}\": anonymous GraphQL operations are not supported.\n\nConsider naming this operation or using \"graphql.operation()\" request handler to intercept GraphQL requests regardless of their operation name/type. Read more: https://mswjs.io/docs/api/graphql/#graphqloperationresolver`)\n return false\n }\n\n const hasMatchingOperationType =\n this.info.operationType === 'all' ||\n args.parsedResult.operationType === this.info.operationType\n\n const hasMatchingOperationName =\n this.info.operationName instanceof RegExp\n ? this.info.operationName.test(args.parsedResult.operationName || '')\n : args.parsedResult.operationName === this.info.operationName\n\n return (\n args.parsedResult.match.matches &&\n hasMatchingOperationType &&\n hasMatchingOperationName\n )\n }\n\n protected extendResolverArgs(args: {\n request: Request\n parsedResult: GraphQLRequestParsedResult\n }) {\n const cookies = getAllRequestCookies(args.request)\n\n return {\n query: args.parsedResult.query || '',\n operationName: args.parsedResult.operationName || '',\n variables: args.parsedResult.variables || {},\n cookies,\n }\n }\n\n async log(args: {\n request: Request\n response: Response\n parsedResult: GraphQLRequestParsedResult\n }) {\n const loggedRequest = await serializeRequest(args.request)\n const loggedResponse = await serializeResponse(args.response)\n const statusColor = getStatusCodeColor(loggedResponse.status)\n const requestInfo = args.parsedResult.operationName\n ? `${args.parsedResult.operationType} ${args.parsedResult.operationName}`\n : `anonymous ${args.parsedResult.operationType}`\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp()} ${requestInfo} (%c${loggedResponse.status} ${\n loggedResponse.statusText\n }%c)`,\n ),\n `color:${statusColor}`,\n 'color:inherit',\n )\n console.log('Request:', loggedRequest)\n console.log('Handler:', this)\n console.log('Response:', loggedResponse)\n console.groupEnd()\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { g as RequestHandlerDefaultInfo, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions, i as ResponseResolutionContext } from '../RequestHandler-vxZdj6Tw.mjs';
|
|
2
|
+
import { Path, Match, PathParams } from '../utils/matching/matchRequestUrl.mjs';
|
|
3
|
+
import '../typeUtils.mjs';
|
|
4
|
+
|
|
5
|
+
type HttpHandlerMethod = string | RegExp;
|
|
6
|
+
interface HttpHandlerInfo extends RequestHandlerDefaultInfo {
|
|
7
|
+
method: HttpHandlerMethod;
|
|
8
|
+
path: Path;
|
|
9
|
+
}
|
|
10
|
+
declare enum HttpMethods {
|
|
11
|
+
HEAD = "HEAD",
|
|
12
|
+
GET = "GET",
|
|
13
|
+
POST = "POST",
|
|
14
|
+
PUT = "PUT",
|
|
15
|
+
PATCH = "PATCH",
|
|
16
|
+
OPTIONS = "OPTIONS",
|
|
17
|
+
DELETE = "DELETE"
|
|
18
|
+
}
|
|
19
|
+
type RequestQuery = {
|
|
20
|
+
[queryName: string]: string;
|
|
21
|
+
};
|
|
22
|
+
type HttpRequestParsedResult = {
|
|
23
|
+
match: Match;
|
|
24
|
+
cookies: Record<string, string>;
|
|
25
|
+
};
|
|
26
|
+
type HttpRequestResolverExtras<Params extends PathParams> = {
|
|
27
|
+
params: Params;
|
|
28
|
+
cookies: Record<string, string>;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Request handler for HTTP requests.
|
|
32
|
+
* Provides request matching based on method and URL.
|
|
33
|
+
*/
|
|
34
|
+
declare class HttpHandler extends RequestHandler<HttpHandlerInfo, HttpRequestParsedResult, HttpRequestResolverExtras<any>> {
|
|
35
|
+
constructor(method: HttpHandlerMethod, path: Path, resolver: ResponseResolver<HttpRequestResolverExtras<any>, any, any>, options?: RequestHandlerOptions);
|
|
36
|
+
private checkRedundantQueryParameters;
|
|
37
|
+
parse(args: {
|
|
38
|
+
request: Request;
|
|
39
|
+
resolutionContext?: ResponseResolutionContext;
|
|
40
|
+
}): Promise<{
|
|
41
|
+
match: Match;
|
|
42
|
+
cookies: Record<string, string>;
|
|
43
|
+
}>;
|
|
44
|
+
predicate(args: {
|
|
45
|
+
request: Request;
|
|
46
|
+
parsedResult: HttpRequestParsedResult;
|
|
47
|
+
}): boolean;
|
|
48
|
+
private matchMethod;
|
|
49
|
+
protected extendResolverArgs(args: {
|
|
50
|
+
request: Request;
|
|
51
|
+
parsedResult: HttpRequestParsedResult;
|
|
52
|
+
}): {
|
|
53
|
+
params: PathParams<string>;
|
|
54
|
+
cookies: Record<string, string>;
|
|
55
|
+
};
|
|
56
|
+
log(args: {
|
|
57
|
+
request: Request;
|
|
58
|
+
response: Response;
|
|
59
|
+
}): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { HttpHandler, type HttpHandlerInfo, HttpMethods, type HttpRequestParsedResult, type HttpRequestResolverExtras, type RequestQuery };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { g as RequestHandlerDefaultInfo, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions, i as ResponseResolutionContext } from '../RequestHandler-
|
|
1
|
+
import { g as RequestHandlerDefaultInfo, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions, i as ResponseResolutionContext } from '../RequestHandler-rBDJQrEf.js';
|
|
2
2
|
import { Path, Match, PathParams } from '../utils/matching/matchRequestUrl.js';
|
|
3
3
|
import '../typeUtils.js';
|
|
4
4
|
|
|
@@ -59,4 +59,4 @@ declare class HttpHandler extends RequestHandler<HttpHandlerInfo, HttpRequestPar
|
|
|
59
59
|
}): Promise<void>;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
export { HttpHandler, HttpHandlerInfo, HttpMethods, HttpRequestParsedResult, HttpRequestResolverExtras, RequestQuery };
|
|
62
|
+
export { HttpHandler, type HttpHandlerInfo, HttpMethods, type HttpRequestParsedResult, type HttpRequestResolverExtras, type RequestQuery };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/handlers/HttpHandler.ts"],"sourcesContent":["import { ResponseResolutionContext } from '../utils/getResponse'\nimport { devUtils } from '../utils/internal/devUtils'\nimport { isStringEqual } from '../utils/internal/isStringEqual'\nimport { getStatusCodeColor } from '../utils/logging/getStatusCodeColor'\nimport { getTimestamp } from '../utils/logging/getTimestamp'\nimport { serializeRequest } from '../utils/logging/serializeRequest'\nimport { serializeResponse } from '../utils/logging/serializeResponse'\nimport {\n matchRequestUrl,\n Match,\n Path,\n PathParams,\n} from '../utils/matching/matchRequestUrl'\nimport { getPublicUrlFromRequest } from '../utils/request/getPublicUrlFromRequest'\nimport { getAllRequestCookies } from '../utils/request/getRequestCookies'\nimport { cleanUrl, getSearchParams } from '../utils/url/cleanUrl'\nimport {\n RequestHandler,\n RequestHandlerDefaultInfo,\n RequestHandlerOptions,\n ResponseResolver,\n} from './RequestHandler'\n\ntype HttpHandlerMethod = string | RegExp\n\nexport interface HttpHandlerInfo extends RequestHandlerDefaultInfo {\n method: HttpHandlerMethod\n path: Path\n}\n\nexport enum HttpMethods {\n HEAD = 'HEAD',\n GET = 'GET',\n POST = 'POST',\n PUT = 'PUT',\n PATCH = 'PATCH',\n OPTIONS = 'OPTIONS',\n DELETE = 'DELETE',\n}\n\nexport type RequestQuery = {\n [queryName: string]: string\n}\n\nexport type HttpRequestParsedResult = {\n match: Match\n cookies: Record<string, string>\n}\n\nexport type HttpRequestResolverExtras<Params extends PathParams> = {\n params: Params\n cookies: Record<string, string>\n}\n\n/**\n * Request handler for HTTP requests.\n * Provides request matching based on method and URL.\n */\nexport class HttpHandler extends RequestHandler<\n HttpHandlerInfo,\n HttpRequestParsedResult,\n HttpRequestResolverExtras<any>\n> {\n constructor(\n method: HttpHandlerMethod,\n path: Path,\n resolver: ResponseResolver<HttpRequestResolverExtras<any>, any, any>,\n options?: RequestHandlerOptions,\n ) {\n super({\n info: {\n header: `${method} ${path}`,\n path,\n method,\n },\n resolver,\n options,\n })\n\n this.checkRedundantQueryParameters()\n }\n\n private checkRedundantQueryParameters() {\n const { method, path } = this.info\n\n if (path instanceof RegExp) {\n return\n }\n\n const url = cleanUrl(path)\n\n // Bypass request handler URLs that have no redundant characters.\n if (url === path) {\n return\n }\n\n const searchParams = getSearchParams(path)\n const queryParams: string[] = []\n\n searchParams.forEach((_, paramName) => {\n queryParams.push(paramName)\n })\n\n devUtils.warn(\n `Found a redundant usage of query parameters in the request handler URL for \"${method} ${path}\". Please match against a path instead and access query parameters in the response resolver function using \"req.url.searchParams\".`,\n )\n }\n\n async parse(args: {\n request: Request\n resolutionContext?: ResponseResolutionContext\n }) {\n const url = new URL(args.request.url)\n const match = matchRequestUrl(\n url,\n this.info.path,\n args.resolutionContext?.baseUrl,\n )\n const cookies = getAllRequestCookies(args.request)\n\n return {\n match,\n cookies,\n }\n }\n\n predicate(args: { request: Request; parsedResult: HttpRequestParsedResult }) {\n const hasMatchingMethod = this.matchMethod(args.request.method)\n const hasMatchingUrl = args.parsedResult.match.matches\n return hasMatchingMethod && hasMatchingUrl\n }\n\n private matchMethod(actualMethod: string): boolean {\n return this.info.method instanceof RegExp\n ? this.info.method.test(actualMethod)\n : isStringEqual(this.info.method, actualMethod)\n }\n\n protected extendResolverArgs(args: {\n request: Request\n parsedResult: HttpRequestParsedResult\n }) {\n return {\n params: args.parsedResult.match?.params || {},\n cookies: args.parsedResult.cookies,\n }\n }\n\n async log(args: { request: Request; response: Response }) {\n const publicUrl = getPublicUrlFromRequest(args.request)\n const loggedRequest = await serializeRequest(args.request)\n const loggedResponse = await serializeResponse(args.response)\n const statusColor = getStatusCodeColor(loggedResponse.status)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp()} ${args.request.method} ${publicUrl} (%c${\n loggedResponse.status\n } ${loggedResponse.statusText}%c)`,\n ),\n `color:${statusColor}`,\n 'color:inherit',\n )\n console.log('Request', loggedRequest)\n console.log('Handler:', this)\n console.log('Response', loggedResponse)\n console.groupEnd()\n }\n}\n"],"mappings":"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","names":["HttpMethods"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/handlers/HttpHandler.ts"],"sourcesContent":["import { ResponseResolutionContext } from '../utils/getResponse'\nimport { devUtils } from '../utils/internal/devUtils'\nimport { isStringEqual } from '../utils/internal/isStringEqual'\nimport { getStatusCodeColor } from '../utils/logging/getStatusCodeColor'\nimport { getTimestamp } from '../utils/logging/getTimestamp'\nimport { serializeRequest } from '../utils/logging/serializeRequest'\nimport { serializeResponse } from '../utils/logging/serializeResponse'\nimport {\n matchRequestUrl,\n Match,\n Path,\n PathParams,\n} from '../utils/matching/matchRequestUrl'\nimport { getPublicUrlFromRequest } from '../utils/request/getPublicUrlFromRequest'\nimport { getAllRequestCookies } from '../utils/request/getRequestCookies'\nimport { cleanUrl, getSearchParams } from '../utils/url/cleanUrl'\nimport {\n RequestHandler,\n RequestHandlerDefaultInfo,\n RequestHandlerOptions,\n ResponseResolver,\n} from './RequestHandler'\n\ntype HttpHandlerMethod = string | RegExp\n\nexport interface HttpHandlerInfo extends RequestHandlerDefaultInfo {\n method: HttpHandlerMethod\n path: Path\n}\n\nexport enum HttpMethods {\n HEAD = 'HEAD',\n GET = 'GET',\n POST = 'POST',\n PUT = 'PUT',\n PATCH = 'PATCH',\n OPTIONS = 'OPTIONS',\n DELETE = 'DELETE',\n}\n\nexport type RequestQuery = {\n [queryName: string]: string\n}\n\nexport type HttpRequestParsedResult = {\n match: Match\n cookies: Record<string, string>\n}\n\nexport type HttpRequestResolverExtras<Params extends PathParams> = {\n params: Params\n cookies: Record<string, string>\n}\n\n/**\n * Request handler for HTTP requests.\n * Provides request matching based on method and URL.\n */\nexport class HttpHandler extends RequestHandler<\n HttpHandlerInfo,\n HttpRequestParsedResult,\n HttpRequestResolverExtras<any>\n> {\n constructor(\n method: HttpHandlerMethod,\n path: Path,\n resolver: ResponseResolver<HttpRequestResolverExtras<any>, any, any>,\n options?: RequestHandlerOptions,\n ) {\n super({\n info: {\n header: `${method} ${path}`,\n path,\n method,\n },\n resolver,\n options,\n })\n\n this.checkRedundantQueryParameters()\n }\n\n private checkRedundantQueryParameters() {\n const { method, path } = this.info\n\n if (path instanceof RegExp) {\n return\n }\n\n const url = cleanUrl(path)\n\n // Bypass request handler URLs that have no redundant characters.\n if (url === path) {\n return\n }\n\n const searchParams = getSearchParams(path)\n const queryParams: string[] = []\n\n searchParams.forEach((_, paramName) => {\n queryParams.push(paramName)\n })\n\n devUtils.warn(\n `Found a redundant usage of query parameters in the request handler URL for \"${method} ${path}\". Please match against a path instead and access query parameters in the response resolver function using \"req.url.searchParams\".`,\n )\n }\n\n async parse(args: {\n request: Request\n resolutionContext?: ResponseResolutionContext\n }) {\n const url = new URL(args.request.url)\n const match = matchRequestUrl(\n url,\n this.info.path,\n args.resolutionContext?.baseUrl,\n )\n const cookies = getAllRequestCookies(args.request)\n\n return {\n match,\n cookies,\n }\n }\n\n predicate(args: { request: Request; parsedResult: HttpRequestParsedResult }) {\n const hasMatchingMethod = this.matchMethod(args.request.method)\n const hasMatchingUrl = args.parsedResult.match.matches\n return hasMatchingMethod && hasMatchingUrl\n }\n\n private matchMethod(actualMethod: string): boolean {\n return this.info.method instanceof RegExp\n ? this.info.method.test(actualMethod)\n : isStringEqual(this.info.method, actualMethod)\n }\n\n protected extendResolverArgs(args: {\n request: Request\n parsedResult: HttpRequestParsedResult\n }) {\n return {\n params: args.parsedResult.match?.params || {},\n cookies: args.parsedResult.cookies,\n }\n }\n\n async log(args: { request: Request; response: Response }) {\n const publicUrl = getPublicUrlFromRequest(args.request)\n const loggedRequest = await serializeRequest(args.request)\n const loggedResponse = await serializeResponse(args.response)\n const statusColor = getStatusCodeColor(loggedResponse.status)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp()} ${args.request.method} ${publicUrl} (%c${\n loggedResponse.status\n } ${loggedResponse.statusText}%c)`,\n ),\n `color:${statusColor}`,\n 'color:inherit',\n )\n console.log('Request', loggedRequest)\n console.log('Handler:', this)\n console.log('Response', loggedResponse)\n console.groupEnd()\n }\n}\n"],"mappings":"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","names":["HttpMethods"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { A as AsyncResponseResolverReturnType, D as DefaultBodyType, d as DefaultRequestMultipartBody, J as JsonBodyType, M as MaybeAsyncResponseResolverReturnType, R as RequestHandler, m as RequestHandlerArgs, g as RequestHandlerDefaultInfo, n as RequestHandlerExecutionResult, k as RequestHandlerInternalInfo, c as RequestHandlerOptions, a as ResponseResolver, l as ResponseResolverInfo, b as ResponseResolverReturnType } from '../RequestHandler-vxZdj6Tw.mjs';
|
|
2
|
+
import '../typeUtils.mjs';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { A as AsyncResponseResolverReturnType, D as DefaultBodyType, d as DefaultRequestMultipartBody, J as JsonBodyType, M as MaybeAsyncResponseResolverReturnType, R as RequestHandler, m as RequestHandlerArgs, g as RequestHandlerDefaultInfo, n as RequestHandlerExecutionResult, k as RequestHandlerInternalInfo, c as RequestHandlerOptions, a as ResponseResolver, l as ResponseResolverInfo, b as ResponseResolverReturnType } from '../RequestHandler-
|
|
1
|
+
export { A as AsyncResponseResolverReturnType, D as DefaultBodyType, d as DefaultRequestMultipartBody, J as JsonBodyType, M as MaybeAsyncResponseResolverReturnType, R as RequestHandler, m as RequestHandlerArgs, g as RequestHandlerDefaultInfo, n as RequestHandlerExecutionResult, k as RequestHandlerInternalInfo, c as RequestHandlerOptions, a as ResponseResolver, l as ResponseResolverInfo, b as ResponseResolverReturnType } from '../RequestHandler-rBDJQrEf.js';
|
|
2
2
|
import '../typeUtils.js';
|
|
@@ -61,7 +61,7 @@ module.exports = __toCommonJS(RequestHandler_exports);
|
|
|
61
61
|
var import_outvariant = require("outvariant");
|
|
62
62
|
var import_getCallFrame = require("../utils/internal/getCallFrame.js");
|
|
63
63
|
var import_isIterable = require("../utils/internal/isIterable.js");
|
|
64
|
-
class
|
|
64
|
+
const _RequestHandler = class _RequestHandler {
|
|
65
65
|
constructor(args) {
|
|
66
66
|
this.resolver = args.resolver;
|
|
67
67
|
this.options = args.options;
|
|
@@ -103,6 +103,18 @@ class RequestHandler {
|
|
|
103
103
|
extendResolverArgs(_args) {
|
|
104
104
|
return {};
|
|
105
105
|
}
|
|
106
|
+
// Clone the request instance before it's passed to the handler phases
|
|
107
|
+
// and the response resolver so we can always read it for logging.
|
|
108
|
+
// We only clone it once per request to avoid unnecessary overhead.
|
|
109
|
+
cloneRequestOrGetFromCache(request) {
|
|
110
|
+
const existingClone = _RequestHandler.cache.get(request);
|
|
111
|
+
if (typeof existingClone !== "undefined") {
|
|
112
|
+
return existingClone;
|
|
113
|
+
}
|
|
114
|
+
const clonedRequest = request.clone();
|
|
115
|
+
_RequestHandler.cache.set(request, clonedRequest);
|
|
116
|
+
return clonedRequest;
|
|
117
|
+
}
|
|
106
118
|
/**
|
|
107
119
|
* Execute this request handler and produce a mocked response
|
|
108
120
|
* using the given resolver function.
|
|
@@ -113,7 +125,7 @@ class RequestHandler {
|
|
|
113
125
|
if (this.isUsed && ((_a = this.options) == null ? void 0 : _a.once)) {
|
|
114
126
|
return null;
|
|
115
127
|
}
|
|
116
|
-
const
|
|
128
|
+
const requestClone = this.cloneRequestOrGetFromCache(args.request);
|
|
117
129
|
const parsedResult = yield this.parse({
|
|
118
130
|
request: args.request,
|
|
119
131
|
resolutionContext: args.resolutionContext
|
|
@@ -141,7 +153,7 @@ class RequestHandler {
|
|
|
141
153
|
const executionResult = this.createExecutionResult({
|
|
142
154
|
// Pass the cloned request to the result so that logging
|
|
143
155
|
// and other consumers could read its body once more.
|
|
144
|
-
request:
|
|
156
|
+
request: requestClone,
|
|
145
157
|
response: mockedResponse,
|
|
146
158
|
parsedResult
|
|
147
159
|
});
|
|
@@ -184,4 +196,7 @@ class RequestHandler {
|
|
|
184
196
|
parsedResult: args.parsedResult
|
|
185
197
|
};
|
|
186
198
|
}
|
|
187
|
-
}
|
|
199
|
+
};
|
|
200
|
+
_RequestHandler.cache = /* @__PURE__ */ new WeakMap();
|
|
201
|
+
let RequestHandler = _RequestHandler;
|
|
202
|
+
//# sourceMappingURL=RequestHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/handlers/RequestHandler.ts"],"sourcesContent":["import { invariant } from 'outvariant'\nimport { getCallFrame } from '../utils/internal/getCallFrame'\nimport { isIterable } from '../utils/internal/isIterable'\nimport type { ResponseResolutionContext } from '../utils/getResponse'\nimport type { MaybePromise } from '../typeUtils'\nimport { StrictRequest, StrictResponse } from '..//HttpResponse'\n\nexport type DefaultRequestMultipartBody = Record<\n string,\n string | File | Array<string | File>\n>\n\nexport type DefaultBodyType =\n | Record<string, any>\n | DefaultRequestMultipartBody\n | string\n | number\n | boolean\n | null\n | undefined\n\nexport type JsonBodyType =\n | Record<string, any>\n | string\n | number\n | boolean\n | null\n | undefined\n\nexport interface RequestHandlerDefaultInfo {\n header: string\n}\n\nexport interface RequestHandlerInternalInfo {\n callFrame?: string\n}\n\nexport type ResponseResolverReturnType<\n BodyType extends DefaultBodyType = undefined,\n> =\n | ([BodyType] extends [undefined] ? Response : StrictResponse<BodyType>)\n | undefined\n | void\n\nexport type MaybeAsyncResponseResolverReturnType<\n BodyType extends DefaultBodyType,\n> = MaybePromise<ResponseResolverReturnType<BodyType>>\n\nexport type AsyncResponseResolverReturnType<BodyType extends DefaultBodyType> =\n | MaybeAsyncResponseResolverReturnType<BodyType>\n | Generator<\n MaybeAsyncResponseResolverReturnType<BodyType>,\n MaybeAsyncResponseResolverReturnType<BodyType>,\n MaybeAsyncResponseResolverReturnType<BodyType>\n >\n\nexport type ResponseResolverInfo<\n ResolverExtraInfo extends Record<string, unknown>,\n RequestBodyType extends DefaultBodyType = DefaultBodyType,\n> = {\n request: StrictRequest<RequestBodyType>\n} & ResolverExtraInfo\n\nexport type ResponseResolver<\n ResolverExtraInfo extends Record<string, unknown> = Record<string, unknown>,\n RequestBodyType extends DefaultBodyType = DefaultBodyType,\n ResponseBodyType extends DefaultBodyType = undefined,\n> = (\n info: ResponseResolverInfo<ResolverExtraInfo, RequestBodyType>,\n) => AsyncResponseResolverReturnType<ResponseBodyType>\n\nexport interface RequestHandlerArgs<\n HandlerInfo,\n HandlerOptions extends RequestHandlerOptions,\n> {\n info: HandlerInfo\n resolver: ResponseResolver<any>\n options?: HandlerOptions\n}\n\nexport interface RequestHandlerOptions {\n once?: boolean\n}\n\nexport interface RequestHandlerExecutionResult<\n ParsedResult extends Record<string, unknown> | undefined,\n> {\n handler: RequestHandler\n parsedResult?: ParsedResult\n request: Request\n response?: Response\n}\n\nexport abstract class RequestHandler<\n HandlerInfo extends RequestHandlerDefaultInfo = RequestHandlerDefaultInfo,\n ParsedResult extends Record<string, any> | undefined = any,\n ResolverExtras extends Record<string, unknown> = any,\n HandlerOptions extends RequestHandlerOptions = RequestHandlerOptions,\n> {\n static cache = new WeakMap<\n StrictRequest<DefaultBodyType>,\n StrictRequest<DefaultBodyType>\n >()\n\n public info: HandlerInfo & RequestHandlerInternalInfo\n /**\n * Indicates whether this request handler has been used\n * (its resolver has successfully executed).\n */\n public isUsed: boolean\n\n protected resolver: ResponseResolver<ResolverExtras, any, any>\n private resolverGenerator?: Generator<\n MaybeAsyncResponseResolverReturnType<any>,\n MaybeAsyncResponseResolverReturnType<any>,\n MaybeAsyncResponseResolverReturnType<any>\n >\n private resolverGeneratorResult?: Response | StrictResponse<any>\n private options?: HandlerOptions\n\n constructor(args: RequestHandlerArgs<HandlerInfo, HandlerOptions>) {\n this.resolver = args.resolver\n this.options = args.options\n\n const callFrame = getCallFrame(new Error())\n\n this.info = {\n ...args.info,\n callFrame,\n }\n\n this.isUsed = false\n }\n\n /**\n * Determine if the intercepted request should be mocked.\n */\n abstract predicate(args: {\n request: Request\n parsedResult: ParsedResult\n resolutionContext?: ResponseResolutionContext\n }): boolean\n\n /**\n * Print out the successfully handled request.\n */\n abstract log(args: {\n request: Request\n response: Response\n parsedResult: ParsedResult\n }): void\n\n /**\n * Parse the intercepted request to extract additional information from it.\n * Parsed result is then exposed to other methods of this request handler.\n */\n async parse(_args: {\n request: Request\n resolutionContext?: ResponseResolutionContext\n }): Promise<ParsedResult> {\n return {} as ParsedResult\n }\n\n /**\n * Test if this handler matches the given request.\n *\n * This method is not used internally but is exposed\n * as a convenience method for consumers writing custom\n * handlers.\n */\n public async test(args: {\n request: Request\n resolutionContext?: ResponseResolutionContext\n }): Promise<boolean> {\n const parsedResult = await this.parse({\n request: args.request,\n resolutionContext: args.resolutionContext,\n })\n\n return this.predicate({\n request: args.request,\n parsedResult,\n resolutionContext: args.resolutionContext,\n })\n }\n\n protected extendResolverArgs(_args: {\n request: Request\n parsedResult: ParsedResult\n }): ResolverExtras {\n return {} as ResolverExtras\n }\n\n // Clone the request instance before it's passed to the handler phases\n // and the response resolver so we can always read it for logging.\n // We only clone it once per request to avoid unnecessary overhead.\n private cloneRequestOrGetFromCache(\n request: StrictRequest<DefaultBodyType>,\n ): StrictRequest<DefaultBodyType> {\n const existingClone = RequestHandler.cache.get(request)\n\n if (typeof existingClone !== 'undefined') {\n return existingClone\n }\n\n const clonedRequest = request.clone()\n RequestHandler.cache.set(request, clonedRequest)\n\n return clonedRequest\n }\n\n /**\n * Execute this request handler and produce a mocked response\n * using the given resolver function.\n */\n public async run(args: {\n request: StrictRequest<any>\n resolutionContext?: ResponseResolutionContext\n }): Promise<RequestHandlerExecutionResult<ParsedResult> | null> {\n if (this.isUsed && this.options?.once) {\n return null\n }\n\n // Clone the request.\n // If this is the first time MSW handles this request, a fresh clone\n // will be created and cached. Upon further handling of the same request,\n // the request clone from the cache will be reused to prevent abundant\n // \"abort\" listeners and save up resources on cloning.\n const requestClone = this.cloneRequestOrGetFromCache(args.request)\n\n const parsedResult = await this.parse({\n request: args.request,\n resolutionContext: args.resolutionContext,\n })\n const shouldInterceptRequest = this.predicate({\n request: args.request,\n parsedResult,\n resolutionContext: args.resolutionContext,\n })\n\n if (!shouldInterceptRequest) {\n return null\n }\n\n // Re-check isUsed, in case another request hit this handler while we were\n // asynchronously parsing the request.\n if (this.isUsed && this.options?.once) {\n return null\n }\n\n this.isUsed = true\n\n // Create a response extraction wrapper around the resolver\n // since it can be both an async function and a generator.\n const executeResolver = this.wrapResolver(this.resolver)\n\n const resolverExtras = this.extendResolverArgs({\n request: args.request,\n parsedResult,\n })\n const mockedResponse = (await executeResolver({\n ...resolverExtras,\n request: args.request,\n })) as Response\n\n const executionResult = this.createExecutionResult({\n // Pass the cloned request to the result so that logging\n // and other consumers could read its body once more.\n request: requestClone,\n response: mockedResponse,\n parsedResult,\n })\n\n return executionResult\n }\n\n private wrapResolver(\n resolver: ResponseResolver<ResolverExtras>,\n ): ResponseResolver<ResolverExtras> {\n return async (info): Promise<ResponseResolverReturnType<any>> => {\n const result = this.resolverGenerator || (await resolver(info))\n\n if (isIterable<AsyncResponseResolverReturnType<any>>(result)) {\n // Immediately mark this handler as unused.\n // Only when the generator is done, the handler will be\n // considered used.\n this.isUsed = false\n\n const { value, done } = result[Symbol.iterator]().next()\n const nextResponse = await value\n\n if (done) {\n this.isUsed = true\n }\n\n // If the generator is done and there is no next value,\n // return the previous generator's value.\n if (!nextResponse && done) {\n invariant(\n this.resolverGeneratorResult,\n 'Failed to returned a previously stored generator response: the value is not a valid Response.',\n )\n\n // Clone the previously stored response from the generator\n // so that it could be read again.\n return this.resolverGeneratorResult.clone() as StrictResponse<any>\n }\n\n if (!this.resolverGenerator) {\n this.resolverGenerator = result\n }\n\n if (nextResponse) {\n // Also clone the response before storing it\n // so it could be read again.\n this.resolverGeneratorResult = nextResponse?.clone()\n }\n\n return nextResponse\n }\n\n return result\n }\n }\n\n private createExecutionResult(args: {\n request: Request\n parsedResult: ParsedResult\n response?: Response\n }): RequestHandlerExecutionResult<ParsedResult> {\n return {\n handler: this,\n request: args.request,\n response: args.response,\n parsedResult: args.parsedResult,\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAA0B;AAC1B,0BAA6B;AAC7B,wBAA2B;AA2FpB,MAAe,kBAAf,MAAe,gBAKpB;AAAA,EAsBA,YAAY,MAAuD;AACjE,SAAK,WAAW,KAAK;AACrB,SAAK,UAAU,KAAK;AAEpB,UAAM,gBAAY,kCAAa,IAAI,MAAM,CAAC;AAE1C,SAAK,OAAO,iCACP,KAAK,OADE;AAAA,MAEV;AAAA,IACF;AAEA,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBM,MAAM,OAGc;AAAA;AACxB,aAAO,CAAC;AAAA,IACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASa,KAAK,MAGG;AAAA;AACnB,YAAM,eAAe,MAAM,KAAK,MAAM;AAAA,QACpC,SAAS,KAAK;AAAA,QACd,mBAAmB,KAAK;AAAA,MAC1B,CAAC;AAED,aAAO,KAAK,UAAU;AAAA,QACpB,SAAS,KAAK;AAAA,QACd;AAAA,QACA,mBAAmB,KAAK;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA;AAAA,EAEU,mBAAmB,OAGV;AACjB,WAAO,CAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKQ,2BACN,SACgC;AAChC,UAAM,gBAAgB,gBAAe,MAAM,IAAI,OAAO;AAEtD,QAAI,OAAO,kBAAkB,aAAa;AACxC,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,QAAQ,MAAM;AACpC,oBAAe,MAAM,IAAI,SAAS,aAAa;AAE/C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMa,IAAI,MAG+C;AAAA;AA1NlE;AA2NI,UAAI,KAAK,YAAU,UAAK,YAAL,mBAAc,OAAM;AACrC,eAAO;AAAA,MACT;AAOA,YAAM,eAAe,KAAK,2BAA2B,KAAK,OAAO;AAEjE,YAAM,eAAe,MAAM,KAAK,MAAM;AAAA,QACpC,SAAS,KAAK;AAAA,QACd,mBAAmB,KAAK;AAAA,MAC1B,CAAC;AACD,YAAM,yBAAyB,KAAK,UAAU;AAAA,QAC5C,SAAS,KAAK;AAAA,QACd;AAAA,QACA,mBAAmB,KAAK;AAAA,MAC1B,CAAC;AAED,UAAI,CAAC,wBAAwB;AAC3B,eAAO;AAAA,MACT;AAIA,UAAI,KAAK,YAAU,UAAK,YAAL,mBAAc,OAAM;AACrC,eAAO;AAAA,MACT;AAEA,WAAK,SAAS;AAId,YAAM,kBAAkB,KAAK,aAAa,KAAK,QAAQ;AAEvD,YAAM,iBAAiB,KAAK,mBAAmB;AAAA,QAC7C,SAAS,KAAK;AAAA,QACd;AAAA,MACF,CAAC;AACD,YAAM,iBAAkB,MAAM,gBAAgB,iCACzC,iBADyC;AAAA,QAE5C,SAAS,KAAK;AAAA,MAChB,EAAC;AAED,YAAM,kBAAkB,KAAK,sBAAsB;AAAA;AAAA;AAAA,QAGjD,SAAS;AAAA,QACT,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT;AAAA;AAAA,EAEQ,aACN,UACkC;AAClC,WAAO,CAAO,SAAmD;AAC/D,YAAM,SAAS,KAAK,sBAAsB,MAAM,SAAS,IAAI;AAE7D,cAAI,8BAAiD,MAAM,GAAG;AAI5D,aAAK,SAAS;AAEd,cAAM,EAAE,OAAO,KAAK,IAAI,OAAO,OAAO,QAAQ,EAAE,EAAE,KAAK;AACvD,cAAM,eAAe,MAAM;AAE3B,YAAI,MAAM;AACR,eAAK,SAAS;AAAA,QAChB;AAIA,YAAI,CAAC,gBAAgB,MAAM;AACzB;AAAA,YACE,KAAK;AAAA,YACL;AAAA,UACF;AAIA,iBAAO,KAAK,wBAAwB,MAAM;AAAA,QAC5C;AAEA,YAAI,CAAC,KAAK,mBAAmB;AAC3B,eAAK,oBAAoB;AAAA,QAC3B;AAEA,YAAI,cAAc;AAGhB,eAAK,0BAA0B,6CAAc;AAAA,QAC/C;AAEA,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,sBAAsB,MAIkB;AAC9C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,MACf,cAAc,KAAK;AAAA,IACrB;AAAA,EACF;AACF;AApPsB,gBAMb,QAAQ,oBAAI,QAGjB;AATG,IAAe,iBAAf;","names":[]}
|
|
@@ -40,7 +40,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
40
40
|
import { invariant } from "outvariant";
|
|
41
41
|
import { getCallFrame } from '../utils/internal/getCallFrame.mjs';
|
|
42
42
|
import { isIterable } from '../utils/internal/isIterable.mjs';
|
|
43
|
-
class
|
|
43
|
+
const _RequestHandler = class _RequestHandler {
|
|
44
44
|
constructor(args) {
|
|
45
45
|
this.resolver = args.resolver;
|
|
46
46
|
this.options = args.options;
|
|
@@ -82,6 +82,18 @@ class RequestHandler {
|
|
|
82
82
|
extendResolverArgs(_args) {
|
|
83
83
|
return {};
|
|
84
84
|
}
|
|
85
|
+
// Clone the request instance before it's passed to the handler phases
|
|
86
|
+
// and the response resolver so we can always read it for logging.
|
|
87
|
+
// We only clone it once per request to avoid unnecessary overhead.
|
|
88
|
+
cloneRequestOrGetFromCache(request) {
|
|
89
|
+
const existingClone = _RequestHandler.cache.get(request);
|
|
90
|
+
if (typeof existingClone !== "undefined") {
|
|
91
|
+
return existingClone;
|
|
92
|
+
}
|
|
93
|
+
const clonedRequest = request.clone();
|
|
94
|
+
_RequestHandler.cache.set(request, clonedRequest);
|
|
95
|
+
return clonedRequest;
|
|
96
|
+
}
|
|
85
97
|
/**
|
|
86
98
|
* Execute this request handler and produce a mocked response
|
|
87
99
|
* using the given resolver function.
|
|
@@ -92,7 +104,7 @@ class RequestHandler {
|
|
|
92
104
|
if (this.isUsed && ((_a = this.options) == null ? void 0 : _a.once)) {
|
|
93
105
|
return null;
|
|
94
106
|
}
|
|
95
|
-
const
|
|
107
|
+
const requestClone = this.cloneRequestOrGetFromCache(args.request);
|
|
96
108
|
const parsedResult = yield this.parse({
|
|
97
109
|
request: args.request,
|
|
98
110
|
resolutionContext: args.resolutionContext
|
|
@@ -120,7 +132,7 @@ class RequestHandler {
|
|
|
120
132
|
const executionResult = this.createExecutionResult({
|
|
121
133
|
// Pass the cloned request to the result so that logging
|
|
122
134
|
// and other consumers could read its body once more.
|
|
123
|
-
request:
|
|
135
|
+
request: requestClone,
|
|
124
136
|
response: mockedResponse,
|
|
125
137
|
parsedResult
|
|
126
138
|
});
|
|
@@ -163,7 +175,10 @@ class RequestHandler {
|
|
|
163
175
|
parsedResult: args.parsedResult
|
|
164
176
|
};
|
|
165
177
|
}
|
|
166
|
-
}
|
|
178
|
+
};
|
|
179
|
+
_RequestHandler.cache = /* @__PURE__ */ new WeakMap();
|
|
180
|
+
let RequestHandler = _RequestHandler;
|
|
167
181
|
export {
|
|
168
182
|
RequestHandler
|
|
169
183
|
};
|
|
184
|
+
//# sourceMappingURL=RequestHandler.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/handlers/RequestHandler.ts"],"sourcesContent":["import { invariant } from 'outvariant'\nimport { getCallFrame } from '../utils/internal/getCallFrame'\nimport { isIterable } from '../utils/internal/isIterable'\nimport type { ResponseResolutionContext } from '../utils/getResponse'\nimport type { MaybePromise } from '../typeUtils'\nimport { StrictRequest, StrictResponse } from '..//HttpResponse'\n\nexport type DefaultRequestMultipartBody = Record<\n string,\n string | File | Array<string | File>\n>\n\nexport type DefaultBodyType =\n | Record<string, any>\n | DefaultRequestMultipartBody\n | string\n | number\n | boolean\n | null\n | undefined\n\nexport type JsonBodyType =\n | Record<string, any>\n | string\n | number\n | boolean\n | null\n | undefined\n\nexport interface RequestHandlerDefaultInfo {\n header: string\n}\n\nexport interface RequestHandlerInternalInfo {\n callFrame?: string\n}\n\nexport type ResponseResolverReturnType<\n BodyType extends DefaultBodyType = undefined,\n> =\n | ([BodyType] extends [undefined] ? Response : StrictResponse<BodyType>)\n | undefined\n | void\n\nexport type MaybeAsyncResponseResolverReturnType<\n BodyType extends DefaultBodyType,\n> = MaybePromise<ResponseResolverReturnType<BodyType>>\n\nexport type AsyncResponseResolverReturnType<BodyType extends DefaultBodyType> =\n | MaybeAsyncResponseResolverReturnType<BodyType>\n | Generator<\n MaybeAsyncResponseResolverReturnType<BodyType>,\n MaybeAsyncResponseResolverReturnType<BodyType>,\n MaybeAsyncResponseResolverReturnType<BodyType>\n >\n\nexport type ResponseResolverInfo<\n ResolverExtraInfo extends Record<string, unknown>,\n RequestBodyType extends DefaultBodyType = DefaultBodyType,\n> = {\n request: StrictRequest<RequestBodyType>\n} & ResolverExtraInfo\n\nexport type ResponseResolver<\n ResolverExtraInfo extends Record<string, unknown> = Record<string, unknown>,\n RequestBodyType extends DefaultBodyType = DefaultBodyType,\n ResponseBodyType extends DefaultBodyType = undefined,\n> = (\n info: ResponseResolverInfo<ResolverExtraInfo, RequestBodyType>,\n) => AsyncResponseResolverReturnType<ResponseBodyType>\n\nexport interface RequestHandlerArgs<\n HandlerInfo,\n HandlerOptions extends RequestHandlerOptions,\n> {\n info: HandlerInfo\n resolver: ResponseResolver<any>\n options?: HandlerOptions\n}\n\nexport interface RequestHandlerOptions {\n once?: boolean\n}\n\nexport interface RequestHandlerExecutionResult<\n ParsedResult extends Record<string, unknown> | undefined,\n> {\n handler: RequestHandler\n parsedResult?: ParsedResult\n request: Request\n response?: Response\n}\n\nexport abstract class RequestHandler<\n HandlerInfo extends RequestHandlerDefaultInfo = RequestHandlerDefaultInfo,\n ParsedResult extends Record<string, any> | undefined = any,\n ResolverExtras extends Record<string, unknown> = any,\n HandlerOptions extends RequestHandlerOptions = RequestHandlerOptions,\n> {\n static cache = new WeakMap<\n StrictRequest<DefaultBodyType>,\n StrictRequest<DefaultBodyType>\n >()\n\n public info: HandlerInfo & RequestHandlerInternalInfo\n /**\n * Indicates whether this request handler has been used\n * (its resolver has successfully executed).\n */\n public isUsed: boolean\n\n protected resolver: ResponseResolver<ResolverExtras, any, any>\n private resolverGenerator?: Generator<\n MaybeAsyncResponseResolverReturnType<any>,\n MaybeAsyncResponseResolverReturnType<any>,\n MaybeAsyncResponseResolverReturnType<any>\n >\n private resolverGeneratorResult?: Response | StrictResponse<any>\n private options?: HandlerOptions\n\n constructor(args: RequestHandlerArgs<HandlerInfo, HandlerOptions>) {\n this.resolver = args.resolver\n this.options = args.options\n\n const callFrame = getCallFrame(new Error())\n\n this.info = {\n ...args.info,\n callFrame,\n }\n\n this.isUsed = false\n }\n\n /**\n * Determine if the intercepted request should be mocked.\n */\n abstract predicate(args: {\n request: Request\n parsedResult: ParsedResult\n resolutionContext?: ResponseResolutionContext\n }): boolean\n\n /**\n * Print out the successfully handled request.\n */\n abstract log(args: {\n request: Request\n response: Response\n parsedResult: ParsedResult\n }): void\n\n /**\n * Parse the intercepted request to extract additional information from it.\n * Parsed result is then exposed to other methods of this request handler.\n */\n async parse(_args: {\n request: Request\n resolutionContext?: ResponseResolutionContext\n }): Promise<ParsedResult> {\n return {} as ParsedResult\n }\n\n /**\n * Test if this handler matches the given request.\n *\n * This method is not used internally but is exposed\n * as a convenience method for consumers writing custom\n * handlers.\n */\n public async test(args: {\n request: Request\n resolutionContext?: ResponseResolutionContext\n }): Promise<boolean> {\n const parsedResult = await this.parse({\n request: args.request,\n resolutionContext: args.resolutionContext,\n })\n\n return this.predicate({\n request: args.request,\n parsedResult,\n resolutionContext: args.resolutionContext,\n })\n }\n\n protected extendResolverArgs(_args: {\n request: Request\n parsedResult: ParsedResult\n }): ResolverExtras {\n return {} as ResolverExtras\n }\n\n // Clone the request instance before it's passed to the handler phases\n // and the response resolver so we can always read it for logging.\n // We only clone it once per request to avoid unnecessary overhead.\n private cloneRequestOrGetFromCache(\n request: StrictRequest<DefaultBodyType>,\n ): StrictRequest<DefaultBodyType> {\n const existingClone = RequestHandler.cache.get(request)\n\n if (typeof existingClone !== 'undefined') {\n return existingClone\n }\n\n const clonedRequest = request.clone()\n RequestHandler.cache.set(request, clonedRequest)\n\n return clonedRequest\n }\n\n /**\n * Execute this request handler and produce a mocked response\n * using the given resolver function.\n */\n public async run(args: {\n request: StrictRequest<any>\n resolutionContext?: ResponseResolutionContext\n }): Promise<RequestHandlerExecutionResult<ParsedResult> | null> {\n if (this.isUsed && this.options?.once) {\n return null\n }\n\n // Clone the request.\n // If this is the first time MSW handles this request, a fresh clone\n // will be created and cached. Upon further handling of the same request,\n // the request clone from the cache will be reused to prevent abundant\n // \"abort\" listeners and save up resources on cloning.\n const requestClone = this.cloneRequestOrGetFromCache(args.request)\n\n const parsedResult = await this.parse({\n request: args.request,\n resolutionContext: args.resolutionContext,\n })\n const shouldInterceptRequest = this.predicate({\n request: args.request,\n parsedResult,\n resolutionContext: args.resolutionContext,\n })\n\n if (!shouldInterceptRequest) {\n return null\n }\n\n // Re-check isUsed, in case another request hit this handler while we were\n // asynchronously parsing the request.\n if (this.isUsed && this.options?.once) {\n return null\n }\n\n this.isUsed = true\n\n // Create a response extraction wrapper around the resolver\n // since it can be both an async function and a generator.\n const executeResolver = this.wrapResolver(this.resolver)\n\n const resolverExtras = this.extendResolverArgs({\n request: args.request,\n parsedResult,\n })\n const mockedResponse = (await executeResolver({\n ...resolverExtras,\n request: args.request,\n })) as Response\n\n const executionResult = this.createExecutionResult({\n // Pass the cloned request to the result so that logging\n // and other consumers could read its body once more.\n request: requestClone,\n response: mockedResponse,\n parsedResult,\n })\n\n return executionResult\n }\n\n private wrapResolver(\n resolver: ResponseResolver<ResolverExtras>,\n ): ResponseResolver<ResolverExtras> {\n return async (info): Promise<ResponseResolverReturnType<any>> => {\n const result = this.resolverGenerator || (await resolver(info))\n\n if (isIterable<AsyncResponseResolverReturnType<any>>(result)) {\n // Immediately mark this handler as unused.\n // Only when the generator is done, the handler will be\n // considered used.\n this.isUsed = false\n\n const { value, done } = result[Symbol.iterator]().next()\n const nextResponse = await value\n\n if (done) {\n this.isUsed = true\n }\n\n // If the generator is done and there is no next value,\n // return the previous generator's value.\n if (!nextResponse && done) {\n invariant(\n this.resolverGeneratorResult,\n 'Failed to returned a previously stored generator response: the value is not a valid Response.',\n )\n\n // Clone the previously stored response from the generator\n // so that it could be read again.\n return this.resolverGeneratorResult.clone() as StrictResponse<any>\n }\n\n if (!this.resolverGenerator) {\n this.resolverGenerator = result\n }\n\n if (nextResponse) {\n // Also clone the response before storing it\n // so it could be read again.\n this.resolverGeneratorResult = nextResponse?.clone()\n }\n\n return nextResponse\n }\n\n return result\n }\n }\n\n private createExecutionResult(args: {\n request: Request\n parsedResult: ParsedResult\n response?: Response\n }): RequestHandlerExecutionResult<ParsedResult> {\n return {\n handler: this,\n request: args.request,\n response: args.response,\n parsedResult: args.parsedResult,\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { D as DefaultBodyType, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-vxZdj6Tw.mjs';
|
|
2
|
+
import { HttpRequestResolverExtras, HttpHandler } from './handlers/HttpHandler.mjs';
|
|
3
|
+
import { PathParams, Path } from './utils/matching/matchRequestUrl.mjs';
|
|
4
|
+
import './typeUtils.mjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A namespace to intercept and mock HTTP requests.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* http.get('/user', resolver)
|
|
11
|
+
* http.post('/post/:id', resolver)
|
|
12
|
+
*
|
|
13
|
+
* @see {@link https://mswjs.io/docs/api/http `http` API reference}
|
|
14
|
+
*/
|
|
15
|
+
declare const http: {
|
|
16
|
+
all: <Params extends PathParams<keyof Params> = PathParams, RequestBodyType extends DefaultBodyType = DefaultBodyType, ResponseBodyType extends DefaultBodyType = undefined>(path: Path, resolver: ResponseResolver<HttpRequestResolverExtras<Params>, RequestBodyType, ResponseBodyType>, options?: RequestHandlerOptions) => HttpHandler;
|
|
17
|
+
head: <Params_1 extends PathParams<keyof Params_1> = PathParams, RequestBodyType_1 extends DefaultBodyType = DefaultBodyType, ResponseBodyType_1 extends DefaultBodyType = undefined>(path: Path, resolver: ResponseResolver<HttpRequestResolverExtras<Params_1>, RequestBodyType_1, ResponseBodyType_1>, options?: RequestHandlerOptions) => HttpHandler;
|
|
18
|
+
get: <Params_2 extends PathParams<keyof Params_2> = PathParams, RequestBodyType_2 extends DefaultBodyType = DefaultBodyType, ResponseBodyType_2 extends DefaultBodyType = undefined>(path: Path, resolver: ResponseResolver<HttpRequestResolverExtras<Params_2>, RequestBodyType_2, ResponseBodyType_2>, options?: RequestHandlerOptions) => HttpHandler;
|
|
19
|
+
post: <Params_3 extends PathParams<keyof Params_3> = PathParams, RequestBodyType_3 extends DefaultBodyType = DefaultBodyType, ResponseBodyType_3 extends DefaultBodyType = undefined>(path: Path, resolver: ResponseResolver<HttpRequestResolverExtras<Params_3>, RequestBodyType_3, ResponseBodyType_3>, options?: RequestHandlerOptions) => HttpHandler;
|
|
20
|
+
put: <Params_4 extends PathParams<keyof Params_4> = PathParams, RequestBodyType_4 extends DefaultBodyType = DefaultBodyType, ResponseBodyType_4 extends DefaultBodyType = undefined>(path: Path, resolver: ResponseResolver<HttpRequestResolverExtras<Params_4>, RequestBodyType_4, ResponseBodyType_4>, options?: RequestHandlerOptions) => HttpHandler;
|
|
21
|
+
delete: <Params_5 extends PathParams<keyof Params_5> = PathParams, RequestBodyType_5 extends DefaultBodyType = DefaultBodyType, ResponseBodyType_5 extends DefaultBodyType = undefined>(path: Path, resolver: ResponseResolver<HttpRequestResolverExtras<Params_5>, RequestBodyType_5, ResponseBodyType_5>, options?: RequestHandlerOptions) => HttpHandler;
|
|
22
|
+
patch: <Params_6 extends PathParams<keyof Params_6> = PathParams, RequestBodyType_6 extends DefaultBodyType = DefaultBodyType, ResponseBodyType_6 extends DefaultBodyType = undefined>(path: Path, resolver: ResponseResolver<HttpRequestResolverExtras<Params_6>, RequestBodyType_6, ResponseBodyType_6>, options?: RequestHandlerOptions) => HttpHandler;
|
|
23
|
+
options: <Params_7 extends PathParams<keyof Params_7> = PathParams, RequestBodyType_7 extends DefaultBodyType = DefaultBodyType, ResponseBodyType_7 extends DefaultBodyType = undefined>(path: Path, resolver: ResponseResolver<HttpRequestResolverExtras<Params_7>, RequestBodyType_7, ResponseBodyType_7>, options?: RequestHandlerOptions) => HttpHandler;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { http };
|
package/lib/core/http.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { D as DefaultBodyType, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-
|
|
1
|
+
import { D as DefaultBodyType, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-rBDJQrEf.js';
|
|
2
2
|
import { HttpRequestResolverExtras, HttpHandler } from './handlers/HttpHandler.js';
|
|
3
3
|
import { PathParams, Path } from './utils/matching/matchRequestUrl.js';
|
|
4
4
|
import './typeUtils.js';
|
package/lib/core/http.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/http.ts"],"sourcesContent":["import {\n DefaultBodyType,\n RequestHandlerOptions,\n ResponseResolver,\n} from './handlers/RequestHandler'\nimport {\n HttpMethods,\n HttpHandler,\n HttpRequestResolverExtras,\n} from './handlers/HttpHandler'\nimport type { Path, PathParams } from './utils/matching/matchRequestUrl'\n\nfunction createHttpHandler<Method extends HttpMethods | RegExp>(\n method: Method,\n) {\n return <\n Params extends PathParams<keyof Params> = PathParams,\n RequestBodyType extends DefaultBodyType = DefaultBodyType,\n ResponseBodyType extends DefaultBodyType = undefined,\n >(\n path: Path,\n resolver: ResponseResolver<\n HttpRequestResolverExtras<Params>,\n RequestBodyType,\n ResponseBodyType\n >,\n options: RequestHandlerOptions = {},\n ) => {\n return new HttpHandler(method, path, resolver, options)\n }\n}\n\n/**\n * A namespace to intercept and mock HTTP requests.\n *\n * @example\n * http.get('/user', resolver)\n * http.post('/post/:id', resolver)\n *\n * @see {@link https://mswjs.io/docs/api/http `http` API reference}\n */\nexport const http = {\n all: createHttpHandler(/.+/),\n head: createHttpHandler(HttpMethods.HEAD),\n get: createHttpHandler(HttpMethods.GET),\n post: createHttpHandler(HttpMethods.POST),\n put: createHttpHandler(HttpMethods.PUT),\n delete: createHttpHandler(HttpMethods.DELETE),\n patch: createHttpHandler(HttpMethods.PATCH),\n options: createHttpHandler(HttpMethods.OPTIONS),\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,yBAIO;AAGP,SAAS,kBACP,QACA;AACA,SAAO,CAKL,MACA,UAKA,UAAiC,CAAC,MAC/B;AACH,WAAO,IAAI,+BAAY,QAAQ,MAAM,UAAU,OAAO;AAAA,EACxD;AACF;AAWO,MAAM,OAAO;AAAA,EAClB,KAAK,kBAAkB,IAAI;AAAA,EAC3B,MAAM,kBAAkB,+BAAY,IAAI;AAAA,EACxC,KAAK,kBAAkB,+BAAY,GAAG;AAAA,EACtC,MAAM,kBAAkB,+BAAY,IAAI;AAAA,EACxC,KAAK,kBAAkB,+BAAY,GAAG;AAAA,EACtC,QAAQ,kBAAkB,+BAAY,MAAM;AAAA,EAC5C,OAAO,kBAAkB,+BAAY,KAAK;AAAA,EAC1C,SAAS,kBAAkB,+BAAY,OAAO;AAChD;","names":[]}
|
package/lib/core/http.mjs
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/http.ts"],"sourcesContent":["import {\n DefaultBodyType,\n RequestHandlerOptions,\n ResponseResolver,\n} from './handlers/RequestHandler'\nimport {\n HttpMethods,\n HttpHandler,\n HttpRequestResolverExtras,\n} from './handlers/HttpHandler'\nimport type { Path, PathParams } from './utils/matching/matchRequestUrl'\n\nfunction createHttpHandler<Method extends HttpMethods | RegExp>(\n method: Method,\n) {\n return <\n Params extends PathParams<keyof Params> = PathParams,\n RequestBodyType extends DefaultBodyType = DefaultBodyType,\n ResponseBodyType extends DefaultBodyType = undefined,\n >(\n path: Path,\n resolver: ResponseResolver<\n HttpRequestResolverExtras<Params>,\n RequestBodyType,\n ResponseBodyType\n >,\n options: RequestHandlerOptions = {},\n ) => {\n return new HttpHandler(method, path, resolver, options)\n }\n}\n\n/**\n * A namespace to intercept and mock HTTP requests.\n *\n * @example\n * http.get('/user', resolver)\n * http.post('/post/:id', resolver)\n *\n * @see {@link https://mswjs.io/docs/api/http `http` API reference}\n */\nexport const http = {\n all: createHttpHandler(/.+/),\n head: createHttpHandler(HttpMethods.HEAD),\n get: createHttpHandler(HttpMethods.GET),\n post: createHttpHandler(HttpMethods.POST),\n put: createHttpHandler(HttpMethods.PUT),\n delete: createHttpHandler(HttpMethods.DELETE),\n patch: createHttpHandler(HttpMethods.PATCH),\n options: createHttpHandler(HttpMethods.OPTIONS),\n}\n"],"mappings":"AAKA;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AAGP,SAAS,kBACP,QACA;AACA,SAAO,CAKL,MACA,UAKA,UAAiC,CAAC,MAC/B;AACH,WAAO,IAAI,YAAY,QAAQ,MAAM,UAAU,OAAO;AAAA,EACxD;AACF;AAWO,MAAM,OAAO;AAAA,EAClB,KAAK,kBAAkB,IAAI;AAAA,EAC3B,MAAM,kBAAkB,YAAY,IAAI;AAAA,EACxC,KAAK,kBAAkB,YAAY,GAAG;AAAA,EACtC,MAAM,kBAAkB,YAAY,IAAI;AAAA,EACxC,KAAK,kBAAkB,YAAY,GAAG;AAAA,EACtC,QAAQ,kBAAkB,YAAY,MAAM;AAAA,EAC5C,OAAO,kBAAkB,YAAY,KAAK;AAAA,EAC1C,SAAS,kBAAkB,YAAY,OAAO;AAChD;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { SetupApi } from './SetupApi.mjs';
|
|
2
|
+
export { A as AsyncResponseResolverReturnType, D as DefaultBodyType, d as DefaultRequestMultipartBody, f as HttpResponse, H as HttpResponseInit, J as JsonBodyType, R as RequestHandler, c as RequestHandlerOptions, a as ResponseResolver, b as ResponseResolverReturnType, S as StrictRequest, e as StrictResponse } from './RequestHandler-vxZdj6Tw.mjs';
|
|
3
|
+
export { http } from './http.mjs';
|
|
4
|
+
export { HttpHandler, HttpMethods, HttpRequestParsedResult, RequestQuery } from './handlers/HttpHandler.mjs';
|
|
5
|
+
export { graphql } from './graphql.mjs';
|
|
6
|
+
export { G as GraphQLHandler, c as GraphQLJsonRequestBody, b as GraphQLRequestBody, a as GraphQLVariables, P as ParsedGraphQLRequest } from './GraphQLHandler-zlmUDnN6.mjs';
|
|
7
|
+
export { Match, Path, PathParams, matchRequestUrl } from './utils/matching/matchRequestUrl.mjs';
|
|
8
|
+
export { HandleRequestOptions, handleRequest } from './utils/handleRequest.mjs';
|
|
9
|
+
export { cleanUrl } from './utils/url/cleanUrl.mjs';
|
|
10
|
+
export { LifeCycleEventsMap, SharedOptions } from './sharedOptions.mjs';
|
|
11
|
+
export { DelayMode, MAX_SERVER_RESPONSE_TIME, MIN_SERVER_RESPONSE_TIME, NODE_SERVER_RESPONSE_TIME, SET_TIMEOUT_MAX_ALLOWED_INT, delay } from './delay.mjs';
|
|
12
|
+
export { bypass } from './bypass.mjs';
|
|
13
|
+
export { passthrough } from './passthrough.mjs';
|
|
14
|
+
import 'strict-event-emitter';
|
|
15
|
+
import './utils/internal/Disposable.mjs';
|
|
16
|
+
import './typeUtils.mjs';
|
|
17
|
+
import 'graphql';
|
|
18
|
+
import './utils/request/onUnhandledRequest.mjs';
|
package/lib/core/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export { SetupApi } from './SetupApi.js';
|
|
2
|
-
export { A as AsyncResponseResolverReturnType, D as DefaultBodyType, d as DefaultRequestMultipartBody, f as HttpResponse, H as HttpResponseInit, J as JsonBodyType, R as RequestHandler, c as RequestHandlerOptions, a as ResponseResolver, b as ResponseResolverReturnType, S as StrictRequest, e as StrictResponse } from './RequestHandler-
|
|
2
|
+
export { A as AsyncResponseResolverReturnType, D as DefaultBodyType, d as DefaultRequestMultipartBody, f as HttpResponse, H as HttpResponseInit, J as JsonBodyType, R as RequestHandler, c as RequestHandlerOptions, a as ResponseResolver, b as ResponseResolverReturnType, S as StrictRequest, e as StrictResponse } from './RequestHandler-rBDJQrEf.js';
|
|
3
3
|
export { http } from './http.js';
|
|
4
4
|
export { HttpHandler, HttpMethods, HttpRequestParsedResult, RequestQuery } from './handlers/HttpHandler.js';
|
|
5
5
|
export { graphql } from './graphql.js';
|
|
6
|
-
export { G as GraphQLHandler, c as GraphQLJsonRequestBody, b as GraphQLRequestBody, a as GraphQLVariables, P as ParsedGraphQLRequest } from './GraphQLHandler-
|
|
6
|
+
export { G as GraphQLHandler, c as GraphQLJsonRequestBody, b as GraphQLRequestBody, a as GraphQLVariables, P as ParsedGraphQLRequest } from './GraphQLHandler-SHlRCcy4.js';
|
|
7
7
|
export { Match, Path, PathParams, matchRequestUrl } from './utils/matching/matchRequestUrl.js';
|
|
8
8
|
export { HandleRequestOptions, handleRequest } from './utils/handleRequest.js';
|
|
9
9
|
export { cleanUrl } from './utils/url/cleanUrl.js';
|
package/lib/core/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/index.ts"],"sourcesContent":["import { checkGlobals } from './utils/internal/checkGlobals'\n\nexport { SetupApi } from './SetupApi'\n\n/* Request handlers */\nexport { RequestHandler } from './handlers/RequestHandler'\nexport { http } from './http'\nexport { HttpHandler, HttpMethods } from './handlers/HttpHandler'\nexport { graphql } from './graphql'\nexport { GraphQLHandler } from './handlers/GraphQLHandler'\n\n/* Utils */\nexport { matchRequestUrl } from './utils/matching/matchRequestUrl'\nexport * from './utils/handleRequest'\nexport { cleanUrl } from './utils/url/cleanUrl'\n\n/**\n * Type definitions.\n */\n\nexport type { SharedOptions, LifeCycleEventsMap } from './sharedOptions'\n\nexport type {\n ResponseResolver,\n ResponseResolverReturnType,\n AsyncResponseResolverReturnType,\n RequestHandlerOptions,\n DefaultBodyType,\n DefaultRequestMultipartBody,\n JsonBodyType,\n} from './handlers/RequestHandler'\n\nexport type {\n RequestQuery,\n HttpRequestParsedResult,\n} from './handlers/HttpHandler'\n\nexport type {\n GraphQLVariables,\n GraphQLRequestBody,\n GraphQLJsonRequestBody,\n} from './handlers/GraphQLHandler'\n\nexport type { Path, PathParams, Match } from './utils/matching/matchRequestUrl'\nexport type { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest'\n\nexport * from './HttpResponse'\nexport * from './delay'\nexport { bypass } from './bypass'\nexport { passthrough } from './passthrough'\n\n// Validate environmental globals before executing any code.\n// This ensures that the library gives user-friendly errors\n// when ran in the environments that require additional polyfills\n// from the end user.\ncheckGlobals()\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAA6B;AAE7B,sBAAyB;AAGzB,4BAA+B;AAC/B,kBAAqB;AACrB,yBAAyC;AACzC,qBAAwB;AACxB,4BAA+B;AAG/B,6BAAgC;AAChC,yBAAc,kCAbd;AAcA,sBAAyB;AAgCzB,yBAAc,2BA9Cd;AA+CA,yBAAc,oBA/Cd;AAgDA,oBAAuB;AACvB,yBAA4B;AAAA,IAM5B,kCAAa;","names":[]}
|
package/lib/core/index.mjs
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/index.ts"],"sourcesContent":["import { checkGlobals } from './utils/internal/checkGlobals'\n\nexport { SetupApi } from './SetupApi'\n\n/* Request handlers */\nexport { RequestHandler } from './handlers/RequestHandler'\nexport { http } from './http'\nexport { HttpHandler, HttpMethods } from './handlers/HttpHandler'\nexport { graphql } from './graphql'\nexport { GraphQLHandler } from './handlers/GraphQLHandler'\n\n/* Utils */\nexport { matchRequestUrl } from './utils/matching/matchRequestUrl'\nexport * from './utils/handleRequest'\nexport { cleanUrl } from './utils/url/cleanUrl'\n\n/**\n * Type definitions.\n */\n\nexport type { SharedOptions, LifeCycleEventsMap } from './sharedOptions'\n\nexport type {\n ResponseResolver,\n ResponseResolverReturnType,\n AsyncResponseResolverReturnType,\n RequestHandlerOptions,\n DefaultBodyType,\n DefaultRequestMultipartBody,\n JsonBodyType,\n} from './handlers/RequestHandler'\n\nexport type {\n RequestQuery,\n HttpRequestParsedResult,\n} from './handlers/HttpHandler'\n\nexport type {\n GraphQLVariables,\n GraphQLRequestBody,\n GraphQLJsonRequestBody,\n} from './handlers/GraphQLHandler'\n\nexport type { Path, PathParams, Match } from './utils/matching/matchRequestUrl'\nexport type { ParsedGraphQLRequest } from './utils/internal/parseGraphQLRequest'\n\nexport * from './HttpResponse'\nexport * from './delay'\nexport { bypass } from './bypass'\nexport { passthrough } from './passthrough'\n\n// Validate environmental globals before executing any code.\n// This ensures that the library gives user-friendly errors\n// when ran in the environments that require additional polyfills\n// from the end user.\ncheckGlobals()\n"],"mappings":"AAAA,SAAS,oBAAoB;AAE7B,SAAS,gBAAgB;AAGzB,SAAS,sBAAsB;AAC/B,SAAS,YAAY;AACrB,SAAS,aAAa,mBAAmB;AACzC,SAAS,eAAe;AACxB,SAAS,sBAAsB;AAG/B,SAAS,uBAAuB;AAChC,cAAc;AACd,SAAS,gBAAgB;AAgCzB,cAAc;AACd,cAAc;AACd,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAM5B,aAAa;","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performs the intercepted request as-is.
|
|
3
|
+
*
|
|
4
|
+
* This stops request handler lookup so no other handlers
|
|
5
|
+
* can affect this request past this point.
|
|
6
|
+
* Unlike `bypass()`, this will not trigger an additional request.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* http.get('/resource', () => {
|
|
10
|
+
* return passthrough()
|
|
11
|
+
* })
|
|
12
|
+
*
|
|
13
|
+
* @see {@link https://mswjs.io/docs/api/passthrough `passthrough()` API reference}
|
|
14
|
+
*/
|
|
15
|
+
declare function passthrough(): Response;
|
|
16
|
+
|
|
17
|
+
export { passthrough };
|
package/lib/core/passthrough.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/passthrough.ts"],"sourcesContent":["/**\n * Performs the intercepted request as-is.\n *\n * This stops request handler lookup so no other handlers\n * can affect this request past this point.\n * Unlike `bypass()`, this will not trigger an additional request.\n *\n * @example\n * http.get('/resource', () => {\n * return passthrough()\n * })\n *\n * @see {@link https://mswjs.io/docs/api/passthrough `passthrough()` API reference}\n */\nexport function passthrough(): Response {\n return new Response(null, {\n status: 302,\n statusText: 'Passthrough',\n headers: {\n 'x-msw-intention': 'passthrough',\n },\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcO,SAAS,cAAwB;AACtC,SAAO,IAAI,SAAS,MAAM;AAAA,IACxB,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,SAAS;AAAA,MACP,mBAAmB;AAAA,IACrB;AAAA,EACF,CAAC;AACH;","names":[]}
|
package/lib/core/passthrough.mjs
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/passthrough.ts"],"sourcesContent":["/**\n * Performs the intercepted request as-is.\n *\n * This stops request handler lookup so no other handlers\n * can affect this request past this point.\n * Unlike `bypass()`, this will not trigger an additional request.\n *\n * @example\n * http.get('/resource', () => {\n * return passthrough()\n * })\n *\n * @see {@link https://mswjs.io/docs/api/passthrough `passthrough()` API reference}\n */\nexport function passthrough(): Response {\n return new Response(null, {\n status: 302,\n statusText: 'Passthrough',\n headers: {\n 'x-msw-intention': 'passthrough',\n },\n })\n}\n"],"mappings":"AAcO,SAAS,cAAwB;AACtC,SAAO,IAAI,SAAS,MAAM;AAAA,IACxB,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,SAAS;AAAA,MACP,mBAAmB;AAAA,IACrB;AAAA,EACF,CAAC;AACH;","names":[]}
|