diff --git a/components/layout/Header.module.css b/components/layout/Header.module.css
index 63d68ab9..b7fdc62c 100644
--- a/components/layout/Header.module.css
+++ b/components/layout/Header.module.css
@@ -5,6 +5,9 @@
.title {
font-size: var(--font-size-large);
+ display: flex;
+ align-items: center;
+ line-height: 1.4;
}
.logo {
@@ -26,11 +29,12 @@
.buttons {
display: flex;
justify-content: flex-end;
+ align-items: center;
}
@media only screen and (max-width: 992px) {
.title {
- text-align: center;
+ justify-content: center;
}
.nav {
diff --git a/components/layout/Page.js b/components/layout/Page.js
index c9a928c5..28492ddf 100644
--- a/components/layout/Page.js
+++ b/components/layout/Page.js
@@ -1,6 +1,7 @@
import React from 'react';
+import classNames from 'classnames';
import styles from './Page.module.css';
-export default function Page({ children }) {
- return
{children}
;
+export default function Page({ className, children }) {
+ return
{children}
;
}
diff --git a/components/layout/PageHeader.module.css b/components/layout/PageHeader.module.css
index 74f7d1a2..263bd5b7 100644
--- a/components/layout/PageHeader.module.css
+++ b/components/layout/PageHeader.module.css
@@ -4,4 +4,5 @@
align-items: center;
align-content: center;
min-height: 80px;
+ align-self: stretch;
}
diff --git a/components/metrics/WebsiteChart.js b/components/metrics/WebsiteChart.js
index 99c03951..ea86ad3e 100644
--- a/components/metrics/WebsiteChart.js
+++ b/components/metrics/WebsiteChart.js
@@ -59,7 +59,7 @@ export default function WebsiteChart({
}
return (
- <>
+
- >
+
);
}
diff --git a/components/metrics/WebsiteChart.module.css b/components/metrics/WebsiteChart.module.css
index 29f94670..0e947aea 100644
--- a/components/metrics/WebsiteChart.module.css
+++ b/components/metrics/WebsiteChart.module.css
@@ -1,6 +1,7 @@
.container {
display: flex;
flex-direction: column;
+ align-self: stretch;
}
.title {
diff --git a/components/settings/Settings.js b/components/pages/Settings.js
similarity index 85%
rename from components/settings/Settings.js
rename to components/pages/Settings.js
index be9feb35..35d039df 100644
--- a/components/settings/Settings.js
+++ b/components/pages/Settings.js
@@ -2,9 +2,9 @@ import React, { useState } from 'react';
import { useRouter } from 'next/router';
import Page from 'components/layout/Page';
import MenuLayout from 'components/layout/MenuLayout';
-import WebsiteSettings from './WebsiteSettings';
-import AccountSettings from './AccountSettings';
-import ProfileSettings from './ProfileSettings';
+import WebsiteSettings from '../settings/WebsiteSettings';
+import AccountSettings from '../settings/AccountSettings';
+import ProfileSettings from '../settings/ProfileSettings';
import { useSelector } from 'react-redux';
import { FormattedMessage } from 'react-intl';
@@ -26,7 +26,7 @@ export default function Settings() {
{
label:
,
value: ACCOUNTS,
- hidden: !user.is_admin,
+ hidden: !user?.is_admin,
},
{
label:
,
diff --git a/components/pages/Test.module.css b/components/pages/Test.module.css
new file mode 100644
index 00000000..78977c55
--- /dev/null
+++ b/components/pages/Test.module.css
@@ -0,0 +1,5 @@
+.test {
+ border: 1px solid var(--gray200);
+ border-radius: 5px;
+ padding: 0 20px 20px 20px;
+}
diff --git a/components/pages/TestConsole.js b/components/pages/TestConsole.js
new file mode 100644
index 00000000..f6fa8a23
--- /dev/null
+++ b/components/pages/TestConsole.js
@@ -0,0 +1,94 @@
+import React, { useState } from 'react';
+import { useSelector } from 'react-redux';
+import classNames from 'classnames';
+import Head from 'next/head';
+import Link from 'next/link';
+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 WebsiteChart from '../metrics/WebsiteChart';
+import EventsChart from '../metrics/EventsChart';
+import Button from '../common/Button';
+import EmptyPlaceholder from '../common/EmptyPlaceholder';
+
+export default function TestConsole() {
+ const user = useSelector(state => state.user);
+ const [website, setWebsite] = useState();
+ const { data } = useFetch('/api/websites');
+
+ if (!data || !user?.is_admin) {
+ return null;
+ }
+
+ const options = data.map(({ name, website_id }) => ({ label: name, value: website_id }));
+ const selectedValue = options.find(({ value }) => value === website?.website_id)?.value;
+
+ function handleSelect(value) {
+ setWebsite(data.find(({ website_id }) => website_id === value));
+ }
+
+ function handleClick() {
+ window.umami('event (default)');
+ window.umami.trackView('/page-view', 'https://www.google.com');
+ window.umami.trackEvent('event (custom)', 'custom-type');
+ }
+
+ return (
+
+
+ {typeof window !== 'undefined' && website && (
+
+ )}
+
+
+ Test Console
+
+
+ {!selectedValue && }
+ {selectedValue && (
+ <>
+
+
+
+
CSS events
+
+ Send event
+
+
+
+
Javascript events
+
+ Run script
+
+
+
+
+ >
+ )}
+
+ );
+}
diff --git a/components/WebsiteDetails.js b/components/pages/WebsiteDetails.js
similarity index 87%
rename from components/WebsiteDetails.js
rename to components/pages/WebsiteDetails.js
index b38f55de..e88c731f 100644
--- a/components/WebsiteDetails.js
+++ b/components/pages/WebsiteDetails.js
@@ -9,14 +9,14 @@ import Link from 'components/common/Link';
import Loading from 'components/common/Loading';
import Arrow from 'assets/arrow-right.svg';
import styles from './WebsiteDetails.module.css';
-import PagesTable from './metrics/PagesTable';
-import ReferrersTable from './metrics/ReferrersTable';
-import BrowsersTable from './metrics/BrowsersTable';
-import OSTable from './metrics/OSTable';
-import DevicesTable from './metrics/DevicesTable';
-import CountriesTable from './metrics/CountriesTable';
-import EventsTable from './metrics/EventsTable';
-import EventsChart from './metrics/EventsChart';
+import PagesTable from '../metrics/PagesTable';
+import ReferrersTable from '../metrics/ReferrersTable';
+import BrowsersTable from '../metrics/BrowsersTable';
+import OSTable from '../metrics/OSTable';
+import DevicesTable from '../metrics/DevicesTable';
+import CountriesTable from '../metrics/CountriesTable';
+import EventsTable from '../metrics/EventsTable';
+import EventsChart from '../metrics/EventsChart';
import useFetch from 'hooks/useFetch';
import usePageQuery from 'hooks/usePageQuery';
@@ -42,16 +42,17 @@ export default function WebsiteDetails({ websiteId, token }) {
} = usePageQuery();
const BackButton = () => (
-
}
- size="small"
- >
-
-
+
+ }
+ size="small"
+ >
+
+
+
);
const menuOptions = [
diff --git a/components/WebsiteDetails.module.css b/components/pages/WebsiteDetails.module.css
similarity index 92%
rename from components/WebsiteDetails.module.css
rename to components/pages/WebsiteDetails.module.css
index 0e1065c6..750a1ac7 100644
--- a/components/WebsiteDetails.module.css
+++ b/components/pages/WebsiteDetails.module.css
@@ -16,6 +16,9 @@
}
.backButton {
+ display: flex;
+ justify-content: center;
+ align-items: center;
margin-bottom: 16px;
}
diff --git a/components/WebsiteList.js b/components/pages/WebsiteList.js
similarity index 100%
rename from components/WebsiteList.js
rename to components/pages/WebsiteList.js
diff --git a/components/WebsiteList.module.css b/components/pages/WebsiteList.module.css
similarity index 87%
rename from components/WebsiteList.module.css
rename to components/pages/WebsiteList.module.css
index 942b71b2..816c5f36 100644
--- a/components/WebsiteList.module.css
+++ b/components/pages/WebsiteList.module.css
@@ -2,6 +2,7 @@
padding-bottom: 30px;
border-bottom: 1px solid var(--gray300);
margin-bottom: 30px;
+ align-self: stretch;
}
.website:last-child {
diff --git a/components/settings/ProfileSettings.js b/components/settings/ProfileSettings.js
index e23c73ed..6fe18d19 100644
--- a/components/settings/ProfileSettings.js
+++ b/components/settings/ProfileSettings.js
@@ -10,6 +10,7 @@ import TimezoneSetting from 'components/settings/TimezoneSetting';
import Dots from 'assets/ellipsis-h.svg';
import styles from './ProfileSettings.module.css';
import DateRangeSetting from './DateRangeSetting';
+import useEscapeKey from 'hooks/useEscapeKey';
export default function ProfileSettings() {
const user = useSelector(state => state.user);
@@ -22,6 +23,10 @@ export default function ProfileSettings() {
setMessage(
);
}
+ useEscapeKey(() => {
+ setChangePassword(false);
+ });
+
return (
<>
diff --git a/hooks/useEscapeKey.js b/hooks/useEscapeKey.js
new file mode 100644
index 00000000..b8020c31
--- /dev/null
+++ b/hooks/useEscapeKey.js
@@ -0,0 +1,19 @@
+import { useEffect, useCallback } from 'react';
+
+export default function useEscapeKey(handler) {
+ const escFunction = useCallback(event => {
+ if (event.keyCode === 27) {
+ handler(event);
+ }
+ }, []);
+
+ useEffect(() => {
+ document.addEventListener('keydown', escFunction, false);
+
+ return () => {
+ document.removeEventListener('keydown', escFunction, false);
+ };
+ }, [escFunction]);
+
+ return null;
+}
diff --git a/hooks/useVersion.js b/hooks/useVersion.js
new file mode 100644
index 00000000..d8e3d699
--- /dev/null
+++ b/hooks/useVersion.js
@@ -0,0 +1,27 @@
+import { useEffect, useCallback } from 'react';
+import { useDispatch, useSelector } from 'react-redux';
+import semver from 'semver';
+import { getItem, setItem } from 'lib/web';
+import { checkVersion } from 'redux/actions/app';
+import { VERSION_CHECK } from 'lib/constants';
+
+export default function useVersion() {
+ const dispatch = useDispatch();
+ const versions = useSelector(state => state.app.versions);
+ const lastCheck = getItem(VERSION_CHECK);
+
+ const { current, latest } = versions;
+ const hasUpdate = latest && semver.gt(latest, current) && lastCheck?.version !== latest;
+
+ const updateCheck = useCallback(() => {
+ setItem(VERSION_CHECK, { version: latest, time: Date.now() });
+ }, [versions]);
+
+ useEffect(() => {
+ if (!versions.latest) {
+ dispatch(checkVersion());
+ }
+ }, [versions]);
+
+ return { ...versions, hasUpdate, updateCheck };
+}
diff --git a/lang/da-DK.json b/lang/da-DK.json
index c4940630..cd96cb3f 100644
--- a/lang/da-DK.json
+++ b/lang/da-DK.json
@@ -7,6 +7,7 @@
"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",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Få sporingskode",
"message.go-to-settings": "Gå til betjeningspanel",
"message.incorrect-username-password": "Ugyldigt brugernavn/adgangskode.",
+ "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.",
"message.page-not-found": "Side ikke fundet.",
diff --git a/lang/de-DE.json b/lang/de-DE.json
index f960d1eb..7c45d131 100644
--- a/lang/de-DE.json
+++ b/lang/de-DE.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "In die Zwischenablage kopieren",
"button.date-range": "Datumsbereich",
"button.delete": "Löschen",
+ "button.dismiss": "Dismiss",
"button.edit": "Bearbeiten",
"button.login": "Anmelden",
"button.more": "Mehr",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Erstelle Tracking Kennung",
"message.go-to-settings": "Zu den Einstellungen",
"message.incorrect-username-password": "Falsches Passwort oder Benutzername.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Keine Daten vorhanden.",
"message.no-websites-configured": "Es ist keine Webseite vorhanden.",
"message.page-not-found": "Seite nicht gefunden.",
diff --git a/lang/el-GR.json b/lang/el-GR.json
index 4b1405e5..14cd69ca 100644
--- a/lang/el-GR.json
+++ b/lang/el-GR.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Αντιγραφή στο πρόχειρο",
"button.date-range": "Εύρος ημερομηνιών",
"button.delete": "Διαγραφή",
+ "button.dismiss": "Dismiss",
"button.edit": "Επεξεργασία",
"button.login": "Είσοδος",
"button.more": "Περισσότερα",
@@ -54,6 +55,7 @@
"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.no-data-available": "Δεν υπάρχουν διαθέσιμα δεδομένα.",
"message.no-websites-configured": "Δεν έχετε ρυθμίσει κανένα ιστότοπο.",
"message.page-not-found": "Η σελίδα δεν βρέθηκε.",
diff --git a/lang/en-US.json b/lang/en-US.json
index 54ee8cad..7c513b95 100644
--- a/lang/en-US.json
+++ b/lang/en-US.json
@@ -7,6 +7,7 @@
"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",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Get tracking code",
"message.go-to-settings": "Go to settings",
"message.incorrect-username-password": "Incorrect username/password.",
+ "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.",
"message.page-not-found": "Page not found.",
diff --git a/lang/es-MX.json b/lang/es-MX.json
index ed8cf1a2..16d911ea 100644
--- a/lang/es-MX.json
+++ b/lang/es-MX.json
@@ -7,6 +7,7 @@
"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",
@@ -54,6 +55,7 @@
"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.no-data-available": "Sin información disponible.",
"message.no-websites-configured": "No tienes ningún sitio configurado.",
"message.page-not-found": "Page not found",
diff --git a/lang/fo-FO.json b/lang/fo-FO.json
index 800f91c7..db9e972b 100644
--- a/lang/fo-FO.json
+++ b/lang/fo-FO.json
@@ -7,6 +7,7 @@
"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",
@@ -54,6 +55,7 @@
"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.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.",
diff --git a/lang/fr-FR.json b/lang/fr-FR.json
index 8cfedb33..762cae34 100644
--- a/lang/fr-FR.json
+++ b/lang/fr-FR.json
@@ -7,6 +7,7 @@
"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",
@@ -54,6 +55,7 @@
"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.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.",
diff --git a/lang/ja-JP.json b/lang/ja-JP.json
index b15e0c92..51cdaec1 100644
--- a/lang/ja-JP.json
+++ b/lang/ja-JP.json
@@ -5,8 +5,9 @@
"button.cancel": "キャンセル",
"button.change-password": "パスワード変更",
"button.copy-to-clipboard": "クリップボードにコピー",
- "button.date-range": "期間",
+ "button.date-range": "日付範囲",
"button.delete": "削除",
+ "button.dismiss": "無視する",
"button.edit": "編集",
"button.login": "ログイン",
"button.more": "さらに表示",
@@ -14,7 +15,7 @@
"button.reset": "リセット",
"button.save": "保存",
"button.single-day": "一日のみ",
- "button.view-details": "詳細表示",
+ "button.view-details": "詳細を見る",
"label.accounts": "アカウント",
"label.administrator": "管理者",
"label.confirm-password": "パスワード(確認)",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "トラッキングコードを取得",
"message.go-to-settings": "設定する",
"message.incorrect-username-password": "ユーザー名/パスワードが正しくありません。",
+ "message.new-version-available": "新しいバージョン({version})が利用可能です!",
"message.no-data-available": "データがありません。",
"message.no-websites-configured": "Webサイトが設定されていません。",
"message.page-not-found": "ページが見つかりません。",
diff --git a/lang/mn-MN.json b/lang/mn-MN.json
index 377c81b1..b3c033cd 100644
--- a/lang/mn-MN.json
+++ b/lang/mn-MN.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Хуулах",
"button.date-range": "Хугацааны мужид",
"button.delete": "Устгах",
+ "button.dismiss": "Dismiss",
"button.edit": "Засах",
"button.login": "Нэвтрэх",
"button.more": "Цааш",
@@ -54,6 +55,7 @@
"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.no-data-available": "Өгөгдөл алга.",
"message.no-websites-configured": "Та ямар нэгэн веб тохируулаагүй байна.",
"message.page-not-found": "Хуудас олдсонгүй.",
diff --git a/lang/nl-NL.json b/lang/nl-NL.json
index 3ebfcd14..148fd32e 100644
--- a/lang/nl-NL.json
+++ b/lang/nl-NL.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Kopiëer naar klembord",
"button.date-range": "Datumbereik",
"button.delete": "Verwijderen",
+ "button.dismiss": "Dismiss",
"button.edit": "Bewerken",
"button.login": "Inloggen",
"button.more": "Toon meer",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Tracking code",
"message.go-to-settings": "Naar instellingen",
"message.incorrect-username-password": "Incorrecte gebruikersnaam/wachtwoord.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Geen gegevens beschikbaar.",
"message.no-websites-configured": "Je hebt geen websites ingesteld.",
"message.page-not-found": "Pagina niet gevonden.",
diff --git a/lang/ru-RU.json b/lang/ru-RU.json
index b9e19336..62a70a7c 100644
--- a/lang/ru-RU.json
+++ b/lang/ru-RU.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Скопировать в буфер обмена",
"button.date-range": "Диапазон дат",
"button.delete": "Удалить",
+ "button.dismiss": "Dismiss",
"button.edit": "Редактировать",
"button.login": "Войти",
"button.more": "Больше",
@@ -54,6 +55,7 @@
"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.no-data-available": "Нет данных.",
"message.no-websites-configured": "У вас нет настроенных сайтов.",
"message.page-not-found": "Страница не найдена.",
diff --git a/lang/sv-SE.json b/lang/sv-SE.json
index 1a14b60d..9e5e5958 100644
--- a/lang/sv-SE.json
+++ b/lang/sv-SE.json
@@ -7,6 +7,7 @@
"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",
@@ -54,6 +55,7 @@
"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.no-data-available": "Ingen data tillgänglig.",
"message.no-websites-configured": "Du har inga webbsajter.",
"message.page-not-found": "Sidan kan inte hittas.",
diff --git a/lang/tr-TR.json b/lang/tr-TR.json
index d8748359..2e84051d 100644
--- a/lang/tr-TR.json
+++ b/lang/tr-TR.json
@@ -7,6 +7,7 @@
"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",
@@ -54,6 +55,7 @@
"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.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ı.",
@@ -92,4 +94,4 @@
"title.edit-website": "Web sitesini düzenle",
"title.share-url": "Paylaşım adresi",
"title.tracking-code": "İzleme kodu"
-}
\ No newline at end of file
+}
diff --git a/lang/zh-CN.json b/lang/zh-CN.json
index a51a42be..d5bf54cd 100644
--- a/lang/zh-CN.json
+++ b/lang/zh-CN.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "复制",
"button.date-range": "多日",
"button.delete": "删除",
+ "button.dismiss": "Dismiss",
"button.edit": "编辑",
"button.login": "登录",
"button.more": "更多",
@@ -54,6 +55,7 @@
"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.no-data-available": "无可用数据.",
"message.no-websites-configured": "你还没有设置任何网站.",
"message.page-not-found": "网页未找到.",
diff --git a/lib/constants.js b/lib/constants.js
index 8acbf0b6..b16abdc5 100644
--- a/lib/constants.js
+++ b/lib/constants.js
@@ -3,6 +3,7 @@ export const LOCALE_CONFIG = 'umami.locale';
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 THEME_COLORS = {
light: {
diff --git a/lib/queries.js b/lib/queries.js
index af2b7f5b..d10777fd 100644
--- a/lib/queries.js
+++ b/lib/queries.js
@@ -16,9 +16,13 @@ export function getDatabase() {
}
export async function runQuery(query) {
- return query.catch(e => {
- throw e;
- });
+ return query
+ .catch(e => {
+ throw e;
+ })
+ .finally(async () => {
+ await prisma.$disconnect();
+ });
}
export async function rawQuery(query, params) {
@@ -285,8 +289,9 @@ export async function createAccount(data) {
);
}
-export function getMetrics(website_id, start_at, end_at, url) {
+export function getMetrics(website_id, start_at, end_at, filters = {}) {
const params = [website_id, start_at, end_at];
+ const { url } = filters;
let urlFilter = '';
if (url) {
@@ -348,8 +353,10 @@ export function getPageviews(
);
}
-export function getSessionMetrics(website_id, start_at, end_at, field, url) {
+export function getSessionMetrics(website_id, start_at, end_at, field, filters = {}) {
const params = [website_id, start_at, end_at];
+ const { url } = filters;
+
let urlFilter = '';
if (url) {
@@ -375,13 +382,15 @@ export function getSessionMetrics(website_id, start_at, end_at, field, url) {
);
}
-export function getPageviewMetrics(website_id, start_at, end_at, field, table, domain, url) {
+export function getPageviewMetrics(website_id, start_at, end_at, field, table, filters = {}) {
const params = [website_id, start_at, end_at];
+ const { domain, url } = filters;
+
let domainFilter = '';
let urlFilter = '';
if (domain) {
- domainFilter = `and referrer not like $${params.length + 1}`;
+ domainFilter = `and referrer not like $${params.length + 1} and referrer not like '/%'`;
params.push(`%${domain}%`);
}
@@ -420,8 +429,17 @@ export function getActiveVisitors(website_id) {
);
}
-export function getEvents(website_id, start_at, end_at, timezone = 'utc', unit = 'day', url) {
+export function getEvents(
+ website_id,
+ start_at,
+ end_at,
+ timezone = 'utc',
+ unit = 'day',
+ filters = {},
+) {
const params = [website_id, start_at, end_at];
+ const { url } = filters;
+
let urlFilter = '';
if (url) {
diff --git a/lib/request.js b/lib/request.js
index 35658ce5..b30a710d 100644
--- a/lib/request.js
+++ b/lib/request.js
@@ -1,8 +1,9 @@
+import path from 'path';
import requestIp from 'request-ip';
import { browserName, detectOS } from 'detect-browser';
import isLocalhost from 'is-localhost-ip';
import maxmind from 'maxmind';
-import geolite2 from 'geolite2-redist';
+
import {
DESKTOP_OS,
MOBILE_OS,
@@ -60,15 +61,11 @@ export async function getCountry(req, ip) {
}
// Database lookup
- const lookup = await geolite2.open('GeoLite2-Country', path => {
- return maxmind.open(path);
- });
+ const lookup = await maxmind.open(path.resolve('./public/geo/GeoLite2-Country.mmdb'));
const result = lookup.get(ip);
- lookup.close();
-
- return result.country.iso_code;
+ return result?.country?.iso_code;
}
export async function getClientInfo(req, { screen }) {
diff --git a/lib/url.js b/lib/url.js
index 49acedf7..500736f9 100644
--- a/lib/url.js
+++ b/lib/url.js
@@ -14,7 +14,7 @@ export function getDomainName(str) {
}
}
-export function getQueryString(params) {
+export function getQueryString(params = {}) {
const map = Object.keys(params).reduce((arr, key) => {
if (params[key] !== undefined) {
return arr.concat(`${key}=${encodeURIComponent(params[key])}`);
diff --git a/next.config.js b/next.config.js
index 2db69754..0033789b 100644
--- a/next.config.js
+++ b/next.config.js
@@ -4,6 +4,9 @@ module.exports = {
env: {
VERSION: pkg.version,
},
+ serverRuntimeConfig: {
+ PROJECT_ROOT: __dirname,
+ },
webpack(config) {
config.module.rules.push({
test: /\.svg$/,
diff --git a/package.json b/package.json
index ed4e470d..68a31c0b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "umami",
- "version": "0.55.0",
+ "version": "0.62.0",
"description": "A simple, fast, website analytics alternative to Google Analytics. ",
"author": "Mike Cao ",
"license": "MIT",
@@ -11,19 +11,20 @@
},
"scripts": {
"dev": "next dev",
- "build": "npm-run-all build-tracker build-lang build-db build-app",
+ "build": "npm-run-all build-tracker build-lang build-geo build-db build-app",
"start": "next start",
"build-app": "next build",
"build-tracker": "rollup -c rollup.tracker.config.js",
"build-db": "npm-run-all copy-db-schema build-db-client",
"build-lang": "npm-run-all format-lang compile-lang",
- "copy-db-schema": "node scripts/copy-db-schema.js",
+ "build-geo": "node scripts/build-geo.js",
"build-db-schema": "dotenv prisma introspect",
"build-db-client": "dotenv prisma generate",
"build-mysql-schema": "dotenv prisma introspect -- --schema=./prisma/schema.mysql.prisma",
"build-mysql-client": "dotenv prisma generate -- --schema=./prisma/schema.mysql.prisma",
"build-postgresql-schema": "dotenv prisma introspect -- --schema=./prisma/schema.postgresql.prisma",
"build-postgresql-client": "dotenv prisma generate -- --schema=./prisma/schema.postgresql.prisma",
+ "copy-db-schema": "node scripts/copy-db-schema.js",
"generate-lang": "npm-run-all extract-lang merge-lang",
"extract-lang": "formatjs extract {pages,components}/**/*.js --out-file build/messages.json",
"merge-lang": "node scripts/merge-lang.js",
@@ -49,7 +50,7 @@
}
},
"dependencies": {
- "@prisma/client": "2.7.1",
+ "@prisma/client": "2.8.0",
"@reduxjs/toolkit": "^1.4.0",
"bcrypt": "^5.0.0",
"chalk": "^4.1.0",
@@ -60,19 +61,17 @@
"date-fns": "^2.16.1",
"date-fns-tz": "^1.0.10",
"detect-browser": "^5.1.1",
- "dotenv": "^8.2.0",
- "formik": "^2.1.5",
- "geolite2-redist": "^1.0.7",
+ "formik": "^2.1.6",
"immer": "^7.0.9",
"is-localhost-ip": "^1.4.0",
"isbot-fast": "^1.2.0",
"jose": "^2.0.2",
- "maxmind": "^4.1.4",
+ "maxmind": "^4.2.0",
"moment-timezone": "^0.5.31",
"next": "^9.5.3",
"react": "^16.13.1",
"react-dom": "^16.13.1",
- "react-intl": "^5.8.2",
+ "react-intl": "^5.8.3",
"react-redux": "^7.2.1",
"react-simple-maps": "^2.1.2",
"react-spring": "^8.0.27",
@@ -81,25 +80,27 @@
"redux": "^4.0.5",
"redux-thunk": "^2.3.0",
"request-ip": "^2.1.3",
+ "semver": "^7.3.2",
"thenby": "^1.3.4",
"timezone-support": "^2.0.2",
- "tinycolor2": "^1.4.1",
+ "tinycolor2": "^1.4.2",
"uuid": "^8.3.0"
},
"devDependencies": {
- "@formatjs/cli": "^2.11.3",
- "@prisma/cli": "2.7.1",
+ "@formatjs/cli": "^2.12.0",
+ "@prisma/cli": "2.8.0",
"@rollup/plugin-buble": "^0.21.3",
"@rollup/plugin-node-resolve": "^9.0.0",
"@rollup/plugin-replace": "^2.3.3",
"@svgr/webpack": "^5.4.0",
"cross-env": "^7.0.2",
- "del": "^5.1.0",
+ "del": "^6.0.0",
+ "dotenv": "^8.2.0",
"dotenv-cli": "^4.0.0",
- "eslint": "^7.9.0",
- "eslint-config-prettier": "^6.11.0",
+ "eslint": "^7.10.0",
+ "eslint-config-prettier": "^6.12.0",
"eslint-plugin-prettier": "^3.1.3",
- "eslint-plugin-react": "^7.20.6",
+ "eslint-plugin-react": "^7.21.2",
"eslint-plugin-react-hooks": "^4.1.2",
"extract-react-intl-messages": "^4.1.1",
"husky": "^4.3.0",
@@ -110,12 +111,13 @@
"postcss-preset-env": "^6.7.0",
"prettier": "^2.1.2",
"prettier-eslint": "^11.0.0",
- "rollup": "^2.28.1",
+ "rollup": "^2.28.2",
"rollup-plugin-hashbang": "^2.2.2",
"rollup-plugin-terser": "^7.0.2",
- "stylelint": "^13.7.1",
+ "stylelint": "^13.7.2",
"stylelint-config-css-modules": "^2.2.0",
"stylelint-config-prettier": "^8.0.1",
- "stylelint-config-recommended": "^3.0.0"
+ "stylelint-config-recommended": "^3.0.0",
+ "tar": "^6.0.5"
}
}
diff --git a/pages/api/website/[id]/events.js b/pages/api/website/[id]/events.js
index da610f17..0498052f 100644
--- a/pages/api/website/[id]/events.js
+++ b/pages/api/website/[id]/events.js
@@ -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 getEvents(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 f7178bf4..91a0f4cf 100644
--- a/pages/api/website/[id]/metrics.js
+++ b/pages/api/website/[id]/metrics.js
@@ -14,7 +14,7 @@ export default async (req, res) => {
const startDate = new Date(+start_at);
const endDate = new Date(+end_at);
- const metrics = await getMetrics(websiteId, startDate, endDate, url);
+ const metrics = await getMetrics(websiteId, startDate, endDate, { url });
const stats = Object.keys(metrics[0]).reduce((obj, key) => {
obj[key] = Number(metrics[0][key]) || 0;
diff --git a/pages/api/website/[id]/rankings.js b/pages/api/website/[id]/rankings.js
index 3def9d3a..17aa6daa 100644
--- a/pages/api/website/[id]/rankings.js
+++ b/pages/api/website/[id]/rankings.js
@@ -42,7 +42,7 @@ export default async (req, res) => {
const endDate = new Date(+end_at);
if (sessionColumns.includes(type)) {
- const data = await getSessionMetrics(websiteId, startDate, endDate, type, url);
+ const data = await getSessionMetrics(websiteId, startDate, endDate, type, { url });
return ok(res, data);
}
@@ -54,8 +54,10 @@ export default async (req, res) => {
endDate,
getColumn(type),
getTable(type),
- domain,
- type !== 'url' ? url : undefined,
+ {
+ domain,
+ url: type !== 'url' && url,
+ },
);
return ok(res, data);
diff --git a/pages/dashboard/[[...id]].js b/pages/dashboard/[[...id]].js
index 90f08492..d3ce1301 100644
--- a/pages/dashboard/[[...id]].js
+++ b/pages/dashboard/[[...id]].js
@@ -1,7 +1,7 @@
import React from 'react';
import { useRouter } from 'next/router';
import Layout from 'components/layout/Layout';
-import WebsiteList from 'components/WebsiteList';
+import WebsiteList from 'components/pages/WebsiteList';
import useRequireLogin from 'hooks/useRequireLogin';
export default function DashboardPage() {
diff --git a/pages/settings/index.js b/pages/settings/index.js
index 65eff46e..b4bb2248 100644
--- a/pages/settings/index.js
+++ b/pages/settings/index.js
@@ -1,6 +1,6 @@
import React from 'react';
import Layout from 'components/layout/Layout';
-import Settings from 'components/settings/Settings';
+import Settings from 'components/pages/Settings';
import useRequireLogin from 'hooks/useRequireLogin';
export default function SettingsPage() {
diff --git a/pages/share/[...id].js b/pages/share/[...id].js
index c4fa9a63..85455af4 100644
--- a/pages/share/[...id].js
+++ b/pages/share/[...id].js
@@ -1,7 +1,7 @@
import React from 'react';
import { useRouter } from 'next/router';
import Layout from 'components/layout/Layout';
-import WebsiteDetails from 'components/WebsiteDetails';
+import WebsiteDetails from 'components/pages/WebsiteDetails';
import useFetch from 'hooks/useFetch';
export default function SharePage() {
diff --git a/pages/test.js b/pages/test.js
index 820a3187..35b88ce3 100644
--- a/pages/test.js
+++ b/pages/test.js
@@ -1,56 +1,18 @@
-import Head from 'next/head';
-import Link from 'next/link';
-import { useRouter } from 'next/router';
+import React from 'react';
import Layout from 'components/layout/Layout';
+import TestConsole from 'components/pages/TestConsole';
+import useRequireLogin from 'hooks/useRequireLogin';
-export default function Test() {
- const router = useRouter();
- const { id } = router.query;
+export default function TestPage() {
+ const { loading } = useRequireLogin();
- if (!id) {
- return No id query specified. ;
- }
-
- function handleClick() {
- window.umami('Custom event');
- window.umami.pageView('/fake', 'https://www.google.com');
- window.umami.pageEvent('pageEvent', 'custom-type');
+ if (loading) {
+ return null;
}
return (
- <>
-
- {typeof window !== 'undefined' && (
-
- )}
-
-
-
- Here you can test if your umami installation works. Open the network tab in your browser
- developer console and watch for requests to the url collect . The links below should
- trigger page views. Clicking on the button should trigger an event.
-
- Page links
-
- Page One
-
-
-
- Page Two
-
- Events
-
- Button
-
- Manual trigger
-
- Button
-
-
- >
+
+
+
);
}
diff --git a/pages/website/[...id].js b/pages/website/[...id].js
index 0add10aa..90f4f492 100644
--- a/pages/website/[...id].js
+++ b/pages/website/[...id].js
@@ -1,7 +1,7 @@
import React from 'react';
import { useRouter } from 'next/router';
import Layout from 'components/layout/Layout';
-import WebsiteDetails from 'components/WebsiteDetails';
+import WebsiteDetails from 'components/pages/WebsiteDetails';
import useRequireLogin from 'hooks/useRequireLogin';
export default function DetailsPage() {
diff --git a/redux/actions/app.js b/redux/actions/app.js
index 6bcba2f0..490bd7f1 100644
--- a/redux/actions/app.js
+++ b/redux/actions/app.js
@@ -7,6 +7,10 @@ const app = createSlice({
initialState: {
locale: getItem(LOCALE_CONFIG) || 'en-US',
theme: getItem(THEME_CONFIG) || 'light',
+ versions: {
+ current: process.env.VERSION,
+ latest: null,
+ },
},
reducers: {
setLocale(state, action) {
@@ -17,9 +21,51 @@ const app = createSlice({
state.theme = action.payload;
return state;
},
+ setVersions(state, action) {
+ state.versions = action.payload;
+ return state;
+ },
},
});
-export const { setLocale, setTheme } = app.actions;
+export const { setLocale, setTheme, setVersions } = app.actions;
export default app.reducer;
+
+export function checkVersion() {
+ return async (dispatch, getState) => {
+ const {
+ app: {
+ versions: { current },
+ },
+ } = getState();
+
+ const data = await fetch('https://api.github.com/repos/mikecao/umami/releases/latest', {
+ method: 'get',
+ headers: {
+ Accept: 'application/vnd.github.v3+json',
+ },
+ }).then(res => {
+ if (res.ok) {
+ return res.json();
+ }
+
+ return null;
+ });
+
+ if (!data) {
+ return;
+ }
+
+ const { tag_name } = data;
+
+ const latest = tag_name.startsWith('v') ? tag_name.slice(1) : tag_name;
+
+ return dispatch(
+ setVersions({
+ current,
+ latest,
+ }),
+ );
+ };
+}
diff --git a/scripts/build-geo.js b/scripts/build-geo.js
new file mode 100644
index 00000000..cc66f941
--- /dev/null
+++ b/scripts/build-geo.js
@@ -0,0 +1,49 @@
+require('dotenv').config();
+const fs = require('fs');
+const path = require('path');
+const https = require('https');
+const zlib = require('zlib');
+const tar = require('tar');
+
+let url =
+ 'https://raw.githubusercontent.com/GitSquared/node-geolite2-redist/master/redist/GeoLite2-Country.tar.gz';
+
+if (process.env.MAXMIND_LICENSE_KEY) {
+ url =
+ `https://download.maxmind.com/app/geoip_download` +
+ `?edition_id=GeoLite2-Country&license_key=${process.env.MAXMIND_LICENSE_KEY}&suffix=tar.gz`;
+}
+
+const dest = path.resolve(__dirname, '../public/geo');
+
+if (!fs.existsSync(dest)) {
+ fs.mkdirSync(dest);
+}
+
+const download = url =>
+ new Promise(resolve => {
+ https.get(url, res => {
+ resolve(res.pipe(zlib.createGunzip({})).pipe(tar.t()));
+ });
+ });
+
+download(url).then(
+ res =>
+ new Promise((resolve, reject) => {
+ res.on('entry', entry => {
+ if (entry.path.endsWith('.mmdb')) {
+ const filename = path.join(dest, path.basename(entry.path));
+ entry.pipe(fs.createWriteStream(filename));
+
+ console.log('Saved geo database:', filename);
+ }
+ });
+
+ res.on('error', e => {
+ reject(e);
+ });
+ res.on('finish', () => {
+ resolve();
+ });
+ }),
+);
diff --git a/yarn.lock b/yarn.lock
index 136b534d..00d976eb 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1064,12 +1064,12 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
-"@formatjs/cli@^2.11.3":
- version "2.11.3"
- resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-2.11.3.tgz#b06a740520aa0d5345adb2330d13447b4292840c"
- integrity sha512-7aV3B/16GkHX5Stna9GoKU2o6/At0zxW7PYATRZujf6gbSsIUMHpUZWnMNk0qaJtXeU+3HLsSquRflCaQruoJw==
+"@formatjs/cli@^2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-2.12.0.tgz#f0bb253db073903634e57e587e0395cd0d0cd681"
+ integrity sha512-F0epNBWCXjKGgej8GL1q4RLGqR38bRCPmGLb3VautkbZ74achB0cVGj2w/AdlQiJJ1mU5rEU13pRroukUBZ+GA==
dependencies:
- "@formatjs/ts-transformer" "^2.10.1"
+ "@formatjs/ts-transformer" "^2.11.0"
"@types/json-stable-stringify" "^1.0.32"
"@types/lodash" "^4.14.150"
"@types/loud-rejection" "^2.0.0"
@@ -1089,10 +1089,10 @@
resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.2.2.tgz#4810bdbd696d3805c535fd0620b7c8f45ab3164f"
integrity sha512-mLCoAPGlXCVskb/ojBO6iurGqwo6sZvAl8pRC4N25bz4LPWExAM9LsOo057zN3Br1JxUM3RZHG4YGnVt+nSRYQ==
-"@formatjs/intl-displaynames@^3.3.8":
- version "3.3.8"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-3.3.8.tgz#37a3698e135e00908c4314c1085a90d4b9381f61"
- integrity sha512-HLoiQFCkwjq1ix7xmLC9DAp0sSXBmD2JuzfHiGKrWU8RIbNcHVzbIL4NgkuXkxvnkADXsK67OtfpuQs8kMZ0qw==
+"@formatjs/intl-displaynames@^3.3.9":
+ version "3.3.9"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-3.3.9.tgz#18eeb39aa05d4a8b064e520725f9178d0c3f8c50"
+ integrity sha512-6Ez9Ab9p9bsxCM4OlqsT+R0rmrj5lr6xjIXiCTs/pSDFeiNPQabWDHcBpiGlMRE3zifOwUOFSoi5AGGYMFgetw==
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
@@ -1117,20 +1117,28 @@
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
-"@formatjs/intl@^1.3.2":
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.3.2.tgz#95240177ef9a66614ae28193d346c1d65036cefd"
- integrity sha512-Z5z9BwUU9M/a46VUhKfKYnEAE+5/2NkISAstwxgtMJmh/tDHYkPF1A4F4bD+YVNusvLXeot1NDH9bQ072XaMsQ==
+"@formatjs/intl@^1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.3.3.tgz#d59997b7ef832e7c47e8ca50861ff7ff7461d56c"
+ integrity sha512-gFuCIZEH6o1O2ZF8YlhHJEApRrBarQ7iyqxFp4ujllr/tcjgSxfzF+LSBCPyJ1OQIU98ynOc0XKdrAR2wUd3ow==
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
- "@formatjs/intl-displaynames" "^3.3.8"
+ "@formatjs/intl-displaynames" "^3.3.9"
"@formatjs/intl-listformat" "^4.2.7"
"@formatjs/intl-relativetimeformat" "^7.2.7"
fast-memoize "^2.5.2"
intl-messageformat "^9.3.8"
intl-messageformat-parser "^6.0.7"
-"@formatjs/ts-transformer@^2.10.1", "@formatjs/ts-transformer@^2.6.0":
+"@formatjs/ts-transformer@^2.11.0":
+ version "2.11.0"
+ resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-2.11.0.tgz#90c4b5afae55fd8b8c7ab6aa08ca94a123eb94b9"
+ integrity sha512-d0++zpEeeCtE+RwbEB+TYw0WnC+jlNniIZu9NcILdgN6LEr9+TRxO+Gz4d7nj3g0D5X1LyNx6P4JI+byGxHqzw==
+ dependencies:
+ intl-messageformat-parser "^6.0.7"
+ typescript "^4.0"
+
+"@formatjs/ts-transformer@^2.6.0":
version "2.10.1"
resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-2.10.1.tgz#883d77c37a6752e3491be3ffdd705beb85cfd6f8"
integrity sha512-d5zpKWnk52bgA7Xf3KteiJ4r5RnDnIGUoUXD32yFiJVZRpPyUeEcuuyBS/1mxb7UDRpFB2gDqimYlqhjeURozA==
@@ -1185,15 +1193,15 @@
resolved "https://registry.yarnpkg.com/@panva/asn1.js/-/asn1.js-1.0.0.tgz#dd55ae7b8129e02049f009408b97c61ccf9032f6"
integrity sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==
-"@prisma/cli@2.7.1":
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/@prisma/cli/-/cli-2.7.1.tgz#98f2cb434bb931341e6c6292c7bab601e5f842f8"
- integrity sha512-0uA+gWkNQ35DveVHDPltiTCTr4wcXtEhnPs463IEM+Xn8dTv9x0gtZiYHSuQM3t7uwlOxj1rurBsqSbiljynfQ==
+"@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/client@2.7.1":
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/@prisma/client/-/client-2.7.1.tgz#0a37ddff7fe80ae3a86dfa620c1141c8607be6c2"
- integrity sha512-IEWDCuvIaQTira8/jAyf+uY+AuPPUFDIXMSN4zEA/gvoJv2woq7RmkaubS+NQVgDbbyOR6F3UcXLiFTYQDzZkQ==
+"@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==
dependencies:
pkg-up "^3.1.0"
@@ -1425,14 +1433,6 @@
dependencies:
"@types/node" "*"
-"@types/glob@^7.1.1":
- version "7.1.3"
- resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183"
- integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==
- dependencies:
- "@types/minimatch" "*"
- "@types/node" "*"
-
"@types/hoist-non-react-statics@^3.3.1":
version "3.3.1"
resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
@@ -1463,11 +1463,6 @@
dependencies:
loud-rejection "*"
-"@types/minimatch@*":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
- integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
-
"@types/minimist@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6"
@@ -3280,18 +3275,18 @@ define-property@^2.0.2:
is-descriptor "^1.0.2"
isobject "^3.0.1"
-del@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7"
- integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==
+del@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952"
+ integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==
dependencies:
- globby "^10.0.1"
- graceful-fs "^4.2.2"
+ globby "^11.0.1"
+ graceful-fs "^4.2.4"
is-glob "^4.0.1"
is-path-cwd "^2.2.0"
- is-path-inside "^3.0.1"
- p-map "^3.0.0"
- rimraf "^3.0.0"
+ is-path-inside "^3.0.2"
+ p-map "^4.0.0"
+ rimraf "^3.0.2"
slash "^3.0.0"
delegates@^1.0.0:
@@ -3633,10 +3628,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.11.0:
- version "6.11.0"
- resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1"
- integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==
+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==
dependencies:
get-stdin "^6.0.0"
@@ -3652,10 +3647,10 @@ eslint-plugin-react-hooks@^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@^7.20.6:
- version "7.20.6"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.6.tgz#4d7845311a93c463493ccfa0a19c9c5d0fd69f60"
- integrity sha512-kidMTE5HAEBSLu23CUDvj8dc3LdBU0ri1scwHBZjI41oDv4tjsWZKU7MQccFzH1QYPYhsnTF2ovh7JlcIcmxgg==
+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==
dependencies:
array-includes "^3.1.1"
array.prototype.flatmap "^1.2.3"
@@ -3677,7 +3672,7 @@ eslint-scope@^4.0.3:
esrecurse "^4.1.0"
estraverse "^4.1.1"
-eslint-scope@^5.0.0, eslint-scope@^5.1.0:
+eslint-scope@^5.0.0, eslint-scope@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -3747,10 +3742,10 @@ eslint@^6.8.0:
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
-eslint@^7.9.0:
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.9.0.tgz#522aeccc5c3a19017cf0cb46ebfd660a79acf337"
- integrity sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA==
+eslint@^7.10.0:
+ version "7.10.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.10.0.tgz#494edb3e4750fb791133ca379e786a8f648c72b9"
+ integrity sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA==
dependencies:
"@babel/code-frame" "^7.0.0"
"@eslint/eslintrc" "^0.1.3"
@@ -3760,7 +3755,7 @@ eslint@^7.9.0:
debug "^4.0.1"
doctrine "^3.0.0"
enquirer "^2.3.5"
- eslint-scope "^5.1.0"
+ eslint-scope "^5.1.1"
eslint-utils "^2.1.0"
eslint-visitor-keys "^1.3.0"
espree "^7.3.0"
@@ -3981,7 +3976,7 @@ fast-diff@^1.1.2:
resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
-fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.4:
+fast-glob@^3.1.1, fast-glob@^3.2.4:
version "3.2.4"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3"
integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==
@@ -4150,10 +4145,10 @@ for-own@^0.1.3:
dependencies:
for-in "^1.0.1"
-formik@^2.1.5:
- version "2.1.5"
- resolved "https://registry.yarnpkg.com/formik/-/formik-2.1.5.tgz#de5bbbe35543fa6d049fe96b8ee329d6cd6892b8"
- integrity sha512-bWpo3PiqVDYslvrRjTq0Isrm0mFXHiO33D8MS6t6dWcqSFGeYF52nlpCM2xwOJ6tRVRznDkL+zz/iHPL4LDuvQ==
+formik@^2.1.6:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/formik/-/formik-2.1.6.tgz#f723bfccb2c7abec886aa6a4930b360d20f1a0b3"
+ integrity sha512-m9DcxlZw/58p4xuhH3dzUzQWaC4dig0RKX7yNQOJt4VRhXn7p+YRrs3o17r3YwzvOLua3zC53VMbfupLsDwO5w==
dependencies:
deepmerge "^2.1.1"
hoist-non-react-statics "^3.3.0"
@@ -4260,14 +4255,6 @@ gensync@^1.0.0-beta.1:
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
-geolite2-redist@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/geolite2-redist/-/geolite2-redist-1.0.7.tgz#98ecd0260115a7c90bc0d49fa96e04f8ab56cddb"
- integrity sha512-NrsPDYUU7OVTtZzj5McnBI7b2n8teS+zgX3IXSd3qxF9M2OaDA4SeF1loWzDyzkQzPFr8JHEYYIBTD0sQGQ7ug==
- dependencies:
- rimraf "^3.0.2"
- tar "^6.0.2"
-
get-own-enumerable-property-symbols@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664"
@@ -4355,20 +4342,6 @@ globals@^12.1.0:
dependencies:
type-fest "^0.8.1"
-globby@^10.0.1:
- version "10.0.2"
- resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543"
- integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==
- dependencies:
- "@types/glob" "^7.1.1"
- array-union "^2.1.0"
- dir-glob "^3.0.1"
- fast-glob "^3.0.3"
- glob "^7.1.3"
- ignore "^5.1.1"
- merge2 "^1.2.3"
- slash "^3.0.0"
-
globby@^11.0.1:
version "11.0.1"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357"
@@ -4393,7 +4366,7 @@ gonzales-pe@^4.3.0:
dependencies:
minimist "^1.2.5"
-graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2:
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4:
version "4.2.4"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
@@ -4608,7 +4581,7 @@ ignore@^4.0.6:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8:
+ignore@^5.1.4, ignore@^5.1.8:
version "5.1.8"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
@@ -4934,7 +4907,7 @@ is-path-cwd@^2.2.0:
resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb"
integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
-is-path-inside@^3.0.1:
+is-path-inside@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==
@@ -5520,10 +5493,10 @@ 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.1.4:
- version "4.1.4"
- resolved "https://registry.yarnpkg.com/maxmind/-/maxmind-4.1.4.tgz#14fa0cf9a88f15b708edfd1378c5e49e0f0105c1"
- integrity sha512-DfcZPpc0XJVF1yypRpVqMs9JiSYYShVkfexSjwTbfqZMCEoQlCU83ooX9cRmWMUaLqm4zffi7HtZg7XqcJaL1A==
+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==
dependencies:
tiny-lru "7.0.6"
@@ -5627,7 +5600,7 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-merge2@^1.2.3, merge2@^1.3.0:
+merge2@^1.3.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
@@ -7192,14 +7165,14 @@ react-fast-compare@^2.0.1:
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.2:
- version "5.8.2"
- resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.8.2.tgz#6be0f31a6438bf12989f7c8f7f4b5610f36e862f"
- integrity sha512-WiZqh4xTSmc+HlCzJ1b0imIPr7OFx0g7kl6RGAazb7WCtUNhsdX5jBmwk5CplwVPXiBCdytuKmyfX4XTrrvA9A==
+react-intl@^5.8.3:
+ version "5.8.3"
+ resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.8.3.tgz#2018aca11a49d2d1b0f602e0dda653a47bf59dfb"
+ integrity sha512-ueM7JhbBIi+6FpH6jCrJuKcYpjmFn9UAHA28ojY8LMAL1PowZ/53XGGMvfj32J0/2EIuHQ6vUbi/07kJqe1ksQ==
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
- "@formatjs/intl" "^1.3.2"
- "@formatjs/intl-displaynames" "^3.3.8"
+ "@formatjs/intl" "^1.3.3"
+ "@formatjs/intl-displaynames" "^3.3.9"
"@formatjs/intl-listformat" "^4.2.7"
"@formatjs/intl-relativetimeformat" "^7.2.7"
"@types/hoist-non-react-statics" "^3.3.1"
@@ -7637,7 +7610,7 @@ rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3, rimraf@^2.7.1:
dependencies:
glob "^7.1.3"
-rimraf@^3.0.0, rimraf@^3.0.2:
+rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
@@ -7669,10 +7642,10 @@ rollup-plugin-terser@^7.0.2:
serialize-javascript "^4.0.0"
terser "^5.0.0"
-rollup@^2.28.1:
- version "2.28.1"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.28.1.tgz#ceedca3cdb013c2fa8f22f958a29c203368159ea"
- integrity sha512-DOtVoqOZt3+FjPJWLU8hDIvBjUylc9s6IZvy76XklxzcLvAQLtVAG/bbhsMhcWnYxC0TKKcf1QQ/tg29zeID0Q==
+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==
optionalDependencies:
fsevents "~2.1.2"
@@ -8374,10 +8347,10 @@ stylelint-config-recommended@^3.0.0:
resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657"
integrity sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==
-stylelint@^13.7.1:
- version "13.7.1"
- resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.7.1.tgz#bee97ee78d778a3f1dbe3f7397b76414973e263e"
- integrity sha512-qzqazcyRxrSRdmFuO0/SZOJ+LyCxYy0pwcvaOBBnl8/2VfHSMrtNIE+AnyJoyq6uKb+mt+hlgmVrvVi6G6XHfQ==
+stylelint@^13.7.2:
+ version "13.7.2"
+ resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.7.2.tgz#6f3c58eea4077680ed0ceb0d064b22b100970486"
+ integrity sha512-mmieorkfmO+ZA6CNDu1ic9qpt4tFvH2QUB7vqXgrMVHe5ENU69q7YDq0YUg/UHLuCsZOWhUAvcMcLzLDIERzSg==
dependencies:
"@stylelint/postcss-css-in-js" "^0.37.2"
"@stylelint/postcss-markdown" "^0.36.1"
@@ -8543,7 +8516,7 @@ tar@^4.4.2:
safe-buffer "^5.1.2"
yallist "^3.0.3"
-tar@^6.0.2:
+tar@^6.0.5:
version "6.0.5"
resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f"
integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==
@@ -8635,10 +8608,10 @@ tiny-warning@^1.0.2:
resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
-tinycolor2@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"
- integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=
+tinycolor2@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"
+ integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==
tmp@^0.0.33:
version "0.0.33"