diff --git a/package.json b/package.json index 80b9adb..12850bf 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "dependencies": { + "@sentry/node": "^6.19.2", + "@sentry/tracing": "^6.19.2", "NeteaseCloudMusicApi": "^4.5.8", "change-case": "^4.1.2", "cookie-parser": "^1.4.6", @@ -30,6 +32,7 @@ "realm": "^10.13.0" }, "devDependencies": { + "@sentry/react": "^6.19.2", "@types/cookie-parser": "^1.4.2", "@types/express": "^4.17.13", "@types/express-fileupload": "^1.2.2", diff --git a/packages/main/cache.ts b/packages/main/cache.ts index 365fd23..2b4c002 100644 --- a/packages/main/cache.ts +++ b/packages/main/cache.ts @@ -99,7 +99,6 @@ export function getCache( if (!isIDsValid) return const idsQuery = ids.map(id => `id = ${id}`).join(' OR ') - console.log(idsQuery) const tracksRaw = realm .objects(ModelNames.TRACK) .filtered(`(${idsQuery})`) diff --git a/packages/main/index.ts b/packages/main/index.ts index a63dacb..f680eb2 100644 --- a/packages/main/index.ts +++ b/packages/main/index.ts @@ -1,4 +1,5 @@ import './preload' // must be first +import './sentry' import { BrowserWindow, BrowserWindowConstructorOptions, diff --git a/packages/main/sentry.ts b/packages/main/sentry.ts new file mode 100644 index 0000000..28c7a2f --- /dev/null +++ b/packages/main/sentry.ts @@ -0,0 +1,14 @@ +import * as Sentry from '@sentry/node' +import * as Tracing from '@sentry/tracing' +import pkg from '../../package.json' + +Sentry.init({ + dsn: 'https://2aaaa67f1c3d4d6baefafa5d58fcf340@o436528.ingest.sentry.io/6274637', + release: `yesplaymusic@${pkg.version}`, + environment: import.meta.env.MODE, + + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for performance monitoring. + // We recommend adjusting this value in production + tracesSampleRate: 1.0, +}) diff --git a/packages/renderer/src/assets/icons/volume-half.svg b/packages/renderer/src/assets/icons/volume-half.svg index 3874031..996d6fe 100644 --- a/packages/renderer/src/assets/icons/volume-half.svg +++ b/packages/renderer/src/assets/icons/volume-half.svg @@ -1,2 +1,4 @@ - - + + + + diff --git a/packages/renderer/src/assets/icons/volume.svg b/packages/renderer/src/assets/icons/volume.svg index 420b924..2ee9dc4 100644 --- a/packages/renderer/src/assets/icons/volume.svg +++ b/packages/renderer/src/assets/icons/volume.svg @@ -1,4 +1,4 @@ - - + + diff --git a/packages/renderer/src/assets/icons/x.svg b/packages/renderer/src/assets/icons/x.svg index 0ac16c8..61d2d7e 100644 --- a/packages/renderer/src/assets/icons/x.svg +++ b/packages/renderer/src/assets/icons/x.svg @@ -1,3 +1,3 @@ - - + + diff --git a/packages/renderer/src/components/Topbar.tsx b/packages/renderer/src/components/Topbar.tsx index 0353afc..5e16f24 100644 --- a/packages/renderer/src/components/Topbar.tsx +++ b/packages/renderer/src/components/Topbar.tsx @@ -29,17 +29,38 @@ const NavigationButtons = () => { } const SearchBox = () => { + const [keyword, setKeyword] = useState('') + const navigate = useNavigate() + const toSearch = (e: React.KeyboardEvent) => { + if (!keyword) return + if (e.key === 'Enter') { + navigate(`/search/${keyword}`) + } + } + return ( -
+
setKeyword(e.target.value)} + onKeyDown={toSearch} type='text' - className='w-full bg-transparent placeholder:text-gray-500 dark:text-white dark:placeholder:text-gray-400' + className='flex-grow bg-transparent placeholder:text-gray-500 dark:text-white dark:placeholder:text-gray-400' placeholder='搜索' /> +
setKeyword('')} + className={classNames( + 'cursor-default rounded-full p-1 transition after:bg-gray-300 hover:bg-white/20 dark:text-white/50', + !keyword && 'hidden' + )} + > + +
) } @@ -55,9 +76,12 @@ const Settings = () => { const Avatar = () => { const navigate = useNavigate() const { data: user } = useUser() + + const avatarUrl = resizeImage(user?.profile?.avatarUrl ?? '', 'sm') + return ( navigate('/login')} className='app-region-no-drag h-9 w-9 rounded-full bg-gray-100 dark:bg-gray-700' /> diff --git a/packages/renderer/src/main.tsx b/packages/renderer/src/main.tsx index 30a24ff..a30606e 100644 --- a/packages/renderer/src/main.tsx +++ b/packages/renderer/src/main.tsx @@ -1,9 +1,24 @@ import { StrictMode } from 'react' import { render } from 'react-dom' import { BrowserRouter } from 'react-router-dom' +import * as Sentry from '@sentry/react' +import { BrowserTracing } from '@sentry/tracing' import 'virtual:svg-icons-register' import '@/styles/global.scss' import App from './App' +import pkg from '../../../package.json' + +Sentry.init({ + dsn: 'https://7cc7879b42ba4bed9f66fb6752558475@o436528.ingest.sentry.io/6274630', + integrations: [new BrowserTracing()], + release: `yesplaymusic@${pkg.version}`, + environment: import.meta.env.MODE, + + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for performance monitoring. + // We recommend adjusting this value in production + tracesSampleRate: 1.0, +}) render( diff --git a/packages/renderer/src/pages/Album.tsx b/packages/renderer/src/pages/Album.tsx index d001e19..f74c283 100644 --- a/packages/renderer/src/pages/Album.tsx +++ b/packages/renderer/src/pages/Album.tsx @@ -96,7 +96,7 @@ const Header = ({ /> )} -
+
@@ -145,7 +145,7 @@ const Header = ({ PLACEHOLDER ) : (
- Album by{' '} + Album ·{' '} ) : ( -
- {dayjs(album?.publishTime || 0).year()} · {album?.size} 首歌,{' '} +
+ {album?.mark === 1056768 && ( + + )} + {dayjs(album?.publishTime || 0).year()} · {album?.size} 首歌 ·{' '} {albumDuration}
)} diff --git a/packages/renderer/src/pages/Artist.tsx b/packages/renderer/src/pages/Artist.tsx index 86de6fc..22e0dee 100644 --- a/packages/renderer/src/pages/Artist.tsx +++ b/packages/renderer/src/pages/Artist.tsx @@ -11,22 +11,113 @@ import Skeleton from '@/components/Skeleton' import { Fragment } from 'react' import useTracks from '@/hooks/useTracks' +const Header = ({ artist }: { artist: Artist | undefined }) => { + const coverImage = resizeImage(artist?.img1v1Url || '', 'md') + + return ( + +
+ {coverImage && ( + + + + + )} +
+
+ +
+
+ + + + + +
+ +
+ +
+
{artist?.name}
+
+
+
+ ) +} + +const LatestRelease = ({ + album, + isLoading, +}: { + album: Album | undefined + isLoading: boolean +}) => { + return ( +
+
+ 最新发行 +
+
+ {isLoading ? ( + + ) : ( + + )} +
+ {album?.name} +
+
+ {album?.type} · {dayjs(album?.publishTime || 0).year()} +
+
+
+ ) +} + +const PopularTracks = ({ + tracks, + isLoadingArtist, +}: { + tracks: Track[] | undefined + isLoadingArtist: boolean +}) => { + const { data: tracksWithExtraInfo } = useTracks({ + ids: tracks?.slice(0, 10)?.map(t => t.id) ?? [], + }) + + return ( +
+
+ 热门歌曲 +
+
+ +
+
+ ) +} + const Artist = () => { const params = useParams() - const { data: artist, isLoading } = useArtist({ + const { data: artist, isLoading: isLoadingArtist } = useArtist({ id: Number(params.id) || 0, }) - const { data: albumsRaw, isLoading: isLoadingAlbum } = useArtistAlbums({ + const { data: albumsRaw, isLoading: isLoadingAlbums } = useArtistAlbums({ id: Number(params.id) || 0, limit: 1000, }) - const { data: tracks, isLoading: isLoadingTracks } = useTracks({ - ids: artist?.hotSongs?.slice(0, 10)?.map(t => t.id) ?? [], - }) - const albums = useMemo(() => { if (!albumsRaw?.hotAlbums) return [] const albums: Album[] = [] @@ -66,84 +157,20 @@ const Artist = () => { ) }, [albums, albumsRaw?.hotAlbums]) - const latestAlbum = useMemo(() => { - if (!albumsRaw || !albumsRaw.hotAlbums) return - return albumsRaw.hotAlbums[0] - }, [albumsRaw]) - - const coverImage = resizeImage(artist?.artist?.img1v1Url || '', 'md') - return (
-
- {coverImage && ( - - - - - )} -
-
- - {/* Header */} -
-
- - - - - -
- -
- -
-
- {artist?.artist.name} -
-
-
+
- {/* Latest release */} -
-
- 最新发行 -
-
- {isLoadingAlbum ? ( - - ) : ( - - )} -
- {latestAlbum?.name} -
-
- {latestAlbum?.type} ·{' '} - {dayjs(latestAlbum?.publishTime || 0).year()} -
-
-
+ - {/* Popular tracks */} -
-
- 热门歌曲 -
-
- -
-
+
{/* Albums */} diff --git a/packages/renderer/src/pages/Playlist.tsx b/packages/renderer/src/pages/Playlist.tsx index 2dc7cbb..bd4dc09 100644 --- a/packages/renderer/src/pages/Playlist.tsx +++ b/packages/renderer/src/pages/Playlist.tsx @@ -30,7 +30,7 @@ const Header = memo(
-
+
@@ -73,7 +73,7 @@ const Header = memo( {/* */} {!isLoading && (
- Playlist by {playlist?.creator?.nickname} + 歌单 · {playlist?.creator?.nickname}
)} {isLoading && ( diff --git a/packages/renderer/src/pages/Search/Search.tsx b/packages/renderer/src/pages/Search/Search.tsx new file mode 100644 index 0000000..f8a4b76 --- /dev/null +++ b/packages/renderer/src/pages/Search/Search.tsx @@ -0,0 +1,5 @@ +const Search = () => { + return
+} + +export default Search diff --git a/packages/renderer/src/pages/Search/index.ts b/packages/renderer/src/pages/Search/index.ts new file mode 100644 index 0000000..e96a4b2 --- /dev/null +++ b/packages/renderer/src/pages/Search/index.ts @@ -0,0 +1,3 @@ +import Search from './Search' + +export default Search diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0ec83e..19c1e90 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,6 +1,9 @@ lockfileVersion: 5.3 specifiers: + '@sentry/node': ^6.19.2 + '@sentry/react': ^6.19.2 + '@sentry/tracing': ^6.19.2 '@types/cookie-parser': ^1.4.2 '@types/express': ^4.17.13 '@types/express-fileupload': ^1.2.2 @@ -19,7 +22,6 @@ specifiers: ansi-styles: ^6.1.0 autoprefixer: ^10.4.4 axios: ^0.26.1 - body-parser: ^1.19.2 change-case: ^4.1.2 classnames: ^2.3.1 color.js: ^1.2.0 @@ -69,6 +71,9 @@ specifiers: vite-plugin-svg-icons: ^2.0.1 dependencies: + '@sentry/node': 6.19.2 + '@sentry/react': 6.19.2_react@17.0.2 + '@sentry/tracing': 6.19.2 NeteaseCloudMusicApi: 4.5.8 change-case: 4.1.2 cookie-parser: 1.4.6 @@ -95,7 +100,6 @@ devDependencies: ansi-styles: 6.1.0 autoprefixer: 10.4.4_postcss@8.4.12 axios: 0.26.1 - body-parser: 1.19.2 classnames: 2.3.1 color.js: 1.2.0 colord: 2.9.2 @@ -562,6 +566,100 @@ packages: picomatch: 2.3.1 dev: true + /@sentry/browser/6.19.2: + resolution: {integrity: sha512-5VC44p5Vu2eJhVT39nLAJFgha5MjHDYCyZRR1ieeZt3a++otojPGBBAKNAtrEMGV+A2Z9AoneD6ZnDVlyb3GKg==} + engines: {node: '>=6'} + dependencies: + '@sentry/core': 6.19.2 + '@sentry/types': 6.19.2 + '@sentry/utils': 6.19.2 + tslib: 1.14.1 + dev: false + + /@sentry/core/6.19.2: + resolution: {integrity: sha512-yu1R3ewBT4udmB4v7sc4biQZ0Z0rfB9+TzB5ZKoCftbe6kqXjFMMaFRYNUF9HicVldKAsBktgkWw3+yfqGkw/A==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 6.19.2 + '@sentry/minimal': 6.19.2 + '@sentry/types': 6.19.2 + '@sentry/utils': 6.19.2 + tslib: 1.14.1 + dev: false + + /@sentry/hub/6.19.2: + resolution: {integrity: sha512-W7KCgNBgdBIMagOxy5J5KQPe+maYxSqfE8a5ncQ3R8BcZDQEKnkW/1FplNbfRLZqA/tL/ndKb7pTPqVtzsbARw==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 6.19.2 + '@sentry/utils': 6.19.2 + tslib: 1.14.1 + dev: false + + /@sentry/minimal/6.19.2: + resolution: {integrity: sha512-ClwxKm77iDHET7kpzv1JvzDx1er5DoNu+EUjst0kQzARIrXvu9xuZuE2/CnBWycQWqw8o3HoGoKz65uIhsUCzQ==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 6.19.2 + '@sentry/types': 6.19.2 + tslib: 1.14.1 + dev: false + + /@sentry/node/6.19.2: + resolution: {integrity: sha512-Z1qREpTpYHxaeWjc1zMUk8ZTAp1WbxMiI2TVNc+a14DVT19Z2xNXb06MiRfeLgNc9lVGdmzR62dPmMBjVgPJYg==} + engines: {node: '>=6'} + dependencies: + '@sentry/core': 6.19.2 + '@sentry/hub': 6.19.2 + '@sentry/types': 6.19.2 + '@sentry/utils': 6.19.2 + cookie: 0.4.2 + https-proxy-agent: 5.0.0 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@sentry/react/6.19.2_react@17.0.2: + resolution: {integrity: sha512-6ffifcUWJegvC5iYJlXL3zBirR05F/i5nA7QaYSMERJqZpXuYhwNPySbuiNTajm64+HA1RbdQkiwrHE/Ur3f1w==} + engines: {node: '>=6'} + peerDependencies: + react: 15.x || 16.x || 17.x + dependencies: + '@sentry/browser': 6.19.2 + '@sentry/minimal': 6.19.2 + '@sentry/types': 6.19.2 + '@sentry/utils': 6.19.2 + hoist-non-react-statics: 3.3.2 + react: 17.0.2 + tslib: 1.14.1 + dev: false + + /@sentry/tracing/6.19.2: + resolution: {integrity: sha512-rGoPpP1JIAxdq5bzrww0XuNVr6yn7RN6/wUcaxf6CAvklKvDx+q28WTGlZLGTZ/3un8Rv6i1FZFZOXizgnVnrg==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 6.19.2 + '@sentry/minimal': 6.19.2 + '@sentry/types': 6.19.2 + '@sentry/utils': 6.19.2 + tslib: 1.14.1 + dev: false + + /@sentry/types/6.19.2: + resolution: {integrity: sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==} + engines: {node: '>=6'} + dev: false + + /@sentry/utils/6.19.2: + resolution: {integrity: sha512-2DQQ2OJaxjtyxGq5FmMlqb6hptsqMs2xoBiVRMkTS/rvyTrk1oQdKZ8ePwjtgX3nJ728ni3IXIyXV+vfGp4EBw==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 6.19.2 + tslib: 1.14.1 + dev: false + /@sindresorhus/is/0.14.0: resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} @@ -1433,6 +1531,7 @@ packages: qs: 6.9.7 raw-body: 2.4.3 type-is: 1.6.18 + dev: false /boolbase/1.0.0: resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} @@ -1616,6 +1715,7 @@ packages: /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + dev: false /cache-base/1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} @@ -2293,6 +2393,7 @@ packages: /depd/1.1.2: resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=} engines: {node: '>= 0.6'} + dev: false /destroy/1.0.4: resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=} @@ -2504,6 +2605,7 @@ packages: /ee-first/1.1.1: resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + dev: false /ejs/3.1.6: resolution: {integrity: sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==} @@ -3805,6 +3907,12 @@ packages: '@babel/runtime': 7.17.2 dev: true + /hoist-non-react-statics/3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + /hosted-git-info/4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} @@ -3848,6 +3956,7 @@ packages: setprototypeof: 1.2.0 statuses: 1.5.0 toidentifier: 1.0.1 + dev: false /http-proxy-agent/4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} @@ -3920,6 +4029,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: false /iconv-lite/0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} @@ -4587,6 +4697,10 @@ packages: dependencies: yallist: 4.0.0 + /lru_map/0.3.3: + resolution: {integrity: sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=} + dev: false + /magic-string/0.26.1: resolution: {integrity: sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg==} engines: {node: '>=12'} @@ -4642,6 +4756,7 @@ packages: /media-typer/0.3.0: resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} engines: {node: '>= 0.6'} + dev: false /media-typer/1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} @@ -5068,6 +5183,7 @@ packages: engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 + dev: false /once/1.4.0: resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} @@ -5555,6 +5671,7 @@ packages: /qs/6.9.7: resolution: {integrity: sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==} engines: {node: '>=0.6'} + dev: false /query-string/4.3.4: resolution: {integrity: sha1-u7aTucqRXCMlFbIosaArYJBD2+s=} @@ -5590,6 +5707,7 @@ packages: http-errors: 1.8.1 iconv-lite: 0.4.24 unpipe: 1.0.0 + dev: false /rc/1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} @@ -6163,6 +6281,7 @@ packages: /setprototypeof/1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false /shebang-command/2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -6397,6 +6516,7 @@ packages: /statuses/1.5.0: resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=} engines: {node: '>= 0.6'} + dev: false /stream-counter/1.0.0: resolution: {integrity: sha1-kc8lac5NxQYf6816yyY5SloRR1E=} @@ -6730,6 +6850,7 @@ packages: /toidentifier/1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + dev: false /token-types/4.2.0: resolution: {integrity: sha512-P0rrp4wUpefLncNamWIef62J0v0kQR/GfDVji9WKY7GDCWy5YbVSrKUTam07iWPZQGy0zWNOfstYTykMmPNR7w==} @@ -6770,7 +6891,6 @@ packages: /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true /tslib/2.3.1: resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} @@ -6835,6 +6955,7 @@ packages: dependencies: media-typer: 0.3.0 mime-types: 2.1.34 + dev: false /typedarray-to-buffer/3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -6901,6 +7022,7 @@ packages: /unpipe/1.0.0: resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} engines: {node: '>= 0.8'} + dev: false /unplugin-auto-import/0.6.6_rollup@2.70.1+vite@2.8.6: resolution: {integrity: sha512-x3YxAI9ePoumXOakuS5YJlFkSyAkl5vJlaFZSJhSp75nH5gg8LpqQ/0Gz1/CG/JRRv+xaE1CZpEV161AqFGjEg==}