From 1952e34110957a3ed81b68d0ad9afb78f0da4ac4 Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Sun, 29 Aug 2021 18:47:01 +0200 Subject: [PATCH 001/134] Added the possibility to clear monitor data --- server/server.js | 48 ++++++++++++++++++++++ src/assets/vars.scss | 2 + src/languages/de-DE.js | 5 +++ src/languages/en.js | 2 + src/mixins/socket.js | 7 ++++ src/pages/Details.vue | 93 ++++++++++++++++++++++++++++++++++++++++-- 6 files changed, 153 insertions(+), 4 deletions(-) diff --git a/server/server.js b/server/server.js index d4fe668b3..3530981bb 100644 --- a/server/server.js +++ b/server/server.js @@ -552,6 +552,54 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); } }); + socket.on("clearEvents", async (monitorID, callback) => { + try { + checkLogin(socket) + + console.log(`Clear Events Monitor: ${monitorID} User ID: ${socket.userID}`) + + await R.exec("UPDATE heartbeat SET msg = ?, important = ? WHERE monitor_id = ? ", [ + "", + "0", + monitorID, + ]); + + callback({ + ok: true, + msg: "Events Successfully Cleared.", + }); + + } catch (e) { + callback({ + ok: false, + msg: e.message, + }); + } + }); + + socket.on("clearHeartbeats", async (monitorID, callback) => { + try { + checkLogin(socket) + + console.log(`Clear Heartbeats Monitor: ${monitorID} User ID: ${socket.userID}`) + + await R.exec("DELETE FROM heartbeat WHERE monitor_id = ?", [ + monitorID + ]); + + callback({ + ok: true, + msg: "Heartbeats Successfully Cleared.", + }); + + } catch (e) { + callback({ + ok: false, + msg: e.message, + }); + } + }); + debug("added all socket handlers") // *************************** diff --git a/src/assets/vars.scss b/src/assets/vars.scss index 9d487eb26..2f4369832 100644 --- a/src/assets/vars.scss +++ b/src/assets/vars.scss @@ -16,3 +16,5 @@ $dark-border-color: #1d2634; $easing-in: cubic-bezier(0.54, 0.78, 0.55, 0.97); $easing-out: cubic-bezier(0.25, 0.46, 0.45, 0.94); $easing-in-out: cubic-bezier(0.79, 0.14, 0.15, 0.86); + +$dropdown-border-radius: 0.5rem; diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index ba852cf32..58d283a3b 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -104,4 +104,9 @@ export default { 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 löschen möchtest?", + clearHeartbeatsMsg: "Bist du sicher das du alle Statistiken löschen möchtest?", + "Clear Data": "Lösche Daten", + "Events": "Ereignisse", + "Heartbeats": "Statistiken", } diff --git a/src/languages/en.js b/src/languages/en.js index 75c25dd57..0729e2e7e 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -16,4 +16,6 @@ export default { resoverserverDescription: "Cloudflare is the default server, you can change the resolver server anytime.", rrtypeDescription: "Select the RR-Type you want to monitor", pauseMonitorMsg: "Are you sure want to pause?", + clearEventsMsg: "Are you sure want to delete all events?", + clearHeartbeatsMsg: "Are you sure want to delete all heartbeats?", } diff --git a/src/mixins/socket.js b/src/mixins/socket.js index 454422e94..6f6f033a6 100644 --- a/src/mixins/socket.js +++ b/src/mixins/socket.js @@ -254,6 +254,13 @@ export default { this.importantHeartbeatList = {} }, + clearEvents(monitorID, callback) { + socket.emit("clearEvents", monitorID, callback) + }, + + clearHeartbeats(monitorID, callback) { + socket.emit("clearHeartbeats", monitorID, callback) + }, }, computed: { diff --git a/src/pages/Details.vue b/src/pages/Details.vue index cc45e4034..8ceae1d25 100644 --- a/src/pages/Details.vue +++ b/src/pages/Details.vue @@ -133,6 +133,23 @@
+ @@ -172,6 +189,14 @@ {{ $t("deleteMonitorMsg") }} + + + {{ $t("clearEventsMsg") }} + + + + {{ $t("clearHeartbeatsMsg") }} + @@ -313,6 +338,14 @@ export default { this.$refs.confirmDelete.show(); }, + clearEventsDialog() { + this.$refs.confirmClearEvents.show(); + }, + + clearHeartbeatsDialog() { + this.$refs.confirmClearHeartbeats.show(); + }, + deleteMonitor() { this.$root.deleteMonitor(this.monitor.id, (res) => { if (res.ok) { @@ -324,6 +357,27 @@ export default { }) }, + clearEvents() { + this.$root.clearEvents(this.monitor.id, (res) => { + if (res.ok) { + toast.success(res.msg); + this.$router.go(); + } else { + toast.error(res.msg); + } + }) + }, + + clearHeartbeats() { + this.$root.clearHeartbeats(this.monitor.id, (res) => { + if (res.ok) { + toast.success(res.msg); + this.$router.go(); + } else { + toast.error(res.msg); + } + }) + }, }, } @@ -340,16 +394,20 @@ export default { @media (max-width: 550px) { .functions { text-align: center; - } - button, a { - margin-left: 10px !important; - margin-right: 10px !important; + button, a { + margin-left: 10px !important; + margin-right: 10px !important; + } } .ping-chart-wrapper { padding: 10px !important; } + + .dropdown-clear-data { + margin-bottom: 10px; + } } @media (max-width: 400px) { @@ -364,6 +422,13 @@ export default { padding-left: 25px; padding-right: 25px; } + + .dropdown-clear-data { + button { + display: block; + padding-top: 4px; + } + } } .url { @@ -417,9 +482,29 @@ table { color: black; } +.dropdown-clear-data { + float: right; +} + .dark { .keyword { color: $dark-font-color; } + + .dropdown-clear-data { + ul { + background-color: $dark-bg; + border-color: $dark-bg2; + border-width: 2px; + + li button{ + color: $dark-font-color; + } + + li button:hover { + background-color: $dark-bg2; + } + } + } } From 7b92166d18e0759d3cc805c9cd96ef39fbdcee61 Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Wed, 1 Sep 2021 00:36:24 +0200 Subject: [PATCH 002/134] Added clear all db statistics function --- server/server.js | 22 ++++++++++++++++++++-- src/languages/de-DE.js | 5 +++-- src/languages/en.js | 5 +++-- src/mixins/socket.js | 4 ++++ src/pages/Details.vue | 2 -- src/pages/Settings.vue | 18 ++++++++++++++++++ 6 files changed, 48 insertions(+), 8 deletions(-) diff --git a/server/server.js b/server/server.js index 3530981bb..6c49b8c23 100644 --- a/server/server.js +++ b/server/server.js @@ -566,7 +566,6 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); callback({ ok: true, - msg: "Events Successfully Cleared.", }); } catch (e) { @@ -589,7 +588,26 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); callback({ ok: true, - msg: "Heartbeats Successfully Cleared.", + }); + + } catch (e) { + callback({ + ok: false, + msg: e.message, + }); + } + }); + + socket.on("clearStatistics", async (callback) => { + try { + checkLogin(socket) + + console.log(`Clear Statistics User ID: ${socket.userID}`) + + await R.exec("DELETE FROM heartbeat"); + + callback({ + ok: true, }); } catch (e) { diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index 58d283a3b..182f9e1a0 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -104,9 +104,10 @@ export default { 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 löschen möchtest?", - clearHeartbeatsMsg: "Bist du sicher das du alle Statistiken löschen 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?", "Clear Data": "Lösche Daten", "Events": "Ereignisse", "Heartbeats": "Statistiken", + confirmClearStatisticsMsg: "Bist du sicher das du ALLE Statistiken löschen möchtest?", } diff --git a/src/languages/en.js b/src/languages/en.js index 0729e2e7e..f72418070 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -16,6 +16,7 @@ export default { resoverserverDescription: "Cloudflare is the default server, you can change the resolver server anytime.", rrtypeDescription: "Select the RR-Type you want to monitor", pauseMonitorMsg: "Are you sure want to pause?", - clearEventsMsg: "Are you sure want to delete all events?", - clearHeartbeatsMsg: "Are you sure want to delete all heartbeats?", + 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?", } diff --git a/src/mixins/socket.js b/src/mixins/socket.js index 6f6f033a6..64560ea7c 100644 --- a/src/mixins/socket.js +++ b/src/mixins/socket.js @@ -261,6 +261,10 @@ export default { clearHeartbeats(monitorID, callback) { socket.emit("clearHeartbeats", monitorID, callback) }, + + clearStatistics(callback) { + socket.emit("clearStatistics", callback) + }, }, computed: { diff --git a/src/pages/Details.vue b/src/pages/Details.vue index 5c05b3dda..907e2d124 100644 --- a/src/pages/Details.vue +++ b/src/pages/Details.vue @@ -360,7 +360,6 @@ export default { clearEvents() { this.$root.clearEvents(this.monitor.id, (res) => { if (res.ok) { - toast.success(res.msg); this.$router.go(); } else { toast.error(res.msg); @@ -371,7 +370,6 @@ export default { clearHeartbeats() { this.$root.clearHeartbeats(this.monitor.id, (res) => { if (res.ok) { - toast.success(res.msg); this.$router.go(); } else { toast.error(res.msg); diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index d71ec109b..da56613e5 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -126,6 +126,7 @@ + @@ -184,6 +185,10 @@

Bitte mit Vorsicht nutzen.

+ + + {{ $t("confirmClearStatisticsMsg") }} + @@ -282,6 +287,10 @@ export default { this.$refs.confirmDisableAuth.show(); }, + confirmClearStatistics() { + this.$refs.confirmClearStatistics.show(); + }, + disableAuth() { this.settings.disableAuth = true; this.saveSettings(); @@ -293,6 +302,15 @@ export default { this.$root.storage().removeItem("token"); }, + clearStatistics() { + this.$root.clearStatistics((res) => { + if (res.ok) { + this.$router.go(); + } else { + toast.error(res.msg); + } + }) + }, }, } From 2f6c5963c5076c246de1591ae41b92b26ab00932 Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Wed, 1 Sep 2021 17:09:32 +0200 Subject: [PATCH 003/134] Added import and export function --- server/server.js | 74 ++++++++++++++++++++++++++++++++++++++++++ src/mixins/socket.js | 3 ++ src/pages/Settings.vue | 54 ++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+) diff --git a/server/server.js b/server/server.js index d4fe668b3..8485c3841 100644 --- a/server/server.js +++ b/server/server.js @@ -552,6 +552,80 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); } }); + socket.on("uploadBackup", async (uploadedJSON, callback) => { + try { + checkLogin(socket) + + console.log(`Import Backup User ID: ${socket.userID}`) + + let notificationList = uploadedJSON[0]; + let monitorList = uploadedJSON[1]; + + monitorList = JSON.stringify(monitorList); + monitorList = JSON.parse(monitorList); + monitorList = Object.values(monitorList); + + if (notificationList.length >= 1) { + for (let i = 0; i < notificationList.length; i++) { + let notification = JSON.parse(notificationList[i].config); + await Notification.save(notification, null, socket.userID) + } + } + + if (monitorList.length >= 1) { + for (let i = 0; i < monitorList.length; i++) { + let monitor = { + name: monitorList[i].name, + type: monitorList[i].type, + url: monitorList[i].url, + interval: monitorList[i].interval, + hostname: monitorList[i].hostname, + maxretries: monitorList[i].maxretries, + port: monitorList[i].port, + keyword: monitorList[i].keyword, + ignoreTls: monitorList[i].ignoreTls, + upsideDown: monitorList[i].upsideDown, + maxredirects: monitorList[i].maxredirects, + accepted_statuscodes: monitorList[i].accepted_statuscodes, + dns_resolve_type: monitorList[i].dns_resolve_type, + dns_resolve_server: monitorList[i].dns_resolve_server, + notificationIDList: {}, + } + + let bean = R.dispense("monitor") + + let notificationIDList = monitor.notificationIDList; + delete monitor.notificationIDList; + + monitor.accepted_statuscodes_json = JSON.stringify(monitor.accepted_statuscodes); + delete monitor.accepted_statuscodes; + + bean.import(monitor) + bean.user_id = socket.userID + await R.store(bean) + + await updateMonitorNotification(bean.id, notificationIDList) + + await startMonitor(socket.userID, bean.id); + } + + await sendNotificationList(socket) + await sendMonitorList(socket); + } + + callback({ + ok: true, + msg: "Backup successfully restored.", + }); + + } catch (e) { + callback({ + ok: false, + msg: e.message, + }); + } + }); + debug("added all socket handlers") // *************************** diff --git a/src/mixins/socket.js b/src/mixins/socket.js index 454422e94..867abfd01 100644 --- a/src/mixins/socket.js +++ b/src/mixins/socket.js @@ -254,6 +254,9 @@ export default { this.importantHeartbeatList = {} }, + uploadBackup(uploadedJSON, callback) { + socket.emit("uploadBackup", uploadedJSON, callback) + }, }, computed: { diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index d71ec109b..c15b1410a 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -120,6 +120,14 @@ +

{{ $t("Import/Export Backup") }}

+ +
+ + + +
+

{{ $t("Advanced") }}

@@ -293,6 +301,41 @@ export default { this.$root.storage().removeItem("token"); }, + downloadBackup() { + let time = dayjs().format("YYYY_MM_DD-hh_mm_ss"); + let fileName = `Uptime_Kuma_Backup_${time}.json`; + let exportData = { + notificationList: this.$root.notificationList, + monitorList: this.$root.monitorList, + } + exportData = JSON.stringify(exportData); + let downloadItem = document.createElement("a"); + downloadItem.setAttribute("href", `data:application/json;charset=utf-8, ${exportData}`); + downloadItem.setAttribute("download", fileName); + downloadItem.click(); + }, + + importBackup() { + let uploadItem = document.getElementById("importBackup").files; + if (uploadItem.length <= 0) { + return false; + } + + let fileReader = new FileReader(); + fileReader.readAsText(uploadItem.item(0)); + + fileReader.onload = item => { + let resultParse = JSON.parse(item.target.result); + let result = Object.values(resultParse); + this.$root.uploadBackup(result, (res) => { + if (res.ok) { + toast.success(res.msg); + } else { + toast.error(res.msg); + } + }) + } + }, }, } @@ -321,6 +364,17 @@ export default { .btn-check:hover + .btn-outline-primary { color: #000; } + + input[type=file]::file-selector-button { + color: $primary; + background-color: $dark-bg; + } + + //Does not work for some reason + input[type=file]::file-selector-button:hover { + color: $dark-font-color; + background-color: $primary; + } } footer { From 8e1e4b9204f0799d8d1504c93eb0bfbd8daceea5 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 01:51:51 +0800 Subject: [PATCH 004/134] override file-selector-button hover color --- src/pages/Settings.vue | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index c15b1410a..881b7aa5a 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -365,15 +365,16 @@ export default { color: #000; } - input[type=file]::file-selector-button { - color: $primary; - background-color: $dark-bg; - } + #importBackup { + &::file-selector-button { + color: $primary; + background-color: $dark-bg; + } - //Does not work for some reason - input[type=file]::file-selector-button:hover { - color: $dark-font-color; - background-color: $primary; + &:hover:not(:disabled):not([readonly])::file-selector-button { + color: $dark-font-color2; + background-color: $primary; + } } } From e7929f461d878af218d70c86bfbe694b84ee450f Mon Sep 17 00:00:00 2001 From: Adam Stachowicz Date: Wed, 1 Sep 2021 20:53:12 +0200 Subject: [PATCH 005/134] Update dependencies --- package.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index f279351ec..23b8e6da6 100644 --- a/package.json +++ b/package.json @@ -54,19 +54,19 @@ "express": "^4.17.1", "express-basic-auth": "^1.2.0", "form-data": "^4.0.0", - "http-graceful-shutdown": "^3.1.3", + "http-graceful-shutdown": "^3.1.4", "jsonwebtoken": "^8.5.1", "nodemailer": "^6.6.3", "password-hash": "^1.2.2", "prom-client": "^13.2.0", "prometheus-api-metrics": "^3.2.0", "redbean-node": "0.1.2", - "socket.io": "^4.1.3", - "socket.io-client": "^4.1.3", + "socket.io": "^4.2.0", + "socket.io-client": "^4.2.0", "sqlite3": "github:mapbox/node-sqlite3#593c9d", "tcp-ping": "^0.1.1", "v-pagination-3": "^0.1.6", - "vue": "^3.2.2", + "vue": "^3.2.6", "vue-chart-3": "^0.5.7", "vue-confirm-dialog": "^1.0.2", "vue-i18n": "^9.1.7", @@ -76,18 +76,18 @@ }, "devDependencies": { "@babel/eslint-parser": "^7.15.0", - "@types/bootstrap": "^5.1.1", - "@vitejs/plugin-legacy": "^1.5.1", - "@vitejs/plugin-vue": "^1.4.0", - "@vue/compiler-sfc": "^3.2.2", - "core-js": "^3.16.1", + "@types/bootstrap": "^5.1.2", + "@vitejs/plugin-legacy": "^1.5.2", + "@vitejs/plugin-vue": "^1.6.0", + "@vue/compiler-sfc": "^3.2.6", + "core-js": "^3.17.0", "dns2": "^2.0.1", "eslint": "^7.32.0", - "eslint-plugin-vue": "^7.16.0", - "sass": "^1.37.5", + "eslint-plugin-vue": "^7.17.0", + "sass": "^1.38.2", "stylelint": "^13.13.1", "stylelint-config-standard": "^22.0.0", - "typescript": "^4.3.5", - "vite": "^2.4.4" + "typescript": "^4.4.2", + "vite": "^2.5.3" } } From c13cc62d3d06f931b755250536e97ffebb5d2d74 Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Wed, 1 Sep 2021 21:32:33 +0200 Subject: [PATCH 006/134] Update server/server.js 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 8485c3841..ec8aad6a9 100644 --- a/server/server.js +++ b/server/server.js @@ -556,7 +556,7 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); try { checkLogin(socket) - console.log(`Import Backup User ID: ${socket.userID}`) + console.log(`Importing Backup, User ID: ${socket.userID}`) let notificationList = uploadedJSON[0]; let monitorList = uploadedJSON[1]; From 2dd392e609757fd3b0bec7841ac7d4c97ef96afa Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Thu, 2 Sep 2021 10:15:25 +0200 Subject: [PATCH 007/134] Added uptime kuma version to backup file --- server/server.js | 6 +++--- src/pages/Settings.vue | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/server/server.js b/server/server.js index ec8aad6a9..a795e2187 100644 --- a/server/server.js +++ b/server/server.js @@ -556,10 +556,10 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); try { checkLogin(socket) - console.log(`Importing Backup, User ID: ${socket.userID}`) + console.log(`Importing Backup, User ID: ${socket.userID}, Version: ${uploadedJSON[0]}`) - let notificationList = uploadedJSON[0]; - let monitorList = uploadedJSON[1]; + let notificationList = uploadedJSON[1]; + let monitorList = uploadedJSON[2]; monitorList = JSON.stringify(monitorList); monitorList = JSON.parse(monitorList); diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index 881b7aa5a..c82a170c5 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -305,6 +305,7 @@ export default { let time = dayjs().format("YYYY_MM_DD-hh_mm_ss"); let fileName = `Uptime_Kuma_Backup_${time}.json`; let exportData = { + version: this.$root.info.version, notificationList: this.$root.notificationList, monitorList: this.$root.monitorList, } From 99725aabe74f088d9fe57e2b6a3d703fd3c07a24 Mon Sep 17 00:00:00 2001 From: Jelle Posthuma Date: Thu, 2 Sep 2021 11:10:54 +0200 Subject: [PATCH 008/134] Add Dutch/Nederlands language (nl_NL) --- src/languages/nl_NL.js | 112 +++++++++++++++++++++++++++++++++++++++++ src/main.js | 2 + 2 files changed, 114 insertions(+) create mode 100644 src/languages/nl_NL.js diff --git a/src/languages/nl_NL.js b/src/languages/nl_NL.js new file mode 100644 index 000000000..b26c17eae --- /dev/null +++ b/src/languages/nl_NL.js @@ -0,0 +1,112 @@ +export default { + languageName: "Nederlands", + checkEverySecond: "Controleer elke {0} seconden.", + "Avg.": "Gem. ", + retriesDescription: "Maximum aantal nieuwe pogingen voordat de service wordt gemarkeerd als niet beschikbaar en er een melding wordt verzonden", + ignoreTLSError: "Negeer TLS/SSL-fout voor HTTPS-websites", + upsideDownModeDescription: "Draai de status om. Als de service bereikbaar is, is deze OFFLINE.", + maxRedirectDescription: "Maximaal aantal te volgen omleidingen. Stel in op 0 om omleidingen uit te schakelen.", + acceptedStatusCodesDescription: "Selecteer statuscodes die als een succesvol antwoord worden beschouwd.", + passwordNotMatchMsg: "Het herhaalwachtwoord komt niet overeen.", + notificationDescription: "Wijs a.u.b. een melding toe aan de monitor(s) om het te laten werken.", + keywordDescription: "Zoek trefwoord in gewone html of JSON-response en het is hoofdlettergevoelig", + pauseDashboardHome: "Gepauzeerd", + deleteMonitorMsg: "Weet u zeker dat u deze monitor wilt verwijderen?", + deleteNotificationMsg: "Weet u zeker dat u deze melding voor alle monitoren wilt verwijderen?", + resoverserverDescription: "Cloudflare is de standaardserver, u kunt de resolver server op elk moment wijzigen.", + rrtypeDescription: "Selecteer het RR-type dat u wilt monitoren", + pauseMonitorMsg: "Weet je zeker dat je wilt pauzeren?", + Settings: "Instellingen", + Dashboard: "Dashboard", + "New Update": "Nieuwe update", + Language: "Taal", + Appearance: "Weergave", + Theme: "Thema", + General: "Algemeen", + Version: "Versie", + "Check Update On GitHub": "Controleer update op GitHub", + List: "Lijst", + Add: "Toevoegen", + "Add New Monitor": "Nieuwe monitor toevoegen", + "Quick Stats": "Snelle statistieken", + Up: "Online", + Down: "Offline", + Pending: "In afwachting", + Unknown: "Onbekend", + Pause: "Pauze", + Name: "Naam", + Status: "Status", + DateTime: "Datum Tijd", + Message: "Bericht", + "No important events": "Geen belangrijke gebeurtenissen", + Resume: "Hervat", + Edit: "Wijzigen", + Delete: "Verwijderen", + Current: "Huidig", + Uptime: "Uptime", + "Cert Exp.": "Cert. verl.", + days: "dagen", + day: "dag", + "-day": "-dag", + hour: "uur", + "-hour": "-uur", + Response: "Antwoord", + Ping: "Ping", + "Monitor Type": "Monitortype:", + Keyword: "Trefwoord", + "Friendly Name": "Vriendelijke naam", + URL: "URL", + Hostname: "Hostnaam", + Port: "Poort", + "Heartbeat Interval": "Hartslaginterval", + Retries: "Pogingen", + Advanced: "Geavanceerd", + "Upside Down Mode": "Ondersteboven modus", + "Max. Redirects": "Max. Omleidingen", + "Accepted Status Codes": "Geaccepteerde statuscodes", + Save: "Opslaan", + Notifications: "Meldingen", + "Not available, please setup.": "Niet beschikbaar, stel a.u.b. in.", + "Setup Notification": "Melding instellen", + Light: "Licht", + Dark: "Donker", + Auto: "Auto", + "Theme - Heartbeat Bar": "Thema - Hartslagbalk", + Normal: "Normaal", + Bottom: "Onderkant", + None: "Geen", + Timezone: "Tijdzone", + "Search Engine Visibility": "Zichtbaarheid voor zoekmachines", + "Allow indexing": "Indexering toestaan", + "Discourage search engines from indexing site": "Ontmoedig zoekmachines om de site te indexeren", + "Change Password": "Verander wachtwoord", + "Current Password": "Huidig ​​wachtwoord", + "New Password": "Nieuw wachtwoord", + "Repeat New Password": "Herhaal nieuw wachtwoord", + "Update Password": "Vernieuw wachtwoord", + "Disable Auth": "Autorisatie uitschakelen", + "Enable Auth": "Autorisatie inschakelen", + Logout: "Uitloggen", + Leave: "Vertrekken", + "I understand, please disable": "Ik begrijp het, schakel a.u.b. uit", + Confirm: "Bevestigen", + Yes: "Ja", + No: "Nee", + Username: "Gebruikersnaam", + Password: "Wachtwoord", + "Remember me": "Wachtwoord onthouden", + Login: "Inloggen", + "No Monitors, please": "Geen monitoren, ", + "add one": "voeg een toe", + "Notification Type": "Melding type", + Email: "E-mail", + Test: "Testen", + "Certificate Info": "Certificaat informatie", + "Resolver Server": "Resolver Server", + "Resource Record Type": "Type bronrecord", + "Last Result": "Laatste resultaat", + "Create your admin account": "Maak uw beheerdersaccount aan", + "Repeat Password": "Herhaal wachtwoord", + respTime: "resp. tijd (ms)", + notAvailableShort: "N.v.t." +} \ No newline at end of file diff --git a/src/main.js b/src/main.js index fe35d3815..b20db3e0f 100644 --- a/src/main.js +++ b/src/main.js @@ -26,6 +26,7 @@ import { appName } from "./util.ts"; import en from "./languages/en"; import zhHK from "./languages/zh-HK"; import deDE from "./languages/de-DE"; +import nlNL from "./languages/nl-NL"; import fr from "./languages/fr"; import ja from "./languages/ja"; import daDK from "./languages/da-DK"; @@ -98,6 +99,7 @@ const languageList = { en, "zh-HK": zhHK, "de-DE": deDE, + "nl-NL": nlNL, "fr": fr, "ja": ja, "da-DK": daDK, From b88b357b55022cc17b202529d4227d82bc91f23a Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 20:18:27 +0800 Subject: [PATCH 009/134] add support for https --- server/server.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/server/server.js b/server/server.js index d4fe668b3..ecdd65025 100644 --- a/server/server.js +++ b/server/server.js @@ -6,6 +6,7 @@ const { sleep, debug, TimeLogger, getRandomInt } = require("../src/util"); console.log("Importing Node libraries") const fs = require("fs"); const http = require("http"); +const https = require("https"); console.log("Importing 3rd-party libraries") debug("Importing express"); @@ -45,9 +46,21 @@ console.info("Version: " + checkVersion.version); const hostname = process.env.HOST || args.host; const port = parseInt(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; + console.log("Creating express and socket.io instance") const app = express(); -const server = http.createServer(app); + +let server; + +if (sslKey && sslCert) { + https.createServer(app); +} else { + http.createServer(app); +} + const io = new Server(server); app.use(express.json()) From c74986647ef4b262fde05c7076571efd7e5496e6 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 20:27:18 +0800 Subject: [PATCH 010/134] allow changing data dir --- server/database.js | 5 +++-- server/server.js | 10 ++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/server/database.js b/server/database.js index c0a53a9b8..f9414ad1b 100644 --- a/server/database.js +++ b/server/database.js @@ -5,7 +5,8 @@ const { setSetting, setting } = require("./util-server"); class Database { static templatePath = "./db/kuma.db" - static path = "./data/kuma.db"; + static dataDir = "./data/"; + static path = this.dataDir + "kuma.db"; static latestVersion = 8; static noReject = true; static sqliteInstance = null; @@ -56,7 +57,7 @@ class Database { console.info("Database patch is needed") console.info("Backup the db") - const backupPath = "./data/kuma.db.bak" + version; + const backupPath = this.dataDir + "kuma.db.bak" + version; fs.copyFileSync(Database.path, backupPath); const shmPath = Database.path + "-shm"; diff --git a/server/server.js b/server/server.js index ecdd65025..a87f37c6d 100644 --- a/server/server.js +++ b/server/server.js @@ -50,15 +50,21 @@ 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; +// Data Directory (must be end with "/") +Database.dataDir = process.env.DATA_DIR || process.env.data_dir || "./data/"; +console.log(`Data Dir: ${Database.dataDir}`); + console.log("Creating express and socket.io instance") const app = express(); let server; if (sslKey && sslCert) { - https.createServer(app); + console.log("Server Type: HTTPS"); + server = https.createServer(app); } else { - http.createServer(app); + console.log("Server Type: HTTP"); + server = http.createServer(app); } const io = new Server(server); From 3ee13bddd1e063d445fc34afb59d5665be3f417d Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 20:36:52 +0800 Subject: [PATCH 011/134] dash style for args --- server/server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/server.js b/server/server.js index a87f37c6d..7ca6ce0d2 100644 --- a/server/server.js +++ b/server/server.js @@ -47,11 +47,11 @@ const hostname = process.env.HOST || args.host; const port = parseInt(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.SSL_KEY || args["ssl-key"] || undefined; +const sslCert = process.env.SSL_CERT || args["ssl-cert"] || undefined; // Data Directory (must be end with "/") -Database.dataDir = process.env.DATA_DIR || process.env.data_dir || "./data/"; +Database.dataDir = process.env.DATA_DIR || args["data-dir"] || "./data/"; console.log(`Data Dir: ${Database.dataDir}`); console.log("Creating express and socket.io instance") From b604807cfe90c01ac8a0ca96c1e0892edc6c6997 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 20:42:55 +0800 Subject: [PATCH 012/134] create data dir if not exists --- server/database.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/database.js b/server/database.js index f9414ad1b..6db61ea4d 100644 --- a/server/database.js +++ b/server/database.js @@ -12,6 +12,10 @@ class Database { static sqliteInstance = null; static async connect() { + if (! fs.existsSync(this.dataDir)) { + fs.mkdirSync(this.dataDir, { recursive: true }); + } + const acquireConnectionTimeout = 120 * 1000; R.setup("sqlite", { From 6e3e2fc85c8a05426a95660c59276cc7a30b995c Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 21:08:00 +0800 Subject: [PATCH 013/134] fix db path --- server/database.js | 4 ++-- server/server.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/server/database.js b/server/database.js index 6db61ea4d..c4e1bce9f 100644 --- a/server/database.js +++ b/server/database.js @@ -5,8 +5,8 @@ const { setSetting, setting } = require("./util-server"); class Database { static templatePath = "./db/kuma.db" - static dataDir = "./data/"; - static path = this.dataDir + "kuma.db"; + static dataDir; + static path; static latestVersion = 8; static noReject = true; static sqliteInstance = null; diff --git a/server/server.js b/server/server.js index 7ca6ce0d2..3c0d281db 100644 --- a/server/server.js +++ b/server/server.js @@ -52,6 +52,7 @@ const sslCert = process.env.SSL_CERT || args["ssl-cert"] || undefined; // Data Directory (must be end with "/") Database.dataDir = process.env.DATA_DIR || args["data-dir"] || "./data/"; +Database.path = Database.dataDir + "kuma.db"; console.log(`Data Dir: ${Database.dataDir}`); console.log("Creating express and socket.io instance") From 582e14098d2aa74c96f309cdb22b192c14196be0 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 21:10:18 +0800 Subject: [PATCH 014/134] create data dir before copy --- server/database.js | 4 ---- server/server.js | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/server/database.js b/server/database.js index c4e1bce9f..77c4da758 100644 --- a/server/database.js +++ b/server/database.js @@ -12,10 +12,6 @@ class Database { static sqliteInstance = null; static async connect() { - if (! fs.existsSync(this.dataDir)) { - fs.mkdirSync(this.dataDir, { recursive: true }); - } - const acquireConnectionTimeout = 120 * 1000; R.setup("sqlite", { diff --git a/server/server.js b/server/server.js index 3c0d281db..42a17679b 100644 --- a/server/server.js +++ b/server/server.js @@ -53,6 +53,9 @@ const sslCert = process.env.SSL_CERT || args["ssl-cert"] || undefined; // Data Directory (must be end with "/") Database.dataDir = process.env.DATA_DIR || args["data-dir"] || "./data/"; Database.path = Database.dataDir + "kuma.db"; +if (! fs.existsSync(this.dataDir)) { + fs.mkdirSync(this.dataDir, { recursive: true }); +} console.log(`Data Dir: ${Database.dataDir}`); console.log("Creating express and socket.io instance") From b30b1d3a5201c2a8977c30833fb3080844cbcc6e Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 21:11:20 +0800 Subject: [PATCH 015/134] create data dir before copy --- server/server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/server.js b/server/server.js index 42a17679b..eb3e508f3 100644 --- a/server/server.js +++ b/server/server.js @@ -53,8 +53,8 @@ const sslCert = process.env.SSL_CERT || args["ssl-cert"] || undefined; // Data Directory (must be end with "/") Database.dataDir = process.env.DATA_DIR || args["data-dir"] || "./data/"; Database.path = Database.dataDir + "kuma.db"; -if (! fs.existsSync(this.dataDir)) { - fs.mkdirSync(this.dataDir, { recursive: true }); +if (! fs.existsSync(Database.dataDir)) { + fs.mkdirSync(Database.dataDir, { recursive: true }); } console.log(`Data Dir: ${Database.dataDir}`); From 51cf2ff6f95aa0a87eb931675a43f6ebd55c3989 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 21:13:59 +0800 Subject: [PATCH 016/134] add missing cert parameters --- server/server.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/server.js b/server/server.js index eb3e508f3..a195c6d25 100644 --- a/server/server.js +++ b/server/server.js @@ -65,7 +65,10 @@ let server; if (sslKey && sslCert) { console.log("Server Type: HTTPS"); - server = https.createServer(app); + server = https.createServer({ + key: sslKey, + cert: sslCert + }, app); } else { console.log("Server Type: HTTP"); server = http.createServer(app); From f23ecef636c9f8c5c62b51d63d889e1c59b4b91e Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 21:16:04 +0800 Subject: [PATCH 017/134] add missing cert parameters --- server/server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/server.js b/server/server.js index a195c6d25..39191de79 100644 --- a/server/server.js +++ b/server/server.js @@ -66,8 +66,8 @@ let server; if (sslKey && sslCert) { console.log("Server Type: HTTPS"); server = https.createServer({ - key: sslKey, - cert: sslCert + key: fs.readFileSync(sslKey), + cert: fs.readFileSync(sslCert) }, app); } else { console.log("Server Type: HTTP"); From 532ad3044cb3e0b7e7771863c2d871f45b1e22b5 Mon Sep 17 00:00:00 2001 From: Domenic Horner Date: Thu, 2 Sep 2021 21:55:25 +0800 Subject: [PATCH 018/134] Add space to pushbullet and lunasea notifications Start changes regarding standardization of notification messages --- server/notification.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/notification.js b/server/notification.js index 472012af7..9417e733e 100644 --- a/server/notification.js +++ b/server/notification.js @@ -491,7 +491,7 @@ class Notification { if (heartbeatJSON["status"] == 0) { let downdata = { - "title": "UptimeKuma Alert:" + monitorJSON["name"], + "title": "UptimeKuma Alert: " + monitorJSON["name"], "body": "[🔴 Down]" + heartbeatJSON["msg"] + "\nTime (UTC):" + heartbeatJSON["time"], } await axios.post(lunaseadevice, downdata) @@ -500,7 +500,7 @@ class Notification { if (heartbeatJSON["status"] == 1) { let updata = { - "title": "UptimeKuma Alert:" + monitorJSON["name"], + "title": "UptimeKuma Alert: " + monitorJSON["name"], "body": "[✅ Up]" + heartbeatJSON["msg"] + "\nTime (UTC):" + heartbeatJSON["time"], } await axios.post(lunaseadevice, updata) @@ -530,14 +530,14 @@ class Notification { } else if (heartbeatJSON["status"] == 0) { let downdata = { "type": "note", - "title": "UptimeKuma Alert:" + monitorJSON["name"], + "title": "UptimeKuma Alert: " + monitorJSON["name"], "body": "[🔴 Down]" + heartbeatJSON["msg"] + "\nTime (UTC):" + heartbeatJSON["time"], } await axios.post(pushbulletUrl, downdata, config) } else if (heartbeatJSON["status"] == 1) { let updata = { "type": "note", - "title": "UptimeKuma Alert:" + monitorJSON["name"], + "title": "UptimeKuma Alert: " + monitorJSON["name"], "body": "[✅ Up]" + heartbeatJSON["msg"] + "\nTime (UTC):" + heartbeatJSON["time"], } await axios.post(pushbulletUrl, updata, config) From 7d70c4d8cdff782613c12b4c96a36f878b6e9051 Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Thu, 2 Sep 2021 16:13:31 +0200 Subject: [PATCH 019/134] Code optimizations --- server/server.js | 10 ++++------ src/pages/Settings.vue | 7 +++---- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/server/server.js b/server/server.js index a795e2187..e1f24ae1f 100644 --- a/server/server.js +++ b/server/server.js @@ -556,14 +556,12 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); try { checkLogin(socket) - console.log(`Importing Backup, User ID: ${socket.userID}, Version: ${uploadedJSON[0]}`) + let backupData = JSON.parse(uploadedJSON); - let notificationList = uploadedJSON[1]; - let monitorList = uploadedJSON[2]; + console.log(`Importing Backup, User ID: ${socket.userID}, Version: ${backupData.version}`) - monitorList = JSON.stringify(monitorList); - monitorList = JSON.parse(monitorList); - monitorList = Object.values(monitorList); + let notificationList = backupData.notificationList; + let monitorList = backupData.monitorList; if (notificationList.length >= 1) { for (let i = 0; i < notificationList.length; i++) { diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index c82a170c5..ff6920cba 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -304,10 +304,11 @@ export default { downloadBackup() { let time = dayjs().format("YYYY_MM_DD-hh_mm_ss"); let fileName = `Uptime_Kuma_Backup_${time}.json`; + let monitorList = Object.values(this.$root.monitorList); let exportData = { version: this.$root.info.version, notificationList: this.$root.notificationList, - monitorList: this.$root.monitorList, + monitorList: monitorList, } exportData = JSON.stringify(exportData); let downloadItem = document.createElement("a"); @@ -326,9 +327,7 @@ export default { fileReader.readAsText(uploadItem.item(0)); fileReader.onload = item => { - let resultParse = JSON.parse(item.target.result); - let result = Object.values(resultParse); - this.$root.uploadBackup(result, (res) => { + this.$root.uploadBackup(item.target.result, (res) => { if (res.ok) { toast.success(res.msg); } else { From d2bf2a551d00fc88f3ddcc4812e0419432d0537a Mon Sep 17 00:00:00 2001 From: "Victor M. Vicente Cuevas" Date: Thu, 2 Sep 2021 16:23:07 +0200 Subject: [PATCH 020/134] Add spanish language and update Readme --- src/languages/README.md | 3 +- src/languages/es-ES.js | 112 ++++++++++++++++++++++++++++++++++++++++ src/pages/Settings.vue | 6 +++ 3 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 src/languages/es-ES.js diff --git a/src/languages/README.md b/src/languages/README.md index 1deeacd6f..afc14d3b5 100644 --- a/src/languages/README.md +++ b/src/languages/README.md @@ -4,7 +4,8 @@ 2. Create a language file. (e.g. `zh-TW.js`) The filename must be ISO language code: http://www.lingoes.net/en/translator/langcode.htm 3. `npm run update-language-files --base-lang=de-DE` 6. Your language file should be filled in. You can translate now. -7. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done. +7. Translate `src/pages/Settings.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`) +8. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done. If you do not have programming skills, let me know in [Issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏 diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js new file mode 100644 index 000000000..734285798 --- /dev/null +++ b/src/languages/es-ES.js @@ -0,0 +1,112 @@ +export default { + languageName: "Español", + checkEverySecond: "Comprobar cada {0} segundos.", + "Avg.": "Media. ", + retriesDescription: "Número máximo de intentos antes de que el servicio se marque como CAÍDO y una notificación sea enviada.", + ignoreTLSError: "Ignorar error TLS/SSL para sitios web HTTPS", + upsideDownModeDescription: "Invertir el estado. Si el servicio es alcanzable, está CAÍDO.", + maxRedirectDescription: "Número máximo de direcciones a seguir. Establecer a 0 para deshabilitar.", + acceptedStatusCodesDescription: "Seleccionar los códigos de estado que se consideran como respuesta exitosa.", + passwordNotMatchMsg: "La contraseña repetida no coincide.", + notificationDescription: "Por favor asigne una notificación a el/los monitor(es) para hacerlos funcional(es).", + keywordDescription: "Palabra clave en HTML plano o respuesta JSON y es sensible a mayúsculas", + pauseDashboardHome: "Pausar", + deleteMonitorMsg: "¿Seguro que quieres eliminar este monitor?", + deleteNotificationMsg: "¿Seguro que quieres eliminar esta notificación para todos los monitores?", + resoverserverDescription: "Cloudflare es el servidor por defecto, puedes cambiar el servidor de resolución en cualquier momento.", + rrtypeDescription: "Selecciona el tipo de registro que quieres monitorizar", + pauseMonitorMsg: "¿Seguro que quieres pausar?", + Settings: "Ajustes", + Dashboard: "Panel", + "New Update": "Vueva actualización", + Language: "Idioma", + Appearance: "Apariencia", + Theme: "Tema", + General: "General", + Version: "Versión", + "Check Update On GitHub": "Comprobar actualizaciones en GitHub", + List: "Lista", + Add: "Añadir", + "Add New Monitor": "Añadir nuevo monitor", + "Quick Stats": "Estadísticas rápidas", + Up: "Funcional", + Down: "Caído", + Pending: "Pendiente", + Unknown: "Desconociso", + Pause: "Pausa", + Name: "Nombre", + Status: "Estado", + DateTime: "Fecha y Hora", + Message: "Mensaje", + "No important events": "No hay eventos importantes", + Resume: "Reanudar", + Edit: "Editar", + Delete: "Eliminar", + Current: "Actual", + Uptime: "Tiempo activo", + "Cert Exp.": "Caducidad cert.", + days: "días", + day: "día", + "-day": "-día", + hour: "hora", + "-hour": "-hora", + Response: "Respuesta", + Ping: "Ping", + "Monitor Type": "Tipo de Monitor", + Keyword: "Palabra clave", + "Friendly Name": "Nombre sencillo", + URL: "URL", + Hostname: "Nombre del host", + Port: "Puerto", + "Heartbeat Interval": "Intervalo de latido", + Retries: "Reintentos", + Advanced: "Avanzado", + "Upside Down Mode": "Modo invertido", + "Max. Redirects": "Máx. redirecciones", + "Accepted Status Codes": "Códigos de estado aceptados", + Save: "Guardar", + Notifications: "Notificaciones", + "Not available, please setup.": "No disponible, por favor configurar.", + "Setup Notification": "Configurar notificación", + Light: "Claro", + Dark: "Oscuro", + Auto: "Auto", + "Theme - Heartbeat Bar": "Tema - Barra de intervalo de latido", + Normal: "Normal", + Bottom: "Abajo", + None: "Ninguno", + Timezone: "Zona horaria", + "Search Engine Visibility": "Visibilidad motor de búsqueda", + "Allow indexing": "Permitir indexación", + "Discourage search engines from indexing site": "Disuadir a los motores de búsqueda de indexar el sitio", + "Change Password": "Cambiar contraseña", + "Current Password": "Contraseña actual", + "New Password": "Nueva contraseña", + "Repeat New Password": "Repetir nueva contraseña", + "Update Password": "Actualizar contraseña", + "Disable Auth": "deshabilitar Autenticación ", + "Enable Auth": "Habilitar Autenticación ", + Logout: "Cerrar sesión", + Leave: "Salir", + "I understand, please disable": "Lo comprendo, por favor deshabilitar", + Confirm: "Confirmar", + Yes: "Sí", + No: "No", + Username: "Usuario", + Password: "Contraseña", + "Remember me": "Recordarme", + Login: "Acceso", + "No Monitors, please": "Sin monitores, por favor", + "add one": "añade uno", + "Notification Type": "Tipo de notificación", + Email: "Email", + Test: "Test", + "Certificate Info": "Información del certificado ", + "Resolver Server": "Servidor de resolución", + "Resource Record Type": "Tipo de Registro", + "Last Result": "Último resultado", + "Create your admin account": "Crea tu cuenta de administrador", + "Repeat Password": "Repetir contraseña", + respTime: "Tiempo de resp. (ms)", + notAvailableShort: "N/A" +} diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index d71ec109b..85ca0066c 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -172,6 +172,12 @@

Please use it carefully.

+ + + +
From 79fda8f442b8f078c42512db2ab3860cd8d5f609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Simi=C4=87?= Date: Fri, 3 Sep 2021 02:20:01 +0200 Subject: [PATCH 028/134] Add Serbian Latin locale --- src/languages/sr-latn.js | 112 +++++++++++++++++++++++++++++++++++++++ src/main.js | 2 + src/pages/Settings.vue | 6 +++ 3 files changed, 120 insertions(+) create mode 100644 src/languages/sr-latn.js diff --git a/src/languages/sr-latn.js b/src/languages/sr-latn.js new file mode 100644 index 000000000..aa7d95cf9 --- /dev/null +++ b/src/languages/sr-latn.js @@ -0,0 +1,112 @@ +export default { + languageName: "Srpski", + checkEverySecond: "Proveri svakih {0} sekundi.", + "Avg.": "Prosečni ", + retriesDescription: "Maksimum pokušaja pre nego što se servis obeleži kao neaktivan i pošalje se obaveštenje.", + ignoreTLSError: "Ignoriši TLS/SSL greške za HTTPS veb stranice.", + upsideDownModeDescription: "Obrnite status. Ako je servis dostupan, onda je obeležen kao neaktivan.", + maxRedirectDescription: "Maksimani broj preusmerenja da se prate. Postavite na 0 da bi se isključila preusmerenja.", + acceptedStatusCodesDescription: "Odaberite statusne kodove koji se smatraju uspešnim odgovorom.", + passwordNotMatchMsg: "Ponovljena lozinka se ne poklapa.", + notificationDescription: "Molim Vas postavite obaveštenje za masmatrače da bise aktivirali.", + keywordDescription: "Pretraži ključnu reč u čistom html ili JSON odgovoru sa osetljivim velikim i malim slovima", + pauseDashboardHome: "Pauziraj", + deleteMonitorMsg: "Da li ste sigurni da želite da obrišete ovog posmatrača?", + deleteNotificationMsg: "Da li ste sigurni d aželite da uklonite ovo obaveštenje za sve posmatrače?", + resoverserverDescription: "Cloudflare je podrazumevani server. Možete promeniti server za raszrešavanje u bilo kom trenutku.", + rrtypeDescription: "Odaberite RR-Type koji želite da posmatrate", + pauseMonitorMsg: "Da li ste sigurni da želite da pauzirate?", + Settings: "Podešavanja", + Dashboard: "Komandna tabla", + "New Update": "Nova verzija", + Language: "Jezik", + Appearance: "Izgled", + Theme: "Tema", + General: "Opšte", + Version: "Verzija", + "Check Update On GitHub": "Proverite novu verziju na GitHub-u", + List: "Lista", + Add: "Dodaj", + "Add New Monitor": "Dodaj novog posmatrača", + "Quick Stats": "Brze statistike", + Up: "Aktivno", + Down: "Neaktivno", + Pending: "Nerešeno", + Unknown: "Nepoznato", + Pause: "Pauziraj", + Name: "Ime", + Status: "Status", + DateTime: "Datum i vreme", + Message: "Poruka", + "No important events": "Nema bitnih događaja", + Resume: "Nastavi", + Edit: "Izmeni", + Delete: "Ukloni", + Current: "Trenutno", + Uptime: "Vreme rada", + "Cert Exp.": "Istek sert.", + days: "dana", + day: "dan", + "-day": "-dana", + hour: "sat", + "-hour": "-sata", + Response: "Odgovor", + Ping: "Ping", + "Monitor Type": "Tip posmatrača", + Keyword: "Ključna reč", + "Friendly Name": "Prijateljsko ime", + URL: "URL", + Hostname: "Hostname", + Port: "Port", + "Heartbeat Interval": "Interval otkucaja srca", + Retries: "Pokušaji", + Advanced: "Napredno", + "Upside Down Mode": "Naopak mod", + "Max. Redirects": "Maks. preusmerenja", + "Accepted Status Codes": "Prihvaćeni statusni kodovi", + Save: "Sačuvaj", + Notifications: "Obaveštenja", + "Not available, please setup.": "Nije dostupno, molim Vas podesite.", + "Setup Notification": "Postavi obaveštenje", + Light: "Svetlo", + Dark: "Tamno", + Auto: "Automatsko", + "Theme - Heartbeat Bar": "Tema - Traka otkucaja srca", + Normal: "Normalno", + Bottom: "Dole", + None: "Isključeno", + Timezone: "Vremenska zona", + "Search Engine Visibility": "Vidljivost pretraživačima", + "Allow indexing": "Dozvoli indeksiranje", + "Discourage search engines from indexing site": "Odvraćajte pretraživače od indeksiranja sajta", + "Change Password": "Promeni lozinku", + "Current Password": "Trenutna lozinka", + "New Password": "Nova lozinka", + "Repeat New Password": "Ponovi novu lozinku", + "Update Password": "Izmeni lozinku", + "Disable Auth": "Isključi autentifikaciju", + "Enable Auth": "Uključi autentifikaciju", + Logout: "Odloguj se", + Leave: "Izađi", + "I understand, please disable": "Razumem, molim te isključi", + Confirm: "Potvrdi", + Yes: "Da", + No: "Ne", + Username: "Korisničko ime", + Password: "Lozinka", + "Remember me": "Zapamti me", + Login: "Uloguj se", + "No Monitors, please": "Bez posmatrača molim", + "add one": "dodaj jednog", + "Notification Type": "Tip obaveštenja", + Email: "E-pošta", + Test: "Test", + "Certificate Info": "Informacije sertifikata", + "Resolver Server": "Razrešivački server", + "Resource Record Type": "Tip zapisa resursa", + "Last Result": "Poslednji rezultat", + "Create your admin account": "Naprivi administratorski nalog", + "Repeat Password": "Ponovite lozinku", + respTime: "Vreme odg. (ms)", + notAvailableShort: "N/A" +} diff --git a/src/main.js b/src/main.js index 3b00f2401..ecbd0d060 100644 --- a/src/main.js +++ b/src/main.js @@ -30,6 +30,7 @@ import esEs from "./languages/es-ES"; import fr from "./languages/fr"; import ja from "./languages/ja"; import daDK from "./languages/da-DK"; +import srLatn from "./languages/sr-latn"; import svSE from "./languages/sv-SE"; import koKR from "./languages/ko-KR"; import ruRU from "./languages/ru-RU"; @@ -104,6 +105,7 @@ const languageList = { "fr": fr, "ja": ja, "da-DK": daDK, + "sr-latn": srLatn, "sv-SE": svSE, "ko-KR": koKR, "ru-RU": ruRU, diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index 85ca0066c..95f977dcd 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -189,6 +189,12 @@

Es ist für jemanden der eine externe Authentifizierung vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access.

Bitte mit Vorsicht nutzen.

+ + From 19a4d570ecb36f4177ffd6ceaee06b63786c4b32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Simi=C4=87?= Date: Fri, 3 Sep 2021 02:24:31 +0200 Subject: [PATCH 029/134] Fix word capitalization --- 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 679a2a7e6..c90dcc145 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -193,7 +193,7 @@ From 18616ee590075b6e71e187ba9960f97eee4ce4c7 Mon Sep 17 00:00:00 2001 From: Nelson Chan Date: Fri, 3 Sep 2021 12:05:49 +0800 Subject: [PATCH 030/134] Fix: Fix Notification "Test" btn styling --- src/assets/app.scss | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/assets/app.scss b/src/assets/app.scss index 41248a5c4..1f75e97fc 100644 --- a/src/assets/app.scss +++ b/src/assets/app.scss @@ -71,6 +71,14 @@ h2 { } } +.btn-warning { + color: white; + + &:hover, &:active, &:focus, &.active { + color: white; + } +} + .btn-info { color: white; @@ -186,6 +194,14 @@ h2 { color: white; } + .btn-warning { + color: $dark-font-color2; + + &:hover, &:active, &:focus, &.active { + color: $dark-font-color2; + } + } + .btn-close { box-shadow: none; filter: invert(1); From c15e6631ae8cf630adb71e95828892e4fe8f41b8 Mon Sep 17 00:00:00 2001 From: Adam Stachowicz Date: Fri, 3 Sep 2021 09:16:54 +0200 Subject: [PATCH 031/134] Update README.md Open Collective URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 68619fc13..bb6589c43 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ 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. -VPS is sponsored by Uptime Kuma sponsors on Open Collective! Thank you so much! +VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollective.com/uptime-kuma)! Thank you so much! ## ⭐ Features From d2151737c13d91b3189f1256a98defcb32cfbab7 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Fri, 3 Sep 2021 17:09:11 +0800 Subject: [PATCH 032/134] Update README.md --- src/languages/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/languages/README.md b/src/languages/README.md index 9ba99ada8..894cb6eaf 100644 --- a/src/languages/README.md +++ b/src/languages/README.md @@ -8,5 +8,11 @@ 8. Import your language file in `src/main.js` and add it to `languageList` constant. 9. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done. + + +One of good examples: +https://github.com/louislam/uptime-kuma/pull/316/files + + If you do not have programming skills, let me know in [Issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏 From e6e2b0ebf8acdf5759644e9fdb775c7024918347 Mon Sep 17 00:00:00 2001 From: J Posthuma Date: Fri, 3 Sep 2021 13:42:14 +0200 Subject: [PATCH 033/134] Update nl_NL.js --- src/languages/nl_NL.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/languages/nl_NL.js b/src/languages/nl_NL.js index b26c17eae..60c5089c9 100644 --- a/src/languages/nl_NL.js +++ b/src/languages/nl_NL.js @@ -24,7 +24,7 @@ export default { Theme: "Thema", General: "Algemeen", Version: "Versie", - "Check Update On GitHub": "Controleer update op GitHub", + "Check Update On GitHub": "Controleer voor updates op GitHub", List: "Lijst", Add: "Toevoegen", "Add New Monitor": "Nieuwe monitor toevoegen", @@ -109,4 +109,4 @@ export default { "Repeat Password": "Herhaal wachtwoord", respTime: "resp. tijd (ms)", notAvailableShort: "N.v.t." -} \ No newline at end of file +} From 5430da955ae150d70d7993f4ea62c9e80d818ef8 Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Fri, 3 Sep 2021 15:54:14 +0200 Subject: [PATCH 034/134] Small german language adjustments --- src/languages/de-DE.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index 7febaad7b..76c355a3b 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -70,7 +70,7 @@ export default { Timezone: "Zeitzone", "Search Engine Visibility": "Suchmaschinensichtbarkeit", "Allow indexing": "Indizierung zulassen", - "Discourage search engines from indexing site": "Halte Suchmaschinen von der Indexierung der Site ab", + "Discourage search engines from indexing site": "Halte Suchmaschinen von der Indexierung der Seite ab", "Change Password": "Passwort ändern", "Current Password": "Dezeitiges Passwort", "New Password": "Neues Passwort", @@ -96,10 +96,10 @@ export default { Email: "E-Mail", Test: "Test", "Certificate Info": "Zertifikatsinfo", - keywordDescription: "Suche nach einen Schlüsselwort in einer schlichten HTML oder JSON Ausgabe. Bitte beachte, es wird in der Groß-/Kleinschreibung unterschieden.", + 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?", deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?", - resoverserverDescription: "Cloudflare ist der Standardserver, dieser kann jederzeit geändern werden.", + 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", @@ -107,6 +107,6 @@ export default { "Create your admin account": "Erstelle dein Admin Konto", "Repeat Password": "Wiederhole das Passwort", "Resource Record Type": "Resource Record Type", - respTime: "Resp. Time (ms)", + respTime: "Antw. Zeit (ms)", notAvailableShort: "N/A" } From 6d8aa20fc64d2b7a3ec8b0a9221fb863a806563e Mon Sep 17 00:00:00 2001 From: dhfhfk Date: Fri, 3 Sep 2021 23:18:18 +0900 Subject: [PATCH 035/134] Add missing string for Korean confirmDisableAuth, new string --- src/languages/ko-KR.js | 4 ++-- src/pages/Settings.vue | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js index f913bbb97..8493193cb 100644 --- a/src/languages/ko-KR.js +++ b/src/languages/ko-KR.js @@ -88,7 +88,7 @@ export default { "Enable Auth": "인증 켜기", Logout: "로그아웃", Leave: "나가기", - "I understand, please disable": "기능에 대해 이해했어요.", + "I understand, please disable": "기능에 대해 이해했으니 꺼주세요.", Confirm: "확인", Yes: "확인", No: "취소", @@ -107,6 +107,6 @@ export default { "Last Result": "최근 결과", "Create your admin account": "관리자 계정 만들기", "Repeat Password": "비밀번호 재입력", - respTime: "Resp. Time (ms)", + respTime: "응답 시간 (ms)", notAvailableShort: "N/A" } diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index 8cf2d5195..705642137 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -207,6 +207,12 @@

To je za one koji imaju dodatu autentifikaciju ispred Uptime Kuma kao na primer Cloudflare Access.

Molim Vas koristite ovo sa pažnjom.

+ + From b98ec0c3d4efa70510538b5bed61c9abe6076db6 Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Sat, 4 Sep 2021 01:26:06 +0200 Subject: [PATCH 036/134] Added i18n keys if necessary for some languages --- src/languages/de-DE.js | 5 ++++- src/languages/en.js | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index 7a8cb52a4..0a0411dcb 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -106,5 +106,8 @@ export default { pauseMonitorMsg: "Bist du sicher das du den Monitor pausieren möchtest?", "Create your admin account": "Erstelle dein Admin Konto", "Repeat Password": "Wiederhole das Passwort", - "Resource Record Type": "Resource Record Type" + "Resource Record Type": "Resource Record Type", + "Import/Export Backup": "Import/Export Backup", + "Export": "Export", + "Import": "Import", } diff --git a/src/languages/en.js b/src/languages/en.js index 2781ba819..fbb70d7eb 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -106,5 +106,8 @@ export default { "Resource Record Type": "Resource Record Type", "Last Result": "Last Result", "Create your admin account": "Create your admin account", - "Repeat Password": "Repeat Password" + "Repeat Password": "Repeat Password", + "Import/Export Backup": "Import/Export Backup", + "Export": "Export", + "Import": "Import", } From dca5c59982f35a2dc29b1e61f25da198f28cfb30 Mon Sep 17 00:00:00 2001 From: Domenic Horner Date: Sat, 4 Sep 2021 18:24:43 +0800 Subject: [PATCH 037/134] Update lunasea body content Co-authored-by: Adam Stachowicz --- server/notification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/notification.js b/server/notification.js index 9417e733e..fb132cedb 100644 --- a/server/notification.js +++ b/server/notification.js @@ -492,7 +492,7 @@ class Notification { if (heartbeatJSON["status"] == 0) { let downdata = { "title": "UptimeKuma Alert: " + monitorJSON["name"], - "body": "[🔴 Down]" + heartbeatJSON["msg"] + "\nTime (UTC):" + heartbeatJSON["time"], + "body": "[🔴 Down] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"], } await axios.post(lunaseadevice, downdata) return okMsg; From 3bf380c684a902b8c5f5d1f6a76536fa0ca5c98d Mon Sep 17 00:00:00 2001 From: Domenic Horner Date: Sat, 4 Sep 2021 18:26:10 +0800 Subject: [PATCH 038/134] Update lunasea "up" body content Co-authored-by: Adam Stachowicz --- server/notification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/notification.js b/server/notification.js index fb132cedb..274f99cb1 100644 --- a/server/notification.js +++ b/server/notification.js @@ -501,7 +501,7 @@ class Notification { if (heartbeatJSON["status"] == 1) { let updata = { "title": "UptimeKuma Alert: " + monitorJSON["name"], - "body": "[✅ Up]" + heartbeatJSON["msg"] + "\nTime (UTC):" + heartbeatJSON["time"], + "body": "[✅ Up] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"], } await axios.post(lunaseadevice, updata) return okMsg; From d346afd33bb2e349c4f8f08fb3b6d201bab208e2 Mon Sep 17 00:00:00 2001 From: Domenic Horner Date: Sat, 4 Sep 2021 18:26:38 +0800 Subject: [PATCH 039/134] Update pushbullet up body Co-authored-by: Adam Stachowicz --- server/notification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/notification.js b/server/notification.js index 274f99cb1..fecc639c1 100644 --- a/server/notification.js +++ b/server/notification.js @@ -538,7 +538,7 @@ class Notification { let updata = { "type": "note", "title": "UptimeKuma Alert: " + monitorJSON["name"], - "body": "[✅ Up]" + heartbeatJSON["msg"] + "\nTime (UTC):" + heartbeatJSON["time"], + "body": "[✅ Up] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"], } await axios.post(pushbulletUrl, updata, config) } From 9c32adfb55bb629bf32b665afb1bece1c9e36da1 Mon Sep 17 00:00:00 2001 From: Domenic Horner Date: Sat, 4 Sep 2021 18:26:44 +0800 Subject: [PATCH 040/134] Update pushbullet down body Co-authored-by: Adam Stachowicz --- server/notification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/notification.js b/server/notification.js index fecc639c1..b9eba5a01 100644 --- a/server/notification.js +++ b/server/notification.js @@ -531,7 +531,7 @@ class Notification { let downdata = { "type": "note", "title": "UptimeKuma Alert: " + monitorJSON["name"], - "body": "[🔴 Down]" + heartbeatJSON["msg"] + "\nTime (UTC):" + heartbeatJSON["time"], + "body": "[🔴 Down] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"], } await axios.post(pushbulletUrl, downdata, config) } else if (heartbeatJSON["status"] == 1) { From 6ae279c7f387ffe79a9341eaa9c11e9257d2989f Mon Sep 17 00:00:00 2001 From: Domenic Horner Date: Sat, 4 Sep 2021 11:06:06 +0800 Subject: [PATCH 041/134] Move title generation to notification class --- server/model/monitor.js | 11 +---------- server/notification.js | 14 +++++++++++++- server/server.js | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/server/model/monitor.js b/server/model/monitor.js index 19f21d924..126d59b1e 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -270,18 +270,9 @@ class Monitor extends BeanModel { this.id, ]) - let text; - if (bean.status === UP) { - text = "✅ Up" - } else { - text = "🔴 Down" - } - - let msg = `[${this.name}] [${text}] ${bean.msg}`; - for (let notification of notificationList) { try { - await Notification.send(JSON.parse(notification.config), msg, await this.toJSON(), bean.toJSON()) + await Notification.send(JSON.parse(notification.config), this.name, await this.toJSON(), bean.toJSON()) } catch (e) { console.error("Cannot send notification to " + notification.name); console.log(e); diff --git a/server/notification.js b/server/notification.js index b9eba5a01..42c4627d8 100644 --- a/server/notification.js +++ b/server/notification.js @@ -15,9 +15,21 @@ class Notification { * @returns {Promise} Successful msg * Throw Error with fail msg */ - static async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + static async send(notification, monitorName = null, monitorJSON = null, heartbeatJSON = null) { let okMsg = "Sent Successfully. "; + let msg = `[${notification.name}] Testing`; + // heartbeatJSON is only defined if we're not testing + if(heartbeatJSON) { + let text; + if (heartbeatJSON["status"] === 1) { + text = "✅ Up" + } else { + text = "🔴 Down" + } + msg = `[${monitorName}] [${text}] ${heartbeatJSON["msg"]}`; + } + if (notification.type === "telegram") { try { await axios.get(`https://api.telegram.org/bot${notification.telegramBotToken}/sendMessage`, { diff --git a/server/server.js b/server/server.js index 39191de79..8f4516dc0 100644 --- a/server/server.js +++ b/server/server.js @@ -552,7 +552,7 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); try { checkLogin(socket) - let msg = await Notification.send(notification, notification.name + " Testing") + let msg = await Notification.send(notification) callback({ ok: true, From e9cd9be03abc36f0d6b03df38fcc726a7acfa057 Mon Sep 17 00:00:00 2001 From: Domenic Horner Date: Sat, 4 Sep 2021 11:09:34 +0800 Subject: [PATCH 042/134] Use constants for UP/DOWN through notifications class --- server/notification.js | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/server/notification.js b/server/notification.js index 42c4627d8..520d78dd9 100644 --- a/server/notification.js +++ b/server/notification.js @@ -4,6 +4,8 @@ const FormData = require("form-data"); const nodemailer = require("nodemailer"); const child_process = require("child_process"); +const { UP, DOWN } = require("../src/util"); + class Notification { /** @@ -22,7 +24,7 @@ class Notification { // heartbeatJSON is only defined if we're not testing if(heartbeatJSON) { let text; - if (heartbeatJSON["status"] === 1) { + if (heartbeatJSON["status"] === UP) { text = "✅ Up" } else { text = "🔴 Down" @@ -121,7 +123,7 @@ class Notification { } // If heartbeatJSON is not null, we go into the normal alerting loop. - if (heartbeatJSON["status"] == 0) { + if (heartbeatJSON["status"] == DOWN) { let discorddowndata = { username: discordDisplayName, embeds: [{ @@ -151,7 +153,7 @@ class Notification { await axios.post(notification.discordWebhookUrl, discorddowndata) return okMsg; - } else if (heartbeatJSON["status"] == 1) { + } else if (heartbeatJSON["status"] == UP) { let discordupdata = { username: discordDisplayName, embeds: [{ @@ -355,7 +357,7 @@ class Notification { const mattermostIconEmoji = notification.mattermosticonemo; const mattermostIconUrl = notification.mattermosticonurl; - if (heartbeatJSON["status"] == 0) { + if (heartbeatJSON["status"] == DOWN) { let mattermostdowndata = { username: mattermostUserName, text: "Uptime Kuma Alert", @@ -399,7 +401,7 @@ class Notification { mattermostdowndata ); return okMsg; - } else if (heartbeatJSON["status"] == 1) { + } else if (heartbeatJSON["status"] == UP) { let mattermostupdata = { username: mattermostUserName, text: "Uptime Kuma Alert", @@ -501,7 +503,7 @@ class Notification { return okMsg; } - if (heartbeatJSON["status"] == 0) { + if (heartbeatJSON["status"] == DOWN) { let downdata = { "title": "UptimeKuma Alert: " + monitorJSON["name"], "body": "[🔴 Down] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"], @@ -510,7 +512,7 @@ class Notification { return okMsg; } - if (heartbeatJSON["status"] == 1) { + if (heartbeatJSON["status"] == UP) { let updata = { "title": "UptimeKuma Alert: " + monitorJSON["name"], "body": "[✅ Up] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"], @@ -539,14 +541,14 @@ class Notification { "body": "Testing Successful.", } await axios.post(pushbulletUrl, testdata, config) - } else if (heartbeatJSON["status"] == 0) { + } else if (heartbeatJSON["status"] == DOWN) { let downdata = { "type": "note", "title": "UptimeKuma Alert: " + monitorJSON["name"], "body": "[🔴 Down] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"], } await axios.post(pushbulletUrl, downdata, config) - } else if (heartbeatJSON["status"] == 1) { + } else if (heartbeatJSON["status"] == UP) { let updata = { "type": "note", "title": "UptimeKuma Alert: " + monitorJSON["name"], @@ -578,7 +580,7 @@ class Notification { ] } await axios.post(lineAPIUrl, testMessage, config) - } else if (heartbeatJSON["status"] == 0) { + } else if (heartbeatJSON["status"] == DOWN) { let downMessage = { "to": notification.lineUserID, "messages": [ @@ -589,7 +591,7 @@ class Notification { ] } await axios.post(lineAPIUrl, downMessage, config) - } else if (heartbeatJSON["status"] == 1) { + } else if (heartbeatJSON["status"] == UP) { let upMessage = { "to": notification.lineUserID, "messages": [ From b0acda52f9b6b47aedb3ce1b05ea78d73c6b7be0 Mon Sep 17 00:00:00 2001 From: Domenic Horner Date: Sat, 4 Sep 2021 11:27:18 +0800 Subject: [PATCH 043/134] Add time to smtp body content --- server/notification.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/server/notification.js b/server/notification.js index 520d78dd9..beb1ff9d0 100644 --- a/server/notification.js +++ b/server/notification.js @@ -94,7 +94,7 @@ class Notification { } } else if (notification.type === "smtp") { - return await Notification.smtp(notification, msg) + return await Notification.smtp(notification, msg, heartbeatJSON) } else if (notification.type === "discord") { try { @@ -648,7 +648,7 @@ class Notification { await R.trash(bean) } - static async smtp(notification, msg) { + static async smtp(notification, msg, heartbeatJSON = null) { const config = { host: notification.smtpHost, @@ -666,12 +666,17 @@ class Notification { let transporter = nodemailer.createTransport(config); + let bodyTextContent = msg; + if(heartbeatJSON) { + bodyTextContent = `${msg}\nTime (UTC): ${heartbeatJSON["time"]}`; + } + // send mail with defined transport object await transporter.sendMail({ from: `"Uptime Kuma" <${notification.smtpFrom}>`, to: notification.smtpTo, subject: msg, - text: msg, + text: bodyTextContent, }); return "Sent Successfully."; From 0d87a6dfea184bb74a6f2253cd5126d7c52ea1d7 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sat, 4 Sep 2021 14:41:45 +0800 Subject: [PATCH 044/134] update vue to 3.2.8 --- package-lock.json | 867 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 435 insertions(+), 434 deletions(-) diff --git a/package-lock.json b/package-lock.json index 25be14778..dcf5077da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "uptime-kuma", - "version": "1.5.0", + "version": "1.5.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "uptime-kuma", - "version": "1.5.0", + "version": "1.5.2", "license": "MIT", "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.36", @@ -26,19 +26,19 @@ "express": "^4.17.1", "express-basic-auth": "^1.2.0", "form-data": "^4.0.0", - "http-graceful-shutdown": "^3.1.3", + "http-graceful-shutdown": "^3.1.4", "jsonwebtoken": "^8.5.1", "nodemailer": "^6.6.3", "password-hash": "^1.2.2", "prom-client": "^13.2.0", "prometheus-api-metrics": "^3.2.0", "redbean-node": "0.1.2", - "socket.io": "^4.1.3", - "socket.io-client": "^4.1.3", + "socket.io": "^4.2.0", + "socket.io-client": "^4.2.0", "sqlite3": "github:mapbox/node-sqlite3#593c9d", "tcp-ping": "^0.1.1", "v-pagination-3": "^0.1.6", - "vue": "^3.2.2", + "vue": "^3.2.8", "vue-chart-3": "^0.5.7", "vue-confirm-dialog": "^1.0.2", "vue-i18n": "^9.1.7", @@ -48,19 +48,19 @@ }, "devDependencies": { "@babel/eslint-parser": "^7.15.0", - "@types/bootstrap": "^5.1.1", - "@vitejs/plugin-legacy": "^1.5.1", - "@vitejs/plugin-vue": "^1.4.0", - "@vue/compiler-sfc": "^3.2.2", - "core-js": "^3.16.1", + "@types/bootstrap": "^5.1.2", + "@vitejs/plugin-legacy": "^1.5.2", + "@vitejs/plugin-vue": "^1.6.0", + "@vue/compiler-sfc": "^3.2.6", + "core-js": "^3.17.0", "dns2": "^2.0.1", "eslint": "^7.32.0", - "eslint-plugin-vue": "^7.16.0", - "sass": "^1.37.5", + "eslint-plugin-vue": "^7.17.0", + "sass": "^1.38.2", "stylelint": "^13.13.1", "stylelint-config-standard": "^22.0.0", - "typescript": "^4.3.5", - "vite": "^2.4.4" + "typescript": "^4.4.2", + "vite": "^2.5.3" }, "engines": { "node": "14.*" @@ -85,20 +85,20 @@ } }, "node_modules/@babel/core": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", - "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.4.tgz", + "integrity": "sha512-Lkcv9I4a8bgUI8LJOLM6IKv6hnz1KOju6KM1lceqVMKlKKqNRopYd2Pc9MgIurqvMJ6BooemrnJz8jlIiQIpsA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.0", - "@babel/helper-module-transforms": "^7.15.0", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.15.0", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -151,9 +151,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.0.tgz", - "integrity": "sha512-+gSPtjSBxOZz4Uh8Ggqu7HbfpB8cT1LwW0DnVVLZEJvzXauiD0Di3zszcBkRmfGGrLdYeHUwcflG7i3tr9kQlw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.4.tgz", + "integrity": "sha512-hPMIAmGNbmQzXJIo2P43Zj9UhRmGev5f9nqdBFOWNGDGh6XKmjby79woBvg6y0Jur6yRfQBneDbUQ8ZVc1krFw==", "dev": true, "dependencies": { "eslint-scope": "^5.1.1", @@ -169,12 +169,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", - "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", "dev": true, "dependencies": { - "@babel/types": "^7.15.0", + "@babel/types": "^7.15.4", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -192,9 +192,9 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", - "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.15.0", @@ -210,132 +210,132 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", - "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", "dev": true, "dependencies": { - "@babel/types": "^7.15.0" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", - "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz", + "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.0", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", "@babel/helper-validator-identifier": "^7.14.9", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", - "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.15.0", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", "dev": true, "dependencies": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" @@ -359,14 +359,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", - "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", "dev": true, "dependencies": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" @@ -458,9 +458,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", - "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.4.tgz", + "integrity": "sha512-xmzz+7fRpjrvDUj+GV7zfz/R3gSK2cOxGlazaXooxspCr539cbTXJKvBJzSVI2pPhcRGquoOtaIkKCsHQUiO3w==", "bin": { "parser": "bin/babel-parser.js" }, @@ -469,23 +469,23 @@ } }, "node_modules/@babel/standalone": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.15.3.tgz", - "integrity": "sha512-Bst2YWEyQ2ROyO0+jxPVnnkSmUh44/x54+LSbe5M4N5LGfOkxpajEUKVE4ndXtIVrLlHCyuiqCPwv3eC1ItnCg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.15.4.tgz", + "integrity": "sha512-UO0QCTFjX5NSuwX/i8+/pesmRPoRTtf46Cpn8VHcXvNinEr2lxqe8Ix10TfU/UK5qsaOrcKk24We8wH1G0nTZA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" @@ -504,18 +504,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", - "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.15.0", - "@babel/types": "^7.15.0", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -545,9 +545,9 @@ } }, "node_modules/@babel/types": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", - "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", + "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", "dependencies": { "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" @@ -817,9 +817,9 @@ } }, "node_modules/@popperjs/core": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz", - "integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.1.tgz", + "integrity": "sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -870,9 +870,9 @@ } }, "node_modules/@types/bootstrap": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.2.tgz", - "integrity": "sha512-dSQvMi2dMyNwJU6LZjP0pimuBowsMUvGScYdfqqeiDUoj9TxXZCpfu0cTl94U0Zvw/tdH9j/9ToOhi4LKNLZhg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.4.tgz", + "integrity": "sha512-VAY+o6sCKrJ7Xix/lugdvQz0PpOn7Go+fQzCXOZvIdp7E/TDaiJddInVhNB/84bk9NX6uuKFSfl2pqslNYH9aA==", "dev": true, "dependencies": { "@popperjs/core": "^2.9.2", @@ -1013,9 +1013,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.7.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.8.tgz", - "integrity": "sha512-8upnoQU0OPzbIkm+ZMM0zCeFCkw2s3mS0IWdx0+AAaWqm4fkBb0UJp8Edl7FVKRamYbpJC/aVsHpKWBIbiC7Zg==" + "version": "16.7.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz", + "integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -1061,9 +1061,9 @@ "dev": true }, "node_modules/@vitejs/plugin-legacy": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.5.1.tgz", - "integrity": "sha512-g+0iy0X3NJRUSKZK+OCeSxNWnCuuE/6lsmr2WLWPOEt1vp6LdfHuNCYRooCm6s0ccTZ/SiumVk8vt9DWSYs+8A==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.5.2.tgz", + "integrity": "sha512-b1CaWY/wi7gQZnZaxH+ujPTPb91bEPgnnk7l0WIwxoQtW5UC5MQywRcAbFX+Ise62exXctOMBtsnXKJw2KajXw==", "dev": true, "dependencies": { "@babel/standalone": "^7.14.9", @@ -1092,40 +1092,40 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.6.tgz", - "integrity": "sha512-vbwnz7+OhtLO5p5i630fTuQCL+MlUpEMTKHuX+RfetQ+3pFCkItt2JUH+9yMaBG2Hkz6av+T9mwN/acvtIwpbw==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.8.tgz", + "integrity": "sha512-Sx8qJ030+QM/NakUrkQuUGCeDEb+0d0AgFOl5W4qRvR6e+YgLnW2ew0jREf4T1hak9Fdk8Edl67StECHrhEuew==", "dependencies": { "@babel/parser": "^7.15.0", "@babel/types": "^7.15.0", - "@vue/shared": "3.2.6", + "@vue/shared": "3.2.8", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.6.tgz", - "integrity": "sha512-+a/3oBAzFIXhHt8L5IHJOTP4a5egzvpXYyi13jR7CUYOR1S+Zzv7vBWKYBnKyJLwnrxTZnTQVjeHCgJq743XKg==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.8.tgz", + "integrity": "sha512-nxBW6k8FMWQ74294CRbqR+iEJRO5vIjx85I3YCOyZFD6FsDHyFL60g76TcJzucp+F2XXIDaYz+A+F4gQlDatjw==", "dependencies": { - "@vue/compiler-core": "3.2.6", - "@vue/shared": "3.2.6" + "@vue/compiler-core": "3.2.8", + "@vue/shared": "3.2.8" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.6.tgz", - "integrity": "sha512-Ariz1eDsf+2fw6oWXVwnBNtfKHav72RjlWXpEgozYBLnfRPzP+7jhJRw4Nq0OjSsLx2HqjF3QX7HutTjYB0/eA==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.8.tgz", + "integrity": "sha512-XClueQAXoWtN2EToKgfYH9FCL70Ac4bxx6OZFZzxYSg1bei8IB9srJP1UOfnJb2IpnM1heikAz1dp1HI1wHcyQ==", "dev": true, "dependencies": { "@babel/parser": "^7.15.0", "@babel/types": "^7.15.0", "@types/estree": "^0.0.48", - "@vue/compiler-core": "3.2.6", - "@vue/compiler-dom": "3.2.6", - "@vue/compiler-ssr": "3.2.6", - "@vue/ref-transform": "3.2.6", - "@vue/shared": "3.2.6", + "@vue/compiler-core": "3.2.8", + "@vue/compiler-dom": "3.2.8", + "@vue/compiler-ssr": "3.2.8", + "@vue/ref-transform": "3.2.8", + "@vue/shared": "3.2.8", "consolidate": "^0.16.0", "estree-walker": "^2.0.2", "hash-sum": "^2.0.0", @@ -1139,13 +1139,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.6.tgz", - "integrity": "sha512-A7IKRKHSyPnTC4w1FxHkjzoyjXInsXkcs/oX22nBQ+6AWlXj2Tt1le96CWPOXy5vYlsTYkF1IgfBaKIdeN/39g==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.8.tgz", + "integrity": "sha512-QqyiFRiIl55W0abDNQ6cNG/7iIfBHmbXVtssUAjX3IlI87ELeT0xackmrCyTSnfIX12ixljg9AN0COIZwlvt5A==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.2.6", - "@vue/shared": "3.2.6" + "@vue/compiler-dom": "3.2.8", + "@vue/shared": "3.2.8" } }, "node_modules/@vue/devtools-api": { @@ -1154,49 +1154,49 @@ "integrity": "sha512-quBx4Jjpexo6KDiNUGFr/zF/2A4srKM9S9v2uHgMXSU//hjgq1eGzqkIFql8T9gfX5ZaVOUzYBP3jIdIR3PKIA==" }, "node_modules/@vue/reactivity": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.6.tgz", - "integrity": "sha512-8vIDD2wpCnYisNNZjmcIj+Rixn0uhZNY3G1vzlgdVdLygeRSuFjkmnZk6WwvGzUWpKfnG0e/NUySM3mVi59hAA==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.8.tgz", + "integrity": "sha512-/Hj3Uz28SG+xB5SDWPOXUs0emvHkq82EmTgk44/plTVFeswCZ3i3Hd7WmsrPT4rGajlDKd5uqMmW0ith1ED0FA==", "dependencies": { - "@vue/shared": "3.2.6" + "@vue/shared": "3.2.8" } }, "node_modules/@vue/ref-transform": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.6.tgz", - "integrity": "sha512-ie39+Y4nbirDLvH+WEq6Eo/l3n3mFATayqR+kEMSphrtMW6Uh/eEMx1Gk2Jnf82zmj3VLRq7dnmPx72JLcBYkQ==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.8.tgz", + "integrity": "sha512-9LdADd4JM3klt+b2qNT8a7b7JvBETNBy2Btv5rDzyPrAVS4Vrw+1WWay6gZBgnxfJ9TPSvG8f/9zu6gNGHmJLA==", "dev": true, "dependencies": { "@babel/parser": "^7.15.0", - "@vue/compiler-core": "3.2.6", - "@vue/shared": "3.2.6", + "@vue/compiler-core": "3.2.8", + "@vue/shared": "3.2.8", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "node_modules/@vue/runtime-core": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.6.tgz", - "integrity": "sha512-3mqtgpj/YSGFxtvTufSERRApo92B16JNNxz9p+5eG6PPuqTmuRJz214MqhKBEgLEAIQ6R6YCbd83ZDtjQnyw2g==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.8.tgz", + "integrity": "sha512-hwzXLGw1njBEY5JSyRXIIdCtzMFFF6F38WcKMmoIE3p7da30jEbWt8EwwrBomjT8ZbqzElOGlewBcnXNOiiIUg==", "dependencies": { - "@vue/reactivity": "3.2.6", - "@vue/shared": "3.2.6" + "@vue/reactivity": "3.2.8", + "@vue/shared": "3.2.8" } }, "node_modules/@vue/runtime-dom": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.6.tgz", - "integrity": "sha512-fq33urnP0BNCGm2O3KCzkJlKIHI80C94HJ4qDZbjsTtxyOn5IHqwKSqXVN3RQvO6epcQH+sWS+JNwcNDPzoasg==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.8.tgz", + "integrity": "sha512-A/aRrlGLJ5y4Z7eNbnO/xHwx2RiPijQo7D3OIwESroG3HNP+dpuoqamajo5TXS9ZGjbMOih82COoe7xb9P4BZw==", "dependencies": { - "@vue/runtime-core": "3.2.6", - "@vue/shared": "3.2.6", + "@vue/runtime-core": "3.2.8", + "@vue/shared": "3.2.8", "csstype": "^2.6.8" } }, "node_modules/@vue/shared": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.6.tgz", - "integrity": "sha512-uwX0Qs2e6kdF+WmxwuxJxOnKs/wEkMArtYpHSm7W+VY/23Tl8syMRyjnzEeXrNCAP0/8HZxEGkHJsjPEDNRuHw==" + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.8.tgz", + "integrity": "sha512-E2DQQnG7Qr4GwTs3GlfPPlHliGVADoufTnhpwfoViw7JlyLMmYtjfnTwM6nXAwvSJWiF7D+7AxpnWBBT3VWo6Q==" }, "node_modules/abbrev": { "version": "1.1.1", @@ -1315,9 +1315,9 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "node_modules/are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -2022,9 +2022,9 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "node_modules/core-js": { - "version": "3.16.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.4.tgz", - "integrity": "sha512-Tq4GVE6XCjE+hcyW6hPy0ofN3hwtLudz5ZRdrlCnsnD/xkm/PWQRudzYHiKgZKUcefV6Q57fhDHjZHJP5dpfSg==", + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.17.2.tgz", + "integrity": "sha512-XkbXqhcXeMHPRk2ItS+zQYliAMilea2euoMsnpRRdDad6b2VY6CQQcwz1K8AnWesfw4p165RzY0bTnr3UrbYiA==", "dev": true, "hasInstallScript": true, "funding": { @@ -2033,9 +2033,9 @@ } }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cors": { "version": "2.8.5", @@ -2313,9 +2313,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron-to-chromium": { - "version": "1.3.824", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.824.tgz", - "integrity": "sha512-Fk+5aD0HDi9i9ZKt9n2VPOZO1dQy7PV++hz2wJ/KIn+CvVfu4fny39squHtyVDPuHNuoJGAZIbuReEklqYIqfA==", + "version": "1.3.830", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.830.tgz", + "integrity": "sha512-gBN7wNAxV5vl1430dG+XRcQhD4pIeYeak6p6rjdCtlz5wWNwDad8jwvphe5oi1chL5MV6RNRikfffBBiFuj+rQ==", "dev": true }, "node_modules/emoji-regex": { @@ -2431,9 +2431,9 @@ } }, "node_modules/esbuild": { - "version": "0.12.24", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.24.tgz", - "integrity": "sha512-C0ibY+HsXzYB6L/pLWEiWjMpghKsIc58Q5yumARwBQsHl9DXPakW+5NI/Y9w4YXiz0PEP6XTGTT/OV4Nnsmb4A==", + "version": "0.12.25", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.25.tgz", + "integrity": "sha512-woie0PosbRSoN8gQytrdCzUbS2ByKgO8nD1xCZkEup3D9q92miCze4PqEI9TZDYAuwn6CruEnQpJxgTRWdooAg==", "dev": true, "hasInstallScript": true, "bin": { @@ -2960,9 +2960,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.2.tgz", - "integrity": "sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", + "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==", "funding": [ { "type": "individual", @@ -3922,9 +3922,9 @@ } }, "node_modules/knex": { - "version": "0.95.10", - "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.10.tgz", - "integrity": "sha512-I60A8TXcMdeJlE6h7DSgEYyY37S7kgLObz1qlJ7QvPMD6vnKO5dtuLEht5pMia9Qf5BomqVgkWCdVTqcC/ImOA==", + "version": "0.95.11", + "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.11.tgz", + "integrity": "sha512-grDetD91O8VoQVCFqeWTgkzdq5406W6rggF/lK1hHuwzmjDs/0m9KxyncGdZbklTi7aUgHvw3+Cfy4x7FvpdaQ==", "dependencies": { "colorette": "1.2.1", "commander": "^7.1.0", @@ -5789,9 +5789,9 @@ } }, "node_modules/redbean-node/node_modules/@types/node": { - "version": "14.17.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.12.tgz", - "integrity": "sha512-vhUqgjJR1qxwTWV5Ps5txuy2XMdf7Fw+OrdChRboy8BmWUPkckOhphaohzFG6b8DW7CrxaBMdrdJ47SYFq1okw==" + "version": "14.17.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.14.tgz", + "integrity": "sha512-rsAj2u8Xkqfc332iXV12SqIsjVi07H479bOP4q94NAcjzmAvapumEhuVIt53koEf7JFrpjgNKjBga5Pnn/GL8A==" }, "node_modules/redent": { "version": "3.0.0", @@ -6032,9 +6032,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.38.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.38.2.tgz", - "integrity": "sha512-Bz1fG6qiyF0FX6m/I+VxtdVKz1Dfmg/e9kfDy2PhWOkq3T384q2KxwIfP0fXpeI+EyyETdOauH+cRHQDFASllA==", + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.39.0.tgz", + "integrity": "sha512-F4o+RhJkNOIG0b6QudYU8c78ZADKZjKDk5cyrf8XTKWfrgbtyVVXImFstJrc+1pkQDCggyidIOytq6gS4gCCZg==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0" @@ -7220,6 +7220,12 @@ "extsprintf": "^1.2.0" } }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, "node_modules/vfile": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", @@ -7251,9 +7257,9 @@ } }, "node_modules/vite": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.5.2.tgz", - "integrity": "sha512-JK5uhiVyMqHiAJbgBa8rCvpP8bEhAE9dKDv1gCmP+EUP2FSPmEeW3WXlCXauPB3MDa8behPW+ntyNXqnGaxslg==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.5.3.tgz", + "integrity": "sha512-1wMDnjflvtTTkMov8O/Xb5+w1/VW/Gw8oCf8f6dqgHn8lMOEqq0SaPtFEQeikFcOKCfSbiU0nEi0LDIx6DNsaQ==", "dev": true, "dependencies": { "esbuild": "^0.12.17", @@ -7272,19 +7278,19 @@ } }, "node_modules/vue": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.6.tgz", - "integrity": "sha512-Zlb3LMemQS3Xxa6xPsecu45bNjr1hxO8Bh5FUmE0Dr6Ot0znZBKiM47rK6O7FTcakxOnvVN+NTXWJF6u8ajpCQ==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.8.tgz", + "integrity": "sha512-x7lwdnOSkceHQUXRVVHBaZzcp6v7M2CYtSZH75zZaT1mTjB4plC4KZHKP/5jAvdqOLBHZGwDSMkWXm3YbAufrA==", "dependencies": { - "@vue/compiler-dom": "3.2.6", - "@vue/runtime-dom": "3.2.6", - "@vue/shared": "3.2.6" + "@vue/compiler-dom": "3.2.8", + "@vue/runtime-dom": "3.2.8", + "@vue/shared": "3.2.8" } }, "node_modules/vue-chart-3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/vue-chart-3/-/vue-chart-3-0.5.7.tgz", - "integrity": "sha512-BccfPv2rodY6IOppYHvMluVmIJE1CHfp5uW2DXrHrm1kIzaafLwpQ5SwdrxuCevn/QhKoi7azzcxwRcoWbX9hg==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/vue-chart-3/-/vue-chart-3-0.5.8.tgz", + "integrity": "sha512-VJEBTdMgWOaYqekXtz4LVBIeYyIx3qDlQnFyY4Ao1GwizokYZBycCeRN3oKDcYbbZi5yxYqTy6+Tm+m+SOPUPA==", "dependencies": { "@vue/runtime-core": "latest", "@vue/runtime-dom": "latest", @@ -7560,20 +7566,20 @@ "dev": true }, "@babel/core": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", - "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.4.tgz", + "integrity": "sha512-Lkcv9I4a8bgUI8LJOLM6IKv6hnz1KOju6KM1lceqVMKlKKqNRopYd2Pc9MgIurqvMJ6BooemrnJz8jlIiQIpsA==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.0", - "@babel/helper-module-transforms": "^7.15.0", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.15.0", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -7609,9 +7615,9 @@ } }, "@babel/eslint-parser": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.0.tgz", - "integrity": "sha512-+gSPtjSBxOZz4Uh8Ggqu7HbfpB8cT1LwW0DnVVLZEJvzXauiD0Di3zszcBkRmfGGrLdYeHUwcflG7i3tr9kQlw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.4.tgz", + "integrity": "sha512-hPMIAmGNbmQzXJIo2P43Zj9UhRmGev5f9nqdBFOWNGDGh6XKmjby79woBvg6y0Jur6yRfQBneDbUQ8ZVc1krFw==", "dev": true, "requires": { "eslint-scope": "^5.1.1", @@ -7620,12 +7626,12 @@ } }, "@babel/generator": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", - "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", "dev": true, "requires": { - "@babel/types": "^7.15.0", + "@babel/types": "^7.15.4", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -7639,9 +7645,9 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", - "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", "dev": true, "requires": { "@babel/compat-data": "^7.15.0", @@ -7651,105 +7657,105 @@ } }, "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", - "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", "dev": true, "requires": { - "@babel/types": "^7.15.0" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-transforms": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", - "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz", + "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.0", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", "@babel/helper-validator-identifier": "^7.14.9", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-replace-supers": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", - "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.15.0", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", "dev": true, "requires": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.15.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-validator-identifier": { @@ -7764,14 +7770,14 @@ "dev": true }, "@babel/helpers": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", - "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", "dev": true, "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/highlight": { @@ -7844,25 +7850,25 @@ } }, "@babel/parser": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", - "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.4.tgz", + "integrity": "sha512-xmzz+7fRpjrvDUj+GV7zfz/R3gSK2cOxGlazaXooxspCr539cbTXJKvBJzSVI2pPhcRGquoOtaIkKCsHQUiO3w==" }, "@babel/standalone": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.15.3.tgz", - "integrity": "sha512-Bst2YWEyQ2ROyO0+jxPVnnkSmUh44/x54+LSbe5M4N5LGfOkxpajEUKVE4ndXtIVrLlHCyuiqCPwv3eC1ItnCg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.15.4.tgz", + "integrity": "sha512-UO0QCTFjX5NSuwX/i8+/pesmRPoRTtf46Cpn8VHcXvNinEr2lxqe8Ix10TfU/UK5qsaOrcKk24We8wH1G0nTZA==", "dev": true }, "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" }, "dependencies": { "@babel/code-frame": { @@ -7877,18 +7883,18 @@ } }, "@babel/traverse": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", - "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.15.0", - "@babel/types": "^7.15.0", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -7911,9 +7917,9 @@ } }, "@babel/types": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", - "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", + "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", "requires": { "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" @@ -7968,8 +7974,7 @@ "@fortawesome/vue-fontawesome": { "version": "3.0.0-4", "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.0-4.tgz", - "integrity": "sha512-dQVhhMRcUPCb0aqk5ohm0KGk5OJ7wFZ9aYapLzJB3Z+xs7LhkRWLTb87reelUAG5PFDjutDAXuloT9hi6cz72A==", - "requires": {} + "integrity": "sha512-dQVhhMRcUPCb0aqk5ohm0KGk5OJ7wFZ9aYapLzJB3Z+xs7LhkRWLTb87reelUAG5PFDjutDAXuloT9hi6cz72A==" }, "@humanwhocodes/config-array": { "version": "0.5.0", @@ -8115,9 +8120,9 @@ } }, "@popperjs/core": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz", - "integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ==" + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.1.tgz", + "integrity": "sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw==" }, "@stylelint/postcss-css-in-js": { "version": "0.37.2", @@ -8156,9 +8161,9 @@ } }, "@types/bootstrap": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.2.tgz", - "integrity": "sha512-dSQvMi2dMyNwJU6LZjP0pimuBowsMUvGScYdfqqeiDUoj9TxXZCpfu0cTl94U0Zvw/tdH9j/9ToOhi4LKNLZhg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.4.tgz", + "integrity": "sha512-VAY+o6sCKrJ7Xix/lugdvQz0PpOn7Go+fQzCXOZvIdp7E/TDaiJddInVhNB/84bk9NX6uuKFSfl2pqslNYH9aA==", "dev": true, "requires": { "@popperjs/core": "^2.9.2", @@ -8299,9 +8304,9 @@ "dev": true }, "@types/node": { - "version": "16.7.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.8.tgz", - "integrity": "sha512-8upnoQU0OPzbIkm+ZMM0zCeFCkw2s3mS0IWdx0+AAaWqm4fkBb0UJp8Edl7FVKRamYbpJC/aVsHpKWBIbiC7Zg==" + "version": "16.7.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz", + "integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -8347,9 +8352,9 @@ "dev": true }, "@vitejs/plugin-legacy": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.5.1.tgz", - "integrity": "sha512-g+0iy0X3NJRUSKZK+OCeSxNWnCuuE/6lsmr2WLWPOEt1vp6LdfHuNCYRooCm6s0ccTZ/SiumVk8vt9DWSYs+8A==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.5.2.tgz", + "integrity": "sha512-b1CaWY/wi7gQZnZaxH+ujPTPb91bEPgnnk7l0WIwxoQtW5UC5MQywRcAbFX+Ise62exXctOMBtsnXKJw2KajXw==", "dev": true, "requires": { "@babel/standalone": "^7.14.9", @@ -8363,44 +8368,43 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-1.6.0.tgz", "integrity": "sha512-n3i8htn8pTg9M+kM3cnEfsPZx/6ngInlTroth6fA1LQTJq5aTVQ8ggaE5pPoAy9vCgHPtcaXMzwpldhqRAkebQ==", - "dev": true, - "requires": {} + "dev": true }, "@vue/compiler-core": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.6.tgz", - "integrity": "sha512-vbwnz7+OhtLO5p5i630fTuQCL+MlUpEMTKHuX+RfetQ+3pFCkItt2JUH+9yMaBG2Hkz6av+T9mwN/acvtIwpbw==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.8.tgz", + "integrity": "sha512-Sx8qJ030+QM/NakUrkQuUGCeDEb+0d0AgFOl5W4qRvR6e+YgLnW2ew0jREf4T1hak9Fdk8Edl67StECHrhEuew==", "requires": { "@babel/parser": "^7.15.0", "@babel/types": "^7.15.0", - "@vue/shared": "3.2.6", + "@vue/shared": "3.2.8", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.6.tgz", - "integrity": "sha512-+a/3oBAzFIXhHt8L5IHJOTP4a5egzvpXYyi13jR7CUYOR1S+Zzv7vBWKYBnKyJLwnrxTZnTQVjeHCgJq743XKg==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.8.tgz", + "integrity": "sha512-nxBW6k8FMWQ74294CRbqR+iEJRO5vIjx85I3YCOyZFD6FsDHyFL60g76TcJzucp+F2XXIDaYz+A+F4gQlDatjw==", "requires": { - "@vue/compiler-core": "3.2.6", - "@vue/shared": "3.2.6" + "@vue/compiler-core": "3.2.8", + "@vue/shared": "3.2.8" } }, "@vue/compiler-sfc": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.6.tgz", - "integrity": "sha512-Ariz1eDsf+2fw6oWXVwnBNtfKHav72RjlWXpEgozYBLnfRPzP+7jhJRw4Nq0OjSsLx2HqjF3QX7HutTjYB0/eA==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.8.tgz", + "integrity": "sha512-XClueQAXoWtN2EToKgfYH9FCL70Ac4bxx6OZFZzxYSg1bei8IB9srJP1UOfnJb2IpnM1heikAz1dp1HI1wHcyQ==", "dev": true, "requires": { "@babel/parser": "^7.15.0", "@babel/types": "^7.15.0", "@types/estree": "^0.0.48", - "@vue/compiler-core": "3.2.6", - "@vue/compiler-dom": "3.2.6", - "@vue/compiler-ssr": "3.2.6", - "@vue/ref-transform": "3.2.6", - "@vue/shared": "3.2.6", + "@vue/compiler-core": "3.2.8", + "@vue/compiler-dom": "3.2.8", + "@vue/compiler-ssr": "3.2.8", + "@vue/ref-transform": "3.2.8", + "@vue/shared": "3.2.8", "consolidate": "^0.16.0", "estree-walker": "^2.0.2", "hash-sum": "^2.0.0", @@ -8414,13 +8418,13 @@ } }, "@vue/compiler-ssr": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.6.tgz", - "integrity": "sha512-A7IKRKHSyPnTC4w1FxHkjzoyjXInsXkcs/oX22nBQ+6AWlXj2Tt1le96CWPOXy5vYlsTYkF1IgfBaKIdeN/39g==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.8.tgz", + "integrity": "sha512-QqyiFRiIl55W0abDNQ6cNG/7iIfBHmbXVtssUAjX3IlI87ELeT0xackmrCyTSnfIX12ixljg9AN0COIZwlvt5A==", "dev": true, "requires": { - "@vue/compiler-dom": "3.2.6", - "@vue/shared": "3.2.6" + "@vue/compiler-dom": "3.2.8", + "@vue/shared": "3.2.8" } }, "@vue/devtools-api": { @@ -8429,49 +8433,49 @@ "integrity": "sha512-quBx4Jjpexo6KDiNUGFr/zF/2A4srKM9S9v2uHgMXSU//hjgq1eGzqkIFql8T9gfX5ZaVOUzYBP3jIdIR3PKIA==" }, "@vue/reactivity": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.6.tgz", - "integrity": "sha512-8vIDD2wpCnYisNNZjmcIj+Rixn0uhZNY3G1vzlgdVdLygeRSuFjkmnZk6WwvGzUWpKfnG0e/NUySM3mVi59hAA==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.8.tgz", + "integrity": "sha512-/Hj3Uz28SG+xB5SDWPOXUs0emvHkq82EmTgk44/plTVFeswCZ3i3Hd7WmsrPT4rGajlDKd5uqMmW0ith1ED0FA==", "requires": { - "@vue/shared": "3.2.6" + "@vue/shared": "3.2.8" } }, "@vue/ref-transform": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.6.tgz", - "integrity": "sha512-ie39+Y4nbirDLvH+WEq6Eo/l3n3mFATayqR+kEMSphrtMW6Uh/eEMx1Gk2Jnf82zmj3VLRq7dnmPx72JLcBYkQ==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.8.tgz", + "integrity": "sha512-9LdADd4JM3klt+b2qNT8a7b7JvBETNBy2Btv5rDzyPrAVS4Vrw+1WWay6gZBgnxfJ9TPSvG8f/9zu6gNGHmJLA==", "dev": true, "requires": { "@babel/parser": "^7.15.0", - "@vue/compiler-core": "3.2.6", - "@vue/shared": "3.2.6", + "@vue/compiler-core": "3.2.8", + "@vue/shared": "3.2.8", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "@vue/runtime-core": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.6.tgz", - "integrity": "sha512-3mqtgpj/YSGFxtvTufSERRApo92B16JNNxz9p+5eG6PPuqTmuRJz214MqhKBEgLEAIQ6R6YCbd83ZDtjQnyw2g==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.8.tgz", + "integrity": "sha512-hwzXLGw1njBEY5JSyRXIIdCtzMFFF6F38WcKMmoIE3p7da30jEbWt8EwwrBomjT8ZbqzElOGlewBcnXNOiiIUg==", "requires": { - "@vue/reactivity": "3.2.6", - "@vue/shared": "3.2.6" + "@vue/reactivity": "3.2.8", + "@vue/shared": "3.2.8" } }, "@vue/runtime-dom": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.6.tgz", - "integrity": "sha512-fq33urnP0BNCGm2O3KCzkJlKIHI80C94HJ4qDZbjsTtxyOn5IHqwKSqXVN3RQvO6epcQH+sWS+JNwcNDPzoasg==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.8.tgz", + "integrity": "sha512-A/aRrlGLJ5y4Z7eNbnO/xHwx2RiPijQo7D3OIwESroG3HNP+dpuoqamajo5TXS9ZGjbMOih82COoe7xb9P4BZw==", "requires": { - "@vue/runtime-core": "3.2.6", - "@vue/shared": "3.2.6", + "@vue/runtime-core": "3.2.8", + "@vue/shared": "3.2.8", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.6.tgz", - "integrity": "sha512-uwX0Qs2e6kdF+WmxwuxJxOnKs/wEkMArtYpHSm7W+VY/23Tl8syMRyjnzEeXrNCAP0/8HZxEGkHJsjPEDNRuHw==" + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.8.tgz", + "integrity": "sha512-E2DQQnG7Qr4GwTs3GlfPPlHliGVADoufTnhpwfoViw7JlyLMmYtjfnTwM6nXAwvSJWiF7D+7AxpnWBBT3VWo6Q==" }, "abbrev": { "version": "1.1.1", @@ -8497,8 +8501,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "agent-base": { "version": "6.0.2", @@ -8557,9 +8560,9 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -8853,8 +8856,7 @@ "bootstrap": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.0.tgz", - "integrity": "sha512-bs74WNI9BgBo3cEovmdMHikSKoXnDgA6VQjJ7TyTotU6L7d41ZyCEEelPwkYEzsG/Zjv3ie9IE3EMAje0W9Xew==", - "requires": {} + "integrity": "sha512-bs74WNI9BgBo3cEovmdMHikSKoXnDgA6VQjJ7TyTotU6L7d41ZyCEEelPwkYEzsG/Zjv3ie9IE3EMAje0W9Xew==" }, "brace-expansion": { "version": "1.1.11", @@ -8968,8 +8970,7 @@ "chartjs-adapter-dayjs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/chartjs-adapter-dayjs/-/chartjs-adapter-dayjs-1.0.0.tgz", - "integrity": "sha512-EnbVqTJGFKLpg1TROLdCEufrzbmIa2oeLGx8O2Wdjw2EoMudoOo9+YFu+6CM0Z0hQ/v3yq/e/Y6efQMu22n8Jg==", - "requires": {} + "integrity": "sha512-EnbVqTJGFKLpg1TROLdCEufrzbmIa2oeLGx8O2Wdjw2EoMudoOo9+YFu+6CM0Z0hQ/v3yq/e/Y6efQMu22n8Jg==" }, "chokidar": { "version": "3.5.2", @@ -9107,15 +9108,15 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "core-js": { - "version": "3.16.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.4.tgz", - "integrity": "sha512-Tq4GVE6XCjE+hcyW6hPy0ofN3hwtLudz5ZRdrlCnsnD/xkm/PWQRudzYHiKgZKUcefV6Q57fhDHjZHJP5dpfSg==", + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.17.2.tgz", + "integrity": "sha512-XkbXqhcXeMHPRk2ItS+zQYliAMilea2euoMsnpRRdDad6b2VY6CQQcwz1K8AnWesfw4p165RzY0bTnr3UrbYiA==", "dev": true }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cors": { "version": "2.8.5", @@ -9335,9 +9336,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.824", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.824.tgz", - "integrity": "sha512-Fk+5aD0HDi9i9ZKt9n2VPOZO1dQy7PV++hz2wJ/KIn+CvVfu4fny39squHtyVDPuHNuoJGAZIbuReEklqYIqfA==", + "version": "1.3.830", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.830.tgz", + "integrity": "sha512-gBN7wNAxV5vl1430dG+XRcQhD4pIeYeak6p6rjdCtlz5wWNwDad8jwvphe5oi1chL5MV6RNRikfffBBiFuj+rQ==", "dev": true }, "emoji-regex": { @@ -9434,9 +9435,9 @@ } }, "esbuild": { - "version": "0.12.24", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.24.tgz", - "integrity": "sha512-C0ibY+HsXzYB6L/pLWEiWjMpghKsIc58Q5yumARwBQsHl9DXPakW+5NI/Y9w4YXiz0PEP6XTGTT/OV4Nnsmb4A==", + "version": "0.12.25", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.25.tgz", + "integrity": "sha512-woie0PosbRSoN8gQytrdCzUbS2ByKgO8nD1xCZkEup3D9q92miCze4PqEI9TZDYAuwn6CruEnQpJxgTRWdooAg==", "dev": true }, "escalade": { @@ -9861,9 +9862,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.2.tgz", - "integrity": "sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA==" + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", + "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==" }, "forever-agent": { "version": "0.6.1", @@ -10261,8 +10262,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} + "dev": true }, "ignore": { "version": "4.0.6", @@ -10584,9 +10584,9 @@ "dev": true }, "knex": { - "version": "0.95.10", - "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.10.tgz", - "integrity": "sha512-I60A8TXcMdeJlE6h7DSgEYyY37S7kgLObz1qlJ7QvPMD6vnKO5dtuLEht5pMia9Qf5BomqVgkWCdVTqcC/ImOA==", + "version": "0.95.11", + "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.11.tgz", + "integrity": "sha512-grDetD91O8VoQVCFqeWTgkzdq5406W6rggF/lK1hHuwzmjDs/0m9KxyncGdZbklTi7aUgHvw3+Cfy4x7FvpdaQ==", "requires": { "colorette": "1.2.1", "commander": "^7.1.0", @@ -11463,8 +11463,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -11783,8 +11782,7 @@ "version": "0.36.2", "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", - "dev": true, - "requires": {} + "dev": true }, "postcss-value-parser": { "version": "4.1.0", @@ -12002,9 +12000,9 @@ }, "dependencies": { "@types/node": { - "version": "14.17.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.12.tgz", - "integrity": "sha512-vhUqgjJR1qxwTWV5Ps5txuy2XMdf7Fw+OrdChRboy8BmWUPkckOhphaohzFG6b8DW7CrxaBMdrdJ47SYFq1okw==" + "version": "14.17.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.14.tgz", + "integrity": "sha512-rsAj2u8Xkqfc332iXV12SqIsjVi07H479bOP4q94NAcjzmAvapumEhuVIt53koEf7JFrpjgNKjBga5Pnn/GL8A==" } } }, @@ -12176,9 +12174,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.38.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.38.2.tgz", - "integrity": "sha512-Bz1fG6qiyF0FX6m/I+VxtdVKz1Dfmg/e9kfDy2PhWOkq3T384q2KxwIfP0fXpeI+EyyETdOauH+cRHQDFASllA==", + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.39.0.tgz", + "integrity": "sha512-F4o+RhJkNOIG0b6QudYU8c78ZADKZjKDk5cyrf8XTKWfrgbtyVVXImFstJrc+1pkQDCggyidIOytq6gS4gCCZg==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0" @@ -12680,8 +12678,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-5.0.0.tgz", "integrity": "sha512-c8aubuARSu5A3vEHLBeOSJt1udOdS+1iue7BmJDTSXoCBmfEQmmWX+59vYIj3NQdJBY6a/QRv1ozVFpaB9jaqA==", - "dev": true, - "requires": {} + "dev": true }, "stylelint-config-standard": { "version": "22.0.0", @@ -13113,6 +13110,14 @@ "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + } } }, "vfile": { @@ -13138,9 +13143,9 @@ } }, "vite": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.5.2.tgz", - "integrity": "sha512-JK5uhiVyMqHiAJbgBa8rCvpP8bEhAE9dKDv1gCmP+EUP2FSPmEeW3WXlCXauPB3MDa8behPW+ntyNXqnGaxslg==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.5.3.tgz", + "integrity": "sha512-1wMDnjflvtTTkMov8O/Xb5+w1/VW/Gw8oCf8f6dqgHn8lMOEqq0SaPtFEQeikFcOKCfSbiU0nEi0LDIx6DNsaQ==", "dev": true, "requires": { "esbuild": "^0.12.17", @@ -13151,19 +13156,19 @@ } }, "vue": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.6.tgz", - "integrity": "sha512-Zlb3LMemQS3Xxa6xPsecu45bNjr1hxO8Bh5FUmE0Dr6Ot0znZBKiM47rK6O7FTcakxOnvVN+NTXWJF6u8ajpCQ==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.8.tgz", + "integrity": "sha512-x7lwdnOSkceHQUXRVVHBaZzcp6v7M2CYtSZH75zZaT1mTjB4plC4KZHKP/5jAvdqOLBHZGwDSMkWXm3YbAufrA==", "requires": { - "@vue/compiler-dom": "3.2.6", - "@vue/runtime-dom": "3.2.6", - "@vue/shared": "3.2.6" + "@vue/compiler-dom": "3.2.8", + "@vue/runtime-dom": "3.2.8", + "@vue/shared": "3.2.8" } }, "vue-chart-3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/vue-chart-3/-/vue-chart-3-0.5.7.tgz", - "integrity": "sha512-BccfPv2rodY6IOppYHvMluVmIJE1CHfp5uW2DXrHrm1kIzaafLwpQ5SwdrxuCevn/QhKoi7azzcxwRcoWbX9hg==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/vue-chart-3/-/vue-chart-3-0.5.8.tgz", + "integrity": "sha512-VJEBTdMgWOaYqekXtz4LVBIeYyIx3qDlQnFyY4Ao1GwizokYZBycCeRN3oKDcYbbZi5yxYqTy6+Tm+m+SOPUPA==", "requires": { "@vue/runtime-core": "latest", "@vue/runtime-dom": "latest", @@ -13176,14 +13181,12 @@ "vue-confirm-dialog": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/vue-confirm-dialog/-/vue-confirm-dialog-1.0.2.tgz", - "integrity": "sha512-gTo1bMDWOLd/6ihmWv8VlPxhc9QaKoE5YqlsKydUOfrrQ3Q3taljF6yI+1TMtAtJLrvZ8DYrePhgBhY1VCJzbQ==", - "requires": {} + "integrity": "sha512-gTo1bMDWOLd/6ihmWv8VlPxhc9QaKoE5YqlsKydUOfrrQ3Q3taljF6yI+1TMtAtJLrvZ8DYrePhgBhY1VCJzbQ==" }, "vue-demi": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.10.1.tgz", - "integrity": "sha512-L6Oi+BvmMv6YXvqv5rJNCFHEKSVu7llpWWJczqmAQYOdmPPw5PNYoz1KKS//Fxhi+4QP64dsPjtmvnYGo1jemA==", - "requires": {} + "integrity": "sha512-L6Oi+BvmMv6YXvqv5rJNCFHEKSVu7llpWWJczqmAQYOdmPPw5PNYoz1KKS//Fxhi+4QP64dsPjtmvnYGo1jemA==" }, "vue-eslint-parser": { "version": "7.10.0", @@ -13246,8 +13249,7 @@ "vue-toastification": { "version": "2.0.0-rc.1", "resolved": "https://registry.npmjs.org/vue-toastification/-/vue-toastification-2.0.0-rc.1.tgz", - "integrity": "sha512-hjauv/FyesNZdwcr5m1SCyvu1JmlB+Ts5bTptDLDmsYYlj6Oqv8NYakiElpCF+Abwkn9J/AChh6FwkTL1HOb7Q==", - "requires": {} + "integrity": "sha512-hjauv/FyesNZdwcr5m1SCyvu1JmlB+Ts5bTptDLDmsYYlj6Oqv8NYakiElpCF+Abwkn9J/AChh6FwkTL1HOb7Q==" }, "which": { "version": "2.0.2", @@ -13292,8 +13294,7 @@ "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "requires": {} + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" }, "xmlhttprequest-ssl": { "version": "2.0.0", diff --git a/package.json b/package.json index f503bbf57..43d0b6354 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "sqlite3": "github:mapbox/node-sqlite3#593c9d", "tcp-ping": "^0.1.1", "v-pagination-3": "^0.1.6", - "vue": "^3.2.6", + "vue": "^3.2.8", "vue-chart-3": "^0.5.7", "vue-confirm-dialog": "^1.0.2", "vue-i18n": "^9.1.7", From 7fd12f54859ce33277e57f31c5ce18592e0443a5 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sat, 4 Sep 2021 14:42:55 +0800 Subject: [PATCH 045/134] rename nl_NL.js to nl-NL.js --- src/languages/{nl_NL.js => nl-NL.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/languages/{nl_NL.js => nl-NL.js} (100%) diff --git a/src/languages/nl_NL.js b/src/languages/nl-NL.js similarity index 100% rename from src/languages/nl_NL.js rename to src/languages/nl-NL.js From 4b8e7fcffcfc9080a1c59f152bad16dd25b060b7 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sat, 4 Sep 2021 15:03:26 +0800 Subject: [PATCH 046/134] update "build-docker" to build both platforms --- extra/update-version.js | 2 ++ package.json | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/extra/update-version.js b/extra/update-version.js index 697a64010..ca810a40a 100644 --- a/extra/update-version.js +++ b/extra/update-version.js @@ -23,6 +23,8 @@ if (! exists) { pkg.version = newVersion; pkg.scripts.setup = pkg.scripts.setup.replaceAll(oldVersion, newVersion); pkg.scripts["build-docker"] = pkg.scripts["build-docker"].replaceAll(oldVersion, newVersion); + pkg.scripts["build-docker-alpine"] = pkg.scripts["build-docker-alpine"].replaceAll(oldVersion, newVersion); + pkg.scripts["build-docker-debian"] = pkg.scripts["build-docker-debian"].replaceAll(oldVersion, newVersion); fs.writeFileSync("package.json", JSON.stringify(pkg, null, 4) + "\n"); commit(newVersion); diff --git a/package.json b/package.json index 43d0b6354..1bf9a890b 100644 --- a/package.json +++ b/package.json @@ -18,10 +18,11 @@ "start-server": "node server/server.js", "build": "vite build", "vite-preview-dist": "vite preview --host", - "build-docker": "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.5.2 --target release . --push", + "build-docker": "npm run build-docker-alpine && npm run build-docker-debian", + "build-docker-alpine": "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.5.2 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.5.2-alpine --target release . --push", + "build-docker-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.5.2-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-amd64": "docker buildx build --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain", - "build-docker-1.5.0-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:1.5.0-debian --target release . --push", "setup": "git checkout 1.5.2 && npm install --legacy-peer-deps && node node_modules/esbuild/install.js && npm run build && npm prune", "update-version": "node extra/update-version.js", "mark-as-nightly": "node extra/mark-as-nightly.js", From 6a603203ccf1ea766e1b3c9a3945b6ff0e5e60b4 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sat, 4 Sep 2021 15:07:32 +0800 Subject: [PATCH 047/134] update to 1.5.3 --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 1bf9a890b..1cfd01c51 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uptime-kuma", - "version": "1.5.2", + "version": "1.5.3", "license": "MIT", "repository": { "type": "git", @@ -19,11 +19,11 @@ "build": "vite build", "vite-preview-dist": "vite preview --host", "build-docker": "npm run build-docker-alpine && npm run build-docker-debian", - "build-docker-alpine": "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.5.2 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.5.2-alpine --target release . --push", - "build-docker-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.5.2-debian --target release . --push", + "build-docker-alpine": "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.5.3 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.5.3-alpine --target release . --push", + "build-docker-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.5.3-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-amd64": "docker buildx build --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain", - "setup": "git checkout 1.5.2 && npm install --legacy-peer-deps && node node_modules/esbuild/install.js && npm run build && npm prune", + "setup": "git checkout 1.5.3 && npm install --legacy-peer-deps && node node_modules/esbuild/install.js && npm run build && npm prune", "update-version": "node extra/update-version.js", "mark-as-nightly": "node extra/mark-as-nightly.js", "reset-password": "node extra/reset-password.js", From ee60d7491015b4fcbdb249f7e082e475ae29f99b Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sat, 4 Sep 2021 15:32:55 +0800 Subject: [PATCH 048/134] fix dockerfile path --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1cfd01c51..8bb962904 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "vite-preview-dist": "vite preview --host", "build-docker": "npm run build-docker-alpine && npm run build-docker-debian", "build-docker-alpine": "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.5.3 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.5.3-alpine --target release . --push", - "build-docker-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.5.3-debian --target release . --push", + "build-docker-debian": "docker buildx build -f dockerfile-debian --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.5.3-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-amd64": "docker buildx build --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain", "setup": "git checkout 1.5.3 && npm install --legacy-peer-deps && node node_modules/esbuild/install.js && npm run build && npm prune", From 778995a4fba33b66ea73c190f002e5618405c87d Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sat, 4 Sep 2021 15:48:25 +0800 Subject: [PATCH 049/134] add dockerfile-debian --- dockerfile-debian | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 dockerfile-debian diff --git a/dockerfile-debian b/dockerfile-debian new file mode 100644 index 000000000..7e0f79890 --- /dev/null +++ b/dockerfile-debian @@ -0,0 +1,28 @@ +# DON'T UPDATE TO alpine3.13, 1.14, see #41. +FROM node:14-bullseye AS release +WORKDIR /app + +RUN apt update +RUN apt --yes install python3 python3-pip python3-dev git g++ make +RUN ln -s /usr/bin/python3 /usr/bin/python + +# split the sqlite install here, so that it can caches the arm prebuilt +RUN npm install mapbox/node-sqlite3#593c9d + +# Install apprise +RUN apt --yes install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib +RUN pip3 --no-cache-dir install apprise && \ + rm -rf /root/.cache + +RUN apt --yes install iputils-ping + +COPY . . +RUN npm install --legacy-peer-deps && npm run build && npm prune + +EXPOSE 3001 +VOLUME ["/app/data"] +HEALTHCHECK --interval=60s --timeout=30s --start-period=300s CMD node extra/healthcheck.js +CMD ["node", "server/server.js"] + +FROM release AS nightly +RUN npm run mark-as-nightly From 0b9e410ea5b6edcc888ddd488d19a36ca011abf8 Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Sat, 4 Sep 2021 13:36:08 +0200 Subject: [PATCH 050/134] Added i18n key to en.js --- src/languages/en.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/languages/en.js b/src/languages/en.js index accc6dcc6..bec4edf27 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -111,5 +111,8 @@ export default { "Create your admin account": "Create your admin account", "Repeat Password": "Repeat Password", respTime: "Resp. Time (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + "Clear Data": "Clear Data", + "Events": "Events", + "Heartbeats": "Heartbeats", } From 41d32bb9dde554794613df002696841d6dceab1f Mon Sep 17 00:00:00 2001 From: Domenic Horner Date: Sat, 4 Sep 2021 20:08:18 +0800 Subject: [PATCH 051/134] Undo parm changes --- server/model/monitor.js | 11 ++++++++++- server/notification.js | 14 +------------- server/server.js | 2 +- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/server/model/monitor.js b/server/model/monitor.js index 126d59b1e..19f21d924 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -270,9 +270,18 @@ class Monitor extends BeanModel { this.id, ]) + let text; + if (bean.status === UP) { + text = "✅ Up" + } else { + text = "🔴 Down" + } + + let msg = `[${this.name}] [${text}] ${bean.msg}`; + for (let notification of notificationList) { try { - await Notification.send(JSON.parse(notification.config), this.name, await this.toJSON(), bean.toJSON()) + await Notification.send(JSON.parse(notification.config), msg, await this.toJSON(), bean.toJSON()) } catch (e) { console.error("Cannot send notification to " + notification.name); console.log(e); diff --git a/server/notification.js b/server/notification.js index beb1ff9d0..f78401d9b 100644 --- a/server/notification.js +++ b/server/notification.js @@ -17,21 +17,9 @@ class Notification { * @returns {Promise} Successful msg * Throw Error with fail msg */ - static async send(notification, monitorName = null, monitorJSON = null, heartbeatJSON = null) { + static async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { let okMsg = "Sent Successfully. "; - let msg = `[${notification.name}] Testing`; - // heartbeatJSON is only defined if we're not testing - if(heartbeatJSON) { - let text; - if (heartbeatJSON["status"] === UP) { - text = "✅ Up" - } else { - text = "🔴 Down" - } - msg = `[${monitorName}] [${text}] ${heartbeatJSON["msg"]}`; - } - if (notification.type === "telegram") { try { await axios.get(`https://api.telegram.org/bot${notification.telegramBotToken}/sendMessage`, { diff --git a/server/server.js b/server/server.js index 8f4516dc0..39191de79 100644 --- a/server/server.js +++ b/server/server.js @@ -552,7 +552,7 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); try { checkLogin(socket) - let msg = await Notification.send(notification) + let msg = await Notification.send(notification, notification.name + " Testing") callback({ ok: true, From 2a34e41d8c47ec2739cae0590ee891747a102b22 Mon Sep 17 00:00:00 2001 From: Levi Date: Sat, 4 Sep 2021 15:59:49 +0200 Subject: [PATCH 052/134] Improved Swedish translation --- src/languages/sv-SE.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js index 502968891..751a4063e 100644 --- a/src/languages/sv-SE.js +++ b/src/languages/sv-SE.js @@ -1,14 +1,14 @@ export default { - languageName: "Swedish", + languageName: "Svenska", checkEverySecond: "Uppdatera var {0} sekund.", - "Avg.": "Genomsnitt ", + "Avg.": "Genomsnittligt ", retriesDescription: "Max antal försök innan tjänsten markeras som nere och en notis skickas", ignoreTLSError: "Ignorera TLS/SSL-fel för webbsidor med HTTPS", upsideDownModeDescription: "Vänd upp och ner på statusen. Om tjänsten är nåbar visas den som NERE.", maxRedirectDescription: "Max antal omdirigeringar att följa. Välj 0 för att avaktivera omdirigeringar.", acceptedStatusCodesDescription: "Välj statuskoder som räknas som lyckade.", passwordNotMatchMsg: "Det bekräftade lösenordet stämmer ej överens.", - notificationDescription: "Vänligen lägg till en notistjänst till övervakaren.", + notificationDescription: "Vänligen lägg till en notistjänst till dina övervakare.", keywordDescription: "Sök efter nyckelord i ren HTML eller JSON-svar. Sökningen är skiftkänslig.", pauseDashboardHome: "Pausa", deleteMonitorMsg: "Är du säker på att du vill ta bort den här övervakningen?", @@ -36,7 +36,7 @@ export default { Pause: "Paus", Name: "Namn", Status: "Status", - DateTime: "DatumTid", + DateTime: "Datum & Tid", Message: "Meddelande", "No important events": "Inga viktiga händelser", Resume: "Återuppta", @@ -44,17 +44,17 @@ export default { Delete: "Ta bort", Current: "Nuvarande", Uptime: "Drifttid", - "Cert Exp.": "Certifikatsutgång", + "Cert Exp.": "Certifikat utgår", days: "dagar", day: "dag", - "-day": "-dag", + "-day": " dagar", hour: "timme", - "-hour": "-timme", + "-hour": " timmar", Response: "Svar", Ping: "Ping", "Monitor Type": "Övervakningstyp", Keyword: "Nyckelord", - "Friendly Name": "Vänligt Namn", + "Friendly Name": "Namn", URL: "URL", Hostname: "Värdnamn", Port: "Port", @@ -67,14 +67,14 @@ export default { Save: "Spara", Notifications: "Notiser", "Not available, please setup.": "Ej tillgänglig, vänligen konfigurera.", - "Setup Notification": "Konfigurera Notis", + "Setup Notification": "Ny Notistjänst", Light: "Ljust", Dark: "Mörkt", - Auto: "Automatisk", + Auto: "Automatiskt", "Theme - Heartbeat Bar": "Tema - Heartbeat Bar", Normal: "Normal", Bottom: "Botten", - None: "Ingen", + None: "Tomt", Timezone: "Tidszon", "Search Engine Visibility": "Synlighet på Sökmotorer", "Allow indexing": "Tillåt indexering", From d35b205fcc41be66a654085c01698656c9ce5443 Mon Sep 17 00:00:00 2001 From: Levi Date: Sat, 4 Sep 2021 16:01:41 +0200 Subject: [PATCH 053/134] Update & Improve Swedish Translation --- src/languages/sv-SE.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js index 751a4063e..276a3a36a 100644 --- a/src/languages/sv-SE.js +++ b/src/languages/sv-SE.js @@ -107,6 +107,6 @@ export default { "Last Result": "Senaste resultat", "Create your admin account": "Skapa ditt administratörskonto", "Repeat Password": "Upprepa Lösenord", - respTime: "Resp. Time (ms)", - notAvailableShort: "N/A" + respTime: "Svarstid (ms)", + notAvailableShort: "Ej Tillg." } From f1a151b4a1e1b3aaadb7b035eda938833117bd06 Mon Sep 17 00:00:00 2001 From: Levi Date: Sat, 4 Sep 2021 16:03:34 +0200 Subject: [PATCH 054/134] Update & Improve Swedish Translation --- src/languages/sv-SE.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js index 276a3a36a..8aa4e155b 100644 --- a/src/languages/sv-SE.js +++ b/src/languages/sv-SE.js @@ -33,7 +33,7 @@ export default { Down: "Nere", Pending: "Pågående", Unknown: "Okänt", - Pause: "Paus", + Pause: "Pausa", Name: "Namn", Status: "Status", DateTime: "Datum & Tid", From cc25787878c37655ea6ce0cfe4d4fb1e3f224252 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sat, 4 Sep 2021 23:32:46 +0800 Subject: [PATCH 055/134] improve heartbeat bar rendering in different dpi --- src/components/HeartbeatBar.vue | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/components/HeartbeatBar.vue b/src/components/HeartbeatBar.vue index 33b003db3..f49b8756d 100644 --- a/src/components/HeartbeatBar.vue +++ b/src/components/HeartbeatBar.vue @@ -124,9 +124,27 @@ export default { }, mounted() { if (this.size === "small") { - this.beatWidth = 5.6; - this.beatMargin = 2.4; - this.beatHeight = 16 + this.beatHeight = 16; + + // Handle strange render problem in different DPI. + if (window.devicePixelRatio === 1.25) { + this.beatWidth = 5.6; + this.beatMargin = 2.4; + + } else if (window.devicePixelRatio === 1.75) { + this.beatWidth = 5.7; + this.beatMargin = 2.4; + + } else if (window.devicePixelRatio === 2.25) { + this.beatWidth = 5.8; + this.beatMargin = 2.4; + + } else { + // 100%, 150%, 200% ... + this.beatWidth = 6; + this.beatMargin = 2; + } + } window.addEventListener("resize", this.resize); From ffbdf97478d72496b9ae235b8de35a9ac751cf93 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sun, 5 Sep 2021 00:08:24 +0800 Subject: [PATCH 056/134] improve heartbeat bar rendering in different dpi --- src/components/HeartbeatBar.vue | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/components/HeartbeatBar.vue b/src/components/HeartbeatBar.vue index f49b8756d..04d046bd5 100644 --- a/src/components/HeartbeatBar.vue +++ b/src/components/HeartbeatBar.vue @@ -31,7 +31,7 @@ export default { beatWidth: 10, beatHeight: 30, hoverScale: 1.5, - beatMargin: 3, // Odd number only, even = blurry + beatMargin: 4, move: false, maxBeat: -1, } @@ -122,29 +122,26 @@ export default { this.$root.heartbeatList[this.monitorId] = []; } }, + mounted() { if (this.size === "small") { + this.beatWidth = 5; this.beatHeight = 16; + this.beatMargin = 2; + } - // Handle strange render problem in different DPI. - if (window.devicePixelRatio === 1.25) { - this.beatWidth = 5.6; - this.beatMargin = 2.4; - - } else if (window.devicePixelRatio === 1.75) { - this.beatWidth = 5.7; - this.beatMargin = 2.4; - - } else if (window.devicePixelRatio === 2.25) { - this.beatWidth = 5.8; - this.beatMargin = 2.4; + // Suddenly, have an idea how to handle it universally. + // If the pixel * ratio != Integer, then it causes render issue, round it to solve it!! + const actualWidth = this.beatWidth * window.devicePixelRatio; + const actualMargin = this.beatMargin * window.devicePixelRatio; - } else { - // 100%, 150%, 200% ... - this.beatWidth = 6; - this.beatMargin = 2; - } + if (! Number.isInteger(actualWidth)) { + this.beatWidth = Math.round(actualWidth) / window.devicePixelRatio; + console.log(this.beatWidth); + } + if (! Number.isInteger(actualMargin)) { + this.beatMargin = Math.round(actualMargin) / window.devicePixelRatio; } window.addEventListener("resize", this.resize); From 299506ce45d64956b064528b30e4fa4cbea806fd Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sun, 5 Sep 2021 02:03:40 +0800 Subject: [PATCH 057/134] reset the heartbeat list instead of reload the page after cleared events or heartbeats --- server/client.js | 91 +++++++++++++++++++++++++++++++++++++++++++ server/server.js | 72 +++++----------------------------- src/mixins/socket.js | 8 ++-- src/pages/Details.vue | 11 ++---- 4 files changed, 109 insertions(+), 73 deletions(-) create mode 100644 server/client.js diff --git a/server/client.js b/server/client.js new file mode 100644 index 000000000..4f28a2fa0 --- /dev/null +++ b/server/client.js @@ -0,0 +1,91 @@ +/* + * For Client Socket + */ +const { TimeLogger } = require("../src/util"); +const { R } = require("redbean-node"); +const { io } = require("./server"); + +async function sendNotificationList(socket) { + const timeLogger = new TimeLogger(); + + let result = []; + let list = await R.find("notification", " user_id = ? ", [ + socket.userID, + ]); + + for (let bean of list) { + result.push(bean.export()) + } + + io.to(socket.userID).emit("notificationList", result) + + timeLogger.print("Send Notification List"); + + return list; +} + +/** + * Send Heartbeat History list to socket + * @param toUser True = send to all browsers with the same user id, False = send to the current browser only + * @param overwrite Overwrite client-side's heartbeat list + */ +async function sendHeartbeatList(socket, monitorID, toUser = false, overwrite = false) { + const timeLogger = new TimeLogger(); + + let list = await R.find("heartbeat", ` + monitor_id = ? + ORDER BY time DESC + LIMIT 100 + `, [ + monitorID, + ]) + + let result = []; + + for (let bean of list) { + result.unshift(bean.toJSON()); + } + + if (toUser) { + io.to(socket.userID).emit("heartbeatList", monitorID, result, overwrite); + } else { + socket.emit("heartbeatList", monitorID, result, overwrite); + } + + timeLogger.print(`[Monitor: ${monitorID}] sendHeartbeatList`); +} + +/** + * Important Heart beat list (aka event list) + * @param socket + * @param monitorID + * @param toUser True = send to all browsers with the same user id, False = send to the current browser only + * @param overwrite Overwrite client-side's heartbeat list + */ +async function sendImportantHeartbeatList(socket, monitorID, toUser = false, overwrite = false) { + const timeLogger = new TimeLogger(); + + let list = await R.find("heartbeat", ` + monitor_id = ? + AND important = 1 + ORDER BY time DESC + LIMIT 500 + `, [ + monitorID, + ]) + + timeLogger.print(`[Monitor: ${monitorID}] sendImportantHeartbeatList`); + + if (toUser) { + io.to(socket.userID).emit("importantHeartbeatList", monitorID, list, overwrite); + } else { + socket.emit("importantHeartbeatList", monitorID, list, overwrite); + } + +} + +module.exports = { + sendNotificationList, + sendImportantHeartbeatList, + sendHeartbeatList, +} diff --git a/server/server.js b/server/server.js index e28b96d82..7d9295354 100644 --- a/server/server.js +++ b/server/server.js @@ -82,7 +82,12 @@ if (sslKey && sslCert) { } const io = new Server(server); -app.use(express.json()) +module.exports.io = io; + +// Must be after io instantiation +const { sendNotificationList, sendHeartbeatList, sendImportantHeartbeatList } = require("./client"); + +app.use(express.json()); /** * Total WebSocket client connected to server currently, no actual use @@ -597,6 +602,8 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); monitorID, ]); + await sendImportantHeartbeatList(socket, monitorID, true, true); + callback({ ok: true, }); @@ -619,6 +626,8 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); monitorID ]); + await sendHeartbeatList(socket, monitorID, true, true); + callback({ ok: true, }); @@ -719,25 +728,6 @@ async function sendMonitorList(socket) { return list; } -async function sendNotificationList(socket) { - const timeLogger = new TimeLogger(); - - let result = []; - let list = await R.find("notification", " user_id = ? ", [ - socket.userID, - ]); - - for (let bean of list) { - result.push(bean.export()) - } - - io.to(socket.userID).emit("notificationList", result) - - timeLogger.print("Send Notification List"); - - return list; -} - async function afterLogin(socket, user) { socket.userID = user.id; socket.join(user.id) @@ -872,48 +862,6 @@ async function startMonitors() { } } -/** - * Send Heartbeat History list to socket - */ -async function sendHeartbeatList(socket, monitorID) { - const timeLogger = new TimeLogger(); - - let list = await R.find("heartbeat", ` - monitor_id = ? - ORDER BY time DESC - LIMIT 100 - `, [ - monitorID, - ]) - - let result = []; - - for (let bean of list) { - result.unshift(bean.toJSON()) - } - - socket.emit("heartbeatList", monitorID, result) - - timeLogger.print(`[Monitor: ${monitorID}] sendHeartbeatList`) -} - -async function sendImportantHeartbeatList(socket, monitorID) { - const timeLogger = new TimeLogger(); - - let list = await R.find("heartbeat", ` - monitor_id = ? - AND important = 1 - ORDER BY time DESC - LIMIT 500 - `, [ - monitorID, - ]) - - timeLogger.print(`[Monitor: ${monitorID}] sendImportantHeartbeatList`); - - socket.emit("importantHeartbeatList", monitorID, list) -} - async function shutdownFunction(signal) { console.log("Shutdown requested"); console.log("Called signal: " + signal); diff --git a/src/mixins/socket.js b/src/mixins/socket.js index 64560ea7c..672027fa1 100644 --- a/src/mixins/socket.js +++ b/src/mixins/socket.js @@ -107,8 +107,8 @@ export default { } }); - socket.on("heartbeatList", (monitorID, data) => { - if (! (monitorID in this.heartbeatList)) { + socket.on("heartbeatList", (monitorID, data, overwrite = false) => { + if (! (monitorID in this.heartbeatList) || overwrite) { this.heartbeatList[monitorID] = data; } else { this.heartbeatList[monitorID] = data.concat(this.heartbeatList[monitorID]) @@ -127,8 +127,8 @@ export default { this.certInfoList[monitorID] = JSON.parse(data) }); - socket.on("importantHeartbeatList", (monitorID, data) => { - if (! (monitorID in this.importantHeartbeatList)) { + socket.on("importantHeartbeatList", (monitorID, data, overwrite) => { + if (! (monitorID in this.importantHeartbeatList) || overwrite) { this.importantHeartbeatList[monitorID] = data; } else { this.importantHeartbeatList[monitorID] = data.concat(this.importantHeartbeatList[monitorID]) diff --git a/src/pages/Details.vue b/src/pages/Details.vue index d30885f48..776f1c1dd 100644 --- a/src/pages/Details.vue +++ b/src/pages/Details.vue @@ -276,6 +276,7 @@ export default { importantHeartBeatList() { if (this.$root.importantHeartbeatList[this.monitor.id]) { + // eslint-disable-next-line vue/no-side-effects-in-computed-properties this.heartBeatList = this.$root.importantHeartbeatList[this.monitor.id]; return this.$root.importantHeartbeatList[this.monitor.id] } @@ -359,9 +360,7 @@ export default { clearEvents() { this.$root.clearEvents(this.monitor.id, (res) => { - if (res.ok) { - this.$router.go(); - } else { + if (! res.ok) { toast.error(res.msg); } }) @@ -369,9 +368,7 @@ export default { clearHeartbeats() { this.$root.clearHeartbeats(this.monitor.id, (res) => { - if (res.ok) { - this.$router.go(); - } else { + if (! res.ok) { toast.error(res.msg); } }) @@ -495,7 +492,7 @@ table { border-color: $dark-bg2; border-width: 2px; - li button{ + li button { color: $dark-font-color; } From d5b32ffbb8cb91834a6c3a37bb3a3c9c76d6e71f Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sun, 5 Sep 2021 02:25:40 +0800 Subject: [PATCH 058/134] add language missing keys --- src/languages/da-DK.js | 8 +++++++- src/languages/de-DE.js | 4 ++-- src/languages/en.js | 4 ++-- src/languages/es-ES.js | 8 +++++++- src/languages/fr.js | 8 +++++++- src/languages/ja.js | 8 +++++++- src/languages/ko-KR.js | 8 +++++++- src/languages/nl-NL.js | 8 +++++++- src/languages/ru-RU.js | 8 +++++++- src/languages/sr-latn.js | 8 +++++++- src/languages/sr.js | 8 +++++++- src/languages/sv-SE.js | 8 +++++++- src/languages/zh-CN.js | 8 +++++++- src/languages/zh-HK.js | 8 +++++++- 14 files changed, 88 insertions(+), 16 deletions(-) diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js index 713eecfe2..1f4f74faf 100644 --- a/src/languages/da-DK.js +++ b/src/languages/da-DK.js @@ -108,5 +108,11 @@ export default { "Repeat Password": "Gentag adgangskoden", "Resource Record Type": "Resource Record Type", respTime: "Resp. Time (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + 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" } diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index 9d51d4383..0db25023c 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -107,8 +107,8 @@ export default { 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?", "Clear Data": "Lösche Daten", - "Events": "Ereignisse", - "Heartbeats": "Statistiken", + Events: "Ereignisse", + Heartbeats: "Statistiken", confirmClearStatisticsMsg: "Bist du sicher das du ALLE Statistiken löschen möchtest?", "Create your admin account": "Erstelle dein Admin Konto", "Repeat Password": "Wiederhole das Passwort", diff --git a/src/languages/en.js b/src/languages/en.js index bec4edf27..58089b9ea 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -113,6 +113,6 @@ export default { respTime: "Resp. Time (ms)", notAvailableShort: "N/A", "Clear Data": "Clear Data", - "Events": "Events", - "Heartbeats": "Heartbeats", + Events: "Events", + Heartbeats: "Heartbeats" } diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js index 96ce923ec..0f1183271 100644 --- a/src/languages/es-ES.js +++ b/src/languages/es-ES.js @@ -108,5 +108,11 @@ export default { "Create your admin account": "Crea tu cuenta de administrador", "Repeat Password": "Repetir contraseña", respTime: "Tiempo de resp. (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + 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" } diff --git a/src/languages/fr.js b/src/languages/fr.js index e4f999dce..7bfb4f9d3 100644 --- a/src/languages/fr.js +++ b/src/languages/fr.js @@ -108,5 +108,11 @@ export default { "Create your admin account": "Créez votre compte administrateur", "Repeat Password": "Répéter le mot de passe", respTime: "Temps de réponse (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + 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" } diff --git a/src/languages/ja.js b/src/languages/ja.js index 23de640cf..86c5b2030 100644 --- a/src/languages/ja.js +++ b/src/languages/ja.js @@ -108,5 +108,11 @@ export default { "Create your admin account": "Create your admin account", "Repeat Password": "Repeat Password", respTime: "Resp. Time (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + 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" } diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js index 8493193cb..4a3c84a4a 100644 --- a/src/languages/ko-KR.js +++ b/src/languages/ko-KR.js @@ -108,5 +108,11 @@ export default { "Create your admin account": "관리자 계정 만들기", "Repeat Password": "비밀번호 재입력", respTime: "응답 시간 (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + 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" } diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js index 60c5089c9..24e72910b 100644 --- a/src/languages/nl-NL.js +++ b/src/languages/nl-NL.js @@ -108,5 +108,11 @@ export default { "Create your admin account": "Maak uw beheerdersaccount aan", "Repeat Password": "Herhaal wachtwoord", respTime: "resp. tijd (ms)", - notAvailableShort: "N.v.t." + notAvailableShort: "N.v.t.", + 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" } diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js index f42f9c256..f2c7a0eee 100644 --- a/src/languages/ru-RU.js +++ b/src/languages/ru-RU.js @@ -108,5 +108,11 @@ export default { "Create your admin account": "Создайте аккаунт администратора", "Repeat Password": "Повторите пароль", respTime: "Resp. Time (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + 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" } diff --git a/src/languages/sr-latn.js b/src/languages/sr-latn.js index aa7d95cf9..60a90d859 100644 --- a/src/languages/sr-latn.js +++ b/src/languages/sr-latn.js @@ -108,5 +108,11 @@ export default { "Create your admin account": "Naprivi administratorski nalog", "Repeat Password": "Ponovite lozinku", respTime: "Vreme odg. (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + 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" } diff --git a/src/languages/sr.js b/src/languages/sr.js index 0bd084036..dfcee7cee 100644 --- a/src/languages/sr.js +++ b/src/languages/sr.js @@ -108,5 +108,11 @@ export default { "Create your admin account": "Наприви администраторски налог", "Repeat Password": "Поновите лозинку", respTime: "Време одг. (мс)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + 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" } diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js index 8aa4e155b..dc76babd9 100644 --- a/src/languages/sv-SE.js +++ b/src/languages/sv-SE.js @@ -108,5 +108,11 @@ export default { "Create your admin account": "Skapa ditt administratörskonto", "Repeat Password": "Upprepa Lösenord", respTime: "Svarstid (ms)", - notAvailableShort: "Ej Tillg." + notAvailableShort: "Ej Tillg.", + 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" } diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js index d179a91af..d04eabdf4 100644 --- a/src/languages/zh-CN.js +++ b/src/languages/zh-CN.js @@ -108,5 +108,11 @@ export default { "Create your admin account": "创建管理员账号", "Repeat Password": "重复密码", respTime: "Resp. Time (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + 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" } diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js index 4bcc5029e..39532dfe2 100644 --- a/src/languages/zh-HK.js +++ b/src/languages/zh-HK.js @@ -108,5 +108,11 @@ export default { "Create your admin account": "製作你的管理員帳號", "Repeat Password": "重複密碼", respTime: "反應時間 (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + clearEventsMsg: "是否確定刪除這個監測器的所有事件?", + clearHeartbeatsMsg: "是否確定刪除這個監測器的所有脈搏資料?", + confirmClearStatisticsMsg: "是否確定刪除所有監測器的脈搏資料?(您的監測器會繼續正常運作)", + "Clear Data": "清除資料", + Events: "事件", + Heartbeats: "脈搏" } From 5837c353b7689c573f03fe843ccc007f872e1335 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sun, 5 Sep 2021 02:47:31 +0800 Subject: [PATCH 059/134] change the default theme to auto from light --- src/mixins/theme.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mixins/theme.js b/src/mixins/theme.js index 44e375327..b149e1113 100644 --- a/src/mixins/theme.js +++ b/src/mixins/theme.js @@ -11,7 +11,7 @@ export default { mounted() { // Default Light if (! this.userTheme) { - this.userTheme = "light"; + this.userTheme = "auto"; } // Default Heartbeat Bar From 9952463350907aaf03ab9d944876145b4c96bc47 Mon Sep 17 00:00:00 2001 From: Misly <60405462+Misly16@users.noreply.github.com> Date: Sat, 4 Sep 2021 20:38:53 +0000 Subject: [PATCH 060/134] Add Polish Locale --- src/languages/pl.js | 112 +++++++++++++++++++++++++++++++++++++++++ src/main.js | 2 + src/pages/Settings.vue | 5 ++ 3 files changed, 119 insertions(+) create mode 100644 src/languages/pl.js diff --git a/src/languages/pl.js b/src/languages/pl.js new file mode 100644 index 000000000..9e16011bc --- /dev/null +++ b/src/languages/pl.js @@ -0,0 +1,112 @@ +export default { + languageName: "Polski", + checkEverySecond: "sprawdzaj co {0} sekund.", + "Avg.": "Średnia. ", + retriesDescription: "Maksymalna liczba ponownych prób, zanim usługa zostanie oznaczona jako offline 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 niedostępna.", + maxRedirectDescription: "Maksymalna liczba przekierowań do naśladowania. Ustaw na 0, aby wyłączyć przekierowania.", + acceptedStatusCodesDescription: "Wybierz kody stanu, które są uważane za udaną odpowiedź.", + passwordNotMatchMsg: "Powtórzone hasło nie jest takie samo.", + notificationDescription: "Dodaj powiadomienie do monitorów, aby one działały.", + keywordDescription: "Wyszukaj słowo kluczowe w html lub JSON i wielkość liter ma znaczenie.", + pauseDashboardHome: "pauza", + deleteMonitorMsg: "Czy na pewno chcesz usunąć ten monitor?", + deleteNotificationMsg: "Czy na pewno chcesz usunąć to powiadomienie ze wszystkich monitorów?", + resoverserverDescription: "Cloudflare jest domyślnym serwerem, możesz zmienić serwer resolver w dowolnym momencie.", + rrtypeDescription: "Wybierz typ RR-Type który chcesz monitorować.", + pauseMonitorMsg: "Czy na pewno chcesz wstrzymać?", + Settings: "Ustawienia", + Dashboard: "Panel", + "New Update": "Nowa aktualizacja", + Language: "Język", + Appearance: "Wygląd", + Theme: "Motyw", + General: "Ogólne", + Version: "Versja", + "Check Update On GitHub": "Sprawdź aktualizację na GitHub.", + List: "Lista", + Add: "Dodaj", + "Add New Monitor": "Dodaj Nowy Monitor", + "Quick Stats": "Szybkie statystyki", + Up: "Online", + Down: "Offline", + Pending: "Oczekujący", + Unknown: "Nieznane", + Pause: "Pauza", + Name: "Nazwa", + Status: "Status", + DateTime: "Data i godzina", + Message: "Wiadomość", + "No important events": "Brak ważnych wydarzeń.", + Resume: "Wznów", + Edit: "Edytuj", + Delete: "Usuń", + Current: "aktualny", + Uptime: "czas pracy", + "Cert Exp.": "Wygaśnięcie certyfikatu.", + days: "dni", + day: "dzień", + "-day": "-dzień", + hour: "godzina", + "-hour": "-godzina", + Response: "odpowiedź", + Ping: "Ping", + "Monitor Type": "Typ monitora", + Keyword: "słowo kluczowe", + "Friendly Name": "Przyjazne imię", + URL: "URL", + Hostname: "Hostname", + Port: "Port", + "Heartbeat Interval": "Interwał bicia serca", + Retries: "Prób", + Advanced: "Zaawansowane", + "Upside Down Mode": "Tryb do góry nogami", + "Max. Redirects": "Maks. Przekierowania", + "Accepted Status Codes": "Akceptowane kody statusu", + Save: "Zapisz", + Notifications: "Powiadomienia", + "Not available, please setup.": "Niedostępne, proszę skonfigurować.", + "Setup Notification": "Powiadomienie konfiguracji", + Light: "Jasny", + Dark: "Ciemny", + Auto: "Automatyczny", + "Theme - Heartbeat Bar": "Motyw - pasek bicia serca", + Normal: "Normalne", + Bottom: "Na dole", + None: "Nic", + Timezone: "Strefa czasowa", + "Search Engine Visibility": "Widoczność w wyszukiwarce", + "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", + "New Password": "Nowe hasło", + "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ę", + Leave: "Opuść", + "I understand, please disable": "Rozumiem, proszę wyłączyć", + Confirm: "Potwierdź", + Yes: "Tak", + No: "Nie", + Username: "Nazwa użytkownika", + Password: "Hasło", + "Remember me": "Zapamiętaj mnie", + Login: "Zaloguj sie", + "No Monitors, please": "Proszę bez monitorów", + "add one": "dodaj jeden", + "Notification Type": "Typ powiadomienia", + Email: "Email", + Test: "Test", + "Certificate Info": "Informacje o certyfikacie", + "Resolver Server": "Server resolver", + "Resource Record Type": "Typ rekordu zasobów", + "Last Result": "Ostatni rekord", + "Create your admin account": "Utwórz swoje konto administratora", + "Repeat Password": "Powtórz hasło", + respTime: "Odp. Czas (ms)", + notAvailableShort: "N/A" +} diff --git a/src/main.js b/src/main.js index 8f5e0a916..7ad9db089 100644 --- a/src/main.js +++ b/src/main.js @@ -37,6 +37,7 @@ import svSE from "./languages/sv-SE"; import koKR from "./languages/ko-KR"; import ruRU from "./languages/ru-RU"; import zhCN from "./languages/zh-CN"; +import pl from "./languages/pl" const routes = [ { @@ -114,6 +115,7 @@ const languageList = { "ko-KR": koKR, "ru-RU": ruRU, "zh-CN": zhCN, + "pl": pl, }; const i18n = createI18n({ diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index 705642137..83384ca80 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -213,6 +213,11 @@

이 기능은 Cloudflare Access와 같은 서드파티 인증을 Uptime Kuma 앞에 둔 사용자를 위한 기능이에요.

신중하게 사용하세요.

+ From 1b8b33c4c3e585b002570bf903d883f6ca42cb1e Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Sun, 5 Sep 2021 15:40:35 +0200 Subject: [PATCH 061/134] Added set language to the Setup.vue --- src/languages/de-DE.js | 3 ++- src/languages/en.js | 3 ++- src/pages/Setup.vue | 16 +++++++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index 76c355a3b..1f8eb055b 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -108,5 +108,6 @@ export default { "Repeat Password": "Wiederhole das Passwort", "Resource Record Type": "Resource Record Type", respTime: "Antw. Zeit (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + Create: "Erstellen", } diff --git a/src/languages/en.js b/src/languages/en.js index f0e4ae969..6a4f5e2f3 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -108,5 +108,6 @@ export default { "Create your admin account": "Create your admin account", "Repeat Password": "Repeat Password", respTime: "Resp. Time (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + Create: "Create", } diff --git a/src/pages/Setup.vue b/src/pages/Setup.vue index 756aff365..dbff86837 100644 --- a/src/pages/Setup.vue +++ b/src/pages/Setup.vue @@ -14,6 +14,15 @@

+ + +
+ +
@@ -29,7 +38,7 @@ @@ -49,6 +58,11 @@ export default { repeatPassword: "", } }, + watch: { + "$i18n.locale"() { + localStorage.locale = this.$i18n.locale; + }, + }, mounted() { this.$root.getSocket().emit("needSetup", (needSetup) => { if (! needSetup) { From 899b33b3a966017a17cd5e3c45c5044fa4554015 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Mon, 6 Sep 2021 01:31:05 +0800 Subject: [PATCH 062/134] add language missing keys --- src/languages/da-DK.js | 3 ++- src/languages/es-ES.js | 3 ++- src/languages/fr.js | 3 ++- src/languages/ja.js | 3 ++- src/languages/ko-KR.js | 3 ++- src/languages/nl-NL.js | 3 ++- src/languages/pl.js | 3 ++- src/languages/ru-RU.js | 3 ++- src/languages/sr-latn.js | 3 ++- src/languages/sr.js | 3 ++- src/languages/sv-SE.js | 3 ++- src/languages/zh-CN.js | 3 ++- src/languages/zh-HK.js | 3 ++- 13 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js index 713eecfe2..050f31e40 100644 --- a/src/languages/da-DK.js +++ b/src/languages/da-DK.js @@ -108,5 +108,6 @@ export default { "Repeat Password": "Gentag adgangskoden", "Resource Record Type": "Resource Record Type", respTime: "Resp. Time (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + Create: "Create" } diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js index 96ce923ec..4079991ee 100644 --- a/src/languages/es-ES.js +++ b/src/languages/es-ES.js @@ -108,5 +108,6 @@ export default { "Create your admin account": "Crea tu cuenta de administrador", "Repeat Password": "Repetir contraseña", respTime: "Tiempo de resp. (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + Create: "Create" } diff --git a/src/languages/fr.js b/src/languages/fr.js index e4f999dce..4019b74d3 100644 --- a/src/languages/fr.js +++ b/src/languages/fr.js @@ -108,5 +108,6 @@ export default { "Create your admin account": "Créez votre compte administrateur", "Repeat Password": "Répéter le mot de passe", respTime: "Temps de réponse (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + Create: "Create" } diff --git a/src/languages/ja.js b/src/languages/ja.js index 23de640cf..51181cdf4 100644 --- a/src/languages/ja.js +++ b/src/languages/ja.js @@ -108,5 +108,6 @@ export default { "Create your admin account": "Create your admin account", "Repeat Password": "Repeat Password", respTime: "Resp. Time (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + Create: "Create" } diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js index 8493193cb..49a510f69 100644 --- a/src/languages/ko-KR.js +++ b/src/languages/ko-KR.js @@ -108,5 +108,6 @@ export default { "Create your admin account": "관리자 계정 만들기", "Repeat Password": "비밀번호 재입력", respTime: "응답 시간 (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + Create: "Create" } diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js index 60c5089c9..0ab73bb9f 100644 --- a/src/languages/nl-NL.js +++ b/src/languages/nl-NL.js @@ -108,5 +108,6 @@ export default { "Create your admin account": "Maak uw beheerdersaccount aan", "Repeat Password": "Herhaal wachtwoord", respTime: "resp. tijd (ms)", - notAvailableShort: "N.v.t." + notAvailableShort: "N.v.t.", + Create: "Create" } diff --git a/src/languages/pl.js b/src/languages/pl.js index 9e16011bc..25f76430d 100644 --- a/src/languages/pl.js +++ b/src/languages/pl.js @@ -108,5 +108,6 @@ export default { "Create your admin account": "Utwórz swoje konto administratora", "Repeat Password": "Powtórz hasło", respTime: "Odp. Czas (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + Create: "Create" } diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js index f42f9c256..96f6efab8 100644 --- a/src/languages/ru-RU.js +++ b/src/languages/ru-RU.js @@ -108,5 +108,6 @@ export default { "Create your admin account": "Создайте аккаунт администратора", "Repeat Password": "Повторите пароль", respTime: "Resp. Time (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + Create: "Create" } diff --git a/src/languages/sr-latn.js b/src/languages/sr-latn.js index aa7d95cf9..defc78211 100644 --- a/src/languages/sr-latn.js +++ b/src/languages/sr-latn.js @@ -108,5 +108,6 @@ export default { "Create your admin account": "Naprivi administratorski nalog", "Repeat Password": "Ponovite lozinku", respTime: "Vreme odg. (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + Create: "Create" } diff --git a/src/languages/sr.js b/src/languages/sr.js index 0bd084036..d333210f9 100644 --- a/src/languages/sr.js +++ b/src/languages/sr.js @@ -108,5 +108,6 @@ export default { "Create your admin account": "Наприви администраторски налог", "Repeat Password": "Поновите лозинку", respTime: "Време одг. (мс)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + Create: "Create" } diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js index 8aa4e155b..d0015432d 100644 --- a/src/languages/sv-SE.js +++ b/src/languages/sv-SE.js @@ -108,5 +108,6 @@ export default { "Create your admin account": "Skapa ditt administratörskonto", "Repeat Password": "Upprepa Lösenord", respTime: "Svarstid (ms)", - notAvailableShort: "Ej Tillg." + notAvailableShort: "Ej Tillg.", + Create: "Create" } diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js index d179a91af..e47bd70a7 100644 --- a/src/languages/zh-CN.js +++ b/src/languages/zh-CN.js @@ -108,5 +108,6 @@ export default { "Create your admin account": "创建管理员账号", "Repeat Password": "重复密码", respTime: "Resp. Time (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + Create: "Create" } diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js index 4bcc5029e..6dfc726ea 100644 --- a/src/languages/zh-HK.js +++ b/src/languages/zh-HK.js @@ -108,5 +108,6 @@ export default { "Create your admin account": "製作你的管理員帳號", "Repeat Password": "重複密碼", respTime: "反應時間 (ms)", - notAvailableShort: "N/A" + notAvailableShort: "N/A", + Create: "建立" } From d4ff5d8b325571ebf4fe518bc09b9ac30cd51a95 Mon Sep 17 00:00:00 2001 From: Adam Stachowicz Date: Sun, 5 Sep 2021 20:55:25 +0200 Subject: [PATCH 063/134] [LANG] `pl` fixes --- src/languages/pl.js | 66 ++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/languages/pl.js b/src/languages/pl.js index 25f76430d..c95a1d6bc 100644 --- a/src/languages/pl.js +++ b/src/languages/pl.js @@ -1,20 +1,20 @@ export default { languageName: "Polski", - checkEverySecond: "sprawdzaj co {0} sekund.", - "Avg.": "Średnia. ", - retriesDescription: "Maksymalna liczba ponownych prób, zanim usługa zostanie oznaczona jako offline i zostanie wysłane powiadomienie.", - ignoreTLSError: "Ignoruj błąd TLS/SSL dla stron HTTPS.", + checkEverySecond: "Sprawdzaj co {0} sekund.", + "Avg.": "Średnia ", + retriesDescription: "Maksymalna liczba powtórzeń, zanim usługa zostanie oznaczona jako wyłączona 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 niedostępna.", - maxRedirectDescription: "Maksymalna liczba przekierowań do naśladowania. Ustaw na 0, aby wyłączyć przekierowania.", + 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ź.", - passwordNotMatchMsg: "Powtórzone hasło nie jest takie samo.", - notificationDescription: "Dodaj powiadomienie do monitorów, aby one działały.", - keywordDescription: "Wyszukaj słowo kluczowe w html lub JSON i wielkość liter ma znaczenie.", - pauseDashboardHome: "pauza", + passwordNotMatchMsg: "Powtórzone hasło nie pasuje.", + notificationDescription: "Proszę przypisać powiadomienie do monitora(ów), aby zadziałał.", + keywordDescription: "Wyszukiwanie słów kluczowych w zwykłym html lub odpowiedzi JSON. Wielkość liter ma znaczenie.", + pauseDashboardHome: "Pauza", deleteMonitorMsg: "Czy na pewno chcesz usunąć ten monitor?", - deleteNotificationMsg: "Czy na pewno chcesz usunąć to powiadomienie ze wszystkich monitorów?", - resoverserverDescription: "Cloudflare jest domyślnym serwerem, możesz zmienić serwer resolver w dowolnym momencie.", - rrtypeDescription: "Wybierz typ RR-Type który chcesz monitorować.", + 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ć?", Settings: "Ustawienia", Dashboard: "Panel", @@ -23,11 +23,11 @@ export default { Appearance: "Wygląd", Theme: "Motyw", General: "Ogólne", - Version: "Versja", + Version: "Wersja", "Check Update On GitHub": "Sprawdź aktualizację na GitHub.", List: "Lista", Add: "Dodaj", - "Add New Monitor": "Dodaj Nowy Monitor", + "Add New Monitor": "Dodaj nowy monitor", "Quick Stats": "Szybkie statystyki", Up: "Online", Down: "Offline", @@ -38,46 +38,46 @@ export default { Status: "Status", DateTime: "Data i godzina", Message: "Wiadomość", - "No important events": "Brak ważnych wydarzeń.", + "No important events": "Brak ważnych wydarzeń", Resume: "Wznów", Edit: "Edytuj", Delete: "Usuń", Current: "aktualny", - Uptime: "czas pracy", - "Cert Exp.": "Wygaśnięcie certyfikatu.", + Uptime: "Czas pracy", + "Cert Exp.": "Wygaśnięcie certyfikatu", days: "dni", day: "dzień", - "-day": "-dzień", + "-day": " dni", hour: "godzina", - "-hour": "-godzina", - Response: "odpowiedź", + "-hour": " godziny", + Response: "Odpowiedź", Ping: "Ping", "Monitor Type": "Typ monitora", - Keyword: "słowo kluczowe", - "Friendly Name": "Przyjazne imię", + Keyword: "Słowo kluczowe", + "Friendly Name": "Przyjazna nazwa", URL: "URL", - Hostname: "Hostname", + Hostname: "Nazwa hosta", Port: "Port", "Heartbeat Interval": "Interwał bicia serca", Retries: "Prób", Advanced: "Zaawansowane", "Upside Down Mode": "Tryb do góry nogami", - "Max. Redirects": "Maks. Przekierowania", + "Max. Redirects": "Maks. przekierowania", "Accepted Status Codes": "Akceptowane kody statusu", Save: "Zapisz", Notifications: "Powiadomienia", "Not available, please setup.": "Niedostępne, proszę skonfigurować.", - "Setup Notification": "Powiadomienie konfiguracji", + "Setup Notification": "Konfiguracja powiadomień", Light: "Jasny", Dark: "Ciemny", Auto: "Automatyczny", "Theme - Heartbeat Bar": "Motyw - pasek bicia serca", Normal: "Normalne", Bottom: "Na dole", - None: "Nic", + None: "Brak", Timezone: "Strefa czasowa", "Search Engine Visibility": "Widoczność w wyszukiwarce", - "Allow indexing": "Zezwól na indeksowanie", + "Allow indexing": "Pozwó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", @@ -87,7 +87,7 @@ export default { "Disable Auth": "Wyłącz autoryzację", "Enable Auth": "Włącz autoryzację ", Logout: "Wyloguj się", - Leave: "Opuść", + Leave: "Zostaw", "I understand, please disable": "Rozumiem, proszę wyłączyć", Confirm: "Potwierdź", Yes: "Tak", @@ -95,8 +95,8 @@ export default { Username: "Nazwa użytkownika", Password: "Hasło", "Remember me": "Zapamiętaj mnie", - Login: "Zaloguj sie", - "No Monitors, please": "Proszę bez monitorów", + Login: "Zaloguj się", + "No Monitors, please": "Brak monitorów, proszę", "add one": "dodaj jeden", "Notification Type": "Typ powiadomienia", Email: "Email", @@ -104,10 +104,10 @@ export default { "Certificate Info": "Informacje o certyfikacie", "Resolver Server": "Server resolver", "Resource Record Type": "Typ rekordu zasobów", - "Last Result": "Ostatni rekord", + "Last Result": "Ostatni wynik", "Create your admin account": "Utwórz swoje konto administratora", "Repeat Password": "Powtórz hasło", - respTime: "Odp. Czas (ms)", + respTime: "Czas odp. (ms)", notAvailableShort: "N/A", - Create: "Create" + Create: "Stwórz" } From 424f20f8e125dd3cdfdfba2da5eff6fb5e523958 Mon Sep 17 00:00:00 2001 From: Adam Stachowicz Date: Sun, 5 Sep 2021 20:59:04 +0200 Subject: [PATCH 064/134] Better `upsideDownModeDescription` --- 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 c95a1d6bc..f416d5083 100644 --- a/src/languages/pl.js +++ b/src/languages/pl.js @@ -4,7 +4,7 @@ export default { "Avg.": "Średnia ", retriesDescription: "Maksymalna liczba powtórzeń, zanim usługa zostanie oznaczona jako wyłączona 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 niedostępna.", + 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ź.", passwordNotMatchMsg: "Powtórzone hasło nie pasuje.", From dcc77991083da699be4e5f8e7ea8d1a2f7c5f0ac Mon Sep 17 00:00:00 2001 From: Minvinea Date: Sun, 5 Sep 2021 21:34:32 +0200 Subject: [PATCH 065/134] Update few words and name of file https://prnt.sc/1rbosiy --- src/languages/{fr.js => fr-FR.js} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/languages/{fr.js => fr-FR.js} (99%) diff --git a/src/languages/fr.js b/src/languages/fr-FR.js similarity index 99% rename from src/languages/fr.js rename to src/languages/fr-FR.js index 4019b74d3..d49d0191d 100644 --- a/src/languages/fr.js +++ b/src/languages/fr-FR.js @@ -66,7 +66,7 @@ export default { "Theme - Heartbeat Bar": "Voir les services surveillés", Normal: "Général", Bottom: "En dessous", - None: "Non", + None: "Rien", Timezone: "Fuseau Horaire", "Search Engine Visibility": "Visibilité par les moteurs de recherche", "Allow indexing": "Autoriser l'indexation par des moteurs de recherche", @@ -109,5 +109,5 @@ export default { "Repeat Password": "Répéter le mot de passe", respTime: "Temps de réponse (ms)", notAvailableShort: "N/A", - Create: "Create" + Create: "Créer" } From e8b814733d4ec8a9e7dea1bf688d487d9ab16643 Mon Sep 17 00:00:00 2001 From: Adam Stachowicz Date: Sun, 5 Sep 2021 23:14:56 +0200 Subject: [PATCH 066/134] Fix typo --- 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 f416d5083..cc625d6de 100644 --- a/src/languages/pl.js +++ b/src/languages/pl.js @@ -8,7 +8,7 @@ export default { 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ź.", passwordNotMatchMsg: "Powtórzone hasło nie pasuje.", - notificationDescription: "Proszę przypisać powiadomienie do monitora(ów), aby zadziałał.", + notificationDescription: "Proszę przypisać powiadomienie do monitora(ów), aby zadziałało.", keywordDescription: "Wyszukiwanie słów kluczowych w zwykłym html lub odpowiedzi JSON. Wielkość liter ma znaczenie.", pauseDashboardHome: "Pauza", deleteMonitorMsg: "Czy na pewno chcesz usunąć ten monitor?", From 58240aceefb4990b62292c4ee702f4dfd2da1546 Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Sun, 5 Sep 2021 23:23:06 +0200 Subject: [PATCH 067/134] Added the option for default notifications --- db/patch9.sql | 7 +++++++ server/database.js | 2 +- server/notification.js | 27 ++++++++++++++++++++++++++- src/components/NotificationDialog.vue | 19 +++++++++++++++++++ src/languages/de-DE.js | 5 ++++- src/languages/en.js | 5 ++++- src/pages/EditMonitor.vue | 8 ++++++++ 7 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 db/patch9.sql diff --git a/db/patch9.sql b/db/patch9.sql new file mode 100644 index 000000000..3f631ff8b --- /dev/null +++ b/db/patch9.sql @@ -0,0 +1,7 @@ +-- You should not modify if this have pushed to Github, unless it does serious wrong with the db. +BEGIN TRANSACTION; + +ALTER TABLE notification + ADD is_default BOOLEAN; + +COMMIT; diff --git a/server/database.js b/server/database.js index 77c4da758..832166d2c 100644 --- a/server/database.js +++ b/server/database.js @@ -7,7 +7,7 @@ class Database { static templatePath = "./db/kuma.db" static dataDir; static path; - static latestVersion = 8; + static latestVersion = 9; static noReject = true; static sqliteInstance = null; diff --git a/server/notification.js b/server/notification.js index 472012af7..d3a55c841 100644 --- a/server/notification.js +++ b/server/notification.js @@ -617,8 +617,13 @@ class Notification { bean.name = notification.name; bean.user_id = userID; - bean.config = JSON.stringify(notification) + bean.config = JSON.stringify(notification); + bean.is_default = notification.isDefault; await R.store(bean) + + if (notification.applyExisting) { + await applyNotificationEveryMonitor(bean.id, userID); + } } static async delete(notificationID, userID) { @@ -702,6 +707,26 @@ function throwGeneralAxiosError(error) { throw new Error(msg) } +async function applyNotificationEveryMonitor(notificationID, userID) { + let monitors = await R.getAll("SELECT id FROM monitor WHERE user_id = ?", [ + userID + ]); + + for (let i = 0; i < monitors.length; i++) { + let checkNotification = await R.findOne("monitor_notification", " monitor_id = ? AND notification_id = ? ", [ + monitors[i].id, + notificationID, + ]) + + if (! checkNotification) { + let relation = R.dispense("monitor_notification"); + relation.monitor_id = monitors[i].id; + relation.notification_id = notificationID; + await R.store(relation) + } + } +} + module.exports = { Notification, } diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue index 2fdb8fe18..fa63a376c 100644 --- a/src/components/NotificationDialog.vue +++ b/src/components/NotificationDialog.vue @@ -469,6 +469,25 @@ 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("enableDefaultNotificationDescription") }} +
+ +
+ +
+ + +
+