From 29d0db805d82e7d01239aead2cb87e75fddf30be Mon Sep 17 00:00:00 2001
From: DeeJayPee
Date: Mon, 13 Sep 2021 10:22:05 +0200
Subject: [PATCH 001/179] Add legacy octopush (Octopush-DM from 2011 to 2020
accounts) version
---
server/notification-providers/octopush.js | 64 ++++++++++++++++-------
src/components/NotificationDialog.vue | 10 ++++
2 files changed, 55 insertions(+), 19 deletions(-)
diff --git a/server/notification-providers/octopush.js b/server/notification-providers/octopush.js
index 40273f9b8..228e1b2a7 100644
--- a/server/notification-providers/octopush.js
+++ b/server/notification-providers/octopush.js
@@ -9,27 +9,53 @@ class Octopush extends NotificationProvider {
let okMsg = "Sent Successfully. ";
try {
- let config = {
- headers: {
- "api-key": notification.octopushAPIKey,
- "api-login": notification.octopushLogin,
- "cache-control": "no-cache"
- }
- };
- let data = {
- "recipients": [
- {
- "phone_number": notification.octopushPhoneNumber
+ // Default - V2
+ if (notification.octopushVersion == 2 || !notification.octopushVersion)
+ {
+ let config = {
+ headers: {
+ "api-key": notification.octopushAPIKey,
+ "api-login": notification.octopushLogin,
+ "cache-control": "no-cache"
}
- ],
- //octopush not supporting non ascii char
- "text": msg.replace(/[^\x00-\x7F]/g, ""),
- "type": notification.octopushSMSType,
- "purpose": "alert",
- "sender": notification.octopushSenderName
- };
+ };
+ let data = {
+ "recipients": [
+ {
+ "phone_number": notification.octopushPhoneNumber
+ }
+ ],
+ //octopush not supporting non ascii char
+ "text": msg.replace(/[^\x00-\x7F]/g, ""),
+ "type": notification.octopushSMSType,
+ "purpose": "alert",
+ "sender": notification.octopushSenderName
+ };
+ await axios.post("https://api.octopush.com/v1/public/sms-campaign/send", data, config)
+ }
+ else if (notification.octopushVersion == 1)
+ {
+ let data = {
+ "user_login": notification.octopushDMLogin,
+ "api_key": notification.octopushDMAPIKey,
+ "sms_recipients" : notification.octopushDMPhoneNumber,
+ "sms_sender": notification.octopushDMSenderName,
+ "sms_type": (notification.octopushDMSMSType == 'sms_premium')?'FR':'XXX',
+ "transactional": '1',
+ //octopush not supporting non ascii char
+ "sms_text": msg.replace(/[^\x00-\x7F]/g, ""),
+ };
+
+ let config = {
+ headers: {
+ "cache-control": "no-cache"
+ },
+ params: data
+ };
+ await axios.post("https://www.octopush-dm.com/api/sms/json", {}, config)
+ } else
+ throw new Error('Unknown Octopush version !');
- await axios.post("https://api.octopush.com/v1/public/sms-campaign/send", data, config)
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue
index d689b0c91..107656001 100644
--- a/src/components/NotificationDialog.vue
+++ b/src/components/NotificationDialog.vue
@@ -244,6 +244,16 @@
+
+
Octopush API Version
+
+ V2
+ V1 (Legacy Octopush-DM)
+
+
+ Do you use the legacy version of Octopush (2011-2020) or the new version ?
+
+
API KEY
From 8c941b1d565b1f3ff61450f91b6e9a6e56d20543 Mon Sep 17 00:00:00 2001
From: zsxeee
Date: Tue, 21 Sep 2021 13:02:41 +0800
Subject: [PATCH 002/179] Add i18n for notification form
---
src/components/notifications/Apprise.vue | 19 ++---
src/components/notifications/Discord.vue | 11 ++-
src/components/notifications/Gotify.vue | 6 +-
src/components/notifications/Line.vue | 20 ++---
src/components/notifications/LunaSea.vue | 4 +-
src/components/notifications/Mattermost.vue | 30 +++----
src/components/notifications/Octopush.vue | 22 ++---
src/components/notifications/Pushbullet.vue | 8 +-
src/components/notifications/Pushover.vue | 24 +++---
src/components/notifications/Pushy.vue | 6 +-
src/components/notifications/RocketChat.vue | 28 +++----
src/components/notifications/SMTP.vue | 14 ++--
src/components/notifications/Signal.vue | 14 ++--
src/components/notifications/Slack.vue | 28 +++----
src/components/notifications/Teams.vue | 9 +-
src/components/notifications/Telegram.vue | 16 ++--
src/components/notifications/Webhook.vue | 9 +-
src/languages/en.js | 93 +++++++++++++++++++++
18 files changed, 228 insertions(+), 133 deletions(-)
diff --git a/src/components/notifications/Apprise.vue b/src/components/notifications/Apprise.vue
index de3fe52b3..567b1eae7 100644
--- a/src/components/notifications/Apprise.vue
+++ b/src/components/notifications/Apprise.vue
@@ -1,20 +1,19 @@
-
- Status:
- Apprise is installed
- Apprise is not installed. Read more
-
+
+ {{ $t("Apprise is installed") }}
+ {{ $t("Apprise is not installed. ") }}{{ $t("Read more") }}
+
diff --git a/src/components/notifications/Discord.vue b/src/components/notifications/Discord.vue
index c45a5262a..99389d29e 100644
--- a/src/components/notifications/Discord.vue
+++ b/src/components/notifications/Discord.vue
@@ -1,20 +1,19 @@
-
Discord Webhook URL
+
{{ $t("Discord Webhook URL") }}
- You can get this by going to Server Settings -> Integrations -> Create Webhook
+ {{ $t("wayToGetDiscordURL") }}
- Bot Display Name
+ {{ $t("Bot Display Name") }}
-
- Prefix Custom Message
-
+ {{ $t("Prefix Custom Message") }}
+
diff --git a/src/components/notifications/Gotify.vue b/src/components/notifications/Gotify.vue
index f8039d58a..9e16d4e43 100644
--- a/src/components/notifications/Gotify.vue
+++ b/src/components/notifications/Gotify.vue
@@ -1,17 +1,17 @@
- Application Token
+ {{ $t("Application Token") }}
-
Server URL
+
{{ $t("Server URL") }}
- Priority
+ {{ $t("Priority") }}
diff --git a/src/components/notifications/Line.vue b/src/components/notifications/Line.vue
index 7d5312c37..f6dbc7489 100644
--- a/src/components/notifications/Line.vue
+++ b/src/components/notifications/Line.vue
@@ -1,21 +1,21 @@
- Channel access token
+ {{ $t("Channel access token") }}
-
- Line Developers Console - Basic Settings
-
+
+ {{ $t("Basic Settings") }}
+
User ID
-
- Line Developers Console - Messaging API
-
-
- First access the
Line Developers Console , create a provider and channel (Messaging API), then you can get the channel access token and user id from the above mentioned menu items.
-
+
+ {{ $t("Messaging API") }}
+
+
+ {{ $t("Line Developers Console") }}
+
diff --git a/src/languages/en.js b/src/languages/en.js
index ca5689442..c4525aef8 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -169,6 +169,7 @@ export default {
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. Response",
// Start notification form
+ defaultNotificationName: "My {0} Alert ({1})",
here: "here",
"Required": "Required",
From 6e55c447732cd17827bfbdb8ead5bb04715893d5 Mon Sep 17 00:00:00 2001
From: zsxeee
Date: Wed, 22 Sep 2021 16:13:23 +0800
Subject: [PATCH 004/179] Chore
---
src/components/NotificationDialog.vue | 3 +--
src/components/notifications/Apprise.vue | 2 +-
src/components/notifications/Signal.vue | 2 +-
src/languages/en.js | 4 ++--
4 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue
index 2cf5eed2d..fb8ff2e0a 100644
--- a/src/components/NotificationDialog.vue
+++ b/src/components/NotificationDialog.vue
@@ -108,7 +108,6 @@ export default {
watch: {
"notification.type"(to, from) {
let oldName;
- console.log(this.$root.notificationList)
if (from) {
oldName = this.getUniqueDefaultName(from);
} else {
@@ -193,7 +192,7 @@ export default {
})
},
/**
- * @param {string} notificationKey
+ * @param {keyof NotificationFormList} notificationKey
* @return {string}
*/
getUniqueDefaultName(notificationKey) {
diff --git a/src/components/notifications/Apprise.vue b/src/components/notifications/Apprise.vue
index 567b1eae7..e0f116f03 100644
--- a/src/components/notifications/Apprise.vue
+++ b/src/components/notifications/Apprise.vue
@@ -11,7 +11,7 @@
- {{ $t("Apprise is installed") }}
+ {{ $t("Apprise is installed. ") }}
{{ $t("Apprise is not installed. ") }}{{ $t("Read more") }}
diff --git a/src/components/notifications/Signal.vue b/src/components/notifications/Signal.vue
index 212aba6a3..e3c9e7aaf 100644
--- a/src/components/notifications/Signal.vue
+++ b/src/components/notifications/Signal.vue
@@ -19,7 +19,7 @@
- {{ $t("canCheckLike") }}
+ {{ $t("wayToCheckSignalURL") }}
diff --git a/src/languages/en.js b/src/languages/en.js
index c4525aef8..c97754034 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -212,7 +212,7 @@ export default {
"Number": "Number",
"Recipients": "Recipients",
needSignalAPI: "You need to have a signal client with REST API.",
- canCheckLike: "You can check this url to view how to setup one:",
+ wayToCheckSignalURL: "You can check this url to view how to setup one:",
signalImportant: "IMPORTANT: You cannot mix groups and numbers in recipients!",
"gotify": "Gotify",
@@ -259,7 +259,7 @@ export default {
"Read more:": "Read more: {0}",
"Status:": "Status: {0}",
"Read more": "Read more",
- "Apprise is installed": "Apprise is installed",
+ "Apprise is installed. ": "Apprise is installed. ",
"Apprise is not installed. ": "Apprise is not installed. ",
"pushbullet": "Pushbullet",
From 6e9d12638c5909cdf9185401fef1bca120e7d56a Mon Sep 17 00:00:00 2001
From: zsxeee
Date: Wed, 22 Sep 2021 16:20:59 +0800
Subject: [PATCH 005/179] Avoid space ending in translation key
---
src/components/notifications/Apprise.vue | 4 ++--
src/components/notifications/Line.vue | 4 ++--
src/languages/en.js | 6 +++---
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/components/notifications/Apprise.vue b/src/components/notifications/Apprise.vue
index e0f116f03..30abfc900 100644
--- a/src/components/notifications/Apprise.vue
+++ b/src/components/notifications/Apprise.vue
@@ -11,8 +11,8 @@
diff --git a/src/components/notifications/Line.vue b/src/components/notifications/Line.vue
index f6dbc7489..0d7da26a4 100644
--- a/src/components/notifications/Line.vue
+++ b/src/components/notifications/Line.vue
@@ -3,14 +3,14 @@
{{ $t("Channel access token") }}
-
+
{{ $t("Basic Settings") }}
User ID
-
+
{{ $t("Messaging API") }}
diff --git a/src/languages/en.js b/src/languages/en.js
index c97754034..948ed437a 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -259,8 +259,8 @@ export default {
"Read more:": "Read more: {0}",
"Status:": "Status: {0}",
"Read more": "Read more",
- "Apprise is installed. ": "Apprise is installed. ",
- "Apprise is not installed. ": "Apprise is not installed. ",
+ "Apprise is installed.": "Apprise is installed. ",
+ "Apprise is not installed.": "Apprise is not installed. ",
"pushbullet": "Pushbullet",
"Access Token": "Access Token",
@@ -268,7 +268,7 @@ export default {
"line": "Line Messenger",
"Channel access token": "Channel access token",
"Line Developers Console": "Line Developers Console",
- "Line Developers Console - ": "Line Developers Console - {0}",
+ lineDevConsoleTo: "Line Developers Console - {0}",
"Basic Settings": "Basic Settings",
"User ID": "User ID",
"Messaging API": "Messaging API",
From 624f632a7a537d3b21ef0c5d55b6b108a5046df2 Mon Sep 17 00:00:00 2001
From: zsxeee
Date: Wed, 22 Sep 2021 22:15:50 +0800
Subject: [PATCH 006/179] Apprise status translation key
---
src/components/NotificationDialog.vue | 2 +-
src/components/notifications/Apprise.vue | 6 ++++--
src/languages/en.js | 4 ++--
3 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue
index fb8ff2e0a..0c2035def 100644
--- a/src/components/NotificationDialog.vue
+++ b/src/components/NotificationDialog.vue
@@ -200,7 +200,7 @@ export default {
let name = ""
do {
name = this.$t("defaultNotificationName", [
- this.$t(notificationKey).replace(/\(.+\)/, ""),
+ this.$t(notificationKey).replace(/\(.+\)/, "").trim(),
index++
]);
} while (this.$root.notificationList.find(it => it.name === name))
diff --git a/src/components/notifications/Apprise.vue b/src/components/notifications/Apprise.vue
index 30abfc900..f485405b4 100644
--- a/src/components/notifications/Apprise.vue
+++ b/src/components/notifications/Apprise.vue
@@ -11,8 +11,10 @@
diff --git a/src/languages/en.js b/src/languages/en.js
index 948ed437a..645467978 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -259,8 +259,8 @@ export default {
"Read more:": "Read more: {0}",
"Status:": "Status: {0}",
"Read more": "Read more",
- "Apprise is installed.": "Apprise is installed. ",
- "Apprise is not installed.": "Apprise is not installed. ",
+ appriseInstalled: "Apprise is installed.",
+ appriseNotInstalled: "Apprise is not installed. {0}",
"pushbullet": "Pushbullet",
"Access Token": "Access Token",
From 58aa83331e55db31f30b2d6ef595c832826478f2 Mon Sep 17 00:00:00 2001
From: Adam Stachowicz
Date: Tue, 28 Sep 2021 06:53:23 +0200
Subject: [PATCH 007/179] Fix Polish language, add missing `Status Page` i18n
---
src/i18n.js | 6 +++---
src/languages/da-DK.js | 5 +++--
src/languages/de-DE.js | 3 ++-
src/languages/en.js | 3 ++-
src/languages/es-ES.js | 3 ++-
src/languages/et-EE.js | 3 ++-
src/languages/fr-FR.js | 3 ++-
src/languages/it-IT.js | 3 ++-
src/languages/ja.js | 3 ++-
src/languages/ko-KR.js | 3 ++-
src/languages/nl-NL.js | 3 ++-
src/languages/pl.js | 7 ++++---
src/languages/pt-BR.js | 2 +-
src/languages/ru-RU.js | 2 +-
src/languages/sr-latn.js | 3 ++-
src/languages/sr.js | 3 ++-
src/languages/sv-SE.js | 3 ++-
src/languages/tr-TR.js | 3 ++-
src/languages/zh-CN.js | 3 ++-
src/languages/zh-HK.js | 3 ++-
20 files changed, 42 insertions(+), 25 deletions(-)
diff --git a/src/i18n.js b/src/i18n.js
index 633a53acb..bd1811f61 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -3,7 +3,6 @@ import daDK from "./languages/da-DK";
import deDE from "./languages/de-DE";
import en from "./languages/en";
import esEs from "./languages/es-ES";
-import ptBR from "./languages/pt-BR";
import etEE from "./languages/et-EE";
import frFR from "./languages/fr-FR";
import itIT from "./languages/it-IT";
@@ -11,11 +10,12 @@ import ja from "./languages/ja";
import koKR from "./languages/ko-KR";
import nlNL from "./languages/nl-NL";
import pl from "./languages/pl";
+import ptBR from "./languages/pt-BR";
import ruRU from "./languages/ru-RU";
import sr from "./languages/sr";
import srLatn from "./languages/sr-latn";
-import trTR from "./languages/tr-TR";
import svSE from "./languages/sv-SE";
+import trTR from "./languages/tr-TR";
import zhCN from "./languages/zh-CN";
import zhHK from "./languages/zh-HK";
@@ -45,6 +45,6 @@ export const i18n = createI18n({
locale: localStorage.locale || "en",
fallbackLocale: "en",
silentFallbackWarn: true,
- silentTranslationWarn: true,
+ silentTranslationWarn: false,
messages: languageList,
});
diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js
index e3d375ce2..b9ce20eca 100644
--- a/src/languages/da-DK.js
+++ b/src/languages/da-DK.js
@@ -143,7 +143,7 @@ export default {
"Show URI": "Vis URI",
"Clear all statistics": "Ryd alle Statistikker",
retryCheckEverySecond: "Prøv igen hvert {0} sekund.",
- importHandleDescription: "Vælg 'Spring over eksisterende', hvis du vil springe over hver overvåger eller underretning med samme navn. 'Overskriv' sletter alle eksisterende overvågere og underretninger.",
+ importHandleDescription: "Vælg 'Spring over eksisterende', hvis du vil springe over hver overvåger eller underretning med samme navn. 'Overskriv' sletter alle eksisterende overvågere og underretninger.",
confirmImportMsg: "Er du sikker på at importere sikkerhedskopien? Sørg for, at du har valgt den rigtige importindstilling.",
"Heartbeat Retry Interval": "Heartbeat Gentagelsesinterval",
"Import Backup": "Importer Backup",
@@ -170,7 +170,7 @@ export default {
"Avg. Ping": "Gns. Ping",
"Avg. Response": "Gns. Respons",
"Entry Page": "Entry Side",
- "statusPageNothing": "Intet her, tilføj venligst en Gruppe eller en Overvåger.",
+ statusPageNothing: "Intet her, tilføj venligst en Gruppe eller en Overvåger.",
"No Services": "Ingen Tjenester",
"All Systems Operational": "Alle Systemer i Drift",
"Partially Degraded Service": "Delvist Forringet Service",
@@ -179,4 +179,5 @@ export default {
"Add a monitor": "Tilføj en Overvåger",
"Edit Status Page": "Rediger Statusside",
"Go to Dashboard": "Gå til Dashboard",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index ef2f7653a..96cd8a283 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -169,7 +169,7 @@ export default {
"Avg. Ping": "Durchsch. Ping",
"Avg. Response": "Durchsch. Antwort",
"Entry Page": "Einstiegsseite",
- "statusPageNothing": "Nichts ist hier, bitte füge eine Gruppe oder Monitor hinzu.",
+ statusPageNothing: "Nichts ist hier, bitte füge eine Gruppe oder Monitor hinzu.",
"No Services": "Keine Dienste",
"All Systems Operational": "Alle Systeme Betriebsbereit",
"Partially Degraded Service": "Teilweise beeinträchtigter Dienst",
@@ -178,4 +178,5 @@ export default {
"Add a monitor": "Monitor hinzufügen",
"Edit Status Page": "Bearbeite Statusseite",
"Go to Dashboard": "Gehe zum Dashboard",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/en.js b/src/languages/en.js
index 75d8f30c3..280c29b94 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -169,7 +169,7 @@ export default {
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. Response",
"Entry Page": "Entry Page",
- "statusPageNothing": "Nothing here, please add a group or a monitor.",
+ statusPageNothing: "Nothing here, please add a group or a monitor.",
"No Services": "No Services",
"All Systems Operational": "All Systems Operational",
"Partially Degraded Service": "Partially Degraded Service",
@@ -178,4 +178,5 @@ export default {
"Add a monitor": "Add a monitor",
"Edit Status Page": "Edit Status Page",
"Go to Dashboard": "Go to Dashboard",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js
index 7571b1308..366291db9 100644
--- a/src/languages/es-ES.js
+++ b/src/languages/es-ES.js
@@ -170,7 +170,7 @@ export default {
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. Response",
"Entry Page": "Entry Page",
- "statusPageNothing": "Nothing here, please add a group or a monitor.",
+ statusPageNothing: "Nothing here, please add a group or a monitor.",
"No Services": "No Services",
"All Systems Operational": "All Systems Operational",
"Partially Degraded Service": "Partially Degraded Service",
@@ -179,4 +179,5 @@ export default {
"Add a monitor": "Add a monitor",
"Edit Status Page": "Edit Status Page",
"Go to Dashboard": "Go to Dashboard",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/et-EE.js b/src/languages/et-EE.js
index b7d9722c3..fe637de5d 100644
--- a/src/languages/et-EE.js
+++ b/src/languages/et-EE.js
@@ -170,7 +170,7 @@ export default {
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. Response",
"Entry Page": "Entry Page",
- "statusPageNothing": "Nothing here, please add a group or a monitor.",
+ statusPageNothing: "Nothing here, please add a group or a monitor.",
"No Services": "No Services",
"All Systems Operational": "All Systems Operational",
"Partially Degraded Service": "Partially Degraded Service",
@@ -179,4 +179,5 @@ export default {
"Add a monitor": "Add a monitor",
"Edit Status Page": "Edit Status Page",
"Go to Dashboard": "Go to Dashboard",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index bc3c5d5d4..f10600775 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -170,7 +170,7 @@ export default {
"Avg. Ping": "Ping moyen",
"Avg. Response": "Réponse moyenne",
"Entry Page": "Page d'accueil",
- "statusPageNothing": "Rien ici, veuillez ajouter un groupe ou une sonde.",
+ statusPageNothing: "Rien ici, veuillez ajouter un groupe ou une sonde.",
"No Services": "Aucun service",
"All Systems Operational": "Tous les systèmes sont opérationnels",
"Partially Degraded Service": "Service partiellement dégradé",
@@ -179,4 +179,5 @@ export default {
"Add a monitor": "Ajouter une sonde",
"Edit Status Page": "Modifier la page de statut",
"Go to Dashboard": "Accéder au tableau de bord",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/it-IT.js b/src/languages/it-IT.js
index 9beb9db57..10c2df89b 100644
--- a/src/languages/it-IT.js
+++ b/src/languages/it-IT.js
@@ -169,7 +169,7 @@ export default {
"Avg. Ping": "Ping medio",
"Avg. Response": "Risposta media",
"Entry Page": "Entry Page",
- "statusPageNothing": "Non c'è nulla qui, aggiungere un gruppo oppure un monitoraggio.",
+ statusPageNothing: "Non c'è nulla qui, aggiungere un gruppo oppure un monitoraggio.",
"No Services": "Nessun Servizio",
"All Systems Operational": "Tutti i sistemi sono operativi",
"Partially Degraded Service": "Servizio parzialmente degradato",
@@ -178,4 +178,5 @@ export default {
"Add a monitor": "Aggiungi un monitoraggio",
"Edit Status Page": "Modifica pagina di stato",
"Go to Dashboard": "Vai al Cruscotto",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/ja.js b/src/languages/ja.js
index bf8e3129a..3462166ba 100644
--- a/src/languages/ja.js
+++ b/src/languages/ja.js
@@ -170,7 +170,7 @@ export default {
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. Response",
"Entry Page": "Entry Page",
- "statusPageNothing": "Nothing here, please add a group or a monitor.",
+ statusPageNothing: "Nothing here, please add a group or a monitor.",
"No Services": "No Services",
"All Systems Operational": "All Systems Operational",
"Partially Degraded Service": "Partially Degraded Service",
@@ -179,4 +179,5 @@ export default {
"Add a monitor": "Add a monitor",
"Edit Status Page": "Edit Status Page",
"Go to Dashboard": "Go to Dashboard",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index fb3d65ea3..881d609e0 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -170,7 +170,7 @@ export default {
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. Response",
"Entry Page": "Entry Page",
- "statusPageNothing": "Nothing here, please add a group or a monitor.",
+ statusPageNothing: "Nothing here, please add a group or a monitor.",
"No Services": "No Services",
"All Systems Operational": "All Systems Operational",
"Partially Degraded Service": "Partially Degraded Service",
@@ -179,4 +179,5 @@ export default {
"Add a monitor": "Add a monitor",
"Edit Status Page": "Edit Status Page",
"Go to Dashboard": "Go to Dashboard",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js
index 78bbe5a81..b55e259b6 100644
--- a/src/languages/nl-NL.js
+++ b/src/languages/nl-NL.js
@@ -170,7 +170,7 @@ export default {
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. Response",
"Entry Page": "Entry Page",
- "statusPageNothing": "Nothing here, please add a group or a monitor.",
+ statusPageNothing: "Nothing here, please add a group or a monitor.",
"No Services": "No Services",
"All Systems Operational": "All Systems Operational",
"Partially Degraded Service": "Partially Degraded Service",
@@ -179,4 +179,5 @@ export default {
"Add a monitor": "Add a monitor",
"Edit Status Page": "Edit Status Page",
"Go to Dashboard": "Go to Dashboard",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/pl.js b/src/languages/pl.js
index 006039144..ad10ceb07 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -169,14 +169,15 @@ export default {
"Search...": "Szukaj...",
"Avg. Ping": "Średni ping",
"Avg. Response": "Średnia odpowiedź",
- "Entry Page": "Wejdź na stronę",
- "statusPageNothing": "Nic tu nie ma, dodaj monitor lub grupę.",
+ "Entry Page": "Strona główna",
+ statusPageNothing: "Nic tu nie ma, dodaj grupę lub monitor.",
"No Services": "Brak usług",
"All Systems Operational": "Wszystkie systemy działają",
"Partially Degraded Service": "Częściowy błąd usługi",
"Degraded Service": "Błąd usługi",
"Add Group": "Dodaj grupę",
- "Add a monitor": "Dodaj monitoe",
+ "Add a monitor": "Dodaj monitor",
"Edit Status Page": "Edytuj stronę statusu",
"Go to Dashboard": "Idź do panelu",
+ "Status Page": "Strona statusu",
};
diff --git a/src/languages/pt-BR.js b/src/languages/pt-BR.js
index 4fc22fefd..4f65f6038 100644
--- a/src/languages/pt-BR.js
+++ b/src/languages/pt-BR.js
@@ -170,7 +170,7 @@ export default {
"Avg. Response": "Resposta Média. ",
"Status Page": "Página de Status",
"Entry Page": "Página de entrada",
- "statusPageNothing": "Nada aqui, por favor, adicione um grupo ou monitor.",
+ statusPageNothing: "Nada aqui, por favor, adicione um grupo ou monitor.",
"No Services": "Nenhum Serviço",
"All Systems Operational": "Todos os Serviços Operacionais",
"Partially Degraded Service": "Serviço parcialmente degradado",
diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js
index 1686aec49..18d97305f 100644
--- a/src/languages/ru-RU.js
+++ b/src/languages/ru-RU.js
@@ -180,7 +180,7 @@ export default {
"Edit Status Page": "Редактировать",
"Go to Dashboard": "Панель мониторов",
"Status Page": "Статус сервисов",
- "Discard": "Отмена",
+ Discard: "Отмена",
"Create Incident": "Создать инцидент",
"Switch to Dark Theme": "Тёмная тема",
"Switch to Light Theme": "Светлая тема",
diff --git a/src/languages/sr-latn.js b/src/languages/sr-latn.js
index 51cb7f8f0..3542e1d6f 100644
--- a/src/languages/sr-latn.js
+++ b/src/languages/sr-latn.js
@@ -170,7 +170,7 @@ export default {
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. Response",
"Entry Page": "Entry Page",
- "statusPageNothing": "Nothing here, please add a group or a monitor.",
+ statusPageNothing: "Nothing here, please add a group or a monitor.",
"No Services": "No Services",
"All Systems Operational": "All Systems Operational",
"Partially Degraded Service": "Partially Degraded Service",
@@ -179,4 +179,5 @@ export default {
"Add a monitor": "Add a monitor",
"Edit Status Page": "Edit Status Page",
"Go to Dashboard": "Go to Dashboard",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/sr.js b/src/languages/sr.js
index 0c8b6ef44..9cb1379e6 100644
--- a/src/languages/sr.js
+++ b/src/languages/sr.js
@@ -170,7 +170,7 @@ export default {
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. Response",
"Entry Page": "Entry Page",
- "statusPageNothing": "Nothing here, please add a group or a monitor.",
+ statusPageNothing: "Nothing here, please add a group or a monitor.",
"No Services": "No Services",
"All Systems Operational": "All Systems Operational",
"Partially Degraded Service": "Partially Degraded Service",
@@ -179,4 +179,5 @@ export default {
"Add a monitor": "Add a monitor",
"Edit Status Page": "Edit Status Page",
"Go to Dashboard": "Go to Dashboard",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js
index de4fbcc7d..ef66aca5e 100644
--- a/src/languages/sv-SE.js
+++ b/src/languages/sv-SE.js
@@ -170,7 +170,7 @@ export default {
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. Response",
"Entry Page": "Entry Page",
- "statusPageNothing": "Nothing here, please add a group or a monitor.",
+ statusPageNothing: "Nothing here, please add a group or a monitor.",
"No Services": "No Services",
"All Systems Operational": "All Systems Operational",
"Partially Degraded Service": "Partially Degraded Service",
@@ -179,4 +179,5 @@ export default {
"Add a monitor": "Add a monitor",
"Edit Status Page": "Edit Status Page",
"Go to Dashboard": "Go to Dashboard",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/tr-TR.js b/src/languages/tr-TR.js
index c73775bb1..908afe6dc 100644
--- a/src/languages/tr-TR.js
+++ b/src/languages/tr-TR.js
@@ -169,7 +169,7 @@ export default {
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. Response",
"Entry Page": "Entry Page",
- "statusPageNothing": "Nothing here, please add a group or a monitor.",
+ statusPageNothing: "Nothing here, please add a group or a monitor.",
"No Services": "No Services",
"All Systems Operational": "All Systems Operational",
"Partially Degraded Service": "Partially Degraded Service",
@@ -178,4 +178,5 @@ export default {
"Add a monitor": "Add a monitor",
"Edit Status Page": "Edit Status Page",
"Go to Dashboard": "Go to Dashboard",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
index e9b1c20e9..a784cd34b 100644
--- a/src/languages/zh-CN.js
+++ b/src/languages/zh-CN.js
@@ -170,7 +170,7 @@ export default {
"Avg. Ping": "平均Ping",
"Avg. Response": "平均响应",
"Entry Page": "入口页面",
- "statusPageNothing": "这里什么也没有,请添加一个分组或一个监控项。",
+ statusPageNothing: "这里什么也没有,请添加一个分组或一个监控项。",
"No Services": "无服务",
"All Systems Operational": "所有服务运行正常",
"Partially Degraded Service": "部分服务出现故障",
@@ -179,4 +179,5 @@ export default {
"Add a monitor": "添加监控项",
"Edit Status Page": "编辑状态页",
"Go to Dashboard": "前往仪表盘",
+ "Status Page": "Status Page",
};
diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js
index 92714d713..df3cc4165 100644
--- a/src/languages/zh-HK.js
+++ b/src/languages/zh-HK.js
@@ -170,7 +170,7 @@ export default {
"Avg. Ping": "Avg. Ping",
"Avg. Response": "Avg. Response",
"Entry Page": "Entry Page",
- "statusPageNothing": "Nothing here, please add a group or a monitor.",
+ statusPageNothing: "Nothing here, please add a group or a monitor.",
"No Services": "No Services",
"All Systems Operational": "All Systems Operational",
"Partially Degraded Service": "Partially Degraded Service",
@@ -179,4 +179,5 @@ export default {
"Add a monitor": "Add a monitor",
"Edit Status Page": "Edit Status Page",
"Go to Dashboard": "Go to Dashboard",
+ "Status Page": "Status Page",
};
From fa9d26416c4696aec6b520f7b05de71500a4fa84 Mon Sep 17 00:00:00 2001
From: Adam Stachowicz
Date: Tue, 28 Sep 2021 07:02:19 +0200
Subject: [PATCH 008/179] `silentTranslationWarn` if not development
---
src/i18n.js | 2 +-
src/main.js | 9 ++++-----
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/src/i18n.js b/src/i18n.js
index bd1811f61..a8a1a0cb9 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -45,6 +45,6 @@ export const i18n = createI18n({
locale: localStorage.locale || "en",
fallbackLocale: "en",
silentFallbackWarn: true,
- silentTranslationWarn: false,
+ silentTranslationWarn: process.env.NODE_ENV !== "development",
messages: languageList,
});
diff --git a/src/main.js b/src/main.js
index 94807b44b..79ba2d1dd 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,7 +1,7 @@
import "bootstrap";
import { createApp, h } from "vue";
+import contenteditable from "vue-contenteditable";
import Toast from "vue-toastification";
-import contenteditable from "vue-contenteditable"
import "vue-toastification/dist/index.css";
import App from "./App.vue";
import "./assets/app.scss";
@@ -9,10 +9,9 @@ import { i18n } from "./i18n";
import { FontAwesomeIcon } from "./icon.js";
import datetime from "./mixins/datetime";
import mobile from "./mixins/mobile";
+import publicMixin from "./mixins/public";
import socket from "./mixins/socket";
import theme from "./mixins/theme";
-import publicMixin from "./mixins/public";
-
import { router } from "./router";
import { appName } from "./util.ts";
@@ -27,10 +26,10 @@ const app = createApp({
data() {
return {
appName: appName
- }
+ };
},
render: () => h(App),
-})
+});
app.use(router);
app.use(i18n);
From 138ddf56089d7dea14669ff7a62458a7ad264f2a Mon Sep 17 00:00:00 2001
From: zsxeee
Date: Thu, 30 Sep 2021 19:22:17 +0800
Subject: [PATCH 009/179] Move attribute `tag` to start of tag
---
src/components/notifications/Apprise.vue | 12 ++++++------
src/components/notifications/Line.vue | 8 ++++----
src/components/notifications/Mattermost.vue | 4 ++--
src/components/notifications/Octopush.vue | 6 +++---
src/components/notifications/Pushbullet.vue | 4 ++--
src/components/notifications/Pushover.vue | 2 +-
src/components/notifications/Pushy.vue | 4 ++--
src/components/notifications/RocketChat.vue | 4 ++--
src/components/notifications/Slack.vue | 4 ++--
src/components/notifications/Teams.vue | 2 +-
src/components/notifications/Webhook.vue | 2 +-
src/languages/en.js | 17 -----------------
12 files changed, 26 insertions(+), 43 deletions(-)
diff --git a/src/components/notifications/Apprise.vue b/src/components/notifications/Apprise.vue
index f485405b4..c10e23cf9 100644
--- a/src/components/notifications/Apprise.vue
+++ b/src/components/notifications/Apprise.vue
@@ -4,15 +4,15 @@
-
+
{{ $t("appriseInstalled") }}
-
+
{{ $t("Read more") }}
@@ -24,12 +24,12 @@ export default {
data() {
return {
appriseInstalled: false
- }
+ };
},
mounted() {
this.$root.getSocket().emit("checkApprise", (installed) => {
this.appriseInstalled = installed;
- })
+ });
},
-}
+};
diff --git a/src/components/notifications/Line.vue b/src/components/notifications/Line.vue
index 0d7da26a4..cb52c0c1f 100644
--- a/src/components/notifications/Line.vue
+++ b/src/components/notifications/Line.vue
@@ -3,17 +3,17 @@
{{ $t("Channel access token") }}
-
+
{{ $t("Basic Settings") }}
User ID
-
+
{{ $t("Messaging API") }}
-
+
{{ $t("Line Developers Console") }}
@@ -25,5 +25,5 @@ export default {
components: {
HiddenInput,
},
-}
+};
diff --git a/src/components/notifications/Mattermost.vue b/src/components/notifications/Mattermost.vue
index 4c6e69189..2d174146a 100644
--- a/src/components/notifications/Mattermost.vue
+++ b/src/components/notifications/Mattermost.vue
@@ -12,7 +12,7 @@
diff --git a/src/components/notifications/Octopush.vue b/src/components/notifications/Octopush.vue
index b8ea6dfac..fb0eb7f47 100644
--- a/src/components/notifications/Octopush.vue
+++ b/src/components/notifications/Octopush.vue
@@ -11,7 +11,7 @@
{{ $t("octopushTypePremium") }}
{{ $t("octopushTypeLowCost") }}
-
+
https://octopush.com/tarifs-sms-international/
@@ -24,7 +24,7 @@
-
+
https://octopush.com/api-sms-documentation/envoi-de-sms/
@@ -36,5 +36,5 @@ export default {
components: {
HiddenInput,
},
-}
+};
diff --git a/src/components/notifications/Pushbullet.vue b/src/components/notifications/Pushbullet.vue
index ea848222d..37a2e095c 100644
--- a/src/components/notifications/Pushbullet.vue
+++ b/src/components/notifications/Pushbullet.vue
@@ -4,7 +4,7 @@
-
+
https://docs.pushbullet.com
@@ -16,5 +16,5 @@ export default {
components: {
HiddenInput,
},
-}
+};
diff --git a/src/components/notifications/Pushover.vue b/src/components/notifications/Pushover.vue
index 7f0a94173..af6e9d83f 100644
--- a/src/components/notifications/Pushover.vue
+++ b/src/components/notifications/Pushover.vue
@@ -43,7 +43,7 @@
* {{ $t("Required") }}
-
+
https://pushover.net/api
diff --git a/src/components/notifications/Pushy.vue b/src/components/notifications/Pushy.vue
index b980f546d..26f404d29 100644
--- a/src/components/notifications/Pushy.vue
+++ b/src/components/notifications/Pushy.vue
@@ -10,7 +10,7 @@
-
+
https://pushy.me/docs/api/send-notifications
@@ -22,5 +22,5 @@ export default {
components: {
HiddenInput,
},
-}
+};
diff --git a/src/components/notifications/RocketChat.vue b/src/components/notifications/RocketChat.vue
index 328da8bd7..8f8082101 100644
--- a/src/components/notifications/RocketChat.vue
+++ b/src/components/notifications/RocketChat.vue
@@ -12,7 +12,7 @@
diff --git a/src/components/notifications/Slack.vue b/src/components/notifications/Slack.vue
index 9cd05fb59..8675922be 100644
--- a/src/components/notifications/Slack.vue
+++ b/src/components/notifications/Slack.vue
@@ -12,7 +12,7 @@
diff --git a/src/components/notifications/Teams.vue b/src/components/notifications/Teams.vue
index 0c36cfed0..2bc76486a 100644
--- a/src/components/notifications/Teams.vue
+++ b/src/components/notifications/Teams.vue
@@ -8,7 +8,7 @@
class="form-control"
required
/>
-
+
"application/json" is good for any modern http servers such as express.js
-
+
"multipart/form-data"
json_decode($_POST['data'])
diff --git a/src/languages/en.js b/src/languages/en.js
index 39464c3f0..b4b7769de 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -182,7 +182,6 @@ export default {
defaultNotificationName: "My {0} Alert ({1})",
here: "here",
"Required": "Required",
-
"telegram": "Telegram",
"Bot Token": "Bot Token",
"You can get a token from": "You can get a token from",
@@ -191,13 +190,11 @@ export default {
wayToGetTelegramChatID: "You can get your chat id by sending message to the bot and go to this url to view the chat_id:",
"YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
chatIDNotFound: "Chat ID is not found, please send a message to this bot first",
-
"webhook": "Webhook",
"Post URL": "Post URL",
"Content Type": "Content Type",
webhookJsonDesc: "{0} is good for any modern http servers such as express.js",
webhookFormDataDesc: "{0} is good for PHP, you just need to parse the json by {1}",
-
"smtp": "Email (SMTP)",
secureOptionNone: "None / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
@@ -206,30 +203,25 @@ export default {
"To Email": "To Email",
smtpCC: "CC",
smtpBCC: "BCC",
-
"discord": "Discord",
"Discord Webhook URL": "Discord Webhook URL",
wayToGetDiscordURL: "You can get this by going to Server Settings -> Integrations -> Create Webhook",
"Bot Display Name": "Bot Display Name",
"Prefix Custom Message": "Prefix Custom Message",
"Hello @everyone is...": "Hello @everyone is...",
-
"teams": "Microsoft Teams",
"Webhook URL": "Webhook URL",
wayToGetTeamsURL: "You can learn how to create a webhook url {0}.",
-
"signal": "Signal",
"Number": "Number",
"Recipients": "Recipients",
needSignalAPI: "You need to have a signal client with REST API.",
wayToCheckSignalURL: "You can check this url to view how to setup one:",
signalImportant: "IMPORTANT: You cannot mix groups and numbers in recipients!",
-
"gotify": "Gotify",
"Application Token": "Application Token",
"Server URL": "Server URL",
"Priority": "Priority",
-
"slack": "Slack",
"Icon Emoji": "Icon Emoji",
"Channel Name": "Channel Name",
@@ -238,9 +230,7 @@ export default {
aboutChannelName: "Enter the channel name on {0} Channel Name field if you want to bypass the webhook channel. Ex: #other-channel",
aboutKumaURL: "If you leave the Uptime Kuma URL field blank, it will default to the Project Github page.",
emojiCheatSheet: "Emoji cheat sheet: {0}",
-
"rocket.chat": "Rocket.chat",
-
"pushover": "Pushover",
"User Key": "User Key",
"Device": "Device",
@@ -249,9 +239,7 @@ export default {
"More info on:": "More info on: {0}",
pushoverDesc1: "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
pushoverDesc2: "If you want to send notifications to different devices, fill out Device field.",
-
"pushy": "Pushy",
-
"octopush": "Octopush",
"SMS Type": "SMS Type",
octopushTypePremium: "Premium (Fast - recommended for alerting)",
@@ -259,10 +247,8 @@ export default {
"Check octopush prices": "Check octopush prices {0}.",
octopushPhoneNumber: "Phone number (intl format, eg : +33612345678) ",
octopushSMSSender: "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
-
"lunasea": "LunaSea",
"LunaSea Device ID": "LunaSea Device ID",
-
"apprise": "Apprise (Support 50+ Notification services)",
"Apprise URL": "Apprise URL",
"Example:": "Example: {0}",
@@ -271,10 +257,8 @@ export default {
"Read more": "Read more",
appriseInstalled: "Apprise is installed.",
appriseNotInstalled: "Apprise is not installed. {0}",
-
"pushbullet": "Pushbullet",
"Access Token": "Access Token",
-
"line": "Line Messenger",
"Channel access token": "Channel access token",
"Line Developers Console": "Line Developers Console",
@@ -283,7 +267,6 @@ export default {
"User ID": "User ID",
"Messaging API": "Messaging API",
wayToGetLineChannelToken: "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user id from the above mentioned menu items.",
-
"mattermost": "Mattermost",
"Icon URL": "Icon URL",
aboutIconURL: "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
From 0f2059cde00e87d0a88ca052a4741b06c7a16294 Mon Sep 17 00:00:00 2001
From: zsxeee
Date: Thu, 30 Sep 2021 19:48:24 +0800
Subject: [PATCH 010/179] Use named slot translation when has multi-slot
---
src/components/NotificationDialog.vue | 52 ++++++++++++------------
src/components/notifications/Webhook.vue | 6 ++-
src/languages/en.js | 4 +-
3 files changed, 32 insertions(+), 30 deletions(-)
diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue
index 0c2035def..659f57267 100644
--- a/src/components/NotificationDialog.vue
+++ b/src/components/NotificationDialog.vue
@@ -68,11 +68,11 @@
From 79ee0e1ef47f560d4dcfd92b7bdac152b586b16b Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Fri, 8 Oct 2021 11:39:31 +0800
Subject: [PATCH 083/179] Update ask-for-help.md
---
.github/ISSUE_TEMPLATE/ask-for-help.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.github/ISSUE_TEMPLATE/ask-for-help.md b/.github/ISSUE_TEMPLATE/ask-for-help.md
index c0c8d1e68..8184f8409 100644
--- a/.github/ISSUE_TEMPLATE/ask-for-help.md
+++ b/.github/ISSUE_TEMPLATE/ask-for-help.md
@@ -9,6 +9,10 @@ assignees: ''
**Is it a duplicate question?**
Please search in Issues without filters: https://github.com/louislam/uptime-kuma/issues?q=
+
+**Describe your problem**
+
+
**Info**
Uptime Kuma Version:
Using Docker?: Yes/No
From 11abc1f1e002a816ef5123b6c82703ad69bee607 Mon Sep 17 00:00:00 2001
From: LouisLam
Date: Fri, 8 Oct 2021 13:35:04 +0800
Subject: [PATCH 084/179] [test] add test for i18n currentLocale
---
jest.config.js | 15 +++++++++++++++
package.json | 10 ----------
src/main.js | 6 ++++++
src/util.js | 2 +-
src/util.ts | 2 +-
test/test.spec.js | 9 +++++++++
test/test_install_script/ubuntu.dockerfile | 3 +--
7 files changed, 33 insertions(+), 14 deletions(-)
create mode 100644 jest.config.js
diff --git a/jest.config.js b/jest.config.js
new file mode 100644
index 000000000..73aa3eae3
--- /dev/null
+++ b/jest.config.js
@@ -0,0 +1,15 @@
+module.exports = {
+ "verbose": true,
+ "preset": "jest-puppeteer",
+ "globals": {
+ "__DEV__": true
+ },
+ "testRegex": "./test/*.spec.js",
+ "rootDir": ".",
+ "testTimeout": 30000,
+ "transform": {
+ "^.+\\.js$": "babel-jest",
+ ".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$": "jest-transform-stub"
+ }
+};
+
diff --git a/package.json b/package.json
index 7511e93d0..c838efee3 100644
--- a/package.json
+++ b/package.json
@@ -115,15 +115,5 @@
"stylelint-config-standard": "~22.0.0",
"typescript": "~4.4.3",
"vite": "~2.6.4"
- },
- "jest": {
- "verbose": true,
- "preset": "jest-puppeteer",
- "globals": {
- "__DEV__": true
- },
- "testRegex": "./test/*.spec.js",
- "rootDir": ".",
- "testTimeout": 30000
}
}
diff --git a/src/main.js b/src/main.js
index 79ba2d1dd..14b87f49d 100644
--- a/src/main.js
+++ b/src/main.js
@@ -43,3 +43,9 @@ app.component("Editable", contenteditable);
app.component("FontAwesomeIcon", FontAwesomeIcon);
app.mount("#app");
+
+// Expose the vue instance for development
+if (process.env.NODE_ENV === "development") {
+ console.log("Dev Only: window.app is the vue instance");
+ window.app = app._instance;
+}
diff --git a/src/util.js b/src/util.js
index 64ac2f6f6..7fb50c5b0 100644
--- a/src/util.js
+++ b/src/util.js
@@ -74,7 +74,7 @@ class TimeLogger {
this.startTime = dayjs().valueOf();
}
print(name) {
- if (exports.isDev && process && process.env.TIMELOGGER === "1") {
+ if (exports.isDev && process.env.TIMELOGGER === "1") {
console.log(name + ": " + (dayjs().valueOf() - this.startTime) + "ms");
}
}
diff --git a/src/util.ts b/src/util.ts
index 450050490..6e911998d 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -86,7 +86,7 @@ export class TimeLogger {
}
print(name: string) {
- if (isDev && process && process.env.TIMELOGGER === "1") {
+ if (isDev && process.env.TIMELOGGER === "1") {
console.log(name + ": " + (dayjs().valueOf() - this.startTime) + "ms")
}
}
diff --git a/test/test.spec.js b/test/test.spec.js
index 91c8459bd..af8da3235 100644
--- a/test/test.spec.js
+++ b/test/test.spec.js
@@ -2,6 +2,7 @@
const { Page, Browser } = require("puppeteer");
const { sleep } = require("../src/util");
const axios = require("axios");
+const { currentLocale } = require("../src/i18n");
/**
* Set back the correct data type for page object
@@ -223,6 +224,14 @@ describe("Init", () => {
});
});
+describe("Test i18n.js", () => {
+
+ it("currentLocale()", () => {
+ expect(currentLocale()).toMatch("");
+ });
+
+});
+
async function login(username, password) {
await input(page, "#floatingInput", username);
await input(page, "#floatingPassword", password);
diff --git a/test/test_install_script/ubuntu.dockerfile b/test/test_install_script/ubuntu.dockerfile
index 07d8a25a4..fc9dcd3f4 100644
--- a/test/test_install_script/ubuntu.dockerfile
+++ b/test/test_install_script/ubuntu.dockerfile
@@ -6,5 +6,4 @@ FROM ubuntu
# RUN ln -s /usr/bin/nodejs /usr/bin/node
# RUN node -v
-COPY ./install.sh .
-RUN bash install.sh local /opt/uptime-kuma 3000 0.0.0.0
+RUN curl -o kuma_install.sh http://git.kuma.pet/install.sh && bash kuma_install.sh local /opt/uptime-kuma 3000 0.0.0.0
From dfd63386ba367f442b11379776a56cd8290a5153 Mon Sep 17 00:00:00 2001
From: Lukas <35193662+NixNotCastey@users.noreply.github.com>
Date: Fri, 8 Oct 2021 09:11:13 +0200
Subject: [PATCH 085/179] Make PromoSMS actually working
Make PromoSMS actually working and inform on success only when API return 0
---
server/notification-providers/promosms.js | 24 +++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/server/notification-providers/promosms.js b/server/notification-providers/promosms.js
index 97d046910..23d6a4502 100644
--- a/server/notification-providers/promosms.js
+++ b/server/notification-providers/promosms.js
@@ -9,28 +9,28 @@ class PromoSMS extends NotificationProvider {
let okMsg = "Sent Successfully.";
try {
- let buffer = new Buffer(notification.promosmsLogin + ":" + notification.promosmsPassword);
- let promosmsAuth = buffer.toString('base64');
let config = {
headers: {
- "Authorization": "Basic" + promosmsAuth,
- "Content-Type": "application/x-www-form-urlencoded",
- "Accept": "text/json"
+ "Content-Type": "application/json",
+ "Authorization": "Basic " + Buffer.from(notification.promosmsLogin + ":" + notification.promosmsPassword).toString('base64'),
+ "Accept": "text/json",
}
};
let data = {
- "recipients": [
- {
- "recipients": notification.promosmsPhoneNumber
- }
- ],
+ "recipients": [ notification.promosmsPhoneNumber ],
//Lets remove non ascii char
"text": msg.replace(/[^\x00-\x7F]/g, ""),
- "type": notification.promosmsSMSType,
+ "type": Number(notification.promosmsSMSType),
"sender": notification.promosmsSenderName
};
- await axios.post("https://promosms.com/api/rest/v3_2/sms", data, config)
+ await axios.post("https://promosms.com/api/rest/v3_2/sms", data, config).then(resp => {
+ if (resp.data.response.status !== 0) {
+ let error = "Something gone wrong. Api returned " + resp.data.response.status + ".";
+ this.throwGeneralAxiosError(error);
+ }
+ });
+
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
From 01812cc446686a041ab7fcabf053f822a7ced22e Mon Sep 17 00:00:00 2001
From: LouisLam
Date: Fri, 8 Oct 2021 15:11:50 +0800
Subject: [PATCH 086/179] [test] add test for i18n currentLocale
---
babel.config.js | 7 +
jest-frontend.config.js | 5 +
jest.config.js | 6 +-
package-lock.json | 2281 ++++++++++++++++++++++++++++
package.json | 4 +-
test/{test.spec.js => e2e.spec.js} | 23 +-
test/frontend.spec.js | 42 +
7 files changed, 2346 insertions(+), 22 deletions(-)
create mode 100644 babel.config.js
create mode 100644 jest-frontend.config.js
rename test/{test.spec.js => e2e.spec.js} (92%)
create mode 100644 test/frontend.spec.js
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 000000000..70266c1f7
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,7 @@
+const config = {};
+
+if (process.env.TEST_FRONTEND) {
+ config.presets = ["@babel/preset-env"];
+}
+
+module.exports = config;
diff --git a/jest-frontend.config.js b/jest-frontend.config.js
new file mode 100644
index 000000000..ec4ab8d8e
--- /dev/null
+++ b/jest-frontend.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ "rootDir": ".",
+ "testRegex": "./test/frontend.spec.js",
+};
+
diff --git a/jest.config.js b/jest.config.js
index 73aa3eae3..6ce5b90a6 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -4,12 +4,8 @@ module.exports = {
"globals": {
"__DEV__": true
},
- "testRegex": "./test/*.spec.js",
+ "testRegex": "./test/e2e.spec.js",
"rootDir": ".",
"testTimeout": 30000,
- "transform": {
- "^.+\\.js$": "babel-jest",
- ".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$": "jest-transform-stub"
- }
};
diff --git a/package-lock.json b/package-lock.json
index 762cfd98a..3820dbf79 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -58,6 +58,7 @@
},
"devDependencies": {
"@babel/eslint-parser": "~7.15.7",
+ "@babel/preset-env": "^7.15.8",
"@types/bootstrap": "~5.1.6",
"@vitejs/plugin-legacy": "~1.6.1",
"@vitejs/plugin-vue": "~1.9.2",
@@ -190,6 +191,31 @@
"node": ">=0.10.0"
}
},
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz",
+ "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.15.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz",
+ "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-explode-assignable-expression": "^7.15.4",
+ "@babel/types": "^7.15.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-compilation-targets": {
"version": "7.15.4",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz",
@@ -208,6 +234,73 @@
"@babel/core": "^7.0.0"
}
},
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz",
+ "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.15.4",
+ "@babel/helper-function-name": "^7.15.4",
+ "@babel/helper-member-expression-to-functions": "^7.15.4",
+ "@babel/helper-optimise-call-expression": "^7.15.4",
+ "@babel/helper-replace-supers": "^7.15.4",
+ "@babel/helper-split-export-declaration": "^7.15.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz",
+ "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.14.5",
+ "regexpu-core": "^4.7.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz",
+ "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.13.0",
+ "@babel/helper-module-imports": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/traverse": "^7.13.0",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2",
+ "semver": "^6.1.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0-0"
+ }
+ },
+ "node_modules/@babel/helper-explode-assignable-expression": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz",
+ "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.15.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-function-name": {
"version": "7.15.4",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz",
@@ -310,6 +403,20 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz",
+ "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.15.4",
+ "@babel/helper-wrap-function": "^7.15.4",
+ "@babel/types": "^7.15.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-replace-supers": {
"version": "7.15.4",
"resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz",
@@ -337,6 +444,18 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz",
+ "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.15.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-split-export-declaration": {
"version": "7.15.4",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz",
@@ -367,6 +486,21 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz",
+ "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-function-name": "^7.15.4",
+ "@babel/template": "^7.15.4",
+ "@babel/traverse": "^7.15.4",
+ "@babel/types": "^7.15.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helpers": {
"version": "7.15.4",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz",
@@ -477,6 +611,271 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz",
+ "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4",
+ "@babel/plugin-proposal-optional-chaining": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.15.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz",
+ "integrity": "sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-remap-async-to-generator": "^7.15.4",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz",
+ "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-static-block": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz",
+ "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-dynamic-import": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz",
+ "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-export-namespace-from": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz",
+ "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-json-strings": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz",
+ "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz",
+ "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz",
+ "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-numeric-separator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz",
+ "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.15.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz",
+ "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.15.0",
+ "@babel/helper-compilation-targets": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.15.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-catch-binding": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz",
+ "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-chaining": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz",
+ "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-methods": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz",
+ "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz",
+ "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.15.4",
+ "@babel/helper-create-class-features-plugin": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz",
+ "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-syntax-async-generators": {
"version": "7.8.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
@@ -513,6 +912,45 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-syntax-import-meta": {
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
@@ -609,6 +1047,21 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-syntax-top-level-await": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
@@ -639,6 +1092,634 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz",
+ "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz",
+ "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-remap-async-to-generator": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz",
+ "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.15.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz",
+ "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz",
+ "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.15.4",
+ "@babel/helper-function-name": "^7.15.4",
+ "@babel/helper-optimise-call-expression": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-replace-supers": "^7.15.4",
+ "@babel/helper-split-export-declaration": "^7.15.4",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes/node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz",
+ "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz",
+ "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz",
+ "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz",
+ "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz",
+ "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz",
+ "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz",
+ "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-function-name": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz",
+ "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz",
+ "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz",
+ "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz",
+ "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-simple-access": "^7.15.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz",
+ "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-hoist-variables": "^7.15.4",
+ "@babel/helper-module-transforms": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz",
+ "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz",
+ "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz",
+ "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz",
+ "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-replace-supers": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz",
+ "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz",
+ "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz",
+ "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==",
+ "dev": true,
+ "dependencies": {
+ "regenerator-transform": "^0.14.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz",
+ "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz",
+ "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.15.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz",
+ "integrity": "sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz",
+ "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz",
+ "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz",
+ "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz",
+ "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz",
+ "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.15.8",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.8.tgz",
+ "integrity": "sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.15.0",
+ "@babel/helper-compilation-targets": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-validator-option": "^7.14.5",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4",
+ "@babel/plugin-proposal-async-generator-functions": "^7.15.8",
+ "@babel/plugin-proposal-class-properties": "^7.14.5",
+ "@babel/plugin-proposal-class-static-block": "^7.15.4",
+ "@babel/plugin-proposal-dynamic-import": "^7.14.5",
+ "@babel/plugin-proposal-export-namespace-from": "^7.14.5",
+ "@babel/plugin-proposal-json-strings": "^7.14.5",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5",
+ "@babel/plugin-proposal-numeric-separator": "^7.14.5",
+ "@babel/plugin-proposal-object-rest-spread": "^7.15.6",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.14.5",
+ "@babel/plugin-proposal-optional-chaining": "^7.14.5",
+ "@babel/plugin-proposal-private-methods": "^7.14.5",
+ "@babel/plugin-proposal-private-property-in-object": "^7.15.4",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.14.5",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-transform-arrow-functions": "^7.14.5",
+ "@babel/plugin-transform-async-to-generator": "^7.14.5",
+ "@babel/plugin-transform-block-scoped-functions": "^7.14.5",
+ "@babel/plugin-transform-block-scoping": "^7.15.3",
+ "@babel/plugin-transform-classes": "^7.15.4",
+ "@babel/plugin-transform-computed-properties": "^7.14.5",
+ "@babel/plugin-transform-destructuring": "^7.14.7",
+ "@babel/plugin-transform-dotall-regex": "^7.14.5",
+ "@babel/plugin-transform-duplicate-keys": "^7.14.5",
+ "@babel/plugin-transform-exponentiation-operator": "^7.14.5",
+ "@babel/plugin-transform-for-of": "^7.15.4",
+ "@babel/plugin-transform-function-name": "^7.14.5",
+ "@babel/plugin-transform-literals": "^7.14.5",
+ "@babel/plugin-transform-member-expression-literals": "^7.14.5",
+ "@babel/plugin-transform-modules-amd": "^7.14.5",
+ "@babel/plugin-transform-modules-commonjs": "^7.15.4",
+ "@babel/plugin-transform-modules-systemjs": "^7.15.4",
+ "@babel/plugin-transform-modules-umd": "^7.14.5",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9",
+ "@babel/plugin-transform-new-target": "^7.14.5",
+ "@babel/plugin-transform-object-super": "^7.14.5",
+ "@babel/plugin-transform-parameters": "^7.15.4",
+ "@babel/plugin-transform-property-literals": "^7.14.5",
+ "@babel/plugin-transform-regenerator": "^7.14.5",
+ "@babel/plugin-transform-reserved-words": "^7.14.5",
+ "@babel/plugin-transform-shorthand-properties": "^7.14.5",
+ "@babel/plugin-transform-spread": "^7.15.8",
+ "@babel/plugin-transform-sticky-regex": "^7.14.5",
+ "@babel/plugin-transform-template-literals": "^7.14.5",
+ "@babel/plugin-transform-typeof-symbol": "^7.14.5",
+ "@babel/plugin-transform-unicode-escapes": "^7.14.5",
+ "@babel/plugin-transform-unicode-regex": "^7.14.5",
+ "@babel/preset-modules": "^0.1.4",
+ "@babel/types": "^7.15.6",
+ "babel-plugin-polyfill-corejs2": "^0.2.2",
+ "babel-plugin-polyfill-corejs3": "^0.2.5",
+ "babel-plugin-polyfill-regenerator": "^0.2.2",
+ "core-js-compat": "^3.16.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
+ "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz",
+ "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==",
+ "dev": true,
+ "dependencies": {
+ "regenerator-runtime": "^0.13.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/standalone": {
"version": "7.15.7",
"resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.15.7.tgz",
@@ -2170,6 +3251,15 @@
"resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz",
"integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU="
},
+ "node_modules/babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "dev": true,
+ "dependencies": {
+ "object.assign": "^4.1.0"
+ }
+ },
"node_modules/babel-plugin-istanbul": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
@@ -2201,6 +3291,45 @@
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz",
+ "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.13.11",
+ "@babel/helper-define-polyfill-provider": "^0.2.2",
+ "semver": "^6.1.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz",
+ "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.2.2",
+ "core-js-compat": "^3.16.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz",
+ "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.2.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/babel-preset-current-node-syntax": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
@@ -2559,6 +3688,19 @@
"node": ">= 0.8"
}
},
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -2922,6 +4064,29 @@
"url": "https://opencollective.com/core-js"
}
},
+ "node_modules/core-js-compat": {
+ "version": "3.18.2",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.2.tgz",
+ "integrity": "sha512-25VJYCJtGjZwLguj7d66oiHfmnVw3TMOZ0zV8DyMJp/aeQ3OjR519iOOeck08HMyVVRAqXxafc2Hl+5QstJrsQ==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.17.3",
+ "semver": "7.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat/node_modules/semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -3145,6 +4310,18 @@
"node": ">=0.10.0"
}
},
+ "node_modules/define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "dependencies": {
+ "object-keys": "^1.0.12"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -4686,6 +5863,20 @@
"node": "6.* || 8.* || >= 10.*"
}
},
+ "node_modules/get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/get-package-type": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
@@ -4931,6 +6122,18 @@
"node": ">=8"
}
},
+ "node_modules/has-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
@@ -6604,6 +7807,12 @@
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
"dev": true
},
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+ "dev": true
+ },
"node_modules/lodash.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
@@ -7330,6 +8539,33 @@
"node": ">=0.10.0"
}
},
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -8439,12 +9675,39 @@
"node": ">=8"
}
},
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz",
+ "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/regenerator-runtime": {
"version": "0.13.9",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
"dev": true
},
+ "node_modules/regenerator-transform": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+ "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
"node_modules/regexpp": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
@@ -8457,6 +9720,50 @@
"url": "https://github.com/sponsors/mysticatea"
}
},
+ "node_modules/regexpu-core": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz",
+ "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^9.0.0",
+ "regjsgen": "^0.5.2",
+ "regjsparser": "^0.7.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
+ "dev": true
+ },
+ "node_modules/regjsparser": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz",
+ "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==",
+ "dev": true,
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
"node_modules/remark": {
"version": "13.0.0",
"resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
@@ -10026,6 +11333,46 @@
"through": "^2.3.8"
}
},
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/unified": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",
@@ -10974,6 +12321,25 @@
}
}
},
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz",
+ "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.15.4"
+ }
+ },
+ "@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz",
+ "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-explode-assignable-expression": "^7.15.4",
+ "@babel/types": "^7.15.4"
+ }
+ },
"@babel/helper-compilation-targets": {
"version": "7.15.4",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz",
@@ -10986,6 +12352,55 @@
"semver": "^6.3.0"
}
},
+ "@babel/helper-create-class-features-plugin": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz",
+ "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.15.4",
+ "@babel/helper-function-name": "^7.15.4",
+ "@babel/helper-member-expression-to-functions": "^7.15.4",
+ "@babel/helper-optimise-call-expression": "^7.15.4",
+ "@babel/helper-replace-supers": "^7.15.4",
+ "@babel/helper-split-export-declaration": "^7.15.4"
+ }
+ },
+ "@babel/helper-create-regexp-features-plugin": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz",
+ "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.14.5",
+ "regexpu-core": "^4.7.1"
+ }
+ },
+ "@babel/helper-define-polyfill-provider": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz",
+ "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-compilation-targets": "^7.13.0",
+ "@babel/helper-module-imports": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/traverse": "^7.13.0",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2",
+ "semver": "^6.1.2"
+ }
+ },
+ "@babel/helper-explode-assignable-expression": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz",
+ "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.15.4"
+ }
+ },
"@babel/helper-function-name": {
"version": "7.15.4",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz",
@@ -11064,6 +12479,17 @@
"integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==",
"dev": true
},
+ "@babel/helper-remap-async-to-generator": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz",
+ "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.15.4",
+ "@babel/helper-wrap-function": "^7.15.4",
+ "@babel/types": "^7.15.4"
+ }
+ },
"@babel/helper-replace-supers": {
"version": "7.15.4",
"resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz",
@@ -11085,6 +12511,15 @@
"@babel/types": "^7.15.4"
}
},
+ "@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz",
+ "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.15.4"
+ }
+ },
"@babel/helper-split-export-declaration": {
"version": "7.15.4",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz",
@@ -11106,6 +12541,18 @@
"integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==",
"dev": true
},
+ "@babel/helper-wrap-function": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz",
+ "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "^7.15.4",
+ "@babel/template": "^7.15.4",
+ "@babel/traverse": "^7.15.4",
+ "@babel/types": "^7.15.4"
+ }
+ },
"@babel/helpers": {
"version": "7.15.4",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz",
@@ -11191,6 +12638,175 @@
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz",
"integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g=="
},
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz",
+ "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4",
+ "@babel/plugin-proposal-optional-chaining": "^7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.15.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz",
+ "integrity": "sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-remap-async-to-generator": "^7.15.4",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ }
+ },
+ "@babel/plugin-proposal-class-properties": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz",
+ "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-class-static-block": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz",
+ "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-dynamic-import": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz",
+ "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-export-namespace-from": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz",
+ "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-json-strings": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz",
+ "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-logical-assignment-operators": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz",
+ "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz",
+ "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-numeric-separator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz",
+ "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.15.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz",
+ "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.15.0",
+ "@babel/helper-compilation-targets": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.15.4"
+ }
+ },
+ "@babel/plugin-proposal-optional-catch-binding": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz",
+ "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-optional-chaining": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz",
+ "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-private-methods": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz",
+ "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz",
+ "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.15.4",
+ "@babel/helper-create-class-features-plugin": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz",
+ "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
"@babel/plugin-syntax-async-generators": {
"version": "7.8.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
@@ -11218,6 +12834,33 @@
"@babel/helper-plugin-utils": "^7.12.13"
}
},
+ "@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ }
+ },
"@babel/plugin-syntax-import-meta": {
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
@@ -11290,6 +12933,15 @@
"@babel/helper-plugin-utils": "^7.8.0"
}
},
+ "@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
"@babel/plugin-syntax-top-level-await": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
@@ -11308,6 +12960,429 @@
"@babel/helper-plugin-utils": "^7.14.5"
}
},
+ "@babel/plugin-transform-arrow-functions": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz",
+ "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-async-to-generator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz",
+ "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-remap-async-to-generator": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz",
+ "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-block-scoping": {
+ "version": "7.15.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz",
+ "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-classes": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz",
+ "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.15.4",
+ "@babel/helper-function-name": "^7.15.4",
+ "@babel/helper-optimise-call-expression": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-replace-supers": "^7.15.4",
+ "@babel/helper-split-export-declaration": "^7.15.4",
+ "globals": "^11.1.0"
+ },
+ "dependencies": {
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/plugin-transform-computed-properties": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz",
+ "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-destructuring": {
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz",
+ "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-dotall-regex": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz",
+ "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-duplicate-keys": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz",
+ "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz",
+ "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-for-of": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz",
+ "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-function-name": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz",
+ "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-literals": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz",
+ "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-member-expression-literals": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz",
+ "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-modules-amd": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz",
+ "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-commonjs": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz",
+ "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-simple-access": "^7.15.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-systemjs": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz",
+ "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-hoist-variables": "^7.15.4",
+ "@babel/helper-module-transforms": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-umd": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz",
+ "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz",
+ "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-new-target": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz",
+ "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-object-super": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz",
+ "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-replace-supers": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-parameters": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz",
+ "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-property-literals": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz",
+ "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-regenerator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz",
+ "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "^0.14.2"
+ }
+ },
+ "@babel/plugin-transform-reserved-words": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz",
+ "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-shorthand-properties": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz",
+ "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-spread": {
+ "version": "7.15.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz",
+ "integrity": "sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4"
+ }
+ },
+ "@babel/plugin-transform-sticky-regex": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz",
+ "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-template-literals": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz",
+ "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-typeof-symbol": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz",
+ "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-unicode-escapes": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz",
+ "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-unicode-regex": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz",
+ "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/preset-env": {
+ "version": "7.15.8",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.8.tgz",
+ "integrity": "sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.15.0",
+ "@babel/helper-compilation-targets": "^7.15.4",
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-validator-option": "^7.14.5",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4",
+ "@babel/plugin-proposal-async-generator-functions": "^7.15.8",
+ "@babel/plugin-proposal-class-properties": "^7.14.5",
+ "@babel/plugin-proposal-class-static-block": "^7.15.4",
+ "@babel/plugin-proposal-dynamic-import": "^7.14.5",
+ "@babel/plugin-proposal-export-namespace-from": "^7.14.5",
+ "@babel/plugin-proposal-json-strings": "^7.14.5",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5",
+ "@babel/plugin-proposal-numeric-separator": "^7.14.5",
+ "@babel/plugin-proposal-object-rest-spread": "^7.15.6",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.14.5",
+ "@babel/plugin-proposal-optional-chaining": "^7.14.5",
+ "@babel/plugin-proposal-private-methods": "^7.14.5",
+ "@babel/plugin-proposal-private-property-in-object": "^7.15.4",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.14.5",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-transform-arrow-functions": "^7.14.5",
+ "@babel/plugin-transform-async-to-generator": "^7.14.5",
+ "@babel/plugin-transform-block-scoped-functions": "^7.14.5",
+ "@babel/plugin-transform-block-scoping": "^7.15.3",
+ "@babel/plugin-transform-classes": "^7.15.4",
+ "@babel/plugin-transform-computed-properties": "^7.14.5",
+ "@babel/plugin-transform-destructuring": "^7.14.7",
+ "@babel/plugin-transform-dotall-regex": "^7.14.5",
+ "@babel/plugin-transform-duplicate-keys": "^7.14.5",
+ "@babel/plugin-transform-exponentiation-operator": "^7.14.5",
+ "@babel/plugin-transform-for-of": "^7.15.4",
+ "@babel/plugin-transform-function-name": "^7.14.5",
+ "@babel/plugin-transform-literals": "^7.14.5",
+ "@babel/plugin-transform-member-expression-literals": "^7.14.5",
+ "@babel/plugin-transform-modules-amd": "^7.14.5",
+ "@babel/plugin-transform-modules-commonjs": "^7.15.4",
+ "@babel/plugin-transform-modules-systemjs": "^7.15.4",
+ "@babel/plugin-transform-modules-umd": "^7.14.5",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9",
+ "@babel/plugin-transform-new-target": "^7.14.5",
+ "@babel/plugin-transform-object-super": "^7.14.5",
+ "@babel/plugin-transform-parameters": "^7.15.4",
+ "@babel/plugin-transform-property-literals": "^7.14.5",
+ "@babel/plugin-transform-regenerator": "^7.14.5",
+ "@babel/plugin-transform-reserved-words": "^7.14.5",
+ "@babel/plugin-transform-shorthand-properties": "^7.14.5",
+ "@babel/plugin-transform-spread": "^7.15.8",
+ "@babel/plugin-transform-sticky-regex": "^7.14.5",
+ "@babel/plugin-transform-template-literals": "^7.14.5",
+ "@babel/plugin-transform-typeof-symbol": "^7.14.5",
+ "@babel/plugin-transform-unicode-escapes": "^7.14.5",
+ "@babel/plugin-transform-unicode-regex": "^7.14.5",
+ "@babel/preset-modules": "^0.1.4",
+ "@babel/types": "^7.15.6",
+ "babel-plugin-polyfill-corejs2": "^0.2.2",
+ "babel-plugin-polyfill-corejs3": "^0.2.5",
+ "babel-plugin-polyfill-regenerator": "^0.2.2",
+ "core-js-compat": "^3.16.0",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/preset-modules": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
+ "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz",
+ "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
"@babel/standalone": {
"version": "7.15.7",
"resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.15.7.tgz",
@@ -12582,6 +14657,15 @@
"resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz",
"integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU="
},
+ "babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "dev": true,
+ "requires": {
+ "object.assign": "^4.1.0"
+ }
+ },
"babel-plugin-istanbul": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
@@ -12607,6 +14691,36 @@
"@types/babel__traverse": "^7.0.6"
}
},
+ "babel-plugin-polyfill-corejs2": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz",
+ "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.13.11",
+ "@babel/helper-define-polyfill-provider": "^0.2.2",
+ "semver": "^6.1.1"
+ }
+ },
+ "babel-plugin-polyfill-corejs3": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz",
+ "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-define-polyfill-provider": "^0.2.2",
+ "core-js-compat": "^3.16.2"
+ }
+ },
+ "babel-plugin-polyfill-regenerator": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz",
+ "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-define-polyfill-provider": "^0.2.2"
+ }
+ },
"babel-preset-current-node-syntax": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
@@ -12885,6 +14999,16 @@
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -13160,6 +15284,24 @@
"integrity": "sha512-vJlUi/7YdlCZeL6fXvWNaLUPh/id12WXj3MbkMw5uOyF0PfWPBNOCNbs53YqgrvtujLNlt9JQpruyIKkUZ+PKA==",
"dev": true
},
+ "core-js-compat": {
+ "version": "3.18.2",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.2.tgz",
+ "integrity": "sha512-25VJYCJtGjZwLguj7d66oiHfmnVw3TMOZ0zV8DyMJp/aeQ3OjR519iOOeck08HMyVVRAqXxafc2Hl+5QstJrsQ==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.17.3",
+ "semver": "7.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+ "dev": true
+ }
+ }
+ },
"core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -13331,6 +15473,15 @@
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
"dev": true
},
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -14477,6 +16628,17 @@
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
},
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
"get-package-type": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
@@ -14656,6 +16818,12 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
+ "has-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+ "dev": true
+ },
"has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
@@ -15937,6 +18105,12 @@
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
"dev": true
},
+ "lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+ "dev": true
+ },
"lodash.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
@@ -16486,6 +18660,24 @@
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ },
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -17326,18 +19518,79 @@
"strip-indent": "^3.0.0"
}
},
+ "regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "regenerate-unicode-properties": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz",
+ "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.4.2"
+ }
+ },
"regenerator-runtime": {
"version": "0.13.9",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
"dev": true
},
+ "regenerator-transform": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+ "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
"regexpp": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
"dev": true
},
+ "regexpu-core": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz",
+ "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^9.0.0",
+ "regjsgen": "^0.5.2",
+ "regjsparser": "^0.7.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.0.0"
+ }
+ },
+ "regjsgen": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz",
+ "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==",
+ "dev": true,
+ "requires": {
+ "jsesc": "~0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ }
+ }
+ },
"remark": {
"version": "13.0.0",
"resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
@@ -18563,6 +20816,34 @@
"through": "^2.3.8"
}
},
+ "unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+ "dev": true
+ },
+ "unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "requires": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ }
+ },
+ "unicode-match-property-value-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
+ "dev": true
+ },
+ "unicode-property-aliases-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
+ "dev": true
+ },
"unified": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",
diff --git a/package.json b/package.json
index c838efee3..024816ba3 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,8 @@
"build": "vite build",
"test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --test",
"test-with-build": "npm run build && npm test",
- "jest": "node test/prepare-jest.js && jest",
+ "jest": "node test/prepare-jest.js && npm run jest-frontend && jest ",
+ "jest-frontend": "cross-env TEST_FRONTEND=1 jest --config=./jest-frontend.config.js",
"tsc": "tsc",
"vite-preview-dist": "vite preview --host",
"build-docker": "npm run build-docker-debian && npm run build-docker-alpine",
@@ -98,6 +99,7 @@
},
"devDependencies": {
"@babel/eslint-parser": "~7.15.7",
+ "@babel/preset-env": "^7.15.8",
"@types/bootstrap": "~5.1.6",
"@vitejs/plugin-legacy": "~1.6.1",
"@vitejs/plugin-vue": "~1.9.2",
diff --git a/test/test.spec.js b/test/e2e.spec.js
similarity index 92%
rename from test/test.spec.js
rename to test/e2e.spec.js
index af8da3235..03920b306 100644
--- a/test/test.spec.js
+++ b/test/e2e.spec.js
@@ -2,7 +2,6 @@
const { Page, Browser } = require("puppeteer");
const { sleep } = require("../src/util");
const axios = require("axios");
-const { currentLocale } = require("../src/i18n");
/**
* Set back the correct data type for page object
@@ -37,7 +36,7 @@ describe("Init", () => {
});
it(`should be titled "${title}"`, async () => {
- await expect(page.title()).resolves.toMatch(title);
+ await expect(page.title()).resolves.toEqual(title);
});
// Setup Page
@@ -76,11 +75,11 @@ describe("Init", () => {
await page.select("#language", "zh-HK");
let languageTitle = await page.evaluate(() => document.querySelector("[for=language]").innerText);
- expect(languageTitle).toMatch("語言");
+ expect(languageTitle).toEqual("語言");
await page.select("#language", "en");
languageTitle = await page.evaluate(() => document.querySelector("[for=language]").innerText);
- expect(languageTitle).toMatch("Language");
+ expect(languageTitle).toEqual("Language");
});
it("Change Theme", async () => {
@@ -104,21 +103,21 @@ describe("Init", () => {
it("Search Engine Visibility", async () => {
// Default
let res = await axios.get(baseURL + "/robots.txt");
- expect(res.data).toMatch("Disallow: /");
+ expect(res.data).toContain("Disallow: /");
// Yes
await click(page, "#searchEngineIndexYes");
await click(page, "form > div > .btn[type=submit]");
await sleep(2000);
res = await axios.get(baseURL + "/robots.txt");
- expect(res.data).not.toMatch("Disallow: /");
+ expect(res.data).not.toContain("Disallow: /");
// No
await click(page, "#searchEngineIndexNo");
await click(page, "form > div > .btn[type=submit]");
await sleep(2000);
res = await axios.get(baseURL + "/robots.txt");
- expect(res.data).toMatch("Disallow: /");
+ expect(res.data).toContain("Disallow: /");
});
it("Entry Page", async () => {
@@ -219,19 +218,11 @@ describe("Init", () => {
await page.goto(baseURL + "/status");
});
it(`should be titled "${title}"`, async () => {
- await expect(page.title()).resolves.toMatch(title);
+ await expect(page.title()).resolves.toEqual(title);
});
});
});
-describe("Test i18n.js", () => {
-
- it("currentLocale()", () => {
- expect(currentLocale()).toMatch("");
- });
-
-});
-
async function login(username, password) {
await input(page, "#floatingInput", username);
await input(page, "#floatingPassword", password);
diff --git a/test/frontend.spec.js b/test/frontend.spec.js
new file mode 100644
index 000000000..63121a6ba
--- /dev/null
+++ b/test/frontend.spec.js
@@ -0,0 +1,42 @@
+// eslint-disable-next-line no-global-assign
+global.localStorage = {};
+global.navigator = {
+ language: "en"
+};
+
+const { currentLocale } = require("../src/i18n");
+
+describe("Test i18n.js", () => {
+
+ it("currentLocale()", () => {
+ expect(currentLocale()).toEqual("en");
+
+ navigator.language = "zh-HK";
+ expect(currentLocale()).toEqual("zh-HK");
+
+ // Note that in Safari on iOS prior to 10.2, the country code returned is lowercase: "en-us", "fr-fr" etc.
+ // https://developer.mozilla.org/en-US/docs/Web/API/Navigator/language
+ navigator.language = "zh-hk";
+ expect(currentLocale()).toEqual("en");
+
+ navigator.language = "en-US";
+ expect(currentLocale()).toEqual("en");
+
+ navigator.language = "ja-ZZ";
+ expect(currentLocale()).toEqual("ja");
+
+ navigator.language = "zz";
+ expect(currentLocale()).toEqual("en");
+
+ navigator.language = "zz-ZZ";
+ expect(currentLocale()).toEqual("en");
+
+ localStorage.locale = "en";
+ expect(currentLocale()).toEqual("en");
+
+ localStorage.locale = "zh-HK";
+ expect(currentLocale()).toEqual("zh-HK");
+ });
+
+});
+
From a1c2a1bc52d89641ff7078d940d1bf285bd1bca8 Mon Sep 17 00:00:00 2001
From: LouisLam
Date: Fri, 8 Oct 2021 15:34:19 +0800
Subject: [PATCH 087/179] [test] auto test for node lts only
---
.github/workflows/auto-test.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/auto-test.yml b/.github/workflows/auto-test.yml
index b5240d775..1d4452ad2 100644
--- a/.github/workflows/auto-test.yml
+++ b/.github/workflows/auto-test.yml
@@ -16,7 +16,7 @@ jobs:
strategy:
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
- node-version: [14.x, 15.x, 16.x]
+ node-version: [14.x, 16.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
From db791c880a57971a1afe38bb7188e5d937e0a4ce Mon Sep 17 00:00:00 2001
From: Lukas <35193662+NixNotCastey@users.noreply.github.com>
Date: Fri, 8 Oct 2021 11:49:12 +0200
Subject: [PATCH 088/179] Don't use then with await.
---
server/notification-providers/promosms.js | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/server/notification-providers/promosms.js b/server/notification-providers/promosms.js
index 23d6a4502..362ef714a 100644
--- a/server/notification-providers/promosms.js
+++ b/server/notification-providers/promosms.js
@@ -24,12 +24,12 @@ class PromoSMS extends NotificationProvider {
"sender": notification.promosmsSenderName
};
- await axios.post("https://promosms.com/api/rest/v3_2/sms", data, config).then(resp => {
- if (resp.data.response.status !== 0) {
- let error = "Something gone wrong. Api returned " + resp.data.response.status + ".";
- this.throwGeneralAxiosError(error);
- }
- });
+ let resp = await axios.post("https://promosms.com/api/rest/v3_2/sms", data, config);
+
+ if (resp.data.response.status !== 0) {
+ let error = "Something gone wrong. Api returned " + resp.data.response.status + ".";
+ this.throwGeneralAxiosError(error);
+ }
return okMsg;
} catch (error) {
From fc8d1e78b6ad60fcc4aaa2cece66fb5eda929734 Mon Sep 17 00:00:00 2001
From: LouisLam
Date: Fri, 8 Oct 2021 20:03:52 +0800
Subject: [PATCH 089/179] [push type] hide upside down mode, apply primary base
url
---
server/check-version.js | 1 -
server/client.js | 22 +++++++++++++++++-----
server/server.js | 9 ++++-----
src/mixins/public.js | 6 +++++-
src/pages/EditMonitor.vue | 4 ++--
5 files changed, 28 insertions(+), 14 deletions(-)
diff --git a/server/check-version.js b/server/check-version.js
index 0da1e3481..2ab5fe514 100644
--- a/server/check-version.js
+++ b/server/check-version.js
@@ -1,6 +1,5 @@
const { setSetting } = require("./util-server");
const axios = require("axios");
-const { isDev } = require("../src/util");
exports.version = require("../package.json").version;
exports.latestVersion = null;
diff --git a/server/client.js b/server/client.js
index e83d1f59a..c7b3bc162 100644
--- a/server/client.js
+++ b/server/client.js
@@ -4,6 +4,8 @@
const { TimeLogger } = require("../src/util");
const { R } = require("redbean-node");
const { io } = require("./server");
+const { setting } = require("./util-server");
+const checkVersion = require("./check-version");
async function sendNotificationList(socket) {
const timeLogger = new TimeLogger();
@@ -14,10 +16,10 @@ async function sendNotificationList(socket) {
]);
for (let bean of list) {
- result.push(bean.export())
+ result.push(bean.export());
}
- io.to(socket.userID).emit("notificationList", result)
+ io.to(socket.userID).emit("notificationList", result);
timeLogger.print("Send Notification List");
@@ -39,7 +41,7 @@ async function sendHeartbeatList(socket, monitorID, toUser = false, overwrite =
LIMIT 100
`, [
monitorID,
- ])
+ ]);
let result = list.reverse();
@@ -69,7 +71,7 @@ async function sendImportantHeartbeatList(socket, monitorID, toUser = false, ove
LIMIT 500
`, [
monitorID,
- ])
+ ]);
timeLogger.print(`[Monitor: ${monitorID}] sendImportantHeartbeatList`);
@@ -81,8 +83,18 @@ async function sendImportantHeartbeatList(socket, monitorID, toUser = false, ove
}
+async function sendInfo(socket) {
+ socket.emit("info", {
+ version: checkVersion.version,
+ latestVersion: checkVersion.latestVersion,
+ primaryBaseURL: await setting("primaryBaseURL")
+ });
+}
+
module.exports = {
sendNotificationList,
sendImportantHeartbeatList,
sendHeartbeatList,
-}
+ sendInfo
+};
+
diff --git a/server/server.js b/server/server.js
index 55448a79a..ed6fa6df7 100644
--- a/server/server.js
+++ b/server/server.js
@@ -90,7 +90,7 @@ const io = new Server(server);
module.exports.io = io;
// Must be after io instantiation
-const { sendNotificationList, sendHeartbeatList, sendImportantHeartbeatList } = require("./client");
+const { sendNotificationList, sendHeartbeatList, sendImportantHeartbeatList, sendInfo } = require("./client");
const { statusPageSocketHandler } = require("./socket-handlers/status-page-socket-handler");
app.use(express.json());
@@ -180,10 +180,7 @@ exports.entryPage = "dashboard";
console.log("Adding socket handler");
io.on("connection", async (socket) => {
- socket.emit("info", {
- version: checkVersion.version,
- latestVersion: checkVersion.latestVersion,
- });
+ sendInfo(socket);
totalClient++;
@@ -870,6 +867,8 @@ exports.entryPage = "dashboard";
msg: "Saved"
});
+ sendInfo(socket);
+
} catch (e) {
callback({
ok: false,
diff --git a/src/mixins/public.js b/src/mixins/public.js
index ba8457a04..a3e12f460 100644
--- a/src/mixins/public.js
+++ b/src/mixins/public.js
@@ -38,11 +38,15 @@ export default {
},
baseURL() {
+ if (this.$root.info.primaryBaseURL) {
+ return this.$root.info.primaryBaseURL;
+ }
+
if (env === "development" || localStorage.dev === "dev") {
return axios.defaults.baseURL;
} else {
return location.protocol + "//" + location.host;
}
- }
+ },
}
};
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 6a72dc82e..b0b0012f2 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -131,7 +131,7 @@
- {{ $t("Advanced") }}
+ {{ $t("Advanced") }}
@@ -140,7 +140,7 @@
-
+
@@ -93,6 +94,7 @@
+
@@ -270,7 +272,10 @@ export default {
},
tlsInfo() {
- if (this.$root.tlsInfoList[this.monitor.id]) {
+ // Add: this.$root.tlsInfoList[this.monitor.id].certInfo
+ // Fix: TypeError: Cannot read properties of undefined (reading 'validTo')
+ // Reason: TLS Info object format is changed in 1.8.0, if for some reason, it cannot connect to the site after update to 1.8.0, the object is still in the old format.
+ if (this.$root.tlsInfoList[this.monitor.id] && this.$root.tlsInfoList[this.monitor.id].certInfo) {
return this.$root.tlsInfoList[this.monitor.id];
}
From 4169127143bf832e2045b7dc2c6f3f46a3db8d6e Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Sat, 9 Oct 2021 19:17:01 +0800
Subject: [PATCH 097/179] Update FUNDING.yml
---
.github/FUNDING.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index 6e53fa086..d55fbd4fc 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,6 +1,6 @@
# These are supported funding model platforms
-#github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
+github: louislam # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
#patreon: # Replace with a single Patreon username
open_collective: uptime-kuma # Replace with a single Open Collective username
#ko_fi: # Replace with a single Ko-fi username
From 2e95e2016d0663f994f4cae86889012a1d935bc2 Mon Sep 17 00:00:00 2001
From: Kyungyoon Kim
Date: Sat, 9 Oct 2021 05:25:49 -0600
Subject: [PATCH 098/179] Translate to Korean
---
src/languages/ko-KR.js | 146 ++++++++++++++++++++---------------------
1 file changed, 73 insertions(+), 73 deletions(-)
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index 9d5cb5bdf..8ad7e9600 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -108,78 +108,78 @@ export default {
"Repeat Password": "비밀번호 재입력",
respTime: "응답 시간 (ms)",
notAvailableShort: "N/A",
- Create: "Create",
- clearEventsMsg: "Are you sure want to delete all events for this monitor?",
- clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?",
- confirmClearStatisticsMsg: "Are you sure want to delete ALL statistics?",
- "Clear Data": "Clear Data",
- Events: "Events",
- Heartbeats: "Heartbeats",
- "Auto Get": "Auto Get",
- enableDefaultNotificationDescription: "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
- "Default enabled": "Default enabled",
- "Also apply to existing monitors": "Also apply to existing monitors",
- Export: "Export",
- Import: "Import",
- backupDescription: "You can backup all monitors and all notifications into a JSON file.",
- backupDescription2: "PS: History and event data is not included.",
- backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.",
- alertNoFile: "Please select a file to import.",
- alertWrongFileType: "Please select a JSON file.",
- twoFAVerifyLabel: "Please type in your token to verify that 2FA is working",
- tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.",
- confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?",
- confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
- "Apply on all existing monitors": "Apply on all existing monitors",
- "Verify Token": "Verify Token",
- "Setup 2FA": "Setup 2FA",
- "Enable 2FA": "Enable 2FA",
- "Disable 2FA": "Disable 2FA",
- "2FA Settings": "2FA Settings",
- "Two Factor Authentication": "Two Factor Authentication",
- Active: "Active",
- Inactive: "Inactive",
- Token: "Token",
- "Show URI": "Show URI",
- "Clear all statistics": "Clear all Statistics",
- retryCheckEverySecond: "Retry every {0} seconds.",
- importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
- confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.",
- "Heartbeat Retry Interval": "Heartbeat Retry Interval",
- "Import Backup": "Import Backup",
- "Export Backup": "Export Backup",
- "Skip existing": "Skip existing",
- Overwrite: "Overwrite",
- Options: "Options",
- "Keep both": "Keep both",
- Tags: "Tags",
- "Add New below or Select...": "Add New below or Select...",
- "Tag with this name already exist.": "Tag with this name already exist.",
- "Tag with this value already exist.": "Tag with this value already exist.",
- color: "color",
- "value (optional)": "value (optional)",
- Gray: "Gray",
- Red: "Red",
- Orange: "Orange",
- Green: "Green",
- Blue: "Blue",
- Indigo: "Indigo",
- Purple: "Purple",
- Pink: "Pink",
- "Search...": "Search...",
- "Avg. Ping": "Avg. Ping",
- "Avg. Response": "Avg. Response",
- "Entry Page": "Entry Page",
- statusPageNothing: "Nothing here, please add a group or a monitor.",
- "No Services": "No Services",
- "All Systems Operational": "All Systems Operational",
- "Partially Degraded Service": "Partially Degraded Service",
- "Degraded Service": "Degraded Service",
- "Add Group": "Add Group",
- "Add a monitor": "Add a monitor",
- "Edit Status Page": "Edit Status Page",
- "Go to Dashboard": "Go to Dashboard",
- "Status Page": "Status Page",
+ Create: "생성하기",
+ clearEventsMsg: "정말로 이 모니터링부터 모든 이벤트를 제거할까요?",
+ clearHeartbeatsMsg: "정말로 이 모니터링부터 모든 하트비트를 제거할까요?",
+ confirmClearStatisticsMsg: "정말로 모든 통계치를 제거할까요?",
+ "Clear Data": "데이터 클리어",
+ Events: "이벤트",
+ Heartbeats: "하트비트",
+ "Auto Get": "자동 Get",
+ enableDefaultNotificationDescription: "모든 모니터링에 이 알림이 기본값으로 설정될거에요. 각각 모니터링에서 이 알림을 비활성화 할 수 있어요.",
+ "Default enabled": "기본값 ",
+ "Also apply to existing monitors": "기존 모니터링에도 적용되요.",
+ Export: "내보내기",
+ Import: "가져오기",
+ backupDescription: "모든 모니터링과 알림을 JSON 파일 형식에 저장할 수 있어요.",
+ backupDescription2: "(히스토리와 이벤트 데이터는 포함되어 있지 않아요.)",
+ backupDescription3: "알림 토큰과 같은 보안 데이터가 내보내기 파일에 포함되어 있으므로 관리에 주의해주세요.",
+ alertNoFile: "가져오기를 하기 위해 파일을 선택해주세요.",
+ alertWrongFileType: "JSON 파일을 선택해주세요.",
+ twoFAVerifyLabel: "2단계 인증이 정상적으로 등록됬는지 확인하기 위해 토큰을 입력해주세요.",
+ tokenValidSettingsMsg: "토큰이 정상 값 이에요! 2단계 인증 설정을 저장할 수 있어요.",
+ confirmEnableTwoFAMsg: "정말로 2단계 인증을 활성화 할까요?",
+ confirmDisableTwoFAMsg: "정말로 2단계 인증을 비활성화 할까요?",
+ "Apply on all existing monitors": "기존 모니터링에 모두 적용하기",
+ "Verify Token": "토큰 검증",
+ "Setup 2FA": "2단계 인증 설정하기",
+ "Enable 2FA": "2단계 인증 활성화",
+ "Disable 2FA": "2단계 인증 비활성화",
+ "2FA Settings": "2단계 인증 설정",
+ "Two Factor Authentication": "2단계 인증",
+ Active: "활성화",
+ Inactive: "비활성화",
+ Token: "토큰",
+ "Show URI": "URI 보기",
+ "Clear all statistics": "모든 통계치 ",
+ retryCheckEverySecond: "{0} 초마다 재시도",
+ importHandleDescription: "같은 이름을 가진 모든 모니터링 또는 알림들을 건너뛰기를 원하시면, '기존값 건너뛰기'를 눌러주세요. 기존 모니터링과 알림을 지우고 싶으면, '덮어쓰기'를 눌러주세요.",
+ confirmImportMsg: "정말로 백업을 가져올까요? 정확한 백업 설정인지 다시 확인해주세요.",
+ "Heartbeat Retry Interval": "하트비트 재시도 주기",
+ "Import Backup": "백업 가져오기",
+ "Export Backup": "백업 내보내기",
+ "Skip existing": "기존값 건너뛰기",
+ Overwrite: "덮어쓰기",
+ Options: "옵션",
+ "Keep both": "두개 모두 보존",
+ Tags: "태그",
+ "Add New below or Select...": "아래 새롭게 추가 또는 선택...",
+ "Tag with this name already exist.": "같은 태그 이름이 이미 존재해요.",
+ "Tag with this value already exist.": "같은 값을 가진 태그가 이미 존재해요.",
+ color: "색상",
+ "value (optional)": "값 (선택)",
+ Gray: "회색",
+ Red: "빨강색",
+ Orange: "주황색",
+ Green: "초록색",
+ Blue: "파랑색",
+ Indigo: "남색",
+ Purple: "보라색",
+ Pink: "핑크색",
+ "Search...": "검색...",
+ "Avg. Ping": "평균 핑",
+ "Avg. Response": "평균 응답",
+ "Entry Page": "첫 페이지",
+ statusPageNothing: "아무것도 없어요. 새로운 그룹 또는 모니터링을 추가해주세요.",
+ "No Services": "서비스 없음",
+ "All Systems Operational": "모든 시스템 정상",
+ "Partially Degraded Service": "일부 시스템 비정상",
+ "Degraded Service": "모든 시스템 비정상",
+ "Add Group": "그룹 추가",
+ "Add a monitor": "모니터링 추가r",
+ "Edit Status Page": "상태 페이지 수정",
+ "Go to Dashboard": "대쉬보드로 가기",
+ "Status Page": "상태 페이지",
telegram: "Telegram",
webhook: "Webhook",
smtp: "Email (SMTP)",
@@ -194,7 +194,7 @@ export default {
octopush: "Octopush",
promosms: "PromoSMS",
lunasea: "LunaSea",
- apprise: "Apprise (Support 50+ Notification services)",
+ apprise: "Apprise (50개 이상 알림 서비스 )",
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
From 9d7def93a56add3595d1216ddd49166a384a9661 Mon Sep 17 00:00:00 2001
From: MrEddX <66828538+MrEddX@users.noreply.github.com>
Date: Sat, 9 Oct 2021 18:44:12 +0300
Subject: [PATCH 099/179] Update bg-BG.js
---
src/languages/bg-BG.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index 0e915255d..b5118c7e1 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -1,7 +1,7 @@
export default {
languageName: "Български",
- checkEverySecond: "Ще се извършва на всеки {0} секунди.",
- retryCheckEverySecond: "Повторен опит на всеки {0} секунди.",
+ checkEverySecond: "Ще се извършва на всеки {0} секунди",
+ retryCheckEverySecond: "Ще се извършва на всеки {0} секунди",
retriesDescription: "Максимакен брой опити преди услугата да бъде маркирана като недостъпна и да бъде изпратено известие",
ignoreTLSError: "Игнорирай TLS/SSL грешки за HTTPS уебсайтове",
upsideDownModeDescription: "Обърни статуса от достъпен на недостъпен. Ако услугата е достъпна се вижда НЕДОСТЪПНА.",
@@ -28,7 +28,7 @@ export default {
confirmDisableTwoFAMsg: "Сигурни ли сте, че желаете да изключите 2FA?",
Settings: "Настройки",
Dashboard: "Табло",
- "New Update": "Нова актуализация",
+ "New Update": "Налична е актуализация",
Language: "Език",
Appearance: "Изглед",
Theme: "Тема",
@@ -57,7 +57,7 @@ export default {
"Cert Exp.": "Вал. сертификат",
days: "дни",
day: "ден",
- "-day": "-денa",
+ "-day": "-дни",
hour: "час",
"-hour": "-часa",
Response: "Отговор",
From 6fe014fa5e6832be61e8f897011c10e912e0001d Mon Sep 17 00:00:00 2001
From: Robin Schneider <45321827+robinschneider@users.noreply.github.com>
Date: Sat, 9 Oct 2021 18:05:52 +0200
Subject: [PATCH 100/179] Fixed spelling for german language support
Fixed spelling for german language support, hacktoberfest-accepted label woul be appreciated.
---
src/languages/de-DE.js | 34 +++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index 20beb626e..bf2dff8c6 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -2,7 +2,7 @@ export default {
languageName: "Deutsch (Deutschland)",
Settings: "Einstellungen",
Dashboard: "Dashboard",
- "New Update": "Update Verfügbar",
+ "New Update": "Update verfügbar",
Language: "Sprache",
Appearance: "Erscheinung",
Theme: "Thema",
@@ -50,7 +50,7 @@ export default {
Advanced: "Erweitert",
ignoreTLSError: "Ignoriere TLS/SSL Fehler von Webseiten",
"Upside Down Mode": "Umgedrehter Modus",
- upsideDownModeDescription: "Drehe den Modus um, ist der Dienst erreichbar, wird er als Inaktiv angezeigt.",
+ upsideDownModeDescription: "Drehe den Modus um, ist der Dienst erreichbar, wird er als inaktiv angezeigt.",
"Max. Redirects": "Max. Weiterleitungen",
maxRedirectDescription: "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Setzte auf 0, um Weiterleitungen zu deaktivieren.",
"Accepted Status Codes": "Erlaubte HTTP-Statuscodes",
@@ -71,7 +71,7 @@ export default {
"Allow indexing": "Indizierung zulassen",
"Discourage search engines from indexing site": "Halte Suchmaschinen von der Indexierung der Seite ab",
"Change Password": "Passwort ändern",
- "Current Password": "Dezeitiges Passwort",
+ "Current Password": "Derzeitiges Passwort",
"New Password": "Neues Passwort",
"Repeat New Password": "Wiederhole neues Passwort",
passwordNotMatchMsg: "Passwörter stimmen nicht überein. ",
@@ -91,24 +91,24 @@ export default {
Login: "Einloggen",
"No Monitors, please": "Keine Monitore, bitte",
"add one": "hinzufügen",
- "Notification Type": "Benachrichtigungs Dienst",
+ "Notification Type": "Benachrichtigungsdienst",
Email: "E-Mail",
Test: "Test",
"Certificate Info": "Zertifikatsinfo",
keywordDescription: "Suche nach einem Schlüsselwort in der HTML oder JSON Ausgabe. Bitte beachte, es wird in der Groß-/Kleinschreibung unterschieden.",
- deleteMonitorMsg: "Bist du sicher das du den Monitor löschen möchtest?",
+ deleteMonitorMsg: "Bist du sicher, dass du den Monitor löschen möchtest?",
deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
resoverserverDescription: "Cloudflare ist als der Standardserver festgelegt, dieser kann jederzeit geändern werden.",
"Resolver Server": "Auflösungsserver",
rrtypeDescription: "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
"Last Result": "Letztes Ergebnis",
- pauseMonitorMsg: "Bist du sicher das du den Monitor pausieren möchtest?",
- clearEventsMsg: "Bist du sicher das du alle Ereignisse für diesen Monitor löschen möchtest?",
- clearHeartbeatsMsg: "Bist du sicher das du alle Statistiken für diesen Monitor löschen möchtest?",
+ pauseMonitorMsg: "Bist du sicher, dass du den Monitor pausieren möchtest?",
+ clearEventsMsg: "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
+ clearHeartbeatsMsg: "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
"Clear Data": "Lösche Daten",
Events: "Ereignisse",
Heartbeats: "Statistiken",
- confirmClearStatisticsMsg: "Bist du sicher das du ALLE Statistiken löschen möchtest?",
+ confirmClearStatisticsMsg: "Bist du dir wirklich sicher, dass du ALLE Statistiken löschen möchtest?",
"Create your admin account": "Erstelle dein Admin Konto",
"Repeat Password": "Wiederhole das Passwort",
"Resource Record Type": "Resource Record Type",
@@ -124,7 +124,7 @@ export default {
backupDescription: "Es können alle Monitore und Benachrichtigungen in einer JSON-Datei gesichert werden.",
backupDescription2: "PS: Verlaufs- und Ereignisdaten sind nicht enthalten.",
backupDescription3: "Sensible Daten wie Benachrichtigungstoken sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.",
- alertNoFile: "Bitte wähle eine Datei zum importieren aus.",
+ alertNoFile: "Bitte wähle eine Datei zum Importieren aus.",
alertWrongFileType: "Bitte wähle eine JSON Datei aus.",
"Clear all statistics": "Lösche alle Statistiken",
importHandleDescription: "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
@@ -133,14 +133,14 @@ export default {
Options: "Optionen",
confirmImportMsg: "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import Option ausgewählt ist.",
"Keep both": "Beide behalten",
- twoFAVerifyLabel: "Bitte trage deinen Token ein um zu verifizieren das 2FA funktioniert",
+ twoFAVerifyLabel: "Bitte trage deinen Token ein, um zu verifizieren das 2FA funktioniert",
"Verify Token": "Token verifizieren",
"Setup 2FA": "2FA Einrichten",
"Enable 2FA": "2FA Aktivieren",
"Disable 2FA": "2FA deaktivieren",
"2FA Settings": "2FA Einstellungen",
- confirmEnableTwoFAMsg: "Bist du sicher das du 2FA aktivieren möchtest?",
- confirmDisableTwoFAMsg: "Bist du sicher das du 2FA deaktivieren möchtest?",
+ confirmEnableTwoFAMsg: "Bist du sicher, dass du 2FA aktivieren möchtest?",
+ confirmDisableTwoFAMsg: "Bist du sicher, dass du 2FA deaktivieren möchtest?",
tokenValidSettingsMsg: "Token gültig! Du kannst jetzt die 2FA Einstellungen speichern.",
"Two Factor Authentication": "Zwei Faktor Authentifizierung",
Active: "Aktiv",
@@ -162,7 +162,7 @@ export default {
Purple: "Lila",
Pink: "Pink",
"Search...": "Suchen...",
- "Heartbeat Retry Interval": "Takt-Wiederholungsintervall",
+ "Heartbeat Retry Interval": "Heartbeat-Wiederholungsintervall",
retryCheckEverySecond: "Versuche alle {0} Sekunden",
"Import Backup": "Import Backup",
"Export Backup": "Export Backup",
@@ -178,10 +178,10 @@ export default {
"Add a monitor": "Monitor hinzufügen",
"Edit Status Page": "Bearbeite Statusseite",
"Go to Dashboard": "Gehe zum Dashboard",
- "Status Page": "Status Page",
+ "Status Page": "Status Seite",
telegram: "Telegram",
webhook: "Webhook",
- smtp: "Email (SMTP)",
+ smtp: "E-Mail (SMTP)",
discord: "Discord",
teams: "Microsoft Teams",
signal: "Signal",
@@ -193,7 +193,7 @@ export default {
octopush: "Octopush",
promosms: "PromoSMS",
lunasea: "LunaSea",
- apprise: "Apprise (Support 50+ Notification services)",
+ apprise: "Apprise (Unterstützung für 50+ Benachrichtigungsdienste)",
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
From 5c8956265048aee726f236bd83b4988a592242f4 Mon Sep 17 00:00:00 2001
From: LouisLam
Date: Sun, 10 Oct 2021 02:23:27 +0800
Subject: [PATCH 101/179] not allow lower than 20s for demo mode
---
server/model/monitor.js | 8 ++++++++
server/server.js | 3 ++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index a50baccfd..b7b24971b 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -11,6 +11,7 @@ const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalCli
const { R } = require("redbean-node");
const { BeanModel } = require("redbean-node/dist/bean-model");
const { Notification } = require("../notification");
+const { demoMode } = require("../server");
const version = require("../../package.json").version;
/**
@@ -334,6 +335,13 @@ class Monitor extends BeanModel {
previousBeat = bean;
if (! this.isStop) {
+
+ if (demoMode) {
+ if (beatInterval < 20) {
+ beatInterval = 20;
+ }
+ }
+
this.heartbeatInterval = setTimeout(beat, beatInterval * 1000);
}
diff --git a/server/server.js b/server/server.js
index ddd686951..984e73ad1 100644
--- a/server/server.js
+++ b/server/server.js
@@ -66,12 +66,13 @@ const sslCert = process.env.SSL_CERT || args["ssl-cert"] || undefined;
// Demo Mode?
const demoMode = args["demo"] || false;
+exports.demoMode = demoMode;
if (demoMode) {
console.log("==== Demo Mode ====");
}
-console.log("Creating express and socket.io instance")
+console.log("Creating express and socket.io instance");
const app = express();
let server;
From 5e3ea3293c5d1f37ba65ab94182075b788608b45 Mon Sep 17 00:00:00 2001
From: Lukas <35193662+NixNotCastey@users.noreply.github.com>
Date: Sat, 9 Oct 2021 20:32:45 +0200
Subject: [PATCH 102/179] Very basic email subject customization
---
server/notification-providers/smtp.js | 10 +++++++++-
src/components/notifications/SMTP.vue | 5 +++++
src/languages/en.js | 1 +
3 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/server/notification-providers/smtp.js b/server/notification-providers/smtp.js
index ecb583eb7..e5fd53e46 100644
--- a/server/notification-providers/smtp.js
+++ b/server/notification-providers/smtp.js
@@ -20,6 +20,14 @@ class SMTP extends NotificationProvider {
pass: notification.smtpPassword,
};
}
+ // Lets start with default subject
+ let subject = msg;
+ // Our subject cannot end with whitespace it's often raise spam score
+ let customsubject = notification.customsubject.trim()
+ // If custom subject is not empty, change subject for notification
+ if (customsubject !== "") {
+ subject = customsubject
+ }
let transporter = nodemailer.createTransport(config);
@@ -34,7 +42,7 @@ class SMTP extends NotificationProvider {
cc: notification.smtpCC,
bcc: notification.smtpBCC,
to: notification.smtpTo,
- subject: msg,
+ subject: subject,
text: bodyTextContent,
tls: {
rejectUnauthorized: notification.smtpIgnoreTLSError || false,
diff --git a/src/components/notifications/SMTP.vue b/src/components/notifications/SMTP.vue
index 72934cdaf..165d39c67 100644
--- a/src/components/notifications/SMTP.vue
+++ b/src/components/notifications/SMTP.vue
@@ -43,6 +43,11 @@
+
+ {{ $t("Custom Email subject") }}
+
+
+
{{ $t("To Email") }}
diff --git a/src/languages/en.js b/src/languages/en.js
index 2ce8f46be..b59cdb73f 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -201,6 +201,7 @@ export default {
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Ignore TLS Error",
"From Email": "From Email",
+ "Custom Email subject": "Custom Email Subject (leave blank for default one)",
"To Email": "To Email",
smtpCC: "CC",
smtpBCC: "BCC",
From 56ae6f6117809d5d4c552ce3a5cfb50abed7b388 Mon Sep 17 00:00:00 2001
From: LouisLam
Date: Sun, 10 Oct 2021 02:36:20 +0800
Subject: [PATCH 103/179] fix demoMode export
---
server/model/monitor.js | 1 +
server/server.js | 16 ++++++++--------
2 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index b7b24971b..3c9e79b54 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -338,6 +338,7 @@ class Monitor extends BeanModel {
if (demoMode) {
if (beatInterval < 20) {
+ console.log("beat interval too low, reset to 20s");
beatInterval = 20;
}
}
diff --git a/server/server.js b/server/server.js
index 984e73ad1..cdbb447a7 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1,12 +1,18 @@
console.log("Welcome to Uptime Kuma");
+const args = require("args-parser")(process.argv);
+const { sleep, debug, getRandomInt } = require("../src/util");
+
+debug(args);
if (! process.env.NODE_ENV) {
process.env.NODE_ENV = "production";
}
-console.log("Node Env: " + process.env.NODE_ENV);
+// Demo Mode?
+const demoMode = args["demo"] || false;
+exports.demoMode = demoMode;
-const { sleep, debug, TimeLogger, getRandomInt } = require("../src/util");
+console.log("Node Env: " + process.env.NODE_ENV);
console.log("Importing Node libraries");
const fs = require("fs");
@@ -50,8 +56,6 @@ const { basicAuth } = require("./auth");
const { login } = require("./auth");
const passwordHash = require("./password-hash");
-const args = require("args-parser")(process.argv);
-
const checkVersion = require("./check-version");
console.info("Version: " + checkVersion.version);
@@ -64,10 +68,6 @@ const port = parseInt(process.env.PORT || args.port || 3001);
const sslKey = process.env.SSL_KEY || args["ssl-key"] || undefined;
const sslCert = process.env.SSL_CERT || args["ssl-cert"] || undefined;
-// Demo Mode?
-const demoMode = args["demo"] || false;
-exports.demoMode = demoMode;
-
if (demoMode) {
console.log("==== Demo Mode ====");
}
From 792f3c7c5c17a2db80e7f9638e272b4607f3d4c6 Mon Sep 17 00:00:00 2001
From: Lukas <35193662+NixNotCastey@users.noreply.github.com>
Date: Sat, 9 Oct 2021 21:48:28 +0200
Subject: [PATCH 104/179] Add support for values of Name, Hostname and Status
---
server/notification-providers/smtp.js | 30 +++++++++++++++++++++++++++
src/components/notifications/SMTP.vue | 4 ++--
src/languages/en.js | 2 +-
3 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/server/notification-providers/smtp.js b/server/notification-providers/smtp.js
index e5fd53e46..2bbec5848 100644
--- a/server/notification-providers/smtp.js
+++ b/server/notification-providers/smtp.js
@@ -22,10 +22,40 @@ class SMTP extends NotificationProvider {
}
// Lets start with default subject
let subject = msg;
+
// Our subject cannot end with whitespace it's often raise spam score
let customsubject = notification.customsubject.trim()
+
// If custom subject is not empty, change subject for notification
if (customsubject !== "") {
+
+ // Replace "MACROS" with coresponding variable
+ let replaceName = new RegExp("{NAME}", "g");
+ let replaceHostname = new RegExp("{HOSTNAME}", "g");
+ let replaceStatus = new RegExp("{STATUS}", "g");
+
+ let serviceStatus;
+
+ if (monitorJSON !== null) {
+ customsubject = customsubject.replace(replaceName,monitorJSON["name"]);
+ customsubject = customsubject.replace(replaceHostname,monitorJSON["hostname"]);
+ } else {
+ // Insert dummy values during test
+ customsubject = customsubject.replace(replaceName,"Test");
+ customsubject = customsubject.replace(replaceHostname,"example.com");
+ }
+ if (heartbeatJSON !== null) {
+ if (heartbeatJSON["status"] === 0) {
+ serviceStatus = "🔴 Down"
+ } else {
+ serviceStatus = "✅ Up"
+ }
+ customsubject = customsubject.replace(replaceStatus,serviceStatus);
+ } else {
+ // Insert dummy values during test
+ customsubject = customsubject.replace(replaceStatus,"TEST");
+ }
+
subject = customsubject
}
diff --git a/src/components/notifications/SMTP.vue b/src/components/notifications/SMTP.vue
index 165d39c67..01bdf8607 100644
--- a/src/components/notifications/SMTP.vue
+++ b/src/components/notifications/SMTP.vue
@@ -44,8 +44,8 @@
- {{ $t("Custom Email subject") }}
-
+ {{ $t("Email Subject") }}
+
diff --git a/src/languages/en.js b/src/languages/en.js
index b59cdb73f..0e8e92302 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -201,7 +201,7 @@ export default {
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Ignore TLS Error",
"From Email": "From Email",
- "Custom Email subject": "Custom Email Subject (leave blank for default one)",
+ "Email Subject": "Subject (leave blank for default one)",
"To Email": "To Email",
smtpCC: "CC",
smtpBCC: "BCC",
From d6f7be91123450f830deab62e8f9b4a119649e6c Mon Sep 17 00:00:00 2001
From: Lukas <35193662+NixNotCastey@users.noreply.github.com>
Date: Sun, 10 Oct 2021 00:38:19 +0200
Subject: [PATCH 105/179] Translated all missing texts and updated few of
previously translated.
---
src/languages/pl.js | 237 ++++++++++++++++++++++++++++++--------------
1 file changed, 160 insertions(+), 77 deletions(-)
diff --git a/src/languages/pl.js b/src/languages/pl.js
index 05101c6aa..2b083527c 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -1,38 +1,49 @@
export default {
languageName: "Polski",
- checkEverySecond: "Sprawdzam co {0} sekund.",
- retriesDescription: "Maksymalna liczba powtórzeń, zanim usługa zostanie oznaczona jako wyłączona i zostanie wysłane powiadomienie",
+ checkEverySecond: "Sprawdzaj co {0} sekund",
+ retryCheckEverySecond: "Ponawiaj co {0} sekund",
+ retriesDescription: "Maksymalna liczba powtórzeń, zanim usługa zostanie oznaczona jako niedostępna i zostanie wysłane powiadomienie",
ignoreTLSError: "Ignoruj błąd TLS/SSL dla stron HTTPS",
upsideDownModeDescription: "Odwróć status do góry nogami. Jeśli usługa jest osiągalna, to jest oznaczona jako niedostępna.",
maxRedirectDescription: "Maksymalna liczba przekierowań do wykonania. Ustaw na 0, aby wyłączyć przekierowania.",
- acceptedStatusCodesDescription: "Wybierz kody stanu, które są uważane za udaną odpowiedź.",
+ acceptedStatusCodesDescription: "Wybierz kody stanu, które są uważane za prawidłową odpowiedź.",
passwordNotMatchMsg: "Powtórzone hasło nie pasuje.",
- notificationDescription: "Proszę przypisać powiadomienie do monitora(ów), aby zadziałało.",
+ notificationDescription: "Proszę przypisać powiadomienie do monitora(ów), aby działało.",
keywordDescription: "Wyszukiwanie słów kluczowych w zwykłym html lub odpowiedzi JSON. Wielkość liter ma znaczenie.",
- pauseDashboardHome: "Pauza",
+ pauseDashboardHome: "Wstrzymaj",
deleteMonitorMsg: "Czy na pewno chcesz usunąć ten monitor?",
deleteNotificationMsg: "Czy na pewno chcesz usunąć to powiadomienie dla wszystkich monitorów?",
resoverserverDescription: "Cloudflare jest domyślnym serwerem, możesz zmienić serwer resolver w każdej chwili.",
- rrtypeDescription: "Wybierz RR-Type który chcesz monitorować",
- pauseMonitorMsg: "Czy na pewno chcesz wstrzymać?",
+ rrtypeDescription: "Wybierz rodzaj rekordu, który chcesz monitorować.",
+ pauseMonitorMsg: "Czy na pewno chcesz wstrzymać monitorowanie?",
+ enableDefaultNotificationDescription: "Dla każdego nowego monitora to powiadomienie będzie domyślnie włączone. Nadal możesz wyłączyć powiadomienia osobno dla każdego monitora.",
+ clearEventsMsg: "Jesteś pewien, że chcesz wyczyścić historię zdarzeń dla tego monitora?",
+ clearHeartbeatsMsg: "Jesteś pewien, że chcesz wyczyścić historię bicia serca dla tego monitora?",
+ confirmClearStatisticsMsg: "Jesteś pewien, że chcesz usunąć WSZYSTKIE statystyki?",
+ importHandleDescription: "Wybierz 'Pomiń istniejące', jeśli chcesz pominąć każdy monitor lub powiadomienie o tej samej nazwie. 'Nadpisz' spowoduje usunięcie każdego istniejącego monitora i powiadomienia.",
+ confirmImportMsg: "Czy na pewno chcesz zaimportować kopię zapasową? Upewnij się, że wybrałeś właściwą opcję importu.",
+ twoFAVerifyLabel: "Proszę podaj swój token 2FA, aby sprawdzić czy 2FA działa.",
+ tokenValidSettingsMsg: "Token jest prawdiłowy! Teraz możesz zapisać ustawienia 2FA.",
+ confirmEnableTwoFAMsg: "Jesteś pewien, że chcesz włączyć 2FA?",
+ confirmDisableTwoFAMsg: "Jesteś pewien, że chcesz wyłączyć 2FA?",
Settings: "Ustawienia",
Dashboard: "Panel",
- "New Update": "Nowa aktualizacja",
+ "New Update": "Nowa Aktualizacja",
Language: "Język",
Appearance: "Wygląd",
Theme: "Motyw",
General: "Ogólne",
Version: "Wersja",
- "Check Update On GitHub": "Sprawdź aktualizację na GitHub.",
+ "Check Update On GitHub": "Sprawdź aktualizację na GitHub",
List: "Lista",
Add: "Dodaj",
- "Add New Monitor": "Dodaj nowy monitor",
- "Quick Stats": "Szybkie statystyki",
+ "Add New Monitor": "Dodaj Monitor",
+ "Quick Stats": "Szybki podgląd statystyk",
Up: "Online",
Down: "Offline",
- Pending: "Oczekujący",
+ Pending: "Oczekuje",
Unknown: "Nieznane",
- Pause: "Pauza",
+ Pause: "Wstrzymane",
Name: "Nazwa",
Status: "Status",
DateTime: "Data i godzina",
@@ -41,42 +52,43 @@ export default {
Resume: "Wznów",
Edit: "Edytuj",
Delete: "Usuń",
- Current: "aktualny",
- Uptime: "Czas pracy",
- "Cert Exp.": "Wygaśnięcie certyfikatu",
+ Current: "Aktualny",
+ Uptime: "Czas Pracy",
+ "Cert Exp.": "Certyfikat Wygasa",
days: "dni",
day: "dzień",
"-day": " dni",
hour: "godzina",
- "-hour": " godziny",
+ "-hour": " godzin",
Response: "Odpowiedź",
Ping: "Ping",
- "Monitor Type": "Typ monitora",
+ "Monitor Type": "Rodzaj Monitora",
Keyword: "Słowo kluczowe",
- "Friendly Name": "Przyjazna nazwa",
+ "Friendly Name": "Przyjazna Nazwa",
URL: "URL",
- Hostname: "Nazwa hosta",
+ Hostname: "Hostname",
Port: "Port",
- "Heartbeat Interval": "Interwał bicia serca",
+ "Heartbeat Interval": "Czętotliwość bicia serca",
Retries: "Prób",
+ "Heartbeat Retry Interval": "Częstotliwość ponawiania bicia serca",
Advanced: "Zaawansowane",
- "Upside Down Mode": "Tryb do góry nogami",
- "Max. Redirects": "Maks. przekierowania",
+ "Upside Down Mode": "Tryb odwrócony",
+ "Max. Redirects": "Maks. Przekierowań",
"Accepted Status Codes": "Akceptowane kody statusu",
Save: "Zapisz",
Notifications: "Powiadomienia",
"Not available, please setup.": "Niedostępne, proszę skonfigurować.",
- "Setup Notification": "Konfiguracja powiadomień",
+ "Setup Notification": "Skonfiguruj Powiadomienie",
Light: "Jasny",
Dark: "Ciemny",
Auto: "Automatyczny",
"Theme - Heartbeat Bar": "Motyw - pasek bicia serca",
- Normal: "Normalne",
+ Normal: "Domyślne",
Bottom: "Na dole",
None: "Brak",
Timezone: "Strefa czasowa",
"Search Engine Visibility": "Widoczność w wyszukiwarce",
- "Allow indexing": "Pozwól na indeksowanie",
+ "Allow indexing": "Zezwól na indeksowanie",
"Discourage search engines from indexing site": "Zniechęcaj wyszukiwarki do indeksowania strony",
"Change Password": "Zmień hasło",
"Current Password": "Aktualne hasło",
@@ -84,54 +96,52 @@ export default {
"Repeat New Password": "Powtórz nowe hasło",
"Update Password": "Zaktualizuj hasło",
"Disable Auth": "Wyłącz autoryzację",
- "Enable Auth": "Włącz autoryzację ",
- Logout: "Wyloguj się",
+ "Enable Auth": "Włącz autoryzację",
+ Logout: "Wyloguj",
Leave: "Zostaw",
"I understand, please disable": "Rozumiem, proszę wyłączyć",
- Confirm: "Potwierdź",
+ Confirm: "Potiwerdź",
Yes: "Tak",
No: "Nie",
Username: "Nazwa użytkownika",
Password: "Hasło",
"Remember me": "Zapamiętaj mnie",
- Login: "Zaloguj się",
+ Login: "Zaloguj",
"No Monitors, please": "Brak monitorów, proszę",
- "add one": "dodaj jeden",
- "Notification Type": "Typ powiadomienia",
+ "add one": "dodać jeden",
+ "Notification Type": "Rodzaj powiadomienia",
Email: "Email",
Test: "Test",
"Certificate Info": "Informacje o certyfikacie",
- "Resolver Server": "Server resolver",
+ "Resolver Server": "Serwer rozwiązywania nazw",
"Resource Record Type": "Typ rekordu zasobów",
"Last Result": "Ostatni wynik",
"Create your admin account": "Utwórz swoje konto administratora",
"Repeat Password": "Powtórz hasło",
- respTime: "Czas odp. (ms)",
- notAvailableShort: "N/A",
- Create: "Stwórz",
- clearEventsMsg: "Jesteś pewien, że chcesz usunąć wszystkie monitory dla tej strony?",
- clearHeartbeatsMsg: "Jesteś pewien, że chcesz usunąć wszystkie bicia serca dla tego monitora?",
- confirmClearStatisticsMsg: "Jesteś pewien, że chcesz usunąć WSZYSTKIE statystyki?",
- "Clear Data": "Usuń dane",
- Events: "Wydarzenia",
- Heartbeats: "Bicia serca",
- "Auto Get": "Pobierz automatycznie",
- enableDefaultNotificationDescription: "Dla każdego nowego monitora to powiadomienie będzie domyślnie włączone. Nadal możesz wyłączyć powiadomienia osobno dla każdego monitora.",
- "Default enabled": "Domyślnie włączone",
- "Also apply to existing monitors": "Również zastosuj do obecnych monitorów",
+ "Import Backup": "Importuj Kopię",
+ "Export Backup": "Eksportuj Kopię",
Export: "Eksportuj",
Import: "Importuj",
+ respTime: "Czas Odp. (ms)",
+ notAvailableShort: "N/A",
+ "Default enabled": "Włącz domyślnie",
+ "Apply on all existing monitors": "Zastosuj do istniejących monitorów",
+ Create: "Stwórz",
+ "Clear Data": "Usuń Dane",
+ Events: "Wydarzenia",
+ Heartbeats: "Bicia serca",
+ "Auto Get": "Wykryj",
backupDescription: "Możesz wykonać kopię zapasową wszystkich monitorów i wszystkich powiadomień do pliku JSON.",
backupDescription2: "PS: Historia i dane zdarzeń nie są uwzględniane.",
backupDescription3: "Poufne dane, takie jak tokeny powiadomień, są zawarte w pliku eksportu, prosimy o ostrożne przechowywanie.",
- alertNoFile: "Proszę wybrać plik do importu.",
+ alertNoFile: "Wybierz plik do importu.",
alertWrongFileType: "Proszę wybrać plik JSON.",
- twoFAVerifyLabel: "Proszę podaj swój token 2FA, aby sprawdzić czy 2FA działa",
- tokenValidSettingsMsg: "Token jest poprawny! Możesz teraz zapisać ustawienia 2FA.",
- confirmEnableTwoFAMsg: "Jesteś pewien że chcesz włączyć 2FA?",
- confirmDisableTwoFAMsg: "Jesteś pewien że chcesz wyłączyć 2FA?",
- "Apply on all existing monitors": "Zastosuj do wszystki obecnych monitorów",
- "Verify Token": "Weryfikuj token",
+ "Clear all statistics": "Wyczyść wszystkie statystyki",
+ "Skip existing": "Pomiń istniejące",
+ Overwrite: "Nadpisz",
+ Options: "Opcje",
+ "Keep both": "Zachowaj oba",
+ "Verify Token": "Zweryfikuj token",
"Setup 2FA": "Konfiguracja 2FA",
"Enable 2FA": "Włącz 2FA",
"Disable 2FA": "Wyłącz 2FA",
@@ -141,17 +151,6 @@ export default {
Inactive: "Wyłączone",
Token: "Token",
"Show URI": "Pokaż URI",
- "Clear all statistics": "Wyczyść wszystkie statystyki",
- retryCheckEverySecond: "Ponawiaj co {0} sekund.",
- importHandleDescription: "Wybierz 'Pomiń istniejące', jeśli chcesz pominąć każdy monitor lub powiadomienie o tej samej nazwie. 'Nadpisz' spowoduje usunięcie każdego istniejącego monitora i powiadomienia.",
- confirmImportMsg: "Czy na pewno chcesz zaimportować kopię zapasową? Upewnij się, że wybrałeś właściwą opcję importu.",
- "Heartbeat Retry Interval": "Częstotliwość ponawiania bicia serca",
- "Import Backup": "Importuj kopię zapasową",
- "Export Backup": "Eksportuj kopię zapasową",
- "Skip existing": "Pomiń istniejące",
- Overwrite: "Nadpisz",
- Options: "Opcje",
- "Keep both": "Zachowaj oba",
Tags: "Tagi",
"Add New below or Select...": "Dodaj nowy poniżej lub wybierz...",
"Tag with this name already exist.": "Tag o tej nazwie już istnieje.",
@@ -169,33 +168,117 @@ export default {
"Search...": "Szukaj...",
"Avg. Ping": "Średni ping",
"Avg. Response": "Średnia odpowiedź",
- "Entry Page": "Strona główna",
+ "Entry Page": "Strona startowa",
statusPageNothing: "Nic tu nie ma, dodaj grupę lub monitor.",
"No Services": "Brak usług",
- "All Systems Operational": "Wszystkie systemy działają",
- "Partially Degraded Service": "Częściowy błąd usługi",
- "Degraded Service": "Błąd usługi",
+ "All Systems Operational": "Wszystkie systemy działają poprawnie",
+ "Partially Degraded Service": "Część usług nie działa",
+ "Degraded Service": "Usługa nie działa",
"Add Group": "Dodaj grupę",
"Add a monitor": "Dodaj monitor",
"Edit Status Page": "Edytuj stronę statusu",
"Go to Dashboard": "Idź do panelu",
"Status Page": "Strona statusu",
- telegram: "Telegram",
- webhook: "Webhook",
- smtp: "Email (SMTP)",
- discord: "Discord",
- teams: "Microsoft Teams",
- signal: "Signal",
- gotify: "Gotify",
- slack: "Slack",
+ // Start notification form
+ defaultNotificationName: "Moje powiadomienie {notification} ({number})",
+ here: "tutaj",
+ "Required": "Wymagane",
+ "telegram": "Telegram",
+ "Bot Token": "Token Bota",
+ "You can get a token from": "Token można uzyskać z",
+ "Chat ID": "Identyfikator Czatu",
+ supportTelegramChatID: "Czat wsprarcia technicznego / Bezpośrednia Rozmowa / Czat Grupowy",
+ wayToGetTelegramChatID: "Możesz uzyskać swój identyfikator czatu, wysyłając wiadomość do bota i przechodząc pod ten adres URL, aby wyświetlić identyfikator czatu:",
+ "YOUR BOT TOKEN HERE": "TWOJ TOKEN BOTA",
+ chatIDNotFound: "Identyfikator czatu nie znaleziony, najpierw napisz do bota",
+ "webhook": "Webhook",
+ "Post URL": "Adres URL",
+ "Content Type": "Rodzaj danych",
+ webhookJsonDesc: "{0} jest dobry w przypadku serwerów HTTP, takich jak express.js",
+ webhookFormDataDesc: "{multipart} jest dobry dla PHP, musisz jedynie przetowrzyć dane przez {decodeFunction}",
+ "smtp": "Email (SMTP)",
+ secureOptionNone: "Brak / STARTTLS (25, 587)",
+ secureOptionTLS: "TLS (465)",
+ "Ignore TLS Error": "Zignrouj Błędy TLS",
+ "From Email": "Nadawca (OD)",
+ "To Email": "Odbiorca (DO)",
+ smtpCC: "DW",
+ smtpBCC: "UDW",
+ "discord": "Discord",
+ "Discord Webhook URL": "URL Webhook Discorda",
+ wayToGetDiscordURL: "Możesz go uzyskać przechodząc do Ustawienia Serwera -> Integracje -> Tworzenie Webhooka",
+ "Bot Display Name": "Wyświetlana Nazwa Bota",
+ "Prefix Custom Message": "Własny Początek Wiadomości",
+ "Hello @everyone is...": "Hej {'@'}everyone ...",
+ "teams": "Microsoft Teams",
+ "Webhook URL": "URL Webhooka",
+ wayToGetTeamsURL: "You can learn how to create a webhook url {0}.",
+ "signal": "Signal",
+ "Number": "Numer",
+ "Recipients": "Odbiorcy",
+ needSignalAPI: "Musisz posiadać klienta Signal z REST API.",
+ wayToCheckSignalURL: "W celu dowiedzenia się, jak go skonfigurować, odwiedź poniższy link:",
+ signalImportant: "UWAGA: Nie można mieszać nazw grup i numerów odbiorców!",
+ "gotify": "Gotify",
+ "Application Token": "Token Aplikacji",
+ "Server URL": "Server URL",
+ "Priority": "Priorytet",
+ "slack": "Slack",
+ "Icon Emoji": "Ikona Emoji",
+ "Channel Name": "Nazwa Kanału",
+ "Uptime Kuma URL": "Adres Uptime Kuma",
+ aboutWebhooks: "Więcej informacji na temat webhooków: {0}",
+ aboutChannelName: "Podaj nazwę kanału {0} w polu Nazwa Kanału, jeśli chcesz pominąć kanał webhooka. Np.: #inny-kanal",
+ aboutKumaURL: "Jeśli pozostawisz pole Adres Uptime Kuma puste, domyślnie będzie to strona projektu na Github.",
+ emojiCheatSheet: "Ściąga Emoji: {0}",
"rocket.chat": "Rocket.chat",
pushover: "Pushover",
pushy: "Pushy",
octopush: "Octopush",
promosms: "PromoSMS",
lunasea: "LunaSea",
- apprise: "Apprise (obsługuje 50+ usług powiadamiania)",
+ apprise: "Apprise (Obsługuje 50+ usług powiadomień)",
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
+ "User Key": "Klucz Użytkownika",
+ "Device": "Urządzenie",
+ "Message Title": "Tytuł Wiadomości",
+ "Notification Sound": "Dźwięk Powiadomienia",
+ "More info on:": "Więcej informacji na: {0}",
+ pushoverDesc1: "Priorytet awaryjny (2) ma domyślny 30-sekundowy limit czasu między kolejnymi próbami i wygaśnie po 1 godzinie.",
+ pushoverDesc2: "Jeśli chcesz wysyłać powiadomienia na różne urządzenia, wypełnij pole Urządzenie.",
+ "SMS Type": "Rodzaj SMS",
+ octopushTypePremium: "Premium (Szybki - rekomendowany dla powiadomień)",
+ octopushTypeLowCost: "Low Cost (Wolny, czasami blokowany przez operatorów)",
+ "Check octopush prices": "Sprawdź ceny Octopush {0}.",
+ octopushPhoneNumber: "Numer Telefonu (Format międzynarodowy np.: +33612345678)",
+ octopushSMSSender: "Nadawca SMS : 3-11 znaków alfanumerycznych i spacji (a-zA-Z0-9)",
+ "LunaSea Device ID": "Idetyfikator Urządzenia LunaSea",
+ "Apprise URL": "URL Apprise",
+ "Example:": "Przykład: {0}",
+ "Read more:": "Czytaj Dalej: {0}",
+ "Status:": "Status: {0}",
+ "Read more": "Czytaj dalej",
+ appriseInstalled: "Apprise jest zostało zainstalowane.",
+ appriseNotInstalled: "Apprise nie zostało zainstalowane. {0}",
+ "Access Token": "Token Dostępu",
+ "Channel access token": "Token Dostępu Kanału",
+ "Line Developers Console": "Konsola Dewelopersja Line",
+ lineDevConsoleTo: "Konsola Dewelopersja Line - {0}",
+ "Basic Settings": "Ustawienia Ogólne",
+ "User ID": "Idetyfikator Użytkownika",
+ "Messaging API": "API Wiadomości",
+ wayToGetLineChannelToken: "Najpierw uzyskaj dostęp do {0}, utwórz dostawcę i kanał (Messaging API), a następnie możesz uzyskać token dostępu do kanału i identyfikator użytkownika z wyżej wymienionych pozycji menu.",
+ "Icon URL": "Adres Ikony",
+ aboutIconURL: "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
+ aboutMattermostChannelName: "You can override the default channel that webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in Mattermost webhook settings. Ex: #other-channel",
+ "matrix": "Matrix",
+ promosmsTypeEco: "SMS ECO - Tanie, lecz wolne. Dostępne tylko w Polsce",
+ promosmsTypeFlash: "SMS FLASH - Wiadomość automatycznie wyświetli się na urządzeniu. Dostępne tylko w Polsce.",
+ promosmsTypeFull: "SMS FULL - Szybkie i dostępne międzynarodowo. Wersja premium usługi, która pozwala min. ustawić własną nazwę nadawcy.",
+ promosmsTypeFull: "SMS SPEED - Wysyłka priorytetowa, posiada wszystkie zalety SMS FULL",
+ promosmsPhoneNumber: "Numer Odbiorcy",
+ promosmsSMSSender: "Nadawca SMS (Wcześniej zatwierdzone nazwy z panelu PromoSMS)",
+ // End notification form
};
From 54f864a1bb868c49955086b7b790eab3537ae02e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=96=B0=E9=80=B8Cary?=
Date: Sun, 10 Oct 2021 10:04:07 +0800
Subject: [PATCH 106/179] =?UTF-8?q?Update=20Simplified=20Chinese=20Languag?=
=?UTF-8?q?e=EF=BC=88=E6=9B=B4=E6=96=B0=E7=AE=80=E4=BD=93=E4=B8=AD?=
=?UTF-8?q?=E6=96=87=E8=AF=AD=E8=A8=80=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/languages/zh-CN.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
index 40db94e23..a7f81950a 100644
--- a/src/languages/zh-CN.js
+++ b/src/languages/zh-CN.js
@@ -179,7 +179,7 @@ export default {
"Add a monitor": "添加监控项",
"Edit Status Page": "编辑状态页",
"Go to Dashboard": "前往仪表盘",
- "Status Page": "Status Page",
+ "Status Page": "状态页",
telegram: "Telegram",
webhook: "Webhook",
smtp: "Email (SMTP)",
From 93a021d027dca3b3e972e2c95360e86231d9edbb Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Sun, 10 Oct 2021 12:20:15 +0800
Subject: [PATCH 107/179] Update SECURITY.md
---
SECURITY.md | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/SECURITY.md b/SECURITY.md
index d2f000ed4..ae052e207 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -5,11 +5,23 @@
Use this section to tell people about which versions of your project are
currently being supported with security updates.
+#### Uptime Kuma Version:
| Version | Supported |
| ------- | ------------------ |
| 1.7.X | :white_check_mark: |
| < 1.7 | ❌ |
+#### Upgradable Docker Tag:
+| Tag | Supported |
+| ------- | ------------------ |
+| 1 | :white_check_mark: |
+| 1-debian | :white_check_mark: |
+| 1-alpine | :white_check_mark: |
+| latest | :white_check_mark: |
+| debian | :white_check_mark: |
+| alpine | :white_check_mark: |
+| All other tags | ❌ |
+
## Reporting a Vulnerability
Please report security issues to uptime@kuma.pet.
From d6753b883376ced8517fc8b3517e4464ce8f7bea Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Sun, 10 Oct 2021 12:20:29 +0800
Subject: [PATCH 108/179] Update SECURITY.md
---
SECURITY.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/SECURITY.md b/SECURITY.md
index ae052e207..4a2857238 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -5,13 +5,13 @@
Use this section to tell people about which versions of your project are
currently being supported with security updates.
-#### Uptime Kuma Version:
+#### Uptime Kuma Versions:
| Version | Supported |
| ------- | ------------------ |
| 1.7.X | :white_check_mark: |
| < 1.7 | ❌ |
-#### Upgradable Docker Tag:
+#### Upgradable Docker Tags:
| Tag | Supported |
| ------- | ------------------ |
| 1 | :white_check_mark: |
From 272d4bde4581d9b977f5fec2fe97186aa1afa0a4 Mon Sep 17 00:00:00 2001
From: LouisLam
Date: Sun, 10 Oct 2021 13:19:10 +0800
Subject: [PATCH 109/179] find promossms language key typo
---
src/languages/en.js | 2 +-
src/languages/pl.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/languages/en.js b/src/languages/en.js
index 2ce8f46be..119b558e0 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -277,7 +277,7 @@ export default {
promosmsTypeEco: "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
promosmsTypeFlash: "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
promosmsTypeFull: "SMS FULL - Premium tier of SMS, You can use Your Sender Name (You need to register name first). Reliable for alerts.",
- promosmsTypeFull: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
+ promosmsTypeSpeed: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
promosmsPhoneNumber: "Phone number (for Polish recipient You can skip area codes)",
promosmsSMSSender: "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
// End notification form
diff --git a/src/languages/pl.js b/src/languages/pl.js
index 2b083527c..f6a32dc67 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -277,7 +277,7 @@ export default {
promosmsTypeEco: "SMS ECO - Tanie, lecz wolne. Dostępne tylko w Polsce",
promosmsTypeFlash: "SMS FLASH - Wiadomość automatycznie wyświetli się na urządzeniu. Dostępne tylko w Polsce.",
promosmsTypeFull: "SMS FULL - Szybkie i dostępne międzynarodowo. Wersja premium usługi, która pozwala min. ustawić własną nazwę nadawcy.",
- promosmsTypeFull: "SMS SPEED - Wysyłka priorytetowa, posiada wszystkie zalety SMS FULL",
+ promosmsTypeSpeed: "SMS SPEED - Wysyłka priorytetowa, posiada wszystkie zalety SMS FULL",
promosmsPhoneNumber: "Numer Odbiorcy",
promosmsSMSSender: "Nadawca SMS (Wcześniej zatwierdzone nazwy z panelu PromoSMS)",
// End notification form
From 4ba20254519d863df1387b3b297b6642039e8c0c Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Sun, 10 Oct 2021 14:40:19 +0800
Subject: [PATCH 110/179] minor
---
CONTRIBUTING.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 93b03ac6a..55b7da275 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -64,7 +64,7 @@ It changed my current workflow and require further studies.
I personally do not like something need to learn so much and need to config so much before you can finally start the app.
- Easy to install for non-Docker users, no native build dependency is needed (at least for x86_64), no extra config, no extra effort to get it run
-- Single container for Docker users, no very complex docker-composer file. Just map the volume and expose the port, then good to go
+- Single container for Docker users, no very complex docker-compose file. Just map the volume and expose the port, then good to go
- Settings should be configurable in the frontend. Env var is not encouraged.
- Easy to use
@@ -74,7 +74,7 @@ I personally do not like something need to learn so much and need to config so m
- Follow `.editorconfig`
- Follow ESLint
-## Name convention
+# Name convention
- Javascript/Typescript: camelCaseType
- SQLite: underscore_type
From 2286f78f574ff56b787b56b558c5f56d9a09fd97 Mon Sep 17 00:00:00 2001
From: Louis
Date: Sun, 10 Oct 2021 16:37:53 +0800
Subject: [PATCH 111/179] update to 1.8.0
---
package.json | 8 ++++----
server/prometheus.js | 31 ++++++++++++++++---------------
2 files changed, 20 insertions(+), 19 deletions(-)
diff --git a/package.json b/package.json
index ae8ed1b1a..6cb8d9dbb 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "uptime-kuma",
- "version": "1.7.3",
+ "version": "1.8.0",
"license": "MIT",
"repository": {
"type": "git",
@@ -29,13 +29,13 @@
"build-docker": "npm run build-docker-debian && npm run build-docker-alpine",
"build-docker-alpine-base": "docker buildx build -f docker/alpine-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-alpine . --push",
"build-docker-debian-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-debian . --push",
- "build-docker-alpine": "docker buildx build -f dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.7.3-alpine --target release . --push",
- "build-docker-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.7.3 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.7.3-debian --target release . --push",
+ "build-docker-alpine": "docker buildx build -f dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.8.0-alpine --target release . --push",
+ "build-docker-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.8.0 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.8.0-debian --target release . --push",
"build-docker-nightly": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
"build-docker-nightly-alpine": "docker buildx build -f dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly-alpine --target nightly . --push",
"build-docker-nightly-amd64": "docker buildx build --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
"upload-artifacts": "docker buildx build --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
- "setup": "git checkout 1.7.3 && npm ci --production && npm run download-dist",
+ "setup": "git checkout 1.8.0 && npm ci --production && npm run download-dist",
"download-dist": "node extra/download-dist.js",
"update-version": "node extra/update-version.js",
"mark-as-nightly": "node extra/mark-as-nightly.js",
diff --git a/server/prometheus.js b/server/prometheus.js
index c27f87f04..870581d2e 100644
--- a/server/prometheus.js
+++ b/server/prometheus.js
@@ -6,7 +6,7 @@ const commonLabels = [
"monitor_url",
"monitor_hostname",
"monitor_port",
-]
+];
const monitor_cert_days_remaining = new PrometheusClient.Gauge({
name: "monitor_cert_days_remaining",
@@ -41,45 +41,46 @@ class Prometheus {
monitor_url: monitor.url,
monitor_hostname: monitor.hostname,
monitor_port: monitor.port
- }
+ };
}
update(heartbeat, tlsInfo) {
+
if (typeof tlsInfo !== "undefined") {
try {
- let is_valid = 0
+ let is_valid = 0;
if (tlsInfo.valid == true) {
- is_valid = 1
+ is_valid = 1;
} else {
- is_valid = 0
+ is_valid = 0;
}
- monitor_cert_is_valid.set(this.monitorLabelValues, is_valid)
+ monitor_cert_is_valid.set(this.monitorLabelValues, is_valid);
} catch (e) {
- console.error(e)
+ console.error(e);
}
try {
- monitor_cert_days_remaining.set(this.monitorLabelValues, tlsInfo.certInfo.daysRemaining)
+ monitor_cert_days_remaining.set(this.monitorLabelValues, tlsInfo.certInfo.daysRemaining);
} catch (e) {
- console.error(e)
+ console.error(e);
}
}
try {
- monitor_status.set(this.monitorLabelValues, heartbeat.status)
+ monitor_status.set(this.monitorLabelValues, heartbeat.status);
} catch (e) {
- console.error(e)
+ console.error(e);
}
try {
if (typeof heartbeat.ping === "number") {
- monitor_response_time.set(this.monitorLabelValues, heartbeat.ping)
+ monitor_response_time.set(this.monitorLabelValues, heartbeat.ping);
} else {
// Is it good?
- monitor_response_time.set(this.monitorLabelValues, -1)
+ monitor_response_time.set(this.monitorLabelValues, -1);
}
} catch (e) {
- console.error(e)
+ console.error(e);
}
}
@@ -87,4 +88,4 @@ class Prometheus {
module.exports = {
Prometheus
-}
+};
From cee225bcb26969ebd2100cadca7771c0734f24db Mon Sep 17 00:00:00 2001
From: Louis
Date: Sun, 10 Oct 2021 17:55:31 +0800
Subject: [PATCH 112/179] no idea why npm prune --production suddenly not
working, switch to npm ci --production
---
dockerfile | 2 +-
dockerfile-alpine | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dockerfile b/dockerfile
index ae935de69..38d585ca7 100644
--- a/dockerfile
+++ b/dockerfile
@@ -6,7 +6,7 @@ ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
COPY . .
RUN npm ci && \
npm run build && \
- npm prune --production && \
+ npm ci --production && \
chmod +x /app/extra/entrypoint.sh
diff --git a/dockerfile-alpine b/dockerfile-alpine
index a3a079eba..e883031ae 100644
--- a/dockerfile-alpine
+++ b/dockerfile-alpine
@@ -6,7 +6,7 @@ ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
COPY . .
RUN npm ci && \
npm run build && \
- npm prune --production && \
+ npm ci --production && \
chmod +x /app/extra/entrypoint.sh
From 2adac64c838dd281d43c451a6475ce87e8018ba4 Mon Sep 17 00:00:00 2001
From: dhfhfk
Date: Mon, 11 Oct 2021 00:02:37 +0900
Subject: [PATCH 113/179] Update ko-KR.js
---
src/languages/ko-KR.js | 481 ++++++++++++++++++++++++-----------------
1 file changed, 281 insertions(+), 200 deletions(-)
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index 8ad7e9600..d88db63b5 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -1,201 +1,282 @@
export default {
- languageName: "한국어",
- checkEverySecond: "{0} 초마다 체크해요.",
- retriesDescription: "서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수",
- ignoreTLSError: "HTTPS 웹사이트에서 TLS/SSL 에러 무시하기",
- upsideDownModeDescription: "서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거에요.",
- maxRedirectDescription: "최대 리다이렉트 횟수에요. 0을 입력하면 리다이렉트를 꺼요.",
- acceptedStatusCodesDescription: "응답 성공으로 간주할 상태 코드를 정해요.",
- passwordNotMatchMsg: "비밀번호 재입력이 일치하지 않아요.",
- notificationDescription: "모니터링에 알림을 설정할 수 있어요.",
- keywordDescription: "Html 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.",
- pauseDashboardHome: "일시 정지",
- deleteMonitorMsg: "정말 이 모니터링을 삭제할까요?",
- deleteNotificationMsg: "정말 이 알림을 모든 모니터링에서 삭제할까요?",
- resoverserverDescription: "Cloudflare가 기본 서버에요, 원한다면 언제나 다른 resolver 서버로 변경할 수 있어요.",
- rrtypeDescription: "모니터링할 RR-Type을 선택해요.",
- pauseMonitorMsg: "정말 이 모니터링을 일시 정지 할까요?",
- Settings: "설정",
- Dashboard: "대시보드",
- "New Update": "새로운 업데이트",
- Language: "언어",
- Appearance: "외형",
- Theme: "테마",
- General: "일반",
- Version: "버전",
- "Check Update On GitHub": "깃허브에서 업데이트 확인",
- List: "목록",
- Add: "추가",
- "Add New Monitor": "새로운 모니터링 추가하기",
- "Quick Stats": "간단한 정보",
- Up: "온라인",
- Down: "오프라인",
- Pending: "대기 중",
- Unknown: "알 수 없음",
- Pause: "일시 정지",
- Name: "이름",
- Status: "상태",
- DateTime: "날짜",
- Message: "메시지",
- "No important events": "중요 이벤트 없음",
- Resume: "재개",
- Edit: "수정",
- Delete: "삭제",
- Current: "현재",
- Uptime: "업타임",
- "Cert Exp.": "인증서 만료",
- days: "일",
- day: "일",
- "-day": "-일",
- hour: "시간",
- "-hour": "-시간",
- Response: "응답",
- Ping: "핑",
- "Monitor Type": "모니터링 종류",
- Keyword: "키워드",
- "Friendly Name": "이름",
- URL: "URL",
- Hostname: "호스트네임",
- Port: "포트",
- "Heartbeat Interval": "하트비트 주기",
- Retries: "재시도",
- Advanced: "고급",
- "Upside Down Mode": "상태 반전 모드",
- "Max. Redirects": "최대 리다이렉트",
- "Accepted Status Codes": "응답 성공 상태 코드",
- Save: "저장",
- Notifications: "알림",
- "Not available, please setup.": "존재하지 않아요, 새로운거 하나 만드는건 어때요?",
- "Setup Notification": "알림 설정",
- Light: "라이트",
- Dark: "다크",
- Auto: "자동",
- "Theme - Heartbeat Bar": "테마 - 하트비트 바",
- Normal: "기본값",
- Bottom: "가운데",
- None: "제거",
- Timezone: "시간대",
- "Search Engine Visibility": "검색 엔진 활성화",
- "Allow indexing": "인덱싱 허용",
- "Discourage search engines from indexing site": "검색 엔진 인덱싱 거부",
- "Change Password": "비밀번호 변경",
- "Current Password": "기존 비밀번호",
- "New Password": "새로운 비밀번호",
- "Repeat New Password": "새로운 비밀번호 재입력",
- "Update Password": "비밀번호 변경",
- "Disable Auth": "인증 끄기",
- "Enable Auth": "인증 켜기",
- Logout: "로그아웃",
- Leave: "나가기",
- "I understand, please disable": "기능에 대해 이해했으니 꺼주세요.",
- Confirm: "확인",
- Yes: "확인",
- No: "취소",
- Username: "이름",
- Password: "비밀번호",
- "Remember me": "비밀번호 기억하기",
- Login: "로그인",
- "No Monitors, please": "모니터링이 없어요,",
- "add one": "하나 추가해봐요",
- "Notification Type": "알림 종류",
- Email: "이메일",
- Test: "테스트",
- "Certificate Info": "인증서 정보",
- "Resolver Server": "Resolver 서버",
- "Resource Record Type": "자원 레코드 유형",
- "Last Result": "최근 결과",
- "Create your admin account": "관리자 계정 만들기",
- "Repeat Password": "비밀번호 재입력",
- respTime: "응답 시간 (ms)",
- notAvailableShort: "N/A",
- Create: "생성하기",
- clearEventsMsg: "정말로 이 모니터링부터 모든 이벤트를 제거할까요?",
- clearHeartbeatsMsg: "정말로 이 모니터링부터 모든 하트비트를 제거할까요?",
- confirmClearStatisticsMsg: "정말로 모든 통계치를 제거할까요?",
- "Clear Data": "데이터 클리어",
- Events: "이벤트",
- Heartbeats: "하트비트",
- "Auto Get": "자동 Get",
- enableDefaultNotificationDescription: "모든 모니터링에 이 알림이 기본값으로 설정될거에요. 각각 모니터링에서 이 알림을 비활성화 할 수 있어요.",
- "Default enabled": "기본값 ",
- "Also apply to existing monitors": "기존 모니터링에도 적용되요.",
- Export: "내보내기",
- Import: "가져오기",
- backupDescription: "모든 모니터링과 알림을 JSON 파일 형식에 저장할 수 있어요.",
- backupDescription2: "(히스토리와 이벤트 데이터는 포함되어 있지 않아요.)",
- backupDescription3: "알림 토큰과 같은 보안 데이터가 내보내기 파일에 포함되어 있으므로 관리에 주의해주세요.",
- alertNoFile: "가져오기를 하기 위해 파일을 선택해주세요.",
- alertWrongFileType: "JSON 파일을 선택해주세요.",
- twoFAVerifyLabel: "2단계 인증이 정상적으로 등록됬는지 확인하기 위해 토큰을 입력해주세요.",
- tokenValidSettingsMsg: "토큰이 정상 값 이에요! 2단계 인증 설정을 저장할 수 있어요.",
- confirmEnableTwoFAMsg: "정말로 2단계 인증을 활성화 할까요?",
- confirmDisableTwoFAMsg: "정말로 2단계 인증을 비활성화 할까요?",
- "Apply on all existing monitors": "기존 모니터링에 모두 적용하기",
- "Verify Token": "토큰 검증",
- "Setup 2FA": "2단계 인증 설정하기",
- "Enable 2FA": "2단계 인증 활성화",
- "Disable 2FA": "2단계 인증 비활성화",
- "2FA Settings": "2단계 인증 설정",
- "Two Factor Authentication": "2단계 인증",
- Active: "활성화",
- Inactive: "비활성화",
- Token: "토큰",
- "Show URI": "URI 보기",
- "Clear all statistics": "모든 통계치 ",
- retryCheckEverySecond: "{0} 초마다 재시도",
- importHandleDescription: "같은 이름을 가진 모든 모니터링 또는 알림들을 건너뛰기를 원하시면, '기존값 건너뛰기'를 눌러주세요. 기존 모니터링과 알림을 지우고 싶으면, '덮어쓰기'를 눌러주세요.",
- confirmImportMsg: "정말로 백업을 가져올까요? 정확한 백업 설정인지 다시 확인해주세요.",
- "Heartbeat Retry Interval": "하트비트 재시도 주기",
- "Import Backup": "백업 가져오기",
- "Export Backup": "백업 내보내기",
- "Skip existing": "기존값 건너뛰기",
- Overwrite: "덮어쓰기",
- Options: "옵션",
- "Keep both": "두개 모두 보존",
- Tags: "태그",
- "Add New below or Select...": "아래 새롭게 추가 또는 선택...",
- "Tag with this name already exist.": "같은 태그 이름이 이미 존재해요.",
- "Tag with this value already exist.": "같은 값을 가진 태그가 이미 존재해요.",
- color: "색상",
- "value (optional)": "값 (선택)",
- Gray: "회색",
- Red: "빨강색",
- Orange: "주황색",
- Green: "초록색",
- Blue: "파랑색",
- Indigo: "남색",
- Purple: "보라색",
- Pink: "핑크색",
- "Search...": "검색...",
- "Avg. Ping": "평균 핑",
- "Avg. Response": "평균 응답",
- "Entry Page": "첫 페이지",
- statusPageNothing: "아무것도 없어요. 새로운 그룹 또는 모니터링을 추가해주세요.",
- "No Services": "서비스 없음",
- "All Systems Operational": "모든 시스템 정상",
- "Partially Degraded Service": "일부 시스템 비정상",
- "Degraded Service": "모든 시스템 비정상",
- "Add Group": "그룹 추가",
- "Add a monitor": "모니터링 추가r",
- "Edit Status Page": "상태 페이지 수정",
- "Go to Dashboard": "대쉬보드로 가기",
- "Status Page": "상태 페이지",
- telegram: "Telegram",
- webhook: "Webhook",
- smtp: "Email (SMTP)",
- discord: "Discord",
- teams: "Microsoft Teams",
- signal: "Signal",
- gotify: "Gotify",
- slack: "Slack",
- "rocket.chat": "Rocket.chat",
- pushover: "Pushover",
- pushy: "Pushy",
- octopush: "Octopush",
- promosms: "PromoSMS",
- lunasea: "LunaSea",
- apprise: "Apprise (50개 이상 알림 서비스 )",
- pushbullet: "Pushbullet",
- line: "Line Messenger",
- mattermost: "Mattermost",
-};
+ languageName: '한국어',
+ checkEverySecond: '{0}초마다 확인해요.',
+ retryCheckEverySecond: '{0}초마다 다시 확인해요.',
+ retriesDescription: '서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수',
+ ignoreTLSError: 'HTTPS 웹사이트에서 TLS/SSL 에러 무시하기',
+ upsideDownModeDescription: '서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거에요.',
+ maxRedirectDescription: '최대 리다이렉트 횟수에요. 0을 입력하면 리다이렉트를 꺼요.',
+ acceptedStatusCodesDescription: '응답 성공으로 간주할 상태 코드를 정해요.',
+ passwordNotMatchMsg: '비밀번호 재입력이 일치하지 않아요.',
+ notificationDescription: '모니터링에 알림을 설정할 수 있어요.',
+ keywordDescription: 'Html 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.',
+ pauseDashboardHome: '일시 정지',
+ deleteMonitorMsg: '정말 이 모니터링을 삭제할까요?',
+ deleteNotificationMsg: '정말 이 알림을 모든 모니터링에서 삭제할까요?',
+ resoverserverDescription: 'Cloudflare가 기본 서버에요, 원한다면 언제나 다른 resolver 서버로 변경할 수 있어요.',
+ rrtypeDescription: '모니터링할 RR-Type을 선택해요.',
+ pauseMonitorMsg: '정말 이 모니터링을 일시 정지 할까요?',
+ enableDefaultNotificationDescription: '새로 추가하는 모든 모니터링에 이 알림을 기본적으로 활성화해요. 각 모니터에 대해 별도로 알림을 비활성화할 수 있어요.',
+ clearEventsMsg: '정말 이 모니터링에 대한 모든 이벤트를 삭제할까요?',
+ clearHeartbeatsMsg: '정말 이 모니터링에 대한 모든 하트비트를 삭제할까요?',
+ confirmClearStatisticsMsg: '정말 모든 통계를 삭제할까요?',
+ importHandleDescription: "이름이 같은 모든 모니터링이나 알림을 건너뛰려면 '기존값 건너뛰기'를 선택해주세요. '덮어쓰기'는 기존의 모든 모니터링과 알림을 삭제해요.",
+ confirmImportMsg: '정말 백업을 가져올까요? 가져오기 옵션을 제대로 설정했는지 다시 확인해주세요.',
+ twoFAVerifyLabel: '토큰을 입력해 2단계 인증이 작동하는지 확인해주세요.',
+ tokenValidSettingsMsg: '토큰이 유효해요! 이제 2단계 인증 설정을 저장할 수 있어요.',
+ confirmEnableTwoFAMsg: '정말 2단계 인증을 활성화 할까요?',
+ confirmDisableTwoFAMsg: '정말 2단계 인증을 비활성화 할까요?',
+ Settings: '설정',
+ Dashboard: '대시보드',
+ 'New Update': '새로운 업데이트',
+ Language: '언어',
+ Appearance: '외형',
+ Theme: '테마',
+ General: '일반',
+ Version: '버전',
+ 'Check Update On GitHub': '깃허브에서 업데이트 확인',
+ List: '목록',
+ Add: '추가',
+ 'Add New Monitor': '새로운 모니터링 추가하기',
+ 'Quick Stats': '간단한 정보',
+ Up: '온라인',
+ Down: '오프라인',
+ Pending: '대기 중',
+ Unknown: '알 수 없음',
+ Pause: '일시 정지',
+ Name: '이름',
+ Status: '상태',
+ DateTime: '날짜',
+ Message: '메시지',
+ 'No important events': '중요 이벤트 없음',
+ Resume: '재개',
+ Edit: '수정',
+ Delete: '삭제',
+ Current: '현재',
+ Uptime: '업타임',
+ 'Cert Exp.': '인증서 만료',
+ days: '일',
+ day: '일',
+ '-day': '-일',
+ hour: '시간',
+ '-hour': '-시간',
+ Response: '응답',
+ Ping: '핑',
+ 'Monitor Type': '모니터링 종류',
+ Keyword: '키워드',
+ 'Friendly Name': '이름',
+ URL: 'URL',
+ Hostname: '호스트네임',
+ Port: '포트',
+ 'Heartbeat Interval': '하트비트 주기',
+ Retries: '재시도',
+ 'Heartbeat Retry Interval': '하트비드 재시도 주기',
+ Advanced: '고급',
+ 'Upside Down Mode': '상태 반전 모드',
+ 'Max. Redirects': '최대 리다이렉트',
+ 'Accepted Status Codes': '응답 성공 상태 코드',
+ Save: '저장',
+ Notifications: '알림',
+ 'Not available, please setup.': '존재하지 않아요, 새로운거 하나 만드는건 어때요?',
+ 'Setup Notification': '알림 설정',
+ Light: '라이트',
+ Dark: '다크',
+ Auto: '자동',
+ 'Theme - Heartbeat Bar': '테마 - 하트비트 바',
+ Normal: '기본값',
+ Bottom: '가운데',
+ None: '없애기',
+ Timezone: '시간대',
+ 'Search Engine Visibility': '검색 엔진 활성화',
+ 'Allow indexing': '인덱싱 허용',
+ 'Discourage search engines from indexing site': '검색 엔진 인덱싱 거부',
+ 'Change Password': '비밀번호 변경',
+ 'Current Password': '기존 비밀번호',
+ 'New Password': '새로운 비밀번호',
+ 'Repeat New Password': '새로운 비밀번호 재입력',
+ 'Update Password': '비밀번호 변경',
+ 'Disable Auth': '인증 비활성화',
+ 'Enable Auth': '인증 활성화',
+ Logout: '로그아웃',
+ Leave: '나가기',
+ 'I understand, please disable': '기능에 대해 이해했으니 꺼주세요.',
+ Confirm: '확인',
+ Yes: '확인',
+ No: '취소',
+ Username: '이름',
+ Password: '비밀번호',
+ 'Remember me': '비밀번호 기억하기',
+ Login: '로그인',
+ 'No Monitors, please': '모니터링이 없어요,',
+ 'add one': '하나 추가해봐요',
+ 'Notification Type': '알림 종류',
+ Email: '이메일',
+ Test: '테스트',
+ 'Certificate Info': '인증서 정보',
+ 'Resolver Server': 'Resolver 서버',
+ 'Resource Record Type': '자원 레코드 유형',
+ 'Last Result': '최근 결과',
+ 'Create your admin account': '관리자 계정 만들기',
+ 'Repeat Password': '비밀번호 재입력',
+ 'Import Backup': '백업 가져오기',
+ 'Export Backup': '백업 내보내기',
+ Export: '내보내기',
+ Import: '가져오기',
+ respTime: '응답 시간 (ms)',
+ notAvailableShort: 'N/A',
+ 'Default enabled': '기본 알림으로 설정',
+ 'Apply on all existing monitors': '기존 모니터링에 모두 적용하기',
+ Create: '생성하기',
+ 'Clear Data': '데이터 삭제',
+ Events: '이벤트',
+ Heartbeats: '하트비트',
+ 'Auto Get': '자동 Get',
+ backupDescription: '모든 모니터링과 알림을 JSON 파일 형식에 저장할 수 있어요.',
+ backupDescription2: '히스토리와 이벤트 데이터는 포함되어 있지 않아요.',
+ backupDescription3: '알림 토큰과 같은 보안 데이터가 내보내기 파일에 포함되어 있으므로 관리에 주의해주세요.',
+ alertNoFile: '가져오기를 하기 위해 파일을 선택해주세요.',
+ alertWrongFileType: 'JSON 파일을 선택해주세요.',
+ 'Clear all statistics': '모든 통계치 삭제',
+ 'Skip existing': '기존값 건너뛰기',
+ Overwrite: '덮어쓰기',
+ Options: '옵션',
+ 'Keep both': '두개 모두 보존',
+ 'Verify Token': '토큰 검증',
+ 'Setup 2FA': '2단계 인증 설정하기',
+ 'Enable 2FA': '2단계 인증 활성화',
+ 'Disable 2FA': '2단계 인증 비활성화',
+ '2FA Settings': '2단계 인증 설정',
+ 'Two Factor Authentication': '2단계 인증',
+ Active: '활성화',
+ Inactive: '비활성화',
+ Token: '토큰',
+ 'Show URI': 'URI 보기',
+ Tags: '태그',
+ 'Add New below or Select...': '아래 새롭게 추가 또는 선택...',
+ 'Tag with this name already exist.': '같은 태그 이름이 이미 존재해요.',
+ 'Tag with this value already exist.': '같은 값을 가진 태그가 이미 존재해요.',
+ color: '색상',
+ 'value (optional)': '값 (선택)',
+ Gray: '회색',
+ Red: '빨강색',
+ Orange: '주황색',
+ Green: '초록색',
+ Blue: '파랑색',
+ Indigo: '남색',
+ Purple: '보라색',
+ Pink: '핑크색',
+ 'Search...': '검색...',
+ 'Avg. Ping': '평균 핑',
+ 'Avg. Response': '평균 응답',
+ 'Entry Page': '첫 페이지',
+ statusPageNothing: '아무것도 없어요. 새로운 그룹 또는 모니터링을 추가해주세요.',
+ 'No Services': '서비스 없음',
+ 'All Systems Operational': '모든 시스템 정상',
+ 'Partially Degraded Service': '일부 시스템 비정상',
+ 'Degraded Service': '모든 시스템 비정상',
+ 'Add Group': '그룹 추가',
+ 'Add a monitor': '모니터링 추가r',
+ 'Edit Status Page': '상태 페이지 수정',
+ 'Go to Dashboard': '대쉬보드로 가기',
+ 'Status Page': '상태 페이지',
+ defaultNotificationName: '내 {notification} 알림 ({number})',
+ here: '여기',
+ Required: '필수',
+ telegram: 'Telegram',
+ 'Bot Token': '봇 토큰',
+ 'You can get a token from': '토큰은 여기서 얻을 수 있어요:',
+ 'Chat ID': '채팅 ID',
+ supportTelegramChatID: "Direct Chat / Group / Channel's Chat ID를 지원해요.",
+ wayToGetTelegramChatID: '봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요.',
+ 'YOUR BOT TOKEN HERE': 'YOUR BOT TOKEN HERE',
+ chatIDNotFound: '채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요.',
+ webhook: '웹훅',
+ 'Post URL': 'Post URL',
+ 'Content Type': 'Content Type',
+ webhookJsonDesc: '{0}은 express.js와 같은 최신 HTTP 서버에 적합해요.',
+ webhookFormDataDesc: '{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 되어요.',
+ smtp: 'Email (SMTP)',
+ secureOptionNone: '없음 / STARTTLS (25, 587)',
+ secureOptionTLS: 'TLS (465)',
+ 'Ignore TLS Error': 'TLS 에러 무시하기',
+ 'From Email': '보내는 이메일',
+ 'To Email': '받는 이메일',
+ smtpCC: '참조',
+ smtpBCC: '숨은 참조',
+ discord: 'Discord',
+ 'Discord Webhook URL': 'Discord 웹훅 URL',
+ wayToGetDiscordURL: '서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요.',
+ 'Bot Display Name': '표시 이름',
+ 'Prefix Custom Message': '접두사 메시지',
+ 'Hello @everyone is...': "{'@'}everyone 서버 상태 알림이에요...",
+ teams: 'Microsoft Teams',
+ 'Webhook URL': '웹훅 URL',
+ wayToGetTeamsURL: '{0}에서 웹훅을 어떻게 만드는지 알아봐요.',
+ signal: 'Signal',
+ Number: '숫자',
+ Recipients: '받는 사람',
+ needSignalAPI: 'REST API를 사용하는 Signal 클라이언트가 있어야 해요.',
+ wayToCheckSignalURL: '밑에 URL을 확인해 URL 설정 방법을 볼 수 있어요.',
+ signalImportant: '중요: 받는 사람의 그룹과 숫자는 섞을 수 없어요!',
+ gotify: 'Gotify',
+ 'Application Token': '애플리케이션 토큰',
+ 'Server URL': '서버 URL',
+ Priority: 'Priority',
+ slack: 'Slack',
+ 'Icon Emoji': '아이콘 이모지',
+ 'Channel Name': '채널 이름',
+ 'Uptime Kuma URL': 'Uptime Kuma URL',
+ aboutWebhooks: '웹훅에 대한 설명: {0}',
+ aboutChannelName: '웹훅 채널을 우회하려면 {0} 채널 이름칸에 채널 이름을 입력해주세요. 예: #기타-채널',
+ aboutKumaURL: 'Uptime Kuma URL칸을 공백으로 두면 기본적으로 Project Github 페이지로 설정해요.',
+ emojiCheatSheet: '이모지 목록 시트: {0}',
+ 'rocket.chat': 'Rocket.chat',
+ pushover: 'Pushover',
+ pushy: 'Pushy',
+ octopush: 'Octopush',
+ promosms: 'PromoSMS',
+ lunasea: 'LunaSea',
+ apprise: 'Apprise (50개 이상 알림 서비스)',
+ pushbullet: 'Pushbullet',
+ line: 'Line Messenger',
+ mattermost: 'Mattermost',
+ 'User Key': '사용자 키',
+ Device: '장치',
+ 'Message Title': '메시지 제목',
+ 'Notification Sound': '알림음',
+ 'More info on:': '자세한 정보: {0}',
+ pushoverDesc1: '긴급 우선 순위 (2)는 재시도 사이에 기본적으로 30초의 타임아웃이 있고, 1시간 후에 만료되어요.',
+ pushoverDesc2: '다른 장치에 알림을 보내려면 장치칸을 입력해주세요.',
+ 'SMS Type': 'SMS 종류',
+ octopushTypePremium: '프리미엄 (빠름) - 알림 기능에 적합해요)',
+ octopushTypeLowCost: '저렴한 요금 (느림, 가끔 차단될 수 있어요)',
+ 'Check octopush prices': '{0}에서 octopush 가격을 확인할 수 있어요.',
+ octopushPhoneNumber: '휴대전화 번호 (intl format, eg : +33612345678) ',
+ octopushSMSSender: '보내는 사람 이름 : 3-11개의 영숫자 및 여백공간 (a-z, A-Z, 0-9',
+ 'LunaSea Device ID': 'LunaSea 장치 ID',
+ 'Apprise URL': 'Apprise URL',
+ 'Example:': '예: {0}',
+ 'Read more:': '더 보기: {0}',
+ 'Status:': '상태: {0}',
+ 'Read more': '더 보기',
+ appriseInstalled: 'Apprise가 설치되어있어요..',
+ appriseNotInstalled: 'Apprise 가 설치되어있지 않아요. {0}',
+ 'Access Token': '액세스 토큰',
+ 'Channel access token': '채널 엑세스 토큰',
+ 'Line Developers Console': 'Line 개발자 콘솔',
+ lineDevConsoleTo: 'Line 개발자 콘솔 - {0}',
+ 'Basic Settings': 'Basic Settings 메뉴',
+ 'User ID': '사용자 ID',
+ 'Messaging API': 'Messaging API 메뉴',
+ wayToGetLineChannelToken: '먼저 {0}에 엑세스하고, 공급자 및 채널 (메시징 API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.',
+ 'Icon URL': '아이콘 URL',
+ aboutIconURL: '"Icon URL"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을거에요.',
+ aboutMattermostChannelName: '채널 이름을 입력하면 웹훅이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널',
+ matrix: '매트릭스',
+ promosmsTypeEco: 'SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요. ',
+ promosmsTypeFlash: 'SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시되어요. 폴란드 수신자만 사용할 수 있어요.',
+ promosmsTypeFull: 'SMS FULL - SMS 프리미엄 티어, 보내는 사람 이름을 먼저 등록해야 해요. 알림 기능에 적합해요.',
+ promosmsTypeSpeed: 'SMS SPEED - 시스템에서 가장 높은 우선순위에요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).',
+ promosmsPhoneNumber: '전화 번호 (폴란드 수신자라면 지역번호를 적지 않아도 돼요.)',
+ promosmsSMSSender: 'SMS 보내는 사람 이름 : 미리 등록된 이름 혹은 기본값 중 하나에요: InfoSMS, SMS Info, MaxSMS, INFO, SMS'
+}
\ No newline at end of file
From efd38229301bd8874490a11c00e74c4e7fbdbad8 Mon Sep 17 00:00:00 2001
From: RisedSky
Date: Sun, 10 Oct 2021 17:33:02 +0200
Subject: [PATCH 114/179] Update fr-FR.js
All the lines corresponds to the English version (sorted correctly)
Plus, updated all the translated strings
---
src/languages/fr-FR.js | 197 +++++++++++++++++++++++++++++------------
1 file changed, 140 insertions(+), 57 deletions(-)
diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index 9f234f7aa..92184e59a 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -1,5 +1,31 @@
export default {
languageName: "Français (France)",
+ checkEverySecond: "Vérifier toutes les {0} secondes",
+ retryCheckEverySecond: "Réessayer toutes les {0} secondes.",
+ retriesDescription: "Nombre d'essais avant que le service soit déclaré hors-ligne.",
+ ignoreTLSError: "Ignorer les erreurs liées au certificat SSL/TLS",
+ upsideDownModeDescription: "Si le service est en ligne, il sera alors noté hors-ligne et vice-versa.",
+ maxRedirectDescription: "Nombre maximal de redirections avant que le service soit noté hors-ligne.",
+ acceptedStatusCodesDescription: "Codes HTTP considérés comme en ligne",
+ passwordNotMatchMsg: "Les mots de passe ne correspondent pas",
+ notificationDescription: "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hôtes.",
+ keywordDescription: "Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.",
+ pauseDashboardHome: "Éléments mis en pause",
+ deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer cette sonde ?",
+ deleteNotificationMsg: "Êtes-vous sûr de vouloir supprimer ce type de notifications ? Une fois désactivée, les services qui l'utilisent ne pourront plus envoyer de notifications.",
+ resoverserverDescription: "Le DNS de cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
+ rrtypeDescription: "Veuillez séléctionner un type d'enregistrement DNS",
+ pauseMonitorMsg: "Etes vous sur de vouloir mettre en pause cette sonde ?",
+ enableDefaultNotificationDescription: "Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.",
+ clearEventsMsg: "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
+ clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer tous les vérifications pour cette sonde ?",
+ confirmClearStatisticsMsg: "Êtes-vous sûr de vouloir supprimer tous les statistiques ?",
+ importHandleDescription: "Choisissez 'Ignorer l'existant' si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option 'Écraser' supprime tous les sondes et notifications existantes.",
+ confirmImportMsg: "Êtes-vous sûr d'importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
+ twoFAVerifyLabel: "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.",
+ tokenValidSettingsMsg: "Le jeton est valide ! Vous pouvez maintenant sauvegarder les paramètres 2FA.",
+ confirmEnableTwoFAMsg: "Êtes-vous sûr de vouloir activer le 2FA ?",
+ confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver le 2FA ?",
Settings: "Paramètres",
Dashboard: "Tableau de bord",
"New Update": "Mise à jour disponible",
@@ -18,7 +44,6 @@ export default {
Pending: "En attente",
Unknown: "Inconnu",
Pause: "En Pause",
- pauseDashboardHome: "Éléments mis en pause",
Name: "Nom",
Status: "État",
DateTime: "Heure",
@@ -30,31 +55,26 @@ export default {
Current: "Actuellement",
Uptime: "Uptime",
"Cert Exp.": "Certificat expiré",
- days: "Jours",
- day: "Jour",
- "-day": "Journée",
- hour: "Heure",
- "-hour": "Heures",
- checkEverySecond: "Vérifier toutes les {0} secondes",
+ days: "jours",
+ day: "jour",
+ "-day": "-jours",
+ hour: "-heure",
+ "-hour": "-heures",
Response: "Temps de réponse",
Ping: "Ping",
"Monitor Type": "Type de Sonde",
Keyword: "Mot-clé",
"Friendly Name": "Nom d'affichage",
URL: "URL",
- Hostname: "Nom d'hôte",
+ Hostname: "Nom d'hôte / adresse IP",
Port: "Port",
"Heartbeat Interval": "Intervale de vérification",
Retries: "Essais",
- retriesDescription: "Nombre d'essais avant que le service soit déclaré hors-ligne.",
+ "Heartbeat Retry Interval": "Réessayer l'intervale de vérification",
Advanced: "Avancé",
- ignoreTLSError: "Ignorer les erreurs liées au certificat SSL/TLS",
"Upside Down Mode": "Mode inversé",
- upsideDownModeDescription: "Si le service est en ligne, il sera alors noté hors-ligne et vice-versa.",
"Max. Redirects": "Nombre maximum de redirections",
- maxRedirectDescription: "Nombre maximal de redirections avant que le service soit noté hors-ligne.",
- "Accepted Status Codes": "Codes HTTP",
- acceptedStatusCodesDescription: "Codes HTTP considérés comme en ligne",
+ "Accepted Status Codes": "Codes HTTP acceptés",
Save: "Sauvegarder",
Notifications: "Notifications",
"Not available, please setup.": "Pas de système de notification disponible, merci de le configurer",
@@ -63,9 +83,9 @@ export default {
Dark: "Sombre",
Auto: "Automatique",
"Theme - Heartbeat Bar": "Voir les services surveillés",
- Normal: "Général",
+ Normal: "Normal",
Bottom: "En dessous",
- None: "Rien",
+ None: "Aucun",
Timezone: "Fuseau Horaire",
"Search Engine Visibility": "Visibilité par les moteurs de recherche",
"Allow indexing": "Autoriser l'indexation par des moteurs de recherche",
@@ -74,14 +94,12 @@ export default {
"Current Password": "Mot de passe actuel",
"New Password": "Nouveau mot de passe",
"Repeat New Password": "Répéter votre nouveau mot de passe",
- passwordNotMatchMsg: "Les mots de passe ne correspondent pas",
"Update Password": "Mettre à jour le mot de passe",
"Disable Auth": "Désactiver l'authentification",
"Enable Auth": "Activer l'authentification",
Logout: "Se déconnecter",
- notificationDescription: "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hôtes.",
Leave: "Quitter",
- "I understand, please disable": "J'ai compris, désactivez-le",
+ "I understand, please disable": "Je comprends, désactivez-le",
Confirm: "Confirmer",
Yes: "Oui",
No: "Non",
@@ -94,43 +112,35 @@ export default {
"Notification Type": "Type de notification",
Email: "Email",
Test: "Tester",
- keywordDescription: "Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.",
"Certificate Info": "Informations sur le certificat SSL",
- deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer cette sonde ?",
- deleteNotificationMsg: "Êtes-vous sûr de vouloir supprimer ce type de notifications ? Une fois désactivée, les services qui l'utilisent ne pourront plus envoyer de notifications.",
"Resolver Server": "Serveur DNS utilisé",
"Resource Record Type": "Type d'enregistrement DNS recherché",
- resoverserverDescription: "Le DNS de cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
- rrtypeDescription: "Veuillez séléctionner un type d'enregistrement DNS",
- pauseMonitorMsg: "Etes vous sur de vouloir mettre en pause cette sonde ?",
"Last Result": "Dernier résultat",
"Create your admin account": "Créez votre compte administrateur",
"Repeat Password": "Répéter le mot de passe",
+ "Import Backup": "Importation de la sauvegarde",
+ "Export Backup": "Exportation de la sauvegarde",
+ Export: "Exporter",
+ Import: "Importer",
respTime: "Temps de réponse (ms)",
notAvailableShort: "N/A",
+ "Default enabled": "Activé par défaut",
+ "Apply on all existing monitors": "Appliquer sur toutes les sondes existantes",
Create: "Créer",
- clearEventsMsg: "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
- clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer tous les vérifications pour cette sonde ? Are you sure want to delete all heartbeats for this monitor?",
- confirmClearStatisticsMsg: "tes-vous sûr de vouloir supprimer tous les statistiques ?",
"Clear Data": "Effacer les données",
Events: "Evénements",
Heartbeats: "Vérfications",
"Auto Get": "Auto Get",
- enableDefaultNotificationDescription: "Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.",
- "Default enabled": "Activé par défaut",
- "Also apply to existing monitors": "S'applique également aux sondes existantes",
- Export: "Exporter",
- Import: "Importer",
backupDescription: "Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.",
backupDescription2: "PS: Les données relatives à l'historique et aux événements ne sont pas incluses.",
backupDescription3: "Les données sensibles telles que les jetons de notification sont incluses dans le fichier d'exportation, veuillez les conserver soigneusement.",
alertNoFile: "Veuillez sélectionner un fichier à importer.",
alertWrongFileType: "Veuillez sélectionner un fichier JSON à importer.",
- twoFAVerifyLabel: "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.",
- tokenValidSettingsMsg: "Le jeton est valide ! Vous pouvez maintenant sauvegarder les paramètres 2FA.",
- confirmEnableTwoFAMsg: "Êtes-vous sûr de vouloir activer le 2FA ?",
- confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver le 2FA ?",
- "Apply on all existing monitors": "Appliquer sur toutes les sondes existantes",
+ "Clear all statistics": "Effacer touutes les statistiques",
+ "Skip existing": "Sauter l'existant",
+ Overwrite: "Ecraser",
+ Options: "Options",
+ "Keep both": "Garder les deux",
"Verify Token": "Vérifier le jeton",
"Setup 2FA": "Configurer 2FA",
"Enable 2FA": "Activer 2FA",
@@ -141,17 +151,6 @@ export default {
Inactive: "Inactif",
Token: "Jeton",
"Show URI": "Afficher l'URI",
- "Clear all statistics": "Effacer touutes les statistiques",
- retryCheckEverySecond: "Réessayer toutes les {0} secondes.",
- importHandleDescription: "Choisissez 'Ignorer l'existant' si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option 'Écraser' supprime tous les sondes et notifications existantes.",
- confirmImportMsg: "Êtes-vous sûr d'importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
- "Heartbeat Retry Interval": "Réessayer l'intervale de vérification",
- "Import Backup": "Importation de la sauvegarde",
- "Export Backup": "Exportation de la sauvegarde",
- "Skip existing": "Sauter l'existant",
- Overwrite: "Ecraser",
- Options: "Options",
- "Keep both": "Garder les deux",
Tags: "Étiquettes",
"Add New below or Select...": "Ajouter nouveau ci-dessous ou sélectionner...",
"Tag with this name already exist.": "Une étiquette portant ce nom existe déjà.",
@@ -180,14 +179,58 @@ export default {
"Edit Status Page": "Modifier la page de statut",
"Go to Dashboard": "Accéder au tableau de bord",
"Status Page": "Status Page",
- telegram: "Telegram",
- webhook: "Webhook",
- smtp: "Email (SMTP)",
- discord: "Discord",
- teams: "Microsoft Teams",
- signal: "Signal",
- gotify: "Gotify",
- slack: "Slack",
+ // Start notification form
+ defaultNotificationName: "Ma notification {notification} numéro ({number})",
+ here: "ici",
+ "Required": "Requis",
+ "telegram": "Telegram",
+ "Bot Token": "Bot Token",
+ "You can get a token from": "Vous pouvez avoir un token depuis",
+ "Chat ID": "Chat ID",
+ supportTelegramChatID: "Supporte les messages privés / en groupe / l'ID du salon",
+ wayToGetTelegramChatID: "Vous pouvez obtenir l'ID du chat en envoyant un message avec le bot puis en récupérant l'URL pour voir l'ID du salon:",
+ "YOUR BOT TOKEN HERE": "VOTRE TOKEN BOT ICI",
+ chatIDNotFound: "ID du salon introuvable, envoyez un message via le bot avant",
+ "webhook": "Webhook",
+ "Post URL": "Post URL",
+ "Content Type": "Content Type",
+ webhookJsonDesc: "{0} est bon pour tous les serveurs HTTP modernes comme express.js",
+ webhookFormDataDesc: "{multipart} est bon pour du PHP, vous avez juste besoin de mettre le json via {decodeFunction}",
+ "smtp": "Email (SMTP)",
+ secureOptionNone: "Aucun / STARTTLS (25, 587)",
+ secureOptionTLS: "TLS (465)",
+ "Ignore TLS Error": "Ignorer les erreurs TLS",
+ "From Email": "Depuis l'Email",
+ "To Email": "Vers l'Email",
+ smtpCC: "CC",
+ smtpBCC: "BCC",
+ "discord": "Discord",
+ "Discord Webhook URL": "Discord Webhook URL",
+ wayToGetDiscordURL: "Vous pouvez l'obtenir en allant dans 'Paramètres du Serveur' -> 'Intégrations' -> 'Créer un Webhook'",
+ "Bot Display Name": "Nom du bot (affiché)",
+ "Prefix Custom Message": "Prefix Custom Message",
+ "Hello @everyone is...": "Bonjour {'@'}everyone il...",
+ "teams": "Microsoft Teams",
+ "Webhook URL": "Webhook URL",
+ wayToGetTeamsURL: "Vous pouvez apprendre comment créer un Webhook {0}.",
+ "signal": "Signal",
+ "Number": "Numéro",
+ "Recipients": "Destinataires",
+ needSignalAPI: "Vous avez besoin d'un client Signal avec l'API REST.",
+ wayToCheckSignalURL: "Vous pouvez regarder l'URL sur comment le mettre en place:",
+ signalImportant: "IMPORTANT: Vous ne pouvez pas mixer les groupes et les numéros en destinataires!",
+ "gotify": "Gotify",
+ "Application Token": "Application Token",
+ "Server URL": "Server URL",
+ "Priority": "Priorité",
+ "slack": "Slack",
+ "Icon Emoji": "Icon Emoji",
+ "Channel Name": "Nom du salon",
+ "Uptime Kuma URL": "Uptime Kuma URL",
+ aboutWebhooks: "Plus d'informations sur les Webhooks ici: {0}",
+ aboutChannelName: "Mettez le nom du salon dans {0} dans Channel Name si vous voulez bypass le salon Webhook. Ex: #autre-salon",
+ aboutKumaURL: "Si vous laissez l'URL d'Uptime Kuma vierge, elle redirigera vers la page du projet GitHub.",
+ emojiCheatSheet: "Emoji cheat sheet: {0}",
"rocket.chat": "Rocket.chat",
pushover: "Pushover",
pushy: "Pushy",
@@ -198,4 +241,44 @@ export default {
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
+ "User Key": "Clé d'utilisateur",
+ "Device": "Device",
+ "Message Title": "Titre du message",
+ "Notification Sound": "Son de notification",
+ "More info on:": "Plus d'informations sur: {0}",
+ pushoverDesc1: "Priorité d'urgence (2) a par défaut 30 secondes de délai dépassé entre les tentatives et expierera après 1 heure.",
+ pushoverDesc2: "Si vous voulez envoyer des notifications sur différents Appareils, remplissez le champ Device.",
+ "SMS Type": "SMS Type",
+ octopushTypePremium: "Premium (Rapide - recommandé pour les alertes)",
+ octopushTypeLowCost: "A bas prix (Lent, bloqué de temps en temps par l'opérateur)",
+ "Check octopush prices": "Vérifiez les prix d'octopush {0}.",
+ octopushPhoneNumber: "Numéro de téléphone (format intérn., ex : +33612345678) ",
+ octopushSMSSender: "Nom de l'envoyer : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
+ "LunaSea Device ID": "LunaSea Device ID",
+ "Apprise URL": "Apprise URL",
+ "Example:": "Exemple: {0}",
+ "Read more:": "En savoir plus: {0}",
+ "Status:": "Status: {0}",
+ "Read more": "En savoir plus",
+ appriseInstalled: "Apprise est intallé.",
+ appriseNotInstalled: "Apprise n'est pas intallé. {0}",
+ "Access Token": "Access Token",
+ "Channel access token": "Channel access token",
+ "Line Developers Console": "Line Developers Console",
+ lineDevConsoleTo: "Line Developers Console - {0}",
+ "Basic Settings": "Paramètres de base",
+ "User ID": "Identifiant utilisateur",
+ "Messaging API": "Messaging API",
+ wayToGetLineChannelToken: "Premièrement accéder à {0}, créez un Provider et un Salon (Messaging API), puis vous pourrez avoir le Token d'accès du salon ainsi que l'Identifiant utilisateur depuis le même menu.",
+ "Icon URL": "Icon URL",
+ aboutIconURL: "Vous pouvez mettre un lien vers l'image dans \"Icon URL\" pour remplacer l'image de profil par défaut. Ne sera pas utilisé si Icon Emoji est défini.",
+ aboutMattermostChannelName: "Vous pouvez remplacer le salon par défaut que le Webhook utilise en mettant le nom du salon dans le champ \"Channel Name\". Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex: #autre-salon",
+ "matrix": "Matrix",
+ promosmsTypeEco: "SMS ECO - Pas chère mais lent et souvent surchargé. Limité uniquement aux déstinataires Polonais.",
+ promosmsTypeFlash: "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux déstinataires Polonais.",
+ promosmsTypeFull: "SMS FULL - Version Premium des SMS, Vous pouvez mettre le nom de l'expéditeur (Vous devez vous enregistrer avant). Fiable pour les alertes.",
+ promosmsTypeSpeed: "SMS SPEED - La plus haute des priorités dans le système. Très rapide et fiable mais cher (environ le double du prix d'un SMS FULL).",
+ promosmsPhoneNumber: "Numéro de téléphone (Poiur les déstinataires Polonais, vous pouvez enlever les codes interna.)",
+ promosmsSMSSender: "SMS Expéditeur : Nom pré-enregistré ou l'un de base: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+ // End notification form
};
From afb75e07d58adb499e9a92dc328b2abfa5a724c4 Mon Sep 17 00:00:00 2001
From: RisedSky
Date: Sun, 10 Oct 2021 17:37:05 +0200
Subject: [PATCH 115/179] Update fr-FR.js
Fixed string (Device => Appareil in French)
---
src/languages/fr-FR.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index 92184e59a..6d65f375c 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -242,12 +242,12 @@ export default {
line: "Line Messenger",
mattermost: "Mattermost",
"User Key": "Clé d'utilisateur",
- "Device": "Device",
+ "Device": "Appareil",
"Message Title": "Titre du message",
"Notification Sound": "Son de notification",
"More info on:": "Plus d'informations sur: {0}",
pushoverDesc1: "Priorité d'urgence (2) a par défaut 30 secondes de délai dépassé entre les tentatives et expierera après 1 heure.",
- pushoverDesc2: "Si vous voulez envoyer des notifications sur différents Appareils, remplissez le champ Device.",
+ pushoverDesc2: "Si vous voulez envoyer des notifications sur différents Appareils, remplissez le champ 'Device'.",
"SMS Type": "SMS Type",
octopushTypePremium: "Premium (Rapide - recommandé pour les alertes)",
octopushTypeLowCost: "A bas prix (Lent, bloqué de temps en temps par l'opérateur)",
From f0ff96afd9e7d50efb996beaaaaaab8b5b1854a1 Mon Sep 17 00:00:00 2001
From: "Daniel S. Billing"
Date: Sun, 10 Oct 2021 18:31:17 +0200
Subject: [PATCH 116/179] Create nb-NO.js
---
src/languages/nb-NO.js | 284 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 284 insertions(+)
create mode 100644 src/languages/nb-NO.js
diff --git a/src/languages/nb-NO.js b/src/languages/nb-NO.js
new file mode 100644
index 000000000..b3ba9380a
--- /dev/null
+++ b/src/languages/nb-NO.js
@@ -0,0 +1,284 @@
+export default {
+ languageName: "Norwegian",
+ checkEverySecond: "Sjekk hvert {0} sekund.",
+ retryCheckEverySecond: "Prøv igjen hvert {0} sekund.",
+ retriesDescription: "Maksimalt antall forsøk før tjenesten er merket som nede og et varsel sendes",
+ ignoreTLSError: "Ignorer TLS/SSL-feil for HTTPS-nettsteder",
+ upsideDownModeDescription: "Snu statusen opp ned. Hvis tjenesten er tilgjengelig, er den NED.",
+ maxRedirectDescription: "Maksimalt antall viderekoblinger å følge. Sett til 0 for å deaktivere viderekoblinger.",
+ acceptedStatusCodesDescription: "Velg statuskoder som anses som et vellykket svar.",
+ passwordNotMatchMsg: "Passordene stemmer ikke overens.",
+ notificationDescription: "Tilordne et varsel for å overvåkningen for å få det til å fungere.",
+ keywordDescription: "Søk etter nøkkelord i vanlig HTML eller JSON, og det er versalfølsom",
+ pauseDashboardHome: "Pause",
+ deleteMonitorMsg: "Er du sikker på at du vil slette denne overvåkningen?",
+ deleteNotificationMsg: "Er du sikker på at du vil slette dette varselet for alle overvåkningene?",
+ resoverserverDescription: "Cloudflare er standardserveren, kan du når som helst endre DNS-serveren.",
+ rrtypeDescription: "Velg RR-typen du vil overvåke",
+ pauseMonitorMsg: "Er du sikker på at du vil sette en pause?",
+ enableDefaultNotificationDescription: "For hver ny overvåkning vil denne varslingen være aktivert som standard. Du kan fortsatt deaktivere varselet separat for hver overvåkning.",
+ clearEventsMsg: "Er du sikker på at du vil slette alle hendelser for denne overvåkningen?",
+ clearHeartbeatsMsg: "Er du sikker på at du vil slette alle hjerteslag for denne overvåkningen?",
+ confirmClearStatisticsMsg: "Er du sikker på at du vil slette ALL statistikk?",
+ importHandleDescription: "Velg 'Hopp over eksisterende' hvis du vil hoppe over hver overvåkning eller varsel med samme navn. 'Overskriv' sletter alle eksisterende overvåkninger og varsler.",
+ confirmImportMsg: "Er du sikker på å importere sikkerhetskopien? Sørg for at du har valgt riktig importalternativ.",
+ twoFAVerifyLabel: "Skriv inn tokenet ditt for å bekrefte at 2FA fungerer",
+ tokenValidSettingsMsg: "Token er gyldig! Du kan nå lagre 2FA-innstillingene.",
+ confirmEnableTwoFAMsg: "Er du sikker på at du vil aktivere 2FA?",
+ confirmDisableTwoFAMsg: "Er du sikker på at du vil deaktivere 2FA?",
+ Settings: "Innstillinger",
+ Dashboard: "Dashboard",
+ "New Update": "Ny Oppdatering",
+ Language: "Språk",
+ Appearance: "Utseende",
+ Theme: "Tema",
+ General: "Generelt",
+ Version: "Versjon",
+ "Check Update On GitHub": "Sjekk oppdatering på GitHub",
+ List: "Liste",
+ Add: "Legg til",
+ "Add New Monitor": "Legg til ny overvåkning",
+ "Quick Stats": "Statistikk",
+ Up: "Oppe",
+ Down: "Nede",
+ Pending: "Avventer",
+ Unknown: "Ukjent",
+ Pause: "Pause",
+ Name: "Navn",
+ Status: "Status",
+ DateTime: "Dato tid",
+ Message: "Melding",
+ "No important events": "Ingen viktige hendelser",
+ Resume: "Fortsett",
+ Edit: "Endre",
+ Delete: "Slett",
+ Current: "Nåværende",
+ Uptime: "Oppetid",
+ "Cert Exp.": "Sertifikat utløper",
+ days: "dager",
+ day: "dag",
+ "-day": "-dag",
+ hour: "time",
+ "-hour": "-time",
+ Response: "Respons",
+ Ping: "Ping",
+ "Monitor Type": "Overvåkningstype",
+ Keyword: "Stikkord",
+ "Friendly Name": "Vennlig navn",
+ URL: "URL",
+ Hostname: "Vertsnavn",
+ Port: "Port",
+ "Heartbeat Interval": "Hjerteslagsintervall",
+ Retries: "Forsøk",
+ "Heartbeat Retry Interval": "Hjerteslagsforsøkintervall",
+ Advanced: "Avansert",
+ "Upside Down Mode": "Opp-ned-modus",
+ "Max. Redirects": "Maks. viderekoblinger",
+ "Accepted Status Codes": "Godkjente statuskoder",
+ Save: "Lagre",
+ Notifications: "Varsler",
+ "Not available, please setup.": "Ikke tilgjengelig, sett opp.",
+ "Setup Notification": "Sett opp varsel",
+ Light: "Lys",
+ Dark: "Mørk",
+ Auto: "Auto",
+ "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
+ Normal: "Normal",
+ Bottom: "Bunn",
+ None: "Ingen",
+ Timezone: "Tidssone",
+ "Search Engine Visibility": "Søkemotor synlighet",
+ "Allow indexing": "Tillat indeksering",
+ "Discourage search engines from indexing site": "Avskrekk søkemotorer fra å indeksere nettstedet",
+ "Change Password": "Endre passord",
+ "Current Password": "Nåværende passord",
+ "New Password": "Nytt passord",
+ "Repeat New Password": "Gjenta nytt passord",
+ "Update Password": "Oppdater passord",
+ "Disable Auth": "Deaktiver autentisering",
+ "Enable Auth": "Aktiver autentisering",
+ Logout: "Logg ut",
+ Leave: "Forlat",
+ "I understand, please disable": "Jeg forstår, deaktiver",
+ Confirm: "Bekreft",
+ Yes: "Ja",
+ No: "Nei",
+ Username: "Brukernavn",
+ Password: "Passord",
+ "Remember me": "Husk meg",
+ Login: "Logg inn",
+ "No Monitors, please": "Ingen overvåkning, vær så snill",
+ "add one": "legg til en",
+ "Notification Type": "Meldingstype",
+ Email: "E-post",
+ Test: "Test",
+ "Certificate Info": "Sertifikatinformasjon",
+ "Resolver Server": "DNS-server",
+ "Resource Record Type": "DNS-posttype",
+ "Last Result": "Siste resultat",
+ "Create your admin account": "Opprett en administratorkonto",
+ "Repeat Password": "Gjenta passord",
+ "Import Backup": "Importer sikkerhetskopi",
+ "Export Backup": "Eksporter sikkerhetskopi",
+ Export: "Eksporter",
+ Import: "Importer",
+ respTime: "Svartid (ms)",
+ notAvailableShort: "N/A",
+ "Default enabled": "Standard aktivert",
+ "Apply on all existing monitors": "Påfør på alle eksisterende overvåkninger",
+ Create: "Opprett",
+ "Clear Data": "Slett data",
+ Events: "Hendelser",
+ Heartbeats: "Hjerteslag",
+ "Auto Get": "Auto Get",
+ backupDescription: "Du kan sikkerhetskopiere alle overvåkninger og alle varsler til en JSON-fil.",
+ backupDescription2: "PS: Historikk og hendelsesdata er ikke inkludert.",
+ backupDescription3: "Følsomme data som varslingstokener er inkludert i eksportfilen. Vennligst oppbevar dem nøye.",
+ alertNoFile: "Velg en fil som skal importeres.",
+ alertWrongFileType: "Velg en JSON-fil.",
+ "Clear all statistics": "Fjern all statistikk",
+ "Skip existing": "Hopp over eksisterende",
+ Overwrite: "Overskriv",
+ Options: "Alternativer",
+ "Keep both": "Behold begge",
+ "Verify Token": "Bekreft token",
+ "Setup 2FA": "Konfigurer 2FA",
+ "Enable 2FA": "Aktiver 2FA",
+ "Disable 2FA": "Deaktiver 2FA",
+ "2FA Settings": "2FA Innstillinger",
+ "Two Factor Authentication": "To-faktor autentisering",
+ Active: "Aktiv",
+ Inactive: "Inaktiv",
+ Token: "Token",
+ "Show URI": "Vis URI",
+ Tags: "Etiketter",
+ "Add New below or Select...": "Legg til nytt nedenfor eller Velg ...",
+ "Tag with this name already exist.": "Etikett med dette navnet eksisterer allerede.",
+ "Tag with this value already exist.": "Etikett med denne verdien finnes allerede.",
+ color: "farge",
+ "value (optional)": "verdi (valgfritt)",
+ Gray: "Grå",
+ Red: "Rød",
+ Orange: "Oransje",
+ Green: "Grønn",
+ Blue: "Blå",
+ Indigo: "Indigo",
+ Purple: "Lilla",
+ Pink: "Rosa",
+ "Search...": "Søk...",
+ "Avg. Ping": "Gj.sn. Ping",
+ "Avg. Response": "Gj.sn. Respons",
+ "Entry Page": "Oppføringsside",
+ statusPageNothing: "Ingenting her, vennligst legg til en gruppe eller en overvåkning.",
+ "No Services": "Ingen tjenester",
+ "All Systems Operational": "Alle systemer i drift",
+ "Partially Degraded Service": "Delvis degradert drift",
+ "Degraded Service": "Degradert drift",
+ "Add Group": "Legg til gruppe",
+ "Add a monitor": "Legg til en overvåkning",
+ "Edit Status Page": "Rediger statusside",
+ "Go to Dashboard": "Gå til Dashboard",
+ "Status Page": "Statusside",
+ // Start notification form
+ defaultNotificationName: "Min {notification} varsling ({number})",
+ here: "here",
+ "Required": "Obligatorisk",
+ "telegram": "Telegram",
+ "Bot Token": "Bot Token",
+ "You can get a token from": "You can get a token from",
+ "Chat ID": "Chat ID",
+ supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
+ wayToGetTelegramChatID: "You can get your chat id by sending message to the bot and go to this url to view the chat_id:",
+ "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
+ chatIDNotFound: "Chat ID is not found, please send a message to this bot first",
+ "webhook": "Webhook",
+ "Post URL": "Post URL",
+ "Content Type": "Content Type",
+ webhookJsonDesc: "{0} is good for any modern http servers such as express.js",
+ webhookFormDataDesc: "{multipart} is good for PHP, you just need to parse the json by {decodeFunction}",
+ "smtp": "Email (SMTP)",
+ secureOptionNone: "None / STARTTLS (25, 587)",
+ secureOptionTLS: "TLS (465)",
+ "Ignore TLS Error": "Ignore TLS Error",
+ "From Email": "From Email",
+ "To Email": "To Email",
+ smtpCC: "CC",
+ smtpBCC: "BCC",
+ "discord": "Discord",
+ "Discord Webhook URL": "Discord Webhook URL",
+ wayToGetDiscordURL: "You can get this by going to Server Settings -> Integrations -> Create Webhook",
+ "Bot Display Name": "Bot Display Name",
+ "Prefix Custom Message": "Prefix Custom Message",
+ "Hello @everyone is...": "Hello {'@'}everyone is...",
+ "teams": "Microsoft Teams",
+ "Webhook URL": "Webhook URL",
+ wayToGetTeamsURL: "You can learn how to create a webhook url {0}.",
+ "signal": "Signal",
+ "Number": "Number",
+ "Recipients": "Recipients",
+ needSignalAPI: "You need to have a signal client with REST API.",
+ wayToCheckSignalURL: "You can check this url to view how to setup one:",
+ signalImportant: "IMPORTANT: You cannot mix groups and numbers in recipients!",
+ "gotify": "Gotify",
+ "Application Token": "Application Token",
+ "Server URL": "Server URL",
+ "Priority": "Priority",
+ "slack": "Slack",
+ "Icon Emoji": "Icon Emoji",
+ "Channel Name": "Channel Name",
+ "Uptime Kuma URL": "Uptime Kuma URL",
+ aboutWebhooks: "More info about webhooks on: {0}",
+ aboutChannelName: "Enter the channel name on {0} Channel Name field if you want to bypass the webhook channel. Ex: #other-channel",
+ aboutKumaURL: "If you leave the Uptime Kuma URL field blank, it will default to the Project Github page.",
+ emojiCheatSheet: "Emoji cheat sheet: {0}",
+ "rocket.chat": "Rocket.chat",
+ pushover: "Pushover",
+ pushy: "Pushy",
+ octopush: "Octopush",
+ promosms: "PromoSMS",
+ lunasea: "LunaSea",
+ apprise: "Apprise (Support 50+ Notification services)",
+ pushbullet: "Pushbullet",
+ line: "Line Messenger",
+ mattermost: "Mattermost",
+ "User Key": "User Key",
+ "Device": "Device",
+ "Message Title": "Message Title",
+ "Notification Sound": "Notification Sound",
+ "More info on:": "More info on: {0}",
+ pushoverDesc1: "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
+ pushoverDesc2: "If you want to send notifications to different devices, fill out Device field.",
+ "SMS Type": "SMS Type",
+ octopushTypePremium: "Premium (Fast - recommended for alerting)",
+ octopushTypeLowCost: "Low Cost (Slow, sometimes blocked by operator)",
+ "Check octopush prices": "Check octopush prices {0}.",
+ octopushPhoneNumber: "Phone number (intl format, eg : +33612345678) ",
+ octopushSMSSender: "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
+ "LunaSea Device ID": "LunaSea Device ID",
+ "Apprise URL": "Apprise URL",
+ "Example:": "Example: {0}",
+ "Read more:": "Read more: {0}",
+ "Status:": "Status: {0}",
+ "Read more": "Read more",
+ appriseInstalled: "Apprise is installed.",
+ appriseNotInstalled: "Apprise is not installed. {0}",
+ "Access Token": "Access Token",
+ "Channel access token": "Channel access token",
+ "Line Developers Console": "Line Developers Console",
+ lineDevConsoleTo: "Line Developers Console - {0}",
+ "Basic Settings": "Basic Settings",
+ "User ID": "User ID",
+ "Messaging API": "Messaging API",
+ wayToGetLineChannelToken: "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user id from the above mentioned menu items.",
+ "Icon URL": "Icon URL",
+ aboutIconURL: "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
+ aboutMattermostChannelName: "You can override the default channel that webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in Mattermost webhook settings. Ex: #other-channel",
+ "matrix": "Matrix",
+ promosmsTypeEco: "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
+ promosmsTypeFlash: "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
+ promosmsTypeFull: "SMS FULL - Premium tier of SMS, You can use Your Sender Name (You need to register name first). Reliable for alerts.",
+ promosmsTypeSpeed: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
+ promosmsPhoneNumber: "Phone number (for Polish recipient You can skip area codes)",
+ promosmsSMSSender: "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+ // End notification form
+};
From c79e80442aa9427f1884841537e7ff799663848c Mon Sep 17 00:00:00 2001
From: "Daniel S. Billing"
Date: Sun, 10 Oct 2021 18:38:15 +0200
Subject: [PATCH 117/179] Update i18n.js
---
src/i18n.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/i18n.js b/src/i18n.js
index ca47742e6..83f71d5db 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -11,6 +11,7 @@ import itIT from "./languages/it-IT";
import ja from "./languages/ja";
import koKR from "./languages/ko-KR";
import nlNL from "./languages/nl-NL";
+import nbNO from "./languages/nb-NO";
import pl from "./languages/pl";
import ptBR from "./languages/pt-BR";
import bgBG from "./languages/bg-BG";
@@ -28,6 +29,7 @@ const languageList = {
"bg-BG": bgBG,
"de-DE": deDE,
"nl-NL": nlNL,
+ "nb-NO": nbNO,
"es-ES": esEs,
"fa": fa,
"pt-BR": ptBR,
From 62805014df64346504510fb09689d35f39ec01b7 Mon Sep 17 00:00:00 2001
From: "Daniel S. Billing"
Date: Sun, 10 Oct 2021 18:38:19 +0200
Subject: [PATCH 118/179] Update Settings.vue
---
src/pages/Settings.vue | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index 259f334b7..8fad9d143 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -357,6 +357,12 @@
Használja megfontoltan!
+
+ Er du sikker på at du vil deaktiver autentisering ?
+ Dette er for de som har tredjepartsautorisering foran Uptime Kuma, for eksempel Cloudflare Access.
+ Vennligst vær forsiktig.
+
+
Are you sure want to disable auth ?
From bb9a9366588b7578fd398df269a18977b5e7ae5a Mon Sep 17 00:00:00 2001
From: "Daniel S. Billing"
Date: Sun, 10 Oct 2021 18:49:03 +0200
Subject: [PATCH 119/179] Translated some of the notifications services
---
src/languages/nb-NO.js | 50 +++++++++++++++++++++---------------------
1 file changed, 25 insertions(+), 25 deletions(-)
diff --git a/src/languages/nb-NO.js b/src/languages/nb-NO.js
index b3ba9380a..687bdd9cb 100644
--- a/src/languages/nb-NO.js
+++ b/src/languages/nb-NO.js
@@ -185,51 +185,51 @@ export default {
"Required": "Obligatorisk",
"telegram": "Telegram",
"Bot Token": "Bot Token",
- "You can get a token from": "You can get a token from",
+ "You can get a token from": "Du kan få et token fra",
"Chat ID": "Chat ID",
supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
- wayToGetTelegramChatID: "You can get your chat id by sending message to the bot and go to this url to view the chat_id:",
- "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
- chatIDNotFound: "Chat ID is not found, please send a message to this bot first",
+ wayToGetTelegramChatID: "Du kan få chat-ID-en din ved å sende meldingen til boten og gå til denne nettadressen for å se chat_id:",
+ "YOUR BOT TOKEN HERE": "DITT BOT TOKEN HER",
+ chatIDNotFound: "Chat-ID ble ikke funnet. Send en melding til denne boten først",
"webhook": "Webhook",
"Post URL": "Post URL",
"Content Type": "Content Type",
- webhookJsonDesc: "{0} is good for any modern http servers such as express.js",
- webhookFormDataDesc: "{multipart} is good for PHP, you just need to parse the json by {decodeFunction}",
- "smtp": "Email (SMTP)",
+ webhookJsonDesc: "{0} er bra for alle moderne HTTP-servere som express.js",
+ webhookFormDataDesc: "{multipart} er bra for PHP, du trenger bare å analysere JSON etter {decodeFunction}",
+ "smtp": "E-post (SMTP)",
secureOptionNone: "None / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
- "Ignore TLS Error": "Ignore TLS Error",
- "From Email": "From Email",
- "To Email": "To Email",
+ "Ignore TLS Error": "Ignorer TLS feilmelding",
+ "From Email": "Fra E-post",
+ "To Email": "Til E-post",
smtpCC: "CC",
smtpBCC: "BCC",
"discord": "Discord",
"Discord Webhook URL": "Discord Webhook URL",
- wayToGetDiscordURL: "You can get this by going to Server Settings -> Integrations -> Create Webhook",
- "Bot Display Name": "Bot Display Name",
- "Prefix Custom Message": "Prefix Custom Message",
- "Hello @everyone is...": "Hello {'@'}everyone is...",
+ wayToGetDiscordURL: "Du kan få dette ved å gå til Serverinnstillinger -> Integrasjoner -> Webhooks -> Ny webhook",
+ "Bot Display Name": "Bot Visningsnavn",
+ "Prefix Custom Message": "Prefiks tilpasset melding",
+ "Hello @everyone is...": "Hei {'@'}everyone det er...",
"teams": "Microsoft Teams",
"Webhook URL": "Webhook URL",
- wayToGetTeamsURL: "You can learn how to create a webhook url {0}.",
+ wayToGetTeamsURL: "Du kan lære hvordan du oppretter en webhook-URL {0}.",
"signal": "Signal",
- "Number": "Number",
- "Recipients": "Recipients",
- needSignalAPI: "You need to have a signal client with REST API.",
- wayToCheckSignalURL: "You can check this url to view how to setup one:",
- signalImportant: "IMPORTANT: You cannot mix groups and numbers in recipients!",
+ "Number": "Nummer",
+ "Recipients": "Mottakere",
+ needSignalAPI: "Du må ha en Signal-klient med REST API.",
+ wayToCheckSignalURL: "Du kan sjekke denne nettadressen for å se hvordan du konfigurerer en:",
+ signalImportant: "VIKTIG: Du kan ikke blande grupper og nummere i mottakere!",
"gotify": "Gotify",
"Application Token": "Application Token",
"Server URL": "Server URL",
- "Priority": "Priority",
+ "Priority": "Prioritet",
"slack": "Slack",
"Icon Emoji": "Icon Emoji",
- "Channel Name": "Channel Name",
+ "Channel Name": "Kanal navn",
"Uptime Kuma URL": "Uptime Kuma URL",
- aboutWebhooks: "More info about webhooks on: {0}",
- aboutChannelName: "Enter the channel name on {0} Channel Name field if you want to bypass the webhook channel. Ex: #other-channel",
- aboutKumaURL: "If you leave the Uptime Kuma URL field blank, it will default to the Project Github page.",
+ aboutWebhooks: "Mer informasjon om webhooks på: {0}",
+ aboutChannelName: "Skriv inn kanalnavnet på {0} Kanalnavn-feltet hvis du vil omgå webhook-kanalen. Eks: #other-channel",
+ aboutKumaURL: "Hvis du lar Uptime Kuma URL feltet være blank, den blir som standard til Github-siden for dette prosjektet.",
emojiCheatSheet: "Emoji cheat sheet: {0}",
"rocket.chat": "Rocket.chat",
pushover: "Pushover",
From 037fdd73a3a24883fbe9be5030f1a2c267855368 Mon Sep 17 00:00:00 2001
From: "Daniel S. Billing"
Date: Sun, 10 Oct 2021 18:50:18 +0200
Subject: [PATCH 120/179] Norsk
---
src/languages/nb-NO.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/languages/nb-NO.js b/src/languages/nb-NO.js
index 687bdd9cb..c667b8ac4 100644
--- a/src/languages/nb-NO.js
+++ b/src/languages/nb-NO.js
@@ -1,5 +1,5 @@
export default {
- languageName: "Norwegian",
+ languageName: "Norsk",
checkEverySecond: "Sjekk hvert {0} sekund.",
retryCheckEverySecond: "Prøv igjen hvert {0} sekund.",
retriesDescription: "Maksimalt antall forsøk før tjenesten er merket som nede og et varsel sendes",
From 4e94cb9aadb7637de51e60f7070741f793c87424 Mon Sep 17 00:00:00 2001
From: LouisLam
Date: Mon, 11 Oct 2021 00:51:18 +0800
Subject: [PATCH 121/179] fix upload dist path
---
dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dockerfile b/dockerfile
index 38d585ca7..97655748e 100644
--- a/dockerfile
+++ b/dockerfile
@@ -47,5 +47,5 @@ RUN chmod +x /app/extra/upload-github-release-asset.sh
# Dist only
RUN cd /app && tar -zcvf $DIST dist
-RUN /app/extra/upload-github-release-asset.sh github_api_token=$GITHUB_TOKEN owner=louislam repo=uptime-kuma tag=$VERSION filename=$DIST
+RUN /app/extra/upload-github-release-asset.sh github_api_token=$GITHUB_TOKEN owner=louislam repo=uptime-kuma tag=$VERSION filename=/app/$DIST
From e5286b0973dd4c5a6aecb750417185b919264699 Mon Sep 17 00:00:00 2001
From: LouisLam
Date: Mon, 11 Oct 2021 00:52:46 +0800
Subject: [PATCH 122/179] eslint for ko-KR.js
---
src/languages/ko-KR.js | 558 ++++++++++++++++++++---------------------
1 file changed, 279 insertions(+), 279 deletions(-)
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index d88db63b5..d04ff050a 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -1,282 +1,282 @@
export default {
- languageName: '한국어',
- checkEverySecond: '{0}초마다 확인해요.',
- retryCheckEverySecond: '{0}초마다 다시 확인해요.',
- retriesDescription: '서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수',
- ignoreTLSError: 'HTTPS 웹사이트에서 TLS/SSL 에러 무시하기',
- upsideDownModeDescription: '서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거에요.',
- maxRedirectDescription: '최대 리다이렉트 횟수에요. 0을 입력하면 리다이렉트를 꺼요.',
- acceptedStatusCodesDescription: '응답 성공으로 간주할 상태 코드를 정해요.',
- passwordNotMatchMsg: '비밀번호 재입력이 일치하지 않아요.',
- notificationDescription: '모니터링에 알림을 설정할 수 있어요.',
- keywordDescription: 'Html 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.',
- pauseDashboardHome: '일시 정지',
- deleteMonitorMsg: '정말 이 모니터링을 삭제할까요?',
- deleteNotificationMsg: '정말 이 알림을 모든 모니터링에서 삭제할까요?',
- resoverserverDescription: 'Cloudflare가 기본 서버에요, 원한다면 언제나 다른 resolver 서버로 변경할 수 있어요.',
- rrtypeDescription: '모니터링할 RR-Type을 선택해요.',
- pauseMonitorMsg: '정말 이 모니터링을 일시 정지 할까요?',
- enableDefaultNotificationDescription: '새로 추가하는 모든 모니터링에 이 알림을 기본적으로 활성화해요. 각 모니터에 대해 별도로 알림을 비활성화할 수 있어요.',
- clearEventsMsg: '정말 이 모니터링에 대한 모든 이벤트를 삭제할까요?',
- clearHeartbeatsMsg: '정말 이 모니터링에 대한 모든 하트비트를 삭제할까요?',
- confirmClearStatisticsMsg: '정말 모든 통계를 삭제할까요?',
+ languageName: "한국어",
+ checkEverySecond: "{0}초마다 확인해요.",
+ retryCheckEverySecond: "{0}초마다 다시 확인해요.",
+ retriesDescription: "서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수",
+ ignoreTLSError: "HTTPS 웹사이트에서 TLS/SSL 에러 무시하기",
+ upsideDownModeDescription: "서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거에요.",
+ maxRedirectDescription: "최대 리다이렉트 횟수에요. 0을 입력하면 리다이렉트를 꺼요.",
+ acceptedStatusCodesDescription: "응답 성공으로 간주할 상태 코드를 정해요.",
+ passwordNotMatchMsg: "비밀번호 재입력이 일치하지 않아요.",
+ notificationDescription: "모니터링에 알림을 설정할 수 있어요.",
+ keywordDescription: "Html 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.",
+ pauseDashboardHome: "일시 정지",
+ deleteMonitorMsg: "정말 이 모니터링을 삭제할까요?",
+ deleteNotificationMsg: "정말 이 알림을 모든 모니터링에서 삭제할까요?",
+ resoverserverDescription: "Cloudflare가 기본 서버에요, 원한다면 언제나 다른 resolver 서버로 변경할 수 있어요.",
+ rrtypeDescription: "모니터링할 RR-Type을 선택해요.",
+ pauseMonitorMsg: "정말 이 모니터링을 일시 정지 할까요?",
+ enableDefaultNotificationDescription: "새로 추가하는 모든 모니터링에 이 알림을 기본적으로 활성화해요. 각 모니터에 대해 별도로 알림을 비활성화할 수 있어요.",
+ clearEventsMsg: "정말 이 모니터링에 대한 모든 이벤트를 삭제할까요?",
+ clearHeartbeatsMsg: "정말 이 모니터링에 대한 모든 하트비트를 삭제할까요?",
+ confirmClearStatisticsMsg: "정말 모든 통계를 삭제할까요?",
importHandleDescription: "이름이 같은 모든 모니터링이나 알림을 건너뛰려면 '기존값 건너뛰기'를 선택해주세요. '덮어쓰기'는 기존의 모든 모니터링과 알림을 삭제해요.",
- confirmImportMsg: '정말 백업을 가져올까요? 가져오기 옵션을 제대로 설정했는지 다시 확인해주세요.',
- twoFAVerifyLabel: '토큰을 입력해 2단계 인증이 작동하는지 확인해주세요.',
- tokenValidSettingsMsg: '토큰이 유효해요! 이제 2단계 인증 설정을 저장할 수 있어요.',
- confirmEnableTwoFAMsg: '정말 2단계 인증을 활성화 할까요?',
- confirmDisableTwoFAMsg: '정말 2단계 인증을 비활성화 할까요?',
- Settings: '설정',
- Dashboard: '대시보드',
- 'New Update': '새로운 업데이트',
- Language: '언어',
- Appearance: '외형',
- Theme: '테마',
- General: '일반',
- Version: '버전',
- 'Check Update On GitHub': '깃허브에서 업데이트 확인',
- List: '목록',
- Add: '추가',
- 'Add New Monitor': '새로운 모니터링 추가하기',
- 'Quick Stats': '간단한 정보',
- Up: '온라인',
- Down: '오프라인',
- Pending: '대기 중',
- Unknown: '알 수 없음',
- Pause: '일시 정지',
- Name: '이름',
- Status: '상태',
- DateTime: '날짜',
- Message: '메시지',
- 'No important events': '중요 이벤트 없음',
- Resume: '재개',
- Edit: '수정',
- Delete: '삭제',
- Current: '현재',
- Uptime: '업타임',
- 'Cert Exp.': '인증서 만료',
- days: '일',
- day: '일',
- '-day': '-일',
- hour: '시간',
- '-hour': '-시간',
- Response: '응답',
- Ping: '핑',
- 'Monitor Type': '모니터링 종류',
- Keyword: '키워드',
- 'Friendly Name': '이름',
- URL: 'URL',
- Hostname: '호스트네임',
- Port: '포트',
- 'Heartbeat Interval': '하트비트 주기',
- Retries: '재시도',
- 'Heartbeat Retry Interval': '하트비드 재시도 주기',
- Advanced: '고급',
- 'Upside Down Mode': '상태 반전 모드',
- 'Max. Redirects': '최대 리다이렉트',
- 'Accepted Status Codes': '응답 성공 상태 코드',
- Save: '저장',
- Notifications: '알림',
- 'Not available, please setup.': '존재하지 않아요, 새로운거 하나 만드는건 어때요?',
- 'Setup Notification': '알림 설정',
- Light: '라이트',
- Dark: '다크',
- Auto: '자동',
- 'Theme - Heartbeat Bar': '테마 - 하트비트 바',
- Normal: '기본값',
- Bottom: '가운데',
- None: '없애기',
- Timezone: '시간대',
- 'Search Engine Visibility': '검색 엔진 활성화',
- 'Allow indexing': '인덱싱 허용',
- 'Discourage search engines from indexing site': '검색 엔진 인덱싱 거부',
- 'Change Password': '비밀번호 변경',
- 'Current Password': '기존 비밀번호',
- 'New Password': '새로운 비밀번호',
- 'Repeat New Password': '새로운 비밀번호 재입력',
- 'Update Password': '비밀번호 변경',
- 'Disable Auth': '인증 비활성화',
- 'Enable Auth': '인증 활성화',
- Logout: '로그아웃',
- Leave: '나가기',
- 'I understand, please disable': '기능에 대해 이해했으니 꺼주세요.',
- Confirm: '확인',
- Yes: '확인',
- No: '취소',
- Username: '이름',
- Password: '비밀번호',
- 'Remember me': '비밀번호 기억하기',
- Login: '로그인',
- 'No Monitors, please': '모니터링이 없어요,',
- 'add one': '하나 추가해봐요',
- 'Notification Type': '알림 종류',
- Email: '이메일',
- Test: '테스트',
- 'Certificate Info': '인증서 정보',
- 'Resolver Server': 'Resolver 서버',
- 'Resource Record Type': '자원 레코드 유형',
- 'Last Result': '최근 결과',
- 'Create your admin account': '관리자 계정 만들기',
- 'Repeat Password': '비밀번호 재입력',
- 'Import Backup': '백업 가져오기',
- 'Export Backup': '백업 내보내기',
- Export: '내보내기',
- Import: '가져오기',
- respTime: '응답 시간 (ms)',
- notAvailableShort: 'N/A',
- 'Default enabled': '기본 알림으로 설정',
- 'Apply on all existing monitors': '기존 모니터링에 모두 적용하기',
- Create: '생성하기',
- 'Clear Data': '데이터 삭제',
- Events: '이벤트',
- Heartbeats: '하트비트',
- 'Auto Get': '자동 Get',
- backupDescription: '모든 모니터링과 알림을 JSON 파일 형식에 저장할 수 있어요.',
- backupDescription2: '히스토리와 이벤트 데이터는 포함되어 있지 않아요.',
- backupDescription3: '알림 토큰과 같은 보안 데이터가 내보내기 파일에 포함되어 있으므로 관리에 주의해주세요.',
- alertNoFile: '가져오기를 하기 위해 파일을 선택해주세요.',
- alertWrongFileType: 'JSON 파일을 선택해주세요.',
- 'Clear all statistics': '모든 통계치 삭제',
- 'Skip existing': '기존값 건너뛰기',
- Overwrite: '덮어쓰기',
- Options: '옵션',
- 'Keep both': '두개 모두 보존',
- 'Verify Token': '토큰 검증',
- 'Setup 2FA': '2단계 인증 설정하기',
- 'Enable 2FA': '2단계 인증 활성화',
- 'Disable 2FA': '2단계 인증 비활성화',
- '2FA Settings': '2단계 인증 설정',
- 'Two Factor Authentication': '2단계 인증',
- Active: '활성화',
- Inactive: '비활성화',
- Token: '토큰',
- 'Show URI': 'URI 보기',
- Tags: '태그',
- 'Add New below or Select...': '아래 새롭게 추가 또는 선택...',
- 'Tag with this name already exist.': '같은 태그 이름이 이미 존재해요.',
- 'Tag with this value already exist.': '같은 값을 가진 태그가 이미 존재해요.',
- color: '색상',
- 'value (optional)': '값 (선택)',
- Gray: '회색',
- Red: '빨강색',
- Orange: '주황색',
- Green: '초록색',
- Blue: '파랑색',
- Indigo: '남색',
- Purple: '보라색',
- Pink: '핑크색',
- 'Search...': '검색...',
- 'Avg. Ping': '평균 핑',
- 'Avg. Response': '평균 응답',
- 'Entry Page': '첫 페이지',
- statusPageNothing: '아무것도 없어요. 새로운 그룹 또는 모니터링을 추가해주세요.',
- 'No Services': '서비스 없음',
- 'All Systems Operational': '모든 시스템 정상',
- 'Partially Degraded Service': '일부 시스템 비정상',
- 'Degraded Service': '모든 시스템 비정상',
- 'Add Group': '그룹 추가',
- 'Add a monitor': '모니터링 추가r',
- 'Edit Status Page': '상태 페이지 수정',
- 'Go to Dashboard': '대쉬보드로 가기',
- 'Status Page': '상태 페이지',
- defaultNotificationName: '내 {notification} 알림 ({number})',
- here: '여기',
- Required: '필수',
- telegram: 'Telegram',
- 'Bot Token': '봇 토큰',
- 'You can get a token from': '토큰은 여기서 얻을 수 있어요:',
- 'Chat ID': '채팅 ID',
+ confirmImportMsg: "정말 백업을 가져올까요? 가져오기 옵션을 제대로 설정했는지 다시 확인해주세요.",
+ twoFAVerifyLabel: "토큰을 입력해 2단계 인증이 작동하는지 확인해주세요.",
+ tokenValidSettingsMsg: "토큰이 유효해요! 이제 2단계 인증 설정을 저장할 수 있어요.",
+ confirmEnableTwoFAMsg: "정말 2단계 인증을 활성화 할까요?",
+ confirmDisableTwoFAMsg: "정말 2단계 인증을 비활성화 할까요?",
+ Settings: "설정",
+ Dashboard: "대시보드",
+ "New Update": "새로운 업데이트",
+ Language: "언어",
+ Appearance: "외형",
+ Theme: "테마",
+ General: "일반",
+ Version: "버전",
+ "Check Update On GitHub": "깃허브에서 업데이트 확인",
+ List: "목록",
+ Add: "추가",
+ "Add New Monitor": "새로운 모니터링 추가하기",
+ "Quick Stats": "간단한 정보",
+ Up: "온라인",
+ Down: "오프라인",
+ Pending: "대기 중",
+ Unknown: "알 수 없음",
+ Pause: "일시 정지",
+ Name: "이름",
+ Status: "상태",
+ DateTime: "날짜",
+ Message: "메시지",
+ "No important events": "중요 이벤트 없음",
+ Resume: "재개",
+ Edit: "수정",
+ Delete: "삭제",
+ Current: "현재",
+ Uptime: "업타임",
+ "Cert Exp.": "인증서 만료",
+ days: "일",
+ day: "일",
+ "-day": "-일",
+ hour: "시간",
+ "-hour": "-시간",
+ Response: "응답",
+ Ping: "핑",
+ "Monitor Type": "모니터링 종류",
+ Keyword: "키워드",
+ "Friendly Name": "이름",
+ URL: "URL",
+ Hostname: "호스트네임",
+ Port: "포트",
+ "Heartbeat Interval": "하트비트 주기",
+ Retries: "재시도",
+ "Heartbeat Retry Interval": "하트비드 재시도 주기",
+ Advanced: "고급",
+ "Upside Down Mode": "상태 반전 모드",
+ "Max. Redirects": "최대 리다이렉트",
+ "Accepted Status Codes": "응답 성공 상태 코드",
+ Save: "저장",
+ Notifications: "알림",
+ "Not available, please setup.": "존재하지 않아요, 새로운거 하나 만드는건 어때요?",
+ "Setup Notification": "알림 설정",
+ Light: "라이트",
+ Dark: "다크",
+ Auto: "자동",
+ "Theme - Heartbeat Bar": "테마 - 하트비트 바",
+ Normal: "기본값",
+ Bottom: "가운데",
+ None: "없애기",
+ Timezone: "시간대",
+ "Search Engine Visibility": "검색 엔진 활성화",
+ "Allow indexing": "인덱싱 허용",
+ "Discourage search engines from indexing site": "검색 엔진 인덱싱 거부",
+ "Change Password": "비밀번호 변경",
+ "Current Password": "기존 비밀번호",
+ "New Password": "새로운 비밀번호",
+ "Repeat New Password": "새로운 비밀번호 재입력",
+ "Update Password": "비밀번호 변경",
+ "Disable Auth": "인증 비활성화",
+ "Enable Auth": "인증 활성화",
+ Logout: "로그아웃",
+ Leave: "나가기",
+ "I understand, please disable": "기능에 대해 이해했으니 꺼주세요.",
+ Confirm: "확인",
+ Yes: "확인",
+ No: "취소",
+ Username: "이름",
+ Password: "비밀번호",
+ "Remember me": "비밀번호 기억하기",
+ Login: "로그인",
+ "No Monitors, please": "모니터링이 없어요,",
+ "add one": "하나 추가해봐요",
+ "Notification Type": "알림 종류",
+ Email: "이메일",
+ Test: "테스트",
+ "Certificate Info": "인증서 정보",
+ "Resolver Server": "Resolver 서버",
+ "Resource Record Type": "자원 레코드 유형",
+ "Last Result": "최근 결과",
+ "Create your admin account": "관리자 계정 만들기",
+ "Repeat Password": "비밀번호 재입력",
+ "Import Backup": "백업 가져오기",
+ "Export Backup": "백업 내보내기",
+ Export: "내보내기",
+ Import: "가져오기",
+ respTime: "응답 시간 (ms)",
+ notAvailableShort: "N/A",
+ "Default enabled": "기본 알림으로 설정",
+ "Apply on all existing monitors": "기존 모니터링에 모두 적용하기",
+ Create: "생성하기",
+ "Clear Data": "데이터 삭제",
+ Events: "이벤트",
+ Heartbeats: "하트비트",
+ "Auto Get": "자동 Get",
+ backupDescription: "모든 모니터링과 알림을 JSON 파일 형식에 저장할 수 있어요.",
+ backupDescription2: "히스토리와 이벤트 데이터는 포함되어 있지 않아요.",
+ backupDescription3: "알림 토큰과 같은 보안 데이터가 내보내기 파일에 포함되어 있으므로 관리에 주의해주세요.",
+ alertNoFile: "가져오기를 하기 위해 파일을 선택해주세요.",
+ alertWrongFileType: "JSON 파일을 선택해주세요.",
+ "Clear all statistics": "모든 통계치 삭제",
+ "Skip existing": "기존값 건너뛰기",
+ Overwrite: "덮어쓰기",
+ Options: "옵션",
+ "Keep both": "두개 모두 보존",
+ "Verify Token": "토큰 검증",
+ "Setup 2FA": "2단계 인증 설정하기",
+ "Enable 2FA": "2단계 인증 활성화",
+ "Disable 2FA": "2단계 인증 비활성화",
+ "2FA Settings": "2단계 인증 설정",
+ "Two Factor Authentication": "2단계 인증",
+ Active: "활성화",
+ Inactive: "비활성화",
+ Token: "토큰",
+ "Show URI": "URI 보기",
+ Tags: "태그",
+ "Add New below or Select...": "아래 새롭게 추가 또는 선택...",
+ "Tag with this name already exist.": "같은 태그 이름이 이미 존재해요.",
+ "Tag with this value already exist.": "같은 값을 가진 태그가 이미 존재해요.",
+ color: "색상",
+ "value (optional)": "값 (선택)",
+ Gray: "회색",
+ Red: "빨강색",
+ Orange: "주황색",
+ Green: "초록색",
+ Blue: "파랑색",
+ Indigo: "남색",
+ Purple: "보라색",
+ Pink: "핑크색",
+ "Search...": "검색...",
+ "Avg. Ping": "평균 핑",
+ "Avg. Response": "평균 응답",
+ "Entry Page": "첫 페이지",
+ statusPageNothing: "아무것도 없어요. 새로운 그룹 또는 모니터링을 추가해주세요.",
+ "No Services": "서비스 없음",
+ "All Systems Operational": "모든 시스템 정상",
+ "Partially Degraded Service": "일부 시스템 비정상",
+ "Degraded Service": "모든 시스템 비정상",
+ "Add Group": "그룹 추가",
+ "Add a monitor": "모니터링 추가r",
+ "Edit Status Page": "상태 페이지 수정",
+ "Go to Dashboard": "대쉬보드로 가기",
+ "Status Page": "상태 페이지",
+ defaultNotificationName: "내 {notification} 알림 ({number})",
+ here: "여기",
+ Required: "필수",
+ telegram: "Telegram",
+ "Bot Token": "봇 토큰",
+ "You can get a token from": "토큰은 여기서 얻을 수 있어요:",
+ "Chat ID": "채팅 ID",
supportTelegramChatID: "Direct Chat / Group / Channel's Chat ID를 지원해요.",
- wayToGetTelegramChatID: '봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요.',
- 'YOUR BOT TOKEN HERE': 'YOUR BOT TOKEN HERE',
- chatIDNotFound: '채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요.',
- webhook: '웹훅',
- 'Post URL': 'Post URL',
- 'Content Type': 'Content Type',
- webhookJsonDesc: '{0}은 express.js와 같은 최신 HTTP 서버에 적합해요.',
- webhookFormDataDesc: '{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 되어요.',
- smtp: 'Email (SMTP)',
- secureOptionNone: '없음 / STARTTLS (25, 587)',
- secureOptionTLS: 'TLS (465)',
- 'Ignore TLS Error': 'TLS 에러 무시하기',
- 'From Email': '보내는 이메일',
- 'To Email': '받는 이메일',
- smtpCC: '참조',
- smtpBCC: '숨은 참조',
- discord: 'Discord',
- 'Discord Webhook URL': 'Discord 웹훅 URL',
- wayToGetDiscordURL: '서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요.',
- 'Bot Display Name': '표시 이름',
- 'Prefix Custom Message': '접두사 메시지',
- 'Hello @everyone is...': "{'@'}everyone 서버 상태 알림이에요...",
- teams: 'Microsoft Teams',
- 'Webhook URL': '웹훅 URL',
- wayToGetTeamsURL: '{0}에서 웹훅을 어떻게 만드는지 알아봐요.',
- signal: 'Signal',
- Number: '숫자',
- Recipients: '받는 사람',
- needSignalAPI: 'REST API를 사용하는 Signal 클라이언트가 있어야 해요.',
- wayToCheckSignalURL: '밑에 URL을 확인해 URL 설정 방법을 볼 수 있어요.',
- signalImportant: '중요: 받는 사람의 그룹과 숫자는 섞을 수 없어요!',
- gotify: 'Gotify',
- 'Application Token': '애플리케이션 토큰',
- 'Server URL': '서버 URL',
- Priority: 'Priority',
- slack: 'Slack',
- 'Icon Emoji': '아이콘 이모지',
- 'Channel Name': '채널 이름',
- 'Uptime Kuma URL': 'Uptime Kuma URL',
- aboutWebhooks: '웹훅에 대한 설명: {0}',
- aboutChannelName: '웹훅 채널을 우회하려면 {0} 채널 이름칸에 채널 이름을 입력해주세요. 예: #기타-채널',
- aboutKumaURL: 'Uptime Kuma URL칸을 공백으로 두면 기본적으로 Project Github 페이지로 설정해요.',
- emojiCheatSheet: '이모지 목록 시트: {0}',
- 'rocket.chat': 'Rocket.chat',
- pushover: 'Pushover',
- pushy: 'Pushy',
- octopush: 'Octopush',
- promosms: 'PromoSMS',
- lunasea: 'LunaSea',
- apprise: 'Apprise (50개 이상 알림 서비스)',
- pushbullet: 'Pushbullet',
- line: 'Line Messenger',
- mattermost: 'Mattermost',
- 'User Key': '사용자 키',
- Device: '장치',
- 'Message Title': '메시지 제목',
- 'Notification Sound': '알림음',
- 'More info on:': '자세한 정보: {0}',
- pushoverDesc1: '긴급 우선 순위 (2)는 재시도 사이에 기본적으로 30초의 타임아웃이 있고, 1시간 후에 만료되어요.',
- pushoverDesc2: '다른 장치에 알림을 보내려면 장치칸을 입력해주세요.',
- 'SMS Type': 'SMS 종류',
- octopushTypePremium: '프리미엄 (빠름) - 알림 기능에 적합해요)',
- octopushTypeLowCost: '저렴한 요금 (느림, 가끔 차단될 수 있어요)',
- 'Check octopush prices': '{0}에서 octopush 가격을 확인할 수 있어요.',
- octopushPhoneNumber: '휴대전화 번호 (intl format, eg : +33612345678) ',
- octopushSMSSender: '보내는 사람 이름 : 3-11개의 영숫자 및 여백공간 (a-z, A-Z, 0-9',
- 'LunaSea Device ID': 'LunaSea 장치 ID',
- 'Apprise URL': 'Apprise URL',
- 'Example:': '예: {0}',
- 'Read more:': '더 보기: {0}',
- 'Status:': '상태: {0}',
- 'Read more': '더 보기',
- appriseInstalled: 'Apprise가 설치되어있어요..',
- appriseNotInstalled: 'Apprise 가 설치되어있지 않아요. {0}',
- 'Access Token': '액세스 토큰',
- 'Channel access token': '채널 엑세스 토큰',
- 'Line Developers Console': 'Line 개발자 콘솔',
- lineDevConsoleTo: 'Line 개발자 콘솔 - {0}',
- 'Basic Settings': 'Basic Settings 메뉴',
- 'User ID': '사용자 ID',
- 'Messaging API': 'Messaging API 메뉴',
- wayToGetLineChannelToken: '먼저 {0}에 엑세스하고, 공급자 및 채널 (메시징 API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.',
- 'Icon URL': '아이콘 URL',
- aboutIconURL: '"Icon URL"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을거에요.',
- aboutMattermostChannelName: '채널 이름을 입력하면 웹훅이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널',
- matrix: '매트릭스',
- promosmsTypeEco: 'SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요. ',
- promosmsTypeFlash: 'SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시되어요. 폴란드 수신자만 사용할 수 있어요.',
- promosmsTypeFull: 'SMS FULL - SMS 프리미엄 티어, 보내는 사람 이름을 먼저 등록해야 해요. 알림 기능에 적합해요.',
- promosmsTypeSpeed: 'SMS SPEED - 시스템에서 가장 높은 우선순위에요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).',
- promosmsPhoneNumber: '전화 번호 (폴란드 수신자라면 지역번호를 적지 않아도 돼요.)',
- promosmsSMSSender: 'SMS 보내는 사람 이름 : 미리 등록된 이름 혹은 기본값 중 하나에요: InfoSMS, SMS Info, MaxSMS, INFO, SMS'
-}
\ No newline at end of file
+ wayToGetTelegramChatID: "봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요.",
+ "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
+ chatIDNotFound: "채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요.",
+ webhook: "웹훅",
+ "Post URL": "Post URL",
+ "Content Type": "Content Type",
+ webhookJsonDesc: "{0}은 express.js와 같은 최신 HTTP 서버에 적합해요.",
+ webhookFormDataDesc: "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 되어요.",
+ smtp: "Email (SMTP)",
+ secureOptionNone: "없음 / STARTTLS (25, 587)",
+ secureOptionTLS: "TLS (465)",
+ "Ignore TLS Error": "TLS 에러 무시하기",
+ "From Email": "보내는 이메일",
+ "To Email": "받는 이메일",
+ smtpCC: "참조",
+ smtpBCC: "숨은 참조",
+ discord: "Discord",
+ "Discord Webhook URL": "Discord 웹훅 URL",
+ wayToGetDiscordURL: "서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요.",
+ "Bot Display Name": "표시 이름",
+ "Prefix Custom Message": "접두사 메시지",
+ "Hello @everyone is...": "{'@'}everyone 서버 상태 알림이에요...",
+ teams: "Microsoft Teams",
+ "Webhook URL": "웹훅 URL",
+ wayToGetTeamsURL: "{0}에서 웹훅을 어떻게 만드는지 알아봐요.",
+ signal: "Signal",
+ Number: "숫자",
+ Recipients: "받는 사람",
+ needSignalAPI: "REST API를 사용하는 Signal 클라이언트가 있어야 해요.",
+ wayToCheckSignalURL: "밑에 URL을 확인해 URL 설정 방법을 볼 수 있어요.",
+ signalImportant: "중요: 받는 사람의 그룹과 숫자는 섞을 수 없어요!",
+ gotify: "Gotify",
+ "Application Token": "애플리케이션 토큰",
+ "Server URL": "서버 URL",
+ Priority: "Priority",
+ slack: "Slack",
+ "Icon Emoji": "아이콘 이모지",
+ "Channel Name": "채널 이름",
+ "Uptime Kuma URL": "Uptime Kuma URL",
+ aboutWebhooks: "웹훅에 대한 설명: {0}",
+ aboutChannelName: "웹훅 채널을 우회하려면 {0} 채널 이름칸에 채널 이름을 입력해주세요. 예: #기타-채널",
+ aboutKumaURL: "Uptime Kuma URL칸을 공백으로 두면 기본적으로 Project Github 페이지로 설정해요.",
+ emojiCheatSheet: "이모지 목록 시트: {0}",
+ "rocket.chat": "Rocket.chat",
+ pushover: "Pushover",
+ pushy: "Pushy",
+ octopush: "Octopush",
+ promosms: "PromoSMS",
+ lunasea: "LunaSea",
+ apprise: "Apprise (50개 이상 알림 서비스)",
+ pushbullet: "Pushbullet",
+ line: "Line Messenger",
+ mattermost: "Mattermost",
+ "User Key": "사용자 키",
+ Device: "장치",
+ "Message Title": "메시지 제목",
+ "Notification Sound": "알림음",
+ "More info on:": "자세한 정보: {0}",
+ pushoverDesc1: "긴급 우선 순위 (2)는 재시도 사이에 기본적으로 30초의 타임아웃이 있고, 1시간 후에 만료되어요.",
+ pushoverDesc2: "다른 장치에 알림을 보내려면 장치칸을 입력해주세요.",
+ "SMS Type": "SMS 종류",
+ octopushTypePremium: "프리미엄 (빠름) - 알림 기능에 적합해요)",
+ octopushTypeLowCost: "저렴한 요금 (느림, 가끔 차단될 수 있어요)",
+ "Check octopush prices": "{0}에서 octopush 가격을 확인할 수 있어요.",
+ octopushPhoneNumber: "휴대전화 번호 (intl format, eg : +33612345678) ",
+ octopushSMSSender: "보내는 사람 이름 : 3-11개의 영숫자 및 여백공간 (a-z, A-Z, 0-9",
+ "LunaSea Device ID": "LunaSea 장치 ID",
+ "Apprise URL": "Apprise URL",
+ "Example:": "예: {0}",
+ "Read more:": "더 보기: {0}",
+ "Status:": "상태: {0}",
+ "Read more": "더 보기",
+ appriseInstalled: "Apprise가 설치되어있어요..",
+ appriseNotInstalled: "Apprise 가 설치되어있지 않아요. {0}",
+ "Access Token": "액세스 토큰",
+ "Channel access token": "채널 엑세스 토큰",
+ "Line Developers Console": "Line 개발자 콘솔",
+ lineDevConsoleTo: "Line 개발자 콘솔 - {0}",
+ "Basic Settings": "Basic Settings 메뉴",
+ "User ID": "사용자 ID",
+ "Messaging API": "Messaging API 메뉴",
+ wayToGetLineChannelToken: "먼저 {0}에 엑세스하고, 공급자 및 채널 (메시징 API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.",
+ "Icon URL": "아이콘 URL",
+ aboutIconURL: "\"Icon URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을거에요.",
+ aboutMattermostChannelName: "채널 이름을 입력하면 웹훅이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널",
+ matrix: "매트릭스",
+ promosmsTypeEco: "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요. ",
+ promosmsTypeFlash: "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시되어요. 폴란드 수신자만 사용할 수 있어요.",
+ promosmsTypeFull: "SMS FULL - SMS 프리미엄 티어, 보내는 사람 이름을 먼저 등록해야 해요. 알림 기능에 적합해요.",
+ promosmsTypeSpeed: "SMS SPEED - 시스템에서 가장 높은 우선순위에요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).",
+ promosmsPhoneNumber: "전화 번호 (폴란드 수신자라면 지역번호를 적지 않아도 돼요.)",
+ promosmsSMSSender: "SMS 보내는 사람 이름 : 미리 등록된 이름 혹은 기본값 중 하나에요: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+};
From ecc25ba59695888a531f964dff39560b988c9ddc Mon Sep 17 00:00:00 2001
From: RisedSky
Date: Sun, 10 Oct 2021 19:02:35 +0200
Subject: [PATCH 123/179] Update fr-FR.js
Fixed wrong string
Also, "Primary Base URL" is missing from english file
---
src/languages/fr-FR.js | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index 6d65f375c..0111d4b89 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -130,7 +130,7 @@ export default {
"Clear Data": "Effacer les données",
Events: "Evénements",
Heartbeats: "Vérfications",
- "Auto Get": "Auto Get",
+ "Auto Get": "Récuperer automatiquement",
backupDescription: "Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.",
backupDescription2: "PS: Les données relatives à l'historique et aux événements ne sont pas incluses.",
backupDescription3: "Les données sensibles telles que les jetons de notification sont incluses dans le fichier d'exportation, veuillez les conserver soigneusement.",
@@ -152,11 +152,11 @@ export default {
Token: "Jeton",
"Show URI": "Afficher l'URI",
Tags: "Étiquettes",
- "Add New below or Select...": "Ajouter nouveau ci-dessous ou sélectionner...",
+ "Add New below or Select...": "Ajoutez-en un en dessous ou sélectionnez-le ici...",
"Tag with this name already exist.": "Une étiquette portant ce nom existe déjà.",
"Tag with this value already exist.": "Une étiquette avec cette valeur existe déjà.",
- color: "couleur",
- "value (optional)": "valeur (facultatif)",
+ color: "Couleur",
+ "value (optional)": "Valeur (facultatif)",
Gray: "Gris",
Red: "Rouge",
Orange: "Orange",
@@ -194,8 +194,8 @@ export default {
"webhook": "Webhook",
"Post URL": "Post URL",
"Content Type": "Content Type",
- webhookJsonDesc: "{0} est bon pour tous les serveurs HTTP modernes comme express.js",
- webhookFormDataDesc: "{multipart} est bon pour du PHP, vous avez juste besoin de mettre le json via {decodeFunction}",
+ webhookJsonDesc: "{0} est bien/bon pour tous les serveurs HTTP modernes comme express.js",
+ webhookFormDataDesc: "{multipart} est bien/bon pour du PHP, vous avez juste besoin de mettre le json via/depuis {decodeFunction}",
"smtp": "Email (SMTP)",
secureOptionNone: "Aucun / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
@@ -228,7 +228,7 @@ export default {
"Channel Name": "Nom du salon",
"Uptime Kuma URL": "Uptime Kuma URL",
aboutWebhooks: "Plus d'informations sur les Webhooks ici: {0}",
- aboutChannelName: "Mettez le nom du salon dans {0} dans Channel Name si vous voulez bypass le salon Webhook. Ex: #autre-salon",
+ aboutChannelName: "Mettez le nom du salon dans {0} dans 'Channel Name' si vous voulez bypass le salon Webhook. Ex: #autre-salon",
aboutKumaURL: "Si vous laissez l'URL d'Uptime Kuma vierge, elle redirigera vers la page du projet GitHub.",
emojiCheatSheet: "Emoji cheat sheet: {0}",
"rocket.chat": "Rocket.chat",
@@ -251,7 +251,7 @@ export default {
"SMS Type": "SMS Type",
octopushTypePremium: "Premium (Rapide - recommandé pour les alertes)",
octopushTypeLowCost: "A bas prix (Lent, bloqué de temps en temps par l'opérateur)",
- "Check octopush prices": "Vérifiez les prix d'octopush {0}.",
+ "Check octopush prices": "Vérifier les prix d'octopush {0}.",
octopushPhoneNumber: "Numéro de téléphone (format intérn., ex : +33612345678) ",
octopushSMSSender: "Nom de l'envoyer : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
"LunaSea Device ID": "LunaSea Device ID",
@@ -274,7 +274,7 @@ export default {
aboutIconURL: "Vous pouvez mettre un lien vers l'image dans \"Icon URL\" pour remplacer l'image de profil par défaut. Ne sera pas utilisé si Icon Emoji est défini.",
aboutMattermostChannelName: "Vous pouvez remplacer le salon par défaut que le Webhook utilise en mettant le nom du salon dans le champ \"Channel Name\". Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex: #autre-salon",
"matrix": "Matrix",
- promosmsTypeEco: "SMS ECO - Pas chère mais lent et souvent surchargé. Limité uniquement aux déstinataires Polonais.",
+ promosmsTypeEco: "SMS ECO - Pas cher mais lent et souvent surchargé. Limité uniquement aux déstinataires Polonais.",
promosmsTypeFlash: "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux déstinataires Polonais.",
promosmsTypeFull: "SMS FULL - Version Premium des SMS, Vous pouvez mettre le nom de l'expéditeur (Vous devez vous enregistrer avant). Fiable pour les alertes.",
promosmsTypeSpeed: "SMS SPEED - La plus haute des priorités dans le système. Très rapide et fiable mais cher (environ le double du prix d'un SMS FULL).",
From 503d1f0a91b95767b0aeab15aae704bf7f487ed9 Mon Sep 17 00:00:00 2001
From: Andreas Brett
Date: Sun, 10 Oct 2021 23:20:56 +0200
Subject: [PATCH 124/179] translation fixes
---
src/languages/de-DE.js | 44 +++++++++++++++++++++---------------------
1 file changed, 22 insertions(+), 22 deletions(-)
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index bf2dff8c6..b8a03b2ee 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -8,7 +8,7 @@ export default {
Theme: "Thema",
General: "Allgemein",
Version: "Version",
- "Check Update On GitHub": "Überprüfen von Updates auf Github",
+ "Check Update On GitHub": "Auf Github nach Updates suchen",
List: "Liste",
Add: "Hinzufügen",
"Add New Monitor": "Neuer Monitor",
@@ -39,20 +39,20 @@ export default {
Response: "Antwortzeit",
Ping: "Ping",
"Monitor Type": "Monitor Typ",
- Keyword: "Schlüsselwort",
+ Keyword: "Suchwort",
"Friendly Name": "Anzeigename",
URL: "URL",
Hostname: "Hostname",
Port: "Port",
- "Heartbeat Interval": "Taktintervall",
+ "Heartbeat Interval": "Prüfintervall",
Retries: "Wiederholungen",
retriesDescription: "Maximale Anzahl von Wiederholungen, bevor der Dienst als inaktiv markiert und eine Benachrichtigung gesendet wird.",
Advanced: "Erweitert",
ignoreTLSError: "Ignoriere TLS/SSL Fehler von Webseiten",
- "Upside Down Mode": "Umgedrehter Modus",
- upsideDownModeDescription: "Drehe den Modus um, ist der Dienst erreichbar, wird er als inaktiv angezeigt.",
+ "Upside Down Mode": "Invertierter Modus",
+ upsideDownModeDescription: "Im invertierten Modus wird der Dienst als inaktiv angezeigt, wenn er erreichbar ist.",
"Max. Redirects": "Max. Weiterleitungen",
- maxRedirectDescription: "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Setzte auf 0, um Weiterleitungen zu deaktivieren.",
+ maxRedirectDescription: "Maximale Anzahl von Weiterleitungen denen gefolgt werden soll. Auf 0 setzen um Weiterleitungen zu deaktivieren.",
"Accepted Status Codes": "Erlaubte HTTP-Statuscodes",
acceptedStatusCodesDescription: "Wähle die Statuscodes aus, welche trotzdem als erfolgreich gewertet werden sollen.",
Save: "Speichern",
@@ -62,20 +62,20 @@ export default {
Light: "Hell",
Dark: "Dunkel",
Auto: "Auto",
- "Theme - Heartbeat Bar": "Thema - Taktleiste",
+ "Theme - Heartbeat Bar": "Thema - Zeitleiste",
Normal: "Normal",
Bottom: "Unten",
None: "Keine",
Timezone: "Zeitzone",
- "Search Engine Visibility": "Suchmaschinensichtbarkeit",
+ "Search Engine Visibility": "Sichtbarkeit für Suchmaschinen",
"Allow indexing": "Indizierung zulassen",
"Discourage search engines from indexing site": "Halte Suchmaschinen von der Indexierung der Seite ab",
"Change Password": "Passwort ändern",
"Current Password": "Derzeitiges Passwort",
"New Password": "Neues Passwort",
- "Repeat New Password": "Wiederhole neues Passwort",
+ "Repeat New Password": "Neues Passwort wiederholen",
passwordNotMatchMsg: "Passwörter stimmen nicht überein. ",
- "Update Password": "Ändere Passwort",
+ "Update Password": "Passwort aktualisieren",
"Disable Auth": "Authentifizierung deaktivieren",
"Enable Auth": "Authentifizierung aktivieren",
Logout: "Ausloggen",
@@ -95,7 +95,7 @@ export default {
Email: "E-Mail",
Test: "Test",
"Certificate Info": "Zertifikatsinfo",
- keywordDescription: "Suche nach einem Schlüsselwort in der HTML oder JSON Ausgabe. Bitte beachte, es wird in der Groß-/Kleinschreibung unterschieden.",
+ keywordDescription: "Ein Suchwort in der HTML oder JSON Ausgabe finden. Bitte beachte: es wird zwischen Groß-/Kleinschreibung unterschieden.",
deleteMonitorMsg: "Bist du sicher, dass du den Monitor löschen möchtest?",
deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
resoverserverDescription: "Cloudflare ist als der Standardserver festgelegt, dieser kann jederzeit geändern werden.",
@@ -133,10 +133,10 @@ export default {
Options: "Optionen",
confirmImportMsg: "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import Option ausgewählt ist.",
"Keep both": "Beide behalten",
- twoFAVerifyLabel: "Bitte trage deinen Token ein, um zu verifizieren das 2FA funktioniert",
+ twoFAVerifyLabel: "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert",
"Verify Token": "Token verifizieren",
- "Setup 2FA": "2FA Einrichten",
- "Enable 2FA": "2FA Aktivieren",
+ "Setup 2FA": "2FA einrichten",
+ "Enable 2FA": "2FA aktivieren",
"Disable 2FA": "2FA deaktivieren",
"2FA Settings": "2FA Einstellungen",
confirmEnableTwoFAMsg: "Bist du sicher, dass du 2FA aktivieren möchtest?",
@@ -148,7 +148,7 @@ export default {
Token: "Token",
"Show URI": "URI Anzeigen",
Tags: "Tags",
- "Add New below or Select...": "Füge neuen hinzu oder wähle aus...",
+ "Add New below or Select...": "Bestehenden Tag auswählen oder neuen hinzufügen...",
"Tag with this name already exist.": "Ein Tag mit dem Namen existiert bereits.",
"Tag with this value already exist.": "Ein Tag mit dem Wert existiert bereits.",
color: "Farbe",
@@ -164,19 +164,19 @@ export default {
"Search...": "Suchen...",
"Heartbeat Retry Interval": "Heartbeat-Wiederholungsintervall",
retryCheckEverySecond: "Versuche alle {0} Sekunden",
- "Import Backup": "Import Backup",
- "Export Backup": "Export Backup",
- "Avg. Ping": "Durchsch. Ping",
- "Avg. Response": "Durchsch. Antwort",
+ "Import Backup": "Backup importieren",
+ "Export Backup": "Backup exportieren",
+ "Avg. Ping": "Durchschn. Ping",
+ "Avg. Response": "Durchschn. Antwort",
"Entry Page": "Einstiegsseite",
- statusPageNothing: "Nichts ist hier, bitte füge eine Gruppe oder Monitor hinzu.",
+ statusPageNothing: "Noch ist hier nichts. Bitte füge eine Gruppe oder einen Monitor hinzu.",
"No Services": "Keine Dienste",
- "All Systems Operational": "Alle Systeme Betriebsbereit",
+ "All Systems Operational": "Alle Systeme betriebsbereit",
"Partially Degraded Service": "Teilweise beeinträchtigter Dienst",
"Degraded Service": "Eingeschränkter Dienst",
"Add Group": "Gruppe hinzufügen",
"Add a monitor": "Monitor hinzufügen",
- "Edit Status Page": "Bearbeite Statusseite",
+ "Edit Status Page": "Bearbeite Status Seite",
"Go to Dashboard": "Gehe zum Dashboard",
"Status Page": "Status Seite",
telegram: "Telegram",
From a433de74e626f4894d78454db5f74d83e00cec0c Mon Sep 17 00:00:00 2001
From: Atlochowski
Date: Mon, 11 Oct 2021 09:24:45 +0200
Subject: [PATCH 125/179] Update pl.js
small fix
---
src/languages/pl.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/languages/pl.js b/src/languages/pl.js
index f6a32dc67..fe67e7563 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -43,7 +43,7 @@ export default {
Down: "Offline",
Pending: "Oczekuje",
Unknown: "Nieznane",
- Pause: "Wstrzymane",
+ Pause: "Wstrzymaj",
Name: "Nazwa",
Status: "Status",
DateTime: "Data i godzina",
From 6d9b71c0547788cbac1b868b249cc02508efb1b9 Mon Sep 17 00:00:00 2001
From: wuwenjing
Date: Mon, 11 Oct 2021 17:20:09 +0800
Subject: [PATCH 126/179] Add Feishu notification
---
server/notification-providers/feishu.js | 87 +++++++++++++++++++++++++
server/notification.js | 2 +
src/components/notifications/Feishu.vue | 15 +++++
src/components/notifications/index.js | 2 +
src/languages/en.js | 1 +
src/languages/zh-CN.js | 1 +
6 files changed, 108 insertions(+)
create mode 100644 server/notification-providers/feishu.js
create mode 100644 src/components/notifications/Feishu.vue
diff --git a/server/notification-providers/feishu.js b/server/notification-providers/feishu.js
new file mode 100644
index 000000000..7648f629b
--- /dev/null
+++ b/server/notification-providers/feishu.js
@@ -0,0 +1,87 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+const { DOWN, UP } = require("../../src/util");
+
+class Feishu extends NotificationProvider {
+ name = "Feishu";
+
+ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+ let okMsg = "Sent Successfully.";
+ let feishuWebHookUrl = notification.feishuWebHookUrl;
+
+ console.log(heartbeatJSON);
+ try {
+ if (heartbeatJSON == null) {
+ let testdata = {
+ msg_type: "text",
+ content: {
+ text: "Testing Successful.",
+ },
+ };
+ var t = await axios.post(feishuWebHookUrl, testdata);
+ console.log(t);
+ return okMsg;
+ }
+
+ if (heartbeatJSON["status"] == DOWN) {
+ let downdata = {
+ msg_type: "post",
+ content: {
+ post: {
+ zh_cn: {
+ title:
+ "UptimeKuma Alert: " + monitorJSON["name"],
+ content: [
+ [
+ {
+ tag: "text",
+ text:
+ "[Down] " +
+ heartbeatJSON["msg"] +
+ "\nTime (UTC): " +
+ heartbeatJSON["time"],
+ },
+ ],
+ ],
+ },
+ },
+ },
+ };
+ await axios.post(feishuWebHookUrl, downdata);
+ return okMsg;
+ }
+
+ if (heartbeatJSON["status"] == UP) {
+ let updata = {
+ msg_type: "post",
+ content: {
+ post: {
+ zh_cn: {
+ title:
+ "UptimeKuma Alert: " + monitorJSON["name"],
+ content: [
+ [
+ {
+ tag: "text",
+ text:
+ "[Up] " +
+ heartbeatJSON["msg"] +
+ "\nTime (UTC): " +
+ heartbeatJSON["time"],
+ },
+ ],
+ ],
+ },
+ },
+ },
+ };
+ await axios.post(feishuWebHookUrl, updata);
+ return okMsg;
+ }
+ } catch (error) {
+ this.throwGeneralAxiosError(error);
+ }
+ }
+}
+
+module.exports = Feishu;
diff --git a/server/notification.js b/server/notification.js
index 5b104bf8a..41a0063c3 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -18,6 +18,7 @@ const SMTP = require("./notification-providers/smtp");
const Teams = require("./notification-providers/teams");
const Telegram = require("./notification-providers/telegram");
const Webhook = require("./notification-providers/webhook");
+const Feishu = require("./notification-providers/feishu");
class Notification {
@@ -35,6 +36,7 @@ class Notification {
new Gotify(),
new Line(),
new LunaSea(),
+ new Feishu(),
new Mattermost(),
new Matrix(),
new Octopush(),
diff --git a/src/components/notifications/Feishu.vue b/src/components/notifications/Feishu.vue
new file mode 100644
index 000000000..18dc26422
--- /dev/null
+++ b/src/components/notifications/Feishu.vue
@@ -0,0 +1,15 @@
+
+
+
{{ $t("Feishu WebHookUrl") }}*
+
+
+
* {{ $t("Required") }}
+
+
+ {{ $t("here") }}
+
+
+
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 7d70eea17..140c1180c 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -12,6 +12,7 @@ import Pushy from "./Pushy.vue";
import Octopush from "./Octopush.vue";
import PromoSMS from "./PromoSMS.vue";
import LunaSea from "./LunaSea.vue";
+import Feishu from "./Feishu.vue";
import Apprise from "./Apprise.vue";
import Pushbullet from "./Pushbullet.vue";
import Line from "./Line.vue";
@@ -38,6 +39,7 @@ const NotificationFormList = {
"octopush": Octopush,
"promosms": PromoSMS,
"lunasea": LunaSea,
+ "Feishu": Feishu,
"apprise": Apprise,
"pushbullet": Pushbullet,
"line": Line,
diff --git a/src/languages/en.js b/src/languages/en.js
index 119b558e0..d93714f66 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -280,5 +280,6 @@ export default {
promosmsTypeSpeed: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
promosmsPhoneNumber: "Phone number (for Polish recipient You can skip area codes)",
promosmsSMSSender: "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+ "Feishu WebHookUrl": "Feishu WebHookUrl",
// End notification form
};
diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
index a7f81950a..1028d577e 100644
--- a/src/languages/zh-CN.js
+++ b/src/languages/zh-CN.js
@@ -198,4 +198,5 @@ export default {
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
+ "Feishu WebHookUrl": "飞书 WebHook 地址",
};
From ce2df137e682310a564395db0c6f233eea53d14c Mon Sep 17 00:00:00 2001
From: wuwenjing
Date: Mon, 11 Oct 2021 17:53:13 +0800
Subject: [PATCH 127/179] change text to using variable `msg`
---
server/notification-providers/feishu.js | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/server/notification-providers/feishu.js b/server/notification-providers/feishu.js
index 7648f629b..d8db2b1d6 100644
--- a/server/notification-providers/feishu.js
+++ b/server/notification-providers/feishu.js
@@ -9,17 +9,15 @@ class Feishu extends NotificationProvider {
let okMsg = "Sent Successfully.";
let feishuWebHookUrl = notification.feishuWebHookUrl;
- console.log(heartbeatJSON);
try {
if (heartbeatJSON == null) {
let testdata = {
msg_type: "text",
content: {
- text: "Testing Successful.",
+ text: msg,
},
};
- var t = await axios.post(feishuWebHookUrl, testdata);
- console.log(t);
+ await axios.post(feishuWebHookUrl, testdata);
return okMsg;
}
From 5b19e3f02592519399ebd81fadc264cb0d344d14 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Mon, 11 Oct 2021 19:40:51 +0800
Subject: [PATCH 128/179] Update README.md
---
README.md | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 75ee8b237..920998a33 100644
--- a/README.md
+++ b/README.md
@@ -23,11 +23,14 @@ VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollec
## ⭐ Features
-* Monitoring uptime for HTTP(s) / TCP / Ping / DNS Record.
+* Monitoring uptime for HTTP(s) / TCP / Ping / DNS Record / Push.
* Fancy, Reactive, Fast UI/UX.
* Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and [70+ notification services, click here for the full list](https://github.com/louislam/uptime-kuma/issues/284).
* 20 seconds interval.
* [Multi Languages](https://github.com/louislam/uptime-kuma/tree/master/src/languages)
+* Simple Status Page
+* Ping Chart
+* Certicate Info
## 🔧 How to Install
From 97af09fd50d6f5e3eee73cf1fb8b553c0c9ba4b1 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Mon, 11 Oct 2021 19:41:56 +0800
Subject: [PATCH 129/179] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 920998a33..11f7fbd5e 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@ VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollec
* Monitoring uptime for HTTP(s) / TCP / Ping / DNS Record / Push.
* Fancy, Reactive, Fast UI/UX.
-* Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and [70+ notification services, click here for the full list](https://github.com/louislam/uptime-kuma/issues/284).
+* Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and [70+ notification services, click here for the full list](https://github.com/louislam/uptime-kuma/tree/master/src/components/notifications).
* 20 seconds interval.
* [Multi Languages](https://github.com/louislam/uptime-kuma/tree/master/src/languages)
* Simple Status Page
From ebf0671fef6fb39c4a26deac95daa5776174c5e3 Mon Sep 17 00:00:00 2001
From: Atlochowski
Date: Mon, 11 Oct 2021 13:45:25 +0200
Subject: [PATCH 130/179] Update pl.js
---
src/languages/pl.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/languages/pl.js b/src/languages/pl.js
index fe67e7563..7a438a592 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -10,7 +10,7 @@ export default {
passwordNotMatchMsg: "Powtórzone hasło nie pasuje.",
notificationDescription: "Proszę przypisać powiadomienie do monitora(ów), aby działało.",
keywordDescription: "Wyszukiwanie słów kluczowych w zwykłym html lub odpowiedzi JSON. Wielkość liter ma znaczenie.",
- pauseDashboardHome: "Wstrzymaj",
+ pauseDashboardHome: "Wstrzymane",
deleteMonitorMsg: "Czy na pewno chcesz usunąć ten monitor?",
deleteNotificationMsg: "Czy na pewno chcesz usunąć to powiadomienie dla wszystkich monitorów?",
resoverserverDescription: "Cloudflare jest domyślnym serwerem, możesz zmienić serwer resolver w każdej chwili.",
From d769c4426c6ff8095c34f191c292f064513c11e8 Mon Sep 17 00:00:00 2001
From: Slayer <51095261+GhostSlayer@users.noreply.github.com>
Date: Mon, 11 Oct 2021 15:22:52 +0300
Subject: [PATCH 131/179] Create PM2 Config file
I don't know if this is a good idea, but users that prefer to use PM2 instead, they can run `pm2 start` instead of `pm2 start server/server.js --name uptime-kuma` with this configuration
---
ecosystem.config.js | 6 ++++++
1 file changed, 6 insertions(+)
create mode 100644 ecosystem.config.js
diff --git a/ecosystem.config.js b/ecosystem.config.js
new file mode 100644
index 000000000..5f4034007
--- /dev/null
+++ b/ecosystem.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ apps: [{
+ name: "uptime-kuma",
+ script: "./server/server.js",
+ }]
+}
From 69ffee55ddbc1c81cf98cb6019a7280af98466c1 Mon Sep 17 00:00:00 2001
From: Atlochowski
Date: Mon, 11 Oct 2021 14:33:00 +0200
Subject: [PATCH 132/179] Update pl.js
---
src/languages/pl.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/languages/pl.js b/src/languages/pl.js
index 7a438a592..7202f540b 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -100,7 +100,7 @@ export default {
Logout: "Wyloguj",
Leave: "Zostaw",
"I understand, please disable": "Rozumiem, proszę wyłączyć",
- Confirm: "Potiwerdź",
+ Confirm: "Potwierdź",
Yes: "Tak",
No: "Nie",
Username: "Nazwa użytkownika",
From 69c623ac2b65f54a30a37e242ff237e1a1d18029 Mon Sep 17 00:00:00 2001
From: xJoker
Date: Mon, 11 Oct 2021 20:38:19 +0800
Subject: [PATCH 133/179] Update server/notification-providers/feishu.js
Co-authored-by: Adam Stachowicz
---
server/notification-providers/feishu.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/server/notification-providers/feishu.js b/server/notification-providers/feishu.js
index d8db2b1d6..63fde9ec3 100644
--- a/server/notification-providers/feishu.js
+++ b/server/notification-providers/feishu.js
@@ -27,8 +27,7 @@ class Feishu extends NotificationProvider {
content: {
post: {
zh_cn: {
- title:
- "UptimeKuma Alert: " + monitorJSON["name"],
+ title: "UptimeKuma Alert: " + monitorJSON["name"],
content: [
[
{
From 1bc77a06e57df6ad1320afe533aa5dc7dc0d4512 Mon Sep 17 00:00:00 2001
From: xJoker
Date: Mon, 11 Oct 2021 20:38:32 +0800
Subject: [PATCH 134/179] Update server/notification-providers/feishu.js
Co-authored-by: Adam Stachowicz
---
server/notification-providers/feishu.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/server/notification-providers/feishu.js b/server/notification-providers/feishu.js
index 63fde9ec3..a3e340301 100644
--- a/server/notification-providers/feishu.js
+++ b/server/notification-providers/feishu.js
@@ -54,8 +54,7 @@ class Feishu extends NotificationProvider {
content: {
post: {
zh_cn: {
- title:
- "UptimeKuma Alert: " + monitorJSON["name"],
+ title: "UptimeKuma Alert: " + monitorJSON["name"],
content: [
[
{
From 9c058054b9ea73eefb7e7f2d0c2ec0cd84cdf4da Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20L=C3=89VEIL?=
Date: Mon, 11 Oct 2021 09:12:08 +0200
Subject: [PATCH 135/179] [i18n] minor update to french translations
---
src/languages/fr-FR.js | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index 0111d4b89..bcba1f869 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -15,15 +15,15 @@ export default {
deleteNotificationMsg: "Êtes-vous sûr de vouloir supprimer ce type de notifications ? Une fois désactivée, les services qui l'utilisent ne pourront plus envoyer de notifications.",
resoverserverDescription: "Le DNS de cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
rrtypeDescription: "Veuillez séléctionner un type d'enregistrement DNS",
- pauseMonitorMsg: "Etes vous sur de vouloir mettre en pause cette sonde ?",
+ pauseMonitorMsg: "Êtes-vous sûr de vouloir mettre en pause cette sonde ?",
enableDefaultNotificationDescription: "Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.",
clearEventsMsg: "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer tous les vérifications pour cette sonde ?",
confirmClearStatisticsMsg: "Êtes-vous sûr de vouloir supprimer tous les statistiques ?",
- importHandleDescription: "Choisissez 'Ignorer l'existant' si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option 'Écraser' supprime tous les sondes et notifications existantes.",
- confirmImportMsg: "Êtes-vous sûr d'importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
+ importHandleDescription: "Choisissez 'Ignorer l'existant' si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option 'Écraser' supprime toutes les sondes et notifications existantes.",
+ confirmImportMsg: "Êtes-vous sûr de vouloir importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
twoFAVerifyLabel: "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.",
- tokenValidSettingsMsg: "Le jeton est valide ! Vous pouvez maintenant sauvegarder les paramètres 2FA.",
+ tokenValidSettingsMsg: "Le jeton est valide ; Vous pouvez maintenant sauvegarder les paramètres 2FA.",
confirmEnableTwoFAMsg: "Êtes-vous sûr de vouloir activer le 2FA ?",
confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver le 2FA ?",
Settings: "Paramètres",
@@ -136,7 +136,7 @@ export default {
backupDescription3: "Les données sensibles telles que les jetons de notification sont incluses dans le fichier d'exportation, veuillez les conserver soigneusement.",
alertNoFile: "Veuillez sélectionner un fichier à importer.",
alertWrongFileType: "Veuillez sélectionner un fichier JSON à importer.",
- "Clear all statistics": "Effacer touutes les statistiques",
+ "Clear all statistics": "Effacer toutes les statistiques",
"Skip existing": "Sauter l'existant",
Overwrite: "Ecraser",
Options: "Options",
@@ -185,10 +185,10 @@ export default {
"Required": "Requis",
"telegram": "Telegram",
"Bot Token": "Bot Token",
- "You can get a token from": "Vous pouvez avoir un token depuis",
+ "You can get a token from": "Vous pouvez obtenir un token depuis",
"Chat ID": "Chat ID",
supportTelegramChatID: "Supporte les messages privés / en groupe / l'ID du salon",
- wayToGetTelegramChatID: "Vous pouvez obtenir l'ID du chat en envoyant un message avec le bot puis en récupérant l'URL pour voir l'ID du salon:",
+ wayToGetTelegramChatID: "Vous pouvez obtenir l'ID du chat en envoyant un message avec le bot puis en récupérant l'URL pour voir l'ID du salon :",
"YOUR BOT TOKEN HERE": "VOTRE TOKEN BOT ICI",
chatIDNotFound: "ID du salon introuvable, envoyez un message via le bot avant",
"webhook": "Webhook",
@@ -217,8 +217,8 @@ export default {
"Number": "Numéro",
"Recipients": "Destinataires",
needSignalAPI: "Vous avez besoin d'un client Signal avec l'API REST.",
- wayToCheckSignalURL: "Vous pouvez regarder l'URL sur comment le mettre en place:",
- signalImportant: "IMPORTANT: Vous ne pouvez pas mixer les groupes et les numéros en destinataires!",
+ wayToCheckSignalURL: "Vous pouvez regarder l'URL sur comment le mettre en place :",
+ signalImportant: "IMPORTANT: Vous ne pouvez pas mixer les groupes et les numéros en destinataires !",
"gotify": "Gotify",
"Application Token": "Application Token",
"Server URL": "Server URL",
@@ -228,9 +228,9 @@ export default {
"Channel Name": "Nom du salon",
"Uptime Kuma URL": "Uptime Kuma URL",
aboutWebhooks: "Plus d'informations sur les Webhooks ici: {0}",
- aboutChannelName: "Mettez le nom du salon dans {0} dans 'Channel Name' si vous voulez bypass le salon Webhook. Ex: #autre-salon",
+ aboutChannelName: "Mettez le nom du salon dans {0} dans 'Channel Name' si vous voulez bypass le salon Webhook. Ex : #autre-salon",
aboutKumaURL: "Si vous laissez l'URL d'Uptime Kuma vierge, elle redirigera vers la page du projet GitHub.",
- emojiCheatSheet: "Emoji cheat sheet: {0}",
+ emojiCheatSheet: "Emoji cheat sheet : {0}",
"rocket.chat": "Rocket.chat",
pushover: "Pushover",
pushy: "Pushy",
@@ -256,9 +256,9 @@ export default {
octopushSMSSender: "Nom de l'envoyer : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
"LunaSea Device ID": "LunaSea Device ID",
"Apprise URL": "Apprise URL",
- "Example:": "Exemple: {0}",
- "Read more:": "En savoir plus: {0}",
- "Status:": "Status: {0}",
+ "Example:": "Exemple : {0}",
+ "Read more:": "En savoir plus : {0}",
+ "Status:": "Status : {0}",
"Read more": "En savoir plus",
appriseInstalled: "Apprise est intallé.",
appriseNotInstalled: "Apprise n'est pas intallé. {0}",
@@ -272,7 +272,7 @@ export default {
wayToGetLineChannelToken: "Premièrement accéder à {0}, créez un Provider et un Salon (Messaging API), puis vous pourrez avoir le Token d'accès du salon ainsi que l'Identifiant utilisateur depuis le même menu.",
"Icon URL": "Icon URL",
aboutIconURL: "Vous pouvez mettre un lien vers l'image dans \"Icon URL\" pour remplacer l'image de profil par défaut. Ne sera pas utilisé si Icon Emoji est défini.",
- aboutMattermostChannelName: "Vous pouvez remplacer le salon par défaut que le Webhook utilise en mettant le nom du salon dans le champ \"Channel Name\". Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex: #autre-salon",
+ aboutMattermostChannelName: "Vous pouvez remplacer le salon par défaut que le Webhook utilise en mettant le nom du salon dans le champ \"Channel Name\". Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex : #autre-salon",
"matrix": "Matrix",
promosmsTypeEco: "SMS ECO - Pas cher mais lent et souvent surchargé. Limité uniquement aux déstinataires Polonais.",
promosmsTypeFlash: "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux déstinataires Polonais.",
From 18c5a16783fa9695c0703c0874f2b03de6498b83 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Tue, 12 Oct 2021 11:15:02 +0800
Subject: [PATCH 136/179] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 11f7fbd5e..52bb895f2 100644
--- a/README.md
+++ b/README.md
@@ -30,7 +30,7 @@ VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollec
* [Multi Languages](https://github.com/louislam/uptime-kuma/tree/master/src/languages)
* Simple Status Page
* Ping Chart
-* Certicate Info
+* Certificate Info
## 🔧 How to Install
From 5269dcec601d3b1bdf2f4738f6ee9f69e6e75804 Mon Sep 17 00:00:00 2001
From: Tomas Rohrer
Date: Tue, 12 Oct 2021 10:21:03 +0200
Subject: [PATCH 137/179] Fix length
In fact, it is 10 min demo :)
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 52bb895f2..ef92cf47e 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ Try it!
https://demo.uptime.kuma.pet
-It is a 5 minutes live demo, all data will be deleted after that. The server is located at Tokyo, if you live far away from here, it may affact your experience. I suggest that you should install to try it.
+It is a 10 minutes live demo, all data will be deleted after that. The server is located at Tokyo, if you live far away from here, it may affact your experience. I suggest that you should install to try it.
VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollective.com/uptime-kuma)! Thank you so much!
From efc78acfeb86f8da259700c5269136a8fde22729 Mon Sep 17 00:00:00 2001
From: Kyungyoon Kim
Date: Tue, 12 Oct 2021 18:17:13 +0900
Subject: [PATCH 138/179] Update ko-KR.js
---
src/languages/ko-KR.js | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index d04ff050a..bf73416f4 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -9,11 +9,11 @@ export default {
acceptedStatusCodesDescription: "응답 성공으로 간주할 상태 코드를 정해요.",
passwordNotMatchMsg: "비밀번호 재입력이 일치하지 않아요.",
notificationDescription: "모니터링에 알림을 설정할 수 있어요.",
- keywordDescription: "Html 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.",
+ keywordDescription: "HTML 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.",
pauseDashboardHome: "일시 정지",
deleteMonitorMsg: "정말 이 모니터링을 삭제할까요?",
deleteNotificationMsg: "정말 이 알림을 모든 모니터링에서 삭제할까요?",
- resoverserverDescription: "Cloudflare가 기본 서버에요, 원한다면 언제나 다른 resolver 서버로 변경할 수 있어요.",
+ resoverserverDescription: "Cloudflare가 기본 서버에요, 원한다면 언제나 다른 Resolver 서버로 변경할 수 있어요.",
rrtypeDescription: "모니터링할 RR-Type을 선택해요.",
pauseMonitorMsg: "정말 이 모니터링을 일시 정지 할까요?",
enableDefaultNotificationDescription: "새로 추가하는 모든 모니터링에 이 알림을 기본적으로 활성화해요. 각 모니터에 대해 별도로 알림을 비활성화할 수 있어요.",
@@ -190,7 +190,7 @@ export default {
wayToGetTelegramChatID: "봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요.",
"YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
chatIDNotFound: "채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요.",
- webhook: "웹훅",
+ webhook: "Webhook",
"Post URL": "Post URL",
"Content Type": "Content Type",
webhookJsonDesc: "{0}은 express.js와 같은 최신 HTTP 서버에 적합해요.",
@@ -204,14 +204,14 @@ export default {
smtpCC: "참조",
smtpBCC: "숨은 참조",
discord: "Discord",
- "Discord Webhook URL": "Discord 웹훅 URL",
+ "Discord Webhook URL": "Discord Webhook URL",
wayToGetDiscordURL: "서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요.",
"Bot Display Name": "표시 이름",
"Prefix Custom Message": "접두사 메시지",
"Hello @everyone is...": "{'@'}everyone 서버 상태 알림이에요...",
teams: "Microsoft Teams",
- "Webhook URL": "웹훅 URL",
- wayToGetTeamsURL: "{0}에서 웹훅을 어떻게 만드는지 알아봐요.",
+ "Webhook URL": "Webhook URL",
+ wayToGetTeamsURL: "{0}에서 Webhook을 어떻게 만드는지 알아봐요.",
signal: "Signal",
Number: "숫자",
Recipients: "받는 사람",
@@ -226,8 +226,8 @@ export default {
"Icon Emoji": "아이콘 이모지",
"Channel Name": "채널 이름",
"Uptime Kuma URL": "Uptime Kuma URL",
- aboutWebhooks: "웹훅에 대한 설명: {0}",
- aboutChannelName: "웹훅 채널을 우회하려면 {0} 채널 이름칸에 채널 이름을 입력해주세요. 예: #기타-채널",
+ aboutWebhooks: "Webhook에 대한 설명: {0}",
+ aboutChannelName: "Webhook 채널을 우회하려면 {0} 채널 이름칸에 채널 이름을 입력해주세요. 예: #기타-채널",
aboutKumaURL: "Uptime Kuma URL칸을 공백으로 두면 기본적으로 Project Github 페이지로 설정해요.",
emojiCheatSheet: "이모지 목록 시트: {0}",
"rocket.chat": "Rocket.chat",
@@ -250,9 +250,9 @@ export default {
"SMS Type": "SMS 종류",
octopushTypePremium: "프리미엄 (빠름) - 알림 기능에 적합해요)",
octopushTypeLowCost: "저렴한 요금 (느림, 가끔 차단될 수 있어요)",
- "Check octopush prices": "{0}에서 octopush 가격을 확인할 수 있어요.",
+ "Check octopush prices": "{0}에서 Octopush 가격을 확인할 수 있어요.",
octopushPhoneNumber: "휴대전화 번호 (intl format, eg : +33612345678) ",
- octopushSMSSender: "보내는 사람 이름 : 3-11개의 영숫자 및 여백공간 (a-z, A-Z, 0-9",
+ octopushSMSSender: "보내는 사람 이름 : 3-11개의 영숫자 및 여백공간 (a-z, A-Z, 0-9)",
"LunaSea Device ID": "LunaSea 장치 ID",
"Apprise URL": "Apprise URL",
"Example:": "예: {0}",
@@ -268,10 +268,10 @@ export default {
"Basic Settings": "Basic Settings 메뉴",
"User ID": "사용자 ID",
"Messaging API": "Messaging API 메뉴",
- wayToGetLineChannelToken: "먼저 {0}에 엑세스하고, 공급자 및 채널 (메시징 API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.",
+ wayToGetLineChannelToken: "먼저 {0}에 엑세스하고, 공급자 및 채널 (Messaging API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.",
"Icon URL": "아이콘 URL",
aboutIconURL: "\"Icon URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을거에요.",
- aboutMattermostChannelName: "채널 이름을 입력하면 웹훅이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널",
+ aboutMattermostChannelName: "채널 이름을 입력하면 Webhook이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널",
matrix: "매트릭스",
promosmsTypeEco: "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요. ",
promosmsTypeFlash: "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시되어요. 폴란드 수신자만 사용할 수 있어요.",
From c1112a32dfce1c953a2f3d7858be6638ac699483 Mon Sep 17 00:00:00 2001
From: Kyungyoon Kim
Date: Tue, 12 Oct 2021 18:19:44 +0900
Subject: [PATCH 139/179] Update ko-KR.js
---
src/languages/ko-KR.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index bf73416f4..4bb4c912e 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -265,7 +265,7 @@ export default {
"Channel access token": "채널 엑세스 토큰",
"Line Developers Console": "Line 개발자 콘솔",
lineDevConsoleTo: "Line 개발자 콘솔 - {0}",
- "Basic Settings": "Basic Settings 메뉴",
+ "Basic Settings": "기본 설정 메뉴",
"User ID": "사용자 ID",
"Messaging API": "Messaging API 메뉴",
wayToGetLineChannelToken: "먼저 {0}에 엑세스하고, 공급자 및 채널 (Messaging API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.",
From 05b691d4c98d1ec5f0df128c0a2a3e7d19dfefe4 Mon Sep 17 00:00:00 2001
From: dhfhfk
Date: Tue, 12 Oct 2021 20:39:15 +0900
Subject: [PATCH 140/179] Fix typo
---
src/languages/ko-KR.js | 44 +++++++++++++++++++++---------------------
1 file changed, 22 insertions(+), 22 deletions(-)
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index 4bb4c912e..aef3bf590 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -4,8 +4,8 @@ export default {
retryCheckEverySecond: "{0}초마다 다시 확인해요.",
retriesDescription: "서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수",
ignoreTLSError: "HTTPS 웹사이트에서 TLS/SSL 에러 무시하기",
- upsideDownModeDescription: "서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거에요.",
- maxRedirectDescription: "최대 리다이렉트 횟수에요. 0을 입력하면 리다이렉트를 꺼요.",
+ upsideDownModeDescription: "서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거예요.",
+ maxRedirectDescription: "최대 리다이렉트 횟수예요. 0을 입력하면 리다이렉트를 꺼요.",
acceptedStatusCodesDescription: "응답 성공으로 간주할 상태 코드를 정해요.",
passwordNotMatchMsg: "비밀번호 재입력이 일치하지 않아요.",
notificationDescription: "모니터링에 알림을 설정할 수 있어요.",
@@ -13,9 +13,9 @@ export default {
pauseDashboardHome: "일시 정지",
deleteMonitorMsg: "정말 이 모니터링을 삭제할까요?",
deleteNotificationMsg: "정말 이 알림을 모든 모니터링에서 삭제할까요?",
- resoverserverDescription: "Cloudflare가 기본 서버에요, 원한다면 언제나 다른 Resolver 서버로 변경할 수 있어요.",
+ resoverserverDescription: "Cloudflare가 기본 서버예요, 원한다면 언제나 다른 Resolver 서버로 변경할 수 있어요.",
rrtypeDescription: "모니터링할 RR-Type을 선택해요.",
- pauseMonitorMsg: "정말 이 모니터링을 일시 정지 할까요?",
+ pauseMonitorMsg: "정말 이 모니터링을 일시 정지할까요?",
enableDefaultNotificationDescription: "새로 추가하는 모든 모니터링에 이 알림을 기본적으로 활성화해요. 각 모니터에 대해 별도로 알림을 비활성화할 수 있어요.",
clearEventsMsg: "정말 이 모니터링에 대한 모든 이벤트를 삭제할까요?",
clearHeartbeatsMsg: "정말 이 모니터링에 대한 모든 하트비트를 삭제할까요?",
@@ -24,8 +24,8 @@ export default {
confirmImportMsg: "정말 백업을 가져올까요? 가져오기 옵션을 제대로 설정했는지 다시 확인해주세요.",
twoFAVerifyLabel: "토큰을 입력해 2단계 인증이 작동하는지 확인해주세요.",
tokenValidSettingsMsg: "토큰이 유효해요! 이제 2단계 인증 설정을 저장할 수 있어요.",
- confirmEnableTwoFAMsg: "정말 2단계 인증을 활성화 할까요?",
- confirmDisableTwoFAMsg: "정말 2단계 인증을 비활성화 할까요?",
+ confirmEnableTwoFAMsg: "정말 2단계 인증을 활성화할까요?",
+ confirmDisableTwoFAMsg: "정말 2단계 인증을 비활성화할까요?",
Settings: "설정",
Dashboard: "대시보드",
"New Update": "새로운 업데이트",
@@ -77,7 +77,7 @@ export default {
"Accepted Status Codes": "응답 성공 상태 코드",
Save: "저장",
Notifications: "알림",
- "Not available, please setup.": "존재하지 않아요, 새로운거 하나 만드는건 어때요?",
+ "Not available, please setup.": "존재하지 않아요, 새로운 거 하나 만드는 건 어때요?",
"Setup Notification": "알림 설정",
Light: "라이트",
Dark: "다크",
@@ -158,10 +158,10 @@ export default {
color: "색상",
"value (optional)": "값 (선택)",
Gray: "회색",
- Red: "빨강색",
+ Red: "빨간색",
Orange: "주황색",
Green: "초록색",
- Blue: "파랑색",
+ Blue: "파란색",
Indigo: "남색",
Purple: "보라색",
Pink: "핑크색",
@@ -175,9 +175,9 @@ export default {
"Partially Degraded Service": "일부 시스템 비정상",
"Degraded Service": "모든 시스템 비정상",
"Add Group": "그룹 추가",
- "Add a monitor": "모니터링 추가r",
+ "Add a monitor": "모니터링 추가",
"Edit Status Page": "상태 페이지 수정",
- "Go to Dashboard": "대쉬보드로 가기",
+ "Go to Dashboard": "대시보드로 가기",
"Status Page": "상태 페이지",
defaultNotificationName: "내 {notification} 알림 ({number})",
here: "여기",
@@ -194,7 +194,7 @@ export default {
"Post URL": "Post URL",
"Content Type": "Content Type",
webhookJsonDesc: "{0}은 express.js와 같은 최신 HTTP 서버에 적합해요.",
- webhookFormDataDesc: "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 되어요.",
+ webhookFormDataDesc: "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 돼요.",
smtp: "Email (SMTP)",
secureOptionNone: "없음 / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
@@ -245,11 +245,11 @@ export default {
"Message Title": "메시지 제목",
"Notification Sound": "알림음",
"More info on:": "자세한 정보: {0}",
- pushoverDesc1: "긴급 우선 순위 (2)는 재시도 사이에 기본적으로 30초의 타임아웃이 있고, 1시간 후에 만료되어요.",
+ pushoverDesc1: "긴급 우선 순위 (2)는 재시도 사이에 기본적으로 30초의 타임아웃이 있고, 1시간 후에 만료돼요.",
pushoverDesc2: "다른 장치에 알림을 보내려면 장치칸을 입력해주세요.",
"SMS Type": "SMS 종류",
octopushTypePremium: "프리미엄 (빠름) - 알림 기능에 적합해요)",
- octopushTypeLowCost: "저렴한 요금 (느림, 가끔 차단될 수 있어요)",
+ octopushTypeLowCost: "저렴한 요금 (느림) - 가끔 차단될 수 있어요)",
"Check octopush prices": "{0}에서 Octopush 가격을 확인할 수 있어요.",
octopushPhoneNumber: "휴대전화 번호 (intl format, eg : +33612345678) ",
octopushSMSSender: "보내는 사람 이름 : 3-11개의 영숫자 및 여백공간 (a-z, A-Z, 0-9)",
@@ -259,24 +259,24 @@ export default {
"Read more:": "더 보기: {0}",
"Status:": "상태: {0}",
"Read more": "더 보기",
- appriseInstalled: "Apprise가 설치되어있어요..",
- appriseNotInstalled: "Apprise 가 설치되어있지 않아요. {0}",
+ appriseInstalled: "Apprise가 설치되어있어요.",
+ appriseNotInstalled: "Apprise가 설치되어있지 않아요. {0}",
"Access Token": "액세스 토큰",
- "Channel access token": "채널 엑세스 토큰",
+ "Channel access token": "채널 액세스 토큰",
"Line Developers Console": "Line 개발자 콘솔",
lineDevConsoleTo: "Line 개발자 콘솔 - {0}",
"Basic Settings": "기본 설정 메뉴",
"User ID": "사용자 ID",
"Messaging API": "Messaging API 메뉴",
- wayToGetLineChannelToken: "먼저 {0}에 엑세스하고, 공급자 및 채널 (Messaging API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.",
+ wayToGetLineChannelToken: "먼저 {0}에 액세스하고, 공급자 및 채널 (Messaging API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.",
"Icon URL": "아이콘 URL",
- aboutIconURL: "\"Icon URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을거에요.",
+ aboutIconURL: "\"Icon URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을 거예요.",
aboutMattermostChannelName: "채널 이름을 입력하면 Webhook이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널",
matrix: "매트릭스",
promosmsTypeEco: "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요. ",
- promosmsTypeFlash: "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시되어요. 폴란드 수신자만 사용할 수 있어요.",
+ promosmsTypeFlash: "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시돼요. 폴란드 수신자만 사용할 수 있어요.",
promosmsTypeFull: "SMS FULL - SMS 프리미엄 티어, 보내는 사람 이름을 먼저 등록해야 해요. 알림 기능에 적합해요.",
- promosmsTypeSpeed: "SMS SPEED - 시스템에서 가장 높은 우선순위에요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).",
+ promosmsTypeSpeed: "SMS SPEED - 시스템에서 가장 높은 우선순위예요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).",
promosmsPhoneNumber: "전화 번호 (폴란드 수신자라면 지역번호를 적지 않아도 돼요.)",
- promosmsSMSSender: "SMS 보내는 사람 이름 : 미리 등록된 이름 혹은 기본값 중 하나에요: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+ promosmsSMSSender: "SMS 보내는 사람 이름 : 미리 등록된 이름 혹은 기본값 중 하나예요: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
};
From 5e759faf3273eccabf82c370cda10ce1739ebc7f Mon Sep 17 00:00:00 2001
From: Paride Barison
Date: Tue, 12 Oct 2021 14:42:11 +0200
Subject: [PATCH 141/179] translation in progress
---
src/languages/it-IT.js | 101 +++++++++++++++++++++++++++++++++++++----
1 file changed, 93 insertions(+), 8 deletions(-)
diff --git a/src/languages/it-IT.js b/src/languages/it-IT.js
index 5ddc414f7..bdb821400 100644
--- a/src/languages/it-IT.js
+++ b/src/languages/it-IT.js
@@ -179,14 +179,58 @@ export default {
"Edit Status Page": "Modifica pagina di stato",
"Go to Dashboard": "Vai al Cruscotto",
"Status Page": "Status Page",
- telegram: "Telegram",
- webhook: "Webhook",
- smtp: "Email (SMTP)",
- discord: "Discord",
- teams: "Microsoft Teams",
- signal: "Signal",
- gotify: "Gotify",
- slack: "Slack",
+ // Start notification form
+ defaultNotificationName: "My {notification} Alert ({number})",
+ here: "qui",
+ "Required": "Richiesto",
+ "telegram": "Telegram",
+ "Bot Token": "Token del Bot",
+ "You can get a token from": "Puoi ricevere un token da",
+ "Chat ID": "ID Chat",
+ supportTelegramChatID: "Supporta Chat dirette / di Gruppo / ID Canale",
+ wayToGetTelegramChatID: "Puoi ricereve l'ID chat mandando un messaggio al bot andando in questo url per visualizzare il chat_id:",
+ "YOUR BOT TOKEN HERE": "QUI IL TOKEN DEL BOT",
+ chatIDNotFound: "Non trovo l'ID chat. Prima bisogna mandare un messaggio al bot",
+ "webhook": "Webhook",
+ "Post URL": "Post URL",
+ "Content Type": "Content Type",
+ webhookJsonDesc: "{0} is good for any modern http servers such as express.js",
+ webhookFormDataDesc: "{multipart} is good for PHP, you just need to parse the json by {decodeFunction}",
+ "smtp": "Email (SMTP)",
+ secureOptionNone: "None / STARTTLS (25, 587)",
+ secureOptionTLS: "TLS (465)",
+ "Ignore TLS Error": "Ignore TLS Error",
+ "From Email": "From Email",
+ "To Email": "To Email",
+ smtpCC: "CC",
+ smtpBCC: "BCC",
+ "discord": "Discord",
+ "Discord Webhook URL": "Discord Webhook URL",
+ wayToGetDiscordURL: "You can get this by going to Server Settings -> Integrations -> Create Webhook",
+ "Bot Display Name": "Bot Display Name",
+ "Prefix Custom Message": "Prefix Custom Message",
+ "Hello @everyone is...": "Hello {'@'}everyone is...",
+ "teams": "Microsoft Teams",
+ "Webhook URL": "Webhook URL",
+ wayToGetTeamsURL: "You can learn how to create a webhook url {0}.",
+ "signal": "Signal",
+ "Number": "Number",
+ "Recipients": "Recipients",
+ needSignalAPI: "You need to have a signal client with REST API.",
+ wayToCheckSignalURL: "You can check this url to view how to setup one:",
+ signalImportant: "IMPORTANT: You cannot mix groups and numbers in recipients!",
+ "gotify": "Gotify",
+ "Application Token": "Application Token",
+ "Server URL": "Server URL",
+ "Priority": "Priority",
+ "slack": "Slack",
+ "Icon Emoji": "Icon Emoji",
+ "Channel Name": "Channel Name",
+ "Uptime Kuma URL": "Uptime Kuma URL",
+ aboutWebhooks: "More info about webhooks on: {0}",
+ aboutChannelName: "Enter the channel name on {0} Channel Name field if you want to bypass the webhook channel. Ex: #other-channel",
+ aboutKumaURL: "If you leave the Uptime Kuma URL field blank, it will default to the Project Github page.",
+ emojiCheatSheet: "Emoji cheat sheet: {0}",
"rocket.chat": "Rocket.chat",
pushover: "Pushover",
pushy: "Pushy",
@@ -197,4 +241,45 @@ export default {
pushbullet: "Pushbullet",
line: "Line Messenger",
mattermost: "Mattermost",
+ "User Key": "User Key",
+ "Device": "Device",
+ "Message Title": "Message Title",
+ "Notification Sound": "Notification Sound",
+ "More info on:": "More info on: {0}",
+ pushoverDesc1: "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
+ pushoverDesc2: "If you want to send notifications to different devices, fill out Device field.",
+ "SMS Type": "SMS Type",
+ octopushTypePremium: "Premium (Fast - recommended for alerting)",
+ octopushTypeLowCost: "Low Cost (Slow, sometimes blocked by operator)",
+ "Check octopush prices": "Check octopush prices {0}.",
+ octopushPhoneNumber: "Phone number (intl format, eg : +33612345678) ",
+ octopushSMSSender: "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
+ "LunaSea Device ID": "LunaSea Device ID",
+ "Apprise URL": "Apprise URL",
+ "Example:": "Example: {0}",
+ "Read more:": "Read more: {0}",
+ "Status:": "Status: {0}",
+ "Read more": "Read more",
+ appriseInstalled: "Apprise is installed.",
+ appriseNotInstalled: "Apprise is not installed. {0}",
+ "Access Token": "Access Token",
+ "Channel access token": "Channel access token",
+ "Line Developers Console": "Line Developers Console",
+ lineDevConsoleTo: "Line Developers Console - {0}",
+ "Basic Settings": "Basic Settings",
+ "User ID": "User ID",
+ "Messaging API": "Messaging API",
+ wayToGetLineChannelToken: "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user id from the above mentioned menu items.",
+ "Icon URL": "Icon URL",
+ aboutIconURL: "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
+ aboutMattermostChannelName: "You can override the default channel that webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in Mattermost webhook settings. Ex: #other-channel",
+ "matrix": "Matrix",
+ promosmsTypeEco: "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
+ promosmsTypeFlash: "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
+ promosmsTypeFull: "SMS FULL - Premium tier of SMS, You can use Your Sender Name (You need to register name first). Reliable for alerts.",
+ promosmsTypeSpeed: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
+ promosmsPhoneNumber: "Phone number (for Polish recipient You can skip area codes)",
+ promosmsSMSSender: "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+ "Feishu WebHookUrl": "Feishu WebHookUrl",
+ // End notification form
};
From d733ec018e6698f45f17b53d19cc725e71eec279 Mon Sep 17 00:00:00 2001
From: giacomo892
Date: Tue, 12 Oct 2021 19:37:58 +0200
Subject: [PATCH 142/179] Prioritize host arg
Otherwise launching the program with the --host argument does nothing
---
server/server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/server.js b/server/server.js
index 67095ff53..3e8ddd319 100644
--- a/server/server.js
+++ b/server/server.js
@@ -61,7 +61,7 @@ console.info("Version: " + checkVersion.version);
// If host is omitted, the server will accept connections on the unspecified IPv6 address (::) when IPv6 is available and the unspecified IPv4 address (0.0.0.0) otherwise.
// Dual-stack support for (::)
-const hostname = process.env.HOST || args.host;
+const hostname = args.host || process.env.HOST;
const port = parseInt(process.env.PORT || args.port || 3001);
// SSL
From 911d4ea37baa4c43a52f7eac1fa26abb8a7de85c Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Wed, 13 Oct 2021 02:27:25 +0800
Subject: [PATCH 143/179] move vite.config.js to config folder
---
vite.config.js => config/vite.config.js | 14 +++++++-------
package.json | 6 +++---
2 files changed, 10 insertions(+), 10 deletions(-)
rename vite.config.js => config/vite.config.js (62%)
diff --git a/vite.config.js b/config/vite.config.js
similarity index 62%
rename from vite.config.js
rename to config/vite.config.js
index 6be31f5e8..a9701d426 100644
--- a/vite.config.js
+++ b/config/vite.config.js
@@ -1,9 +1,9 @@
-import legacy from "@vitejs/plugin-legacy"
-import vue from "@vitejs/plugin-vue"
-import { defineConfig } from "vite"
+import legacy from "@vitejs/plugin-legacy";
+import vue from "@vitejs/plugin-vue";
+import { defineConfig } from "vite";
-const postCssScss = require("postcss-scss")
-const postcssRTLCSS = require('postcss-rtlcss');
+const postCssScss = require("postcss-scss");
+const postcssRTLCSS = require("postcss-rtlcss");
// https://vitejs.dev/config/
export default defineConfig({
@@ -20,5 +20,5 @@ export default defineConfig({
"map": false,
"plugins": [postcssRTLCSS]
}
- },
-})
+ },
+});
diff --git a/package.json b/package.json
index 6cb8d9dbb..03fdebbd4 100644
--- a/package.json
+++ b/package.json
@@ -15,17 +15,17 @@
"lint:js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .",
"lint:style": "stylelint \"**/*.{vue,css,scss}\" --ignore-path .gitignore",
"lint": "npm run lint:js && npm run lint:style",
- "dev": "vite --host",
+ "dev": "vite --host --config ./config/vite.config.js",
"start": "npm run start-server",
"start-server": "node server/server.js",
"start-server-dev": "cross-env NODE_ENV=development node server/server.js",
- "build": "vite build",
+ "build": "vite build --config ./config/vite.config.js",
"test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --test",
"test-with-build": "npm run build && npm test",
"jest": "node test/prepare-jest.js && npm run jest-frontend && jest ",
"jest-frontend": "cross-env TEST_FRONTEND=1 jest --config=./jest-frontend.config.js",
"tsc": "tsc",
- "vite-preview-dist": "vite preview --host",
+ "vite-preview-dist": "vite preview --host --config ./config/vite.config.js",
"build-docker": "npm run build-docker-debian && npm run build-docker-alpine",
"build-docker-alpine-base": "docker buildx build -f docker/alpine-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-alpine . --push",
"build-docker-debian-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-debian . --push",
From 11c3c636e0076d88de1118cbb3b74a592b7f5790 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Wed, 13 Oct 2021 02:32:02 +0800
Subject: [PATCH 144/179] move dockerfile, docker-compose.yml to docker folder
---
docker-compose.yml => docker/docker-compose.yml | 0
dockerfile => docker/dockerfile | 0
dockerfile-alpine => docker/dockerfile-alpine | 0
package.json | 9 ++++-----
4 files changed, 4 insertions(+), 5 deletions(-)
rename docker-compose.yml => docker/docker-compose.yml (100%)
rename dockerfile => docker/dockerfile (100%)
rename dockerfile-alpine => docker/dockerfile-alpine (100%)
diff --git a/docker-compose.yml b/docker/docker-compose.yml
similarity index 100%
rename from docker-compose.yml
rename to docker/docker-compose.yml
diff --git a/dockerfile b/docker/dockerfile
similarity index 100%
rename from dockerfile
rename to docker/dockerfile
diff --git a/dockerfile-alpine b/docker/dockerfile-alpine
similarity index 100%
rename from dockerfile-alpine
rename to docker/dockerfile-alpine
diff --git a/package.json b/package.json
index 03fdebbd4..b4454601e 100644
--- a/package.json
+++ b/package.json
@@ -29,11 +29,11 @@
"build-docker": "npm run build-docker-debian && npm run build-docker-alpine",
"build-docker-alpine-base": "docker buildx build -f docker/alpine-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-alpine . --push",
"build-docker-debian-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-debian . --push",
- "build-docker-alpine": "docker buildx build -f dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.8.0-alpine --target release . --push",
- "build-docker-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.8.0 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.8.0-debian --target release . --push",
- "build-docker-nightly": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
+ "build-docker-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.8.0-alpine --target release . --push",
+ "build-docker-debian": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.8.0 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.8.0-debian --target release . --push",
+ "build-docker-nightly": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
"build-docker-nightly-alpine": "docker buildx build -f dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly-alpine --target nightly . --push",
- "build-docker-nightly-amd64": "docker buildx build --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
+ "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
"upload-artifacts": "docker buildx build --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
"setup": "git checkout 1.8.0 && npm ci --production && npm run download-dist",
"download-dist": "node extra/download-dist.js",
@@ -107,7 +107,6 @@
"@vitejs/plugin-vue": "~1.9.2",
"@vue/compiler-sfc": "~3.2.19",
"core-js": "~3.18.1",
- "cross-env": "~7.0.3",
"dns2": "~2.0.1",
"eslint": "~7.32.0",
"eslint-plugin-vue": "~7.18.0",
From 407581ee07a38490a2ced7828a87b586cfbcc54e Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Wed, 13 Oct 2021 02:53:59 +0800
Subject: [PATCH 145/179] move jest config files to config dir
---
babel.config.js | 4 ++++
config/jest-backend.config.js | 5 +++++
.../jest-frontend.config.js | 2 +-
.../jest-puppeteer.config.js | 0
jest.config.js => config/jest.config.js | 2 +-
package-lock.json | 17 +++++++++++++++--
package.json | 6 ++++--
test/backend.spec.js | 10 ++++++++++
8 files changed, 40 insertions(+), 6 deletions(-)
create mode 100644 config/jest-backend.config.js
rename jest-frontend.config.js => config/jest-frontend.config.js (76%)
rename jest-puppeteer.config.js => config/jest-puppeteer.config.js (100%)
rename jest.config.js => config/jest.config.js (90%)
create mode 100644 test/backend.spec.js
diff --git a/babel.config.js b/babel.config.js
index 70266c1f7..d2ad8213a 100644
--- a/babel.config.js
+++ b/babel.config.js
@@ -4,4 +4,8 @@ if (process.env.TEST_FRONTEND) {
config.presets = ["@babel/preset-env"];
}
+if (process.env.TEST_BACKEND) {
+ config.plugins = ["babel-plugin-rewire"];
+}
+
module.exports = config;
diff --git a/config/jest-backend.config.js b/config/jest-backend.config.js
new file mode 100644
index 000000000..1a88d9a6b
--- /dev/null
+++ b/config/jest-backend.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ "rootDir": "..",
+ "testRegex": "./test/backend.spec.js",
+};
+
diff --git a/jest-frontend.config.js b/config/jest-frontend.config.js
similarity index 76%
rename from jest-frontend.config.js
rename to config/jest-frontend.config.js
index ec4ab8d8e..ab6af7f1e 100644
--- a/jest-frontend.config.js
+++ b/config/jest-frontend.config.js
@@ -1,5 +1,5 @@
module.exports = {
- "rootDir": ".",
+ "rootDir": "..",
"testRegex": "./test/frontend.spec.js",
};
diff --git a/jest-puppeteer.config.js b/config/jest-puppeteer.config.js
similarity index 100%
rename from jest-puppeteer.config.js
rename to config/jest-puppeteer.config.js
diff --git a/jest.config.js b/config/jest.config.js
similarity index 90%
rename from jest.config.js
rename to config/jest.config.js
index 6ce5b90a6..4baaa0fb6 100644
--- a/jest.config.js
+++ b/config/jest.config.js
@@ -5,7 +5,7 @@ module.exports = {
"__DEV__": true
},
"testRegex": "./test/e2e.spec.js",
- "rootDir": ".",
+ "rootDir": "..",
"testTimeout": 30000,
};
diff --git a/package-lock.json b/package-lock.json
index 104b38c10..296362633 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "uptime-kuma",
- "version": "1.7.3",
+ "version": "1.8.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "uptime-kuma",
- "version": "1.7.3",
+ "version": "1.8.0",
"license": "MIT",
"dependencies": {
"@fortawesome/fontawesome-svg-core": "~1.2.36",
@@ -64,6 +64,7 @@
"@vitejs/plugin-legacy": "~1.6.1",
"@vitejs/plugin-vue": "~1.9.2",
"@vue/compiler-sfc": "~3.2.19",
+ "babel-plugin-rewire": "^1.2.0",
"core-js": "~3.18.1",
"cross-env": "~7.0.3",
"dns2": "~2.0.1",
@@ -3331,6 +3332,12 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/babel-plugin-rewire": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-rewire/-/babel-plugin-rewire-1.2.0.tgz",
+ "integrity": "sha512-JBZxczHw3tScS+djy6JPLMjblchGhLI89ep15H3SyjujIzlxo5nr6Yjo7AXotdeVczeBmWs0tF8PgJWDdgzAkQ==",
+ "dev": true
+ },
"node_modules/babel-preset-current-node-syntax": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
@@ -14722,6 +14729,12 @@
"@babel/helper-define-polyfill-provider": "^0.2.2"
}
},
+ "babel-plugin-rewire": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-rewire/-/babel-plugin-rewire-1.2.0.tgz",
+ "integrity": "sha512-JBZxczHw3tScS+djy6JPLMjblchGhLI89ep15H3SyjujIzlxo5nr6Yjo7AXotdeVczeBmWs0tF8PgJWDdgzAkQ==",
+ "dev": true
+ },
"babel-preset-current-node-syntax": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
diff --git a/package.json b/package.json
index b4454601e..16f463c50 100644
--- a/package.json
+++ b/package.json
@@ -22,8 +22,9 @@
"build": "vite build --config ./config/vite.config.js",
"test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --test",
"test-with-build": "npm run build && npm test",
- "jest": "node test/prepare-jest.js && npm run jest-frontend && jest ",
- "jest-frontend": "cross-env TEST_FRONTEND=1 jest --config=./jest-frontend.config.js",
+ "jest": "node test/prepare-jest.js && npm run jest-frontend && npm run jest-backend && jest --config=./config/jest.config.js",
+ "jest-frontend": "cross-env TEST_FRONTEND=1 jest --config=./config/jest-frontend.config.js",
+ "jest-backend": "cross-env TEST_BACKEND=1 jest --config=./config/jest-backend.config.js",
"tsc": "tsc",
"vite-preview-dist": "vite preview --host --config ./config/vite.config.js",
"build-docker": "npm run build-docker-debian && npm run build-docker-alpine",
@@ -59,6 +60,7 @@
"@popperjs/core": "~2.10.2",
"args-parser": "~1.3.0",
"axios": "~0.21.4",
+ "babel-plugin-rewire": "~1.2.0",
"bcryptjs": "~2.4.3",
"bootstrap": "~5.1.1",
"chart.js": "~3.5.1",
diff --git a/test/backend.spec.js b/test/backend.spec.js
new file mode 100644
index 000000000..4f00c0b13
--- /dev/null
+++ b/test/backend.spec.js
@@ -0,0 +1,10 @@
+beforeAll(() => {
+
+});
+
+describe("", () => {
+
+ it("should ", () => {
+
+ });
+});
From 5b67fec084f770c10f787db97c854d31dfec207c Mon Sep 17 00:00:00 2001
From: KangAlleW <76554157+KangAlleW@users.noreply.github.com>
Date: Wed, 13 Oct 2021 02:46:11 +0700
Subject: [PATCH 146/179] add indonesian language
---
src/languages/id.js | 285 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 285 insertions(+)
create mode 100644 src/languages/id.js
diff --git a/src/languages/id.js b/src/languages/id.js
new file mode 100644
index 000000000..30540db5a
--- /dev/null
+++ b/src/languages/id.js
@@ -0,0 +1,285 @@
+export default {
+ languageName: "Indonesia",
+ checkEverySecond: "Cek Setiap {0} detik.",
+ retryCheckEverySecond: "Coba lagi setiap {0} detik.",
+ retriesDescription: "Percobaan ulang maksimum sebelum layanan dinyatakan tidak aktif dan notifikasi dikirim",
+ ignoreTLSError: "Abaikan kesalahan TLS/SSL untuk situs web HTTPS",
+ upsideDownModeDescription: "Balikkan statusnya. Jika layanan dapat dijangkau, TIDAK AKTIF.",
+ maxRedirectDescription: "Jumlah maksimum pengalihan untuk diikuti. Setel ke 0 untuk menonaktifkan pengalihan.",
+ acceptedStatusCodesDescription: "Pilih kode status yang dianggap sebagai respons yang berhasil.",
+ passwordNotMatchMsg: "Sandi kedua tidak cocok.",
+ notificationDescription: "Harap atur notifikasi ke monitor agar berfungsi.",
+ keywordDescription: "Cari kata kunci dalam code html atau JSON huruf besar-kecil berpengaruh",
+ pauseDashboardHome: "Jeda",
+ deleteMonitorMsg: "Apakah anda mau menghapus monitor ini?",
+ deleteNotificationMsg: "Apakah anda mau menghapus notifikasi ini untuk semua monitor?",
+ resoverserverDescription: "Cloudflare adalah server default, Anda dapat mengubah server resolver kapan saja.",
+ rrtypeDescription: "Pilih RR-Type yang mau anda monitor",
+ pauseMonitorMsg: "Apakah anda yakin mau menjeda?",
+ enableDefaultNotificationDescription: "Untuk setiap monitor baru, notifikasi ini akan diaktifkan secara default. Anda masih dapat menonaktifkan notifikasi secara terpisah untuk setiap monitor.",
+ clearEventsMsg: "Apakah anda yakin mau menghapus semua event di monitor ini?",
+ clearHeartbeatsMsg: "Apakah anda yakin mau menghapus semua heartbeats di monitor ini?",
+ confirmClearStatisticsMsg: "Apakah anda yakin mau menghapus semua statistik?",
+ importHandleDescription: "Pilih 'Lewati yang ada' jika Anda ingin melewati setiap monitor atau notifikasi dengan nama yang sama. 'Timpa' akan menghapus setiap monitor dan notifikasi yang ada.",
+ confirmImportMsg: "Apakah Anda yakin untuk mengimpor cadangan? Pastikan Anda telah memilih opsi impor yang tepat.",
+ twoFAVerifyLabel: "Silakan ketik token Anda untuk memverifikasi bahwa 2FA berfungsi",
+ tokenValidSettingsMsg: "Tokennya valid! Anda sekarang dapat menyimpan pengaturan 2FA.",
+ confirmEnableTwoFAMsg: "Apakah Anda yakin ingin mengaktifkan 2FA?",
+ confirmDisableTwoFAMsg: "Apakah Anda yakin ingin menonaktifkan 2FA?",
+ Settings: "Pengaturan",
+ Dashboard: "Dashboard",
+ "New Update": "Update Baru",
+ Language: "Bahasa",
+ Appearance: "Tampilan",
+ Theme: "Tema",
+ General: "General",
+ Version: "Versi",
+ "Check Update On GitHub": "Cek Update di GitHub",
+ List: "List",
+ Add: "Tambah",
+ "Add New Monitor": "Tambah Monitor Baru",
+ "Quick Stats": "Statistik Cepat",
+ Up: "Aktif",
+ Down: "Tidak Aktif",
+ Pending: "Tertunda",
+ Unknown: "Tidak diketahui",
+ Pause: "Jeda",
+ Name: "Nama",
+ Status: "Status",
+ DateTime: "Tanggal Waktu",
+ Message: "Pesan",
+ "No important events": "Tidak ada Event penting",
+ Resume: "Melanjutkan",
+ Edit: "Rubah",
+ Delete: "Hapus",
+ Current: "Saat ini",
+ Uptime: "Waktu aktif",
+ "Cert Exp.": "Cert Exp.",
+ days: "hari-hari",
+ day: "hari",
+ "-day": "-hari",
+ hour: "Jam",
+ "-hour": "-Jam",
+ Response: "Respon",
+ Ping: "Ping",
+ "Monitor Type": "Tipe Monitor",
+ Keyword: "Keyword",
+ "Friendly Name": "Friendly Name",
+ URL: "URL",
+ Hostname: "Hostname",
+ Port: "Port",
+ "Heartbeat Interval": "Interval Heartbeat ",
+ Retries: "Retries",
+ "Heartbeat Retry Interval": "Interval Heartbeat Mencoba kembali ",
+ Advanced: "Advanced",
+ "Upside Down Mode": "Mode Terbalik",
+ "Max. Redirects": "Maksimal Redirect/Pengalihan",
+ "Accepted Status Codes": "Kode Status yang Diterima",
+ Save: "Simpan",
+ Notifications: "Notifikasi",
+ "Not available, please setup.": "Tidak tersedia, silakan atur.",
+ "Setup Notification": "Setel Notifikasi",
+ Light: "Terang",
+ Dark: "Gelap",
+ Auto: "Automatis",
+ "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
+ Normal: "Normal",
+ Bottom: "Bawah",
+ None: "Tidak ada",
+ Timezone: "Zona Waktu",
+ "Search Engine Visibility": "Visibilitas Mesin Pencari",
+ "Allow indexing": "Mengizinkan untuk diindex",
+ "Discourage search engines from indexing site": "Mencegah mesin pencari untuk mengindex site",
+ "Change Password": "Ganti Sandi",
+ "Current Password": "Sandi Lama",
+ "New Password": "Sandi Baru",
+ "Repeat New Password": "Ulangi Sandi Baru",
+ "Update Password": "Perbarui Kata Sandi",
+ "Disable Auth": "Nonaktifkan auth",
+ "Enable Auth": "Aktifkan Auth",
+ Logout: "Keluar",
+ Leave: "Pergi",
+ "I understand, please disable": "Saya mengerti, silahkan dinonaktifkan",
+ Confirm: "Konfirmasi",
+ Yes: "Ya",
+ No: "Tidak",
+ Username: "Nama Pengguna",
+ Password: "Sandi",
+ "Remember me": "Ingat saya",
+ Login: "Masuk",
+ "No Monitors, please": "Tidak ada monitor, silahkan",
+ "add one": "tambah baru",
+ "Notification Type": "Tipe Notifikasi",
+ Email: "Email",
+ Test: "Test",
+ "Certificate Info": "Info Sertifikasi ",
+ "Resolver Server": "Resolver Server",
+ "Resource Record Type": "Resource Record Type",
+ "Last Result": "Hasil Terakhir",
+ "Create your admin account": "Buat admin akun anda",
+ "Repeat Password": "Ulangi Sandi",
+ "Import Backup": "Impor Backup",
+ "Export Backup": "Expor Backup",
+ Export: "Expor",
+ Import: "Impor",
+ respTime: "Tanggapan. Waktu (milidetik)",
+ notAvailableShort: "N/A",
+ "Default enabled": "Default diaktifkan",
+ "Apply on all existing monitors": "Terapkan pada semua monitor yang ada",
+ Create: "Buat",
+ "Clear Data": "Bersihkan Data",
+ Events: "Event",
+ Heartbeats: "Heartbeats",
+ "Auto Get": "Auto Get",
+ backupDescription: "Anda dapat mencadangkan semua monitor dan semua notifikasi ke dalam file JSON.",
+ backupDescription2: "Catatan: Data sejarah dan event tidak disertakan.",
+ backupDescription3: "Data sensitif seperti notifikasi token disertakan dalam file ekspor, harap simpan dengan hati-hati.",
+ alertNoFile: "Silakan pilih file untuk diimpor.",
+ alertWrongFileType: "Silakan pilih file JSON .",
+ "Clear all statistics": "Hapus semua statistik",
+ "Skip existing": "Lewati yang ada",
+ Overwrite: "Timpa",
+ Options: "Opsi",
+ "Keep both": "Simpan keduanya",
+ "Verify Token": "Verifikasi Token",
+ "Setup 2FA": "Pengaturan 2FA",
+ "Enable 2FA": "Aktifkan 2FA",
+ "Disable 2FA": "Nonaktifkan 2FA",
+ "2FA Settings": "Settings 2FA",
+ "Two Factor Authentication": "Otentikasi Dua Faktor",
+ Active: "Aktif",
+ Inactive: "Tidak Aktif",
+ Token: "Token",
+ "Show URI": "Lihat URI",
+ Tags: "Tag",
+ "Add New below or Select...": "Tambahkan Baru di bawah atau Pilih...",
+ "Tag with this name already exist.": "Tag dengan nama ini sudah ada.",
+ "Tag with this value already exist.": "Tag dengan nilai ini sudah ada.",
+ color: "warna",
+ "value (optional)": "nilai (harus diisi)",
+ Gray: "Abu Abu",
+ Red: "Merah",
+ Orange: "Oranye",
+ Green: "Hijau",
+ Blue: "Biru",
+ Indigo: "Indigo",
+ Purple: "Ungu",
+ Pink: "Merah Muda",
+ "Search...": "Cari...",
+ "Avg. Ping": "Rata-rata. Ping",
+ "Avg. Response": "Rata-rata. Respon",
+ "Entry Page": "Halaman Masuk",
+ statusPageNothing: "Tidak ada di sini, silakan tambahkan grup atau monitor.",
+ "No Services": "Tidak ada Layanan",
+ "All Systems Operational": "Semua Sistem Berfungsi",
+ "Partially Degraded Service": "Layanan Terdegradasi Sebagian",
+ "Degraded Service": "Layanan Terdegradasi",
+ "Add Group": "Tambah Grup",
+ "Add a monitor": "Tambah monitor",
+ "Edit Status Page": "Edit Halaman Status",
+ "Go to Dashboard": "Lihat Dashboard",
+ "Status Page": "Halaman Status",
+ // Start notification form
+ defaultNotificationName: "{notification} saya Peringatan ({number})",
+ here: "di sini",
+ "Required": "Dibutuhkan",
+ "telegram": "Telegram",
+ "Bot Token": "Bot Token",
+ "You can get a token from": "Anda bisa mendapatkan token dari",
+ "Chat ID": "Chat ID",
+ supportTelegramChatID: "Mendukung Obrolan Langsung / Grup / Channel Chat ID",
+ wayToGetTelegramChatID: "Anda bisa mendapatkan chat id Anda dengan mengirim pesan ke bot dan pergi ke url ini untuk melihat chat_id:",
+ "YOUR BOT TOKEN HERE": "BOT TOKEN ANDA DI SINI",
+ chatIDNotFound: "Chat ID tidak ditemukan, tolong kirim pesan ke bot ini dulu",
+ "webhook": "Webhook",
+ "Post URL": "Post URL",
+ "Content Type": "Tipe konten",
+ webhookJsonDesc: "{0} bagus untuk server http modern seperti express.js",
+ webhookFormDataDesc: "{multipart} bagus untuk PHP, Anda hanya perlu mengurai json dengan {decodeFunction}",
+ "smtp": "Email (SMTP)",
+ secureOptionNone: "None / STARTTLS (25, 587)",
+ secureOptionTLS: "TLS (465)",
+ "Ignore TLS Error": "Ignore TLS Error",
+ "From Email": "From Email",
+ "To Email": "To Email",
+ smtpCC: "CC",
+ smtpBCC: "BCC",
+ "discord": "Discord",
+ "Discord Webhook URL": "Discord Webhook URL",
+ wayToGetDiscordURL: "Anda bisa mendapatkan ini dengan pergi ke Server Settings -> Integrations -> Create Webhook",
+ "Bot Display Name": "Nama Bot",
+ "Prefix Custom Message": "Prefix Pesan",
+ "Hello @everyone is...": "Hallo {'@'}everyone is...",
+ "teams": "Microsoft Teams",
+ "Webhook URL": "Webhook URL",
+ wayToGetTeamsURL: "Anda dapat mempelajari cara membuat url webhook {0}.",
+ "signal": "Sinyal",
+ "Number": "Nomer",
+ "Recipients": "Penerima",
+ needSignalAPI: "Anda harus memiliki klien sinyal dengan REST API.",
+ wayToCheckSignalURL: "Anda dapat memeriksa url ini untuk melihat cara menyiapkannya:",
+ signalImportant: "PENTING: Anda tidak dapat mencampur grup dan nomor di penerima!",
+ "gotify": "Gotify",
+ "Application Token": "Token Aplikasi",
+ "Server URL": "Server URL",
+ "Priority": "Prioritas",
+ "slack": "Slack",
+ "Icon Emoji": "Icon Emoji",
+ "Channel Name": "Nama Channel",
+ "Uptime Kuma URL": "Uptime Kuma URL",
+ aboutWebhooks: "Info lain tentang webhook: {0}",
+ aboutChannelName: "Masukan nama channel di {0} Kolom Nama Channel jika Anda ingin melewati channel webhook. Contoh: #other-channel",
+ aboutKumaURL: "Jika Anda membiarkan bidang URL Uptime Kuma kosong, itu akan menjadi default ke halaman Project Github.",
+ emojiCheatSheet: "Emoji cheat sheet: {0}",
+ "rocket.chat": "Rocket.chat",
+ pushover: "Pushover",
+ pushy: "Pushy",
+ octopush: "Octopush",
+ promosms: "PromoSMS",
+ lunasea: "LunaSea",
+ apprise: "Apprise (Mendukung 50+ layanan notifikasi)",
+ pushbullet: "Pushbullet",
+ line: "Line Messenger",
+ mattermost: "Mattermost",
+ "User Key": "Kunci pengguna",
+ "Device": "Perangkat",
+ "Message Title": "Judul Pesan",
+ "Notification Sound": "Suara Nofifikasi",
+ "More info on:": "Info lebih lanjut tentang: {0}",
+ pushoverDesc1: "Prioritas darurat (2) memiliki batas waktu default 30 detik antara percobaan ulang dan akan kadaluwarsa setelah 1 jam.",
+ pushoverDesc2: "Jika Anda ingin mengirim pemberitahuan ke perangkat yang berbeda, isi kolom Perangkat.",
+ "SMS Type": "Tipe SMS",
+ octopushTypePremium: "Premium (Cepat - direkomendasikan untuk mengingatkan)",
+ octopushTypeLowCost: "Low Cost (Lambat, terkadang diblokir oleh operator)",
+ "Check octopush prices": "Cek harga octopush {0}.",
+ octopushPhoneNumber: "Nomer Telpon/HP (format internasional, contoh : +33612345678) ",
+ octopushSMSSender: "Nama Pengirim SMS : 3-11 karakter alfanumerik dan spasi (a-zA-Z0-9)",
+ "LunaSea Device ID": "LunaSea Device ID",
+ "Apprise URL": "Apprise URL",
+ "Example:": "Contoh: {0}",
+ "Read more:": "Baca lebih lajut: {0}",
+ "Status:": "Status: {0}",
+ "Read more": "Baca lebih lajut",
+ appriseInstalled: "Apprise diinstall.",
+ appriseNotInstalled: "Apprise tidak diinstall. {0}",
+ "Access Token": "Access Token",
+ "Channel access token": "Channel access token",
+ "Line Developers Console": "Line Developers Console",
+ lineDevConsoleTo: "Line Developers Console - {0}",
+ "Basic Settings": "Pengaturan dasar",
+ "User ID": "User ID",
+ "Messaging API": "Messaging API",
+ wayToGetLineChannelToken: "Pertama akses {0}, buat penyedia dan saluran (Messaging API), lalu Anda bisa mendapatkan token akses saluran dan id pengguna dari item menu yang disebutkan di atas.",
+ "Icon URL": "Icon URL",
+ aboutIconURL: "Anda dapat memberikan tautan ke gambar di \"Icon URL\" untuk mengganti gambar profil default. Tidak akan digunakan jika Ikon Emoji diset.",
+ aboutMattermostChannelName: "Anda dapat mengganti channel default tujuan posting webhook dengan memasukkan nama channel ke dalam Kolom \"Channel Name\". Ini perlu diaktifkan di pengaturan webhook Mattermost. contoh: #other-channel",
+ "matrix": "Matrix",
+ promosmsTypeEco: "SMS ECO - murah tapi lambat dan sering kelebihan beban. Terbatas hanya untuk penerima Polandia.",
+ promosmsTypeFlash: "SMS FLASH - Pesan akan otomatis muncul di perangkat penerima. Terbatas hanya untuk penerima Polandia.",
+ promosmsTypeFull: "SMS FULL - SMS tingkat premium, Anda dapat menggunakan Nama Pengirim Anda (Anda harus mendaftarkan nama terlebih dahulu). Dapat diandalkan untuk peringatan.",
+ promosmsTypeSpeed: "SMS SPEED - Prioritas tertinggi dalam sistem. Sangat cepat dan dapat diandalkan tetapi mahal (sekitar dua kali lipat dari harga SMS FULL).",
+ promosmsPhoneNumber: "Nomor telepon (untuk penerima Polandia Anda dapat melewati kode area)",
+ promosmsSMSSender: "Nama Pengirim SMS : Nama pra-registrasi atau salah satu default: InfoSMS, Info SMS, MaxSMS, INFO, SMS",
+ "Feishu WebHookUrl": "Feishu WebHookUrl",
+ // End notification form
+};
From 4b9f0a3fe673381cd59b8cbe174f5b332bddc1c3 Mon Sep 17 00:00:00 2001
From: KangAlleW <76554157+KangAlleW@users.noreply.github.com>
Date: Wed, 13 Oct 2021 02:53:46 +0700
Subject: [PATCH 147/179] add indonesian language and edit settings.vue
---
src/pages/Settings.vue | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index 8fad9d143..979417774 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -333,6 +333,12 @@
Utilizzare con attenzione.
+
+ Apakah Anda yakin ingin menonaktifkan autentikasi ?
+ Ini untuk mereka yang memiliki otentikasi pihak ketiga diletakkan di depan Uptime Kuma, misalnya akses Cloudflare.
+ Gunakan dengan hati-hati.
+
+
Вы уверены, что хотите отключить авторизацию ?
Это подходит для тех, у кого стоит другая авторизация перед открытием Uptime Kuma, например Cloudflare Access.
From 7c9ed9840856b0e1adf5840060a812526bbf16c0 Mon Sep 17 00:00:00 2001
From: KangAlleW <76554157+KangAlleW@users.noreply.github.com>
Date: Wed, 13 Oct 2021 02:57:36 +0700
Subject: [PATCH 148/179] rename id.js to id-ID.js
---
src/i18n.js | 2 ++
src/languages/{id.js => id-ID.js} | 0
2 files changed, 2 insertions(+)
rename src/languages/{id.js => id-ID.js} (100%)
diff --git a/src/i18n.js b/src/i18n.js
index 83f71d5db..19fc02933 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -8,6 +8,7 @@ import fa from "./languages/fa";
import frFR from "./languages/fr-FR";
import hu from "./languages/hu";
import itIT from "./languages/it-IT";
+import idID from "./languages/id-ID";
import ja from "./languages/ja";
import koKR from "./languages/ko-KR";
import nlNL from "./languages/nl-NL";
@@ -36,6 +37,7 @@ const languageList = {
"fr-FR": frFR,
"hu": hu,
"it-IT": itIT,
+ "id-ID" : idID
"ja": ja,
"da-DK": daDK,
"sr": sr,
diff --git a/src/languages/id.js b/src/languages/id-ID.js
similarity index 100%
rename from src/languages/id.js
rename to src/languages/id-ID.js
From dcf15c3eb7ac71202fd1217f8d937fb390b60a8d Mon Sep 17 00:00:00 2001
From: KangAlleW <76554157+KangAlleW@users.noreply.github.com>
Date: Wed, 13 Oct 2021 02:58:09 +0700
Subject: [PATCH 149/179] edit i18n.js
---
src/i18n.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/i18n.js b/src/i18n.js
index 19fc02933..b95e32d00 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -37,7 +37,7 @@ const languageList = {
"fr-FR": frFR,
"hu": hu,
"it-IT": itIT,
- "id-ID" : idID
+ "id-ID" : idID,
"ja": ja,
"da-DK": daDK,
"sr": sr,
From 2939bd4138e77d0af231f0480fe76c7cd0805271 Mon Sep 17 00:00:00 2001
From: KangAlleW <76554157+KangAlleW@users.noreply.github.com>
Date: Wed, 13 Oct 2021 03:12:26 +0700
Subject: [PATCH 150/179] fix locale
---
src/pages/Settings.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index 979417774..0f4fe5a8e 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -333,7 +333,7 @@
Utilizzare con attenzione.
-
+
Apakah Anda yakin ingin menonaktifkan autentikasi ?
Ini untuk mereka yang memiliki otentikasi pihak ketiga diletakkan di depan Uptime Kuma, misalnya akses Cloudflare.
Gunakan dengan hati-hati.
From 30d8aadf12af55198679960685130321507af865 Mon Sep 17 00:00:00 2001
From: Lukas <35193662+NixNotCastey@users.noreply.github.com>
Date: Tue, 12 Oct 2021 23:24:34 +0200
Subject: [PATCH 151/179] Slightly refactor
---
server/notification-providers/smtp.js | 33 ++++++++++++---------------
1 file changed, 15 insertions(+), 18 deletions(-)
diff --git a/server/notification-providers/smtp.js b/server/notification-providers/smtp.js
index 2bbec5848..7def06940 100644
--- a/server/notification-providers/smtp.js
+++ b/server/notification-providers/smtp.js
@@ -1,5 +1,6 @@
const nodemailer = require("nodemailer");
const NotificationProvider = require("./notification-provider");
+const { DOWN, UP } = require("../../src/util");
class SMTP extends NotificationProvider {
@@ -28,33 +29,29 @@ class SMTP extends NotificationProvider {
// If custom subject is not empty, change subject for notification
if (customsubject !== "") {
-
- // Replace "MACROS" with coresponding variable
+
+ // Replace "MACROS" with coresponding variable
let replaceName = new RegExp("{NAME}", "g");
let replaceHostname = new RegExp("{HOSTNAME}", "g");
let replaceStatus = new RegExp("{STATUS}", "g");
- let serviceStatus;
+ // Lets start with dummy values to simplify code
+ let monitorName = "Test"
+ let monitorHostname = "example.com"
+ let serviceStatus = "⚠️ Test";
if (monitorJSON !== null) {
- customsubject = customsubject.replace(replaceName,monitorJSON["name"]);
- customsubject = customsubject.replace(replaceHostname,monitorJSON["hostname"]);
- } else {
- // Insert dummy values during test
- customsubject = customsubject.replace(replaceName,"Test");
- customsubject = customsubject.replace(replaceHostname,"example.com");
+ monitorName = monitorJSON["name"];
+ monitorHostname = monitorJSON["hostname"];
}
+
if (heartbeatJSON !== null) {
- if (heartbeatJSON["status"] === 0) {
- serviceStatus = "🔴 Down"
- } else {
- serviceStatus = "✅ Up"
- }
- customsubject = customsubject.replace(replaceStatus,serviceStatus);
- } else {
- // Insert dummy values during test
- customsubject = customsubject.replace(replaceStatus,"TEST");
+ serviceStatus = heartbeatJSON["status"] == DOWN ? "🔴 Down":"✅ Up";
}
+ // Break replace to one by line for better readability
+ customsubject = customsubject.replace(replaceStatus,serviceStatus);
+ customsubject = customsubject.replace(replaceName,monitorName);
+ customsubject = customsubject.replace(replaceHostname,monitorHostname);
subject = customsubject
}
From 281671b938a854a50efe20419011469db65233ca Mon Sep 17 00:00:00 2001
From: Adam Stachowicz
Date: Wed, 13 Oct 2021 01:10:17 +0200
Subject: [PATCH 152/179] Fix build
Add `cross-env` deleted in https://github.com/louislam/uptime-kuma/commit/11c3c636e0076d88de1118cbb3b74a592b7f5790
---
package.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/package.json b/package.json
index 16f463c50..03112518a 100644
--- a/package.json
+++ b/package.json
@@ -109,6 +109,7 @@
"@vitejs/plugin-vue": "~1.9.2",
"@vue/compiler-sfc": "~3.2.19",
"core-js": "~3.18.1",
+ "cross-env": "~7.0.3",
"dns2": "~2.0.1",
"eslint": "~7.32.0",
"eslint-plugin-vue": "~7.18.0",
From 521d57c4837fb7b34ba4875796f0e5d1868f1376 Mon Sep 17 00:00:00 2001
From: Adam Stachowicz
Date: Wed, 13 Oct 2021 02:01:34 +0200
Subject: [PATCH 153/179] Fix some of markdownlint warnings
---
.github/ISSUE_TEMPLATE/ask-for-help.md | 3 +-
CONTRIBUTING.md | 53 +++++++++++++-------------
README.md | 3 +-
SECURITY.md | 7 +++-
4 files changed, 35 insertions(+), 31 deletions(-)
diff --git a/.github/ISSUE_TEMPLATE/ask-for-help.md b/.github/ISSUE_TEMPLATE/ask-for-help.md
index 8184f8409..79ec21c66 100644
--- a/.github/ISSUE_TEMPLATE/ask-for-help.md
+++ b/.github/ISSUE_TEMPLATE/ask-for-help.md
@@ -9,9 +9,8 @@ assignees: ''
**Is it a duplicate question?**
Please search in Issues without filters: https://github.com/louislam/uptime-kuma/issues?q=
-
**Describe your problem**
-
+Please describe what you are asking for
**Info**
Uptime Kuma Version:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 55b7da275..9c4d5dc4f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -6,7 +6,7 @@ The project was created with vite.js (vue3). Then I created a sub-directory call
The frontend code build into "dist" directory. The server (express.js) exposes the "dist" directory as root of the endpoint. This is how production is working.
-# Key Technical Skills
+## Key Technical Skills
- Node.js (You should know what are promise, async/await and arrow function etc.)
- Socket.io
@@ -15,7 +15,7 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
- Bootstrap
- SQLite
-# Directories
+## Directories
- data (App data)
- dist (Frontend build)
@@ -25,41 +25,41 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
- src (Frontend source code)
- test (unit test)
-# Can I create a pull request for Uptime Kuma?
+## Can I create a pull request for Uptime Kuma?
Generally, if the pull request is working fine and it do not affect any existing logic, workflow and perfomance, I will merge into the master branch once it is tested.
If you are not sure, feel free to create an empty pull request draft first.
-## Pull Request Examples
+### Pull Request Examples
-### ✅ High - Medium Priority
+#### ✅ High - Medium Priority
- Add a new notification
- Add a chart
- Fix a bug
- Translations
-### *️⃣ Requires one more reviewer
+#### *️⃣ Requires one more reviewer
I do not have such knowledge to test it.
- Add k8s supports
-### *️⃣ Low Priority
+#### *️⃣ Low Priority
It changed my current workflow and require further studies.
- Change my release approach
-### ❌ Won't Merge
+#### ❌ Won't Merge
- Duplicated pull request
- Buggy
- Existing logic is completely modified or deleted
- A function that is completely out of scope
-# Project Styles
+## Project Styles
I personally do not like something need to learn so much and need to config so much before you can finally start the app.
@@ -68,32 +68,32 @@ I personally do not like something need to learn so much and need to config so m
- Settings should be configurable in the frontend. Env var is not encouraged.
- Easy to use
-# Coding Styles
+## Coding Styles
- 4 spaces indentation
- Follow `.editorconfig`
- Follow ESLint
-# Name convention
+## Name convention
- Javascript/Typescript: camelCaseType
- SQLite: underscore_type
- CSS/SCSS: dash-type
-# Tools
+## Tools
- Node.js >= 14
- Git
- IDE that supports ESLint and EditorConfig (I am using Intellji Idea)
- A SQLite tool (SQLite Expert Personal is suggested)
-# Install dependencies
+## Install dependencies
```bash
npm ci
```
-# How to start the Backend Dev Server
+## How to start the Backend Dev Server
(2021-09-23 Update)
@@ -103,7 +103,7 @@ npm run start-server-dev
It binds to `0.0.0.0:3001` by default.
-## Backend Details
+### Backend Details
It is mainly a socket.io app + express.js.
@@ -116,24 +116,26 @@ express.js is just used for serving the frontend built files (index.html, .js an
- scoket-handler (Socket.io Handlers)
- server.js (Server main logic)
-# How to start the Frontend Dev Server
+## How to start the Frontend Dev Server
1. Set the env var `NODE_ENV` to "development".
2. Start the frontend dev server by the following command.
+
```bash
npm run dev
```
+
It binds to `0.0.0.0:3000` by default.
You can use Vue.js devtools Chrome extension for debugging.
-## Build the frontend
+### Build the frontend
```bash
npm run build
```
-## Frontend Details
+### Frontend Details
Uptime Kuma Frontend is a single page application (SPA). Most paths are handled by Vue Router.
@@ -143,24 +145,23 @@ As you can see, most data in frontend is stored in root level, even though you c
The data and socket logic are in `src/mixins/socket.js`.
-
-# Database Migration
+## Database Migration
1. Create `patch-{name}.sql` in `./db/`
2. Add your patch filename in the `patchList` list in `./server/database.js`
-# Unit Test
+## Unit Test
It is an end-to-end testing. It is using Jest and Puppeteer.
-```
+```bash
npm run build
npm test
```
By default, the Chromium window will be shown up during the test. Specifying `HEADLESS_TEST=1` for terminal environments.
-# Update Dependencies
+## Update Dependencies
Install `ncu`
https://github.com/raineorshine/npm-check-updates
@@ -170,10 +171,10 @@ ncu -u -t patch
npm install
```
-Since previously updating vite 2.5.10 to 2.6.0 broke the application completely, from now on, it should update patch release version only.
+Since previously updating vite 2.5.10 to 2.6.0 broke the application completely, from now on, it should update patch release version only.
-Patch release = the third digit
+Patch release = the third digit ([Semantic Versioning](https://semver.org/))
-# Translations
+## Translations
Please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages
diff --git a/README.md b/README.md
index ef92cf47e..1dc492bf5 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,6 @@
-
@@ -119,9 +118,11 @@ If you love this project, please consider giving me a ⭐.
## 🗣️ Discussion
### Issues Page
+
You can discuss or ask for help in [Issues](https://github.com/louislam/uptime-kuma/issues).
### Subreddit
+
My Reddit account: louislamlam
You can mention me if you ask question on Reddit.
https://www.reddit.com/r/UptimeKuma/
diff --git a/SECURITY.md b/SECURITY.md
index 4a2857238..48ab9a72f 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -5,13 +5,15 @@
Use this section to tell people about which versions of your project are
currently being supported with security updates.
-#### Uptime Kuma Versions:
+### Uptime Kuma Versions
+
| Version | Supported |
| ------- | ------------------ |
| 1.7.X | :white_check_mark: |
| < 1.7 | ❌ |
-#### Upgradable Docker Tags:
+### Upgradable Docker Tags
+
| Tag | Supported |
| ------- | ------------------ |
| 1 | :white_check_mark: |
@@ -23,6 +25,7 @@ currently being supported with security updates.
| All other tags | ❌ |
## Reporting a Vulnerability
+
Please report security issues to uptime@kuma.pet.
Do not use the issue tracker or discuss it in the public as it will cause more damage.
From a2f22532213353da4dd5b6d1b543602102ddc7a6 Mon Sep 17 00:00:00 2001
From: wuwenjing
Date: Wed, 13 Oct 2021 11:55:01 +0800
Subject: [PATCH 154/179] Add aliyun sms notification
---
package.json | 1 +
server/notification-providers/aliyun-sms.js | 70 +++++++++++++++++++++
server/notification.js | 2 +
src/components/notifications/AliyunSms.vue | 24 +++++++
src/components/notifications/index.js | 2 +
5 files changed, 99 insertions(+)
create mode 100644 server/notification-providers/aliyun-sms.js
create mode 100644 src/components/notifications/AliyunSms.vue
diff --git a/package.json b/package.json
index 03112518a..1dd79e905 100644
--- a/package.json
+++ b/package.json
@@ -52,6 +52,7 @@
"update-language-files": "cd extra/update-language-files && node index.js && eslint ../../src/languages/**.js --fix"
},
"dependencies": {
+ "@alicloud/pop-core": "^1.7.10",
"@fortawesome/fontawesome-svg-core": "~1.2.36",
"@fortawesome/free-regular-svg-icons": "~5.15.4",
"@fortawesome/free-solid-svg-icons": "~5.15.4",
diff --git a/server/notification-providers/aliyun-sms.js b/server/notification-providers/aliyun-sms.js
new file mode 100644
index 000000000..9111c429a
--- /dev/null
+++ b/server/notification-providers/aliyun-sms.js
@@ -0,0 +1,70 @@
+const NotificationProvider = require("./notification-provider");
+const { DOWN, UP } = require("../../src/util");
+const Core = require("@alicloud/pop-core");
+
+class AliyunSMS extends NotificationProvider {
+ name = "AliyunSMS";
+
+ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+ let okMsg = "Sent Successfully.";
+
+ try {
+ var client = new Core({
+ accessKeyId: notification.accessKeyId,
+ accessKeySecret: notification.secretAccessKey,
+ endpoint: "https://dysmsapi.aliyuncs.com",
+ apiVersion: "2017-05-25",
+ });
+
+ var params = {
+ PhoneNumbers: notification.phonenumber,
+ TemplateCode: notification.templateCode,
+ SignName: notification.signName,
+ TemplateParam: JSON.stringify({
+ name: "",
+ time: "",
+ status: "",
+ msg: msg,
+ }),
+ };
+
+ if (heartbeatJSON != null) {
+ params.TemplateParam = JSON.stringify({
+ name: monitorJSON["name"],
+ time: heartbeatJSON["time"],
+ status: this.statusToString(heartbeatJSON["status"]),
+ msg: heartbeatJSON["msg"],
+ });
+ }
+
+ var requestOption = {
+ method: "POST",
+ };
+
+ await client.request("SendSms", params, requestOption).then(
+ (result) => {
+ console.log(JSON.stringify(result));
+ return okMsg;
+ },
+ (ex) => {
+ console.log(ex);
+ }
+ );
+ } catch (error) {
+ this.throwGeneralAxiosError(error);
+ }
+ }
+
+ statusToString(status) {
+ switch (status) {
+ case DOWN:
+ return "DOWN";
+ case UP:
+ return "UP";
+ default:
+ return status;
+ }
+ }
+}
+
+module.exports = AliyunSMS;
diff --git a/server/notification.js b/server/notification.js
index 41a0063c3..21bd2b1e6 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -19,6 +19,7 @@ const Teams = require("./notification-providers/teams");
const Telegram = require("./notification-providers/telegram");
const Webhook = require("./notification-providers/webhook");
const Feishu = require("./notification-providers/feishu");
+const AliyunSms = require("./notification-providers/aliyun-sms");
class Notification {
@@ -31,6 +32,7 @@ class Notification {
const list = [
new Apprise(),
+ new AliyunSms(),
new Discord(),
new Teams(),
new Gotify(),
diff --git a/src/components/notifications/AliyunSms.vue b/src/components/notifications/AliyunSms.vue
new file mode 100644
index 000000000..07dca8bbb
--- /dev/null
+++ b/src/components/notifications/AliyunSms.vue
@@ -0,0 +1,24 @@
+
+
+
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 140c1180c..74fe0df38 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -18,6 +18,7 @@ import Pushbullet from "./Pushbullet.vue";
import Line from "./Line.vue";
import Mattermost from "./Mattermost.vue";
import Matrix from "./Matrix.vue";
+import AliyunSMS from "./AliyunSms.vue";
/**
* Manage all notification form.
@@ -40,6 +41,7 @@ const NotificationFormList = {
"promosms": PromoSMS,
"lunasea": LunaSea,
"Feishu": Feishu,
+ "AliyunSMS":AliyunSMS,
"apprise": Apprise,
"pushbullet": Pushbullet,
"line": Line,
From 330cd6e058b77cda9444482d184474af48a39424 Mon Sep 17 00:00:00 2001
From: Lukas <35193662+NixNotCastey@users.noreply.github.com>
Date: Wed, 13 Oct 2021 07:32:09 +0200
Subject: [PATCH 155/179] Minor rehabilitanty impedyment
Co-authored-by: Adam Stachowicz
---
server/notification-providers/smtp.js | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/server/notification-providers/smtp.js b/server/notification-providers/smtp.js
index 7def06940..dd1cd10a7 100644
--- a/server/notification-providers/smtp.js
+++ b/server/notification-providers/smtp.js
@@ -46,12 +46,13 @@ class SMTP extends NotificationProvider {
}
if (heartbeatJSON !== null) {
- serviceStatus = heartbeatJSON["status"] == DOWN ? "🔴 Down":"✅ Up";
+ serviceStatus = heartbeatJSON["status"] == DOWN ? "🔴 Down" : "✅ Up";
}
+
// Break replace to one by line for better readability
- customsubject = customsubject.replace(replaceStatus,serviceStatus);
- customsubject = customsubject.replace(replaceName,monitorName);
- customsubject = customsubject.replace(replaceHostname,monitorHostname);
+ customsubject = customsubject.replace(replaceStatus, serviceStatus);
+ customsubject = customsubject.replace(replaceName, monitorName);
+ customsubject = customsubject.replace(replaceHostname, monitorHostname);
subject = customsubject
}
From 3fe34505332ee6f8a51188fcc2111f7721ade2c0 Mon Sep 17 00:00:00 2001
From: giacomo892
Date: Wed, 13 Oct 2021 08:29:55 +0200
Subject: [PATCH 156/179] Prioritize port passed from args
Co-authored-by: Adam Stachowicz
---
server/server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/server.js b/server/server.js
index 3e8ddd319..7dbd6155f 100644
--- a/server/server.js
+++ b/server/server.js
@@ -62,7 +62,7 @@ console.info("Version: " + checkVersion.version);
// If host is omitted, the server will accept connections on the unspecified IPv6 address (::) when IPv6 is available and the unspecified IPv4 address (0.0.0.0) otherwise.
// Dual-stack support for (::)
const hostname = args.host || process.env.HOST;
-const port = parseInt(process.env.PORT || args.port || 3001);
+const port = parseInt(args.port || process.env.PORT || 3001);
// SSL
const sslKey = process.env.SSL_KEY || args["ssl-key"] || undefined;
From 57a76e6129145bdeb75755885ca31099795473e5 Mon Sep 17 00:00:00 2001
From: wuwenjing
Date: Wed, 13 Oct 2021 14:41:59 +0800
Subject: [PATCH 157/179] remove `alicloud/pop-core` keep simple
---
package.json | 1 -
server/notification-providers/aliyun-sms.js | 106 +++++++++++++-------
src/components/notifications/AliyunSms.vue | 1 +
3 files changed, 73 insertions(+), 35 deletions(-)
diff --git a/package.json b/package.json
index 1dd79e905..03112518a 100644
--- a/package.json
+++ b/package.json
@@ -52,7 +52,6 @@
"update-language-files": "cd extra/update-language-files && node index.js && eslint ../../src/languages/**.js --fix"
},
"dependencies": {
- "@alicloud/pop-core": "^1.7.10",
"@fortawesome/fontawesome-svg-core": "~1.2.36",
"@fortawesome/free-regular-svg-icons": "~5.15.4",
"@fortawesome/free-solid-svg-icons": "~5.15.4",
diff --git a/server/notification-providers/aliyun-sms.js b/server/notification-providers/aliyun-sms.js
index 9111c429a..d5d59be91 100644
--- a/server/notification-providers/aliyun-sms.js
+++ b/server/notification-providers/aliyun-sms.js
@@ -1,6 +1,8 @@
const NotificationProvider = require("./notification-provider");
const { DOWN, UP } = require("../../src/util");
-const Core = require("@alicloud/pop-core");
+const { default: axios } = require("axios");
+const Crypto = require("crypto");
+const qs = require("qs");
class AliyunSMS extends NotificationProvider {
name = "AliyunSMS";
@@ -9,52 +11,88 @@ class AliyunSMS extends NotificationProvider {
let okMsg = "Sent Successfully.";
try {
- var client = new Core({
- accessKeyId: notification.accessKeyId,
- accessKeySecret: notification.secretAccessKey,
- endpoint: "https://dysmsapi.aliyuncs.com",
- apiVersion: "2017-05-25",
- });
-
- var params = {
- PhoneNumbers: notification.phonenumber,
- TemplateCode: notification.templateCode,
- SignName: notification.signName,
- TemplateParam: JSON.stringify({
- name: "",
- time: "",
- status: "",
- msg: msg,
- }),
- };
-
if (heartbeatJSON != null) {
- params.TemplateParam = JSON.stringify({
+ var msgBody = JSON.stringify({
name: monitorJSON["name"],
time: heartbeatJSON["time"],
status: this.statusToString(heartbeatJSON["status"]),
msg: heartbeatJSON["msg"],
});
- }
-
- var requestOption = {
- method: "POST",
- };
-
- await client.request("SendSms", params, requestOption).then(
- (result) => {
- console.log(JSON.stringify(result));
+ if (this.sendSms(notification, msgBody)) {
return okMsg;
- },
- (ex) => {
- console.log(ex);
}
- );
+ } else {
+ var msgBody = JSON.stringify({
+ name: "",
+ time: "",
+ status: "",
+ msg: msg,
+ });
+ if (this.sendSms(notification, msgBody)) {
+ return okMsg;
+ }
+ }
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
+ async sendSms(notification, msgbody) {
+ var params = {
+ PhoneNumbers: notification.phonenumber,
+ TemplateCode: notification.templateCode,
+ SignName: notification.signName,
+ TemplateParam: msgbody,
+ AccessKeyId: notification.accessKeyId,
+ Format: "JSON",
+ SignatureMethod: "HMAC-SHA1",
+ SignatureVersion: "1.0",
+ SignatureNonce: Math.random().toString(),
+ Timestamp: new Date().toISOString(),
+ Action: "SendSms",
+ Version: "2017-05-25",
+ };
+
+ params.Signature = this.sign(params, notification.secretAccessKey);
+ var config = {
+ method: "POST",
+ url: "http://dysmsapi.aliyuncs.com/",
+ headers: {
+ "Content-Type": "application/x-www-form-urlencoded",
+ },
+ data: qs.stringify(params),
+ };
+
+ var result = await axios(config);
+ if (result.data.Message == "OK") {
+ return true;
+ }
+ return false;
+ }
+
+ /** Aliyun request sign */
+ sign(param, AccessKeySecret) {
+ var param2 = {},
+ data = [];
+
+ var oa = Object.keys(param).sort();
+
+ for (var i = 0; i < oa.length; i++) {
+ var key = oa[i];
+ param2[key] = param[key];
+ }
+
+ for (var key in param2) {
+ data.push(`${encodeURIComponent(key)}=${encodeURIComponent(param2[key])}`);
+ }
+
+ var StringToSign = `POST&${encodeURIComponent("/")}&${encodeURIComponent(data.join("&"))}`;
+ return Crypto
+ .createHmac("sha1", `${AccessKeySecret}&`)
+ .update(Buffer.from(StringToSign))
+ .digest("base64");
+ }
+
statusToString(status) {
switch (status) {
case DOWN:
diff --git a/src/components/notifications/AliyunSms.vue b/src/components/notifications/AliyunSms.vue
index 07dca8bbb..3f65b3464 100644
--- a/src/components/notifications/AliyunSms.vue
+++ b/src/components/notifications/AliyunSms.vue
@@ -16,6 +16,7 @@
+
Sms template must contain parameters: ${name} ${time} ${status} ${msg}
https://help.aliyun.com/document_detail/101414.html
From 843992c4104160b76439c455e414dbe6cb8a678c Mon Sep 17 00:00:00 2001
From: wuwenjing
Date: Wed, 13 Oct 2021 16:13:46 +0800
Subject: [PATCH 158/179] Add DingDing notification
---
server/notification-providers/dingding.js | 79 +++++++++++++++++++++++
server/notification.js | 2 +
src/components/notifications/DingDing.vue | 16 +++++
src/components/notifications/index.js | 2 +
4 files changed, 99 insertions(+)
create mode 100644 server/notification-providers/dingding.js
create mode 100644 src/components/notifications/DingDing.vue
diff --git a/server/notification-providers/dingding.js b/server/notification-providers/dingding.js
new file mode 100644
index 000000000..5a64f4aaf
--- /dev/null
+++ b/server/notification-providers/dingding.js
@@ -0,0 +1,79 @@
+const NotificationProvider = require("./notification-provider");
+const { DOWN, UP } = require("../../src/util");
+const { default: axios } = require("axios");
+const Crypto = require("crypto");
+
+class DingDing extends NotificationProvider {
+ name = "DingDing";
+
+ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+ let okMsg = "Sent Successfully.";
+
+ try {
+ if (heartbeatJSON != null) {
+ var params = {
+ msgtype:"markdown",
+ markdown:{
+ title: monitorJSON["name"],
+ text: `## [${this.statusToString(heartbeatJSON["status"])}] \n > ${heartbeatJSON["msg"]} \n > Time(UTC):${heartbeatJSON["time"]}`,
+ }
+ };
+ if (this.sendToDingDing(notification, params)) {
+ return okMsg;
+ }
+ } else {
+ var params = {
+ msgtype:"text",
+ text:{
+ content:msg
+ }
+ };
+ if (this.sendToDingDing(notification, params)) {
+ return okMsg;
+ }
+ }
+ } catch (error) {
+ this.throwGeneralAxiosError(error);
+ }
+ }
+
+ async sendToDingDing(notification, params) {
+ var timestamp=Date.now()
+
+ var config = {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ url: `${notification.webHookUrl}×tamp=${timestamp}&sign=${encodeURIComponent(this.sign(timestamp, notification.secretKey))}`,
+ data: JSON.stringify(params),
+ };
+
+ var result = await axios(config);
+ if (result.data.errmsg == "ok") {
+ return true;
+ }
+ return false;
+ }
+
+ /** DingDing sign */
+ sign(timestamp,secretKey) {
+ return Crypto
+ .createHmac("sha256",Buffer.from(secretKey, 'utf8'))
+ .update(Buffer.from(`${timestamp}\n${secretKey}`, 'utf8'))
+ .digest("base64");
+ }
+
+ statusToString(status) {
+ switch (status) {
+ case DOWN:
+ return "DOWN";
+ case UP:
+ return "UP";
+ default:
+ return status;
+ }
+ }
+}
+
+module.exports = DingDing;
diff --git a/server/notification.js b/server/notification.js
index 21bd2b1e6..658216f91 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -20,6 +20,7 @@ const Telegram = require("./notification-providers/telegram");
const Webhook = require("./notification-providers/webhook");
const Feishu = require("./notification-providers/feishu");
const AliyunSms = require("./notification-providers/aliyun-sms");
+const DingDing = require("./notification-providers/dingding");
class Notification {
@@ -33,6 +34,7 @@ class Notification {
const list = [
new Apprise(),
new AliyunSms(),
+ new DingDing(),
new Discord(),
new Teams(),
new Gotify(),
diff --git a/src/components/notifications/DingDing.vue b/src/components/notifications/DingDing.vue
new file mode 100644
index 000000000..3ee475c80
--- /dev/null
+++ b/src/components/notifications/DingDing.vue
@@ -0,0 +1,16 @@
+
+
+
{{ $t("WebHookUrl") }}*
+
+
+
{{ $t("SecretKey") }}*
+
+
+
+
+
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 74fe0df38..ff0acc6a5 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -19,6 +19,7 @@ import Line from "./Line.vue";
import Mattermost from "./Mattermost.vue";
import Matrix from "./Matrix.vue";
import AliyunSMS from "./AliyunSms.vue";
+import DingDing from "./DingDing.vue";
/**
* Manage all notification form.
@@ -47,6 +48,7 @@ const NotificationFormList = {
"line": Line,
"mattermost": Mattermost,
"matrix": Matrix,
+ "DingDing":DingDing
}
export default NotificationFormList
From 84507268ad556247b1319ea95bce782b418b9a14 Mon Sep 17 00:00:00 2001
From: hrtkpf <42646788+hrtkpf@users.noreply.github.com>
Date: Wed, 13 Oct 2021 11:13:21 +0200
Subject: [PATCH 159/179] fix translations (de-DE and en)
---
src/languages/de-DE.js | 42 +++++++++++++++++++++---------------------
src/languages/en.js | 2 +-
2 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index b8a03b2ee..5e69899d8 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -8,7 +8,7 @@ export default {
Theme: "Thema",
General: "Allgemein",
Version: "Version",
- "Check Update On GitHub": "Auf Github nach Updates suchen",
+ "Check Update On GitHub": "Auf GitHub nach Updates suchen",
List: "Liste",
Add: "Hinzufügen",
"Add New Monitor": "Neuer Monitor",
@@ -38,7 +38,7 @@ export default {
checkEverySecond: "Überprüfe alle {0} Sekunden",
Response: "Antwortzeit",
Ping: "Ping",
- "Monitor Type": "Monitor Typ",
+ "Monitor Type": "Monitor-Typ",
Keyword: "Suchwort",
"Friendly Name": "Anzeigename",
URL: "URL",
@@ -48,11 +48,11 @@ export default {
Retries: "Wiederholungen",
retriesDescription: "Maximale Anzahl von Wiederholungen, bevor der Dienst als inaktiv markiert und eine Benachrichtigung gesendet wird.",
Advanced: "Erweitert",
- ignoreTLSError: "Ignoriere TLS/SSL Fehler von Webseiten",
+ ignoreTLSError: "Ignoriere TLS-/SSL-Fehler von Webseiten",
"Upside Down Mode": "Invertierter Modus",
upsideDownModeDescription: "Im invertierten Modus wird der Dienst als inaktiv angezeigt, wenn er erreichbar ist.",
"Max. Redirects": "Max. Weiterleitungen",
- maxRedirectDescription: "Maximale Anzahl von Weiterleitungen denen gefolgt werden soll. Auf 0 setzen um Weiterleitungen zu deaktivieren.",
+ maxRedirectDescription: "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Auf 0 setzen, um Weiterleitungen zu deaktivieren.",
"Accepted Status Codes": "Erlaubte HTTP-Statuscodes",
acceptedStatusCodesDescription: "Wähle die Statuscodes aus, welche trotzdem als erfolgreich gewertet werden sollen.",
Save: "Speichern",
@@ -82,7 +82,7 @@ export default {
notificationDescription: "Weise den Monitor(en) eine Benachrichtigung zu, damit diese Funktion greift.",
Leave: "Verlassen",
"I understand, please disable": "Ich verstehe, bitte deaktivieren",
- Confirm: "Bestätige",
+ Confirm: "Bestätigen",
Yes: "Ja",
No: "Nein",
Username: "Benutzername",
@@ -95,7 +95,7 @@ export default {
Email: "E-Mail",
Test: "Test",
"Certificate Info": "Zertifikatsinfo",
- keywordDescription: "Ein Suchwort in der HTML oder JSON Ausgabe finden. Bitte beachte: es wird zwischen Groß-/Kleinschreibung unterschieden.",
+ keywordDescription: "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Groß-/Kleinschreibung unterschieden.",
deleteMonitorMsg: "Bist du sicher, dass du den Monitor löschen möchtest?",
deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
resoverserverDescription: "Cloudflare ist als der Standardserver festgelegt, dieser kann jederzeit geändern werden.",
@@ -108,13 +108,13 @@ export default {
"Clear Data": "Lösche Daten",
Events: "Ereignisse",
Heartbeats: "Statistiken",
- confirmClearStatisticsMsg: "Bist du dir wirklich sicher, dass du ALLE Statistiken löschen möchtest?",
- "Create your admin account": "Erstelle dein Admin Konto",
+ confirmClearStatisticsMsg: "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
+ "Create your admin account": "Erstelle dein Admin-Konto",
"Repeat Password": "Wiederhole das Passwort",
"Resource Record Type": "Resource Record Type",
Export: "Export",
Import: "Import",
- respTime: "Antw. Zeit (ms)",
+ respTime: "Antw.-Zeit (ms)",
notAvailableShort: "N/A",
"Default enabled": "Standardmäßig aktiviert",
"Apply on all existing monitors": "Auf alle existierenden Monitore anwenden",
@@ -125,34 +125,34 @@ export default {
backupDescription2: "PS: Verlaufs- und Ereignisdaten sind nicht enthalten.",
backupDescription3: "Sensible Daten wie Benachrichtigungstoken sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.",
alertNoFile: "Bitte wähle eine Datei zum Importieren aus.",
- alertWrongFileType: "Bitte wähle eine JSON Datei aus.",
+ alertWrongFileType: "Bitte wähle eine JSON-Datei aus.",
"Clear all statistics": "Lösche alle Statistiken",
- importHandleDescription: "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
+ importHandleDescription: "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder jede Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
"Skip existing": "Vorhandene überspringen",
Overwrite: "Überschreiben",
Options: "Optionen",
- confirmImportMsg: "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import Option ausgewählt ist.",
+ confirmImportMsg: "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.",
"Keep both": "Beide behalten",
twoFAVerifyLabel: "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert",
"Verify Token": "Token verifizieren",
"Setup 2FA": "2FA einrichten",
"Enable 2FA": "2FA aktivieren",
"Disable 2FA": "2FA deaktivieren",
- "2FA Settings": "2FA Einstellungen",
+ "2FA Settings": "2FA-Einstellungen",
confirmEnableTwoFAMsg: "Bist du sicher, dass du 2FA aktivieren möchtest?",
confirmDisableTwoFAMsg: "Bist du sicher, dass du 2FA deaktivieren möchtest?",
- tokenValidSettingsMsg: "Token gültig! Du kannst jetzt die 2FA Einstellungen speichern.",
- "Two Factor Authentication": "Zwei Faktor Authentifizierung",
+ tokenValidSettingsMsg: "Token gültig! Du kannst jetzt die 2FA-Einstellungen speichern.",
+ "Two Factor Authentication": "Zwei-Faktor-Authentifizierung",
Active: "Aktiv",
Inactive: "Inaktiv",
Token: "Token",
- "Show URI": "URI Anzeigen",
+ "Show URI": "URI anzeigen",
Tags: "Tags",
"Add New below or Select...": "Bestehenden Tag auswählen oder neuen hinzufügen...",
- "Tag with this name already exist.": "Ein Tag mit dem Namen existiert bereits.",
- "Tag with this value already exist.": "Ein Tag mit dem Wert existiert bereits.",
+ "Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.",
+ "Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.",
color: "Farbe",
- "value (optional)": "Wert (Optional)",
+ "value (optional)": "Wert (optional)",
Gray: "Grau",
Red: "Rot",
Orange: "Orange",
@@ -176,9 +176,9 @@ export default {
"Degraded Service": "Eingeschränkter Dienst",
"Add Group": "Gruppe hinzufügen",
"Add a monitor": "Monitor hinzufügen",
- "Edit Status Page": "Bearbeite Status Seite",
+ "Edit Status Page": "Bearbeite Status-Seite",
"Go to Dashboard": "Gehe zum Dashboard",
- "Status Page": "Status Seite",
+ "Status Page": "Status-Seite",
telegram: "Telegram",
webhook: "Webhook",
smtp: "E-Mail (SMTP)",
diff --git a/src/languages/en.js b/src/languages/en.js
index d93714f66..85b143ae3 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -19,7 +19,7 @@ export default {
enableDefaultNotificationDescription: "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
clearEventsMsg: "Are you sure want to delete all events for this monitor?",
clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?",
- confirmClearStatisticsMsg: "Are you sure want to delete ALL statistics?",
+ confirmClearStatisticsMsg: "Are you sure you want to delete ALL statistics?",
importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.",
twoFAVerifyLabel: "Please type in your token to verify that 2FA is working",
From 2ff7c4de5d65b62ed2a81a7206605c6725de30d5 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Wed, 13 Oct 2021 22:16:46 +0800
Subject: [PATCH 160/179] [test] genSecret
---
test/backend.spec.js | 31 +++++++++++++++++++++++++++++--
1 file changed, 29 insertions(+), 2 deletions(-)
diff --git a/test/backend.spec.js b/test/backend.spec.js
index 4f00c0b13..ea04439a8 100644
--- a/test/backend.spec.js
+++ b/test/backend.spec.js
@@ -1,10 +1,37 @@
+const { genSecret } = require("../src/util");
+
beforeAll(() => {
});
-describe("", () => {
+describe("Test genSecret", () => {
- it("should ", () => {
+ it("should be correct length", () => {
+ let secret = genSecret(-1);
+ expect(secret).toEqual("");
+ secret = genSecret(0);
+ expect(secret).toEqual("");
+
+ secret = genSecret(1);
+ expect(secret.length).toEqual(1);
+
+ secret = genSecret(2);
+ expect(secret.length).toEqual(2);
+
+ secret = genSecret(64);
+ expect(secret.length).toEqual(64);
+
+ secret = genSecret(9000);
+ expect(secret.length).toEqual(9000);
+
+ secret = genSecret(90000);
+ expect(secret.length).toEqual(90000);
+ });
+
+ it("should contain first and last possible chars", () => {
+ let secret = genSecret(90000);
+ expect(secret).toContain("A");
+ expect(secret).toContain("9");
});
});
From 9b05e86c253b23a95c3c173ba2b2911248ea49c8 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Wed, 13 Oct 2021 22:31:36 +0800
Subject: [PATCH 161/179] set newLine to LF for ts compiler
---
tsconfig.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/tsconfig.json b/tsconfig.json
index b7637c3c9..c54546424 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,6 +1,7 @@
{
"compileOnSave": true,
"compilerOptions": {
+ "newLine": "LF",
"target": "es2018",
"module": "commonjs",
"lib": [
From 89b34b57484d5dfba7913b9bf2c56c1ec5c80763 Mon Sep 17 00:00:00 2001
From: Lukas <35193662+NixNotCastey@users.noreply.github.com>
Date: Wed, 13 Oct 2021 18:05:18 +0200
Subject: [PATCH 162/179] Use double curly brackets and sanity check for
customSubject
---
server/notification-providers/smtp.js | 24 ++++++++++++++----------
src/components/notifications/SMTP.vue | 2 +-
2 files changed, 15 insertions(+), 11 deletions(-)
diff --git a/server/notification-providers/smtp.js b/server/notification-providers/smtp.js
index dd1cd10a7..a74b48cc1 100644
--- a/server/notification-providers/smtp.js
+++ b/server/notification-providers/smtp.js
@@ -21,19 +21,23 @@ class SMTP extends NotificationProvider {
pass: notification.smtpPassword,
};
}
- // Lets start with default subject
+ // Lets start with default subject and empty string for custom one
let subject = msg;
+ let customSubject = "";
// Our subject cannot end with whitespace it's often raise spam score
- let customsubject = notification.customsubject.trim()
+ // Once I got "Cannot read property 'trim' of undefined", better be safe than sorry
+ if (notification.customSubject) {
+ customSubject = notification.customSubject.trim()
+ }
// If custom subject is not empty, change subject for notification
- if (customsubject !== "") {
+ if (customSubject !== "") {
// Replace "MACROS" with coresponding variable
- let replaceName = new RegExp("{NAME}", "g");
- let replaceHostname = new RegExp("{HOSTNAME}", "g");
- let replaceStatus = new RegExp("{STATUS}", "g");
+ let replaceName = new RegExp("{{NAME}}", "g");
+ let replaceHostname = new RegExp("{{HOSTNAME}}", "g");
+ let replaceStatus = new RegExp("{{STATUS}}", "g");
// Lets start with dummy values to simplify code
let monitorName = "Test"
@@ -50,11 +54,11 @@ class SMTP extends NotificationProvider {
}
// Break replace to one by line for better readability
- customsubject = customsubject.replace(replaceStatus, serviceStatus);
- customsubject = customsubject.replace(replaceName, monitorName);
- customsubject = customsubject.replace(replaceHostname, monitorHostname);
+ customSubject = customSubject.replace(replaceStatus, serviceStatus);
+ customSubject = customSubject.replace(replaceName, monitorName);
+ customSubject = customSubject.replace(replaceHostname, monitorHostname);
- subject = customsubject
+ subject = customSubject
}
let transporter = nodemailer.createTransport(config);
diff --git a/src/components/notifications/SMTP.vue b/src/components/notifications/SMTP.vue
index 01bdf8607..79efd9f9a 100644
--- a/src/components/notifications/SMTP.vue
+++ b/src/components/notifications/SMTP.vue
@@ -45,7 +45,7 @@
{{ $t("Email Subject") }}
-
+
From e2dbacb383acdd981a5f09d07c3a4e6ee96770d5 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Thu, 14 Oct 2021 00:22:49 +0800
Subject: [PATCH 163/179] Fix encoding problem of ping result for non-English
Windows
---
package-lock.json | 93 ++++++++++++++++++++++++++++++++++++++-----
package.json | 4 +-
server/ping-lite.js | 24 +++++++++++
server/util-server.js | 13 ++++++
4 files changed, 124 insertions(+), 10 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 296362633..31eeb4c6e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -19,6 +19,7 @@
"axios": "~0.21.4",
"bcryptjs": "~2.4.3",
"bootstrap": "~5.1.1",
+ "chardet": "^1.3.0",
"chart.js": "~3.5.1",
"chartjs-adapter-dayjs": "~1.0.0",
"command-exists": "~1.2.9",
@@ -28,6 +29,7 @@
"express-basic-auth": "~1.2.0",
"form-data": "~4.0.0",
"http-graceful-shutdown": "~3.1.4",
+ "iconv-lite": "^0.6.3",
"jsonwebtoken": "~8.5.1",
"nodemailer": "~6.6.5",
"notp": "~2.0.3",
@@ -64,7 +66,7 @@
"@vitejs/plugin-legacy": "~1.6.1",
"@vitejs/plugin-vue": "~1.9.2",
"@vue/compiler-sfc": "~3.2.19",
- "babel-plugin-rewire": "^1.2.0",
+ "babel-plugin-rewire": "~1.2.0",
"core-js": "~3.18.1",
"cross-env": "~7.0.3",
"dns2": "~2.0.1",
@@ -3551,6 +3553,17 @@
"ms": "2.0.0"
}
},
+ "node_modules/body-parser/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/body-parser/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -3813,6 +3826,11 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/chardet": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.3.0.tgz",
+ "integrity": "sha512-cyTQGGptIjIT+CMGT5J/0l9c6Fb+565GCFjjeUTKxUO7w3oR+FcNCMEKTn5xtVKaLFmladN7QF68IiQsv5Fbdw=="
+ },
"node_modules/chart.js": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.5.1.tgz",
@@ -6303,11 +6321,11 @@
}
},
"node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
@@ -9527,6 +9545,17 @@
"node": ">= 0.8"
}
},
+ "node_modules/raw-body/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
@@ -11978,6 +12007,18 @@
"iconv-lite": "0.4.24"
}
},
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/whatwg-mimetype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
@@ -14905,6 +14946,14 @@
"ms": "2.0.0"
}
},
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -15090,6 +15139,11 @@
"integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
"dev": true
},
+ "chardet": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.3.0.tgz",
+ "integrity": "sha512-cyTQGGptIjIT+CMGT5J/0l9c6Fb+565GCFjjeUTKxUO7w3oR+FcNCMEKTn5xtVKaLFmladN7QF68IiQsv5Fbdw=="
+ },
"chart.js": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.5.1.tgz",
@@ -16967,11 +17021,11 @@
"dev": true
},
"iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"requires": {
- "safer-buffer": ">= 2.1.2 < 3"
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
}
},
"ieee754": {
@@ -19393,6 +19447,16 @@
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ }
}
},
"react-is": {
@@ -21251,6 +21315,17 @@
"dev": true,
"requires": {
"iconv-lite": "0.4.24"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ }
}
},
"whatwg-mimetype": {
diff --git a/package.json b/package.json
index 03112518a..d117e7f2b 100644
--- a/package.json
+++ b/package.json
@@ -60,9 +60,9 @@
"@popperjs/core": "~2.10.2",
"args-parser": "~1.3.0",
"axios": "~0.21.4",
- "babel-plugin-rewire": "~1.2.0",
"bcryptjs": "~2.4.3",
"bootstrap": "~5.1.1",
+ "chardet": "^1.3.0",
"chart.js": "~3.5.1",
"chartjs-adapter-dayjs": "~1.0.0",
"command-exists": "~1.2.9",
@@ -72,6 +72,7 @@
"express-basic-auth": "~1.2.0",
"form-data": "~4.0.0",
"http-graceful-shutdown": "~3.1.4",
+ "iconv-lite": "^0.6.3",
"jsonwebtoken": "~8.5.1",
"nodemailer": "~6.6.5",
"notp": "~2.0.3",
@@ -108,6 +109,7 @@
"@vitejs/plugin-legacy": "~1.6.1",
"@vitejs/plugin-vue": "~1.9.2",
"@vue/compiler-sfc": "~3.2.19",
+ "babel-plugin-rewire": "~1.2.0",
"core-js": "~3.18.1",
"cross-env": "~7.0.3",
"dns2": "~2.0.1",
diff --git a/server/ping-lite.js b/server/ping-lite.js
index 0af0e9706..291bf20d3 100644
--- a/server/ping-lite.js
+++ b/server/ping-lite.js
@@ -4,6 +4,8 @@ const net = require("net");
const spawn = require("child_process").spawn;
const events = require("events");
const fs = require("fs");
+const util = require("./util-server");
+
const WIN = /^win/.test(process.platform);
const LIN = /^linux/.test(process.platform);
const MAC = /^darwin/.test(process.platform);
@@ -101,6 +103,9 @@ Ping.prototype.send = function (callback) {
});
this._ping.stdout.on("data", function (data) { // log stdout
+ if (WIN) {
+ data = convertOutput(data);
+ }
this._stdout = (this._stdout || "") + data;
});
@@ -112,6 +117,9 @@ Ping.prototype.send = function (callback) {
});
this._ping.stderr.on("data", function (data) { // log stderr
+ if (WIN) {
+ data = convertOutput(data);
+ }
this._stderr = (this._stderr || "") + data;
});
@@ -157,3 +165,19 @@ Ping.prototype.start = function (callback) {
Ping.prototype.stop = function () {
clearInterval(this._i);
};
+
+/**
+ * Try to convert to UTF-8 for Windows, as the ping's output on Windows is not UTF-8 and could be in other languages
+ * Thank @pemassi
+ * https://github.com/louislam/uptime-kuma/issues/570#issuecomment-941984094
+ * @param data
+ * @returns {string}
+ */
+function convertOutput(data) {
+ if (WIN) {
+ if (data) {
+ return util.convertToUTF8(data);
+ }
+ }
+ return data;
+}
diff --git a/server/util-server.js b/server/util-server.js
index 5620d674b..aecb74e8e 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -6,6 +6,8 @@ const passwordHash = require("./password-hash");
const dayjs = require("dayjs");
const { Resolver } = require("dns");
const child_process = require("child_process");
+const iconv = require("iconv-lite");
+const chardet = require("chardet");
/**
* Init or reset JWT secret
@@ -312,3 +314,14 @@ exports.startUnitTest = async () => {
process.exit(code);
});
};
+
+/**
+ * @param body : Buffer
+ * @returns {string}
+ */
+exports.convertToUTF8 = (body) => {
+ const guessEncoding = chardet.detect(body);
+ debug("Guess Encoding: " + guessEncoding);
+ const str = iconv.decode(body, guessEncoding);
+ return str.toString();
+};
From 655ccc86b9dce6c7f334456175de5de6a2d98b99 Mon Sep 17 00:00:00 2001
From: Aaron Erkenswick
Date: Wed, 13 Oct 2021 11:47:23 -0700
Subject: [PATCH 164/179] Add monitor name context to Slack fallback text.
The text block of a slack notification payload is used for mobile
devices and plain text previews. This change allows slack users to see
the name of the failing service without having to open up Slack to read
the entire message.
---
server/notification-providers/slack.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/server/notification-providers/slack.js b/server/notification-providers/slack.js
index 5132ba977..b4dad6fe3 100644
--- a/server/notification-providers/slack.js
+++ b/server/notification-providers/slack.js
@@ -39,8 +39,9 @@ class Slack extends NotificationProvider {
}
const time = heartbeatJSON["time"];
+ const textMsg = "Uptime Kuma Alert";
let data = {
- "text": "Uptime Kuma Alert",
+ "text": monitorJSON ? textMsg + `: ${monitorJSON.name}` : textMsg,
"channel": notification.slackchannel,
"username": notification.slackusername,
"icon_emoji": notification.slackiconemo,
From cae194f58f9410beacf8ea255113f9c758ef3965 Mon Sep 17 00:00:00 2001
From: xJoker
Date: Thu, 14 Oct 2021 07:34:24 +0800
Subject: [PATCH 165/179] Update server/notification-providers/dingding.js
Co-authored-by: Adam Stachowicz
---
server/notification-providers/dingding.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/server/notification-providers/dingding.js b/server/notification-providers/dingding.js
index 5a64f4aaf..5fd21c415 100644
--- a/server/notification-providers/dingding.js
+++ b/server/notification-providers/dingding.js
@@ -12,8 +12,8 @@ class DingDing extends NotificationProvider {
try {
if (heartbeatJSON != null) {
var params = {
- msgtype:"markdown",
- markdown:{
+ msgtype: "markdown",
+ markdown: {
title: monitorJSON["name"],
text: `## [${this.statusToString(heartbeatJSON["status"])}] \n > ${heartbeatJSON["msg"]} \n > Time(UTC):${heartbeatJSON["time"]}`,
}
From 2d471a5e8461275c3c2c15c8cf0f8fc306e70c76 Mon Sep 17 00:00:00 2001
From: xJoker
Date: Thu, 14 Oct 2021 07:34:33 +0800
Subject: [PATCH 166/179] Update server/notification-providers/dingding.js
Co-authored-by: Adam Stachowicz
---
server/notification-providers/dingding.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/server/notification-providers/dingding.js b/server/notification-providers/dingding.js
index 5fd21c415..ef348e2f7 100644
--- a/server/notification-providers/dingding.js
+++ b/server/notification-providers/dingding.js
@@ -23,8 +23,8 @@ class DingDing extends NotificationProvider {
}
} else {
var params = {
- msgtype:"text",
- text:{
+ msgtype: "text",
+ text: {
content:msg
}
};
From 6e04ec436e8316665cadabd7a779dbebbeeb447d Mon Sep 17 00:00:00 2001
From: xJoker
Date: Thu, 14 Oct 2021 07:34:45 +0800
Subject: [PATCH 167/179] Update server/notification-providers/dingding.js
Co-authored-by: Adam Stachowicz
---
server/notification-providers/dingding.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/notification-providers/dingding.js b/server/notification-providers/dingding.js
index ef348e2f7..1dd52a526 100644
--- a/server/notification-providers/dingding.js
+++ b/server/notification-providers/dingding.js
@@ -59,7 +59,7 @@ class DingDing extends NotificationProvider {
/** DingDing sign */
sign(timestamp,secretKey) {
return Crypto
- .createHmac("sha256",Buffer.from(secretKey, 'utf8'))
+ .createHmac("sha256", Buffer.from(secretKey, 'utf8'))
.update(Buffer.from(`${timestamp}\n${secretKey}`, 'utf8'))
.digest("base64");
}
From 4e4ab0577ec5b763c093f1c5fdbb7fe21d01d244 Mon Sep 17 00:00:00 2001
From: xJoker
Date: Thu, 14 Oct 2021 09:33:31 +0800
Subject: [PATCH 168/179] Update src/components/notifications/index.js
Co-authored-by: Adam Stachowicz
---
src/components/notifications/index.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index ff0acc6a5..9018602cf 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -42,7 +42,7 @@ const NotificationFormList = {
"promosms": PromoSMS,
"lunasea": LunaSea,
"Feishu": Feishu,
- "AliyunSMS":AliyunSMS,
+ "AliyunSMS": AliyunSMS,
"apprise": Apprise,
"pushbullet": Pushbullet,
"line": Line,
From 8ab4788f80230d06e0a42764b27e50d806cc0bdb Mon Sep 17 00:00:00 2001
From: xJoker
Date: Thu, 14 Oct 2021 09:33:36 +0800
Subject: [PATCH 169/179] Update src/components/notifications/index.js
Co-authored-by: Adam Stachowicz
---
src/components/notifications/index.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 9018602cf..96ee2824b 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -48,7 +48,7 @@ const NotificationFormList = {
"line": Line,
"mattermost": Mattermost,
"matrix": Matrix,
- "DingDing":DingDing
+ "DingDing": DingDing
}
export default NotificationFormList
From f75c9e4f0ca4f7417ea0c7f2184be4dd1332be05 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Thu, 14 Oct 2021 14:09:16 +0800
Subject: [PATCH 170/179] add UPTIME_KUMA_HOST, UPTIME_KUMA_PORT and special
handling for FreeBSD
---
server/ping-lite.js | 5 +----
server/server.js | 20 +++++++++++++++-----
server/util-server.js | 6 ++++++
3 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/server/ping-lite.js b/server/ping-lite.js
index 0af0e9706..37709aaf4 100644
--- a/server/ping-lite.js
+++ b/server/ping-lite.js
@@ -4,10 +4,7 @@ const net = require("net");
const spawn = require("child_process").spawn;
const events = require("events");
const fs = require("fs");
-const WIN = /^win/.test(process.platform);
-const LIN = /^linux/.test(process.platform);
-const MAC = /^darwin/.test(process.platform);
-const FBSD = /^freebsd/.test(process.platform);
+const { MAC, FBSD, LIN, WIN } = require("./util-server");
module.exports = Ping;
diff --git a/server/server.js b/server/server.js
index 7dbd6155f..376e7bb3f 100644
--- a/server/server.js
+++ b/server/server.js
@@ -43,7 +43,7 @@ console.log("Importing this project modules");
debug("Importing Monitor");
const Monitor = require("./model/monitor");
debug("Importing Settings");
-const { getSettings, setSettings, setting, initJWTSecret, checkLogin, startUnitTest } = require("./util-server");
+const { getSettings, setSettings, setting, initJWTSecret, checkLogin, startUnitTest, FBSD } = require("./util-server");
debug("Importing Notification");
const { Notification } = require("./notification");
@@ -61,12 +61,22 @@ console.info("Version: " + checkVersion.version);
// If host is omitted, the server will accept connections on the unspecified IPv6 address (::) when IPv6 is available and the unspecified IPv4 address (0.0.0.0) otherwise.
// Dual-stack support for (::)
-const hostname = args.host || process.env.HOST;
-const port = parseInt(args.port || process.env.PORT || 3001);
+let hostname = process.env.UPTIME_KUMA_HOST || args.host;
+
+// Also read HOST if not FreeBSD, as HOST is a system environment variable in FreeBSD
+if (!hostname && !FBSD) {
+ hostname = process.env.HOST;
+}
+
+if (hostname) {
+ console.log("Custom hostname: " + hostname);
+}
+
+const port = parseInt(process.env.UPTIME_KUMA_PORT || process.env.PORT || args.port || 3001);
// SSL
-const sslKey = process.env.SSL_KEY || args["ssl-key"] || undefined;
-const sslCert = process.env.SSL_CERT || args["ssl-cert"] || undefined;
+const sslKey = process.env.UPTIME_KUMA_SSL_KEY || process.env.SSL_KEY || args["ssl-key"] || undefined;
+const sslCert = process.env.UPTIME_KUMA_SSL_CERT || process.env.SSL_CERT || args["ssl-cert"] || undefined;
/**
* Run unit test after the server is ready
diff --git a/server/util-server.js b/server/util-server.js
index 5620d674b..f6faa7a2f 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -7,6 +7,12 @@ const dayjs = require("dayjs");
const { Resolver } = require("dns");
const child_process = require("child_process");
+// From ping-lite
+exports.WIN = /^win/.test(process.platform);
+exports.LIN = /^linux/.test(process.platform);
+exports.MAC = /^darwin/.test(process.platform);
+exports.FBSD = /^freebsd/.test(process.platform);
+
/**
* Init or reset JWT secret
* @returns {Promise}
From 5ff9a64e5e162451ed1dd65c44b4f26532177ab9 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Thu, 14 Oct 2021 14:42:34 +0800
Subject: [PATCH 171/179] [Push Type] Fix missing duration calculation (#685)
---
server/routers/api-router.js | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 0da1fd705..927a54643 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -18,6 +18,7 @@ router.get("/api/entry-page", async (_, response) => {
router.get("/api/push/:pushToken", async (request, response) => {
try {
+
let pushToken = request.params.pushToken;
let msg = request.query.msg || "OK";
let ping = request.query.ping;
@@ -30,12 +31,20 @@ router.get("/api/push/:pushToken", async (request, response) => {
throw new Error("Monitor not found or not active.");
}
+ const previousHeartbeatTime = await R.getCell(`
+ SELECT time FROM heartbeat
+ WHERE id = (select MAX(id) from heartbeat where monitor_id = ?)
+ `, [
+ monitor.id
+ ]);
+
let bean = R.dispense("heartbeat");
bean.monitor_id = monitor.id;
bean.time = R.isoDateTime(dayjs.utc());
bean.status = UP;
bean.msg = msg;
bean.ping = ping;
+ bean.duration = dayjs(bean.time).diff(dayjs(previousHeartbeatTime), "second");
await R.store(bean);
From 83388819273e49e8773646a90cb6de3f0bfebd6d Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Thu, 14 Oct 2021 16:07:25 +0800
Subject: [PATCH 172/179] [SMTP] change {{HOSTNAME}} to {{HOSTNAME_OR_URL}},
support for http montior type, some UI improvements
---
server/notification-providers/smtp.js | 73 +++++++++++++++------------
src/components/notifications/SMTP.vue | 17 +++++--
src/languages/en.js | 2 +-
src/pages/EditMonitor.vue | 1 +
4 files changed, 56 insertions(+), 37 deletions(-)
diff --git a/server/notification-providers/smtp.js b/server/notification-providers/smtp.js
index a74b48cc1..60068eb77 100644
--- a/server/notification-providers/smtp.js
+++ b/server/notification-providers/smtp.js
@@ -23,42 +23,53 @@ class SMTP extends NotificationProvider {
}
// Lets start with default subject and empty string for custom one
let subject = msg;
- let customSubject = "";
- // Our subject cannot end with whitespace it's often raise spam score
- // Once I got "Cannot read property 'trim' of undefined", better be safe than sorry
- if (notification.customSubject) {
- customSubject = notification.customSubject.trim()
- }
+ // Change the subject if:
+ // - The msg ends with "Testing" or
+ // - Actual Up/Down Notification
+ if ((monitorJSON && heartbeatJSON) || msg.endsWith("Testing")) {
+ let customSubject = "";
- // If custom subject is not empty, change subject for notification
- if (customSubject !== "") {
-
- // Replace "MACROS" with coresponding variable
- let replaceName = new RegExp("{{NAME}}", "g");
- let replaceHostname = new RegExp("{{HOSTNAME}}", "g");
- let replaceStatus = new RegExp("{{STATUS}}", "g");
-
- // Lets start with dummy values to simplify code
- let monitorName = "Test"
- let monitorHostname = "example.com"
- let serviceStatus = "⚠️ Test";
-
- if (monitorJSON !== null) {
- monitorName = monitorJSON["name"];
- monitorHostname = monitorJSON["hostname"];
+ // Our subject cannot end with whitespace it's often raise spam score
+ // Once I got "Cannot read property 'trim' of undefined", better be safe than sorry
+ if (notification.customSubject) {
+ customSubject = notification.customSubject.trim();
}
- if (heartbeatJSON !== null) {
- serviceStatus = heartbeatJSON["status"] == DOWN ? "🔴 Down" : "✅ Up";
- }
-
- // Break replace to one by line for better readability
- customSubject = customSubject.replace(replaceStatus, serviceStatus);
- customSubject = customSubject.replace(replaceName, monitorName);
- customSubject = customSubject.replace(replaceHostname, monitorHostname);
+ // If custom subject is not empty, change subject for notification
+ if (customSubject !== "") {
- subject = customSubject
+ // Replace "MACROS" with corresponding variable
+ let replaceName = new RegExp("{{NAME}}", "g");
+ let replaceHostnameOrURL = new RegExp("{{HOSTNAME_OR_URL}}", "g");
+ let replaceStatus = new RegExp("{{STATUS}}", "g");
+
+ // Lets start with dummy values to simplify code
+ let monitorName = "Test";
+ let monitorHostnameOrURL = "testing.hostname";
+ let serviceStatus = "⚠️ Test";
+
+ if (monitorJSON !== null) {
+ monitorName = monitorJSON["name"];
+
+ if (monitorJSON["type"] === "http" || monitorJSON["type"] === "keyword") {
+ monitorHostnameOrURL = monitorJSON["url"];
+ } else {
+ monitorHostnameOrURL = monitorJSON["hostname"];
+ }
+ }
+
+ if (heartbeatJSON !== null) {
+ serviceStatus = (heartbeatJSON["status"] === DOWN) ? "🔴 Down" : "✅ Up";
+ }
+
+ // Break replace to one by line for better readability
+ customSubject = customSubject.replace(replaceStatus, serviceStatus);
+ customSubject = customSubject.replace(replaceName, monitorName);
+ customSubject = customSubject.replace(replaceHostnameOrURL, monitorHostnameOrURL);
+
+ subject = customSubject;
+ }
}
let transporter = nodemailer.createTransport(config);
diff --git a/src/components/notifications/SMTP.vue b/src/components/notifications/SMTP.vue
index 79efd9f9a..483917e3f 100644
--- a/src/components/notifications/SMTP.vue
+++ b/src/components/notifications/SMTP.vue
@@ -43,11 +43,6 @@
-
- {{ $t("Email Subject") }}
-
-
-
{{ $t("To Email") }}
@@ -62,6 +57,18 @@
{{ $t("smtpBCC") }}
+
+
+
{{ $t("emailCustomSubject") }}
+
+
+ (leave blank for default one)
+ {{NAME}}: Service Name
+ {{HOSTNAME_OR_URL}}: Hostname or URL
+ {{URL}}: URL
+ {{STATUS}}: Status
+
+