diff --git a/packages/api-v4/package.json b/packages/api-v4/package.json index e6bcbdc9552..24f469068cc 100644 --- a/packages/api-v4/package.json +++ b/packages/api-v4/package.json @@ -67,7 +67,7 @@ "lint-staged": "^13.2.2", "prettier": "~2.2.1", "tsup": "^7.2.0", - "vitest": "^1.0.1" + "vitest": "^1.3.1" }, "lint-staged": { "*.{ts,tsx,js}": [ diff --git a/packages/manager/.changeset/pr-10278-tests-1710347078555.md b/packages/manager/.changeset/pr-10278-tests-1710347078555.md new file mode 100644 index 00000000000..6bb98190d06 --- /dev/null +++ b/packages/manager/.changeset/pr-10278-tests-1710347078555.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Tests +--- + +Improve unit test suite stability ([#10278](https://github.com/linode/manager/pull/10278)) diff --git a/packages/manager/package.json b/packages/manager/package.json index 1b6e5bf0ea2..f1f0f3fcf49 100644 --- a/packages/manager/package.json +++ b/packages/manager/package.json @@ -212,7 +212,7 @@ "ts-node": "^10.9.2", "vite": "^5.1.7", "vite-plugin-svgr": "^3.2.0", - "vitest": "^1.2.0" + "vitest": "^1.3.1" }, "browserslist": [ ">1%", diff --git a/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.test.tsx b/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.test.tsx index b9605c9cbde..35688591d00 100644 --- a/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.test.tsx +++ b/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.test.tsx @@ -31,7 +31,7 @@ describe('BillingSummary', () => { ); - within(screen.getByTestId(accountBalanceText)).getByText(/no balance/gi); + within(screen.getByTestId(accountBalanceText)).getByText(/no balance/i); within(screen.getByTestId(accountBalanceValue)).getByText('$0.00'); }); @@ -45,7 +45,7 @@ describe('BillingSummary', () => { /> ); - within(screen.getByTestId(accountBalanceText)).getByText(/credit/gi); + within(screen.getByTestId(accountBalanceText)).getByText(/credit/i); within(screen.getByTestId(accountBalanceValue)).getByText('$10.00'); }); @@ -59,7 +59,7 @@ describe('BillingSummary', () => { /> ); - within(screen.getByTestId(accountBalanceText)).getByText(/Balance/gi); + within(screen.getByTestId(accountBalanceText)).getByText(/Balance/i); within(screen.getByTestId(accountBalanceValue)).getByText('$10.00'); }); diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx index bffcc435beb..29004901f82 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx @@ -1,5 +1,4 @@ import * as React from 'react'; - import { profileFactory } from 'src/factories'; import { accountUserFactory } from 'src/factories/accountUsers'; import { grantsFactory } from 'src/factories/grants'; @@ -26,12 +25,15 @@ describe('ImageAndPassword', () => { expect(getByLabelText('Image')).toBeEnabled(); }); it('should render a password error if defined', async () => { - const passwordError = 'Unable to set password.'; + const errorMessage = 'Unable to set password.'; const { findByText } = renderWithTheme( - + ); - expect(await findByText(passwordError)).toBeVisible(); + const passwordError = await findByText(errorMessage, undefined, { + timeout: 2500, + }); + expect(passwordError).toBeVisible(); }); it('should render an SSH Keys section', async () => { const { getByText } = renderWithTheme(); diff --git a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/CreateCertificateDrawer.test.tsx b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/CreateCertificateDrawer.test.tsx index eb99d893cab..7d28ba7a98a 100644 --- a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/CreateCertificateDrawer.test.tsx +++ b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/CreateCertificateDrawer.test.tsx @@ -7,28 +7,32 @@ import { renderWithTheme } from 'src/utilities/testHelpers'; import { CreateCertificateDrawer } from './CreateCertificateDrawer'; describe('CreateCertificateDrawer', () => { - it('should be submittable when form is filled out correctly', async () => { - const onClose = vi.fn(); - - const { getByLabelText, getByTestId } = renderWithTheme( - - ); - - const labelInput = getByLabelText('Label'); - const certInput = getByLabelText('TLS Certificate'); - const keyInput = getByLabelText('Private Key'); - - await userEvent.type(labelInput, 'my-cert-0'); - await userEvent.type(certInput, 'massive cert'); - await userEvent.type(keyInput, 'massive key'); - - await userEvent.click(getByTestId('submit')); - - await waitFor(() => expect(onClose).toBeCalled()); - }); + it( + 'should be submittable when form is filled out correctly', + async () => { + const onClose = vi.fn(); + + const { getByLabelText, getByTestId } = renderWithTheme( + + ); + + const labelInput = getByLabelText('Label'); + const certInput = getByLabelText('TLS Certificate'); + const keyInput = getByLabelText('Private Key'); + + await userEvent.type(labelInput, 'my-cert-0'); + await userEvent.type(certInput, 'massive cert'); + await userEvent.type(keyInput, 'massive key'); + + await userEvent.click(getByTestId('submit')); + + await waitFor(() => expect(onClose).toBeCalled()); + }, + { timeout: 10000 } + ); }); diff --git a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/EditCertificateDrawer.test.tsx b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/EditCertificateDrawer.test.tsx index d727d4ad7cc..9f77e663998 100644 --- a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/EditCertificateDrawer.test.tsx +++ b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/EditCertificateDrawer.test.tsx @@ -1,4 +1,4 @@ -import { act, waitFor } from '@testing-library/react'; +import { waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; @@ -82,10 +82,8 @@ describe('EditCertificateDrawer', () => { expect(labelInput).toHaveDisplayValue(mockCACertificate.label); expect(certInput).toHaveDisplayValue(mockCACertificate.certificate.trim()); - await act(async () => { - await userEvent.type(labelInput, 'my-updated-cert-0'); - await userEvent.click(getByTestId('submit')); - }); + await userEvent.type(labelInput, 'my-updated-cert-0'); + await userEvent.click(getByTestId('submit')); await waitFor(() => expect(onClose).toBeCalled()); }); @@ -105,13 +103,10 @@ describe('EditCertificateDrawer', () => { const certInput = getByLabelText('TLS Certificate'); const keyInput = getByLabelText('Private Key'); - await act(async () => { - await userEvent.type(labelInput, 'my-cert-0'); - await userEvent.type(certInput, 'massive cert'); - await userEvent.type(keyInput, 'massive key'); - - await userEvent.click(getByTestId('submit')); - }); + await userEvent.type(labelInput, 'my-cert-0'); + await userEvent.type(certInput, 'massive cert'); + await userEvent.type(keyInput, 'massive key'); + await userEvent.click(getByTestId('submit')); await waitFor(() => expect(onClose).toBeCalled()); }); diff --git a/packages/manager/src/features/Longview/LongviewDetail/DetailTabs/Disks/Graphs.test.tsx b/packages/manager/src/features/Longview/LongviewDetail/DetailTabs/Disks/Graphs.test.tsx index 6b4c3b31cb6..821e0339fe8 100644 --- a/packages/manager/src/features/Longview/LongviewDetail/DetailTabs/Disks/Graphs.test.tsx +++ b/packages/manager/src/features/Longview/LongviewDetail/DetailTabs/Disks/Graphs.test.tsx @@ -42,7 +42,7 @@ describe('UI', () => { expect(queryByTestId('space-graph')).toBeNull(); expect(queryByTestId('diskio-graph')).toBeInTheDocument(); - expect(getByText(/gather space and inode data/gim)); + expect(getByText(/gather space and inode data/im)); }); it('should not render Disk I/O graph for OpenVZ Configs', () => { @@ -55,7 +55,7 @@ describe('UI', () => { expect(queryByTestId('inodes-graph')).toBeInTheDocument(); expect(queryByTestId('diskio-graph')).toBeNull(); - expect(getByText(/gather Disk I\/O on OpenVZ Linodes/gim)); + expect(getByText(/gather Disk I\/O on OpenVZ Linodes/im)); }); it('should render warning text for ChildOf Disks', () => { @@ -68,7 +68,7 @@ describe('UI', () => { expect(queryByTestId('space-graph')).toBeNull(); expect(queryByTestId('diskio-graph')).toBeNull(); - expect(getByText(/doesn't gather data on this type of device/gim)); + expect(getByText(/doesn't gather data on this type of device/im)); }); it('should render warning text for unmounted disks', () => { @@ -81,6 +81,6 @@ describe('UI', () => { expect(queryByTestId('space-graph')).toBeNull(); expect(queryByTestId('diskio-graph')).toBeInTheDocument(); - expect(getByText(/gather Space and Inode data on unmounted disks/gim)); + expect(getByText(/gather Space and Inode data on unmounted disks/im)); }); }); diff --git a/packages/manager/src/features/Longview/LongviewLanding/LongviewLanding.test.tsx b/packages/manager/src/features/Longview/LongviewLanding/LongviewLanding.test.tsx index 47bd119b2da..1ff3d36970f 100644 --- a/packages/manager/src/features/Longview/LongviewLanding/LongviewLanding.test.tsx +++ b/packages/manager/src/features/Longview/LongviewLanding/LongviewLanding.test.tsx @@ -107,9 +107,10 @@ describe('Longview clients list view', () => { expect(props.getLongviewClients).toHaveBeenCalledTimes(1); }); - it('should have an Add Client button', () => { - const { queryByText } = renderWithTheme(); - expect(queryByText('Add Client')).toBeInTheDocument(); + it('should have an Add Client button', async () => { + const { findByText } = renderWithTheme(); + const addButton = await findByText('Add Client'); + expect(addButton).toBeInTheDocument(); }); it('should attempt to add a new client when the Add Client button is clicked', async () => { diff --git a/packages/manager/src/features/PlacementGroups/PlacementGroupsDeleteModal.test.tsx b/packages/manager/src/features/PlacementGroups/PlacementGroupsDeleteModal.test.tsx index 3377afe1b35..77796f06e19 100644 --- a/packages/manager/src/features/PlacementGroups/PlacementGroupsDeleteModal.test.tsx +++ b/packages/manager/src/features/PlacementGroups/PlacementGroupsDeleteModal.test.tsx @@ -1,13 +1,11 @@ -import { act, fireEvent } from '@testing-library/react'; import * as React from 'react'; +import { userEvent } from '@testing-library/user-event'; import { linodeFactory, placementGroupFactory } from 'src/factories'; import { renderWithTheme } from 'src/utilities/testHelpers'; import { PlacementGroupsDeleteModal } from './PlacementGroupsDeleteModal'; -import type { RenderResult } from '@testing-library/react'; - const queryMocks = vi.hoisted(() => ({ useDeletePlacementGroup: vi.fn().mockReturnValue({ mutateAsync: vi.fn().mockResolvedValue({}), @@ -31,36 +29,31 @@ const props = { describe('PlacementGroupsDeleteModal', () => { it('should render the right form elements', async () => { - let renderResult: RenderResult; - await act(async () => { - renderResult = renderWithTheme( - - ); - }); - - const { getByRole, getByTestId, getByText } = renderResult!; + }), + ]} + selectedPlacementGroup={placementGroupFactory.build({ + affinity_type: 'anti_affinity:local', + id: 1, + label: 'PG-to-delete', + members: [ + { + is_compliant: true, + linode_id: 1, + }, + ], + region: 'us-east', + })} + disableUnassignButton={false} + /> + ); expect( getByRole('heading', { @@ -80,30 +73,25 @@ describe('PlacementGroupsDeleteModal', () => { }); it("should be enabled when there's no assigned linodes", async () => { - let renderResult: RenderResult; - await act(async () => { - renderResult = renderWithTheme( - - ); - }); - - const { getByRole, getByTestId } = renderResult!; + label: 'test-linode', + region: 'us-east', + }), + ]} + selectedPlacementGroup={placementGroupFactory.build({ + affinity_type: 'anti_affinity:local', + id: 1, + label: 'PG-to-delete', + members: [], + })} + disableUnassignButton={false} + /> + ); const textField = getByTestId('textfield-input'); const deleteButton = getByRole('button', { name: 'Delete' }); @@ -111,10 +99,10 @@ describe('PlacementGroupsDeleteModal', () => { expect(textField).toBeEnabled(); expect(deleteButton).toBeDisabled(); - fireEvent.change(textField, { target: { value: 'PG-to-delete' } }); + await userEvent.type(textField, 'PG-to-delete'); expect(deleteButton).toBeEnabled(); - fireEvent.click(deleteButton); + await userEvent.click(deleteButton); expect(queryMocks.useDeletePlacementGroup).toHaveBeenCalled(); }); diff --git a/packages/manager/src/features/Profile/APITokens/CreateAPITokenDrawer.test.tsx b/packages/manager/src/features/Profile/APITokens/CreateAPITokenDrawer.test.tsx index 38f9fa7c00b..124ffd92732 100644 --- a/packages/manager/src/features/Profile/APITokens/CreateAPITokenDrawer.test.tsx +++ b/packages/manager/src/features/Profile/APITokens/CreateAPITokenDrawer.test.tsx @@ -56,35 +56,39 @@ describe('Create API Token Drawer', () => { expect(cancelBtn).toBeVisible(); }); - it('Should see secret modal with secret when you type a label and submit the form successfully', async () => { - server.use( - http.post('*/profile/tokens', () => { - return HttpResponse.json( - appTokenFactory.build({ token: 'secret-value' }) - ); - }) - ); - - const { getByLabelText, getByTestId, getByText } = renderWithTheme( - - ); - - const labelField = getByTestId('textfield-input'); - await userEvent.type(labelField, 'my-test-token'); - - const selectAllNoAccessPermRadioButton = getByLabelText( - 'Select no access for all' - ); - const submitBtn = getByText('Create Token'); - - expect(submitBtn).not.toHaveAttribute('aria-disabled', 'true'); - await userEvent.click(selectAllNoAccessPermRadioButton); - await userEvent.click(submitBtn); - - await waitFor(() => - expect(props.showSecret).toBeCalledWith('secret-value') - ); - }); + it( + 'Should see secret modal with secret when you type a label and submit the form successfully', + async () => { + server.use( + http.post('*/profile/tokens', () => { + return HttpResponse.json( + appTokenFactory.build({ token: 'secret-value' }) + ); + }) + ); + + const { getByLabelText, getByTestId, getByText } = renderWithTheme( + + ); + + const labelField = getByTestId('textfield-input'); + await userEvent.type(labelField, 'my-test-token'); + + const selectAllNoAccessPermRadioButton = getByLabelText( + 'Select no access for all' + ); + const submitBtn = getByText('Create Token'); + + expect(submitBtn).not.toHaveAttribute('aria-disabled', 'true'); + await userEvent.click(selectAllNoAccessPermRadioButton); + await userEvent.click(submitBtn); + + await waitFor(() => + expect(props.showSecret).toBeCalledWith('secret-value') + ); + }, + { timeout: 15000 } + ); it('Should default to no selection for all scopes', () => { const { getByLabelText } = renderWithTheme( diff --git a/packages/manager/src/features/Profile/APITokens/EditAPITokenDrawer.test.tsx b/packages/manager/src/features/Profile/APITokens/EditAPITokenDrawer.test.tsx index 05c526a8bf6..e102124db4c 100644 --- a/packages/manager/src/features/Profile/APITokens/EditAPITokenDrawer.test.tsx +++ b/packages/manager/src/features/Profile/APITokens/EditAPITokenDrawer.test.tsx @@ -1,4 +1,4 @@ -import { act, waitFor } from '@testing-library/react'; +import { waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import * as React from 'react'; @@ -33,44 +33,38 @@ describe('Edit API Token Drawer', () => { expect(cancelBtn).not.toHaveAttribute('aria-disabled', 'true'); expect(cancelBtn).toBeVisible(); }); + it('Save button should become enabled when label is changed', async () => { const { getByTestId } = renderWithTheme(); - const saveButton = getByTestId('save-button'); - expect(saveButton).toHaveAttribute('aria-disabled', 'true'); - - await act(async () => { - const labelField = getByTestId('textfield-input'); - - await userEvent.type(labelField, 'updated-token-label'); + expect(getByTestId('save-button')).toHaveAttribute('aria-disabled', 'true'); - const saveButton = getByTestId('save-button'); + const labelField = getByTestId('textfield-input'); - await waitFor(() => - expect(saveButton).toHaveAttribute('aria-disabled', 'false') - ); - }); + await userEvent.type(labelField, 'updated-token-label'); + await waitFor(() => + expect(getByTestId('save-button')).toHaveAttribute( + 'aria-disabled', + 'false' + ) + ); }); + it('Should close when updating a label and saving', async () => { // @note: this test uses handlers for PUT */profile/tokens/:id in serverHandlers.ts const { getByTestId } = renderWithTheme(); - await act(async () => { - const labelField = getByTestId('textfield-input'); - - await userEvent.type(labelField, 'my-token-updated'); - - const saveButton = getByTestId('save-button'); - - await waitFor(() => - expect(saveButton).toHaveAttribute('aria-disabled', 'false') - ); - - await userEvent.click(saveButton); + const labelField = getByTestId('textfield-input'); + await userEvent.type(labelField, 'my-token-updated'); - await waitFor(() => expect(props.onClose).toBeCalled()); - }); + const saveButton = getByTestId('save-button'); + await waitFor(() => + expect(saveButton).toHaveAttribute('aria-disabled', 'false') + ); + await userEvent.click(saveButton); + await waitFor(() => expect(props.onClose).toBeCalled()); }); + it('Should close when Cancel is pressed', async () => { const { getByText } = renderWithTheme(); const cancelButton = getByText(/Cancel/); diff --git a/packages/manager/src/utilities/storage.test.ts b/packages/manager/src/utilities/storage.test.ts index 46204e9b750..004c88dfb5f 100644 --- a/packages/manager/src/utilities/storage.test.ts +++ b/packages/manager/src/utilities/storage.test.ts @@ -15,9 +15,9 @@ describe('getLocalStorageOverrides', () => { }; describe('built for development mode', () => { - // Stub `DEV` environment variable to be truthy. + // Stub `DEV` environment variable to be true. beforeEach(() => { - vi.stubEnv('DEV', '1'); + vi.stubEnv('DEV', true); }); it('returns overrides if overrides are defined', () => { @@ -42,9 +42,9 @@ describe('getLocalStorageOverrides', () => { }); describe('not built for development mode', () => { - // Stub `DEV` environment variable to be falsy. + // Stub `DEV` environment variable to be false. beforeEach(() => { - vi.stubEnv('DEV', ''); + vi.stubEnv('DEV', false); }); it('returns `undefined` when overrides are defined', () => { diff --git a/yarn.lock b/yarn.lock index c07bd45ecc9..c69bbcc7e3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4506,37 +4506,37 @@ test-exclude "^6.0.0" v8-to-istanbul "^9.2.0" -"@vitest/expect@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.2.2.tgz#39ea22e849bbf404b7e5272786551aa99e2663d0" - integrity sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg== +"@vitest/expect@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.6.0.tgz#0b3ba0914f738508464983f4d811bc122b51fb30" + integrity sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ== dependencies: - "@vitest/spy" "1.2.2" - "@vitest/utils" "1.2.2" + "@vitest/spy" "1.6.0" + "@vitest/utils" "1.6.0" chai "^4.3.10" -"@vitest/runner@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.2.2.tgz#8b060a56ecf8b3d607b044d79f5f50d3cd9fee2f" - integrity sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg== +"@vitest/runner@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.6.0.tgz#a6de49a96cb33b0e3ba0d9064a3e8d6ce2f08825" + integrity sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg== dependencies: - "@vitest/utils" "1.2.2" + "@vitest/utils" "1.6.0" p-limit "^5.0.0" pathe "^1.1.1" -"@vitest/snapshot@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.2.2.tgz#f56fd575569774968f3eeba9382a166c26201042" - integrity sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA== +"@vitest/snapshot@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.6.0.tgz#deb7e4498a5299c1198136f56e6e0f692e6af470" + integrity sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ== dependencies: magic-string "^0.30.5" pathe "^1.1.1" pretty-format "^29.7.0" -"@vitest/spy@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.2.2.tgz#8fc2aeccb96cecbbdd192c643729bd5f97a01c86" - integrity sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g== +"@vitest/spy@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.6.0.tgz#362cbd42ccdb03f1613798fde99799649516906d" + integrity sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw== dependencies: tinyspy "^2.2.0" @@ -4563,6 +4563,16 @@ loupe "^2.3.7" pretty-format "^29.7.0" +"@vitest/utils@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.6.0.tgz#5c5675ca7d6f546a7b4337de9ae882e6c57896a1" + integrity sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw== + dependencies: + diff-sequences "^29.6.3" + estree-walker "^3.0.3" + loupe "^2.3.7" + pretty-format "^29.7.0" + "@yarnpkg/esbuild-plugin-pnp@^3.0.0-rc.10": version "3.0.0-rc.15" resolved "https://registry.yarnpkg.com/@yarnpkg/esbuild-plugin-pnp/-/esbuild-plugin-pnp-3.0.0-rc.15.tgz#4e40e7d2eb28825c9a35ab9d04c363931d7c0e67" @@ -4629,7 +4639,7 @@ acorn@^7.1.1, acorn@^7.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.10.0, acorn@^8.11.3, acorn@^8.4.1, acorn@^8.9.0: +acorn@^8.11.3, acorn@^8.4.1, acorn@^8.9.0: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -8849,6 +8859,11 @@ joycon@^3.0.1: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.0.tgz#0f893996d6f3ed46df7f0a3b12a03f5fd84223c1" + integrity sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ== + js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -12594,12 +12609,12 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strip-literal@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.3.0.tgz#db3942c2ec1699e6836ad230090b84bb458e3a07" - integrity sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg== +strip-literal@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.0.tgz#6d82ade5e2e74f5c7e8739b6c84692bd65f0bd2a" + integrity sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw== dependencies: - acorn "^8.10.0" + js-tokens "^9.0.0" stylis@4.2.0: version "4.2.0" @@ -12830,10 +12845,10 @@ tinybench@^2.5.1: resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.6.0.tgz#1423284ee22de07c91b3752c048d2764714b341b" integrity sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA== -tinypool@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.2.tgz#84013b03dc69dacb322563a475d4c0a9be00f82a" - integrity sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ== +tinypool@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.4.tgz#e217fe1270d941b39e98c625dcecebb1408c9aa8" + integrity sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ== tinyspy@^2.2.0: version "2.2.1" @@ -13468,10 +13483,10 @@ victory-vendor@^36.6.8: d3-time "^3.0.0" d3-timer "^3.0.1" -vite-node@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.2.2.tgz#f6d329b06f9032130ae6eac1dc773f3663903c25" - integrity sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg== +vite-node@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.0.tgz#2c7e61129bfecc759478fa592754fd9704aaba7f" + integrity sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw== dependencies: cac "^6.7.14" debug "^4.3.4" @@ -13499,18 +13514,17 @@ vite@^5.0.0, vite@^5.1.7: optionalDependencies: fsevents "~2.3.3" -vitest@^1.0.1, vitest@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.2.2.tgz#9e29ad2a74a5df553c30c5798c57a062d58ce299" - integrity sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw== - dependencies: - "@vitest/expect" "1.2.2" - "@vitest/runner" "1.2.2" - "@vitest/snapshot" "1.2.2" - "@vitest/spy" "1.2.2" - "@vitest/utils" "1.2.2" +vitest@^1.3.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.6.0.tgz#9d5ad4752a3c451be919e412c597126cffb9892f" + integrity sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA== + dependencies: + "@vitest/expect" "1.6.0" + "@vitest/runner" "1.6.0" + "@vitest/snapshot" "1.6.0" + "@vitest/spy" "1.6.0" + "@vitest/utils" "1.6.0" acorn-walk "^8.3.2" - cac "^6.7.14" chai "^4.3.10" debug "^4.3.4" execa "^8.0.1" @@ -13519,11 +13533,11 @@ vitest@^1.0.1, vitest@^1.2.0: pathe "^1.1.1" picocolors "^1.0.0" std-env "^3.5.0" - strip-literal "^1.3.0" + strip-literal "^2.0.0" tinybench "^2.5.1" - tinypool "^0.8.2" + tinypool "^0.8.3" vite "^5.0.0" - vite-node "1.2.2" + vite-node "1.6.0" why-is-node-running "^2.2.2" w3c-xmlserializer@^4.0.0: