From c627a68e96caca359bb406be61313c8790703bb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=B1=E3=82=A4=E3=83=A9?= Date: Fri, 31 Oct 2025 15:15:30 -0600 Subject: [PATCH] chore: migrate some tests from jest to vitest (#20568) --- site/.knip.jsonc | 5 +- site/jest.config.ts | 2 +- site/package.json | 14 +- site/pnpm-lock.yaml | 558 +++++++++++++++++- site/src/api/{api.test.ts => api.jest.ts} | 0 site/src/api/api.ts | 2 +- .../ConfirmDialog/ConfirmDialog.test.tsx | 6 +- .../DeleteDialog/DeleteDialog.test.tsx | 12 +- .../components/FileUpload/FileUpload.test.tsx | 6 +- .../components/GlobalSnackbar/utils.test.ts | 21 +- ...test.tsx => PaginationWidgetBase.jest.tsx} | 0 ...Context.test.tsx => ProxyContext.jest.tsx} | 0 site/src/contexts/auth/AuthProvider.test.tsx | 33 -- ...uireAuth.test.tsx => RequireAuth.jest.tsx} | 0 .../{debounce.test.ts => debounce.jest.ts} | 0 site/src/hooks/events.test.ts | 4 +- site/src/hooks/hookPolyfills.test.ts | 6 +- site/src/hooks/useClickable.test.tsx | 16 +- ...ipboard.test.tsx => useClipboard.jest.tsx} | 0 ...ta.test.ts => useEmbeddedMetadata.jest.ts} | 0 ...uery.test.ts => usePaginatedQuery.jest.ts} | 8 +- ...Key.test.ts => useSearchParamsKey.jest.ts} | 0 ...yout.test.tsx => DashboardLayout.jest.tsx} | 0 .../modules/dashboard/Navbar/Navbar.test.tsx | 64 -- .../dashboard/Navbar/NavbarView.test.tsx | 104 ---- .../UserDropdown/UserDropdownContent.test.tsx | 4 +- ...Check.test.tsx => useUpdateCheck.jest.tsx} | 0 .../resources/PortForwardPopoverView.test.tsx | 40 -- ...s.test.tsx => useAgentContainers.jest.tsx} | 0 ...AgentLogs.test.ts => useAgentLogs.jest.ts} | 0 ...cParameterFlowDeprecationWarning.jest.tsx} | 0 ...ter.test.tsx => DynamicParameter.jest.tsx} | 0 ...t.tsx => useWorkspaceDuplication.jest.tsx} | 0 ...{AuditPage.test.tsx => AuditPage.jest.tsx} | 0 ...ge.test.tsx => ConnectionLogPage.jest.tsx} | 0 .../CreateTemplateGalleryPage.test.tsx | 53 -- ...e.test.tsx => CreateTemplatePage.jest.tsx} | 0 ...Page.test.tsx => CreateTokenPage.jest.tsx} | 0 ...rPage.test.tsx => CreateUserPage.jest.tsx} | 0 ....test.tsx => CreateWorkspacePage.jest.tsx} | 0 ... CreateWorkspacePageExperimental.jest.tsx} | 0 ...{LoginPage.test.tsx => LoginPage.jest.tsx} | 0 ...t.tsx => OrganizationMembersPage.jest.tsx} | 0 ...test.tsx => OrganizationRedirect.jest.tsx} | 0 ...{SetupPage.test.tsx => SetupPage.jest.tsx} | 0 ...ge.test.tsx => TemplateEmbedPage.jest.tsx} | 0 ...ge.test.tsx => TemplateFilesPage.jest.tsx} | 0 ...sx => TemplateRedirectController.jest.tsx} | 0 ...test.ts => useDeletionDialogState.jest.ts} | 0 ...test.tsx => TemplateSettingsPage.jest.tsx} | 0 ...test.tsx => TemplateSchedulePage.jest.tsx} | 0 ...est.tsx => TemplateVariablesPage.jest.tsx} | 0 ...tsx => TemplateVersionEditorPage.jest.tsx} | 0 ....test.tsx => TemplateVersionPage.jest.tsx} | 0 ...nalPage.test.tsx => TerminalPage.jest.tsx} | 0 ...ountPage.test.tsx => AccountPage.jest.tsx} | 0 ...ePage.test.tsx => AppearancePage.jest.tsx} | 0 ...KeysPage.test.tsx => SSHKeysPage.jest.tsx} | 0 ...ulePage.test.tsx => SchedulePage.jest.tsx} | 0 ...ityPage.test.tsx => SecurityPage.jest.tsx} | 0 ...e.test.tsx => WorkspaceBuildPage.jest.tsx} | 0 ...cePage.test.tsx => WorkspacePage.jest.tsx} | 0 ...tsx => WorkspaceScheduleControls.jest.tsx} | 0 ...t.tsx => WorkspaceParametersPage.jest.tsx} | 0 ...est.tsx => WorkspaceScheduleForm.jest.tsx} | 9 +- ...est.tsx => WorkspaceSchedulePage.jest.tsx} | 0 ...est.tsx => WorkspaceSettingsPage.jest.tsx} | 0 ...sPage.test.tsx => WorkspacesPage.jest.tsx} | 0 site/src/testHelpers/entities.ts | 4 - ...{websockets.test.ts => websockets.jest.ts} | 0 ...Socket.test.ts => OneWayWebSocket.jest.ts} | 0 site/src/utils/events.test.ts | 18 +- .../{formUtils.test.ts => formUtils.jest.ts} | 0 site/src/utils/{tar.test.ts => tar.jest.ts} | 0 site/src/utils/tar.ts | 2 +- site/tsconfig.json | 2 +- site/vite.config.mts | 11 +- 77 files changed, 629 insertions(+), 375 deletions(-) rename site/src/api/{api.test.ts => api.jest.ts} (100%) rename site/src/components/PaginationWidget/{PaginationWidgetBase.test.tsx => PaginationWidgetBase.jest.tsx} (100%) rename site/src/contexts/{ProxyContext.test.tsx => ProxyContext.jest.tsx} (100%) delete mode 100644 site/src/contexts/auth/AuthProvider.test.tsx rename site/src/contexts/auth/{RequireAuth.test.tsx => RequireAuth.jest.tsx} (100%) rename site/src/hooks/{debounce.test.ts => debounce.jest.ts} (100%) rename site/src/hooks/{useClipboard.test.tsx => useClipboard.jest.tsx} (100%) rename site/src/hooks/{useEmbeddedMetadata.test.ts => useEmbeddedMetadata.jest.ts} (100%) rename site/src/hooks/{usePaginatedQuery.test.ts => usePaginatedQuery.jest.ts} (96%) rename site/src/hooks/{useSearchParamsKey.test.ts => useSearchParamsKey.jest.ts} (100%) rename site/src/modules/dashboard/{DashboardLayout.test.tsx => DashboardLayout.jest.tsx} (100%) delete mode 100644 site/src/modules/dashboard/Navbar/Navbar.test.tsx delete mode 100644 site/src/modules/dashboard/Navbar/NavbarView.test.tsx rename site/src/modules/dashboard/{useUpdateCheck.test.tsx => useUpdateCheck.jest.tsx} (100%) delete mode 100644 site/src/modules/resources/PortForwardPopoverView.test.tsx rename site/src/modules/resources/{useAgentContainers.test.tsx => useAgentContainers.jest.tsx} (100%) rename site/src/modules/resources/{useAgentLogs.test.ts => useAgentLogs.jest.ts} (100%) rename site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/{ClassicParameterFlowDeprecationWarning.test.tsx => ClassicParameterFlowDeprecationWarning.jest.tsx} (100%) rename site/src/modules/workspaces/DynamicParameter/{DynamicParameter.test.tsx => DynamicParameter.jest.tsx} (100%) rename site/src/modules/workspaces/WorkspaceMoreActions/{useWorkspaceDuplication.test.tsx => useWorkspaceDuplication.jest.tsx} (100%) rename site/src/pages/AuditPage/{AuditPage.test.tsx => AuditPage.jest.tsx} (100%) rename site/src/pages/ConnectionLogPage/{ConnectionLogPage.test.tsx => ConnectionLogPage.jest.tsx} (100%) delete mode 100644 site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.test.tsx rename site/src/pages/CreateTemplatePage/{CreateTemplatePage.test.tsx => CreateTemplatePage.jest.tsx} (100%) rename site/src/pages/CreateTokenPage/{CreateTokenPage.test.tsx => CreateTokenPage.jest.tsx} (100%) rename site/src/pages/CreateUserPage/{CreateUserPage.test.tsx => CreateUserPage.jest.tsx} (100%) rename site/src/pages/CreateWorkspacePage/{CreateWorkspacePage.test.tsx => CreateWorkspacePage.jest.tsx} (100%) rename site/src/pages/CreateWorkspacePage/{CreateWorkspacePageExperimental.test.tsx => CreateWorkspacePageExperimental.jest.tsx} (100%) rename site/src/pages/LoginPage/{LoginPage.test.tsx => LoginPage.jest.tsx} (100%) rename site/src/pages/OrganizationSettingsPage/{OrganizationMembersPage.test.tsx => OrganizationMembersPage.jest.tsx} (100%) rename site/src/pages/OrganizationSettingsPage/{OrganizationRedirect.test.tsx => OrganizationRedirect.jest.tsx} (100%) rename site/src/pages/SetupPage/{SetupPage.test.tsx => SetupPage.jest.tsx} (100%) rename site/src/pages/TemplatePage/TemplateEmbedPage/{TemplateEmbedPage.test.tsx => TemplateEmbedPage.jest.tsx} (100%) rename site/src/pages/TemplatePage/TemplateFilesPage/{TemplateFilesPage.test.tsx => TemplateFilesPage.jest.tsx} (100%) rename site/src/pages/TemplatePage/{TemplateRedirectController.test.tsx => TemplateRedirectController.jest.tsx} (100%) rename site/src/pages/TemplatePage/{useDeletionDialogState.test.ts => useDeletionDialogState.jest.ts} (100%) rename site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/{TemplateSettingsPage.test.tsx => TemplateSettingsPage.jest.tsx} (100%) rename site/src/pages/TemplateSettingsPage/TemplateSchedulePage/{TemplateSchedulePage.test.tsx => TemplateSchedulePage.jest.tsx} (100%) rename site/src/pages/TemplateSettingsPage/TemplateVariablesPage/{TemplateVariablesPage.test.tsx => TemplateVariablesPage.jest.tsx} (100%) rename site/src/pages/TemplateVersionEditorPage/{TemplateVersionEditorPage.test.tsx => TemplateVersionEditorPage.jest.tsx} (100%) rename site/src/pages/TemplateVersionPage/{TemplateVersionPage.test.tsx => TemplateVersionPage.jest.tsx} (100%) rename site/src/pages/TerminalPage/{TerminalPage.test.tsx => TerminalPage.jest.tsx} (100%) rename site/src/pages/UserSettingsPage/AccountPage/{AccountPage.test.tsx => AccountPage.jest.tsx} (100%) rename site/src/pages/UserSettingsPage/AppearancePage/{AppearancePage.test.tsx => AppearancePage.jest.tsx} (100%) rename site/src/pages/UserSettingsPage/SSHKeysPage/{SSHKeysPage.test.tsx => SSHKeysPage.jest.tsx} (100%) rename site/src/pages/UserSettingsPage/SchedulePage/{SchedulePage.test.tsx => SchedulePage.jest.tsx} (100%) rename site/src/pages/UserSettingsPage/SecurityPage/{SecurityPage.test.tsx => SecurityPage.jest.tsx} (100%) rename site/src/pages/WorkspaceBuildPage/{WorkspaceBuildPage.test.tsx => WorkspaceBuildPage.jest.tsx} (100%) rename site/src/pages/WorkspacePage/{WorkspacePage.test.tsx => WorkspacePage.jest.tsx} (100%) rename site/src/pages/WorkspacePage/{WorkspaceScheduleControls.test.tsx => WorkspaceScheduleControls.jest.tsx} (100%) rename site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/{WorkspaceParametersPage.test.tsx => WorkspaceParametersPage.jest.tsx} (100%) rename site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/{WorkspaceScheduleForm.test.tsx => WorkspaceScheduleForm.jest.tsx} (99%) rename site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/{WorkspaceSchedulePage.test.tsx => WorkspaceSchedulePage.jest.tsx} (100%) rename site/src/pages/WorkspaceSettingsPage/{WorkspaceSettingsPage.test.tsx => WorkspaceSettingsPage.jest.tsx} (100%) rename site/src/pages/WorkspacesPage/{WorkspacesPage.test.tsx => WorkspacesPage.jest.tsx} (100%) rename site/src/testHelpers/{websockets.test.ts => websockets.jest.ts} (100%) rename site/src/utils/{OneWayWebSocket.test.ts => OneWayWebSocket.jest.ts} (100%) rename site/src/utils/{formUtils.test.ts => formUtils.jest.ts} (100%) rename site/src/utils/{tar.test.ts => tar.jest.ts} (100%) diff --git a/site/.knip.jsonc b/site/.knip.jsonc index 1d620f9134..312d4a9782 100644 --- a/site/.knip.jsonc +++ b/site/.knip.jsonc @@ -8,5 +8,8 @@ "@types/react-virtualized-auto-sizer", "jest_workaround", "ts-proto" - ] + ], + "jest": { + "entry": "./src/**/*.jest.{ts,tsx}" + } } diff --git a/site/jest.config.ts b/site/jest.config.ts index 887b91fb9d..5ee9ec7ebd 100644 --- a/site/jest.config.ts +++ b/site/jest.config.ts @@ -31,7 +31,7 @@ module.exports = { testEnvironmentOptions: { customExportConditions: [""], }, - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$", + testRegex: "(/__tests__/.*|(\\.|/)(jest))\\.tsx?$", testPathIgnorePatterns: [ "/node_modules/", "/e2e/", diff --git a/site/package.json b/site/package.json index 7b74cfae58..43281f5453 100644 --- a/site/package.json +++ b/site/package.json @@ -27,10 +27,10 @@ "storybook": "STORYBOOK=true storybook dev -p 6006", "storybook:build": "storybook build", "storybook:ci": "storybook build --test", - "test": "jest", - "test:ci": "jest --selectProjects test --silent", - "test:coverage": "jest --selectProjects test --collectCoverage", - "test:watch": "jest --selectProjects test --watch", + "test": "vitest run && jest", + "test:ci": "vitest run && jest --silent", + "test:watch": "vitest", + "test:watch-jest": "jest --watch", "stats": "STATS=true pnpm build && npx http-server ./stats -p 8081 -c-1", "update-emojis": "cp -rf ./node_modules/emoji-datasource-apple/img/apple/64/* ./static/emojis" }, @@ -133,7 +133,7 @@ "@swc/core": "1.3.38", "@swc/jest": "0.2.37", "@tailwindcss/typography": "0.5.16", - "@testing-library/jest-dom": "6.6.3", + "@testing-library/jest-dom": "6.9.1", "@testing-library/react": "14.3.1", "@testing-library/user-event": "14.6.1", "@types/chroma-js": "2.4.0", @@ -167,6 +167,7 @@ "jest-location-mock": "2.0.0", "jest-websocket-mock": "2.5.0", "jest_workaround": "0.1.14", + "jsdom": "27.0.1", "knip": "5.64.1", "msw": "2.4.8", "postcss": "8.5.6", @@ -180,7 +181,8 @@ "ts-proto": "1.181.2", "typescript": "5.6.3", "vite": "7.1.11", - "vite-plugin-checker": "0.11.0" + "vite-plugin-checker": "0.11.0", + "vitest": "4.0.5" }, "browserslist": [ "chrome 110", diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml index c70eff146b..b70a5b7553 100644 --- a/site/pnpm-lock.yaml +++ b/site/pnpm-lock.yaml @@ -309,8 +309,8 @@ importers: specifier: 0.5.16 version: 0.5.16(tailwindcss@3.4.18(yaml@2.7.0)) '@testing-library/jest-dom': - specifier: 6.6.3 - version: 6.6.3 + specifier: 6.9.1 + version: 6.9.1 '@testing-library/react': specifier: 14.3.1 version: 14.3.1(@types/react@19.1.17)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -410,6 +410,9 @@ importers: jest_workaround: specifier: 0.1.14 version: 0.1.14(@swc/core@1.3.38)(@swc/jest@0.2.37(@swc/core@1.3.38)) + jsdom: + specifier: 27.0.1 + version: 27.0.1 knip: specifier: 5.64.1 version: 5.64.1(@types/node@20.17.16)(typescript@5.6.3) @@ -452,6 +455,9 @@ importers: vite-plugin-checker: specifier: 0.11.0 version: 0.11.0(@biomejs/biome@2.2.4)(eslint@8.52.0)(optionator@0.9.3)(typescript@5.6.3)(vite@7.1.11(@types/node@20.17.16)(jiti@1.21.7)(yaml@2.7.0)) + vitest: + specifier: 4.0.5 + version: 4.0.5(@types/debug@4.1.12)(@types/node@20.17.16)(jiti@1.21.7)(jsdom@27.0.1)(msw@2.4.8(typescript@5.6.3))(yaml@2.7.0) packages: @@ -466,6 +472,15 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, tarball: https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz} engines: {node: '>=10'} + '@asamuzakjp/css-color@4.0.5': + resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==, tarball: https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.0.5.tgz} + + '@asamuzakjp/dom-selector@6.7.3': + resolution: {integrity: sha512-kiGFeY+Hxf5KbPpjRLf+ffWbkos1aGo8MBfd91oxS3O57RgU3XhZrt/6UzoVF9VMpWbC3v87SRc9jxGrc9qHtQ==, tarball: https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.7.3.tgz} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==, tarball: https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==, tarball: https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz} engines: {node: '>=6.9.0'} @@ -727,6 +742,38 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, tarball: https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz} engines: {node: '>=12'} + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==, tarball: https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==, tarball: https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==, tarball: https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==, tarball: https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.15': + resolution: {integrity: sha512-q0p6zkVq2lJnmzZVPR33doA51G7YOja+FBvRdp5ISIthL0MtFCgYHHhR563z9WFGxcOn0WfjSkPDJ5Qig3H3Sw==, tarball: https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.15.tgz} + engines: {node: '>=18'} + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==, tarball: https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz} + engines: {node: '>=18'} + '@emnapi/core@1.5.0': resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==, tarball: https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz} @@ -2557,6 +2604,9 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==, tarball: https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==, tarball: https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz} + '@storybook/addon-docs@9.1.2': resolution: {integrity: sha512-U3eHJ8lQFfEZ/OcgdKkUBbW2Y2tpAsHfy8lQOBgs5Pgj9biHEJcUmq+drOS/sJhle673eoBcUFmspXulI4KP1w==, tarball: https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-9.1.2.tgz} peerDependencies: @@ -2728,8 +2778,8 @@ packages: resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==, tarball: https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz} engines: {node: '>=14'} - '@testing-library/jest-dom@6.6.3': - resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==, tarball: https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz} + '@testing-library/jest-dom@6.9.1': + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==, tarball: https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} '@testing-library/react@14.3.1': @@ -3057,6 +3107,9 @@ packages: '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==, tarball: https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz} + '@vitest/expect@4.0.5': + resolution: {integrity: sha512-DJctLVlKoddvP/G389oGmKWNG6GD9frm2FPXARziU80Rjo7SIYxQzb2YFzmQ4fVD3Q5utUYY8nUmWrqsuIlIXQ==, tarball: https://registry.npmjs.org/@vitest/expect/-/expect-4.0.5.tgz} + '@vitest/mocker@3.2.4': resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==, tarball: https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz} peerDependencies: @@ -3068,15 +3121,41 @@ packages: vite: optional: true + '@vitest/mocker@4.0.5': + resolution: {integrity: sha512-iYHIy72LfbK+mL5W8zXROp6oOcJKXWeKcNjcPPsqoa18qIEDrhB6/Z08o0wRajTd6SSSDNw8NCSIHVNOMpz0mw==, tarball: https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.5.tgz} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz} + '@vitest/pretty-format@4.0.5': + resolution: {integrity: sha512-t1T/sSdsYyNc5AZl0EMeD0jW9cpJe2cODP0R++ZQe1kTkpgrwEfxGFR/yCG4w8ZybizbXRTHU7lE8sTDD/QsGw==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.5.tgz} + + '@vitest/runner@4.0.5': + resolution: {integrity: sha512-CQVVe+YEeKSiFBD5gBAmRDQglm4PnMBYzeTmt06t5iWtsUN9StQeeKhYCea/oaqBYilf8sARG6fSctUcEL/UmQ==, tarball: https://registry.npmjs.org/@vitest/runner/-/runner-4.0.5.tgz} + + '@vitest/snapshot@4.0.5': + resolution: {integrity: sha512-jfmSAeR6xYNEvcD+/RxFGA1bzpqHtkVhgxo2cxXia+Q3xX7m6GpZij07rz+WyQcA/xEGn4eIS1OItkMyWsGBmQ==, tarball: https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.5.tgz} + '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==, tarball: https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz} + '@vitest/spy@4.0.5': + resolution: {integrity: sha512-TUmVQpAQign7r8+EnZsgTF3vY9BdGofTUge1rGNbnHn2IN3FChiQoT9lrPz7A7AVUZJU2LAZXl4v66HhsNMhoA==, tarball: https://registry.npmjs.org/@vitest/spy/-/spy-4.0.5.tgz} + '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz} + '@vitest/utils@4.0.5': + resolution: {integrity: sha512-V5RndUgCB5/AfNvK9zxGCrRs99IrPYtMTIdUzJMMFs9nrmE5JXExIEfjVtUteyTRiLfCm+dCRMHf/Uu7Mm8/dg==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-4.0.5.tgz} + '@xterm/addon-canvas@0.7.0': resolution: {integrity: sha512-LF5LYcfvefJuJ7QotNRdRSPc9YASAVDeoT5uyXS/nZshZXjYplGXRECBGiznwvhNL2I8bq1Lf5MzRwstsYQ2Iw==, tarball: https://registry.npmjs.org/@xterm/addon-canvas/-/addon-canvas-0.7.0.tgz} peerDependencies: @@ -3144,6 +3223,10 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, tarball: https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz} engines: {node: '>= 6.0.0'} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==, tarball: https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz} + engines: {node: '>= 14'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, tarball: https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz} @@ -3304,6 +3387,9 @@ packages: resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==, tarball: https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz} engines: {node: '>=12.0.0'} + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==, tarball: https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, tarball: https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz} engines: {node: '>=8'} @@ -3390,9 +3476,9 @@ packages: resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==, tarball: https://registry.npmjs.org/chai/-/chai-5.2.1.tgz} engines: {node: '>=18'} - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==, tarball: https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz} - engines: {node: '>=8'} + chai@6.2.0: + resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==, tarball: https://registry.npmjs.org/chai/-/chai-6.2.0.tgz} + engines: {node: '>=18'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, tarball: https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz} @@ -3599,6 +3685,10 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, tarball: https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz} engines: {node: '>= 8'} + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==, tarball: https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==, tarball: https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz} @@ -3620,6 +3710,10 @@ packages: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==, tarball: https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz} engines: {node: '>=8'} + cssstyle@5.3.1: + resolution: {integrity: sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==, tarball: https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.1.tgz} + engines: {node: '>=20'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, tarball: https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz} @@ -3671,6 +3765,10 @@ packages: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==, tarball: https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz} engines: {node: '>=12'} + data-urls@6.0.0: + resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==, tarball: https://registry.npmjs.org/data-urls/-/data-urls-6.0.0.tgz} + engines: {node: '>=20'} + date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==, tarball: https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz} engines: {node: '>=0.11'} @@ -3710,6 +3808,9 @@ packages: decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, tarball: https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==, tarball: https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz} + decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==, tarball: https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz} @@ -3869,6 +3970,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, tarball: https://registry.npmjs.org/entities/-/entities-4.5.0.tgz} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==, tarball: https://registry.npmjs.org/entities/-/entities-6.0.1.tgz} + engines: {node: '>=0.12'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, tarball: https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz} @@ -3883,6 +3988,9 @@ packages: es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==, tarball: https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==, tarball: https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, tarball: https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz} engines: {node: '>= 0.4'} @@ -3993,6 +4101,10 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, tarball: https://registry.npmjs.org/exit/-/exit-0.1.2.tgz} engines: {node: '>= 0.8.0'} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==, tarball: https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz} + engines: {node: '>=12.0.0'} + expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==, tarball: https://registry.npmjs.org/expect/-/expect-29.7.0.tgz} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4278,6 +4390,10 @@ packages: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==, tarball: https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz} engines: {node: '>=12'} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==, tarball: https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz} + engines: {node: '>=18'} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, tarball: https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz} @@ -4292,10 +4408,18 @@ packages: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, tarball: https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz} engines: {node: '>= 6'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==, tarball: https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz} + engines: {node: '>= 14'} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, tarball: https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz} engines: {node: '>= 6'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==, tarball: https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz} + engines: {node: '>= 14'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, tarball: https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz} engines: {node: '>=10.17.0'} @@ -4751,6 +4875,15 @@ packages: canvas: optional: true + jsdom@27.0.1: + resolution: {integrity: sha512-SNSQteBL1IlV2zqhwwolaG9CwhIhTvVHWg3kTss/cLE7H/X4644mtPQqYvCfsSrGQWt9hSZcgOXX8bOZaMN+kA==, tarball: https://registry.npmjs.org/jsdom/-/jsdom-27.0.1.tgz} + engines: {node: '>=20'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, tarball: https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz} engines: {node: '>=6'} @@ -4868,6 +5001,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz} @@ -4887,6 +5024,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==, tarball: https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==, tarball: https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, tarball: https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz} engines: {node: '>=10'} @@ -4952,6 +5092,9 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, tarball: https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz} + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==, tarball: https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, tarball: https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz} engines: {node: '>= 0.6'} @@ -5278,6 +5421,9 @@ packages: parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, tarball: https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz} + parse5@8.0.0: + resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==, tarball: https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, tarball: https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz} engines: {node: '>= 0.8'} @@ -5319,6 +5465,9 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, tarball: https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, tarball: https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz} + pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==, tarball: https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz} engines: {node: '>= 14.16'} @@ -5727,6 +5876,10 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, tarball: https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, tarball: https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz} + engines: {node: '>=0.10.0'} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, tarball: https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz} @@ -5785,6 +5938,9 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==, tarball: https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, tarball: https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz} @@ -5864,6 +6020,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, tarball: https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, tarball: https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, tarball: https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz} @@ -5918,6 +6077,9 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, tarball: https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz} engines: {node: '>=10'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, tarball: https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz} + state-local@1.0.7: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==, tarball: https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz} @@ -5929,6 +6091,9 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==, tarball: https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==, tarball: https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz} + stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==, tarball: https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz} engines: {node: '>= 0.4'} @@ -6084,9 +6249,15 @@ packages: tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==, tarball: https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, tarball: https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz} + tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==, tarball: https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, tarball: https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==, tarball: https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz} engines: {node: '>=12.0.0'} @@ -6095,10 +6266,21 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==, tarball: https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz} engines: {node: '>=14.0.0'} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==, tarball: https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz} + engines: {node: '>=14.0.0'} + tinyspy@4.0.3: resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==, tarball: https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz} engines: {node: '>=14.0.0'} + tldts-core@7.0.17: + resolution: {integrity: sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g==, tarball: https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.17.tgz} + + tldts@7.0.17: + resolution: {integrity: sha512-Y1KQBgDd/NUc+LfOtKS6mNsC9CCaH+m2P1RoIZy7RAPo3C3/t8X45+zgut31cRZtZ3xKPjfn3TkGTrctC2TQIQ==, tarball: https://registry.npmjs.org/tldts/-/tldts-7.0.17.tgz} + hasBin: true + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, tarball: https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz} @@ -6117,10 +6299,18 @@ packages: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==, tarball: https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz} engines: {node: '>=6'} + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==, tarball: https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz} + engines: {node: '>=16'} + tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==, tarball: https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz} engines: {node: '>=12'} + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==, tarball: https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz} + engines: {node: '>=20'} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, tarball: https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz} @@ -6444,6 +6634,40 @@ packages: yaml: optional: true + vitest@4.0.5: + resolution: {integrity: sha512-4H+J28MI5oeYgGg3h5BFSkQ1g/2GKK1IR8oorH3a6EQQbb7CwjbnyBjH4PGxw9/6vpwAPNzaeUMp4Js4WJmdXQ==, tarball: https://registry.npmjs.org/vitest/-/vitest-4.0.5.tgz} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.5 + '@vitest/browser-preview': 4.0.5 + '@vitest/browser-webdriverio': 4.0.5 + '@vitest/ui': 4.0.5 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==, tarball: https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz} @@ -6451,6 +6675,10 @@ packages: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==, tarball: https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz} engines: {node: '>=14'} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==, tarball: https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz} + engines: {node: '>=18'} + walk-up-path@4.0.0: resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==, tarball: https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz} engines: {node: 20 || >=22} @@ -6465,6 +6693,10 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, tarball: https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz} engines: {node: '>=12'} + webidl-conversions@8.0.0: + resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==, tarball: https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.0.tgz} + engines: {node: '>=20'} + webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, tarball: https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz} engines: {node: '>=10.13.0'} @@ -6479,14 +6711,26 @@ packages: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==, tarball: https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz} engines: {node: '>=12'} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==, tarball: https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz} + engines: {node: '>=18'} + whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==, tarball: https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz} engines: {node: '>=12'} + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==, tarball: https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz} + engines: {node: '>=18'} + whatwg-url@11.0.0: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==, tarball: https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz} engines: {node: '>=12'} + whatwg-url@15.1.0: + resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==, tarball: https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz} + engines: {node: '>=20'} + which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, tarball: https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz} @@ -6502,6 +6746,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, tarball: https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz} + engines: {node: '>=8'} + hasBin: true + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, tarball: https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz} engines: {node: '>=8'} @@ -6545,10 +6794,26 @@ packages: utf-8-validate: optional: true + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==, tarball: https://registry.npmjs.org/ws/-/ws-8.18.3.tgz} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==, tarball: https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz} engines: {node: '>=12'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==, tarball: https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz} + engines: {node: '>=18'} + xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, tarball: https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz} @@ -6614,6 +6879,24 @@ snapshots: '@alloc/quick-lru@5.2.0': {} + '@asamuzakjp/css-color@4.0.5': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 11.2.2 + + '@asamuzakjp/dom-selector@6.7.3': + dependencies: + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.1.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.2.2 + + '@asamuzakjp/nwsapi@2.3.9': {} + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -6899,6 +7182,28 @@ snapshots: '@jridgewell/trace-mapping': 0.3.9 optional: true + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.15': {} + + '@csstools/css-tokenizer@3.0.4': {} + '@emnapi/core@1.5.0': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -8640,6 +8945,8 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.0 + '@standard-schema/spec@1.0.0': {} + '@storybook/addon-docs@9.1.2(@types/react@19.1.17)(storybook@9.1.2(@testing-library/dom@10.4.0)(msw@2.4.8(typescript@5.6.3))(prettier@3.4.1)(vite@7.1.11(@types/node@20.17.16)(jiti@1.21.7)(yaml@2.7.0)))': dependencies: '@mdx-js/react': 3.0.1(@types/react@19.1.17)(react@19.1.1) @@ -8817,14 +9124,13 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.6.3': + '@testing-library/jest-dom@6.9.1': dependencies: '@adobe/css-tools': 4.4.1 aria-query: 5.3.2 - chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 - lodash: 4.17.21 + picocolors: 1.1.1 redent: 3.0.0 '@testing-library/react@14.3.1(@types/react@19.1.17)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': @@ -9178,6 +9484,15 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 + '@vitest/expect@4.0.5': + dependencies: + '@standard-schema/spec': 1.0.0 + '@types/chai': 5.2.2 + '@vitest/spy': 4.0.5 + '@vitest/utils': 4.0.5 + chai: 6.2.0 + tinyrainbow: 3.0.3 + '@vitest/mocker@3.2.4(msw@2.4.8(typescript@5.6.3))(vite@7.1.11(@types/node@20.17.16)(jiti@1.21.7)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.2.4 @@ -9187,20 +9502,51 @@ snapshots: msw: 2.4.8(typescript@5.6.3) vite: 7.1.11(@types/node@20.17.16)(jiti@1.21.7)(yaml@2.7.0) + '@vitest/mocker@4.0.5(msw@2.4.8(typescript@5.6.3))(vite@7.1.11(@types/node@20.17.16)(jiti@1.21.7)(yaml@2.7.0))': + dependencies: + '@vitest/spy': 4.0.5 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.4.8(typescript@5.6.3) + vite: 7.1.11(@types/node@20.17.16)(jiti@1.21.7)(yaml@2.7.0) + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 + '@vitest/pretty-format@4.0.5': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.5': + dependencies: + '@vitest/utils': 4.0.5 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.5': + dependencies: + '@vitest/pretty-format': 4.0.5 + magic-string: 0.30.21 + pathe: 2.0.3 + '@vitest/spy@3.2.4': dependencies: tinyspy: 4.0.3 + '@vitest/spy@4.0.5': {} + '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 loupe: 3.2.0 tinyrainbow: 2.0.0 + '@vitest/utils@4.0.5': + dependencies: + '@vitest/pretty-format': 4.0.5 + tinyrainbow: 3.0.3 + '@xterm/addon-canvas@0.7.0(@xterm/xterm@5.5.0)': dependencies: '@xterm/xterm': 5.5.0 @@ -9257,6 +9603,8 @@ snapshots: transitivePeerDependencies: - supports-color + agent-base@7.1.4: {} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -9443,6 +9791,10 @@ snapshots: dependencies: open: 8.4.2 + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + binary-extensions@2.3.0: {} bl@4.1.0: @@ -9548,10 +9900,7 @@ snapshots: loupe: 3.2.0 pathval: 2.0.0 - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + chai@6.2.0: {} chalk@4.1.2: dependencies: @@ -9726,6 +10075,11 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + css.escape@1.5.1: {} cssesc@3.0.0: {} @@ -9740,6 +10094,12 @@ snapshots: dependencies: cssom: 0.3.8 + cssstyle@5.3.1: + dependencies: + '@asamuzakjp/css-color': 4.0.5 + '@csstools/css-syntax-patches-for-csstree': 1.0.15 + css-tree: 3.1.0 + csstype@3.1.3: {} d3-array@3.2.4: @@ -9786,6 +10146,11 @@ snapshots: whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 + data-urls@6.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 + date-fns@2.30.0: dependencies: '@babel/runtime': 7.26.10 @@ -9808,6 +10173,8 @@ snapshots: decimal.js@10.4.3: {} + decimal.js@10.6.0: {} + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 @@ -9956,6 +10323,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.1: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -9976,6 +10345,8 @@ snapshots: isarray: 2.0.5 stop-iteration-iterator: 1.0.0 + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -10171,6 +10542,8 @@ snapshots: exit@0.1.2: {} + expect-type@1.2.2: {} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 @@ -10519,6 +10892,10 @@ snapshots: dependencies: whatwg-encoding: 2.0.0 + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + html-escaper@2.0.2: {} html-url-attributes@3.0.1: {} @@ -10539,6 +10916,13 @@ snapshots: transitivePeerDependencies: - supports-color + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -10546,6 +10930,13 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + human-signals@2.1.0: {} humanize-duration@3.32.2: {} @@ -11210,6 +11601,33 @@ snapshots: - supports-color - utf-8-validate + jsdom@27.0.1: + dependencies: + '@asamuzakjp/dom-selector': 6.7.3 + cssstyle: 5.3.1 + data-urls: 6.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + parse5: 8.0.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + jsesc@3.1.0: {} json-buffer@3.0.1: @@ -11327,6 +11745,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.2.2: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -11343,6 +11763,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-dir@4.0.0: dependencies: semver: 7.7.2 @@ -11513,6 +11937,8 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + mdn-data@2.12.2: {} + media-typer@0.3.0: {} memoize-one@5.2.1: {} @@ -11970,6 +12396,10 @@ snapshots: dependencies: entities: 4.5.0 + parse5@8.0.0: + dependencies: + entities: 6.0.1 + parseurl@1.3.3: {} path-exists@4.0.0: {} @@ -11995,6 +12425,8 @@ snapshots: path-type@4.0.0: {} + pathe@2.0.3: {} + pathval@2.0.0: {} picocolors@1.1.1: {} @@ -12454,6 +12886,8 @@ snapshots: require-directory@2.1.1: {} + require-from-string@2.0.2: {} + requires-port@1.0.0: {} resize-observer-polyfill@1.5.1: {} @@ -12523,6 +12957,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.52.5 fsevents: 2.3.3 + rrweb-cssom@0.8.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -12629,6 +13065,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -12670,12 +13108,16 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stackback@0.0.2: {} + state-local@1.0.7: {} statuses@2.0.1: {} statuses@2.0.2: {} + std-env@3.10.0: {} + stop-iteration-iterator@1.0.0: dependencies: internal-slot: 1.0.6 @@ -12694,7 +13136,7 @@ snapshots: storybook@9.1.2(@testing-library/dom@10.4.0)(msw@2.4.8(typescript@5.6.3))(prettier@3.4.1)(vite@7.1.11(@types/node@20.17.16)(jiti@1.21.7)(yaml@2.7.0)): dependencies: '@storybook/global': 5.0.0 - '@testing-library/jest-dom': 6.6.3 + '@testing-library/jest-dom': 6.9.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) '@vitest/expect': 3.2.4 '@vitest/mocker': 3.2.4(msw@2.4.8(typescript@5.6.3))(vite@7.1.11(@types/node@20.17.16)(jiti@1.21.7)(yaml@2.7.0)) @@ -12866,8 +13308,12 @@ snapshots: tiny-warning@1.0.3: {} + tinybench@2.9.0: {} + tinycolor2@1.6.0: {} + tinyexec@0.3.2: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -12875,8 +13321,16 @@ snapshots: tinyrainbow@2.0.0: {} + tinyrainbow@3.0.3: {} + tinyspy@4.0.3: {} + tldts-core@7.0.17: {} + + tldts@7.0.17: + dependencies: + tldts-core: 7.0.17 + tmpl@1.0.5: {} to-regex-range@5.0.1: @@ -12894,10 +13348,18 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 + tough-cookie@6.0.0: + dependencies: + tldts: 7.0.17 + tr46@3.0.0: dependencies: punycode: 2.3.1 + tr46@6.0.0: + dependencies: + punycode: 2.3.1 + trim-lines@3.0.1: {} trough@2.2.0: {} @@ -13173,12 +13635,56 @@ snapshots: jiti: 1.21.7 yaml: 2.7.0 + vitest@4.0.5(@types/debug@4.1.12)(@types/node@20.17.16)(jiti@1.21.7)(jsdom@27.0.1)(msw@2.4.8(typescript@5.6.3))(yaml@2.7.0): + dependencies: + '@vitest/expect': 4.0.5 + '@vitest/mocker': 4.0.5(msw@2.4.8(typescript@5.6.3))(vite@7.1.11(@types/node@20.17.16)(jiti@1.21.7)(yaml@2.7.0)) + '@vitest/pretty-format': 4.0.5 + '@vitest/runner': 4.0.5 + '@vitest/snapshot': 4.0.5 + '@vitest/spy': 4.0.5 + '@vitest/utils': 4.0.5 + debug: 4.4.3 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.1.11(@types/node@20.17.16)(jiti@1.21.7)(yaml@2.7.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 20.17.16 + jsdom: 27.0.1 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vscode-uri@3.1.0: {} w3c-xmlserializer@4.0.0: dependencies: xml-name-validator: 4.0.0 + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + walk-up-path@4.0.0: {} walker@1.0.8: @@ -13191,6 +13697,8 @@ snapshots: webidl-conversions@7.0.0: {} + webidl-conversions@8.0.0: {} + webpack-sources@3.2.3: {} webpack-virtual-modules@0.5.0: {} @@ -13201,13 +13709,24 @@ snapshots: dependencies: iconv-lite: 0.6.3 + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-mimetype@3.0.0: {} + whatwg-mimetype@4.0.0: {} + whatwg-url@11.0.0: dependencies: tr46: 3.0.0 webidl-conversions: 7.0.0 + whatwg-url@15.1.0: + dependencies: + tr46: 6.0.0 + webidl-conversions: 8.0.0 + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -13236,6 +13755,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -13265,8 +13789,12 @@ snapshots: ws@8.18.0: {} + ws@8.18.3: {} + xml-name-validator@4.0.0: {} + xml-name-validator@5.0.0: {} + xmlchars@2.2.0: {} xtend@4.0.2: {} diff --git a/site/src/api/api.test.ts b/site/src/api/api.jest.ts similarity index 100% rename from site/src/api/api.test.ts rename to site/src/api/api.jest.ts diff --git a/site/src/api/api.ts b/site/src/api/api.ts index baf56e5a27..8c665e3c60 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -2759,7 +2759,7 @@ function getConfiguredAxiosInstance(): AxiosInstance { } } else { // Do not write error logs if we are in a FE unit test. - if (process.env.JEST_WORKER_ID === undefined) { + if (!process.env.JEST_WORKER_ID && !process.env.VITEST) { console.error("CSRF token not found"); } } diff --git a/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.test.tsx b/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.test.tsx index 72ce09290d..8ec97302ed 100644 --- a/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.test.tsx +++ b/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.test.tsx @@ -5,7 +5,7 @@ import { ConfirmDialog } from "./ConfirmDialog"; describe("ConfirmDialog", () => { it("onClose is called when cancelled", () => { // Given - const onCloseMock = jest.fn(); + const onCloseMock = vi.fn(); const props = { cancelText: "CANCEL", hideCancel: false, @@ -24,8 +24,8 @@ describe("ConfirmDialog", () => { it("onConfirm is called when confirmed", () => { // Given - const onCloseMock = jest.fn(); - const onConfirmMock = jest.fn(); + const onCloseMock = vi.fn(); + const onConfirmMock = vi.fn(); const props = { cancelText: "CANCEL", confirmText: "CONFIRM", diff --git a/site/src/components/Dialogs/DeleteDialog/DeleteDialog.test.tsx b/site/src/components/Dialogs/DeleteDialog/DeleteDialog.test.tsx index 94fe49bcd3..1ef3159747 100644 --- a/site/src/components/Dialogs/DeleteDialog/DeleteDialog.test.tsx +++ b/site/src/components/Dialogs/DeleteDialog/DeleteDialog.test.tsx @@ -23,8 +23,8 @@ describe("DeleteDialog", () => { renderComponent( , @@ -38,8 +38,8 @@ describe("DeleteDialog", () => { renderComponent( , @@ -56,8 +56,8 @@ describe("DeleteDialog", () => { renderComponent( , diff --git a/site/src/components/FileUpload/FileUpload.test.tsx b/site/src/components/FileUpload/FileUpload.test.tsx index e3ebce085c..f72425152e 100644 --- a/site/src/components/FileUpload/FileUpload.test.tsx +++ b/site/src/components/FileUpload/FileUpload.test.tsx @@ -3,7 +3,7 @@ import { fireEvent, screen } from "@testing-library/react"; import { FileUpload } from "./FileUpload"; test("accepts files with the correct extension", async () => { - const onUpload = jest.fn(); + const onUpload = vi.fn(); renderComponent( { fireEvent.drop(dropZone, { dataTransfer: { files: [tarFile] }, }); - expect(onUpload).toBeCalledWith(tarFile); + expect(onUpload).toHaveBeenCalledWith(tarFile); onUpload.mockClear(); const zipFile = new File([""], "file.zip"); fireEvent.drop(dropZone, { dataTransfer: { files: [zipFile] }, }); - expect(onUpload).toBeCalledWith(zipFile); + expect(onUpload).toHaveBeenCalledWith(zipFile); onUpload.mockClear(); const unsupportedFile = new File([""], "file.mp4"); diff --git a/site/src/components/GlobalSnackbar/utils.test.ts b/site/src/components/GlobalSnackbar/utils.test.ts index cc2c33b3d3..3ce76c33d6 100644 --- a/site/src/components/GlobalSnackbar/utils.test.ts +++ b/site/src/components/GlobalSnackbar/utils.test.ts @@ -1,3 +1,4 @@ +import type { Mock } from "vitest"; import { displayError, displaySuccess, @@ -48,7 +49,7 @@ describe("Snackbar", () => { describe("displaySuccess", () => { const originalWindowDispatchEvent = window.dispatchEvent; - type TDispatchEventMock = jest.MockedFunction< + type TDispatchEventMock = Mock< (msg: CustomEvent) => boolean >; let dispatchEventMock: TDispatchEventMock; @@ -67,7 +68,7 @@ describe("Snackbar", () => { }; beforeEach(() => { - dispatchEventMock = jest.fn(); + dispatchEventMock = vi.fn(); window.dispatchEvent = dispatchEventMock as unknown as typeof window.dispatchEvent; }); @@ -114,16 +115,18 @@ describe("Snackbar", () => { }); describe("displayError", () => { - it("shows the title and the message", (done) => { + it("shows the title and the message", () => { const message = "Some error happened"; - window.addEventListener(SnackbarEventType, (event) => { - const notificationEvent = event as CustomEvent; - expect(notificationEvent.detail.msg).toEqual(message); - done(); - }); + return new Promise((resolve) => { + window.addEventListener(SnackbarEventType, (event) => { + const notificationEvent = event as CustomEvent; + expect(notificationEvent.detail.msg).toEqual(message); + resolve(); + }); - displayError(message); + displayError(message); + }); }); }); }); diff --git a/site/src/components/PaginationWidget/PaginationWidgetBase.test.tsx b/site/src/components/PaginationWidget/PaginationWidgetBase.jest.tsx similarity index 100% rename from site/src/components/PaginationWidget/PaginationWidgetBase.test.tsx rename to site/src/components/PaginationWidget/PaginationWidgetBase.jest.tsx diff --git a/site/src/contexts/ProxyContext.test.tsx b/site/src/contexts/ProxyContext.jest.tsx similarity index 100% rename from site/src/contexts/ProxyContext.test.tsx rename to site/src/contexts/ProxyContext.jest.tsx diff --git a/site/src/contexts/auth/AuthProvider.test.tsx b/site/src/contexts/auth/AuthProvider.test.tsx deleted file mode 100644 index bf3ea34a79..0000000000 --- a/site/src/contexts/auth/AuthProvider.test.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { createTestQueryClient } from "testHelpers/renderHelpers"; -import { renderHook } from "@testing-library/react"; -import type { FC, PropsWithChildren } from "react"; -import { QueryClientProvider } from "react-query"; -import { AuthProvider, useAuthContext } from "./AuthProvider"; - -const Wrapper: FC = ({ children }) => { - return ( - - {children} - - ); -}; - -describe("useAuth", () => { - it("throws an error if it is used outside of ", () => { - jest.spyOn(console, "error").mockImplementation(() => {}); - - expect(() => { - renderHook(() => useAuthContext()); - }).toThrow("useAuth should be used inside of "); - - jest.restoreAllMocks(); - }); - - it("returns AuthContextValue when used inside of ", () => { - expect(() => { - renderHook(() => useAuthContext(), { - wrapper: Wrapper, - }); - }).not.toThrow(); - }); -}); diff --git a/site/src/contexts/auth/RequireAuth.test.tsx b/site/src/contexts/auth/RequireAuth.jest.tsx similarity index 100% rename from site/src/contexts/auth/RequireAuth.test.tsx rename to site/src/contexts/auth/RequireAuth.jest.tsx diff --git a/site/src/hooks/debounce.test.ts b/site/src/hooks/debounce.jest.ts similarity index 100% rename from site/src/hooks/debounce.test.ts rename to site/src/hooks/debounce.jest.ts diff --git a/site/src/hooks/events.test.ts b/site/src/hooks/events.test.ts index de2a18c0f6..b7cc284572 100644 --- a/site/src/hooks/events.test.ts +++ b/site/src/hooks/events.test.ts @@ -4,14 +4,14 @@ import { useCustomEvent } from "./events"; describe(useCustomEvent.name, () => { it("Should receive custom events dispatched by the dispatchCustomEvent function", async () => { - const mockCallback = jest.fn(); + const mockCallback = vi.fn(); const eventType = "testEvent"; const detail = { title: "We have a new event!" }; renderHook(() => useCustomEvent(eventType, mockCallback)); dispatchCustomEvent(eventType, detail); - await waitFor(() => expect(mockCallback).toBeCalledTimes(1)); + await waitFor(() => expect(mockCallback).toHaveBeenCalledTimes(1)); expect(mockCallback.mock.calls[0]?.[0]?.detail).toBe(detail); }); }); diff --git a/site/src/hooks/hookPolyfills.test.ts b/site/src/hooks/hookPolyfills.test.ts index 3e603b1720..23342bb59c 100644 --- a/site/src/hooks/hookPolyfills.test.ts +++ b/site/src/hooks/hookPolyfills.test.ts @@ -15,7 +15,7 @@ describe(useEffectEvent.name, () => { } it("Should maintain a stable reference across all renders", () => { - const callback = jest.fn(); + const callback = vi.fn(); const { result, rerender } = renderEffectEvent(callback); const firstResult = result.current; @@ -28,8 +28,8 @@ describe(useEffectEvent.name, () => { }); it("Should always call the most recent callback passed in", () => { - const mockCallback1 = jest.fn(); - const mockCallback2 = jest.fn(); + const mockCallback1 = vi.fn(); + const mockCallback2 = vi.fn(); const { result, rerender } = renderEffectEvent(mockCallback1); rerender({ callback: mockCallback2 }); diff --git a/site/src/hooks/useClickable.test.tsx b/site/src/hooks/useClickable.test.tsx index 4a564bc8ce..ea18fb33e4 100644 --- a/site/src/hooks/useClickable.test.tsx +++ b/site/src/hooks/useClickable.test.tsx @@ -35,14 +35,14 @@ const NonNativeButton: FC> = ({ describe(useClickable.name, () => { it("Always defaults to role 'button'", () => { - render(); + render(); expect(() => screen.getByRole("button")).not.toThrow(); }); it("Overrides the native role of any element that receives the hook result (be very careful with this behavior)", () => { const anchorText = "I'm a button that's secretly a link!"; render( - + {anchorText} , ); @@ -55,7 +55,7 @@ describe(useClickable.name, () => { }); it("Always returns out the same role override received via arguments", () => { - const placeholderCallback = jest.fn(); + const placeholderCallback = vi.fn(); const roles = [ "button", "switch", @@ -73,7 +73,7 @@ describe(useClickable.name, () => { it("Allows an element to receive keyboard focus", async () => { const user = userEvent.setup(); - const mockCallback = jest.fn(); + const mockCallback = vi.fn(); render(, { wrapper: ({ children }) => ( @@ -90,7 +90,7 @@ describe(useClickable.name, () => { }); it("Allows an element to respond to clicks and Space/Enter, following all rules for native Button element interactions", async () => { - const mockCallback = jest.fn(); + const mockCallback = vi.fn(); const user = userEvent.setup(); render(); @@ -107,7 +107,7 @@ describe(useClickable.name, () => { }); it("Will keep firing events if the Enter key is held down", async () => { - const mockCallback = jest.fn(); + const mockCallback = vi.fn(); const user = userEvent.setup(); render(); @@ -119,7 +119,7 @@ describe(useClickable.name, () => { }); it("Will NOT keep firing events if the Space key is held down", async () => { - const mockCallback = jest.fn(); + const mockCallback = vi.fn(); const user = userEvent.setup(); render(); @@ -133,7 +133,7 @@ describe(useClickable.name, () => { }); test("If focus is lost while Space is held down, then releasing the key will do nothing", async () => { - const mockCallback = jest.fn(); + const mockCallback = vi.fn(); const user = userEvent.setup(); render(, { diff --git a/site/src/hooks/useClipboard.test.tsx b/site/src/hooks/useClipboard.jest.tsx similarity index 100% rename from site/src/hooks/useClipboard.test.tsx rename to site/src/hooks/useClipboard.jest.tsx diff --git a/site/src/hooks/useEmbeddedMetadata.test.ts b/site/src/hooks/useEmbeddedMetadata.jest.ts similarity index 100% rename from site/src/hooks/useEmbeddedMetadata.test.ts rename to site/src/hooks/useEmbeddedMetadata.jest.ts diff --git a/site/src/hooks/usePaginatedQuery.test.ts b/site/src/hooks/usePaginatedQuery.jest.ts similarity index 96% rename from site/src/hooks/usePaginatedQuery.test.ts rename to site/src/hooks/usePaginatedQuery.jest.ts index bb62f2b4b2..3811cd134c 100644 --- a/site/src/hooks/usePaginatedQuery.test.ts +++ b/site/src/hooks/usePaginatedQuery.jest.ts @@ -1,3 +1,9 @@ +// TODO: This test is timing out after upgrade a few Jest dependencies +// and I was not able to figure out why. When running it specifically, I +// can see many act warnings that may can help us to find the issue. +// (Note: This comment was originally written by Bruno, and was relocated by +// me. If you go poking at `git blame`, disabling these tests was not my idea. + import { renderHookWithAuth } from "testHelpers/hooks"; import { waitFor } from "@testing-library/react"; import { @@ -303,7 +309,7 @@ describe.skip(usePaginatedQuery.name, () => { }); }); -describe(`${usePaginatedQuery.name} - Returned properties`, () => { +describe.skip(`${usePaginatedQuery.name} - Returned properties`, () => { describe("Page change methods", () => { const mockQueryKey = jest.fn(() => ["mock"]); diff --git a/site/src/hooks/useSearchParamsKey.test.ts b/site/src/hooks/useSearchParamsKey.jest.ts similarity index 100% rename from site/src/hooks/useSearchParamsKey.test.ts rename to site/src/hooks/useSearchParamsKey.jest.ts diff --git a/site/src/modules/dashboard/DashboardLayout.test.tsx b/site/src/modules/dashboard/DashboardLayout.jest.tsx similarity index 100% rename from site/src/modules/dashboard/DashboardLayout.test.tsx rename to site/src/modules/dashboard/DashboardLayout.jest.tsx diff --git a/site/src/modules/dashboard/Navbar/Navbar.test.tsx b/site/src/modules/dashboard/Navbar/Navbar.test.tsx deleted file mode 100644 index 2390d315ce..0000000000 --- a/site/src/modules/dashboard/Navbar/Navbar.test.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { App } from "App"; -import { - MockEntitlementsWithAuditLog, - MockMemberPermissions, -} from "testHelpers/entities"; -import { server } from "testHelpers/server"; -import { render, screen, waitFor } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import { HttpResponse, http } from "msw"; - -/** - * The LicenseBanner, mounted above the AppRouter, fetches entitlements. Thus, to test their - * effects, we must test at the App level and `waitFor` the fetch to be done. - */ -describe("Navbar", () => { - it("shows Audit Log link when permitted and entitled", async () => { - // set entitlements to allow audit log - server.use( - http.get("/api/v2/entitlements", () => { - return HttpResponse.json(MockEntitlementsWithAuditLog); - }), - ); - render(); - const deploymentMenu = await screen.findByText("Admin settings"); - await userEvent.click(deploymentMenu); - await screen.findByText("Audit Logs"); - }); - - it("does not show Audit Log link when not entitled", async () => { - // by default, user is an Admin with permission to see the audit log, - // but is unlicensed so not entitled to see the audit log - render(); - const deploymentMenu = await screen.findByText("Admin settings"); - await userEvent.click(deploymentMenu); - await waitFor( - () => { - expect(screen.queryByText("Audit Logs")).not.toBeInTheDocument(); - }, - { timeout: 2000 }, - ); - }); - - it("does not show Audit Log link when not permitted via role", async () => { - // set permissions to Member (can't audit) - server.use( - http.post("/api/v2/authcheck", async () => { - return HttpResponse.json(MockMemberPermissions); - }), - ); - // set entitlements to allow audit log - server.use( - http.get("/api/v2/entitlements", () => { - return HttpResponse.json(MockEntitlementsWithAuditLog); - }), - ); - render(); - await waitFor( - () => { - expect(screen.queryByText("Deployment")).not.toBeInTheDocument(); - }, - { timeout: 2000 }, - ); - }); -}); diff --git a/site/src/modules/dashboard/Navbar/NavbarView.test.tsx b/site/src/modules/dashboard/Navbar/NavbarView.test.tsx deleted file mode 100644 index f313b6aa2b..0000000000 --- a/site/src/modules/dashboard/Navbar/NavbarView.test.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { MockPrimaryWorkspaceProxy, MockUserOwner } from "testHelpers/entities"; -import { renderWithAuth } from "testHelpers/renderHelpers"; -import { screen } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import type { ProxyContextValue } from "contexts/ProxyContext"; -import { NavbarView } from "./NavbarView"; - -const proxyContextValue: ProxyContextValue = { - latenciesLoaded: true, - proxy: { - preferredPathAppURL: "", - preferredWildcardHostname: "", - proxy: MockPrimaryWorkspaceProxy, - }, - isLoading: false, - isFetched: true, - setProxy: jest.fn(), - clearProxy: jest.fn(), - refetchProxyLatencies: jest.fn(), - proxyLatencies: {}, -}; - -describe("NavbarView", () => { - const noop = jest.fn(); - - it("workspaces nav link has the correct href", async () => { - renderWithAuth( - , - ); - const workspacesLink = - await screen.findByText(/workspaces/i); - expect(workspacesLink.href).toContain("/workspaces"); - }); - - it("templates nav link has the correct href", async () => { - renderWithAuth( - , - ); - const templatesLink = - await screen.findByText(/templates/i); - expect(templatesLink.href).toContain("/templates"); - }); - - it("audit nav link has the correct href", async () => { - renderWithAuth( - , - ); - const deploymentMenu = await screen.findByText("Admin settings"); - await userEvent.click(deploymentMenu); - const auditLink = await screen.findByText(/audit logs/i); - expect(auditLink.href).toContain("/audit"); - }); - - it("deployment nav link has the correct href", async () => { - renderWithAuth( - , - ); - const deploymentMenu = await screen.findByText("Admin settings"); - await userEvent.click(deploymentMenu); - const deploymentSettingsLink = - await screen.findByText(/deployment/i); - expect(deploymentSettingsLink.href).toContain("/deployment"); - }); -}); diff --git a/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.test.tsx b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.test.tsx index 1d25d894ea..a134d706d1 100644 --- a/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.test.tsx +++ b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.test.tsx @@ -10,7 +10,7 @@ describe("UserDropdownContent", () => { , @@ -26,7 +26,7 @@ describe("UserDropdownContent", () => { }); it("calls the onSignOut function", async () => { - const onSignOut = jest.fn(); + const onSignOut = vi.fn(); render( { - it("renders component", async () => { - renderComponent( - - - , - ); - - expect( - screen.getByText(MockListeningPortsResponse.ports[0].port), - ).toBeInTheDocument(); - - expect( - screen.getByText(MockListeningPortsResponse.ports[0].process_name), - ).toBeInTheDocument(); - }); -}); diff --git a/site/src/modules/resources/useAgentContainers.test.tsx b/site/src/modules/resources/useAgentContainers.jest.tsx similarity index 100% rename from site/src/modules/resources/useAgentContainers.test.tsx rename to site/src/modules/resources/useAgentContainers.jest.tsx diff --git a/site/src/modules/resources/useAgentLogs.test.ts b/site/src/modules/resources/useAgentLogs.jest.ts similarity index 100% rename from site/src/modules/resources/useAgentLogs.test.ts rename to site/src/modules/resources/useAgentLogs.jest.ts diff --git a/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.test.tsx b/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.jest.tsx similarity index 100% rename from site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.test.tsx rename to site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.jest.tsx diff --git a/site/src/modules/workspaces/DynamicParameter/DynamicParameter.test.tsx b/site/src/modules/workspaces/DynamicParameter/DynamicParameter.jest.tsx similarity index 100% rename from site/src/modules/workspaces/DynamicParameter/DynamicParameter.test.tsx rename to site/src/modules/workspaces/DynamicParameter/DynamicParameter.jest.tsx diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.test.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.jest.tsx similarity index 100% rename from site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.test.tsx rename to site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.jest.tsx diff --git a/site/src/pages/AuditPage/AuditPage.test.tsx b/site/src/pages/AuditPage/AuditPage.jest.tsx similarity index 100% rename from site/src/pages/AuditPage/AuditPage.test.tsx rename to site/src/pages/AuditPage/AuditPage.jest.tsx diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogPage.test.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogPage.jest.tsx similarity index 100% rename from site/src/pages/ConnectionLogPage/ConnectionLogPage.test.tsx rename to site/src/pages/ConnectionLogPage/ConnectionLogPage.jest.tsx diff --git a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.test.tsx b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.test.tsx deleted file mode 100644 index 48f545ea1c..0000000000 --- a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.test.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { AppProviders } from "App"; -import { - MockTemplateExample, - MockTemplateExample2, -} from "testHelpers/entities"; -import { server } from "testHelpers/server"; -import { render, screen } from "@testing-library/react"; -import { RequireAuth } from "contexts/auth/RequireAuth"; -import { HttpResponse, http } from "msw"; -import { createMemoryRouter, RouterProvider } from "react-router"; -import CreateTemplateGalleryPage from "./CreateTemplateGalleryPage"; - -test("displays the scratch template", async () => { - server.use( - http.get("api/v2/templates/examples", () => { - return HttpResponse.json([ - MockTemplateExample, - MockTemplateExample2, - { - ...MockTemplateExample, - id: "scratch", - name: "Scratch", - description: "Create a template from scratch", - }, - ]); - }), - ); - - render( - - , - children: [ - { - path: "/starter-templates", - element: , - }, - ], - }, - ], - { initialEntries: ["/starter-templates"] }, - )} - /> - , - ); - - await screen.findByText(MockTemplateExample.name); - screen.getByText(MockTemplateExample2.name); - expect(screen.queryByText("Scratch")).toBeInTheDocument(); -}); diff --git a/site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx b/site/src/pages/CreateTemplatePage/CreateTemplatePage.jest.tsx similarity index 100% rename from site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx rename to site/src/pages/CreateTemplatePage/CreateTemplatePage.jest.tsx diff --git a/site/src/pages/CreateTokenPage/CreateTokenPage.test.tsx b/site/src/pages/CreateTokenPage/CreateTokenPage.jest.tsx similarity index 100% rename from site/src/pages/CreateTokenPage/CreateTokenPage.test.tsx rename to site/src/pages/CreateTokenPage/CreateTokenPage.jest.tsx diff --git a/site/src/pages/CreateUserPage/CreateUserPage.test.tsx b/site/src/pages/CreateUserPage/CreateUserPage.jest.tsx similarity index 100% rename from site/src/pages/CreateUserPage/CreateUserPage.test.tsx rename to site/src/pages/CreateUserPage/CreateUserPage.jest.tsx diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.test.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.jest.tsx similarity index 100% rename from site/src/pages/CreateWorkspacePage/CreateWorkspacePage.test.tsx rename to site/src/pages/CreateWorkspacePage/CreateWorkspacePage.jest.tsx diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.test.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.jest.tsx similarity index 100% rename from site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.test.tsx rename to site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.jest.tsx diff --git a/site/src/pages/LoginPage/LoginPage.test.tsx b/site/src/pages/LoginPage/LoginPage.jest.tsx similarity index 100% rename from site/src/pages/LoginPage/LoginPage.test.tsx rename to site/src/pages/LoginPage/LoginPage.jest.tsx diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.test.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.jest.tsx similarity index 100% rename from site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.test.tsx rename to site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.jest.tsx diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.test.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.jest.tsx similarity index 100% rename from site/src/pages/OrganizationSettingsPage/OrganizationRedirect.test.tsx rename to site/src/pages/OrganizationSettingsPage/OrganizationRedirect.jest.tsx diff --git a/site/src/pages/SetupPage/SetupPage.test.tsx b/site/src/pages/SetupPage/SetupPage.jest.tsx similarity index 100% rename from site/src/pages/SetupPage/SetupPage.test.tsx rename to site/src/pages/SetupPage/SetupPage.jest.tsx diff --git a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.test.tsx b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.jest.tsx similarity index 100% rename from site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.test.tsx rename to site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.jest.tsx diff --git a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.test.tsx b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.jest.tsx similarity index 100% rename from site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.test.tsx rename to site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.jest.tsx diff --git a/site/src/pages/TemplatePage/TemplateRedirectController.test.tsx b/site/src/pages/TemplatePage/TemplateRedirectController.jest.tsx similarity index 100% rename from site/src/pages/TemplatePage/TemplateRedirectController.test.tsx rename to site/src/pages/TemplatePage/TemplateRedirectController.jest.tsx diff --git a/site/src/pages/TemplatePage/useDeletionDialogState.test.ts b/site/src/pages/TemplatePage/useDeletionDialogState.jest.ts similarity index 100% rename from site/src/pages/TemplatePage/useDeletionDialogState.test.ts rename to site/src/pages/TemplatePage/useDeletionDialogState.jest.ts diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.test.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.jest.tsx similarity index 100% rename from site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.test.tsx rename to site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.jest.tsx diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.test.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.jest.tsx similarity index 100% rename from site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.test.tsx rename to site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.jest.tsx diff --git a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.test.tsx b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.jest.tsx similarity index 100% rename from site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.test.tsx rename to site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.jest.tsx diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.jest.tsx similarity index 100% rename from site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx rename to site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.jest.tsx diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionPage.test.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionPage.jest.tsx similarity index 100% rename from site/src/pages/TemplateVersionPage/TemplateVersionPage.test.tsx rename to site/src/pages/TemplateVersionPage/TemplateVersionPage.jest.tsx diff --git a/site/src/pages/TerminalPage/TerminalPage.test.tsx b/site/src/pages/TerminalPage/TerminalPage.jest.tsx similarity index 100% rename from site/src/pages/TerminalPage/TerminalPage.test.tsx rename to site/src/pages/TerminalPage/TerminalPage.jest.tsx diff --git a/site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx b/site/src/pages/UserSettingsPage/AccountPage/AccountPage.jest.tsx similarity index 100% rename from site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx rename to site/src/pages/UserSettingsPage/AccountPage/AccountPage.jest.tsx diff --git a/site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.test.tsx b/site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.jest.tsx similarity index 100% rename from site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.test.tsx rename to site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.jest.tsx diff --git a/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPage.test.tsx b/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPage.jest.tsx similarity index 100% rename from site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPage.test.tsx rename to site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPage.jest.tsx diff --git a/site/src/pages/UserSettingsPage/SchedulePage/SchedulePage.test.tsx b/site/src/pages/UserSettingsPage/SchedulePage/SchedulePage.jest.tsx similarity index 100% rename from site/src/pages/UserSettingsPage/SchedulePage/SchedulePage.test.tsx rename to site/src/pages/UserSettingsPage/SchedulePage/SchedulePage.jest.tsx diff --git a/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.test.tsx b/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.jest.tsx similarity index 100% rename from site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.test.tsx rename to site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.jest.tsx diff --git a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.test.tsx b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.jest.tsx similarity index 100% rename from site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.test.tsx rename to site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.jest.tsx diff --git a/site/src/pages/WorkspacePage/WorkspacePage.test.tsx b/site/src/pages/WorkspacePage/WorkspacePage.jest.tsx similarity index 100% rename from site/src/pages/WorkspacePage/WorkspacePage.test.tsx rename to site/src/pages/WorkspacePage/WorkspacePage.jest.tsx diff --git a/site/src/pages/WorkspacePage/WorkspaceScheduleControls.test.tsx b/site/src/pages/WorkspacePage/WorkspaceScheduleControls.jest.tsx similarity index 100% rename from site/src/pages/WorkspacePage/WorkspaceScheduleControls.test.tsx rename to site/src/pages/WorkspacePage/WorkspaceScheduleControls.jest.tsx diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.test.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.jest.tsx similarity index 100% rename from site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.test.tsx rename to site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.jest.tsx diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.jest.tsx similarity index 99% rename from site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx rename to site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.jest.tsx index 68ffdac9e7..c34e2a6a99 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.jest.tsx @@ -144,17 +144,16 @@ describe("validationSchema", () => { expect(validate).toThrow(Language.errorTimezone); }); - it.each<[string]>(timeZones.map((zone) => [zone]))( - "validation passes for tz=%p", - (zone) => { + it("validation passes for all timezones", () => { + for (const zone of timeZones) { const values: WorkspaceScheduleFormValues = { ...valid, timezone: zone, }; const validate = () => validationSchema.validateSync(values); expect(validate).not.toThrow(); - }, - ); + } + }); it("allows a ttl of 7 days", () => { const values: WorkspaceScheduleFormValues = { diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.test.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.jest.tsx similarity index 100% rename from site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.test.tsx rename to site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.jest.tsx diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.test.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.jest.tsx similarity index 100% rename from site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.test.tsx rename to site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.jest.tsx diff --git a/site/src/pages/WorkspacesPage/WorkspacesPage.test.tsx b/site/src/pages/WorkspacesPage/WorkspacesPage.jest.tsx similarity index 100% rename from site/src/pages/WorkspacesPage/WorkspacesPage.test.tsx rename to site/src/pages/WorkspacesPage/WorkspacesPage.jest.tsx diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index b0ce392fa1..f858db66d1 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -507,10 +507,6 @@ export const MockAssignableSiteRoles = [ assignableRole(MockWorkspaceCreationBanRole, true), ]; -export const MockMemberPermissions = { - viewAuditLog: false, -}; - export const MockUserOwner: TypesGen.User = { id: "test-user", username: "TestUser", diff --git a/site/src/testHelpers/websockets.test.ts b/site/src/testHelpers/websockets.jest.ts similarity index 100% rename from site/src/testHelpers/websockets.test.ts rename to site/src/testHelpers/websockets.jest.ts diff --git a/site/src/utils/OneWayWebSocket.test.ts b/site/src/utils/OneWayWebSocket.jest.ts similarity index 100% rename from site/src/utils/OneWayWebSocket.test.ts rename to site/src/utils/OneWayWebSocket.jest.ts diff --git a/site/src/utils/events.test.ts b/site/src/utils/events.test.ts index 3f68afa078..f2fe5936f4 100644 --- a/site/src/utils/events.test.ts +++ b/site/src/utils/events.test.ts @@ -2,17 +2,19 @@ import { dispatchCustomEvent, isCustomEvent } from "./events"; describe("events", () => { describe("dispatchCustomEvent", () => { - it("dispatch a custom event", (done) => { + it("dispatch a custom event", () => { const eventDetail = { title: "Event title" }; - window.addEventListener("eventType", (event) => { - if (isCustomEvent(event)) { - expect(event.detail).toEqual(eventDetail); - done(); - } - }); + return new Promise((resolve) => { + window.addEventListener("eventType", (event) => { + if (isCustomEvent(event)) { + expect(event.detail).toEqual(eventDetail); + resolve(); + } + }); - dispatchCustomEvent("eventType", eventDetail); + dispatchCustomEvent("eventType", eventDetail); + }); }); }); }); diff --git a/site/src/utils/formUtils.test.ts b/site/src/utils/formUtils.jest.ts similarity index 100% rename from site/src/utils/formUtils.test.ts rename to site/src/utils/formUtils.jest.ts diff --git a/site/src/utils/tar.test.ts b/site/src/utils/tar.jest.ts similarity index 100% rename from site/src/utils/tar.test.ts rename to site/src/utils/tar.jest.ts diff --git a/site/src/utils/tar.ts b/site/src/utils/tar.ts index 74b6e7b825..1f0ff7e130 100644 --- a/site/src/utils/tar.ts +++ b/site/src/utils/tar.ts @@ -320,7 +320,7 @@ export class TarWriter { uid: 1000, gid: 1000, mode: fileType === TarFileTypeCodes.File ? 0o664 : 0o775, - mtime: ~~(Date.now() / 1000), + mtime: Math.trunc(Date.now() / 1000), user: "tarballjs", group: "tarballjs", ...opts, diff --git a/site/tsconfig.json b/site/tsconfig.json index 79b406d0f5..65d615f5b0 100644 --- a/site/tsconfig.json +++ b/site/tsconfig.json @@ -16,7 +16,7 @@ "skipLibCheck": true, "strict": true, "target": "es2020", - "types": ["jest", "node", "react", "react-dom", "vite/client"], + "types": ["node", "react", "react-dom", "vite/client", "vitest/globals"], "baseUrl": "src/" }, "include": ["**/*.ts", "**/*.tsx"], diff --git a/site/vite.config.mts b/site/vite.config.mts index d2da0a1a93..fd656a11de 100644 --- a/site/vite.config.mts +++ b/site/vite.config.mts @@ -1,8 +1,9 @@ import * as path from "node:path"; import react from "@vitejs/plugin-react"; import { visualizer } from "rollup-plugin-visualizer"; -import { defineConfig, type PluginOption } from "vite"; +import type { PluginOption } from "vite"; import checker from "vite-plugin-checker"; +import { defineConfig } from "vitest/config"; const plugins: PluginOption[] = [ react(), @@ -120,6 +121,7 @@ export default defineConfig({ }, resolve: { alias: { + App: path.resolve(__dirname, "./src/App"), api: path.resolve(__dirname, "./src/api"), components: path.resolve(__dirname, "./src/components"), contexts: path.resolve(__dirname, "./src/contexts"), @@ -131,4 +133,11 @@ export default defineConfig({ utils: path.resolve(__dirname, "./src/utils"), }, }, + test: { + include: ["src/**/*.test.?(m)ts?(x)"], + globals: true, + environment: "jsdom", + setupFiles: ["@testing-library/jest-dom/vitest"], + silent: "passed-only", + }, });