From 03db6af1f8ed998d2ea6941a9473966eac5cad7b Mon Sep 17 00:00:00 2001 From: Sander Vocke Date: Tue, 21 Jul 2020 16:25:47 +0200 Subject: [PATCH] Routing fix, artists list --- client/package.json | 3 + client/src/App.tsx | 124 +++++++++++++++--- client/src/components/ItemListArtistItem.tsx | 18 +++ client/src/components/ItemListItem.tsx | 6 +- .../components/ItemListLoadedArtistItem.tsx | 24 ++++ .../components/ItemListLoadingArtistItem.tsx | 22 ++++ client/src/types/DisplayItem.tsx | 18 ++- client/yarn.lock | 110 +++++++++++++++- 8 files changed, 302 insertions(+), 23 deletions(-) create mode 100644 client/src/components/ItemListArtistItem.tsx create mode 100644 client/src/components/ItemListLoadedArtistItem.tsx create mode 100644 client/src/components/ItemListLoadingArtistItem.tsx diff --git a/client/package.json b/client/package.json index d47afb3..5c46bb5 100644 --- a/client/package.json +++ b/client/package.json @@ -13,10 +13,13 @@ "@types/node": "^12.0.0", "@types/react": "^16.9.0", "@types/react-dom": "^16.9.0", + "@types/react-router": "^5.1.8", + "@types/react-router-dom": "^5.1.5", "lodash": "^4.17.19", "material-table": "^1.64.0", "react": "^16.13.1", "react-dom": "^16.13.1", + "react-router-dom": "^5.2.0", "react-scripts": "3.4.1", "typescript": "~3.7.2" }, diff --git a/client/src/App.tsx b/client/src/App.tsx index d8262f8..a961e86 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -6,26 +6,38 @@ import * as serverApi from './api'; import AppBar, { ActiveTab as AppBarActiveTab } from './components/AppBar'; import ItemList from './components/ItemList'; import ItemListItem from './components/ItemListItem'; -import { SongDisplayItem } from './types/DisplayItem'; +import { SongDisplayItem, ArtistDisplayItem } from './types/DisplayItem'; +import { + BrowserRouter as Router, + Switch, + Route, + useHistory, + Redirect +} from "react-router-dom"; interface SongItemProps { id: Number, } +interface ArtistItemProps { + id: Number, +} + + function SongItem(props: SongItemProps) { const [songDisplayItem, setSongDisplayItem] = React.useState(undefined); const updateSong = async () => { - const response:any = await fetch(serverApi.SongDetailsEndpoint.replace(':id', props.id.toString())); - const json:any = await response.json(); - const title:String|undefined = json.title; - const artistIds:Number[]|undefined = json.artistIds; - const artistNamesPromises:Promise[]|undefined = artistIds && artistIds.map((id:Number) => { + const response: any = await fetch(serverApi.SongDetailsEndpoint.replace(':id', props.id.toString())); + const json: any = await response.json(); + const title: String | undefined = json.title; + const artistIds: Number[] | undefined = json.artistIds; + const artistNamesPromises: Promise[] | undefined = artistIds && artistIds.map((id: Number) => { return fetch(serverApi.ArtistDetailsEndpoint.replace(':id', id.toString())) - .then((response:any) => response.json()) - .then((json:any) => json.name); + .then((response: any) => response.json()) + .then((json: any) => json.name); }); - const artistNames:String[]|undefined = artistNamesPromises && await Promise.all(artistNamesPromises); + const artistNames: String[] | undefined = artistNamesPromises && await Promise.all(artistNamesPromises); return { title: title ? title : "Unknown", @@ -34,7 +46,7 @@ function SongItem(props: SongItemProps) { }; useEffect(() => { - updateSong().then((song:SongDisplayItem) => { setSongDisplayItem(song); }); + updateSong().then((song: SongDisplayItem) => { setSongDisplayItem(song); }); }, []); return ; } -function App() { - const [appBarActiveTab, setAppBarActiveTab] = React.useState(AppBarActiveTab.Songs); +function ArtistItem(props: ArtistItemProps) { + const [artistDisplayItem, setArtistDisplayItem] = React.useState(undefined); + + const updateArtist = async () => { + const response: any = await fetch(serverApi.ArtistDetailsEndpoint.replace(':id', props.id.toString())); + const json: any = await response.json(); + return { + name: json.name ? json.name : "Unknown" + }; + }; + + useEffect(() => { + updateArtist().then((artist: ArtistDisplayItem) => { setArtistDisplayItem(artist); }); + }, []); + + return ; +} + +function ArtistList() { + const [artists, setArtists] = useState([]); + + React.useEffect(() => { + const request: serverApi.QueryArtistsRequest = { + query: {} + } + const requestOpts = { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(request) + }; + fetch(serverApi.QueryArtistsEndpoint, requestOpts) + .then((response: any) => response.json()) + .then((json: any) => { + 'ids' in json && setArtists(json.ids); + }); + }, []); + + return + + {artists.map((song: any) => { + return ; + })} + + ; +} + +function AppBody() { + const history = useHistory(); + + const onAppBarTabChange = (value: AppBarActiveTab) => { + switch (value) { + case AppBarActiveTab.Artists: { + history.push('/artists'); + break; + } + case AppBarActiveTab.Songs: { + history.push('/songs'); + break; + } + } + } return (
- - - {(appBarActiveTab === AppBarActiveTab.Songs) && } - + + + + + + + + + + + + + + +
); } +function App() { + return ( + + + + ); +} + export default App; \ No newline at end of file diff --git a/client/src/components/ItemListArtistItem.tsx b/client/src/components/ItemListArtistItem.tsx new file mode 100644 index 0000000..b4458bb --- /dev/null +++ b/client/src/components/ItemListArtistItem.tsx @@ -0,0 +1,18 @@ +import React, { useEffect } from 'react'; +import ItemListItem from './ItemListItem'; +import { ArtistDisplayItem, LoadingArtistDisplayItem } from '../types/DisplayItem'; + +export interface IProps { + getDetails: () => Promise +} + +export default function ItemListArtistItem(props: IProps) { + const [ artist, setArtist ] = React.useState({ loadingArtist: true }); + + useEffect(() => { + props.getDetails() + .then((details:ArtistDisplayItem) => { setArtist(details); }); + }); + + return +} diff --git a/client/src/components/ItemListItem.tsx b/client/src/components/ItemListItem.tsx index 9f67b2f..e4d1430 100644 --- a/client/src/components/ItemListItem.tsx +++ b/client/src/components/ItemListItem.tsx @@ -1,7 +1,9 @@ import React from 'react'; -import { DisplayItem, isSong, isLoadingSong } from '../types/DisplayItem'; +import { DisplayItem, isSong, isLoadingSong, isArtist, isLoadingArtist } from '../types/DisplayItem'; import ItemListLoadedSongItem from './ItemListLoadedSongItem'; import ItemListLoadingSongItem from './ItemListLoadingSongItem'; +import ItemListLoadedArtistItem from './ItemListLoadedArtistItem'; +import ItemListLoadingArtistItem from './ItemListLoadingArtistItem'; export interface IProps { item: DisplayItem @@ -11,5 +13,7 @@ export default function ItemListItem(props: IProps) { return <> {isSong(props.item) && } {isLoadingSong(props.item) && } + {isArtist(props.item) && } + {isLoadingArtist(props.item) && } } diff --git a/client/src/components/ItemListLoadedArtistItem.tsx b/client/src/components/ItemListLoadedArtistItem.tsx new file mode 100644 index 0000000..e8e4d19 --- /dev/null +++ b/client/src/components/ItemListLoadedArtistItem.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import GroupIcon from '@material-ui/icons/Group'; + +import { ArtistDisplayItem } from '../types/DisplayItem'; + +export interface IProps { + item: ArtistDisplayItem +} + +export default function ItemListLoadedArtistItem(props: IProps) { + return ( + + + + + + + ); +} diff --git a/client/src/components/ItemListLoadingArtistItem.tsx b/client/src/components/ItemListLoadingArtistItem.tsx new file mode 100644 index 0000000..614030d --- /dev/null +++ b/client/src/components/ItemListLoadingArtistItem.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import GroupIcon from '@material-ui/icons/Group'; +import CircularProgress from '@material-ui/core/CircularProgress'; + +import { LoadingArtistDisplayItem } from '../types/DisplayItem'; + +export interface IProps { + item: LoadingArtistDisplayItem +} + +export default function ItemListLoadingArtistItem(props: IProps) { + return ( + + + + + + + ); +} diff --git a/client/src/types/DisplayItem.tsx b/client/src/types/DisplayItem.tsx index 49af9dd..b173c27 100644 --- a/client/src/types/DisplayItem.tsx +++ b/client/src/types/DisplayItem.tsx @@ -7,7 +7,15 @@ export interface LoadingSongDisplayItem { loadingSong: boolean, } -export type DisplayItem = SongDisplayItem | LoadingSongDisplayItem; +export interface ArtistDisplayItem { + name:String, +} + +export interface LoadingArtistDisplayItem { + loadingArtist: boolean, +} + +export type DisplayItem = SongDisplayItem | LoadingSongDisplayItem | ArtistDisplayItem | LoadingArtistDisplayItem; export function isSong(item: DisplayItem): item is SongDisplayItem { return "title" in item; @@ -15,4 +23,12 @@ export function isSong(item: DisplayItem): item is SongDisplayItem { export function isLoadingSong(item: DisplayItem): item is LoadingSongDisplayItem { return "loadingSong" in item; +} + +export function isArtist(item: DisplayItem): item is ArtistDisplayItem { + return "name" in item; +} + +export function isLoadingArtist(item: DisplayItem): item is LoadingArtistDisplayItem { + return "loadingArtist" in item; } \ No newline at end of file diff --git a/client/yarn.lock b/client/yarn.lock index 1071228..df9b111 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -1005,6 +1005,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.1.2": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c" + integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99" @@ -1633,6 +1640,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/history@*": + version "4.7.6" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.6.tgz#ed8fc802c45b8e8f54419c2d054e55c9ea344356" + integrity sha512-GRTZLeLJ8ia00ZH8mxMO8t0aC9M1N9bN461Z2eaRurJo6Fpa+utgCwLzI4jQHcrdzuzp5WPN9jRwpsCQ1VhJ5w== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -1702,6 +1714,23 @@ dependencies: "@types/react" "*" +"@types/react-router-dom@^5.1.5": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.5.tgz#7c334a2ea785dbad2b2dcdd83d2cf3d9973da090" + integrity sha512-ArBM4B1g3BWLGbaGvwBGO75GNFbLDUthrDojV2vHLih/Tq8M+tgvY1DSwkuNrPSwdp/GUL93WSEpTZs8nVyJLw== + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*", "@types/react-router@^5.1.8": + version "5.1.8" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.8.tgz#4614e5ba7559657438e17766bb95ef6ed6acc3fa" + integrity sha512-HzOyJb+wFmyEhyfp4D4NYrumi+LQgQL/68HvJO+q6XtuHSDvw6Aqov7sCAhjbNq3bUPgPqbdvjXC5HeB2oEAPg== + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react-transition-group@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.0.tgz#882839db465df1320e4753e6e9f70ca7e9b4d46d" @@ -5239,6 +5268,18 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -5248,7 +5289,7 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -5951,6 +5992,11 @@ is-wsl@^2.1.1: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -6918,7 +6964,7 @@ loglevel@^1.6.6: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -7145,6 +7191,14 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== +mini-create-react-context@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040" + integrity sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA== + dependencies: + "@babel/runtime" "^7.5.5" + tiny-warning "^1.0.3" + mini-css-extract-plugin@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" @@ -7944,6 +7998,13 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" @@ -9067,7 +9128,7 @@ react-error-overlay@^6.0.7: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== -react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.9.0: +react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.9.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -9083,6 +9144,35 @@ react-redux@^7.1.1: prop-types "^15.7.2" react-is "^16.9.0" +react-router-dom@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.2.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + react-scripts@3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.1.tgz#f551298b5c71985cc491b9acf3c8e8c0ae3ada0a" @@ -9459,6 +9549,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + resolve-url-loader@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" @@ -10505,12 +10600,12 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tiny-invariant@^1.0.6: +tiny-invariant@^1.0.2, tiny-invariant@^1.0.6: version "1.1.0" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== -tiny-warning@^1.0.2: +tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== @@ -10870,6 +10965,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"