diff options
author | Michael Hunteman <huntemanmt@gmail.com> | 2025-01-24 10:39:16 -0600 |
---|---|---|
committer | Michael Hunteman <huntemanmt@gmail.com> | 2025-01-24 10:39:16 -0600 |
commit | 5713d1f4f04563fb96cbea8907cc1d8cdd3edbc2 (patch) | |
tree | 4d885dbb9f0b994e69c7aa845e9efbb95934189d | |
parent | 30529536ee5137635a9efc483baa05dac198dd0d (diff) |
Update npm packages
-rw-r--r-- | client/package.json | 59 | ||||
-rw-r--r-- | client/public/mockServiceWorker.js | 54 | ||||
-rw-r--r-- | client/src/setup.ts | 11 |
3 files changed, 79 insertions, 45 deletions
diff --git a/client/package.json b/client/package.json index 0849953..4452646 100644 --- a/client/package.json +++ b/client/package.json @@ -11,34 +11,39 @@ "test": "vitest" }, "dependencies": { - "@emotion/react": "^11.13.3", - "@emotion/styled": "^11.13.0", - "@mui/icons-material": "^5.16.7", - "@mui/material": "^5.16.7", - "@mui/x-date-pickers": "^7.14.0", - "@reduxjs/toolkit": "^2.2.1", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@mui/icons-material": "^5.16.14", + "@mui/material": "^5.16.14", + "@mui/x-date-pickers": "^7.24.0", + "@reduxjs/toolkit": "^2.5.0", "export-to-csv": "^1.4.0", - "framer-motion": "^11.17.0", - "material-react-table": "^2.13.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-hook-form": "^7.50.1", - "react-redux": "^9.1.0", - "react-router-dom": "^6.22.0" + "framer-motion": "^11.18.2", + "material-react-table": "^2.13.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-hook-form": "^7.54.2", + "react-redux": "^9.2.0", + "react-router-dom": "^6.28.2" }, "devDependencies": { - "@testing-library/jest-dom": "^6.5.0", - "@testing-library/react": "^16.0.1", - "@testing-library/user-event": "^14.5.2", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "eslint": "^8.56.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.5", - "jsdom": "^25.0.0", - "msw": "^2.2.1", - "typescript": "^5.6.2", - "vite": "^5.4.8", - "vitest": "^2.1.1" + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.2.0", + "@testing-library/user-event": "^14.6.1", + "@typescript-eslint/eslint-plugin": "^8.21.0", + "@typescript-eslint/parser": "^8.21.0", + "eslint": "^9.18.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.18", + "jsdom": "^26.0.0", + "msw": "^2.7.0", + "typescript": "^5.7.3", + "vite": "^6.0.11", + "vitest": "^3.0.3" + }, + "msw": { + "workerDirectory": [ + "public" + ] } -} +}
\ No newline at end of file diff --git a/client/public/mockServiceWorker.js b/client/public/mockServiceWorker.js index 919d3e1..ec47a9a 100644 --- a/client/public/mockServiceWorker.js +++ b/client/public/mockServiceWorker.js @@ -2,13 +2,14 @@ /* tslint:disable */ /** - * Mock Service Worker (2.2.1). + * Mock Service Worker. * @see https://github.com/mswjs/msw * - Please do NOT modify this file. * - Please do NOT serve this file on production. */ -const INTEGRITY_CHECKSUM = '223d191a56023cd36aa88c802961b911' +const PACKAGE_VERSION = '2.7.0' +const INTEGRITY_CHECKSUM = '00729d72e3b82faf54ca8b9621dbb96f' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() @@ -48,7 +49,10 @@ self.addEventListener('message', async function (event) { case 'INTEGRITY_CHECK_REQUEST': { sendToClient(client, { type: 'INTEGRITY_CHECK_RESPONSE', - payload: INTEGRITY_CHECKSUM, + payload: { + packageVersion: PACKAGE_VERSION, + checksum: INTEGRITY_CHECKSUM, + }, }) break } @@ -58,7 +62,12 @@ self.addEventListener('message', async function (event) { sendToClient(client, { type: 'MOCKING_ENABLED', - payload: true, + payload: { + client: { + id: client.id, + frameType: client.frameType, + }, + }, }) break } @@ -151,6 +160,10 @@ async function handleRequest(event, requestId) { async function resolveMainClient(event) { const client = await self.clients.get(event.clientId) + if (activeClientIds.has(event.clientId)) { + return client + } + if (client?.frameType === 'top-level') { return client } @@ -179,12 +192,26 @@ async function getResponse(event, client, requestId) { const requestClone = request.clone() function passthrough() { - const headers = Object.fromEntries(requestClone.headers.entries()) + // Cast the request headers to a new Headers instance + // so the headers can be manipulated with. + const headers = new Headers(requestClone.headers) + + // Remove the "accept" header value that marked this request as passthrough. + // This prevents request alteration and also keeps it compliant with the + // user-defined CORS policies. + const acceptHeader = headers.get('accept') + if (acceptHeader) { + const values = acceptHeader.split(',').map((value) => value.trim()) + const filteredValues = values.filter( + (value) => value !== 'msw/passthrough', + ) - // Remove internal MSW request header so the passthrough request - // complies with any potential CORS preflight checks on the server. - // Some servers forbid unknown request headers. - delete headers['x-msw-intention'] + if (filteredValues.length > 0) { + headers.set('accept', filteredValues.join(', ')) + } else { + headers.delete('accept') + } + } return fetch(requestClone, { headers }) } @@ -202,13 +229,6 @@ async function getResponse(event, client, requestId) { return passthrough() } - // Bypass requests with the explicit bypass header. - // Such requests can be issued by "ctx.fetch()". - const mswIntention = request.headers.get('x-msw-intention') - if (['bypass', 'passthrough'].includes(mswIntention)) { - return passthrough() - } - // Notify the client that a request has been intercepted. const requestBuffer = await request.arrayBuffer() const clientMessage = await sendToClient( @@ -240,7 +260,7 @@ async function getResponse(event, client, requestId) { return respondWithMock(clientMessage.data) } - case 'MOCK_NOT_FOUND': { + case 'PASSTHROUGH': { return passthrough() } } diff --git a/client/src/setup.ts b/client/src/setup.ts index 0abb5f3..d72d646 100644 --- a/client/src/setup.ts +++ b/client/src/setup.ts @@ -1,6 +1,15 @@ -import { afterAll, afterEach, beforeAll } from 'vitest'; +import { afterAll, afterEach, beforeAll, beforeEach, vitest } from 'vitest'; import { server } from './mocks/server'; beforeAll(() => server.listen({ onUnhandledRequest: 'error' })); +beforeEach(() => { + const mockIntersectionObserver = vitest.fn(); + mockIntersectionObserver.mockReturnValue({ + observe: () => this, + unobserve: () => this, + disconnect: () => this, + }); + window.IntersectionObserver = mockIntersectionObserver; +}) afterAll(() => server.close()); afterEach(() => server.resetHandlers()); |