msw 2.0.14 → 2.1.1

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.
Files changed (135) hide show
  1. package/cli/index.js +11 -3
  2. package/cli/init.js +126 -73
  3. package/config/scripts/postinstall.js +8 -20
  4. package/lib/browser/index.js +111 -176
  5. package/lib/browser/index.js.map +1 -1
  6. package/lib/browser/index.mjs +111 -179
  7. package/lib/browser/index.mjs.map +1 -1
  8. package/lib/core/{GraphQLHandler-JB4bsrLF.d.ts → GraphQLHandler-2guuZL5R.d.ts} +1 -1
  9. package/lib/core/{GraphQLHandler-mT-MmgeB.d.mts → GraphQLHandler-fe5IYUg3.d.mts} +1 -1
  10. package/lib/core/HttpResponse.d.mts +1 -1
  11. package/lib/core/HttpResponse.d.ts +1 -1
  12. package/lib/core/{RequestHandler-rmY-HeFN.d.ts → RequestHandler-TRh8Eh4H.d.ts} +9 -1
  13. package/lib/core/{RequestHandler-YiqamK0M.d.mts → RequestHandler-nfjVJ8Tp.d.mts} +9 -1
  14. package/lib/core/SetupApi.d.mts +1 -1
  15. package/lib/core/SetupApi.d.ts +1 -1
  16. package/lib/core/SetupApi.js +5 -0
  17. package/lib/core/SetupApi.js.map +1 -1
  18. package/lib/core/SetupApi.mjs +5 -0
  19. package/lib/core/SetupApi.mjs.map +1 -1
  20. package/lib/core/delay.js +24 -46
  21. package/lib/core/delay.js.map +1 -1
  22. package/lib/core/delay.mjs +24 -46
  23. package/lib/core/delay.mjs.map +1 -1
  24. package/lib/core/graphql.d.mts +2 -2
  25. package/lib/core/graphql.d.ts +2 -2
  26. package/lib/core/graphql.js +3 -19
  27. package/lib/core/graphql.js.map +1 -1
  28. package/lib/core/graphql.mjs +3 -21
  29. package/lib/core/graphql.mjs.map +1 -1
  30. package/lib/core/handlers/GraphQLHandler.d.mts +2 -2
  31. package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
  32. package/lib/core/handlers/GraphQLHandler.js +51 -77
  33. package/lib/core/handlers/GraphQLHandler.js.map +1 -1
  34. package/lib/core/handlers/GraphQLHandler.mjs +51 -77
  35. package/lib/core/handlers/GraphQLHandler.mjs.map +1 -1
  36. package/lib/core/handlers/HttpHandler.d.mts +1 -1
  37. package/lib/core/handlers/HttpHandler.d.ts +1 -1
  38. package/lib/core/handlers/HttpHandler.js +29 -55
  39. package/lib/core/handlers/HttpHandler.js.map +1 -1
  40. package/lib/core/handlers/HttpHandler.mjs +29 -55
  41. package/lib/core/handlers/HttpHandler.mjs.map +1 -1
  42. package/lib/core/handlers/RequestHandler.d.mts +1 -1
  43. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  44. package/lib/core/handlers/RequestHandler.js +79 -103
  45. package/lib/core/handlers/RequestHandler.js.map +1 -1
  46. package/lib/core/handlers/RequestHandler.mjs +79 -105
  47. package/lib/core/handlers/RequestHandler.mjs.map +1 -1
  48. package/lib/core/http.d.mts +1 -1
  49. package/lib/core/http.d.ts +1 -1
  50. package/lib/core/index.d.mts +2 -2
  51. package/lib/core/index.d.ts +2 -2
  52. package/lib/core/sharedOptions.d.mts +1 -1
  53. package/lib/core/sharedOptions.d.ts +1 -1
  54. package/lib/core/utils/HttpResponse/decorators.d.mts +1 -1
  55. package/lib/core/utils/HttpResponse/decorators.d.ts +1 -1
  56. package/lib/core/utils/HttpResponse/decorators.js +7 -24
  57. package/lib/core/utils/HttpResponse/decorators.js.map +1 -1
  58. package/lib/core/utils/HttpResponse/decorators.mjs +7 -26
  59. package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -1
  60. package/lib/core/utils/getResponse.d.mts +1 -1
  61. package/lib/core/utils/getResponse.d.ts +1 -1
  62. package/lib/core/utils/getResponse.js +11 -26
  63. package/lib/core/utils/getResponse.js.map +1 -1
  64. package/lib/core/utils/getResponse.mjs +11 -26
  65. package/lib/core/utils/getResponse.mjs.map +1 -1
  66. package/lib/core/utils/handleRequest.d.mts +1 -1
  67. package/lib/core/utils/handleRequest.d.ts +1 -1
  68. package/lib/core/utils/handleRequest.js +49 -72
  69. package/lib/core/utils/handleRequest.js.map +1 -1
  70. package/lib/core/utils/handleRequest.mjs +49 -72
  71. package/lib/core/utils/handleRequest.mjs.map +1 -1
  72. package/lib/core/utils/internal/Disposable.js +3 -27
  73. package/lib/core/utils/internal/Disposable.js.map +1 -1
  74. package/lib/core/utils/internal/Disposable.mjs +3 -27
  75. package/lib/core/utils/internal/Disposable.mjs.map +1 -1
  76. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +2 -2
  77. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
  78. package/lib/core/utils/internal/parseGraphQLRequest.js +72 -112
  79. package/lib/core/utils/internal/parseGraphQLRequest.js.map +1 -1
  80. package/lib/core/utils/internal/parseGraphQLRequest.mjs +72 -113
  81. package/lib/core/utils/internal/parseGraphQLRequest.mjs.map +1 -1
  82. package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
  83. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  84. package/lib/core/utils/internal/parseMultipartData.js +3 -4
  85. package/lib/core/utils/internal/parseMultipartData.js.map +1 -1
  86. package/lib/core/utils/internal/parseMultipartData.mjs +3 -4
  87. package/lib/core/utils/internal/parseMultipartData.mjs.map +1 -1
  88. package/lib/core/utils/internal/requestHandlerUtils.d.mts +1 -1
  89. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  90. package/lib/core/utils/internal/tryCatch.js +1 -1
  91. package/lib/core/utils/internal/tryCatch.js.map +1 -1
  92. package/lib/core/utils/internal/tryCatch.mjs +1 -1
  93. package/lib/core/utils/internal/tryCatch.mjs.map +1 -1
  94. package/lib/core/utils/logging/serializeRequest.js +9 -31
  95. package/lib/core/utils/logging/serializeRequest.js.map +1 -1
  96. package/lib/core/utils/logging/serializeRequest.mjs +9 -31
  97. package/lib/core/utils/logging/serializeRequest.mjs.map +1 -1
  98. package/lib/core/utils/logging/serializeResponse.js +11 -33
  99. package/lib/core/utils/logging/serializeResponse.js.map +1 -1
  100. package/lib/core/utils/logging/serializeResponse.mjs +11 -33
  101. package/lib/core/utils/logging/serializeResponse.mjs.map +1 -1
  102. package/lib/core/utils/request/getRequestCookies.js +9 -18
  103. package/lib/core/utils/request/getRequestCookies.js.map +1 -1
  104. package/lib/core/utils/request/getRequestCookies.mjs +9 -20
  105. package/lib/core/utils/request/getRequestCookies.mjs.map +1 -1
  106. package/lib/core/utils/request/onUnhandledRequest.d.mts +1 -1
  107. package/lib/core/utils/request/onUnhandledRequest.d.ts +1 -1
  108. package/lib/core/utils/request/onUnhandledRequest.js +62 -84
  109. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -1
  110. package/lib/core/utils/request/onUnhandledRequest.mjs +62 -84
  111. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -1
  112. package/lib/core/utils/request/readResponseCookies.js +1 -18
  113. package/lib/core/utils/request/readResponseCookies.js.map +1 -1
  114. package/lib/core/utils/request/readResponseCookies.mjs +1 -20
  115. package/lib/core/utils/request/readResponseCookies.mjs.map +1 -1
  116. package/lib/iife/index.js +678 -958
  117. package/lib/iife/index.js.map +1 -1
  118. package/lib/mockServiceWorker.js +2 -2
  119. package/lib/native/index.js +5 -23
  120. package/lib/native/index.js.map +1 -1
  121. package/lib/native/index.mjs +5 -24
  122. package/lib/native/index.mjs.map +1 -1
  123. package/lib/node/index.js +5 -23
  124. package/lib/node/index.js.map +1 -1
  125. package/lib/node/index.mjs +5 -24
  126. package/lib/node/index.mjs.map +1 -1
  127. package/package.json +32 -37
  128. package/src/browser/setupWorker/setupWorker.ts +6 -0
  129. package/src/browser/setupWorker/start/createStartHandler.ts +0 -8
  130. package/src/core/handlers/GraphQLHandler.test.ts +7 -3
  131. package/src/core/handlers/HttpHandler.test.ts +7 -2
  132. package/src/core/handlers/RequestHandler.ts +24 -4
  133. package/src/core/utils/getResponse.ts +12 -6
  134. package/src/core/utils/handleRequest.test.ts +20 -0
  135. package/src/core/utils/handleRequest.ts +4 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/browser/setupWorker/setupWorker.ts","../../src/browser/setupWorker/start/createStartHandler.ts","../../src/browser/setupWorker/start/utils/getWorkerInstance.ts","../../src/browser/utils/getAbsoluteWorkerUrl.ts","../../src/browser/setupWorker/start/utils/getWorkerByRegistration.ts","../../src/browser/setupWorker/start/utils/enableMocking.ts","../../src/browser/setupWorker/start/utils/printStartMessage.ts","../../src/browser/setupWorker/start/utils/createMessageChannel.ts","../../src/browser/utils/pruneGetRequestBody.ts","../../src/browser/utils/parseWorkerRequest.ts","../../src/browser/setupWorker/start/createRequestListener.ts","../../src/browser/utils/requestIntegrityCheck.ts","../../src/browser/utils/deferNetworkRequestsUntil.ts","../../src/browser/setupWorker/start/createResponseListener.ts","../../src/browser/setupWorker/start/utils/validateWorkerScope.ts","../../src/browser/setupWorker/stop/createStop.ts","../../src/browser/setupWorker/stop/utils/printStopMessage.ts","../../src/browser/setupWorker/start/utils/prepareStartHandler.ts","../../src/browser/setupWorker/start/createFallbackRequestListener.ts","../../src/browser/setupWorker/start/createFallbackStart.ts","../../src/browser/setupWorker/stop/createFallbackStop.ts","../../src/browser/utils/supportsReadableStreamTransfer.ts"],"sourcesContent":["import { invariant } from 'outvariant'\nimport { isNodeProcess } from 'is-node-process'\nimport {\n SetupWorkerInternalContext,\n ServiceWorkerIncomingEventsMap,\n StartReturnType,\n StopHandler,\n StartHandler,\n StartOptions,\n} from './glossary'\nimport { createStartHandler } from './start/createStartHandler'\nimport { createStop } from './stop/createStop'\nimport { ServiceWorkerMessage } from './start/utils/createMessageChannel'\nimport { RequestHandler } from '~/core/handlers/RequestHandler'\nimport { DEFAULT_START_OPTIONS } from './start/utils/prepareStartHandler'\nimport { createFallbackStart } from './start/createFallbackStart'\nimport { createFallbackStop } from './stop/createFallbackStop'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { SetupApi } from '~/core/SetupApi'\nimport { mergeRight } from '~/core/utils/internal/mergeRight'\nimport { LifeCycleEventsMap } from '~/core/sharedOptions'\nimport { SetupWorker } from './glossary'\nimport { supportsReadableStreamTransfer } from '../utils/supportsReadableStreamTransfer'\n\ninterface Listener {\n target: EventTarget\n eventType: string\n callback: EventListenerOrEventListenerObject\n}\n\nexport class SetupWorkerApi\n extends SetupApi<LifeCycleEventsMap>\n implements SetupWorker\n{\n private context: SetupWorkerInternalContext\n private startHandler: StartHandler = null as any\n private stopHandler: StopHandler = null as any\n private listeners: Array<Listener>\n\n constructor(...handlers: Array<RequestHandler>) {\n super(...handlers)\n\n invariant(\n !isNodeProcess(),\n devUtils.formatMessage(\n 'Failed to execute `setupWorker` in a non-browser environment. Consider using `setupServer` for Node.js environment instead.',\n ),\n )\n\n this.listeners = []\n this.context = this.createWorkerContext()\n }\n\n private createWorkerContext(): SetupWorkerInternalContext {\n const context: SetupWorkerInternalContext = {\n // Mocking is not considered enabled until the worker\n // signals back the successful activation event.\n isMockingEnabled: false,\n startOptions: null as any,\n worker: null,\n registration: null,\n requestHandlers: this.currentHandlers,\n emitter: this.emitter,\n workerChannel: {\n on: (eventType, callback) => {\n this.context.events.addListener<\n MessageEvent<ServiceWorkerMessage<typeof eventType, any>>\n >(navigator.serviceWorker, 'message', (event) => {\n // Avoid messages broadcasted from unrelated workers.\n if (event.source !== this.context.worker) {\n return\n }\n\n const message = event.data\n\n if (!message) {\n return\n }\n\n if (message.type === eventType) {\n callback(event, message)\n }\n })\n },\n send: (type) => {\n this.context.worker?.postMessage(type)\n },\n },\n events: {\n addListener: (target, eventType, callback) => {\n target.addEventListener(eventType, callback as EventListener)\n this.listeners.push({\n eventType,\n target,\n callback: callback as EventListener,\n })\n\n return () => {\n target.removeEventListener(eventType, callback as EventListener)\n }\n },\n removeAllListeners: () => {\n for (const { target, eventType, callback } of this.listeners) {\n target.removeEventListener(eventType, callback)\n }\n this.listeners = []\n },\n once: (eventType) => {\n const bindings: Array<() => void> = []\n\n return new Promise<\n ServiceWorkerMessage<\n typeof eventType,\n ServiceWorkerIncomingEventsMap[typeof eventType]\n >\n >((resolve, reject) => {\n const handleIncomingMessage = (event: MessageEvent) => {\n try {\n const message = event.data\n\n if (message.type === eventType) {\n resolve(message)\n }\n } catch (error) {\n reject(error)\n }\n }\n\n bindings.push(\n this.context.events.addListener(\n navigator.serviceWorker,\n 'message',\n handleIncomingMessage,\n ),\n this.context.events.addListener(\n navigator.serviceWorker,\n 'messageerror',\n reject,\n ),\n )\n }).finally(() => {\n bindings.forEach((unbind) => unbind())\n })\n },\n },\n supports: {\n serviceWorkerApi:\n !('serviceWorker' in navigator) || location.protocol === 'file:',\n readableStreamTransfer: supportsReadableStreamTransfer(),\n },\n }\n\n /**\n * @todo Not sure I like this but \"this.currentHandlers\"\n * updates never bubble to \"this.context.requestHandlers\".\n */\n Object.defineProperties(context, {\n requestHandlers: {\n get: () => this.currentHandlers,\n },\n })\n\n this.startHandler = context.supports.serviceWorkerApi\n ? createFallbackStart(context)\n : createStartHandler(context)\n\n this.stopHandler = context.supports.serviceWorkerApi\n ? createFallbackStop(context)\n : createStop(context)\n\n return context\n }\n\n public async start(options: StartOptions = {}): StartReturnType {\n this.context.startOptions = mergeRight(\n DEFAULT_START_OPTIONS,\n options,\n ) as SetupWorkerInternalContext['startOptions']\n\n return await this.startHandler(this.context.startOptions, options)\n }\n\n public stop(): void {\n super.dispose()\n this.context.events.removeAllListeners()\n this.context.emitter.removeAllListeners()\n this.stopHandler()\n }\n}\n\n/**\n * Sets up a requests interception in the browser with the given request handlers.\n * @param {RequestHandler[]} handlers List of request handlers.\n *\n * @see {@link https://mswjs.io/docs/api/setup-worker `setupWorker()` API reference}\n */\nexport function setupWorker(...handlers: Array<RequestHandler>): SetupWorker {\n return new SetupWorkerApi(...handlers)\n}\n","import { until } from '@open-draft/until'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { getWorkerInstance } from './utils/getWorkerInstance'\nimport { enableMocking } from './utils/enableMocking'\nimport { SetupWorkerInternalContext, StartHandler } from '../glossary'\nimport { createRequestListener } from './createRequestListener'\nimport { requestIntegrityCheck } from '../../utils/requestIntegrityCheck'\nimport { deferNetworkRequestsUntil } from '../../utils/deferNetworkRequestsUntil'\nimport { createResponseListener } from './createResponseListener'\nimport { validateWorkerScope } from './utils/validateWorkerScope'\n\nexport const createStartHandler = (\n context: SetupWorkerInternalContext,\n): StartHandler => {\n return function start(options, customOptions) {\n const startWorkerInstance = async () => {\n // Remove all previously existing event listeners.\n // This way none of the listeners persists between Fast refresh\n // of the application's code.\n context.events.removeAllListeners()\n\n // Handle requests signaled by the worker.\n context.workerChannel.on(\n 'REQUEST',\n createRequestListener(context, options),\n )\n\n // Handle responses signaled by the worker.\n context.workerChannel.on('RESPONSE', createResponseListener(context))\n\n const instance = await getWorkerInstance(\n options.serviceWorker.url,\n options.serviceWorker.options,\n options.findWorker,\n )\n\n const [worker, registration] = instance\n\n if (!worker) {\n const missingWorkerMessage = customOptions?.findWorker\n ? devUtils.formatMessage(\n `Failed to locate the Service Worker registration using a custom \"findWorker\" predicate.\n\nPlease ensure that the custom predicate properly locates the Service Worker registration at \"%s\".\nMore details: https://mswjs.io/docs/api/setup-worker/start#findworker\n`,\n options.serviceWorker.url,\n )\n : devUtils.formatMessage(\n `Failed to locate the Service Worker registration.\n\nThis most likely means that the worker script URL \"%s\" cannot resolve against the actual public hostname (%s). This may happen if your application runs behind a proxy, or has a dynamic hostname.\n\nPlease consider using a custom \"serviceWorker.url\" option to point to the actual worker script location, or a custom \"findWorker\" option to resolve the Service Worker registration manually. More details: https://mswjs.io/docs/api/setup-worker/start`,\n options.serviceWorker.url,\n location.host,\n )\n\n throw new Error(missingWorkerMessage)\n }\n\n context.worker = worker\n context.registration = registration\n\n context.events.addListener(window, 'beforeunload', () => {\n if (worker.state !== 'redundant') {\n // Notify the Service Worker that this client has closed.\n // Internally, it's similar to disabling the mocking, only\n // client close event has a handler that self-terminates\n // the Service Worker when there are no open clients.\n context.workerChannel.send('CLIENT_CLOSED')\n }\n // Make sure we're always clearing the interval - there are reports that not doing this can\n // cause memory leaks in headless browser environments.\n window.clearInterval(context.keepAliveInterval)\n })\n\n // Check if the active Service Worker is the latest published one\n const integrityCheckResult = await until(() =>\n requestIntegrityCheck(context, worker),\n )\n\n if (integrityCheckResult.error) {\n devUtils.error(`\\\nDetected outdated Service Worker: ${integrityCheckResult.error.message}\n\nThe mocking is still enabled, but it's highly recommended that you update your Service Worker by running:\n\n$ npx msw init <PUBLIC_DIR>\n\nThis is necessary to ensure that the Service Worker is in sync with the library to guarantee its stability.\nIf this message still persists after updating, please report an issue: https://github.com/open-draft/msw/issues\\\n `)\n }\n\n context.keepAliveInterval = window.setInterval(\n () => context.workerChannel.send('KEEPALIVE_REQUEST'),\n 5000,\n )\n\n // Warn the user when loading the page that lies outside\n // of the worker's scope.\n validateWorkerScope(registration, context.startOptions)\n\n return registration\n }\n\n const workerRegistration = startWorkerInstance().then(\n async (registration) => {\n const pendingInstance = registration.installing || registration.waiting\n\n // Wait until the worker is activated.\n // Assume the worker is already activated if there's no pending registration\n // (i.e. when reloading the page after a successful activation).\n if (pendingInstance) {\n await new Promise<void>((resolve) => {\n pendingInstance.addEventListener('statechange', () => {\n if (pendingInstance.state === 'activated') {\n return resolve()\n }\n })\n })\n }\n\n // Print the activation message only after the worker has been activated.\n await enableMocking(context, options).catch((error) => {\n throw new Error(`Failed to enable mocking: ${error?.message}`)\n })\n\n return registration\n },\n )\n\n // Defer any network requests until the Service Worker instance is ready.\n // This prevents a race condition between the Service Worker registration\n // and application's runtime requests (i.e. requests on mount).\n if (options.waitUntilReady) {\n deferNetworkRequestsUntil(workerRegistration)\n }\n\n return workerRegistration\n }\n}\n","import { until } from '@open-draft/until'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { getAbsoluteWorkerUrl } from '../../../utils/getAbsoluteWorkerUrl'\nimport { getWorkerByRegistration } from './getWorkerByRegistration'\nimport { ServiceWorkerInstanceTuple, FindWorker } from '../../glossary'\n\n/**\n * Returns an active Service Worker instance.\n * When not found, registers a new Service Worker.\n */\nexport const getWorkerInstance = async (\n url: string,\n options: RegistrationOptions = {},\n findWorker: FindWorker,\n): Promise<ServiceWorkerInstanceTuple> => {\n // Resolve the absolute Service Worker URL.\n const absoluteWorkerUrl = getAbsoluteWorkerUrl(url)\n\n const mockRegistrations = await navigator.serviceWorker\n .getRegistrations()\n .then((registrations) =>\n registrations.filter((registration) =>\n getWorkerByRegistration(registration, absoluteWorkerUrl, findWorker),\n ),\n )\n if (!navigator.serviceWorker.controller && mockRegistrations.length > 0) {\n // Reload the page when it has associated workers, but no active controller.\n // The absence of a controller can mean either:\n // - page has no Service Worker associated with it\n // - page has been hard-reloaded and its workers won't be used until the next reload.\n // Since we've checked that there are registrations associated with this page,\n // at this point we are sure it's hard reload that falls into this clause.\n location.reload()\n }\n\n const [existingRegistration] = mockRegistrations\n\n if (existingRegistration) {\n // When the Service Worker is registered, update it and return the reference.\n return existingRegistration.update().then(() => {\n return [\n getWorkerByRegistration(\n existingRegistration,\n absoluteWorkerUrl,\n findWorker,\n ),\n existingRegistration,\n ]\n })\n }\n\n // When the Service Worker wasn't found, register it anew and return the reference.\n const registrationResult = await until<Error, ServiceWorkerInstanceTuple>(\n async () => {\n const registration = await navigator.serviceWorker.register(url, options)\n return [\n // Compare existing worker registration by its worker URL,\n // to prevent irrelevant workers to resolve here (such as Codesandbox worker).\n getWorkerByRegistration(registration, absoluteWorkerUrl, findWorker),\n registration,\n ]\n },\n )\n\n // Handle Service Worker registration errors.\n if (registrationResult.error) {\n const isWorkerMissing = registrationResult.error.message.includes('(404)')\n\n // Produce a custom error message when given a non-existing Service Worker url.\n // Suggest developers to check their setup.\n if (isWorkerMissing) {\n const scopeUrl = new URL(options?.scope || '/', location.href)\n\n throw new Error(\n devUtils.formatMessage(`\\\nFailed to register a Service Worker for scope ('${scopeUrl.href}') with script ('${absoluteWorkerUrl}'): Service Worker script does not exist at the given path.\n\nDid you forget to run \"npx msw init <PUBLIC_DIR>\"?\n\nLearn more about creating the Service Worker script: https://mswjs.io/docs/cli/init`),\n )\n }\n\n // Fallback error message for any other registration errors.\n throw new Error(\n devUtils.formatMessage(\n 'Failed to register the Service Worker:\\n\\n%s',\n registrationResult.error.message,\n ),\n )\n }\n\n return registrationResult.data\n}\n","/**\n * Returns an absolute Service Worker URL based on the given\n * relative URL (known during the registration).\n */\nexport function getAbsoluteWorkerUrl(workerUrl: string): string {\n return new URL(workerUrl, location.href).href\n}\n","import { FindWorker } from '../../glossary'\n\n/**\n * Attempts to resolve a Service Worker instance from a given registration,\n * regardless of its state (active, installing, waiting).\n */\nexport function getWorkerByRegistration(\n registration: ServiceWorkerRegistration,\n absoluteWorkerUrl: string,\n findWorker: FindWorker,\n): ServiceWorker | null {\n const allStates = [\n registration.active,\n registration.installing,\n registration.waiting,\n ]\n const relevantStates = allStates.filter((state): state is ServiceWorker => {\n return state != null\n })\n const worker = relevantStates.find((worker) => {\n return findWorker(worker.scriptURL, absoluteWorkerUrl)\n })\n\n return worker || null\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\nimport { StartOptions, SetupWorkerInternalContext } from '../../glossary'\nimport { printStartMessage } from './printStartMessage'\n\n/**\n * Signals the worker to enable the interception of requests.\n */\nexport async function enableMocking(\n context: SetupWorkerInternalContext,\n options: StartOptions,\n) {\n context.workerChannel.send('MOCK_ACTIVATE')\n await context.events.once('MOCKING_ENABLED')\n\n // Warn the developer on multiple \"worker.start()\" calls.\n // While this will not affect the worker in any way,\n // it likely indicates an issue with the developer's code.\n if (context.isMockingEnabled) {\n devUtils.warn(\n `Found a redundant \"worker.start()\" call. Note that starting the worker while mocking is already enabled will have no effect. Consider removing this \"worker.start()\" call.`,\n )\n return\n }\n\n context.isMockingEnabled = true\n\n printStartMessage({\n quiet: options.quiet,\n workerScope: context.registration?.scope,\n workerUrl: context.worker?.scriptURL,\n })\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\n\nexport interface PrintStartMessageArgs {\n quiet?: boolean\n message?: string\n workerUrl?: string\n workerScope?: string\n}\n\n/**\n * Prints a worker activation message in the browser's console.\n */\nexport function printStartMessage(args: PrintStartMessageArgs = {}) {\n if (args.quiet) {\n return\n }\n\n const message = args.message || 'Mocking enabled.'\n\n console.groupCollapsed(\n `%c${devUtils.formatMessage(message)}`,\n 'color:orangered;font-weight:bold;',\n )\n console.log(\n '%cDocumentation: %chttps://mswjs.io/docs',\n 'font-weight:bold',\n 'font-weight:normal',\n )\n console.log('Found an issue? https://github.com/mswjs/msw/issues')\n\n if (args.workerUrl) {\n console.log('Worker script URL:', args.workerUrl)\n }\n\n if (args.workerScope) {\n console.log('Worker scope:', args.workerScope)\n }\n\n console.groupEnd()\n}\n","import {\n StringifiedResponse,\n ServiceWorkerIncomingEventsMap,\n} from '../../glossary'\n\nexport interface ServiceWorkerMessage<\n EventType extends keyof ServiceWorkerIncomingEventsMap,\n EventPayload,\n> {\n type: EventType\n payload: EventPayload\n}\n\ninterface WorkerChannelEventsMap {\n MOCK_RESPONSE: [\n data: StringifiedResponse,\n transfer?: [ReadableStream<Uint8Array>],\n ]\n NOT_FOUND: []\n}\n\nexport class WorkerChannel {\n constructor(private readonly port: MessagePort) {}\n\n public postMessage<Event extends keyof WorkerChannelEventsMap>(\n event: Event,\n ...rest: WorkerChannelEventsMap[Event]\n ): void {\n const [data, transfer] = rest\n this.port.postMessage({ type: event, data }, { transfer })\n }\n}\n","import type { ServiceWorkerIncomingRequest } from '../setupWorker/glossary'\n\ntype Input = Pick<ServiceWorkerIncomingRequest, 'method' | 'body'>\n\n/**\n * Ensures that an empty GET request body is always represented as `undefined`.\n */\nexport function pruneGetRequestBody(\n request: Input,\n): ServiceWorkerIncomingRequest['body'] {\n // Force HEAD/GET request body to always be empty.\n // The worker reads any request's body as ArrayBuffer,\n // and you cannot re-construct a GET/HEAD Request\n // with an ArrayBuffer, even if empty. Also note that\n // \"request.body\" is always undefined in the worker.\n if (['HEAD', 'GET'].includes(request.method)) {\n return undefined\n }\n\n return request.body\n}\n","import { pruneGetRequestBody } from './pruneGetRequestBody'\nimport type { ServiceWorkerIncomingRequest } from '../setupWorker/glossary'\n\n/**\n * Converts a given request received from the Service Worker\n * into a Fetch `Request` instance.\n */\nexport function parseWorkerRequest(\n incomingRequest: ServiceWorkerIncomingRequest,\n): Request {\n return new Request(incomingRequest.url, {\n ...incomingRequest,\n body: pruneGetRequestBody(incomingRequest),\n })\n}\n","import {\n StartOptions,\n SetupWorkerInternalContext,\n ServiceWorkerIncomingEventsMap,\n} from '../glossary'\nimport {\n ServiceWorkerMessage,\n WorkerChannel,\n} from './utils/createMessageChannel'\nimport { parseWorkerRequest } from '../../utils/parseWorkerRequest'\nimport { handleRequest } from '~/core/utils/handleRequest'\nimport { RequiredDeep } from '~/core/typeUtils'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { toResponseInit } from '~/core/utils/toResponseInit'\n\nexport const createRequestListener = (\n context: SetupWorkerInternalContext,\n options: RequiredDeep<StartOptions>,\n) => {\n return async (\n event: MessageEvent,\n message: ServiceWorkerMessage<\n 'REQUEST',\n ServiceWorkerIncomingEventsMap['REQUEST']\n >,\n ) => {\n const messageChannel = new WorkerChannel(event.ports[0])\n\n const requestId = message.payload.id\n const request = parseWorkerRequest(message.payload)\n const requestCloneForLogs = request.clone()\n\n try {\n await handleRequest(\n request,\n requestId,\n context.requestHandlers,\n options,\n context.emitter,\n {\n onPassthroughResponse() {\n messageChannel.postMessage('NOT_FOUND')\n },\n async onMockedResponse(response, { handler, parsedResult }) {\n // Clone the mocked response so its body could be read\n // to buffer to be sent to the worker and also in the\n // \".log()\" method of the request handler.\n const responseClone = response.clone()\n const responseCloneForLogs = response.clone()\n const responseInit = toResponseInit(response)\n\n /**\n * @note Safari doesn't support transferring a \"ReadableStream\".\n * Check that the browser supports that before sending it to the worker.\n */\n if (context.supports.readableStreamTransfer) {\n const responseStreamOrNull = response.body\n\n messageChannel.postMessage(\n 'MOCK_RESPONSE',\n {\n ...responseInit,\n body: responseStreamOrNull,\n },\n responseStreamOrNull ? [responseStreamOrNull] : undefined,\n )\n } else {\n /**\n * @note If we are here, this means the current environment doesn't\n * support \"ReadableStream\" as transferable. In that case,\n * attempt to read the non-empty response body as ArrayBuffer, if it's not empty.\n * @see https://github.com/mswjs/msw/issues/1827\n */\n const responseBufferOrNull =\n response.body === null\n ? null\n : await responseClone.arrayBuffer()\n\n messageChannel.postMessage('MOCK_RESPONSE', {\n ...responseInit,\n body: responseBufferOrNull,\n })\n }\n\n if (!options.quiet) {\n context.emitter.once('response:mocked', () => {\n handler.log({\n request: requestCloneForLogs,\n response: responseCloneForLogs,\n parsedResult,\n })\n })\n }\n },\n },\n )\n } catch (error) {\n if (error instanceof Error) {\n devUtils.error(\n `Uncaught exception in the request handler for \"%s %s\":\n\n%s\n\nThis exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/recipes/mocking-error-responses`,\n request.method,\n request.url,\n error.stack ?? error,\n )\n\n // Treat all other exceptions in a request handler as unintended,\n // alerting that there is a problem that needs fixing.\n messageChannel.postMessage('MOCK_RESPONSE', {\n status: 500,\n statusText: 'Request Handler Error',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name: error.name,\n message: error.message,\n stack: error.stack,\n }),\n })\n }\n }\n }\n}\n","import type { SetupWorkerInternalContext } from '../setupWorker/glossary'\n\nexport async function requestIntegrityCheck(\n context: SetupWorkerInternalContext,\n serviceWorker: ServiceWorker,\n): Promise<ServiceWorker> {\n // Signal Service Worker to report back its integrity\n context.workerChannel.send('INTEGRITY_CHECK_REQUEST')\n\n const { payload: actualChecksum } = await context.events.once(\n 'INTEGRITY_CHECK_RESPONSE',\n )\n\n // Compare the response from the Service Worker and the\n // global variable set during the build.\n if (actualChecksum !== SERVICE_WORKER_CHECKSUM) {\n throw new Error(\n `Currently active Service Worker (${actualChecksum}) is behind the latest published one (${SERVICE_WORKER_CHECKSUM}).`,\n )\n }\n\n return serviceWorker\n}\n","import { until } from '@open-draft/until'\n\n/**\n * Intercepts and defers any requests on the page\n * until the Service Worker instance is ready.\n * Must only be used in a browser.\n */\nexport function deferNetworkRequestsUntil(predicatePromise: Promise<any>) {\n // Defer any `XMLHttpRequest` requests until the Service Worker is ready.\n const originalXhrSend = window.XMLHttpRequest.prototype.send\n window.XMLHttpRequest.prototype.send = function (\n ...args: Parameters<XMLHttpRequest['send']>\n ) {\n // Keep this function synchronous to comply with `XMLHttpRequest.prototype.send`,\n // because that method is always synchronous.\n until(() => predicatePromise).then(() => {\n window.XMLHttpRequest.prototype.send = originalXhrSend\n this.send(...args)\n })\n }\n\n // Defer any `fetch` requests until the Service Worker is ready.\n const originalFetch = window.fetch\n window.fetch = async (...args) => {\n await until(() => predicatePromise)\n window.fetch = originalFetch\n return window.fetch(...args)\n }\n}\n","import {\n ServiceWorkerIncomingEventsMap,\n SetupWorkerInternalContext,\n} from '../glossary'\nimport { ServiceWorkerMessage } from './utils/createMessageChannel'\nimport { isResponseWithoutBody } from '@mswjs/interceptors'\n\nexport function createResponseListener(context: SetupWorkerInternalContext) {\n return (\n _: MessageEvent,\n message: ServiceWorkerMessage<\n 'RESPONSE',\n ServiceWorkerIncomingEventsMap['RESPONSE']\n >,\n ) => {\n const { payload: responseJson } = message\n\n /**\n * CORS requests with `mode: \"no-cors\"` result in \"opaque\" responses.\n * That kind of responses cannot be manipulated in JavaScript due\n * to the security considerations.\n * @see https://fetch.spec.whatwg.org/#concept-filtered-response-opaque\n * @see https://github.com/mswjs/msw/issues/529\n */\n if (responseJson.type?.includes('opaque')) {\n return\n }\n\n const response =\n responseJson.status === 0\n ? Response.error()\n : new Response(\n /**\n * Responses may be streams here, but when we create a response object\n * with null-body status codes, like 204, 205, 304 Response will\n * throw when passed a non-null body, so ensure it's null here\n * for those codes\n */\n isResponseWithoutBody(responseJson.status)\n ? null\n : responseJson.body,\n responseJson,\n )\n\n context.emitter.emit(\n responseJson.isMockedResponse ? 'response:mocked' : 'response:bypass',\n {\n response,\n /**\n * @todo @fixme In this context, we don't know anything about\n * the request.\n */\n request: null as any,\n requestId: responseJson.requestId,\n },\n )\n }\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\nimport { StartOptions } from '../../glossary'\n\nexport function validateWorkerScope(\n registration: ServiceWorkerRegistration,\n options?: StartOptions,\n): void {\n if (!options?.quiet && !location.href.startsWith(registration.scope)) {\n devUtils.warn(\n `\\\nCannot intercept requests on this page because it's outside of the worker's scope (\"${registration.scope}\"). If you wish to mock API requests on this page, you must resolve this scope issue.\n\n- (Recommended) Register the worker at the root level (\"/\") of your application.\n- Set the \"Service-Worker-Allowed\" response header to allow out-of-scope workers.\\\n`,\n )\n }\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\nimport { SetupWorkerInternalContext, StopHandler } from '../glossary'\nimport { printStopMessage } from './utils/printStopMessage'\n\nexport const createStop = (\n context: SetupWorkerInternalContext,\n): StopHandler => {\n return function stop() {\n // Warn developers calling \"worker.stop()\" more times than necessary.\n // This likely indicates a mistake in their code.\n if (!context.isMockingEnabled) {\n devUtils.warn(\n 'Found a redundant \"worker.stop()\" call. Note that stopping the worker while mocking already stopped has no effect. Consider removing this \"worker.stop()\" call.',\n )\n return\n }\n\n /**\n * Signal the Service Worker to disable mocking for this client.\n * Use this an an explicit way to stop the mocking, while preserving\n * the worker-client relation. Does not affect the worker's lifecycle.\n */\n context.workerChannel.send('MOCK_DEACTIVATE')\n context.isMockingEnabled = false\n window.clearInterval(context.keepAliveInterval)\n\n printStopMessage({ quiet: context.startOptions?.quiet })\n }\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\n\nexport function printStopMessage(args: { quiet?: boolean } = {}): void {\n if (args.quiet) {\n return\n }\n\n console.log(\n `%c${devUtils.formatMessage('Mocking disabled.')}`,\n 'color:orangered;font-weight:bold;',\n )\n}\n","import { RequiredDeep } from '~/core/typeUtils'\nimport { mergeRight } from '~/core/utils/internal/mergeRight'\nimport {\n SetupWorker,\n SetupWorkerInternalContext,\n StartHandler,\n StartOptions,\n} from '../../glossary'\n\nexport const DEFAULT_START_OPTIONS: RequiredDeep<StartOptions> = {\n serviceWorker: {\n url: '/mockServiceWorker.js',\n options: null as any,\n },\n quiet: false,\n waitUntilReady: true,\n onUnhandledRequest: 'warn',\n findWorker(scriptURL, mockServiceWorkerUrl) {\n return scriptURL === mockServiceWorkerUrl\n },\n}\n\n/**\n * Returns resolved worker start options, merging the default options\n * with the given custom options.\n */\nexport function resolveStartOptions(\n initialOptions?: StartOptions,\n): RequiredDeep<StartOptions> {\n return mergeRight(\n DEFAULT_START_OPTIONS,\n initialOptions || {},\n ) as RequiredDeep<StartOptions>\n}\n\nexport function prepareStartHandler(\n handler: StartHandler,\n context: SetupWorkerInternalContext,\n): SetupWorker['start'] {\n return (initialOptions) => {\n context.startOptions = resolveStartOptions(initialOptions)\n return handler(context.startOptions, initialOptions || {})\n }\n}\n","import {\n Interceptor,\n BatchInterceptor,\n HttpRequestEventMap,\n} from '@mswjs/interceptors'\nimport { FetchInterceptor } from '@mswjs/interceptors/fetch'\nimport { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest'\nimport { SetupWorkerInternalContext, StartOptions } from '../glossary'\nimport type { RequiredDeep } from '~/core/typeUtils'\nimport { handleRequest } from '~/core/utils/handleRequest'\n\nexport function createFallbackRequestListener(\n context: SetupWorkerInternalContext,\n options: RequiredDeep<StartOptions>,\n): Interceptor<HttpRequestEventMap> {\n const interceptor = new BatchInterceptor({\n name: 'fallback',\n interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()],\n })\n\n interceptor.on('request', async ({ request, requestId }) => {\n const requestCloneForLogs = request.clone()\n\n const response = await handleRequest(\n request,\n requestId,\n context.requestHandlers,\n options,\n context.emitter,\n {\n onMockedResponse(_, { handler, parsedResult }) {\n if (!options.quiet) {\n context.emitter.once('response:mocked', ({ response }) => {\n handler.log({\n request: requestCloneForLogs,\n response,\n parsedResult,\n })\n })\n }\n },\n },\n )\n\n if (response) {\n request.respondWith(response)\n }\n })\n\n interceptor.on(\n 'response',\n ({ response, isMockedResponse, request, requestId }) => {\n context.emitter.emit(\n isMockedResponse ? 'response:mocked' : 'response:bypass',\n {\n response,\n request,\n requestId,\n },\n )\n },\n )\n\n interceptor.apply()\n\n return interceptor\n}\n","import { createFallbackRequestListener } from './createFallbackRequestListener'\nimport { SetupWorkerInternalContext, StartHandler } from '../glossary'\nimport { printStartMessage } from './utils/printStartMessage'\n\nexport function createFallbackStart(\n context: SetupWorkerInternalContext,\n): StartHandler {\n return async function start(options) {\n context.fallbackInterceptor = createFallbackRequestListener(\n context,\n options,\n )\n\n printStartMessage({\n message: 'Mocking enabled (fallback mode).',\n quiet: options.quiet,\n })\n\n return undefined\n }\n}\n","import { SetupWorkerInternalContext, StopHandler } from '../glossary'\nimport { printStopMessage } from './utils/printStopMessage'\n\nexport function createFallbackStop(\n context: SetupWorkerInternalContext,\n): StopHandler {\n return function stop() {\n context.fallbackInterceptor?.dispose()\n printStopMessage({ quiet: context.startOptions?.quiet })\n }\n}\n","/**\n * Returns a boolean indicating whether the current browser\n * supports `ReadableStream` as a `Transferable` when posting\n * messages.\n */\nexport function supportsReadableStreamTransfer() {\n try {\n const stream = new ReadableStream({\n start: (controller) => controller.close(),\n })\n const message = new MessageChannel()\n message.port1.postMessage(stream, [stream])\n return true\n } catch (error) {\n return false\n }\n}\n"],"mappings":"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","names":["until","devUtils","worker","devUtils","devUtils","devUtils","devUtils","devUtils","until","until","devUtils","devUtils","until","devUtils","devUtils","devUtils","handleRequest","handleRequest","response","devUtils","mergeRight","devUtils","mergeRight"]}
1
+ {"version":3,"sources":["../../src/browser/setupWorker/setupWorker.ts","../../src/browser/setupWorker/start/createStartHandler.ts","../../src/browser/setupWorker/start/utils/getWorkerInstance.ts","../../src/browser/utils/getAbsoluteWorkerUrl.ts","../../src/browser/setupWorker/start/utils/getWorkerByRegistration.ts","../../src/browser/setupWorker/start/utils/enableMocking.ts","../../src/browser/setupWorker/start/utils/printStartMessage.ts","../../src/browser/setupWorker/start/utils/createMessageChannel.ts","../../src/browser/utils/pruneGetRequestBody.ts","../../src/browser/utils/parseWorkerRequest.ts","../../src/browser/setupWorker/start/createRequestListener.ts","../../src/browser/utils/requestIntegrityCheck.ts","../../src/browser/setupWorker/start/createResponseListener.ts","../../src/browser/setupWorker/start/utils/validateWorkerScope.ts","../../src/browser/setupWorker/stop/createStop.ts","../../src/browser/setupWorker/stop/utils/printStopMessage.ts","../../src/browser/setupWorker/start/utils/prepareStartHandler.ts","../../src/browser/setupWorker/start/createFallbackRequestListener.ts","../../src/browser/setupWorker/start/createFallbackStart.ts","../../src/browser/setupWorker/stop/createFallbackStop.ts","../../src/browser/utils/supportsReadableStreamTransfer.ts"],"sourcesContent":["import { invariant } from 'outvariant'\nimport { isNodeProcess } from 'is-node-process'\nimport {\n SetupWorkerInternalContext,\n ServiceWorkerIncomingEventsMap,\n StartReturnType,\n StopHandler,\n StartHandler,\n StartOptions,\n} from './glossary'\nimport { createStartHandler } from './start/createStartHandler'\nimport { createStop } from './stop/createStop'\nimport { ServiceWorkerMessage } from './start/utils/createMessageChannel'\nimport { RequestHandler } from '~/core/handlers/RequestHandler'\nimport { DEFAULT_START_OPTIONS } from './start/utils/prepareStartHandler'\nimport { createFallbackStart } from './start/createFallbackStart'\nimport { createFallbackStop } from './stop/createFallbackStop'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { SetupApi } from '~/core/SetupApi'\nimport { mergeRight } from '~/core/utils/internal/mergeRight'\nimport { LifeCycleEventsMap } from '~/core/sharedOptions'\nimport { SetupWorker } from './glossary'\nimport { supportsReadableStreamTransfer } from '../utils/supportsReadableStreamTransfer'\n\ninterface Listener {\n target: EventTarget\n eventType: string\n callback: EventListenerOrEventListenerObject\n}\n\nexport class SetupWorkerApi\n extends SetupApi<LifeCycleEventsMap>\n implements SetupWorker\n{\n private context: SetupWorkerInternalContext\n private startHandler: StartHandler = null as any\n private stopHandler: StopHandler = null as any\n private listeners: Array<Listener>\n\n constructor(...handlers: Array<RequestHandler>) {\n super(...handlers)\n\n invariant(\n !isNodeProcess(),\n devUtils.formatMessage(\n 'Failed to execute `setupWorker` in a non-browser environment. Consider using `setupServer` for Node.js environment instead.',\n ),\n )\n\n this.listeners = []\n this.context = this.createWorkerContext()\n }\n\n private createWorkerContext(): SetupWorkerInternalContext {\n const context: SetupWorkerInternalContext = {\n // Mocking is not considered enabled until the worker\n // signals back the successful activation event.\n isMockingEnabled: false,\n startOptions: null as any,\n worker: null,\n registration: null,\n requestHandlers: this.currentHandlers,\n emitter: this.emitter,\n workerChannel: {\n on: (eventType, callback) => {\n this.context.events.addListener<\n MessageEvent<ServiceWorkerMessage<typeof eventType, any>>\n >(navigator.serviceWorker, 'message', (event) => {\n // Avoid messages broadcasted from unrelated workers.\n if (event.source !== this.context.worker) {\n return\n }\n\n const message = event.data\n\n if (!message) {\n return\n }\n\n if (message.type === eventType) {\n callback(event, message)\n }\n })\n },\n send: (type) => {\n this.context.worker?.postMessage(type)\n },\n },\n events: {\n addListener: (target, eventType, callback) => {\n target.addEventListener(eventType, callback as EventListener)\n this.listeners.push({\n eventType,\n target,\n callback: callback as EventListener,\n })\n\n return () => {\n target.removeEventListener(eventType, callback as EventListener)\n }\n },\n removeAllListeners: () => {\n for (const { target, eventType, callback } of this.listeners) {\n target.removeEventListener(eventType, callback)\n }\n this.listeners = []\n },\n once: (eventType) => {\n const bindings: Array<() => void> = []\n\n return new Promise<\n ServiceWorkerMessage<\n typeof eventType,\n ServiceWorkerIncomingEventsMap[typeof eventType]\n >\n >((resolve, reject) => {\n const handleIncomingMessage = (event: MessageEvent) => {\n try {\n const message = event.data\n\n if (message.type === eventType) {\n resolve(message)\n }\n } catch (error) {\n reject(error)\n }\n }\n\n bindings.push(\n this.context.events.addListener(\n navigator.serviceWorker,\n 'message',\n handleIncomingMessage,\n ),\n this.context.events.addListener(\n navigator.serviceWorker,\n 'messageerror',\n reject,\n ),\n )\n }).finally(() => {\n bindings.forEach((unbind) => unbind())\n })\n },\n },\n supports: {\n serviceWorkerApi:\n !('serviceWorker' in navigator) || location.protocol === 'file:',\n readableStreamTransfer: supportsReadableStreamTransfer(),\n },\n }\n\n /**\n * @todo Not sure I like this but \"this.currentHandlers\"\n * updates never bubble to \"this.context.requestHandlers\".\n */\n Object.defineProperties(context, {\n requestHandlers: {\n get: () => this.currentHandlers,\n },\n })\n\n this.startHandler = context.supports.serviceWorkerApi\n ? createFallbackStart(context)\n : createStartHandler(context)\n\n this.stopHandler = context.supports.serviceWorkerApi\n ? createFallbackStop(context)\n : createStop(context)\n\n return context\n }\n\n public async start(options: StartOptions = {}): StartReturnType {\n if (options.waitUntilReady === true) {\n devUtils.warn(\n 'The \"waitUntilReady\" option has been deprecated. Please remove it from this \"worker.start()\" call. Follow the recommended Browser integration (https://mswjs.io/docs/integrations/browser) to eliminate any race conditions between the Service Worker registration and any requests made by your application on initial render.',\n )\n }\n\n this.context.startOptions = mergeRight(\n DEFAULT_START_OPTIONS,\n options,\n ) as SetupWorkerInternalContext['startOptions']\n\n return await this.startHandler(this.context.startOptions, options)\n }\n\n public stop(): void {\n super.dispose()\n this.context.events.removeAllListeners()\n this.context.emitter.removeAllListeners()\n this.stopHandler()\n }\n}\n\n/**\n * Sets up a requests interception in the browser with the given request handlers.\n * @param {RequestHandler[]} handlers List of request handlers.\n *\n * @see {@link https://mswjs.io/docs/api/setup-worker `setupWorker()` API reference}\n */\nexport function setupWorker(...handlers: Array<RequestHandler>): SetupWorker {\n return new SetupWorkerApi(...handlers)\n}\n","import { until } from '@open-draft/until'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { getWorkerInstance } from './utils/getWorkerInstance'\nimport { enableMocking } from './utils/enableMocking'\nimport { SetupWorkerInternalContext, StartHandler } from '../glossary'\nimport { createRequestListener } from './createRequestListener'\nimport { requestIntegrityCheck } from '../../utils/requestIntegrityCheck'\nimport { createResponseListener } from './createResponseListener'\nimport { validateWorkerScope } from './utils/validateWorkerScope'\n\nexport const createStartHandler = (\n context: SetupWorkerInternalContext,\n): StartHandler => {\n return function start(options, customOptions) {\n const startWorkerInstance = async () => {\n // Remove all previously existing event listeners.\n // This way none of the listeners persists between Fast refresh\n // of the application's code.\n context.events.removeAllListeners()\n\n // Handle requests signaled by the worker.\n context.workerChannel.on(\n 'REQUEST',\n createRequestListener(context, options),\n )\n\n // Handle responses signaled by the worker.\n context.workerChannel.on('RESPONSE', createResponseListener(context))\n\n const instance = await getWorkerInstance(\n options.serviceWorker.url,\n options.serviceWorker.options,\n options.findWorker,\n )\n\n const [worker, registration] = instance\n\n if (!worker) {\n const missingWorkerMessage = customOptions?.findWorker\n ? devUtils.formatMessage(\n `Failed to locate the Service Worker registration using a custom \"findWorker\" predicate.\n\nPlease ensure that the custom predicate properly locates the Service Worker registration at \"%s\".\nMore details: https://mswjs.io/docs/api/setup-worker/start#findworker\n`,\n options.serviceWorker.url,\n )\n : devUtils.formatMessage(\n `Failed to locate the Service Worker registration.\n\nThis most likely means that the worker script URL \"%s\" cannot resolve against the actual public hostname (%s). This may happen if your application runs behind a proxy, or has a dynamic hostname.\n\nPlease consider using a custom \"serviceWorker.url\" option to point to the actual worker script location, or a custom \"findWorker\" option to resolve the Service Worker registration manually. More details: https://mswjs.io/docs/api/setup-worker/start`,\n options.serviceWorker.url,\n location.host,\n )\n\n throw new Error(missingWorkerMessage)\n }\n\n context.worker = worker\n context.registration = registration\n\n context.events.addListener(window, 'beforeunload', () => {\n if (worker.state !== 'redundant') {\n // Notify the Service Worker that this client has closed.\n // Internally, it's similar to disabling the mocking, only\n // client close event has a handler that self-terminates\n // the Service Worker when there are no open clients.\n context.workerChannel.send('CLIENT_CLOSED')\n }\n // Make sure we're always clearing the interval - there are reports that not doing this can\n // cause memory leaks in headless browser environments.\n window.clearInterval(context.keepAliveInterval)\n })\n\n // Check if the active Service Worker is the latest published one\n const integrityCheckResult = await until(() =>\n requestIntegrityCheck(context, worker),\n )\n\n if (integrityCheckResult.error) {\n devUtils.error(`\\\nDetected outdated Service Worker: ${integrityCheckResult.error.message}\n\nThe mocking is still enabled, but it's highly recommended that you update your Service Worker by running:\n\n$ npx msw init <PUBLIC_DIR>\n\nThis is necessary to ensure that the Service Worker is in sync with the library to guarantee its stability.\nIf this message still persists after updating, please report an issue: https://github.com/open-draft/msw/issues\\\n `)\n }\n\n context.keepAliveInterval = window.setInterval(\n () => context.workerChannel.send('KEEPALIVE_REQUEST'),\n 5000,\n )\n\n // Warn the user when loading the page that lies outside\n // of the worker's scope.\n validateWorkerScope(registration, context.startOptions)\n\n return registration\n }\n\n const workerRegistration = startWorkerInstance().then(\n async (registration) => {\n const pendingInstance = registration.installing || registration.waiting\n\n // Wait until the worker is activated.\n // Assume the worker is already activated if there's no pending registration\n // (i.e. when reloading the page after a successful activation).\n if (pendingInstance) {\n await new Promise<void>((resolve) => {\n pendingInstance.addEventListener('statechange', () => {\n if (pendingInstance.state === 'activated') {\n return resolve()\n }\n })\n })\n }\n\n // Print the activation message only after the worker has been activated.\n await enableMocking(context, options).catch((error) => {\n throw new Error(`Failed to enable mocking: ${error?.message}`)\n })\n\n return registration\n },\n )\n\n return workerRegistration\n }\n}\n","import { until } from '@open-draft/until'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { getAbsoluteWorkerUrl } from '../../../utils/getAbsoluteWorkerUrl'\nimport { getWorkerByRegistration } from './getWorkerByRegistration'\nimport { ServiceWorkerInstanceTuple, FindWorker } from '../../glossary'\n\n/**\n * Returns an active Service Worker instance.\n * When not found, registers a new Service Worker.\n */\nexport const getWorkerInstance = async (\n url: string,\n options: RegistrationOptions = {},\n findWorker: FindWorker,\n): Promise<ServiceWorkerInstanceTuple> => {\n // Resolve the absolute Service Worker URL.\n const absoluteWorkerUrl = getAbsoluteWorkerUrl(url)\n\n const mockRegistrations = await navigator.serviceWorker\n .getRegistrations()\n .then((registrations) =>\n registrations.filter((registration) =>\n getWorkerByRegistration(registration, absoluteWorkerUrl, findWorker),\n ),\n )\n if (!navigator.serviceWorker.controller && mockRegistrations.length > 0) {\n // Reload the page when it has associated workers, but no active controller.\n // The absence of a controller can mean either:\n // - page has no Service Worker associated with it\n // - page has been hard-reloaded and its workers won't be used until the next reload.\n // Since we've checked that there are registrations associated with this page,\n // at this point we are sure it's hard reload that falls into this clause.\n location.reload()\n }\n\n const [existingRegistration] = mockRegistrations\n\n if (existingRegistration) {\n // When the Service Worker is registered, update it and return the reference.\n return existingRegistration.update().then(() => {\n return [\n getWorkerByRegistration(\n existingRegistration,\n absoluteWorkerUrl,\n findWorker,\n ),\n existingRegistration,\n ]\n })\n }\n\n // When the Service Worker wasn't found, register it anew and return the reference.\n const registrationResult = await until<Error, ServiceWorkerInstanceTuple>(\n async () => {\n const registration = await navigator.serviceWorker.register(url, options)\n return [\n // Compare existing worker registration by its worker URL,\n // to prevent irrelevant workers to resolve here (such as Codesandbox worker).\n getWorkerByRegistration(registration, absoluteWorkerUrl, findWorker),\n registration,\n ]\n },\n )\n\n // Handle Service Worker registration errors.\n if (registrationResult.error) {\n const isWorkerMissing = registrationResult.error.message.includes('(404)')\n\n // Produce a custom error message when given a non-existing Service Worker url.\n // Suggest developers to check their setup.\n if (isWorkerMissing) {\n const scopeUrl = new URL(options?.scope || '/', location.href)\n\n throw new Error(\n devUtils.formatMessage(`\\\nFailed to register a Service Worker for scope ('${scopeUrl.href}') with script ('${absoluteWorkerUrl}'): Service Worker script does not exist at the given path.\n\nDid you forget to run \"npx msw init <PUBLIC_DIR>\"?\n\nLearn more about creating the Service Worker script: https://mswjs.io/docs/cli/init`),\n )\n }\n\n // Fallback error message for any other registration errors.\n throw new Error(\n devUtils.formatMessage(\n 'Failed to register the Service Worker:\\n\\n%s',\n registrationResult.error.message,\n ),\n )\n }\n\n return registrationResult.data\n}\n","/**\n * Returns an absolute Service Worker URL based on the given\n * relative URL (known during the registration).\n */\nexport function getAbsoluteWorkerUrl(workerUrl: string): string {\n return new URL(workerUrl, location.href).href\n}\n","import { FindWorker } from '../../glossary'\n\n/**\n * Attempts to resolve a Service Worker instance from a given registration,\n * regardless of its state (active, installing, waiting).\n */\nexport function getWorkerByRegistration(\n registration: ServiceWorkerRegistration,\n absoluteWorkerUrl: string,\n findWorker: FindWorker,\n): ServiceWorker | null {\n const allStates = [\n registration.active,\n registration.installing,\n registration.waiting,\n ]\n const relevantStates = allStates.filter((state): state is ServiceWorker => {\n return state != null\n })\n const worker = relevantStates.find((worker) => {\n return findWorker(worker.scriptURL, absoluteWorkerUrl)\n })\n\n return worker || null\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\nimport { StartOptions, SetupWorkerInternalContext } from '../../glossary'\nimport { printStartMessage } from './printStartMessage'\n\n/**\n * Signals the worker to enable the interception of requests.\n */\nexport async function enableMocking(\n context: SetupWorkerInternalContext,\n options: StartOptions,\n) {\n context.workerChannel.send('MOCK_ACTIVATE')\n await context.events.once('MOCKING_ENABLED')\n\n // Warn the developer on multiple \"worker.start()\" calls.\n // While this will not affect the worker in any way,\n // it likely indicates an issue with the developer's code.\n if (context.isMockingEnabled) {\n devUtils.warn(\n `Found a redundant \"worker.start()\" call. Note that starting the worker while mocking is already enabled will have no effect. Consider removing this \"worker.start()\" call.`,\n )\n return\n }\n\n context.isMockingEnabled = true\n\n printStartMessage({\n quiet: options.quiet,\n workerScope: context.registration?.scope,\n workerUrl: context.worker?.scriptURL,\n })\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\n\nexport interface PrintStartMessageArgs {\n quiet?: boolean\n message?: string\n workerUrl?: string\n workerScope?: string\n}\n\n/**\n * Prints a worker activation message in the browser's console.\n */\nexport function printStartMessage(args: PrintStartMessageArgs = {}) {\n if (args.quiet) {\n return\n }\n\n const message = args.message || 'Mocking enabled.'\n\n console.groupCollapsed(\n `%c${devUtils.formatMessage(message)}`,\n 'color:orangered;font-weight:bold;',\n )\n console.log(\n '%cDocumentation: %chttps://mswjs.io/docs',\n 'font-weight:bold',\n 'font-weight:normal',\n )\n console.log('Found an issue? https://github.com/mswjs/msw/issues')\n\n if (args.workerUrl) {\n console.log('Worker script URL:', args.workerUrl)\n }\n\n if (args.workerScope) {\n console.log('Worker scope:', args.workerScope)\n }\n\n console.groupEnd()\n}\n","import {\n StringifiedResponse,\n ServiceWorkerIncomingEventsMap,\n} from '../../glossary'\n\nexport interface ServiceWorkerMessage<\n EventType extends keyof ServiceWorkerIncomingEventsMap,\n EventPayload,\n> {\n type: EventType\n payload: EventPayload\n}\n\ninterface WorkerChannelEventsMap {\n MOCK_RESPONSE: [\n data: StringifiedResponse,\n transfer?: [ReadableStream<Uint8Array>],\n ]\n NOT_FOUND: []\n}\n\nexport class WorkerChannel {\n constructor(private readonly port: MessagePort) {}\n\n public postMessage<Event extends keyof WorkerChannelEventsMap>(\n event: Event,\n ...rest: WorkerChannelEventsMap[Event]\n ): void {\n const [data, transfer] = rest\n this.port.postMessage({ type: event, data }, { transfer })\n }\n}\n","import type { ServiceWorkerIncomingRequest } from '../setupWorker/glossary'\n\ntype Input = Pick<ServiceWorkerIncomingRequest, 'method' | 'body'>\n\n/**\n * Ensures that an empty GET request body is always represented as `undefined`.\n */\nexport function pruneGetRequestBody(\n request: Input,\n): ServiceWorkerIncomingRequest['body'] {\n // Force HEAD/GET request body to always be empty.\n // The worker reads any request's body as ArrayBuffer,\n // and you cannot re-construct a GET/HEAD Request\n // with an ArrayBuffer, even if empty. Also note that\n // \"request.body\" is always undefined in the worker.\n if (['HEAD', 'GET'].includes(request.method)) {\n return undefined\n }\n\n return request.body\n}\n","import { pruneGetRequestBody } from './pruneGetRequestBody'\nimport type { ServiceWorkerIncomingRequest } from '../setupWorker/glossary'\n\n/**\n * Converts a given request received from the Service Worker\n * into a Fetch `Request` instance.\n */\nexport function parseWorkerRequest(\n incomingRequest: ServiceWorkerIncomingRequest,\n): Request {\n return new Request(incomingRequest.url, {\n ...incomingRequest,\n body: pruneGetRequestBody(incomingRequest),\n })\n}\n","import {\n StartOptions,\n SetupWorkerInternalContext,\n ServiceWorkerIncomingEventsMap,\n} from '../glossary'\nimport {\n ServiceWorkerMessage,\n WorkerChannel,\n} from './utils/createMessageChannel'\nimport { parseWorkerRequest } from '../../utils/parseWorkerRequest'\nimport { handleRequest } from '~/core/utils/handleRequest'\nimport { RequiredDeep } from '~/core/typeUtils'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { toResponseInit } from '~/core/utils/toResponseInit'\n\nexport const createRequestListener = (\n context: SetupWorkerInternalContext,\n options: RequiredDeep<StartOptions>,\n) => {\n return async (\n event: MessageEvent,\n message: ServiceWorkerMessage<\n 'REQUEST',\n ServiceWorkerIncomingEventsMap['REQUEST']\n >,\n ) => {\n const messageChannel = new WorkerChannel(event.ports[0])\n\n const requestId = message.payload.id\n const request = parseWorkerRequest(message.payload)\n const requestCloneForLogs = request.clone()\n\n try {\n await handleRequest(\n request,\n requestId,\n context.requestHandlers,\n options,\n context.emitter,\n {\n onPassthroughResponse() {\n messageChannel.postMessage('NOT_FOUND')\n },\n async onMockedResponse(response, { handler, parsedResult }) {\n // Clone the mocked response so its body could be read\n // to buffer to be sent to the worker and also in the\n // \".log()\" method of the request handler.\n const responseClone = response.clone()\n const responseCloneForLogs = response.clone()\n const responseInit = toResponseInit(response)\n\n /**\n * @note Safari doesn't support transferring a \"ReadableStream\".\n * Check that the browser supports that before sending it to the worker.\n */\n if (context.supports.readableStreamTransfer) {\n const responseStreamOrNull = response.body\n\n messageChannel.postMessage(\n 'MOCK_RESPONSE',\n {\n ...responseInit,\n body: responseStreamOrNull,\n },\n responseStreamOrNull ? [responseStreamOrNull] : undefined,\n )\n } else {\n /**\n * @note If we are here, this means the current environment doesn't\n * support \"ReadableStream\" as transferable. In that case,\n * attempt to read the non-empty response body as ArrayBuffer, if it's not empty.\n * @see https://github.com/mswjs/msw/issues/1827\n */\n const responseBufferOrNull =\n response.body === null\n ? null\n : await responseClone.arrayBuffer()\n\n messageChannel.postMessage('MOCK_RESPONSE', {\n ...responseInit,\n body: responseBufferOrNull,\n })\n }\n\n if (!options.quiet) {\n context.emitter.once('response:mocked', () => {\n handler.log({\n request: requestCloneForLogs,\n response: responseCloneForLogs,\n parsedResult,\n })\n })\n }\n },\n },\n )\n } catch (error) {\n if (error instanceof Error) {\n devUtils.error(\n `Uncaught exception in the request handler for \"%s %s\":\n\n%s\n\nThis exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/recipes/mocking-error-responses`,\n request.method,\n request.url,\n error.stack ?? error,\n )\n\n // Treat all other exceptions in a request handler as unintended,\n // alerting that there is a problem that needs fixing.\n messageChannel.postMessage('MOCK_RESPONSE', {\n status: 500,\n statusText: 'Request Handler Error',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name: error.name,\n message: error.message,\n stack: error.stack,\n }),\n })\n }\n }\n }\n}\n","import type { SetupWorkerInternalContext } from '../setupWorker/glossary'\n\nexport async function requestIntegrityCheck(\n context: SetupWorkerInternalContext,\n serviceWorker: ServiceWorker,\n): Promise<ServiceWorker> {\n // Signal Service Worker to report back its integrity\n context.workerChannel.send('INTEGRITY_CHECK_REQUEST')\n\n const { payload: actualChecksum } = await context.events.once(\n 'INTEGRITY_CHECK_RESPONSE',\n )\n\n // Compare the response from the Service Worker and the\n // global variable set during the build.\n if (actualChecksum !== SERVICE_WORKER_CHECKSUM) {\n throw new Error(\n `Currently active Service Worker (${actualChecksum}) is behind the latest published one (${SERVICE_WORKER_CHECKSUM}).`,\n )\n }\n\n return serviceWorker\n}\n","import {\n ServiceWorkerIncomingEventsMap,\n SetupWorkerInternalContext,\n} from '../glossary'\nimport { ServiceWorkerMessage } from './utils/createMessageChannel'\nimport { isResponseWithoutBody } from '@mswjs/interceptors'\n\nexport function createResponseListener(context: SetupWorkerInternalContext) {\n return (\n _: MessageEvent,\n message: ServiceWorkerMessage<\n 'RESPONSE',\n ServiceWorkerIncomingEventsMap['RESPONSE']\n >,\n ) => {\n const { payload: responseJson } = message\n\n /**\n * CORS requests with `mode: \"no-cors\"` result in \"opaque\" responses.\n * That kind of responses cannot be manipulated in JavaScript due\n * to the security considerations.\n * @see https://fetch.spec.whatwg.org/#concept-filtered-response-opaque\n * @see https://github.com/mswjs/msw/issues/529\n */\n if (responseJson.type?.includes('opaque')) {\n return\n }\n\n const response =\n responseJson.status === 0\n ? Response.error()\n : new Response(\n /**\n * Responses may be streams here, but when we create a response object\n * with null-body status codes, like 204, 205, 304 Response will\n * throw when passed a non-null body, so ensure it's null here\n * for those codes\n */\n isResponseWithoutBody(responseJson.status)\n ? null\n : responseJson.body,\n responseJson,\n )\n\n context.emitter.emit(\n responseJson.isMockedResponse ? 'response:mocked' : 'response:bypass',\n {\n response,\n /**\n * @todo @fixme In this context, we don't know anything about\n * the request.\n */\n request: null as any,\n requestId: responseJson.requestId,\n },\n )\n }\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\nimport { StartOptions } from '../../glossary'\n\nexport function validateWorkerScope(\n registration: ServiceWorkerRegistration,\n options?: StartOptions,\n): void {\n if (!options?.quiet && !location.href.startsWith(registration.scope)) {\n devUtils.warn(\n `\\\nCannot intercept requests on this page because it's outside of the worker's scope (\"${registration.scope}\"). If you wish to mock API requests on this page, you must resolve this scope issue.\n\n- (Recommended) Register the worker at the root level (\"/\") of your application.\n- Set the \"Service-Worker-Allowed\" response header to allow out-of-scope workers.\\\n`,\n )\n }\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\nimport { SetupWorkerInternalContext, StopHandler } from '../glossary'\nimport { printStopMessage } from './utils/printStopMessage'\n\nexport const createStop = (\n context: SetupWorkerInternalContext,\n): StopHandler => {\n return function stop() {\n // Warn developers calling \"worker.stop()\" more times than necessary.\n // This likely indicates a mistake in their code.\n if (!context.isMockingEnabled) {\n devUtils.warn(\n 'Found a redundant \"worker.stop()\" call. Note that stopping the worker while mocking already stopped has no effect. Consider removing this \"worker.stop()\" call.',\n )\n return\n }\n\n /**\n * Signal the Service Worker to disable mocking for this client.\n * Use this an an explicit way to stop the mocking, while preserving\n * the worker-client relation. Does not affect the worker's lifecycle.\n */\n context.workerChannel.send('MOCK_DEACTIVATE')\n context.isMockingEnabled = false\n window.clearInterval(context.keepAliveInterval)\n\n printStopMessage({ quiet: context.startOptions?.quiet })\n }\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\n\nexport function printStopMessage(args: { quiet?: boolean } = {}): void {\n if (args.quiet) {\n return\n }\n\n console.log(\n `%c${devUtils.formatMessage('Mocking disabled.')}`,\n 'color:orangered;font-weight:bold;',\n )\n}\n","import { RequiredDeep } from '~/core/typeUtils'\nimport { mergeRight } from '~/core/utils/internal/mergeRight'\nimport {\n SetupWorker,\n SetupWorkerInternalContext,\n StartHandler,\n StartOptions,\n} from '../../glossary'\n\nexport const DEFAULT_START_OPTIONS: RequiredDeep<StartOptions> = {\n serviceWorker: {\n url: '/mockServiceWorker.js',\n options: null as any,\n },\n quiet: false,\n waitUntilReady: true,\n onUnhandledRequest: 'warn',\n findWorker(scriptURL, mockServiceWorkerUrl) {\n return scriptURL === mockServiceWorkerUrl\n },\n}\n\n/**\n * Returns resolved worker start options, merging the default options\n * with the given custom options.\n */\nexport function resolveStartOptions(\n initialOptions?: StartOptions,\n): RequiredDeep<StartOptions> {\n return mergeRight(\n DEFAULT_START_OPTIONS,\n initialOptions || {},\n ) as RequiredDeep<StartOptions>\n}\n\nexport function prepareStartHandler(\n handler: StartHandler,\n context: SetupWorkerInternalContext,\n): SetupWorker['start'] {\n return (initialOptions) => {\n context.startOptions = resolveStartOptions(initialOptions)\n return handler(context.startOptions, initialOptions || {})\n }\n}\n","import {\n Interceptor,\n BatchInterceptor,\n HttpRequestEventMap,\n} from '@mswjs/interceptors'\nimport { FetchInterceptor } from '@mswjs/interceptors/fetch'\nimport { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest'\nimport { SetupWorkerInternalContext, StartOptions } from '../glossary'\nimport type { RequiredDeep } from '~/core/typeUtils'\nimport { handleRequest } from '~/core/utils/handleRequest'\n\nexport function createFallbackRequestListener(\n context: SetupWorkerInternalContext,\n options: RequiredDeep<StartOptions>,\n): Interceptor<HttpRequestEventMap> {\n const interceptor = new BatchInterceptor({\n name: 'fallback',\n interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()],\n })\n\n interceptor.on('request', async ({ request, requestId }) => {\n const requestCloneForLogs = request.clone()\n\n const response = await handleRequest(\n request,\n requestId,\n context.requestHandlers,\n options,\n context.emitter,\n {\n onMockedResponse(_, { handler, parsedResult }) {\n if (!options.quiet) {\n context.emitter.once('response:mocked', ({ response }) => {\n handler.log({\n request: requestCloneForLogs,\n response,\n parsedResult,\n })\n })\n }\n },\n },\n )\n\n if (response) {\n request.respondWith(response)\n }\n })\n\n interceptor.on(\n 'response',\n ({ response, isMockedResponse, request, requestId }) => {\n context.emitter.emit(\n isMockedResponse ? 'response:mocked' : 'response:bypass',\n {\n response,\n request,\n requestId,\n },\n )\n },\n )\n\n interceptor.apply()\n\n return interceptor\n}\n","import { createFallbackRequestListener } from './createFallbackRequestListener'\nimport { SetupWorkerInternalContext, StartHandler } from '../glossary'\nimport { printStartMessage } from './utils/printStartMessage'\n\nexport function createFallbackStart(\n context: SetupWorkerInternalContext,\n): StartHandler {\n return async function start(options) {\n context.fallbackInterceptor = createFallbackRequestListener(\n context,\n options,\n )\n\n printStartMessage({\n message: 'Mocking enabled (fallback mode).',\n quiet: options.quiet,\n })\n\n return undefined\n }\n}\n","import { SetupWorkerInternalContext, StopHandler } from '../glossary'\nimport { printStopMessage } from './utils/printStopMessage'\n\nexport function createFallbackStop(\n context: SetupWorkerInternalContext,\n): StopHandler {\n return function stop() {\n context.fallbackInterceptor?.dispose()\n printStopMessage({ quiet: context.startOptions?.quiet })\n }\n}\n","/**\n * Returns a boolean indicating whether the current browser\n * supports `ReadableStream` as a `Transferable` when posting\n * messages.\n */\nexport function supportsReadableStreamTransfer() {\n try {\n const stream = new ReadableStream({\n start: (controller) => controller.close(),\n })\n const message = new MessageChannel()\n message.port1.postMessage(stream, [stream])\n return true\n } catch (error) {\n return false\n }\n}\n"],"mappings":"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","names":["until","devUtils","worker","devUtils","devUtils","devUtils","devUtils","devUtils","devUtils","until","devUtils","devUtils","devUtils","handleRequest","response","devUtils","mergeRight","devUtils","mergeRight"]}
@@ -1,5 +1,5 @@
1
1
  import { OperationTypeNode, DocumentNode, GraphQLError } from 'graphql';
2
- import { g as RequestHandlerDefaultInfo, D as DefaultBodyType, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-rmY-HeFN.js';
2
+ import { g as RequestHandlerDefaultInfo, D as DefaultBodyType, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-TRh8Eh4H.js';
3
3
  import { Match, Path } from './utils/matching/matchRequestUrl.js';
4
4
 
5
5
  interface ParsedGraphQLQuery {
@@ -1,5 +1,5 @@
1
1
  import { OperationTypeNode, DocumentNode, GraphQLError } from 'graphql';
2
- import { g as RequestHandlerDefaultInfo, D as DefaultBodyType, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-YiqamK0M.mjs';
2
+ import { g as RequestHandlerDefaultInfo, D as DefaultBodyType, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-nfjVJ8Tp.mjs';
3
3
  import { Match, Path } from './utils/matching/matchRequestUrl.mjs';
4
4
 
5
5
  interface ParsedGraphQLQuery {
@@ -1,2 +1,2 @@
1
- export { f as HttpResponse, H as HttpResponseInit, S as StrictRequest, e as StrictResponse } from './RequestHandler-YiqamK0M.mjs';
1
+ export { f as HttpResponse, H as HttpResponseInit, S as StrictRequest, e as StrictResponse } from './RequestHandler-nfjVJ8Tp.mjs';
2
2
  import './typeUtils.mjs';
@@ -1,2 +1,2 @@
1
- export { f as HttpResponse, H as HttpResponseInit, S as StrictRequest, e as StrictResponse } from './RequestHandler-rmY-HeFN.js';
1
+ export { f as HttpResponse, H as HttpResponseInit, S as StrictRequest, e as StrictResponse } from './RequestHandler-TRh8Eh4H.js';
2
2
  import './typeUtils.js';
@@ -11,7 +11,12 @@ interface ResponseResolutionContext {
11
11
  /**
12
12
  * Returns a mocked response for a given request using following request handlers.
13
13
  */
14
- declare const getResponse: <Handler extends RequestHandler<RequestHandlerDefaultInfo, any, any, RequestHandlerOptions>[]>(request: Request, handlers: Handler, resolutionContext?: ResponseResolutionContext) => Promise<ResponseLookupResult | null>;
14
+ declare const getResponse: <Handler extends RequestHandler<RequestHandlerDefaultInfo, any, any, RequestHandlerOptions>[]>({ request, requestId, handlers, resolutionContext, }: {
15
+ request: Request;
16
+ requestId: string;
17
+ handlers: Handler;
18
+ resolutionContext?: ResponseResolutionContext | undefined;
19
+ }) => Promise<ResponseLookupResult | null>;
15
20
 
16
21
  interface HttpResponseInit extends ResponseInit {
17
22
  type?: ResponseType;
@@ -95,6 +100,7 @@ type MaybeAsyncResponseResolverReturnType<ResponseBodyType extends DefaultBodyTy
95
100
  type AsyncResponseResolverReturnType<ResponseBodyType extends DefaultBodyType> = MaybePromise<ResponseResolverReturnType<ResponseBodyType> | Generator<MaybeAsyncResponseResolverReturnType<ResponseBodyType>, MaybeAsyncResponseResolverReturnType<ResponseBodyType>, MaybeAsyncResponseResolverReturnType<ResponseBodyType>>>;
96
101
  type ResponseResolverInfo<ResolverExtraInfo extends Record<string, unknown>, RequestBodyType extends DefaultBodyType = DefaultBodyType> = {
97
102
  request: StrictRequest<RequestBodyType>;
103
+ requestId: string;
98
104
  } & ResolverExtraInfo;
99
105
  type ResponseResolver<ResolverExtraInfo extends Record<string, unknown> = Record<string, unknown>, RequestBodyType extends DefaultBodyType = DefaultBodyType, ResponseBodyType extends DefaultBodyType = undefined> = (info: ResponseResolverInfo<ResolverExtraInfo, RequestBodyType>) => AsyncResponseResolverReturnType<ResponseBodyType>;
100
106
  interface RequestHandlerArgs<HandlerInfo, HandlerOptions extends RequestHandlerOptions> {
@@ -109,6 +115,7 @@ interface RequestHandlerExecutionResult<ParsedResult extends Record<string, unkn
109
115
  handler: RequestHandler;
110
116
  parsedResult?: ParsedResult;
111
117
  request: Request;
118
+ requestId: string;
112
119
  response?: Response;
113
120
  }
114
121
  declare abstract class RequestHandler<HandlerInfo extends RequestHandlerDefaultInfo = RequestHandlerDefaultInfo, ParsedResult extends Record<string, any> | undefined = any, ResolverExtras extends Record<string, unknown> = any, HandlerOptions extends RequestHandlerOptions = RequestHandlerOptions> {
@@ -170,6 +177,7 @@ declare abstract class RequestHandler<HandlerInfo extends RequestHandlerDefaultI
170
177
  */
171
178
  run(args: {
172
179
  request: StrictRequest<any>;
180
+ requestId: string;
173
181
  resolutionContext?: ResponseResolutionContext;
174
182
  }): Promise<RequestHandlerExecutionResult<ParsedResult> | null>;
175
183
  private wrapResolver;
@@ -11,7 +11,12 @@ interface ResponseResolutionContext {
11
11
  /**
12
12
  * Returns a mocked response for a given request using following request handlers.
13
13
  */
14
- declare const getResponse: <Handler extends RequestHandler<RequestHandlerDefaultInfo, any, any, RequestHandlerOptions>[]>(request: Request, handlers: Handler, resolutionContext?: ResponseResolutionContext) => Promise<ResponseLookupResult | null>;
14
+ declare const getResponse: <Handler extends RequestHandler<RequestHandlerDefaultInfo, any, any, RequestHandlerOptions>[]>({ request, requestId, handlers, resolutionContext, }: {
15
+ request: Request;
16
+ requestId: string;
17
+ handlers: Handler;
18
+ resolutionContext?: ResponseResolutionContext | undefined;
19
+ }) => Promise<ResponseLookupResult | null>;
15
20
 
16
21
  interface HttpResponseInit extends ResponseInit {
17
22
  type?: ResponseType;
@@ -95,6 +100,7 @@ type MaybeAsyncResponseResolverReturnType<ResponseBodyType extends DefaultBodyTy
95
100
  type AsyncResponseResolverReturnType<ResponseBodyType extends DefaultBodyType> = MaybePromise<ResponseResolverReturnType<ResponseBodyType> | Generator<MaybeAsyncResponseResolverReturnType<ResponseBodyType>, MaybeAsyncResponseResolverReturnType<ResponseBodyType>, MaybeAsyncResponseResolverReturnType<ResponseBodyType>>>;
96
101
  type ResponseResolverInfo<ResolverExtraInfo extends Record<string, unknown>, RequestBodyType extends DefaultBodyType = DefaultBodyType> = {
97
102
  request: StrictRequest<RequestBodyType>;
103
+ requestId: string;
98
104
  } & ResolverExtraInfo;
99
105
  type ResponseResolver<ResolverExtraInfo extends Record<string, unknown> = Record<string, unknown>, RequestBodyType extends DefaultBodyType = DefaultBodyType, ResponseBodyType extends DefaultBodyType = undefined> = (info: ResponseResolverInfo<ResolverExtraInfo, RequestBodyType>) => AsyncResponseResolverReturnType<ResponseBodyType>;
100
106
  interface RequestHandlerArgs<HandlerInfo, HandlerOptions extends RequestHandlerOptions> {
@@ -109,6 +115,7 @@ interface RequestHandlerExecutionResult<ParsedResult extends Record<string, unkn
109
115
  handler: RequestHandler;
110
116
  parsedResult?: ParsedResult;
111
117
  request: Request;
118
+ requestId: string;
112
119
  response?: Response;
113
120
  }
114
121
  declare abstract class RequestHandler<HandlerInfo extends RequestHandlerDefaultInfo = RequestHandlerDefaultInfo, ParsedResult extends Record<string, any> | undefined = any, ResolverExtras extends Record<string, unknown> = any, HandlerOptions extends RequestHandlerOptions = RequestHandlerOptions> {
@@ -170,6 +177,7 @@ declare abstract class RequestHandler<HandlerInfo extends RequestHandlerDefaultI
170
177
  */
171
178
  run(args: {
172
179
  request: StrictRequest<any>;
180
+ requestId: string;
173
181
  resolutionContext?: ResponseResolutionContext;
174
182
  }): Promise<RequestHandlerExecutionResult<ParsedResult> | null>;
175
183
  private wrapResolver;
@@ -1,5 +1,5 @@
1
1
  import { EventMap, Emitter } from 'strict-event-emitter';
2
- import { R as RequestHandler, g as RequestHandlerDefaultInfo } from './RequestHandler-YiqamK0M.mjs';
2
+ import { R as RequestHandler, g as RequestHandlerDefaultInfo } from './RequestHandler-nfjVJ8Tp.mjs';
3
3
  import { LifeCycleEventEmitter } from './sharedOptions.mjs';
4
4
  import { Disposable } from './utils/internal/Disposable.mjs';
5
5
  import './typeUtils.mjs';
@@ -1,5 +1,5 @@
1
1
  import { EventMap, Emitter } from 'strict-event-emitter';
2
- import { R as RequestHandler, g as RequestHandlerDefaultInfo } from './RequestHandler-rmY-HeFN.js';
2
+ import { R as RequestHandler, g as RequestHandlerDefaultInfo } from './RequestHandler-TRh8Eh4H.js';
3
3
  import { LifeCycleEventEmitter } from './sharedOptions.js';
4
4
  import { Disposable } from './utils/internal/Disposable.js';
5
5
  import './typeUtils.js';
@@ -28,6 +28,11 @@ var import_pipeEvents = require("./utils/internal/pipeEvents.js");
28
28
  var import_toReadonlyArray = require("./utils/internal/toReadonlyArray.js");
29
29
  var import_Disposable = require("./utils/internal/Disposable.js");
30
30
  class SetupApi extends import_Disposable.Disposable {
31
+ initialHandlers;
32
+ currentHandlers;
33
+ emitter;
34
+ publicEmitter;
35
+ events;
31
36
  constructor(...initialHandlers) {
32
37
  super();
33
38
  (0, import_outvariant.invariant)(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/SetupApi.ts"],"sourcesContent":["import { invariant } from 'outvariant'\nimport { EventMap, Emitter } from 'strict-event-emitter'\nimport {\n RequestHandler,\n RequestHandlerDefaultInfo,\n} from './handlers/RequestHandler'\nimport { LifeCycleEventEmitter } from './sharedOptions'\nimport { devUtils } from './utils/internal/devUtils'\nimport { pipeEvents } from './utils/internal/pipeEvents'\nimport { toReadonlyArray } from './utils/internal/toReadonlyArray'\nimport { Disposable } from './utils/internal/Disposable'\n\n/**\n * Generic class for the mock API setup.\n */\nexport abstract class SetupApi<EventsMap extends EventMap> extends Disposable {\n protected initialHandlers: ReadonlyArray<RequestHandler>\n protected currentHandlers: Array<RequestHandler>\n protected readonly emitter: Emitter<EventsMap>\n protected readonly publicEmitter: Emitter<EventsMap>\n\n public readonly events: LifeCycleEventEmitter<EventsMap>\n\n constructor(...initialHandlers: Array<RequestHandler>) {\n super()\n\n invariant(\n this.validateHandlers(initialHandlers),\n devUtils.formatMessage(\n `Failed to apply given request handlers: invalid input. Did you forget to spread the request handlers Array?`,\n ),\n )\n\n this.initialHandlers = toReadonlyArray(initialHandlers)\n this.currentHandlers = [...initialHandlers]\n\n this.emitter = new Emitter<EventsMap>()\n this.publicEmitter = new Emitter<EventsMap>()\n pipeEvents(this.emitter, this.publicEmitter)\n\n this.events = this.createLifeCycleEvents()\n\n this.subscriptions.push(() => {\n this.emitter.removeAllListeners()\n this.publicEmitter.removeAllListeners()\n })\n }\n\n private validateHandlers(handlers: ReadonlyArray<RequestHandler>): boolean {\n // Guard against incorrect call signature of the setup API.\n return handlers.every((handler) => !Array.isArray(handler))\n }\n\n public use(...runtimeHandlers: Array<RequestHandler>): void {\n invariant(\n this.validateHandlers(runtimeHandlers),\n devUtils.formatMessage(\n `Failed to call \"use()\" with the given request handlers: invalid input. Did you forget to spread the array of request handlers?`,\n ),\n )\n\n this.currentHandlers.unshift(...runtimeHandlers)\n }\n\n public restoreHandlers(): void {\n this.currentHandlers.forEach((handler) => {\n handler.isUsed = false\n })\n }\n\n public resetHandlers(...nextHandlers: Array<RequestHandler>): void {\n this.currentHandlers =\n nextHandlers.length > 0 ? [...nextHandlers] : [...this.initialHandlers]\n }\n\n public listHandlers(): ReadonlyArray<\n RequestHandler<RequestHandlerDefaultInfo, any, any>\n > {\n return toReadonlyArray(this.currentHandlers)\n }\n\n private createLifeCycleEvents(): LifeCycleEventEmitter<EventsMap> {\n return {\n on: (...args: any[]) => {\n return (this.publicEmitter.on as any)(...args)\n },\n removeListener: (...args: any[]) => {\n return (this.publicEmitter.removeListener as any)(...args)\n },\n removeAllListeners: (...args: any[]) => {\n return this.publicEmitter.removeAllListeners(...args)\n },\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAA0B;AAC1B,kCAAkC;AAMlC,sBAAyB;AACzB,wBAA2B;AAC3B,6BAAgC;AAChC,wBAA2B;AAKpB,MAAe,iBAA6C,6BAAW;AAAA,EAQ5E,eAAe,iBAAwC;AACrD,UAAM;AAEN;AAAA,MACE,KAAK,iBAAiB,eAAe;AAAA,MACrC,yBAAS;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,SAAK,sBAAkB,wCAAgB,eAAe;AACtD,SAAK,kBAAkB,CAAC,GAAG,eAAe;AAE1C,SAAK,UAAU,IAAI,oCAAmB;AACtC,SAAK,gBAAgB,IAAI,oCAAmB;AAC5C,sCAAW,KAAK,SAAS,KAAK,aAAa;AAE3C,SAAK,SAAS,KAAK,sBAAsB;AAEzC,SAAK,cAAc,KAAK,MAAM;AAC5B,WAAK,QAAQ,mBAAmB;AAChC,WAAK,cAAc,mBAAmB;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiB,UAAkD;AAEzE,WAAO,SAAS,MAAM,CAAC,YAAY,CAAC,MAAM,QAAQ,OAAO,CAAC;AAAA,EAC5D;AAAA,EAEO,OAAO,iBAA8C;AAC1D;AAAA,MACE,KAAK,iBAAiB,eAAe;AAAA,MACrC,yBAAS;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,SAAK,gBAAgB,QAAQ,GAAG,eAAe;AAAA,EACjD;AAAA,EAEO,kBAAwB;AAC7B,SAAK,gBAAgB,QAAQ,CAAC,YAAY;AACxC,cAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEO,iBAAiB,cAA2C;AACjE,SAAK,kBACH,aAAa,SAAS,IAAI,CAAC,GAAG,YAAY,IAAI,CAAC,GAAG,KAAK,eAAe;AAAA,EAC1E;AAAA,EAEO,eAEL;AACA,eAAO,wCAAgB,KAAK,eAAe;AAAA,EAC7C;AAAA,EAEQ,wBAA0D;AAChE,WAAO;AAAA,MACL,IAAI,IAAI,SAAgB;AACtB,eAAQ,KAAK,cAAc,GAAW,GAAG,IAAI;AAAA,MAC/C;AAAA,MACA,gBAAgB,IAAI,SAAgB;AAClC,eAAQ,KAAK,cAAc,eAAuB,GAAG,IAAI;AAAA,MAC3D;AAAA,MACA,oBAAoB,IAAI,SAAgB;AACtC,eAAO,KAAK,cAAc,mBAAmB,GAAG,IAAI;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/core/SetupApi.ts"],"sourcesContent":["import { invariant } from 'outvariant'\nimport { EventMap, Emitter } from 'strict-event-emitter'\nimport {\n RequestHandler,\n RequestHandlerDefaultInfo,\n} from './handlers/RequestHandler'\nimport { LifeCycleEventEmitter } from './sharedOptions'\nimport { devUtils } from './utils/internal/devUtils'\nimport { pipeEvents } from './utils/internal/pipeEvents'\nimport { toReadonlyArray } from './utils/internal/toReadonlyArray'\nimport { Disposable } from './utils/internal/Disposable'\n\n/**\n * Generic class for the mock API setup.\n */\nexport abstract class SetupApi<EventsMap extends EventMap> extends Disposable {\n protected initialHandlers: ReadonlyArray<RequestHandler>\n protected currentHandlers: Array<RequestHandler>\n protected readonly emitter: Emitter<EventsMap>\n protected readonly publicEmitter: Emitter<EventsMap>\n\n public readonly events: LifeCycleEventEmitter<EventsMap>\n\n constructor(...initialHandlers: Array<RequestHandler>) {\n super()\n\n invariant(\n this.validateHandlers(initialHandlers),\n devUtils.formatMessage(\n `Failed to apply given request handlers: invalid input. Did you forget to spread the request handlers Array?`,\n ),\n )\n\n this.initialHandlers = toReadonlyArray(initialHandlers)\n this.currentHandlers = [...initialHandlers]\n\n this.emitter = new Emitter<EventsMap>()\n this.publicEmitter = new Emitter<EventsMap>()\n pipeEvents(this.emitter, this.publicEmitter)\n\n this.events = this.createLifeCycleEvents()\n\n this.subscriptions.push(() => {\n this.emitter.removeAllListeners()\n this.publicEmitter.removeAllListeners()\n })\n }\n\n private validateHandlers(handlers: ReadonlyArray<RequestHandler>): boolean {\n // Guard against incorrect call signature of the setup API.\n return handlers.every((handler) => !Array.isArray(handler))\n }\n\n public use(...runtimeHandlers: Array<RequestHandler>): void {\n invariant(\n this.validateHandlers(runtimeHandlers),\n devUtils.formatMessage(\n `Failed to call \"use()\" with the given request handlers: invalid input. Did you forget to spread the array of request handlers?`,\n ),\n )\n\n this.currentHandlers.unshift(...runtimeHandlers)\n }\n\n public restoreHandlers(): void {\n this.currentHandlers.forEach((handler) => {\n handler.isUsed = false\n })\n }\n\n public resetHandlers(...nextHandlers: Array<RequestHandler>): void {\n this.currentHandlers =\n nextHandlers.length > 0 ? [...nextHandlers] : [...this.initialHandlers]\n }\n\n public listHandlers(): ReadonlyArray<\n RequestHandler<RequestHandlerDefaultInfo, any, any>\n > {\n return toReadonlyArray(this.currentHandlers)\n }\n\n private createLifeCycleEvents(): LifeCycleEventEmitter<EventsMap> {\n return {\n on: (...args: any[]) => {\n return (this.publicEmitter.on as any)(...args)\n },\n removeListener: (...args: any[]) => {\n return (this.publicEmitter.removeListener as any)(...args)\n },\n removeAllListeners: (...args: any[]) => {\n return this.publicEmitter.removeAllListeners(...args)\n },\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAA0B;AAC1B,kCAAkC;AAMlC,sBAAyB;AACzB,wBAA2B;AAC3B,6BAAgC;AAChC,wBAA2B;AAKpB,MAAe,iBAA6C,6BAAW;AAAA,EAClE;AAAA,EACA;AAAA,EACS;AAAA,EACA;AAAA,EAEH;AAAA,EAEhB,eAAe,iBAAwC;AACrD,UAAM;AAEN;AAAA,MACE,KAAK,iBAAiB,eAAe;AAAA,MACrC,yBAAS;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,SAAK,sBAAkB,wCAAgB,eAAe;AACtD,SAAK,kBAAkB,CAAC,GAAG,eAAe;AAE1C,SAAK,UAAU,IAAI,oCAAmB;AACtC,SAAK,gBAAgB,IAAI,oCAAmB;AAC5C,sCAAW,KAAK,SAAS,KAAK,aAAa;AAE3C,SAAK,SAAS,KAAK,sBAAsB;AAEzC,SAAK,cAAc,KAAK,MAAM;AAC5B,WAAK,QAAQ,mBAAmB;AAChC,WAAK,cAAc,mBAAmB;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiB,UAAkD;AAEzE,WAAO,SAAS,MAAM,CAAC,YAAY,CAAC,MAAM,QAAQ,OAAO,CAAC;AAAA,EAC5D;AAAA,EAEO,OAAO,iBAA8C;AAC1D;AAAA,MACE,KAAK,iBAAiB,eAAe;AAAA,MACrC,yBAAS;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,SAAK,gBAAgB,QAAQ,GAAG,eAAe;AAAA,EACjD;AAAA,EAEO,kBAAwB;AAC7B,SAAK,gBAAgB,QAAQ,CAAC,YAAY;AACxC,cAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEO,iBAAiB,cAA2C;AACjE,SAAK,kBACH,aAAa,SAAS,IAAI,CAAC,GAAG,YAAY,IAAI,CAAC,GAAG,KAAK,eAAe;AAAA,EAC1E;AAAA,EAEO,eAEL;AACA,eAAO,wCAAgB,KAAK,eAAe;AAAA,EAC7C;AAAA,EAEQ,wBAA0D;AAChE,WAAO;AAAA,MACL,IAAI,IAAI,SAAgB;AACtB,eAAQ,KAAK,cAAc,GAAW,GAAG,IAAI;AAAA,MAC/C;AAAA,MACA,gBAAgB,IAAI,SAAgB;AAClC,eAAQ,KAAK,cAAc,eAAuB,GAAG,IAAI;AAAA,MAC3D;AAAA,MACA,oBAAoB,IAAI,SAAgB;AACtC,eAAO,KAAK,cAAc,mBAAmB,GAAG,IAAI;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -5,6 +5,11 @@ import { pipeEvents } from './utils/internal/pipeEvents.mjs';
5
5
  import { toReadonlyArray } from './utils/internal/toReadonlyArray.mjs';
6
6
  import { Disposable } from './utils/internal/Disposable.mjs';
7
7
  class SetupApi extends Disposable {
8
+ initialHandlers;
9
+ currentHandlers;
10
+ emitter;
11
+ publicEmitter;
12
+ events;
8
13
  constructor(...initialHandlers) {
9
14
  super();
10
15
  invariant(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/SetupApi.ts"],"sourcesContent":["import { invariant } from 'outvariant'\nimport { EventMap, Emitter } from 'strict-event-emitter'\nimport {\n RequestHandler,\n RequestHandlerDefaultInfo,\n} from './handlers/RequestHandler'\nimport { LifeCycleEventEmitter } from './sharedOptions'\nimport { devUtils } from './utils/internal/devUtils'\nimport { pipeEvents } from './utils/internal/pipeEvents'\nimport { toReadonlyArray } from './utils/internal/toReadonlyArray'\nimport { Disposable } from './utils/internal/Disposable'\n\n/**\n * Generic class for the mock API setup.\n */\nexport abstract class SetupApi<EventsMap extends EventMap> extends Disposable {\n protected initialHandlers: ReadonlyArray<RequestHandler>\n protected currentHandlers: Array<RequestHandler>\n protected readonly emitter: Emitter<EventsMap>\n protected readonly publicEmitter: Emitter<EventsMap>\n\n public readonly events: LifeCycleEventEmitter<EventsMap>\n\n constructor(...initialHandlers: Array<RequestHandler>) {\n super()\n\n invariant(\n this.validateHandlers(initialHandlers),\n devUtils.formatMessage(\n `Failed to apply given request handlers: invalid input. Did you forget to spread the request handlers Array?`,\n ),\n )\n\n this.initialHandlers = toReadonlyArray(initialHandlers)\n this.currentHandlers = [...initialHandlers]\n\n this.emitter = new Emitter<EventsMap>()\n this.publicEmitter = new Emitter<EventsMap>()\n pipeEvents(this.emitter, this.publicEmitter)\n\n this.events = this.createLifeCycleEvents()\n\n this.subscriptions.push(() => {\n this.emitter.removeAllListeners()\n this.publicEmitter.removeAllListeners()\n })\n }\n\n private validateHandlers(handlers: ReadonlyArray<RequestHandler>): boolean {\n // Guard against incorrect call signature of the setup API.\n return handlers.every((handler) => !Array.isArray(handler))\n }\n\n public use(...runtimeHandlers: Array<RequestHandler>): void {\n invariant(\n this.validateHandlers(runtimeHandlers),\n devUtils.formatMessage(\n `Failed to call \"use()\" with the given request handlers: invalid input. Did you forget to spread the array of request handlers?`,\n ),\n )\n\n this.currentHandlers.unshift(...runtimeHandlers)\n }\n\n public restoreHandlers(): void {\n this.currentHandlers.forEach((handler) => {\n handler.isUsed = false\n })\n }\n\n public resetHandlers(...nextHandlers: Array<RequestHandler>): void {\n this.currentHandlers =\n nextHandlers.length > 0 ? [...nextHandlers] : [...this.initialHandlers]\n }\n\n public listHandlers(): ReadonlyArray<\n RequestHandler<RequestHandlerDefaultInfo, any, any>\n > {\n return toReadonlyArray(this.currentHandlers)\n }\n\n private createLifeCycleEvents(): LifeCycleEventEmitter<EventsMap> {\n return {\n on: (...args: any[]) => {\n return (this.publicEmitter.on as any)(...args)\n },\n removeListener: (...args: any[]) => {\n return (this.publicEmitter.removeListener as any)(...args)\n },\n removeAllListeners: (...args: any[]) => {\n return this.publicEmitter.removeAllListeners(...args)\n },\n }\n }\n}\n"],"mappings":"AAAA,SAAS,iBAAiB;AAC1B,SAAmB,eAAe;AAMlC,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAKpB,MAAe,iBAA6C,WAAW;AAAA,EAQ5E,eAAe,iBAAwC;AACrD,UAAM;AAEN;AAAA,MACE,KAAK,iBAAiB,eAAe;AAAA,MACrC,SAAS;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,SAAK,kBAAkB,gBAAgB,eAAe;AACtD,SAAK,kBAAkB,CAAC,GAAG,eAAe;AAE1C,SAAK,UAAU,IAAI,QAAmB;AACtC,SAAK,gBAAgB,IAAI,QAAmB;AAC5C,eAAW,KAAK,SAAS,KAAK,aAAa;AAE3C,SAAK,SAAS,KAAK,sBAAsB;AAEzC,SAAK,cAAc,KAAK,MAAM;AAC5B,WAAK,QAAQ,mBAAmB;AAChC,WAAK,cAAc,mBAAmB;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiB,UAAkD;AAEzE,WAAO,SAAS,MAAM,CAAC,YAAY,CAAC,MAAM,QAAQ,OAAO,CAAC;AAAA,EAC5D;AAAA,EAEO,OAAO,iBAA8C;AAC1D;AAAA,MACE,KAAK,iBAAiB,eAAe;AAAA,MACrC,SAAS;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,SAAK,gBAAgB,QAAQ,GAAG,eAAe;AAAA,EACjD;AAAA,EAEO,kBAAwB;AAC7B,SAAK,gBAAgB,QAAQ,CAAC,YAAY;AACxC,cAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEO,iBAAiB,cAA2C;AACjE,SAAK,kBACH,aAAa,SAAS,IAAI,CAAC,GAAG,YAAY,IAAI,CAAC,GAAG,KAAK,eAAe;AAAA,EAC1E;AAAA,EAEO,eAEL;AACA,WAAO,gBAAgB,KAAK,eAAe;AAAA,EAC7C;AAAA,EAEQ,wBAA0D;AAChE,WAAO;AAAA,MACL,IAAI,IAAI,SAAgB;AACtB,eAAQ,KAAK,cAAc,GAAW,GAAG,IAAI;AAAA,MAC/C;AAAA,MACA,gBAAgB,IAAI,SAAgB;AAClC,eAAQ,KAAK,cAAc,eAAuB,GAAG,IAAI;AAAA,MAC3D;AAAA,MACA,oBAAoB,IAAI,SAAgB;AACtC,eAAO,KAAK,cAAc,mBAAmB,GAAG,IAAI;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/core/SetupApi.ts"],"sourcesContent":["import { invariant } from 'outvariant'\nimport { EventMap, Emitter } from 'strict-event-emitter'\nimport {\n RequestHandler,\n RequestHandlerDefaultInfo,\n} from './handlers/RequestHandler'\nimport { LifeCycleEventEmitter } from './sharedOptions'\nimport { devUtils } from './utils/internal/devUtils'\nimport { pipeEvents } from './utils/internal/pipeEvents'\nimport { toReadonlyArray } from './utils/internal/toReadonlyArray'\nimport { Disposable } from './utils/internal/Disposable'\n\n/**\n * Generic class for the mock API setup.\n */\nexport abstract class SetupApi<EventsMap extends EventMap> extends Disposable {\n protected initialHandlers: ReadonlyArray<RequestHandler>\n protected currentHandlers: Array<RequestHandler>\n protected readonly emitter: Emitter<EventsMap>\n protected readonly publicEmitter: Emitter<EventsMap>\n\n public readonly events: LifeCycleEventEmitter<EventsMap>\n\n constructor(...initialHandlers: Array<RequestHandler>) {\n super()\n\n invariant(\n this.validateHandlers(initialHandlers),\n devUtils.formatMessage(\n `Failed to apply given request handlers: invalid input. Did you forget to spread the request handlers Array?`,\n ),\n )\n\n this.initialHandlers = toReadonlyArray(initialHandlers)\n this.currentHandlers = [...initialHandlers]\n\n this.emitter = new Emitter<EventsMap>()\n this.publicEmitter = new Emitter<EventsMap>()\n pipeEvents(this.emitter, this.publicEmitter)\n\n this.events = this.createLifeCycleEvents()\n\n this.subscriptions.push(() => {\n this.emitter.removeAllListeners()\n this.publicEmitter.removeAllListeners()\n })\n }\n\n private validateHandlers(handlers: ReadonlyArray<RequestHandler>): boolean {\n // Guard against incorrect call signature of the setup API.\n return handlers.every((handler) => !Array.isArray(handler))\n }\n\n public use(...runtimeHandlers: Array<RequestHandler>): void {\n invariant(\n this.validateHandlers(runtimeHandlers),\n devUtils.formatMessage(\n `Failed to call \"use()\" with the given request handlers: invalid input. Did you forget to spread the array of request handlers?`,\n ),\n )\n\n this.currentHandlers.unshift(...runtimeHandlers)\n }\n\n public restoreHandlers(): void {\n this.currentHandlers.forEach((handler) => {\n handler.isUsed = false\n })\n }\n\n public resetHandlers(...nextHandlers: Array<RequestHandler>): void {\n this.currentHandlers =\n nextHandlers.length > 0 ? [...nextHandlers] : [...this.initialHandlers]\n }\n\n public listHandlers(): ReadonlyArray<\n RequestHandler<RequestHandlerDefaultInfo, any, any>\n > {\n return toReadonlyArray(this.currentHandlers)\n }\n\n private createLifeCycleEvents(): LifeCycleEventEmitter<EventsMap> {\n return {\n on: (...args: any[]) => {\n return (this.publicEmitter.on as any)(...args)\n },\n removeListener: (...args: any[]) => {\n return (this.publicEmitter.removeListener as any)(...args)\n },\n removeAllListeners: (...args: any[]) => {\n return this.publicEmitter.removeAllListeners(...args)\n },\n }\n }\n}\n"],"mappings":"AAAA,SAAS,iBAAiB;AAC1B,SAAmB,eAAe;AAMlC,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAKpB,MAAe,iBAA6C,WAAW;AAAA,EAClE;AAAA,EACA;AAAA,EACS;AAAA,EACA;AAAA,EAEH;AAAA,EAEhB,eAAe,iBAAwC;AACrD,UAAM;AAEN;AAAA,MACE,KAAK,iBAAiB,eAAe;AAAA,MACrC,SAAS;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,SAAK,kBAAkB,gBAAgB,eAAe;AACtD,SAAK,kBAAkB,CAAC,GAAG,eAAe;AAE1C,SAAK,UAAU,IAAI,QAAmB;AACtC,SAAK,gBAAgB,IAAI,QAAmB;AAC5C,eAAW,KAAK,SAAS,KAAK,aAAa;AAE3C,SAAK,SAAS,KAAK,sBAAsB;AAEzC,SAAK,cAAc,KAAK,MAAM;AAC5B,WAAK,QAAQ,mBAAmB;AAChC,WAAK,cAAc,mBAAmB;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiB,UAAkD;AAEzE,WAAO,SAAS,MAAM,CAAC,YAAY,CAAC,MAAM,QAAQ,OAAO,CAAC;AAAA,EAC5D;AAAA,EAEO,OAAO,iBAA8C;AAC1D;AAAA,MACE,KAAK,iBAAiB,eAAe;AAAA,MACrC,SAAS;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,SAAK,gBAAgB,QAAQ,GAAG,eAAe;AAAA,EACjD;AAAA,EAEO,kBAAwB;AAC7B,SAAK,gBAAgB,QAAQ,CAAC,YAAY;AACxC,cAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEO,iBAAiB,cAA2C;AACjE,SAAK,kBACH,aAAa,SAAS,IAAI,CAAC,GAAG,YAAY,IAAI,CAAC,GAAG,KAAK,eAAe;AAAA,EAC1E;AAAA,EAEO,eAEL;AACA,WAAO,gBAAgB,KAAK,eAAe;AAAA,EAC7C;AAAA,EAEQ,wBAA0D;AAChE,WAAO;AAAA,MACL,IAAI,IAAI,SAAgB;AACtB,eAAQ,KAAK,cAAc,GAAW,GAAG,IAAI;AAAA,MAC/C;AAAA,MACA,gBAAgB,IAAI,SAAgB;AAClC,eAAQ,KAAK,cAAc,eAAuB,GAAG,IAAI;AAAA,MAC3D;AAAA,MACA,oBAAoB,IAAI,SAAgB;AACtC,eAAO,KAAK,cAAc,mBAAmB,GAAG,IAAI;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/lib/core/delay.js CHANGED
@@ -16,26 +16,6 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var __async = (__this, __arguments, generator) => {
20
- return new Promise((resolve, reject) => {
21
- var fulfilled = (value) => {
22
- try {
23
- step(generator.next(value));
24
- } catch (e) {
25
- reject(e);
26
- }
27
- };
28
- var rejected = (value) => {
29
- try {
30
- step(generator.throw(value));
31
- } catch (e) {
32
- reject(e);
33
- }
34
- };
35
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
36
- step((generator = generator.apply(__this, __arguments)).next());
37
- });
38
- };
39
19
  var delay_exports = {};
40
20
  __export(delay_exports, {
41
21
  MAX_SERVER_RESPONSE_TIME: () => MAX_SERVER_RESPONSE_TIME,
@@ -58,36 +38,34 @@ function getRealisticResponseTime() {
58
38
  Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) + MIN_SERVER_RESPONSE_TIME
59
39
  );
60
40
  }
61
- function delay(durationOrMode) {
62
- return __async(this, null, function* () {
63
- let delayTime;
64
- if (typeof durationOrMode === "string") {
65
- switch (durationOrMode) {
66
- case "infinite": {
67
- delayTime = SET_TIMEOUT_MAX_ALLOWED_INT;
68
- break;
69
- }
70
- case "real": {
71
- delayTime = getRealisticResponseTime();
72
- break;
73
- }
74
- default: {
75
- throw new Error(
76
- `Failed to delay a response: unknown delay mode "${durationOrMode}". Please make sure you provide one of the supported modes ("real", "infinite") or a number.`
77
- );
78
- }
41
+ async function delay(durationOrMode) {
42
+ let delayTime;
43
+ if (typeof durationOrMode === "string") {
44
+ switch (durationOrMode) {
45
+ case "infinite": {
46
+ delayTime = SET_TIMEOUT_MAX_ALLOWED_INT;
47
+ break;
79
48
  }
80
- } else if (typeof durationOrMode === "undefined") {
81
- delayTime = getRealisticResponseTime();
82
- } else {
83
- if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) {
49
+ case "real": {
50
+ delayTime = getRealisticResponseTime();
51
+ break;
52
+ }
53
+ default: {
84
54
  throw new Error(
85
- `Failed to delay a response: provided delay duration (${durationOrMode}) exceeds the maximum allowed duration for "setTimeout" (${SET_TIMEOUT_MAX_ALLOWED_INT}). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the "infinite" delay mode to delay the response indefinitely.`
55
+ `Failed to delay a response: unknown delay mode "${durationOrMode}". Please make sure you provide one of the supported modes ("real", "infinite") or a number.`
86
56
  );
87
57
  }
88
- delayTime = durationOrMode;
89
58
  }
90
- return new Promise((resolve) => setTimeout(resolve, delayTime));
91
- });
59
+ } else if (typeof durationOrMode === "undefined") {
60
+ delayTime = getRealisticResponseTime();
61
+ } else {
62
+ if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) {
63
+ throw new Error(
64
+ `Failed to delay a response: provided delay duration (${durationOrMode}) exceeds the maximum allowed duration for "setTimeout" (${SET_TIMEOUT_MAX_ALLOWED_INT}). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the "infinite" delay mode to delay the response indefinitely.`
65
+ );
66
+ }
67
+ delayTime = durationOrMode;
68
+ }
69
+ return new Promise((resolve) => setTimeout(resolve, delayTime));
92
70
  }
93
71
  //# sourceMappingURL=delay.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/delay.ts"],"sourcesContent":["import { isNodeProcess } from 'is-node-process'\n\nexport const SET_TIMEOUT_MAX_ALLOWED_INT = 2147483647\nexport const MIN_SERVER_RESPONSE_TIME = 100\nexport const MAX_SERVER_RESPONSE_TIME = 400\nexport const NODE_SERVER_RESPONSE_TIME = 5\n\nfunction getRealisticResponseTime(): number {\n if (isNodeProcess()) {\n return NODE_SERVER_RESPONSE_TIME\n }\n\n return Math.floor(\n Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) +\n MIN_SERVER_RESPONSE_TIME,\n )\n}\n\nexport type DelayMode = 'real' | 'infinite'\n\n/**\n * Delays the response by the given duration (ms).\n *\n * @example\n * await delay() // emulate realistic server response time\n * await delay(1200) // delay response by 1200ms\n * await delay('infinite') // delay response infinitely\n *\n * @see {@link https://mswjs.io/docs/api/delay `delay()` API reference}\n */\nexport async function delay(\n durationOrMode?: DelayMode | number,\n): Promise<void> {\n let delayTime: number\n\n if (typeof durationOrMode === 'string') {\n switch (durationOrMode) {\n case 'infinite': {\n // Using `Infinity` as a delay value executes the response timeout immediately.\n // Instead, use the maximum allowed integer for `setTimeout`.\n delayTime = SET_TIMEOUT_MAX_ALLOWED_INT\n break\n }\n case 'real': {\n delayTime = getRealisticResponseTime()\n break\n }\n default: {\n throw new Error(\n `Failed to delay a response: unknown delay mode \"${durationOrMode}\". Please make sure you provide one of the supported modes (\"real\", \"infinite\") or a number.`,\n )\n }\n }\n } else if (typeof durationOrMode === 'undefined') {\n // Use random realistic server response time when no explicit delay duration was provided.\n delayTime = getRealisticResponseTime()\n } else {\n // Guard against passing values like `Infinity` or `Number.MAX_VALUE`\n // as the response delay duration. They don't produce the result you may expect.\n if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) {\n throw new Error(\n `Failed to delay a response: provided delay duration (${durationOrMode}) exceeds the maximum allowed duration for \"setTimeout\" (${SET_TIMEOUT_MAX_ALLOWED_INT}). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the \"infinite\" delay mode to delay the response indefinitely.`,\n )\n }\n\n delayTime = durationOrMode\n }\n\n return new Promise((resolve) => setTimeout(resolve, delayTime))\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAA8B;AAEvB,MAAM,8BAA8B;AACpC,MAAM,2BAA2B;AACjC,MAAM,2BAA2B;AACjC,MAAM,4BAA4B;AAEzC,SAAS,2BAAmC;AAC1C,UAAI,sCAAc,GAAG;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK;AAAA,IACV,KAAK,OAAO,KAAK,2BAA2B,4BAC1C;AAAA,EACJ;AACF;AAcA,SAAsB,MACpB,gBACe;AAAA;AACf,QAAI;AAEJ,QAAI,OAAO,mBAAmB,UAAU;AACtC,cAAQ,gBAAgB;AAAA,QACtB,KAAK,YAAY;AAGf,sBAAY;AACZ;AAAA,QACF;AAAA,QACA,KAAK,QAAQ;AACX,sBAAY,yBAAyB;AACrC;AAAA,QACF;AAAA,QACA,SAAS;AACP,gBAAM,IAAI;AAAA,YACR,mDAAmD,cAAc;AAAA,UACnE;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,OAAO,mBAAmB,aAAa;AAEhD,kBAAY,yBAAyB;AAAA,IACvC,OAAO;AAGL,UAAI,iBAAiB,6BAA6B;AAChD,cAAM,IAAI;AAAA,UACR,wDAAwD,cAAc,4DAA4D,2BAA2B;AAAA,QAC/J;AAAA,MACF;AAEA,kBAAY;AAAA,IACd;AAEA,WAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,SAAS,CAAC;AAAA,EAChE;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../src/core/delay.ts"],"sourcesContent":["import { isNodeProcess } from 'is-node-process'\n\nexport const SET_TIMEOUT_MAX_ALLOWED_INT = 2147483647\nexport const MIN_SERVER_RESPONSE_TIME = 100\nexport const MAX_SERVER_RESPONSE_TIME = 400\nexport const NODE_SERVER_RESPONSE_TIME = 5\n\nfunction getRealisticResponseTime(): number {\n if (isNodeProcess()) {\n return NODE_SERVER_RESPONSE_TIME\n }\n\n return Math.floor(\n Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) +\n MIN_SERVER_RESPONSE_TIME,\n )\n}\n\nexport type DelayMode = 'real' | 'infinite'\n\n/**\n * Delays the response by the given duration (ms).\n *\n * @example\n * await delay() // emulate realistic server response time\n * await delay(1200) // delay response by 1200ms\n * await delay('infinite') // delay response infinitely\n *\n * @see {@link https://mswjs.io/docs/api/delay `delay()` API reference}\n */\nexport async function delay(\n durationOrMode?: DelayMode | number,\n): Promise<void> {\n let delayTime: number\n\n if (typeof durationOrMode === 'string') {\n switch (durationOrMode) {\n case 'infinite': {\n // Using `Infinity` as a delay value executes the response timeout immediately.\n // Instead, use the maximum allowed integer for `setTimeout`.\n delayTime = SET_TIMEOUT_MAX_ALLOWED_INT\n break\n }\n case 'real': {\n delayTime = getRealisticResponseTime()\n break\n }\n default: {\n throw new Error(\n `Failed to delay a response: unknown delay mode \"${durationOrMode}\". Please make sure you provide one of the supported modes (\"real\", \"infinite\") or a number.`,\n )\n }\n }\n } else if (typeof durationOrMode === 'undefined') {\n // Use random realistic server response time when no explicit delay duration was provided.\n delayTime = getRealisticResponseTime()\n } else {\n // Guard against passing values like `Infinity` or `Number.MAX_VALUE`\n // as the response delay duration. They don't produce the result you may expect.\n if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) {\n throw new Error(\n `Failed to delay a response: provided delay duration (${durationOrMode}) exceeds the maximum allowed duration for \"setTimeout\" (${SET_TIMEOUT_MAX_ALLOWED_INT}). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the \"infinite\" delay mode to delay the response indefinitely.`,\n )\n }\n\n delayTime = durationOrMode\n }\n\n return new Promise((resolve) => setTimeout(resolve, delayTime))\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAA8B;AAEvB,MAAM,8BAA8B;AACpC,MAAM,2BAA2B;AACjC,MAAM,2BAA2B;AACjC,MAAM,4BAA4B;AAEzC,SAAS,2BAAmC;AAC1C,UAAI,sCAAc,GAAG;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK;AAAA,IACV,KAAK,OAAO,KAAK,2BAA2B,4BAC1C;AAAA,EACJ;AACF;AAcA,eAAsB,MACpB,gBACe;AACf,MAAI;AAEJ,MAAI,OAAO,mBAAmB,UAAU;AACtC,YAAQ,gBAAgB;AAAA,MACtB,KAAK,YAAY;AAGf,oBAAY;AACZ;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,oBAAY,yBAAyB;AACrC;AAAA,MACF;AAAA,MACA,SAAS;AACP,cAAM,IAAI;AAAA,UACR,mDAAmD,cAAc;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,OAAO,mBAAmB,aAAa;AAEhD,gBAAY,yBAAyB;AAAA,EACvC,OAAO;AAGL,QAAI,iBAAiB,6BAA6B;AAChD,YAAM,IAAI;AAAA,QACR,wDAAwD,cAAc,4DAA4D,2BAA2B;AAAA,MAC/J;AAAA,IACF;AAEA,gBAAY;AAAA,EACd;AAEA,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,SAAS,CAAC;AAChE;","names":[]}