From 5fe064814594c8a44cbdbff19eb0607e869f233f Mon Sep 17 00:00:00 2001 From: Jake Coble Date: Fri, 16 Aug 2024 15:40:50 -0400 Subject: [PATCH 1/9] Prefetch audiobook slider data --- src/pages/[language]/discover/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/[language]/discover/index.ts b/src/pages/[language]/discover/index.ts index 85ca78373..d0c044605 100644 --- a/src/pages/[language]/discover/index.ts +++ b/src/pages/[language]/discover/index.ts @@ -40,6 +40,8 @@ export async function getStaticProps({ getSectionPresenters: { language }, getSectionBibleBooks: { language }, getSectionTrendingMusic: { language }, + getSectionEgwAudiobooks: { language }, + getSectionAudiobooks: { language }, }); return { From 8e6bbff4e41fc6d495fe583bcd4629ee5bf2f4a1 Mon Sep 17 00:00:00 2001 From: Jake Coble Date: Sun, 18 Aug 2024 14:46:53 -0400 Subject: [PATCH 2/9] Use generated infinite query function on sponsor page --- src/containers/sponsor/list/all.graphql | 2 +- src/containers/sponsor/list/all.tsx | 39 +++++++++++++------------ 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/containers/sponsor/list/all.graphql b/src/containers/sponsor/list/all.graphql index 428f08bf6..0f89a4a6c 100644 --- a/src/containers/sponsor/list/all.graphql +++ b/src/containers/sponsor/list/all.graphql @@ -1,4 +1,4 @@ -query getSponsorListAllPageData($language: Language!, $after: String) { +query getSponsorListAllPageData($language: Language!, $after: String = null) { sponsors( language: $language orderBy: [{ field: TITLE, direction: ASC }] diff --git a/src/containers/sponsor/list/all.tsx b/src/containers/sponsor/list/all.tsx index f574485ea..1a13325b0 100644 --- a/src/containers/sponsor/list/all.tsx +++ b/src/containers/sponsor/list/all.tsx @@ -1,15 +1,13 @@ -import { useInfiniteQuery } from '@tanstack/react-query'; import React, { useEffect, useRef } from 'react'; import { useIntl } from 'react-intl'; -import { fetchApi } from '~lib/api/fetchApi'; import useOnScreen from '~lib/hooks/useOnScreen'; import { useLanguageId } from '~lib/useLanguageId'; import { Maybe } from '~src/__generated__/graphql'; import { - GetSponsorListAllPageDataDocument, GetSponsorListAllPageDataQuery, + useInfiniteGetSponsorListAllPageDataQuery, } from './__generated__/all'; import Sponsors, { SponsorsProps } from './list'; @@ -21,29 +19,32 @@ export default function AllSponsors(props: Props) { const hasReachedEnd = useOnScreen(endRef); const language = useLanguageId(); - const { data, hasNextPage, fetchNextPage, isLoading } = useInfiniteQuery( - ['sponsors'], - ({ pageParam = null }) => - fetchApi(GetSponsorListAllPageDataDocument, { - variables: { - language, - after: pageParam, + const { data, hasNextPage, fetchNextPage, isLoading, isFetchingNextPage } = + useInfiniteGetSponsorListAllPageDataQuery( + 'after', + { language }, + { + getNextPageParam: (lastPage: Maybe) => { + const pageInfo = lastPage?.sponsors.pageInfo; + if (!pageInfo?.hasNextPage) return; + return { language, after: pageInfo.endCursor }; }, - }), - { - getNextPageParam: (lastPage: Maybe) => - lastPage?.sponsors.pageInfo.hasNextPage - ? lastPage.sponsors.pageInfo.endCursor - : undefined, - } - ); + } + ); useEffect(() => { if (!hasNextPage) return; if (!hasReachedEnd) return; if (isLoading) return; + if (isFetchingNextPage) return; fetchNextPage(); - }, [hasNextPage, hasReachedEnd, fetchNextPage, isLoading]); + }, [ + hasNextPage, + hasReachedEnd, + fetchNextPage, + isLoading, + isFetchingNextPage, + ]); const sponsors = data?.pages.flatMap((p) => p?.sponsors.nodes || []) || []; From f4b7fa767aa82e921ae125734e488cf44a084dca Mon Sep 17 00:00:00 2001 From: Jake Coble Date: Thu, 22 Aug 2024 14:57:14 -0400 Subject: [PATCH 3/9] Rename withAuthGuard query to getIsAuthenticated in hooks directory --- src/components/HOCs/withAuthGuard.spec.tsx | 7 +++---- src/components/HOCs/withAuthGuard.tsx | 4 ++-- src/components/molecules/player.tsx | 4 ++-- src/components/organisms/navigation.tsx | 4 ++-- .../hooks/useIsAuthenticated.graphql} | 2 +- src/lib/hooks/useIsAuthenticated.ts | 21 ++++++------------- src/lib/test/loadAuthGuardData.ts | 4 ++-- 7 files changed, 18 insertions(+), 28 deletions(-) rename src/{components/HOCs/withAuthGuard.graphql => lib/hooks/useIsAuthenticated.graphql} (58%) diff --git a/src/components/HOCs/withAuthGuard.spec.tsx b/src/components/HOCs/withAuthGuard.spec.tsx index 8e02fe963..ddf779d8b 100644 --- a/src/components/HOCs/withAuthGuard.spec.tsx +++ b/src/components/HOCs/withAuthGuard.spec.tsx @@ -9,10 +9,9 @@ import React, { ReactElement } from 'react'; import withAuthGuard from '~components/HOCs/withAuthGuard'; import { RegisterSocialDocument } from '~containers/account/__generated__/register'; import { fetchApi } from '~lib/api/fetchApi'; +import { GetIsAuthenticatedDocument } from '~lib/hooks/__generated__/useIsAuthenticated'; import renderWithProviders from '~lib/test/renderWithProviders'; -import { GetWithAuthGuardDataDocument } from './__generated__/withAuthGuard'; - function render() { const Comp = withAuthGuard(() => <>hello world); return (async function ( @@ -27,7 +26,7 @@ describe('withAuthGuard', () => { beforeEach(() => __loadRouter({ query: {} })); it('displays login if no email', async () => { when(fetchApi) - .calledWith(GetWithAuthGuardDataDocument, expect.anything()) + .calledWith(GetIsAuthenticatedDocument, expect.anything()) .mockResolvedValue({ me: { user: { @@ -74,7 +73,7 @@ describe('withAuthGuard', () => { }); when(fetchApi) - .calledWith(GetWithAuthGuardDataDocument, expect.anything()) + .calledWith(GetIsAuthenticatedDocument, expect.anything()) .mockResolvedValue({ me: { user: { diff --git a/src/components/HOCs/withAuthGuard.tsx b/src/components/HOCs/withAuthGuard.tsx index 6b1a892c4..24253450e 100644 --- a/src/components/HOCs/withAuthGuard.tsx +++ b/src/components/HOCs/withAuthGuard.tsx @@ -11,9 +11,9 @@ function withAuthGuard

( ): React.ComponentType

{ function WithAuthGuard(props: P) { const sessionToken = getSessionToken(getCurrentRequest()); - const { isUserLoggedIn, isLoading } = useIsAuthenticated(); + const { isUserLoggedIn, isFetching } = useIsAuthenticated(); - return (sessionToken && isLoading) || isUserLoggedIn ? ( + return (sessionToken && isFetching) || isUserLoggedIn ? ( ) : ( diff --git a/src/components/molecules/player.tsx b/src/components/molecules/player.tsx index d9b674778..6b84a22e8 100644 --- a/src/components/molecules/player.tsx +++ b/src/components/molecules/player.tsx @@ -3,7 +3,6 @@ import Image from 'next/legacy/image'; import React, { useContext, useEffect, useState } from 'react'; import { useIntl } from 'react-intl'; -import { useGetWithAuthGuardDataQuery } from '~components/HOCs/__generated__/withAuthGuard'; import ButtonDownload from '~components/molecules/buttonDownload'; import ButtonNudge from '~components/molecules/buttonNudge'; import ButtonPlay, { @@ -17,6 +16,7 @@ import { AndMiniplayerFragment } from '~components/templates/__generated__/andMi import { BaseColors } from '~lib/constants'; import { getSessionToken } from '~lib/cookies'; import hasVideo from '~lib/hasVideo'; +import { useGetIsAuthenticatedQuery } from '~lib/hooks/__generated__/useIsAuthenticated'; import useGlobalSpaceDown from '~lib/useGlobalSpaceDown'; import usePlaybackSession from '~lib/usePlaybackSession'; import IconAirPlayAudio from '~public/img/icon-airplay-audio.svg'; @@ -85,7 +85,7 @@ const Player = ({ : BaseColors.DARK; const sessionToken = getSessionToken(); // i will see if this give any issue - const authResult = useGetWithAuthGuardDataQuery( + const authResult = useGetIsAuthenticatedQuery( {}, { enabled: !!sessionToken, diff --git a/src/components/organisms/navigation.tsx b/src/components/organisms/navigation.tsx index 60b8fd8a7..b0dde52b9 100644 --- a/src/components/organisms/navigation.tsx +++ b/src/components/organisms/navigation.tsx @@ -6,7 +6,6 @@ import { FormattedMessage, useIntl } from 'react-intl'; import Heading3 from '~components/atoms/heading3'; import Heading6 from '~components/atoms/heading6'; -import { useGetWithAuthGuardDataQuery } from '~components/HOCs/__generated__/withAuthGuard'; import Button from '~components/molecules/button'; import DownloadAppButton from '~components/molecules/downloadAppButton'; import LanguageButton from '~components/molecules/languageButton'; @@ -14,6 +13,7 @@ import NavItem from '~components/molecules/navItem'; import SearchBar from '~components/molecules/searchBar'; import Header from '~components/organisms/header'; import { getSessionToken, setSessionToken } from '~lib/cookies'; +import { useGetIsAuthenticatedQuery } from '~lib/hooks/__generated__/useIsAuthenticated'; import root from '~lib/routes'; import useLanguageRoute from '~lib/useLanguageRoute'; import { INavigationItem, useNavigationItems } from '~lib/useNavigationItems'; @@ -62,7 +62,7 @@ const Navigation = ({ } }, [router.asPath, sessionToken]); - const authResult = useGetWithAuthGuardDataQuery( + const authResult = useGetIsAuthenticatedQuery( {}, { enabled: !!sessionToken, diff --git a/src/components/HOCs/withAuthGuard.graphql b/src/lib/hooks/useIsAuthenticated.graphql similarity index 58% rename from src/components/HOCs/withAuthGuard.graphql rename to src/lib/hooks/useIsAuthenticated.graphql index 34ddd6ab8..795f870d5 100644 --- a/src/components/HOCs/withAuthGuard.graphql +++ b/src/lib/hooks/useIsAuthenticated.graphql @@ -1,4 +1,4 @@ -query getWithAuthGuardData { +query getIsAuthenticated { me { user { email diff --git a/src/lib/hooks/useIsAuthenticated.ts b/src/lib/hooks/useIsAuthenticated.ts index fdb34e9e4..6640ef78d 100644 --- a/src/lib/hooks/useIsAuthenticated.ts +++ b/src/lib/hooks/useIsAuthenticated.ts @@ -1,22 +1,13 @@ -import { UseQueryResult } from '@tanstack/react-query'; +import { useGetIsAuthenticatedQuery } from './__generated__/useIsAuthenticated'; -import { - GetWithAuthGuardDataQuery, - useGetWithAuthGuardDataQuery, -} from '~components/HOCs/__generated__/withAuthGuard'; -import { getSessionToken } from '~lib/cookies'; - -export default function useIsAuthenticated(): UseQueryResult< - GetWithAuthGuardDataQuery, - unknown -> & { +export default function useIsAuthenticated(): { isUserLoggedIn: boolean; + isFetching: boolean; } { - const token = getSessionToken(); - const result = useGetWithAuthGuardDataQuery({}, { retry: false }); + const { data, isFetching } = useGetIsAuthenticatedQuery({}, { retry: false }); return { - ...result, - isUserLoggedIn: !!token && !!result.data?.me?.user.email, + isUserLoggedIn: !!data?.me?.user.email, + isFetching, }; } diff --git a/src/lib/test/loadAuthGuardData.ts b/src/lib/test/loadAuthGuardData.ts index 1753d171e..8f71d8546 100644 --- a/src/lib/test/loadAuthGuardData.ts +++ b/src/lib/test/loadAuthGuardData.ts @@ -1,14 +1,14 @@ import { when } from 'jest-when'; import Cookie from 'js-cookie'; -import { GetWithAuthGuardDataDocument } from '~components/HOCs/__generated__/withAuthGuard'; import { fetchApi } from '~lib/api/fetchApi'; +import { GetIsAuthenticatedDocument } from '~lib/hooks/__generated__/useIsAuthenticated'; export function loadAuthGuardData(email: any = 'the_email'): void { Cookie.get = jest.fn().mockReturnValue({ avSession: 'abc123' }); when(fetchApi) - .calledWith(GetWithAuthGuardDataDocument, expect.anything()) + .calledWith(GetIsAuthenticatedDocument, expect.anything()) .mockResolvedValue({ me: { user: { From def771235c17bf0721a8267d0f97a637cfd22f93 Mon Sep 17 00:00:00 2001 From: Jake Coble Date: Mon, 2 Sep 2024 10:02:15 -0400 Subject: [PATCH 4/9] Replace useGetIsAuthenticatedQuery with useIsAuthenticated --- src/components/molecules/player.tsx | 15 +++------------ src/components/organisms/navigation.tsx | 11 ++--------- src/lib/hooks/useIsAuthenticated.ts | 2 ++ 3 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/components/molecules/player.tsx b/src/components/molecules/player.tsx index 6b84a22e8..125479b96 100644 --- a/src/components/molecules/player.tsx +++ b/src/components/molecules/player.tsx @@ -14,9 +14,7 @@ import PlaybackTimes from '~components/molecules/playbackTimes'; import RecordingProgressBar from '~components/molecules/recordingProgressBar'; import { AndMiniplayerFragment } from '~components/templates/__generated__/andMiniplayer'; import { BaseColors } from '~lib/constants'; -import { getSessionToken } from '~lib/cookies'; import hasVideo from '~lib/hasVideo'; -import { useGetIsAuthenticatedQuery } from '~lib/hooks/__generated__/useIsAuthenticated'; import useGlobalSpaceDown from '~lib/useGlobalSpaceDown'; import usePlaybackSession from '~lib/usePlaybackSession'; import IconAirPlayAudio from '~public/img/icon-airplay-audio.svg'; @@ -24,6 +22,7 @@ import IconChromeCast from '~public/img/icon-chromecast.svg'; import IconFullscreen from '~public/img/icons/icon-fullscreen.svg'; import IconPause from '~public/img/icons/icon-pause-large.svg'; import IconPlay from '~public/img/icons/icon-play-large.svg'; +import useIsAuthenticated from '~src/lib/hooks/useIsAuthenticated'; import { PlaybackContext } from '../templates/andPlaybackContext'; import { PlayerFragment } from './__generated__/player'; @@ -84,15 +83,7 @@ const Player = ({ ? BaseColors.WHITE : BaseColors.DARK; - const sessionToken = getSessionToken(); // i will see if this give any issue - const authResult = useGetIsAuthenticatedQuery( - {}, - { - enabled: !!sessionToken, - retry: false, - } - ); - const user = authResult.data?.me?.user; + const { isUserLoggedIn } = useIsAuthenticated(); return (

- {user ? ( + {isUserLoggedIn ? ( ) : ( diff --git a/src/components/organisms/navigation.tsx b/src/components/organisms/navigation.tsx index b0dde52b9..32be95d63 100644 --- a/src/components/organisms/navigation.tsx +++ b/src/components/organisms/navigation.tsx @@ -13,7 +13,6 @@ import NavItem from '~components/molecules/navItem'; import SearchBar from '~components/molecules/searchBar'; import Header from '~components/organisms/header'; import { getSessionToken, setSessionToken } from '~lib/cookies'; -import { useGetIsAuthenticatedQuery } from '~lib/hooks/__generated__/useIsAuthenticated'; import root from '~lib/routes'; import useLanguageRoute from '~lib/useLanguageRoute'; import { INavigationItem, useNavigationItems } from '~lib/useNavigationItems'; @@ -21,6 +20,7 @@ import IconUser from '~public/img/icons/fa-user-heavy.svg'; import IconDisclosure from '~public/img/icons/icon-disclosure-light-small.svg'; import IconExit from '~public/img/icons/icon-exit.svg'; import { BaseColors } from '~src/lib/constants'; +import useIsAuthenticated from '~src/lib/hooks/useIsAuthenticated'; import { analytics } from '../../lib/analytics'; import IconButton from '../molecules/iconButton'; @@ -62,14 +62,7 @@ const Navigation = ({ } }, [router.asPath, sessionToken]); - const authResult = useGetIsAuthenticatedQuery( - {}, - { - enabled: !!sessionToken, - retry: false, - } - ); - const user = authResult.data?.me?.user; + const { user } = useIsAuthenticated(); const navigationItems = useNavigationItems(); const submenuItem = navigationItems.find( diff --git a/src/lib/hooks/useIsAuthenticated.ts b/src/lib/hooks/useIsAuthenticated.ts index 6640ef78d..54387f38f 100644 --- a/src/lib/hooks/useIsAuthenticated.ts +++ b/src/lib/hooks/useIsAuthenticated.ts @@ -3,11 +3,13 @@ import { useGetIsAuthenticatedQuery } from './__generated__/useIsAuthenticated'; export default function useIsAuthenticated(): { isUserLoggedIn: boolean; isFetching: boolean; + user?: { name: string; email: string }; } { const { data, isFetching } = useGetIsAuthenticatedQuery({}, { retry: false }); return { isUserLoggedIn: !!data?.me?.user.email, isFetching, + user: data?.me?.user, }; } From e553d404fb7dab4f9ffbe6901b0b6d2e600070fc Mon Sep 17 00:00:00 2001 From: Jake Coble Date: Thu, 5 Sep 2024 16:00:25 -0400 Subject: [PATCH 5/9] Add getIsAuthenticated to user session query keys --- src/lib/api/login.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/api/login.ts b/src/lib/api/login.ts index 098b6dfa3..e49b890ad 100644 --- a/src/lib/api/login.ts +++ b/src/lib/api/login.ts @@ -6,7 +6,7 @@ import { analytics } from '../analytics'; import { login as _login } from './__generated__/login'; export const USER_SESSION_QUERY_KEYS = [ - ['getWithAuthGuardData'], + ['getIsAuthenticated'], ['getProfileData'], ['isCollectionFavorited'], ['collectionIsFavorited'], From fb00185cdb15ff99dab90577dfce56796e0d4e97 Mon Sep 17 00:00:00 2001 From: Jake Coble Date: Sun, 22 Sep 2024 11:26:32 -0400 Subject: [PATCH 6/9] Whitelist CVE --- audit-ci.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/audit-ci.json b/audit-ci.json index 761d54738..19c5ddd34 100644 --- a/audit-ci.json +++ b/audit-ci.json @@ -26,6 +26,7 @@ "GHSA-qw6h-vgh9-j6wx", // Used by lighthouse CI, not at runtime "GHSA-m6fv-jmcg-4jfg", // Used by lighthouse CI, not at runtime "GHSA-m6fv-jmcg-4jfg", // Used by lighthouse CI, not at runtime - "GHSA-cm22-4g7w-348p" // Used by lighthouse CI, not at runtime + "GHSA-cm22-4g7w-348p", // Used by lighthouse CI, not at runtime + "GHSA-gp8f-8m3g-qvj9" // Deployments on Vercel are not affected ] } From 921fa3c6561a5b4dda656fad74b79353fe3cf7ba Mon Sep 17 00:00:00 2001 From: Jake Coble Date: Fri, 27 Sep 2024 10:55:12 -0400 Subject: [PATCH 7/9] Fix generated query keys in doPrefetch --- graphql-codegen/graphql-plugin-prefetch.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/graphql-codegen/graphql-plugin-prefetch.ts b/graphql-codegen/graphql-plugin-prefetch.ts index 253ab6e4f..3596df969 100644 --- a/graphql-codegen/graphql-plugin-prefetch.ts +++ b/graphql-codegen/graphql-plugin-prefetch.ts @@ -26,8 +26,13 @@ const options = { cacheTime: 24 * 60 * 60 * 1000 }; async function doPrefetch(k: T, v: Vars[T], client: QueryClient) { const r = await fns[k](v as any); - await client.prefetchQuery([k, v], () => r, options); - await client.prefetchInfiniteQuery([\`\${k}.infinite\`, v], () => r, options); + + const hasVars = Object.keys(v as any).length > 0; + const queryKey = hasVars ? [k, v] : [k]; + const infiniteQueryKey = hasVars ? [\`\${k}.infinite\`, v] : [\`\${k}.infinite\`]; + + await client.prefetchQuery(queryKey, () => r, options); + await client.prefetchInfiniteQuery(infiniteQueryKey, () => r, options); } export async function prefetchQueries( From c597584fa906ce93e1c8e70984709dafd577aa98 Mon Sep 17 00:00:00 2001 From: Henry Orozco Date: Fri, 27 Sep 2024 09:47:00 -0600 Subject: [PATCH 8/9] refactor: use codegen hook for useGetLibraryPlaylistPageDataQuery --- .../library/playlist/libraryPlaylistDetail.tsx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/containers/library/playlist/libraryPlaylistDetail.tsx b/src/containers/library/playlist/libraryPlaylistDetail.tsx index 449149546..d10a294bc 100644 --- a/src/containers/library/playlist/libraryPlaylistDetail.tsx +++ b/src/containers/library/playlist/libraryPlaylistDetail.tsx @@ -1,4 +1,3 @@ -import { useQuery } from '@tanstack/react-query'; import { useRouter } from 'next/router'; import React from 'react'; @@ -6,17 +5,14 @@ import NotFound from '~components/organisms/notFound'; import PlaylistDetail from '~containers/library/playlist/detail'; import LoadingCards from '~src/components/molecules/loadingCards'; -import { getLibraryPlaylistPageData } from './__generated__/detail'; +import { useGetLibraryPlaylistPageDataQuery } from './__generated__/detail'; function LibraryPlaylistDetail(): JSX.Element { const router = useRouter(); const playlistId = router.query.playlist as string; - - const { data, isLoading } = useQuery( - ['getLibraryPlaylistPageData', { id: playlistId }], - () => getLibraryPlaylistPageData({ id: playlistId }), - { staleTime: Infinity } - ); + const { data, isLoading } = useGetLibraryPlaylistPageDataQuery({ + id: playlistId, + }); if (isLoading) { return ; From 50a949b9dbcd6b232224bf1c1a6db5072708310e Mon Sep 17 00:00:00 2001 From: Jake Coble Date: Fri, 27 Sep 2024 11:51:16 -0400 Subject: [PATCH 9/9] Update vulnerable dependency --- package-lock.json | 7 ++++--- package.json | 6 ++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb3b31e95..6a835419b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "react-facebook-login": "^4.1.1", "react-google-login": "^5.2.2", "react-intl": "^6.4.4", + "rollup": "^2.79.2", "sass": "^1.42.1", "sharp": "^0.33.4", "striptags": "^3.2.0", @@ -27715,9 +27716,9 @@ } }, "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "bin": { "rollup": "dist/bin/rollup" }, diff --git a/package.json b/package.json index 1fc928222..1e948fe4e 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "react-facebook-login": "^4.1.1", "react-google-login": "^5.2.2", "react-intl": "^6.4.4", + "rollup": "^2.79.2", "sass": "^1.42.1", "sharp": "^0.33.4", "striptags": "^3.2.0", @@ -144,6 +145,11 @@ "type-fest": "^4.3.1", "typescript": "^5.1.6" }, + "overrides": { + "next-pwa": { + "rollup": "$rollup" + } + }, "nextBundleAnalysis": { "budget": 230400, "budgetPercentIncreaseRed": 5,