diff --git a/package.json b/package.json index 5bfdbdd..43fc654 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,9 @@ "packageManager": "pnpm@7.0.0", "scripts": { "install": "turbo run post-install --parallel --no-cache", - "build": "ross-env-shell IS_ELECTRON=yes turbo run build", + "build": "cross-env-shell IS_ELECTRON=yes turbo run build", "build:web": "turbo run build:web", + "pack": "turbo run build pack", "dev": "cross-env-shell IS_ELECTRON=yes turbo run dev --parallel", "lint": "turbo run lint", "format": "prettier --write \"**/*.{ts,tsx,js,jsx,md}\"", @@ -24,9 +25,9 @@ }, "devDependencies": { "cross-env": "^7.0.3", - "eslint": "^8.16.0", + "eslint": "^8.17.0", "prettier": "^2.6.2", - "turbo": "^1.2.14", - "typescript": "^4.7.2" + "turbo": "^1.2.16", + "typescript": "^4.7.3" } } diff --git a/packages/electron/.electron-builder.config.js b/packages/electron/.electron-builder.config.js index 8f935e9..d86f4ff 100644 --- a/packages/electron/.electron-builder.config.js +++ b/packages/electron/.electron-builder.config.js @@ -6,15 +6,15 @@ module.exports = { appId: 'com.qier222.yesplaymusic', productName: 'YesPlayMusic', - copyright: 'Copyright © 2022 ${author}', - asar: true, + copyright: 'Copyright © 2022 qier222', + asar: false, directories: { output: 'release', buildResources: 'build', }, npmRebuild: false, buildDependenciesFromSource: true, - files: ['./dist'], + electronVersion: '19.0.3', publish: [ { provider: 'github', @@ -98,16 +98,8 @@ module.exports = { icon: './build/icon.icns', }, files: [ - 'dist/main/**/*', - 'dist/renderer/**/*', - { - from: 'packages/electron/migrations', - to: 'dist/main/migrations', - }, - { - from: 'src/main/assets', - to: 'dist/main/assets', - }, + '!**/*.ts', + '!**/node_modules/better-sqlite3/{bin,build,deps}/**', '!**/node_modules/*/{*.MD,*.md,README,readme}', '!**/node_modules/*/{test,__tests__,tests,powered-test,example,examples}', '!**/node_modules/*.d.ts', @@ -120,5 +112,24 @@ module.exports = { '!**/{appveyor.yml,.travis.yml,circle.yml}', '!**/{npm-debug.log,yarn.lock,.yarn-integrity,.yarn-metadata.json,pnpm-lock.yaml}', '!**/*.{map,debug.min.js}', + + '!**/dist/binary', + { + from: './dist', + to: './main', + }, + { + from: '../web/dist', + to: './web', + }, + { + from: './migrations', + to: 'main/migrations', + }, + { + from: './assets', + to: 'main/assets', + }, + './main', ], } diff --git a/build/icons/1024x1024.png b/packages/electron/build/icons/1024x1024.png similarity index 100% rename from build/icons/1024x1024.png rename to packages/electron/build/icons/1024x1024.png diff --git a/build/icons/128x128.png b/packages/electron/build/icons/128x128.png similarity index 100% rename from build/icons/128x128.png rename to packages/electron/build/icons/128x128.png diff --git a/build/icons/16x16.png b/packages/electron/build/icons/16x16.png similarity index 100% rename from build/icons/16x16.png rename to packages/electron/build/icons/16x16.png diff --git a/build/icons/24x24.png b/packages/electron/build/icons/24x24.png similarity index 100% rename from build/icons/24x24.png rename to packages/electron/build/icons/24x24.png diff --git a/build/icons/256x256.png b/packages/electron/build/icons/256x256.png similarity index 100% rename from build/icons/256x256.png rename to packages/electron/build/icons/256x256.png diff --git a/build/icons/32x32.png b/packages/electron/build/icons/32x32.png similarity index 100% rename from build/icons/32x32.png rename to packages/electron/build/icons/32x32.png diff --git a/build/icons/48x48.png b/packages/electron/build/icons/48x48.png similarity index 100% rename from build/icons/48x48.png rename to packages/electron/build/icons/48x48.png diff --git a/build/icons/512x512.png b/packages/electron/build/icons/512x512.png similarity index 100% rename from build/icons/512x512.png rename to packages/electron/build/icons/512x512.png diff --git a/build/icons/64x64.png b/packages/electron/build/icons/64x64.png similarity index 100% rename from build/icons/64x64.png rename to packages/electron/build/icons/64x64.png diff --git a/build/icons/icon.icns b/packages/electron/build/icons/icon.icns similarity index 100% rename from build/icons/icon.icns rename to packages/electron/build/icons/icon.icns diff --git a/build/icons/icon.ico b/packages/electron/build/icons/icon.ico similarity index 100% rename from build/icons/icon.ico rename to packages/electron/build/icons/icon.ico diff --git a/build/icons/icon.png b/packages/electron/build/icons/icon.png similarity index 100% rename from build/icons/icon.png rename to packages/electron/build/icons/icon.png diff --git a/build/icons/menu@88.png b/packages/electron/build/icons/menu@88.png similarity index 100% rename from build/icons/menu@88.png rename to packages/electron/build/icons/menu@88.png diff --git a/packages/electron/package.json b/packages/electron/package.json index 59d83ec..65e6b51 100644 --- a/packages/electron/package.json +++ b/packages/electron/package.json @@ -2,11 +2,13 @@ "name": "electron", "private": true, "version": "2.0.0", - "main": "./index.js", + "main": "./main/index.js", + "author": "*", "scripts": { "post-install": "node scripts/build.sqlite3.js", "dev": "node scripts/build.main.mjs --watch", "build": "node scripts/build.main.mjs", + "pack": "electron-builder build -c .electron-builder.config.js", "test:types": "tsc --noEmit --project src/main/tsconfig.json", "lint": "eslint --ext .ts,.js ./", "format": "prettier --write './**/*.{ts,js,tsx,jsx}'" @@ -18,7 +20,7 @@ "@sentry/node": "^6.19.7", "@sentry/tracing": "^6.19.7", "@unblockneteasemusic/rust-napi": "^0.3.0", - "NeteaseCloudMusicApi": "^4.6.0", + "NeteaseCloudMusicApi": "^4.6.2", "better-sqlite3": "7.5.1", "change-case": "^4.1.2", "compare-versions": "^4.1.3", @@ -26,7 +28,7 @@ "electron-log": "^4.4.6", "electron-store": "^8.0.1", "express": "^4.18.1", - "fast-folder-size": "^1.6.1", + "fast-folder-size": "^1.7.0", "pretty-bytes": "^6.0.0" }, "devDependencies": { @@ -35,18 +37,18 @@ "@types/cookie-parser": "^1.4.3", "@types/express": "^4.17.13", "@types/express-fileupload": "^1.2.2", - "@typescript-eslint/eslint-plugin": "^5.26.0", - "@typescript-eslint/parser": "^5.26.0", + "@typescript-eslint/eslint-plugin": "^5.27.0", + "@typescript-eslint/parser": "^5.27.0", "@vitejs/plugin-react": "^1.3.1", "axios": "^0.27.2", "cross-env": "^7.0.3", "dotenv": "^16.0.0", - "electron": "^19.0.1", + "electron": "^19.0.3", "electron-builder": "^23.0.3", "electron-devtools-installer": "^3.2.0", "electron-rebuild": "^3.2.7", - "electron-releases": "^3.1021.0", - "esbuild": "^0.14.41", + "electron-releases": "^3.1026.0", + "esbuild": "^0.14.42", "eslint": "*", "express-fileupload": "^1.4.0", "minimist": "^1.2.6", @@ -59,6 +61,6 @@ "wait-on": "^6.0.1" }, "resolutions": { - "@electron/universal": "1.2.1" + "@electron/universal": "1.3.0" } } diff --git a/packages/shared/api/User.ts b/packages/shared/api/User.ts index 7b8316b..ef996e0 100644 --- a/packages/shared/api/User.ts +++ b/packages/shared/api/User.ts @@ -4,6 +4,7 @@ export enum UserApiNames { FetchUserPlaylists = 'fetchUserPlaylists', FetchUserAlbums = 'fetchUserAlbums', FetchUserArtist = 'fetchUserArtists', + FetchListenedRecords = 'fetchListenedRecords', } // 获取账号详情 diff --git a/packages/web/AppNew.tsx b/packages/web/AppNew.tsx index b3f22f5..fe118aa 100644 --- a/packages/web/AppNew.tsx +++ b/packages/web/AppNew.tsx @@ -3,16 +3,19 @@ import TitleBar from '@/web/components/TitleBar' import IpcRendererReact from '@/web/IpcRendererReact' import Layout from '@/web/components/New/Layout' import Devtool from '@/web/components/New/Devtool' +import ErrorBoundary from '@/web/components/New/ErrorBoundary' const App = () => { return ( -
- {window.env?.isEnableTitlebar && } - - - - -
+ +
+ {window.env?.isEnableTitlebar && } + + + + +
+
) } diff --git a/packages/web/api/hooks/useAlbum.ts b/packages/web/api/hooks/useAlbum.ts index 0cc0a3d..cfddf59 100644 --- a/packages/web/api/hooks/useAlbum.ts +++ b/packages/web/api/hooks/useAlbum.ts @@ -17,6 +17,12 @@ const fetch = async (params: FetchAlbumParams, noCache?: boolean) => { return album } +const fetchFromCache = (id: number): FetchAlbumResponse => + window.ipcRenderer?.sendSync(IpcChannels.GetApiCacheSync, { + api: APIs.Album, + query: { id }, + }) + export default function useAlbum(params: FetchAlbumParams, noCache?: boolean) { return useQuery( [AlbumApiNames.FetchAlbum, params.id], @@ -24,13 +30,7 @@ export default function useAlbum(params: FetchAlbumParams, noCache?: boolean) { { enabled: !!params.id, staleTime: 24 * 60 * 60 * 1000, // 24 hours - placeholderData: (): FetchAlbumResponse => - window.ipcRenderer?.sendSync(IpcChannels.GetApiCacheSync, { - api: APIs.Album, - query: { - id: params.id, - }, - }), + placeholderData: () => fetchFromCache(params.id), } ) } @@ -46,6 +46,7 @@ export function fetchAlbumWithReactQuery(params: FetchAlbumParams) { } export async function prefetchAlbum(params: FetchAlbumParams) { + if (fetchFromCache(params.id)) return await reactQueryClient.prefetchQuery( [AlbumApiNames.FetchAlbum, params.id], () => fetch(params), diff --git a/packages/web/api/hooks/useArtists.ts b/packages/web/api/hooks/useArtists.ts new file mode 100644 index 0000000..d66268c --- /dev/null +++ b/packages/web/api/hooks/useArtists.ts @@ -0,0 +1,27 @@ +import { fetchArtist } from '@/web/api/artist' +import { IpcChannels } from '@/shared/IpcChannels' +import { APIs } from '@/shared/CacheAPIs' +import { + FetchArtistParams, + ArtistApiNames, + FetchArtistResponse, +} from '@/shared/api/Artist' +import { useQuery } from 'react-query' + +export default function useArtists(ids: number[]) { + return useQuery( + ['fetchArtists', ids], + () => Promise.all(ids.map(id => fetchArtist({ id }, false))), + { + enabled: !!ids && ids.length > 0, + staleTime: 5 * 60 * 1000, // 5 mins + // placeholderData: (): FetchArtistResponse[] => + // window.ipcRenderer?.sendSync(IpcChannels.GetApiCacheSync, { + // api: APIs.Artist, + // query: { + // ids, + // }, + // }), + } + ) +} diff --git a/packages/web/api/hooks/usePlaylist.ts b/packages/web/api/hooks/usePlaylist.ts index 96ce4fa..91cf025 100644 --- a/packages/web/api/hooks/usePlaylist.ts +++ b/packages/web/api/hooks/usePlaylist.ts @@ -13,6 +13,12 @@ const fetch = (params: FetchPlaylistParams, noCache?: boolean) => { return fetchPlaylist(params, !!noCache) } +export const fetchFromCache = (id: number): FetchPlaylistResponse | undefined => + window.ipcRenderer?.sendSync(IpcChannels.GetApiCacheSync, { + api: APIs.Playlist, + query: { id }, + }) + export default function usePlaylist( params: FetchPlaylistParams, noCache?: boolean @@ -23,13 +29,7 @@ export default function usePlaylist( { enabled: !!(params.id && params.id > 0 && !isNaN(Number(params.id))), refetchOnWindowFocus: true, - placeholderData: (): FetchPlaylistResponse | undefined => - window.ipcRenderer?.sendSync(IpcChannels.GetApiCacheSync, { - api: APIs.Playlist, - query: { - id: params.id, - }, - }), + placeholderData: () => fetchFromCache(params.id), } ) } @@ -45,6 +45,7 @@ export function fetchPlaylistWithReactQuery(params: FetchPlaylistParams) { } export async function prefetchPlaylist(params: FetchPlaylistParams) { + if (fetchFromCache(params.id)) return await reactQueryClient.prefetchQuery( [PlaylistApiNames.FetchPlaylist, params], () => fetch(params), diff --git a/packages/web/api/hooks/useUserListenedRecords.ts b/packages/web/api/hooks/useUserListenedRecords.ts new file mode 100644 index 0000000..d2a93eb --- /dev/null +++ b/packages/web/api/hooks/useUserListenedRecords.ts @@ -0,0 +1,33 @@ +import { + fetchListenedRecords, + FetchListenedRecordsParams, +} from '@/web/api/user' +import { UserApiNames } from '@/shared/api/User' +import { APIs } from '@/shared/CacheAPIs' +import { IpcChannels } from '@/shared/IpcChannels' +import { useQuery } from 'react-query' +import useUser from './useUser' + +export default function useUserListenedRecords(params: { + type: 'week' | 'all' +}) { + const { data: user } = useUser() + const uid = user?.account?.id || 0 + + return useQuery( + [UserApiNames.FetchListenedRecords], + () => + fetchListenedRecords({ + uid, + type: params.type === 'week' ? 1 : 0, + }), + { + refetchOnWindowFocus: false, + enabled: !!uid, + // placeholderData: (): FetchUserArtistsResponse => + // window.ipcRenderer?.sendSync(IpcChannels.GetApiCacheSync, { + // api: APIs.UserArtists, + // }), + } + ) +} diff --git a/packages/web/api/user.ts b/packages/web/api/user.ts index 6c74658..6092bd6 100644 --- a/packages/web/api/user.ts +++ b/packages/web/api/user.ts @@ -62,6 +62,47 @@ export function fetchUserLikedTracksIDs( }) } +// 听歌打卡 +export function scrobble(params: { + id: number // track id + sourceid: number // 歌单或专辑id + time?: number // 已听秒数 +}): Promise { + return request({ + url: '/scrobble', + method: 'post', + params: { + ...params, + timestamp: new Date().getTime(), + }, + }) +} + +export interface FetchListenedRecordsParams { + uid: number // 用户id + type: number // type=1 时只返回 weekData, type=0 时返回 allData +} +export interface FetchListenedRecordsResponse { + code: number + weekData: { + playCount: number + score: number + song: Track + }[] +} +export function fetchListenedRecords( + params: FetchListenedRecordsParams +): Promise { + return request({ + url: '/user/record', + method: 'get', + params: { + ...params, + timestamp: new Date().getTime(), + }, + }) +} + /** * 每日签到 * 说明 : 调用此接口可签到获取积分 diff --git a/packages/web/assets/icons/heart.svg b/packages/web/assets/icons/heart.svg index 50426fd..ac6c718 100644 --- a/packages/web/assets/icons/heart.svg +++ b/packages/web/assets/icons/heart.svg @@ -1,3 +1,3 @@ - - + + diff --git a/packages/web/components/New/CoverRow.tsx b/packages/web/components/New/CoverRow.tsx index e0c9272..4b334d8 100644 --- a/packages/web/components/New/CoverRow.tsx +++ b/packages/web/components/New/CoverRow.tsx @@ -2,6 +2,8 @@ import { resizeImage } from '@/web/utils/common' import { cx } from '@emotion/css' import { useNavigate } from 'react-router-dom' import Image from './Image' +import { prefetchAlbum } from '@/web/api/hooks/useAlbum' +import { prefetchPlaylist } from '@/web/api/hooks/usePlaylist' const CoverRow = ({ albums, @@ -21,6 +23,11 @@ const CoverRow = ({ if (playlists) navigate(`/playlist/${id}`) } + const prefetch = (id: number) => { + if (albums) prefetchAlbum({ id }) + if (playlists) prefetchPlaylist({ id }) + } + return (
{/* Title */} @@ -39,6 +46,7 @@ const CoverRow = ({ alt={album.name} src={resizeImage(album?.picUrl || '', 'md')} className='aspect-square rounded-24' + onMouseOver={() => prefetch(album.id)} /> ))} {playlists?.map(playlist => ( @@ -46,8 +54,12 @@ const CoverRow = ({ onClick={() => goTo(playlist.id)} key={playlist.id} alt={playlist.name} - src={resizeImage(playlist?.picUrl || '', 'md')} + src={resizeImage( + playlist.coverImgUrl || playlist?.picUrl || '', + 'md' + )} className='aspect-square rounded-24' + onMouseOver={() => prefetch(playlist.id)} /> ))}
diff --git a/packages/web/components/New/CoverWall.tsx b/packages/web/components/New/CoverWall.tsx index af49e2a..c793fa6 100644 --- a/packages/web/components/New/CoverWall.tsx +++ b/packages/web/components/New/CoverWall.tsx @@ -1,19 +1,16 @@ import { css, cx } from '@emotion/css' -import { sampleSize, shuffle } from 'lodash-es' import Image from './Image' -import { covers } from '@/web/.storybook/mock/tracks' import { resizeImage } from '@/web/utils/common' import useBreakpoint from '@/web/hooks/useBreakpoint' -import { useMemo } from 'react' +import { useNavigate } from 'react-router-dom' +import { prefetchAlbum } from '@/web/api/hooks/useAlbum' -const CoverWall = () => { - const bigCover = useMemo( - () => - shuffle( - sampleSize([...Array(covers.length).keys()], ~~(covers.length / 3)) - ), - [] - ) +const CoverWall = ({ + albums, +}: { + albums: { id: number; coverUrl: string; large: boolean }[] +}) => { + const navigate = useNavigate() const breakpoint = useBreakpoint() const sizes = { small: { @@ -23,7 +20,7 @@ const CoverWall = () => { xl: 'sm', '2xl': 'md', }, - big: { + large: { sm: 'xs', md: 'sm', lg: 'md', @@ -41,19 +38,21 @@ const CoverWall = () => { ` )} > - {covers.map((cover, index) => ( + {albums.map(album => ( Album Cover navigate(`/album/${album.id}`)} + onMouseOver={() => prefetchAlbum({ id: album.id })} /> ))} diff --git a/packages/web/components/New/ErrorBoundary.tsx b/packages/web/components/New/ErrorBoundary.tsx new file mode 100644 index 0000000..81de4d0 --- /dev/null +++ b/packages/web/components/New/ErrorBoundary.tsx @@ -0,0 +1,43 @@ +import { ReactNode } from 'react' +import { ErrorBoundary as ErrorBoundaryRaw } from 'react-error-boundary' + +function ErrorFallback({ + error, + resetErrorBoundary, +}: { + error: Error + resetErrorBoundary: () => void +}) { + return ( +
+
+

Something went wrong:

+
{error.message}
+ +
+
+ ) +} + +const ErrorBoundary = ({ children }: { children: ReactNode }) => { + return ( + { + // reset the state of your app so the error doesn't happen again + }} + > + {children} + + ) +} + +export default ErrorBoundary diff --git a/packages/web/components/New/Image.tsx b/packages/web/components/New/Image.tsx index 0d19b42..45d1c34 100644 --- a/packages/web/components/New/Image.tsx +++ b/packages/web/components/New/Image.tsx @@ -12,6 +12,7 @@ const Image = ({ sizes, placeholder = 'blank', onClick, + onMouseOver, }: { src?: string srcSet?: string @@ -21,6 +22,7 @@ const Image = ({ lazyLoad?: boolean placeholder?: 'artist' | 'album' | 'playlist' | 'podcast' | 'blank' | null onClick?: (e: React.MouseEvent) => void + onMouseOver?: (e: React.MouseEvent) => void }) => { const [loaded, setLoaded] = useState(false) const [error, setError] = useState(false) @@ -57,6 +59,7 @@ const Image = ({ initial={{ opacity: 0 }} transition={transition} onClick={onClick} + onMouseOver={onMouseOver} /> {/* Placeholder / Error fallback */} diff --git a/packages/web/components/New/Layout.tsx b/packages/web/components/New/Layout.tsx index 928bc33..dba2374 100644 --- a/packages/web/components/New/Layout.tsx +++ b/packages/web/components/New/Layout.tsx @@ -9,18 +9,19 @@ import { useSnapshot } from 'valtio' const Layout = () => { const playerSnapshot = useSnapshot(player) - const track = useMemo(() => playerSnapshot.track, [playerSnapshot]) + const showPlayer = useMemo(() => !!playerSnapshot.track, [playerSnapshot]) return (
{
- {track && } + {showPlayer && }
) } diff --git a/packages/web/components/New/NowPlaying.tsx b/packages/web/components/New/NowPlaying.tsx index 6d1092b..17c5b55 100644 --- a/packages/web/components/New/NowPlaying.tsx +++ b/packages/web/components/New/NowPlaying.tsx @@ -45,18 +45,21 @@ const Cover = () => { const duration = 150 // ms useEffect(() => { - const cover = resizeImage(playerSnapshot.track?.al.picUrl || '', 'lg') + const resizedCover = resizeImage( + playerSnapshot.track?.al.picUrl || '', + 'lg' + ) const animate = async () => { animationStartTime.current = Date.now() await controls.start({ opacity: 0 }) - setCover(cover) + setCover(resizedCover) } animate() }, [controls, playerSnapshot.track?.al.picUrl]) // 防止狂点下一首或上一首造成封面与歌曲不匹配的问题 useEffect(() => { - const realCover = playerSnapshot.track?.al.picUrl ?? '' + const realCover = resizeImage(playerSnapshot.track?.al.picUrl ?? '', 'lg') if (cover !== realCover) setCover(realCover) }, [cover, playerSnapshot.track?.al.picUrl]) @@ -156,7 +159,7 @@ const NowPlaying = () => { diff --git a/packages/web/components/New/PlayingNext.tsx b/packages/web/components/New/PlayingNext.tsx index b1bf649..f7a2004 100644 --- a/packages/web/components/New/PlayingNext.tsx +++ b/packages/web/components/New/PlayingNext.tsx @@ -1,19 +1,15 @@ import { resizeImage } from '@/web/utils/common' -import React, { useMemo } from 'react' import { player } from '@/web/store' import { useSnapshot } from 'valtio' import useTracks from '@/web/api/hooks/useTracks' import { css, cx } from '@emotion/css' import { AnimatePresence, motion } from 'framer-motion' import Image from './Image' +import Wave from './Wave' const PlayingNext = ({ className }: { className?: string }) => { const playerSnapshot = useSnapshot(player) - const list = useMemo( - () => playerSnapshot.trackList.slice(playerSnapshot.trackIndex + 1, 100), - [playerSnapshot.trackList, playerSnapshot.trackIndex] - ) - const { data: tracks } = useTracks({ ids: list }) + const { data: tracks } = useTracks({ ids: playerSnapshot.trackList }) return ( <> @@ -28,19 +24,13 @@ const PlayingNext = ({ className }: { className?: string }) => { className={cx( 'relative z-10 overflow-scroll', className, + css``, css` + padding-top: 42px; + mask-image: linear-gradient(to bottom, transparent 0, black 42px); &::-webkit-scrollbar { display: none; } - `, - css` - padding-top: 42px; - -webkit-mask-image: linear-gradient( - to bottom, - transparent 0, - black 42px - ); - mask-image: linear-gradient(to bottom, transparent 0, black 42px); ` )} > @@ -57,13 +47,19 @@ const PlayingNext = ({ className }: { className?: string }) => { duration: 0.24, }} layout + onClick={e => { + if (e.detail === 2) player.playTrack(track.id) + }} > + {/* Cover */} Cover -
+ + {/* Track info */} +
{track.name}
@@ -71,13 +67,21 @@ const PlayingNext = ({ className }: { className?: string }) => { {track.ar.map(a => a.name).join(', ')}
-
- {String(index + 1).padStart(2, '0')} -
+ + {/* Wave icon */} + {playerSnapshot.trackIndex === index ? ( + + ) : ( +
+ {String(index + 1).padStart(2, '0')} +
+ )} ))} -
+ {(tracks?.songs.length || 0) >= 4 && ( +
+ )} diff --git a/packages/web/components/New/Router.tsx b/packages/web/components/New/Router.tsx index bd9f072..91a74fa 100644 --- a/packages/web/components/New/Router.tsx +++ b/packages/web/components/New/Router.tsx @@ -1,6 +1,5 @@ import { Route, RouteObject, Routes, useLocation } from 'react-router-dom' import Login from '@/web/pages/Login' -import Playlist from '@/web/pages/Playlist' import Artist from '@/web/pages/Artist' import Search from '@/web/pages/Search' import Library from '@/web/pages/Library' @@ -11,6 +10,7 @@ import React, { ReactNode, Suspense } from 'react' const My = React.lazy(() => import('@/web/pages/New/My')) const Discover = React.lazy(() => import('@/web/pages/New/Discover')) const Album = React.lazy(() => import('@/web/pages/New/Album')) +const Playlist = React.lazy(() => import('@/web/pages/New/Playlist')) const routes: RouteObject[] = [ { @@ -71,6 +71,7 @@ const Router = () => { )} /> )} /> )} /> + )} /> ) diff --git a/packages/web/components/New/Topbar.tsx b/packages/web/components/New/Topbar.tsx index c7bf70c..e747dd7 100644 --- a/packages/web/components/New/Topbar.tsx +++ b/packages/web/components/New/Topbar.tsx @@ -82,7 +82,7 @@ const Topbar = () => { return (
playerSnapshot.state === 'playing', + [playerSnapshot.state] + ) + return (
{tracks?.map(track => (
handleClick(e, track.id)} - className={cx( - 'flex py-2 text-18 font-medium transition duration-300 ease-in-out', - playingTrack?.id === track.id - ? 'text-brand-700' - : 'text-night-50 dark:hover:text-neutral-200' - )} + className='relative flex items-center py-2 text-18 font-medium text-night-50 transition duration-300 ease-in-out dark:hover:text-neutral-200' >
{String(track.no).padStart(2, '0')}
{track.name}
@@ -42,6 +43,13 @@ const TrackList = ({
{formatDuration(track.dt, 'en', 'hh:mm:ss')}
+ + {/* The wave icon */} + {playingTrack?.id === track.id && playing && ( +
+ +
+ )}
))}
diff --git a/packages/web/components/New/TrackListHeader.tsx b/packages/web/components/New/TrackListHeader.tsx index a341d98..e9eeda7 100644 --- a/packages/web/components/New/TrackListHeader.tsx +++ b/packages/web/components/New/TrackListHeader.tsx @@ -1,4 +1,4 @@ -import { formatDuration, resizeImage } from '@/web/utils/common' +import { formatDate, formatDuration, resizeImage } from '@/web/utils/common' import { css, cx } from '@emotion/css' import Icon from '@/web/components/Icon' import dayjs from 'dayjs' @@ -7,9 +7,11 @@ import Image from './Image' const TrackListHeader = ({ album, + playlist, onPlay, }: { album?: Album + playlist?: Playlist onPlay: () => void }) => { const albumDuration = useMemo(() => { @@ -17,6 +19,8 @@ const TrackListHeader = ({ return formatDuration(duration, 'en', 'hh[hr] mm[min]') }, [album?.songs]) + const cover = album?.picUrl || playlist?.coverImgUrl || '' + return (
Cover + {/* Blur bg */} -
+
- {album?.name} + {album?.name || playlist?.name}
- {album?.artist.name} + {album?.artist.name || playlist?.creator.nickname}
- {album?.mark === 1056768 && ( - - )}{' '} - {dayjs(album?.publishTime || 0).year()} · {album?.songs.length}{' '} - Songs, {albumDuration} + {!!album && ( + <> + {album?.mark === 1056768 && ( + + )}{' '} + {dayjs(album?.publishTime || 0).year()} · {album?.songs.length}{' '} + Tracks, {albumDuration} + + )} + {!!playlist && ( + <> + Updated at {formatDate(playlist?.updateTime || 0, 'en')} ·{' '} + {playlist.trackCount} Tracks + + )}
-
- {album?.description} +
+ {album?.description || playlist?.description}
diff --git a/packages/web/components/New/Wave.tsx b/packages/web/components/New/Wave.tsx new file mode 100644 index 0000000..87c78eb --- /dev/null +++ b/packages/web/components/New/Wave.tsx @@ -0,0 +1,32 @@ +import { css, cx, keyframes } from '@emotion/css' + +const Wave = ({ playing }: { playing: boolean }) => { + const wave = keyframes` + 0% { transform: scaleY(1) } + 50% { transform: scaleY(0.2) } + 100% { transform: scaleY(1)} + ` + const animation = css` + transform-origin: bottom; + animation: ${wave} 1s ease-in-out infinite; + ` + + const delay = ['-100ms', '-500ms', '-1200ms', '-1000ms', '-700ms'] + + return ( +
+ {[...new Array(5).keys()].map(i => ( +
+ ))} +
+ ) +} + +export default Wave diff --git a/packages/web/package.json b/packages/web/package.json index adc857f..c4866f1 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -36,6 +36,7 @@ "qrcode": "^1.5.0", "react": "^18.1.0", "react-dom": "^18.1.0", + "react-error-boundary": "^3.1.4", "react-ga4": "^1.4.1", "react-hot-toast": "^2.2.0", "react-query": "^3.38.0", @@ -59,12 +60,12 @@ "@types/lodash-es": "^4.17.6", "@types/md5": "^2.3.2", "@types/qrcode": "^1.4.2", - "@types/react": "^18.0.8", + "@types/react": "^18.0.11", "@types/react-dom": "^18.0.5", - "@typescript-eslint/eslint-plugin": "^5.26.0", - "@typescript-eslint/parser": "^5.26.0", + "@typescript-eslint/eslint-plugin": "^5.27.0", + "@typescript-eslint/parser": "^5.27.0", "@vitejs/plugin-react": "^1.3.1", - "@vitest/ui": "^0.12.9", + "@vitest/ui": "^0.12.10", "autoprefixer": "^10.4.5", "c8": "^7.11.3", "dotenv": "^16.0.0", @@ -82,6 +83,6 @@ "typescript": "*", "vite": "^2.9.6", "vite-plugin-svg-icons": "^2.0.1", - "vitest": "^0.12.9" + "vitest": "^0.12.10" } } diff --git a/packages/web/pages/New/Album.tsx b/packages/web/pages/New/Album.tsx index 6ac9af9..dbd3c93 100644 --- a/packages/web/pages/New/Album.tsx +++ b/packages/web/pages/New/Album.tsx @@ -1,17 +1,97 @@ import TrackListHeader from '@/web/components/New/TrackListHeader' import useAlbum from '@/web/api/hooks/useAlbum' import useTracks from '@/web/api/hooks/useTracks' -import { useParams } from 'react-router-dom' +import { NavLink, useParams } from 'react-router-dom' import PageTransition from '@/web/components/New/PageTransition' import TrackList from '@/web/components/New/TrackList' import { player } from '@/web/store' import toast from 'react-hot-toast' import { useSnapshot } from 'valtio' +import useArtistAlbums from '@/web/api/hooks/useArtistAlbums' +import { css, cx } from '@emotion/css' +import CoverRow from '@/web/components/New/CoverRow' +import { useMemo } from 'react' + +const MoreByArtist = ({ album }: { album?: Album }) => { + const { data: albums } = useArtistAlbums({ + id: album?.artist?.id || 0, + limit: 1000, + }) + + const filteredAlbums = useMemo((): Album[] => { + if (!albums) return [] + const allReleases = albums?.hotAlbums || [] + const filteredAlbums = allReleases.filter( + album => + ['专辑', 'EP/Single', 'EP'].includes(album.type) && album.size > 1 + ) + const singles = allReleases.filter(album => album.type === 'Single') + + const qualifiedAlbums = [...filteredAlbums, ...singles] + + const formatName = (name: string) => + name.toLowerCase().replace(/(\s|deluxe|edition|\(|\))/g, '') + + const uniqueAlbums: Album[] = [] + qualifiedAlbums.forEach(a => { + // 去除当前页面的专辑 + if (formatName(a.name) === formatName(album?.name ?? '')) return + + // 去除重复的专辑(包含 deluxe edition 的专辑会视为重复) + if ( + uniqueAlbums.findIndex(aa => { + return formatName(a.name) === formatName(aa.name) + }) !== -1 + ) { + return + } + + // 去除 remix 专辑 + if ( + a.name.toLowerCase().includes('remix)') || + a.name.toLowerCase().includes('remixes)') + ) { + return + } + + uniqueAlbums.push(a) + }) + + return uniqueAlbums.slice(0, 4) + }, [album?.name, albums]) + + return ( +
+ {/* Dividing line */} +
+ + {/* Title */} +
+ MORE BY{' '} + + {album?.artist.name} + +
+ + +
+ ) +} const Album = () => { const params = useParams() - const { data: album, isLoading } = useAlbum({ - id: Number(params.id) || 0, + const { data: album } = useAlbum({ + id: Number(params.id), }) const { data: tracks } = useTracks({ @@ -37,12 +117,13 @@ const Album = () => { return ( - onPlay()} /> + + ) } diff --git a/packages/web/pages/New/Discover.tsx b/packages/web/pages/New/Discover.tsx index 67a018b..c72db54 100644 --- a/packages/web/pages/New/Discover.tsx +++ b/packages/web/pages/New/Discover.tsx @@ -1,10 +1,108 @@ import CoverWall from '@/web/components/New/CoverWall' import PageTransition from '@/web/components/New/PageTransition' +import { + fetchPlaylistWithReactQuery, + fetchFromCache, +} from '@/web/api/hooks/usePlaylist' +import useTracks, { fetchTracksWithReactQuery } from '@/web/api/hooks/useTracks' +import { useEffect, useMemo, useState } from 'react' +import { sampleSize } from 'lodash-es' +import { FetchPlaylistResponse } from '@/shared/api/Playlists' + +interface DiscoverAlbum { + id: number + coverUrl: string + large: boolean +} + +const getAlbumsFromAPI = async () => { + const playlistsIds = [ + 2859214503, // 一周欧美上新 + 2829816518, // 欧美私人订制 + 5327906368, // 乐迷雷达 + 5362359247, // 宝藏雷达 + 3136952023, // 私人雷达 + 60198, // Billboard 排行榜 + 180106, // UK 排行榜 + 5212729721, // 欧美点唱机 + 2724708415, // 私藏推荐精选 + 5300458264, // 新歌雷达 + 7463185187, // 开发者夹带私货 + ] + + const playlists = (await Promise.all( + sampleSize(playlistsIds, 5).map( + id => + new Promise(resolve => { + const cache = fetchFromCache(id) + if (cache) { + resolve(cache) + return + } + return fetchPlaylistWithReactQuery({ id }) + }) + ) + )) as FetchPlaylistResponse[] + + const ids: number[] = [] + playlists.forEach(playlist => + playlist?.playlist?.trackIds?.forEach(t => ids.push(t.id)) + ) + if (!ids.length) { + return [] + } + + const tracks = await fetchTracksWithReactQuery({ ids }) + if (!tracks.songs.length) { + return [] + } + + // 从歌单中抽出歌曲 + const pickedIds: number[] = [] + let albums: DiscoverAlbum[] = [] + tracks.songs.forEach(t => { + if (pickedIds.includes(t.al.id)) return + pickedIds.push(t.al.id) + albums.push({ + id: t.al.id, + coverUrl: t.al.picUrl, + large: false, + }) + }) + + // 挑选出大图 + albums = sampleSize(albums, 100) + const largeCover = sampleSize([...Array(100).keys()], ~~(100 / 3)) + albums.map((album, index) => (album.large = largeCover.includes(index))) + + localStorage.setItem('discoverAlbums', JSON.stringify(albums)) + localStorage.setItem('discoverAlbumsTime', String(Date.now())) + + return albums +} const Discover = () => { + const [albums, setAlbums] = useState([]) + + useEffect(() => { + const get = async () => { + const albumsInLocalStorageTime = + localStorage.getItem('discoverAlbumsTime') + if ( + !albumsInLocalStorageTime || + Date.now() - Number(albumsInLocalStorageTime) > 1000 * 60 * 60 * 2 + ) { + setAlbums(await getAlbumsFromAPI()) + } else { + setAlbums(JSON.parse(localStorage.getItem('discoverAlbums') || '[]')) + } + } + get() + }, []) + return ( - + ) } diff --git a/packages/web/pages/New/My.tsx b/packages/web/pages/New/My.tsx index a4ddafe..5dd9fd4 100644 --- a/packages/web/pages/New/My.tsx +++ b/packages/web/pages/New/My.tsx @@ -4,10 +4,12 @@ import PageTransition from '@/web/components/New/PageTransition' import useUserArtists from '@/web/api/hooks/useUserArtists' import ArtistRow from '@/web/components/New/ArtistRow' import Tabs from '@/web/components/New/Tabs' -import { useState } from 'react' +import { useMemo, useState } from 'react' import CoverRow from '@/web/components/New/CoverRow' import useUserPlaylists from '@/web/api/hooks/useUserPlaylists' import useUserAlbums from '@/web/api/hooks/useUserAlbums' +import useUserListenedRecords from '@/web/api/hooks/useUserListenedRecords' +import useArtists from '@/web/api/hooks/useArtists' const tabs = [ { @@ -34,12 +36,41 @@ const My = () => { const { data: albums } = useUserAlbums() const [selectedTab, setSelectedTab] = useState(tabs[0].id) + const { data: listenedRecords } = useUserListenedRecords({ type: 'week' }) + const recentListenedArtistsIDs = useMemo(() => { + const artists: { + id: number + playCount: number + }[] = [] + listenedRecords?.weekData?.forEach(record => { + const artist = record.song.ar[0] + const index = artists.findIndex(a => a.id === artist.id) + if (index === -1) { + artists.push({ + id: artist.id, + playCount: record.playCount, + }) + } else { + artists[index].playCount += record.playCount + } + }) + + return artists + .sort((a, b) => b.playCount - a.playCount) + .slice(0, 5) + .map(artist => artist.id) + }, [listenedRecords]) + const { data: recentListenedArtists } = useArtists(recentListenedArtistsIDs) + return (
- + a.artist)} + title='RECENTLY LISTENED' + />
@@ -48,7 +79,7 @@ const My = () => { value={selectedTab} onChange={(id: string) => setSelectedTab(id)} /> - +
diff --git a/packages/web/pages/New/Playlist.tsx b/packages/web/pages/New/Playlist.tsx new file mode 100644 index 0000000..56c4a70 --- /dev/null +++ b/packages/web/pages/New/Playlist.tsx @@ -0,0 +1,48 @@ +import TrackListHeader from '@/web/components/New/TrackListHeader' +import { NavLink, useParams } from 'react-router-dom' +import PageTransition from '@/web/components/New/PageTransition' +import TrackList from '@/web/components/New/TrackList' +import { player } from '@/web/store' +import toast from 'react-hot-toast' +import { useSnapshot } from 'valtio' +import { memo, useEffect, useMemo } from 'react' +import usePlaylist from '@/web/api/hooks/usePlaylist' +import useTracksInfinite from '@/web/api/hooks/useTracksInfinite' +import useScroll from '@/web/hooks/useScroll' +const Playlist = () => { + const params = useParams() + const { data: playlist, isLoading } = usePlaylist({ + id: Number(params.id), + }) + + const playerSnapshot = useSnapshot(player) + const onPlay = async (trackID: number | null = null) => { + if (!playlist?.playlist.id) { + toast('无法播放歌单,该歌单不存在') + return + } + + if ( + playerSnapshot.trackListSource?.type === 'playlist' && + playerSnapshot.trackListSource?.id === playlist.playlist.id && + playlist?.playlist?.trackIds?.[0].id + ) { + await player.playTrack(trackID ?? playlist.playlist.trackIds[0].id) + return + } + await player.playPlaylist(playlist.playlist.id, trackID) + } + + return ( + + + + + ) +} + +export default Playlist diff --git a/packages/web/utils/player.ts b/packages/web/utils/player.ts index e5c0e52..a2848a7 100644 --- a/packages/web/utils/player.ts +++ b/packages/web/utils/player.ts @@ -14,6 +14,7 @@ import { fetchAlbumWithReactQuery } from '@/web/api/hooks/useAlbum' import { IpcChannels } from '@/shared/IpcChannels' import { RepeatMode } from '@/shared/playerDataTypes' import toast from 'react-hot-toast' +import { scrobble } from '@/web/api/user' type TrackID = number export enum TrackListSourceType { @@ -173,7 +174,8 @@ export class Player { this._loadMoreFMTracks() } - private setStateToLoading() { + private _setStateToLoading() { + this._scrobble() this.state = State.Loading _howler.pause() } @@ -184,6 +186,20 @@ export class Player { }, 1000) } + private async _scrobble() { + if (!this.track?.id || !this.trackListSource?.id) { + return + } + if (this.progress <= this.track.dt / 1000 / 3) { + return + } + scrobble({ + id: this.track.id, + sourceid: this.trackListSource.id, + time: ~~this.progress, + }) + } + /** * Fetch track details from Netease based on this.trackID */ @@ -356,7 +372,7 @@ export class Player { * Play previous track */ prevTrack() { - this.setStateToLoading() + this._setStateToLoading() this._progress = 0 if (this.mode === Mode.FM) { toast('Personal FM not support previous track') @@ -374,7 +390,7 @@ export class Player { * Play next track */ nextTrack(forceFM: boolean = false) { - this.setStateToLoading() + this._setStateToLoading() this._progress = 0 if (forceFM || this.mode === Mode.FM) { this.mode = Mode.FM @@ -396,7 +412,7 @@ export class Player { * @param {null|number} autoPlayTrackID */ playAList(list: TrackID[], autoPlayTrackID?: null | number) { - this.setStateToLoading() + this._setStateToLoading() this.mode = Mode.TrackList this.trackList = list this._trackIndex = autoPlayTrackID @@ -407,16 +423,16 @@ export class Player { /** * Play a playlist - * @param {number} playlistID + * @param {number} id * @param {null|number=} autoPlayTrackID */ - async playPlaylist(playlistID: number, autoPlayTrackID?: null | number) { - this.setStateToLoading() - const playlist = await fetchPlaylistWithReactQuery({ id: playlistID }) + async playPlaylist(id: number, autoPlayTrackID?: null | number) { + this._setStateToLoading() + const playlist = await fetchPlaylistWithReactQuery({ id }) if (!playlist?.playlist?.trackIds?.length) return this.trackListSource = { type: TrackListSourceType.Playlist, - id: playlistID, + id, } this.playAList( playlist.playlist.trackIds.map(t => t.id), @@ -426,18 +442,17 @@ export class Player { /** * Play am album - * @param {number} albumID + * @param {number} id * @param {null|number=} autoPlayTrackID */ - async playAlbum(albumID: number, autoPlayTrackID?: null | number) { - this.setStateToLoading() - const album = await fetchAlbumWithReactQuery({ id: albumID }) + async playAlbum(id: number, autoPlayTrackID?: null | number) { + this._setStateToLoading() + const album = await fetchAlbumWithReactQuery({ id }) if (!album?.songs?.length) return this.trackListSource = { type: TrackListSourceType.Album, - id: albumID, + id, } - this._playTrack() this.playAList( album.songs.map(t => t.id), autoPlayTrackID @@ -448,7 +463,7 @@ export class Player { * Play personal fm */ async playFM() { - this.setStateToLoading() + this._setStateToLoading() this.mode = Mode.FM if ( this.fmTrackList.length > 0 && @@ -475,7 +490,7 @@ export class Player { * Play track in trackList by id */ async playTrack(trackID: TrackID) { - this.setStateToLoading() + this._setStateToLoading() const index = this.trackList.findIndex(t => t === trackID) if (!index) toast('播放失败,歌曲不在列表内') this._trackIndex = index diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 019a201..98bbd9a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,16 +5,16 @@ importers: .: specifiers: cross-env: ^7.0.3 - eslint: ^8.16.0 + eslint: ^8.17.0 prettier: ^2.6.2 - turbo: ^1.2.14 - typescript: ^4.7.2 + turbo: ^1.2.16 + typescript: ^4.7.3 devDependencies: cross-env: 7.0.3 - eslint: 8.16.0 + eslint: 8.17.0 prettier: 2.6.2 - turbo: 1.2.14 - typescript: 4.7.2 + turbo: 1.2.16 + typescript: 4.7.3 packages/electron: specifiers: @@ -25,8 +25,8 @@ importers: '@types/cookie-parser': ^1.4.3 '@types/express': ^4.17.13 '@types/express-fileupload': ^1.2.2 - '@typescript-eslint/eslint-plugin': ^5.26.0 - '@typescript-eslint/parser': ^5.26.0 + '@typescript-eslint/eslint-plugin': ^5.27.0 + '@typescript-eslint/parser': ^5.27.0 '@unblockneteasemusic/rust-napi': ^0.3.0 '@vitejs/plugin-react': ^1.3.1 axios: ^0.27.2 @@ -36,21 +36,21 @@ importers: cookie-parser: ^1.4.6 cross-env: ^7.0.3 dotenv: ^16.0.0 - electron: ^19.0.1 + electron: ^19.0.3 electron-builder: ^23.0.3 electron-devtools-installer: ^3.2.0 electron-log: ^4.4.6 electron-rebuild: ^3.2.7 - electron-releases: ^3.1021.0 + electron-releases: ^3.1026.0 electron-store: ^8.0.1 - esbuild: ^0.14.41 + esbuild: ^0.14.42 eslint: '*' express: ^4.18.1 express-fileupload: ^1.4.0 - fast-folder-size: ^1.6.1 + fast-folder-size: ^1.7.0 minimist: ^1.2.6 music-metadata: ^7.12.3 - NeteaseCloudMusicApi: ^4.6.0 + NeteaseCloudMusicApi: ^4.6.2 open-cli: ^7.0.1 ora: ^6.1.0 picocolors: ^1.0.0 @@ -69,8 +69,8 @@ importers: electron-log: 4.4.7 electron-store: 8.0.1 express: 4.18.1 - fast-folder-size: 1.6.2 - NeteaseCloudMusicApi: 4.6.0 + fast-folder-size: 1.7.0 + NeteaseCloudMusicApi: 4.6.2 pretty-bytes: 6.0.0 devDependencies: '@electron/universal': 1.2.1 @@ -78,19 +78,19 @@ importers: '@types/cookie-parser': 1.4.3 '@types/express': 4.17.13 '@types/express-fileupload': 1.2.2 - '@typescript-eslint/eslint-plugin': 5.26.0_hzuh7e2up357pvq3mkokjvu2lq - '@typescript-eslint/parser': 5.26.0_xztl6dhthcahlo6akmb2bmjmle + '@typescript-eslint/eslint-plugin': 5.27.0_kor2e3kwnnzugzo3aovmfcq2la + '@typescript-eslint/parser': 5.27.0_ud6rd4xtew5bv4yhvkvu24pzm4 '@vitejs/plugin-react': 1.3.2 axios: 0.27.2 cross-env: 7.0.3 dotenv: 16.0.1 - electron: 19.0.1 + electron: 19.0.3 electron-builder: 23.0.3 electron-devtools-installer: 3.2.0 electron-rebuild: 3.2.7 - electron-releases: 3.1021.0 - esbuild: 0.14.41 - eslint: 8.16.0 + electron-releases: 3.1026.0 + esbuild: 0.14.42 + eslint: 8.17.0 express-fileupload: 1.4.0 minimist: 1.2.6 music-metadata: 7.12.3 @@ -98,7 +98,7 @@ importers: ora: 6.1.0 picocolors: 1.0.0 prettier: 2.6.2 - typescript: 4.7.2 + typescript: 4.7.3 wait-on: 6.0.1 packages/web: @@ -121,12 +121,12 @@ importers: '@types/lodash-es': ^4.17.6 '@types/md5': ^2.3.2 '@types/qrcode': ^1.4.2 - '@types/react': ^18.0.8 + '@types/react': ^18.0.11 '@types/react-dom': ^18.0.5 - '@typescript-eslint/eslint-plugin': ^5.26.0 - '@typescript-eslint/parser': ^5.26.0 + '@typescript-eslint/eslint-plugin': ^5.27.0 + '@typescript-eslint/parser': ^5.27.0 '@vitejs/plugin-react': ^1.3.1 - '@vitest/ui': ^0.12.9 + '@vitest/ui': ^0.12.10 autoprefixer: ^10.4.5 axios: ^0.27.2 c8: ^7.11.3 @@ -150,6 +150,7 @@ importers: qrcode: ^1.5.0 react: ^18.1.0 react-dom: ^18.1.0 + react-error-boundary: ^3.1.4 react-ga4: ^1.4.1 react-hot-toast: ^2.2.0 react-query: ^3.38.0 @@ -162,7 +163,7 @@ importers: valtio: ^1.6.1 vite: ^2.9.6 vite-plugin-svg-icons: ^2.0.1 - vitest: ^0.12.9 + vitest: ^0.12.10 dependencies: '@emotion/css': 11.9.0 '@sentry/react': 6.19.7_react@18.1.0 @@ -171,7 +172,7 @@ importers: color.js: 1.2.0 colord: 2.9.2 dayjs: 1.11.2 - framer-motion: 6.3.4_ef5jwxihqo6n7gxfmzogljlgcm + framer-motion: 6.3.10_ef5jwxihqo6n7gxfmzogljlgcm howler: 2.2.3 js-cookie: 3.0.1 lodash-es: 4.17.21 @@ -179,21 +180,22 @@ importers: qrcode: 1.5.0 react: 18.1.0 react-dom: 18.1.0_react@18.1.0 + react-error-boundary: 3.1.4_react@18.1.0 react-ga4: 1.4.1 react-hot-toast: 2.2.0_ef5jwxihqo6n7gxfmzogljlgcm - react-query: 3.39.0_ef5jwxihqo6n7gxfmzogljlgcm + react-query: 3.39.1_ef5jwxihqo6n7gxfmzogljlgcm react-router-dom: 6.3.0_ef5jwxihqo6n7gxfmzogljlgcm react-use: 17.4.0_ef5jwxihqo6n7gxfmzogljlgcm valtio: 1.6.1_react@18.1.0+vite@2.9.9 devDependencies: '@storybook/addon-actions': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/addon-essentials': 6.5.5_prdvedzkszhyllmfomk6yy4khy - '@storybook/addon-interactions': 6.5.5_lgiz43rw3qxbkqi6ccalvcy2nm + '@storybook/addon-essentials': 6.5.5_bxmn6y3pweymjo6ekelj24wybq + '@storybook/addon-interactions': 6.5.5_kq2rkzam3lngl7wb7tnee2wn7q '@storybook/addon-links': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/addon-postcss': 2.0.0 '@storybook/addon-viewport': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/builder-vite': 0.1.35_6mkujuxsemxlkfprs5gu32q4ri - '@storybook/react': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/builder-vite': 0.1.35_i2zgygkw4werwuj4w6bczo4nii + '@storybook/react': 6.5.5_bxmn6y3pweymjo6ekelj24wybq '@storybook/testing-library': 0.0.11_ef5jwxihqo6n7gxfmzogljlgcm '@testing-library/react': 13.3.0_ef5jwxihqo6n7gxfmzogljlgcm '@types/howler': 2.2.7 @@ -201,18 +203,18 @@ importers: '@types/lodash-es': 4.17.6 '@types/md5': 2.3.2 '@types/qrcode': 1.4.2 - '@types/react': 18.0.9 + '@types/react': 18.0.11 '@types/react-dom': 18.0.5 - '@typescript-eslint/eslint-plugin': 5.26.0_hzuh7e2up357pvq3mkokjvu2lq - '@typescript-eslint/parser': 5.26.0_xztl6dhthcahlo6akmb2bmjmle + '@typescript-eslint/eslint-plugin': 5.27.0_kor2e3kwnnzugzo3aovmfcq2la + '@typescript-eslint/parser': 5.27.0_ud6rd4xtew5bv4yhvkvu24pzm4 '@vitejs/plugin-react': 1.3.2 - '@vitest/ui': 0.12.9 + '@vitest/ui': 0.12.10 autoprefixer: 10.4.7_postcss@8.4.14 c8: 7.11.3 dotenv: 16.0.1 - eslint: 8.16.0 - eslint-plugin-react: 7.30.0_eslint@8.16.0 - eslint-plugin-react-hooks: 4.5.0_eslint@8.16.0 + eslint: 8.17.0 + eslint-plugin-react: 7.30.0_eslint@8.17.0 + eslint-plugin-react-hooks: 4.5.0_eslint@8.17.0 jsdom: 19.0.0 open-cli: 7.0.1 postcss: 8.4.14 @@ -221,10 +223,10 @@ importers: rollup-plugin-visualizer: 5.6.0 storybook-tailwind-dark-mode: 1.0.12_ef5jwxihqo6n7gxfmzogljlgcm tailwindcss: 3.0.24 - typescript: 4.7.2 + typescript: 4.7.3 vite: 2.9.9 vite-plugin-svg-icons: 2.0.1_vite@2.9.9 - vitest: 0.12.9_izzclx2ns4ngboxzp36esaqdxe + vitest: 0.12.10_5y625lpcnancu4te4y3qqugezq packages: @@ -3906,7 +3908,7 @@ packages: dev: true optional: true - /@design-systems/utils/2.12.0_ohobp6rpsmerwlq5ipwfh5yigy: + /@design-systems/utils/2.12.0_zvt3kh6vtxobxb4gmt75nlt57a: resolution: {integrity: sha512-Y/d2Zzr+JJfN6u1gbuBUb1ufBuLMJJRZQk+dRmw8GaTpqKx5uf7cGUYGTwN02dIb3I+Tf+cW8jcGBTRiFxdYFg==} peerDependencies: '@types/react': '*' @@ -3914,7 +3916,7 @@ packages: react-dom: '>= 16.8.6' dependencies: '@babel/runtime': 7.18.3 - '@types/react': 18.0.9 + '@types/react': 18.0.11 clsx: 1.1.0 focus-lock: 0.8.1 react: 18.1.0 @@ -3930,15 +3932,15 @@ packages: ajv-keywords: 3.5.2_ajv@6.12.6 dev: true - /@devtools-ds/object-inspector/1.2.0_ohobp6rpsmerwlq5ipwfh5yigy: + /@devtools-ds/object-inspector/1.2.0_zvt3kh6vtxobxb4gmt75nlt57a: resolution: {integrity: sha512-VztcwqVwScSvYdvJVZBJYsVO/2Pew3JPpFV3T9fuCHQLlHcLYOV3aU/kBS2ScuE2O1JN0ZbobLqFLa3vQF54Fw==} peerDependencies: react: '>= 16.8.6' dependencies: '@babel/runtime': 7.7.2 '@devtools-ds/object-parser': 1.2.0 - '@devtools-ds/themes': 1.2.0_ohobp6rpsmerwlq5ipwfh5yigy - '@devtools-ds/tree': 1.2.0_ohobp6rpsmerwlq5ipwfh5yigy + '@devtools-ds/themes': 1.2.0_zvt3kh6vtxobxb4gmt75nlt57a + '@devtools-ds/tree': 1.2.0_zvt3kh6vtxobxb4gmt75nlt57a clsx: 1.1.0 react: 18.1.0 transitivePeerDependencies: @@ -3952,13 +3954,13 @@ packages: '@babel/runtime': 7.5.5 dev: true - /@devtools-ds/themes/1.2.0_ohobp6rpsmerwlq5ipwfh5yigy: + /@devtools-ds/themes/1.2.0_zvt3kh6vtxobxb4gmt75nlt57a: resolution: {integrity: sha512-LimEITorE6yWZWWuMc6OiBfLQgPrQqWbyMEmfRUDPa3PHXoAY4SpDxczfg31fgyRDUNWnZhjaJH5bBbu8VEbIw==} peerDependencies: react: '>= 16.8.6' dependencies: '@babel/runtime': 7.5.5 - '@design-systems/utils': 2.12.0_ohobp6rpsmerwlq5ipwfh5yigy + '@design-systems/utils': 2.12.0_zvt3kh6vtxobxb4gmt75nlt57a clsx: 1.1.0 react: 18.1.0 transitivePeerDependencies: @@ -3966,13 +3968,13 @@ packages: - react-dom dev: true - /@devtools-ds/tree/1.2.0_ohobp6rpsmerwlq5ipwfh5yigy: + /@devtools-ds/tree/1.2.0_zvt3kh6vtxobxb4gmt75nlt57a: resolution: {integrity: sha512-hC4g4ocuo2eg7jsnzKdauxH0sDQiPW3KSM2+uK3kRgcmr9PzpBD5Kob+Y/WFSVKswFleftOGKL4BQLuRv0sPxA==} peerDependencies: react: '>= 16.8.6' dependencies: '@babel/runtime': 7.7.2 - '@devtools-ds/themes': 1.2.0_ohobp6rpsmerwlq5ipwfh5yigy + '@devtools-ds/themes': 1.2.0_zvt3kh6vtxobxb4gmt75nlt57a clsx: 1.1.0 react: 18.1.0 transitivePeerDependencies: @@ -4076,7 +4078,7 @@ packages: peerDependencies: react: '>=16.3.0' dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 '@emotion/cache': 10.0.29 '@emotion/css': 10.0.27 '@emotion/serialize': 0.11.16 @@ -4158,7 +4160,7 @@ packages: '@emotion/core': ^10.0.28 react: '>=16.3.0' dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 '@emotion/core': 10.3.1_react@18.1.0 '@emotion/is-prop-valid': 0.8.8 '@emotion/serialize': 0.11.16 @@ -4303,7 +4305,7 @@ packages: chalk: 4.1.2 dev: true - /@joshwooding/vite-plugin-react-docgen-typescript/0.0.4_xjvffdju4jonbyfnhcatsvyz5i: + /@joshwooding/vite-plugin-react-docgen-typescript/0.0.4_w2ia2u24h3y5wbn5vvjywyz3ga: resolution: {integrity: sha512-ezL7SU//1OV4Oyt/zQ3CsX8uLujVEYUHuULkqgcW6wOuQfRnvgkn99HZtLWwS257GmZVwszGQzhL7VE3PbMAYw==} peerDependencies: typescript: '>= 4.3.x' @@ -4312,8 +4314,8 @@ packages: glob: 7.2.3 glob-promise: 4.2.2_glob@7.2.3 magic-string: 0.26.2 - react-docgen-typescript: 2.2.2_typescript@4.7.2 - typescript: 4.7.2 + react-docgen-typescript: 2.2.2_typescript@4.7.3 + typescript: 4.7.3 vite: 2.9.9 dev: true @@ -4699,7 +4701,7 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/addon-controls/6.5.5_prdvedzkszhyllmfomk6yy4khy: + /@storybook/addon-controls/6.5.5_bxmn6y3pweymjo6ekelj24wybq: resolution: {integrity: sha512-uazzNUxz8LKcjZIYD5sE49HK6VS1SOi7YHFQy/u2e4MFx4M1sntY4JZ98bDZKEDr/94kAX+FBuL1PkJ8IKoY2g==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4714,7 +4716,7 @@ packages: '@storybook/api': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/client-logger': 6.5.5 '@storybook/components': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/core-common': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/core-common': 6.5.5_bxmn6y3pweymjo6ekelj24wybq '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/node-logger': 6.5.5 '@storybook/store': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm @@ -4733,7 +4735,7 @@ packages: - webpack-command dev: true - /@storybook/addon-docs/6.5.5_prdvedzkszhyllmfomk6yy4khy: + /@storybook/addon-docs/6.5.5_bxmn6y3pweymjo6ekelj24wybq: resolution: {integrity: sha512-84Hmi3v/ccLBsiK69Qr8EQTlGfnV8VBaT/2IbHCtqgqMPfxD7Z6aoC65sBSbJWF9utJku17O9v+0qRG9lOJnWA==} peerDependencies: '@storybook/mdx2-csf': ^0.0.3 @@ -4754,7 +4756,7 @@ packages: '@storybook/addons': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/api': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/components': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/core-common': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/core-common': 6.5.5_bxmn6y3pweymjo6ekelj24wybq '@storybook/core-events': 6.5.5 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm @@ -4788,7 +4790,7 @@ packages: - webpack-command dev: true - /@storybook/addon-essentials/6.5.5_prdvedzkszhyllmfomk6yy4khy: + /@storybook/addon-essentials/6.5.5_bxmn6y3pweymjo6ekelj24wybq: resolution: {integrity: sha512-2w8jAIDbrc4/X9/HgVMh1ODsDHbXG7QFFF186UPPDIcCHoNb/3HZk9YSi0Rv7O3VcY4PyKWbTsbmmTzbT8QSbA==} peerDependencies: '@babel/core': ^7.9.6 @@ -4847,15 +4849,15 @@ packages: dependencies: '@storybook/addon-actions': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/addon-backgrounds': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/addon-controls': 6.5.5_prdvedzkszhyllmfomk6yy4khy - '@storybook/addon-docs': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/addon-controls': 6.5.5_bxmn6y3pweymjo6ekelj24wybq + '@storybook/addon-docs': 6.5.5_bxmn6y3pweymjo6ekelj24wybq '@storybook/addon-measure': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/addon-outline': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/addon-toolbars': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/addon-viewport': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/addons': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/api': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/core-common': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/core-common': 6.5.5_bxmn6y3pweymjo6ekelj24wybq '@storybook/node-logger': 6.5.5 core-js: 3.22.7 react: 18.1.0 @@ -4872,7 +4874,7 @@ packages: - webpack-command dev: true - /@storybook/addon-interactions/6.5.5_lgiz43rw3qxbkqi6ccalvcy2nm: + /@storybook/addon-interactions/6.5.5_kq2rkzam3lngl7wb7tnee2wn7q: resolution: {integrity: sha512-V7igk2P/KTDMXKJafA4HMhtq0MErvjYWPrY6ifjptcuJhuykQIdRlvEtfIlN9cKOVb0yw9gktXB3Gpujb6xW5Q==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4883,12 +4885,12 @@ packages: react-dom: optional: true dependencies: - '@devtools-ds/object-inspector': 1.2.0_ohobp6rpsmerwlq5ipwfh5yigy + '@devtools-ds/object-inspector': 1.2.0_zvt3kh6vtxobxb4gmt75nlt57a '@storybook/addons': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/api': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/client-logger': 6.5.5 '@storybook/components': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/core-common': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/core-common': 6.5.5_bxmn6y3pweymjo6ekelj24wybq '@storybook/core-events': 6.5.5 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/instrumenter': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm @@ -5190,14 +5192,14 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/builder-vite/0.1.35_6mkujuxsemxlkfprs5gu32q4ri: + /@storybook/builder-vite/0.1.35_i2zgygkw4werwuj4w6bczo4nii: resolution: {integrity: sha512-QEVbfEH/wXHSh1i/Nz8Ox+YDn6Y2OOpHrOa+GsuJG/Oej+WErYDVnBxN8HrfNyc02bzksH8NsML8yZDBLQPccA==} peerDependencies: '@storybook/core-common': '>=6.4.3 || >=6.5.0-alpha.0' '@storybook/node-logger': '>=6.4.3 || >=6.5.0-alpha.0' vite: '>=2.6.7' dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.0.4_xjvffdju4jonbyfnhcatsvyz5i + '@joshwooding/vite-plugin-react-docgen-typescript': 0.0.4_w2ia2u24h3y5wbn5vvjywyz3ga '@mdx-js/mdx': 1.6.22 '@storybook/csf-tools': 6.5.3_react@18.1.0 '@storybook/source-loader': 6.5.3_ef5jwxihqo6n7gxfmzogljlgcm @@ -5219,7 +5221,7 @@ packages: - typescript dev: true - /@storybook/builder-webpack4/6.5.5_prdvedzkszhyllmfomk6yy4khy: + /@storybook/builder-webpack4/6.5.5_bxmn6y3pweymjo6ekelj24wybq: resolution: {integrity: sha512-KjvfnzIyeEWGZtdROjwAlGvF8Tsi2NqjVsHiw7t8kRMdB+5ermIEYbwuezFa4le0sOhJSgsszV602wurgjtVPQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5237,7 +5239,7 @@ packages: '@storybook/client-api': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/client-logger': 6.5.5 '@storybook/components': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/core-common': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/core-common': 6.5.5_bxmn6y3pweymjo6ekelj24wybq '@storybook/core-events': 6.5.5 '@storybook/node-logger': 6.5.5 '@storybook/preview-web': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm @@ -5255,12 +5257,12 @@ packages: css-loader: 3.6.0_webpack@4.46.0 file-loader: 6.2.0_webpack@4.46.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 4.1.6_2gfktnqqmcadqrnc4yeoi2id7m + fork-ts-checker-webpack-plugin: 4.1.6_ixplphslglgm26g7hajb6yf2fu glob: 7.2.3 glob-promise: 3.4.0_glob@7.2.3 global: 4.4.0 html-webpack-plugin: 4.5.2_webpack@4.46.0 - pnp-webpack-plugin: 1.6.4_typescript@4.7.2 + pnp-webpack-plugin: 1.6.4_typescript@4.7.3 postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 postcss-loader: 4.3.0_gzaxsinx64nntyd3vmdqwl7coe @@ -5271,7 +5273,7 @@ packages: style-loader: 1.3.0_webpack@4.46.0 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 - typescript: 4.7.2 + typescript: 4.7.3 url-loader: 4.1.1_lit45vopotvaqup7lrvlnvtxwy util-deprecate: 1.0.2 webpack: 4.46.0 @@ -5404,7 +5406,7 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/core-client/6.5.5_gs43gmpe3gx6zeczbtct32m3ym: + /@storybook/core-client/6.5.5_ep5i7rh3xck6dvekot5qk64pi4: resolution: {integrity: sha512-+hRkka7lAUhw64oRrr2H5uR69DKeblbsOpVr8SEVbPbWmhs9lP93CEmFxaO70dwcb2bgrpLjuHN3/OknHfcyQw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5435,50 +5437,50 @@ packages: react-dom: 18.1.0_react@18.1.0 regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 - typescript: 4.7.2 - unfetch: 4.2.0 - util-deprecate: 1.0.2 - webpack: 5.72.1 - dev: true - - /@storybook/core-client/6.5.5_i2ts6dbcrvvxd5u4b66vobh5he: - resolution: {integrity: sha512-+hRkka7lAUhw64oRrr2H5uR69DKeblbsOpVr8SEVbPbWmhs9lP93CEmFxaO70dwcb2bgrpLjuHN3/OknHfcyQw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - webpack: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@storybook/addons': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/channel-postmessage': 6.5.5 - '@storybook/channel-websocket': 6.5.5 - '@storybook/client-api': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/client-logger': 6.5.5 - '@storybook/core-events': 6.5.5 - '@storybook/csf': 0.0.2--canary.4566f4d.1 - '@storybook/preview-web': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/store': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/ui': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - airbnb-js-shims: 2.2.1 - ansi-to-html: 0.6.15 - core-js: 3.22.7 - global: 4.4.0 - lodash: 4.17.21 - qs: 6.10.3 - react: 18.1.0 - react-dom: 18.1.0_react@18.1.0 - regenerator-runtime: 0.13.9 - ts-dedent: 2.2.0 - typescript: 4.7.2 + typescript: 4.7.3 unfetch: 4.2.0 util-deprecate: 1.0.2 webpack: 4.46.0 dev: true - /@storybook/core-common/6.5.5_prdvedzkszhyllmfomk6yy4khy: + /@storybook/core-client/6.5.5_t6yzycgud3x5i4jgz2gna62xty: + resolution: {integrity: sha512-+hRkka7lAUhw64oRrr2H5uR69DKeblbsOpVr8SEVbPbWmhs9lP93CEmFxaO70dwcb2bgrpLjuHN3/OknHfcyQw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + typescript: '*' + webpack: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@storybook/addons': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm + '@storybook/channel-postmessage': 6.5.5 + '@storybook/channel-websocket': 6.5.5 + '@storybook/client-api': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm + '@storybook/client-logger': 6.5.5 + '@storybook/core-events': 6.5.5 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/preview-web': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm + '@storybook/store': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm + '@storybook/ui': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm + airbnb-js-shims: 2.2.1 + ansi-to-html: 0.6.15 + core-js: 3.22.7 + global: 4.4.0 + lodash: 4.17.21 + qs: 6.10.3 + react: 18.1.0 + react-dom: 18.1.0_react@18.1.0 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + typescript: 4.7.3 + unfetch: 4.2.0 + util-deprecate: 1.0.2 + webpack: 5.72.1 + dev: true + + /@storybook/core-common/6.5.5_bxmn6y3pweymjo6ekelj24wybq: resolution: {integrity: sha512-1nyma4/E43+R34RL/AO7Pw/P6tNTxnF9ui5MrynApnvDFxtPYcKXIRUK2DN6R6isY33+IdZ8f2QEbpLtMLDo+Q==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5522,7 +5524,7 @@ packages: express: 4.18.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.2_2gfktnqqmcadqrnc4yeoi2id7m + fork-ts-checker-webpack-plugin: 6.5.2_ixplphslglgm26g7hajb6yf2fu fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.7 @@ -5538,7 +5540,7 @@ packages: slash: 3.0.0 telejson: 6.0.8 ts-dedent: 2.2.0 - typescript: 4.7.2 + typescript: 4.7.3 util-deprecate: 1.0.2 webpack: 4.46.0 transitivePeerDependencies: @@ -5567,7 +5569,7 @@ packages: core-js: 3.22.7 dev: true - /@storybook/core-server/6.5.5_prdvedzkszhyllmfomk6yy4khy: + /@storybook/core-server/6.5.5_bxmn6y3pweymjo6ekelj24wybq: resolution: {integrity: sha512-eNXgPl0mbqtyCj/tP0Zw3gtiUCZxN7N7m+3GYYHZlJVzLKhXXxm5qSASk5WOWsDeZTBw2X36k2vPuuwmHQMsOg==} peerDependencies: '@storybook/builder-webpack5': '*' @@ -5584,17 +5586,17 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.5_prdvedzkszhyllmfomk6yy4khy - '@storybook/core-client': 6.5.5_i2ts6dbcrvvxd5u4b66vobh5he - '@storybook/core-common': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/builder-webpack4': 6.5.5_bxmn6y3pweymjo6ekelj24wybq + '@storybook/core-client': 6.5.5_ep5i7rh3xck6dvekot5qk64pi4 + '@storybook/core-common': 6.5.5_bxmn6y3pweymjo6ekelj24wybq '@storybook/core-events': 6.5.5 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.5 - '@storybook/manager-webpack4': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/manager-webpack4': 6.5.5_bxmn6y3pweymjo6ekelj24wybq '@storybook/node-logger': 6.5.5 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/telemetry': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/telemetry': 6.5.5_bxmn6y3pweymjo6ekelj24wybq '@types/node': 16.11.36 '@types/node-fetch': 2.6.1 '@types/pretty-hrtime': 1.0.1 @@ -5625,7 +5627,7 @@ packages: slash: 3.0.0 telejson: 6.0.8 ts-dedent: 2.2.0 - typescript: 4.7.2 + typescript: 4.7.3 util-deprecate: 1.0.2 watchpack: 2.3.1 webpack: 4.46.0 @@ -5644,7 +5646,7 @@ packages: - webpack-command dev: true - /@storybook/core/6.5.5_v2ffolvrsyslamnnn4wdgcnh4q: + /@storybook/core/6.5.5_q2kmbkdx2sq24d7u3cjslgjxvq: resolution: {integrity: sha512-+o1Kzzb31DJJ/NyCeKsAlRc6kgepRAIa6eCj3QNntT4e5m6+Ej0p0TP9PbrN8YQ8/3NMCni2OSLkg6HSchBXig==} peerDependencies: '@storybook/builder-webpack5': '*' @@ -5661,11 +5663,11 @@ packages: typescript: optional: true dependencies: - '@storybook/core-client': 6.5.5_gs43gmpe3gx6zeczbtct32m3ym - '@storybook/core-server': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/core-client': 6.5.5_t6yzycgud3x5i4jgz2gna62xty + '@storybook/core-server': 6.5.5_bxmn6y3pweymjo6ekelj24wybq react: 18.1.0 react-dom: 18.1.0_react@18.1.0 - typescript: 4.7.2 + typescript: 4.7.3 webpack: 5.72.1 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -5786,7 +5788,7 @@ packages: - react-dom dev: true - /@storybook/manager-webpack4/6.5.5_prdvedzkszhyllmfomk6yy4khy: + /@storybook/manager-webpack4/6.5.5_bxmn6y3pweymjo6ekelj24wybq: resolution: {integrity: sha512-STYy20qj1QR+Pb7AIfx+S5SGzsoLzFTDFePoRzQ+8BGEN/jme7eqZqcMC4gPaD5c2toUOChoF69EWpLiZqiqLA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5800,8 +5802,8 @@ packages: '@babel/plugin-transform-template-literals': 7.18.2_@babel+core@7.18.2 '@babel/preset-react': 7.17.12_@babel+core@7.18.2 '@storybook/addons': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm - '@storybook/core-client': 6.5.5_i2ts6dbcrvvxd5u4b66vobh5he - '@storybook/core-common': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/core-client': 6.5.5_ep5i7rh3xck6dvekot5qk64pi4 + '@storybook/core-common': 6.5.5_bxmn6y3pweymjo6ekelj24wybq '@storybook/node-logger': 6.5.5 '@storybook/theming': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/ui': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm @@ -5818,7 +5820,7 @@ packages: fs-extra: 9.1.0 html-webpack-plugin: 4.5.2_webpack@4.46.0 node-fetch: 2.6.7 - pnp-webpack-plugin: 1.6.4_typescript@4.7.2 + pnp-webpack-plugin: 1.6.4_typescript@4.7.3 react: 18.1.0 react-dom: 18.1.0_react@18.1.0 read-pkg-up: 7.0.1 @@ -5828,7 +5830,7 @@ packages: telejson: 6.0.8 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 - typescript: 4.7.2 + typescript: 4.7.3 url-loader: 4.1.1_lit45vopotvaqup7lrvlnvtxwy util-deprecate: 1.0.2 webpack: 4.46.0 @@ -5955,7 +5957,7 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/react-docgen-typescript-plugin/1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0_d3ofjbjbkerjqvgldod72xzm2y: + /@storybook/react-docgen-typescript-plugin/1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0_l2pzpjjnb7ui4zrswmsiz2a6xi: resolution: {integrity: sha512-eVg3BxlOm2P+chijHBTByr90IZVUtgRW56qEOLX7xlww2NBuKrcavBlcmn+HH7GIUktquWkMPtvy6e0W0NgA5w==} peerDependencies: typescript: '>= 3.x' @@ -5966,15 +5968,15 @@ packages: find-cache-dir: 3.3.2 flat-cache: 3.0.4 micromatch: 4.0.5 - react-docgen-typescript: 2.2.2_typescript@4.7.2 + react-docgen-typescript: 2.2.2_typescript@4.7.3 tslib: 2.4.0 - typescript: 4.7.2 + typescript: 4.7.3 webpack: 5.72.1 transitivePeerDependencies: - supports-color dev: true - /@storybook/react/6.5.5_prdvedzkszhyllmfomk6yy4khy: + /@storybook/react/6.5.5_bxmn6y3pweymjo6ekelj24wybq: resolution: {integrity: sha512-hWeYkEKm+vLxPb2iRWJtWiD3/9mWkPyA6ExUVvfkeZ+ygLByPI8MEl8JMQbZtsHySoOLypmgHzV4l4YhvLvdQw==} engines: {node: '>=10.13.0'} hasBin: true @@ -6007,12 +6009,12 @@ packages: '@pmmmwh/react-refresh-webpack-plugin': 0.5.7_jj4bc5mcn3kl4p4jwsxgmjil3i '@storybook/addons': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/client-logger': 6.5.5 - '@storybook/core': 6.5.5_v2ffolvrsyslamnnn4wdgcnh4q - '@storybook/core-common': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/core': 6.5.5_q2kmbkdx2sq24d7u3cjslgjxvq + '@storybook/core-common': 6.5.5_bxmn6y3pweymjo6ekelj24wybq '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@storybook/node-logger': 6.5.5 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0_d3ofjbjbkerjqvgldod72xzm2y + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0_l2pzpjjnb7ui4zrswmsiz2a6xi '@storybook/semver': 7.3.2 '@storybook/store': 6.5.5_ef5jwxihqo6n7gxfmzogljlgcm '@types/estree': 0.0.51 @@ -6037,7 +6039,7 @@ packages: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 - typescript: 4.7.2 + typescript: 4.7.3 util-deprecate: 1.0.2 webpack: 5.72.1 transitivePeerDependencies: @@ -6183,11 +6185,11 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/telemetry/6.5.5_prdvedzkszhyllmfomk6yy4khy: + /@storybook/telemetry/6.5.5_bxmn6y3pweymjo6ekelj24wybq: resolution: {integrity: sha512-Q+k25pvm/IU4uAFxa6S0OrdrgnK/i7lY0bSG1PGNmOh9yEqFCgyzZBTZv/QkM4qB7QHqzUrFyrwAzi2nxAQSZQ==} dependencies: '@storybook/client-logger': 6.5.5 - '@storybook/core-common': 6.5.5_prdvedzkszhyllmfomk6yy4khy + '@storybook/core-common': 6.5.5_bxmn6y3pweymjo6ekelj24wybq chalk: 4.1.2 core-js: 3.22.7 detect-package-manager: 2.0.1 @@ -6652,17 +6654,17 @@ packages: /@types/react-dom/18.0.5: resolution: {integrity: sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==} dependencies: - '@types/react': 18.0.9 + '@types/react': 18.0.11 dev: true /@types/react-syntax-highlighter/11.0.5: resolution: {integrity: sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg==} dependencies: - '@types/react': 18.0.9 + '@types/react': 18.0.11 dev: true - /@types/react/18.0.9: - resolution: {integrity: sha512-9bjbg1hJHUm4De19L1cHiW0Jvx3geel6Qczhjd0qY5VKVE2X5+x77YxAepuCwVh4vrgZJdgEJw48zrhRIeF4Nw==} + /@types/react/18.0.11: + resolution: {integrity: sha512-JxSwm54IgMW4XTR+zFF5QpNx4JITmFbB4WHR2J0vg9RpjNeyqEMlODXsD2e64br6GX70TL0UYjZJETpyyC1WdA==} dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.2 @@ -6764,8 +6766,8 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/5.26.0_hzuh7e2up357pvq3mkokjvu2lq: - resolution: {integrity: sha512-oGCmo0PqnRZZndr+KwvvAUvD3kNE4AfyoGCwOZpoCncSh4MVD06JTE8XQa2u9u+NX5CsyZMBTEc2C72zx38eYA==} + /@typescript-eslint/eslint-plugin/5.27.0_kor2e3kwnnzugzo3aovmfcq2la: + resolution: {integrity: sha512-DDrIA7GXtmHXr1VCcx9HivA39eprYBIFxbQEHI6NyraRDxCGpxAFiYQAT/1Y0vh1C+o2vfBiy4IuPoXxtTZCAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -6775,24 +6777,24 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.26.0_xztl6dhthcahlo6akmb2bmjmle - '@typescript-eslint/scope-manager': 5.26.0 - '@typescript-eslint/type-utils': 5.26.0_xztl6dhthcahlo6akmb2bmjmle - '@typescript-eslint/utils': 5.26.0_xztl6dhthcahlo6akmb2bmjmle + '@typescript-eslint/parser': 5.27.0_ud6rd4xtew5bv4yhvkvu24pzm4 + '@typescript-eslint/scope-manager': 5.27.0 + '@typescript-eslint/type-utils': 5.27.0_ud6rd4xtew5bv4yhvkvu24pzm4 + '@typescript-eslint/utils': 5.27.0_ud6rd4xtew5bv4yhvkvu24pzm4 debug: 4.3.4 - eslint: 8.16.0 + eslint: 8.17.0 functional-red-black-tree: 1.0.1 ignore: 5.2.0 regexpp: 3.2.0 semver: 7.3.7 - tsutils: 3.21.0_typescript@4.7.2 - typescript: 4.7.2 + tsutils: 3.21.0_typescript@4.7.3 + typescript: 4.7.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.26.0_xztl6dhthcahlo6akmb2bmjmle: - resolution: {integrity: sha512-n/IzU87ttzIdnAH5vQ4BBDnLPly7rC5VnjN3m0xBG82HK6rhRxnCb3w/GyWbNDghPd+NktJqB/wl6+YkzZ5T5Q==} + /@typescript-eslint/parser/5.27.0_ud6rd4xtew5bv4yhvkvu24pzm4: + resolution: {integrity: sha512-8oGjQF46c52l7fMiPPvX4It3u3V3JipssqDfHQ2hcR0AeR8Zge+OYyKUCm5b70X72N1qXt0qgHenwN6Gc2SXZA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -6801,26 +6803,26 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.26.0 - '@typescript-eslint/types': 5.26.0 - '@typescript-eslint/typescript-estree': 5.26.0_typescript@4.7.2 + '@typescript-eslint/scope-manager': 5.27.0 + '@typescript-eslint/types': 5.27.0 + '@typescript-eslint/typescript-estree': 5.27.0_typescript@4.7.3 debug: 4.3.4 - eslint: 8.16.0 - typescript: 4.7.2 + eslint: 8.17.0 + typescript: 4.7.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.26.0: - resolution: {integrity: sha512-gVzTJUESuTwiju/7NiTb4c5oqod8xt5GhMbExKsCTp6adU3mya6AGJ4Pl9xC7x2DX9UYFsjImC0mA62BCY22Iw==} + /@typescript-eslint/scope-manager/5.27.0: + resolution: {integrity: sha512-VnykheBQ/sHd1Vt0LJ1JLrMH1GzHO+SzX6VTXuStISIsvRiurue/eRkTqSrG0CexHQgKG8shyJfR4o5VYioB9g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.26.0 - '@typescript-eslint/visitor-keys': 5.26.0 + '@typescript-eslint/types': 5.27.0 + '@typescript-eslint/visitor-keys': 5.27.0 dev: true - /@typescript-eslint/type-utils/5.26.0_xztl6dhthcahlo6akmb2bmjmle: - resolution: {integrity: sha512-7ccbUVWGLmcRDSA1+ADkDBl5fP87EJt0fnijsMFTVHXKGduYMgienC/i3QwoVhDADUAPoytgjbZbCOMj4TY55A==} + /@typescript-eslint/type-utils/5.27.0_ud6rd4xtew5bv4yhvkvu24pzm4: + resolution: {integrity: sha512-vpTvRRchaf628Hb/Xzfek+85o//zEUotr1SmexKvTfs7czXfYjXVT/a5yDbpzLBX1rhbqxjDdr1Gyo0x1Fc64g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -6829,22 +6831,22 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.26.0_xztl6dhthcahlo6akmb2bmjmle + '@typescript-eslint/utils': 5.27.0_ud6rd4xtew5bv4yhvkvu24pzm4 debug: 4.3.4 - eslint: 8.16.0 - tsutils: 3.21.0_typescript@4.7.2 - typescript: 4.7.2 + eslint: 8.17.0 + tsutils: 3.21.0_typescript@4.7.3 + typescript: 4.7.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.26.0: - resolution: {integrity: sha512-8794JZFE1RN4XaExLWLI2oSXsVImNkl79PzTOOWt9h0UHROwJedNOD2IJyfL0NbddFllcktGIO2aOu10avQQyA==} + /@typescript-eslint/types/5.27.0: + resolution: {integrity: sha512-lY6C7oGm9a/GWhmUDOs3xAVRz4ty/XKlQ2fOLr8GAIryGn0+UBOoJDWyHer3UgrHkenorwvBnphhP+zPmzmw0A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.26.0_typescript@4.7.2: - resolution: {integrity: sha512-EyGpw6eQDsfD6jIqmXP3rU5oHScZ51tL/cZgFbFBvWuCwrIptl+oueUZzSmLtxFuSOQ9vDcJIs+279gnJkfd1w==} + /@typescript-eslint/typescript-estree/5.27.0_typescript@4.7.3: + resolution: {integrity: sha512-QywPMFvgZ+MHSLRofLI7BDL+UczFFHyj0vF5ibeChDAJgdTV8k4xgEwF0geFhVlPc1p8r70eYewzpo6ps+9LJQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -6852,41 +6854,41 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.26.0 - '@typescript-eslint/visitor-keys': 5.26.0 + '@typescript-eslint/types': 5.27.0 + '@typescript-eslint/visitor-keys': 5.27.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.7 - tsutils: 3.21.0_typescript@4.7.2 - typescript: 4.7.2 + tsutils: 3.21.0_typescript@4.7.3 + typescript: 4.7.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.26.0_xztl6dhthcahlo6akmb2bmjmle: - resolution: {integrity: sha512-PJFwcTq2Pt4AMOKfe3zQOdez6InIDOjUJJD3v3LyEtxHGVVRK3Vo7Dd923t/4M9hSH2q2CLvcTdxlLPjcIk3eg==} + /@typescript-eslint/utils/5.27.0_ud6rd4xtew5bv4yhvkvu24pzm4: + resolution: {integrity: sha512-nZvCrkIJppym7cIbP3pOwIkAefXOmfGPnCM0LQfzNaKxJHI6VjI8NC662uoiPlaf5f6ymkTy9C3NQXev2mdXmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 - '@typescript-eslint/scope-manager': 5.26.0 - '@typescript-eslint/types': 5.26.0 - '@typescript-eslint/typescript-estree': 5.26.0_typescript@4.7.2 - eslint: 8.16.0 + '@typescript-eslint/scope-manager': 5.27.0 + '@typescript-eslint/types': 5.27.0 + '@typescript-eslint/typescript-estree': 5.27.0_typescript@4.7.3 + eslint: 8.17.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.16.0 + eslint-utils: 3.0.0_eslint@8.17.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.26.0: - resolution: {integrity: sha512-wei+ffqHanYDOQgg/fS6Hcar6wAWv0CUPQ3TZzOWd2BLfgP539rb49bwua8WRAs7R6kOSLn82rfEu2ro6Llt8Q==} + /@typescript-eslint/visitor-keys/5.27.0: + resolution: {integrity: sha512-46cYrteA2MrIAjv9ai44OQDUoCZyHeGIc4lsjCUX2WT6r4C+kidz1bNiR4017wHOPUythYeH+Sc7/cFP97KEAA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.26.0 + '@typescript-eslint/types': 5.27.0 eslint-visitor-keys: 3.3.0 dev: true @@ -7042,8 +7044,8 @@ packages: - supports-color dev: true - /@vitest/ui/0.12.9: - resolution: {integrity: sha512-CFh2yEfakcNeheGAXHvaWGMpI5CcnxVIwkKC1rFz6LnEyOpkEv7i6gbZ1Tqu2YbnC5jRNCrz/bIsT5hT1lh9Rw==} + /@vitest/ui/0.12.10: + resolution: {integrity: sha512-o0XKr8cbT6h7XJwDzxvBFSzqs0z+52LsjtL6BZcZXSgqXMrCJmylM2lSCiLuhXhf+zmOWA0O+mjwLm0PdWCkYw==} dependencies: sirv: 2.0.2 dev: true @@ -7293,8 +7295,8 @@ packages: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true - /NeteaseCloudMusicApi/4.6.0: - resolution: {integrity: sha512-wi5Uz8lg4Arpo1W5teHWDJ84mYFkwV7TlRbapB3aX96u2t9XFGUvFrqocxsfSMYz7NVz6IdHZQtXP+LUeEZPpA==} + /NeteaseCloudMusicApi/4.6.2: + resolution: {integrity: sha512-W4Okv0VCktso6w9CAFzOxinNvY+kJA6S6Z7i8oJd9N/FbDS+qTTytmlOClOHwdEdPlIRKR4MKKKE65HghmY7cg==} engines: {node: '>=12'} hasBin: true dependencies: @@ -8002,7 +8004,7 @@ packages: /babel-plugin-macros/2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 cosmiconfig: 6.0.0 resolve: 1.22.0 @@ -8341,7 +8343,7 @@ packages: /broadcast-channel/3.7.0: resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 detect-node: 2.1.0 js-sha3: 0.8.0 microseconds: 0.2.0 @@ -10213,8 +10215,8 @@ packages: - supports-color dev: true - /electron-releases/3.1021.0: - resolution: {integrity: sha512-qXHZo/+N5iF5rw7UqKHDdbbcTQQmgJpo+ucajlkh0iIxIVLGcelhAPsnc7MkkyhM9Z1gIpqQZPxCrHtpkz5w5g==} + /electron-releases/3.1026.0: + resolution: {integrity: sha512-wfPdn1jVOPCOnEg6sVdLKTU4j+3Yf6beDlHQEswBxiVj/vICV7pGWJG4xfxlFRRgUkuNrEayLRa+5mkVNogZgA==} dev: true /electron-store/8.0.1: @@ -10228,8 +10230,8 @@ packages: resolution: {integrity: sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==} dev: true - /electron/19.0.1: - resolution: {integrity: sha512-zuhJVV7nTDFrRZ7uAIylSD0Eoi1xcUV4UzGfpWsREI4W5GsxNGyZQeqQDpg43w8+7oED812oDrGfPh5kb9rcQA==} + /electron/19.0.3: + resolution: {integrity: sha512-V/8pFkXUOsoHcBzuTYVSbIQKLIwI/FAxfpvbkMazdaO/weZoIf9AN3Qc4Wuo9+489mhelDYc8lSX5N7c6A5n6A==} engines: {node: '>= 8.6'} hasBin: true requiresBuild: true @@ -10267,7 +10269,7 @@ packages: '@emotion/core': ^10.0.27 react: '>=16.3.0' dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 '@emotion/core': 10.3.1_react@18.1.0 '@emotion/weak-memoize': 0.2.5 hoist-non-react-statics: 3.3.2 @@ -10469,8 +10471,8 @@ packages: requiresBuild: true optional: true - /esbuild-android-64/0.14.41: - resolution: {integrity: sha512-byyo8LPOGHzAqxbwh2Q72d7L+rXXTsr/KALjsiCySrJ60CGMe80i3bwoQ+WODxsGaH08R//yg5oc7xHKgQz4uw==} + /esbuild-android-64/0.14.42: + resolution: {integrity: sha512-P4Y36VUtRhK/zivqGVMqhptSrFILAGlYp0Z8r9UQqHJ3iWztRCNWnlBzD9HRx0DbueXikzOiwyOri+ojAFfW6A==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -10494,8 +10496,8 @@ packages: requiresBuild: true optional: true - /esbuild-android-arm64/0.14.41: - resolution: {integrity: sha512-7koo9Dm/mwK4M8PGQX8JQRc4UQ4Wj7DT1nD4BQkVs2jxtHbYOlnsQH0fneKSXZVmnBIHYcntr/e1VU5gnYLvGQ==} + /esbuild-android-arm64/0.14.42: + resolution: {integrity: sha512-0cOqCubq+RWScPqvtQdjXG3Czb3AWI2CaKw3HeXry2eoA2rrPr85HF7IpdU26UWdBXgPYtlTN1LUiuXbboROhg==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -10519,8 +10521,8 @@ packages: requiresBuild: true optional: true - /esbuild-darwin-64/0.14.41: - resolution: {integrity: sha512-kW8fC2auh9jjmBXudTmlMfbBCMYMuujhxG40CxMhKiQ8NLBK4RU9yUYY6ss7QJp24kVTtKd4IvfwOio9SE53MA==} + /esbuild-darwin-64/0.14.42: + resolution: {integrity: sha512-ipiBdCA3ZjYgRfRLdQwP82rTiv/YVMtW36hTvAN5ZKAIfxBOyPXY7Cejp3bMXWgzKD8B6O+zoMzh01GZsCuEIA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -10544,8 +10546,8 @@ packages: requiresBuild: true optional: true - /esbuild-darwin-arm64/0.14.41: - resolution: {integrity: sha512-cO0EPkiQt0bERH9sZFIoTywWfGhEpshdpvQpDfLh/ZJLeioQfaarM9YDrmID+f7k77djh0mdyfsC6XpS0HlLsw==} + /esbuild-darwin-arm64/0.14.42: + resolution: {integrity: sha512-bU2tHRqTPOaoH/4m0zYHbFWpiYDmaA0gt90/3BMEFaM0PqVK/a6MA2V/ypV5PO0v8QxN6gH5hBPY4YJ2lopXgA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -10569,8 +10571,8 @@ packages: requiresBuild: true optional: true - /esbuild-freebsd-64/0.14.41: - resolution: {integrity: sha512-6tsMDK6b7czCOjsr68BgVogFXcTCWL3T7yFXRFuAmXwY9ybYgX8sybD7ztrRB03dLAPeMxHo+PzeMD6LdVrLdQ==} + /esbuild-freebsd-64/0.14.42: + resolution: {integrity: sha512-75h1+22Ivy07+QvxHyhVqOdekupiTZVLN1PMwCDonAqyXd8TVNJfIRFrdL8QmSJrOJJ5h8H1I9ETyl2L8LQDaw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -10594,8 +10596,8 @@ packages: requiresBuild: true optional: true - /esbuild-freebsd-arm64/0.14.41: - resolution: {integrity: sha512-AQ2S/VCLKVBe/+HNiFLyp3w9i7AEtCOWEzKHSkfHk0VO5bPzHd7WJfWmj1Bxliu7vdPESbiDUTJIH3rDt4bzSA==} + /esbuild-freebsd-arm64/0.14.42: + resolution: {integrity: sha512-W6Jebeu5TTDQMJUJVarEzRU9LlKpNkPBbjqSu+GUPTHDCly5zZEQq9uHkmHHl7OKm+mQ2zFySN83nmfCeZCyNA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -10619,8 +10621,8 @@ packages: requiresBuild: true optional: true - /esbuild-linux-32/0.14.41: - resolution: {integrity: sha512-sb7Kah5Px6BNZ6gzm0nJLuDeAJKbIlaKIoI9zgZ5dFDxZSn91TMAHJz5W39YDJ8+ZaGJYIdqZSpDo+4G769mZw==} + /esbuild-linux-32/0.14.42: + resolution: {integrity: sha512-Ooy/Bj+mJ1z4jlWcK5Dl6SlPlCgQB9zg1UrTCeY8XagvuWZ4qGPyYEWGkT94HUsRi2hKsXvcs6ThTOjBaJSMfg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -10644,8 +10646,8 @@ packages: requiresBuild: true optional: true - /esbuild-linux-64/0.14.41: - resolution: {integrity: sha512-PeI0bfbv+5ondZRhPRszptp3RQRRAPxpOB2CYDphKske5+UlCXPi4Af+T++OqhV5TEpymTfxJdJQ1sn1w32coA==} + /esbuild-linux-64/0.14.42: + resolution: {integrity: sha512-2L0HbzQfbTuemUWfVqNIjOfaTRt9zsvjnme6lnr7/MO9toz/MJ5tZhjqrG6uDWDxhsaHI2/nsDgrv8uEEN2eoA==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -10669,8 +10671,8 @@ packages: requiresBuild: true optional: true - /esbuild-linux-arm/0.14.41: - resolution: {integrity: sha512-8DQ6Sv3XNwgu0cnPA3q+kJSqfOYLDqWzpW8dPF+/Or23bS/5EIT/CzN73uIhR8A3AokXIczn88VKti7Xtv+V2g==} + /esbuild-linux-arm/0.14.42: + resolution: {integrity: sha512-STq69yzCMhdRaWnh29UYrLSr/qaWMm/KqwaRF1pMEK7kDiagaXhSL1zQGXbYv94GuGY/zAwzK98+6idCMUOOCg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -10694,8 +10696,8 @@ packages: requiresBuild: true optional: true - /esbuild-linux-arm64/0.14.41: - resolution: {integrity: sha512-aAhBX6kVG8hTVuANE90ORobioHdpZLzy8Fibf4XBuG4IuJfjgM5N4wFIq2Tpd+Ykit432PL/YOQhZ4W6nVc4cQ==} + /esbuild-linux-arm64/0.14.42: + resolution: {integrity: sha512-c3Ug3e9JpVr8jAcfbhirtpBauLxzYPpycjWulD71CF6ZSY26tvzmXMJYooQ2YKqDY4e/fPu5K8bm7MiXMnyxuA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -10719,8 +10721,8 @@ packages: requiresBuild: true optional: true - /esbuild-linux-mips64le/0.14.41: - resolution: {integrity: sha512-88xo4FRYQ2laMJnrqZu8j5q531XT/odZnhO5NLWO/NdweIdT8F+QL0fNIBIf+nVkC1d0Psgmt+g35GAODMDl8g==} + /esbuild-linux-mips64le/0.14.42: + resolution: {integrity: sha512-QuvpHGbYlkyXWf2cGm51LBCHx6eUakjaSrRpUqhPwjh/uvNUYvLmz2LgPTTPwCqaKt0iwL+OGVL0tXA5aDbAbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -10744,8 +10746,8 @@ packages: requiresBuild: true optional: true - /esbuild-linux-ppc64le/0.14.41: - resolution: {integrity: sha512-kJ0r/Cg3LzFzHhbBsvqi/hDPGKMGzFiPGOmUvqTkfVXhRUQtOMkXkyKdP7OEMRb8ctPtnptsZOOXPHRdU0NdJQ==} + /esbuild-linux-ppc64le/0.14.42: + resolution: {integrity: sha512-8ohIVIWDbDT+i7lCx44YCyIRrOW1MYlks9fxTo0ME2LS/fxxdoJBwHWzaDYhjvf8kNpA+MInZvyOEAGoVDrMHg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -10761,8 +10763,8 @@ packages: requiresBuild: true optional: true - /esbuild-linux-riscv64/0.14.41: - resolution: {integrity: sha512-ZJ7d/qFRx14J3aP75ccrFSZyuYZ1hu8IVfwVqyQg4jQFgNME2FMz7pZMskBJ0fSW8QcYUnN3RubFXWijyjKUug==} + /esbuild-linux-riscv64/0.14.42: + resolution: {integrity: sha512-DzDqK3TuoXktPyG1Lwx7vhaF49Onv3eR61KwQyxYo4y5UKTpL3NmuarHSIaSVlTFDDpcIajCDwz5/uwKLLgKiQ==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -10778,8 +10780,8 @@ packages: requiresBuild: true optional: true - /esbuild-linux-s390x/0.14.41: - resolution: {integrity: sha512-xeWAEZt1jAfYkYuyIUuHKpH/oj7O862Je5HTH9E+4sEfoOnZaAmFrisbXjGDKXjMRKYscFlM8wXdNBmiqQlT8g==} + /esbuild-linux-s390x/0.14.42: + resolution: {integrity: sha512-YFRhPCxl8nb//Wn6SiS5pmtplBi4z9yC2gLrYoYI/tvwuB1jldir9r7JwAGy1Ck4D7sE7wBN9GFtUUX/DLdcEQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -10803,8 +10805,8 @@ packages: requiresBuild: true optional: true - /esbuild-netbsd-64/0.14.41: - resolution: {integrity: sha512-X/UE3Asqy594/atYi/STgYtaMQBJwtZKF0KFFdJTkwb6rtaoHCM1o482iHibgnSK7CicuRhyTZ+cNx4OFqRQAg==} + /esbuild-netbsd-64/0.14.42: + resolution: {integrity: sha512-QYSD2k+oT9dqB/4eEM9c+7KyNYsIPgzYOSrmfNGDIyJrbT1d+CFVKvnKahDKNJLfOYj8N4MgyFaU9/Ytc6w5Vw==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -10828,8 +10830,8 @@ packages: requiresBuild: true optional: true - /esbuild-openbsd-64/0.14.41: - resolution: {integrity: sha512-6m+1dtdO+4KaU3R0UTT82hxWxWpFCjgSHhQl/PKtMmq+CvvxRQDcTwujLC843M7ChGVWNM2q1s6YCwoA0WQ9kw==} + /esbuild-openbsd-64/0.14.42: + resolution: {integrity: sha512-M2meNVIKWsm2HMY7+TU9AxM7ZVwI9havdsw6m/6EzdXysyCFFSoaTQ/Jg03izjCsK17FsVRHqRe26Llj6x0MNA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -10853,8 +10855,8 @@ packages: requiresBuild: true optional: true - /esbuild-sunos-64/0.14.41: - resolution: {integrity: sha512-p96tTTcE8/WY7A4Udh+fxVUTGL8rIXOpyxyhZiXug+f7DGbjE24PbewqgIBRSDyM7xRUty+1RzqyJz73YIV6yg==} + /esbuild-sunos-64/0.14.42: + resolution: {integrity: sha512-uXV8TAZEw36DkgW8Ak3MpSJs1ofBb3Smkc/6pZ29sCAN1KzCAQzsje4sUwugf+FVicrHvlamCOlFZIXgct+iqQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -10878,8 +10880,8 @@ packages: requiresBuild: true optional: true - /esbuild-windows-32/0.14.41: - resolution: {integrity: sha512-jS+/pGyPPzrL8tgcvOxLEatV1QPICghKm13EjEVgkeRftl8X6tqRyFv/9eKutczdD3sklMDOJfivoPD32D46Ww==} + /esbuild-windows-32/0.14.42: + resolution: {integrity: sha512-4iw/8qWmRICWi9ZOnJJf9sYt6wmtp3hsN4TdI5NqgjfOkBVMxNdM9Vt3626G1Rda9ya2Q0hjQRD9W1o+m6Lz6g==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -10903,8 +10905,8 @@ packages: requiresBuild: true optional: true - /esbuild-windows-64/0.14.41: - resolution: {integrity: sha512-vLqmKbV8FJ7LFMrT3zEQpojnUUbXyqhRPVGnAYzc0ESY5yAuom4E9tL7KzZ5H8KEuCUf//AvbyxpE+yOcjpyjA==} + /esbuild-windows-64/0.14.42: + resolution: {integrity: sha512-j3cdK+Y3+a5H0wHKmLGTJcq0+/2mMBHPWkItR3vytp/aUGD/ua/t2BLdfBIzbNN9nLCRL9sywCRpOpFMx3CxzA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -10928,8 +10930,8 @@ packages: requiresBuild: true optional: true - /esbuild-windows-arm64/0.14.41: - resolution: {integrity: sha512-TOvj7kRTfpH4GPPmblvuMNf8oNJ3y2h7a6HttanVnc3QLMm5bNFYLSo6TShLOn0SbqFWGJwHIhGhw2JK96aVhg==} + /esbuild-windows-arm64/0.14.42: + resolution: {integrity: sha512-+lRAARnF+hf8J0mN27ujO+VbhPbDqJ8rCcJKye4y7YZLV6C4n3pTRThAb388k/zqF5uM0lS5O201u0OqoWSicw==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -10988,32 +10990,32 @@ packages: esbuild-windows-64: 0.14.38 esbuild-windows-arm64: 0.14.38 - /esbuild/0.14.41: - resolution: {integrity: sha512-uZl2CH5nwayLPi1Unhfk+vBBjD3FDlYQ+v24qAlj2oZMYQP8pFs1k3DK5ViD+keF3JnuV4K7JtqVvBmTDwVEbA==} + /esbuild/0.14.42: + resolution: {integrity: sha512-V0uPZotCEHokJdNqyozH6qsaQXqmZEOiZWrXnds/zaH/0SyrIayRXWRB98CENO73MIZ9T3HBIOsmds5twWtmgw==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - esbuild-android-64: 0.14.41 - esbuild-android-arm64: 0.14.41 - esbuild-darwin-64: 0.14.41 - esbuild-darwin-arm64: 0.14.41 - esbuild-freebsd-64: 0.14.41 - esbuild-freebsd-arm64: 0.14.41 - esbuild-linux-32: 0.14.41 - esbuild-linux-64: 0.14.41 - esbuild-linux-arm: 0.14.41 - esbuild-linux-arm64: 0.14.41 - esbuild-linux-mips64le: 0.14.41 - esbuild-linux-ppc64le: 0.14.41 - esbuild-linux-riscv64: 0.14.41 - esbuild-linux-s390x: 0.14.41 - esbuild-netbsd-64: 0.14.41 - esbuild-openbsd-64: 0.14.41 - esbuild-sunos-64: 0.14.41 - esbuild-windows-32: 0.14.41 - esbuild-windows-64: 0.14.41 - esbuild-windows-arm64: 0.14.41 + esbuild-android-64: 0.14.42 + esbuild-android-arm64: 0.14.42 + esbuild-darwin-64: 0.14.42 + esbuild-darwin-arm64: 0.14.42 + esbuild-freebsd-64: 0.14.42 + esbuild-freebsd-arm64: 0.14.42 + esbuild-linux-32: 0.14.42 + esbuild-linux-64: 0.14.42 + esbuild-linux-arm: 0.14.42 + esbuild-linux-arm64: 0.14.42 + esbuild-linux-mips64le: 0.14.42 + esbuild-linux-ppc64le: 0.14.42 + esbuild-linux-riscv64: 0.14.42 + esbuild-linux-s390x: 0.14.42 + esbuild-netbsd-64: 0.14.42 + esbuild-openbsd-64: 0.14.42 + esbuild-sunos-64: 0.14.42 + esbuild-windows-32: 0.14.42 + esbuild-windows-64: 0.14.42 + esbuild-windows-arm64: 0.14.42 dev: true /escalade/3.1.1: @@ -11062,16 +11064,16 @@ packages: source-map: 0.6.1 dev: true - /eslint-plugin-react-hooks/4.5.0_eslint@8.16.0: + /eslint-plugin-react-hooks/4.5.0_eslint@8.17.0: resolution: {integrity: sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.16.0 + eslint: 8.17.0 dev: true - /eslint-plugin-react/7.30.0_eslint@8.16.0: + /eslint-plugin-react/7.30.0_eslint@8.17.0: resolution: {integrity: sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==} engines: {node: '>=4'} peerDependencies: @@ -11080,7 +11082,7 @@ packages: array-includes: 3.1.5 array.prototype.flatmap: 1.3.0 doctrine: 2.1.0 - eslint: 8.16.0 + eslint: 8.17.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.0 minimatch: 3.1.2 @@ -11118,13 +11120,13 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.16.0: + /eslint-utils/3.0.0_eslint@8.17.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.16.0 + eslint: 8.17.0 eslint-visitor-keys: 2.1.0 dev: true @@ -11138,8 +11140,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.16.0: - resolution: {integrity: sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==} + /eslint/8.17.0: + resolution: {integrity: sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: @@ -11152,7 +11154,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.16.0 + eslint-utils: 3.0.0_eslint@8.17.0 eslint-visitor-keys: 3.3.0 espree: 9.3.2 esquery: 1.4.0 @@ -11406,8 +11408,8 @@ packages: /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-folder-size/1.6.2: - resolution: {integrity: sha512-sruYdpIWmLra7avLYJSbyUJuzHOIG5IFi3x4MoP4l2TRja+jTVEvDL8Bo0k/Yu2uk63Zj20ZgBRw8cCOwMkmyA==} + /fast-folder-size/1.7.0: + resolution: {integrity: sha512-NtU4r7WOKYtU6sinhjgvRw3KoY6fUHp1UVfu6EUiX65HanN/JnZjCYBY+h2J9xLpKti/3UtvyfcKLwvzNkTHOw==} hasBin: true requiresBuild: true dependencies: @@ -11667,7 +11669,7 @@ packages: signal-exit: 3.0.7 dev: true - /fork-ts-checker-webpack-plugin/4.1.6_2gfktnqqmcadqrnc4yeoi2id7m: + /fork-ts-checker-webpack-plugin/4.1.6_ixplphslglgm26g7hajb6yf2fu: resolution: {integrity: sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==} engines: {node: '>=6.11.5', yarn: '>=1.0.0'} peerDependencies: @@ -11683,19 +11685,19 @@ packages: dependencies: '@babel/code-frame': 7.16.7 chalk: 2.4.2 - eslint: 8.16.0 + eslint: 8.17.0 micromatch: 3.1.10 minimatch: 3.1.2 semver: 5.7.1 tapable: 1.1.3 - typescript: 4.7.2 + typescript: 4.7.3 webpack: 4.46.0 worker-rpc: 0.1.1 transitivePeerDependencies: - supports-color dev: true - /fork-ts-checker-webpack-plugin/6.5.2_2gfktnqqmcadqrnc4yeoi2id7m: + /fork-ts-checker-webpack-plugin/6.5.2_ixplphslglgm26g7hajb6yf2fu: resolution: {integrity: sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -11715,7 +11717,7 @@ packages: chokidar: 3.5.3 cosmiconfig: 6.0.0 deepmerge: 4.2.2 - eslint: 8.16.0 + eslint: 8.17.0 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.4.4 @@ -11723,7 +11725,7 @@ packages: schema-utils: 2.7.0 semver: 7.3.7 tapable: 1.1.3 - typescript: 4.7.2 + typescript: 4.7.3 webpack: 4.46.0 dev: true @@ -11764,8 +11766,8 @@ packages: map-cache: 0.2.2 dev: true - /framer-motion/6.3.4_ef5jwxihqo6n7gxfmzogljlgcm: - resolution: {integrity: sha512-FXHqpY23g0MhznXpAf94SyEmUqfw7KoLaCQqTKrjWZgQzMkjvfOgOVYKUA9Dlmys6XGn0qN+AMzjhFJ1N5bH+A==} + /framer-motion/6.3.10_ef5jwxihqo6n7gxfmzogljlgcm: + resolution: {integrity: sha512-modFplFb1Fznsm0MrmRAJUC32UDA5jbGU9rDvkGzhAHksru2tnoKbU/Pa3orzdsJI0CJviG4NGBrmwGveU98Cg==} peerDependencies: react: '>=16.8 || ^17.0.0 || ^18.0.0' react-dom: '>=16.8 || ^17.0.0 || ^18.0.0' @@ -12460,13 +12462,13 @@ packages: /history/5.0.0: resolution: {integrity: sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 dev: true /history/5.3.0: resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 /hmac-drbg/1.0.1: resolution: {integrity: sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=} @@ -12992,7 +12994,7 @@ packages: dev: true /is-glob/3.1.0: - resolution: {integrity: sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=} + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 @@ -13946,7 +13948,7 @@ packages: /match-sorter/6.3.1: resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 remove-accents: 0.4.2 dev: false @@ -15330,11 +15332,11 @@ packages: engines: {node: '>=10.13.0'} dev: false - /pnp-webpack-plugin/1.6.4_typescript@4.7.2: + /pnp-webpack-plugin/1.6.4_typescript@4.7.3: resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} engines: {node: '>=6'} dependencies: - ts-pnp: 1.2.0_typescript@4.7.2 + ts-pnp: 1.2.0_typescript@4.7.3 transitivePeerDependencies: - typescript dev: true @@ -15343,7 +15345,7 @@ packages: resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} engines: {node: '>=10'} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 dev: true /popmotion/11.0.3: @@ -15898,12 +15900,12 @@ packages: minimist: 1.2.6 strip-json-comments: 2.0.1 - /react-docgen-typescript/2.2.2_typescript@4.7.2: + /react-docgen-typescript/2.2.2_typescript@4.7.3: resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} peerDependencies: typescript: '>= 4.3.x' dependencies: - typescript: 4.7.2 + typescript: 4.7.3 dev: true /react-docgen/5.4.0: @@ -15966,6 +15968,16 @@ packages: react-is: 17.0.2 dev: true + /react-error-boundary/3.1.4_react@18.1.0: + resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + react: '>=16.13.1' + dependencies: + '@babel/runtime': 7.18.3 + react: 18.1.0 + dev: false + /react-ga4/1.4.1: resolution: {integrity: sha512-ioBMEIxd4ePw4YtaloTUgqhQGqz5ebDdC4slEpLgy2sLx1LuZBC9iYCwDymTXzcntw6K1dHX183ulP32nNdG7w==} dev: false @@ -16006,8 +16018,8 @@ packages: resolution: {integrity: sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==} dev: true - /react-query/3.39.0_ef5jwxihqo6n7gxfmzogljlgcm: - resolution: {integrity: sha512-Od0IkSuS79WJOhzWBx/ys0x13+7wFqgnn64vBqqAAnZ9whocVhl/y1padD5uuZ6EIkXbFbInax0qvY7zGM0thA==} + /react-query/3.39.1_ef5jwxihqo6n7gxfmzogljlgcm: + resolution: {integrity: sha512-qYKT1bavdDiQZbngWZyPotlBVzcBjDYEJg5RQLBa++5Ix5jjfbEYJmHSZRZD+USVHUSvl/ey9Hu+QfF1QAK80A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: '*' @@ -17939,7 +17951,7 @@ packages: resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} dev: false - /ts-pnp/1.2.0_typescript@4.7.2: + /ts-pnp/1.2.0_typescript@4.7.3: resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} engines: {node: '>=6'} peerDependencies: @@ -17948,7 +17960,7 @@ packages: typescript: optional: true dependencies: - typescript: 4.7.2 + typescript: 4.7.3 dev: true /tslib/1.14.1: @@ -17957,14 +17969,14 @@ packages: /tslib/2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - /tsutils/3.21.0_typescript@4.7.2: + /tsutils/3.21.0_typescript@4.7.3: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.7.2 + typescript: 4.7.3 dev: true /tty-browserify/0.0.0: @@ -17981,128 +17993,128 @@ packages: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - /turbo-darwin-64/1.2.14: - resolution: {integrity: sha512-Fdx212fvhcbF/KKnSoenTtNLZ5Wzl+DDBmwHoHXmG2DX/1qFk4HD1/D6waCySZU1Hu1bQToIimEyrWgwAkCVbQ==} + /turbo-darwin-64/1.2.16: + resolution: {integrity: sha512-dyitLQJdH3uLVdlH9jAkP4LqEO/K+wOXjUqOzjTciRLjQPzmsNY60/bmFHODADK4eBBl1nxbtn7tmmoT4vS1qA==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64/1.2.14: - resolution: {integrity: sha512-B9LRgZKW1D8EwMLNhW6n8pADiZZ+M7Qgb/Pv9DAJM+/MW5ozRn/PBA4Y+teyx2dGuaMOzvX9QzRhT1jn5U71TA==} + /turbo-darwin-arm64/1.2.16: + resolution: {integrity: sha512-Ex6uM4HU7rGXdhvJMpzNpp6qxglJ98nWeIi5qR/lBXHLjK3UCvSW8BEALArUJYJTXS9FZBq1a5LowFqXYsfDcA==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-freebsd-64/1.2.14: - resolution: {integrity: sha512-kmDgDZXS3vdDremUPPkaY4bAtEyqqUnhcH3tVGsHZJ6OF1eCoy+oiXWa9Aw7Wm2B0Ph5TyMooOjChgE44q4cMA==} + /turbo-freebsd-64/1.2.16: + resolution: {integrity: sha512-onRGKMvog8B3XDssSBIAg+FrEq9pcBoAybP7bpi/uYIH1L/WQ7YMmLn88X9JX19ehYuVOVZrjap4jWH2GIkU8A==} cpu: [x64] os: [freebsd] requiresBuild: true dev: true optional: true - /turbo-freebsd-arm64/1.2.14: - resolution: {integrity: sha512-ZDbxkIXkBQJGJOrwihmfbza+jnfObMspbThEL0bp/MtMJS8QO4NELyjHDM0LgTfecduXtS1rJMSe7pZjiEK/Vg==} + /turbo-freebsd-arm64/1.2.16: + resolution: {integrity: sha512-S0EqPqxwnJuVNNXRgcHB0r8ai8LSrpHdihVJKRM7WYmIR7isccBEf/G9agrt73sCXwjvenxFs4HDR7cSvGt14Q==} cpu: [arm64] os: [freebsd] requiresBuild: true dev: true optional: true - /turbo-linux-32/1.2.14: - resolution: {integrity: sha512-fBGbevGtvbGV5bK+w6O8vve5C07TbdfIk5j59odTZo782F4Xs7fgY57mRQtNOq71YUW9Hs7FGrLUI1iRsVODAA==} + /turbo-linux-32/1.2.16: + resolution: {integrity: sha512-ecbqmGOxgTWePGrowtwyvZGfvwaLxFWmPK21cU0PS+fzoZBaVmzYmniTdd/2EkGCw7TOPhtiT22v96fWcnRycA==} cpu: [ia32] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-64/1.2.14: - resolution: {integrity: sha512-im46sHYjZ/yl4JSmjF8HbgHpvClVHtFMvIkRVnJGuJK+e74L5YVX7ML/o1PdBj4NtQNNxyPRWfit7zfM/yLjtQ==} + /turbo-linux-64/1.2.16: + resolution: {integrity: sha512-q6gtdMWCzM0Sktkd73zcaQjNoeM1MjtrbwQBctWN/Sgj0eiPBPnzpIvokvx98x7RLf4qyI99/mlme0Dn5fx21A==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm/1.2.14: - resolution: {integrity: sha512-d8v53TxIQpq6w3RFxcOyHrQzLcvgyA3VC9oxZ2phZtlcTvjjZulYmuToUAHdRW24cA2DGZkwA2wSF//zJoBcdQ==} + /turbo-linux-arm/1.2.16: + resolution: {integrity: sha512-du7uvExELNb89V3g7iM0XP21fR1Yl3EoHRcOfQz32oUqnS7idCKvbEowM9LtiluQl1dKcOIJjn1nlvvsqzkhOg==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64/1.2.14: - resolution: {integrity: sha512-qyusEtylnt5cF2+jIOMIN4iCzMG/tur2y3++YeKRCdGaboPUbsfCcTXbhM29VxxNWw5JVxh7FC0+ZUsEFRYDNg==} + /turbo-linux-arm64/1.2.16: + resolution: {integrity: sha512-gUf67tYJ/N09WAZTTmtUWYrqm381tZxiulnRGAIM+iRsaTrweyUKZaYXwJvlPpI/cQOw25wCG9/IyvxLeagL8A==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-mips64le/1.2.14: - resolution: {integrity: sha512-zKPi9ArRDu4BKB8YmcQ6i89Hhzd5xk4W+m7YuZKBmeEVCFBDUUAyWnKsvmBoYuGTpdQqMSH14BdYMTr5s2thjw==} + /turbo-linux-mips64le/1.2.16: + resolution: {integrity: sha512-U5BM+Ql3z13uRtwMmKH/8eL+9DdTgyijC2gaX4xP0RTlcN7WfAstg8Fg/Tn2Vw9vtpVDdxwpw7dvX4kw2ghhpA==} cpu: [mips64el] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-ppc64le/1.2.14: - resolution: {integrity: sha512-gW43yKJjSHZjZdjI/MihrnIEACnwhB+okJJjYYFKuEteJF+TCWHvY3rfL9MFI7vH2zwFUgoncIOuGvaeZo3K0A==} + /turbo-linux-ppc64le/1.2.16: + resolution: {integrity: sha512-HQWSCmVZyc5chw7Ie2ZcfZPfmM06mbEEu0Wl11Y5QWh1ZzhPNQHs/TsF4I9r146wHi62XgcrKFjkw4ARZiWsLA==} cpu: [ppc64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-32/1.2.14: - resolution: {integrity: sha512-BMqpSaHx5mgvMdXotMoVinU3dSGBoRdZZkwOAs8R0WPUCwZVMPo6fTuKIhcOlKFOt6swQGFD02IzCWD+SGfEuA==} + /turbo-windows-32/1.2.16: + resolution: {integrity: sha512-0ZtPz5FK2qZjznMG4vvRyaabrhO8BgbN+tBx1wjXSuoICTAjYi5TwRVVRh59c3x7qQmR21Cv33CrhLBPRfeAlg==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-64/1.2.14: - resolution: {integrity: sha512-SA9YNAyZ2wYBccPtWbQckpSZOAuhH71893UZsstRWUEUj/cZ+PFpwNGTrHTGoySbwQPbOVHQNXEO7QX405Ajow==} + /turbo-windows-64/1.2.16: + resolution: {integrity: sha512-j8iAIixq/rGfBpHNbYOosxMasZrGuMzLILEuQGDxZgKNpYgobJ15QFHQlGR9sit1b8qPU5zZX4CtByRtkgH1Bw==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64/1.2.14: - resolution: {integrity: sha512-VNxbJ2LlRWzkiRE15nwW4oA/wBMFf1h8fuPCHHXtB6ThjfeG8SN5QgPUrhTIP4p7WiEdN/Sq7UJzFrGA4I8jqg==} + /turbo-windows-arm64/1.2.16: + resolution: {integrity: sha512-4GpcJG3B8R9WDhwfT8fu6ZmOOfseCg6Q1cy/G8/zpJQk769yYcSnD8MgQhYgHB58aVFxZcMxBvLL6UA0UrpgWA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo/1.2.14: - resolution: {integrity: sha512-una2aE2agjTT2SgC3kCmUrYIPy5uh5NLPQrRCKKBIgvII90vyajvFhcq+yJUYdh5f+2o0xb/9YXaj+FAITds0A==} + /turbo/1.2.16: + resolution: {integrity: sha512-PPUa2COKgFkyb6N3uF9AnIY3l9FZkF15QQ3U1K2wpI01D3gyGKQO0Q3DUQ4ipmciP0teBfL7H+l/QTrUA9IVvQ==} hasBin: true requiresBuild: true optionalDependencies: - turbo-darwin-64: 1.2.14 - turbo-darwin-arm64: 1.2.14 - turbo-freebsd-64: 1.2.14 - turbo-freebsd-arm64: 1.2.14 - turbo-linux-32: 1.2.14 - turbo-linux-64: 1.2.14 - turbo-linux-arm: 1.2.14 - turbo-linux-arm64: 1.2.14 - turbo-linux-mips64le: 1.2.14 - turbo-linux-ppc64le: 1.2.14 - turbo-windows-32: 1.2.14 - turbo-windows-64: 1.2.14 - turbo-windows-arm64: 1.2.14 + turbo-darwin-64: 1.2.16 + turbo-darwin-arm64: 1.2.16 + turbo-freebsd-64: 1.2.16 + turbo-freebsd-arm64: 1.2.16 + turbo-linux-32: 1.2.16 + turbo-linux-64: 1.2.16 + turbo-linux-arm: 1.2.16 + turbo-linux-arm64: 1.2.16 + turbo-linux-mips64le: 1.2.16 + turbo-linux-ppc64le: 1.2.16 + turbo-windows-32: 1.2.16 + turbo-windows-64: 1.2.16 + turbo-windows-arm64: 1.2.16 dev: true /type-check/0.3.2: @@ -18170,8 +18182,8 @@ packages: resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=} dev: true - /typescript/4.7.2: - resolution: {integrity: sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==} + /typescript/4.7.3: + resolution: {integrity: sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==} engines: {node: '>=4.2.0'} hasBin: true dev: true @@ -18339,7 +18351,7 @@ packages: /unload/2.2.0: resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 detect-node: 2.1.0 dev: false @@ -18661,8 +18673,8 @@ packages: optionalDependencies: fsevents: 2.3.2 - /vitest/0.12.9_izzclx2ns4ngboxzp36esaqdxe: - resolution: {integrity: sha512-1NtyUANS72Qw5PwYvoztk067NX4fSiis2xQxhByOWS33eL2er/yupHyLxlBCOkF2ANe0dLFRvT1GVb+nczL5aw==} + /vitest/0.12.10_5y625lpcnancu4te4y3qqugezq: + resolution: {integrity: sha512-TVoI6fM7rZ1zIMDjcviY8Dg5XIaPqBwDweaI3oUwvWqUz68cbM49CIHNMkF+UVoSjl94wXiBRdNhsT4ekgWuGA==} engines: {node: '>=v14.16.0'} hasBin: true peerDependencies: @@ -18682,7 +18694,7 @@ packages: dependencies: '@types/chai': 4.3.1 '@types/chai-subset': 1.3.3 - '@vitest/ui': 0.12.9 + '@vitest/ui': 0.12.10 c8: 7.11.3 chai: 4.3.6 debug: 4.3.4 diff --git a/turbo.json b/turbo.json index 6040152..47cdad4 100644 --- a/turbo.json +++ b/turbo.json @@ -12,8 +12,12 @@ "dependsOn": ["^build"], "outputs": ["dist/**"] }, + "pack": { + "dependsOn": ["build"], + "outputs": ["release/**"] + }, "test": { - "dependsOn": ["^build"], + "dependsOn": ["build"], "outputs": [] }, "lint": {