Updated settings components.

This commit is contained in:
Mike Cao 2023-01-20 17:12:53 -08:00
parent 1d9c3133f0
commit 91af593ff5
31 changed files with 805 additions and 494 deletions

View File

@ -1 +1 @@
<svg fill="none" height="512" viewBox="0 0 24 24" width="512" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill="rgb(0,0,0)" fill-rule="evenodd"><path d="m12 4c-4.41828 0-8 3.58172-8 8 0 4.4183 3.58172 8 8 8 4.4183 0 8-3.5817 8-8 0-4.41828-3.5817-8-8-8zm-10 8c0-5.52285 4.47715-10 10-10 5.5228 0 10 4.47715 10 10 0 5.5228-4.4772 10-10 10-5.52285 0-10-4.4772-10-10z"/><path d="m11.168 11.4453c.3063-.4595.9272-.5837 1.3867-.2774l3 2c.4595.3064.5837.9273.2774 1.3868-.3064.4595-.9273.5837-1.3868.2773l-3-2c-.4595-.3063-.5837-.9272-.2773-1.3867z"/><path d="m12 6c.5523 0 1 .44772 1 1v5c0 .5523-.4477 1-1 1s-1-.4477-1-1v-5c0-.55228.4477-1 1-1z"/></g></svg> <svg height="512" viewBox="0 0 24 24" width="512" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd"><path d="M12 4a8 8 0 1 0 0 16 8 8 0 0 0 0-16zM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12z"/><path d="M11.168 11.445a1 1 0 0 1 1.387-.277l3 2a1 1 0 0 1-1.11 1.664l-3-2a1 1 0 0 1-.277-1.387z"/><path d="M12 6a1 1 0 0 1 1 1v5a1 1 0 1 1-2 0V7a1 1 0 0 1 1-1z"/></g></svg>

Before

Width:  |  Height:  |  Size: 665 B

After

Width:  |  Height:  |  Size: 400 B

View File

@ -1 +1 @@
<svg height="512pt" viewBox="0 0 512 512" width="512pt" xmlns="http://www.w3.org/2000/svg"><path d="m197.332031 170.667969h-160c-20.585937 0-37.332031-16.746094-37.332031-37.335938v-96c0-20.585937 16.746094-37.332031 37.332031-37.332031h160c20.589844 0 37.335938 16.746094 37.335938 37.332031v96c0 20.589844-16.746094 37.335938-37.335938 37.335938zm-160-138.667969c-2.941406 0-5.332031 2.390625-5.332031 5.332031v96c0 2.945313 2.390625 5.335938 5.332031 5.335938h160c2.945313 0 5.335938-2.390625 5.335938-5.335938v-96c0-2.941406-2.390625-5.332031-5.335938-5.332031zm0 0"/><path d="m197.332031 512h-160c-20.585937 0-37.332031-16.746094-37.332031-37.332031v-224c0-20.589844 16.746094-37.335938 37.332031-37.335938h160c20.589844 0 37.335938 16.746094 37.335938 37.335938v224c0 20.585937-16.746094 37.332031-37.335938 37.332031zm-160-266.667969c-2.941406 0-5.332031 2.390625-5.332031 5.335938v224c0 2.941406 2.390625 5.332031 5.332031 5.332031h160c2.945313 0 5.335938-2.390625 5.335938-5.332031v-224c0-2.945313-2.390625-5.335938-5.335938-5.335938zm0 0"/><path d="m474.667969 512h-160c-20.589844 0-37.335938-16.746094-37.335938-37.332031v-96c0-20.589844 16.746094-37.335938 37.335938-37.335938h160c20.585937 0 37.332031 16.746094 37.332031 37.335938v96c0 20.585937-16.746094 37.332031-37.332031 37.332031zm-160-138.667969c-2.945313 0-5.335938 2.390625-5.335938 5.335938v96c0 2.941406 2.390625 5.332031 5.335938 5.332031h160c2.941406 0 5.332031-2.390625 5.332031-5.332031v-96c0-2.945313-2.390625-5.335938-5.332031-5.335938zm0 0"/><path d="m474.667969 298.667969h-160c-20.589844 0-37.335938-16.746094-37.335938-37.335938v-224c0-20.585937 16.746094-37.332031 37.335938-37.332031h160c20.585937 0 37.332031 16.746094 37.332031 37.332031v224c0 20.589844-16.746094 37.335938-37.332031 37.335938zm-160-266.667969c-2.945313 0-5.335938 2.390625-5.335938 5.332031v224c0 2.945313 2.390625 5.335938 5.335938 5.335938h160c2.941406 0 5.332031-2.390625 5.332031-5.335938v-224c0-2.941406-2.390625-5.332031-5.332031-5.332031zm0 0"/></svg> <svg height="512pt" viewBox="0 0 512 512" width="512pt" xmlns="http://www.w3.org/2000/svg"><path d="M197.332 170.668h-160C16.746 170.668 0 153.922 0 133.332v-96C0 16.746 16.746 0 37.332 0h160c20.59 0 37.336 16.746 37.336 37.332v96c0 20.59-16.746 37.336-37.336 37.336zM37.332 32A5.336 5.336 0 0 0 32 37.332v96a5.337 5.337 0 0 0 5.332 5.336h160a5.338 5.338 0 0 0 5.336-5.336v-96A5.337 5.337 0 0 0 197.332 32zM197.332 512h-160C16.746 512 0 495.254 0 474.668v-224c0-20.59 16.746-37.336 37.332-37.336h160c20.59 0 37.336 16.746 37.336 37.336v224c0 20.586-16.746 37.332-37.336 37.332zm-160-266.668A5.337 5.337 0 0 0 32 250.668v224A5.336 5.336 0 0 0 37.332 480h160a5.337 5.337 0 0 0 5.336-5.332v-224a5.338 5.338 0 0 0-5.336-5.336zM474.668 512h-160c-20.59 0-37.336-16.746-37.336-37.332v-96c0-20.59 16.746-37.336 37.336-37.336h160c20.586 0 37.332 16.746 37.332 37.336v96C512 495.254 495.254 512 474.668 512zm-160-138.668a5.338 5.338 0 0 0-5.336 5.336v96a5.337 5.337 0 0 0 5.336 5.332h160a5.336 5.336 0 0 0 5.332-5.332v-96a5.337 5.337 0 0 0-5.332-5.336zM474.668 298.668h-160c-20.59 0-37.336-16.746-37.336-37.336v-224C277.332 16.746 294.078 0 314.668 0h160C495.254 0 512 16.746 512 37.332v224c0 20.59-16.746 37.336-37.332 37.336zM314.668 32a5.337 5.337 0 0 0-5.336 5.332v224a5.338 5.338 0 0 0 5.336 5.336h160a5.337 5.337 0 0 0 5.332-5.336v-224A5.336 5.336 0 0 0 474.668 32zm0 0"/></svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

1
assets/edit.svg Normal file
View File

@ -0,0 +1 @@
<svg clip-rule="evenodd" fill-rule="evenodd" height="512" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 24 24" width="512" xmlns="http://www.w3.org/2000/svg"><g id="Icon"><path d="m13.647 3.25c.414 0 .75.336.75.75s-.336.75-.75.75h-8.647c-1.243 0-2.25 1.007-2.25 2.25v12c0 1.243 1.007 2.25 2.25 2.25h12c1.243 0 2.25-1.007 2.25-2.25v-8.647c0-.414.336-.75.75-.75s.75.336.75.75v8.647c0 2.071-1.679 3.75-3.75 3.75h-12c-2.071 0-3.75-1.679-3.75-3.75v-12c0-2.071 1.679-3.75 3.75-3.75z"/><path d="m22.092 5.09-8.841 8.841c-.082.082-.182.144-.293.181l-3.182 1.06c-.269.09-.566.02-.767-.181s-.271-.498-.181-.767l1.06-3.182c.037-.111.099-.211.181-.293l8.841-8.841c.878-.877 2.301-.877 3.179 0l.003.003c.877.878.877 2.301 0 3.179zm-1.061-1.06c.292-.292.292-.766 0-1.058l-.003-.003c-.292-.292-.766-.292-1.058 0l-8.715 8.715-.53 1.591 1.591-.53z"/><path d="m20.322 5.799c.293.293.293.768 0 1.061-.292.292-.768.292-1.06 0l-2.122-2.122c-.292-.292-.292-.768 0-1.06.293-.293.768-.293 1.061 0z"/></g></svg>

After

Width:  |  Height:  |  Size: 999 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1400 1400"><path d="M367.43 422.13a54.44 54.44 0 0 1-38.66-16L205 282.35A54.69 54.69 0 0 1 282.37 205l123.74 123.79a54.68 54.68 0 0 1-38.68 93.34ZM1156.3 1211a54.51 54.51 0 0 1-38.67-16l-123.74-123.79a54.68 54.68 0 1 1 77.34-77.33L1195 1117.65a54.7 54.7 0 0 1-38.7 93.35ZM243.7 1211a54.7 54.7 0 0 1-38.7-93.35l123.74-123.76a54.69 54.69 0 0 1 77.36 77.32L282.37 1195a54.51 54.51 0 0 1-38.67 16ZM1032.57 422.13a54.68 54.68 0 0 1-38.68-93.34L1117.61 205a54.69 54.69 0 0 1 77.39 77.35l-123.77 123.76a54.44 54.44 0 0 1-38.66 16.02ZM229.69 754.69h-175a54.69 54.69 0 0 1 0-109.38h175a54.69 54.69 0 0 1 0 109.38ZM1345.31 754.69h-175a54.69 54.69 0 0 1 0-109.38h175a54.69 54.69 0 0 1 0 109.38ZM700 1400a54.68 54.68 0 0 1-54.69-54.69v-175a54.69 54.69 0 0 1 109.38 0v175A54.68 54.68 0 0 1 700 1400ZM700 284.38a54.7 54.7 0 0 1-54.69-54.69v-175a54.69 54.69 0 0 1 109.38 0v175A54.7 54.7 0 0 1 700 284.38Z"/><circle cx="700" cy="700" r="306.25"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1400 1400"><path d="M367.43 422.13a54.44 54.44 0 0 1-38.66-16L205 282.35A54.69 54.69 0 0 1 282.37 205l123.74 123.79a54.68 54.68 0 0 1-38.68 93.34ZM1156.3 1211a54.51 54.51 0 0 1-38.67-16l-123.74-123.79a54.68 54.68 0 1 1 77.34-77.33L1195 1117.65a54.7 54.7 0 0 1-38.7 93.35Zm-912.6 0a54.7 54.7 0 0 1-38.7-93.35l123.74-123.76a54.69 54.69 0 0 1 77.36 77.32L282.37 1195a54.51 54.51 0 0 1-38.67 16Zm788.87-788.87a54.68 54.68 0 0 1-38.68-93.34L1117.61 205a54.69 54.69 0 0 1 77.39 77.35l-123.77 123.76a54.44 54.44 0 0 1-38.66 16.02ZM229.69 754.69h-175a54.69 54.69 0 0 1 0-109.38h175a54.69 54.69 0 0 1 0 109.38Zm1115.62 0h-175a54.69 54.69 0 0 1 0-109.38h175a54.69 54.69 0 0 1 0 109.38ZM700 1400a54.68 54.68 0 0 1-54.69-54.69v-175a54.69 54.69 0 0 1 109.38 0v175A54.68 54.68 0 0 1 700 1400Zm0-1115.62a54.7 54.7 0 0 1-54.69-54.69v-175a54.69 54.69 0 0 1 109.38 0v175A54.7 54.7 0 0 1 700 284.38Z"/><circle cx="700" cy="700" r="306.25"/></svg>

Before

Width:  |  Height:  |  Size: 989 B

After

Width:  |  Height:  |  Size: 980 B

View File

@ -1 +1 @@
<svg height="512pt" viewBox="-56 0 512 512" width="512pt" xmlns="http://www.w3.org/2000/svg"><path d="m267 236.375c36.253906-22.582031 60.433594-62.796875 60.433594-108.5625 0-70.476562-57.335938-127.8125-127.8125-127.8125-70.476563 0-127.8125 57.335938-127.8125 127.8125 0 45.765625 24.179687 85.976562 60.429687 108.558594-77.015625 27.699218-132.238281 101.46875-132.238281 187.902344v72.242187c0 8.550781 6.933594 15.484375 15.484375 15.484375h368.265625c8.550781 0 15.480469-6.933594 15.480469-15.484375v-72.242187c0-86.429688-55.21875-160.195313-132.230469-187.898438zm101.265625 244.65625h-337.296875v-56.757812c0-92.992188 75.652344-168.644532 168.648438-168.644532 92.992187 0 168.648437 75.652344 168.648437 168.644532zm-71.800781-353.21875c0 53.402344-43.441406 96.847656-96.84375 96.847656s-96.84375-43.445312-96.84375-96.847656c0-53.398438 43.441406-96.84375 96.84375-96.84375s96.84375 43.445312 96.84375 96.84375zm0 0"/></svg> <svg height="512pt" viewBox="-56 0 512 512" width="512pt" xmlns="http://www.w3.org/2000/svg"><path d="M267 236.375c36.254-22.582 60.434-62.797 60.434-108.563C327.434 57.337 270.098 0 199.62 0 129.145 0 71.81 57.336 71.81 127.813c0 45.765 24.18 85.976 60.43 108.558C55.222 264.071 0 337.84 0 424.273v72.243C0 505.066 6.934 512 15.484 512H383.75c8.55 0 15.48-6.934 15.48-15.484v-72.243c0-86.43-55.218-160.195-132.23-187.898zm101.266 244.656H30.969v-56.758c0-92.992 75.652-168.644 168.648-168.644 92.992 0 168.649 75.652 168.649 168.644zm-71.801-353.219c0 53.403-43.442 96.848-96.844 96.848s-96.844-43.445-96.844-96.847c0-53.399 43.442-96.844 96.844-96.844s96.844 43.445 96.844 96.844zm0 0"/></svg>

Before

Width:  |  Height:  |  Size: 940 B

After

Width:  |  Height:  |  Size: 695 B

View File

@ -1,25 +1,16 @@
import PropTypes from 'prop-types'; import { Icon, Text, Flexbox } from 'react-basics';
import { Icon, Flexbox } from 'react-basics';
import Logo from 'assets/logo.svg'; import Logo from 'assets/logo.svg';
import styles from './EmptyPlaceholder.module.css';
function EmptyPlaceholder({ msg, children }) { function EmptyPlaceholder({ msg, children }) {
return ( return (
<div className={styles.placeholder}> <Flexbox direction="column" alignItems="center" justifyContent="center" gap={60} height={600}>
<Icon className={styles.icon} size="xl"> <Icon size="xl">
<Logo /> <Logo />
</Icon> </Icon>
<h2 className={styles.msg}>{msg}</h2> <Text size="lg">{msg}</Text>
<Flexbox justifyContent="center" alignItems="center"> <div>{children}</div>
{children} </Flexbox>
</Flexbox>
</div>
); );
} }
EmptyPlaceholder.propTypes = {
msg: PropTypes.node,
children: PropTypes.node,
};
export default EmptyPlaceholder; export default EmptyPlaceholder;

View File

@ -1,15 +0,0 @@
.placeholder {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
min-height: 600px;
}
.icon {
margin-bottom: 30px;
}
.msg {
margin-bottom: 15px;
}

View File

@ -1,8 +1,10 @@
import Calendar from 'assets/calendar.svg'; import Calendar from 'assets/calendar.svg';
import Clock from 'assets/clock.svg'; import Clock from 'assets/clock.svg';
import Dashboard from 'assets/dashboard.svg'; import Dashboard from 'assets/dashboard.svg';
import Edit from 'assets/edit.svg';
import Gear from 'assets/gear.svg'; import Gear from 'assets/gear.svg';
import Globe from 'assets/globe.svg'; import Globe from 'assets/globe.svg';
import Lock from 'assets/lock.svg';
import Logo from 'assets/logo.svg'; import Logo from 'assets/logo.svg';
import Moon from 'assets/moon.svg'; import Moon from 'assets/moon.svg';
import Profile from 'assets/profile.svg'; import Profile from 'assets/profile.svg';
@ -10,4 +12,18 @@ import Sun from 'assets/sun.svg';
import User from 'assets/user.svg'; import User from 'assets/user.svg';
import Users from 'assets/users.svg'; import Users from 'assets/users.svg';
export { Calendar, Clock, Dashboard, Gear, Globe, Logo, Moon, Profile, Sun, User, Users }; export {
Calendar,
Clock,
Dashboard,
Edit,
Gear,
Globe,
Lock,
Logo,
Moon,
Profile,
Sun,
User,
Users,
};

View File

@ -4,19 +4,22 @@ import classNames from 'classnames';
import { Dashboard, Logo, Profile, User, Users, Clock, Globe } from 'components/icons'; import { Dashboard, Logo, Profile, User, Users, Clock, Globe } from 'components/icons';
import NavGroup from './NavGroup'; import NavGroup from './NavGroup';
import styles from './NavBar.module.css'; import styles from './NavBar.module.css';
import ThemeButton from '../buttons/ThemeButton';
import LanguageButton from '../buttons/LanguageButton';
const { ChevronDown, Search } = Icons; const { ChevronDown, Search } = Icons;
const analytics = [ const analytics = [
{ key: 'dashboard', label: 'Dashboard', url: '/dashboard', icon: <Dashboard /> }, { label: 'Dashboard', url: '/dashboard', icon: <Dashboard /> },
{ key: 'realtime', label: 'Realtime', url: '/realtime', icon: <Clock /> }, { label: 'Realtime', url: '/realtime', icon: <Clock /> },
{ key: 'queries', label: 'Queries', url: '/queries', icon: <Search /> }, { label: 'Queries', url: '/queries', icon: <Search /> },
]; ];
const settings = [ const settings = [
{ key: 'websites', label: 'Websites', url: '/settings/websites', icon: <Globe /> }, { label: 'Websites', url: '/settings/websites', icon: <Globe /> },
{ key: 'users', label: 'Users', url: '/settings/users', icon: <User /> }, { label: 'Users', url: '/settings/users', icon: <User /> },
{ key: 'teams', label: 'Teams', url: '/settings/teams', icon: <Users /> }, { label: 'Teams', url: '/settings/teams', icon: <Users /> },
{ label: 'Profile', url: '/settings/profile', icon: <Profile /> },
]; ];
export default function NavBar() { export default function NavBar() {
@ -38,10 +41,10 @@ export default function NavBar() {
<NavGroup title="Analytics" items={analytics} minimized={minimized} /> <NavGroup title="Analytics" items={analytics} minimized={minimized} />
<NavGroup title="Settings" items={settings} minimized={minimized} /> <NavGroup title="Settings" items={settings} minimized={minimized} />
<div className={styles.footer}> <div className={styles.footer}>
<Icon> <div className={styles.buttons}>
<Profile /> <ThemeButton />
</Icon> <LanguageButton />
<Text>Profile</Text> </div>
</div> </div>
</div> </div>
); );

View File

@ -45,3 +45,9 @@
justify-content: flex-end; justify-content: flex-end;
padding: 20px; padding: 20px;
} }
.buttons {
display: flex;
align-items: center;
justify-content: center;
}

View File

@ -26,18 +26,23 @@ export default function NavGroup({
[styles.minimized]: minimized, [styles.minimized]: minimized,
})} })}
> >
<div className={styles.header} onClick={allowExpand ? handleExpand : undefined}> {title && (
<Text>{title}</Text> <div className={styles.header} onClick={allowExpand ? handleExpand : undefined}>
<Icon size="sm" rotate={expanded ? 0 : -90}> <Text>{title}</Text>
<ChevronDown /> <Icon size="sm" rotate={expanded ? 0 : -90}>
</Icon> <ChevronDown />
</div> </Icon>
</div>
)}
<div className={styles.body}> <div className={styles.body}>
{items.map(({ key, label, url, icon }) => { {items.map(({ label, url, icon, divider }) => {
return ( return (
<Link key={key} href={url}> <Link key={label} href={url}>
<a <a
className={classNames(styles.item, { [styles.selected]: pathname.startsWith(url) })} className={classNames(styles.item, {
[styles.divider]: divider,
[styles.selected]: pathname.startsWith(url),
})}
> >
<Icon>{icon}</Icon> <Icon>{icon}</Icon>
<Text className={styles.text}>{label}</Text> <Text className={styles.text}>{label}</Text>

View File

@ -25,6 +25,7 @@
} }
.items { .items {
position: relative;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 20px; gap: 20px;
@ -33,6 +34,7 @@
} }
.item { .item {
position: relative;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
@ -43,6 +45,10 @@
width: 200px; width: 200px;
} }
a.item {
color: var(--base700);
}
.item.selected { .item.selected {
color: var(--base900); color: var(--base900);
border-right-color: var(--primary400); border-right-color: var(--primary400);
@ -58,10 +64,6 @@
pointer-events: none; pointer-events: none;
} }
a.item {
color: var(--base600);
}
.minimized .text, .minimized .text,
.minimized .header { .minimized .header {
display: none; display: none;
@ -74,3 +76,18 @@ a.item {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.divider:before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
margin: auto;
border-top: 1px solid var(--base300);
width: 160px;
}
.minimized .divider:before {
width: 60px;
}

View File

@ -39,8 +39,7 @@ export default function Dashboard({ userId }) {
return ( return (
<Page> <Page>
<PageHeader> <PageHeader title={formatMessage(messages.dashboard)}>
<div>{formatMessage(messages.dashboard)}</div>
{!editing && <DashboardSettingsButton />} {!editing && <DashboardSettingsButton />}
</PageHeader> </PageHeader>
{editing && <DashboardEdit websites={data} />} {editing && <DashboardEdit websites={data} />}

View File

@ -0,0 +1,46 @@
import { useState } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { Button, Icon, Modal, useToast } from 'react-basics';
import PasswordEditForm from 'components/pages/settings/profile/PasswordEditForm';
import { Lock } from 'components/icons';
const messages = defineMessages({
changePassword: { id: 'label.change-password', defaultMessage: 'Change password' },
saved: { id: 'message.saved-successfully', defaultMessage: 'Saved successfully.' },
});
export default function ChangePasswordButton() {
const { formatMessage } = useIntl();
const [edit, setEdit] = useState(false);
const { toast, showToast } = useToast();
const handleSave = () => {
showToast({ message: formatMessage(messages.saved), variant: 'success' });
setEdit(false);
};
const handleAdd = () => {
setEdit(true);
};
const handleClose = () => {
setEdit(false);
};
return (
<>
{toast}
<Button onClick={handleAdd}>
<Icon>
<Lock />
</Icon>
Change Password
</Button>
{edit && (
<Modal title={formatMessage(messages.changePassword)} onClose={handleClose}>
{() => <PasswordEditForm onSave={handleSave} onClose={handleClose} />}
</Modal>
)}
</>
);
}

View File

@ -0,0 +1,76 @@
import { useRef } from 'react';
import { Form, FormRow, FormInput, FormButtons, PasswordField, Button } from 'react-basics';
import useApi from 'hooks/useApi';
import useUser from 'hooks/useUser';
export default function PasswordEditForm({ userId, onSave, onClose }) {
const user = useUser();
const isCurrentUser = !userId || user?.id === userId;
const url = isCurrentUser ? `/users/${user?.id}/password` : `/users/${user?.id}`;
const { post, useMutation } = useApi();
const { mutate, error, isLoading } = useMutation(data => post(url, data));
const ref = useRef(null);
const handleSubmit = async data => {
const payload = isCurrentUser
? data
: {
password: data.newPassword,
};
mutate(payload, {
onSuccess: async () => {
onSave();
ref.current.reset();
},
});
};
const samePassword = value => {
if (value !== ref?.current?.getValues('newPassword')) {
return "Passwords don't match";
}
return true;
};
return (
<Form ref={ref} onSubmit={handleSubmit} error={error}>
{isCurrentUser && (
<FormRow label="Current password">
<FormInput name="currentPassword" rules={{ required: 'Required' }}>
<PasswordField autoComplete="off" />
</FormInput>
</FormRow>
)}
<FormRow label="New password">
<FormInput
name="newPassword"
rules={{
required: 'Required',
minLength: { value: 8, message: 'Minimum length 8 characters' },
}}
>
<PasswordField autoComplete="off" />
</FormInput>
</FormRow>
<FormRow label="Confirm password">
<FormInput
name="confirmPassword"
rules={{
required: 'Required',
minLength: { value: 8, message: 'Minimum length 8 characters' },
validate: samePassword,
}}
>
<PasswordField autoComplete="off" />
</FormInput>
</FormRow>
<FormButtons flex>
<Button type="submit" variant="primary" disabled={isLoading}>
Save
</Button>
<Button onClick={onClose}>Close</Button>
</FormButtons>
</Form>
);
}

View File

@ -1,48 +1,26 @@
import { Breadcrumbs, Item } from 'react-basics';
import { defineMessages, useIntl } from 'react-intl';
import Page from 'components/layout/Page'; import Page from 'components/layout/Page';
import PageHeader from 'components/layout/PageHeader'; import PageHeader from 'components/layout/PageHeader';
import ProfileDetails from 'components/pages/settings/profile/ProfileDetails'; import ProfileDetails from './ProfileDetails';
import { useState } from 'react'; import ChangePasswordButton from './ChangePasswordButton';
import { Breadcrumbs, Icon, Item, useToast, Modal, Button } from 'react-basics';
import UserPasswordForm from 'components/pages/settings/users/UserPasswordForm'; const messages = defineMessages({
import Lock from 'assets/lock.svg'; profile: { id: 'label.profile', defaultMessage: 'Profile' },
});
export default function ProfileSettings() { export default function ProfileSettings() {
const [edit, setEdit] = useState(false); const { formatMessage } = useIntl();
const { toast, showToast } = useToast();
const handleSave = () => {
showToast({ message: 'Saved successfully.', variant: 'success' });
setEdit(false);
};
const handleAdd = () => {
setEdit(true);
};
const handleClose = () => {
setEdit(false);
};
return ( return (
<Page> <Page>
{toast}
<PageHeader> <PageHeader>
<Breadcrumbs> <Breadcrumbs>
<Item>Profile</Item> <Item>{formatMessage(messages.profile)}</Item>
</Breadcrumbs> </Breadcrumbs>
<Button onClick={handleAdd}> <ChangePasswordButton />
<Icon>
<Lock />
</Icon>
Change Password
</Button>
</PageHeader> </PageHeader>
<ProfileDetails /> <ProfileDetails />
{edit && (
<Modal title="Change password" onClose={handleClose}>
{close => <UserPasswordForm onSave={handleSave} onClose={close} />}
</Modal>
)}
</Page> </Page>
); );
} }

View File

@ -0,0 +1,65 @@
import {
Dropdown,
Item,
Form,
FormRow,
FormButtons,
FormInput,
TextField,
PasswordField,
SubmitButton,
} from 'react-basics';
import { useIntl, defineMessages } from 'react-intl';
import useApi from 'hooks/useApi';
import { ROLES } from 'lib/constants';
const messages = defineMessages({
username: { id: 'label.username', defaultMessage: 'Username' },
password: { id: 'label.password', defaultMessage: 'Password' },
role: { id: 'label.role', defaultMessage: 'Role' },
user: { id: 'label.user', defaultMessage: 'User' },
admin: { id: 'label.admin', defaultMessage: 'Admin' },
save: { id: 'label.save', defaultMessage: 'Save' },
cancel: { id: 'label.cancel', defaultMessage: 'Cancel' },
required: { id: 'label.required', defaultMessage: 'Required' },
});
export default function UserAddForm({ onSave }) {
const { post, useMutation } = useApi();
const { mutate, error } = useMutation(data => post(`/users`, data));
const { formatMessage } = useIntl();
const handleSubmit = async data => {
mutate(data, {
onSuccess: async () => {
onSave(data);
},
});
};
return (
<Form onSubmit={handleSubmit} error={error}>
<FormRow label={formatMessage(messages.username)}>
<FormInput name="username" rules={{ required: formatMessage(messages.required) }}>
<TextField />
</FormInput>
</FormRow>
<FormRow label={formatMessage(messages.password)}>
<FormInput name="password" rules={{ required: formatMessage(messages.required) }}>
<PasswordField />
</FormInput>
</FormRow>
<FormRow label={formatMessage(messages.role)}>
<FormInput name="role" rules={{ required: formatMessage(messages.required) }}>
<Dropdown style={{ width: 200 }}>
<Item key={ROLES.user}>{formatMessage(messages.user)}</Item>
<Item key={ROLES.admin}>{formatMessage(messages.admin)}</Item>
</Dropdown>
</FormInput>
</FormRow>
<FormButtons>
<SubmitButton variant="primary">{formatMessage(messages.save)}</SubmitButton>
</FormButtons>
</Form>
);
}

View File

@ -9,7 +9,6 @@ import {
SubmitButton, SubmitButton,
} from 'react-basics'; } from 'react-basics';
import { useRef } from 'react'; import { useRef } from 'react';
import { useMutation } from '@tanstack/react-query';
import useApi from 'hooks/useApi'; import useApi from 'hooks/useApi';
import { ROLES } from 'lib/constants'; import { ROLES } from 'lib/constants';
@ -26,7 +25,7 @@ const items = [
export default function UserEditForm({ data, onSave }) { export default function UserEditForm({ data, onSave }) {
const { id } = data; const { id } = data;
const { post } = useApi(); const { post, useMutation } = useApi();
const { mutate, error } = useMutation(({ username }) => post(`/user/${id}`, { username })); const { mutate, error } = useMutation(({ username }) => post(`/user/${id}`, { username }));
const ref = useRef(null); const ref = useRef(null);

View File

@ -5,7 +5,6 @@ import useUser from 'hooks/useUser';
export default function UserPasswordForm({ onSave, onClose, userId }) { export default function UserPasswordForm({ onSave, onClose, userId }) {
const user = useUser(); const user = useUser();
const isCurrentUser = !userId || user?.id === userId; const isCurrentUser = !userId || user?.id === userId;
const url = isCurrentUser ? `/users/${user?.id}/password` : `/users/${user?.id}`; const url = isCurrentUser ? `/users/${user?.id}/password` : `/users/${user?.id}`;
const { post, useMutation } = useApi(); const { post, useMutation } = useApi();

View File

@ -1,21 +1,30 @@
import { useQuery } from '@tanstack/react-query'; import { useEffect, useState } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { Breadcrumbs, Item, Tabs, useToast } from 'react-basics';
import Link from 'next/link';
import { useRouter } from 'next/router';
import UserDelete from 'components/pages/settings/users/UserDelete'; import UserDelete from 'components/pages/settings/users/UserDelete';
import UserEditForm from 'components/pages/settings/users/UserEditForm'; import UserEditForm from 'components/pages/settings/users//UserEditForm';
import UserPasswordForm from 'components/pages/settings/users/UserPasswordForm'; import UserPasswordForm from 'components/pages/settings/users/UserPasswordForm';
import Page from 'components/layout/Page'; import Page from 'components/layout/Page';
import PageHeader from 'components/layout/PageHeader'; import PageHeader from 'components/layout/PageHeader';
import useApi from 'hooks/useApi'; import useApi from 'hooks/useApi';
import Link from 'next/link';
import { useRouter } from 'next/router'; const messages = defineMessages({
import { useEffect, useState } from 'react'; users: { id: 'label.users', defaultMessage: 'Users' },
import { Breadcrumbs, Item, Icon, Tabs, useToast, Modal, Button } from 'react-basics'; details: { id: 'label.details', defaultMessage: 'Details' },
import Pen from 'assets/pen.svg'; changePassword: { id: 'label.change-password', defaultMessage: 'Change password' },
actions: { id: 'label.actions', defaultMessage: 'Actions' },
saved: { id: 'message.saved-successfully', defaultMessage: 'Saved successfully.' },
delete: { id: 'message.delete-successfully', defaultMessage: 'Delete successfully.' },
});
export default function UserSettings({ userId }) { export default function UserSettings({ userId }) {
const { formatMessage } = useIntl();
const [edit, setEdit] = useState(false); const [edit, setEdit] = useState(false);
const [values, setValues] = useState(null); const [values, setValues] = useState(null);
const [tab, setTab] = useState('general'); const [tab, setTab] = useState('details');
const { get } = useApi(); const { get, useQuery } = useApi();
const { toast, showToast } = useToast(); const { toast, showToast } = useToast();
const router = useRouter(); const router = useRouter();
const { data, isLoading } = useQuery( const { data, isLoading } = useQuery(
@ -39,14 +48,6 @@ export default function UserSettings({ userId }) {
} }
}; };
const handleAdd = () => {
setEdit(true);
};
const handleClose = () => {
setEdit(false);
};
const handleDelete = async () => { const handleDelete = async () => {
showToast({ message: 'Deleted successfully.', variant: 'danger' }); showToast({ message: 'Deleted successfully.', variant: 'danger' });
await router.push('/users'); await router.push('/users');
@ -64,30 +65,19 @@ export default function UserSettings({ userId }) {
<PageHeader> <PageHeader>
<Breadcrumbs> <Breadcrumbs>
<Item> <Item>
<Link href="/users">Users</Link> <Link href="/settings/users">{formatMessage(messages.users)}</Link>
</Item> </Item>
<Item>{values?.username}</Item> <Item>{values?.username}</Item>
</Breadcrumbs> </Breadcrumbs>
<Button onClick={handleAdd}>
<Icon>
<Pen />
</Icon>
Change Password
</Button>
</PageHeader> </PageHeader>
<Tabs selectedKey={tab} onSelect={setTab} style={{ marginBottom: 30, fontSize: 14 }}> <Tabs selectedKey={tab} onSelect={setTab} style={{ marginBottom: 30, fontSize: 14 }}>
<Item key="general">General</Item> <Item key="details">{formatMessage(messages.details)}</Item>
<Item key="delete">Danger Zone</Item> <Item key="password">{formatMessage(messages.changePassword)}</Item>
<Item key="delete">{formatMessage(messages.actions)}</Item>
</Tabs> </Tabs>
{tab === 'general' && <UserEditForm userId={userId} data={values} onSave={handleSave} />} {tab === 'details' && <UserEditForm userId={userId} data={values} onSave={handleSave} />}
{tab === 'password' && <UserPasswordForm userId={userId} onSave={handleSave} />}
{tab === 'delete' && <UserDelete userId={userId} onSave={handleDelete} />} {tab === 'delete' && <UserDelete userId={userId} onSave={handleDelete} />}
{edit && (
<Modal title="Add website" onClose={handleClose}>
{close => (
<UserPasswordForm userId={userId} data={values} onSave={handleSave} onClose={close} />
)}
</Modal>
)}
</Page> </Page>
); );
} }

View File

@ -1,44 +1,69 @@
import { useState } from 'react';
import { Button, Text, Icon, useToast, Icons, Modal } from 'react-basics';
import { useIntl, defineMessages } from 'react-intl';
import Page from 'components/layout/Page'; import Page from 'components/layout/Page';
import PageHeader from 'components/layout/PageHeader'; import PageHeader from 'components/layout/PageHeader';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import UsersTable from 'components/pages/settings/users/UsersTable'; import UsersTable from 'components/pages/settings/users/UsersTable';
import { useState } from 'react'; import UserEditForm from 'components/pages/settings/users/UserEditForm';
import { Button, Icon, useToast } from 'react-basics';
import { useMutation } from '@tanstack/react-query';
import useApi from 'hooks/useApi'; import useApi from 'hooks/useApi';
import useUser from 'hooks/useUser';
const { Plus } = Icons;
const messages = defineMessages({
saved: { id: 'messages.api-key-saved', defaultMessage: 'API key saved.' },
noUsers: {
id: 'messages.no-useres',
defaultMessage: "You don't have any users.",
},
users: { id: 'label.users', defaultMessage: 'Users' },
createUser: { id: 'label.create-user', defaultMessage: 'Create user' },
});
export default function UsersList() { export default function UsersList() {
const [loading, setLoading] = useState(false); const [edit, setEdit] = useState(false);
const [error, setError] = useState(); const { formatMessage } = useIntl();
const { toast, showToast } = useToast(); const { toast, showToast } = useToast();
const { post } = useApi(); const { user } = useUser();
const { mutate, isLoading } = useMutation(data => post('/api-key', data)); const { get, useQuery } = useApi();
const { data, isLoading, error, refetch } = useQuery(['user'], () => get(`/users`), {
enabled: !!user,
});
const hasData = data && data.length !== 0;
const handleSave = () => { const handleSave = async () => {
mutate( await refetch();
{}, setEdit(false);
{ showToast({ message: formatMessage(messages.saved), variant: 'success' });
onSuccess: async () => {
showToast({ message: 'API key saved.', variant: 'success' });
},
},
);
}; };
const handleAdd = () => setEdit(true);
const handleClose = () => setEdit(false);
const addButton = (
<Button variant="primary" onClick={handleAdd}>
<Icon>
<Plus />
</Icon>
<Text>{formatMessage(messages.createUser)}</Text>
</Button>
);
return ( return (
<Page loading={loading || isLoading} error={error}> <Page loading={isLoading} error={error}>
{toast} {toast}
<PageHeader title="Users"> <PageHeader title={formatMessage(messages.users)}>{addButton}</PageHeader>
<Button onClick={handleSave}> {hasData && <UsersTable data={data} />}
<Icon icon="plus" /> Create user {!hasData && (
</Button> <EmptyPlaceholder message={formatMessage(messages.noUsers)}>{addButton}</EmptyPlaceholder>
</PageHeader> )}
<UsersTable {edit && (
onLoading={({ isLoading, error }) => { <Modal title={formatMessage(messages.createUser)} onClose={handleClose}>
setLoading(isLoading); {close => <UserEditForm onSave={handleSave} onClose={close} />}
setError(error); </Modal>
}} )}
onAddKeyClick={handleSave}
/>
</Page> </Page>
); );
} }

View File

@ -1,11 +1,6 @@
import { useQuery } from '@tanstack/react-query';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import { formatDistance } from 'date-fns';
import useApi from 'hooks/useApi';
import Link from 'next/link';
import { useEffect, useState } from 'react';
import { import {
Button, Button,
Text,
Icon, Icon,
Table, Table,
TableBody, TableBody,
@ -14,84 +9,66 @@ import {
TableHeader, TableHeader,
TableRow, TableRow,
} from 'react-basics'; } from 'react-basics';
import { formatDistance } from 'date-fns';
import Link from 'next/link';
import { Edit } from 'components/icons';
import styles from './UsersTable.module.css'; import styles from './UsersTable.module.css';
const defaultColumns = [ const columns = [
{ name: 'username', label: 'Username', style: { flex: 2 } }, { name: 'username', label: 'Username', style: { flex: 2 } },
{ name: 'role', label: 'Role', style: { flex: 2 } }, { name: 'role', label: 'Role', style: { flex: 2 } },
{ name: 'created', label: 'Created' }, { name: 'created', label: 'Created' },
{ name: 'action', label: ' ' }, { name: 'action', label: ' ' },
]; ];
export default function UsersTable({ columns = defaultColumns, onLoading, onAddKeyClick }) { export default function UsersTable({ data = [] }) {
const [values, setValues] = useState(null);
const { get } = useApi();
const { data, isLoading, error } = useQuery(['user'], () => get(`/users`));
const hasData = data && data.length !== 0;
useEffect(() => {
if (data) {
setValues(data);
onLoading({ data, isLoading, error });
}
}, [onLoading, data, isLoading, error]);
return ( return (
<> <Table className={styles.table} columns={columns} rows={data}>
{hasData && ( <TableHeader>
<Table className={styles.table} columns={columns} rows={values}> {(column, index) => {
<TableHeader> return (
{(column, index) => { <TableColumn key={index} className={styles.header} style={{ ...column.style }}>
return ( {column.label}
<TableColumn key={index} className={styles.header} style={{ ...column.style }}> </TableColumn>
{column.label} );
</TableColumn> }}
); </TableHeader>
}} <TableBody>
</TableHeader> {(row, keys, rowIndex) => {
<TableBody> row.created = formatDistance(new Date(row.createdAt), new Date(), {
{(row, keys, rowIndex) => { addSuffix: true,
row.created = formatDistance(new Date(row.createdAt), new Date(), { });
addSuffix: true,
});
row.action = ( row.action = (
<div className={styles.actions}> <div className={styles.actions}>
<Link href={`/settings/users/${row.id}`}> <Link href={`/settings/users/${row.id}`}>
<Button> <Button>
<Icon icon="arrow-right" /> <Icon>
Settings <Edit />
</Button> </Icon>
</Link> <Text>Edit</Text>
</div> </Button>
); </Link>
</div>
);
return ( return (
<TableRow key={rowIndex} data={row} keys={keys}> <TableRow key={rowIndex} data={row} keys={keys}>
{(data, key, colIndex) => { {(data, key, colIndex) => {
return ( return (
<TableCell <TableCell
key={colIndex} key={colIndex}
className={styles.cell} className={styles.cell}
style={{ ...columns[colIndex]?.style }} style={{ ...columns[colIndex]?.style }}
> >
{data[key]} {data[key]}
</TableCell> </TableCell>
); );
}} }}
</TableRow> </TableRow>
); );
}} }}
</TableBody> </TableBody>
</Table> </Table>
)}
{!hasData && (
<EmptyPlaceholder className={styles.empty} msg="You don't have any Users.">
<Button variant="primary" onClick={onAddKeyClick}>
<Icon icon="plus" /> Create User
</Button>
</EmptyPlaceholder>
)}
</>
); );
} }

View File

@ -23,7 +23,7 @@ export default function ShareUrl({ websiteId, data, onSave }) {
); );
const ref = useRef(null); const ref = useRef(null);
const url = useMemo( const url = useMemo(
() => `${process.env.analyticsUrl}/share/${id}/${encodeURIComponent(name)}`, () => `${process.env.analyticsUrl || location.origin}/share/${id}/${encodeURIComponent(name)}`,
[id, name], [id, name],
); );

View File

@ -18,7 +18,7 @@ export default function WebsiteEditForm({ websiteId, data, onSave }) {
}; };
return ( return (
<Form ref={ref} onSubmit={handleSubmit} error={error} values={data}> <Form ref={ref} onSubmit={handleSubmit} error={error} values={data} style={{ width: 600 }}>
<FormRow label="Website ID"> <FormRow label="Website ID">
<TextField value={websiteId} readOnly allowCopy /> <TextField value={websiteId} readOnly allowCopy />
</FormRow> </FormRow>

View File

@ -1,16 +1,29 @@
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { Breadcrumbs, Item, Tabs, useToast, Button, Icon } from 'react-basics'; import { Breadcrumbs, Item, Tabs, useToast, Button, Text, Icon, Icons } from 'react-basics';
import useApi from 'hooks/useApi'; import { defineMessages, useIntl } from 'react-intl';
import Link from 'next/link'; import Link from 'next/link';
import Page from 'components/layout/Page'; import Page from 'components/layout/Page';
import PageHeader from 'components/layout/PageHeader';
import WebsiteEditForm from 'components/pages/settings/websites/WebsiteEditForm'; import WebsiteEditForm from 'components/pages/settings/websites/WebsiteEditForm';
import WebsiteReset from 'components/pages/settings/websites/WebsiteReset'; import WebsiteReset from 'components/pages/settings/websites/WebsiteReset';
import PageHeader from 'components/layout/PageHeader';
import TrackingCode from 'components/pages/settings/websites/TrackingCode'; import TrackingCode from 'components/pages/settings/websites/TrackingCode';
import ShareUrl from 'components/pages/settings/websites/ShareUrl'; import ShareUrl from 'components/pages/settings/websites/ShareUrl';
import ExternalLink from 'assets/external-link.svg'; import useApi from 'hooks/useApi';
export default function WebsiteDetails({ websiteId }) { const { External } = Icons;
const messages = defineMessages({
websites: { id: 'label.websites', defaultMessage: 'Websites' },
details: { id: 'label.details', defaultMessage: 'Details' },
trackingCode: { id: 'label.tracking-code', defaultMessage: 'Tracking code' },
shareUrl: { id: 'label.share-url', defaultMessage: 'Share URL' },
actions: { id: 'label.actions', defaultMessage: 'Actions' },
view: { id: 'label.view', defaultMessage: 'View' },
saved: { id: 'message.saved-successfully', defaultMessage: 'Save successfully.' },
});
export default function WebsiteSettings({ websiteId }) {
const { formatMessage } = useIntl();
const [values, setValues] = useState(null); const [values, setValues] = useState(null);
const [tab, setTab] = useState('details'); const [tab, setTab] = useState('details');
const { get, useQuery } = useApi(); const { get, useQuery } = useApi();
@ -26,7 +39,7 @@ export default function WebsiteDetails({ websiteId }) {
); );
const handleSave = data => { const handleSave = data => {
showToast({ message: 'Saved successfully.', variant: 'success' }); showToast({ message: formatMessage(messages.saved), variant: 'success' });
setValues(state => ({ ...state, ...data })); setValues(state => ({ ...state, ...data }));
}; };
@ -42,7 +55,7 @@ export default function WebsiteDetails({ websiteId }) {
<PageHeader> <PageHeader>
<Breadcrumbs> <Breadcrumbs>
<Item> <Item>
<Link href="/settings/websites">Websites</Link> <Link href="/settings/websites">{formatMessage(messages.websites)}</Link>
</Item> </Item>
<Item>{values?.name}</Item> <Item>{values?.name}</Item>
</Breadcrumbs> </Breadcrumbs>
@ -50,18 +63,18 @@ export default function WebsiteDetails({ websiteId }) {
<a> <a>
<Button variant="primary"> <Button variant="primary">
<Icon> <Icon>
<ExternalLink /> <External />
</Icon> </Icon>
View <Text>{formatMessage(messages.view)}</Text>
</Button> </Button>
</a> </a>
</Link> </Link>
</PageHeader> </PageHeader>
<Tabs selectedKey={tab} onSelect={setTab} style={{ marginBottom: 30 }}> <Tabs selectedKey={tab} onSelect={setTab} style={{ marginBottom: 30 }}>
<Item key="details">Details</Item> <Item key="details">{formatMessage(messages.details)}</Item>
<Item key="tracking">Tracking code</Item> <Item key="tracking">{formatMessage(messages.trackingCode)}</Item>
<Item key="share">Share URL</Item> <Item key="share">{formatMessage(messages.shareUrl)}</Item>
<Item key="actions">Actions</Item> <Item key="actions">{formatMessage(messages.actions)}</Item>
</Tabs> </Tabs>
{tab === 'details' && ( {tab === 'details' && (
<WebsiteEditForm websiteId={websiteId} data={values} onSave={handleSave} /> <WebsiteEditForm websiteId={websiteId} data={values} onSave={handleSave} />

View File

@ -1,72 +1,70 @@
import { useState } from 'react'; import { useState } from 'react';
import { Button, Icon, Text, Modal, useToast, Icons } from 'react-basics'; import { Button, Icon, Text, Modal, useToast, Icons } from 'react-basics';
import useApi from 'hooks/useApi'; import { useIntl, defineMessages } from 'react-intl';
import Page from 'components/layout/Page';
import PageHeader from 'components/layout/PageHeader';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder'; import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import WebsiteAddForm from 'components/pages/settings/websites/WebsiteAddForm'; import WebsiteAddForm from 'components/pages/settings/websites/WebsiteAddForm';
import PageHeader from 'components/layout/PageHeader';
import WebsitesTable from 'components/pages/settings/websites/WebsitesTable'; import WebsitesTable from 'components/pages/settings/websites/WebsitesTable';
import Page from 'components/layout/Page'; import useApi from 'hooks/useApi';
import useUser from 'hooks/useUser'; import useUser from 'hooks/useUser';
const messages = defineMessages({
saved: { id: 'messages.website-saved', defaultMessage: 'Website saved.' },
noWebsites: {
id: 'messages.no-websites',
defaultMessage: "You don't have any websites configured.",
},
websites: { id: 'label.websites', defaultMessage: 'Websites' },
addWebsite: { id: 'label.add-website', defaultMessage: 'Add website' },
});
const { Plus } = Icons; const { Plus } = Icons;
export default function WebsitesList() { export default function WebsitesList() {
const [edit, setEdit] = useState(false); const [edit, setEdit] = useState(false);
const { get, useQuery } = useApi();
const { user } = useUser(); const { user } = useUser();
const { get, useQuery } = useApi();
const { data, isLoading, error, refetch } = useQuery( const { data, isLoading, error, refetch } = useQuery(
['websites', user?.id], ['websites', user?.id],
() => get(`/users/${user?.id}/websites`), () => get(`/users/${user?.id}/websites`),
{ enabled: !!user }, { enabled: !!user },
); );
const hasData = data && data.length !== 0;
const { toast, showToast } = useToast(); const { toast, showToast } = useToast();
const { formatMessage } = useIntl();
const columns = [ const hasData = data && data.length !== 0;
{ name: 'name', label: 'Name', style: { flex: 2 } },
{ name: 'domain', label: 'Domain' },
{ name: 'action', label: ' ' },
];
const handleAdd = () => {
setEdit(true);
};
const handleSave = async () => { const handleSave = async () => {
await refetch(); await refetch();
setEdit(false); setEdit(false);
showToast({ message: 'Website saved.', variant: 'success' }); showToast({ message: formatMessage(messages.saved), variant: 'success' });
}; };
const handleClose = () => { const handleAdd = () => setEdit(true);
setEdit(false);
}; const handleClose = () => setEdit(false);
const addButton = (
<Button variant="primary" onClick={handleAdd}>
<Icon>
<Plus />
</Icon>
<Text>{formatMessage(messages.addWebsite)}</Text>
</Button>
);
return ( return (
<Page loading={isLoading} error={error}> <Page loading={isLoading} error={error}>
{toast} {toast}
<PageHeader title="Websites"> <PageHeader title={formatMessage(messages.websites)}>{addButton}</PageHeader>
<Button variant="primary" onClick={handleAdd}> {hasData && <WebsitesTable data={data} />}
<Icon>
<Plus />
</Icon>
<Text>Add website</Text>
</Button>
</PageHeader>
{hasData && <WebsitesTable columns={columns} rows={data} />}
{!hasData && ( {!hasData && (
<EmptyPlaceholder message="You don't have any websites configured."> <EmptyPlaceholder message={formatMessage(messages.noWebsites)}>
<Button variant="primary" onClick={handleAdd}> {addButton}
<Icon>
<Plus />
</Icon>
<Text>Add website</Text>
</Button>
</EmptyPlaceholder> </EmptyPlaceholder>
)} )}
{edit && ( {edit && (
<Modal title="Add website" onClose={handleClose}> <Modal title={formatMessage(messages.addWebsite)} onClose={handleClose}>
{close => <WebsiteAddForm onSave={handleSave} onClose={close} />} {close => <WebsiteAddForm onSave={handleSave} onClose={close} />}
</Modal> </Modal>
)} )}

View File

@ -14,9 +14,15 @@ import styles from './WebsitesTable.module.css';
const { ArrowRight, External } = Icons; const { ArrowRight, External } = Icons;
export default function WebsitesTable({ columns = [], rows = [] }) { const columns = [
{ name: 'name', label: 'Name', style: { flex: 2 } },
{ name: 'domain', label: 'Domain' },
{ name: 'action', label: ' ' },
];
export default function WebsitesTable({ data = [] }) {
return ( return (
<Table className={styles.table} columns={columns} rows={rows}> <Table className={styles.table} columns={columns} rows={data}>
<TableHeader> <TableHeader>
{(column, index) => { {(column, index) => {
return ( return (

View File

@ -59,9 +59,9 @@
], ],
"dependencies": { "dependencies": {
"@fontsource/inter": "4.5.7", "@fontsource/inter": "4.5.7",
"@prisma/client": "4.8.0", "@prisma/client": "4.9.0",
"@tanstack/react-query": "^4.16.1", "@tanstack/react-query": "^4.16.1",
"@umami/prisma-client": "^0.1.0", "@umami/prisma-client": "^0.2.0",
"@umami/redis-client": "^0.1.0", "@umami/redis-client": "^0.1.0",
"chalk": "^4.1.1", "chalk": "^4.1.1",
"chart.js": "^2.9.4", "chart.js": "^2.9.4",
@ -94,7 +94,7 @@
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"prop-types": "^15.7.2", "prop-types": "^15.7.2",
"react": "^18.2.0", "react": "^18.2.0",
"react-basics": "^0.50.0", "react-basics": "^0.53.0",
"react-beautiful-dnd": "^13.1.0", "react-beautiful-dnd": "^13.1.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-intl": "^5.24.7", "react-intl": "^5.24.7",
@ -134,14 +134,14 @@
"postcss-preset-env": "7.8.3", "postcss-preset-env": "7.8.3",
"postcss-rtlcss": "^4.0.1", "postcss-rtlcss": "^4.0.1",
"prettier": "^2.6.2", "prettier": "^2.6.2",
"prisma": "4.8.0", "prisma": "4.9.0",
"prompts": "2.4.2", "prompts": "2.4.2",
"rollup": "^2.70.1", "rollup": "^2.70.1",
"rollup-plugin-terser": "^7.0.2", "rollup-plugin-terser": "^7.0.2",
"stylelint": "^14.5.3", "stylelint": "^14.16.1",
"stylelint-config-css-modules": "^4.1.0", "stylelint-config-css-modules": "^4.1.0",
"stylelint-config-prettier": "^9.0.3", "stylelint-config-prettier": "^9.0.3",
"stylelint-config-recommended": "^7.0.0", "stylelint-config-recommended": "^9.0.0",
"tar": "^6.1.2" "tar": "^6.1.2"
} }
} }

View File

@ -1,5 +1,5 @@
import { useRouter } from 'next/router'; import { useRouter } from 'next/router';
import WebsiteDetails from 'components/pages/settings/websites/WebsiteDetails'; import WebsiteSettings from 'components/pages/settings/websites/WebsiteSettings';
import useUser from 'hooks/useUser'; import useUser from 'hooks/useUser';
import AppLayout from 'components/layout/AppLayout'; import AppLayout from 'components/layout/AppLayout';
@ -14,7 +14,7 @@ export default function WebsiteSettingsPage() {
return ( return (
<AppLayout> <AppLayout>
<WebsiteDetails websiteId={id} /> <WebsiteSettings websiteId={id} />
</AppLayout> </AppLayout>
); );
} }

514
yarn.lock
View File

@ -1603,37 +1603,37 @@
"@netlify/esbuild-windows-64" "0.14.39" "@netlify/esbuild-windows-64" "0.14.39"
"@netlify/esbuild-windows-arm64" "0.14.39" "@netlify/esbuild-windows-arm64" "0.14.39"
"@netlify/functions@^1.3.0": "@netlify/functions@^1.4.0":
version "1.3.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/@netlify/functions/-/functions-1.3.0.tgz#4305a3fb6b49caf56cd2be88d4b8534b1d5aff4f" resolved "https://registry.yarnpkg.com/@netlify/functions/-/functions-1.4.0.tgz#027a2e5d54df5519ccbd14cf450231e97bbbf93a"
integrity sha512-hN/Fgpz8XIOBfsBPLYUMxVKBlCopgeqGB0popayicnmkFLnvKByTTMYgF01wcF9DBtBQdV0H2h1kPFpMl34I8w== integrity sha512-gy7ULTIRroc2/jyFVGx1djCmmBMVisIwrvkqggq5B6iDcInRSy2Tpkm+V5C63hKJVkNRskKWtLQKm9ecCaQTjA==
dependencies: dependencies:
is-promise "^4.0.0" is-promise "^4.0.0"
"@netlify/ipx@^1.3.2": "@netlify/ipx@^1.3.3":
version "1.3.2" version "1.3.3"
resolved "https://registry.yarnpkg.com/@netlify/ipx/-/ipx-1.3.2.tgz#7235999c19d50349a4407d9548a7d8037e33db2d" resolved "https://registry.yarnpkg.com/@netlify/ipx/-/ipx-1.3.3.tgz#db28352ee1ed86d0b991cb8236f64a4dfbe70b8c"
integrity sha512-IozNE8IDJiMsWvNG0HqSfArJKl1HhgvvPPNfWGieg5AIQzLxu57L7ol10DYBARsrVZWGZstM3J7sTaP6fbhdQw== integrity sha512-2rDdCGPDPW7cyJr57rwfvpouOJx34CLDgfa2yfqTKvPzqCMOqkCi1PN/rHGuvJ/k5trZ8rxmWnnZyEbeQaZcqA==
dependencies: dependencies:
"@netlify/functions" "^1.3.0" "@netlify/functions" "^1.4.0"
etag "^1.8.1" etag "^1.8.1"
fs-extra "^10.0.0" fs-extra "^11.0.0"
ipx "^0.9.11" ipx "^0.9.11"
micromatch "^4.0.5" micromatch "^4.0.5"
mkdirp "^1.0.4" mkdirp "^1.0.4"
murmurhash "^2.0.0" murmurhash "^2.0.0"
node-fetch "^2.0.0" node-fetch "^2.0.0"
ufo "^1.0.0" ufo "^1.0.0"
unstorage "^0.6.0" unstorage "^1.0.0"
"@netlify/plugin-nextjs@^4.27.3": "@netlify/plugin-nextjs@^4.27.3":
version "4.29.4" version "4.30.0"
resolved "https://registry.yarnpkg.com/@netlify/plugin-nextjs/-/plugin-nextjs-4.29.4.tgz#5261aeed4d19fdc8e46e295a1097ae6b79acdf84" resolved "https://registry.yarnpkg.com/@netlify/plugin-nextjs/-/plugin-nextjs-4.30.0.tgz#1e4330ff1094057fc337d3b3504cf4a87b1cdbab"
integrity sha512-tx1TSvtLa/tJUf1Z0XcToMONCYPXwPTJC1rEYJP5bh1qsBIqQxNYxKVgJOXjsBOgtmRD9l146UjbtF1a5Tockw== integrity sha512-+MyfV6biKGVs/jQQUKGi2vN5aFFyRUTeEAItDiSvNhAUi0mOXEkEmu5JN7ZAQtL2oRIKKnxflsZDmtP3DdAahg==
dependencies: dependencies:
"@netlify/esbuild" "0.14.39" "@netlify/esbuild" "0.14.39"
"@netlify/functions" "^1.3.0" "@netlify/functions" "^1.4.0"
"@netlify/ipx" "^1.3.2" "@netlify/ipx" "^1.3.3"
"@vercel/node-bridge" "^2.1.0" "@vercel/node-bridge" "^2.1.0"
chalk "^4.1.2" chalk "^4.1.2"
destr "^1.1.1" destr "^1.1.1"
@ -1752,22 +1752,22 @@
"@nodelib/fs.scandir" "2.1.5" "@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0" fastq "^1.6.0"
"@prisma/client@4.8.0": "@prisma/client@4.9.0":
version "4.8.0" version "4.9.0"
resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.8.0.tgz#6ec7adaca6a2e233d7e41dbe7cc6d0fa6143a407" resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.9.0.tgz#4a4068f3540732ea5723c008d49ed684d20f9340"
integrity sha512-Y1riB0p2W52kh3zgssP/YAhln3RjBFcJy3uwEiyjmU+TQYh6QTZDRFBo3JtBWuq2FyMOl1Rye8jxzUP+n0l5Cg== integrity sha512-bz6QARw54sWcbyR1lLnF2QHvRW5R/Jxnbbmwh3u+969vUKXtBkXgSgjDA85nji31ZBlf7+FrHDy5x+5ydGyQDg==
dependencies: dependencies:
"@prisma/engines-version" "4.8.0-61.d6e67a83f971b175a593ccc12e15c4a757f93ffe" "@prisma/engines-version" "4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5"
"@prisma/engines-version@4.8.0-61.d6e67a83f971b175a593ccc12e15c4a757f93ffe": "@prisma/engines-version@4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5":
version "4.8.0-61.d6e67a83f971b175a593ccc12e15c4a757f93ffe" version "4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5"
resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.8.0-61.d6e67a83f971b175a593ccc12e15c4a757f93ffe.tgz#30401aba1029e7d32e3cb717e705a7c92ccc211e" resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5.tgz#9d817a5779fc05b107eb02f63d197ad296d60b3c"
integrity sha512-MHSOSexomRMom8QN4t7bu87wPPD+pa+hW9+71JnVcF3DqyyO/ycCLhRL1we3EojRpZxKvuyGho2REQsMCvxcJw== integrity sha512-M16aibbxi/FhW7z1sJCX8u+0DriyQYY5AyeTH7plQm9MLnURoiyn3CZBqAyIoQ+Z1pS77usCIibYJWSgleBMBA==
"@prisma/engines@4.8.0": "@prisma/engines@4.9.0":
version "4.8.0" version "4.9.0"
resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.8.0.tgz#5123c67dc0d2caa008268fc63081ca2d68b2ed7e" resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.9.0.tgz#05a1411964e047c1bc43f777c7a1c69f86a2a26c"
integrity sha512-A1Asn2rxZMlLAj1HTyfaCv0VQrLUv034jVay05QlqZg1qiHPeA3/pGTfNMijbsMYCsGVxfWEJuaZZuNxXGMCrA== integrity sha512-t1pt0Gsp+HcgPJrHFc+d/ZSAaKKWar2G/iakrE07yeKPNavDP3iVKPpfXP22OTCHZUWf7OelwKJxQgKAm5hkgw==
"@react-spring/animated@~9.5.5": "@react-spring/animated@~9.5.5":
version "9.5.5" version "9.5.5"
@ -2119,17 +2119,17 @@
dependencies: dependencies:
tslib "^2.4.0" tslib "^2.4.0"
"@tanstack/query-core@4.20.4": "@tanstack/query-core@4.22.0":
version "4.20.4" version "4.22.0"
resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.20.4.tgz#1f7975a2db26a8bc2f382bad8a44cd422c846b17" resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.22.0.tgz#7a786fcea64e229ed5d4308093dd644cdfaa895e"
integrity sha512-lhLtGVNJDsJ/DyZXrLzekDEywQqRVykgBqTmkv0La32a/RleILXy6JMLBb7UmS3QCatg/F/0N9/5b0i5j6IKcA== integrity sha512-OeLyBKBQoT265f5G9biReijeP8mBxNFwY7ZUu1dKL+YzqpG5q5z7J/N1eT8aWyKuhyDTiUHuKm5l+oIVzbtrjw==
"@tanstack/react-query@^4.16.1": "@tanstack/react-query@^4.16.1":
version "4.20.4" version "4.22.0"
resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.20.4.tgz#562b34fb919adea884eccaba2b5be50e8ba7fb16" resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.22.0.tgz#aaa4b41a6d306be6958018c74a8a3bb3e9f1924c"
integrity sha512-SJRxx13k/csb9lXAJfycgVA1N/yU/h3bvRNWP0+aHMfMjmbyX82FdoAcckDBbOdEyAupvb0byelNHNeypCFSyA== integrity sha512-P9o+HjG42uB/xHR6dMsJaPhtZydSe4v0xdG5G/cEj1oHZAXelMlm67/rYJNQGKgBamKElKogj+HYGF+NY2yHYg==
dependencies: dependencies:
"@tanstack/query-core" "4.20.4" "@tanstack/query-core" "4.22.0"
use-sync-external-store "^1.2.0" use-sync-external-store "^1.2.0"
"@trysound/sax@0.2.0": "@trysound/sax@0.2.0":
@ -2336,10 +2336,10 @@
"@typescript-eslint/types" "5.45.0" "@typescript-eslint/types" "5.45.0"
eslint-visitor-keys "^3.3.0" eslint-visitor-keys "^3.3.0"
"@umami/prisma-client@^0.1.0": "@umami/prisma-client@^0.2.0":
version "0.1.0" version "0.2.0"
resolved "https://registry.yarnpkg.com/@umami/prisma-client/-/prisma-client-0.1.0.tgz#4ecc17b1998cb738b8f2027b80b003864beef6a4" resolved "https://registry.yarnpkg.com/@umami/prisma-client/-/prisma-client-0.2.0.tgz#b9de1f28be67ccfb9e2544f23c69c392c5b26ea7"
integrity sha512-2qTXN0dtMUT+HVhz37eVC02lDSwz9TGUGHRRO0LPRHdfJPfSkUF0D8pgksX7ETy3IZoIQP1h45tiXsM0pKBMZA== integrity sha512-+27dd4DLl8SvbbIYG1mdm6pIZd+UzQI7eZGNjQ9ONeWO0jr+/wiVnPIXUzd8w4R/OoM4ChpI3mBZPqcWa5MAOw==
dependencies: dependencies:
debug "^4.3.4" debug "^4.3.4"
@ -2600,17 +2600,6 @@ array-find-index@^1.0.1:
resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz" resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz"
integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==
array-includes@^3.1.4:
version "3.1.5"
resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz"
integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.4"
es-abstract "^1.19.5"
get-intrinsic "^1.1.1"
is-string "^1.0.7"
array-includes@^3.1.5, array-includes@^3.1.6: array-includes@^3.1.5, array-includes@^3.1.6:
version "3.1.6" version "3.1.6"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f"
@ -2627,14 +2616,14 @@ array-union@^2.1.0:
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
array.prototype.flat@^1.2.5: array.prototype.flat@^1.3.1:
version "1.3.0" version "1.3.1"
resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2"
integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==
dependencies: dependencies:
call-bind "^1.0.2" call-bind "^1.0.2"
define-properties "^1.1.3" define-properties "^1.1.4"
es-abstract "^1.19.2" es-abstract "^1.20.4"
es-shim-unscopables "^1.0.0" es-shim-unscopables "^1.0.0"
array.prototype.flatmap@^1.3.1: array.prototype.flatmap@^1.3.1:
@ -2707,6 +2696,11 @@ autoprefixer@^10.4.13:
picocolors "^1.0.0" picocolors "^1.0.0"
postcss-value-parser "^4.2.0" postcss-value-parser "^4.2.0"
available-typed-arrays@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
aws-sign2@~0.7.0: aws-sign2@~0.7.0:
version "0.7.0" version "0.7.0"
resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz"
@ -3438,13 +3432,6 @@ debounce@^1.2.1:
resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz"
integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==
debug@^2.6.9:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
debug@^3.2.7: debug@^3.2.7:
version "3.2.7" version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
@ -3514,7 +3501,7 @@ define-properties@^1.1.3, define-properties@^1.1.4:
has-property-descriptors "^1.0.0" has-property-descriptors "^1.0.0"
object-keys "^1.1.1" object-keys "^1.1.1"
defu@^6.0.0, defu@^6.1.0: defu@^6.0.0, defu@^6.1.0, defu@^6.1.1:
version "6.1.1" version "6.1.1"
resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.1.tgz#a12c712349197c545dc61d3cd3b607b4cc7ef0c1" resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.1.tgz#a12c712349197c545dc61d3cd3b607b4cc7ef0c1"
integrity sha512-aA964RUCsBt0FGoNIlA3uFgo2hO+WWC0fiC6DBps/0SFzkKcYoM/3CzVLIa5xSsrFjdioMdYgAIbwo80qp2MoA== integrity sha512-aA964RUCsBt0FGoNIlA3uFgo2hO+WWC0fiC6DBps/0SFzkKcYoM/3CzVLIa5xSsrFjdioMdYgAIbwo80qp2MoA==
@ -3543,7 +3530,7 @@ denque@^2.0.1:
resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1"
integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==
destr@^1.1.1, destr@^1.2.0: destr@^1.1.1, destr@^1.2.0, destr@^1.2.1, destr@^1.2.2:
version "1.2.2" version "1.2.2"
resolved "https://registry.yarnpkg.com/destr/-/destr-1.2.2.tgz#7ba9befcafb645a50e76b260449c63927b51e22f" resolved "https://registry.yarnpkg.com/destr/-/destr-1.2.2.tgz#7ba9befcafb645a50e76b260449c63927b51e22f"
integrity sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA== integrity sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==
@ -3680,7 +3667,46 @@ error-ex@^1.3.1:
dependencies: dependencies:
is-arrayish "^0.2.1" is-arrayish "^0.2.1"
es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.4: es-abstract@^1.19.0, es-abstract@^1.20.4:
version "1.21.1"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6"
integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==
dependencies:
available-typed-arrays "^1.0.5"
call-bind "^1.0.2"
es-set-tostringtag "^2.0.1"
es-to-primitive "^1.2.1"
function-bind "^1.1.1"
function.prototype.name "^1.1.5"
get-intrinsic "^1.1.3"
get-symbol-description "^1.0.0"
globalthis "^1.0.3"
gopd "^1.0.1"
has "^1.0.3"
has-property-descriptors "^1.0.0"
has-proto "^1.0.1"
has-symbols "^1.0.3"
internal-slot "^1.0.4"
is-array-buffer "^3.0.1"
is-callable "^1.2.7"
is-negative-zero "^2.0.2"
is-regex "^1.1.4"
is-shared-array-buffer "^1.0.2"
is-string "^1.0.7"
is-typed-array "^1.1.10"
is-weakref "^1.0.2"
object-inspect "^1.12.2"
object-keys "^1.1.1"
object.assign "^4.1.4"
regexp.prototype.flags "^1.4.3"
safe-regex-test "^1.0.0"
string.prototype.trimend "^1.0.6"
string.prototype.trimstart "^1.0.6"
typed-array-length "^1.0.4"
unbox-primitive "^1.0.2"
which-typed-array "^1.1.9"
es-abstract@^1.19.1:
version "1.20.4" version "1.20.4"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861"
integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==
@ -3710,6 +3736,15 @@ es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19
string.prototype.trimstart "^1.0.5" string.prototype.trimstart "^1.0.5"
unbox-primitive "^1.0.2" unbox-primitive "^1.0.2"
es-set-tostringtag@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8"
integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==
dependencies:
get-intrinsic "^1.1.3"
has "^1.0.3"
has-tostringtag "^1.0.0"
es-shim-unscopables@^1.0.0: es-shim-unscopables@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241"
@ -3757,22 +3792,23 @@ eslint-config-next@^12.2.4:
eslint-plugin-react-hooks "^4.5.0" eslint-plugin-react-hooks "^4.5.0"
eslint-config-prettier@^8.5.0: eslint-config-prettier@^8.5.0:
version "8.5.0" version "8.6.0"
resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207"
integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==
eslint-import-resolver-alias@^1.1.2: eslint-import-resolver-alias@^1.1.2:
version "1.1.2" version "1.1.2"
resolved "https://registry.npmjs.org/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz" resolved "https://registry.npmjs.org/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz"
integrity sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w== integrity sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==
eslint-import-resolver-node@^0.3.6: eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7:
version "0.3.6" version "0.3.7"
resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7"
integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==
dependencies: dependencies:
debug "^3.2.7" debug "^3.2.7"
resolve "^1.20.0" is-core-module "^2.11.0"
resolve "^1.22.1"
eslint-import-resolver-typescript@^2.7.1: eslint-import-resolver-typescript@^2.7.1:
version "2.7.1" version "2.7.1"
@ -3785,30 +3821,32 @@ eslint-import-resolver-typescript@^2.7.1:
resolve "^1.22.0" resolve "^1.22.0"
tsconfig-paths "^3.14.1" tsconfig-paths "^3.14.1"
eslint-module-utils@^2.7.3: eslint-module-utils@^2.7.4:
version "2.7.4" version "2.7.4"
resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974"
integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==
dependencies: dependencies:
debug "^3.2.7" debug "^3.2.7"
eslint-plugin-import@^2.26.0: eslint-plugin-import@^2.26.0:
version "2.26.0" version "2.27.5"
resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65"
integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==
dependencies: dependencies:
array-includes "^3.1.4" array-includes "^3.1.6"
array.prototype.flat "^1.2.5" array.prototype.flat "^1.3.1"
debug "^2.6.9" array.prototype.flatmap "^1.3.1"
debug "^3.2.7"
doctrine "^2.1.0" doctrine "^2.1.0"
eslint-import-resolver-node "^0.3.6" eslint-import-resolver-node "^0.3.7"
eslint-module-utils "^2.7.3" eslint-module-utils "^2.7.4"
has "^1.0.3" has "^1.0.3"
is-core-module "^2.8.1" is-core-module "^2.11.0"
is-glob "^4.0.3" is-glob "^4.0.3"
minimatch "^3.1.2" minimatch "^3.1.2"
object.values "^1.1.5" object.values "^1.1.6"
resolve "^1.22.0" resolve "^1.22.1"
semver "^6.3.0"
tsconfig-paths "^3.14.1" tsconfig-paths "^3.14.1"
eslint-plugin-jsx-a11y@^6.5.1: eslint-plugin-jsx-a11y@^6.5.1:
@ -4106,9 +4144,9 @@ fastest-levenshtein@^1.0.16:
integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==
fastq@^1.6.0: fastq@^1.6.0:
version "1.14.0" version "1.15.0"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==
dependencies: dependencies:
reusify "^1.0.4" reusify "^1.0.4"
@ -4165,6 +4203,13 @@ follow-redirects@^1.15.2:
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
for-each@^0.3.3:
version "0.3.3"
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
dependencies:
is-callable "^1.1.3"
forever-agent@~0.6.1: forever-agent@~0.6.1:
version "0.6.1" version "0.6.1"
resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
@ -4218,6 +4263,15 @@ fs-extra@10, fs-extra@^10.0.0, fs-extra@^10.0.1:
jsonfile "^6.0.1" jsonfile "^6.0.1"
universalify "^2.0.0" universalify "^2.0.0"
fs-extra@^11.0.0:
version "11.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed"
integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==
dependencies:
graceful-fs "^4.2.0"
jsonfile "^6.0.1"
universalify "^2.0.0"
fs-extra@^9.0.0: fs-extra@^9.0.0:
version "9.1.0" version "9.1.0"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz"
@ -4285,7 +4339,7 @@ gensync@^1.0.0-beta.2:
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3:
version "1.1.3" version "1.1.3"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385"
integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==
@ -4390,6 +4444,13 @@ globals@^13.6.0, globals@^13.9.0:
dependencies: dependencies:
type-fest "^0.20.2" type-fest "^0.20.2"
globalthis@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
dependencies:
define-properties "^1.1.3"
globalyzer@0.1.0: globalyzer@0.1.0:
version "0.1.0" version "0.1.0"
resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465"
@ -4417,6 +4478,13 @@ globrex@^0.1.2:
resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098"
integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==
gopd@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
dependencies:
get-intrinsic "^1.1.3"
graceful-fs@^4.1.15: graceful-fs@^4.1.15:
version "4.2.9" version "4.2.9"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz"
@ -4427,15 +4495,15 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
h3@^0.8.1: h3@^1.0.1:
version "0.8.6" version "1.0.2"
resolved "https://registry.yarnpkg.com/h3/-/h3-0.8.6.tgz#8095ef998fe14769b87170b7c8b68ba9c54973d5" resolved "https://registry.yarnpkg.com/h3/-/h3-1.0.2.tgz#3a2992921a62de697bd4a3f449401f7600116df6"
integrity sha512-CSWNOKa3QGo67rFU2PhbFTp0uPJtilNji2Z0pMiSRQt3+OkIW0u3E1WMJqIycLqaTgb9JyFqH/S4mcTyyGtvyQ== integrity sha512-25QqjQMz8pX1NI2rZ/ziNT9B8Aog7jmu2a0o8Qm9kKoH3zOhE+2icVs069h6DEp0g1Dst1+zKfRdRYcK0MogJA==
dependencies: dependencies:
cookie-es "^0.5.0" cookie-es "^0.5.0"
destr "^1.2.0" destr "^1.2.2"
radix3 "^0.2.1" radix3 "^1.0.0"
ufo "^0.8.6" ufo "^1.0.1"
har-schema@^2.0.0: har-schema@^2.0.0:
version "2.0.0" version "2.0.0"
@ -4477,6 +4545,11 @@ has-property-descriptors@^1.0.0:
dependencies: dependencies:
get-intrinsic "^1.1.1" get-intrinsic "^1.1.1"
has-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
has-symbols@^1.0.2, has-symbols@^1.0.3: has-symbols@^1.0.2, has-symbols@^1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
@ -4565,9 +4638,9 @@ image-meta@^0.1.1:
integrity sha512-+oXiHwOEPr1IE5zY0tcBLED/CYcre15J4nwL50x3o0jxWqEkyjrusiKP3YSU+tr9fvJp33ZcP5Gpj2295g3aEw== integrity sha512-+oXiHwOEPr1IE5zY0tcBLED/CYcre15J4nwL50x3o0jxWqEkyjrusiKP3YSU+tr9fvJp33ZcP5Gpj2295g3aEw==
immer@^9.0.12: immer@^9.0.12:
version "9.0.16" version "9.0.18"
resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.16.tgz#8e7caab80118c2b54b37ad43e05758cdefad0198" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.18.tgz#d2faee58fd0e34f017f329b98cdab37826fa31b8"
integrity sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ== integrity sha512-eAPNpsj7Ax1q6Y/3lm2PmlwRcFzpON7HSNQ3ru5WQH1/PSpnyed/HpNOELl2CxLKoj4r+bAHgdyKqW5gc2Se1A==
import-fresh@^3.0.0, import-fresh@^3.2.1: import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0" version "3.3.0"
@ -4610,12 +4683,12 @@ ini@^1.3.5, ini@~1.3.0:
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
internal-slot@^1.0.3: internal-slot@^1.0.3, internal-slot@^1.0.4:
version "1.0.3" version "1.0.4"
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3"
integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==
dependencies: dependencies:
get-intrinsic "^1.1.0" get-intrinsic "^1.1.3"
has "^1.0.3" has "^1.0.3"
side-channel "^1.0.4" side-channel "^1.0.4"
@ -4649,10 +4722,10 @@ intl-messageformat@9.13.0:
"@formatjs/icu-messageformat-parser" "2.1.0" "@formatjs/icu-messageformat-parser" "2.1.0"
tslib "^2.1.0" tslib "^2.1.0"
ioredis@^5.2.3: ioredis@^5.2.4:
version "5.2.4" version "5.2.5"
resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.2.4.tgz#9e262a668bc29bae98f2054c1e0d7efd86996b96" resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.2.5.tgz#c62dc3945ad2a8f0323fbb2765b934a84a68cde0"
integrity sha512-qIpuAEt32lZJQ0XyrloCRdlEdUUNGG9i0UOk6zgzK6igyudNWqEBxfH6OlbnOOoBBvr1WB02mm8fR55CnikRng== integrity sha512-7HKo/ClM2DGLRXdFq8ruS3Uuadensz4A76wPOU0adqlOqd1qkhoLPDaBhmVhUhNGpB+J65/bhLmNB8DDY99HJQ==
dependencies: dependencies:
"@ioredis/commands" "^1.1.1" "@ioredis/commands" "^1.1.1"
cluster-key-slot "^1.1.0" cluster-key-slot "^1.1.0"
@ -4691,6 +4764,15 @@ ipx@^0.9.11:
ufo "^0.8.5" ufo "^0.8.5"
xss "^1.0.14" xss "^1.0.14"
is-array-buffer@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a"
integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==
dependencies:
call-bind "^1.0.2"
get-intrinsic "^1.1.3"
is-typed-array "^1.1.10"
is-arrayish@^0.2.1: is-arrayish@^0.2.1:
version "0.2.1" version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
@ -4723,7 +4805,7 @@ is-boolean-object@^1.1.0:
call-bind "^1.0.2" call-bind "^1.0.2"
has-tostringtag "^1.0.0" has-tostringtag "^1.0.0"
is-callable@^1.1.4, is-callable@^1.2.7: is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
version "1.2.7" version "1.2.7"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
@ -4735,20 +4817,13 @@ is-ci@^3.0.1:
dependencies: dependencies:
ci-info "^3.2.0" ci-info "^3.2.0"
is-core-module@^2.5.0, is-core-module@^2.9.0: is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0:
version "2.11.0" version "2.11.0"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144"
integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==
dependencies: dependencies:
has "^1.0.3" has "^1.0.3"
is-core-module@^2.8.1:
version "2.10.0"
resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz"
integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==
dependencies:
has "^1.0.3"
is-date-object@^1.0.1: is-date-object@^1.0.1:
version "1.0.5" version "1.0.5"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
@ -4879,6 +4954,17 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
dependencies: dependencies:
has-symbols "^1.0.2" has-symbols "^1.0.2"
is-typed-array@^1.1.10, is-typed-array@^1.1.9:
version "1.1.10"
resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f"
integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==
dependencies:
available-typed-arrays "^1.0.5"
call-bind "^1.0.2"
for-each "^0.3.3"
gopd "^1.0.1"
has-tostringtag "^1.0.0"
is-typedarray@^1.0.0, is-typedarray@~1.0.0: is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
@ -4993,9 +5079,9 @@ json-stringify-safe@~5.0.1:
integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
json5@^1.0.1: json5@^1.0.1:
version "1.0.1" version "1.0.2"
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
dependencies: dependencies:
minimist "^1.2.0" minimist "^1.2.0"
@ -5152,19 +5238,19 @@ listhen@^0.2.15:
selfsigned "^2.0.1" selfsigned "^2.0.1"
ufo "^0.8.5" ufo "^0.8.5"
listhen@^0.3.4: listhen@^1.0.0:
version "0.3.5" version "1.0.1"
resolved "https://registry.yarnpkg.com/listhen/-/listhen-0.3.5.tgz#04a0f6dbdab5bbac711992004a37c8306fad3e4e" resolved "https://registry.yarnpkg.com/listhen/-/listhen-1.0.1.tgz#31054d08d850ad21473768085a50a8b34a635070"
integrity sha512-suyt79hNmCFeBIyftcLqLPfYiXeB795gSUWOJT7nspl2IvREY0Q9xvchLhekxvQ0KiOPvWoyALnc9Mxoelm0Pw== integrity sha512-RBzBGHMCc5wP8J5Vf8WgF4CAJH8dWHi9LaKB7vfzZt54CiH/0dp01rudy2hFD9wCrTM+UfxFVnn5wTIiY+Qhiw==
dependencies: dependencies:
clipboardy "^3.0.0" clipboardy "^3.0.0"
colorette "^2.0.19" colorette "^2.0.19"
defu "^6.1.0" defu "^6.1.1"
get-port-please "^2.6.1" get-port-please "^2.6.1"
http-shutdown "^1.2.2" http-shutdown "^1.2.2"
ip-regex "^5.0.0" ip-regex "^5.0.0"
node-forge "^1.3.1" node-forge "^1.3.1"
ufo "^0.8.6" ufo "^1.0.0"
listr2@^3.12.2: listr2@^3.12.2:
version "3.14.0" version "3.14.0"
@ -5525,9 +5611,9 @@ mmdb-lib@2.0.2:
integrity sha512-shi1I+fCPQonhTi7qyb6hr7hi87R7YS69FlfJiMFuJ12+grx0JyL56gLNzGTYXPU7EhAPkMLliGeyHer0K+AVA== integrity sha512-shi1I+fCPQonhTi7qyb6hr7hi87R7YS69FlfJiMFuJ12+grx0JyL56gLNzGTYXPU7EhAPkMLliGeyHer0K+AVA==
moize@^6.1.0: moize@^6.1.0:
version "6.1.4" version "6.1.5"
resolved "https://registry.yarnpkg.com/moize/-/moize-6.1.4.tgz#8e79b62a4a0519229b013522ae27d1b00c0b0c2d" resolved "https://registry.yarnpkg.com/moize/-/moize-6.1.5.tgz#e9a589685a3de4266eeb5f2bbfdfe1a173265f1a"
integrity sha512-Ga8V0iu7XHDz6GR50pAaGjc3hJ5CVmWUgQRyWFAn4pYrBzITx9dMlXOGhURP2qmO3WTeOC9Yu17MlFV6PY2m/g== integrity sha512-Fu46qKV9F8DOi2vXimR3yRw/JAJfFRQEFZeclvOFnG92AEFERqwFtu4PIxETYFtCghHGlU1itKcvvNioKgWGIw==
dependencies: dependencies:
fast-equals "^3.0.1" fast-equals "^3.0.1"
micro-memoize "^4.0.11" micro-memoize "^4.0.11"
@ -5556,11 +5642,6 @@ mri@^1.2.0:
resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
ms@2.1.2: ms@2.1.2:
version "2.1.2" version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
@ -5637,16 +5718,16 @@ nice-try@^1.0.4:
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
node-abi@^3.3.0: node-abi@^3.3.0:
version "3.30.0" version "3.31.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.30.0.tgz#d84687ad5d24ca81cdfa912a36f2c5c19b137359" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.31.0.tgz#dfb2ea3d01188eb80859f69bb4a4354090c1b355"
integrity sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw== integrity sha512-eSKV6s+APenqVh8ubJyiu/YhZgxQpGP66ntzUb3lY1xB9ukSRaGnx0AIxI+IM+1+IVYC1oWobgG5L3Lt9ARykQ==
dependencies: dependencies:
semver "^7.3.5" semver "^7.3.5"
node-addon-api@^5.0.0: node-addon-api@^5.0.0:
version "5.0.0" version "5.1.0"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.0.0.tgz#7d7e6f9ef89043befdb20c1989c905ebde18c501" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762"
integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA== integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==
node-domexception@^1.0.0: node-domexception@^1.0.0:
version "1.0.0" version "1.0.0"
@ -5658,10 +5739,15 @@ node-fetch-native@^0.1.8:
resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-0.1.8.tgz#19e2eaf6d86ac14e711ebd2612f40517c3468f2a" resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-0.1.8.tgz#19e2eaf6d86ac14e711ebd2612f40517c3468f2a"
integrity sha512-ZNaury9r0NxaT2oL65GvdGDy+5PlSaHTovT6JV5tOW07k1TQmgC0olZETa4C9KZg0+6zBr99ctTYa3Utqj9P/Q== integrity sha512-ZNaury9r0NxaT2oL65GvdGDy+5PlSaHTovT6JV5tOW07k1TQmgC0olZETa4C9KZg0+6zBr99ctTYa3Utqj9P/Q==
node-fetch-native@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.0.1.tgz#1dfe78f57545d07e07016b7df4c0cb9d2ff416c7"
integrity sha512-VzW+TAk2wE4X9maiKMlT+GsPU4OMmR1U9CrHSmd3DFLn2IcZ9VJ6M6BBugGfYUnPCLSYxXdZy17M0BEJyhUTwg==
node-fetch@^2.0.0, node-fetch@^2.6.6: node-fetch@^2.0.0, node-fetch@^2.6.6:
version "2.6.7" version "2.6.8"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.8.tgz#a68d30b162bc1d8fd71a367e81b997e1f4d4937e"
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== integrity sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg==
dependencies: dependencies:
whatwg-url "^5.0.0" whatwg-url "^5.0.0"
@ -5759,9 +5845,9 @@ object-assign@^4, object-assign@^4.1.1:
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
object-inspect@^1.12.2, object-inspect@^1.9.0: object-inspect@^1.12.2, object-inspect@^1.9.0:
version "1.12.2" version "1.12.3"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
object-keys@^1.1.1: object-keys@^1.1.1:
version "1.1.1" version "1.1.1"
@ -5804,7 +5890,7 @@ object.hasown@^1.1.2:
define-properties "^1.1.4" define-properties "^1.1.4"
es-abstract "^1.20.4" es-abstract "^1.20.4"
object.values@^1.1.5, object.values@^1.1.6: object.values@^1.1.6:
version "1.1.6" version "1.1.6"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d"
integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==
@ -5813,7 +5899,16 @@ object.values@^1.1.5, object.values@^1.1.6:
define-properties "^1.1.4" define-properties "^1.1.4"
es-abstract "^1.20.4" es-abstract "^1.20.4"
ohmyfetch@^0.4.18, ohmyfetch@^0.4.19: ofetch@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/ofetch/-/ofetch-1.0.0.tgz#5a2604cdcb33349900e4f73ffe44de449a61101a"
integrity sha512-d40aof8czZFSQKJa4+F7Ch3UC5D631cK1TTUoK+iNEut9NoiCL+u0vykl/puYVUS2df4tIQl5upQcolIcEzQjQ==
dependencies:
destr "^1.2.1"
node-fetch-native "^1.0.1"
ufo "^1.0.0"
ohmyfetch@^0.4.18:
version "0.4.21" version "0.4.21"
resolved "https://registry.yarnpkg.com/ohmyfetch/-/ohmyfetch-0.4.21.tgz#6850db751fc7bbf08153aa8b11ff1ef45fcfd963" resolved "https://registry.yarnpkg.com/ohmyfetch/-/ohmyfetch-0.4.21.tgz#6850db751fc7bbf08153aa8b11ff1ef45fcfd963"
integrity sha512-VG7f/JRvqvBOYvL0tHyEIEG7XHWm7OqIfAs6/HqwWwDfjiJ1g0huIpe5sFEmyb+7hpFa1EGNH2aERWR72tlClw== integrity sha512-VG7f/JRvqvBOYvL0tHyEIEG7XHWm7OqIfAs6/HqwWwDfjiJ1g0huIpe5sFEmyb+7hpFa1EGNH2aERWR72tlClw==
@ -5863,7 +5958,7 @@ p-limit@^2.2.0:
p-limit@^3.1.0: p-limit@^3.1.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
dependencies: dependencies:
yocto-queue "^0.1.0" yocto-queue "^0.1.0"
@ -6354,21 +6449,21 @@ prettier-linter-helpers@^1.0.0:
fast-diff "^1.1.2" fast-diff "^1.1.2"
prettier@^2.6.2: prettier@^2.6.2:
version "2.8.1" version "2.8.3"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632"
integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==
pretty-bytes@^5.6.0: pretty-bytes@^5.6.0:
version "5.6.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"
integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==
prisma@4.8.0: prisma@4.9.0:
version "4.8.0" version "4.9.0"
resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.8.0.tgz#634dbbdc9d3f76c61604880251673d08ccb6f02b" resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.9.0.tgz#295954b2a89cd35a0e6bcf66b2b036dbf80c75ee"
integrity sha512-DWIhxvxt8f4h6MDd35mz7BJff+fu7HItW3WPDIEpCR3RzcOWyiHBbLQW5/DOgmf+pRLTjwXQob7kuTZVYUAw5w== integrity sha512-bS96oZ5oDFXYgoF2l7PJ3Mp1wWWfLOo8B/jAfbA2Pn0Wm5Z/owBHzaMQKS3i1CzVBDWWPVnOohmbJmjvkcHS5w==
dependencies: dependencies:
"@prisma/engines" "4.8.0" "@prisma/engines" "4.9.0"
progress@^2.0.0: progress@^2.0.0:
version "2.0.3" version "2.0.3"
@ -6440,10 +6535,10 @@ quick-lru@^4.0.1:
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
radix3@^0.2.1: radix3@^1.0.0:
version "0.2.1" version "1.0.0"
resolved "https://registry.yarnpkg.com/radix3/-/radix3-0.2.1.tgz#77e66a41c7ba5600a8bc137fd259ef661d314418" resolved "https://registry.yarnpkg.com/radix3/-/radix3-1.0.0.tgz#d1c760b850206a6bd5dfd26820c25903cb20eccc"
integrity sha512-FnhArTl5Tq7dodiLeSPKrDUyCQuJqEncP8cKdyy399g8F/cz7GH6FmzA3Rkosu2IZMkpswFFwXfb2ERSiL06pg== integrity sha512-6n3AEXth91ASapMVKiEh2wrbFJmI+NBilrWE0AbiGgfm0xet0QXC8+a3K19r1UVYjUjctUgB053c3V/J6V0kCQ==
raf-schd@^4.0.2: raf-schd@^4.0.2:
version "4.0.3" version "4.0.3"
@ -6467,10 +6562,10 @@ rc@^1.2.7:
minimist "^1.2.0" minimist "^1.2.0"
strip-json-comments "~2.0.1" strip-json-comments "~2.0.1"
react-basics@^0.50.0: react-basics@^0.53.0:
version "0.50.0" version "0.53.0"
resolved "https://registry.yarnpkg.com/react-basics/-/react-basics-0.50.0.tgz#1784ce05f0361dd208804a273954dd50b8ec8b6f" resolved "https://registry.yarnpkg.com/react-basics/-/react-basics-0.53.0.tgz#2215ca47bca99a316cd129875682960d6519611f"
integrity sha512-hf9pbYuVSNqI7tlhO/5Ry1GfcWINKJgDkmDbFVCKSYYyiiycqDcsIyaXGn+pSxvWUj3Lk8YJep7INFeUMxA35A== integrity sha512-XsG38JsumhHvqGaVnY7oRErs7Ub1Td1GjFE0VG4Uc7SlwRzK1idmtaZGW6dbPpHhmwkDNa7xnohRaKgRBmP2pg==
dependencies: dependencies:
classnames "^2.3.1" classnames "^2.3.1"
react "^18.2.0" react "^18.2.0"
@ -6863,7 +6958,7 @@ resolve@^1.1.7:
path-parse "^1.0.7" path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0" supports-preserve-symlinks-flag "^1.0.0"
resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0: resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.0, resolve@^1.22.1:
version "1.22.1" version "1.22.1"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
@ -7274,7 +7369,7 @@ string.prototype.padend@^3.0.0:
define-properties "^1.1.3" define-properties "^1.1.3"
es-abstract "^1.19.1" es-abstract "^1.19.1"
string.prototype.trimend@^1.0.5: string.prototype.trimend@^1.0.5, string.prototype.trimend@^1.0.6:
version "1.0.6" version "1.0.6"
resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533"
integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==
@ -7283,7 +7378,7 @@ string.prototype.trimend@^1.0.5:
define-properties "^1.1.4" define-properties "^1.1.4"
es-abstract "^1.20.4" es-abstract "^1.20.4"
string.prototype.trimstart@^1.0.5: string.prototype.trimstart@^1.0.5, string.prototype.trimstart@^1.0.6:
version "1.0.6" version "1.0.6"
resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4"
integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==
@ -7369,10 +7464,10 @@ stylelint-config-prettier@^9.0.3:
resolved "https://registry.yarnpkg.com/stylelint-config-prettier/-/stylelint-config-prettier-9.0.4.tgz#1b1dda614d5b3ef6c1f583fa6fa55f88245eb00b" resolved "https://registry.yarnpkg.com/stylelint-config-prettier/-/stylelint-config-prettier-9.0.4.tgz#1b1dda614d5b3ef6c1f583fa6fa55f88245eb00b"
integrity sha512-38nIGTGpFOiK5LjJ8Ma1yUgpKENxoKSOhbDNSemY7Ep0VsJoXIW9Iq/2hSt699oB9tReynfWicTAoIHiq8Rvbg== integrity sha512-38nIGTGpFOiK5LjJ8Ma1yUgpKENxoKSOhbDNSemY7Ep0VsJoXIW9Iq/2hSt699oB9tReynfWicTAoIHiq8Rvbg==
stylelint-config-recommended@^7.0.0: stylelint-config-recommended@^9.0.0:
version "7.0.0" version "9.0.0"
resolved "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz" resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz#1c9e07536a8cd875405f8ecef7314916d94e7e40"
integrity sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q== integrity sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==
stylelint-scss@^4.2.0: stylelint-scss@^4.2.0:
version "4.2.0" version "4.2.0"
@ -7385,10 +7480,10 @@ stylelint-scss@^4.2.0:
postcss-selector-parser "^6.0.6" postcss-selector-parser "^6.0.6"
postcss-value-parser "^4.1.0" postcss-value-parser "^4.1.0"
stylelint@^14.5.3: stylelint@^14.16.1:
version "14.16.0" version "14.16.1"
resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.16.0.tgz#8e1a424f4b9852e59089f95de306734d70e5048b" resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.16.1.tgz#b911063530619a1bbe44c2b875fd8181ebdc742d"
integrity sha512-X6uTi9DcxjzLV8ZUAjit1vsRtSwcls0nl07c9rqOPzvpA8IvTX/xWEkBRowS0ffevRrqkHa/ThDEu86u73FQDg== integrity sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==
dependencies: dependencies:
"@csstools/selector-specificity" "^2.0.2" "@csstools/selector-specificity" "^2.0.2"
balanced-match "^2.0.0" balanced-match "^2.0.0"
@ -7725,6 +7820,15 @@ type-fest@^0.8.1:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
typed-array-length@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==
dependencies:
call-bind "^1.0.2"
for-each "^0.3.3"
is-typed-array "^1.1.9"
typedarray-to-buffer@^3.1.5: typedarray-to-buffer@^3.1.5:
version "3.1.5" version "3.1.5"
resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz"
@ -7747,7 +7851,7 @@ ufo@^0.8.5, ufo@^0.8.6:
resolved "https://registry.yarnpkg.com/ufo/-/ufo-0.8.6.tgz#c0ec89bc0e0c9fa59a683680feb0f28b55ec323b" resolved "https://registry.yarnpkg.com/ufo/-/ufo-0.8.6.tgz#c0ec89bc0e0c9fa59a683680feb0f28b55ec323b"
integrity sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw== integrity sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw==
ufo@^1.0.0: ufo@^1.0.0, ufo@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.0.1.tgz#64ed43b530706bda2e4892f911f568cf4cf67d29" resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.0.1.tgz#64ed43b530706bda2e4892f911f568cf4cf67d29"
integrity sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA== integrity sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==
@ -7763,9 +7867,9 @@ unbox-primitive@^1.0.2:
which-boxed-primitive "^1.0.2" which-boxed-primitive "^1.0.2"
undici@^5.12.0: undici@^5.12.0:
version "5.14.0" version "5.15.1"
resolved "https://registry.yarnpkg.com/undici/-/undici-5.14.0.tgz#1169d0cdee06a4ffdd30810f6228d57998884d00" resolved "https://registry.yarnpkg.com/undici/-/undici-5.15.1.tgz#5292454b1441da486a80c0f3ada1e88f1765ff8d"
integrity sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ== integrity sha512-XLk8g0WAngdvFqTI+VKfBtM4YWXgdxkf1WezC771Es0Dd+Pm1KmNx8t93WTC+Hh9tnghmVxkclU1HN+j+CvIUA==
dependencies: dependencies:
busboy "^1.6.0" busboy "^1.6.0"
@ -7820,22 +7924,22 @@ universalify@^2.0.0:
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
unstorage@^0.6.0: unstorage@^1.0.0:
version "0.6.0" version "1.0.1"
resolved "https://registry.yarnpkg.com/unstorage/-/unstorage-0.6.0.tgz#9a70d770d08ed8dbb87f4aa5fbf7700baf4a641d" resolved "https://registry.yarnpkg.com/unstorage/-/unstorage-1.0.1.tgz#8cac09e435e727f68ac8ffdac10caa1a5b35883d"
integrity sha512-X05PIq28pVNA1BypX6Y00YNqAsHM25MGemvpjHeYvwJ8/wg936GoO1YD+VdWlqm3LmVX4fNJ5tlC7uhXsMPgeg== integrity sha512-J1c4b8K2KeihHrQtdgl/ybIapArUbPaPb+TyJy/nGSauDwDYqciZsEKdkee568P3c8SSH4TIgnGRHDWMPGw+Lg==
dependencies: dependencies:
anymatch "^3.1.2" anymatch "^3.1.2"
chokidar "^3.5.3" chokidar "^3.5.3"
destr "^1.1.1" destr "^1.2.1"
h3 "^0.8.1" h3 "^1.0.1"
ioredis "^5.2.3" ioredis "^5.2.4"
listhen "^0.3.4" listhen "^1.0.0"
mkdir "^0.0.2" mkdir "^0.0.2"
mri "^1.2.0" mri "^1.2.0"
ohmyfetch "^0.4.19" ofetch "^1.0.0"
ufo "^0.8.6" ufo "^1.0.0"
ws "^8.9.0" ws "^8.11.0"
update-browserslist-db@^1.0.9: update-browserslist-db@^1.0.9:
version "1.0.10" version "1.0.10"
@ -7949,6 +8053,18 @@ which-boxed-primitive@^1.0.2:
is-string "^1.0.5" is-string "^1.0.5"
is-symbol "^1.0.3" is-symbol "^1.0.3"
which-typed-array@^1.1.9:
version "1.1.9"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6"
integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==
dependencies:
available-typed-arrays "^1.0.5"
call-bind "^1.0.2"
for-each "^0.3.3"
gopd "^1.0.1"
has-tostringtag "^1.0.0"
is-typed-array "^1.1.10"
which@^1.2.9, which@^1.3.1: which@^1.2.9, which@^1.3.1:
version "1.3.1" version "1.3.1"
resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
@ -8021,10 +8137,10 @@ write-json-file@^4.3.0:
sort-keys "^4.0.0" sort-keys "^4.0.0"
write-file-atomic "^3.0.0" write-file-atomic "^3.0.0"
ws@^8.9.0: ws@^8.11.0:
version "8.11.0" version "8.12.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8"
integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==
xss@^1.0.14: xss@^1.0.14:
version "1.0.14" version "1.0.14"