Merge pull request #492 from mikecao/dev

v1.13.0
This commit is contained in:
Mike Cao 2021-02-20 20:46:34 -08:00 committed by GitHub
commit 7eb0ca8034
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
43 changed files with 545 additions and 389 deletions

View File

@ -1,10 +1,11 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import ReactTooltip from 'react-tooltip'; import ReactTooltip from 'react-tooltip';
import classNames from 'classnames'; import classNames from 'classnames';
import Icon from './Icon'; import Icon from './Icon';
import styles from './Button.module.css'; import styles from './Button.module.css';
export default function Button({ function Button({
type = 'button', type = 'button',
icon, icon,
size, size,
@ -43,3 +44,19 @@ export default function Button({
</button> </button>
); );
} }
Button.propTypes = {
type: PropTypes.oneOf(['button', 'submit', 'reset']),
icon: PropTypes.node,
size: PropTypes.oneOf(['xlarge', 'large', 'medium', 'small', 'xsmall']),
variant: PropTypes.oneOf(['action', 'danger', 'light']),
children: PropTypes.node,
className: PropTypes.string,
tooltip: PropTypes.node,
tooltipId: PropTypes.string,
disabled: PropTypes.bool,
iconRight: PropTypes.bool,
onClick: PropTypes.func,
};
export default Button;

View File

@ -1,16 +1,10 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import Button from './Button'; import Button from './Button';
import styles from './ButtonGroup.module.css'; import styles from './ButtonGroup.module.css';
export default function ButtonGroup({ function ButtonGroup({ items = [], selectedItem, className, size, icon, onClick = () => {} }) {
items = [],
selectedItem,
className,
size,
icon,
onClick = () => {},
}) {
return ( return (
<div className={classNames(styles.group, className)}> <div className={classNames(styles.group, className)}>
{items.map(item => { {items.map(item => {
@ -30,3 +24,19 @@ export default function ButtonGroup({
</div> </div>
); );
} }
ButtonGroup.propTypes = {
items: PropTypes.arrayOf(
PropTypes.shape({
label: PropTypes.node,
value: PropTypes.any.isRequired,
}),
),
selectedItem: PropTypes.any,
className: PropTypes.string,
size: PropTypes.oneOf(['xlarge', 'large', 'medium', 'small', 'xsmall']),
icon: PropTypes.node,
onClick: PropTypes.func,
};
export default ButtonGroup;

View File

@ -1,9 +1,10 @@
import React, { useRef } from 'react'; import React, { useRef } from 'react';
import PropTypes from 'prop-types';
import Icon from 'components/common/Icon'; import Icon from 'components/common/Icon';
import Check from 'assets/check.svg'; import Check from 'assets/check.svg';
import styles from './Checkbox.module.css'; import styles from './Checkbox.module.css';
export default function Checkbox({ name, value, label, onChange }) { function Checkbox({ name, value, label, onChange }) {
const ref = useRef(); const ref = useRef();
return ( return (
@ -25,3 +26,12 @@ export default function Checkbox({ name, value, label, onChange }) {
</div> </div>
); );
} }
Checkbox.propTypes = {
name: PropTypes.string,
value: PropTypes.any,
label: PropTypes.node,
onChange: PropTypes.func,
};
export default Checkbox;

View File

@ -1,4 +1,5 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import PropTypes from 'prop-types';
import Button from './Button'; import Button from './Button';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
@ -6,7 +7,7 @@ const defaultText = (
<FormattedMessage id="label.copy-to-clipboard" defaultMessage="Copy to clipboard" /> <FormattedMessage id="label.copy-to-clipboard" defaultMessage="Copy to clipboard" />
); );
export default function CopyButton({ element, ...props }) { function CopyButton({ element, ...props }) {
const [text, setText] = useState(defaultText); const [text, setText] = useState(defaultText);
function handleClick() { function handleClick() {
@ -24,3 +25,13 @@ export default function CopyButton({ element, ...props }) {
</Button> </Button>
); );
} }
CopyButton.propTypes = {
element: PropTypes.shape({
current: PropTypes.shape({
select: PropTypes.func.isRequired,
}),
}),
};
export default CopyButton;

View File

@ -1,4 +1,5 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import { endOfYear, isSameDay } from 'date-fns'; import { endOfYear, isSameDay } from 'date-fns';
import Modal from './Modal'; import Modal from './Modal';
@ -54,7 +55,7 @@ const filterOptions = [
}, },
]; ];
export default function DateFilter({ value, startDate, endDate, onChange, className }) { function DateFilter({ value, startDate, endDate, onChange, className }) {
const [showPicker, setShowPicker] = useState(false); const [showPicker, setShowPicker] = useState(false);
const displayValue = const displayValue =
value === 'custom' ? ( value === 'custom' ? (
@ -117,3 +118,13 @@ const CustomRange = ({ startDate, endDate, onClick }) => {
</> </>
); );
}; };
DateFilter.propTypes = {
value: PropTypes.string,
startDate: PropTypes.instanceOf(Date),
endDate: PropTypes.instanceOf(Date),
onChange: PropTypes.func,
className: PropTypes.string,
};
export default DateFilter;

View File

@ -1,8 +1,9 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import styles from './Dot.module.css'; import styles from './Dot.module.css';
export default function Dot({ color, size, className }) { function Dot({ color, size, className }) {
return ( return (
<div className={styles.wrapper}> <div className={styles.wrapper}>
<div <div
@ -15,3 +16,11 @@ export default function Dot({ color, size, className }) {
</div> </div>
); );
} }
Dot.propTypes = {
color: PropTypes.string,
size: PropTypes.oneOf(['small', 'large']),
className: PropTypes.string,
};
export default Dot;

View File

@ -1,4 +1,5 @@
import React, { useState, useRef } from 'react'; import React, { useState, useRef } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import Menu from './Menu'; import Menu from './Menu';
import useDocumentClick from 'hooks/useDocumentClick'; import useDocumentClick from 'hooks/useDocumentClick';
@ -6,13 +7,7 @@ import Chevron from 'assets/chevron-down.svg';
import styles from './Dropdown.module.css'; import styles from './Dropdown.module.css';
import Icon from './Icon'; import Icon from './Icon';
export default function DropDown({ function DropDown({ value, className, menuClassName, options = [], onChange = () => {} }) {
value,
className,
menuClassName,
options = [],
onChange = () => {},
}) {
const [showMenu, setShowMenu] = useState(false); const [showMenu, setShowMenu] = useState(false);
const ref = useRef(); const ref = useRef();
const selectedOption = options.find(e => e.value === value); const selectedOption = options.find(e => e.value === value);
@ -52,3 +47,18 @@ export default function DropDown({
</div> </div>
); );
} }
DropDown.propTypes = {
value: PropTypes.any,
className: PropTypes.string,
menuClassName: PropTypes.string,
options: PropTypes.arrayOf(
PropTypes.shape({
value: PropTypes.any.isRequired,
label: PropTypes.node,
}),
),
onChange: PropTypes.func,
};
export default DropDown;

View File

@ -1,9 +1,10 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import Icon from 'components/common/Icon'; import Icon from 'components/common/Icon';
import Logo from 'assets/logo.svg'; import Logo from 'assets/logo.svg';
import styles from './EmptyPlaceholder.module.css'; import styles from './EmptyPlaceholder.module.css';
export default function EmptyPlaceholder({ msg, children }) { function EmptyPlaceholder({ msg, children }) {
return ( return (
<div className={styles.placeholder}> <div className={styles.placeholder}>
<Icon className={styles.icon} icon={<Logo />} size="xlarge" /> <Icon className={styles.icon} icon={<Logo />} size="xlarge" />
@ -12,3 +13,10 @@ export default function EmptyPlaceholder({ msg, children }) {
</div> </div>
); );
} }
EmptyPlaceholder.propTypes = {
msg: PropTypes.node,
children: PropTypes.node,
};
export default EmptyPlaceholder;

View File

@ -1,4 +1,5 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import styles from './Favicon.module.css'; import styles from './Favicon.module.css';
function getHostName(url) { function getHostName(url) {
@ -6,7 +7,7 @@ function getHostName(url) {
return match && match.length > 1 ? match[1] : null; return match && match.length > 1 ? match[1] : null;
} }
export default function Favicon({ domain, ...props }) { function Favicon({ domain, ...props }) {
const hostName = domain ? getHostName(domain) : null; const hostName = domain ? getHostName(domain) : null;
return hostName ? ( return hostName ? (
@ -19,3 +20,9 @@ export default function Favicon({ domain, ...props }) {
/> />
) : null; ) : null;
} }
Favicon.propTypes = {
domain: PropTypes.string,
};
export default Favicon;

View File

@ -1,11 +1,25 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import ButtonLayout from 'components/layout/ButtonLayout'; import ButtonLayout from 'components/layout/ButtonLayout';
import ButtonGroup from './ButtonGroup'; import ButtonGroup from './ButtonGroup';
export default function FilterButtons({ buttons, selected, onClick }) { function FilterButtons({ buttons, selected, onClick }) {
return ( return (
<ButtonLayout> <ButtonLayout>
<ButtonGroup size="xsmall" items={buttons} selectedItem={selected} onClick={onClick} /> <ButtonGroup size="xsmall" items={buttons} selectedItem={selected} onClick={onClick} />
</ButtonLayout> </ButtonLayout>
); );
} }
FilterButtons.propTypes = {
buttons: PropTypes.arrayOf(
PropTypes.shape({
label: PropTypes.node,
value: PropTypes.any.isRequired,
}),
),
selected: PropTypes.any,
onClick: PropTypes.func,
};
export default FilterButtons;

View File

@ -1,8 +1,9 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import styles from './Icon.module.css'; import styles from './Icon.module.css';
export default function Icon({ icon, className, size = 'medium', ...props }) { function Icon({ icon, className, size = 'medium', ...props }) {
return ( return (
<div <div
className={classNames(styles.icon, className, { className={classNames(styles.icon, className, {
@ -18,3 +19,11 @@ export default function Icon({ icon, className, size = 'medium', ...props }) {
</div> </div>
); );
} }
Icon.propTypes = {
className: PropTypes.string,
icon: PropTypes.node.isRequired,
size: PropTypes.oneOf(['xlarge', 'large', 'medium', 'small', 'xsmall']),
};
export default Icon;

View File

@ -1,10 +1,11 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import NextLink from 'next/link'; import NextLink from 'next/link';
import Icon from './Icon'; import Icon from './Icon';
import styles from './Link.module.css'; import styles from './Link.module.css';
export default function Link({ className, icon, children, size, iconRight, ...props }) { function Link({ className, icon, children, size, iconRight, ...props }) {
return ( return (
<NextLink {...props}> <NextLink {...props}>
<a <a
@ -21,3 +22,13 @@ export default function Link({ className, icon, children, size, iconRight, ...pr
</NextLink> </NextLink>
); );
} }
Link.propTypes = {
className: PropTypes.string,
icon: PropTypes.node,
children: PropTypes.node,
size: PropTypes.oneOf(['large', 'small', 'xsmall']),
iconRight: PropTypes.bool,
};
export default Link;

View File

@ -1,8 +1,9 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import styles from './Loading.module.css'; import styles from './Loading.module.css';
export default function Loading({ className }) { function Loading({ className }) {
return ( return (
<div className={classNames(styles.loading, className)}> <div className={classNames(styles.loading, className)}>
<div /> <div />
@ -11,3 +12,9 @@ export default function Loading({ className }) {
</div> </div>
); );
} }
Loading.propTypes = {
className: PropTypes.string,
};
export default Loading;

View File

@ -1,8 +1,9 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import styles from './Menu.module.css'; import styles from './Menu.module.css';
export default function Menu({ function Menu({
options = [], options = [],
selectedOption, selectedOption,
className, className,
@ -46,3 +47,24 @@ export default function Menu({
</div> </div>
); );
} }
Menu.propTypes = {
options: PropTypes.arrayOf(
PropTypes.shape({
label: PropTypes.node,
value: PropTypes.any,
className: PropTypes.string,
render: PropTypes.func,
divider: PropTypes.bool,
}),
),
selectedOption: PropTypes.any,
className: PropTypes.string,
float: PropTypes.oneOf(['top', 'bottom']),
align: PropTypes.oneOf(['left', 'right']),
optionClassName: PropTypes.string,
selectedClassName: PropTypes.string,
onSelect: PropTypes.func,
};
export default Menu;

View File

@ -1,11 +1,12 @@
import React, { useState, useRef } from 'react'; import React, { useState, useRef } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import Menu from 'components/common/Menu'; import Menu from 'components/common/Menu';
import Button from 'components/common/Button'; import Button from 'components/common/Button';
import useDocumentClick from 'hooks/useDocumentClick'; import useDocumentClick from 'hooks/useDocumentClick';
import styles from './MenuButton.module.css'; import styles from './MenuButton.module.css';
export default function MenuButton({ function MenuButton({
icon, icon,
value, value,
options, options,
@ -58,3 +59,25 @@ export default function MenuButton({
</div> </div>
); );
} }
MenuButton.propTypes = {
icon: PropTypes.node,
value: PropTypes.any,
options: PropTypes.arrayOf(
PropTypes.shape({
label: PropTypes.node,
value: PropTypes.any,
className: PropTypes.string,
render: PropTypes.func,
divider: PropTypes.bool,
}),
),
buttonClassName: PropTypes.string,
menuClassName: PropTypes.string,
menuPosition: PropTypes.oneOf(['top', 'bottom']),
menuAlign: PropTypes.oneOf(['left', 'right']),
onSelect: PropTypes.func,
renderValue: PropTypes.func,
};
export default MenuButton;

View File

@ -1,9 +1,10 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import { useSpring, animated } from 'react-spring'; import { useSpring, animated } from 'react-spring';
import styles from './Modal.module.css'; import styles from './Modal.module.css';
export default function Modal({ title, children }) { function Modal({ title, children }) {
const props = useSpring({ opacity: 1, from: { opacity: 0 } }); const props = useSpring({ opacity: 1, from: { opacity: 0 } });
return ReactDOM.createPortal( return ReactDOM.createPortal(
@ -16,3 +17,10 @@ export default function Modal({ title, children }) {
document.getElementById('__modals'), document.getElementById('__modals'),
); );
} }
Modal.propTypes = {
title: PropTypes.node,
children: PropTypes.node,
};
export default Modal;

View File

@ -1,9 +1,10 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import { useRouter } from 'next/router'; import { useRouter } from 'next/router';
import classNames from 'classnames'; import classNames from 'classnames';
import styles from './NavMenu.module.css'; import styles from './NavMenu.module.css';
export default function NavMenu({ options = [], className, onSelect = () => {} }) { function NavMenu({ options = [], className, onSelect = () => {} }) {
const router = useRouter(); const router = useRouter();
return ( return (
@ -30,3 +31,17 @@ export default function NavMenu({ options = [], className, onSelect = () => {} }
</div> </div>
); );
} }
NavMenu.propTypes = {
options: PropTypes.arrayOf(
PropTypes.shape({
label: PropTypes.node,
value: PropTypes.any,
className: PropTypes.string,
render: PropTypes.func,
}),
),
className: PropTypes.string,
onSelect: PropTypes.func,
};
export default NavMenu;

View File

@ -1,12 +1,19 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import styles from './NoData.module.css'; import styles from './NoData.module.css';
export default function NoData({ className }) { function NoData({ className }) {
return ( return (
<div className={classNames(styles.container, className)}> <div className={classNames(styles.container, className)}>
<FormattedMessage id="message.no-data-available" defaultMessage="No data available." /> <FormattedMessage id="message.no-data-available" defaultMessage="No data available." />
</div> </div>
); );
} }
NoData.propTypes = {
className: PropTypes.string,
};
export default NoData;

View File

@ -1,4 +1,5 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import { setDateRange } from 'redux/actions/websites'; import { setDateRange } from 'redux/actions/websites';
@ -8,7 +9,7 @@ import Dots from 'assets/ellipsis-h.svg';
import useDateRange from 'hooks/useDateRange'; import useDateRange from 'hooks/useDateRange';
import { getDateRange } from '../../lib/date'; import { getDateRange } from '../../lib/date';
export default function RefreshButton({ websiteId }) { function RefreshButton({ websiteId }) {
const dispatch = useDispatch(); const dispatch = useDispatch();
const [dateRange] = useDateRange(websiteId); const [dateRange] = useDateRange(websiteId);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
@ -35,3 +36,9 @@ export default function RefreshButton({ websiteId }) {
/> />
); );
} }
RefreshButton.propTypes = {
websiteId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
};
export default RefreshButton;

View File

@ -1,9 +1,10 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import NoData from 'components/common/NoData'; import NoData from 'components/common/NoData';
import styles from './Table.module.css'; import styles from './Table.module.css';
export default function Table({ function Table({
columns, columns,
rows, rows,
empty, empty,
@ -45,6 +46,34 @@ export default function Table({
); );
} }
const styledObject = PropTypes.shape({
className: PropTypes.string,
style: PropTypes.object,
});
Table.propTypes = {
columns: PropTypes.arrayOf(
PropTypes.shape({
cell: styledObject,
className: PropTypes.string,
header: styledObject,
key: PropTypes.string,
label: PropTypes.node,
render: PropTypes.func,
style: PropTypes.object,
}),
),
rows: PropTypes.arrayOf(PropTypes.object),
empty: PropTypes.node,
className: PropTypes.string,
bodyClassName: PropTypes.string,
rowKey: PropTypes.func,
showHeader: PropTypes.bool,
children: PropTypes.node,
};
export default Table;
export const TableRow = ({ columns, row }) => ( export const TableRow = ({ columns, row }) => (
<div className={classNames(styles.row, 'row')}> <div className={classNames(styles.row, 'row')}>
{columns.map(({ key, render, className, style, cell }, index) => ( {columns.map(({ key, render, className, style, cell }, index) => (

View File

@ -1,7 +1,15 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import styles from './Tag.module.css'; import styles from './Tag.module.css';
export default function Tag({ className, children }) { function Tag({ className, children }) {
return <span className={classNames(styles.tag, className)}>{children}</span>; return <span className={classNames(styles.tag, className)}>{children}</span>;
} }
Tag.propTypes = {
className: PropTypes.string,
children: PropTypes.node,
};
export default Tag;

View File

@ -1,11 +1,12 @@
import React, { useEffect } from 'react'; import React, { useEffect } from 'react';
import PropTypes from 'prop-types';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import { useSpring, animated } from 'react-spring'; import { useSpring, animated } from 'react-spring';
import styles from './Toast.module.css'; import styles from './Toast.module.css';
import Icon from 'components/common/Icon'; import Icon from 'components/common/Icon';
import Close from 'assets/times.svg'; import Close from 'assets/times.svg';
export default function Toast({ message, timeout = 3000, onClose }) { function Toast({ message, timeout = 3000, onClose }) {
const props = useSpring({ const props = useSpring({
opacity: 1, opacity: 1,
transform: 'translate3d(0,0px,0)', transform: 'translate3d(0,0px,0)',
@ -24,3 +25,11 @@ export default function Toast({ message, timeout = 3000, onClose }) {
document.getElementById('__modals'), document.getElementById('__modals'),
); );
} }
Toast.propTypes = {
message: PropTypes.node,
timeout: PropTypes.number,
onClose: PropTypes.func,
};
export default Toast;

View File

@ -1,4 +1,5 @@
import React, { useState, useMemo } from 'react'; import React, { useState, useMemo } from 'react';
import PropTypes from 'prop-types';
import ReactTooltip from 'react-tooltip'; import ReactTooltip from 'react-tooltip';
import { ComposableMap, Geographies, Geography, ZoomableGroup } from 'react-simple-maps'; import { ComposableMap, Geographies, Geography, ZoomableGroup } from 'react-simple-maps';
import classNames from 'classnames'; import classNames from 'classnames';
@ -12,7 +13,7 @@ import { useRouter } from 'next/router';
const geoUrl = '/world-110m.json'; const geoUrl = '/world-110m.json';
export default function WorldMap({ data, className }) { function WorldMap({ data, className }) {
const { basePath } = useRouter(); const { basePath } = useRouter();
const [tooltip, setTooltip] = useState(); const [tooltip, setTooltip] = useState();
const [theme] = useTheme(); const [theme] = useTheme();
@ -89,3 +90,16 @@ export default function WorldMap({ data, className }) {
</div> </div>
); );
} }
WorldMap.propTypes = {
data: PropTypes.arrayOf(
PropTypes.shape({
x: PropTypes.string,
y: PropTypes.number,
z: PropTypes.number,
}),
),
className: PropTypes.string,
};
export default WorldMap;

View File

@ -44,4 +44,7 @@
.header { .header {
padding: 0 15px; padding: 0 15px;
} }
.nav {
font-size: var(--font-size-normal);
}
} }

View File

@ -3,7 +3,7 @@ import classNames from 'classnames';
import ChartJS from 'chart.js'; import ChartJS from 'chart.js';
import Legend from 'components/metrics/Legend'; import Legend from 'components/metrics/Legend';
import { formatLongNumber } from 'lib/format'; import { formatLongNumber } from 'lib/format';
import { dateFormat } from 'lib/lang'; import { dateFormat, timeFormat } from 'lib/lang';
import useLocale from 'hooks/useLocale'; import useLocale from 'hooks/useLocale';
import useTheme from 'hooks/useTheme'; import useTheme from 'hooks/useTheme';
import { DEFAUL_CHART_HEIGHT, DEFAULT_ANIMATION_DURATION, THEME_COLORS } from 'lib/constants'; import { DEFAUL_CHART_HEIGHT, DEFAULT_ANIMATION_DURATION, THEME_COLORS } from 'lib/constants';
@ -44,9 +44,9 @@ export default function BarChart({
switch (unit) { switch (unit) {
case 'minute': case 'minute':
return index % 2 === 0 ? dateFormat(d, 'h:mm', locale) : ''; return index % 2 === 0 ? dateFormat(d, 'H:mm', locale) : '';
case 'hour': case 'hour':
return dateFormat(d, 'ha', locale); return timeFormat(d, locale);
case 'day': case 'day':
if (records > 31) { if (records > 31) {
if (w <= 500) { if (w <= 500) {
@ -131,6 +131,7 @@ export default function BarChart({
minRotation: 0, minRotation: 0,
maxRotation: 0, maxRotation: 0,
fontColor: colors.text, fontColor: colors.text,
autoSkipPadding: 1,
}, },
gridLines: { gridLines: {
display: false, display: false,

View File

@ -10,7 +10,11 @@ export default function CountriesTable({ websiteId, onDataLoad, ...props }) {
const countryNames = useCountryNames(locale); const countryNames = useCountryNames(locale);
function renderLabel({ x }) { function renderLabel({ x }) {
return <div className={locale}>{countryNames[x]}</div>; return (
<div className={locale}>
{countryNames[x] ?? <FormattedMessage id="label.unknown" defaultMessage="Unknown" />}
</div>
);
} }
return ( return (

View File

@ -2,6 +2,7 @@ import React, { useState } from 'react';
import { FixedSizeList } from 'react-window'; import { FixedSizeList } from 'react-window';
import { useSpring, animated, config } from 'react-spring'; import { useSpring, animated, config } from 'react-spring';
import classNames from 'classnames'; import classNames from 'classnames';
import { FormattedMessage } from 'react-intl';
import NoData from 'components/common/NoData'; import NoData from 'components/common/NoData';
import { formatNumber, formatLongNumber } from 'lib/format'; import { formatNumber, formatLongNumber } from 'lib/format';
import styles from './DataTable.module.css'; import styles from './DataTable.module.css';
@ -27,7 +28,11 @@ export default function DataTable({
return ( return (
<AnimatedRow <AnimatedRow
key={label} key={label}
label={renderLabel ? renderLabel(row) : label} label={
renderLabel
? renderLabel(row)
: label ?? <FormattedMessage id="label.unknown" defaultMessage="Unknown" />
}
value={value} value={value}
percent={percent} percent={percent}
animate={animate && !virtualize} animate={animate && !virtualize}

View File

@ -1,6 +1,5 @@
import React from 'react'; import React from 'react';
import MetricsTable from './MetricsTable'; import MetricsTable from './MetricsTable';
import { deviceFilter } from 'lib/filters';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import { getDeviceMessage } from 'components/messages'; import { getDeviceMessage } from 'components/messages';
@ -12,7 +11,6 @@ export default function DevicesTable({ websiteId, ...props }) {
type="device" type="device"
metric={<FormattedMessage id="metrics.visitors" defaultMessage="Visitors" />} metric={<FormattedMessage id="metrics.visitors" defaultMessage="Visitors" />}
websiteId={websiteId} websiteId={websiteId}
dataFilter={deviceFilter}
renderLabel={({ x }) => getDeviceMessage(x)} renderLabel={({ x }) => getDeviceMessage(x)}
/> />
); );

View File

@ -1,18 +1,46 @@
import React from 'react'; import React, { useState } from 'react';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import MetricsTable from './MetricsTable'; import MetricsTable from './MetricsTable';
import Tag from 'components/common/Tag'; import Tag from 'components/common/Tag';
import DropDown from 'components/common/DropDown';
import { eventTypeFilter } from 'lib/filters';
import styles from './EventsTable.module.css';
const EVENT_FILTER_DEFAULT = {
value: 'EVENT_FILTER_DEFAULT',
label: <FormattedMessage id="label.all-events" defaultMessage="All events" />,
};
export default function EventsTable({ websiteId, ...props }) { export default function EventsTable({ websiteId, ...props }) {
const [eventType, setEventType] = useState(EVENT_FILTER_DEFAULT.value);
const [eventTypes, setEventTypes] = useState([]);
const dropDownOptions = [EVENT_FILTER_DEFAULT, ...eventTypes.map(t => ({ value: t, label: t }))];
function handleDataLoad(data) {
setEventTypes([...new Set(data.map(({ x }) => x.split('\t')[0]))]);
props.onDataLoad(data);
}
return ( return (
<MetricsTable <>
{...props} {eventTypes?.length > 1 && (
title={<FormattedMessage id="metrics.events" defaultMessage="Events" />} <div className={styles.filter}>
type="event" <DropDown value={eventType} options={dropDownOptions} onChange={setEventType} />
metric={<FormattedMessage id="metrics.actions" defaultMessage="Actions" />} </div>
websiteId={websiteId} )}
renderLabel={({ x }) => <Label value={x} />} <MetricsTable
/> {...props}
title={<FormattedMessage id="metrics.events" defaultMessage="Events" />}
type="event"
metric={<FormattedMessage id="metrics.actions" defaultMessage="Actions" />}
websiteId={websiteId}
dataFilter={eventTypeFilter}
filterOptions={eventType === EVENT_FILTER_DEFAULT.value ? [] : [eventType]}
renderLabel={({ x }) => <Label value={x} />}
onDataLoad={handleDataLoad}
/>
</>
); );
} }

View File

@ -0,0 +1,6 @@
.filter {
display: flex;
justify-content: flex-start;
align-items: center;
margin-bottom: 15px;
}

View File

@ -11,8 +11,6 @@
@media only screen and (max-width: 992px) { @media only screen and (max-width: 992px) {
.bar { .bar {
justify-content: space-between; justify-content: space-between;
} overflow: auto;
.bar > div:nth-child(n + 3) {
display: none;
} }
} }

View File

@ -1,6 +1,5 @@
import React from 'react'; import React from 'react';
import MetricsTable from './MetricsTable'; import MetricsTable from './MetricsTable';
import { osFilter } from 'lib/filters';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
export default function OSTable({ websiteId, ...props }) { export default function OSTable({ websiteId, ...props }) {
@ -11,7 +10,6 @@ export default function OSTable({ websiteId, ...props }) {
type="os" type="os"
metric={<FormattedMessage id="metrics.visitors" defaultMessage="Visitors" />} metric={<FormattedMessage id="metrics.visitors" defaultMessage="Visitors" />}
websiteId={websiteId} websiteId={websiteId}
dataFilter={osFilter}
/> />
); );
} }

View File

@ -5,6 +5,7 @@
"label.administrator": "Administrator", "label.administrator": "Administrator",
"label.all": "Alle", "label.all": "Alle",
"label.all-websites": "Alle Webseiten", "label.all-websites": "Alle Webseiten",
"label.all-events": "Alle Ereignisse",
"label.back": "Zurück", "label.back": "Zurück",
"label.cancel": "Abbrechen", "label.cancel": "Abbrechen",
"label.change-password": "Passwort ändern", "label.change-password": "Passwort ändern",
@ -38,7 +39,7 @@
"label.passwords-dont-match": "Passwörter stimmen nicht überein", "label.passwords-dont-match": "Passwörter stimmen nicht überein",
"label.profile": "Profil", "label.profile": "Profil",
"label.realtime": "Echtzeit", "label.realtime": "Echtzeit",
"label.realtime-logs": "Echtzeit Logs", "label.realtime-logs": "Echtzeit-Protokoll",
"label.refresh": "Aktualisieren", "label.refresh": "Aktualisieren",
"label.required": "Erforderlich", "label.required": "Erforderlich",
"label.reset": "Zurücksetzen", "label.reset": "Zurücksetzen",
@ -57,23 +58,23 @@
"label.view-details": "Details anzeigen", "label.view-details": "Details anzeigen",
"label.websites": "Webseiten", "label.websites": "Webseiten",
"message.active-users": "{x} {x, plural, one {aktiver Besucher} other {aktive Besucher}}", "message.active-users": "{x} {x, plural, one {aktiver Besucher} other {aktive Besucher}}",
"message.confirm-delete": "Sind sie sich sicher {target} zu löschen?", "message.confirm-delete": "Sind Sie sich sicher {target} zu löschen?",
"message.copied": "In Zwischenablage kopiert!", "message.copied": "In Zwischenablage kopiert!",
"message.delete-warning": "Alle zugehörigen Daten werden auch gelöscht.", "message.delete-warning": "Alle zugehörigen Daten werden ebenfalls gelöscht.",
"message.failure": "Es ist ein Fehler aufgetreten.", "message.failure": "Es ist ein Fehler aufgetreten.",
"message.get-share-url": "Freigabe-URL abrufen", "message.get-share-url": "Freigabe-URL abrufen",
"message.get-tracking-code": "Erstelle Tracking Kennung", "message.get-tracking-code": "Erstelle Tracking Kennung",
"message.go-to-settings": "Zu den Einstellungen", "message.go-to-settings": "Zu den Einstellungen",
"message.incorrect-username-password": "Falsches Passwort oder Benutzername.", "message.incorrect-username-password": "Falsches Passwort oder Benutzername.",
"message.log.visitor": "Besucher aus {country} benutzt {browser} auf {os} {device}", "message.log.visitor": "Besucher aus {country} benutzt {browser} auf {os} {device}",
"message.new-version-available": "Eine neue Version umami {version} ist verfügbar!", "message.new-version-available": "Eine neue Version von umami {version} ist verfügbar!",
"message.no-data-available": "Keine Daten vorhanden.", "message.no-data-available": "Keine Daten vorhanden.",
"message.no-websites-configured": "Es ist keine Webseite vorhanden.", "message.no-websites-configured": "Es ist keine Webseite vorhanden.",
"message.page-not-found": "Seite nicht gefunden.", "message.page-not-found": "Seite nicht gefunden.",
"message.powered-by": "Ermöglicht durch {name}", "message.powered-by": "Betrieben durch {name}",
"message.save-success": "Erfolgreich gespeichert.", "message.save-success": "Erfolgreich gespeichert.",
"message.share-url": "Dies ist die öffentliche URL zum Teilen für {target}.", "message.share-url": "Dies ist die öffentliche URL zum Teilen für {target}.",
"message.track-stats": "Um die Statistiken für {target} zu übermitteln, platzieren Sie bitte den folgenden Quelltext im {head} ihrer Homepage.", "message.track-stats": "Um die Statistiken für {target} zu übermitteln, platzieren Sie bitte den folgenden Quelltext im {head} ihrer Webseite.",
"message.type-delete": "Geben Sie {delete} in das Feld unten ein um zu bestätigen.", "message.type-delete": "Geben Sie {delete} in das Feld unten ein um zu bestätigen.",
"metrics.actions": "Aktionen", "metrics.actions": "Aktionen",
"metrics.average-visit-time": "Durchschn. Besuchszeit", "metrics.average-visit-time": "Durchschn. Besuchszeit",
@ -92,7 +93,7 @@
"metrics.operating-systems": "Betriebssysteme", "metrics.operating-systems": "Betriebssysteme",
"metrics.page-views": "Seitenaufrufe", "metrics.page-views": "Seitenaufrufe",
"metrics.pages": "Seiten", "metrics.pages": "Seiten",
"metrics.referrers": "Referrers", "metrics.referrers": "Referrer",
"metrics.unique-visitors": "Eindeutige Besucher", "metrics.unique-visitors": "Eindeutige Besucher",
"metrics.views": "Aufrufe", "metrics.views": "Aufrufe",
"metrics.visitors": "Besucher" "metrics.visitors": "Besucher"

View File

@ -5,6 +5,7 @@
"label.administrator": "Administrator", "label.administrator": "Administrator",
"label.all": "All", "label.all": "All",
"label.all-websites": "All websites", "label.all-websites": "All websites",
"label.all-events": "All events",
"label.back": "Back", "label.back": "Back",
"label.cancel": "Cancel", "label.cancel": "Cancel",
"label.change-password": "Change password", "label.change-password": "Change password",

View File

@ -5,6 +5,7 @@
"label.administrator": "Administrador", "label.administrator": "Administrador",
"label.all": "Todos", "label.all": "Todos",
"label.all-websites": "Todos los sitios", "label.all-websites": "Todos los sitios",
"label.all-events": "Todos los eventos",
"label.back": "Atrás", "label.back": "Atrás",
"label.cancel": "Cancelar", "label.cancel": "Cancelar",
"label.change-password": "Cambiar contraseña", "label.change-password": "Cambiar contraseña",

View File

@ -5,6 +5,7 @@
"label.administrator": "Administrateur", "label.administrator": "Administrateur",
"label.all": "Tout", "label.all": "Tout",
"label.all-websites": "Tous les sites web", "label.all-websites": "Tous les sites web",
"label.all-events": "Tous les événements",
"label.back": "Retour", "label.back": "Retour",
"label.cancel": "Annuler", "label.cancel": "Annuler",
"label.change-password": "Changer le mot de passe", "label.change-password": "Changer le mot de passe",

View File

@ -13,8 +13,8 @@
"label.current-password": "目前密码", "label.current-password": "目前密码",
"label.custom-range": "自定义时间段", "label.custom-range": "自定义时间段",
"label.dashboard": "仪表板", "label.dashboard": "仪表板",
"label.date-range": "多日", "label.date-range": "时间段",
"label.default-date-range": "默认日期范围", "label.default-date-range": "默认时间段",
"label.delete": "删除", "label.delete": "删除",
"label.delete-account": "删除账户", "label.delete-account": "删除账户",
"label.delete-website": "删除网站", "label.delete-website": "删除网站",
@ -23,7 +23,7 @@
"label.edit": "编辑", "label.edit": "编辑",
"label.edit-account": "编辑账户", "label.edit-account": "编辑账户",
"label.edit-website": "编辑网站", "label.edit-website": "编辑网站",
"label.enable-share-url": "激活共享链接", "label.enable-share-url": "启用共享链接",
"label.invalid": "输入无效", "label.invalid": "输入无效",
"label.invalid-domain": "无效域名", "label.invalid-domain": "无效域名",
"label.last-days": "最近 {x} 天", "label.last-days": "最近 {x} 天",
@ -57,30 +57,30 @@
"label.view-details": "查看更多", "label.view-details": "查看更多",
"label.websites": "网站", "label.websites": "网站",
"message.active-users": "当前在线 {x} 人", "message.active-users": "当前在线 {x} 人",
"message.confirm-delete": "你确定要删除{target}吗?", "message.confirm-delete": "你确定要删除 {target} 吗?",
"message.copied": "复制成功!", "message.copied": "复制成功",
"message.delete-warning": "所有相关数据将会被删除.", "message.delete-warning": "所有相关数据将会被删除",
"message.failure": "出现错误.", "message.failure": "出现错误",
"message.get-share-url": "获共享链接", "message.get-share-url": "获共享链接",
"message.get-tracking-code": "获跟踪代码", "message.get-tracking-code": "获跟踪代码",
"message.go-to-settings": "去设置", "message.go-to-settings": "去设置",
"message.incorrect-username-password": "用户名密码不正确.", "message.incorrect-username-password": "用户名或密码不正确。",
"message.log.visitor": "来自 {country} 的访客在搭载 {os} 的 {device} 上使用 {browser} 进行访问.", "message.log.visitor": "来自 {country} 的访客在搭载 {os} 的 {device} 上使用 {browser} 浏览器进行访问。",
"message.new-version-available": "umami 有新版本 {version} 发布啦!", "message.new-version-available": "umami 有新版本 {version} 发布啦!",
"message.no-data-available": "无可用数据.", "message.no-data-available": "无可用数据",
"message.no-websites-configured": "你还没有设置任何网站.", "message.no-websites-configured": "你还没有设置任何网站",
"message.page-not-found": "网页未找到.", "message.page-not-found": "网页未找到",
"message.powered-by": "运行 {name}", "message.powered-by": "由 {name} 提供支持",
"message.save-success": "成功保存.", "message.save-success": "保存成功。",
"message.share-url": "这是 {target} 的共享链接.", "message.share-url": "这是 {target} 的共享链接",
"message.track-stats": "把以下代码放到你的网站的{head}部分来收集{target}的数据.", "message.track-stats": "把以下代码放到你的网站的 {head} 部分来收集 {target} 的数据。",
"message.type-delete": "在下面空格输入{delete}确认", "message.type-delete": "在下方输入框输入 {delete} 以确认删除。",
"metrics.actions": "用户行为", "metrics.actions": "用户行为",
"metrics.average-visit-time": "平均访问时间", "metrics.average-visit-time": "平均访问时间",
"metrics.bounce-rate": "跳出率", "metrics.bounce-rate": "跳出率",
"metrics.browsers": "浏览器", "metrics.browsers": "浏览器",
"metrics.countries": "国家", "metrics.countries": "国家",
"metrics.device.desktop": "台式机", "metrics.device.desktop": "桌面电脑",
"metrics.device.laptop": "笔记本", "metrics.device.laptop": "笔记本",
"metrics.device.mobile": "手机", "metrics.device.mobile": "手机",
"metrics.device.tablet": "平板", "metrics.device.tablet": "平板",
@ -90,10 +90,10 @@
"metrics.filter.domain-only": "只看域名", "metrics.filter.domain-only": "只看域名",
"metrics.filter.raw": "原始", "metrics.filter.raw": "原始",
"metrics.operating-systems": "操作系统", "metrics.operating-systems": "操作系统",
"metrics.page-views": "页面量", "metrics.page-views": "页面浏览量",
"metrics.pages": "网页", "metrics.pages": "网页",
"metrics.referrers": "指入域名", "metrics.referrers": "来源域名",
"metrics.unique-visitors": "独立访客", "metrics.unique-visitors": "独立访客",
"metrics.views": "页面流量", "metrics.views": "浏览量",
"metrics.visitors": "独立访客" "metrics.visitors": "访客"
} }

View File

@ -80,7 +80,7 @@ export const POSTGRESQL_DATE_FORMATS = {
year: 'YYYY-01-01', year: 'YYYY-01-01',
}; };
export const DOMAIN_REGEX = /localhost(:\d{1,5})?|((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}/; export const DOMAIN_REGEX = /^localhost(:\d{1,5})?|((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}$/;
export const DESKTOP_SCREEN_WIDTH = 1920; export const DESKTOP_SCREEN_WIDTH = 1920;
export const LAPTOP_SCREEN_WIDTH = 1024; export const LAPTOP_SCREEN_WIDTH = 1024;

View File

@ -113,12 +113,18 @@ export const refFilter = (data, { domain, domainOnly, raw }) => {
return Object.keys(map).map(key => ({ x: key, y: map[key], w: links[key] })); return Object.keys(map).map(key => ({ x: key, y: map[key], w: links[key] }));
}; };
export const browserFilter = data => export const browserFilter = data => data.map(({ x, y }) => ({ x: BROWSERS[x] ?? x, y }));
data.map(({ x, y }) => ({ x: BROWSERS[x] || x, y })).filter(({ x }) => x);
export const osFilter = data => data.filter(({ x }) => x); export const eventTypeFilter = (data, types) => {
if (!types || types.length === 0) {
return data;
}
export const deviceFilter = data => data.filter(({ x }) => x); return data.filter(({ x }) => {
const [event] = x.split('\t');
return types.some(type => type === event);
});
};
export const percentFilter = data => { export const percentFilter = data => {
const total = data.reduce((n, { y }) => n + y, 0); const total = data.reduce((n, { y }) => n + y, 0);

View File

@ -118,6 +118,11 @@ export const dateLocales = {
'it-IT': it, 'it-IT': it,
}; };
const timeFormats = {
// https://date-fns.org/v2.17.0/docs/format
'en-US': 'ha',
};
export const menuOptions = [ export const menuOptions = [
{ label: '中文', value: 'zh-CN', display: 'cn' }, { label: '中文', value: 'zh-CN', display: 'cn' },
{ label: '中文(繁體)', value: 'zh-TW', display: 'tw' }, { label: '中文(繁體)', value: 'zh-TW', display: 'tw' },
@ -152,3 +157,7 @@ export const menuOptions = [
export function dateFormat(date, str, locale) { export function dateFormat(date, str, locale) {
return format(date, str, { locale: dateLocales[locale] || enUS }); return format(date, str, { locale: dateLocales[locale] || enUS });
} }
export function timeFormat(date, locale = 'en-US') {
return format(date, timeFormats[locale] || 'p', { locale: dateLocales[locale] });
}

View File

@ -1,6 +1,6 @@
{ {
"name": "umami", "name": "umami",
"version": "1.12.0", "version": "1.13.0",
"description": "A simple, fast, website analytics alternative to Google Analytics. ", "description": "A simple, fast, website analytics alternative to Google Analytics. ",
"author": "Mike Cao <mike@mikecao.com>", "author": "Mike Cao <mike@mikecao.com>",
"license": "MIT", "license": "MIT",
@ -56,7 +56,7 @@
} }
}, },
"dependencies": { "dependencies": {
"@prisma/client": "2.15.0", "@prisma/client": "2.17.0",
"@reduxjs/toolkit": "^1.5.0", "@reduxjs/toolkit": "^1.5.0",
"bcrypt": "^5.0.0", "bcrypt": "^5.0.0",
"chalk": "^4.1.0", "chalk": "^4.1.0",
@ -75,15 +75,15 @@
"jose": "2.0.3", "jose": "2.0.3",
"maxmind": "^4.3.1", "maxmind": "^4.3.1",
"moment-timezone": "^0.5.32", "moment-timezone": "^0.5.32",
"next": "^10.0.6", "next": "^10.0.7",
"prompts": "2.4.0", "prompts": "2.4.0",
"react": "^17.0.1", "react": "^17.0.1",
"react-dom": "^17.0.1", "react-dom": "^17.0.1",
"react-intl": "^5.12.0", "react-intl": "^5.12.3",
"react-redux": "^7.2.2", "react-redux": "^7.2.2",
"react-simple-maps": "^2.3.0", "react-simple-maps": "^2.3.0",
"react-spring": "^8.0.27", "react-spring": "^8.0.27",
"react-tooltip": "^4.2.11", "react-tooltip": "^4.2.14",
"react-use-measure": "^2.0.3", "react-use-measure": "^2.0.3",
"react-window": "^1.8.6", "react-window": "^1.8.6",
"redux": "^4.0.5", "redux": "^4.0.5",
@ -97,7 +97,7 @@
}, },
"devDependencies": { "devDependencies": {
"@formatjs/cli": "^2.13.16", "@formatjs/cli": "^2.13.16",
"@prisma/cli": "2.15.0", "@prisma/cli": "2.17.0",
"@rollup/plugin-buble": "^0.21.3", "@rollup/plugin-buble": "^0.21.3",
"@rollup/plugin-node-resolve": "^11.1.1", "@rollup/plugin-node-resolve": "^11.1.1",
"@rollup/plugin-replace": "^2.3.4", "@rollup/plugin-replace": "^2.3.4",
@ -105,14 +105,14 @@
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"del": "^6.0.0", "del": "^6.0.0",
"dotenv-cli": "^4.0.0", "dotenv-cli": "^4.0.0",
"eslint": "^7.19.0", "eslint": "^7.20.0",
"eslint-config-prettier": "^7.2.0", "eslint-config-prettier": "^7.2.0",
"eslint-plugin-prettier": "^3.3.1", "eslint-plugin-prettier": "^3.3.1",
"eslint-plugin-react": "^7.22.0", "eslint-plugin-react": "^7.22.0",
"eslint-plugin-react-hooks": "^4.2.0", "eslint-plugin-react-hooks": "^4.2.0",
"extract-react-intl-messages": "^4.1.1", "extract-react-intl-messages": "^4.1.1",
"husky": "^4.3.8", "husky": "^4.3.8",
"lint-staged": "^10.5.3", "lint-staged": "^10.5.4",
"loadtest": "5.1.2", "loadtest": "5.1.2",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"postcss-flexbugs-fixes": "^5.0.2", "postcss-flexbugs-fixes": "^5.0.2",
@ -123,7 +123,7 @@
"rollup": "^2.38.3", "rollup": "^2.38.3",
"rollup-plugin-hashbang": "^2.2.2", "rollup-plugin-hashbang": "^2.2.2",
"rollup-plugin-terser": "^7.0.2", "rollup-plugin-terser": "^7.0.2",
"stylelint": "^13.9.0", "stylelint": "^13.10.0",
"stylelint-config-css-modules": "^2.2.0", "stylelint-config-css-modules": "^2.2.0",
"stylelint-config-prettier": "^8.0.1", "stylelint-config-prettier": "^8.0.1",
"stylelint-config-recommended": "^3.0.0", "stylelint-config-recommended": "^3.0.0",

View File

@ -36,6 +36,7 @@ export default function App({ Component, pageProps }) {
<link rel="mask-icon" href="safari-pinned-tab.svg" color="#5bbad5" /> <link rel="mask-icon" href="safari-pinned-tab.svg" color="#5bbad5" />
<meta name="msapplication-TileColor" content="#da532c" /> <meta name="msapplication-TileColor" content="#da532c" />
<meta name="theme-color" content="#ffffff" /> <meta name="theme-color" content="#ffffff" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
</Head> </Head>
<Intl> <Intl>
<Component {...pageProps} /> <Component {...pageProps} />

393
yarn.lock
View File

@ -2,57 +2,6 @@
# yarn lockfile v1 # yarn lockfile v1
"@ampproject/toolbox-core@2.7.4", "@ampproject/toolbox-core@^2.7.1-alpha.0":
version "2.7.4"
resolved "https://registry.yarnpkg.com/@ampproject/toolbox-core/-/toolbox-core-2.7.4.tgz#8355136f16301458ce942acf6c55952c9a415627"
integrity sha512-qpBhcS4urB7IKc+jx2kksN7BuvvwCo7Y3IstapWo+EW+COY5EYAUwb2pil37v3TsaqHKgX//NloFP1SKzGZAnw==
dependencies:
cross-fetch "3.0.6"
lru-cache "6.0.0"
"@ampproject/toolbox-optimizer@2.7.1-alpha.0":
version "2.7.1-alpha.0"
resolved "https://registry.yarnpkg.com/@ampproject/toolbox-optimizer/-/toolbox-optimizer-2.7.1-alpha.0.tgz#1571dcd02608223ff68f6b7223102a123e381197"
integrity sha512-WGPZKVQvHgNYJk1XVJCCmY+NVGTGJtvn0OALDyiegN4FJWOcilQUhCIcjMkZN59u1flz/u+sEKccM5qsROqVyg==
dependencies:
"@ampproject/toolbox-core" "^2.7.1-alpha.0"
"@ampproject/toolbox-runtime-version" "^2.7.1-alpha.0"
"@ampproject/toolbox-script-csp" "^2.5.4"
"@ampproject/toolbox-validator-rules" "^2.7.1-alpha.0"
abort-controller "3.0.0"
cross-fetch "3.0.6"
cssnano-simple "1.2.1"
dom-serializer "1.1.0"
domhandler "3.3.0"
domutils "2.4.2"
htmlparser2 "5.0.1"
https-proxy-agent "5.0.0"
lru-cache "6.0.0"
node-fetch "2.6.1"
normalize-html-whitespace "1.0.0"
postcss "7.0.32"
postcss-safe-parser "4.0.2"
terser "5.5.1"
"@ampproject/toolbox-runtime-version@^2.7.1-alpha.0":
version "2.7.4"
resolved "https://registry.yarnpkg.com/@ampproject/toolbox-runtime-version/-/toolbox-runtime-version-2.7.4.tgz#f49da0dab122101ef75ed3caed3a0142487b73e1"
integrity sha512-SAdOUOERp42thVNWaBJlnFvFVvnacMVnz5z9LyUZHSnoL1EqrAW5Sz5jv+Ly+gkA8NYsEaUxAdSCBAzE9Uzb4Q==
dependencies:
"@ampproject/toolbox-core" "2.7.4"
"@ampproject/toolbox-script-csp@^2.5.4":
version "2.5.4"
resolved "https://registry.yarnpkg.com/@ampproject/toolbox-script-csp/-/toolbox-script-csp-2.5.4.tgz#d8b7b91a678ae8f263cb36d9b74e441b7d633aad"
integrity sha512-+knTYetI5nWllRZ9wFcj7mYxelkiiFVRAAW/hl0ad8EnKHMH82tRlk40CapEnUHhp6Er5sCYkumQ8dngs3Q4zQ==
"@ampproject/toolbox-validator-rules@^2.7.1-alpha.0":
version "2.7.4"
resolved "https://registry.yarnpkg.com/@ampproject/toolbox-validator-rules/-/toolbox-validator-rules-2.7.4.tgz#a58b5eca723f6c3557ac83b696de0247f5f03ce4"
integrity sha512-z3JRcpIZLLdVC9XVe7YTZuB3a/eR9s2SjElYB9AWRdyJyL5Jt7+pGNv4Uwh1uHVoBXsWEVQzNOWSNtrO3mSwZA==
dependencies:
cross-fetch "3.0.6"
"@babel/code-frame@7.12.11": "@babel/code-frame@7.12.11":
version "7.12.11" version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
@ -1259,10 +1208,10 @@
"@formatjs/ecma402-abstract" "1.5.2" "@formatjs/ecma402-abstract" "1.5.2"
tslib "^2.0.1" tslib "^2.0.1"
"@formatjs/intl@1.6.6": "@formatjs/intl@1.6.8":
version "1.6.6" version "1.6.8"
resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.6.6.tgz#e95e9e317da45005b944d154c24417cce2fd7814" resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.6.8.tgz#c147cb3b5779e5a37bda791bc09be97a863d249a"
integrity sha512-j9J4HG6hJ++aZFj2zCCh4QBSMyoxwqc2R4YyBBix9lzpALNjTW3xPkvhjV3KWN+zujRy89utSqWF+LqxxTO7LA== integrity sha512-cN4pUXFoUvbbLk9nq46QkDTSLzh8KN2ddK+Fi3py9Yv28xFQBl1HrSIZM4P8CFolzfoB3i7HsdI/yq0WocOx1A==
dependencies: dependencies:
"@formatjs/ecma402-abstract" "1.5.2" "@formatjs/ecma402-abstract" "1.5.2"
"@formatjs/intl-datetimeformat" "3.2.7" "@formatjs/intl-datetimeformat" "3.2.7"
@ -1270,8 +1219,8 @@
"@formatjs/intl-listformat" "5.0.5" "@formatjs/intl-listformat" "5.0.5"
"@formatjs/intl-relativetimeformat" "8.0.4" "@formatjs/intl-relativetimeformat" "8.0.4"
fast-memoize "^2.5.2" fast-memoize "^2.5.2"
intl-messageformat "9.4.6" intl-messageformat "9.4.7"
intl-messageformat-parser "6.3.1" intl-messageformat-parser "6.3.2"
tslib "^2.0.1" tslib "^2.0.1"
"@formatjs/ts-transformer@2.12.11": "@formatjs/ts-transformer@2.12.11":
@ -1311,20 +1260,20 @@
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.0.tgz#6c9eafc78c1529248f8f4d92b0799a712b6052c6" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.0.tgz#6c9eafc78c1529248f8f4d92b0799a712b6052c6"
integrity sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw== integrity sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==
"@next/env@10.0.6": "@next/env@10.0.7":
version "10.0.6" version "10.0.7"
resolved "https://registry.yarnpkg.com/@next/env/-/env-10.0.6.tgz#e3c845491a8b0fffda219b5bda84b361b8b2f9c2" resolved "https://registry.yarnpkg.com/@next/env/-/env-10.0.7.tgz#7b3e87a9029ca37491e2ec25c27593f0906725f9"
integrity sha512-++zgrcSL9SprjWKBbO3YuVj/8CTmxJl+zLErW/Kbr2VCT0u12SrBcMKvD236lEGs5/qUgeBfU3Dvmr6MASWrtA== integrity sha512-/vnz2SL/mk3Tei58WfRtVnvz5xHmAqcBmZL5sTBEy1CZG6OtZGNx0qAFCjtVkeJ5m1Bh4Ut+WFh/RF333wx8Sg==
"@next/polyfill-module@10.0.6": "@next/polyfill-module@10.0.7":
version "10.0.6" version "10.0.7"
resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-10.0.6.tgz#9d4c651456d90b5bafb3d9a3a93100d309d47746" resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-10.0.7.tgz#ec45ec1f28f47beed15ed67dffc907edd7143094"
integrity sha512-Sk3HYFxiI3AyIhw7Nnc5un//duCthAP2XtPb4N1SamymOU2QSb8I1zkcsxVIlZRvftdXikQQgra6Ck2zfJRxpA== integrity sha512-HxqzRpoSgmZP0kRIWwH+e0SgtAXqJ0VkYtwWcsQFED8+xF4Eqn+7Twyp4uE6hutC8gr8IFSFqH+DEYhRtg1ltQ==
"@next/react-dev-overlay@10.0.6": "@next/react-dev-overlay@10.0.7":
version "10.0.6" version "10.0.7"
resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-10.0.6.tgz#9e9828cfd75a62e852a3d1861e605c92d97c4ff4" resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-10.0.7.tgz#5fe777011cab75ec09ad539ee61bb95ab5a2bdeb"
integrity sha512-KbxpyVT6gr1KZ7JoFDKGNM0hK7CxPkIC14j/gYgR6qSOhxGs3GEIBScJRXfKD7LNPMgVgQtaJlBYlEJ7aQu1xg== integrity sha512-yq71MDHVqN2N+IqOvZDiFsMpQrBcymrdpTx1ShhAADX7cWQvW4dhcIir4BbfrS10vS1LLz/3a8uKZkGdNoJj3w==
dependencies: dependencies:
"@babel/code-frame" "7.12.11" "@babel/code-frame" "7.12.11"
anser "1.4.9" anser "1.4.9"
@ -1338,10 +1287,10 @@
stacktrace-parser "0.1.10" stacktrace-parser "0.1.10"
strip-ansi "6.0.0" strip-ansi "6.0.0"
"@next/react-refresh-utils@10.0.6": "@next/react-refresh-utils@10.0.7":
version "10.0.6" version "10.0.7"
resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-10.0.6.tgz#896a182654d54eec6b6374251d834199efa70081" resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-10.0.7.tgz#866ce30fe2f321e011255e81ed5d55eeda05894b"
integrity sha512-4BF+8PyzDcYpumQJ22yBUjVP/CL2KLPM+3K3ZQb61HvmIptB/t+jFnH2ew8S7ORQNu/caVQC6wP5wAfOtpJNsg== integrity sha512-d/71vtQglv6m7sh4W1O9drc2hYti7UnAdEXfBLZAS354g2S80lvCRGIhbDrMx4w0rpShoxBIZboE2++LihAESg==
"@nodelib/fs.scandir@2.1.3": "@nodelib/fs.scandir@2.1.3":
version "2.1.3" version "2.1.3"
@ -1381,29 +1330,29 @@
resolved "https://registry.yarnpkg.com/@panva/asn1.js/-/asn1.js-1.0.0.tgz#dd55ae7b8129e02049f009408b97c61ccf9032f6" resolved "https://registry.yarnpkg.com/@panva/asn1.js/-/asn1.js-1.0.0.tgz#dd55ae7b8129e02049f009408b97c61ccf9032f6"
integrity sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw== integrity sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==
"@prisma/cli@2.15.0": "@prisma/cli@2.17.0":
version "2.15.0" version "2.17.0"
resolved "https://registry.yarnpkg.com/@prisma/cli/-/cli-2.15.0.tgz#a979a67dbd606a966cf475686170128562590713" resolved "https://registry.yarnpkg.com/@prisma/cli/-/cli-2.17.0.tgz#27a963afc5c846ce77c75c5436c82919bf21b72d"
integrity sha512-sF2mgn5oH5fL9/CKxS0tqojf0rK2BKODlEUqL+2s3YZqvJRSt4iFpiyjgajyd0wyTyv1k9LDHTV0yOD1mXDBsA== integrity sha512-G2Hu15E+dLX/VSj8NJzDPXJzl/ji331w+T97EW5NDIDDoGakSVW7r3xcw9dR4uRnoGtttZ7JhBFjXg6bt1Mb0g==
dependencies: dependencies:
"@prisma/engines" "2.15.0-25.e51dc3b5a9ee790a07104bec1c9477d51740fe54" "@prisma/engines" "2.17.0-35.3c463ebd78b1d21d8fdacdd27899e280cf686223"
"@prisma/client@2.15.0": "@prisma/client@2.17.0":
version "2.15.0" version "2.17.0"
resolved "https://registry.yarnpkg.com/@prisma/client/-/client-2.15.0.tgz#41ee22c60778b54aec0f6d4832c2d35fbf9eb423" resolved "https://registry.yarnpkg.com/@prisma/client/-/client-2.17.0.tgz#e38462796c2e824504763416f5e3a7219d70652d"
integrity sha512-3j4OoLpAGF104KAenUFJM9sU2+4jRP+RlrlYssBHkwBf+/5+2ihSpcmFiWIw1vXNRdmZtivjwhjcVtmjZPJktw== integrity sha512-tzsBxtx9J1epOGCiBeXur1tEz81UIdWg2G/HpDmflXKcv/MJb+KCWSKSsEW49eXcvVwRgxNyxLoCO6CwvjQKcg==
dependencies: dependencies:
"@prisma/engines-version" "2.15.0-25.e51dc3b5a9ee790a07104bec1c9477d51740fe54" "@prisma/engines-version" "2.17.0-35.3c463ebd78b1d21d8fdacdd27899e280cf686223"
"@prisma/engines-version@2.15.0-25.e51dc3b5a9ee790a07104bec1c9477d51740fe54": "@prisma/engines-version@2.17.0-35.3c463ebd78b1d21d8fdacdd27899e280cf686223":
version "2.15.0-25.e51dc3b5a9ee790a07104bec1c9477d51740fe54" version "2.17.0-35.3c463ebd78b1d21d8fdacdd27899e280cf686223"
resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-2.15.0-25.e51dc3b5a9ee790a07104bec1c9477d51740fe54.tgz#d9c887bc8f30d1f107c9021b2565a8672d62622d" resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-2.17.0-35.3c463ebd78b1d21d8fdacdd27899e280cf686223.tgz#9ae6ed4467a0febff8afaf216c1bb67225f51b84"
integrity sha512-KDxk7Zsc9tDoShCE7v+O1SnCUTUkMdfezjbuz9CBvdEBGMtYLgyHaZAO8M038uqy8KjgwV9PzyoLqvVfzfsngg== integrity sha512-9idv5blqPUlvUPVT48eVi3T0RS/NBklUcjrla3jWyV8AYfB2BdaG/Zci7H5ajyYLnfZZHG9tBpP0LcveQCFH8A==
"@prisma/engines@2.15.0-25.e51dc3b5a9ee790a07104bec1c9477d51740fe54": "@prisma/engines@2.17.0-35.3c463ebd78b1d21d8fdacdd27899e280cf686223":
version "2.15.0-25.e51dc3b5a9ee790a07104bec1c9477d51740fe54" version "2.17.0-35.3c463ebd78b1d21d8fdacdd27899e280cf686223"
resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-2.15.0-25.e51dc3b5a9ee790a07104bec1c9477d51740fe54.tgz#3093ace7c09cf694214727c4e67109f2a2d8855a" resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-2.17.0-35.3c463ebd78b1d21d8fdacdd27899e280cf686223.tgz#08bc3633fd27fb1935805ef16c37802ed713db5b"
integrity sha512-AgPxAWtwYhhTNEEsV4lK63HTe9z0GAGL3ofMr2B0TncACmzi9lhdun9TTNie38Oy/3DLfr71TUHKUpV8QjOKUw== integrity sha512-FKjVD6NYbGiQhwas3hA2uMpNchz+Mf3tv5qA8Ci9cAkKHGqt3jWjjUAK9juVBqeOcv4OPimQYMrkRX6SvaxBjg==
"@reduxjs/toolkit@^1.5.0": "@reduxjs/toolkit@^1.5.0":
version "1.5.0" version "1.5.0"
@ -1780,13 +1729,6 @@ abbrev@1:
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
abort-controller@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
dependencies:
event-target-shim "^5.0.0"
acorn-dynamic-import@^4.0.0: acorn-dynamic-import@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948"
@ -1807,13 +1749,6 @@ acorn@^7.1.1, acorn@^7.4.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c"
integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==
agent-base@6:
version "6.0.1"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4"
integrity sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==
dependencies:
debug "4"
agent-base@^4.3.0: agent-base@^4.3.0:
version "4.3.0" version "4.3.0"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
@ -2325,7 +2260,7 @@ camelcase@^6.2.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001093, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001131: caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001131:
version "1.0.30001133" version "1.0.30001133"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001133.tgz#ec564c5495311299eb05245e252d589a84acd95e" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001133.tgz#ec564c5495311299eb05245e252d589a84acd95e"
integrity sha512-s3XAUFaC/ntDb1O3lcw9K8MPeOW7KO3z9+GzAoBxfz1B0VdacXPMKgFUtG4KIsgmnbexmi013s9miVu4h+qMHw== integrity sha512-s3XAUFaC/ntDb1O3lcw9K8MPeOW7KO3z9+GzAoBxfz1B0VdacXPMKgFUtG4KIsgmnbexmi013s9miVu4h+qMHw==
@ -2688,13 +2623,6 @@ cross-env@^7.0.3:
dependencies: dependencies:
cross-spawn "^7.0.1" cross-spawn "^7.0.1"
cross-fetch@3.0.6:
version "3.0.6"
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c"
integrity sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==
dependencies:
node-fetch "2.6.1"
cross-spawn@^6.0.5: cross-spawn@^6.0.5:
version "6.0.5" version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
@ -2810,14 +2738,6 @@ cssesc@^3.0.0:
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
cssnano-preset-simple@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-1.2.1.tgz#8976013114b1fc4718253d30f21aaed1780fb80e"
integrity sha512-B2KahOIFTV6dw5Ioy9jHshTh/vAYNnUB2enyWRgnAEg3oJBjI/035ExpePaMqS2SwpbH7gCgvQqwpMBH6hTJSw==
dependencies:
caniuse-lite "^1.0.30001093"
postcss "^7.0.32"
cssnano-preset-simple@1.2.2: cssnano-preset-simple@1.2.2:
version "1.2.2" version "1.2.2"
resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-1.2.2.tgz#c631bf79ffec7fdfc4069e2f2da3ca67d99d8413" resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-1.2.2.tgz#c631bf79ffec7fdfc4069e2f2da3ca67d99d8413"
@ -2826,14 +2746,6 @@ cssnano-preset-simple@1.2.2:
caniuse-lite "^1.0.30001179" caniuse-lite "^1.0.30001179"
postcss "^7.0.32" postcss "^7.0.32"
cssnano-simple@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-1.2.1.tgz#6de5d9dd75774bc8f31767573410a952c7dd8a12"
integrity sha512-9vOyjw8Dj/T12kIOnXPZ5VnEIo6F3YMaIn0wqJXmn277R58cWpI3AvtdlCBtohX7VAUNYcyk2d0dKcXXkb5I6Q==
dependencies:
cssnano-preset-simple "1.2.1"
postcss "^7.0.32"
cssnano-simple@1.2.2: cssnano-simple@1.2.2:
version "1.2.2" version "1.2.2"
resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-1.2.2.tgz#72c2c3970e67123c3b4130894a30dc1050267007" resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-1.2.2.tgz#72c2c3970e67123c3b4130894a30dc1050267007"
@ -2963,13 +2875,6 @@ debounce@^1.2.0:
resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131"
integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==
debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
dependencies:
ms "2.1.2"
debug@^2.2.0: debug@^2.2.0:
version "2.6.9" version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@ -2984,6 +2889,13 @@ debug@^3.1.0, debug@^3.2.6:
dependencies: dependencies:
ms "^2.1.1" ms "^2.1.1"
debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
dependencies:
ms "2.1.2"
debug@^4.3.1: debug@^4.3.1:
version "4.3.1" version "4.3.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
@ -3140,15 +3052,6 @@ dom-serializer@0:
domelementtype "^2.0.1" domelementtype "^2.0.1"
entities "^2.0.0" entities "^2.0.0"
dom-serializer@1.1.0, dom-serializer@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.1.0.tgz#5f7c828f1bfc44887dc2a315ab5c45691d544b58"
integrity sha512-ox7bvGXt2n+uLWtCRLybYx60IrOlWL/aCebWJk1T0d4m3y2tzf4U3ij9wBMUb6YJZpz06HCCYuyCDveE2xXmzQ==
dependencies:
domelementtype "^2.0.1"
domhandler "^3.0.0"
entities "^2.0.0"
domain-browser@^1.1.1: domain-browser@^1.1.1:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
@ -3164,18 +3067,6 @@ domelementtype@^2.0.1:
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971"
integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA== integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==
domelementtype@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e"
integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==
domhandler@3.3.0, domhandler@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a"
integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==
dependencies:
domelementtype "^2.0.1"
domhandler@^2.3.0: domhandler@^2.3.0:
version "2.4.2" version "2.4.2"
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
@ -3183,29 +3074,6 @@ domhandler@^2.3.0:
dependencies: dependencies:
domelementtype "1" domelementtype "1"
domhandler@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9"
integrity sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==
dependencies:
domelementtype "^2.0.1"
domhandler@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.0.0.tgz#01ea7821de996d85f69029e81fa873c21833098e"
integrity sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==
dependencies:
domelementtype "^2.1.0"
domutils@2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.4.2.tgz#7ee5be261944e1ad487d9aa0616720010123922b"
integrity sha512-NKbgaM8ZJOecTZsIzW5gSuplsX2IWW2mIK7xVr8hTQF2v1CJWTmLZ1HOCh5sH+IzVPAGE5IucooOkvwBRAdowA==
dependencies:
dom-serializer "^1.0.1"
domelementtype "^2.0.1"
domhandler "^3.3.0"
domutils@^1.5.1, domutils@^1.7.0: domutils@^1.5.1, domutils@^1.7.0:
version "1.7.0" version "1.7.0"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
@ -3214,15 +3082,6 @@ domutils@^1.5.1, domutils@^1.7.0:
dom-serializer "0" dom-serializer "0"
domelementtype "1" domelementtype "1"
domutils@^2.4.2:
version "2.4.4"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.4.4.tgz#282739c4b150d022d34699797369aad8d19bbbd3"
integrity sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA==
dependencies:
dom-serializer "^1.0.1"
domelementtype "^2.0.1"
domhandler "^4.0.0"
dotenv-cli@^4.0.0: dotenv-cli@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/dotenv-cli/-/dotenv-cli-4.0.0.tgz#3cdd68b87ccd63c78dbfa72aab2f639bbeba5f4b" resolved "https://registry.yarnpkg.com/dotenv-cli/-/dotenv-cli-4.0.0.tgz#3cdd68b87ccd63c78dbfa72aab2f639bbeba5f4b"
@ -3478,12 +3337,12 @@ eslint-visitor-keys@^2.0.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
eslint@^7.19.0: eslint@^7.20.0:
version "7.19.0" version "7.20.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.19.0.tgz#6719621b196b5fad72e43387981314e5d0dc3f41" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.20.0.tgz#db07c4ca4eda2e2316e7aa57ac7fc91ec550bdc7"
integrity sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg== integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==
dependencies: dependencies:
"@babel/code-frame" "^7.0.0" "@babel/code-frame" "7.12.11"
"@eslint/eslintrc" "^0.3.0" "@eslint/eslintrc" "^0.3.0"
ajv "^6.10.0" ajv "^6.10.0"
chalk "^4.0.0" chalk "^4.0.0"
@ -3495,7 +3354,7 @@ eslint@^7.19.0:
eslint-utils "^2.1.0" eslint-utils "^2.1.0"
eslint-visitor-keys "^2.0.0" eslint-visitor-keys "^2.0.0"
espree "^7.3.1" espree "^7.3.1"
esquery "^1.2.0" esquery "^1.4.0"
esutils "^2.0.2" esutils "^2.0.2"
file-entry-cache "^6.0.0" file-entry-cache "^6.0.0"
functional-red-black-tree "^1.0.1" functional-red-black-tree "^1.0.1"
@ -3603,6 +3462,13 @@ esquery@^1.0.1, esquery@^1.2.0:
dependencies: dependencies:
estraverse "^5.1.0" estraverse "^5.1.0"
esquery@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
dependencies:
estraverse "^5.1.0"
esrecurse@^4.3.0: esrecurse@^4.3.0:
version "4.3.0" version "4.3.0"
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
@ -3635,11 +3501,6 @@ etag@1.8.1:
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
event-target-shim@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
events@^3.0.0: events@^3.0.0:
version "3.2.0" version "3.2.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379"
@ -4161,16 +4022,6 @@ html-tags@^3.1.0:
resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==
htmlparser2@5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-5.0.1.tgz#7daa6fc3e35d6107ac95a4fc08781f091664f6e7"
integrity sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==
dependencies:
domelementtype "^2.0.1"
domhandler "^3.3.0"
domutils "^2.4.2"
entities "^2.0.0"
htmlparser2@^3.10.0: htmlparser2@^3.10.0:
version "3.10.1" version "3.10.1"
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
@ -4199,14 +4050,6 @@ https-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
https-proxy-agent@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
dependencies:
agent-base "6"
debug "4"
https-proxy-agent@^2.2.1: https-proxy-agent@^2.2.1:
version "2.2.4" version "2.2.4"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
@ -4348,10 +4191,10 @@ intl-messageformat-parser@6.1.0:
"@formatjs/ecma402-abstract" "1.5.0" "@formatjs/ecma402-abstract" "1.5.0"
tslib "^2.0.1" tslib "^2.0.1"
intl-messageformat-parser@6.3.1: intl-messageformat-parser@6.3.2:
version "6.3.1" version "6.3.2"
resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-6.3.1.tgz#da343ea34ed061db1597e46885d6f5a8febb68e4" resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-6.3.2.tgz#5104d23b175f1c9aaccacdc98d558930b6890d00"
integrity sha512-/aK5zKeNfVO9OEGji6X8y11J0Xse7cQFVJo4YPJwQ/ts85O2J4QQsxXZBh5mMVHvHuKDDdsX+FY4/YTD9bwoNQ== integrity sha512-n6To2TG0ictSMDBXvenS+BalJDzbIAT/e6ByPXPEBhaouVEaHbqII02gZbusAoEUI3Xq19bKyrDkkOBP0PapIA==
dependencies: dependencies:
"@formatjs/ecma402-abstract" "1.5.2" "@formatjs/ecma402-abstract" "1.5.2"
tslib "^2.0.1" tslib "^2.0.1"
@ -4370,13 +4213,13 @@ intl-messageformat-parser@^6.0.7:
dependencies: dependencies:
"@formatjs/ecma402-abstract" "^1.2.2" "@formatjs/ecma402-abstract" "^1.2.2"
intl-messageformat@9.4.6: intl-messageformat@9.4.7:
version "9.4.6" version "9.4.7"
resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.4.6.tgz#dc447cd338023f7c1ad478bd8c1807691cd4f01b" resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.4.7.tgz#02696a819ade1ae847639335199e3b6d8ba825c9"
integrity sha512-7GSvbRcM2iuWGWoHrvqB/Yu0vvidj3eTbsjFGI9CeYxboPxlmmTGAXGJo9gbOqM5dw6zL0rFFWyMUS1b4yNPMw== integrity sha512-BUGRv2MI2m4CQFcZH09pf+zl1msaCe+G4e63dPT0wEEuySOMfoEilGftOJ/jxnOvDs6udD2OVCRUuv2/xt8bag==
dependencies: dependencies:
fast-memoize "^2.5.2" fast-memoize "^2.5.2"
intl-messageformat-parser "6.3.1" intl-messageformat-parser "6.3.2"
tslib "^2.0.1" tslib "^2.0.1"
is-alphabetical@^1.0.0: is-alphabetical@^1.0.0:
@ -4713,10 +4556,10 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
known-css-properties@^0.20.0: known-css-properties@^0.21.0:
version "0.20.0" version "0.21.0"
resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.20.0.tgz#0570831661b47dd835293218381166090ff60e96" resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.21.0.tgz#15fbd0bbb83447f3ce09d8af247ed47c68ede80d"
integrity sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw== integrity sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==
levn@^0.4.1: levn@^0.4.1:
version "0.4.1" version "0.4.1"
@ -4739,10 +4582,10 @@ lines-and-columns@^1.1.6:
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
lint-staged@^10.5.3: lint-staged@^10.5.4:
version "10.5.3" version "10.5.4"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.3.tgz#c682838b3eadd4c864d1022da05daa0912fb1da5" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.4.tgz#cd153b5f0987d2371fc1d2847a409a2fe705b665"
integrity sha512-TanwFfuqUBLufxCc3RUtFEkFraSPNR3WzWcGF39R3f2J7S9+iF9W0KTVLfSy09lYGmZS5NDCxjNvhGMSJyFCWg== integrity sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==
dependencies: dependencies:
chalk "^4.1.0" chalk "^4.1.0"
cli-truncate "^2.1.0" cli-truncate "^2.1.0"
@ -4944,7 +4787,7 @@ loud-rejection@*, loud-rejection@^2.2.0:
currently-unhandled "^0.4.1" currently-unhandled "^0.4.1"
signal-exit "^3.0.2" signal-exit "^3.0.2"
lru-cache@6.0.0, lru-cache@^6.0.0: lru-cache@^6.0.0:
version "6.0.0" version "6.0.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
@ -5281,18 +5124,17 @@ next-tick@~1.0.0:
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
next@^10.0.6: next@^10.0.7:
version "10.0.6" version "10.0.7"
resolved "https://registry.yarnpkg.com/next/-/next-10.0.6.tgz#1d33723d714c85f282b9bf6ff59dcae40f9252cb" resolved "https://registry.yarnpkg.com/next/-/next-10.0.7.tgz#442f8e1da7454de33b0bbcc1ce5684b923597ee6"
integrity sha512-uM5Yv4Ha9iL6Lbg7Ez36GyJ0YTdRLzXLA9b1REH3rX2Wytw0Ls5qPuFGk4BHSQpQhYx6Z61iA2qPkGl33W4iBg== integrity sha512-We0utmwwfkvO12eLyUZd3tX9VLDE3FPpOaHpH3kqKdUTxJzUKt8FLBXCTm0mwsTKW5XColWG8mJvz2OLu3+3QA==
dependencies: dependencies:
"@ampproject/toolbox-optimizer" "2.7.1-alpha.0"
"@babel/runtime" "7.12.5" "@babel/runtime" "7.12.5"
"@hapi/accept" "5.0.1" "@hapi/accept" "5.0.1"
"@next/env" "10.0.6" "@next/env" "10.0.7"
"@next/polyfill-module" "10.0.6" "@next/polyfill-module" "10.0.7"
"@next/react-dev-overlay" "10.0.6" "@next/react-dev-overlay" "10.0.7"
"@next/react-refresh-utils" "10.0.6" "@next/react-refresh-utils" "10.0.7"
"@opentelemetry/api" "0.14.0" "@opentelemetry/api" "0.14.0"
ast-types "0.13.2" ast-types "0.13.2"
browserslist "4.16.1" browserslist "4.16.1"
@ -5433,11 +5275,6 @@ nopt@^4.0.1:
abbrev "1" abbrev "1"
osenv "^0.1.4" osenv "^0.1.4"
normalize-html-whitespace@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz#5e3c8e192f1b06c3b9eee4b7e7f28854c7601e34"
integrity sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA==
normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
version "2.5.0" version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@ -6157,7 +5994,7 @@ postcss-resolve-nested-selector@^0.1.1:
resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e"
integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=
postcss-safe-parser@4.0.2, postcss-safe-parser@^4.0.2: postcss-safe-parser@^4.0.2:
version "4.0.2" version "4.0.2"
resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96"
integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g== integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==
@ -6243,15 +6080,6 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
indexes-of "^1.0.1" indexes-of "^1.0.1"
uniq "^1.0.1" uniq "^1.0.1"
postcss@7.0.32:
version "7.0.32"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d"
integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==
dependencies:
chalk "^2.4.2"
source-map "^0.6.1"
supports-color "^6.1.0"
postcss@8.1.7: postcss@8.1.7:
version "8.1.7" version "8.1.7"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.7.tgz#ff6a82691bd861f3354fd9b17b2332f88171233f" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.7.tgz#ff6a82691bd861f3354fd9b17b2332f88171233f"
@ -6490,21 +6318,21 @@ react-fast-compare@^2.0.1:
resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
react-intl@^5.12.0: react-intl@^5.12.3:
version "5.12.0" version "5.12.3"
resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.12.0.tgz#297868c7a7b8ac568ac457dddbf200a39a19014f" resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.12.3.tgz#edac4339ac28feb71923c5ec5965aa0c51672b4c"
integrity sha512-SWIt2+OFEGR8XjqDYpOBQLKVN3cR+1eJZGlHIAlZWw/562YE4OkXyFlK7e/Gk9KHS4xl9FwCBD7FScjfcDvm0g== integrity sha512-xzqsorTC7LYYS29bokeg3HuEL4gZ4xhrrme7PHx+wum4S6d+TEMERJbdsJTrU95ClWiqZ8u7BsT7Ep+0yTXkyw==
dependencies: dependencies:
"@formatjs/ecma402-abstract" "1.5.2" "@formatjs/ecma402-abstract" "1.5.2"
"@formatjs/intl" "1.6.6" "@formatjs/intl" "1.6.8"
"@formatjs/intl-displaynames" "4.0.5" "@formatjs/intl-displaynames" "4.0.5"
"@formatjs/intl-listformat" "5.0.5" "@formatjs/intl-listformat" "5.0.5"
"@formatjs/intl-relativetimeformat" "8.0.4" "@formatjs/intl-relativetimeformat" "8.0.4"
"@types/hoist-non-react-statics" "^3.3.1" "@types/hoist-non-react-statics" "^3.3.1"
fast-memoize "^2.5.2" fast-memoize "^2.5.2"
hoist-non-react-statics "^3.3.2" hoist-non-react-statics "^3.3.2"
intl-messageformat "9.4.6" intl-messageformat "9.4.7"
intl-messageformat-parser "6.3.1" intl-messageformat-parser "6.3.2"
shallow-equal "^1.2.1" shallow-equal "^1.2.1"
tslib "^2.0.1" tslib "^2.0.1"
@ -6547,10 +6375,10 @@ react-spring@^8.0.27:
"@babel/runtime" "^7.3.1" "@babel/runtime" "^7.3.1"
prop-types "^15.5.8" prop-types "^15.5.8"
react-tooltip@^4.2.11: react-tooltip@^4.2.14:
version "4.2.11" version "4.2.14"
resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-4.2.11.tgz#244d4d1833c583160c4e6c95a8a89e0fb320e18a" resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-4.2.14.tgz#8e06b5926fdf6672e78d8ccadaa16bef40d131d7"
integrity sha512-exREte3mK/qbeuQpFbEL3ImdF5/TSAb+x/T7pkVfKmgVcfQLZKHSgLN+Msv7ZOHxaWNJwuCrSsCAy/iTGoPigg== integrity sha512-hS2kAlpjyH5MXL9DaGKsdmEFCIEuMD2RZXkEJeNjmDe05dHpqj93o5JgpmczAgQFk099+JSsnHUDo7pIOuyMDQ==
dependencies: dependencies:
prop-types "^15.7.2" prop-types "^15.7.2"
uuid "^7.0.3" uuid "^7.0.3"
@ -7151,7 +6979,7 @@ sort-keys@^4.0.0:
dependencies: dependencies:
is-plain-obj "^2.0.0" is-plain-obj "^2.0.0"
source-map-support@~0.5.12, source-map-support@~0.5.19: source-map-support@~0.5.12:
version "0.5.19" version "0.5.19"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
@ -7159,7 +6987,7 @@ source-map-support@~0.5.12, source-map-support@~0.5.19:
buffer-from "^1.0.0" buffer-from "^1.0.0"
source-map "^0.6.0" source-map "^0.6.0"
source-map@0.7.3, source-map@~0.7.2: source-map@0.7.3:
version "0.7.3" version "0.7.3"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
@ -7469,10 +7297,10 @@ stylelint-config-recommended@^3.0.0:
resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657" resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657"
integrity sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ== integrity sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==
stylelint@^13.9.0: stylelint@^13.10.0:
version "13.9.0" version "13.10.0"
resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.9.0.tgz#93921ee6e11d4556b9f31131f485dc813b68e32a" resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.10.0.tgz#67b0c6f378c3fa61aa569a55d38feb8570b0b587"
integrity sha512-VVWH2oixOAxpWL1vH+V42ReCzBjW2AeqskSAbi8+3OjV1Xg3VZkmTcAqBZfRRvJeF4BvYuDLXebW3tIHxgZDEg== integrity sha512-eDuLrL0wzPKbl5/TbNGZcbw0lTIGbDEr5W6lCODvb1gAg0ncbgCRt7oU0C2VFDvbrcY0A3MFZOwltwTRmc0XCw==
dependencies: dependencies:
"@stylelint/postcss-css-in-js" "^0.37.2" "@stylelint/postcss-css-in-js" "^0.37.2"
"@stylelint/postcss-markdown" "^0.36.2" "@stylelint/postcss-markdown" "^0.36.2"
@ -7493,7 +7321,7 @@ stylelint@^13.9.0:
ignore "^5.1.8" ignore "^5.1.8"
import-lazy "^4.0.0" import-lazy "^4.0.0"
imurmurhash "^0.1.4" imurmurhash "^0.1.4"
known-css-properties "^0.20.0" known-css-properties "^0.21.0"
lodash "^4.17.20" lodash "^4.17.20"
log-symbols "^4.0.0" log-symbols "^4.0.0"
mathml-tag-names "^2.1.3" mathml-tag-names "^2.1.3"
@ -7697,15 +7525,6 @@ tar@^6.0.5:
mkdirp "^1.0.3" mkdirp "^1.0.3"
yallist "^4.0.0" yallist "^4.0.0"
terser@5.5.1:
version "5.5.1"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289"
integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==
dependencies:
commander "^2.20.0"
source-map "~0.7.2"
source-map-support "~0.5.19"
terser@^5.0.0: terser@^5.0.0:
version "5.3.2" version "5.3.2"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.2.tgz#f4bea90eb92945b2a028ceef79181b9bb586e7af" resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.2.tgz#f4bea90eb92945b2a028ceef79181b9bb586e7af"