diff --git a/examples/react-storybook/package.json b/examples/react-storybook/package.json index 838557bc8ca8..6fe2707944d3 100644 --- a/examples/react-storybook/package.json +++ b/examples/react-storybook/package.json @@ -32,7 +32,7 @@ "@vitest/ui": "latest", "babel-loader": "^8.2.5", "jsdom": "latest", - "msw": "^0.39.2", + "msw": "^0.49.2", "msw-storybook-addon": "^1.6.3", "typescript": "^4.8.4", "vite": "latest", diff --git a/examples/react-storybook/public/mockServiceWorker.js b/examples/react-storybook/public/mockServiceWorker.js index 144102f49fe3..70f0a2b99410 100644 --- a/examples/react-storybook/public/mockServiceWorker.js +++ b/examples/react-storybook/public/mockServiceWorker.js @@ -1,24 +1,22 @@ -/* eslint-disable eslint-comments/no-unlimited-disable */ /* eslint-disable */ /* tslint:disable */ /** - * Mock Service Worker (0.36.3). + * Mock Service Worker (0.49.2). * @see https://github.com/mswjs/msw * - Please do NOT modify this file. * - Please do NOT serve this file on production. */ -const INTEGRITY_CHECKSUM = '02f4ad4a2797f85668baf196e553d929' -const bypassHeaderName = 'x-msw-bypass' +const INTEGRITY_CHECKSUM = '3d6b9f06410d179a7f7404d4bf4c3c70' const activeClientIds = new Set() self.addEventListener('install', function () { - return self.skipWaiting() + self.skipWaiting() }) -self.addEventListener('activate', async function (event) { - return self.clients.claim() +self.addEventListener('activate', function (event) { + event.waitUntil(self.clients.claim()) }) self.addEventListener('message', async function (event) { @@ -34,7 +32,9 @@ self.addEventListener('message', async function (event) { return } - const allClients = await self.clients.matchAll() + const allClients = await self.clients.matchAll({ + type: 'window', + }) switch (event.data) { case 'KEEPALIVE_REQUEST': { @@ -84,30 +84,58 @@ self.addEventListener('message', async function (event) { } }) -// Resolve the "main" client for the given event. -// Client that issues a request doesn't necessarily equal the client -// that registered the worker. It's with the latter the worker should -// communicate with during the response resolving phase. -async function resolveMainClient(event) { - const client = await self.clients.get(event.clientId) +self.addEventListener('fetch', function (event) { + const { request } = event + const accept = request.headers.get('accept') || '' - if (client.frameType === 'top-level') { - return client + // Bypass server-sent events. + if (accept.includes('text/event-stream')) { + return } - const allClients = await self.clients.matchAll() + // Bypass navigation requests. + if (request.mode === 'navigate') { + return + } - return allClients - .filter((client) => { - // Get only those clients that are currently visible. - return client.visibilityState === 'visible' - }) - .find((client) => { - // Find the client ID that's recorded in the - // set of clients that have registered the worker. - return activeClientIds.has(client.id) - }) -} + // Opening the DevTools triggers the "only-if-cached" request + // that cannot be handled by the worker. Bypass such requests. + if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { + return + } + + // Bypass all requests when there are no active clients. + // Prevents the self-unregistered worked from handling requests + // after it's been deleted (still remains active until the next reload). + if (activeClientIds.size === 0) { + return + } + + // Generate unique request ID. + const requestId = Math.random().toString(16).slice(2) + + event.respondWith( + handleRequest(event, requestId).catch((error) => { + if (error.name === 'NetworkError') { + console.warn( + '[MSW] Successfully emulated a network error for the "%s %s" request.', + request.method, + request.url, + ) + return + } + + // At this point, any exception indicates an issue with the original request/response. + console.error( + `\ +[MSW] Caught an exception from the "%s %s" request (%s). This is probably not a problem with Mock Service Worker. There is likely an additional logging output above.`, + request.method, + request.url, + `${error.name}: ${error.message}`, + ) + }), + ) +}) async function handleRequest(event, requestId) { const client = await resolveMainClient(event) @@ -129,7 +157,7 @@ async function handleRequest(event, requestId) { statusText: clonedResponse.statusText, body: clonedResponse.body === null ? null : await clonedResponse.text(), - headers: serializeHeaders(clonedResponse.headers), + headers: Object.fromEntries(clonedResponse.headers.entries()), redirected: clonedResponse.redirected, }, }) @@ -139,14 +167,54 @@ async function handleRequest(event, requestId) { return response } +// Resolve the main client for the given event. +// Client that issues a request doesn't necessarily equal the client +// that registered the worker. It's with the latter the worker should +// communicate with during the response resolving phase. +async function resolveMainClient(event) { + const client = await self.clients.get(event.clientId) + + if (client?.frameType === 'top-level') { + return client + } + + const allClients = await self.clients.matchAll({ + type: 'window', + }) + + return allClients + .filter((client) => { + // Get only those clients that are currently visible. + return client.visibilityState === 'visible' + }) + .find((client) => { + // Find the client ID that's recorded in the + // set of clients that have registered the worker. + return activeClientIds.has(client.id) + }) +} + async function getResponse(event, client, requestId) { const { request } = event - const requestClone = request.clone() - const getOriginalResponse = () => fetch(requestClone) + const clonedRequest = request.clone() + + function passthrough() { + // Clone the request because it might've been already used + // (i.e. its body has been read and sent to the client). + const headers = Object.fromEntries(clonedRequest.headers.entries()) + + // Remove MSW-specific request headers so the bypassed requests + // comply with the server's CORS preflight check. + // Operate with the headers as an object because request "Headers" + // are immutable. + delete headers['x-msw-bypass'] - // Bypass mocking when the request client is not active. + return fetch(clonedRequest, { headers }) + } + + // Bypass mocking when the client is not active. if (!client) { - return getOriginalResponse() + return passthrough() } // Bypass initial page load requests (i.e. static assets). @@ -154,34 +222,23 @@ async function getResponse(event, client, requestId) { // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet // and is not ready to handle requests. if (!activeClientIds.has(client.id)) { - return await getOriginalResponse() + return passthrough() } - // Bypass requests with the explicit bypass header - if (requestClone.headers.get(bypassHeaderName) === 'true') { - const cleanRequestHeaders = serializeHeaders(requestClone.headers) - - // Remove the bypass header to comply with the CORS preflight check. - delete cleanRequestHeaders[bypassHeaderName] - - const originalRequest = new Request(requestClone, { - headers: new Headers(cleanRequestHeaders), - }) - - return fetch(originalRequest) + // Bypass requests with the explicit bypass header. + // Such requests can be issued by "ctx.fetch()". + if (request.headers.get('x-msw-bypass') === 'true') { + return passthrough() } - // Send the request to the client-side MSW. - const reqHeaders = serializeHeaders(request.headers) - const body = await request.text() - + // Notify the client that a request has been intercepted. const clientMessage = await sendToClient(client, { type: 'REQUEST', payload: { id: requestId, url: request.url, method: request.method, - headers: reqHeaders, + headers: Object.fromEntries(request.headers.entries()), cache: request.cache, mode: request.mode, credentials: request.credentials, @@ -190,115 +247,32 @@ async function getResponse(event, client, requestId) { redirect: request.redirect, referrer: request.referrer, referrerPolicy: request.referrerPolicy, - body, + body: await request.text(), bodyUsed: request.bodyUsed, keepalive: request.keepalive, }, }) switch (clientMessage.type) { - case 'MOCK_SUCCESS': { - return delayPromise( - () => respondWithMock(clientMessage), - clientMessage.payload.delay, - ) + case 'MOCK_RESPONSE': { + return respondWithMock(clientMessage.data) } case 'MOCK_NOT_FOUND': { - return getOriginalResponse() + return passthrough() } case 'NETWORK_ERROR': { - const { name, message } = clientMessage.payload + const { name, message } = clientMessage.data const networkError = new Error(message) networkError.name = name - // Rejecting a request Promise emulates a network error. + // Rejecting a "respondWith" promise emulates a network error. throw networkError } - - case 'INTERNAL_ERROR': { - const parsedBody = JSON.parse(clientMessage.payload.body) - - console.error( - `\ -[MSW] Uncaught exception in the request handler for "%s %s": - -${parsedBody.location} - -This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/recipes/mocking-error-responses\ -`, - request.method, - request.url, - ) - - return respondWithMock(clientMessage) - } - } - - return getOriginalResponse() -} - -self.addEventListener('fetch', function (event) { - const { request } = event - const accept = request.headers.get('accept') || '' - - // Bypass server-sent events. - if (accept.includes('text/event-stream')) { - return - } - - // Bypass navigation requests. - if (request.mode === 'navigate') { - return } - // Opening the DevTools triggers the "only-if-cached" request - // that cannot be handled by the worker. Bypass such requests. - if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { - return - } - - // Bypass all requests when there are no active clients. - // Prevents the self-unregistered worked from handling requests - // after it's been deleted (still remains active until the next reload). - if (activeClientIds.size === 0) { - return - } - - const requestId = uuidv4() - - return event.respondWith( - handleRequest(event, requestId).catch((error) => { - if (error.name === 'NetworkError') { - console.warn( - '[MSW] Successfully emulated a network error for the "%s %s" request.', - request.method, - request.url, - ) - return - } - - // At this point, any exception indicates an issue with the original request/response. - console.error( - `\ -[MSW] Caught an exception from the "%s %s" request (%s). This is probably not a problem with Mock Service Worker. There is likely an additional logging output above.`, - request.method, - request.url, - `${error.name}: ${error.message}`, - ) - }), - ) -}) - -function serializeHeaders(headers) { - const reqHeaders = {} - headers.forEach((value, name) => { - reqHeaders[name] = reqHeaders[name] - ? [].concat(reqHeaders[name]).concat(value) - : value - }) - return reqHeaders + return passthrough() } function sendToClient(client, message) { @@ -313,27 +287,17 @@ function sendToClient(client, message) { resolve(event.data) } - client.postMessage(JSON.stringify(message), [channel.port2]) + client.postMessage(message, [channel.port2]) }) } -function delayPromise(cb, duration) { +function sleep(timeMs) { return new Promise((resolve) => { - setTimeout(() => resolve(cb()), duration) + setTimeout(resolve, timeMs) }) } -function respondWithMock(clientMessage) { - return new Response(clientMessage.payload.body, { - ...clientMessage.payload, - headers: clientMessage.payload.headers, - }) -} - -function uuidv4() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - const r = (Math.random() * 16) | 0 - const v = c == 'x' ? r : (r & 0x3) | 0x8 - return v.toString(16) - }) +async function respondWithMock(response) { + await sleep(response.delay) + return new Response(response.body, response) } diff --git a/examples/react-testing-lib-msw/package.json b/examples/react-testing-lib-msw/package.json index 7d6926cab9f6..7d2b07fe992f 100644 --- a/examples/react-testing-lib-msw/package.json +++ b/examples/react-testing-lib-msw/package.json @@ -23,7 +23,7 @@ "@vitest/ui": "latest", "cross-fetch": "^3.1.5", "jsdom": "latest", - "msw": "^0.39.2", + "msw": "^0.49.2", "vite": "latest", "vitest": "latest" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e5d3104edea..9a29b57a048f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -385,7 +385,7 @@ importers: babel-loader: ^8.2.5 cross-fetch: ^3.1.5 jsdom: latest - msw: ^0.39.2 + msw: ^0.49.2 msw-storybook-addon: ^1.6.3 react: ^17.0.2 react-dom: ^17.0.2 @@ -415,8 +415,8 @@ importers: '@vitest/ui': link:../../packages/ui babel-loader: 8.2.5_@babel+core@7.18.13 jsdom: 20.0.3 - msw: 0.39.2 - msw-storybook-addon: 1.6.3_ssm5z5kjlefxgbmyszjdm3lzke + msw: 0.49.2_typescript@4.8.4 + msw-storybook-addon: 1.6.3_s5cxgiagrgvv4frx3sfmny2xh4 typescript: 4.8.4 vite: 4.0.0 vitest: link:../../packages/vitest @@ -465,7 +465,7 @@ importers: '@vitest/ui': latest cross-fetch: ^3.1.5 jsdom: latest - msw: ^0.39.2 + msw: ^0.49.2 react: ^17.0.2 react-dom: ^17.0.2 vite: ^4.0.0 @@ -483,7 +483,7 @@ importers: '@vitest/ui': link:../../packages/ui cross-fetch: 3.1.5 jsdom: 20.0.3 - msw: 0.39.2 + msw: 0.49.2 vite: 4.0.0 vitest: link:../../packages/vitest @@ -1516,14 +1516,14 @@ packages: dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.0 + '@babel/generator': 7.20.5 '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.19.6 - '@babel/helper-module-transforms': 7.19.6 - '@babel/helpers': 7.20.0 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helpers': 7.20.6 '@babel/parser': 7.20.5 '@babel/template': 7.18.10 - '@babel/traverse': 7.20.0 - '@babel/types': 7.20.0 + '@babel/traverse': 7.20.5 + '@babel/types': 7.20.5 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -1813,22 +1813,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms/7.19.6: - resolution: {integrity: sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.20.2 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-module-transforms/7.20.2: resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==} engines: {node: '>=6.9.0'} @@ -1963,17 +1947,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helpers/7.20.0: - resolution: {integrity: sha512-aGMjYraN0zosCEthoGLdqot1oRsmxVTQRHadsUPz5QM44Zej2PYRz7XiDE7GqnkZnNtLbOuxqoZw42vkU7+XEQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helpers/7.20.6: resolution: {integrity: sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==} engines: {node: '>=6.9.0'} @@ -3512,7 +3485,7 @@ packages: '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.13 - '@babel/types': 7.20.0 + '@babel/types': 7.20.5 dev: true /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.18.13: @@ -3526,7 +3499,7 @@ packages: '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.13 - '@babel/types': 7.20.0 + '@babel/types': 7.20.5 dev: true /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.19.6: @@ -3540,7 +3513,7 @@ packages: '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.19.6 - '@babel/types': 7.20.0 + '@babel/types': 7.20.5 dev: true /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.20.5: @@ -3554,7 +3527,7 @@ packages: '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5 - '@babel/types': 7.20.0 + '@babel/types': 7.20.5 dev: true /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.18.13: @@ -4078,24 +4051,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/traverse/7.20.0: - resolution: {integrity: sha512-5+cAXQNARgjRUK0JWu2UBwja4JLSO/rBMPJzpsKb+oBF5xlUuCfljQepS4XypBQoiigL0VQjTZy6WiONtUdScQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.5 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/traverse/7.20.5: resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==} engines: {node: '>=6.9.0'} @@ -4121,15 +4076,6 @@ packages: '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 - /@babel/types/7.20.0: - resolution: {integrity: sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - dev: true - /@babel/types/7.20.5: resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==} engines: {node: '>=6.9.0'} @@ -4989,16 +4935,18 @@ packages: set-cookie-parser: 2.5.1 dev: true - /@mswjs/interceptors/0.15.3: - resolution: {integrity: sha512-GJ1qzBq82EQ3bwhsvw5nScbrLzOSI5H/TyB2CGd1K7dDqX58DJDLJHexiN+S5Ucvl6/84FjRdIysz0RxE/L8MA==} + /@mswjs/interceptors/0.17.6: + resolution: {integrity: sha512-201pBIWehTURb6q8Gheu4Zhvd3Ox1U4BJq5KiOQsYzkWyfiOG4pwcz5hPZIEryztgrf8/sdwABpvY757xMmfrQ==} engines: {node: '>=14'} dependencies: '@open-draft/until': 1.0.3 - '@xmldom/xmldom': 0.7.5 + '@types/debug': 4.1.7 + '@xmldom/xmldom': 0.8.6 debug: 4.3.4 - headers-polyfill: 3.0.10 + headers-polyfill: 3.1.2 outvariant: 1.3.0 - strict-event-emitter: 0.2.4 + strict-event-emitter: 0.2.8 + web-encoding: 1.1.5 transitivePeerDependencies: - supports-color dev: true @@ -6641,7 +6589,7 @@ packages: '@babel/generator': 7.20.0 '@babel/parser': 7.20.5 '@babel/preset-env': 7.18.10_@babel+core@7.18.13 - '@babel/types': 7.20.0 + '@babel/types': 7.20.5 '@mdx-js/mdx': 1.6.22 '@mdx-js/react': 1.6.22_react@17.0.2 '@types/lodash': 4.14.191 @@ -8751,8 +8699,8 @@ packages: tslib: 2.4.1 dev: false - /@xmldom/xmldom/0.7.5: - resolution: {integrity: sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==} + /@xmldom/xmldom/0.8.6: + resolution: {integrity: sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg==} engines: {node: '>=10.0.0'} dev: true @@ -8768,6 +8716,12 @@ packages: resolution: {integrity: sha512-OGyn8dIHBwryU5ZE5gZU5TZ1KSmwDFsRaEFO1cR/sXhf+PlvNlegTNpVUJBQ2uyo4RxxmbRaYUdcUR/wfhCfbg==} dev: true + /@zxing/text-encoding/0.9.0: + resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} + requiresBuild: true + dev: true + optional: true + /abab/2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true @@ -11683,35 +11637,6 @@ packages: stackframe: 1.3.4 dev: true - /es-abstract/1.20.1: - resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - es-to-primitive: 1.2.1 - function-bind: 1.1.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.1.3 - get-symbol-description: 1.0.0 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-symbols: 1.0.3 - internal-slot: 1.0.3 - is-callable: 1.2.4 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-weakref: 1.0.2 - object-inspect: 1.12.2 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 - string.prototype.trimend: 1.0.5 - string.prototype.trimstart: 1.0.5 - unbox-primitive: 1.0.2 - dev: true - /es-abstract/1.20.4: resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==} engines: {node: '>= 0.4'} @@ -13621,8 +13546,8 @@ packages: hasBin: true dev: true - /headers-polyfill/3.0.10: - resolution: {integrity: sha512-lOhQU7iG3AMcjmb8NIWCa+KwfJw5bY44BoWPtrj5A4iDbSD3ylGf5QcYr0ZyQnhkKQ2GgWNLdF2rfrXtXlF3nQ==} + /headers-polyfill/3.1.2: + resolution: {integrity: sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA==} dev: true /hexoid/1.0.0: @@ -14199,6 +14124,13 @@ packages: resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} dev: true + /is-generator-function/1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-glob/3.1.0: resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} engines: {node: '>=0.10.0'} @@ -15802,27 +15734,32 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /msw-storybook-addon/1.6.3_ssm5z5kjlefxgbmyszjdm3lzke: + /msw-storybook-addon/1.6.3_s5cxgiagrgvv4frx3sfmny2xh4: resolution: {integrity: sha512-Ps80WdRmXsmenoTwfrgKMNpQD8INUUFyUFyZOecx8QjuqSlL++UYrLaGyACXN2goOn+/VS6rb0ZapbjrasPClg==} peerDependencies: msw: '>=0.35.0 <1.0.0' dependencies: '@storybook/addons': 6.5.10_sfoxds7t5ydpegc3knd667wn6m is-node-process: 1.0.1 - msw: 0.39.2 + msw: 0.49.2_typescript@4.8.4 transitivePeerDependencies: - react - react-dom dev: true - /msw/0.39.2: - resolution: {integrity: sha512-ju/HpqQpE4/qCxZ23t5Gaau0KREn4QuFzdG28nP1EpidMrymMJuIvNd32+2uGTGG031PMwrC41YW7vCxHOwyHA==} + /msw/0.49.2: + resolution: {integrity: sha512-70/E10f+POE2UmMw16v8PnKatpZplpkUwVRLBqiIdimpgaC3le7y2yOq9JmOrL15jpwWM5wAcPTOj0f550LI3g==} engines: {node: '>=14'} hasBin: true requiresBuild: true + peerDependencies: + typescript: '>= 4.4.x <= 4.9.x' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@mswjs/cookies': 0.2.2 - '@mswjs/interceptors': 0.15.3 + '@mswjs/interceptors': 0.17.6 '@open-draft/until': 1.0.3 '@types/cookie': 0.4.1 '@types/js-levenshtein': 1.1.1 @@ -15830,15 +15767,51 @@ packages: chokidar: 3.5.3 cookie: 0.4.2 graphql: 16.6.0 - headers-polyfill: 3.0.10 + headers-polyfill: 3.1.2 inquirer: 8.2.4 is-node-process: 1.0.1 js-levenshtein: 1.1.6 node-fetch: 2.6.7 + outvariant: 1.3.0 path-to-regexp: 6.2.1 - statuses: 2.0.1 - strict-event-emitter: 0.2.4 - type-fest: 1.4.0 + strict-event-emitter: 0.2.8 + type-fest: 2.19.0 + yargs: 17.5.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /msw/0.49.2_typescript@4.8.4: + resolution: {integrity: sha512-70/E10f+POE2UmMw16v8PnKatpZplpkUwVRLBqiIdimpgaC3le7y2yOq9JmOrL15jpwWM5wAcPTOj0f550LI3g==} + engines: {node: '>=14'} + hasBin: true + requiresBuild: true + peerDependencies: + typescript: '>= 4.4.x <= 4.9.x' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@mswjs/cookies': 0.2.2 + '@mswjs/interceptors': 0.17.6 + '@open-draft/until': 1.0.3 + '@types/cookie': 0.4.1 + '@types/js-levenshtein': 1.1.1 + chalk: 4.1.1 + chokidar: 3.5.3 + cookie: 0.4.2 + graphql: 16.6.0 + headers-polyfill: 3.1.2 + inquirer: 8.2.4 + is-node-process: 1.0.1 + js-levenshtein: 1.1.6 + node-fetch: 2.6.7 + outvariant: 1.3.0 + path-to-regexp: 6.2.1 + strict-event-emitter: 0.2.8 + type-fest: 2.19.0 + typescript: 4.8.4 yargs: 17.5.1 transitivePeerDependencies: - encoding @@ -16221,7 +16194,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.1 + es-abstract: 1.20.4 dev: true /object.getownpropertydescriptors/2.1.4: @@ -18931,8 +18904,8 @@ packages: engines: {node: '>=10.0.0'} dev: true - /strict-event-emitter/0.2.4: - resolution: {integrity: sha512-xIqTLS5azUH1djSUsLH9DbP6UnM/nI18vu8d43JigCQEoVsnY+mrlE+qv6kYqs6/1OkMnMIiL6ffedQSZStuoQ==} + /strict-event-emitter/0.2.8: + resolution: {integrity: sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==} dependencies: events: 3.3.0 dev: true @@ -19849,6 +19822,11 @@ packages: engines: {node: '>=10'} dev: true + /type-fest/2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: true + /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -20441,6 +20419,16 @@ packages: inherits: 2.0.3 dev: true + /util/0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.9 + which-typed-array: 1.1.8 + dev: true + /utila/0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} dev: true @@ -20933,6 +20921,14 @@ packages: defaults: 1.0.3 dev: true + /web-encoding/1.1.5: + resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} + dependencies: + util: 0.12.5 + optionalDependencies: + '@zxing/text-encoding': 0.9.0 + dev: true + /web-namespaces/1.1.4: resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} dev: true