diff --git a/package.json b/package.json index 778199ac..c4f4e81e 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^12.1.4", - "@testing-library/react-hooks": "^8.0.1", + "@testing-library/react-hooks": "^8.0.0", "@testing-library/user-event": "^14.5.2", "@types/dompurify": "^2.2.2", "@types/file-saver": "^2.0.1", @@ -69,12 +69,12 @@ "typescript": "4.9.5", "uuid": "^8.1.0", "validator": "^13.7.0", - "vite": "^5.1.7", + "vite": "^5.2.11", "vite-plugin-eslint": "^1.8.1", "vite-plugin-node-polyfills": "^0.21.0", "vite-plugin-svgr": "^4.2.0", "vite-tsconfig-paths": "^4.3.1", - "vitest": "^1.6.0", + "vitest": "^1.5.2", "vitest-fetch-mock": "^0.2.2", "yup": "^0.32.5" }, @@ -111,7 +111,7 @@ "@graphql-codegen/cli": "^5.0.2", "@graphql-codegen/typescript": "^4.0.6", "@graphql-codegen/typescript-operations": "^4.2.0", - "@vitest/coverage-istanbul": "^1.6.0", + "@vitest/coverage-istanbul": "^1.3.1", "cross-env": "^7.0.3", "helsinki-utils": "City-of-Helsinki/helsinki-utils-js#0.1.0", "husky": "^9.0.11", diff --git a/src/profile/hooks/__tests__/useProfileLoadTracker.test.ts b/src/profile/hooks/__tests__/useProfileLoadTracker.test.ts index 5dd0ed44..cbfc920b 100644 --- a/src/profile/hooks/__tests__/useProfileLoadTracker.test.ts +++ b/src/profile/hooks/__tests__/useProfileLoadTracker.test.ts @@ -107,19 +107,18 @@ describe('useProfileLoader.ts ', () => { }; const waitForProfileLoadToEnd = async (renderHookResult: RenderResult) => - waitFor(() => { + waitFor(async () => { const currentHookProps = renderHookResult.result.current; if (currentHookProps.isProfileLoadComplete() === false) { - advanceTimers(); renderHookResult.rerender(); + advanceTimers(); throw new Error('Profile load is not complete'); } }); // Function for advancing straight to point where // profile loading is complete (success / failure) - // eslint-disable-next-line @typescript-eslint/no-unused-vars const proceedToProfileLoadCompleteState = async ({ loadSuccess, profileExist, @@ -130,21 +129,15 @@ describe('useProfileLoader.ts ', () => { addAllowedGraphQLError: boolean; }) => { const renderHookResult = await initTests(); - const result = profileExist ? { data: loadSuccess ? getMyProfile() : undefined } : { data: { myProfile: null } }; - const errorObj = addAllowedGraphQLError ? createApolloErrorWithAllowedPermissionError() : (({} as unknown) as ApolloError); - const error = loadSuccess ? undefined : errorObj; - mockProfileLoadProcess({ ...result, error }); - await waitForProfileLoadToEnd(renderHookResult); - return { renderHookResult }; }; @@ -191,9 +184,9 @@ describe('useProfileLoader.ts ', () => { }); it(`Profile should not be loaded at all, if context has an error. In this case - - hook.hasExistingProfile() returns false - - hook.didProfileLoadFail() returns true - - hook.isProfileLoadComplete() returns true`, async () => { + - hook.hasExistingProfile() returns false + - hook.didProfileLoadFail() returns true + - hook.isProfileLoadComplete() returns true`, async () => { await act(async () => { updateMockUseProfileQueryResult({ error: {} as ApolloError, @@ -208,104 +201,102 @@ describe('useProfileLoader.ts ', () => { }); }); - // it(`When profile load is successful and profile exists - // - hook.hasExistingProfile() returns true - // - hook.didProfileLoadFail() returns false - // - hook.isProfileLoadComplete() returns true. - // Response can include an allowed graphQL error.`, async () => { - // await act(async () => { - // const { renderHookResult } = await proceedToProfileLoadCompleteState({ - // loadSuccess: true, - // profileExist: true, - // addAllowedGraphQLError: true, - // }); - - // const currentHookProps = renderHookResult.result.current; - - // expect(currentHookProps.hasExistingProfile()).toBeTruthy(); - // expect(currentHookProps.didProfileLoadFail()).toBeFalsy(); - // expect(currentHookProps.isProfileLoadComplete()).toBeTruthy(); - // expect(fetchProfileMock).toHaveBeenCalledTimes(1); - // }); - // }); + it(`When profile load is successful and profile exists + - hook.hasExistingProfile() returns true + - hook.didProfileLoadFail() returns false + - hook.isProfileLoadComplete() returns true. + Response can include an allowed graphQL error.`, async () => { + await act(async () => { + const { renderHookResult } = await proceedToProfileLoadCompleteState({ + loadSuccess: true, + profileExist: true, + addAllowedGraphQLError: true, + }); + const currentHookProps = renderHookResult.result.current; + expect(currentHookProps.hasExistingProfile()).toBeTruthy(); + expect(currentHookProps.didProfileLoadFail()).toBeFalsy(); + expect(currentHookProps.isProfileLoadComplete()).toBeTruthy(); + expect(fetchProfileMock).toHaveBeenCalledTimes(1); + }); + }); - // it(`When profile load is successful, but profile does not exist, - // - hook.hasExistingProfile() returns false - // - hook.didProfileLoadFail() returns false - // - hook.isProfileLoadComplete() returns true`, async () => { - // await act(async () => { - // const { renderHookResult } = await proceedToProfileLoadCompleteState({ - // loadSuccess: true, - // profileExist: false, - // addAllowedGraphQLError: false, - // }); - // const currentHookProps = renderHookResult.result.current; - // expect(currentHookProps.hasExistingProfile()).toBeFalsy(); - // expect(currentHookProps.didProfileLoadFail()).toBeFalsy(); - // expect(currentHookProps.isProfileLoadComplete()).toBeTruthy(); - // expect(fetchProfileMock).toHaveBeenCalledTimes(1); - // }); - // }); + it(`When profile load is successful, but profile does not exist, + - hook.hasExistingProfile() returns false + - hook.didProfileLoadFail() returns false + - hook.isProfileLoadComplete() returns true`, async () => { + await act(async () => { + const { renderHookResult } = await proceedToProfileLoadCompleteState({ + loadSuccess: true, + profileExist: false, + addAllowedGraphQLError: false, + }); + const currentHookProps = renderHookResult.result.current; + expect(currentHookProps.hasExistingProfile()).toBeFalsy(); + expect(currentHookProps.didProfileLoadFail()).toBeFalsy(); + expect(currentHookProps.isProfileLoadComplete()).toBeTruthy(); + expect(fetchProfileMock).toHaveBeenCalledTimes(1); + }); + }); - // it(`When profile load fails - // - hook.hasExistingProfile() returns false - // - hook.didProfileLoadFail() returns true - // - hook.isProfileLoadComplete() returns true`, async () => { - // await act(async () => { - // const { renderHookResult } = await proceedToProfileLoadCompleteState({ - // loadSuccess: false, - // profileExist: true, - // addAllowedGraphQLError: false, - // }); - // const currentHookProps = renderHookResult.result.current; - // expect(currentHookProps.isProfileLoadComplete()).toBeTruthy(); - // expect(currentHookProps.didProfileLoadFail()).toBeTruthy(); - // expect(currentHookProps.hasExistingProfile()).toBeFalsy(); - // expect(fetchProfileMock).toHaveBeenCalledTimes(1); - // }); - // }); + it(`When profile load fails + - hook.hasExistingProfile() returns false + - hook.didProfileLoadFail() returns true + - hook.isProfileLoadComplete() returns true`, async () => { + await act(async () => { + const { renderHookResult } = await proceedToProfileLoadCompleteState({ + loadSuccess: false, + profileExist: true, + addAllowedGraphQLError: false, + }); + const currentHookProps = renderHookResult.result.current; + expect(currentHookProps.isProfileLoadComplete()).toBeTruthy(); + expect(currentHookProps.didProfileLoadFail()).toBeTruthy(); + expect(currentHookProps.hasExistingProfile()).toBeFalsy(); + expect(fetchProfileMock).toHaveBeenCalledTimes(1); + }); + }); - // it(`Hook provides a reloadProfile() function for refetching profile when - // - load fails - // - profile is fetched after it is created for first time.`, async () => { - // await act(async () => { - // const { renderHookResult } = await proceedToProfileLoadCompleteState({ - // loadSuccess: false, - // profileExist: true, - // addAllowedGraphQLError: false, - // }); - // const currentHookProps = renderHookResult.result.current; - // expect(currentHookProps.didProfileLoadFail()).toBeTruthy(); - // expect(currentHookProps.hasExistingProfile()).toBeFalsy(); - // updateMockUseProfileQueryResult({ - // error: undefined, - // loading: true, - // data: undefined, - // }); - // mockProfileLoadProcess({ - // ...successfulProfileLoadData, - // }); - // currentHookProps.reloadProfile(); + it(`Hook provides a reloadProfile() function for refetching profile when + - load fails + - profile is fetched after it is created for first time.`, async () => { + await act(async () => { + const { renderHookResult } = await proceedToProfileLoadCompleteState({ + loadSuccess: false, + profileExist: true, + addAllowedGraphQLError: false, + }); + const currentHookProps = renderHookResult.result.current; + expect(currentHookProps.didProfileLoadFail()).toBeTruthy(); + expect(currentHookProps.hasExistingProfile()).toBeFalsy(); + updateMockUseProfileQueryResult({ + error: undefined, + loading: true, + data: undefined, + }); + mockProfileLoadProcess({ + ...successfulProfileLoadData, + }); + currentHookProps.reloadProfile(); - // await waitForProfileLoadToEnd(renderHookResult); - // const updatedHookProps = renderHookResult.result.current; - // expect(updatedHookProps.didProfileLoadFail()).toBeFalsy(); - // expect(updatedHookProps.hasExistingProfile()).toBeTruthy(); + await waitForProfileLoadToEnd(renderHookResult); + const updatedHookProps = renderHookResult.result.current; + expect(updatedHookProps.didProfileLoadFail()).toBeFalsy(); + expect(updatedHookProps.hasExistingProfile()).toBeTruthy(); - // expect(fetchProfileMock).toHaveBeenCalledTimes(1); - // expect(refetchProfileMock).toHaveBeenCalledTimes(1); - // }); - // }); + expect(fetchProfileMock).toHaveBeenCalledTimes(1); + expect(refetchProfileMock).toHaveBeenCalledTimes(1); + }); + }); - // it('Hook.hasExistingProfile() throws, when used before profile load is complete', async () => { - // await act(async () => { - // const renderHookResult = await initTests(); - // const currentHookProps = renderHookResult.result.current; - // expect(() => currentHookProps.hasExistingProfile()).toThrow(); - // mockProfileLoadProcess(successfulProfileLoadData); - // await waitForProfileLoadToEnd(renderHookResult); - // expect(() => currentHookProps.hasExistingProfile()).not.toThrow(); - // }); - // }); + it('Hook.hasExistingProfile() throws, when used before profile load is complete', async () => { + await act(async () => { + const renderHookResult = await initTests(); + const currentHookProps = renderHookResult.result.current; + expect(() => currentHookProps.hasExistingProfile()).toThrow(); + mockProfileLoadProcess(successfulProfileLoadData); + await waitForProfileLoadToEnd(renderHookResult); + expect(() => currentHookProps.hasExistingProfile()).not.toThrow(); + }); + }); }); }); diff --git a/src/profile/hooks/useProfileLoadTracker.ts b/src/profile/hooks/useProfileLoadTracker.ts index c917adeb..2ca03312 100644 --- a/src/profile/hooks/useProfileLoadTracker.ts +++ b/src/profile/hooks/useProfileLoadTracker.ts @@ -79,6 +79,8 @@ export function useProfileLoadTracker(): useProfileLoaderHookReturnType { const statusRef = useRef(STATUS_WAITING); const updateStatus = useCallback((updatedStatus?: Status): Status => { + console.log('Updating status to', updatedStatus); + if (!updatedStatus) { return statusRef.current; } @@ -87,10 +89,13 @@ export function useProfileLoadTracker(): useProfileLoaderHookReturnType { }, []); const newStatus = resolveChangedStatus(statusRef.current, profileContext); + updateStatus(newStatus); useEffect(() => { + console.log('Effect running with newStatus', newStatus); if (shouldLoad(newStatus)) { + console.log('Starting to load'); updateStatus(STATUS_LOADING); profileContext.fetch(); } diff --git a/yarn.lock b/yarn.lock index c3161d91..960bd62e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1696,19 +1696,19 @@ yargs "^17.0.0" "@graphql-codegen/client-preset@^4.2.2": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@graphql-codegen/client-preset/-/client-preset-4.2.5.tgz#1cf2a19aaa367b81920999a3511cb1e11a632b4a" - integrity sha512-hAdB6HN8EDmkoBtr0bPUN/7NH6svzqbcTDMWBCRXPESXkl7y80po+IXrXUjsSrvhKG8xkNXgJNz/2mjwHzywcA== + version "4.2.6" + resolved "https://registry.yarnpkg.com/@graphql-codegen/client-preset/-/client-preset-4.2.6.tgz#dbce627c9db5fcb5777d8567b8fd46683741e31d" + integrity sha512-e7SzPb+nxNJfsD0uG+NSyzIeTtCXTouX5VThmcCoqGMDLgF5Lo7932B3HtZCvzmzqcXxRjJ81CmkA2LhlqIbCw== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/template" "^7.20.7" "@graphql-codegen/add" "^5.0.2" - "@graphql-codegen/gql-tag-operations" "4.0.6" - "@graphql-codegen/plugin-helpers" "^5.0.3" - "@graphql-codegen/typed-document-node" "^5.0.6" - "@graphql-codegen/typescript" "^4.0.6" - "@graphql-codegen/typescript-operations" "^4.2.0" - "@graphql-codegen/visitor-plugin-common" "^5.1.0" + "@graphql-codegen/gql-tag-operations" "4.0.7" + "@graphql-codegen/plugin-helpers" "^5.0.4" + "@graphql-codegen/typed-document-node" "^5.0.7" + "@graphql-codegen/typescript" "^4.0.7" + "@graphql-codegen/typescript-operations" "^4.2.1" + "@graphql-codegen/visitor-plugin-common" "^5.2.0" "@graphql-tools/documents" "^1.0.0" "@graphql-tools/utils" "^10.0.0" "@graphql-typed-document-node/core" "3.2.0" @@ -1724,21 +1724,21 @@ "@graphql-tools/utils" "^10.0.0" tslib "~2.6.0" -"@graphql-codegen/gql-tag-operations@4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.6.tgz#d16ee0306cfdea60217c025a1bc21649452d7da3" - integrity sha512-y6iXEDpDNjwNxJw3WZqX1/Znj0QHW7+y8O+t2V8qvbTT+3kb2lr9ntc8By7vCr6ctw9tXI4XKaJgpTstJDOwFA== +"@graphql-codegen/gql-tag-operations@4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.7.tgz#365f01dd6e2dc1853beb7de6d93c94d71efdf2ff" + integrity sha512-2I69+IDC8pqAohH6cgKse/vPfJ/4TRTJX96PkAKz8S4RD54PUHtBmzCdBInIFEP/vQuH5mFUAaIKXXjznmGOsg== dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.3" - "@graphql-codegen/visitor-plugin-common" "5.1.0" + "@graphql-codegen/plugin-helpers" "^5.0.4" + "@graphql-codegen/visitor-plugin-common" "5.2.0" "@graphql-tools/utils" "^10.0.0" auto-bind "~4.0.0" tslib "~2.6.0" -"@graphql-codegen/plugin-helpers@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.0.3.tgz#7027b9d911d7cb594663590fcf5d63e9cf7ec2ff" - integrity sha512-yZ1rpULIWKBZqCDlvGIJRSyj1B2utkEdGmXZTBT/GVayP4hyRYlkd36AJV/LfEsVD8dnsKL5rLz2VTYmRNlJ5Q== +"@graphql-codegen/plugin-helpers@^5.0.3", "@graphql-codegen/plugin-helpers@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.0.4.tgz#5f4c987c3f308ef1c8809ee0c43af0369867e0f6" + integrity sha512-MOIuHFNWUnFnqVmiXtrI+4UziMTYrcquljaI5f/T/Bc7oO7sXcfkAvgkNWEEi9xWreYwvuer3VHCuPI/lAFWbw== dependencies: "@graphql-tools/utils" "^10.0.0" change-case-all "1.0.15" @@ -1756,45 +1756,45 @@ "@graphql-tools/utils" "^10.0.0" tslib "~2.6.0" -"@graphql-codegen/typed-document-node@^5.0.6": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.6.tgz#54750f4a7c6e963defeb6c27a9ea280a2a8bc2a3" - integrity sha512-US0J95hOE2/W/h42w4oiY+DFKG7IetEN1mQMgXXeat1w6FAR5PlIz4JrRrEkiVfVetZ1g7K78SOwBD8/IJnDiA== +"@graphql-codegen/typed-document-node@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.7.tgz#a1034785d860b1459b9d89b4530d872319f29233" + integrity sha512-rgFh96hAbNwPUxLVlRcNhGaw2+y7ZGx7giuETtdO8XzPasTQGWGRkZ3wXQ5UUiTX4X3eLmjnuoXYKT7HoxSznQ== dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.3" - "@graphql-codegen/visitor-plugin-common" "5.1.0" + "@graphql-codegen/plugin-helpers" "^5.0.4" + "@graphql-codegen/visitor-plugin-common" "5.2.0" auto-bind "~4.0.0" change-case-all "1.0.15" tslib "~2.6.0" -"@graphql-codegen/typescript-operations@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-4.2.0.tgz#0c6bbaf41cb325809b7e9e2b9d85ab01f11d142f" - integrity sha512-lmuwYb03XC7LNRS8oo9M4/vlOrq/wOKmTLBHlltK2YJ1BO/4K/Q9Jdv/jDmJpNydHVR1fmeF4wAfsIp1f9JibA== +"@graphql-codegen/typescript-operations@^4.2.0", "@graphql-codegen/typescript-operations@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-4.2.1.tgz#887d5883d33d1e14a6f5dc90f125db343b3759d3" + integrity sha512-LhEPsaP+AI65zfK2j6CBAL4RT0bJL/rR9oRWlvwtHLX0t7YQr4CP4BXgvvej9brYdedAxHGPWeV1tPHy5/z9KQ== dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.3" - "@graphql-codegen/typescript" "^4.0.6" - "@graphql-codegen/visitor-plugin-common" "5.1.0" + "@graphql-codegen/plugin-helpers" "^5.0.4" + "@graphql-codegen/typescript" "^4.0.7" + "@graphql-codegen/visitor-plugin-common" "5.2.0" auto-bind "~4.0.0" tslib "~2.6.0" -"@graphql-codegen/typescript@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-4.0.6.tgz#2c9b70dc1eafda912de5e31c119c757b1aa5fca1" - integrity sha512-IBG4N+Blv7KAL27bseruIoLTjORFCT3r+QYyMC3g11uY3/9TPpaUyjSdF70yBe5GIQ6dAgDU+ENUC1v7EPi0rw== +"@graphql-codegen/typescript@^4.0.6", "@graphql-codegen/typescript@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-4.0.7.tgz#32f0f0916ed2ef7efbc233d14af07057aafdeea8" + integrity sha512-Gn+JNvQBJhBqH7s83piAJ6UeU/MTj9GXWFO9bdbl8PMLCAM1uFAtg04iHfkGCtDKXcUg5a3Dt/SZG85uk5KuhA== dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-codegen/plugin-helpers" "^5.0.4" "@graphql-codegen/schema-ast" "^4.0.2" - "@graphql-codegen/visitor-plugin-common" "5.1.0" + "@graphql-codegen/visitor-plugin-common" "5.2.0" auto-bind "~4.0.0" tslib "~2.6.0" -"@graphql-codegen/visitor-plugin-common@5.1.0", "@graphql-codegen/visitor-plugin-common@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.1.0.tgz#4edf7edb53460e71762a5fd8bbf5269bc3d9200b" - integrity sha512-eamQxtA9bjJqI2lU5eYoA1GbdMIRT2X8m8vhWYsVQVWD3qM7sx/IqJU0kx0J3Vd4/CSd36BzL6RKwksibytDIg== +"@graphql-codegen/visitor-plugin-common@5.2.0", "@graphql-codegen/visitor-plugin-common@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.2.0.tgz#8c48c0a62575d5f302678aae3994a50e9ac72cd0" + integrity sha512-0p8AwmARaZCAlDFfQu6Sz+JV6SjbPDx3y2nNM7WAAf0au7Im/GpJ7Ke3xaIYBc1b2rTZ+DqSTJI/zomENGD9NA== dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-codegen/plugin-helpers" "^5.0.4" "@graphql-tools/optimize" "^2.0.0" "@graphql-tools/relay-operation-optimizer" "^7.0.0" "@graphql-tools/utils" "^10.0.0" @@ -2788,7 +2788,7 @@ lodash "^4.17.21" redent "^3.0.0" -"@testing-library/react-hooks@^8.0.1": +"@testing-library/react-hooks@^8.0.0": version "8.0.1" resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz#0924bbd5b55e0c0c0502d1754657ada66947ca12" integrity sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g== @@ -3180,7 +3180,7 @@ dependencies: "@swc/core" "^1.3.107" -"@vitest/coverage-istanbul@^1.6.0": +"@vitest/coverage-istanbul@^1.3.1": version "1.6.0" resolved "https://registry.yarnpkg.com/@vitest/coverage-istanbul/-/coverage-istanbul-1.6.0.tgz#4df9310b085416f064f7e057373c546dcf14e41c" integrity sha512-h/BwpXehkkS0qsNCS00QxiupAqVkNi0WT19BR0dQvlge5oHghoSVLx63fABYFoKxVb7Ue7+k6V2KokmQ1zdMpg== @@ -9194,7 +9194,7 @@ vite-tsconfig-paths@^4.3.1: globrex "^0.1.2" tsconfck "^3.0.3" -vite@^5.0.0, vite@^5.1.7: +vite@^5.0.0, vite@^5.2.11: version "5.2.11" resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.11.tgz#726ec05555431735853417c3c0bfb36003ca0cbd" integrity sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ== @@ -9212,7 +9212,7 @@ vitest-fetch-mock@^0.2.2: dependencies: cross-fetch "^3.0.6" -vitest@^1.6.0: +vitest@^1.5.2: version "1.6.0" resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.6.0.tgz#9d5ad4752a3c451be919e412c597126cffb9892f" integrity sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==