1 ? formatLongNumber(label) : label;
+ return +label > 1000 ? formatLongNumber(label) : label;
}
function renderTooltip(model) {
@@ -109,9 +115,7 @@ export default function BarChart({
responsiveAnimationDuration: 0,
maintainAspectRatio: false,
legend: {
- labels: {
- fontColor: colors.text,
- },
+ display: false,
},
scales: {
xAxes: [
@@ -177,6 +181,10 @@ export default function BarChart({
options.tooltips.custom = renderTooltip;
onUpdate(chart.current);
+
+ chart.current.update();
+
+ forceUpdate();
}
useEffect(() => {
@@ -200,23 +208,8 @@ export default function BarChart({
>
-
- {tooltip ? : null}
-
+
+
>
);
}
-
-const Tooltip = ({ title, value, label, labelColor }) => (
-
-);
diff --git a/components/metrics/BarChart.module.css b/components/metrics/BarChart.module.css
index cd26d3af..aea86a4c 100644
--- a/components/metrics/BarChart.module.css
+++ b/components/metrics/BarChart.module.css
@@ -1,43 +1,3 @@
.chart {
position: relative;
}
-
-.tooltip {
- color: var(--msgColor);
- pointer-events: none;
- z-index: 1;
-}
-
-.content {
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- text-align: center;
-}
-
-.title {
- font-size: var(--font-size-xsmall);
- font-weight: 600;
-}
-
-.metric {
- display: flex;
- justify-content: center;
- align-items: center;
- font-size: var(--font-size-small);
- font-weight: 600;
-}
-
-.dot {
- position: relative;
- overflow: hidden;
- border-radius: 100%;
- margin-right: 8px;
- background: var(--gray50);
-}
-
-.color {
- width: 10px;
- height: 10px;
-}
diff --git a/components/metrics/BrowsersTable.js b/components/metrics/BrowsersTable.js
index 97f9bfbd..12c1087b 100644
--- a/components/metrics/BrowsersTable.js
+++ b/components/metrics/BrowsersTable.js
@@ -3,15 +3,14 @@ import { FormattedMessage } from 'react-intl';
import MetricsTable from './MetricsTable';
import { browserFilter } from 'lib/filters';
-export default function BrowsersTable({ websiteId, token, limit }) {
+export default function BrowsersTable({ websiteId, ...props }) {
return (
}
type="browser"
metric={
}
websiteId={websiteId}
- token={token}
- limit={limit}
dataFilter={browserFilter}
/>
);
diff --git a/components/metrics/ChartTooltip.js b/components/metrics/ChartTooltip.js
new file mode 100644
index 00000000..fb290b66
--- /dev/null
+++ b/components/metrics/ChartTooltip.js
@@ -0,0 +1,26 @@
+import React from 'react';
+import Dot from 'components/common/Dot';
+import styles from './ChartTooltip.module.css';
+import ReactTooltip from 'react-tooltip';
+
+export default function ChartTooltip({ chartId, tooltip }) {
+ if (!tooltip) {
+ return null;
+ }
+
+ const { title, value, label, labelColor } = tooltip;
+
+ return (
+
+
+
+
{title}
+
+
+ {value} {label}
+
+
+
+
+ );
+}
diff --git a/components/metrics/ChartTooltip.module.css b/components/metrics/ChartTooltip.module.css
new file mode 100644
index 00000000..cd26d3af
--- /dev/null
+++ b/components/metrics/ChartTooltip.module.css
@@ -0,0 +1,43 @@
+.chart {
+ position: relative;
+}
+
+.tooltip {
+ color: var(--msgColor);
+ pointer-events: none;
+ z-index: 1;
+}
+
+.content {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ text-align: center;
+}
+
+.title {
+ font-size: var(--font-size-xsmall);
+ font-weight: 600;
+}
+
+.metric {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: var(--font-size-small);
+ font-weight: 600;
+}
+
+.dot {
+ position: relative;
+ overflow: hidden;
+ border-radius: 100%;
+ margin-right: 8px;
+ background: var(--gray50);
+}
+
+.color {
+ width: 10px;
+ height: 10px;
+}
diff --git a/components/metrics/CountriesTable.js b/components/metrics/CountriesTable.js
index d562b464..59d17dfb 100644
--- a/components/metrics/CountriesTable.js
+++ b/components/metrics/CountriesTable.js
@@ -5,7 +5,7 @@ import { FormattedMessage } from 'react-intl';
import useCountryNames from 'hooks/useCountryNames';
import useLocale from 'hooks/useLocale';
-export default function CountriesTable({ websiteId, token, limit, onDataLoad = () => {} }) {
+export default function CountriesTable({ websiteId, onDataLoad, ...props }) {
const [locale] = useLocale();
const countryNames = useCountryNames(locale);
@@ -15,13 +15,12 @@ export default function CountriesTable({ websiteId, token, limit, onDataLoad = (
return (
}
type="country"
metric={
}
websiteId={websiteId}
- token={token}
- limit={limit}
- onDataLoad={data => onDataLoad(percentFilter(data))}
+ onDataLoad={data => onDataLoad?.(percentFilter(data))}
renderLabel={renderLabel}
/>
);
diff --git a/components/metrics/DataTable.js b/components/metrics/DataTable.js
new file mode 100644
index 00000000..5cf9ddb4
--- /dev/null
+++ b/components/metrics/DataTable.js
@@ -0,0 +1,91 @@
+import React, { useState } from 'react';
+import { FixedSizeList } from 'react-window';
+import { useSpring, animated, config } from 'react-spring';
+import classNames from 'classnames';
+import NoData from 'components/common/NoData';
+import { formatNumber, formatLongNumber } from 'lib/format';
+import styles from './DataTable.module.css';
+
+export default function DataTable({
+ data,
+ title,
+ metric,
+ className,
+ renderLabel,
+ height,
+ animate = true,
+ virtualize = false,
+}) {
+ const [format, setFormat] = useState(true);
+ const formatFunc = format ? formatLongNumber : formatNumber;
+
+ const handleSetFormat = () => setFormat(state => !state);
+
+ const getRow = row => {
+ const { x: label, y: value, z: percent } = row;
+
+ return (
+
+ );
+ };
+
+ const Row = ({ index, style }) => {
+ return
{getRow(data[index])}
;
+ };
+
+ return (
+
+
+
{title}
+
+ {metric}
+
+
+
+ {data?.length === 0 && }
+ {virtualize && data.length > 0 ? (
+
+ {Row}
+
+ ) : (
+ data.map(row => getRow(row))
+ )}
+
+
+ );
+}
+
+const AnimatedRow = ({ label, value = 0, percent, animate, format, onClick }) => {
+ const props = useSpring({
+ width: percent,
+ y: value,
+ from: { width: 0, y: 0 },
+ config: animate ? config.default : { duration: 0 },
+ });
+
+ return (
+
+
{label}
+
+
{props.y?.interpolate(format)}
+
+
+
`${n}%`) }}
+ />
+
+ {props.width.interpolate(n => `${n.toFixed(0)}%`)}
+
+
+
+ );
+};
diff --git a/components/metrics/DataTable.module.css b/components/metrics/DataTable.module.css
new file mode 100644
index 00000000..79a60577
--- /dev/null
+++ b/components/metrics/DataTable.module.css
@@ -0,0 +1,95 @@
+.table {
+ position: relative;
+ font-size: var(--font-size-small);
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+}
+
+.body {
+ position: relative;
+ overflow: auto;
+}
+
+.header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ line-height: 40px;
+}
+
+.title {
+ display: flex;
+ font-weight: 600;
+ font-size: var(--font-size-normal);
+}
+
+.metric {
+ font-size: var(--font-size-small);
+ font-weight: 600;
+ text-align: center;
+ width: 100px;
+ cursor: pointer;
+}
+
+.row {
+ position: relative;
+ height: 30px;
+ line-height: 30px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 5px;
+ overflow: hidden;
+}
+
+.label {
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ flex: 2;
+}
+
+.label a {
+ color: inherit;
+ text-decoration: none;
+}
+
+.label a:hover {
+ color: var(--primary400);
+}
+
+.label:empty {
+ color: #b3b3b3;
+}
+
+.label:empty:before {
+ content: 'Unknown';
+}
+
+.value {
+ width: 50px;
+ text-align: right;
+ margin-right: 10px;
+ font-weight: 600;
+ cursor: pointer;
+}
+
+.percent {
+ position: relative;
+ width: 50px;
+ color: var(--gray600);
+ border-left: 1px solid var(--gray600);
+ padding-left: 10px;
+ z-index: 1;
+}
+
+.bar {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 30px;
+ opacity: 0.1;
+ background: var(--primary400);
+ z-index: -1;
+}
diff --git a/components/metrics/DevicesTable.js b/components/metrics/DevicesTable.js
index 7d87d1c1..52b6b5fc 100644
--- a/components/metrics/DevicesTable.js
+++ b/components/metrics/DevicesTable.js
@@ -4,15 +4,14 @@ import { deviceFilter } from 'lib/filters';
import { FormattedMessage } from 'react-intl';
import { getDeviceMessage } from 'components/messages';
-export default function DevicesTable({ websiteId, token, limit }) {
+export default function DevicesTable({ websiteId, ...props }) {
return (
}
type="device"
metric={
}
websiteId={websiteId}
- token={token}
- limit={limit}
dataFilter={deviceFilter}
renderLabel={({ x }) => getDeviceMessage(x)}
/>
diff --git a/components/metrics/EventsChart.js b/components/metrics/EventsChart.js
index 113c6f56..68556c96 100644
--- a/components/metrics/EventsChart.js
+++ b/components/metrics/EventsChart.js
@@ -5,29 +5,36 @@ import { getDateArray, getDateLength } from 'lib/date';
import useFetch from 'hooks/useFetch';
import useDateRange from 'hooks/useDateRange';
import useTimezone from 'hooks/useTimezone';
-import { EVENT_COLORS } from 'lib/constants';
-import usePageQuery from '../../hooks/usePageQuery';
+import usePageQuery from 'hooks/usePageQuery';
+import useShareToken from 'hooks/useShareToken';
+import { EVENT_COLORS, TOKEN_HEADER } from 'lib/constants';
-export default function EventsChart({ websiteId, token }) {
+export default function EventsChart({ websiteId, className, token }) {
const [dateRange] = useDateRange(websiteId);
const { startDate, endDate, unit, modified } = dateRange;
const [timezone] = useTimezone();
const { query } = usePageQuery();
+ const shareToken = useShareToken();
- const { data } = useFetch(
+ const { data, loading } = useFetch(
`/api/website/${websiteId}/events`,
{
- start_at: +startDate,
- end_at: +endDate,
- unit,
- tz: timezone,
- url: query.url,
- token,
+ params: {
+ start_at: +startDate,
+ end_at: +endDate,
+ unit,
+ tz: timezone,
+ url: query.url,
+ token,
+ },
+ headers: { [TOKEN_HEADER]: shareToken?.token },
},
- { update: [modified] },
+ [modified],
);
+
const datasets = useMemo(() => {
if (!data) return [];
+ if (loading) return data;
const map = data.reduce((obj, { x, t, y }) => {
if (!obj[x]) {
@@ -44,7 +51,7 @@ export default function EventsChart({ websiteId, token }) {
});
return Object.keys(map).map((key, index) => {
- const color = tinycolor(EVENT_COLORS[index]);
+ const color = tinycolor(EVENT_COLORS[index % EVENT_COLORS.length]);
return {
label: key,
data: map[key],
@@ -54,15 +61,7 @@ export default function EventsChart({ websiteId, token }) {
borderWidth: 1,
};
});
- }, [data]);
-
- function handleCreate(options) {
- const legend = {
- position: 'bottom',
- };
-
- options.legend = legend;
- }
+ }, [data, loading]);
function handleUpdate(chart) {
chart.data.datasets = datasets;
@@ -77,11 +76,13 @@ export default function EventsChart({ websiteId, token }) {
return (
);
diff --git a/components/metrics/EventsTable.js b/components/metrics/EventsTable.js
index 9a7a09cb..c415a3e9 100644
--- a/components/metrics/EventsTable.js
+++ b/components/metrics/EventsTable.js
@@ -1,19 +1,17 @@
import React from 'react';
import { FormattedMessage } from 'react-intl';
import MetricsTable from './MetricsTable';
-import styles from './EventsTable.module.css';
+import Tag from 'components/common/Tag';
-export default function EventsTable({ websiteId, token, limit, onDataLoad }) {
+export default function EventsTable({ websiteId, ...props }) {
return (
}
type="event"
metric={
}
websiteId={websiteId}
- token={token}
- limit={limit}
renderLabel={({ x }) =>
}
- onDataLoad={onDataLoad}
/>
);
}
@@ -22,7 +20,7 @@ const Label = ({ value }) => {
const [event, label] = value.split(':');
return (
<>
-
{event}
+
{event}
{label}
>
);
diff --git a/components/metrics/Legend.js b/components/metrics/Legend.js
new file mode 100644
index 00000000..a40ff411
--- /dev/null
+++ b/components/metrics/Legend.js
@@ -0,0 +1,40 @@
+import React from 'react';
+import classNames from 'classnames';
+import Dot from 'components/common/Dot';
+import useLocale from 'hooks/useLocale';
+import styles from './Legend.module.css';
+import useForceUpdate from '../../hooks/useForceUpdate';
+
+export default function Legend({ chart }) {
+ const [locale] = useLocale();
+ const forceUpdate = useForceUpdate();
+
+ function handleClick(index) {
+ const meta = chart.getDatasetMeta(index);
+
+ meta.hidden = meta.hidden === null ? !chart.data.datasets[index].hidden : null;
+
+ chart.update();
+
+ forceUpdate();
+ }
+
+ if (!chart?.legend?.legendItems.find(({ text }) => text)) {
+ return null;
+ }
+
+ return (
+
+ {chart.legend.legendItems.map(({ text, fillStyle, datasetIndex, hidden }) => (
+
handleClick(datasetIndex)}
+ >
+
+ {text}
+
+ ))}
+
+ );
+}
diff --git a/components/metrics/Legend.module.css b/components/metrics/Legend.module.css
new file mode 100644
index 00000000..faa197e3
--- /dev/null
+++ b/components/metrics/Legend.module.css
@@ -0,0 +1,21 @@
+.legend {
+ display: flex;
+ justify-content: center;
+ flex-wrap: wrap;
+ margin-top: 10px;
+}
+
+.label {
+ display: flex;
+ align-items: center;
+ font-size: var(--font-size-xsmall);
+ cursor: pointer;
+}
+
+.label + .label {
+ margin-left: 20px;
+}
+
+.hidden {
+ color: var(--gray400);
+}
diff --git a/components/metrics/MetricsBar.js b/components/metrics/MetricsBar.js
index b7a47a10..886ee5f0 100644
--- a/components/metrics/MetricsBar.js
+++ b/components/metrics/MetricsBar.js
@@ -5,12 +5,15 @@ import Loading from 'components/common/Loading';
import ErrorMessage from 'components/common/ErrorMessage';
import useFetch from 'hooks/useFetch';
import useDateRange from 'hooks/useDateRange';
-import { formatShortTime, formatNumber, formatLongNumber } from 'lib/format';
import usePageQuery from 'hooks/usePageQuery';
+import useShareToken from 'hooks/useShareToken';
+import { formatShortTime, formatNumber, formatLongNumber } from 'lib/format';
+import { TOKEN_HEADER } from 'lib/constants';
import MetricCard from './MetricCard';
import styles from './MetricsBar.module.css';
-export default function MetricsBar({ websiteId, token, className }) {
+export default function MetricsBar({ websiteId, className }) {
+ const shareToken = useShareToken();
const [dateRange] = useDateRange(websiteId);
const { startDate, endDate, modified } = dateRange;
const [format, setFormat] = useState(true);
@@ -19,16 +22,16 @@ export default function MetricsBar({ websiteId, token, className }) {
} = usePageQuery();
const { data, error, loading } = useFetch(
- `/api/website/${websiteId}/metrics`,
+ `/api/website/${websiteId}/stats`,
{
- start_at: +startDate,
- end_at: +endDate,
- url,
- token,
- },
- {
- update: [modified],
+ params: {
+ start_at: +startDate,
+ end_at: +endDate,
+ url,
+ },
+ headers: { [TOKEN_HEADER]: shareToken?.token },
},
+ [url, modified],
);
const formatFunc = format ? formatLongNumber : formatNumber;
diff --git a/components/metrics/MetricsTable.js b/components/metrics/MetricsTable.js
index 6850a3bf..25bb4a08 100644
--- a/components/metrics/MetricsTable.js
+++ b/components/metrics/MetricsTable.js
@@ -1,34 +1,32 @@
-import React, { useState, useMemo } from 'react';
+import React, { useMemo } from 'react';
import { FormattedMessage } from 'react-intl';
-import { FixedSizeList } from 'react-window';
-import { useSpring, animated, config } from 'react-spring';
+import firstBy from 'thenby';
import classNames from 'classnames';
import Link from 'components/common/Link';
import Loading from 'components/common/Loading';
-import NoData from 'components/common/NoData';
import useFetch from 'hooks/useFetch';
import Arrow from 'assets/arrow-right.svg';
import { percentFilter } from 'lib/filters';
-import { formatNumber, formatLongNumber } from 'lib/format';
import useDateRange from 'hooks/useDateRange';
import usePageQuery from 'hooks/usePageQuery';
+import useShareToken from 'hooks/useShareToken';
+import ErrorMessage from 'components/common/ErrorMessage';
+import DataTable from './DataTable';
+import { DEFAULT_ANIMATION_DURATION, TOKEN_HEADER } from 'lib/constants';
import styles from './MetricsTable.module.css';
-import ErrorMessage from '../common/ErrorMessage';
export default function MetricsTable({
websiteId,
websiteDomain,
- token,
- title,
- metric,
type,
className,
dataFilter,
filterOptions,
limit,
- renderLabel,
- onDataLoad = () => {},
+ onDataLoad,
+ ...props
}) {
+ const shareToken = useShareToken();
const [dateRange] = useDateRange(websiteId);
const { startDate, endDate, modified } = dateRange;
const {
@@ -38,117 +36,51 @@ export default function MetricsTable({
} = usePageQuery();
const { data, loading, error } = useFetch(
- `/api/website/${websiteId}/rankings`,
+ `/api/website/${websiteId}/metrics`,
{
- type,
- start_at: +startDate,
- end_at: +endDate,
- domain: websiteDomain,
- url,
- token,
+ params: {
+ type,
+ start_at: +startDate,
+ end_at: +endDate,
+ domain: websiteDomain,
+ url,
+ },
+ onDataLoad,
+ delay: DEFAULT_ANIMATION_DURATION,
+ headers: { [TOKEN_HEADER]: shareToken?.token },
},
- { onDataLoad, delay: 300, update: [modified] },
+ [modified],
);
- const [format, setFormat] = useState(true);
- const formatFunc = format ? formatLongNumber : formatNumber;
- const shouldAnimate = limit > 0;
- const rankings = useMemo(() => {
+ const filteredData = useMemo(() => {
if (data) {
const items = percentFilter(dataFilter ? dataFilter(data, filterOptions) : data);
if (limit) {
- return items.filter((e, i) => i < limit);
+ return items.filter((e, i) => i < limit).sort(firstBy('y', -1).thenBy('x'));
}
- return items;
+ return items.sort(firstBy('y', -1).thenBy('x'));
}
return [];
}, [data, error, dataFilter, filterOptions]);
- const handleSetFormat = () => setFormat(state => !state);
-
- const getRow = row => {
- const { x: label, y: value, z: percent } = row;
- return (
-
- );
- };
-
- const Row = ({ index, style }) => {
- return
{getRow(rankings[index])}
;
- };
-
return (
{!data && loading &&
}
{error &&
}
- {data && !error && (
- <>
-
-
{title}
-
- {metric}
-
-
-
- {rankings?.length === 0 && }
- {limit
- ? rankings.map(row => getRow(row))
- : rankings.length > 0 && (
-
- {Row}
-
- )}
-
-
- {limit && (
- }
- href={router.pathname}
- as={resolve({ view: type })}
- size="small"
- iconRight
- >
-
-
- )}
-
- >
- )}
+ {data && !error &&
}
+
+ {data && !error && limit && (
+ }
+ href={router.pathname}
+ as={resolve({ view: type })}
+ size="small"
+ iconRight
+ >
+
+
+ )}
+
);
}
-
-const AnimatedRow = ({ label, value = 0, percent, animate, format, onClick }) => {
- const props = useSpring({
- width: percent,
- y: value,
- from: { width: 0, y: 0 },
- config: animate ? config.default : { duration: 0 },
- });
-
- return (
-
-
{label}
-
-
{props.y?.interpolate(format)}
-
-
-
`${n}%`) }}
- />
-
- {props.width.interpolate(n => `${n.toFixed(0)}%`)}
-
-
-
- );
-};
diff --git a/components/metrics/MetricsTable.module.css b/components/metrics/MetricsTable.module.css
index bbba0009..e93f536e 100644
--- a/components/metrics/MetricsTable.module.css
+++ b/components/metrics/MetricsTable.module.css
@@ -6,95 +6,6 @@
flex-direction: column;
}
-.header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- line-height: 40px;
-}
-
-.title {
- display: flex;
- font-weight: 600;
- font-size: var(--font-size-normal);
-}
-
-.metric {
- font-size: var(--font-size-small);
- font-weight: 600;
- text-align: center;
- width: 100px;
- cursor: pointer;
-}
-
-.row {
- position: relative;
- height: 30px;
- line-height: 30px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 5px;
- overflow: hidden;
-}
-
-.label {
- white-space: nowrap;
- text-overflow: ellipsis;
- overflow: hidden;
- flex: 2;
-}
-
-.label a {
- color: inherit;
- text-decoration: none;
-}
-
-.label a:hover {
- color: var(--primary400);
-}
-
-.label:empty {
- color: #b3b3b3;
-}
-
-.label:empty:before {
- content: 'Unknown';
-}
-
-.value {
- width: 50px;
- text-align: right;
- margin-right: 10px;
- font-weight: 600;
- cursor: pointer;
-}
-
-.percent {
- position: relative;
- width: 50px;
- color: var(--gray600);
- border-left: 1px solid var(--gray600);
- padding-left: 10px;
- z-index: 1;
-}
-
-.bar {
- position: absolute;
- top: 0;
- left: 0;
- height: 30px;
- opacity: 0.1;
- background: var(--primary400);
- z-index: -1;
-}
-
-.body {
- position: relative;
- flex: 1;
- overflow: hidden;
-}
-
.footer {
display: flex;
justify-content: center;
diff --git a/components/metrics/OSTable.js b/components/metrics/OSTable.js
index 63d4739c..c1790e17 100644
--- a/components/metrics/OSTable.js
+++ b/components/metrics/OSTable.js
@@ -3,15 +3,14 @@ import MetricsTable from './MetricsTable';
import { osFilter } from 'lib/filters';
import { FormattedMessage } from 'react-intl';
-export default function OSTable({ websiteId, token, limit }) {
+export default function OSTable({ websiteId, ...props }) {
return (
}
type="os"
metric={
}
websiteId={websiteId}
- token={token}
- limit={limit}
dataFilter={osFilter}
/>
);
diff --git a/components/metrics/PagesTable.js b/components/metrics/PagesTable.js
index 0acda811..c137589f 100644
--- a/components/metrics/PagesTable.js
+++ b/components/metrics/PagesTable.js
@@ -2,15 +2,16 @@ import React, { useState } from 'react';
import { FormattedMessage } from 'react-intl';
import classNames from 'classnames';
import Link from 'next/link';
-import ButtonGroup from 'components/common/ButtonGroup';
-import ButtonLayout from 'components/layout/ButtonLayout';
+import FilterButtons from 'components/common/FilterButtons';
import { urlFilter } from 'lib/filters';
-import { FILTER_COMBINED, FILTER_RAW } from 'lib/constants';
import usePageQuery from 'hooks/usePageQuery';
import MetricsTable from './MetricsTable';
import styles from './PagesTable.module.css';
-export default function PagesTable({ websiteId, token, websiteDomain, limit, showFilters }) {
+export const FILTER_COMBINED = 0;
+export const FILTER_RAW = 1;
+
+export default function PagesTable({ websiteId, websiteDomain, showFilters, ...props }) {
const [filter, setFilter] = useState(FILTER_COMBINED);
const {
resolve,
@@ -48,20 +49,11 @@ export default function PagesTable({ websiteId, token, websiteDomain, limit, sho
type="url"
metric={
}
websiteId={websiteId}
- token={token}
- limit={limit}
dataFilter={urlFilter}
filterOptions={{ domain: websiteDomain, raw: filter === FILTER_RAW }}
renderLabel={renderLink}
+ {...props}
/>
>
);
}
-
-const FilterButtons = ({ buttons, selected, onClick }) => {
- return (
-
-
-
- );
-};
diff --git a/components/metrics/PageviewsChart.js b/components/metrics/PageviewsChart.js
index 9120a6c3..e9d30449 100644
--- a/components/metrics/PageviewsChart.js
+++ b/components/metrics/PageviewsChart.js
@@ -4,9 +4,18 @@ import tinycolor from 'tinycolor2';
import CheckVisible from 'components/helpers/CheckVisible';
import BarChart from './BarChart';
import useTheme from 'hooks/useTheme';
-import { THEME_COLORS } from 'lib/constants';
+import { THEME_COLORS, DEFAULT_ANIMATION_DURATION } from 'lib/constants';
-export default function PageviewsChart({ websiteId, data, unit, records, className, loading }) {
+export default function PageviewsChart({
+ websiteId,
+ data,
+ unit,
+ records,
+ className,
+ loading,
+ animationDuration = DEFAULT_ANIMATION_DURATION,
+ ...props
+}) {
const intl = useIntl();
const [theme] = useTheme();
const primaryColor = tinycolor(THEME_COLORS[theme].primary);
@@ -26,7 +35,7 @@ export default function PageviewsChart({ websiteId, data, unit, records, classNa
data: { datasets },
} = chart;
- datasets[0].data = data.uniques;
+ datasets[0].data = data.sessions;
datasets[0].label = intl.formatMessage({
id: 'metrics.unique-visitors',
defaultMessage: 'Unique visitors',
@@ -36,8 +45,6 @@ export default function PageviewsChart({ websiteId, data, unit, records, classNa
id: 'metrics.page-views',
defaultMessage: 'Page views',
});
-
- chart.update();
};
if (!data) {
@@ -48,6 +55,7 @@ export default function PageviewsChart({ websiteId, data, unit, records, classNa
{visible => (
diff --git a/components/metrics/RealtimeChart.js b/components/metrics/RealtimeChart.js
new file mode 100644
index 00000000..6acfd653
--- /dev/null
+++ b/components/metrics/RealtimeChart.js
@@ -0,0 +1,60 @@
+import React, { useMemo, useRef } from 'react';
+import { format, parseISO, startOfMinute, subMinutes, isBefore } from 'date-fns';
+import PageviewsChart from './PageviewsChart';
+import { getDateArray } from 'lib/date';
+import { DEFAULT_ANIMATION_DURATION, REALTIME_RANGE } from 'lib/constants';
+
+function mapData(data) {
+ let last = 0;
+ const arr = [];
+
+ data.reduce((obj, val) => {
+ const { created_at } = val;
+ const t = startOfMinute(parseISO(created_at));
+ if (t.getTime() > last) {
+ obj = { t: format(t, 'yyyy-LL-dd HH:mm:00'), y: 1 };
+ arr.push(obj);
+ last = t;
+ } else {
+ obj.y += 1;
+ }
+ return obj;
+ }, {});
+
+ return arr;
+}
+
+export default function RealtimeChart({ data, unit, ...props }) {
+ const endDate = startOfMinute(new Date());
+ const startDate = subMinutes(endDate, REALTIME_RANGE);
+ const prevEndDate = useRef(endDate);
+
+ const chartData = useMemo(() => {
+ if (data) {
+ return {
+ pageviews: getDateArray(mapData(data.pageviews), startDate, endDate, unit),
+ sessions: getDateArray(mapData(data.sessions), startDate, endDate, unit),
+ };
+ }
+ return { pageviews: [], sessions: [] };
+ }, [data]);
+
+ // Don't animate the bars shifting over because it looks weird
+ const animationDuration = useMemo(() => {
+ if (isBefore(prevEndDate.current, endDate)) {
+ prevEndDate.current = endDate;
+ return 0;
+ }
+ return DEFAULT_ANIMATION_DURATION;
+ }, [data]);
+
+ return (
+
+ );
+}
diff --git a/components/metrics/RealtimeHeader.js b/components/metrics/RealtimeHeader.js
new file mode 100644
index 00000000..c501937a
--- /dev/null
+++ b/components/metrics/RealtimeHeader.js
@@ -0,0 +1,49 @@
+import React from 'react';
+import { FormattedMessage } from 'react-intl';
+import PageHeader from '../layout/PageHeader';
+import DropDown from '../common/DropDown';
+import MetricCard from './MetricCard';
+import styles from './RealtimeHeader.module.css';
+
+export default function RealtimeHeader({ websites, data, websiteId, onSelect }) {
+ const options = [
+ { label: , value: 0 },
+ ].concat(
+ websites.map(({ name, website_id }, index) => ({
+ label: name,
+ value: website_id,
+ divider: index === 0,
+ })),
+ );
+
+ const { pageviews, sessions, events, countries } = data;
+
+ return (
+ <>
+
+
+
+
+
+
+
+ }
+ value={pageviews.length}
+ />
+ }
+ value={sessions.length}
+ />
+ }
+ value={events.length}
+ />
+ }
+ value={countries.length}
+ />
+
+ >
+ );
+}
diff --git a/components/metrics/RealtimeHeader.module.css b/components/metrics/RealtimeHeader.module.css
new file mode 100644
index 00000000..28aabc3e
--- /dev/null
+++ b/components/metrics/RealtimeHeader.module.css
@@ -0,0 +1,4 @@
+.metrics {
+ display: flex;
+ margin-bottom: 10px;
+}
diff --git a/components/metrics/RealtimeLog.js b/components/metrics/RealtimeLog.js
new file mode 100644
index 00000000..6c39dd87
--- /dev/null
+++ b/components/metrics/RealtimeLog.js
@@ -0,0 +1,183 @@
+import React, { useMemo, useState } from 'react';
+import { FormattedMessage, useIntl } from 'react-intl';
+import { FixedSizeList } from 'react-window';
+import firstBy from 'thenby';
+import { format } from 'date-fns';
+import Icon from 'components/common/Icon';
+import Tag from 'components/common/Tag';
+import Dot from 'components/common/Dot';
+import FilterButtons from 'components/common/FilterButtons';
+import { devices } from 'components/messages';
+import useLocale from 'hooks/useLocale';
+import useCountryNames from 'hooks/useCountryNames';
+import { BROWSERS } from 'lib/constants';
+import Bolt from 'assets/bolt.svg';
+import Visitor from 'assets/visitor.svg';
+import Eye from 'assets/eye.svg';
+import { stringToColor } from 'lib/format';
+import styles from './RealtimeLog.module.css';
+import NoData from '../common/NoData';
+
+const TYPE_ALL = 0;
+const TYPE_PAGEVIEW = 1;
+const TYPE_SESSION = 2;
+const TYPE_EVENT = 3;
+
+const TYPE_ICONS = {
+ [TYPE_PAGEVIEW]: ,
+ [TYPE_SESSION]: ,
+ [TYPE_EVENT]: ,
+};
+
+export default function RealtimeLog({ data, websites }) {
+ const intl = useIntl();
+ const [locale] = useLocale();
+ const countryNames = useCountryNames(locale);
+ const [filter, setFilter] = useState(TYPE_ALL);
+
+ const logs = useMemo(() => {
+ const { pageviews, sessions, events } = data;
+ const logs = [...pageviews, ...sessions, ...events].sort(firstBy('created_at', -1));
+ if (filter) {
+ return logs.filter(row => getType(row) === filter);
+ }
+ return logs;
+ }, [data, filter]);
+
+ const uuids = useMemo(() => {
+ return data.sessions.reduce((obj, { session_id, session_uuid }) => {
+ obj[session_id] = session_uuid;
+ return obj;
+ }, {});
+ }, [data]);
+
+ const buttons = [
+ {
+ label: ,
+ value: TYPE_ALL,
+ },
+ {
+ label: ,
+ value: TYPE_PAGEVIEW,
+ },
+ {
+ label: ,
+ value: TYPE_SESSION,
+ },
+ {
+ label: ,
+ value: TYPE_EVENT,
+ },
+ ];
+
+ function getType({ view_id, session_id, event_id }) {
+ if (event_id) {
+ return TYPE_EVENT;
+ }
+ if (view_id) {
+ return TYPE_PAGEVIEW;
+ }
+ if (session_id) {
+ return TYPE_SESSION;
+ }
+ return null;
+ }
+
+ function getIcon(row) {
+ return TYPE_ICONS[getType(row)];
+ }
+
+ function getWebsite({ website_id }) {
+ return websites.find(n => n.website_id === website_id)?.name;
+ }
+
+ function getDetail({
+ event_type,
+ event_value,
+ view_id,
+ session_id,
+ url,
+ browser,
+ os,
+ country,
+ device,
+ website_id,
+ }) {
+ if (event_type) {
+ return (
+
+ {event_type} {event_value}
+
+ );
+ }
+ if (view_id) {
+ const domain = getWebsite({ website_id });
+ return (
+
+ {url}
+
+ );
+ }
+ if (session_id) {
+ return (
+ {countryNames[country]},
+ browser: {BROWSERS[browser]},
+ os: {os},
+ device: {intl.formatMessage(devices[device])?.toLowerCase()},
+ }}
+ />
+ );
+ }
+ }
+
+ function getTime({ created_at }) {
+ return format(new Date(created_at), 'h:mm:ss');
+ }
+
+ function getColor(row) {
+ const { session_id } = row;
+
+ return stringToColor(uuids[session_id] || `${session_id}${getWebsite(row)}`);
+ }
+
+ const Row = ({ index, style }) => {
+ const row = logs[index];
+ return (
+
+
+
+
+
{getTime(row)}
+
+
+ {getDetail(row)}
+
+
{getWebsite(row)}
+
+ );
+ };
+
+ return (
+
+
+
+
+
+
+ {logs?.length === 0 && }
+
+ {Row}
+
+
+
+ );
+}
diff --git a/components/metrics/RealtimeLog.module.css b/components/metrics/RealtimeLog.module.css
new file mode 100644
index 00000000..6fb09a64
--- /dev/null
+++ b/components/metrics/RealtimeLog.module.css
@@ -0,0 +1,55 @@
+.table {
+ font-size: var(--font-size-xsmall);
+ overflow: hidden;
+}
+
+.header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 16px;
+ line-height: 40px;
+ font-weight: 600;
+}
+
+.row {
+ display: flex;
+ align-items: center;
+ height: 40px;
+ border-bottom: 1px solid var(--gray300);
+}
+
+.body {
+ overflow: auto;
+}
+
+.icon {
+ margin-right: 10px;
+}
+
+.time {
+ min-width: 60px;
+ overflow: hidden;
+}
+
+.website {
+ text-align: right;
+ padding: 0 20px;
+}
+
+.detail {
+ display: flex;
+ flex: 1;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+
+.row .link {
+ color: var(--gray900);
+ text-decoration: none;
+}
+
+.row .link:hover {
+ color: var(--primary400);
+}
diff --git a/components/metrics/RealtimeViews.js b/components/metrics/RealtimeViews.js
new file mode 100644
index 00000000..f07facef
--- /dev/null
+++ b/components/metrics/RealtimeViews.js
@@ -0,0 +1,100 @@
+import React, { useMemo, useState, useCallback } from 'react';
+import { FormattedMessage } from 'react-intl';
+import firstBy from 'thenby';
+import { percentFilter } from 'lib/filters';
+import DataTable from './DataTable';
+import FilterButtons from 'components/common/FilterButtons';
+
+const FILTER_REFERRERS = 0;
+const FILTER_PAGES = 1;
+
+export default function RealtimeViews({ websiteId, data, websites }) {
+ const { pageviews } = data;
+ const [filter, setFilter] = useState(FILTER_REFERRERS);
+ const domains = useMemo(() => websites.map(({ domain }) => domain), [websites]);
+ const getDomain = useCallback(
+ id => websites.find(({ website_id }) => website_id === id)?.domain,
+ [websites],
+ );
+
+ const buttons = [
+ {
+ label: ,
+ value: FILTER_REFERRERS,
+ },
+ {
+ label: ,
+ value: FILTER_PAGES,
+ },
+ ];
+
+ const [referrers, pages] = useMemo(() => {
+ if (pageviews) {
+ const referrers = percentFilter(
+ pageviews
+ .reduce((arr, { referrer }) => {
+ if (referrer?.startsWith('http')) {
+ const hostname = new URL(referrer).hostname.replace(/^www\./, '');
+
+ if (hostname && !domains.includes(hostname)) {
+ const row = arr.find(({ x }) => x === hostname);
+
+ if (!row) {
+ arr.push({ x: hostname, y: 1 });
+ } else {
+ row.y += 1;
+ }
+ }
+ }
+ return arr;
+ }, [])
+ .sort(firstBy('y', -1)),
+ );
+
+ const pages = percentFilter(
+ pageviews
+ .reduce((arr, { url, website_id }) => {
+ if (url?.startsWith('/')) {
+ if (!websiteId) {
+ url = `${getDomain(website_id)}${url}`;
+ }
+ const row = arr.find(({ x }) => x === url);
+
+ if (!row) {
+ arr.push({ x: url, y: 1 });
+ } else {
+ row.y += 1;
+ }
+ }
+ return arr;
+ }, [])
+ .sort(firstBy('y', -1)),
+ );
+
+ return [referrers, pages];
+ }
+ return [];
+ }, [pageviews]);
+
+ return (
+ <>
+
+ {filter === FILTER_REFERRERS && (
+ }
+ metric={}
+ data={referrers}
+ height={400}
+ />
+ )}
+ {filter === FILTER_PAGES && (
+ }
+ metric={}
+ data={pages}
+ height={400}
+ />
+ )}
+ >
+ );
+}
diff --git a/components/metrics/ReferrersTable.js b/components/metrics/ReferrersTable.js
index df7a8c15..2d51ab74 100644
--- a/components/metrics/ReferrersTable.js
+++ b/components/metrics/ReferrersTable.js
@@ -1,12 +1,14 @@
import React, { useState } from 'react';
import { FormattedMessage } from 'react-intl';
import MetricsTable from './MetricsTable';
+import FilterButtons from 'components/common/FilterButtons';
import { refFilter } from 'lib/filters';
-import ButtonGroup from 'components/common/ButtonGroup';
-import { FILTER_DOMAIN_ONLY, FILTER_COMBINED, FILTER_RAW } from 'lib/constants';
-import ButtonLayout from '../layout/ButtonLayout';
-export default function ReferrersTable({ websiteId, websiteDomain, token, limit, showFilters }) {
+export const FILTER_DOMAIN_ONLY = 0;
+export const FILTER_COMBINED = 1;
+export const FILTER_RAW = 2;
+
+export default function ReferrersTable({ websiteId, websiteDomain, showFilters, ...props }) {
const [filter, setFilter] = useState(FILTER_COMBINED);
const buttons = [
@@ -35,13 +37,12 @@ export default function ReferrersTable({ websiteId, websiteDomain, token, limit,
<>
{showFilters && }
}
type="referrer"
metric={}
websiteId={websiteId}
websiteDomain={websiteDomain}
- token={token}
- limit={limit}
dataFilter={refFilter}
filterOptions={{
domain: websiteDomain,
@@ -53,11 +54,3 @@ export default function ReferrersTable({ websiteId, websiteDomain, token, limit,
>
);
}
-
-const FilterButtons = ({ buttons, selected, onClick }) => {
- return (
-
-
-
- );
-};
diff --git a/components/metrics/WebsiteChart.js b/components/metrics/WebsiteChart.js
index 6a07afe5..0f4b48c3 100644
--- a/components/metrics/WebsiteChart.js
+++ b/components/metrics/WebsiteChart.js
@@ -14,15 +14,18 @@ import { getDateArray, getDateLength } from 'lib/date';
import Times from 'assets/times.svg';
import styles from './WebsiteChart.module.css';
import ErrorMessage from '../common/ErrorMessage';
+import useShareToken from '../../hooks/useShareToken';
+import { TOKEN_HEADER } from '../../lib/constants';
export default function WebsiteChart({
websiteId,
- token,
title,
+ domain,
stickyHeader = false,
showLink = false,
onDataLoad = () => {},
}) {
+ const shareToken = useShareToken();
const [dateRange, setDateRange] = useDateRange(websiteId);
const { startDate, endDate, unit, value, modified } = dateRange;
const [timezone] = useTimezone();
@@ -35,24 +38,27 @@ export default function WebsiteChart({
const { data, loading, error } = useFetch(
`/api/website/${websiteId}/pageviews`,
{
- start_at: +startDate,
- end_at: +endDate,
- unit,
- tz: timezone,
- url,
- token,
+ params: {
+ start_at: +startDate,
+ end_at: +endDate,
+ unit,
+ tz: timezone,
+ url,
+ },
+ onDataLoad,
+ headers: { [TOKEN_HEADER]: shareToken?.token },
},
- { onDataLoad, update: [modified] },
+ [url, modified],
);
- const [pageviews, uniques] = useMemo(() => {
+ const chartData = useMemo(() => {
if (data) {
- return [
- getDateArray(data.pageviews, startDate, endDate, unit),
- getDateArray(data.uniques, startDate, endDate, unit),
- ];
+ return {
+ pageviews: getDateArray(data.pageviews, startDate, endDate, unit),
+ sessions: getDateArray(data.sessions, startDate, endDate, unit),
+ };
}
- return [[], []];
+ return { pageviews: [], sessions: [] };
}, [data]);
function handleCloseFilter() {
@@ -61,7 +67,7 @@ export default function WebsiteChart({
return (
-
+
{url && }
-
+
}
- {title}
-
+
+
+ {title}
+
+
{showLink && (
@@ -24,7 +28,7 @@ export default function WebsiteHeader({ websiteId, token, title, showLink = fals
size="small"
iconRight
>
-
+
)}
diff --git a/components/metrics/WebsiteHeader.module.css b/components/metrics/WebsiteHeader.module.css
index 67d23e61..5b5876c6 100644
--- a/components/metrics/WebsiteHeader.module.css
+++ b/components/metrics/WebsiteHeader.module.css
@@ -1,5 +1,5 @@
.title {
- color: var(--gray-900);
+ color: var(--gray900);
font-size: var(--font-size-large);
line-height: var(--font-size-large);
}
diff --git a/components/pages/RealtimeDashboard.js b/components/pages/RealtimeDashboard.js
new file mode 100644
index 00000000..1a2a3f54
--- /dev/null
+++ b/components/pages/RealtimeDashboard.js
@@ -0,0 +1,158 @@
+import React, { useState, useEffect, useMemo, useCallback } from 'react';
+import { FormattedMessage } from 'react-intl';
+import { subMinutes, startOfMinute } from 'date-fns';
+import firstBy from 'thenby';
+import Page from 'components/layout/Page';
+import GridLayout, { GridRow, GridColumn } from 'components/layout/GridLayout';
+import RealtimeChart from 'components/metrics/RealtimeChart';
+import RealtimeLog from 'components/metrics/RealtimeLog';
+import RealtimeHeader from 'components/metrics/RealtimeHeader';
+import WorldMap from 'components/common/WorldMap';
+import DataTable from 'components/metrics/DataTable';
+import RealtimeViews from 'components/metrics/RealtimeViews';
+import useFetch from 'hooks/useFetch';
+import useLocale from 'hooks/useLocale';
+import useCountryNames from 'hooks/useCountryNames';
+import { percentFilter } from 'lib/filters';
+import { TOKEN_HEADER, REALTIME_RANGE, REALTIME_INTERVAL } from 'lib/constants';
+import styles from './RealtimeDashboard.module.css';
+
+function mergeData(state, data, time) {
+ const ids = state.map(({ __id }) => __id);
+ return state
+ .concat(data.filter(({ __id }) => !ids.includes(__id)))
+ .filter(({ created_at }) => new Date(created_at).getTime() >= time);
+}
+
+function filterWebsite(data, id) {
+ return data.filter(({ website_id }) => website_id === id);
+}
+
+export default function RealtimeDashboard() {
+ const [locale] = useLocale();
+ const countryNames = useCountryNames(locale);
+ const [data, setData] = useState();
+ const [websiteId, setWebsiteId] = useState(0);
+ const { data: init, loading } = useFetch('/api/realtime/init');
+ const { data: updates } = useFetch('/api/realtime/update', {
+ params: { start_at: data?.timestamp },
+ disabled: !init?.websites?.length || !data,
+ interval: REALTIME_INTERVAL,
+ headers: { [TOKEN_HEADER]: init?.token },
+ });
+
+ const renderCountryName = useCallback(
+ ({ x }) => {countryNames[x]},
+ [countryNames],
+ );
+
+ const realtimeData = useMemo(() => {
+ if (data) {
+ const { pageviews, sessions, events } = data;
+
+ if (websiteId) {
+ return {
+ pageviews: filterWebsite(pageviews, websiteId),
+ sessions: filterWebsite(sessions, websiteId),
+ events: filterWebsite(events, websiteId),
+ };
+ }
+ }
+
+ return data;
+ }, [data, websiteId]);
+
+ const countries = useMemo(() => {
+ if (realtimeData?.sessions) {
+ return percentFilter(
+ realtimeData.sessions
+ .reduce((arr, { country }) => {
+ if (country) {
+ const row = arr.find(({ x }) => x === country);
+
+ if (!row) {
+ arr.push({ x: country, y: 1 });
+ } else {
+ row.y += 1;
+ }
+ }
+ return arr;
+ }, [])
+ .sort(firstBy('y', -1)),
+ );
+ }
+ return [];
+ }, [realtimeData?.sessions]);
+
+ useEffect(() => {
+ if (init && !data) {
+ const { websites, data } = init;
+
+ setData({ websites, ...data });
+ }
+ }, [init]);
+
+ useEffect(() => {
+ if (updates) {
+ const { pageviews, sessions, events, timestamp } = updates;
+ const time = subMinutes(startOfMinute(new Date()), REALTIME_RANGE).getTime();
+
+ setData(state => ({
+ ...state,
+ pageviews: mergeData(state.pageviews, pageviews, time),
+ sessions: mergeData(state.sessions, sessions, time),
+ events: mergeData(state.events, events, time),
+ timestamp,
+ }));
+ }
+ }, [updates]);
+
+ if (!init || !data || loading) {
+ return null;
+ }
+
+ const { websites } = data;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+ metric={}
+ data={countries}
+ renderLabel={renderCountryName}
+ height={500}
+ />
+
+
+
+
+
+
+
+ );
+}
diff --git a/components/pages/RealtimeDashboard.module.css b/components/pages/RealtimeDashboard.module.css
new file mode 100644
index 00000000..b9b5a632
--- /dev/null
+++ b/components/pages/RealtimeDashboard.module.css
@@ -0,0 +1,7 @@
+.container {
+ display: flex;
+}
+
+.chart {
+ margin-bottom: 30px;
+}
diff --git a/components/pages/TestConsole.js b/components/pages/TestConsole.js
index f6fa8a23..b715b4a8 100644
--- a/components/pages/TestConsole.js
+++ b/components/pages/TestConsole.js
@@ -7,7 +7,7 @@ import Page from '../layout/Page';
import PageHeader from '../layout/PageHeader';
import useFetch from '../../hooks/useFetch';
import DropDown from '../common/DropDown';
-import styles from './Test.module.css';
+import styles from './TestConsole.module.css';
import WebsiteChart from '../metrics/WebsiteChart';
import EventsChart from '../metrics/EventsChart';
import Button from '../common/Button';
@@ -82,7 +82,12 @@ export default function TestConsole() {
diff --git a/components/pages/Test.module.css b/components/pages/TestConsole.module.css
similarity index 100%
rename from components/pages/Test.module.css
rename to components/pages/TestConsole.module.css
diff --git a/components/pages/WebsiteDetails.js b/components/pages/WebsiteDetails.js
index 66545928..81cde3ad 100644
--- a/components/pages/WebsiteDetails.js
+++ b/components/pages/WebsiteDetails.js
@@ -4,6 +4,7 @@ import classNames from 'classnames';
import WebsiteChart from 'components/metrics/WebsiteChart';
import WorldMap from 'components/common/WorldMap';
import Page from 'components/layout/Page';
+import GridLayout, { GridRow, GridColumn } from 'components/layout/GridLayout';
import MenuLayout from 'components/layout/MenuLayout';
import Link from 'components/common/Link';
import Loading from 'components/common/Loading';
@@ -19,6 +20,8 @@ import EventsTable from '../metrics/EventsTable';
import EventsChart from '../metrics/EventsChart';
import useFetch from 'hooks/useFetch';
import usePageQuery from 'hooks/usePageQuery';
+import useShareToken from 'hooks/useShareToken';
+import { DEFAULT_ANIMATION_DURATION, TOKEN_HEADER } from 'lib/constants';
const views = {
url: PagesTable,
@@ -30,8 +33,11 @@ const views = {
event: EventsTable,
};
-export default function WebsiteDetails({ websiteId, token }) {
- const { data } = useFetch(`/api/website/${websiteId}`, { token });
+export default function WebsiteDetails({ websiteId }) {
+ const shareToken = useShareToken();
+ const { data } = useFetch(`/api/website/${websiteId}`, {
+ headers: { [TOKEN_HEADER]: shareToken?.token },
+ });
const [chartLoaded, setChartLoaded] = useState(false);
const [countryData, setCountryData] = useState();
const [eventsData, setEventsData] = useState();
@@ -50,7 +56,7 @@ export default function WebsiteDetails({ websiteId, token }) {
icon={
}
size="small"
>
-
+
);
@@ -91,7 +97,6 @@ export default function WebsiteDetails({ websiteId, token }) {
const tableProps = {
websiteId,
- token,
websiteDomain: data?.domain,
limit: 10,
};
@@ -100,7 +105,7 @@ export default function WebsiteDetails({ websiteId, token }) {
function handleDataLoad() {
if (!chartLoaded) {
- setTimeout(() => setChartLoaded(true), 300);
+ setTimeout(() => setChartLoaded(true), DEFAULT_ANIMATION_DURATION);
}
}
@@ -114,8 +119,8 @@ export default function WebsiteDetails({ websiteId, token }) {
{!chartLoaded && }
{chartLoaded && !view && (
- <>
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
-
-
-
- 0 })}
- >
-
+
+
+ 0 })}>
+
-
-
-
-
-
- >
+
+
+
+
+
+
)}
- {view && (
+ {view && chartLoaded && (
-
+
)}
diff --git a/components/pages/WebsiteDetails.module.css b/components/pages/WebsiteDetails.module.css
index 750a1ac7..e8dd5399 100644
--- a/components/pages/WebsiteDetails.module.css
+++ b/components/pages/WebsiteDetails.module.css
@@ -26,37 +26,10 @@
transform: rotate(180deg);
}
-.row {
- border-top: 1px solid var(--gray300);
- min-height: 430px;
-}
-
-.row > [class*='col-'] {
- border-left: 1px solid var(--gray300);
- padding: 20px;
-}
-
-.row > [class*='col-']:first-child {
- border-left: 0;
- padding-left: 0;
-}
-
-.row > [class*='col-']:last-child {
- padding-right: 0;
-}
-
.hidden {
display: none;
}
-@media only screen and (max-width: 992px) {
- .row {
- border: 0;
- }
-
- .row > [class*='col-'] {
- border-top: 1px solid var(--gray300);
- border-left: 0;
- padding: 0;
- }
+.eventschart {
+ padding-top: 30px;
}
diff --git a/components/pages/WebsiteList.js b/components/pages/WebsiteList.js
index 73d20c98..03552470 100644
--- a/components/pages/WebsiteList.js
+++ b/components/pages/WebsiteList.js
@@ -9,7 +9,7 @@ import Arrow from 'assets/arrow-right.svg';
import styles from './WebsiteList.module.css';
export default function WebsiteList({ userId }) {
- const { data } = useFetch('/api/websites', { user_id: userId });
+ const { data } = useFetch('/api/websites', { params: { user_id: userId } });
if (!data) {
return null;
@@ -17,9 +17,9 @@ export default function WebsiteList({ userId }) {
return (
- {data.map(({ website_id, name }) => (
+ {data.map(({ website_id, name, domain }) => (
-
+
))}
{data.length === 0 && (
diff --git a/components/settings/AccountSettings.js b/components/settings/AccountSettings.js
index aa206fa9..b2b0011e 100644
--- a/components/settings/AccountSettings.js
+++ b/components/settings/AccountSettings.js
@@ -25,7 +25,7 @@ export default function AccountSettings() {
const [deleteAccount, setDeleteAccount] = useState();
const [saved, setSaved] = useState(0);
const [message, setMessage] = useState();
- const { data } = useFetch(`/api/accounts`, {}, { update: [saved] });
+ const { data } = useFetch(`/api/accounts`, {}, [saved]);
const Checkmark = ({ is_admin }) => (is_admin ? } size="medium" /> : null);
@@ -42,10 +42,10 @@ export default function AccountSettings() {
row.username !== 'admin' ? (
} size="small" onClick={() => setEditAccount(row)}>
-
+
} size="small" onClick={() => setDeleteAccount(row)}>
-
+
) : null;
@@ -98,12 +98,12 @@ export default function AccountSettings() {
} size="small" onClick={() => setAddAccount(true)}>
-
+
{editAccount && (
- }>
+ }>
)}
{addAccount && (
- }>
+ }>
)}
{deleteAccount && (
}
+ title={}
>
>
);
diff --git a/components/settings/LanguageButton.js b/components/settings/LanguageButton.js
index 2d340ed0..14a1aaf1 100644
--- a/components/settings/LanguageButton.js
+++ b/components/settings/LanguageButton.js
@@ -16,7 +16,7 @@ export default function LanguageButton() {
return (
<>
- {locale === 'zh-CN' && (
+ {(locale === 'zh-CN' || locale === 'zh-TW') && (
} size="small" onClick={() => setChangePassword(true)}>
-
+
@@ -57,7 +57,7 @@ export default function ProfileSettings() {
{changePassword && (
}
+ title={
}
>
>
);
diff --git a/components/settings/WebsiteSettings.js b/components/settings/WebsiteSettings.js
index 17fc5952..686605f2 100644
--- a/components/settings/WebsiteSettings.js
+++ b/components/settings/WebsiteSettings.js
@@ -13,6 +13,7 @@ import ShareUrlForm from 'components/forms/ShareUrlForm';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import ButtonLayout from 'components/layout/ButtonLayout';
import Toast from 'components/common/Toast';
+import Favicon from 'components/common/Favicon';
import Pen from 'assets/pen.svg';
import Trash from 'assets/trash.svg';
import Plus from 'assets/plus.svg';
@@ -29,7 +30,7 @@ export default function WebsiteSettings() {
const [showUrl, setShowUrl] = useState();
const [saved, setSaved] = useState(0);
const [message, setMessage] = useState();
- const { data } = useFetch(`/api/websites`, {}, { update: [saved] });
+ const { data } = useFetch(`/api/websites`, {}, [saved]);
const Buttons = row => (
@@ -52,16 +53,17 @@ export default function WebsiteSettings() {
onClick={() => setShowCode(row)}
/>
} size="small" onClick={() => setEditWebsite(row)}>
-
+
} size="small" onClick={() => setDeleteWebsite(row)}>
-
+
);
- const DetailsLink = ({ website_id, name }) => (
+ const DetailsLink = ({ website_id, name, domain }) => (
+
{name}
);
@@ -113,7 +115,7 @@ export default function WebsiteSettings() {
}
>
} size="medium" onClick={() => setAddWebsite(true)}>
-
+
);
@@ -125,23 +127,23 @@ export default function WebsiteSettings() {
} size="small" onClick={() => setAddWebsite(true)}>
-
+
{editWebsite && (
- }>
+ }>
)}
{addWebsite && (
- }>
+ }>
)}
{deleteWebsite && (
}
+ title={}
>
)}
{showCode && (
- }>
+ }>
)}
{showUrl && (
- }>
+ }>
)}
diff --git a/hooks/useFetch.js b/hooks/useFetch.js
index 0eb82b13..7f97d0fb 100644
--- a/hooks/useFetch.js
+++ b/hooks/useFetch.js
@@ -4,24 +4,22 @@ import { get } from 'lib/web';
import { updateQuery } from 'redux/actions/queries';
import { useRouter } from 'next/router';
-export default function useFetch(url, params = {}, options = {}) {
+export default function useFetch(url, options = {}, update = []) {
const dispatch = useDispatch();
const [data, setData] = useState();
const [status, setStatus] = useState();
const [error, setError] = useState();
const [loading, setLoadiing] = useState(false);
+ const [count, setCount] = useState(0);
const { basePath } = useRouter();
- const keys = Object.keys(params)
- .sort()
- .map(key => params[key]);
- const { update = [], onDataLoad = () => {} } = options;
+ const { params = {}, disabled, headers, delay = 0, interval, onDataLoad } = options;
- async function loadData() {
+ async function loadData(params) {
try {
setLoadiing(true);
setError(null);
const time = performance.now();
- const { data, status } = await get(`${basePath}${url}`, params);
+ const { data, status } = await get(`${basePath}${url}`, params, headers);
dispatch(updateQuery({ url, time: performance.now() - time, completed: Date.now() }));
@@ -33,7 +31,7 @@ export default function useFetch(url, params = {}, options = {}) {
}
setStatus(status);
- onDataLoad(data);
+ onDataLoad?.(data);
} catch (e) {
console.error(e);
setError(e);
@@ -43,18 +41,24 @@ export default function useFetch(url, params = {}, options = {}) {
}
useEffect(() => {
- if (url) {
- const { interval, delay = 0 } = options;
+ if (url && !disabled) {
+ const id = setTimeout(() => loadData(params), delay);
- setTimeout(() => loadData(), delay);
+ return () => {
+ clearTimeout(id);
+ };
+ }
+ }, [url, !!disabled, count, ...update]);
- const id = interval ? setInterval(() => loadData(), interval) : null;
+ useEffect(() => {
+ if (interval && !disabled) {
+ const id = setInterval(() => setCount(state => state + 1), interval);
return () => {
clearInterval(id);
};
}
- }, [url, ...keys, ...update]);
+ }, [interval, !!disabled]);
return { data, status, error, loading };
}
diff --git a/hooks/useShareToken.js b/hooks/useShareToken.js
new file mode 100644
index 00000000..16ee11d0
--- /dev/null
+++ b/hooks/useShareToken.js
@@ -0,0 +1,25 @@
+import { useEffect } from 'react';
+import { useDispatch, useSelector } from 'react-redux';
+import { get } from 'lib/web';
+import { setShareToken } from 'redux/actions/app';
+
+export default function useShareToken(shareId) {
+ const dispatch = useDispatch();
+ const shareToken = useSelector(state => state.app.shareToken);
+
+ async function loadToken(id) {
+ const { data } = await get(`/api/share/${id}`);
+
+ if (data) {
+ dispatch(setShareToken(data));
+ }
+ }
+
+ useEffect(() => {
+ if (shareId) {
+ loadToken(shareId);
+ }
+ }, [shareId]);
+
+ return shareToken;
+}
diff --git a/lang-ignore.json b/lang-ignore.json
new file mode 100644
index 00000000..8a01beb9
--- /dev/null
+++ b/lang-ignore.json
@@ -0,0 +1,22 @@
+{
+ "cs-CZ": ["label.reset", "metrics.device.tablet"],
+ "de-DE": [
+ "label.administrator",
+ "label.name",
+ "label.domain",
+ "metrics.device.desktop",
+ "metrics.device.laptop",
+ "metrics.device.tablet",
+ "metrics.referrers"
+ ],
+ "fr-FR": ["metrics.actions", "metrics.pages"],
+ "nb-NO": ["label.administrator", "label.dashboard"],
+ "nl-NL": [
+ "label.administrator",
+ "label.websites",
+ "metrics.browsers",
+ "metrics.device.desktop",
+ "metrics.device.laptop",
+ "metrics.device.tablet"
+ ]
+}
diff --git a/lang/cs-CZ.json b/lang/cs-CZ.json
new file mode 100644
index 00000000..57493e98
--- /dev/null
+++ b/lang/cs-CZ.json
@@ -0,0 +1,99 @@
+{
+ "label.accounts": "Účty",
+ "label.add-account": "Přidat účet",
+ "label.add-website": "Přidat web",
+ "label.administrator": "Administrátor",
+ "label.all": "Vše",
+ "label.all-websites": "Všechny weby",
+ "label.back": "Zpět",
+ "label.cancel": "Zrušit",
+ "label.change-password": "Změnit heslo",
+ "label.confirm-password": "Potvrdit heslo",
+ "label.copy-to-clipboard": "Kopírovat do schránky",
+ "label.current-password": "Aktuální heslo",
+ "label.custom-range": "Vlastní rozsah",
+ "label.dashboard": "Přehled",
+ "label.date-range": "Období",
+ "label.default-date-range": "Výchozí období",
+ "label.delete": "Smazat",
+ "label.delete-account": "Smazat účet",
+ "label.delete-website": "Smazat web",
+ "label.dismiss": "Odejít",
+ "label.domain": "Doména",
+ "label.edit": "Upravit",
+ "label.edit-account": "Upravit účet",
+ "label.edit-website": "Upravit web",
+ "label.enable-share-url": "Povolit sdílení URL",
+ "label.invalid": "Neplatný",
+ "label.invalid-domain": "Neplatná doména",
+ "label.last-days": "Posledních {x} dnů",
+ "label.last-hours": "Posledních {x} hodin",
+ "label.logged-in-as": "Přihlášený jako {username}",
+ "label.login": "Přihlásit",
+ "label.logout": "Odhlásit",
+ "label.more": "Více",
+ "label.name": "Jméno",
+ "label.new-password": "Nové heslo",
+ "label.password": "Heslo",
+ "label.passwords-dont-match": "Hesla se neschodují",
+ "label.profile": "Profil",
+ "label.realtime": "Aktuálně",
+ "label.realtime-logs": "Aktuální záznamy",
+ "label.refresh": "Obnovit",
+ "label.required": "Vyžadováno",
+ "label.reset": "Reset",
+ "label.save": "Uložit",
+ "label.settings": "Nastavení",
+ "label.share-url": "Sdílet URL",
+ "label.single-day": "Jeden den",
+ "label.this-month": "Tento měsíc",
+ "label.this-week": "Tento týden",
+ "label.this-year": "Tento rok",
+ "label.timezone": "Časová zóna",
+ "label.today": "Dnes",
+ "label.tracking-code": "Sledovací kód",
+ "label.unknown": "Neznámý",
+ "label.username": "Uživatelské jméno",
+ "label.view-details": "Zobrazit detaily",
+ "label.websites": "Weby",
+ "message.active-users": "{x} aktuálně {x, plural, one {návštěvník} other {návštěvníci}}",
+ "message.confirm-delete": "Opravdu smazat {target}?",
+ "message.copied": "Zkopírováno!",
+ "message.delete-warning": "Všechna související data budou také smazána.",
+ "message.failure": "Něco se pokazilo.",
+ "message.get-share-url": "Získat sdílené URL",
+ "message.get-tracking-code": "Získat měřící kód",
+ "message.go-to-settings": "Jít do nastavení",
+ "message.incorrect-username-password": "Nesprávné jméno/heslo.",
+ "message.log.visitor": "Návštěvník z {country} s prohlížečem {browser} na {os} {device}",
+ "message.new-version-available": "Nová verze umami {version} je k dispozici!",
+ "message.no-data-available": "Žádná data.",
+ "message.no-websites-configured": "Nemáte nastavený žádný web.",
+ "message.page-not-found": "Stránka nenalezena.",
+ "message.powered-by": "Běží na {name}",
+ "message.save-success": "Úspěšně uloženo.",
+ "message.share-url": "Toto je sdílené URL pro {target}.",
+ "message.track-stats": "Pro sledování návštěv na {target}, přidejte následující kód do {head} části vašeho webu.",
+ "message.type-delete": "Napište {delete} pro potvrzení.",
+ "metrics.actions": "Akce",
+ "metrics.average-visit-time": "Průměrný čas návštěvy",
+ "metrics.bounce-rate": "Okamžité opuštění",
+ "metrics.browsers": "Prohlížeč",
+ "metrics.countries": "Země",
+ "metrics.device.desktop": "Stolní počítač",
+ "metrics.device.laptop": "Přenosný počítač",
+ "metrics.device.mobile": "Mobilní telefon",
+ "metrics.device.tablet": "Tablet",
+ "metrics.devices": "Zařízení",
+ "metrics.events": "Události",
+ "metrics.filter.combined": "Kombinace",
+ "metrics.filter.domain-only": "Domény",
+ "metrics.filter.raw": "Nezpracované",
+ "metrics.operating-systems": "Operační systém",
+ "metrics.page-views": "Zobrazení stránek",
+ "metrics.pages": "Stránky",
+ "metrics.referrers": "Odkazy",
+ "metrics.unique-visitors": "Jedinečné návštěvy",
+ "metrics.views": "Zobrazení",
+ "metrics.visitors": "Návštěvy"
+}
diff --git a/lang/da-DK.json b/lang/da-DK.json
index cd96cb3f..b1b5c512 100644
--- a/lang/da-DK.json
+++ b/lang/da-DK.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Tilføj konto",
- "button.add-website": "Tilføj hjemmeside",
- "button.back": "Tilbage",
- "button.cancel": "Afvis",
- "button.change-password": "Skift adgangskode",
- "button.copy-to-clipboard": "Kopier til udklipsholder",
- "button.date-range": "Datointerval",
- "button.delete": "Slet",
- "button.dismiss": "Dismiss",
- "button.edit": "Rediger",
- "button.login": "Log ind",
- "button.more": "Mere",
- "button.refresh": "Opdater",
- "button.reset": "Reset",
- "button.save": "Gem",
- "button.single-day": "Enkelt dag",
- "button.view-details": "Vis detajler",
"label.accounts": "Kontoer",
+ "label.add-account": "Tilføj konto",
+ "label.add-website": "Tilføj hjemmeside",
"label.administrator": "Administrator",
+ "label.all": "All",
+ "label.all-websites": "All websites",
+ "label.back": "Tilbage",
+ "label.cancel": "Afvis",
+ "label.change-password": "Skift adgangskode",
"label.confirm-password": "Godkendt adgangskode",
+ "label.copy-to-clipboard": "Kopier til udklipsholder",
"label.current-password": "Nuværende adgangskode",
"label.custom-range": "Tilpasset interval",
"label.dashboard": "Betjeningspanel",
+ "label.date-range": "Datointerval",
"label.default-date-range": "Default date range",
+ "label.delete": "Slet",
+ "label.delete-account": "Slet konto",
+ "label.delete-website": "Slet hjemmeside",
+ "label.dismiss": "Dismiss",
"label.domain": "Domæne",
+ "label.edit": "Rediger",
+ "label.edit-account": "Rediger konto",
+ "label.edit-website": "Rediger hjemmeside",
"label.enable-share-url": "Aktivér delings-URL",
"label.invalid": "Ugyldig",
"label.invalid-domain": "Ugyldigt domæne",
"label.last-days": "Sidste {x} dage",
"label.last-hours": "Sidste {x} timer",
"label.logged-in-as": "Loggede ind som {username}",
+ "label.login": "Log ind",
"label.logout": "Log ud",
+ "label.more": "Mere",
"label.name": "Navn",
"label.new-password": "Ny adgangskode",
"label.password": "Adgangskode",
"label.passwords-dont-match": "Adgangskoder matcher ikke",
"label.profile": "Profil",
+ "label.realtime": "Realtime",
+ "label.realtime-logs": "Realtime logs",
+ "label.refresh": "Opdater",
"label.required": "Påkrævet",
+ "label.reset": "Reset",
+ "label.save": "Gem",
"label.settings": "Indstillinger",
+ "label.share-url": "Del URL",
+ "label.single-day": "Enkelt dag",
"label.this-month": "Denne måned",
"label.this-week": "Denne uge",
"label.this-year": "Dette år",
"label.timezone": "Timezone",
"label.today": "Idag",
+ "label.tracking-code": "Sporingskode",
"label.unknown": "Ukendt",
"label.username": "Brugernavn",
+ "label.view-details": "Vis detajler",
"label.websites": "Hjemmesider",
"message.active-users": "{x} nuværende {x, plural, one {bruger} other {brugere}}",
"message.confirm-delete": "Er du sikker på at du vil slette {target}?",
@@ -55,6 +65,7 @@
"message.get-tracking-code": "Få sporingskode",
"message.go-to-settings": "Gå til betjeningspanel",
"message.incorrect-username-password": "Ugyldigt brugernavn/adgangskode.",
+ "message.log.visitor": "Visitor from {country} using {browser} on {os} {device}",
"message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Ingen data tilgængelig.",
"message.no-websites-configured": "Du har ikke konfigureret nogen websteder.",
@@ -84,14 +95,5 @@
"metrics.referrers": "Henvisninger",
"metrics.unique-visitors": "Unikke besøgende",
"metrics.views": "Visninger",
- "metrics.visitors": "Besøgende",
- "title.add-account": "Tilføj konto",
- "title.add-website": "Tilføj hjemmeside",
- "title.change-password": "Skift adgangskode",
- "title.delete-account": "Slet konto",
- "title.delete-website": "Slet hjemmeside",
- "title.edit-account": "Rediger konto",
- "title.edit-website": "Rediger hjemmeside",
- "title.share-url": "Del URL",
- "title.tracking-code": "Sporingskode"
+ "metrics.visitors": "Besøgende"
}
diff --git a/lang/de-DE.json b/lang/de-DE.json
index 8d507693..ac9ac040 100644
--- a/lang/de-DE.json
+++ b/lang/de-DE.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Konto hinzufügen",
- "button.add-website": "Webseite hinzufügen",
- "button.back": "Zurück",
- "button.cancel": "Abbrechen",
- "button.change-password": "Passwort ändern",
- "button.copy-to-clipboard": "In die Zwischenablage kopieren",
- "button.date-range": "Datumsbereich",
- "button.delete": "Löschen",
- "button.dismiss": "Verwerfen",
- "button.edit": "Bearbeiten",
- "button.login": "Anmelden",
- "button.more": "Mehr",
- "button.refresh": "Aktualisieren",
- "button.reset": "Zurücksetzen",
- "button.save": "Speichern",
- "button.single-day": "Ein Tag",
- "button.view-details": "Details anzeigen",
"label.accounts": "Konten",
+ "label.add-account": "Konto hinzugfügen",
+ "label.add-website": "Webseite hinzufügen",
"label.administrator": "Administrator",
+ "label.all": "Alle",
+ "label.all-websites": "Alle Webseiten",
+ "label.back": "Zurück",
+ "label.cancel": "Abbrechen",
+ "label.change-password": "Passwort ändern",
"label.confirm-password": "Passwort wiederholen",
+ "label.copy-to-clipboard": "In die Zwischenablage kopieren",
"label.current-password": "Derzeitiges Passwort",
"label.custom-range": "Benutzerdefinierter Bereich",
"label.dashboard": "Übersicht",
+ "label.date-range": "Datumsbereich",
"label.default-date-range": "Voreingestellter Datumsbereich",
+ "label.delete": "Löschen",
+ "label.delete-account": "Konto löschen",
+ "label.delete-website": "Webseite löschen",
+ "label.dismiss": "Verwerfen",
"label.domain": "Domain",
+ "label.edit": "Bearbeiten",
+ "label.edit-account": "Konto bearbeiten",
+ "label.edit-website": "Webseite bearbeiten",
"label.enable-share-url": "Freigabe-URL aktivieren",
"label.invalid": "Ungültig",
"label.invalid-domain": "Ungültige Domain",
"label.last-days": "Letzten {x} Tage",
"label.last-hours": "Letzten {x} Stunden",
"label.logged-in-as": "Angemeldet als {username}",
+ "label.login": "Anmelden",
"label.logout": "Abmelden",
+ "label.more": "Mehr",
"label.name": "Name",
"label.new-password": "Neues Passwort",
"label.password": "Passwort",
"label.passwords-dont-match": "Passwörter stimmen nicht überein",
"label.profile": "Profil",
+ "label.realtime": "Echtzeit",
+ "label.realtime-logs": "Echtzeit Logs",
+ "label.refresh": "Aktualisieren",
"label.required": "Erforderlich",
+ "label.reset": "Zurücksetzen",
+ "label.save": "Speichern",
"label.settings": "Einstellungen",
+ "label.share-url": "Freigabe-URL",
+ "label.single-day": "Ein Tag",
"label.this-month": "Diesen Monat",
"label.this-week": "Diese Woche",
"label.this-year": "Dieses Jahr",
"label.timezone": "Zeitzone",
"label.today": "Heute",
+ "label.tracking-code": "Tracking Kennung",
"label.unknown": "Unbekannt",
"label.username": "Benutzername",
+ "label.view-details": "Details anzeigen",
"label.websites": "Webseiten",
"message.active-users": "{x} {x, plural, one {aktiver Besucher} other {aktive Besucher}}",
"message.confirm-delete": "Sind sie sich sicher {target} zu löschen?",
@@ -55,6 +65,7 @@
"message.get-tracking-code": "Erstelle Tracking Kennung",
"message.go-to-settings": "Zu den Einstellungen",
"message.incorrect-username-password": "Falsches Passwort oder Benutzername.",
+ "message.log.visitor": "Besucher aus {country} benutzt {browser} auf {os} {device}",
"message.new-version-available": "Eine neue Version umami {version} ist verfügbar!",
"message.no-data-available": "Keine Daten vorhanden.",
"message.no-websites-configured": "Es ist keine Webseite vorhanden.",
@@ -67,7 +78,7 @@
"metrics.actions": "Aktionen",
"metrics.average-visit-time": "Durchschn. Besuchszeit",
"metrics.bounce-rate": "Absprungrate",
- "metrics.browsers": "Browsers",
+ "metrics.browsers": "Browser",
"metrics.countries": "Länder",
"metrics.device.desktop": "Desktop",
"metrics.device.laptop": "Laptop",
@@ -84,14 +95,5 @@
"metrics.referrers": "Referrers",
"metrics.unique-visitors": "Eindeutige Besucher",
"metrics.views": "Aufrufe",
- "metrics.visitors": "Besucher",
- "title.add-account": "Konto hinzugfügen",
- "title.add-website": "Webseite hinzufügen",
- "title.change-password": "Passwort ändern",
- "title.delete-account": "Konto löschen",
- "title.delete-website": "Webseite löschen",
- "title.edit-account": "Konto bearbeiten",
- "title.edit-website": "Webseite bearbeiten",
- "title.share-url": "Freigabe-URL",
- "title.tracking-code": "Tracking Kennung"
+ "metrics.visitors": "Besucher"
}
diff --git a/lang/el-GR.json b/lang/el-GR.json
index 14cd69ca..3de40ea0 100644
--- a/lang/el-GR.json
+++ b/lang/el-GR.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Προσθήκη λογαριασμού",
- "button.add-website": "Προσθήκη ιστότοπου",
- "button.back": "Πίσω",
- "button.cancel": "Ακύρωση",
- "button.change-password": "Αλλαγή κωδικού",
- "button.copy-to-clipboard": "Αντιγραφή στο πρόχειρο",
- "button.date-range": "Εύρος ημερομηνιών",
- "button.delete": "Διαγραφή",
- "button.dismiss": "Dismiss",
- "button.edit": "Επεξεργασία",
- "button.login": "Είσοδος",
- "button.more": "Περισσότερα",
- "button.refresh": "Ανανέωση",
- "button.reset": "Επαναφορά",
- "button.save": "Αποθήκευση",
- "button.single-day": "Ημερήσια",
- "button.view-details": "Λεπτομέρειες",
"label.accounts": "Λογαριασμοί",
+ "label.add-account": "Προσθήκη λογαριασμού",
+ "label.add-website": "Προσθήκη ιστότοπου",
"label.administrator": "Διαχειριστής",
+ "label.all": "All",
+ "label.all-websites": "All websites",
+ "label.back": "Πίσω",
+ "label.cancel": "Ακύρωση",
+ "label.change-password": "Αλλαγή κωδικού",
"label.confirm-password": "Επιβεβαίωση κωδικού",
+ "label.copy-to-clipboard": "Αντιγραφή στο πρόχειρο",
"label.current-password": "Τωρινός κωδικός πρόσβασης",
"label.custom-range": "Προσαρμοσμένο εύρος",
"label.dashboard": "Πίνακας",
+ "label.date-range": "Εύρος ημερομηνιών",
"label.default-date-range": "Προεπιλεγμένο εύρος ημερομηνιών",
+ "label.delete": "Διαγραφή",
+ "label.delete-account": "Διαγραφή λογαριασμού",
+ "label.delete-website": "Διαγραφή ιστότοπου",
+ "label.dismiss": "Dismiss",
"label.domain": "Τομέας",
+ "label.edit": "Επεξεργασία",
+ "label.edit-account": "Επεξεργασία λογαριασμού",
+ "label.edit-website": "Επεξεργασία ιστότοπου",
"label.enable-share-url": "Ενεργοποίηση κοινής χρήσης URL",
"label.invalid": "Μη έγκυρο",
"label.invalid-domain": "Μη έγκυρος τομέας",
"label.last-days": "Τελευταίες {x} ημέρες",
"label.last-hours": "Τελευταίες {x} ώρες",
"label.logged-in-as": "Συνδεθήκατε ως {username}",
+ "label.login": "Είσοδος",
"label.logout": "Αποσύνδεση",
+ "label.more": "Περισσότερα",
"label.name": "Όνομα",
"label.new-password": "Νέος κωδικός",
"label.password": "Κωδικός",
"label.passwords-dont-match": "Οι κωδικοί πρόσβασης δεν ταιριάζουν",
"label.profile": "Προφίλ",
+ "label.realtime": "Realtime",
+ "label.realtime-logs": "Realtime logs",
+ "label.refresh": "Ανανέωση",
"label.required": "Απαιτείται",
+ "label.reset": "Επαναφορά",
+ "label.save": "Αποθήκευση",
"label.settings": "Ρυθμίσεις",
+ "label.share-url": "Κοινοποίηση διεύθυνσης URL",
+ "label.single-day": "Ημερήσια",
"label.this-month": "Αυτο το μήνα",
"label.this-week": "Αυτή την εβδομάδα",
"label.this-year": "Αυτή την χρονιά",
"label.timezone": "Ζώνη ώρας",
"label.today": "Σήμερα",
+ "label.tracking-code": "Κωδικός παρακολούθησης",
"label.unknown": "Άγνωστο",
"label.username": "Όνομα χρήστη",
+ "label.view-details": "Λεπτομέρειες",
"label.websites": "Ιστότοποι",
"message.active-users": "{x} ενεργοί {x, plural, one {επισκέπτης} other {επισκέπτες}}",
"message.confirm-delete": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το {target};",
@@ -55,6 +65,7 @@
"message.get-tracking-code": "Λήψη κώδικα παρακολούθησης",
"message.go-to-settings": "Μεταβείτε στις ρυθμίσεις",
"message.incorrect-username-password": "Εσφαλμένο όνομα χρήστη / κωδικός πρόσβασης.",
+ "message.log.visitor": "Visitor from {country} using {browser} on {os} {device}",
"message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Δεν υπάρχουν διαθέσιμα δεδομένα.",
"message.no-websites-configured": "Δεν έχετε ρυθμίσει κανένα ιστότοπο.",
@@ -84,14 +95,5 @@
"metrics.referrers": "Παραπομπές",
"metrics.unique-visitors": "Μοναδικοί επισκέπτες",
"metrics.views": "Προβολές",
- "metrics.visitors": "Επισκέπτες",
- "title.add-account": "Προσθήκη λογαριασμού",
- "title.add-website": "Προσθήκη ιστότοπου",
- "title.change-password": "Αλλαγή κωδικού",
- "title.delete-account": "Διαγραφή λογαριασμού",
- "title.delete-website": "Διαγραφή ιστότοπου",
- "title.edit-account": "Επεξεργασία λογαριασμού",
- "title.edit-website": "Επεξεργασία ιστότοπου",
- "title.share-url": "Κοινοποίηση διεύθυνσης URL",
- "title.tracking-code": "Κωδικός παρακολούθησης"
+ "metrics.visitors": "Επισκέπτες"
}
diff --git a/lang/en-US.json b/lang/en-US.json
index 7c513b95..5d3365b9 100644
--- a/lang/en-US.json
+++ b/lang/en-US.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Add account",
- "button.add-website": "Add website",
- "button.back": "Back",
- "button.cancel": "Cancel",
- "button.change-password": "Change password",
- "button.copy-to-clipboard": "Copy to clipboard",
- "button.date-range": "Date range",
- "button.delete": "Delete",
- "button.dismiss": "Dismiss",
- "button.edit": "Edit",
- "button.login": "Login",
- "button.more": "More",
- "button.refresh": "Refresh",
- "button.reset": "Reset",
- "button.save": "Save",
- "button.single-day": "Single day",
- "button.view-details": "View details",
"label.accounts": "Accounts",
+ "label.add-account": "Add account",
+ "label.add-website": "Add website",
"label.administrator": "Administrator",
+ "label.all": "All",
+ "label.all-websites": "All websites",
+ "label.back": "Back",
+ "label.cancel": "Cancel",
+ "label.change-password": "Change password",
"label.confirm-password": "Confirm password",
+ "label.copy-to-clipboard": "Copy to clipboard",
"label.current-password": "Current password",
"label.custom-range": "Custom range",
"label.dashboard": "Dashboard",
+ "label.date-range": "Date range",
"label.default-date-range": "Default date range",
+ "label.delete": "Delete",
+ "label.delete-account": "Delete account",
+ "label.delete-website": "Delete website",
+ "label.dismiss": "Dismiss",
"label.domain": "Domain",
+ "label.edit": "Edit",
+ "label.edit-account": "Edit account",
+ "label.edit-website": "Edit website",
"label.enable-share-url": "Enable share URL",
"label.invalid": "Invalid",
"label.invalid-domain": "Invalid domain",
"label.last-days": "Last {x} days",
"label.last-hours": "Last {x} hours",
"label.logged-in-as": "Logged in as {username}",
+ "label.login": "Login",
"label.logout": "Logout",
+ "label.more": "More",
"label.name": "Name",
"label.new-password": "New password",
"label.password": "Password",
"label.passwords-dont-match": "Passwords don't match",
"label.profile": "Profile",
+ "label.realtime": "Realtime",
+ "label.realtime-logs": "Realtime logs",
+ "label.refresh": "Refresh",
"label.required": "Required",
+ "label.reset": "Reset",
+ "label.save": "Save",
"label.settings": "Settings",
+ "label.share-url": "Share URL",
+ "label.single-day": "Single day",
"label.this-month": "This month",
"label.this-week": "This week",
"label.this-year": "This year",
"label.timezone": "Timezone",
"label.today": "Today",
+ "label.tracking-code": "Tracking code",
"label.unknown": "Unknown",
"label.username": "Username",
+ "label.view-details": "View details",
"label.websites": "Websites",
"message.active-users": "{x} current {x, plural, one {visitor} other {visitors}}",
"message.confirm-delete": "Are your sure you want to delete {target}?",
@@ -55,6 +65,7 @@
"message.get-tracking-code": "Get tracking code",
"message.go-to-settings": "Go to settings",
"message.incorrect-username-password": "Incorrect username/password.",
+ "message.log.visitor": "Visitor from {country} using {browser} on {os} {device}",
"message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "No data available.",
"message.no-websites-configured": "You don't have any websites configured.",
@@ -84,14 +95,5 @@
"metrics.referrers": "Referrers",
"metrics.unique-visitors": "Unique visitors",
"metrics.views": "Views",
- "metrics.visitors": "Visitors",
- "title.add-account": "Add account",
- "title.add-website": "Add website",
- "title.change-password": "Change password",
- "title.delete-account": "Delete account",
- "title.delete-website": "Delete website",
- "title.edit-account": "Edit account",
- "title.edit-website": "Edit website",
- "title.share-url": "Share URL",
- "title.tracking-code": "Tracking code"
+ "metrics.visitors": "Visitors"
}
diff --git a/lang/es-MX.json b/lang/es-MX.json
index 16d911ea..4d57ac3c 100644
--- a/lang/es-MX.json
+++ b/lang/es-MX.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Agregar usuario",
- "button.add-website": "Agregar sitio",
- "button.back": "Atrás",
- "button.cancel": "Cancelar",
- "button.change-password": "Cambiar contraseña",
- "button.copy-to-clipboard": "Copiar al portapapeles",
- "button.date-range": "Date range",
- "button.delete": "Eliminar",
- "button.dismiss": "Dismiss",
- "button.edit": "Editar",
- "button.login": "Iniciar sesión",
- "button.more": "Más",
- "button.refresh": "Refresh",
- "button.reset": "Reset",
- "button.save": "Guardar",
- "button.single-day": "Single day",
- "button.view-details": "Ver detalles",
"label.accounts": "Usuarios",
+ "label.add-account": "Agregar usuario",
+ "label.add-website": "Agregar sitio",
"label.administrator": "Administrador",
+ "label.all": "Todos",
+ "label.all-websites": "Todos los sitios",
+ "label.back": "Atrás",
+ "label.cancel": "Cancelar",
+ "label.change-password": "Cambiar contraseña",
"label.confirm-password": "Confirmar contraseña",
+ "label.copy-to-clipboard": "Copiar al portapapeles",
"label.current-password": "Contraseña actual",
- "label.custom-range": "Custom range",
+ "label.custom-range": "Intervalo personalizado",
"label.dashboard": "Panel de control",
- "label.default-date-range": "Default date range",
+ "label.date-range": "Fechas",
+ "label.default-date-range": "Intervalo por defecto",
+ "label.delete": "Eliminar",
+ "label.delete-account": "Eliminar usuario",
+ "label.delete-website": "Eliminar sitio",
+ "label.dismiss": "Ignorar",
"label.domain": "Dominio",
+ "label.edit": "Editar",
+ "label.edit-account": "Editar usuario",
+ "label.edit-website": "Editar sitio",
"label.enable-share-url": "Habilitar compartir URL",
"label.invalid": "Inválido",
"label.invalid-domain": "Dominio inválido",
"label.last-days": "Últimos {x} días",
"label.last-hours": "Últimas {x} horas",
"label.logged-in-as": "Sesión iniciada como {username}",
+ "label.login": "Iniciar sesión",
"label.logout": "Cerrar sesión",
+ "label.more": "Más",
"label.name": "Nombre",
"label.new-password": "Nueva contraseña",
"label.password": "Contraseña",
"label.passwords-dont-match": "Las contraseñas no coinciden",
"label.profile": "Perfil",
+ "label.realtime": "Tiempo real",
+ "label.realtime-logs": "Registros en tiempo real",
+ "label.refresh": "Actualizar",
"label.required": "Requerido",
+ "label.reset": "Reiniciar",
+ "label.save": "Guardar",
"label.settings": "Configuraciones",
+ "label.share-url": "Compartir URL",
+ "label.single-day": "Dia",
"label.this-month": "Este mes",
"label.this-week": "Esta semana",
"label.this-year": "Este año",
- "label.timezone": "Timezone",
+ "label.timezone": "Zona horaria",
"label.today": "Hoy",
- "label.unknown": "Unknown",
+ "label.tracking-code": "Código de rastreo",
+ "label.unknown": "Desconocida",
"label.username": "Nombre de usuario",
+ "label.view-details": "Ver detalles",
"label.websites": "Sitios",
"message.active-users": "{x} {x, plural, one {activo} other {activos}}",
"message.confirm-delete": "¿Estás seguro(a) de querer eliminar {target}?",
@@ -55,7 +65,8 @@
"message.get-tracking-code": "Obtener código de rastreo",
"message.go-to-settings": "Ir a la configuración",
"message.incorrect-username-password": "Nombre de usuario o contraseña incorrectos.",
- "message.new-version-available": "A new version of umami {version} is available!",
+ "message.log.visitor": "Visitante desde {country} usando {browser} en {os} {device}",
+ "message.new-version-available": "Una nueva versíon de umami {version} esta disponible!",
"message.no-data-available": "Sin información disponible.",
"message.no-websites-configured": "No tienes ningún sitio configurado.",
"message.page-not-found": "Page not found",
@@ -72,7 +83,7 @@
"metrics.device.desktop": "Desktop",
"metrics.device.laptop": "Laptop",
"metrics.device.mobile": "Mobile",
- "metrics.device.tablet": "Tablet",
+ "metrics.device.tablet": "Tableta",
"metrics.devices": "Dispositivos",
"metrics.events": "Eventos",
"metrics.filter.combined": "Combinado",
@@ -84,14 +95,5 @@
"metrics.referrers": "Referentes",
"metrics.unique-visitors": "Visitantes únicos",
"metrics.views": "Vistas",
- "metrics.visitors": "Visitantes",
- "title.add-account": "Agregar usuario",
- "title.add-website": "Agregar sitio",
- "title.change-password": "Cambiar contraseña",
- "title.delete-account": "Eliminar usuario",
- "title.delete-website": "Eliminar sitio",
- "title.edit-account": "Editar usuario",
- "title.edit-website": "Editar sitio",
- "title.share-url": "Compartir URL",
- "title.tracking-code": "Código de rastreo"
+ "metrics.visitors": "Visitantes"
}
diff --git a/lang/fi-FI.json b/lang/fi-FI.json
new file mode 100644
index 00000000..9b3aa961
--- /dev/null
+++ b/lang/fi-FI.json
@@ -0,0 +1,99 @@
+{
+ "label.accounts": "Tilit",
+ "label.add-account": "Lisää tili",
+ "label.add-website": "Lisää verkkosivu",
+ "label.administrator": "Järjestelmänvalvoja",
+ "label.all": "Kaikki",
+ "label.all-websites": "Kaikki verkkosivut",
+ "label.back": "Takaisin",
+ "label.cancel": "Peruuta",
+ "label.change-password": "Vaihda salasana",
+ "label.confirm-password": "Vahvista salasana",
+ "label.copy-to-clipboard": "Kopioi leikepöydälle",
+ "label.current-password": "Nykyinen salasana",
+ "label.custom-range": "Mukautettu jakso",
+ "label.dashboard": "Ohjauspaneeli",
+ "label.date-range": "Ajanjakso",
+ "label.default-date-range": "Oletusajanjakso",
+ "label.delete": "Poista",
+ "label.delete-account": "Poista tili",
+ "label.delete-website": "Poista verkkosivu",
+ "label.dismiss": "Hylkää",
+ "label.domain": "Verkkotunnus",
+ "label.edit": "Muokkaa",
+ "label.edit-account": "Muokkaa tiliä",
+ "label.edit-website": "Muokkaa verkkosivua",
+ "label.enable-share-url": "Ota jakamisen URL-osoite käyttöön",
+ "label.invalid": "Virheellinen",
+ "label.invalid-domain": "Virheellinen verkkotunnus",
+ "label.last-days": "Viimeisimmät {x} päivät",
+ "label.last-hours": "Viimeisimmät {x} tunnit",
+ "label.logged-in-as": "Kirjautuneena sisään nimellä {username}",
+ "label.login": "Kirjaudu sisään",
+ "label.logout": "Kirjaudu ulos",
+ "label.more": "Lisää",
+ "label.name": "Nimi",
+ "label.new-password": "Uusi salasana",
+ "label.password": "Salasana",
+ "label.passwords-dont-match": "Salasanat eivät täsmää",
+ "label.profile": "Profiili",
+ "label.realtime": "Reaaliaikainen",
+ "label.realtime-logs": "Reaaliaikaiset lokit",
+ "label.refresh": "Päivitä",
+ "label.required": "Vaaditaan",
+ "label.reset": "Nollaa",
+ "label.save": "Tallenna",
+ "label.settings": "Asetukset",
+ "label.share-url": "Jaa URL",
+ "label.single-day": "Yksi päivä",
+ "label.this-month": "Tämä kuukausi",
+ "label.this-week": "Tämä viikko",
+ "label.this-year": "Tämä vuosi",
+ "label.timezone": "Aikavyöhyke",
+ "label.today": "Tänään",
+ "label.tracking-code": "Seurantakoodi",
+ "label.unknown": "Tuntematon",
+ "label.username": "Käyttäjänimi",
+ "label.view-details": "Katso tiedot",
+ "label.websites": "Verkkosivut",
+ "message.active-users": "{x} nykyinen {x, plural, yksi {visitor} muut {visitors}}",
+ "message.confirm-delete": "Haluatko varmasti poistaa {target}?",
+ "message.copied": "Kopioitu!",
+ "message.delete-warning": "Kaikki siihen liittyvät tiedot poistetaan.",
+ "message.failure": "Jotain meni väärin.",
+ "message.get-share-url": "Hanki jakamisen URL-osoite",
+ "message.get-tracking-code": "Hanki seurantakoodi",
+ "message.go-to-settings": "Mene asetuksiin",
+ "message.incorrect-username-password": "Väärä käyttäjänimi/salasana.",
+ "message.log.visitor": "Vierailija maasta {country} käyttäen selainta {browser} {os}-laitteella: {device}",
+ "message.new-version-available": "Uusi versio umamista {version} on käytettävissä!",
+ "message.no-data-available": "Tietoja ei ole käytettävissä.",
+ "message.no-websites-configured": "Sinulla ei ole määritettyjä verkkosivustoja.",
+ "message.page-not-found": "Sivua ei löydetty.",
+ "message.powered-by": "Voimanlähteenä {name}",
+ "message.save-success": "Tallennettu onnistuneesti.",
+ "message.share-url": "Tämä on julkisesti jaettu URL-osoitteelle {target}.",
+ "message.track-stats": "Jos haluat seurata kohteen {target} tilastoja, aseta seuraava koodi verkkosivustosi {head} osioon.",
+ "message.type-delete": "Kirjoita {delete} alla olevaan ruutuun vahvistaaksesi.",
+ "metrics.actions": "Toiminnat",
+ "metrics.average-visit-time": "Keskimääräinen vierailuaika",
+ "metrics.bounce-rate": "Välitön poistuminen",
+ "metrics.browsers": "Selaimet",
+ "metrics.countries": "Maat",
+ "metrics.device.desktop": "Pöytäkone",
+ "metrics.device.laptop": "Kannettava tietokone",
+ "metrics.device.mobile": "Mobiili",
+ "metrics.device.tablet": "Tabletti",
+ "metrics.devices": "Laitteet",
+ "metrics.events": "Tapahtumat",
+ "metrics.filter.combined": "Yhdistetty",
+ "metrics.filter.domain-only": "Vain verkkotunnus",
+ "metrics.filter.raw": "Käsittelemätön",
+ "metrics.operating-systems": "Käyttöjärjestelmät",
+ "metrics.page-views": "Sivun näyttökertoja",
+ "metrics.pages": "Sivut",
+ "metrics.referrers": "Viittaajat",
+ "metrics.unique-visitors": "Uniikit vierailijat",
+ "metrics.views": "Näyttökertoja",
+ "metrics.visitors": "Vierailijat"
+}
diff --git a/lang/fo-FO.json b/lang/fo-FO.json
index db9e972b..c358be1e 100644
--- a/lang/fo-FO.json
+++ b/lang/fo-FO.json
@@ -1,67 +1,78 @@
{
- "button.add-account": "Ger brúkara",
- "button.add-website": "Legg heimasíðu til",
- "button.back": "Aftur",
- "button.cancel": "Strika",
- "button.change-password": "Broyt loyniorð",
- "button.copy-to-clipboard": "Kopier til clipboard",
- "button.date-range": "Vel dato",
- "button.delete": "Sletta",
- "button.dismiss": "Dismiss",
- "button.edit": "Ger broyting",
- "button.login": "Rita inn",
- "button.more": "Meira",
- "button.refresh": "Endurskapa",
- "button.reset": "Nulstilla",
- "button.save": "Goym",
- "button.single-day": "Einkultur dagur",
- "button.view-details": "Vís upplýsingar",
"label.accounts": "Brúkarar",
- "label.administrator": "Administrator",
+ "label.add-account": "Ger brúkara",
+ "label.add-website": "Legg heimasíðu afturat",
+ "label.administrator": "Fyrisitari",
+ "label.all": "Alt",
+ "label.all-websites": "Allar heimasíður",
+ "label.back": "Aftur",
+ "label.cancel": "Strika",
+ "label.change-password": "Skift loyniorð",
"label.confirm-password": "Vátta loyniorð",
+ "label.copy-to-clipboard": "Avrita til setiðborð",
"label.current-password": "Núverandi loyniorð",
"label.custom-range": "Tillaga spenni",
"label.dashboard": "Yvirlitsskíggi",
- "label.default-date-range": "Standard dato",
+ "label.date-range": "Vel dato",
+ "label.default-date-range": "Forsett dato",
+ "label.delete": "Sletta",
+ "label.delete-account": "Sletta brúkara",
+ "label.delete-website": "Sletta heimasíðu",
+ "label.dismiss": "Lat fara",
"label.domain": "Økisnavn",
+ "label.edit": "Ger broyting",
+ "label.edit-account": "Broyt brúkara",
+ "label.edit-website": "Broyt heimasíðu",
"label.enable-share-url": "Virkja deili leinki",
"label.invalid": "Ógilda",
"label.invalid-domain": "Ógilt økisnavn",
"label.last-days": "Seinastu {x} dagarnar",
- "label.last-hours": "Seinastu {x} tímanar",
+ "label.last-hours": "Seinastu {x} tímarnar",
"label.logged-in-as": "Ritaður inn sum {username}",
+ "label.login": "Rita inn",
"label.logout": "Rita út",
+ "label.more": "Meira",
"label.name": "Navn",
"label.new-password": "Nýtt loyniorð",
"label.password": "Loyniorð",
"label.passwords-dont-match": "Loyniorðini eru ikki eins",
- "label.profile": "Brúkari",
- "label.required": "Krav",
+ "label.profile": "Vangi",
+ "label.realtime": "Beinleiðis",
+ "label.realtime-logs": "Beinleiðis skrá",
+ "label.refresh": "Endurskapa",
+ "label.required": "Kravt",
+ "label.reset": "Nulstilla",
+ "label.save": "Goym",
"label.settings": "Stillingar",
+ "label.share-url": "Deil leinku",
+ "label.single-day": "Einkultur dagur",
"label.this-month": "Hendan mánan",
"label.this-week": "Hesa vikuna",
"label.this-year": "Hetta árið",
"label.timezone": "Tíðarsona",
"label.today": "Í dag",
+ "label.tracking-code": "Spori kota",
"label.unknown": "Ókent",
"label.username": "Brúkaranavn",
+ "label.view-details": "Vís frágreiðing",
"label.websites": "Heimasíður",
"message.active-users": "{x} í løtuni {x, plural, one {vitjandi} other { vitjandi }}",
- "message.confirm-delete": "Ert tú sikkur at tú ynskir at sletta {target}?",
- "message.copied": "Kopiera!",
- "message.delete-warning": "Øll data ið er knýtt at verður eisini sletta.",
+ "message.confirm-delete": "Ert tú sikkur at tú ynskir at strika {target}?",
+ "message.copied": "Avrita!",
+ "message.delete-warning": "Øll data ið er knýtt at verður eisini strika.",
"message.failure": "Okkurt bleiv gali.",
"message.get-share-url": "Fá leinku sum tú kanst deila",
"message.get-tracking-code": "Fá sporings kotu",
"message.go-to-settings": "Far til stillingar",
"message.incorrect-username-password": "Skeivt brúkaranavn/loyniorð.",
- "message.new-version-available": "A new version of umami {version} is available!",
+ "message.log.visitor": "Vitjandi frá {country} brúkar {browser} á {os} {device}",
+ "message.new-version-available": "Ein nýggj útgava av umami {version} er tøkt!",
"message.no-data-available": "Einki data tøk.",
"message.no-websites-configured": "Tú hevur ongar heimasíður stillaða til.",
"message.page-not-found": "Síðan bleiv ikki funnin.",
"message.powered-by": "Powered by {name}",
"message.save-success": "Goymt.",
- "message.share-url": "Hetta er tann almenna leinkan av {target}.",
+ "message.share-url": "Hettar er tann almenna leinkan av {target}.",
"message.track-stats": "Fyri at spora hagtøl fyri {target}, koyr kotuna í {head} partin á tínari heimasíðu.",
"message.type-delete": "Skriva {delete} í feltið fyri at vátta",
"metrics.actions": "Gerðir",
@@ -83,15 +94,6 @@
"metrics.pages": "Síðir",
"metrics.referrers": "Framsendingar",
"metrics.unique-visitors": "Einsýna vitjanir",
- "metrics.views": "Vitjanir",
- "metrics.visitors": "Vitjandi",
- "title.add-account": "Ger brúkara",
- "title.add-website": "Legg heimasíðu avtrat",
- "title.change-password": "Skift loyniorð",
- "title.delete-account": "Sletta brúkara",
- "title.delete-website": "Sletta heimasíðu",
- "title.edit-account": "Broyt brúkara",
- "title.edit-website": "Broyt heimasíðu",
- "title.share-url": "Deil leinku",
- "title.tracking-code": "Spori kota"
+ "metrics.views": "Sýningar",
+ "metrics.visitors": "Vitjandi"
}
diff --git a/lang/fr-FR.json b/lang/fr-FR.json
index 762cae34..622c760f 100644
--- a/lang/fr-FR.json
+++ b/lang/fr-FR.json
@@ -1,53 +1,63 @@
{
- "button.add-account": "Ajouter un compte",
- "button.add-website": "Ajouter un site",
- "button.back": "Retour",
- "button.cancel": "Annuler",
- "button.change-password": "Changer de mot de passse",
- "button.copy-to-clipboard": "Copier dans le presse papier",
- "button.date-range": "Date range",
- "button.delete": "Supprimer",
- "button.dismiss": "Dismiss",
- "button.edit": "Modifier",
- "button.login": "Connexion",
- "button.more": "Plus",
- "button.refresh": "Refresh",
- "button.reset": "Reset",
- "button.save": "Sauvegarder",
- "button.single-day": "Single day",
- "button.view-details": "Voir les details",
"label.accounts": "Comptes",
+ "label.add-account": "Ajouter un compte",
+ "label.add-website": "Ajouter un site",
"label.administrator": "Administrateur",
+ "label.all": "Tout",
+ "label.all-websites": "Tous les sites web",
+ "label.back": "Retour",
+ "label.cancel": "Annuler",
+ "label.change-password": "Changer le mot de passe",
"label.confirm-password": "Confirmation du mot de passe",
+ "label.copy-to-clipboard": "Copier dans le presse papier",
"label.current-password": "Mot de passe actuel",
- "label.custom-range": "Plage personnalisée",
+ "label.custom-range": "Intervalle personnalisé",
"label.dashboard": "Tableau de bord",
- "label.default-date-range": "Default date range",
+ "label.date-range": "Intervalle",
+ "label.default-date-range": "Intervalle par défaut",
+ "label.delete": "Supprimer",
+ "label.delete-account": "Supprimer le compte",
+ "label.delete-website": "Supprimer le site",
+ "label.dismiss": "Ignorer",
"label.domain": "Domaine",
+ "label.edit": "Modifier",
+ "label.edit-account": "Modifier le compte",
+ "label.edit-website": "Modifier le site",
"label.enable-share-url": "Activer le partage d'URL",
"label.invalid": "Invalide",
"label.invalid-domain": "Domaine invalide",
"label.last-days": "{x} derniers jours",
"label.last-hours": "{x} dernières heures",
"label.logged-in-as": "Connecté en tant que {username}",
+ "label.login": "Connexion",
"label.logout": "Déconnexion",
+ "label.more": "Plus",
"label.name": "Nom",
"label.new-password": "Nouveau mot de passe",
"label.password": "Mot de passe",
"label.passwords-dont-match": "Les mots de passe ne correspondent pas",
- "label.profile": "Profile",
+ "label.profile": "Profil",
+ "label.realtime": "Temps réel",
+ "label.realtime-logs": "Logs en temps réel",
+ "label.refresh": "Rafraîchir",
"label.required": "Requis",
+ "label.reset": "Réinitialiser",
+ "label.save": "Sauvegarder",
"label.settings": "Paramètres",
+ "label.share-url": "Partager l'URL",
+ "label.single-day": "Journée",
"label.this-month": "Ce mois ci",
"label.this-week": "Cette semaine",
"label.this-year": "Cette année",
- "label.timezone": "Timezone",
+ "label.timezone": "Fuseau horaire",
"label.today": "Aujourd'hui",
- "label.unknown": "Unknown",
+ "label.tracking-code": "Code de suivi",
+ "label.unknown": "Inconnu",
"label.username": "Nom d'utilisateur",
+ "label.view-details": "Voir les details",
"label.websites": "Sites",
"message.active-users": "{x} {x, plural, one {visiteur} other {visiteurs}} actuellement",
- "message.confirm-delete": "Êtes-vous sur de vouloir supprimer {target}?",
+ "message.confirm-delete": "Êtes-vous sûr de vouloir supprimer {target} ?",
"message.copied": "Copié !",
"message.delete-warning": "Toutes les données associées seront également supprimées.",
"message.failure": "Un problème est survenu.",
@@ -55,7 +65,8 @@
"message.get-tracking-code": "Obtenez le code de suivi",
"message.go-to-settings": "Aller aux paramètres",
"message.incorrect-username-password": "nom d'utilisateurs/mot de passe incorrect.",
- "message.new-version-available": "A new version of umami {version} is available!",
+ "message.log.visitor": "Visiteur de {country} utilisant {browser} sur {os} {device}",
+ "message.new-version-available": "Une nouvelle version de umami {version} est disponible !",
"message.no-data-available": "Pas de données disponibles.",
"message.no-websites-configured": "Vous n'avez configuré aucun site Web.",
"message.page-not-found": "Page non trouvée.",
@@ -69,10 +80,10 @@
"metrics.bounce-rate": "Taux de rebond",
"metrics.browsers": "Navigateurs",
"metrics.countries": "Pays",
- "metrics.device.desktop": "Desktop",
- "metrics.device.laptop": "Laptop",
- "metrics.device.mobile": "Mobile",
- "metrics.device.tablet": "Tablet",
+ "metrics.device.desktop": "Ordinateur",
+ "metrics.device.laptop": "Portable",
+ "metrics.device.mobile": "Téléphone",
+ "metrics.device.tablet": "Tablette",
"metrics.devices": "Appareils",
"metrics.events": "Événements",
"metrics.filter.combined": "Combiné",
@@ -84,14 +95,5 @@
"metrics.referrers": "URL Référentes",
"metrics.unique-visitors": "Visiteurs uniques",
"metrics.views": "Vues",
- "metrics.visitors": "Visiteurs",
- "title.add-account": "Ajouter un compte",
- "title.add-website": "Ajouter un site",
- "title.change-password": "Changer le mot de passe",
- "title.delete-account": "Supprimer le compte",
- "title.delete-website": "Suprimer le site",
- "title.edit-account": "Modifier le compte",
- "title.edit-website": "Modifier le site",
- "title.share-url": "Partager l'URL",
- "title.tracking-code": "Code de suivi"
+ "metrics.visitors": "Visiteurs"
}
diff --git a/lang/id-ID.json b/lang/id-ID.json
index 8099cd75..99fd0fe5 100644
--- a/lang/id-ID.json
+++ b/lang/id-ID.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Tambah akun",
- "button.add-website": "Tambah situs web",
- "button.back": "Kembali",
- "button.cancel": "Batal",
- "button.change-password": "Ganti password",
- "button.copy-to-clipboard": "Salin ke papan klip",
- "button.date-range": "Rentang tanggal",
- "button.delete": "Hapus",
- "button.dismiss": "Tutup",
- "button.edit": "Sunting",
- "button.login": "Masuk",
- "button.more": "Lebih banyak",
- "button.refresh": "Segarkan",
- "button.reset": "Atur ulang",
- "button.save": "Simpan",
- "button.single-day": "Sehari",
- "button.view-details": "Lihat Detil",
"label.accounts": "Akun",
+ "label.add-account": "Tambah akun",
+ "label.add-website": "Tambah situs web",
"label.administrator": "Pengelola",
+ "label.all": "Semua",
+ "label.all-websites": "Semua website",
+ "label.back": "Kembali",
+ "label.cancel": "Batal",
+ "label.change-password": "Ganti kata sandi",
"label.confirm-password": "Konfirmasi kata sandi",
+ "label.copy-to-clipboard": "Salin ke papan klip",
"label.current-password": "Kata sandi sekarang",
"label.custom-range": "Rentang khusus",
"label.dashboard": "Dasbor",
- "label.default-date-range": "Rentang tanggal default",
+ "label.date-range": "Rentang tanggal",
+ "label.default-date-range": "Rentang tanggal bawaan",
+ "label.delete": "Hapus",
+ "label.delete-account": "Hapus akun",
+ "label.delete-website": "Hapus situs web",
+ "label.dismiss": "Tutup",
"label.domain": "Domain",
+ "label.edit": "Sunting",
+ "label.edit-account": "Sunting akun",
+ "label.edit-website": "Sunting situs web",
"label.enable-share-url": "Aktifkan URL berbagi",
"label.invalid": "Tidak valid",
"label.invalid-domain": "Domain tidak valid",
"label.last-days": "{x} hari terakhir",
"label.last-hours": "{x} jam terakhir",
"label.logged-in-as": "Masuk sebagai {username}",
+ "label.login": "Masuk",
"label.logout": "Keluar",
+ "label.more": "Lebih banyak",
"label.name": "Nama",
"label.new-password": "Kata sandi baru",
"label.password": "Kata sandi",
"label.passwords-dont-match": "Kata sandi tidak cocok",
"label.profile": "Profil",
+ "label.realtime": "Waktu nyata",
+ "label.realtime-logs": "Log waktu nyata",
+ "label.refresh": "Segarkan",
"label.required": "Wajib",
+ "label.reset": "Atur ulang",
+ "label.save": "Simpan",
"label.settings": "Pengaturan",
+ "label.share-url": "Bagikan URL",
+ "label.single-day": "Sehari",
"label.this-month": "Bulan ini",
"label.this-week": "Minggu ini",
"label.this-year": "Tahun ini",
"label.timezone": "Zona waktu",
"label.today": "Hari ini",
+ "label.tracking-code": "Kode lacak",
"label.unknown": "Tidak diketahui",
"label.username": "Nama pengguna",
+ "label.view-details": "Lihat Detil",
"label.websites": "Situs web",
"message.active-users": "{x} pengunjung saat ini",
"message.confirm-delete": "Apakah kamu yakin ingin menghapus {target}?",
@@ -55,6 +65,7 @@
"message.get-tracking-code": "Dapatkan kode pelacakan",
"message.go-to-settings": "Pergi ke pengaturan",
"message.incorrect-username-password": "Nama pengguna/kata sandi salah.",
+ "message.log.visitor": "Pengunjung dari {country} dengan {browser} di {device} {os}",
"message.new-version-available": "Versi terbaru umami {version} telah tersedia!",
"message.no-data-available": "Tidak ada data.",
"message.no-websites-configured": "Anda tidak memiliki situs web yang dikonfigurasi.",
@@ -66,8 +77,8 @@
"message.type-delete": "Ketikkan {delete} pada kotak di bawah untuk konfirmasi.",
"metrics.actions": "Aksi",
"metrics.average-visit-time": "Waktu kunjungan rata-rata",
- "metrics.bounce-rate": "Tingkat bouncing",
- "metrics.browsers": "Browser",
+ "metrics.bounce-rate": "Rasio pentalan",
+ "metrics.browsers": "Peramban",
"metrics.countries": "Negara",
"metrics.device.desktop": "Desktop",
"metrics.device.laptop": "Laptop",
@@ -77,21 +88,12 @@
"metrics.events": "Perihal",
"metrics.filter.combined": "Gabungan",
"metrics.filter.domain-only": "Hanya domain",
- "metrics.filter.raw": "Raw",
+ "metrics.filter.raw": "Mentah",
"metrics.operating-systems": "Sistem Operasi",
"metrics.page-views": "Tampilan halaman",
"metrics.pages": "Halaman",
"metrics.referrers": "Perujuk",
"metrics.unique-visitors": "Pengunjung unik",
"metrics.views": "Tampilan",
- "metrics.visitors": "Pengunjung",
- "title.add-account": "Tambah akun",
- "title.add-website": "Tambah situs web",
- "title.change-password": "Ganti kata sandi",
- "title.delete-account": "Hapus akun",
- "title.delete-website": "Hapus situs web",
- "title.edit-account": "Sunting akun",
- "title.edit-website": "Sunting situs web",
- "title.share-url": "Bagikan URL",
- "title.tracking-code": "Kode lacak"
+ "metrics.visitors": "Pengunjung"
}
diff --git a/lang/ja-JP.json b/lang/ja-JP.json
index 51cdaec1..14cad565 100644
--- a/lang/ja-JP.json
+++ b/lang/ja-JP.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "アカウントを追加する",
- "button.add-website": "Webサイトを追加する",
- "button.back": "戻る",
- "button.cancel": "キャンセル",
- "button.change-password": "パスワード変更",
- "button.copy-to-clipboard": "クリップボードにコピー",
- "button.date-range": "日付範囲",
- "button.delete": "削除",
- "button.dismiss": "無視する",
- "button.edit": "編集",
- "button.login": "ログイン",
- "button.more": "さらに表示",
- "button.refresh": "更新",
- "button.reset": "リセット",
- "button.save": "保存",
- "button.single-day": "一日のみ",
- "button.view-details": "詳細を見る",
"label.accounts": "アカウント",
+ "label.add-account": "アカウントの追加",
+ "label.add-website": "Webサイトの追加",
"label.administrator": "管理者",
+ "label.all": "すべて表示",
+ "label.all-websites": "すべてのWebサイト",
+ "label.back": "戻る",
+ "label.cancel": "キャンセル",
+ "label.change-password": "パスワード変更",
"label.confirm-password": "パスワード(確認)",
+ "label.copy-to-clipboard": "クリップボードにコピー",
"label.current-password": "現在のパスワード",
"label.custom-range": "期間を指定する",
"label.dashboard": "ダッシュボード",
+ "label.date-range": "範囲指定",
"label.default-date-range": "最初に表示する期間",
+ "label.delete": "削除",
+ "label.delete-account": "アカウントの削除",
+ "label.delete-website": "Webサイトの削除",
+ "label.dismiss": "無視する",
"label.domain": "ドメイン",
+ "label.edit": "編集",
+ "label.edit-account": "アカウントの編集",
+ "label.edit-website": "Webサイトの編集",
"label.enable-share-url": "共有リンクを有効にする",
"label.invalid": "無効",
"label.invalid-domain": "無効なドメイン",
"label.last-days": "過去{x}日間",
"label.last-hours": "過去{x}時間",
"label.logged-in-as": "{username}でログイン中",
+ "label.login": "ログイン",
"label.logout": "ログアウト",
+ "label.more": "さらに表示",
"label.name": "名前",
"label.new-password": "新しいパスワード",
"label.password": "パスワード",
"label.passwords-dont-match": "パスワードが一致しません",
"label.profile": "プロファイル",
+ "label.realtime": "リアルタイム",
+ "label.realtime-logs": "リアルタイムログ",
+ "label.refresh": "更新",
"label.required": "必須",
+ "label.reset": "リセット",
+ "label.save": "保存",
"label.settings": "設定",
+ "label.share-url": "共有リンク",
+ "label.single-day": "一日のみ",
"label.this-month": "今月",
"label.this-week": "今週",
"label.this-year": "今年",
"label.timezone": "タイムゾーン",
"label.today": "今日",
+ "label.tracking-code": "トラッキングコード",
"label.unknown": "不明",
"label.username": "ユーザー名",
+ "label.view-details": "詳細を見る",
"label.websites": "Webサイト",
"message.active-users": "{x}人が閲覧中です。",
"message.confirm-delete": "{target}を削除してもよろしいですか?",
@@ -55,11 +65,12 @@
"message.get-tracking-code": "トラッキングコードを取得",
"message.go-to-settings": "設定する",
"message.incorrect-username-password": "ユーザー名/パスワードが正しくありません。",
+ "message.log.visitor": "Visitor from {country} using {browser} on {os} {device}",
"message.new-version-available": "新しいバージョン({version})が利用可能です!",
"message.no-data-available": "データがありません。",
"message.no-websites-configured": "Webサイトが設定されていません。",
"message.page-not-found": "ページが見つかりません。",
- "message.powered-by": "Powered by {name}",
+ "message.powered-by": "このシステムは {name} で実行されています。",
"message.save-success": "正常に保存されました。",
"message.share-url": "これは {target} の共有リンクです。",
"message.track-stats": "{target}のアクセス解析を開始するには、次のコードをWebサイトの{head}セクションへ追加してください。",
@@ -84,14 +95,5 @@
"metrics.referrers": "リファラー",
"metrics.unique-visitors": "ユニーク訪問者数",
"metrics.views": "閲覧数",
- "metrics.visitors": "訪問者数",
- "title.add-account": "アカウントの追加",
- "title.add-website": "Webサイトの追加",
- "title.change-password": "パスワード変更",
- "title.delete-account": "アカウントの削除",
- "title.delete-website": "Webサイトの削除",
- "title.edit-account": "アカウントの編集",
- "title.edit-website": "Webサイトの編集",
- "title.share-url": "共有リンク",
- "title.tracking-code": "トラッキングコード"
+ "metrics.visitors": "訪問者数"
}
diff --git a/lang/mn-MN.json b/lang/mn-MN.json
index 694e068e..f40f30f1 100644
--- a/lang/mn-MN.json
+++ b/lang/mn-MN.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Хэрэглэгч нэмэх",
- "button.add-website": "Веб нэмэх",
- "button.back": "Буцах",
- "button.cancel": "Цуцлах",
- "button.change-password": "Нууц үг солих",
- "button.copy-to-clipboard": "Хуулах",
- "button.date-range": "Хугацааны мужид",
- "button.delete": "Устгах",
- "button.dismiss": "Үл хэргэсэх",
- "button.edit": "Засах",
- "button.login": "Нэвтрэх",
- "button.more": "Цааш",
- "button.refresh": "Сэргээх",
- "button.reset": "Хуучин хэвд нь оруулах",
- "button.save": "Хадгалах",
- "button.single-day": "Нэг өдөр",
- "button.view-details": "Дэлгэрүүлж харах",
"label.accounts": "Хэрэглэгчид",
+ "label.add-account": "Хэрэглэгч нэмэх",
+ "label.add-website": "Веб нэмэх",
"label.administrator": "Админ",
+ "label.all": "Бүх",
+ "label.all-websites": "Бүх вебүүд",
+ "label.back": "Буцах",
+ "label.cancel": "Цуцлах",
+ "label.change-password": "Нууц үг солих",
"label.confirm-password": "Шинэ нууц үгээ давтах",
+ "label.copy-to-clipboard": "Хуулах",
"label.current-password": "Ашиглаж буй нууц үг",
"label.custom-range": "Дурын хугацаа",
"label.dashboard": "Хянах самбар",
+ "label.date-range": "Хугацааны мужид",
"label.default-date-range": "Өгөгдмөл хугацааны муж",
+ "label.delete": "Устгах",
+ "label.delete-account": "Хэрэглэгч устгах",
+ "label.delete-website": "Веб устгах",
+ "label.dismiss": "Үл хэргэсэх",
"label.domain": "Домэйн",
+ "label.edit": "Засах",
+ "label.edit-account": "Хэрэглэгч засах",
+ "label.edit-website": "Веб засах",
"label.enable-share-url": "Хуваалцах холбоос идэвхжүүлэх",
"label.invalid": "Буруу",
"label.invalid-domain": "Буруу домэйн",
"label.last-days": "Сүүлийн {x} хоног",
"label.last-hours": "Сүүлийн {x} цаг",
"label.logged-in-as": "{username}-р нэвтэрсэн",
+ "label.login": "Нэвтрэх",
"label.logout": "Гарах",
+ "label.more": "Цааш",
"label.name": "Нэр",
"label.new-password": "Шинэ нууц үг",
"label.password": "Нууц үг",
"label.passwords-dont-match": "Нууц үг тохирохгүй байна",
"label.profile": "Бүртгэл",
+ "label.realtime": "Яг одоо",
+ "label.realtime-logs": "Бодит хугацааны бүртгэл",
+ "label.refresh": "Сэргээх",
"label.required": "Шаардлагатай",
+ "label.reset": "Хуучин хэвд нь оруулах",
+ "label.save": "Хадгалах",
"label.settings": "Тохиргоо",
+ "label.share-url": "Хуваалцах холбоос",
+ "label.single-day": "Нэг өдөр",
"label.this-month": "Энэ сар",
"label.this-week": "Энэ долоо хоног",
"label.this-year": "Энэ жил",
"label.timezone": "Цагийн бүс",
"label.today": "Өнөөдөр",
+ "label.tracking-code": "Мөрдөх код",
"label.unknown": "Тодорхойгүй",
"label.username": "Хэрэглэгчийн нэр",
+ "label.view-details": "Дэлгэрүүлж харах",
"label.websites": "Вебүүд",
"message.active-users": "одоо {x} {x, plural, one {зочин} other {зочин}} байна",
"message.confirm-delete": "Та {target}-г устгахдаа итгэлтэй байна уу?",
@@ -55,11 +65,12 @@
"message.get-tracking-code": "Мөрдөх код авах",
"message.go-to-settings": "Тохиргоо руу очих",
"message.incorrect-username-password": "Буруу хэрэглэгчийн нэр/нууц үг.",
+ "message.log.visitor": "{country} улсаас {os} {device} дээр {browser} хөтөч ашиглан орсон",
"message.new-version-available": "Umami-гийн шинэ хувилбар {version} гарсан байна!",
"message.no-data-available": "Өгөгдөл алга.",
"message.no-websites-configured": "Та ямар нэгэн веб тохируулаагүй байна.",
"message.page-not-found": "Хуудас олдсонгүй.",
- "message.powered-by": "Powered by {name}",
+ "message.powered-by": "{name} дээр суурилсан",
"message.save-success": "Амжилттай хадгаллаа.",
"message.share-url": "{target}-г нийтэд хуваалцах холбоос.",
"message.track-stats": "{target} вебийн статистикийг бүртгэхийн тулд доорх кодыг вебийнхээ {head} хэсэгт байрлуулна уу.",
@@ -84,14 +95,5 @@
"metrics.referrers": "Чиглүүлэгч",
"metrics.unique-visitors": "Зочид",
"metrics.views": "Үзсэн",
- "metrics.visitors": "Зочид",
- "title.add-account": "Хэрэглэгч нэмэх",
- "title.add-website": "Веб нэмэх",
- "title.change-password": "Нууц үг солих",
- "title.delete-account": "Хэрэглэгч устгах",
- "title.delete-website": "Веб устгах",
- "title.edit-account": "Хэрэглэгч засах",
- "title.edit-website": "Веб засах",
- "title.share-url": "Хуваалцах холбоос",
- "title.tracking-code": "Мөрдөх код"
+ "metrics.visitors": "Зочид"
}
diff --git a/lang/nb-NO.json b/lang/nb-NO.json
index dcd97d47..75f9020a 100644
--- a/lang/nb-NO.json
+++ b/lang/nb-NO.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Legg til konto",
- "button.add-website": "Legg til nettsted",
- "button.back": "Tilbake",
- "button.cancel": "Avvis",
- "button.change-password": "Bytt passord",
- "button.copy-to-clipboard": "Kopier til utklippstavle",
- "button.date-range": "Datointervall",
- "button.delete": "Slett",
- "button.dismiss": "Avbryt",
- "button.edit": "Rediger",
- "button.login": "Logg inn",
- "button.more": "Mer",
- "button.refresh": "Oppdater",
- "button.reset": "Nullstill",
- "button.save": "Lagre",
- "button.single-day": "Enkelt dag",
- "button.view-details": "Vis detaljer",
"label.accounts": "Kontoer",
+ "label.add-account": "Legg til konto",
+ "label.add-website": "Legg til nettsted",
"label.administrator": "Administrator",
+ "label.all": "Alle",
+ "label.all-websites": "Alle nettsteder",
+ "label.back": "Tilbake",
+ "label.cancel": "Avvis",
+ "label.change-password": "Bytt passord",
"label.confirm-password": "Godkjenn passord",
+ "label.copy-to-clipboard": "Kopier til utklippstavle",
"label.current-password": "Nåværende passord",
"label.custom-range": "Egendefinert utvalg",
"label.dashboard": "Dashboard",
+ "label.date-range": "Datointervall",
"label.default-date-range": "Standard datoperiode",
+ "label.delete": "Slett",
+ "label.delete-account": "Slett konto",
+ "label.delete-website": "Slett nettstedet",
+ "label.dismiss": "Avbryt",
"label.domain": "Domene",
+ "label.edit": "Rediger",
+ "label.edit-account": "Rediger konto",
+ "label.edit-website": "Rediger nettsted",
"label.enable-share-url": "Aktiver delings-URL",
"label.invalid": "Ugyldig",
"label.invalid-domain": "Ugyldig domene",
"label.last-days": "Siste {x} dager",
"label.last-hours": "Siste {x} timer",
"label.logged-in-as": "Logget på som {brukernavn}",
+ "label.login": "Logg inn",
"label.logout": "Logg ut",
+ "label.more": "Mer",
"label.name": "Navn",
"label.new-password": "Nytt passord",
"label.password": "Passord",
"label.passwords-dont-match": "Passordene er ikke like",
"label.profile": "Profil",
+ "label.realtime": "Sanntid",
+ "label.realtime-logs": "Sanntidslogger",
+ "label.refresh": "Oppdater",
"label.required": "Påkrevd",
+ "label.reset": "Nullstill",
+ "label.save": "Lagre",
"label.settings": "Innstillinger",
+ "label.share-url": "Del URL",
+ "label.single-day": "Enkelt dag",
"label.this-month": "Denne måneden",
"label.this-week": "Denne uka",
"label.this-year": "I år",
"label.timezone": "Tidssone",
"label.today": "I dag",
+ "label.tracking-code": "Sporingskode",
"label.unknown": "Ukjent",
"label.username": "Brukernavn",
+ "label.view-details": "Vis detaljer",
"label.websites": "Nettsteder",
"message.active-users": "{x} {x, plural, one {besøkende} other {besøkende}} nå",
"message.confirm-delete": "Er du sikker på at du vil slette {target}?",
@@ -55,6 +65,7 @@
"message.get-tracking-code": "Få sporingskode",
"message.go-to-settings": "Gå til innstillinger",
"message.incorrect-username-password": "Ugyldig brukernavn/passord.",
+ "message.log.visitor": "Besøkende fra {country} med {browser} på {os} {device}",
"message.new-version-available": "En ny versjon av umami {version} er tilgjengelig!",
"message.no-data-available": "Ingen data tilgjengelig.",
"message.no-websites-configured": "Du har ikke satt opp noen nettsteder.",
@@ -69,8 +80,8 @@
"metrics.bounce-rate": "Avvisningsfrekvens",
"metrics.browsers": "Nettlesere",
"metrics.countries": "Land",
- "metrics.device.desktop": "Desktop",
- "metrics.device.laptop": "Laptop",
+ "metrics.device.desktop": "Stasjonær",
+ "metrics.device.laptop": "Bærbar",
"metrics.device.mobile": "Mobiltelefon",
"metrics.device.tablet": "Nettbrett",
"metrics.devices": "Enheter",
@@ -84,14 +95,5 @@
"metrics.referrers": "Referanser",
"metrics.unique-visitors": "Unike besøkende",
"metrics.views": "Visninger",
- "metrics.visitors": "Besøkende",
- "title.add-account": "Legg til konto",
- "title.add-website": "Legg til nettsted",
- "title.change-password": "Bytt passord",
- "title.delete-account": "Slett konto",
- "title.delete-website": "Slett nettstedet",
- "title.edit-account": "Rediger konto",
- "title.edit-website": "Rediger nettsted",
- "title.share-url": "Del URL",
- "title.tracking-code": "Sporingskode"
+ "metrics.visitors": "Besøkende"
}
diff --git a/lang/nl-NL.json b/lang/nl-NL.json
index 54f7894f..56eaf90a 100644
--- a/lang/nl-NL.json
+++ b/lang/nl-NL.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Account toevoegen",
- "button.add-website": "Website toevoegen",
- "button.back": "Terug",
- "button.cancel": "Annuleren",
- "button.change-password": "Wachtwoord wijzigen",
- "button.copy-to-clipboard": "Kopiëer naar klembord",
- "button.date-range": "Datumbereik",
- "button.delete": "Verwijderen",
- "button.dismiss": "Negeren",
- "button.edit": "Bewerken",
- "button.login": "Inloggen",
- "button.more": "Toon meer",
- "button.refresh": "Vernieuwen",
- "button.reset": "Resetten",
- "button.save": "Opslaan",
- "button.single-day": "Enkele dag",
- "button.view-details": "Meer details",
"label.accounts": "Gebruikers",
+ "label.add-account": "Account toevoegen",
+ "label.add-website": "Website toevoegen",
"label.administrator": "Administrator",
+ "label.all": "Alles",
+ "label.all-websites": "Alle websites",
+ "label.back": "Terug",
+ "label.cancel": "Annuleren",
+ "label.change-password": "Wachtwoord wijzigen",
"label.confirm-password": "Wachtwoord bevestigen",
+ "label.copy-to-clipboard": "Kopiëer naar klembord",
"label.current-password": "Huidig wachtwoord",
"label.custom-range": "Aangepast bereik",
"label.dashboard": "Overzicht",
+ "label.date-range": "Datumbereik",
"label.default-date-range": "Standaard bereik",
+ "label.delete": "Verwijderen",
+ "label.delete-account": "Account verwijderen",
+ "label.delete-website": "Website verwijderen",
+ "label.dismiss": "Negeren",
"label.domain": "Domein",
+ "label.edit": "Bewerken",
+ "label.edit-account": "Account bewerken",
+ "label.edit-website": "Website bewerken",
"label.enable-share-url": "Sta delen via openbare URL toe",
"label.invalid": "Ongeldig",
"label.invalid-domain": "Ongeldig domein",
"label.last-days": "Laatste {x} dagen",
"label.last-hours": "Laatste {x} uur",
"label.logged-in-as": "Ingelogd als {username}",
+ "label.login": "Inloggen",
"label.logout": "Uitloggen",
+ "label.more": "Toon meer",
"label.name": "Naam",
"label.new-password": "Nieuw wachtwoord",
"label.password": "Wachtwoord",
"label.passwords-dont-match": "Wachtwoorden komen niet overeen",
"label.profile": "Profiel",
+ "label.realtime": "Actueel",
+ "label.realtime-logs": "Actueel logboek",
+ "label.refresh": "Vernieuwen",
"label.required": "Verplicht",
+ "label.reset": "Resetten",
+ "label.save": "Opslaan",
"label.settings": "Instellingen",
+ "label.share-url": "URL delen",
+ "label.single-day": "Enkele dag",
"label.this-month": "Deze maand",
"label.this-week": "Deze week",
"label.this-year": "Dit jaar",
"label.timezone": "Tijdzone",
"label.today": "Vandaag",
+ "label.tracking-code": "Volgcode",
"label.unknown": "Onbekend",
"label.username": "Gebruikersnaam",
+ "label.view-details": "Meer details",
"label.websites": "Websites",
"message.active-users": "{x} actieve {x, plural, one {bezoeker} other {bezoekers}}",
"message.confirm-delete": "Weet je zeker dat je {target} wilt verwijderen?",
@@ -55,6 +65,7 @@
"message.get-tracking-code": "Tracking code",
"message.go-to-settings": "Naar instellingen",
"message.incorrect-username-password": "Incorrecte gebruikersnaam/wachtwoord.",
+ "message.log.visitor": "Bezoeker uit {country} met {browser} op een {os} {device}",
"message.new-version-available": "Een nieuwe versie van umami {version} is beschikbaar!",
"message.no-data-available": "Geen gegevens beschikbaar.",
"message.no-websites-configured": "Je hebt geen websites ingesteld.",
@@ -84,14 +95,5 @@
"metrics.referrers": "Verwijzers",
"metrics.unique-visitors": "Unieke bezoekers",
"metrics.views": "Weergaven",
- "metrics.visitors": "Bezoekers",
- "title.add-account": "Account toevoegen",
- "title.add-website": "Website toevoegen",
- "title.change-password": "Wachtwoord wijzigen",
- "title.delete-account": "Account verwijderen",
- "title.delete-website": "Website verwijderen",
- "title.edit-account": "Account bewerken",
- "title.edit-website": "Website bewerken",
- "title.share-url": "URL delen",
- "title.tracking-code": "Tracking code"
+ "metrics.visitors": "Bezoekers"
}
diff --git a/lang/pt-PT.json b/lang/pt-PT.json
index db9a8a7f..3ba2cccf 100644
--- a/lang/pt-PT.json
+++ b/lang/pt-PT.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Adicionar conta",
- "button.add-website": "Adicionar website",
- "button.back": "Voltar",
- "button.cancel": "Cancelar",
- "button.change-password": "Alterar palavra-passe",
- "button.copy-to-clipboard": "Copiar para a área de transferência",
- "button.date-range": "Intervalo de datas",
- "button.delete": "Eliminar",
- "button.dismiss": "Ignorar",
- "button.edit": "Editar",
- "button.login": "Iniciar sessão",
- "button.more": "Mais",
- "button.refresh": "Atualizar",
- "button.reset": "Repor",
- "button.save": "Guardar",
- "button.single-day": "Dia único",
- "button.view-details": "Ver detalhes",
"label.accounts": "Contas",
+ "label.add-account": "Adicionar conta",
+ "label.add-website": "Adicionar website",
"label.administrator": "Administrador",
+ "label.all": "Todos",
+ "label.all-websites": "Todos os websites",
+ "label.back": "Voltar",
+ "label.cancel": "Cancelar",
+ "label.change-password": "Alterar palavra-passe",
"label.confirm-password": "Confirmar palavra-passe",
+ "label.copy-to-clipboard": "Copiar para a área de transferência",
"label.current-password": "Palavra-passe atual",
"label.custom-range": "Intervalo personalizado",
"label.dashboard": "Dashboard",
+ "label.date-range": "Intervalo de datas",
"label.default-date-range": "Intervalo de datas predefinido",
+ "label.delete": "Eliminar",
+ "label.delete-account": "Eliminar conta",
+ "label.delete-website": "Eliminar website",
+ "label.dismiss": "Ignorar",
"label.domain": "Domínio",
+ "label.edit": "Editar",
+ "label.edit-account": "Editar conta",
+ "label.edit-website": "Editar website",
"label.enable-share-url": "Ativar link de partilha",
"label.invalid": "Inválido",
"label.invalid-domain": "Domínio inválido",
"label.last-days": "Últimos {x} dias",
"label.last-hours": "Últimas {x} horas",
"label.logged-in-as": "Sessão iniciada como {username}",
+ "label.login": "Iniciar sessão",
"label.logout": "Sair",
+ "label.more": "Mais",
"label.name": "Nome",
"label.new-password": "Nova palavra-passe",
"label.password": "Palavra-passe",
"label.passwords-dont-match": "Palavra-passes não correspondem",
"label.profile": "Perfil",
+ "label.realtime": "Tempo real",
+ "label.realtime-logs": "Relatório em tempo real",
+ "label.refresh": "Atualizar",
"label.required": "Obrigatório",
+ "label.reset": "Repor",
+ "label.save": "Guardar",
"label.settings": "Definições",
+ "label.share-url": "Partilhar link",
+ "label.single-day": "Dia único",
"label.this-month": "Este mês",
"label.this-week": "Esta semana",
"label.this-year": "Este ano",
"label.timezone": "Fuso horário",
"label.today": "Hoje",
+ "label.tracking-code": "Código de tracking",
"label.unknown": "Desconhecido",
"label.username": "Nome de utilizador",
+ "label.view-details": "Ver detalhes",
"label.websites": "Websites",
"message.active-users": "{x} {x, plural, one {visitante} other {visitantes}} neste momento",
"message.confirm-delete": "Tens a certeza que queres eliminar {target}?",
@@ -55,6 +65,7 @@
"message.get-tracking-code": "Obter código de tracking",
"message.go-to-settings": "Ir para as definições",
"message.incorrect-username-password": "Nome de utilizador/palavra-passe incorretos.",
+ "message.log.visitor": "Visitante de {country} a usar {browser} no {device} {os}",
"message.new-version-available": "Uma nova versão de umami {version} está disponível!",
"message.no-data-available": "Sem dados disponíveis.",
"message.no-websites-configured": "Não tens nenhum website configurado.",
@@ -84,14 +95,5 @@
"metrics.referrers": "Referrers",
"metrics.unique-visitors": "Visitantes únicos",
"metrics.views": "Visualizações",
- "metrics.visitors": "Visitantes",
- "title.add-account": "Adicionar conta",
- "title.add-website": "Adicionar website",
- "title.change-password": "Alterar palavra-passe",
- "title.delete-account": "Eliminar conta",
- "title.delete-website": "Eliminar website",
- "title.edit-account": "Editar conta",
- "title.edit-website": "Editar website",
- "title.share-url": "Partilhar link",
- "title.tracking-code": "Código de tracking"
+ "metrics.visitors": "Visitantes"
}
diff --git a/lang/ro-RO.json b/lang/ro-RO.json
index edaf27d6..9ef15254 100644
--- a/lang/ro-RO.json
+++ b/lang/ro-RO.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Adaugă cont",
- "button.add-website": "Adaugă site web",
- "button.back": "Înapoi",
- "button.cancel": "Anulează",
- "button.change-password": "Schimbă parola",
- "button.copy-to-clipboard": "Copiază în clipboard",
- "button.date-range": "Interval de date",
- "button.delete": "Șterge",
- "button.dismiss": "Renunță",
- "button.edit": "Editare",
- "button.login": "Autentificare",
- "button.more": "Mai mult",
- "button.refresh": "Reîmprospătare",
- "button.reset": "Resetează",
- "button.save": "Salvează",
- "button.single-day": "O singură zi",
- "button.view-details": "Vizualizare detalii",
"label.accounts": "Conturi",
+ "label.add-account": "Adăugare cont",
+ "label.add-website": "Adăugare site web",
"label.administrator": "Administrator",
+ "label.all": "All",
+ "label.all-websites": "All websites",
+ "label.back": "Înapoi",
+ "label.cancel": "Anulează",
+ "label.change-password": "Schimbare parolă",
"label.confirm-password": "Confirmare parolă",
+ "label.copy-to-clipboard": "Copiază în clipboard",
"label.current-password": "Parola curentă",
"label.custom-range": "Interval personalizat",
"label.dashboard": "Tablou de bord",
+ "label.date-range": "Interval de date",
"label.default-date-range": "Interval de date implicit",
+ "label.delete": "Șterge",
+ "label.delete-account": "Ștergere cont",
+ "label.delete-website": "Ștergere site web",
+ "label.dismiss": "Renunță",
"label.domain": "Domeniu",
+ "label.edit": "Editare",
+ "label.edit-account": "Editare cont",
+ "label.edit-website": "Editare site web",
"label.enable-share-url": "Activare adresa URL de distribuire",
"label.invalid": "Invalid",
"label.invalid-domain": "Invalid domain",
"label.last-days": "Ultimele {x} zile",
"label.last-hours": "Ultimele {x} ore",
"label.logged-in-as": "Autentificat ca {username}",
+ "label.login": "Autentificare",
"label.logout": "Dezautentificare",
+ "label.more": "Mai mult",
"label.name": "Nume",
"label.new-password": "Parola nouă",
"label.password": "Parolă",
"label.passwords-dont-match": "Parolele nu se potrivesc",
"label.profile": "Profil",
+ "label.realtime": "Realtime",
+ "label.realtime-logs": "Realtime logs",
+ "label.refresh": "Reîmprospătare",
"label.required": "Obligatoriu",
+ "label.reset": "Resetează",
+ "label.save": "Salvează",
"label.settings": "Setări",
+ "label.share-url": "Partajare URL",
+ "label.single-day": "O singură zi",
"label.this-month": "Această lună",
"label.this-week": "Această săptămână",
"label.this-year": "Acest an",
"label.timezone": "Fus orar",
"label.today": "Astăzi",
+ "label.tracking-code": "Cod de urmărire",
"label.unknown": "Necunoscut",
"label.username": "Username",
+ "label.view-details": "Vizualizare detalii",
"label.websites": "Site-uri web",
"message.active-users": "{x} {x, plural, one {vizitator activ} other {vizitatori activi}}",
"message.confirm-delete": "Sunteți sigur că doriți să ștergeți {target}?",
@@ -55,6 +65,7 @@
"message.get-tracking-code": "Obține codul de urmărire",
"message.go-to-settings": "Mergi la Setări",
"message.incorrect-username-password": "Username/parolă incorecte.",
+ "message.log.visitor": "Visitor from {country} using {browser} on {os} {device}",
"message.new-version-available": "Este disponibilă o nouă versiune {version} de umami!",
"message.no-data-available": "Nicio informație disponibilă.",
"message.no-websites-configured": "Nu aveți niciun site web configurat.",
@@ -84,14 +95,5 @@
"metrics.referrers": "Site-uri de proveniență",
"metrics.unique-visitors": "Vizitatori unici",
"metrics.views": "Vizualizări",
- "metrics.visitors": "Vizitatori",
- "title.add-account": "Adăugare cont",
- "title.add-website": "Adăugare site web",
- "title.change-password": "Schimbare parolă",
- "title.delete-account": "Ștergere cont",
- "title.delete-website": "Ștergere site web",
- "title.edit-account": "Editare cont",
- "title.edit-website": "Editare site web",
- "title.share-url": "Partajare URL",
- "title.tracking-code": "Cod de urmărire"
+ "metrics.visitors": "Vizitatori"
}
diff --git a/lang/ru-RU.json b/lang/ru-RU.json
index 74985574..e9b7f43e 100644
--- a/lang/ru-RU.json
+++ b/lang/ru-RU.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Добавить аккаунт",
- "button.add-website": "Добавить сайт",
- "button.back": "Назад",
- "button.cancel": "Отменить",
- "button.change-password": "Изменить пароль",
- "button.copy-to-clipboard": "Скопировать в буфер обмена",
- "button.date-range": "Диапазон дат",
- "button.delete": "Удалить",
- "button.dismiss": "Отклонить",
- "button.edit": "Редактировать",
- "button.login": "Войти",
- "button.more": "Больше",
- "button.refresh": "Обновить",
- "button.reset": "Сбросить",
- "button.save": "Сохранить",
- "button.single-day": "Один день",
- "button.view-details": "Посмотреть детали",
"label.accounts": "Аккаунты",
+ "label.add-account": "Добавить аккаунт",
+ "label.add-website": "Добавить сайт",
"label.administrator": "Администратор",
+ "label.all": "Все",
+ "label.all-websites": "Все сайты",
+ "label.back": "Назад",
+ "label.cancel": "Отменить",
+ "label.change-password": "Изменить пароль",
"label.confirm-password": "Подтвердить пароль",
+ "label.copy-to-clipboard": "Скопировать в буфер обмена",
"label.current-password": "Текущий пароль",
"label.custom-range": "Другой период",
"label.dashboard": "Информационная панель",
+ "label.date-range": "Диапазон дат",
"label.default-date-range": "Диапазон дат по-умолчанию",
+ "label.delete": "Удалить",
+ "label.delete-account": "Удалить аккаунт",
+ "label.delete-website": "Удалить сайт",
+ "label.dismiss": "Отклонить",
"label.domain": "Домен",
+ "label.edit": "Редактировать",
+ "label.edit-account": "Редактировать аккаунт",
+ "label.edit-website": "Редактировать сайт",
"label.enable-share-url": "Разрешить делиться ссылкой",
"label.invalid": "Некорректный",
"label.invalid-domain": "Некорректный домен",
"label.last-days": "Последние {x} дней",
"label.last-hours": "Последние {x} часа",
"label.logged-in-as": "Вы вошли как {username}",
+ "label.login": "Войти",
"label.logout": "Выйти",
+ "label.more": "Больше",
"label.name": "Имя",
"label.new-password": "Новый пароль",
"label.password": "Пароль",
"label.passwords-dont-match": "Пароли не совпадают",
"label.profile": "Профиль",
+ "label.realtime": "Реальное время",
+ "label.realtime-logs": "Логи в реальном времени",
+ "label.refresh": "Обновить",
"label.required": "Обязательное",
+ "label.reset": "Сбросить",
+ "label.save": "Сохранить",
"label.settings": "Настройки",
+ "label.share-url": "Поделиться ссылкой",
+ "label.single-day": "Один день",
"label.this-month": "Этот месяц",
"label.this-week": "Эта неделя",
"label.this-year": "Этот год",
"label.timezone": "Часовой пояс",
"label.today": "Сегодня",
+ "label.tracking-code": "Код отслеживания",
"label.unknown": "Неизвестно",
"label.username": "Имя пользователя",
+ "label.view-details": "Посмотреть детали",
"label.websites": "Сайты",
"message.active-users": "{x} текущих посетителей",
"message.confirm-delete": "Вы уверены, что хотите удалить {target}?",
@@ -55,6 +65,7 @@
"message.get-tracking-code": "Получить код отслеживания",
"message.go-to-settings": "Перейти к настройкам",
"message.incorrect-username-password": "Неверное имя пользователя/пароль.",
+ "message.log.visitor": "Посетитель из {country} используя {browser} на {os} {device}",
"message.new-version-available": "Доступна новая версия umami {version}",
"message.no-data-available": "Нет данных.",
"message.no-websites-configured": "У вас нет настроенных сайтов.",
@@ -84,14 +95,5 @@
"metrics.referrers": "Источники",
"metrics.unique-visitors": "Уникальные посетители",
"metrics.views": "Просмотры",
- "metrics.visitors": "Посетители",
- "title.add-account": "Добавить аккаунт",
- "title.add-website": "Добавить сайт",
- "title.change-password": "Изменить пароль",
- "title.delete-account": "Удалить аккаунт",
- "title.delete-website": "Удалить сайт",
- "title.edit-account": "Редактировать аккаунт",
- "title.edit-website": "Редактировать сайт",
- "title.share-url": "Поделиться ссылкой",
- "title.tracking-code": "Код отслеживания"
+ "metrics.visitors": "Посетители"
}
diff --git a/lang/sv-SE.json b/lang/sv-SE.json
index 9e5e5958..3023ed90 100644
--- a/lang/sv-SE.json
+++ b/lang/sv-SE.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Lägg till konto",
- "button.add-website": "Lägg till webbsajt",
- "button.back": "Tillbaka",
- "button.cancel": "Avbryt",
- "button.change-password": "Byt lösenord",
- "button.copy-to-clipboard": "Kopiera till urklipp",
- "button.date-range": "Datumomfång",
- "button.delete": "Radera",
- "button.dismiss": "Dismiss",
- "button.edit": "Redigera",
- "button.login": "Logga in",
- "button.more": "Mer",
- "button.refresh": "Uppdatera",
- "button.reset": "Återställ",
- "button.save": "Spara",
- "button.single-day": "En dag",
- "button.view-details": "Visa detaljer",
"label.accounts": "Konton",
+ "label.add-account": "Lägg till konto",
+ "label.add-website": "Lägg till webbsajt",
"label.administrator": "Administratör",
+ "label.all": "Alla",
+ "label.all-websites": "Alla sajter",
+ "label.back": "Tillbaka",
+ "label.cancel": "Avbryt",
+ "label.change-password": "Byt lösenord",
"label.confirm-password": "Bekräfta lösenord",
+ "label.copy-to-clipboard": "Kopiera till urklipp",
"label.current-password": "Nuvarande lösenord",
"label.custom-range": "Anpassat urval",
- "label.dashboard": "Instrumentpanel",
+ "label.dashboard": "Översikt",
+ "label.date-range": "Datumomfång",
"label.default-date-range": "Standard datum-urval",
+ "label.delete": "Radera",
+ "label.delete-account": "Radera konto",
+ "label.delete-website": "Radera webbsajt",
+ "label.dismiss": "Avbryt",
"label.domain": "Domän",
+ "label.edit": "Redigera",
+ "label.edit-account": "Redigera konto",
+ "label.edit-website": "Redigera webbsajt",
"label.enable-share-url": "Aktivera delnings-URL",
"label.invalid": "Ogiltig",
"label.invalid-domain": "Ogiltig domän",
"label.last-days": "Senaste {x} dagarna",
"label.last-hours": "Senaste {x} timmarna",
"label.logged-in-as": "Inloggad som {username}",
+ "label.login": "Logga in",
"label.logout": "Logga ut",
+ "label.more": "Mer",
"label.name": "Namn",
"label.new-password": "Nytt lösenord",
"label.password": "Lösenord",
"label.passwords-dont-match": "Lösenorden är inte samma",
"label.profile": "Profil",
+ "label.realtime": "Realtid",
+ "label.realtime-logs": "Realtidsloggar",
+ "label.refresh": "Uppdatera",
"label.required": "Krävs",
+ "label.reset": "Återställ",
+ "label.save": "Spara",
"label.settings": "Inställningar",
+ "label.share-url": "Delnings-URL",
+ "label.single-day": "En dag",
"label.this-month": "Denna månad",
"label.this-week": "Denna vecka",
"label.this-year": "Detta år",
"label.timezone": "Tidszon",
"label.today": "Idag",
+ "label.tracking-code": "Spårningskod",
"label.unknown": "Okänd",
"label.username": "Användarnamn",
+ "label.view-details": "Visa detaljer",
"label.websites": "Webbsajt",
"message.active-users": "{x} {x, plural, one {besökare} other {besökare}} just nu",
"message.confirm-delete": "Är du säker på att du vill radera {target}?",
@@ -55,7 +65,8 @@
"message.get-tracking-code": "Visa spårningskod",
"message.go-to-settings": "Gå till inställningar",
"message.incorrect-username-password": "Felaktikt användarnamn/lösenord.",
- "message.new-version-available": "A new version of umami {version} is available!",
+ "message.log.visitor": "Besökare från {country} med {browser} på {os} {device}",
+ "message.new-version-available": "En ny version av umami {version} är tillgänglig!",
"message.no-data-available": "Ingen data tillgänglig.",
"message.no-websites-configured": "Du har inga webbsajter.",
"message.page-not-found": "Sidan kan inte hittas.",
@@ -69,8 +80,8 @@
"metrics.bounce-rate": "Avvisningfrekvens",
"metrics.browsers": "Webbläsare",
"metrics.countries": "Länder",
- "metrics.device.desktop": "Desktop",
- "metrics.device.laptop": "Laptop",
+ "metrics.device.desktop": "Stationär",
+ "metrics.device.laptop": "Bärbar",
"metrics.device.mobile": "Mobil",
"metrics.device.tablet": "Platta",
"metrics.devices": "Enheter",
@@ -84,14 +95,5 @@
"metrics.referrers": "Hänvisare",
"metrics.unique-visitors": "Unika besökare",
"metrics.views": "Visningar",
- "metrics.visitors": "Besökare",
- "title.add-account": "Lägg till konto",
- "title.add-website": "Lägg till webbsajt",
- "title.change-password": "Byt lösenord",
- "title.delete-account": "Radera konto",
- "title.delete-website": "Radera webbsajt",
- "title.edit-account": "Redigera konto",
- "title.edit-website": "Redigera webbsajt",
- "title.share-url": "Delnings-URL",
- "title.tracking-code": "Spårningskod"
+ "metrics.visitors": "Besökare"
}
diff --git a/lang/tr-TR.json b/lang/tr-TR.json
index 2e84051d..b821d5dc 100644
--- a/lang/tr-TR.json
+++ b/lang/tr-TR.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "Yeni Hesap Ekle",
- "button.add-website": "Web sitesi ekle",
- "button.back": "Geri",
- "button.cancel": "İptal",
- "button.change-password": "Şifre değiştir",
- "button.copy-to-clipboard": "Panoya kopyala",
- "button.date-range": "Tarih aralığı",
- "button.delete": "Sil",
- "button.dismiss": "Dismiss",
- "button.edit": "Düzenle",
- "button.login": "Giriş Yap",
- "button.more": "Detaylı göster",
- "button.refresh": "Yenile",
- "button.reset": "Sıfırla",
- "button.save": "Kaydet",
- "button.single-day": "Tekil gün",
- "button.view-details": "Detayı incele",
"label.accounts": "Hesaplar",
+ "label.add-account": "Hesap ekle",
+ "label.add-website": "Web sitesi ekle",
"label.administrator": "Yönetici",
+ "label.all": "Tümü",
+ "label.all-websites": "Tüm web siteleri",
+ "label.back": "Geri",
+ "label.cancel": "İptal",
+ "label.change-password": "Şifre değiştir",
"label.confirm-password": "Parolayı onayla",
+ "label.copy-to-clipboard": "Panoya kopyala",
"label.current-password": "Mevcut parola",
"label.custom-range": "Özelleştirilmiş aralık",
"label.dashboard": "Kontrol Paneli",
+ "label.date-range": "Tarih aralığı",
"label.default-date-range": "Varsayılan tarih aralığı",
+ "label.delete": "Sil",
+ "label.delete-account": "Hesabı sil",
+ "label.delete-website": "Web sitesini sil",
+ "label.dismiss": "Reddet",
"label.domain": "Alan adı",
+ "label.edit": "Düzenle",
+ "label.edit-account": "Hesabı düzenle",
+ "label.edit-website": "Web sitesini düzenle",
"label.enable-share-url": "Anonim paylaşım URL'i aktif",
- "label.invalid": "Geçeriz",
+ "label.invalid": "Geçersiz",
"label.invalid-domain": "Geçersiz alan adı",
"label.last-days": "Son {x} gün",
"label.last-hours": "Son {x} saat",
"label.logged-in-as": "{username} olarak giriş yapıldı.",
+ "label.login": "Giriş Yap",
"label.logout": "Çıkış Yap",
+ "label.more": "Detaylı göster",
"label.name": "İsim",
"label.new-password": "Yeni parola",
"label.password": "Parola",
"label.passwords-dont-match": "Parolalar uyuşmuyor",
"label.profile": "Profil",
+ "label.realtime": "Gerçek Zamanlı",
+ "label.realtime-logs": "Gerçek zamanlı kayıtlar",
+ "label.refresh": "Yenile",
"label.required": "Zorunlu alan",
+ "label.reset": "Sıfırla",
+ "label.save": "Kaydet",
"label.settings": "Ayarlar",
+ "label.share-url": "Paylaşım adresi",
+ "label.single-day": "Tekil gün",
"label.this-month": "Bu ay",
"label.this-week": "Bu hafta",
"label.this-year": "Bu yıl",
"label.timezone": "Zaman dilimi",
"label.today": "Bugün",
+ "label.tracking-code": "İzleme kodu",
"label.unknown": "Bilinmeyen",
"label.username": "Kullanıcı adı",
+ "label.view-details": "Detayı incele",
"label.websites": "Web siteleri",
"message.active-users": "{x} aktif ziyaretçi",
"message.confirm-delete": "{target} kaydını silmek istediğinizden emin misiniz?",
@@ -55,7 +65,8 @@
"message.get-tracking-code": "İzleme kodunu al",
"message.go-to-settings": "Ayarlara git",
"message.incorrect-username-password": "Hatalı kullanıcı adı ya da parola.",
- "message.new-version-available": "A new version of umami {version} is available!",
+ "message.log.visitor": "Yeni ziyaretçi: {country}, {os}, {device}, {browser}",
+ "message.new-version-available": "umami'nin yeni bir versiyonu ({version}) mevcut!",
"message.no-data-available": "Henüz hiç veri yok.",
"message.no-websites-configured": "Henüz hiç web sitesi tanımlamadınız",
"message.page-not-found": "Sayfa bulunamadı.",
@@ -84,14 +95,5 @@
"metrics.referrers": "Yönlendirenler",
"metrics.unique-visitors": "Tekil kullanıcı",
"metrics.views": "Görüntüleme",
- "metrics.visitors": "Ziyaretçi",
- "title.add-account": "Hesap ekle",
- "title.add-website": "Web sitesi ekle",
- "title.change-password": "Şifre değiştir",
- "title.delete-account": "Hesabı sil",
- "title.delete-website": "Web sitesini sil",
- "title.edit-account": "Hesabı düzenle",
- "title.edit-website": "Web sitesini düzenle",
- "title.share-url": "Paylaşım adresi",
- "title.tracking-code": "İzleme kodu"
-}
+ "metrics.visitors": "Ziyaretçi"
+}
\ No newline at end of file
diff --git a/lang/uk-UA.json b/lang/uk-UA.json
index 9c5065bf..cb504fe1 100644
--- a/lang/uk-UA.json
+++ b/lang/uk-UA.json
@@ -1,51 +1,61 @@
{
- "button.add-account": "Додати обліковий запис",
- "button.add-website": "Додати веб-сайт",
- "button.back": "Назад",
- "button.cancel": "Відмінити",
- "button.change-password": "Змінити пароль",
- "button.copy-to-clipboard": "Копіювати до буферу обміну",
- "button.date-range": "Діапазон дат",
- "button.delete": "Видалити",
- "button.dismiss": "Відхилити",
- "button.edit": "Редагувати",
- "button.login": "Увійти",
- "button.more": "Більше",
- "button.refresh": "Оновити",
- "button.reset": "Скинути",
- "button.save": "Зберегти",
- "button.single-day": "Один день",
- "button.view-details": "Переглянути деталі",
"label.accounts": "Облікові записи",
+ "label.add-account": "Додати обліковий запис",
+ "label.add-website": "Додати вебсайт",
"label.administrator": "Адміністратор",
+ "label.all": "Всі",
+ "label.all-websites": "Всі вебсайти",
+ "label.back": "Назад",
+ "label.cancel": "Відмінити",
+ "label.change-password": "Змінити пароль",
"label.confirm-password": "Підтвердити пароль",
+ "label.copy-to-clipboard": "Копіювати до буферу обміну",
"label.current-password": "Поточний пароль",
"label.custom-range": "Довільний період",
"label.dashboard": "Інформаційна панель",
+ "label.date-range": "Діапазон дат",
"label.default-date-range": "Діапазон дат за умовчанням",
+ "label.delete": "Видалити",
+ "label.delete-account": "Видалити обліковий запис",
+ "label.delete-website": "Видалити вебсайт",
+ "label.dismiss": "Відхилити",
"label.domain": "Домен",
+ "label.edit": "Редагувати",
+ "label.edit-account": "Редагувати обліковий запис",
+ "label.edit-website": "Редагувати вебсайт",
"label.enable-share-url": "Дозволити ділитися посиланням",
"label.invalid": "Некоректний",
"label.invalid-domain": "Некоректний домен",
"label.last-days": "Останні {x} днів",
"label.last-hours": "Останні {x} годин",
"label.logged-in-as": "Ви увійшли як {username}",
+ "label.login": "Увійти",
"label.logout": "Вийти",
+ "label.more": "Більше",
"label.name": "Ім'я",
"label.new-password": "Новий пароль",
"label.password": "Пароль",
"label.passwords-dont-match": "Паролі не співпадають",
"label.profile": "Профіль",
+ "label.realtime": "У реальному часі",
+ "label.realtime-logs": "Логи у реальному часі",
+ "label.refresh": "Оновити",
"label.required": "Обов'язкове",
+ "label.reset": "Скинути",
+ "label.save": "Зберегти",
"label.settings": "Налаштування",
+ "label.share-url": "Поділитися посилання",
+ "label.single-day": "Один день",
"label.this-month": "Поточний місяць",
"label.this-week": "Поточний тиждень",
"label.this-year": "Поточний рік",
"label.timezone": "Часовий пояс",
"label.today": "Сьогодні",
+ "label.tracking-code": "Код для відслідковування",
"label.unknown": "Невідомо",
"label.username": "Ім'я користувача",
- "label.websites": "Веб-сайти",
+ "label.view-details": "Переглянути деталі",
+ "label.websites": "Вебсайти",
"message.active-users": "{x} поточних відвідувачів",
"message.confirm-delete": "Ви впевнені, що бажаєте видалити {target}?",
"message.copied": "Скопійовано!",
@@ -55,14 +65,15 @@
"message.get-tracking-code": "Отримати код для відслідковування",
"message.go-to-settings": "Перейти до налаштувань",
"message.incorrect-username-password": "Невірне ім'я користувача або пароль.",
+ "message.log.visitor": "Відвідувач з {country} використовуючи {browser} на {os} {device}",
"message.new-version-available": "Нова версія umami {version} доступна!",
"message.no-data-available": "Немає даних.",
- "message.no-websites-configured": "У вас немає налаштованих веб-сайтів.",
+ "message.no-websites-configured": "У вас немає налаштованих вебсайтів.",
"message.page-not-found": "Сторінку не знайдено.",
"message.powered-by": "На базі {name}",
"message.save-success": "Збережено успішно.",
"message.share-url": "Це публічне посилання для {target}.",
- "message.track-stats": "Або відслідковувати статистику для {target}, розмістіть наступний код у {head} секції вашого веб-сайту.",
+ "message.track-stats": "Або відслідковувати статистику для {target}, розмістіть наступний код у {head} секції вашого вебсайту.",
"message.type-delete": "Введіть {delete} у полі нижче щоб підтвердити.",
"metrics.actions": "Дії",
"metrics.average-visit-time": "Середній час візиту",
@@ -84,14 +95,5 @@
"metrics.referrers": "Джерела",
"metrics.unique-visitors": "Унікальні відвідувачі",
"metrics.views": "Перегляди",
- "metrics.visitors": "Відвідувачі",
- "title.add-account": "Додати обліковий запис",
- "title.add-website": "Додати website",
- "title.change-password": "Змінити пароль",
- "title.delete-account": "Видалити обліковий запис",
- "title.delete-website": "Видалити веб-сайт",
- "title.edit-account": "Редагувати обліковий запис",
- "title.edit-website": "Редагувати веб-сайт",
- "title.share-url": "Поділитися посилання",
- "title.tracking-code": "Код для відслідковування"
+ "metrics.visitors": "Відвідувачі"
}
diff --git a/lang/zh-CN.json b/lang/zh-CN.json
index d5bf54cd..101cd6cd 100644
--- a/lang/zh-CN.json
+++ b/lang/zh-CN.json
@@ -1,50 +1,60 @@
{
- "button.add-account": "添加账户",
- "button.add-website": "添加网站",
- "button.back": "返回",
- "button.cancel": "取消",
- "button.change-password": "更新密码",
- "button.copy-to-clipboard": "复制",
- "button.date-range": "多日",
- "button.delete": "删除",
- "button.dismiss": "Dismiss",
- "button.edit": "编辑",
- "button.login": "登录",
- "button.more": "更多",
- "button.refresh": "刷新",
- "button.reset": "重置",
- "button.save": "保存",
- "button.single-day": "单日",
- "button.view-details": "查看更多",
"label.accounts": "账户",
+ "label.add-account": "添加账户",
+ "label.add-website": "添加网站",
"label.administrator": "管理员",
+ "label.all": "所有",
+ "label.all-websites": "全部网站",
+ "label.back": "返回",
+ "label.cancel": "取消",
+ "label.change-password": "更新密码",
"label.confirm-password": "确认密码",
+ "label.copy-to-clipboard": "复制",
"label.current-password": "目前密码",
"label.custom-range": "自定义时间段",
"label.dashboard": "仪表板",
+ "label.date-range": "多日",
"label.default-date-range": "默认日期范围",
+ "label.delete": "删除",
+ "label.delete-account": "删除账户",
+ "label.delete-website": "删除网站",
+ "label.dismiss": "关闭",
"label.domain": "域名",
+ "label.edit": "编辑",
+ "label.edit-account": "编辑账户",
+ "label.edit-website": "编辑网站",
"label.enable-share-url": "激活共享链接",
"label.invalid": "输入无效",
"label.invalid-domain": "无效域名",
"label.last-days": "最近 {x} 天",
"label.last-hours": "最近 {x} 小时",
"label.logged-in-as": "登录名: {username}",
+ "label.login": "登录",
"label.logout": "退出",
+ "label.more": "更多",
"label.name": "名字",
"label.new-password": "新密码",
"label.password": "密码",
"label.passwords-dont-match": "密码不一致",
"label.profile": "个人资料",
+ "label.realtime": "实时",
+ "label.realtime-logs": "实时日志",
+ "label.refresh": "刷新",
"label.required": "必填",
+ "label.reset": "重置",
+ "label.save": "保存",
"label.settings": "设置",
+ "label.share-url": "共享链接",
+ "label.single-day": "单日",
"label.this-month": "本月",
"label.this-week": "本周",
"label.this-year": "今年",
"label.timezone": "时区",
"label.today": "今天",
+ "label.tracking-code": "跟踪代码",
"label.unknown": "未知",
"label.username": "用户名",
+ "label.view-details": "查看更多",
"label.websites": "网站",
"message.active-users": "当前在线 {x} 人",
"message.confirm-delete": "你确定要删除{target}吗?",
@@ -55,7 +65,8 @@
"message.get-tracking-code": "获得跟踪代码",
"message.go-to-settings": "去设置",
"message.incorrect-username-password": "用户名密码不正确.",
- "message.new-version-available": "A new version of umami {version} is available!",
+ "message.log.visitor": "来自 {country} 的访客在搭载 {os} 的 {device} 上使用 {browser} 进行访问.",
+ "message.new-version-available": "umami 有新版本 {version} 发布啦!",
"message.no-data-available": "无可用数据.",
"message.no-websites-configured": "你还没有设置任何网站.",
"message.page-not-found": "网页未找到.",
@@ -84,14 +95,5 @@
"metrics.referrers": "指入域名",
"metrics.unique-visitors": "独立访客",
"metrics.views": "页面流量",
- "metrics.visitors": "独立访客",
- "title.add-account": "添加账户",
- "title.add-website": "添加网站",
- "title.change-password": "更新密码",
- "title.delete-account": "删除账户",
- "title.delete-website": "删除网站",
- "title.edit-account": "编辑账户",
- "title.edit-website": "编辑网站",
- "title.share-url": "共享链接",
- "title.tracking-code": "跟踪代码"
+ "metrics.visitors": "独立访客"
}
diff --git a/lang/zh-TW.json b/lang/zh-TW.json
new file mode 100644
index 00000000..c979c89b
--- /dev/null
+++ b/lang/zh-TW.json
@@ -0,0 +1,99 @@
+{
+ "label.accounts": "帳戶",
+ "label.add-account": "增加帳戶",
+ "label.add-website": "增加網站",
+ "label.administrator": "管理員",
+ "label.all": "所有",
+ "label.all-websites": "全部網站",
+ "label.back": "返回",
+ "label.cancel": "取消",
+ "label.change-password": "更新密碼",
+ "label.confirm-password": "確認密碼",
+ "label.copy-to-clipboard": "複製",
+ "label.current-password": "目前密碼",
+ "label.custom-range": "自定義時段",
+ "label.dashboard": "管理面板",
+ "label.date-range": "多日",
+ "label.default-date-range": "默認日期範圍",
+ "label.delete": "刪除",
+ "label.delete-account": "刪除帳戶",
+ "label.delete-website": "删除網站",
+ "label.dismiss": "關閉",
+ "label.domain": "域名",
+ "label.edit": "編輯",
+ "label.edit-account": "編輯帳戶",
+ "label.edit-website": "編輯網站",
+ "label.enable-share-url": "啟用分享連結",
+ "label.invalid": "無效輸入",
+ "label.invalid-domain": "無效域名",
+ "label.last-days": "最近 {x} 天",
+ "label.last-hours": "最近 {x} 小時",
+ "label.logged-in-as": "用戶名: {username}",
+ "label.login": "登入",
+ "label.logout": "退出",
+ "label.more": "更多",
+ "label.name": "名字",
+ "label.new-password": "新密碼",
+ "label.password": "密碼",
+ "label.passwords-dont-match": "密碼不一致",
+ "label.profile": "個人資料",
+ "label.realtime": "實時",
+ "label.realtime-logs": "實時日志",
+ "label.refresh": "刷新",
+ "label.required": "必填",
+ "label.reset": "重置",
+ "label.save": "保存",
+ "label.settings": "設置",
+ "label.share-url": "分享連結",
+ "label.single-day": "單日",
+ "label.this-month": "本月",
+ "label.this-week": "本週",
+ "label.this-year": "今年",
+ "label.timezone": "時區",
+ "label.today": "今天",
+ "label.tracking-code": "追蹤代碼",
+ "label.unknown": "未知",
+ "label.username": "用户名",
+ "label.view-details": "查看更多",
+ "label.websites": "網站",
+ "message.active-users": "当前線上 {x} 人",
+ "message.confirm-delete": "你確定要删除{target}嗎?",
+ "message.copied": "複製成功!",
+ "message.delete-warning": "所有相關數據將會被删除.",
+ "message.failure": "出現錯誤.",
+ "message.get-share-url": "獲得分享連結",
+ "message.get-tracking-code": "獲得追蹤代碼",
+ "message.go-to-settings": "去設定",
+ "message.incorrect-username-password": "用户名或密碼不正確.",
+ "message.log.visitor": "自 {country} 的訪客在搭載 {os} 的 {device} 上使用 {browser} 進行訪問.",
+ "message.new-version-available": "umami 有新版本 {version} 發佈啦!",
+ "message.no-data-available": "無可用數據.",
+ "message.no-websites-configured": "目前無任何網站設定.",
+ "message.page-not-found": "網頁未找到.",
+ "message.powered-by": "運行 {name}",
+ "message.save-success": "成功保存.",
+ "message.share-url": "這是 {target} 的分享連結.",
+ "message.track-stats": "將以下代碼放入被設定網站的{head}部分来收集{target}的資料.",
+ "message.type-delete": "在下方空格輸入{delete}確認",
+ "metrics.actions": "用戶行為",
+ "metrics.average-visit-time": "平均訪問時間",
+ "metrics.bounce-rate": "跳出率",
+ "metrics.browsers": "瀏覽器",
+ "metrics.countries": "國家",
+ "metrics.device.desktop": "桌機",
+ "metrics.device.laptop": "筆記本",
+ "metrics.device.mobile": "手機",
+ "metrics.device.tablet": "平板",
+ "metrics.devices": "裝置",
+ "metrics.events": "行為類別",
+ "metrics.filter.combined": "總和",
+ "metrics.filter.domain-only": "僅域名",
+ "metrics.filter.raw": "原始",
+ "metrics.operating-systems": "操作系统",
+ "metrics.page-views": "網頁流量",
+ "metrics.pages": "網頁",
+ "metrics.referrers": "指入域名",
+ "metrics.unique-visitors": "獨立訪客",
+ "metrics.views": "页面流量",
+ "metrics.visitors": "獨立訪客"
+}
\ No newline at end of file
diff --git a/lib/auth.js b/lib/auth.js
index 370db1c4..acfbe422 100644
--- a/lib/auth.js
+++ b/lib/auth.js
@@ -1,6 +1,6 @@
import { parse } from 'cookie';
import { parseSecureToken, parseToken } from './crypto';
-import { AUTH_COOKIE_NAME } from './constants';
+import { AUTH_COOKIE_NAME, TOKEN_HEADER } from './constants';
import { getWebsiteById } from './queries';
export async function getAuthToken(req) {
@@ -26,13 +26,14 @@ export async function isValidToken(token, validation) {
}
export async function allowQuery(req, skipToken) {
- const { id, token } = req.query;
+ const { id } = req.query;
+ const token = req.headers[TOKEN_HEADER];
const websiteId = +id;
const website = await getWebsiteById(websiteId);
if (website) {
- if (token && !skipToken) {
+ if (token && token !== 'undefined' && !skipToken) {
return isValidToken(token, { website_id: websiteId });
}
diff --git a/lib/constants.js b/lib/constants.js
index 87e0cf1d..65702620 100644
--- a/lib/constants.js
+++ b/lib/constants.js
@@ -4,6 +4,16 @@ export const TIMEZONE_CONFIG = 'umami.timezone';
export const DATE_RANGE_CONFIG = 'umami.date-range';
export const THEME_CONFIG = 'umami.theme';
export const VERSION_CHECK = 'umami.version-check';
+export const TOKEN_HEADER = 'x-umami-token';
+
+export const DEFAULT_LOCALE = 'en-US';
+export const DEFAULT_THEME = 'light';
+export const DEFAUL_CHART_HEIGHT = 400;
+export const DEFAULT_ANIMATION_DURATION = 300;
+export const DEFAULT_DATE_RANGE = '24hour';
+
+export const REALTIME_RANGE = 30;
+export const REALTIME_INTERVAL = 3000;
export const THEME_COLORS = {
light: {
@@ -42,13 +52,15 @@ export const EVENT_COLORS = [
'#44b556',
'#e68619',
'#e34850',
- '#1b959a',
- '#d83790',
- '#85d044',
+ '#f7bd12',
+ '#01bad7',
+ '#6734bc',
+ '#89c541',
+ '#ffc301',
+ '#ec1562',
+ '#ffec16',
];
-export const DEFAULT_DATE_RANGE = '24hour';
-
export const POSTGRESQL = 'postgresql';
export const MYSQL = 'mysql';
@@ -68,10 +80,6 @@ export const POSTGRESQL_DATE_FORMATS = {
year: 'YYYY-01-01',
};
-export const FILTER_DOMAIN_ONLY = 0;
-export const FILTER_COMBINED = 1;
-export const FILTER_RAW = 2;
-
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;
diff --git a/lib/date.js b/lib/date.js
index cdfe322c..50d623bb 100644
--- a/lib/date.js
+++ b/lib/date.js
@@ -7,6 +7,7 @@ import {
addYears,
subHours,
subDays,
+ startOfMinute,
startOfHour,
startOfDay,
startOfWeek,
@@ -17,6 +18,7 @@ import {
endOfWeek,
endOfMonth,
endOfYear,
+ differenceInMinutes,
differenceInHours,
differenceInCalendarDays,
differenceInCalendarMonths,
@@ -114,6 +116,7 @@ export function getDateFromString(str) {
}
const dateFuncs = {
+ minute: [differenceInMinutes, addMinutes, startOfMinute],
hour: [differenceInHours, addHours, startOfHour],
day: [differenceInCalendarDays, addDays, startOfDay],
month: [differenceInCalendarMonths, addMonths, startOfMonth],
diff --git a/lib/filters.js b/lib/filters.js
index 7fd5d833..d4853618 100644
--- a/lib/filters.js
+++ b/lib/filters.js
@@ -1,4 +1,3 @@
-import firstBy from 'thenby';
import { BROWSERS } from './constants';
import { removeTrailingSlash, removeWWW, getDomainName } from './url';
@@ -43,9 +42,7 @@ export const urlFilter = (data, { raw }) => {
return obj;
}, {});
- return Object.keys(map)
- .map(key => ({ x: key, y: map[key] }))
- .sort(firstBy('y', -1).thenBy('x'));
+ return Object.keys(map).map(key => ({ x: key, y: map[key] }));
};
export const refFilter = (data, { domain, domainOnly, raw }) => {
@@ -70,7 +67,7 @@ export const refFilter = (data, { domain, domainOnly, raw }) => {
}
if (domainOnly && hostname) {
- return hostname;
+ return removeWWW(hostname);
}
if (!origin || origin === 'null') {
@@ -113,9 +110,7 @@ export const refFilter = (data, { domain, domainOnly, raw }) => {
return obj;
}, {});
- return Object.keys(map)
- .map(key => ({ x: key, y: map[key], w: links[key] }))
- .sort(firstBy('y', -1).thenBy('x'));
+ return Object.keys(map).map(key => ({ x: key, y: map[key], w: links[key] }));
};
export const browserFilter = data =>
diff --git a/lib/format.js b/lib/format.js
index b031509b..a336c1c4 100644
--- a/lib/format.js
+++ b/lib/format.js
@@ -62,3 +62,19 @@ export function formatLongNumber(value) {
return formatNumber(n);
}
+
+export function stringToColor(str) {
+ if (!str) {
+ return '#ffffff';
+ }
+ let hash = 0;
+ for (let i = 0; i < str.length; i++) {
+ hash = str.charCodeAt(i) + ((hash << 5) - hash);
+ }
+ let color = '#';
+ for (let i = 0; i < 3; i++) {
+ let value = (hash >> (i * 8)) & 0xff;
+ color += ('00' + value.toString(16)).substr(-2);
+ }
+ return color;
+}
diff --git a/lib/lang.js b/lib/lang.js
index 200ac893..07df1837 100644
--- a/lib/lang.js
+++ b/lib/lang.js
@@ -1,26 +1,30 @@
import { format } from 'date-fns';
import {
- enUS,
- nl,
- zhCN,
- tr,
- ru,
- de,
- ja,
- es,
- fr,
+ cs,
da,
- sv,
+ de,
el,
+ enUS,
+ es,
+ fi,
+ fr,
+ id,
+ ja,
+ nb,
+ nl,
pt,
ro,
- nb,
- id,
+ ru,
+ sv,
+ tr,
uk,
+ zhCN,
+ zhTW,
} from 'date-fns/locale';
import enMessages from 'lang-compiled/en-US.json';
import nlMessages from 'lang-compiled/nl-NL.json';
import zhCNMessages from 'lang-compiled/zh-CN.json';
+import zhTWMessages from 'lang-compiled/zh-TW.json';
import trTRMessages from 'lang-compiled/tr-TR.json';
import ruRUMessages from 'lang-compiled/ru-RU.json';
import deDEMessages from 'lang-compiled/de-DE.json';
@@ -37,11 +41,14 @@ import roMessages from 'lang-compiled/ro-RO.json';
import nbNOMessages from 'lang-compiled/nb-NO.json';
import idMessages from 'lang-compiled/id-ID.json';
import ukMessages from 'lang-compiled/uk-UA.json';
+import fiMessages from 'lang-compiled/fi-FI.json';
+import csMessages from 'lang-compiled/cs-CZ.json';
export const messages = {
'en-US': enMessages,
'nl-NL': nlMessages,
'zh-CN': zhCNMessages,
+ 'zh-TW': zhTWMessages,
'de-DE': deDEMessages,
'ru-RU': ruRUMessages,
'tr-TR': trTRMessages,
@@ -58,12 +65,15 @@ export const messages = {
'nb-NO': nbNOMessages,
'id-ID': idMessages,
'uk-UA': ukMessages,
+ 'fi-FI': fiMessages,
+ 'cs-CZ': csMessages,
};
export const dateLocales = {
'en-US': enUS,
'nl-NL': nl,
'zh-CN': zhCN,
+ 'zh-TW': zhTW,
'de-DE': de,
'da-DK': da,
'ru-RU': ru,
@@ -80,10 +90,14 @@ export const dateLocales = {
'nb-NO': nb,
'id-ID': id,
'uk-UA': uk,
+ 'fi-FI': fi,
+ 'cs-CZ': cs,
};
export const menuOptions = [
{ label: '中文', value: 'zh-CN', display: 'cn' },
+ { label: '中文(繁體)', value: 'zh-TW', display: 'tw' },
+ { label: 'Čeština', value: 'cs-CZ', display: 'cs' },
{ label: 'Dansk', value: 'da-DK', display: 'da' },
{ label: 'Deutsch', value: 'de-DE', display: 'de' },
{ label: 'English', value: 'en-US', display: 'en' },
@@ -99,6 +113,7 @@ export const menuOptions = [
{ label: 'Português', value: 'pt-PT', display: 'pt' },
{ label: 'Русский', value: 'ru-RU', display: 'ru' },
{ label: 'Română', value: 'ro-RO', display: 'ro' },
+ { label: 'Suomi', value: 'fi-FI', display: 'fi' },
{ label: 'Svenska', value: 'sv-SE', display: 'sv' },
{ label: 'Türkçe', value: 'tr-TR', display: 'tr' },
{ label: 'українська', value: 'uk-UA', display: 'uk' },
diff --git a/lib/queries.js b/lib/queries.js
index 3b138faa..ed97eb93 100644
--- a/lib/queries.js
+++ b/lib/queries.js
@@ -166,16 +166,6 @@ export async function createSession(website_id, data) {
);
}
-export async function getSessionById(session_id) {
- return runQuery(
- prisma.session.findOne({
- where: {
- session_id,
- },
- }),
- );
-}
-
export async function getSessionByUuid(session_uuid) {
return runQuery(
prisma.session.findOne({
@@ -285,7 +275,58 @@ export async function createAccount(data) {
);
}
-export function getMetrics(website_id, start_at, end_at, filters = {}) {
+export async function getSessions(websites, start_at) {
+ return runQuery(
+ prisma.session.findMany({
+ where: {
+ website: {
+ website_id: {
+ in: websites,
+ },
+ },
+ created_at: {
+ gte: start_at,
+ },
+ },
+ }),
+ );
+}
+
+export async function getPageviews(websites, start_at) {
+ return runQuery(
+ prisma.pageview.findMany({
+ where: {
+ website: {
+ website_id: {
+ in: websites,
+ },
+ },
+ created_at: {
+ gte: start_at,
+ },
+ },
+ }),
+ );
+}
+
+export async function getEvents(websites, start_at) {
+ return runQuery(
+ prisma.event.findMany({
+ where: {
+ website: {
+ website_id: {
+ in: websites,
+ },
+ },
+ created_at: {
+ gte: start_at,
+ },
+ },
+ }),
+ );
+}
+
+export function getWebsiteStats(website_id, start_at, end_at, filters = {}) {
const params = [website_id, start_at, end_at];
const { url } = filters;
let urlFilter = '';
@@ -317,7 +358,7 @@ export function getMetrics(website_id, start_at, end_at, filters = {}) {
);
}
-export function getPageviews(
+export function getPageviewStats(
website_id,
start_at,
end_at,
@@ -425,7 +466,7 @@ export function getActiveVisitors(website_id) {
);
}
-export function getEvents(
+export function getEventMetrics(
website_id,
start_at,
end_at,
@@ -459,3 +500,30 @@ export function getEvents(
params,
);
}
+
+export async function getRealtimeData(websites, time) {
+ const [pageviews, sessions, events] = await Promise.all([
+ getPageviews(websites, time),
+ getSessions(websites, time),
+ getEvents(websites, time),
+ ]);
+
+ return {
+ pageviews: pageviews.map(({ view_id, ...props }) => ({
+ __id: `p${view_id}`,
+ view_id,
+ ...props,
+ })),
+ sessions: sessions.map(({ session_id, ...props }) => ({
+ __id: `s${session_id}`,
+ session_id,
+ ...props,
+ })),
+ events: events.map(({ event_id, ...props }) => ({
+ __id: `e${event_id}`,
+ event_id,
+ ...props,
+ })),
+ timestamp: Date.now(),
+ };
+}
diff --git a/lib/url.js b/lib/url.js
index 500736f9..deec7fe1 100644
--- a/lib/url.js
+++ b/lib/url.js
@@ -28,3 +28,7 @@ export function getQueryString(params = {}) {
return '';
}
+
+export function makeUrl(url, params) {
+ return `${url}${getQueryString(params)}`;
+}
diff --git a/lib/web.js b/lib/web.js
index aceb6498..13889cbe 100644
--- a/lib/web.js
+++ b/lib/web.js
@@ -1,4 +1,4 @@
-import { getQueryString } from './url';
+import { makeUrl } from './url';
export const apiRequest = (method, url, body, headers) =>
fetch(url, {
@@ -19,13 +19,17 @@ export const apiRequest = (method, url, body, headers) =>
return res.text().then(data => ({ ok: res.ok, status: res.status, res: res, data }));
});
-export const get = (url, params) => apiRequest('get', `${url}${getQueryString(params)}`);
+export const get = (url, params, headers) =>
+ apiRequest('get', makeUrl(url, params), undefined, headers);
-export const del = (url, params) => apiRequest('delete', `${url}${getQueryString(params)}`);
+export const del = (url, params, headers) =>
+ apiRequest('delete', makeUrl(url, params), undefined, headers);
-export const post = (url, params) => apiRequest('post', url, JSON.stringify(params));
+export const post = (url, params, headers) =>
+ apiRequest('post', url, JSON.stringify(params), headers);
-export const put = (url, params) => apiRequest('put', url, JSON.stringify(params));
+export const put = (url, params, headers) =>
+ apiRequest('put', url, JSON.stringify(params), headers);
export const hook = (_this, method, callback) => {
const orig = _this[method];
diff --git a/package.json b/package.json
index 0ab5c084..cfab3adf 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "umami",
- "version": "0.80.0",
+ "version": "1.4.0",
"description": "A simple, fast, website analytics alternative to Google Analytics. ",
"author": "Mike Cao ",
"license": "MIT",
@@ -56,34 +56,36 @@
}
},
"dependencies": {
- "@prisma/client": "2.8.0",
+ "@prisma/client": "2.10.1",
"@reduxjs/toolkit": "^1.4.0",
"bcrypt": "^5.0.0",
"chalk": "^4.1.0",
- "chart.js": "^2.9.3",
+ "chart.js": "^2.9.4",
"classnames": "^2.2.6",
"cookie": "^0.4.1",
"cors": "^2.8.5",
"date-fns": "^2.16.1",
- "date-fns-tz": "^1.0.10",
- "detect-browser": "^5.1.1",
+ "date-fns-tz": "^1.0.12",
+ "detect-browser": "^5.2.0",
"dotenv": "^8.2.0",
- "formik": "^2.1.7",
- "immer": "^7.0.9",
+ "formik": "^2.2.1",
+ "immer": "^7.0.14",
"is-localhost-ip": "^1.4.0",
"isbot-fast": "^1.2.0",
- "jose": "^2.0.2",
- "maxmind": "^4.2.0",
+ "jose": "^2.0.3",
+ "maxmind": "^4.3.1",
"moment-timezone": "^0.5.31",
- "next": "^9.5.4",
- "react": "^16.13.1",
- "react-dom": "^16.13.1",
- "react-intl": "^5.8.4",
- "react-redux": "^7.2.1",
- "react-simple-maps": "^2.1.2",
+ "next": "^10.0.0",
+ "prompts": "2.4.0",
+ "react": "^17.0.1",
+ "react-dom": "^17.0.1",
+ "react-intl": "^5.8.8",
+ "react-redux": "^7.2.2",
+ "react-simple-maps": "^2.3.0",
"react-spring": "^8.0.27",
"react-tooltip": "^4.2.10",
- "react-window": "^1.8.5",
+ "react-use-measure": "^2.0.2",
+ "react-window": "^1.8.6",
"redux": "^4.0.5",
"redux-thunk": "^2.3.0",
"request-ip": "^2.1.3",
@@ -91,34 +93,34 @@
"thenby": "^1.3.4",
"timezone-support": "^2.0.2",
"tinycolor2": "^1.4.2",
- "uuid": "^8.3.0"
+ "uuid": "^8.3.1"
},
"devDependencies": {
- "@formatjs/cli": "^2.13.0",
- "@prisma/cli": "2.8.0",
+ "@formatjs/cli": "^2.13.5",
+ "@prisma/cli": "2.10.1",
"@rollup/plugin-buble": "^0.21.3",
- "@rollup/plugin-node-resolve": "^9.0.0",
- "@rollup/plugin-replace": "^2.3.3",
+ "@rollup/plugin-node-resolve": "^10.0.0",
+ "@rollup/plugin-replace": "^2.3.4",
"@svgr/webpack": "^5.4.0",
"cross-env": "^7.0.2",
"del": "^6.0.0",
"dotenv-cli": "^4.0.0",
- "eslint": "^7.10.0",
- "eslint-config-prettier": "^6.12.0",
+ "eslint": "^7.12.1",
+ "eslint-config-prettier": "^6.15.0",
"eslint-plugin-prettier": "^3.1.3",
- "eslint-plugin-react": "^7.21.2",
- "eslint-plugin-react-hooks": "^4.1.2",
+ "eslint-plugin-react": "^7.21.5",
+ "eslint-plugin-react-hooks": "^4.2.0",
"extract-react-intl-messages": "^4.1.1",
"husky": "^4.3.0",
- "lint-staged": "^10.4.0",
+ "lint-staged": "^10.5.1",
"loadtest": "5.1.0",
"npm-run-all": "^4.1.5",
"postcss-flexbugs-fixes": "^4.2.1",
- "postcss-import": "^12.0.1",
+ "postcss-import": "^13.0.0",
"postcss-preset-env": "^6.7.0",
"prettier": "^2.1.2",
"prettier-eslint": "^11.0.0",
- "rollup": "^2.28.2",
+ "rollup": "^2.33.0",
"rollup-plugin-hashbang": "^2.2.2",
"rollup-plugin-terser": "^7.0.2",
"stylelint": "^13.7.2",
diff --git a/pages/api/collect.js b/pages/api/collect.js
index 2ea528be..a6140169 100644
--- a/pages/api/collect.js
+++ b/pages/api/collect.js
@@ -7,7 +7,7 @@ import { getIpAddress } from '../../lib/request';
export default async (req, res) => {
await useCors(req, res);
-
+
if (isBot(req.headers['user-agent'])) {
return ok(res);
}
diff --git a/pages/api/realtime/init.js b/pages/api/realtime/init.js
new file mode 100644
index 00000000..52e66600
--- /dev/null
+++ b/pages/api/realtime/init.js
@@ -0,0 +1,26 @@
+import { subMinutes } from 'date-fns';
+import { useAuth } from 'lib/middleware';
+import { ok, methodNotAllowed } from 'lib/response';
+import { getUserWebsites, getRealtimeData } from 'lib/queries';
+import { createToken } from 'lib/crypto';
+
+export default async (req, res) => {
+ await useAuth(req, res);
+
+ if (req.method === 'GET') {
+ const { user_id } = req.auth;
+
+ const websites = await getUserWebsites(user_id);
+ const ids = websites.map(({ website_id }) => website_id);
+ const token = await createToken({ websites: ids });
+ const data = await getRealtimeData(ids, subMinutes(new Date(), 30));
+
+ return ok(res, {
+ websites,
+ token,
+ data,
+ });
+ }
+
+ return methodNotAllowed(res);
+};
diff --git a/pages/api/realtime/update.js b/pages/api/realtime/update.js
new file mode 100644
index 00000000..730219ae
--- /dev/null
+++ b/pages/api/realtime/update.js
@@ -0,0 +1,27 @@
+import { useAuth } from 'lib/middleware';
+import { ok, methodNotAllowed, badRequest } from 'lib/response';
+import { getRealtimeData } from 'lib/queries';
+import { parseToken } from 'lib/crypto';
+import { TOKEN_HEADER } from 'lib/constants';
+
+export default async (req, res) => {
+ await useAuth(req, res);
+
+ if (req.method === 'GET') {
+ const { start_at } = req.query;
+
+ const token = req.headers[TOKEN_HEADER];
+
+ if (!token) {
+ return badRequest(res);
+ }
+
+ const { websites } = await parseToken(token);
+
+ const data = await getRealtimeData(websites, new Date(+start_at));
+
+ return ok(res, data);
+ }
+
+ return methodNotAllowed(res);
+};
diff --git a/pages/api/website/[id]/events.js b/pages/api/website/[id]/events.js
index 0498052f..7d98717a 100644
--- a/pages/api/website/[id]/events.js
+++ b/pages/api/website/[id]/events.js
@@ -1,5 +1,5 @@
import moment from 'moment-timezone';
-import { getEvents } from 'lib/queries';
+import { getEventMetrics } from 'lib/queries';
import { ok, badRequest, methodNotAllowed, unauthorized } from 'lib/response';
import { allowQuery } from 'lib/auth';
@@ -21,7 +21,7 @@ export default async (req, res) => {
const startDate = new Date(+start_at);
const endDate = new Date(+end_at);
- const events = await getEvents(websiteId, startDate, endDate, tz, unit, { url });
+ const events = await getEventMetrics(websiteId, startDate, endDate, tz, unit, { url });
return ok(res, events);
}
diff --git a/pages/api/website/[id]/metrics.js b/pages/api/website/[id]/metrics.js
index 91a0f4cf..2aca489f 100644
--- a/pages/api/website/[id]/metrics.js
+++ b/pages/api/website/[id]/metrics.js
@@ -1,27 +1,67 @@
-import { getMetrics } from 'lib/queries';
-import { methodNotAllowed, ok, unauthorized } from 'lib/response';
+import { getPageviewMetrics, getSessionMetrics } from 'lib/queries';
+import { ok, badRequest, methodNotAllowed, unauthorized } from 'lib/response';
+import { DOMAIN_REGEX } from 'lib/constants';
import { allowQuery } from 'lib/auth';
+const sessionColumns = ['browser', 'os', 'device', 'country'];
+const pageviewColumns = ['url', 'referrer'];
+
+function getTable(type) {
+ if (type === 'event') {
+ return 'event';
+ }
+
+ if (sessionColumns.includes(type)) {
+ return 'session';
+ }
+
+ return 'pageview';
+}
+
+function getColumn(type) {
+ if (type === 'event') {
+ return `concat(event_type, ':', event_value)`;
+ }
+ return type;
+}
+
export default async (req, res) => {
if (req.method === 'GET') {
if (!(await allowQuery(req))) {
return unauthorized(res);
}
- const { id, start_at, end_at, url } = req.query;
+ const { id, type, start_at, end_at, domain, url } = req.query;
+
+ if (domain && !DOMAIN_REGEX.test(domain)) {
+ return badRequest(res);
+ }
const websiteId = +id;
const startDate = new Date(+start_at);
const endDate = new Date(+end_at);
- const metrics = await getMetrics(websiteId, startDate, endDate, { url });
+ if (sessionColumns.includes(type)) {
+ const data = await getSessionMetrics(websiteId, startDate, endDate, type, { url });
- const stats = Object.keys(metrics[0]).reduce((obj, key) => {
- obj[key] = Number(metrics[0][key]) || 0;
- return obj;
- }, {});
+ return ok(res, data);
+ }
- return ok(res, stats);
+ if (type === 'event' || pageviewColumns.includes(type)) {
+ const data = await getPageviewMetrics(
+ websiteId,
+ startDate,
+ endDate,
+ getColumn(type),
+ getTable(type),
+ {
+ domain: type !== 'event' && domain,
+ url: type !== 'url' && url,
+ },
+ );
+
+ return ok(res, data);
+ }
}
return methodNotAllowed(res);
diff --git a/pages/api/website/[id]/pageviews.js b/pages/api/website/[id]/pageviews.js
index 2191a4c4..965f28ae 100644
--- a/pages/api/website/[id]/pageviews.js
+++ b/pages/api/website/[id]/pageviews.js
@@ -1,5 +1,5 @@
import moment from 'moment-timezone';
-import { getPageviews } from 'lib/queries';
+import { getPageviewStats } from 'lib/queries';
import { ok, badRequest, methodNotAllowed, unauthorized } from 'lib/response';
import { allowQuery } from 'lib/auth';
@@ -21,12 +21,12 @@ export default async (req, res) => {
return badRequest(res);
}
- const [pageviews, uniques] = await Promise.all([
- getPageviews(websiteId, startDate, endDate, tz, unit, '*', url),
- getPageviews(websiteId, startDate, endDate, tz, unit, 'distinct session_id', url),
+ const [pageviews, sessions] = await Promise.all([
+ getPageviewStats(websiteId, startDate, endDate, tz, unit, '*', url),
+ getPageviewStats(websiteId, startDate, endDate, tz, unit, 'distinct session_id', url),
]);
- return ok(res, { pageviews, uniques });
+ return ok(res, { pageviews, sessions });
}
return methodNotAllowed(res);
diff --git a/pages/api/website/[id]/rankings.js b/pages/api/website/[id]/rankings.js
deleted file mode 100644
index 17aa6daa..00000000
--- a/pages/api/website/[id]/rankings.js
+++ /dev/null
@@ -1,68 +0,0 @@
-import { getPageviewMetrics, getSessionMetrics } from 'lib/queries';
-import { ok, badRequest, methodNotAllowed, unauthorized } from 'lib/response';
-import { DOMAIN_REGEX } from 'lib/constants';
-import { allowQuery } from 'lib/auth';
-
-const sessionColumns = ['browser', 'os', 'device', 'country'];
-const pageviewColumns = ['url', 'referrer'];
-
-function getTable(type) {
- if (type === 'event') {
- return 'event';
- }
-
- if (sessionColumns.includes(type)) {
- return 'session';
- }
-
- return 'pageview';
-}
-
-function getColumn(type) {
- if (type === 'event') {
- return `concat(event_type, ':', event_value)`;
- }
- return type;
-}
-
-export default async (req, res) => {
- if (req.method === 'GET') {
- if (!(await allowQuery(req))) {
- return unauthorized(res);
- }
-
- const { id, type, start_at, end_at, domain, url } = req.query;
-
- if (domain && !DOMAIN_REGEX.test(domain)) {
- return badRequest(res);
- }
-
- const websiteId = +id;
- const startDate = new Date(+start_at);
- const endDate = new Date(+end_at);
-
- if (sessionColumns.includes(type)) {
- const data = await getSessionMetrics(websiteId, startDate, endDate, type, { url });
-
- return ok(res, data);
- }
-
- if (type === 'event' || pageviewColumns.includes(type)) {
- const data = await getPageviewMetrics(
- websiteId,
- startDate,
- endDate,
- getColumn(type),
- getTable(type),
- {
- domain,
- url: type !== 'url' && url,
- },
- );
-
- return ok(res, data);
- }
- }
-
- return methodNotAllowed(res);
-};
diff --git a/pages/api/website/[id]/stats.js b/pages/api/website/[id]/stats.js
new file mode 100644
index 00000000..8b80a363
--- /dev/null
+++ b/pages/api/website/[id]/stats.js
@@ -0,0 +1,28 @@
+import { getWebsiteStats } from 'lib/queries';
+import { methodNotAllowed, ok, unauthorized } from 'lib/response';
+import { allowQuery } from 'lib/auth';
+
+export default async (req, res) => {
+ if (req.method === 'GET') {
+ if (!(await allowQuery(req))) {
+ return unauthorized(res);
+ }
+
+ const { id, start_at, end_at, url } = req.query;
+
+ const websiteId = +id;
+ const startDate = new Date(+start_at);
+ const endDate = new Date(+end_at);
+
+ const metrics = await getWebsiteStats(websiteId, startDate, endDate, { url });
+
+ const stats = Object.keys(metrics[0]).reduce((obj, key) => {
+ obj[key] = Number(metrics[0][key]) || 0;
+ return obj;
+ }, {});
+
+ return ok(res, stats);
+ }
+
+ return methodNotAllowed(res);
+};
diff --git a/pages/realtime.js b/pages/realtime.js
new file mode 100644
index 00000000..9f1ebffa
--- /dev/null
+++ b/pages/realtime.js
@@ -0,0 +1,18 @@
+import React from 'react';
+import Layout from 'components/layout/Layout';
+import RealtimeDashboard from 'components/pages/RealtimeDashboard';
+import useRequireLogin from 'hooks/useRequireLogin';
+
+export default function RealtimePage() {
+ const { loading } = useRequireLogin();
+
+ if (loading) {
+ return null;
+ }
+
+ return (
+
+
+
+ );
+}
diff --git a/pages/share/[...id].js b/pages/share/[...id].js
index 85455af4..ff5e4a6e 100644
--- a/pages/share/[...id].js
+++ b/pages/share/[...id].js
@@ -2,23 +2,23 @@ import React from 'react';
import { useRouter } from 'next/router';
import Layout from 'components/layout/Layout';
import WebsiteDetails from 'components/pages/WebsiteDetails';
-import useFetch from 'hooks/useFetch';
+import useShareToken from 'hooks/useShareToken';
export default function SharePage() {
const router = useRouter();
const { id } = router.query;
const shareId = id?.[0];
- const { data } = useFetch(shareId ? `/api/share/${shareId}` : null);
+ const shareToken = useShareToken(shareId);
- if (!data) {
+ if (!shareToken) {
return null;
}
- const { websiteId, token } = data;
+ const { websiteId } = shareToken;
return (
-
+
);
}
diff --git a/public/country/cs-CZ.json b/public/country/cs-CZ.json
new file mode 100644
index 00000000..0c5f5070
--- /dev/null
+++ b/public/country/cs-CZ.json
@@ -0,0 +1 @@
+{"AF":"Afgh\u00e1nist\u00e1n","AX":"\u00c5landy","AL":"Alb\u00e1nie","DZ":"Al\u017e\u00edrsko","AS":"Americk\u00e1 Samoa","VI":"Americk\u00e9 Panensk\u00e9 ostrovy","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktida","AG":"Antigua a Barbuda","AR":"Argentina","AM":"Arm\u00e9nie","AW":"Aruba","AU":"Austr\u00e1lie","AZ":"\u00c1zerb\u00e1jd\u017e\u00e1n","BS":"Bahamy","BH":"Bahrajn","BD":"Banglad\u00e9\u0161","BB":"Barbados","BE":"Belgie","BZ":"Belize","BY":"B\u011blorusko","BJ":"Benin","BM":"Bermudy","BT":"Bh\u00fat\u00e1n","BO":"Bol\u00edvie","BA":"Bosna a Hercegovina","BW":"Botswana","BV":"Bouvet\u016fv ostrov","BR":"Braz\u00edlie","IO":"Britsk\u00e9 indickooce\u00e1nsk\u00e9 \u00fazem\u00ed","VG":"Britsk\u00e9 Panensk\u00e9 ostrovy","BN":"Brunej","BG":"Bulharsko","BF":"Burkina Faso","BI":"Burundi","CK":"Cookovy ostrovy","CW":"Cura\u00e7ao","TD":"\u010cad","ME":"\u010cern\u00e1 Hora","CZ":"\u010cesko","CN":"\u010c\u00edna","DK":"D\u00e1nsko","DM":"Dominika","DO":"Dominik\u00e1nsk\u00e1 republika","DJ":"D\u017eibutsko","EG":"Egypt","EC":"Ekv\u00e1dor","ER":"Eritrea","EE":"Estonsko","ET":"Etiopie","FO":"Faersk\u00e9 ostrovy","FK":"Falklandsk\u00e9 ostrovy","FJ":"Fid\u017ei","PH":"Filip\u00edny","FI":"Finsko","FR":"Francie","GF":"Francouzsk\u00e1 Guyana","TF":"Francouzsk\u00e1 ji\u017en\u00ed \u00fazem\u00ed","PF":"Francouzsk\u00e1 Polyn\u00e9sie","GA":"Gabon","GM":"Gambie","GH":"Ghana","GI":"Gibraltar","GD":"Grenada","GL":"Gr\u00f3nsko","GE":"Gruzie","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard\u016fv ostrov a McDonaldovy ostrovy","HN":"Honduras","HK":"Hongkong \u2013 ZAO \u010c\u00edny","CL":"Chile","HR":"Chorvatsko","IN":"Indie","ID":"Indon\u00e9sie","IQ":"Ir\u00e1k","IR":"\u00cdr\u00e1n","IE":"Irsko","IS":"Island","IT":"It\u00e1lie","IL":"Izrael","JM":"Jamajka","JP":"Japonsko","YE":"Jemen","JE":"Jersey","ZA":"Jihoafrick\u00e1 republika","GS":"Ji\u017en\u00ed Georgie a Ji\u017en\u00ed Sandwichovy ostrovy","KR":"Ji\u017en\u00ed Korea","SS":"Ji\u017en\u00ed S\u00fad\u00e1n","JO":"Jord\u00e1nsko","KY":"Kajmansk\u00e9 ostrovy","KH":"Kambod\u017ea","CM":"Kamerun","CA":"Kanada","CV":"Kapverdy","BQ":"Karibsk\u00e9 Nizozemsko","QA":"Katar","KZ":"Kazachst\u00e1n","KE":"Ke\u0148a","KI":"Kiribati","CC":"Kokosov\u00e9 ostrovy","CO":"Kolumbie","KM":"Komory","CG":"Kongo \u2013 Brazzaville","CD":"Kongo \u2013 Kinshasa","CR":"Kostarika","CU":"Kuba","KW":"Kuvajt","CY":"Kypr","KG":"Kyrgyzst\u00e1n","LA":"Laos","LS":"Lesotho","LB":"Libanon","LR":"Lib\u00e9rie","LY":"Libye","LI":"Lichten\u0161tejnsko","LT":"Litva","LV":"Loty\u0161sko","LU":"Lucembursko","MO":"Macao \u2013 ZAO \u010c\u00edny","MG":"Madagaskar","HU":"Ma\u010farsko","MY":"Malajsie","MW":"Malawi","MV":"Maledivy","ML":"Mali","MT":"Malta","MA":"Maroko","MH":"Marshallovy ostrovy","MQ":"Martinik","MU":"Mauricius","MR":"Maurit\u00e1nie","YT":"Mayotte","UM":"Men\u0161\u00ed odlehl\u00e9 ostrovy USA","MX":"Mexiko","FM":"Mikron\u00e9sie","MD":"Moldavsko","MC":"Monako","MN":"Mongolsko","MS":"Montserrat","MZ":"Mosambik","MM":"Myanmar (Barma)","NA":"Namibie","NR":"Nauru","DE":"N\u011bmecko","NP":"Nep\u00e1l","NE":"Niger","NG":"Nig\u00e9rie","NI":"Nikaragua","NU":"Niue","NL":"Nizozemsko","NF":"Norfolk","NO":"Norsko","NC":"Nov\u00e1 Kaledonie","NZ":"Nov\u00fd Z\u00e9land","OM":"Om\u00e1n","IM":"Ostrov Man","PK":"P\u00e1kist\u00e1n","PW":"Palau","PS":"Palestinsk\u00e1 \u00fazem\u00ed","PA":"Panama","PG":"Papua-Nov\u00e1 Guinea","PY":"Paraguay","PE":"Peru","PN":"Pitcairnovy ostrovy","CI":"Pob\u0159e\u017e\u00ed slonoviny","PL":"Polsko","PR":"Portoriko","PT":"Portugalsko","AT":"Rakousko","RE":"R\u00e9union","GQ":"Rovn\u00edkov\u00e1 Guinea","RO":"Rumunsko","RU":"Rusko","RW":"Rwanda","GR":"\u0158ecko","PM":"Saint-Pierre a Miquelon","SV":"Salvador","WS":"Samoa","SM":"San Marino","SA":"Sa\u00fadsk\u00e1 Ar\u00e1bie","SN":"Senegal","KP":"Severn\u00ed Korea","MK":"Severn\u00ed Makedonie","MP":"Severn\u00ed Mariany","SC":"Seychely","SL":"Sierra Leone","SG":"Singapur","SK":"Slovensko","SI":"Slovinsko","SO":"Som\u00e1lsko","AE":"Spojen\u00e9 arabsk\u00e9 emir\u00e1ty","GB":"Spojen\u00e9 kr\u00e1lovstv\u00ed","US":"Spojen\u00e9 st\u00e1ty","RS":"Srbsko","LK":"Sr\u00ed Lanka","CF":"St\u0159edoafrick\u00e1 republika","SD":"S\u00fad\u00e1n","SR":"Surinam","SH":"Svat\u00e1 Helena","LC":"Svat\u00e1 Lucie","BL":"Svat\u00fd Bartolom\u011bj","KN":"Svat\u00fd Kry\u0161tof a Nevis","MF":"Svat\u00fd Martin (Francie)","SX":"Svat\u00fd Martin (Nizozemsko)","ST":"Svat\u00fd Tom\u00e1\u0161 a Princ\u016fv ostrov","VC":"Svat\u00fd Vincenc a Grenadiny","SZ":"Svazijsko","SY":"S\u00fdrie","SB":"\u0160alamounovy ostrovy","ES":"\u0160pan\u011blsko","SJ":"\u0160picberky a Jan Mayen","SE":"\u0160v\u00e9dsko","CH":"\u0160v\u00fdcarsko","TJ":"T\u00e1d\u017eikist\u00e1n","TZ":"Tanzanie","TH":"Thajsko","TW":"Tchaj-wan","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad a Tobago","TN":"Tunisko","TR":"Turecko","TM":"Turkmenist\u00e1n","TC":"Turks a Caicos","TV":"Tuvalu","UG":"Uganda","UA":"Ukrajina","UY":"Uruguay","UZ":"Uzbekist\u00e1n","CX":"V\u00e1no\u010dn\u00ed ostrov","VU":"Vanuatu","VA":"Vatik\u00e1n","VE":"Venezuela","VN":"Vietnam","TL":"V\u00fdchodn\u00ed Timor","WF":"Wallis a Futuna","ZM":"Zambie","EH":"Z\u00e1padn\u00ed Sahara","ZW":"Zimbabwe"}
\ No newline at end of file
diff --git a/public/country/fi-FI.json b/public/country/fi-FI.json
new file mode 100644
index 00000000..6410ee12
--- /dev/null
+++ b/public/country/fi-FI.json
@@ -0,0 +1 @@
+{"AF":"Afganistan","AX":"Ahvenanmaa","NL":"Alankomaat","AL":"Albania","DZ":"Algeria","AS":"Amerikan Samoa","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktis","AG":"Antigua ja Barbuda","AE":"Arabiemiirikunnat","AR":"Argentiina","AM":"Armenia","AW":"Aruba","AU":"Australia","AZ":"Azerbaid\u017ean","BS":"Bahama","BH":"Bahrain","BD":"Bangladesh","BB":"Barbados","BE":"Belgia","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivia","BA":"Bosnia ja Hertsegovina","BW":"Botswana","BV":"Bouvet\u2019nsaari","BR":"Brasilia","IO":"Brittil\u00e4inen Intian valtameren alue","VG":"Brittil\u00e4iset Neitsytsaaret","BN":"Brunei","BG":"Bulgaria","BF":"Burkina Faso","BI":"Burundi","KY":"Caymansaaret","CL":"Chile","CK":"Cookinsaaret","CR":"Costa Rica","CW":"Cura\u00e7ao","DJ":"Djibouti","DM":"Dominica","DO":"Dominikaaninen tasavalta","EC":"Ecuador","EG":"Egypti","SV":"El Salvador","ER":"Eritrea","ES":"Espanja","ZA":"Etel\u00e4-Afrikka","GS":"Etel\u00e4-Georgia ja Etel\u00e4iset Sandwichsaaret","KR":"Etel\u00e4-Korea","SS":"Etel\u00e4-Sudan","ET":"Etiopia","FK":"Falklandinsaaret","FJ":"Fid\u017ei","PH":"Filippiinit","FO":"F\u00e4rsaaret","GA":"Gabon","GM":"Gambia","GE":"Georgia","GH":"Ghana","GI":"Gibraltar","GD":"Grenada","GL":"Gr\u00f6nlanti","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard ja McDonaldinsaaret","HN":"Honduras","HK":"Hongkong \u2013 Kiinan e.h.a.","SJ":"Huippuvuoret ja Jan Mayen","ID":"Indonesia","IN":"Intia","IQ":"Irak","IR":"Iran","IE":"Irlanti","IS":"Islanti","GB":"Iso-Britannia","IL":"Israel","IT":"Italia","TL":"It\u00e4-Timor","AT":"It\u00e4valta","JM":"Jamaika","JP":"Japani","YE":"Jemen","JE":"Jersey","JO":"Jordania","CX":"Joulusaari","KH":"Kambod\u017ea","CM":"Kamerun","CA":"Kanada","CV":"Kap Verde","BQ":"Karibian Alankomaat","KZ":"Kazakstan","KE":"Kenia","CF":"Keski-Afrikan tasavalta","CN":"Kiina","KG":"Kirgisia","KI":"Kiribati","CO":"Kolumbia","KM":"Komorit","CD":"Kongon demokraattinen tasavalta","CG":"Kongon tasavalta","CC":"Kookossaaret (Keelingsaaret)","GR":"Kreikka","HR":"Kroatia","CU":"Kuuba","KW":"Kuwait","CY":"Kypros","LA":"Laos","LV":"Latvia","LS":"Lesotho","LB":"Libanon","LR":"Liberia","LY":"Libya","LI":"Liechtenstein","LT":"Liettua","LU":"Luxemburg","EH":"L\u00e4nsi-Sahara","MO":"Macao \u2013 Kiinan e.h.a.","MG":"Madagaskar","MW":"Malawi","MV":"Malediivit","MY":"Malesia","ML":"Mali","MT":"Malta","IM":"Mansaari","MA":"Marokko","MH":"Marshallinsaaret","MQ":"Martinique","MR":"Mauritania","MU":"Mauritius","YT":"Mayotte","MX":"Meksiko","FM":"Mikronesian liittovaltio","MD":"Moldova","MC":"Monaco","MN":"Mongolia","ME":"Montenegro","MS":"Montserrat","MZ":"Mosambik","MM":"Myanmar (Burma)","NA":"Namibia","NR":"Nauru","NP":"Nepal","NI":"Nicaragua","NE":"Niger","NG":"Nigeria","NU":"Niue","NF":"Norfolkinsaari","NO":"Norja","CI":"Norsunluurannikko","OM":"Oman","PK":"Pakistan","PW":"Palau","PS":"Palestiinalaisalueet","PA":"Panama","PG":"Papua-Uusi-Guinea","PY":"Paraguay","PE":"Peru","PN":"Pitcairn","KP":"Pohjois-Korea","MK":"Pohjois-Makedonia","MP":"Pohjois-Mariaanit","PT":"Portugali","PR":"Puerto Rico","PL":"Puola","GQ":"P\u00e4iv\u00e4ntasaajan Guinea","QA":"Qatar","FR":"Ranska","TF":"Ranskan etel\u00e4iset alueet","GF":"Ranskan Guayana","PF":"Ranskan Polynesia","RE":"R\u00e9union","RO":"Romania","RW":"Ruanda","SE":"Ruotsi","SH":"Saint Helena","KN":"Saint Kitts ja Nevis","LC":"Saint Lucia","VC":"Saint Vincent ja Grenadiinit","BL":"Saint-Barth\u00e9lemy","MF":"Saint-Martin","PM":"Saint-Pierre ja Miquelon","DE":"Saksa","SB":"Salomonsaaret","ZM":"Sambia","WS":"Samoa","SM":"San Marino","ST":"S\u00e3o Tom\u00e9 ja Pr\u00edncipe","SA":"Saudi-Arabia","SN":"Senegal","RS":"Serbia","SC":"Seychellit","SL":"Sierra Leone","SG":"Singapore","SX":"Sint Maarten","SK":"Slovakia","SI":"Slovenia","SO":"Somalia","LK":"Sri Lanka","SD":"Sudan","FI":"Suomi","SR":"Suriname","CH":"Sveitsi","SZ":"Swazimaa","SY":"Syyria","TJ":"Tad\u017eikistan","TW":"Taiwan","TZ":"Tansania","DK":"Tanska","TH":"Thaimaa","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad ja Tobago","TD":"T\u0161ad","CZ":"T\u0161ekki","TN":"Tunisia","TR":"Turkki","TM":"Turkmenistan","TC":"Turks- ja Caicossaaret","TV":"Tuvalu","UG":"Uganda","UA":"Ukraina","HU":"Unkari","UY":"Uruguay","NC":"Uusi-Kaledonia","NZ":"Uusi-Seelanti","UZ":"Uzbekistan","BY":"Valko-Ven\u00e4j\u00e4","VU":"Vanuatu","VA":"Vatikaani","VE":"Venezuela","RU":"Ven\u00e4j\u00e4","VN":"Vietnam","EE":"Viro","WF":"Wallis ja Futuna","US":"Yhdysvallat","UM":"Yhdysvaltain erillissaaret","VI":"Yhdysvaltain Neitsytsaaret","ZW":"Zimbabwe"}
\ No newline at end of file
diff --git a/public/country/zh-TW.json b/public/country/zh-TW.json
new file mode 100644
index 00000000..9c6230e2
--- /dev/null
+++ b/public/country/zh-TW.json
@@ -0,0 +1 @@
+{"TT":"\u5343\u91cc\u9054\u53ca\u6258\u5df4\u54e5","TR":"\u571f\u8033\u5176","TC":"\u571f\u514b\u65af\u53ca\u958b\u79d1\u65af\u7fa4\u5cf6","TM":"\u571f\u5eab\u66fc","BT":"\u4e0d\u4e39","CF":"\u4e2d\u975e\u5171\u548c\u570b","CN":"\u4e2d\u570b","HK":"\u4e2d\u570b\u9999\u6e2f\u7279\u5225\u884c\u653f\u5340","MO":"\u4e2d\u570b\u6fb3\u9580\u7279\u5225\u884c\u653f\u5340","DK":"\u4e39\u9ea5","EC":"\u5384\u74dc\u591a","ER":"\u5384\u5229\u5782\u4e9e","PG":"\u5df4\u5e03\u4e9e\u7d10\u5e7e\u5167\u4e9e","BR":"\u5df4\u897f","BB":"\u5df4\u8c9d\u591a","PY":"\u5df4\u62c9\u572d","BH":"\u5df4\u6797","BS":"\u5df4\u54c8\u99ac","PA":"\u5df4\u62ff\u99ac","PS":"\u5df4\u52d2\u65af\u5766\u81ea\u6cbb\u5340","PK":"\u5df4\u57fa\u65af\u5766","JP":"\u65e5\u672c","BE":"\u6bd4\u5229\u6642","JM":"\u7259\u8cb7\u52a0","IL":"\u4ee5\u8272\u5217","CA":"\u52a0\u62ff\u5927","GA":"\u52a0\u5f6d","MP":"\u5317\u99ac\u5229\u5b89\u7d0d\u7fa4\u5cf6","MK":"\u5317\u99ac\u5176\u9813","KP":"\u5317\u97d3","QA":"\u5361\u9054","CU":"\u53e4\u5df4","TW":"\u53f0\u7063","SZ":"\u53f2\u74e6\u5e1d\u5c3c","NE":"\u5c3c\u65e5","NI":"\u5c3c\u52a0\u62c9\u74dc","NP":"\u5c3c\u6cca\u723e","BF":"\u5e03\u5409\u7d0d\u6cd5\u7d22","BV":"\u5e03\u5a01\u5cf6","GP":"\u74dc\u5730\u6d1b\u666e","GT":"\u74dc\u5730\u99ac\u62c9","WF":"\u74e6\u5229\u65af\u7fa4\u5cf6\u548c\u5bcc\u5716\u90a3\u7fa4\u5cf6","GM":"\u7518\u6bd4\u4e9e","BY":"\u767d\u4fc4\u7f85\u65af","PN":"\u76ae\u7279\u80af\u7fa4\u5cf6","LT":"\u7acb\u9676\u5b9b","IQ":"\u4f0a\u62c9\u514b","IR":"\u4f0a\u6717","IS":"\u51b0\u5cf6","LI":"\u5217\u652f\u6566\u65af\u767b","HU":"\u5308\u7259\u5229","ID":"\u5370\u5c3c","IN":"\u5370\u5ea6","DJ":"\u5409\u5e03\u5730","KI":"\u5409\u91cc\u5df4\u65af","KG":"\u5409\u723e\u5409\u65af","TV":"\u5410\u74e6\u9b6f","DM":"\u591a\u7c73\u5c3c\u514b","DO":"\u591a\u660e\u5c3c\u52a0\u5171\u548c\u570b","TG":"\u591a\u54e5","AG":"\u5b89\u5730\u5361\u53ca\u5df4\u5e03\u9054","AI":"\u5b89\u594e\u62c9","AO":"\u5b89\u54e5\u62c9","AD":"\u5b89\u9053\u723e","TK":"\u6258\u514b\u52de\u7fa4\u5cf6","BM":"\u767e\u6155\u9054","ET":"\u8863\u7d22\u6bd4\u4e9e","ES":"\u897f\u73ed\u7259","EH":"\u897f\u6492\u54c8\u62c9","HR":"\u514b\u7f85\u57c3\u897f\u4e9e","LY":"\u5229\u6bd4\u4e9e","HN":"\u5b8f\u90fd\u62c9\u65af","GR":"\u5e0c\u81d8","BN":"\u6c76\u840a","SA":"\u6c99\u70cf\u5730\u963f\u62c9\u4f2f","BZ":"\u8c9d\u91cc\u65af","BJ":"\u8c9d\u5357","GQ":"\u8d64\u9053\u5e7e\u5167\u4e9e","ZW":"\u8f9b\u5df4\u5a01","AM":"\u4e9e\u7f8e\u5c3c\u4e9e","AZ":"\u4e9e\u585e\u62dc\u7136","TZ":"\u5766\u5c1a\u5c3c\u4e9e","NG":"\u5948\u53ca\u5229\u4e9e","VE":"\u59d4\u5167\u745e\u62c9","BD":"\u5b5f\u52a0\u62c9","ZM":"\u5c1a\u6bd4\u4e9e","PW":"\u5e1b\u7409","LV":"\u62c9\u812b\u7dad\u4e9e","TO":"\u6771\u52a0","TL":"\u6771\u5e1d\u6c76","FR":"\u6cd5\u570b","FO":"\u6cd5\u7f85\u7fa4\u5cf6","GF":"\u6cd5\u5c6c\u572d\u4e9e\u90a3","TF":"\u6cd5\u5c6c\u5357\u90e8\u5c6c\u5730","PF":"\u6cd5\u5c6c\u73bb\u91cc\u5c3c\u897f\u4e9e","MF":"\u6cd5\u5c6c\u8056\u99ac\u4e01","BA":"\u6ce2\u58eb\u5c3c\u4e9e\u8207\u8d6b\u585e\u54e5\u7dad\u7d0d","BW":"\u6ce2\u672d\u90a3","PR":"\u6ce2\u591a\u9ece\u5404","PL":"\u6ce2\u862d","GI":"\u76f4\u5e03\u7f85\u9640","KE":"\u80af\u4e9e","FI":"\u82ac\u862d","AE":"\u963f\u62c9\u4f2f\u806f\u5408\u5927\u516c\u570b","AR":"\u963f\u6839\u5ef7","OM":"\u963f\u66fc","AF":"\u963f\u5bcc\u6c57","DZ":"\u963f\u723e\u53ca\u5229\u4e9e","AL":"\u963f\u723e\u5df4\u5c3c\u4e9e","RU":"\u4fc4\u7f85\u65af","BG":"\u4fdd\u52a0\u5229\u4e9e","ZA":"\u5357\u975e","GS":"\u5357\u55ac\u6cbb\u4e9e\u8207\u5357\u4e09\u660e\u6cbb\u7fa4\u5cf6","AQ":"\u5357\u6975\u6d32","KR":"\u5357\u97d3","SS":"\u5357\u8607\u4e39","KZ":"\u54c8\u85a9\u514b","TD":"\u67e5\u5fb7","KH":"\u67ec\u57d4\u5be8","BO":"\u73bb\u5229\u7dad\u4e9e","CC":"\u79d1\u514b\u65af\uff08\u57fa\u9748\uff09\u7fa4\u5cf6","KW":"\u79d1\u5a01\u7279","TN":"\u7a81\u5c3c\u897f\u4e9e","JO":"\u7d04\u65e6","US":"\u7f8e\u570b","UM":"\u7f8e\u570b\u672c\u571f\u5916\u5c0f\u5cf6\u5dbc","VI":"\u7f8e\u5c6c\u7dad\u4eac\u7fa4\u5cf6","AS":"\u7f8e\u5c6c\u85a9\u6469\u4e9e","GB":"\u82f1\u570b","IO":"\u82f1\u5c6c\u5370\u5ea6\u6d0b\u9818\u5730","VG":"\u82f1\u5c6c\u7dad\u4eac\u7fa4\u5cf6","MR":"\u8305\u5229\u5854\u5c3c\u4e9e","GH":"\u8fe6\u7d0d","CG":"\u525b\u679c\uff08\u5e03\u62c9\u85a9\uff09","CD":"\u525b\u679c\uff08\u91d1\u590f\u6c99\uff09","CO":"\u54e5\u502b\u6bd4\u4e9e","CR":"\u54e5\u65af\u5927\u9ece\u52a0","EG":"\u57c3\u53ca","CK":"\u5eab\u514b\u7fa4\u5cf6","CW":"\u5eab\u62c9\u7d22","NO":"\u632a\u5a01","SJ":"\u632a\u5a01\u5c6c\u65af\u74e6\u5df4\u53ca\u5c16\u68c9","GG":"\u6839\u606f","GL":"\u683c\u9675\u862d","GD":"\u683c\u745e\u90a3\u9054","TH":"\u6cf0\u570b","HT":"\u6d77\u5730","UG":"\u70cf\u5e72\u9054","UA":"\u70cf\u514b\u862d","UY":"\u70cf\u62c9\u572d","UZ":"\u70cf\u8332\u5225\u514b","RE":"\u7559\u5c3c\u65fa","PE":"\u79d8\u9b6f","NA":"\u7d0d\u7c73\u6bd4\u4e9e","NZ":"\u7d10\u897f\u862d","NU":"\u7d10\u57c3\u5cf6","SO":"\u7d22\u99ac\u5229\u4e9e","SB":"\u7d22\u7f85\u9580\u7fa4\u5cf6","MQ":"\u99ac\u4e01\u5c3c\u514b","ML":"\u99ac\u5229","MY":"\u99ac\u4f86\u897f\u4e9e","MW":"\u99ac\u62c9\u5a01","YT":"\u99ac\u7d04\u7279\u5cf6","MH":"\u99ac\u7d39\u723e\u7fa4\u5cf6","MG":"\u99ac\u9054\u52a0\u65af\u52a0","MT":"\u99ac\u723e\u4ed6","MV":"\u99ac\u723e\u5730\u592b","FM":"\u5bc6\u514b\u7f85\u5c3c\u897f\u4e9e","CZ":"\u6377\u514b","SY":"\u6558\u5229\u4e9e","IM":"\u66fc\u5cf6","VA":"\u68b5\u8482\u5ca1","AW":"\u8377\u5c6c\u963f\u9b6f\u5df4","SX":"\u8377\u5c6c\u8056\u99ac\u4e01","NL":"\u8377\u862d","BQ":"\u8377\u862d\u52a0\u52d2\u6bd4\u5340","MZ":"\u83ab\u4e09\u6bd4\u514b","CM":"\u5580\u9ea5\u9686","GE":"\u55ac\u6cbb\u4e9e","GN":"\u5e7e\u5167\u4e9e","GW":"\u5e7e\u5167\u4e9e\u6bd4\u7d22","FJ":"\u6590\u6fdf","LK":"\u65af\u91cc\u862d\u5361","SK":"\u65af\u6d1b\u4f10\u514b","SI":"\u65af\u6d1b\u7dad\u5c3c\u4e9e","CL":"\u667a\u5229","PH":"\u83f2\u5f8b\u8cd3","CI":"\u8c61\u7259\u6d77\u5cb8","VN":"\u8d8a\u5357","KY":"\u958b\u66fc\u7fa4\u5cf6","TJ":"\u5854\u5409\u514b","SN":"\u585e\u5167\u52a0\u723e","SC":"\u585e\u5e2d\u723e","RS":"\u585e\u723e\u7dad\u4e9e","AT":"\u5967\u5730\u5229","AX":"\u5967\u862d\u7fa4\u5cf6","EE":"\u611b\u6c99\u5c3c\u4e9e","IE":"\u611b\u723e\u862d","SG":"\u65b0\u52a0\u5761","NC":"\u65b0\u5580\u91cc\u591a\u5c3c\u4e9e","SL":"\u7345\u5b50\u5c71","CH":"\u745e\u58eb","SE":"\u745e\u5178","VU":"\u842c\u90a3\u675c","IT":"\u7fa9\u5927\u5229","BL":"\u8056\u5df4\u745f\u7c73","VC":"\u8056\u6587\u68ee\u53ca\u683c\u745e\u90a3\u4e01","PM":"\u8056\u76ae\u57c3\u8207\u5bc6\u514b\u9686\u7fa4\u5cf6","ST":"\u8056\u591a\u7f8e\u666e\u6797\u897f\u6bd4","KN":"\u8056\u514b\u91cc\u65af\u591a\u798f\u53ca\u5c3c\u7dad\u65af","SM":"\u8056\u99ac\u5229\u8afe","SH":"\u8056\u8d6b\u52d2\u62ff\u5cf6","CX":"\u8056\u8a95\u5cf6","LC":"\u8056\u9732\u897f\u4e9e","YE":"\u8449\u9580","KM":"\u845b\u6469","PT":"\u8461\u8404\u7259","FK":"\u798f\u514b\u862d\u7fa4\u5cf6","CV":"\u7dad\u5fb7\u89d2","MN":"\u8499\u53e4","MS":"\u8499\u54f2\u81d8","ME":"\u8499\u7279\u5167\u54e5\u7f85","BI":"\u84b2\u9686\u5730","GY":"\u84cb\u4e9e\u90a3","HM":"\u8d6b\u5fb7\u5cf6\u53ca\u9ea5\u5510\u7d0d\u7fa4\u5cf6","LA":"\u5bee\u570b","DE":"\u5fb7\u570b","MA":"\u6469\u6d1b\u54e5","MC":"\u6469\u7d0d\u54e5","MD":"\u6469\u723e\u591a\u74e6","MU":"\u6a21\u91cc\u897f\u65af","MM":"\u7dec\u7538","LB":"\u9ece\u5df4\u5ae9","MX":"\u58a8\u897f\u54e5","JE":"\u6fa4\u897f\u5cf6","AU":"\u6fb3\u6d32","RW":"\u76e7\u5b89\u9054","LU":"\u76e7\u68ee\u5821","NF":"\u8afe\u798f\u514b\u5cf6","NR":"\u8afe\u9b6f","LR":"\u8cf4\u6bd4\u745e\u4e9e","LS":"\u8cf4\u7d22\u6258","CY":"\u8cfd\u666e\u52d2\u65af","SV":"\u85a9\u723e\u74e6\u591a","WS":"\u85a9\u6469\u4e9e","RO":"\u7f85\u99ac\u5c3c\u4e9e","GU":"\u95dc\u5cf6","SD":"\u8607\u4e39","SR":"\u8607\u5229\u5357"}
\ No newline at end of file
diff --git a/redux/actions/app.js b/redux/actions/app.js
index 94b77daa..f10d162a 100644
--- a/redux/actions/app.js
+++ b/redux/actions/app.js
@@ -1,18 +1,25 @@
import { createSlice } from '@reduxjs/toolkit';
import { getItem } from 'lib/web';
-import { LOCALE_CONFIG, THEME_CONFIG, VERSION_CHECK } from 'lib/constants';
+import {
+ DEFAULT_LOCALE,
+ DEFAULT_THEME,
+ LOCALE_CONFIG,
+ THEME_CONFIG,
+ VERSION_CHECK,
+} from 'lib/constants';
import semver from 'semver';
const app = createSlice({
name: 'app',
initialState: {
- locale: getItem(LOCALE_CONFIG) || 'en-US',
- theme: getItem(THEME_CONFIG) || 'light',
+ locale: getItem(LOCALE_CONFIG) || DEFAULT_LOCALE,
+ theme: getItem(THEME_CONFIG) || DEFAULT_THEME,
versions: {
current: process.env.VERSION,
latest: null,
hasUpdate: false,
},
+ shareToken: null,
},
reducers: {
setLocale(state, action) {
@@ -27,10 +34,14 @@ const app = createSlice({
state.versions = action.payload;
return state;
},
+ setShareToken(state, action) {
+ state.shareToken = action.payload;
+ return state;
+ },
},
});
-export const { setLocale, setTheme, setVersions } = app.actions;
+export const { setLocale, setTheme, setVersions, setShareToken } = app.actions;
export default app.reducer;
diff --git a/scripts/change-password.js b/scripts/change-password.js
new file mode 100644
index 00000000..ff294bc3
--- /dev/null
+++ b/scripts/change-password.js
@@ -0,0 +1,98 @@
+require('dotenv').config();
+const bcrypt = require('bcrypt');
+const chalk = require('chalk');
+const prompts = require('prompts');
+const { PrismaClient } = require('@prisma/client');
+
+const prisma = new PrismaClient();
+const SALT_ROUNDS = 10;
+
+const runQuery = async query => {
+ return query.catch(e => {
+ throw e;
+ });
+};
+
+const updateAccountByUsername = (username, data) => {
+ return runQuery(
+ prisma.account.update({
+ where: {
+ username,
+ },
+ data,
+ }),
+ );
+};
+
+const hashPassword = password => {
+ return bcrypt.hash(password, SALT_ROUNDS);
+};
+
+const changePassword = async (username, newPassword) => {
+ const password = await hashPassword(newPassword);
+ return updateAccountByUsername(username, { password });
+};
+
+const getUsernameAndPassword = async () => {
+ let [username, password] = process.argv.slice(2);
+ if (username && password) {
+ return { username, password };
+ }
+
+ const questions = [];
+ if (!username) {
+ questions.push({
+ type: 'text',
+ name: 'username',
+ message: 'Enter account to change password',
+ });
+ }
+ if (!password) {
+ questions.push(
+ {
+ type: 'password',
+ name: 'password',
+ message: 'Enter new password',
+ },
+ {
+ type: 'password',
+ name: 'confirmation',
+ message: 'Confirm new password',
+ },
+ );
+ }
+
+ const answers = await prompts(questions);
+ if (answers.password !== answers.confirmation) {
+ throw new Error(`Passwords don't match`);
+ }
+
+ return {
+ username: username || answers.username,
+ password: answers.password,
+ };
+};
+
+(async () => {
+ let username, password;
+
+ try {
+ ({ username, password } = await getUsernameAndPassword());
+ } catch (error) {
+ console.log(chalk.redBright(error.message));
+ return;
+ }
+
+ try {
+ await changePassword(username, password);
+ console.log('Password changed for user', chalk.greenBright(username));
+ } catch (error) {
+ if (error.message.includes('RecordNotFound')) {
+ console.log('Account not found:', chalk.redBright(username));
+ } else {
+ throw error;
+ }
+ }
+
+ prisma.$disconnect();
+})();
diff --git a/scripts/check-lang.js b/scripts/check-lang.js
index 96522879..823d7115 100644
--- a/scripts/check-lang.js
+++ b/scripts/check-lang.js
@@ -2,23 +2,37 @@ const fs = require('fs');
const path = require('path');
const chalk = require('chalk');
const messages = require('../lang/en-US.json');
+const ignore = require('../lang-ignore.json');
const dir = path.resolve(__dirname, '../lang');
const files = fs.readdirSync(dir);
const keys = Object.keys(messages).sort();
+const filter = process.argv?.[2];
files.forEach(file => {
if (file !== 'en-US.json') {
const lang = require(`../lang/${file}`);
+ const id = file.replace('.json', '');
- console.log(chalk.yellowBright(`\n## ${file}`));
+ if (filter && filter !== id) {
+ return;
+ }
+
+ console.log(chalk.yellowBright(`\n## ${file.replace('.json', '')}`));
+ let count = 0;
keys.forEach(key => {
const orig = messages[key];
const check = lang[key];
+ const ignored = ignore[id]?.includes(key);
- if (!check || check === orig) {
+ if (!ignored && (!check || check === orig)) {
console.log(chalk.redBright('*'), chalk.greenBright(`${key}:`), orig);
+ count++;
}
});
+
+ if (count === 0) {
+ console.log('**👍 Complete!**');
+ }
}
});
diff --git a/scripts/start-env.js b/scripts/start-env.js
index 05823b7a..63b66369 100644
--- a/scripts/start-env.js
+++ b/scripts/start-env.js
@@ -1,3 +1,3 @@
const cli = require('next/dist/cli/next-start');
-cli.nextStart(['-p', process.env.PORT || 3000, '-H', process.env.HOSTNAME || 'localhost']);
+cli.nextStart(['-p', process.env.PORT || 3000, '-H', process.env.HOSTNAME || '0.0.0.0']);
diff --git a/styles/index.css b/styles/index.css
index c0e2ae6d..e5d31dfb 100644
--- a/styles/index.css
+++ b/styles/index.css
@@ -20,6 +20,10 @@ body {
font-family: 'Noto Sans SC', sans-serif !important;
}
+.zh-TW {
+ font-family: 'Noto Sans SC', sans-serif !important;
+}
+
.ja-JP {
font-family: 'Noto Sans JP', sans-serif !important;
}
@@ -37,6 +41,9 @@ h4,
h5,
h6 {
font-weight: 400;
+ line-height: 30px;
+ padding: 0;
+ margin: 0;
}
button,
diff --git a/tracker/index.js b/tracker/index.js
index df4c5216..5257548a 100644
--- a/tracker/index.js
+++ b/tracker/index.js
@@ -6,14 +6,17 @@ import { removeTrailingSlash } from '../lib/url';
screen: { width, height },
navigator: { language },
location: { hostname, pathname, search },
+ localStorage,
sessionStorage,
document,
history,
} = window;
const script = document.querySelector('script[data-website-id]');
- const attr = key => script && script.getAttribute(key);
+ if (!script) return;
+
+ const attr = key => script && script.getAttribute(key);
const website = attr('data-website-id');
const hostUrl = attr('data-host-url');
const autoTrack = attr('data-auto-track') !== 'false';
@@ -21,17 +24,14 @@ import { removeTrailingSlash } from '../lib/url';
const useCache = attr('data-cache');
const domains = attr('data-domains');
- if (
- !script ||
+ const disableTracking =
+ localStorage.getItem('umami.disabled') ||
(dnt && doNotTrack()) ||
(domains &&
!domains
.split(',')
.map(n => n.trim())
- .includes(hostname))
- ) {
- return;
- }
+ .includes(hostname));
const root = hostUrl
? removeTrailingSlash(hostUrl)
@@ -58,6 +58,8 @@ import { removeTrailingSlash } from '../lib/url';
};
const collect = (type, params, uuid) => {
+ if (disableTracking) return;
+
const key = 'umami.cache';
const payload = {
@@ -74,7 +76,7 @@ import { removeTrailingSlash } from '../lib/url';
});
}
- return post(
+ post(
`${root}/api/collect`,
{
type,
@@ -110,7 +112,7 @@ import { removeTrailingSlash } from '../lib/url';
const addEvents = () => {
document.querySelectorAll("[class*='umami--']").forEach(element => {
element.className.split(' ').forEach(className => {
- if (/^umami--([a-z]+)--([a-z0-9_]+[a-z0-9-_]+)$/.test(className)) {
+ if (/^umami--([a-z]+)--([\w]+[\w-]*)$/.test(className)) {
const [, type, value] = className.split('--');
const listener = () => trackEvent(value, type);
@@ -160,7 +162,7 @@ import { removeTrailingSlash } from '../lib/url';
/* Start */
- if (autoTrack) {
+ if (autoTrack && !disableTracking) {
history.pushState = hook(history, 'pushState', handlePush);
history.replaceState = hook(history, 'replaceState', handlePush);
diff --git a/yarn.lock b/yarn.lock
index 641dd5de..01277268 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -10,18 +10,18 @@
cross-fetch "3.0.5"
lru-cache "6.0.0"
-"@ampproject/toolbox-optimizer@2.6.0":
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/@ampproject/toolbox-optimizer/-/toolbox-optimizer-2.6.0.tgz#e1bde0697d0fb25ab888bc0d0422998abaf6bad1"
- integrity sha512-saToXVopb15a6zKK6kW4B1N/sYZZddkECcqmfTotRxJ2DaLE+wFB6jgWLbaPkgHwvLPQyA2IjV9BHJ/KUFuGzg==
+"@ampproject/toolbox-optimizer@2.7.0-alpha.1":
+ version "2.7.0-alpha.1"
+ resolved "https://registry.yarnpkg.com/@ampproject/toolbox-optimizer/-/toolbox-optimizer-2.7.0-alpha.1.tgz#ab4c386645f991e5da5a9d2967ed2bb734a9f6c4"
+ integrity sha512-2wTvOyM6GP6FrYQzxSQCg43STo1jMRGeDKa6YUkYXYH9fm9Wbt2wTRx+ajjb48JQ6WwUnGwga1MhQhVFzRQ+wQ==
dependencies:
"@ampproject/toolbox-core" "^2.6.0"
- "@ampproject/toolbox-runtime-version" "^2.6.0"
+ "@ampproject/toolbox-runtime-version" "^2.7.0-alpha.1"
"@ampproject/toolbox-script-csp" "^2.5.4"
"@ampproject/toolbox-validator-rules" "^2.5.4"
abort-controller "3.0.0"
cross-fetch "3.0.5"
- cssnano-simple "1.0.5"
+ cssnano-simple "1.2.0"
dom-serializer "1.0.1"
domhandler "3.0.0"
domutils "2.1.0"
@@ -32,12 +32,12 @@
normalize-html-whitespace "1.0.0"
postcss "7.0.32"
postcss-safe-parser "4.0.2"
- terser "4.8.0"
+ terser "5.1.0"
-"@ampproject/toolbox-runtime-version@^2.6.0":
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/@ampproject/toolbox-runtime-version/-/toolbox-runtime-version-2.6.0.tgz#c2a310840a6c60a7f5046d2ccaf45646a761bd4f"
- integrity sha512-wT+Ehsoq2PRXqpgjebygHD01BpSlaAE4HfDEVxgPVT8oAsLzE4ywZgzI2VQZfaCdb8qLyO5+WXrLSoJXxDBo2Q==
+"@ampproject/toolbox-runtime-version@^2.7.0-alpha.1":
+ version "2.7.0-alpha.1"
+ resolved "https://registry.yarnpkg.com/@ampproject/toolbox-runtime-version/-/toolbox-runtime-version-2.7.0-alpha.1.tgz#2ecd603e1fc986f21048947639e99b5706e01ec3"
+ integrity sha512-JruvO4RfaC/piKOY/2w6vuasNjdrHnb+xvmQTl4zBBdMsDooohZKsN9jv9YiKIdpny4MzLt1ce497840vJJq+g==
dependencies:
"@ampproject/toolbox-core" "^2.6.0"
@@ -994,13 +994,20 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-transform-typescript" "^7.10.4"
-"@babel/runtime@7.11.2", "@babel/runtime@^7.0.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4":
+"@babel/runtime@7.11.2", "@babel/runtime@^7.0.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.8.4":
version "7.11.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
dependencies:
regenerator-runtime "^0.13.4"
+"@babel/runtime@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740"
+ integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
"@babel/template@^7.10.4", "@babel/template@^7.7.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
@@ -1048,10 +1055,10 @@
resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==
-"@eslint/eslintrc@^0.1.3":
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085"
- integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==
+"@eslint/eslintrc@^0.2.1":
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c"
+ integrity sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==
dependencies:
ajv "^6.12.4"
debug "^4.1.1"
@@ -1064,12 +1071,12 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
-"@formatjs/cli@^2.13.0":
- version "2.13.0"
- resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-2.13.0.tgz#64018c82f9fbc291918792daf1eed16e4b56bb7f"
- integrity sha512-1E/rdrKiHi7gbcN0WuY792X+jCHWI+9jC3565hhZXAJYmgNe9SntRW02nEJOK3WOkhm6yMWiHPLkFpyLq5hW3w==
+"@formatjs/cli@^2.13.5":
+ version "2.13.5"
+ resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-2.13.5.tgz#833892bfa01df1c6f1eab438585a10675a553b09"
+ integrity sha512-t4dWNXjguodNL2xYWCnVqXjm36QNkMUMQPbYvILIjgLxoQSqY5/t9qgF1QwAFt6zhMPzvrw+FRdO9dBYupRcvQ==
dependencies:
- "@formatjs/ts-transformer" "^2.11.1"
+ "@formatjs/ts-transformer" "^2.12.0"
"@types/json-stable-stringify" "^1.0.32"
"@types/lodash" "^4.14.150"
"@types/loud-rejection" "^2.0.0"
@@ -1078,7 +1085,7 @@
commander "^6.1.0"
fast-glob "^3.2.4"
fs-extra "^9.0.0"
- intl-messageformat-parser "^6.0.8"
+ intl-messageformat-parser "^6.0.11"
json-stable-stringify "^1.0.1"
lodash "^4.17.15"
loud-rejection "^2.2.0"
@@ -1090,27 +1097,27 @@
resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.2.2.tgz#4810bdbd696d3805c535fd0620b7c8f45ab3164f"
integrity sha512-mLCoAPGlXCVskb/ojBO6iurGqwo6sZvAl8pRC4N25bz4LPWExAM9LsOo057zN3Br1JxUM3RZHG4YGnVt+nSRYQ==
-"@formatjs/ecma402-abstract@^1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.2.3.tgz#ca94911dd8e9c89eeaabba0f00e2f692979fc27b"
- integrity sha512-sEkxTZj7qa+Pi/c4ppE5mxZYJkqQO3GNZzJZjAxgsXip2ixO/TZn58qrxdQ0V8mXmf+5xf+AfveyPvv4yHaRtw==
+"@formatjs/ecma402-abstract@^1.2.6":
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.2.6.tgz#8929525dcb49af31f348fcb4789263743872b57f"
+ integrity sha512-5/wUWuOFEaZeHhDvc+xgkFZxjYcij9/CjyUHngTfWhx+NwYqo8/xusVYv9SnTYDHAahek3OSCP93tzcv4M+7Xw==
dependencies:
tslib "^2.0.1"
-"@formatjs/intl-displaynames@^3.3.10":
- version "3.3.10"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-3.3.10.tgz#905ad86431fdadfab2ec188bf9f4fe9e359d1fe6"
- integrity sha512-SdIMuaKUO0N5zQb6CXtIrwjJbX+DC8ju7ifrcqpLagUMh2nIEJCz7sf0Q6lOMWEE+un1VTmjaXpRPP55cP40IA==
+"@formatjs/intl-displaynames@^3.4.1":
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-3.4.1.tgz#b63276045065761cd9d4a2548f337fb3a430a898"
+ integrity sha512-bStuATYAecjxMNVv9TOBLiTK90F7jTbVioiZCrbNt97zbBoShYwddLMdgczGMeyvy/bwJ7NBXY1+5bg1vKUVvA==
dependencies:
- "@formatjs/ecma402-abstract" "^1.2.3"
+ "@formatjs/ecma402-abstract" "^1.2.6"
tslib "^2.0.1"
-"@formatjs/intl-listformat@^4.2.8":
- version "4.2.8"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-4.2.8.tgz#aa8935234dd5f8fcec6d08dfdf2be43e11ba671c"
- integrity sha512-9qAThh/1HV9T/g6E11VbN5b209zg28fMUMrZqrpHiZZxc2PPHvP/CGqK7mo8hpyCoMUVo3kFxB5CFnw5difJrA==
+"@formatjs/intl-listformat@^4.3.1":
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-4.3.1.tgz#273747c42c6d6fd4e16e3588be3dc2743a68d77e"
+ integrity sha512-BSJ3mzxD0xxfRLAuQCRUHcO4b+JA0/kfLybyLew6nD+TeBMpfxFWTcgN4E8qa3752eYK7eXM4XrXrJYm0nWWmg==
dependencies:
- "@formatjs/ecma402-abstract" "^1.2.3"
+ "@formatjs/ecma402-abstract" "^1.2.6"
tslib "^2.0.1"
"@formatjs/intl-numberformat@^5.5.2":
@@ -1120,34 +1127,34 @@
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
-"@formatjs/intl-relativetimeformat@^7.2.8":
- version "7.2.8"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-7.2.8.tgz#a423ef9acd379980f58730b4757713156076de14"
- integrity sha512-h6H5lcPn1LbVlAk62m7DYtY68aE6AiZVK1bLEo3HeWrMBFCskWAe9I/5kI+RjStdGZzo+CqBl+rSTcrSXjVj+g==
+"@formatjs/intl-relativetimeformat@^7.3.1":
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-7.3.1.tgz#eb90e856f89c1367245b3ece53bb8854458c7c2e"
+ integrity sha512-OcPSa2sU262MSTTRAgGggs9V9tXWJSu54Ugwe5x/sNUUDlbsen0HZc7N05JJSDTW/XWxGzHKkhSqC9TB49+Caw==
dependencies:
- "@formatjs/ecma402-abstract" "^1.2.3"
+ "@formatjs/ecma402-abstract" "^1.2.6"
tslib "^2.0.1"
-"@formatjs/intl@^1.3.4":
- version "1.3.4"
- resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.3.4.tgz#66441b85986726256f83fdffdb533c6334bc299b"
- integrity sha512-aq6bhi2aZPYUEL15iiBrsNzDtw4Qe1r9dsqM26fbTbfWa6r5sdqcFwGySoeTzguxd+ZXoc9RypSMERjH92xFKA==
+"@formatjs/intl@^1.3.8":
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.3.8.tgz#de7ce5119e5c04d70398681d8471f1d2d12f7b7b"
+ integrity sha512-vksg+ksKEtdaMb5M2POx41C5SQy98xdny6maMOyjcSvaaz8hyNuRsaIVVdy5ThRCsuXlsWkcjPUTXQqKM3SLaw==
dependencies:
- "@formatjs/ecma402-abstract" "^1.2.3"
- "@formatjs/intl-displaynames" "^3.3.10"
- "@formatjs/intl-listformat" "^4.2.8"
- "@formatjs/intl-relativetimeformat" "^7.2.8"
+ "@formatjs/ecma402-abstract" "^1.2.6"
+ "@formatjs/intl-displaynames" "^3.4.1"
+ "@formatjs/intl-listformat" "^4.3.1"
+ "@formatjs/intl-relativetimeformat" "^7.3.1"
fast-memoize "^2.5.2"
- intl-messageformat "^9.3.9"
- intl-messageformat-parser "^6.0.8"
+ intl-messageformat "^9.3.12"
+ intl-messageformat-parser "^6.0.11"
tslib "^2.0.1"
-"@formatjs/ts-transformer@^2.11.1":
- version "2.11.1"
- resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-2.11.1.tgz#9b30c066cd1ca1831bfc76e22b01e2858b931923"
- integrity sha512-VAjFBnWSQfO71PrR0NeGgwGoHOAlNMuQv4kdV6GpxQ/3d4YM+202Cpu6r1BmCvxkuXhijTMUu7ubKeenUr8WcA==
+"@formatjs/ts-transformer@^2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-2.12.0.tgz#71bb3d1af3e818996211b36231d1b753859f46f9"
+ integrity sha512-bi7XVicXTPHMEK4vapp29wJQnBHt9IrNW5QREiBPR5NF52EGvuVQeLmfU17nnojnHf4+X0PoamW7Sr0WPTtmWA==
dependencies:
- intl-messageformat-parser "^6.0.8"
+ intl-messageformat-parser "^6.0.11"
tslib "^2.0.1"
typescript "^4.0"
@@ -1159,20 +1166,40 @@
intl-messageformat-parser "^6.0.7"
typescript "^4.0"
-"@next/env@9.5.4":
- version "9.5.4"
- resolved "https://registry.yarnpkg.com/@next/env/-/env-9.5.4.tgz#950f3370151a940ecac6e7e19cf125e6113e101e"
- integrity sha512-uGnUO68/u9C8bqHj5obIvyGRDqe/jh1dFSLx03mJmlESjcCmV4umXYJOnt3XzU1VhVntSE+jUZtnS5bjYmmLfQ==
+"@hapi/accept@5.0.1":
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.1.tgz#068553e867f0f63225a506ed74e899441af53e10"
+ integrity sha512-fMr4d7zLzsAXo28PRRQPXR1o2Wmu+6z+VY1UzDp0iFo13Twj8WePakwXBiqn3E1aAlTpSNzCXdnnQXFhst8h8Q==
+ dependencies:
+ "@hapi/boom" "9.x.x"
+ "@hapi/hoek" "9.x.x"
-"@next/polyfill-module@9.5.4":
- version "9.5.4"
- resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-9.5.4.tgz#35ea31ce5f6bbf0ac31aac483b60d4ba17a79861"
- integrity sha512-GA2sW7gs33s7RGPFqkMiT9asYpaV/Hhw9+XM9/UlPrkNdTaxZWaPa2iHgmqJ7k6OHiOmy+CBLFrUBgzqKNhs3Q==
+"@hapi/boom@9.x.x":
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.0.tgz#0d9517657a56ff1e0b42d0aca9da1b37706fec56"
+ integrity sha512-4nZmpp4tXbm162LaZT45P7F7sgiem8dwAh2vHWT6XX24dozNjGMg6BvKCRvtCUcmcXqeMIUqWN8Rc5X8yKuROQ==
+ dependencies:
+ "@hapi/hoek" "9.x.x"
-"@next/react-dev-overlay@9.5.4":
- version "9.5.4"
- resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-9.5.4.tgz#7d88a710d23021020cca213bc77106df18950b2b"
- integrity sha512-tYvNmOQ0inykSvcimkTiONMv4ZyFB2G2clsy9FKLLRZ2OA+Jiov6T7Pq6YpKbBwTLu/BQGVc7Qn4BZ5CDHR8ig==
+"@hapi/hoek@9.x.x":
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.0.tgz#6c9eafc78c1529248f8f4d92b0799a712b6052c6"
+ integrity sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==
+
+"@next/env@10.0.0":
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/@next/env/-/env-10.0.0.tgz#eb0239062226a9c8b604d58d4a4204e26c22eb16"
+ integrity sha512-59+6BnOxPoMY64Qy2crDGHtvQgHwIL1SIkWeNiEud1V6ASs59SM9oDGN+Bo/EswII1nn+wQRpMvax0IIN2j+VQ==
+
+"@next/polyfill-module@10.0.0":
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-10.0.0.tgz#17f59cb7325a03f23b66b979fccc56d133411b0a"
+ integrity sha512-FLSwwWQaP/sXjlS7w4YFu+oottbo/bjoh+L+YED7dblsaRJT89ifV+h8zvLvh1hCL7FJUYVar4rehvj/VO5T9w==
+
+"@next/react-dev-overlay@10.0.0":
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-10.0.0.tgz#ba1acc79bc9d874f1801a0b312e6a45de74bf425"
+ integrity sha512-HJ44TJXtaGfGxVtljPECZvqw+GctVvBr60Rsedo5A+wU2GIiycJ8n5yUSdc9UiYTnPuxfJFicJec6kgR6GSWKA==
dependencies:
"@babel/code-frame" "7.10.4"
ally.js "1.4.1"
@@ -1185,10 +1212,10 @@
stacktrace-parser "0.1.10"
strip-ansi "6.0.0"
-"@next/react-refresh-utils@9.5.4":
- version "9.5.4"
- resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-9.5.4.tgz#3bfe067f0cfc717f079482d956211708c9e81126"
- integrity sha512-TPhEiYxK5YlEuzVuTzgZiDN7SDh4drvUAqsO9Yccd8WLcfYqOLRN2fCALremW5mNLAZQZW3iFgW8PW8Gckq4EQ==
+"@next/react-refresh-utils@10.0.0":
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-10.0.0.tgz#45cdd1ad3b55ac442f8431cdc43ff53c3dc44d16"
+ integrity sha512-V1/oiDWb2C1Do0eZONsKX1aqGNkqCUqxUahIiCjwKFu9c3bps+Ygg4JjtaCd9oycv0KzYImUZnU+nqveFUjxUw==
"@nodelib/fs.scandir@2.1.3":
version "2.1.3"
@@ -1223,17 +1250,35 @@
resolved "https://registry.yarnpkg.com/@panva/asn1.js/-/asn1.js-1.0.0.tgz#dd55ae7b8129e02049f009408b97c61ccf9032f6"
integrity sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==
-"@prisma/cli@2.8.0":
- version "2.8.0"
- resolved "https://registry.yarnpkg.com/@prisma/cli/-/cli-2.8.0.tgz#919d7f66023affa76d14823212b62a8512cfd37d"
- integrity sha512-Kg1C47d75jdEIMmJif8TMlv/2Ihx08E1qWp0euwoZhjd807HGnjgC9tJYjTfkdf+NMJSAUbvoPXKInEX0HoOMw==
+"@prisma/bar@^0.0.0":
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/@prisma/bar/-/bar-0.0.0.tgz#9daff159a1a09abf7665a8b6e40ddc1fdc1ed4f7"
+ integrity sha512-3nez9n/vMyAr4+nmqj6Xh3cGZbreYHr3RWX0vgtrFRpiN6otuCzL+9HW8MW/DfZNuFz5YyIdfwnRSPueUZPoWQ==
-"@prisma/client@2.8.0":
- version "2.8.0"
- resolved "https://registry.yarnpkg.com/@prisma/client/-/client-2.8.0.tgz#a0f7247786c9b6ee804437acf8215854c5eb3946"
- integrity sha512-5+GzRTkPnmv4OEV2tB8kwQt/xLLxBR/daJBcMt6pnnonJvrREsu0tSTdz2LJNPaj3kTT0fSS/OaeGMMdfVYSpw==
+"@prisma/cli@2.10.1":
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/@prisma/cli/-/cli-2.10.1.tgz#e99ebff7290e27c13062543f464f169448e5587c"
+ integrity sha512-I+51GBJyuGS5xsCl8pf4XfTt9HIdhCJQoaGCA9KLDzVRbFHElMQ++hhyhLohJ4buFZlSagIq8NI8yIC5yu+Wkg==
dependencies:
- pkg-up "^3.1.0"
+ "@prisma/bar" "^0.0.0"
+ "@prisma/engines" "2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111"
+
+"@prisma/client@2.10.1":
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/@prisma/client/-/client-2.10.1.tgz#96fe79ad0d7763d0eda1ea91870a8882e4dbb21f"
+ integrity sha512-VwasxCCwdRmrcVVoLwXTEbwrBiqOYr2Umqw9btvMvHGRhA1nRKCvmt7SCiCjGrx6CuC8eCG/HGxruv04001YKQ==
+ dependencies:
+ "@prisma/engines-version" "2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111"
+
+"@prisma/engines-version@2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111":
+ version "2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111"
+ resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111.tgz#7f96aa61085fc803f81b3df0fa32297909ce4b08"
+ integrity sha512-OuOSTvEzXJwCJzNqZ9N/+J3lO64HgX9uGiVOuvlTrRSXoLZk0Q2IiLAx8qhY1U7jPpHJ7LTlZuGNScimqonpJg==
+
+"@prisma/engines@2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111":
+ version "2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111"
+ resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111.tgz#614e82316270333d31a1581e533ef0c275b2b5f6"
+ integrity sha512-F/I8mmYMQnEFX47jl7Su8Pmvpua1wti9Uq3IUlSCqLQsrOmuMj+GKQ5nYEewmcynqBlyVcpUyxF5iAWbmUVdjw==
"@reduxjs/toolkit@^1.4.0":
version "1.4.0"
@@ -1254,10 +1299,10 @@
"@types/buble" "^0.19.2"
buble "^0.20.0"
-"@rollup/plugin-node-resolve@^9.0.0":
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz#39bd0034ce9126b39c1699695f440b4b7d2b62e6"
- integrity sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==
+"@rollup/plugin-node-resolve@^10.0.0":
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-10.0.0.tgz#44064a2b98df7530e66acf8941ff262fc9b4ead8"
+ integrity sha512-sNijGta8fqzwA1VwUEtTvWCx2E7qC70NMsDh4ZG13byAXYigBNZMxALhKUSycBks5gupJdq0lFrKumFrRZ8H3A==
dependencies:
"@rollup/pluginutils" "^3.1.0"
"@types/resolve" "1.17.1"
@@ -1266,13 +1311,13 @@
is-module "^1.0.0"
resolve "^1.17.0"
-"@rollup/plugin-replace@^2.3.3":
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.3.3.tgz#cd6bae39444de119f5d905322b91ebd4078562e7"
- integrity sha512-XPmVXZ7IlaoWaJLkSCDaa0Y6uVo5XQYHhiMFzOd5qSv5rE+t/UJToPIOE56flKIxBFQI27ONsxb7dqHnwSsjKQ==
+"@rollup/plugin-replace@^2.3.4":
+ version "2.3.4"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.3.4.tgz#7dd84c17755d62b509577f2db37eb524d7ca88ca"
+ integrity sha512-waBhMzyAtjCL1GwZes2jaE9MjuQ/DQF2BatH3fRivUF3z0JBFrU0U6iBNC/4WR+2rLKhaAhPWDNPYp4mI6RqdQ==
dependencies:
- "@rollup/pluginutils" "^3.0.8"
- magic-string "^0.25.5"
+ "@rollup/pluginutils" "^3.1.0"
+ magic-string "^0.25.7"
"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0":
version "3.1.0"
@@ -1785,16 +1830,13 @@ acorn@^7.1.1, acorn@^7.4.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c"
integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==
-adjust-sourcemap-loader@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz#6471143af75ec02334b219f54bc7970c52fb29a4"
- integrity sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==
+adjust-sourcemap-loader@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e"
+ integrity sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==
dependencies:
- assert "1.4.1"
- camelcase "5.0.0"
- loader-utils "1.2.3"
- object-path "0.11.4"
- regex-parser "2.2.10"
+ loader-utils "^2.0.0"
+ regex-parser "^2.2.11"
agent-base@6:
version "6.0.1"
@@ -2012,13 +2054,6 @@ asn1.js@^5.2.0:
minimalistic-assert "^1.0.0"
safer-buffer "^2.1.0"
-assert@1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
- integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=
- dependencies:
- util "0.10.3"
-
assert@^1.1.1:
version "1.5.0"
resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
@@ -2126,7 +2161,7 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
-base64-js@^1.0.2:
+base64-js@^1.0.2, base64-js@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
@@ -2174,6 +2209,15 @@ bindings@^1.5.0:
dependencies:
file-uri-to-path "1.0.0"
+bl@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489"
+ integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==
+ dependencies:
+ buffer "^5.5.0"
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+
bluebird@^3.5.5:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
@@ -2351,6 +2395,14 @@ buffer@^4.3.0:
ieee754 "^1.1.4"
isarray "^1.0.0"
+buffer@^5.5.0:
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.0.tgz#88afbd29fc89fa7b58e82b39206f31f2cf34feed"
+ integrity sha512-cd+5r1VLBwUqTrmnzW+D7ABkJUM6mr7uv1dv+6jRw4Rcl7tFIFHDqHPL98LhpGFn3dbAt3gtLxtrWp4m1kFrqg==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
bufferutil@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7"
@@ -2441,11 +2493,6 @@ camelcase-keys@^6.2.2:
map-obj "^4.0.0"
quick-lru "^4.0.1"
-camelcase@5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42"
- integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==
-
camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1:
version "5.3.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
@@ -2527,10 +2574,10 @@ chardet@^0.7.0:
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
-chart.js@^2.9.3:
- version "2.9.3"
- resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.3.tgz#ae3884114dafd381bc600f5b35a189138aac1ef7"
- integrity sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==
+chart.js@^2.9.4:
+ version "2.9.4"
+ resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.4.tgz#0827f9563faffb2dc5c06562f8eb10337d5b9684"
+ integrity sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==
dependencies:
chartjs-color "^2.1.0"
moment "^2.10.2"
@@ -2550,7 +2597,22 @@ chartjs-color@^2.1.0:
chartjs-color-string "^0.6.0"
color-convert "^1.9.3"
-chokidar@2.1.8, chokidar@^2.1.8:
+chokidar@3.4.2, chokidar@^3.4.1:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d"
+ integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.4.0"
+ optionalDependencies:
+ fsevents "~2.1.2"
+
+chokidar@^2.1.8:
version "2.1.8"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
@@ -2569,21 +2631,6 @@ chokidar@2.1.8, chokidar@^2.1.8:
optionalDependencies:
fsevents "^1.2.7"
-chokidar@^3.4.1:
- version "3.4.2"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d"
- integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==
- dependencies:
- anymatch "~3.1.1"
- braces "~3.0.2"
- glob-parent "~5.1.0"
- is-binary-path "~2.1.0"
- is-glob "~4.0.1"
- normalize-path "~3.0.0"
- readdirp "~3.4.0"
- optionalDependencies:
- fsevents "~2.1.2"
-
chownr@^1.1.1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
@@ -2699,7 +2746,7 @@ collection-visit@^1.0.0:
map-visit "^1.0.0"
object-visit "^1.0.0"
-color-convert@^1.9.0, color-convert@^1.9.3:
+color-convert@^1.9.0, color-convert@^1.9.1, color-convert@^1.9.3:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
@@ -2723,6 +2770,22 @@ color-name@^1.0.0, color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+color-string@^1.5.4:
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6"
+ integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==
+ dependencies:
+ color-name "^1.0.0"
+ simple-swizzle "^0.2.2"
+
+color@^3.1.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e"
+ integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==
+ dependencies:
+ color-convert "^1.9.1"
+ color-string "^1.5.4"
+
colorette@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
@@ -2738,11 +2801,16 @@ commander@2.20.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
-commander@^6.0.0, commander@^6.1.0:
+commander@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc"
integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==
+commander@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75"
+ integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==
+
common-tags@^1.4.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
@@ -3073,13 +3141,6 @@ cssesc@^3.0.0:
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
-cssnano-preset-simple@1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-1.1.4.tgz#7b287a31df786348565d02342df71af8f758ac82"
- integrity sha512-EYKDo65W+AxMViUijv/hvhbEnxUjmu3V7omcH1MatPOwjRLrAgVArUOE8wTUyc1ePFEtvV8oCT4/QSRJDorm/A==
- dependencies:
- postcss "^7.0.32"
-
cssnano-preset-simple@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-1.2.0.tgz#afcf13eb076e8ebd91c4f311cd449781c14c7371"
@@ -3088,14 +3149,6 @@ cssnano-preset-simple@1.2.0:
caniuse-lite "^1.0.30001093"
postcss "^7.0.32"
-cssnano-simple@1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-1.0.5.tgz#66ee528f3a4e60754e2625ea9f51ac315f5f0a92"
- integrity sha512-NJjx2Er1C3pa75v1GwMKm0w6xAp1GsW2Ql1As4CWPNFxTgYFN5e8wblYeHfna13sANAhyIdSIPqKJjBO4CU5Eg==
- dependencies:
- cssnano-preset-simple "1.1.4"
- postcss "^7.0.32"
-
cssnano-simple@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-1.2.0.tgz#b8cc5f52c2a52e6513b4636d0da165ec9d48d327"
@@ -3128,80 +3181,79 @@ cyclist@^1.0.1:
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
-d3-array@1:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f"
- integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==
+d3-array@>=2.5:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.8.0.tgz#f76e10ad47f1f4f75f33db5fc322eb9ffde5ef23"
+ integrity sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw==
-d3-color@1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a"
- integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==
+"d3-color@1 - 2":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e"
+ integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==
-d3-dispatch@1:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58"
- integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==
+"d3-dispatch@1 - 2":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-2.0.0.tgz#8a18e16f76dd3fcaef42163c97b926aa9b55e7cf"
+ integrity sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==
-d3-drag@1:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70"
- integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==
+d3-drag@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-2.0.0.tgz#9eaf046ce9ed1c25c88661911c1d5a4d8eb7ea6d"
+ integrity sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w==
dependencies:
- d3-dispatch "1"
- d3-selection "1"
+ d3-dispatch "1 - 2"
+ d3-selection "2"
-d3-ease@1:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2"
- integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==
+"d3-ease@1 - 2":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-2.0.0.tgz#fd1762bfca00dae4bacea504b1d628ff290ac563"
+ integrity sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==
-d3-geo@^1.11.9:
- version "1.12.1"
- resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f"
- integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==
+d3-geo@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-2.0.1.tgz#2437fdfed3fe3aba2812bd8f30609cac83a7ee39"
+ integrity sha512-M6yzGbFRfxzNrVhxDJXzJqSLQ90q1cCyb3EWFZ1LF4eWOBYxFypw7I/NFVBNXKNqxv1bqLathhYvdJ6DC+th3A==
dependencies:
- d3-array "1"
+ d3-array ">=2.5"
-d3-interpolate@1:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987"
- integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==
+"d3-interpolate@1 - 2":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163"
+ integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==
dependencies:
- d3-color "1"
+ d3-color "1 - 2"
-d3-selection@1, d3-selection@^1.1.0, d3-selection@^1.4.1:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c"
- integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==
+d3-selection@2, d3-selection@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-2.0.0.tgz#94a11638ea2141b7565f883780dabc7ef6a61066"
+ integrity sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==
-d3-timer@1:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5"
- integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==
+"d3-timer@1 - 2":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-2.0.0.tgz#055edb1d170cfe31ab2da8968deee940b56623e6"
+ integrity sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==
-d3-transition@1:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398"
- integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==
+d3-transition@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-2.0.0.tgz#366ef70c22ef88d1e34105f507516991a291c94c"
+ integrity sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==
dependencies:
- d3-color "1"
- d3-dispatch "1"
- d3-ease "1"
- d3-interpolate "1"
- d3-selection "^1.1.0"
- d3-timer "1"
+ d3-color "1 - 2"
+ d3-dispatch "1 - 2"
+ d3-ease "1 - 2"
+ d3-interpolate "1 - 2"
+ d3-timer "1 - 2"
-d3-zoom@^1.8.3:
- version "1.8.3"
- resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a"
- integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==
+d3-zoom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-2.0.0.tgz#f04d0afd05518becce879d04709c47ecd93fba54"
+ integrity sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==
dependencies:
- d3-dispatch "1"
- d3-drag "1"
- d3-interpolate "1"
- d3-selection "1"
- d3-transition "1"
+ d3-dispatch "1 - 2"
+ d3-drag "2"
+ d3-interpolate "1 - 2"
+ d3-selection "2"
+ d3-transition "2"
d@1, d@^1.0.1:
version "1.0.1"
@@ -3218,17 +3270,22 @@ data-uri-to-buffer@3.0.0:
dependencies:
buffer-from "^1.1.1"
-date-fns-tz@^1.0.10:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.0.10.tgz#30fef0038f80534fddd8e133a6b8ca55ba313748"
- integrity sha512-cHQAz0/9uDABaUNDM80Mj1FL4ODlxs1xEY4b0DQuAooO2UdNKvDkNbV8ogLnxLbv02Ru1HXFcot0pVvDRBgptg==
+date-fns-tz@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.0.12.tgz#2d680e1099767775cff7a30eac34362d52639fed"
+ integrity sha512-Ca+9pjGkU90XDHnclfSjz9o7g/ZqyYyYI0aCYmbf65P75oy8gktuaRslO3UPXl3ADgAnF9/KCykQkpU3/xvtWQ==
date-fns@^2.16.1:
version "2.16.1"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.1.tgz#05775792c3f3331da812af253e1a935851d3834b"
integrity sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==
-debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
+debounce@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131"
+ integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==
+
+debug@4, 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==
@@ -3267,6 +3324,20 @@ decode-uri-component@^0.2.0:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+decompress-response@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
+ integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
+ dependencies:
+ mimic-response "^2.0.0"
+
+decompress-response@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
+ integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
+ dependencies:
+ mimic-response "^3.1.0"
+
dedent@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
@@ -3348,17 +3419,17 @@ des.js@^1.0.0:
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
-detect-browser@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.1.1.tgz#a800db91d3fd60d0861669f5984f1be9ffbe009c"
- integrity sha512-5n2aWI57qC3kZaK4j2zYsG6L1LrxgLptGCNhMQgdKhVn6cSdcq43pp6xHPfTHG3TYM6myF4tIPWiZtfdVDgb9w==
+detect-browser@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97"
+ integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA==
detect-indent@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd"
integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==
-detect-libc@^1.0.2:
+detect-libc@^1.0.2, detect-libc@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
@@ -3547,7 +3618,7 @@ emojis-list@^3.0.0:
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
-end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -3686,10 +3757,10 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
-eslint-config-prettier@^6.12.0:
- version "6.12.0"
- resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.12.0.tgz#9eb2bccff727db1c52104f0b49e87ea46605a0d2"
- integrity sha512-9jWPlFlgNwRUYVoujvWTQ1aMO8o6648r+K7qU7K5Jmkbyqav1fuEZC0COYpGBxyiAJb65Ra9hrmFx19xRGwXWw==
+eslint-config-prettier@^6.15.0:
+ version "6.15.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9"
+ integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==
dependencies:
get-stdin "^6.0.0"
@@ -3700,26 +3771,26 @@ eslint-plugin-prettier@^3.1.3:
dependencies:
prettier-linter-helpers "^1.0.0"
-eslint-plugin-react-hooks@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.1.2.tgz#2eb53731d11c95826ef7a7272303eabb5c9a271e"
- integrity sha512-ykUeqkGyUGgwTtk78C0o8UG2fzwmgJ0qxBGPp2WqRKsTwcLuVf01kTDRAtOsd4u6whX2XOC8749n2vPydP82fg==
+eslint-plugin-react-hooks@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556"
+ integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==
-eslint-plugin-react@^7.21.2:
- version "7.21.2"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.21.2.tgz#3bd5d2c4c36d5a0428d0d6dda301ac9a84d681b2"
- integrity sha512-j3XKvrK3rpBzveKFbgAeGsWb9uz6iUOrR0jixRfjwdFeGSRsXvVTFtHDQYCjsd1/6Z/xvb8Vy3LiI5Reo7fDrg==
+eslint-plugin-react@^7.21.5:
+ version "7.21.5"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz#50b21a412b9574bfe05b21db176e8b7b3b15bff3"
+ integrity sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==
dependencies:
array-includes "^3.1.1"
array.prototype.flatmap "^1.2.3"
doctrine "^2.1.0"
has "^1.0.3"
- jsx-ast-utils "^2.4.1"
+ jsx-ast-utils "^2.4.1 || ^3.0.0"
object.entries "^1.1.2"
object.fromentries "^2.0.2"
object.values "^1.1.1"
prop-types "^15.7.2"
- resolve "^1.17.0"
+ resolve "^1.18.1"
string.prototype.matchall "^4.0.2"
eslint-scope@^4.0.3:
@@ -3757,6 +3828,11 @@ eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
+eslint-visitor-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
+ integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
+
eslint@^6.8.0:
version "6.8.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb"
@@ -3800,13 +3876,13 @@ eslint@^6.8.0:
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
-eslint@^7.10.0:
- version "7.10.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.10.0.tgz#494edb3e4750fb791133ca379e786a8f648c72b9"
- integrity sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA==
+eslint@^7.12.1:
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.1.tgz#bd9a81fa67a6cfd51656cdb88812ce49ccec5801"
+ integrity sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==
dependencies:
"@babel/code-frame" "^7.0.0"
- "@eslint/eslintrc" "^0.1.3"
+ "@eslint/eslintrc" "^0.2.1"
ajv "^6.10.0"
chalk "^4.0.0"
cross-spawn "^7.0.2"
@@ -3815,7 +3891,7 @@ eslint@^7.10.0:
enquirer "^2.3.5"
eslint-scope "^5.1.1"
eslint-utils "^2.1.0"
- eslint-visitor-keys "^1.3.0"
+ eslint-visitor-keys "^2.0.0"
espree "^7.3.0"
esquery "^1.2.0"
esutils "^2.0.2"
@@ -3918,10 +3994,10 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
md5.js "^1.3.4"
safe-buffer "^5.1.1"
-execa@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2"
- integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==
+execa@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a"
+ integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==
dependencies:
cross-spawn "^7.0.0"
get-stream "^5.0.0"
@@ -3953,6 +4029,11 @@ expand-brackets@^2.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
+expand-template@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
+ integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
+
ext@^1.1.2:
version "1.4.0"
resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244"
@@ -4203,10 +4284,10 @@ for-own@^0.1.3:
dependencies:
for-in "^1.0.1"
-formik@^2.1.7:
- version "2.1.7"
- resolved "https://registry.yarnpkg.com/formik/-/formik-2.1.7.tgz#40bd04e59b242176d0a17c701830f1536cd7506b"
- integrity sha512-n1wviIh0JsvHqj9PufNvOV+fS7mFwh9FfMxxTMnTrKR/uVYMS06DKaivXBlJdDF0qEwTcPHxSmIQ3deFHL3Hsg==
+formik@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/formik/-/formik-2.2.1.tgz#e09747569e44ffc17263541d2e732cc6568208dc"
+ integrity sha512-N/8Q1yGlXHibyrM5CyKtC85V8U+mxY04zSfakpyR1e6KpaIC4+A4yo30NBARRprkFoxoT1EV+yK8bo5tjXxfyg==
dependencies:
deepmerge "^2.1.1"
hoist-non-react-statics "^3.3.0"
@@ -4232,6 +4313,11 @@ from2@^2.1.0:
inherits "^2.0.1"
readable-stream "^2.0.0"
+fs-constants@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+ integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
fs-extra@^9.0.0:
version "9.0.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc"
@@ -4340,6 +4426,11 @@ get-value@^2.0.3, get-value@^2.0.6:
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+github-from-package@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
+ integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
+
glob-parent@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
@@ -4625,6 +4716,11 @@ icss-utils@^4.0.0, icss-utils@^4.1.1:
dependencies:
postcss "^7.0.14"
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
ieee754@^1.1.4:
version "1.1.13"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
@@ -4652,7 +4748,12 @@ ignore@^5.1.4, ignore@^5.1.8:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
-immer@^7.0.3, immer@^7.0.9:
+immer@^7.0.14:
+ version "7.0.14"
+ resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.14.tgz#3e605f8584b15a9520d2f2f3fda9441cc9170d25"
+ integrity sha512-BxCs6pJwhgSEUEOZjywW7OA8DXVzfHjkBelSEl0A+nEu0+zS4cFVdNOONvt55N4WOm8Pu4xqSPYxhm1Lv2iBBA==
+
+immer@^7.0.3:
version "7.0.9"
resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.9.tgz#28e7552c21d39dd76feccd2b800b7bc86ee4a62e"
integrity sha512-Vs/gxoM4DqNAYR7pugIxi0Xc8XAun/uy7AQu4fLLqaTBHxjOP9pJ266Q9MWA/ly4z6rAFZbvViOtihxUZ7O28A==
@@ -4753,6 +4854,14 @@ intl-messageformat-parser@^5.3.7:
dependencies:
"@formatjs/intl-numberformat" "^5.5.2"
+intl-messageformat-parser@^6.0.11:
+ version "6.0.11"
+ resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-6.0.11.tgz#b5769990f9eb8c015ef726cf4d782a9445544993"
+ integrity sha512-0avgk5LN8KGpH6CC8OsDAttzkTtR/6Oy50dYaUpbulnNUDrSxPFMc79IJRktN8PT+HwOzhk26vvfJHXyPdf6ZA==
+ dependencies:
+ "@formatjs/ecma402-abstract" "^1.2.6"
+ tslib "^2.0.1"
+
intl-messageformat-parser@^6.0.7:
version "6.0.7"
resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-6.0.7.tgz#de57a03466e1441b7cbfd99a02ace108745ef133"
@@ -4760,21 +4869,13 @@ intl-messageformat-parser@^6.0.7:
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
-intl-messageformat-parser@^6.0.8:
- version "6.0.8"
- resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-6.0.8.tgz#4180b280d21653df7c8c078e75e0bb7f0e3322c3"
- integrity sha512-g1nV8YVI/Nscbu3qjGGgMcq61Es7L2bI+08gcbAx3taiFMJ3oJgQhC/wYksWLsq2cvLxq5pQ5Te06CE793/iVA==
- dependencies:
- "@formatjs/ecma402-abstract" "^1.2.3"
- tslib "^2.0.1"
-
-intl-messageformat@^9.3.9:
- version "9.3.9"
- resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.3.9.tgz#41f9f139adbbb509da657133047c8c5bf4ca22a9"
- integrity sha512-SB6b68bY+RZPBhg3XTmwfX0lL3ywvOuAcS+iH6cptiHPfzOPSzP05F3ZOirARwj8pVbC9Xd4w0pMtF/sGnHurw==
+intl-messageformat@^9.3.12:
+ version "9.3.12"
+ resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.3.12.tgz#a5a3f02b7cb275ac1f5bc8127a86763c24fc1255"
+ integrity sha512-+BrnExt/3ICcMVTQoN1aTueTvCblZ94UH/hQQ4sTFaN7E59BPqTN/vBF5W446JFWuYY0cGjuielBbjSsye+13w==
dependencies:
fast-memoize "^2.5.2"
- intl-messageformat-parser "^6.0.8"
+ intl-messageformat-parser "^6.0.11"
tslib "^2.0.1"
invariant@^2.2.2, invariant@^2.2.4:
@@ -4821,6 +4922,11 @@ is-arrayish@^0.2.1:
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+is-arrayish@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+ integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
is-binary-path@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
@@ -4850,6 +4956,13 @@ is-callable@^1.1.4, is-callable@^1.2.0:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9"
integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==
+is-core-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d"
+ integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==
+ dependencies:
+ has "^1.0.3"
+
is-data-descriptor@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
@@ -5112,10 +5225,10 @@ jest-worker@^26.2.1:
merge-stream "^2.0.0"
supports-color "^7.0.0"
-jose@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/jose/-/jose-2.0.2.tgz#fb22385b80c658cc7a0cae05b7086c04c6be49f4"
- integrity sha512-yD93lsiMA1go/qxSY/vXWBodmIZJIxeB7QhFi8z1yQ3KUwKENqI9UA8VCHlQ5h3x1zWuWZjoY87ByQzkQbIrQg==
+jose@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/jose/-/jose-2.0.3.tgz#9c931ab3e13e2d16a5b9e6183e60b2fc40a8e1b8"
+ integrity sha512-L+RlDgjO0Tk+Ki6/5IXCSEnmJCV8iMFZoBuEgu2vPQJJ4zfG/k3CAqZUMKDYNRHIDyy0QidJpOvX0NgpsAqFlw==
dependencies:
"@panva/asn1.js" "^1.0.0"
@@ -5197,13 +5310,13 @@ jsonify@~0.0.0:
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
-jsx-ast-utils@^2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e"
- integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==
+"jsx-ast-utils@^2.4.1 || ^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.0.0.tgz#0f49d5093bafa4b45d3fe02147d8b40ffc6c7438"
+ integrity sha512-sPuicm6EPKYI/UnWpOatvg4pI50qaBo4dSOMGUPutmJ26ttedFKXr0It0XXPk4HKnQ/1X0st4eSS2w2jhFk9Ow==
dependencies:
array-includes "^3.1.1"
- object.assign "^4.1.0"
+ object.assign "^4.1.1"
kind-of@^2.0.1:
version "2.0.1"
@@ -5236,6 +5349,11 @@ kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
klona@^2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0"
@@ -5284,25 +5402,33 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
+line-column@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2"
+ integrity sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=
+ dependencies:
+ isarray "^1.0.0"
+ isobject "^2.0.0"
+
lines-and-columns@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
-lint-staged@^10.4.0:
- version "10.4.0"
- resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.4.0.tgz#d18628f737328e0bbbf87d183f4020930e9a984e"
- integrity sha512-uaiX4U5yERUSiIEQc329vhCTDDwUcSvKdRLsNomkYLRzijk3v8V9GWm2Nz0RMVB87VcuzLvtgy6OsjoH++QHIg==
+lint-staged@^10.5.1:
+ version "10.5.1"
+ resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.1.tgz#901e915c2360072dded0e7d752a0d9a49e079daa"
+ integrity sha512-fTkTGFtwFIJJzn/PbUO3RXyEBHIhbfYBE7+rJyLcOXabViaO/h6OslgeK6zpeUtzkDrzkgyAYDTLAwx6JzDTHw==
dependencies:
chalk "^4.1.0"
cli-truncate "^2.1.0"
- commander "^6.0.0"
+ commander "^6.2.0"
cosmiconfig "^7.0.0"
- debug "^4.1.1"
+ debug "^4.2.0"
dedent "^0.7.0"
enquirer "^2.3.6"
- execa "^4.0.3"
- listr2 "^2.6.0"
+ execa "^4.1.0"
+ listr2 "^3.2.2"
log-symbols "^4.0.0"
micromatch "^4.0.2"
normalize-path "^3.0.0"
@@ -5310,10 +5436,10 @@ lint-staged@^10.4.0:
string-argv "0.3.1"
stringify-object "^3.3.0"
-listr2@^2.6.0:
- version "2.6.2"
- resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.6.2.tgz#4912eb01e1e2dd72ec37f3895a56bf2622d6f36a"
- integrity sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA==
+listr2@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.2.2.tgz#d20feb75015e506992b55af40722ba1af168b8f1"
+ integrity sha512-AajqcZEUikF2ioph6PfH3dIuxJclhr3i3kHgTOP0xeXdWQohrvJAAmqVcV43/GI987HFY/vzT73jYXoa4esDHg==
dependencies:
chalk "^4.1.0"
cli-truncate "^2.1.0"
@@ -5321,7 +5447,7 @@ listr2@^2.6.0:
indent-string "^4.0.0"
log-update "^4.0.0"
p-map "^4.0.0"
- rxjs "^6.6.2"
+ rxjs "^6.6.3"
through "^2.3.8"
load-json-file@^4.0.0:
@@ -5530,7 +5656,7 @@ magic-string@^0.22.4:
dependencies:
vlq "^0.2.2"
-magic-string@^0.25.0, magic-string@^0.25.5, magic-string@^0.25.7:
+magic-string@^0.25.0, magic-string@^0.25.7:
version "0.25.7"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==
@@ -5591,11 +5717,12 @@ mathml-tag-names@^2.1.3:
resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
-maxmind@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/maxmind/-/maxmind-4.2.0.tgz#912e5ec4a961807d20d7fb541160aeb5ea802c1c"
- integrity sha512-TADiE11Q10IjvLtlo05tTD52xLqfCJMhE3eYJHmpYIKg668STi/fQZGH9X3FpqpIP/2WPgKFxf899awFvfMtQA==
+maxmind@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/maxmind/-/maxmind-4.3.1.tgz#b20103f19e9fc12e4d1618814380d89a00f65770"
+ integrity sha512-0CxAgwWIwQy4zF1/qCMOeUPleMTYgfnsuIsZ4Otzx6hzON4PCqivPiH6Kz7iWrC++KOGCbSB3nxkJMvDEdWt6g==
dependencies:
+ mmdb-lib "1.2.0"
tiny-lru "7.0.6"
md5.js@^1.3.4:
@@ -5743,6 +5870,16 @@ mimic-fn@^2.1.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+mimic-response@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43"
+ integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
+
+mimic-response@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
+ integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
+
min-indent@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
@@ -5774,7 +5911,7 @@ minimist-options@4.1.0, minimist-options@^4.0.2:
is-plain-obj "^1.1.0"
kind-of "^6.0.3"
-minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
+minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@@ -5862,6 +5999,11 @@ mixin-object@^2.0.1:
for-in "^0.1.3"
is-extendable "^0.1.1"
+mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
+ integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
+
mkdirp@0.5.3:
version "0.5.3"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c"
@@ -5881,6 +6023,11 @@ mkdirp@^1.0.3, mkdirp@^1.0.4:
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+mmdb-lib@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mmdb-lib/-/mmdb-lib-1.2.0.tgz#0ecd93f4942f65a2d09be0502fa9126939606727"
+ integrity sha512-3XYebkStxqCgWJjsmT9FCaE19Yi4Tvs2SBPKhUks3rJJh52oF1AKAd9kei+LTutud3a6RCZ0o2Um96Fn7o3zVA==
+
moment-timezone@^0.5.31:
version "0.5.31"
resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.31.tgz#9c40d8c5026f0c7ab46eda3d63e49c155148de05"
@@ -5925,6 +6072,11 @@ nan@^2.12.1:
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
+nanoid@^3.1.12:
+ version "3.1.16"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.16.tgz#b21f0a7d031196faf75314d7c65d36352beeef64"
+ integrity sha512-+AK8MN0WHji40lj8AEuwLOvLSbWYApQpre/aFJZD71r43wVRLrOYS4FmJOPQYon1TqB462RzrrxlfA74XRES8w==
+
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@@ -5942,6 +6094,11 @@ nanomatch@^1.2.9:
snapdragon "^0.8.1"
to-regex "^3.0.1"
+napi-build-utils@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
+ integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
+
native-url@0.3.4:
version "0.3.4"
resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.3.4.tgz#29c943172aed86c63cee62c8c04db7f5756661f8"
@@ -5978,12 +6135,12 @@ next-tick@~1.0.0:
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
-next@^9.5.4:
- version "9.5.4"
- resolved "https://registry.yarnpkg.com/next/-/next-9.5.4.tgz#3c6aa3fd38ff1711e956ea2b6833475e0262ec35"
- integrity sha512-dicsJSxiUFcRjeZ/rNMAO3HS5ttFFuRHhdAn5g7lHnWUZ3MnEX4ggBIihaoUr6qu2So9KoqUPXpS91MuSXUmBw==
+next@^10.0.0:
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/next/-/next-10.0.0.tgz#fbc82fa69f05bf82fb5c4e160151f38fb9615e99"
+ integrity sha512-hpJkikt6tqwj7DfD5Mizwc1kDsaaS73TQK6lJL+++Ht8QXIEs+KUqTZULgdMk80mDV2Zhzo9/JYMEranWwAFLA==
dependencies:
- "@ampproject/toolbox-optimizer" "2.6.0"
+ "@ampproject/toolbox-optimizer" "2.7.0-alpha.1"
"@babel/code-frame" "7.10.4"
"@babel/core" "7.7.7"
"@babel/plugin-proposal-class-properties" "7.10.4"
@@ -6001,10 +6158,11 @@ next@^9.5.4:
"@babel/preset-typescript" "7.10.4"
"@babel/runtime" "7.11.2"
"@babel/types" "7.11.5"
- "@next/env" "9.5.4"
- "@next/polyfill-module" "9.5.4"
- "@next/react-dev-overlay" "9.5.4"
- "@next/react-refresh-utils" "9.5.4"
+ "@hapi/accept" "5.0.1"
+ "@next/env" "10.0.0"
+ "@next/polyfill-module" "10.0.0"
+ "@next/react-dev-overlay" "10.0.0"
+ "@next/react-refresh-utils" "10.0.0"
ast-types "0.13.2"
babel-plugin-transform-define "2.0.0"
babel-plugin-transform-react-remove-prop-types "0.4.24"
@@ -6012,7 +6170,7 @@ next@^9.5.4:
buffer "5.6.0"
cacache "15.0.5"
caniuse-lite "^1.0.30001113"
- chokidar "2.1.8"
+ chokidar "3.4.2"
crypto-browserify "3.12.0"
css-loader "4.3.0"
cssnano-simple "1.2.0"
@@ -6025,30 +6183,39 @@ next@^9.5.4:
node-html-parser "^1.2.19"
path-browserify "1.0.1"
pnp-webpack-plugin "1.6.4"
- postcss "7.0.32"
+ postcss "8.1.1"
process "0.11.10"
prop-types "15.7.2"
react-is "16.13.1"
react-refresh "0.8.3"
- resolve-url-loader "3.1.1"
+ resolve-url-loader "3.1.2"
sass-loader "10.0.2"
schema-utils "2.7.1"
stream-browserify "3.0.0"
style-loader "1.2.1"
- styled-jsx "3.3.0"
- use-subscription "1.4.1"
+ styled-jsx "3.3.1"
+ use-subscription "1.5.0"
vm-browserify "1.1.2"
watchpack "2.0.0-beta.13"
web-vitals "0.2.4"
webpack "4.44.1"
webpack-sources "1.4.3"
+ optionalDependencies:
+ sharp "0.26.2"
nice-try@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
-node-addon-api@^3.0.0:
+node-abi@^2.7.0:
+ version "2.19.1"
+ resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.19.1.tgz#6aa32561d0a5e2fdb6810d8c25641b657a8cea85"
+ integrity sha512-HbtmIuByq44yhAzK7b9j/FelKlHYISKQn0mtvcBrU5QBkhoCMp5bu8Hv5AI34DcKfOAcJBcOEMwLlwO62FFu9A==
+ dependencies:
+ semver "^5.4.1"
+
+node-addon-api@^3.0.0, node-addon-api@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.0.2.tgz#04bc7b83fd845ba785bb6eae25bc857e1ef75681"
integrity sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==
@@ -6120,6 +6287,11 @@ node-releases@^1.1.58, node-releases@^1.1.61:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e"
integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==
+noop-logger@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
+ integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=
+
nopt@^4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
@@ -6208,7 +6380,7 @@ npm-run-path@^4.0.0:
dependencies:
path-key "^3.0.0"
-npmlog@^4.0.2:
+npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
@@ -6259,11 +6431,6 @@ object-keys@^1.0.12, object-keys@^1.1.1:
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
-object-path@0.11.4:
- version "0.11.4"
- resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949"
- integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=
-
object-visit@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
@@ -6271,7 +6438,7 @@ object-visit@^1.0.0:
dependencies:
isobject "^3.0.0"
-object.assign@^4.1.0:
+object.assign@^4.1.0, object.assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd"
integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==
@@ -6603,13 +6770,6 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0:
dependencies:
find-up "^4.0.0"
-pkg-up@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
- integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
- dependencies:
- find-up "^3.0.0"
-
platform@1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.3.tgz#646c77011899870b6a0903e75e997e8e51da7461"
@@ -6781,13 +6941,12 @@ postcss-image-set-function@^3.0.1:
postcss "^7.0.2"
postcss-values-parser "^2.0.0"
-postcss-import@^12.0.1:
- version "12.0.1"
- resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153"
- integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==
+postcss-import@^13.0.0:
+ version "13.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-13.0.0.tgz#d6960cd9e3de5464743b04dd8cd9d870662f8b8c"
+ integrity sha512-LPUbm3ytpYopwQQjqgUH4S3EM/Gb9QsaSPP/5vnoi+oKVy3/mIk2sc0Paqw7RL57GpScm9MdIMUypw2znWiBpg==
dependencies:
- postcss "^7.0.1"
- postcss-value-parser "^3.2.3"
+ postcss-value-parser "^4.0.0"
read-cache "^1.0.0"
resolve "^1.1.7"
@@ -7021,12 +7180,7 @@ postcss-syntax@^0.36.2:
resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c"
integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==
-postcss-value-parser@^3.2.3:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
- integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
-
-postcss-value-parser@^4.1.0:
+postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
@@ -7058,7 +7212,17 @@ postcss@7.0.32:
source-map "^0.6.1"
supports-color "^6.1.0"
-postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6:
+postcss@8.1.1:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.1.tgz#c3a287dd10e4f6c84cb3791052b96a5d859c9389"
+ integrity sha512-9DGLSsjooH3kSNjTZUOt2eIj2ZTW0VI2PZ/3My+8TC7KIbH2OKwUlISfDsf63EP4aiRUt3XkEWMWvyJHvJelEg==
+ dependencies:
+ colorette "^1.2.1"
+ line-column "^1.0.2"
+ nanoid "^3.1.12"
+ source-map "^0.6.1"
+
+postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6:
version "7.0.34"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.34.tgz#f2baf57c36010df7de4009940f21532c16d65c20"
integrity sha512-H/7V2VeNScX9KE83GDrDZNiGT1m2H+UTnlinIzhjlLX9hfMUn1mHNnGeX81a1c8JSBdBvqk7c2ZOG6ZPn5itGw==
@@ -7067,6 +7231,27 @@ postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.2
source-map "^0.6.1"
supports-color "^6.1.0"
+prebuild-install@^5.3.5:
+ version "5.3.6"
+ resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.6.tgz#7c225568d864c71d89d07f8796042733a3f54291"
+ integrity sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==
+ dependencies:
+ detect-libc "^1.0.3"
+ expand-template "^2.0.3"
+ github-from-package "0.0.0"
+ minimist "^1.2.3"
+ mkdirp-classic "^0.5.3"
+ napi-build-utils "^1.0.1"
+ node-abi "^2.7.0"
+ noop-logger "^0.1.1"
+ npmlog "^4.0.1"
+ pump "^3.0.0"
+ rc "^1.2.7"
+ simple-get "^3.0.3"
+ tar-fs "^2.0.0"
+ tunnel-agent "^0.6.0"
+ which-pm-runs "^1.0.0"
+
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -7135,7 +7320,15 @@ promise-inflight@^1.0.1:
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
-prop-types@15.7.2, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2:
+prompts@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7"
+ integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+prop-types@15.7.2, prop-types@^15.5.8, prop-types@^15.7.2:
version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
@@ -7251,69 +7444,68 @@ rc@^1.2.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
-react-dom@^16.13.1:
- version "16.13.1"
- resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f"
- integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==
+react-dom@^17.0.1:
+ version "17.0.1"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.1.tgz#1de2560474ec9f0e334285662ede52dbc5426fc6"
+ integrity sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
- prop-types "^15.6.2"
- scheduler "^0.19.1"
+ scheduler "^0.20.1"
react-fast-compare@^2.0.1:
version "2.0.4"
resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
-react-intl@^5.8.4:
- version "5.8.4"
- resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.8.4.tgz#aba5432fcba17f47d9d46ac9bea1881c92f4f354"
- integrity sha512-ToDeHYBpO9WBAOpnwQKihUdxB4qE1nqcGKV9Jq2upj1zspxeX3OddWaZwz8wNV5yjoYnoDY3HLWeBP4IXwbwqg==
+react-intl@^5.8.8:
+ version "5.8.8"
+ resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.8.8.tgz#8f292c96bbc764b2cb937a5e2a7f2c6bd3d08e28"
+ integrity sha512-Ib1TovHjIHI50TWMs6LSFntBIMugB2VBbrZLKijkYGNm6DaQK4Zmp74zuERfjxa3+EZr38pJGwU3cRsIraDCKw==
dependencies:
- "@formatjs/ecma402-abstract" "^1.2.3"
- "@formatjs/intl" "^1.3.4"
- "@formatjs/intl-displaynames" "^3.3.10"
- "@formatjs/intl-listformat" "^4.2.8"
- "@formatjs/intl-relativetimeformat" "^7.2.8"
+ "@formatjs/ecma402-abstract" "^1.2.6"
+ "@formatjs/intl" "^1.3.8"
+ "@formatjs/intl-displaynames" "^3.4.1"
+ "@formatjs/intl-listformat" "^4.3.1"
+ "@formatjs/intl-relativetimeformat" "^7.3.1"
"@types/hoist-non-react-statics" "^3.3.1"
fast-memoize "^2.5.2"
hoist-non-react-statics "^3.3.2"
- intl-messageformat "^9.3.9"
- intl-messageformat-parser "^6.0.8"
+ intl-messageformat "^9.3.12"
+ intl-messageformat-parser "^6.0.11"
shallow-equal "^1.2.1"
tslib "^2.0.1"
-react-is@16.13.1, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.9.0:
+react-is@16.13.1, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.1:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
-react-redux@^7.2.1:
- version "7.2.1"
- resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.1.tgz#8dedf784901014db2feca1ab633864dee68ad985"
- integrity sha512-T+VfD/bvgGTUA74iW9d2i5THrDQWbweXP0AVNI8tNd1Rk5ch1rnMiJkDD67ejw7YBKM4+REvcvqRuWJb7BLuEg==
+react-redux@^7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.2.tgz#03862e803a30b6b9ef8582dadcc810947f74b736"
+ integrity sha512-8+CQ1EvIVFkYL/vu6Olo7JFLWop1qRUeb46sGtIMDCSpgwPQq8fPLpirIB0iTqFe9XYEFPHssdX8/UwN6pAkEA==
dependencies:
- "@babel/runtime" "^7.5.5"
- hoist-non-react-statics "^3.3.0"
+ "@babel/runtime" "^7.12.1"
+ hoist-non-react-statics "^3.3.2"
loose-envify "^1.4.0"
prop-types "^15.7.2"
- react-is "^16.9.0"
+ react-is "^16.13.1"
react-refresh@0.8.3:
version "0.8.3"
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f"
integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==
-react-simple-maps@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/react-simple-maps/-/react-simple-maps-2.1.2.tgz#4c6531733b9eeb0003c10ddcd822a9414a86acab"
- integrity sha512-CuwuOomMmf/3zMtMqG9w8IKxpPUDhXHuF1p/8/8G6EMiRdYUJDysmDFGUIxD30CfkR4+9ItE0NV1pI/fZC/1cw==
+react-simple-maps@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/react-simple-maps/-/react-simple-maps-2.3.0.tgz#7fdb55120335a9b1ef5bf62e0dcb669511705f3e"
+ integrity sha512-IZVeiPSRZKwD6I/2NvXpQ2uENYGDGZp8DvZjkapcxuJ/LQHTfl+Byb+KNgY7s+iatRA2ad8LnZ3AgqcjziCCsw==
dependencies:
- d3-geo "^1.11.9"
- d3-selection "^1.4.1"
- d3-zoom "^1.8.3"
- topojson-client "^3.0.0"
+ d3-geo "^2.0.1"
+ d3-selection "^2.0.0"
+ d3-zoom "^2.0.0"
+ topojson-client "^3.1.0"
react-spring@^8.0.27:
version "8.0.27"
@@ -7331,22 +7523,28 @@ react-tooltip@^4.2.10:
prop-types "^15.7.2"
uuid "^7.0.3"
-react-window@^1.8.5:
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.5.tgz#a56b39307e79979721021f5d06a67742ecca52d1"
- integrity sha512-HeTwlNa37AFa8MDZFZOKcNEkuF2YflA0hpGPiTT9vR7OawEt+GZbfM6wqkBahD3D3pUjIabQYzsnY/BSJbgq6Q==
+react-use-measure@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/react-use-measure/-/react-use-measure-2.0.2.tgz#06b4f99b887d5dfcd7b7167a2da063d97ec8f62f"
+ integrity sha512-/+eSmQiU2ePNTwFCXX4JPrQNMvyu3sWrSDi/n5F6IMXwboB46IvtU8VHvG7Nc+egvtM7sBJKwmUx/vx6KIRDog==
+ dependencies:
+ debounce "^1.2.0"
+
+react-window@^1.8.6:
+ version "1.8.6"
+ resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.6.tgz#d011950ac643a994118632665aad0c6382e2a112"
+ integrity sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==
dependencies:
"@babel/runtime" "^7.0.0"
memoize-one ">=3.1.1 <6"
-react@^16.13.1:
- version "16.13.1"
- resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e"
- integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==
+react@^17.0.1:
+ version "17.0.1"
+ resolved "https://registry.yarnpkg.com/react/-/react-17.0.1.tgz#6e0600416bd57574e3f86d92edba3d9008726127"
+ integrity sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
- prop-types "^15.6.2"
read-babelrc-up@^1.1.0:
version "1.1.0"
@@ -7404,7 +7602,7 @@ read-pkg@^5.2.0:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
-readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0:
+readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -7482,10 +7680,10 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
-regex-parser@2.2.10:
- version "2.2.10"
- resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37"
- integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==
+regex-parser@^2.2.11:
+ version "2.2.11"
+ resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58"
+ integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==
regexp.prototype.flags@^1.3.0:
version "1.3.0"
@@ -7639,12 +7837,12 @@ resolve-from@^5.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-resolve-url-loader@3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0"
- integrity sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==
+resolve-url-loader@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz#235e2c28e22e3e432ba7a5d4e305c59a58edfc08"
+ integrity sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==
dependencies:
- adjust-sourcemap-loader "2.0.0"
+ adjust-sourcemap-loader "3.0.0"
camelcase "5.3.1"
compose-function "3.0.3"
convert-source-map "1.7.0"
@@ -7667,6 +7865,14 @@ resolve@^1.1.7, resolve@^1.10.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1
dependencies:
path-parse "^1.0.6"
+resolve@^1.18.1:
+ version "1.18.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130"
+ integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==
+ dependencies:
+ is-core-module "^2.0.0"
+ path-parse "^1.0.6"
+
restore-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
@@ -7744,10 +7950,10 @@ rollup-plugin-terser@^7.0.2:
serialize-javascript "^4.0.0"
terser "^5.0.0"
-rollup@^2.28.2:
- version "2.28.2"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.28.2.tgz#599ec4978144a82d8a8ec3d37670a8440cb04e4b"
- integrity sha512-8txbsFBFLmm9Xdt4ByTOGa9Muonmc8MfNjnGAR8U8scJlF1ZW7AgNZa7aqBXaKtlvnYP/ab++fQIq9dB9NWUbg==
+rollup@^2.33.0:
+ version "2.33.0"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.33.0.tgz#dc105b312e2817f996d0b6a192b7033f607ef08d"
+ integrity sha512-7jFrmKgQj1GOWlC8rExHaPcv2SQnWMv1BFUyH/xWS5w80h6132wBUWp/qTvQkAbnlqGvi13T6iP2kHo9Sb2HxA==
optionalDependencies:
fsevents "~2.1.2"
@@ -7768,7 +7974,7 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies:
aproba "^1.1.1"
-rxjs@^6.6.0, rxjs@^6.6.2:
+rxjs@^6.6.0, rxjs@^6.6.3:
version "6.6.3"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552"
integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==
@@ -7821,10 +8027,10 @@ scheduler@^0.18.0:
loose-envify "^1.1.0"
object-assign "^4.1.1"
-scheduler@^0.19.1:
- version "0.19.1"
- resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196"
- integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==
+scheduler@^0.20.1:
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz#da0b907e24026b01181ecbc75efdc7f27b5a000c"
+ integrity sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
@@ -7927,6 +8133,21 @@ shallow-equal@^1.2.1:
resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da"
integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==
+sharp@0.26.2:
+ version "0.26.2"
+ resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.26.2.tgz#3d5777d246ae32890afe82a783c1cbb98456a88c"
+ integrity sha512-bGBPCxRAvdK9bX5HokqEYma4j/Q5+w8Nrmb2/sfgQCLEUx/HblcpmOfp59obL3+knIKnOhyKmDb4tEOhvFlp6Q==
+ dependencies:
+ color "^3.1.2"
+ detect-libc "^1.0.3"
+ node-addon-api "^3.0.2"
+ npmlog "^4.1.2"
+ prebuild-install "^5.3.5"
+ semver "^7.3.2"
+ simple-get "^4.0.0"
+ tar-fs "^2.1.0"
+ tunnel-agent "^0.6.0"
+
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -7969,6 +8190,41 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3"
+ integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
+ dependencies:
+ decompress-response "^4.2.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+simple-get@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.0.tgz#73fa628278d21de83dadd5512d2cc1f4872bd675"
+ integrity sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==
+ dependencies:
+ decompress-response "^6.0.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+simple-swizzle@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+ integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
+ dependencies:
+ is-arrayish "^0.3.1"
+
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
@@ -8409,10 +8665,10 @@ style-search@^0.1.0:
resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"
integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=
-styled-jsx@3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.3.0.tgz#32335c1a3ecfc923ba4f9c056eeb3d4699006b09"
- integrity sha512-sh8BI5eGKyJlwL4kNXHjb27/a/GJV8wP4ElRIkRXrGW3sHKOsY9Pa1VZRNxyvf3+lisdPwizD9JDkzVO9uGwZw==
+styled-jsx@3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.3.1.tgz#d79f306c42c99cefbe8e76f35dad8100dc5c9ecc"
+ integrity sha512-RhW71t3k95E3g7Zq3lEBk+kmf+p4ZME7c5tfsYf9M5mq6CgIvFXkbvhawL2gWriXLRlMyKAYACE89Qa2JnTqUw==
dependencies:
"@babel/types" "7.8.3"
babel-plugin-syntax-jsx "6.18.0"
@@ -8594,6 +8850,27 @@ tapable@^1.0.0, tapable@^1.1.3:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
+tar-fs@^2.0.0, tar-fs@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.0.tgz#d1cdd121ab465ee0eb9ccde2d35049d3f3daf0d5"
+ integrity sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==
+ dependencies:
+ chownr "^1.1.1"
+ mkdirp-classic "^0.5.2"
+ pump "^3.0.0"
+ tar-stream "^2.0.0"
+
+tar-stream@^2.0.0:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa"
+ integrity sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==
+ dependencies:
+ bl "^4.0.3"
+ end-of-stream "^1.4.1"
+ fs-constants "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^3.1.1"
+
tar@^4.4.2:
version "4.4.13"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
@@ -8634,7 +8911,16 @@ terser-webpack-plugin@^1.4.3:
webpack-sources "^1.4.0"
worker-farm "^1.7.0"
-terser@4.8.0, terser@^4.1.2:
+terser@5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.1.0.tgz#1f4ab81c8619654fdded51f3157b001e1747281d"
+ integrity sha512-pwC1Jbzahz1ZPU87NQ8B3g5pKbhyJSiHih4gLH6WZiPU8mmS1IlGbB0A2Nuvkj/LCNsgIKctg6GkYwWCeTvXZQ==
+ dependencies:
+ commander "^2.20.0"
+ source-map "~0.6.1"
+ source-map-support "~0.5.12"
+
+terser@^4.1.2:
version "4.8.0"
resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
@@ -8760,7 +9046,7 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2"
safe-regex "^1.1.0"
-topojson-client@^3.0.0:
+topojson-client@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99"
integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==
@@ -8826,6 +9112,13 @@ tty-browserify@0.0.0:
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
@@ -9055,10 +9348,10 @@ url@^0.11.0:
punycode "1.3.2"
querystring "0.2.0"
-use-subscription@1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.4.1.tgz#edcbcc220f1adb2dd4fa0b2f61b6cc308e620069"
- integrity sha512-7+IIwDG/4JICrWHL/Q/ZPK5yozEnvRm6vHImu0LKwQlmWGKeiF7mbAenLlK/cTNXrTtXHU/SFASQHzB6+oSJMQ==
+use-subscription@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.0.tgz#0df66fdf97b9a340147ad72f76fac1db6f56d240"
+ integrity sha512-/FVRiB2I7NDjzWoNBYPt6YkkvleMm/lFtxj1hH6nX2TVrJ/5UTbovw9OE1efv2Zl0HoAYuTjM7zHd9OsABn5sg==
dependencies:
object-assign "^4.1.1"
@@ -9108,10 +9401,10 @@ uuid@^7.0.3:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b"
integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==
-uuid@^8.3.0:
- version "8.3.0"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea"
- integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==
+uuid@^8.3.1:
+ version "8.3.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31"
+ integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==
v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1:
version "2.1.1"