From bcf2a319c20d4a8604369ff5d58b682ef5b2a040 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Fri, 30 Jul 2021 15:04:52 +0800 Subject: [PATCH 001/470] update readme --- README.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index ef8211368..3b181eade 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ It is a self-hosted monitoring tool like "Uptime Robot". * Monitoring uptime for HTTP(s) / TCP / Ping. * Fancy, Reactive, Fast UI/UX. -* Notifications via Webhook, Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP) and more by Apprise. +* Notifications via Webhook, Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP) and more by Apprise. * 20 seconds interval. # How to Use @@ -40,7 +40,7 @@ docker run -d --restart=always -p :3001 -v :/app/ ### Without Docker -Required Tools: Node.js >= 14, git and pm2. +Required Tools: Node.js >= 14, git and pm2. ```bash git clone https://github.com/louislam/uptime-kuma.git @@ -62,12 +62,15 @@ pm2 start npm --name uptime-kuma -- run start-server -- --port=80 --hostname=0.0 Browse to http://localhost:3001 after started. -### One-click Deploy to DigitalOcean +### One-click Deploy + + [![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/louislam/uptime-kuma/tree/master&refcode=e2c7eb658434) -Choose Cheapest Plan is enough. (US$ 5) - # How to Update ### Docker @@ -88,7 +91,7 @@ pm2 restart uptime-kuma # What's Next? -I will mark requests/issues to the next milestone. +I will mark requests/issues to the next milestone. https://github.com/louislam/uptime-kuma/milestones # More Screenshots @@ -104,10 +107,10 @@ Telegram Notification Sample: # Motivation -* I was looking for a self-hosted monitoring tool like "Uptime Robot", but it is hard to find a suitable one. One of the close one is statping. Unfortunately, it is not stable and unmaintained. +* I was looking for a self-hosted monitoring tool like "Uptime Robot", but it is hard to find a suitable one. One of the close one is statping. Unfortunately, it is not stable and unmaintained. * Want to build a fancy UI. * Learn Vue 3 and vite.js. -* Show the power of Bootstrap 5. +* Show the power of Bootstrap 5. * Try to use WebSocket with SPA instead of REST API. * Deploy my first Docker image to Docker Hub. From 60aa67892d3b90bf6c2796d91ac7e0eb522d85f5 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Fri, 30 Jul 2021 19:18:26 +0800 Subject: [PATCH 002/470] store ignoreTls and upsideDown into db --- server/model/monitor.js | 60 +++++++++++++++++++++------------------ server/server.js | 4 +++ src/pages/EditMonitor.vue | 2 +- 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/server/model/monitor.js b/server/model/monitor.js index a995b5fa9..1d25df93e 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -1,21 +1,25 @@ -const https = require('https'); +const https = require("https"); const dayjs = require("dayjs"); -const utc = require('dayjs/plugin/utc') -var timezone = require('dayjs/plugin/timezone') +const utc = require("dayjs/plugin/utc") +let timezone = require("dayjs/plugin/timezone") dayjs.extend(utc) dayjs.extend(timezone) const axios = require("axios"); -const {Prometheus} = require("../prometheus"); -const {debug, UP, DOWN, PENDING} = require("../../src/util"); -const {tcping, ping, checkCertificate} = require("../util-server"); -const {R} = require("redbean-node"); -const {BeanModel} = require("redbean-node/dist/bean-model"); -const {Notification} = require("../notification") +const { Prometheus } = require("../prometheus"); +const { + debug, UP, DOWN, PENDING, +} = require("../../src/util"); +const { + tcping, ping, checkCertificate, +} = require("../util-server"); +const { R } = require("redbean-node"); +const { BeanModel } = require("redbean-node/dist/bean-model"); +const { Notification } = require("../notification") // Use Custom agent to disable session reuse // https://github.com/nodejs/node/issues/3940 const customAgent = new https.Agent({ - maxCachedSessions: 0 + maxCachedSessions: 0, }); /** @@ -30,7 +34,7 @@ class Monitor extends BeanModel { let notificationIDList = {}; let list = await R.find("monitor_notification", " monitor_id = ? ", [ - this.id + this.id, ]) for (let bean of list) { @@ -49,7 +53,9 @@ class Monitor extends BeanModel { type: this.type, interval: this.interval, keyword: this.keyword, - notificationIDList + ignoreTls: Boolean(this.ignoreTls), + upsideDown: Boolean(this.upsideDown), + notificationIDList, }; } @@ -63,7 +69,7 @@ class Monitor extends BeanModel { if (! previousBeat) { previousBeat = await R.findOne("heartbeat", " monitor_id = ? ORDER BY time DESC", [ - this.id + this.id, ]) } @@ -76,7 +82,7 @@ class Monitor extends BeanModel { // Duration if (! isFirstBeat) { - bean.duration = dayjs(bean.time).diff(dayjs(previousBeat.time), 'second'); + bean.duration = dayjs(bean.time).diff(dayjs(previousBeat.time), "second"); } else { bean.duration = 0; } @@ -85,7 +91,9 @@ class Monitor extends BeanModel { if (this.type === "http" || this.type === "keyword") { let startTime = dayjs().valueOf(); let res = await axios.get(this.url, { - headers: { "User-Agent": "Uptime-Kuma" }, + headers: { + "User-Agent": "Uptime-Kuma", + }, httpsAgent: customAgent, }); bean.msg = `${res.status} - ${res.statusText}` @@ -124,7 +132,6 @@ class Monitor extends BeanModel { } - } else if (this.type === "port") { bean.ping = await tcping(this.hostname, this.port); bean.msg = "" @@ -168,8 +175,8 @@ class Monitor extends BeanModel { // Send only if the first beat is DOWN if (!isFirstBeat || bean.status === DOWN) { - let notificationList = await R.getAll(`SELECT notification.* FROM notification, monitor_notification WHERE monitor_id = ? AND monitor_notification.notification_id = notification.id `, [ - this.id + let notificationList = await R.getAll("SELECT notification.* FROM notification, monitor_notification WHERE monitor_id = ? AND monitor_notification.notification_id = notification.id ", [ + this.id, ]) let text; @@ -181,7 +188,7 @@ class Monitor extends BeanModel { let msg = `[${this.name}] [${text}] ${bean.msg}`; - for(let notification of notificationList) { + for (let notification of notificationList) { try { await Notification.send(JSON.parse(notification.config), msg, await this.toJSON(), bean.toJSON()) } catch (e) { @@ -194,7 +201,6 @@ class Monitor extends BeanModel { bean.important = false; } - if (bean.status === UP) { console.info(`Monitor #${this.id} '${this.name}': Successful Response: ${bean.ping} ms | Interval: ${this.interval} seconds | Type: ${this.type}`) } else if (bean.status === PENDING) { @@ -242,7 +248,7 @@ class Monitor extends BeanModel { */ async updateTlsInfo(checkCertificateResult) { let tls_info_bean = await R.findOne("monitor_tls_info", "monitor_id = ?", [ - this.id + this.id, ]); if (tls_info_bean == null) { tls_info_bean = R.dispense("monitor_tls_info"); @@ -271,15 +277,15 @@ class Monitor extends BeanModel { AND ping IS NOT NULL AND monitor_id = ? `, [ -duration, - monitorID + monitorID, ])); io.to(userID).emit("avgPing", monitorID, avgPing); } static async sendCertInfo(io, monitorID, userID) { - let tls_info = await R.findOne("monitor_tls_info", "monitor_id = ?", [ - monitorID + let tls_info = await R.findOne("monitor_tls_info", "monitor_id = ?", [ + monitorID, ]); if (tls_info != null) { io.to(userID).emit("certInfo", monitorID, tls_info.info_json); @@ -301,7 +307,7 @@ class Monitor extends BeanModel { WHERE time > DATETIME('now', ? || ' hours') AND monitor_id = ? `, [ -duration, - monitorID + monitorID, ]); let downtime = 0; @@ -325,7 +331,7 @@ class Monitor extends BeanModel { // Handle if heartbeat duration longer than the target duration // e.g. Heartbeat duration = 28hrs, but target duration = 24hrs if (value > sec) { - let trim = dayjs.utc().diff(dayjs(time), 'second'); + let trim = dayjs.utc().diff(dayjs(time), "second"); value = sec - trim; if (value < 0) { @@ -346,8 +352,6 @@ class Monitor extends BeanModel { } } - - io.to(userID).emit("uptime", monitorID, duration, uptime); } } diff --git a/server/server.js b/server/server.js index 3789540db..5cb810f9c 100644 --- a/server/server.js +++ b/server/server.js @@ -197,6 +197,7 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); // Auth Only API // *************************** + // Add a new monitor socket.on("add", async (monitor, callback) => { try { checkLogin(socket) @@ -228,6 +229,7 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); } }); + // Edit a monitor socket.on("editMonitor", async (monitor, callback) => { try { checkLogin(socket) @@ -246,6 +248,8 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); bean.maxretries = monitor.maxretries; bean.port = monitor.port; bean.keyword = monitor.keyword; + bean.ignoreTls = monitor.ignoreTls; + bean.upsideDown = monitor.upsideDown; await R.store(bean) diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index f27be3f13..6754173a0 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -168,7 +168,7 @@ export default { interval: 60, maxretries: 0, notificationIDList: {}, - ignoreTLS: false, + ignoreTls: false, upsideDown: false, } } else if (this.isEdit) { From 06377af7e50793c3b3583ea7150e22c357c4dc1c Mon Sep 17 00:00:00 2001 From: LouisLam Date: Fri, 30 Jul 2021 22:11:14 +0800 Subject: [PATCH 003/470] turn off object-curly-newline, it makes const { a, b, c, d } = require(...) ugly --- .eslintrc.js | 17 +---------------- server/model/monitor.js | 42 ++++++++++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 31 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 3283fa5a5..943e19e9b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -36,22 +36,7 @@ module.exports = { }], "curly": "error", "object-curly-spacing": ["error", "always"], - "object-curly-newline": ["error", { - "ObjectExpression": { - "minProperties": 1, - }, - "ObjectPattern": { - "multiline": true, - "minProperties": 2, - }, - "ImportDeclaration": { - "multiline": true, - }, - "ExportDeclaration": { - "multiline": true, - //'minProperties': 2, - }, - }], + "object-curly-newline": "off", "object-property-newline": "error", "comma-spacing": "error", "brace-style": "error", diff --git a/server/model/monitor.js b/server/model/monitor.js index 1d25df93e..4ff0b4cb9 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -6,22 +6,12 @@ dayjs.extend(utc) dayjs.extend(timezone) const axios = require("axios"); const { Prometheus } = require("../prometheus"); -const { - debug, UP, DOWN, PENDING, -} = require("../../src/util"); -const { - tcping, ping, checkCertificate, -} = require("../util-server"); +const { debug, UP, DOWN, PENDING } = require("../../src/util"); +const { tcping, ping, checkCertificate } = require("../util-server"); const { R } = require("redbean-node"); const { BeanModel } = require("redbean-node/dist/bean-model"); const { Notification } = require("../notification") -// Use Custom agent to disable session reuse -// https://github.com/nodejs/node/issues/3940 -const customAgent = new https.Agent({ - maxCachedSessions: 0, -}); - /** * status: * 0 = DOWN @@ -53,12 +43,28 @@ class Monitor extends BeanModel { type: this.type, interval: this.interval, keyword: this.keyword, - ignoreTls: Boolean(this.ignoreTls), - upsideDown: Boolean(this.upsideDown), + ignoreTls: this.getIgnoreTls(), + upsideDown: this.getUpsideDown(), notificationIDList, }; } + /** + * Parse to boolean + * @returns {boolean} + */ + getIgnoreTls() { + return Boolean(this.ignoreTls) + } + + /** + * Parse to boolean + * @returns {boolean} + */ + getUpsideDown() { + return Boolean(this.upsideDown); + } + start(io) { let previousBeat = null; let retries = 0; @@ -90,11 +96,17 @@ class Monitor extends BeanModel { try { if (this.type === "http" || this.type === "keyword") { let startTime = dayjs().valueOf(); + + // Use Custom agent to disable session reuse + // https://github.com/nodejs/node/issues/3940 let res = await axios.get(this.url, { headers: { "User-Agent": "Uptime-Kuma", }, - httpsAgent: customAgent, + httpsAgent: new https.Agent({ + maxCachedSessions: 0, + rejectUnauthorized: ! this.getIgnoreTls(), + }), }); bean.msg = `${res.status} - ${res.statusText}` bean.ping = dayjs().valueOf() - startTime; From 63f0a3681163d0301f1ff3406a3e2c25dea10222 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sat, 31 Jul 2021 00:01:04 +0800 Subject: [PATCH 004/470] implement upside down mode and ignore tls error --- server/model/monitor.js | 29 ++++++++++++++++++++++++----- src/util.js | 12 +++++++++++- src/util.ts | 12 ++++++++++++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/server/model/monitor.js b/server/model/monitor.js index 4ff0b4cb9..49fcfb303 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -6,7 +6,7 @@ dayjs.extend(utc) dayjs.extend(timezone) const axios = require("axios"); const { Prometheus } = require("../prometheus"); -const { debug, UP, DOWN, PENDING } = require("../../src/util"); +const { debug, UP, DOWN, PENDING, flipStatus } = require("../../src/util"); const { tcping, ping, checkCertificate } = require("../util-server"); const { R } = require("redbean-node"); const { BeanModel } = require("redbean-node/dist/bean-model"); @@ -44,7 +44,7 @@ class Monitor extends BeanModel { interval: this.interval, keyword: this.keyword, ignoreTls: this.getIgnoreTls(), - upsideDown: this.getUpsideDown(), + upsideDown: this.isUpsideDown(), notificationIDList, }; } @@ -61,7 +61,7 @@ class Monitor extends BeanModel { * Parse to boolean * @returns {boolean} */ - getUpsideDown() { + isUpsideDown() { return Boolean(this.upsideDown); } @@ -86,6 +86,10 @@ class Monitor extends BeanModel { bean.time = R.isoDateTime(dayjs.utc()); bean.status = DOWN; + if (this.isUpsideDown()) { + bean.status = flipStatus(bean.status); + } + // Duration if (! isFirstBeat) { bean.duration = dayjs(bean.time).diff(dayjs(previousBeat.time), "second"); @@ -155,14 +159,29 @@ class Monitor extends BeanModel { bean.status = UP; } + if (this.isUpsideDown()) { + bean.status = flipStatus(bean.status); + + if (bean.status === DOWN) { + throw new Error("Flip UP to DOWN"); + } + } + retries = 0; } catch (error) { - if ((this.maxretries > 0) && (retries < this.maxretries)) { + + bean.msg = error.message; + + // If UP come in here, it must be upside down mode + // Just reset the retries + if (this.isUpsideDown() && bean.status === UP) { + retries = 0; + + } else if ((this.maxretries > 0) && (retries < this.maxretries)) { retries++; bean.status = PENDING; } - bean.msg = error.message; } // * ? -> ANY STATUS = important [isFirstBeat] diff --git a/src/util.js b/src/util.js index 68b10c02b..9b4c4dab7 100644 --- a/src/util.js +++ b/src/util.js @@ -1,9 +1,19 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.debug = exports.ucfirst = exports.sleep = exports.PENDING = exports.UP = exports.DOWN = void 0; +exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.PENDING = exports.UP = exports.DOWN = void 0; exports.DOWN = 0; exports.UP = 1; exports.PENDING = 2; +function flipStatus(s) { + if (s === exports.UP) { + return exports.DOWN; + } + if (s === exports.DOWN) { + return exports.UP; + } + return s; +} +exports.flipStatus = flipStatus; function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } diff --git a/src/util.ts b/src/util.ts index 1ea8db1fe..23446c830 100644 --- a/src/util.ts +++ b/src/util.ts @@ -7,6 +7,18 @@ export const DOWN = 0; export const UP = 1; export const PENDING = 2; +export function flipStatus(s) { + if (s === UP) { + return DOWN; + } + + if (s === DOWN) { + return UP; + } + + return s; +} + export function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } From 00cc140acd1c0f749f13033eb2332de27e3c0b8a Mon Sep 17 00:00:00 2001 From: Aleks Bunin Date: Fri, 30 Jul 2021 22:32:59 -0400 Subject: [PATCH 005/470] Simplify apprise instalation --- dockerfile | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/dockerfile b/dockerfile index 4c9f5e0e4..56a063066 100644 --- a/dockerfile +++ b/dockerfile @@ -11,21 +11,10 @@ RUN apk add --no-cache --virtual .build-deps make g++ python3 python3-dev && \ # Touching above code may causes sqlite3 re-compile again, painful slow. # Install apprise -# Hate pip!!! I never run pip install successfully in first run for anything in my life without Google :/ -# Compilation Fail 1 => Google Search "alpine ffi.h" => Add libffi-dev -# Compilation Fail 2 => Google Search "alpine cargo" => Add cargo -# Compilation Fail 3 => Google Search "alpine opensslv.h" => Add openssl-dev -# Compilation Fail 4 => Google Search "alpine opensslv.h" again => Change to libressl-dev musl-dev -# Compilation Fail 5 => Google Search "ERROR: libressl3.3-libtls-3.3.3-r0: trying to overwrite usr/lib/libtls.so.20 owned by libretls-3.3.3-r0." again => Change back to openssl-dev with musl-dev -# Runtime Error => ModuleNotFoundError: No module named 'six' => pip3 install six -# Runtime Error 2 => ModuleNotFoundError: No module named 'six' => apk add py3-six -ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1 -RUN apk add --no-cache python3 py3-pip py3-six cargo -RUN apk add --no-cache --virtual .build-deps libffi-dev musl-dev openssl-dev python3-dev && \ - pip3 install apprise && \ - pip3 cache purge && \ - rm -rf /root/.cache && \ - apk del .build-deps +RUN apk add --no-cache python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib +RUN pip3 install apprise && \ + pip3 cache purge && \ + rm -rf /root/.cache RUN apprise --version # New things add here From d58be56cb9bd398b95c715be39d4026502089273 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sat, 31 Jul 2021 12:21:39 +0800 Subject: [PATCH 006/470] remove "pip3 cache purge" that causes error --- dockerfile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dockerfile b/dockerfile index 56a063066..627222306 100644 --- a/dockerfile +++ b/dockerfile @@ -12,15 +12,16 @@ RUN apk add --no-cache --virtual .build-deps make g++ python3 python3-dev && \ # Install apprise RUN apk add --no-cache python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib -RUN pip3 install apprise && \ - pip3 cache purge && \ - rm -rf /root/.cache +RUN pip3 --no-cache-dir install apprise && \ + rm -rf /root/.cache RUN apprise --version # New things add here COPY . . -RUN npm install && npm run build && npm prune +RUN npm install && \ + npm run build && \ + npm prune EXPOSE 3001 VOLUME ["/app/data"] From 67a4e949a220c88527c0cf2a7610f46cb3bed1e8 Mon Sep 17 00:00:00 2001 From: Niyas Date: Sat, 31 Jul 2021 10:31:41 +0530 Subject: [PATCH 007/470] LunaSea Support --- src/components/NotificationDialog.vue | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue index f716d83bf..15c2bb708 100644 --- a/src/components/NotificationDialog.vue +++ b/src/components/NotificationDialog.vue @@ -323,6 +323,17 @@

+ + + - + - + @@ -33,6 +33,14 @@ export default { type: String, default: "btn-primary", }, + yesText: { + type: String, + default: "Yes", + }, + noText: { + type: String, + default: "No", + }, }, data: () => ({ modal: null, From 7f42888546415fdca83fc75506b6c7802254442b Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sat, 31 Jul 2021 20:42:51 +0800 Subject: [PATCH 015/470] fix eslint for vue (https://github.com/louislam/uptime-kuma/pull/121#issuecomment-889729900) --- .eslintrc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index 9c31b29e5..41ad54b81 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -68,6 +68,6 @@ module.exports = { "array-bracket-newline": ["error", "consistent"], "eol-last": ["error", "always"], //'prefer-template': 'error', - "comma-dangle": ["warn", "always-multiline"], + "comma-dangle": ["warn", "only-multiline"], }, } From 9f0be5f531bdbf5e8ce2b3fa8c75d98225ec2548 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sat, 31 Jul 2021 21:13:32 +0800 Subject: [PATCH 016/470] improve the connection error msg --- src/layouts/Layout.vue | 2 +- src/mixins/socket.js | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue index 8e725500a..4405ebb7b 100644 --- a/src/layouts/Layout.vue +++ b/src/layouts/Layout.vue @@ -1,7 +1,7 @@ From 33d7f8645a08af90bd67bb313f580d519b1c8238 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sat, 31 Jul 2021 22:02:30 +0800 Subject: [PATCH 018/470] json format for setting value --- server/util-server.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/server/util-server.js b/server/util-server.js index d892c1069..c329d0ab6 100644 --- a/server/util-server.js +++ b/server/util-server.js @@ -40,9 +40,15 @@ exports.ping = function (hostname) { } exports.setting = async function (key) { - return await R.getCell("SELECT `value` FROM setting WHERE `key` = ? ", [ + let value = await R.getCell("SELECT `value` FROM setting WHERE `key` = ? ", [ key, - ]) + ]); + + try { + return JSON.parse(value); + } catch (e) { + return value; + } } exports.setSetting = async function (key, value) { @@ -53,7 +59,7 @@ exports.setSetting = async function (key, value) { bean = R.dispense("setting") bean.key = key; } - bean.value = value; + bean.value = JSON.stringify(value); await R.store(bean) } @@ -65,7 +71,11 @@ exports.getSettings = async function (type) { let result = {}; for (let row of list) { - result[row.key] = JSON.parse(row.value); + try { + result[row.key] = JSON.parse(row.value); + } catch (e) { + result[row.key] = row.value; + } } return result; From 6f868c9ec3bc8814f385dcd353aeec5e32ef0939 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sat, 31 Jul 2021 23:41:24 +0800 Subject: [PATCH 019/470] implement no auth --- server/server.js | 9 +++++- src/mixins/socket.js | 13 ++++++-- src/pages/Settings.vue | 71 +++++++++++++++++++++++------------------- 3 files changed, 58 insertions(+), 35 deletions(-) diff --git a/server/server.js b/server/server.js index 967db53a7..25c44ebf9 100644 --- a/server/server.js +++ b/server/server.js @@ -26,7 +26,7 @@ console.log("Importing this project modules"); debug("Importing Monitor"); const Monitor = require("./model/monitor"); debug("Importing Settings"); -const { getSettings, setSettings } = require("./util-server"); +const { getSettings, setSettings, setting } = require("./util-server"); debug("Importing Notification"); const { Notification } = require("./notification"); debug("Importing Database"); @@ -114,6 +114,11 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); socket.emit("setup") } + if (await setting("disableAuth")) { + console.log("Disabled Auth: auto login to admin") + await afterLogin(socket, await R.findOne("user", " username = 'admin' ")) + } + socket.on("disconnect", () => { totalClient--; }); @@ -600,6 +605,8 @@ async function afterLogin(socket, user) { } sendNotificationList(socket) + + socket.emit("autoLogin") } async function getMonitorJSONList(userID) { diff --git a/src/mixins/socket.js b/src/mixins/socket.js index 0c7fed15b..bae045650 100644 --- a/src/mixins/socket.js +++ b/src/mixins/socket.js @@ -56,6 +56,11 @@ export default { this.$router.push("/setup") }); + socket.on("autoLogin", (monitorID, data) => { + this.loggedIn = true; + this.storage().token = "autoLogin" + }); + socket.on("monitorList", (data) => { // Add Helper function Object.entries(data).forEach(([monitorID, monitor]) => { @@ -156,8 +161,12 @@ export default { this.clearData() } - if (this.storage().token) { - this.loginByToken(this.storage().token) + let token = this.storage().token; + + if (token) { + if (token !== "autoLogin") { + this.loginByToken(token) + } } else { this.allowLoginDialog = true; } diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index d11479162..5923e4482 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -27,40 +27,44 @@ -

Change Password

-
-
- - -
+
@@ -128,7 +132,8 @@ export default { }, settings: { - } + }, + loaded: false, } }, watch: { @@ -166,6 +171,7 @@ export default { loadSettings() { this.$root.getSocket().emit("getSettings", (res) => { this.settings = res.data; + this.loaded = true; }) }, @@ -188,6 +194,7 @@ export default { enableAuth() { this.settings.disableAuth = false; this.saveSettings(); + this.$root.storage().token = null; }, }, From ee071e41f5f9e1ec17cee93eb230be37997a6cf2 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Sun, 1 Aug 2021 00:15:33 +0800 Subject: [PATCH 020/470] Update README.md --- README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3b181eade..6646722e8 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ It is a self-hosted monitoring tool like "Uptime Robot". # How to Use -### Docker +## Docker ```bash # Create a volume @@ -38,7 +38,7 @@ Change Port and Volume docker run -d --restart=always -p :3001 -v :/app/data --name uptime-kuma louislam/uptime-kuma:1 ``` -### Without Docker +## Without Docker Required Tools: Node.js >= 14, git and pm2. @@ -62,7 +62,15 @@ pm2 start npm --name uptime-kuma -- run start-server -- --port=80 --hostname=0.0 Browse to http://localhost:3001 after started. -### One-click Deploy + +## One more step for Reverse Proxy + +Unlikely other web apps, Uptime Kuma is based on WebSocket. You need two more header "Upgrade" and "Connection" in order to reverse proxy WebSocket. + +Please read wiki for more info: +https://github.com/louislam/uptime-kuma/wiki/Reverse-Proxy + +## One-click Deploy [![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/louislam/uptime-kuma/tree/master&refcode=e2c7eb658434) @@ -93,7 +93,7 @@ PS: For every new release, it takes some time to build the docker image, please ```bash git fetch --all -git checkout 1.0.8 --force +git checkout 1.0.9 --force npm install npm run build pm2 restart uptime-kuma diff --git a/package.json b/package.json index 79867418c..07cd3054c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uptime-kuma", - "version": "1.0.8", + "version": "1.0.9", "license": "MIT", "repository": { "type": "git", @@ -16,10 +16,10 @@ "update": "", "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.0.8 --target release . --push", + "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.0.9 --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", - "setup": "git checkout 1.0.8 && npm install && npm run build", + "setup": "git checkout 1.0.9 && npm install && npm run build", "version-global-replace": "node extra/version-global-replace.js", "mark-as-nightly": "node extra/mark-as-nightly.js" }, From 655536e457dae6e5888cee1ea464d553708c86a8 Mon Sep 17 00:00:00 2001 From: Nelson Chan Date: Wed, 4 Aug 2021 11:56:10 +0800 Subject: [PATCH 040/470] Fix: use send() instead of end() (#161) --- server/server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/server.js b/server/server.js index c8759df3e..34afc5f10 100644 --- a/server/server.js +++ b/server/server.js @@ -96,8 +96,8 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); app.get("/metrics", basicAuth, prometheusAPIMetrics()) // Universal Route Handler, must be at the end - app.get("*", function(request, response, next) { - response.end(indexHTML) + app.get("*", function(_request, response) { + response.send(indexHTML); }); console.log("Adding socket handler") From 38c0c170e72fb5bfd26b3e16bf33e3744bd3feb8 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 4 Aug 2021 13:31:17 +0800 Subject: [PATCH 041/470] add some comments --- server/server.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/server.js b/server/server.js index 34afc5f10..daaf9555a 100644 --- a/server/server.js +++ b/server/server.js @@ -538,6 +538,10 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); debug("added all socket handlers") + // *************************** + // Better do anything after added all socket handlers here + // *************************** + debug("check auto login") if (await setting("disableAuth")) { console.log("Disabled Auth: auto login to admin") From 8fce62632d51624593779d1139d3dabc5e6534e1 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 4 Aug 2021 13:53:13 +0800 Subject: [PATCH 042/470] a better script for version update --- extra/update-version.js | 70 +++++++++++++++++++++++++++++++++ extra/version-global-replace.js | 39 ------------------ package.json | 2 +- 3 files changed, 71 insertions(+), 40 deletions(-) create mode 100644 extra/update-version.js delete mode 100644 extra/version-global-replace.js diff --git a/extra/update-version.js b/extra/update-version.js new file mode 100644 index 000000000..797724abf --- /dev/null +++ b/extra/update-version.js @@ -0,0 +1,70 @@ +/** + * String.prototype.replaceAll() polyfill + * https://gomakethings.com/how-to-replace-a-section-of-a-string-with-another-one-with-vanilla-js/ + * @author Chris Ferdinandi + * @license MIT + */ +if (!String.prototype.replaceAll) { + String.prototype.replaceAll = function(str, newStr) { + + // If a regex pattern + if (Object.prototype.toString.call(str).toLowerCase() === "[object regexp]") { + return this.replace(str, newStr); + } + + // If a string + return this.replace(new RegExp(str, "g"), newStr); + + }; +} + +const pkg = require("../package.json"); +const fs = require("fs"); +const child_process = require("child_process"); +const oldVersion = pkg.version; +const newVersion = process.argv[2]; + +console.log("Old Version: " + oldVersion); +console.log("New Version: " + newVersion); + +if (! newVersion) { + console.error("invalid version"); + process.exit(1); +} + +const exists = tagExists(newVersion); + +if (! exists) { + // Process package.json + pkg.version = newVersion; + pkg.scripts.setup = pkg.scripts.setup.replaceAll(oldVersion, newVersion); + pkg.scripts["build-docker"] = pkg.scripts["build-docker"].replaceAll(oldVersion, newVersion); + fs.writeFileSync("package.json", JSON.stringify(pkg, null, 4) + "\n"); + + // Process README.md + fs.writeFileSync("README.md", fs.readFileSync("README.md", "utf8").replaceAll(oldVersion, newVersion)); + + //commit(newVersion); + //tag(newVersion); +} else { + console.log("version exists") +} + +function commit(version) { + let msg = "update to " + version; + child_process.spawnSync("git", ["commit", "-m", msg]); +} + +function tag(version) { + child_process.spawnSync("git", ["tag", version]); +} + +function tagExists(version) { + if (! version) { + throw new Error("invalid version"); + } + + let res = child_process.spawnSync("git", ["tag", "-l", version]); + + return res.stdout.toString().trim() === version; +} diff --git a/extra/version-global-replace.js b/extra/version-global-replace.js deleted file mode 100644 index bf9186567..000000000 --- a/extra/version-global-replace.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * String.prototype.replaceAll() polyfill - * https://gomakethings.com/how-to-replace-a-section-of-a-string-with-another-one-with-vanilla-js/ - * @author Chris Ferdinandi - * @license MIT - */ -if (!String.prototype.replaceAll) { - String.prototype.replaceAll = function(str, newStr){ - - // If a regex pattern - if (Object.prototype.toString.call(str).toLowerCase() === '[object regexp]') { - return this.replace(str, newStr); - } - - // If a string - return this.replace(new RegExp(str, 'g'), newStr); - - }; -} - -const pkg = require('../package.json'); -const fs = require("fs"); -const oldVersion = pkg.version -const newVersion = process.argv[2] - -console.log("Old Version: " + oldVersion) -console.log("New Version: " + newVersion) - -if (newVersion) { - // Process package.json - pkg.version = newVersion - pkg.scripts.setup = pkg.scripts.setup.replaceAll(oldVersion, newVersion) - pkg.scripts["build-docker"] = pkg.scripts["build-docker"].replaceAll(oldVersion, newVersion) - fs.writeFileSync("package.json", JSON.stringify(pkg, null, 4) + "\n") - - // Process README.md - fs.writeFileSync("README.md", fs.readFileSync("README.md", 'utf8').replaceAll(oldVersion, newVersion)) -} - diff --git a/package.json b/package.json index 07cd3054c..44acd995f 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "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", "setup": "git checkout 1.0.9 && npm install && npm run build", - "version-global-replace": "node extra/version-global-replace.js", + "update-version": "node extra/update-version.js", "mark-as-nightly": "node extra/mark-as-nightly.js" }, "dependencies": { From 8cd0e7a058421a0fb9f5769bd3e561735f88c3ae Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 4 Aug 2021 13:53:21 +0800 Subject: [PATCH 043/470] a better script for version update --- extra/update-version.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extra/update-version.js b/extra/update-version.js index 797724abf..2296deed5 100644 --- a/extra/update-version.js +++ b/extra/update-version.js @@ -44,8 +44,8 @@ if (! exists) { // Process README.md fs.writeFileSync("README.md", fs.readFileSync("README.md", "utf8").replaceAll(oldVersion, newVersion)); - //commit(newVersion); - //tag(newVersion); + commit(newVersion); + tag(newVersion); } else { console.log("version exists") } From d315e8306bbfed32a13b82ff7a73beb851ff2371 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 4 Aug 2021 13:59:42 +0800 Subject: [PATCH 044/470] update to 1.0.10 --- README.md | 4 ++-- extra/update-version.js | 12 ++++++++++-- package.json | 6 +++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 1fd43a448..534115422 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ https://github.com/louislam/uptime-kuma/wiki/Reverse-Proxy [![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/louislam/uptime-kuma/tree/master&refcode=e2c7eb658434) @@ -93,7 +93,7 @@ PS: For every new release, it takes some time to build the docker image, please ```bash git fetch --all -git checkout 1.0.9 --force +git checkout 1.0.10 --force npm install npm run build pm2 restart uptime-kuma diff --git a/extra/update-version.js b/extra/update-version.js index 2296deed5..ab020c383 100644 --- a/extra/update-version.js +++ b/extra/update-version.js @@ -52,11 +52,19 @@ if (! exists) { function commit(version) { let msg = "update to " + version; - child_process.spawnSync("git", ["commit", "-m", msg]); + + let res = child_process.spawnSync("git", ["commit", "-m", msg, "-a"]); + let stdout = res.stdout.toString().trim(); + console.log(stdout) + + if (stdout.includes("no changes added to commit")) { + throw new Error("commit error") + } } function tag(version) { - child_process.spawnSync("git", ["tag", version]); + let res = child_process.spawnSync("git", ["tag", version]); + console.log(res.stdout.toString().trim()) } function tagExists(version) { diff --git a/package.json b/package.json index 44acd995f..def27f798 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uptime-kuma", - "version": "1.0.9", + "version": "1.0.10", "license": "MIT", "repository": { "type": "git", @@ -16,10 +16,10 @@ "update": "", "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.0.9 --target release . --push", + "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.0.10 --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", - "setup": "git checkout 1.0.9 && npm install && npm run build", + "setup": "git checkout 1.0.10 && npm install && npm run build", "update-version": "node extra/update-version.js", "mark-as-nightly": "node extra/mark-as-nightly.js" }, From 94f2219715533e04d3fe3a07fcaf0754ffd1736f Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Wed, 4 Aug 2021 14:51:05 +0800 Subject: [PATCH 045/470] Create dependabot.yml --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..8abca405f --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "npm" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" From d06711a1a77e2c6fcaa57cd3b4e4539ba4746bbd Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Wed, 4 Aug 2021 15:19:06 +0800 Subject: [PATCH 046/470] Update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 534115422..93b6ad93b 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,14 @@ Abort. Heroku instance killed the server.js if idle, stupid. Re-pull the latest docker image and create another container with the same volume. +For someone who used my "How-to-use" commands to install Uptime Kuma, you can update by this: +```bash +docker pull uptime-kuma:1 +docker stop uptime-kuma +docker rm uptime-kuma +docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1 +``` + PS: For every new release, it takes some time to build the docker image, please be patient if it is not available yet. ### Without Docker From 2c2ac9dc59cfa349ab24d71c0de61257bc504aa9 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Thu, 5 Aug 2021 12:13:39 +0800 Subject: [PATCH 047/470] Delete dependabot.yml --- .github/dependabot.yml | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 8abca405f..000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,11 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 -updates: - - package-ecosystem: "npm" # See documentation for possible values - directory: "/" # Location of package manifests - schedule: - interval: "daily" From a03dd91e40dc485ff95f635858760162f80f4372 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 5 Aug 2021 17:56:38 +0800 Subject: [PATCH 048/470] try to support subdirectory reverse proxy --- index.html | 14 +++++++------- server/server.js | 2 +- vite.config.js | 21 +++++++++++---------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/index.html b/index.html index 66d58c1e6..74dde4db0 100644 --- a/index.html +++ b/index.html @@ -1,16 +1,16 @@ - + - + Uptime Kuma - - -
- - + + +
+ + diff --git a/server/server.js b/server/server.js index daaf9555a..8958aeb4d 100644 --- a/server/server.js +++ b/server/server.js @@ -87,7 +87,7 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); // Normal Router here - app.use("/", express.static("dist")); + app.use(express.static("dist")); // Basic Auth Router here diff --git a/vite.config.js b/vite.config.js index f93fb0269..05a91d199 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,14 +1,15 @@ -import { defineConfig } from 'vite' -import vue from '@vitejs/plugin-vue' -import legacy from '@vitejs/plugin-legacy' +import { defineConfig } from "vite" +import vue from "@vitejs/plugin-vue" +import legacy from "@vitejs/plugin-legacy" // https://vitejs.dev/config/ export default defineConfig({ - plugins: [ - vue(), - legacy({ - targets: ['ie > 11'], - additionalLegacyPolyfills: ['regenerator-runtime/runtime'] - }) - ] + base: "./", + plugins: [ + vue(), + legacy({ + targets: ["ie > 11"], + additionalLegacyPolyfills: ["regenerator-runtime/runtime"] + }) + ] }) From dffe3cf8f2e28803ef0f59a95ff158a6397448a1 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 5 Aug 2021 18:20:34 +0800 Subject: [PATCH 049/470] Revert "try to support subdirectory reverse proxy" This reverts commit a03dd91e40dc485ff95f635858760162f80f4372. --- index.html | 14 +++++++------- server/server.js | 2 +- vite.config.js | 21 ++++++++++----------- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/index.html b/index.html index 74dde4db0..66d58c1e6 100644 --- a/index.html +++ b/index.html @@ -1,16 +1,16 @@ - + - + Uptime Kuma - - -
- - + + +
+ + diff --git a/server/server.js b/server/server.js index 8958aeb4d..daaf9555a 100644 --- a/server/server.js +++ b/server/server.js @@ -87,7 +87,7 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); // Normal Router here - app.use(express.static("dist")); + app.use("/", express.static("dist")); // Basic Auth Router here diff --git a/vite.config.js b/vite.config.js index 05a91d199..f93fb0269 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,15 +1,14 @@ -import { defineConfig } from "vite" -import vue from "@vitejs/plugin-vue" -import legacy from "@vitejs/plugin-legacy" +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import legacy from '@vitejs/plugin-legacy' // https://vitejs.dev/config/ export default defineConfig({ - base: "./", - plugins: [ - vue(), - legacy({ - targets: ["ie > 11"], - additionalLegacyPolyfills: ["regenerator-runtime/runtime"] - }) - ] + plugins: [ + vue(), + legacy({ + targets: ['ie > 11'], + additionalLegacyPolyfills: ['regenerator-runtime/runtime'] + }) + ] }) From 8f7885e58a5edca69e4ff2e3715232474dc5bcb3 Mon Sep 17 00:00:00 2001 From: Nelson Chan Date: Thu, 5 Aug 2021 19:04:38 +0800 Subject: [PATCH 050/470] Feat: Implement MaxRedirects & StatusCodes --- db/patch6.sql | 74 +++++++++++++++++++++++++++++++++++++++ package-lock.json | 7 +++- package.json | 1 + server/database.js | 2 +- server/model/monitor.js | 12 ++++++- server/server.js | 1 + server/util-server.js | 35 ++++++++++++++++-- src/pages/EditMonitor.vue | 71 ++++++++++++++++++++++++++++++------- 8 files changed, 184 insertions(+), 19 deletions(-) create mode 100644 db/patch6.sql diff --git a/db/patch6.sql b/db/patch6.sql new file mode 100644 index 000000000..4f539a271 --- /dev/null +++ b/db/patch6.sql @@ -0,0 +1,74 @@ +-- You should not modify if this have pushed to Github, unless it does serious wrong with the db. +PRAGMA foreign_keys = off; + +BEGIN TRANSACTION; + +create table monitor_dg_tmp ( + id INTEGER not null primary key autoincrement, + name VARCHAR(150), + active BOOLEAN default 1 not null, + user_id INTEGER references user on update cascade on delete + set + null, + interval INTEGER default 20 not null, + url TEXT, + type VARCHAR(20), + weight INTEGER default 2000, + hostname VARCHAR(255), + port INTEGER, + created_date DATETIME default (DATETIME('now')) not null, + keyword VARCHAR(255), + maxretries INTEGER NOT NULL DEFAULT 0, + ignore_tls BOOLEAN default 0 not null, + upside_down BOOLEAN default 0 not null, + maxredirects INTEGER default 10 not null, + accepted_statuscodes_json TEXT default '["200-299"]' not null +); + +insert into + monitor_dg_tmp( + id, + name, + active, + user_id, + interval, + url, + type, + weight, + hostname, + port, + created_date, + keyword, + maxretries, + ignore_tls, + upside_down + ) +select + id, + name, + active, + user_id, + interval, + url, + type, + weight, + hostname, + port, + created_date, + keyword, + maxretries, + ignore_tls, + upside_down +from + monitor; + +drop table monitor; + +alter table + monitor_dg_tmp rename to monitor; + +create index user_id on monitor (user_id); + +COMMIT; + +PRAGMA foreign_keys = on; diff --git a/package-lock.json b/package-lock.json index c62dc8eed..3053e0337 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "uptime-kuma", - "version": "1.0.7", + "version": "1.0.10", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -7021,6 +7021,11 @@ } } }, + "vue-multiselect": { + "version": "3.0.0-alpha.2", + "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.0.0-alpha.2.tgz", + "integrity": "sha512-Xp9fGJECns45v+v8jXbCIsAkCybYkEg0lNwr7Z6HDUSMyx2TEIK2giipPE+qXiShEc1Ipn+ZtttH2iq9hwXP4Q==" + }, "vue-router": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.10.tgz", diff --git a/package.json b/package.json index def27f798..2faac07c3 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "v-pagination-3": "^0.1.6", "vue": "^3.0.5", "vue-confirm-dialog": "^1.0.2", + "vue-multiselect": "^3.0.0-alpha.2", "vue-router": "^4.0.10", "vue-toastification": "^2.0.0-rc.1" }, diff --git a/server/database.js b/server/database.js index 4accbc32e..233d54f7c 100644 --- a/server/database.js +++ b/server/database.js @@ -9,7 +9,7 @@ class Database { static templatePath = "./db/kuma.db" static path = "./data/kuma.db"; - static latestVersion = 5; + static latestVersion = 6; static noReject = true; static async patch() { diff --git a/server/model/monitor.js b/server/model/monitor.js index 49fcfb303..e452e686b 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -7,7 +7,7 @@ dayjs.extend(timezone) const axios = require("axios"); const { Prometheus } = require("../prometheus"); const { debug, UP, DOWN, PENDING, flipStatus } = require("../../src/util"); -const { tcping, ping, checkCertificate } = require("../util-server"); +const { tcping, ping, checkCertificate, checkStatusCode } = require("../util-server"); const { R } = require("redbean-node"); const { BeanModel } = require("redbean-node/dist/bean-model"); const { Notification } = require("../notification") @@ -45,6 +45,8 @@ class Monitor extends BeanModel { keyword: this.keyword, ignoreTls: this.getIgnoreTls(), upsideDown: this.isUpsideDown(), + maxredirects: this.maxredirects, + accepted_statuscodes: this.getAcceptedStatuscodes(), notificationIDList, }; } @@ -65,6 +67,10 @@ class Monitor extends BeanModel { return Boolean(this.upsideDown); } + getAcceptedStatuscodes() { + return JSON.parse(this.accepted_statuscodes_json); + } + start(io) { let previousBeat = null; let retries = 0; @@ -111,6 +117,10 @@ class Monitor extends BeanModel { maxCachedSessions: 0, rejectUnauthorized: ! this.getIgnoreTls(), }), + maxRedirects: this.maxredirects, + validateStatus: (status) => { + return checkStatusCode(status, this.getAcceptedStatuscodes()); + }, }); bean.msg = `${res.status} - ${res.statusText}` bean.ping = dayjs().valueOf() - startTime; diff --git a/server/server.js b/server/server.js index daaf9555a..688966c96 100644 --- a/server/server.js +++ b/server/server.js @@ -274,6 +274,7 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); bean.keyword = monitor.keyword; bean.ignoreTls = monitor.ignoreTls; bean.upsideDown = monitor.upsideDown; + bean.accepted_statuscodes_json = JSON.stringify(monitor.accepted_statuscodes); await R.store(bean) diff --git a/server/util-server.js b/server/util-server.js index 1411a3f69..d9bd54102 100644 --- a/server/util-server.js +++ b/server/util-server.js @@ -9,7 +9,7 @@ exports.tcping = function (hostname, port) { address: hostname, port: port, attempts: 1, - }, function(err, data) { + }, function (err, data) { if (err) { reject(err); @@ -28,7 +28,7 @@ exports.ping = function (hostname) { return new Promise((resolve, reject) => { const ping = new Ping(hostname); - ping.send(function(err, ms) { + ping.send(function (err, ms) { if (err) { reject(err) } else if (ms === null) { @@ -58,7 +58,7 @@ exports.setSetting = async function (key, value) { let bean = await R.findOne("setting", " `key` = ? ", [ key, ]) - if (! bean) { + if (!bean) { bean = R.dispense("setting") bean.key = key; } @@ -158,3 +158,32 @@ exports.checkCertificate = function (res) { fingerprint, }; } + +// Check if the provided status code is within the accepted ranges +// Param: status - the status code to check +// Param: accepted_codes - an array of accepted status codes +// Return: true if the status code is within the accepted ranges, false otherwise +// Will throw an error if the provided status code is not a valid range string or code string + +exports.checkStatusCode = function (status, accepted_codes) { + if (accepted_codes == null || accepted_codes.length === 0) { + return false; + } + + for (const code_range of accepted_codes) { + const code_range_split = code_range.split("-").map(string => parseInt(string)); + if (code_range_split.length === 1) { + if (status === code_range_split[0]) { + return true; + } + } else if (code_range_split.length === 2) { + if (status >= code_range_split[0] && status <= code_range_split[1]) { + return true; + } + } else { + throw new Error("Invalid status code range"); + } + } + + return false; +} diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index 6754173a0..a54016b41 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -1,5 +1,5 @@ @@ -512,3 +512,13 @@ export default { }, } + + diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue index 4405ebb7b..9607483eb 100644 --- a/src/layouts/Layout.vue +++ b/src/layouts/Layout.vue @@ -1,76 +1,78 @@ - diff --git a/src/main.js b/src/main.js index 5b9ab9441..6ef72034c 100644 --- a/src/main.js +++ b/src/main.js @@ -9,6 +9,7 @@ import { FontAwesomeIcon } from "./icon.js"; import EmptyLayout from "./layouts/EmptyLayout.vue"; import Layout from "./layouts/Layout.vue"; import socket from "./mixins/socket"; +import theme from "./mixins/theme"; import Dashboard from "./pages/Dashboard.vue"; import DashboardHome from "./pages/DashboardHome.vue"; import Details from "./pages/Details.vue"; @@ -77,6 +78,7 @@ const router = createRouter({ const app = createApp({ mixins: [ socket, + theme ], data() { return { diff --git a/src/mixins/socket.js b/src/mixins/socket.js index 59abd27c1..46449adeb 100644 --- a/src/mixins/socket.js +++ b/src/mixins/socket.js @@ -29,7 +29,7 @@ export default { notificationList: [], windowWidth: window.innerWidth, showListMobile: false, - connectionErrorMsg: "Cannot connect to the socket server. Reconnecting..." + connectionErrorMsg: "Cannot connect to the socket server. Reconnecting...", } }, diff --git a/src/mixins/theme.js b/src/mixins/theme.js new file mode 100644 index 000000000..673a8caa6 --- /dev/null +++ b/src/mixins/theme.js @@ -0,0 +1,39 @@ +export default { + + data() { + return { + system: (window.matchMedia("(prefers-color-scheme: dark)")) ? "dark" : "light", + userTheme: localStorage.theme, + }; + }, + + mounted() { + // Default Light + if (! this.userTheme) { + this.userTheme = "light"; + } + + document.body.classList.add(this.theme); + }, + + computed: { + theme() { + if (this.userTheme === "auto") { + return this.system; + } + return this.userTheme; + } + }, + + watch: { + userTheme(to, from) { + localStorage.theme = to; + }, + + theme(to, from) { + document.body.classList.remove(from); + document.body.classList.add(this.theme); + } + } +} + diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue index 60b7ca467..bbb60a265 100644 --- a/src/pages/Dashboard.vue +++ b/src/pages/Dashboard.vue @@ -89,7 +89,7 @@ export default { } - diff --git a/src/pages/DashboardHome.vue b/src/pages/DashboardHome.vue index 1fd4f6028..969652f31 100644 --- a/src/pages/DashboardHome.vue +++ b/src/pages/DashboardHome.vue @@ -169,7 +169,7 @@ export default { } - diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index 5eaab88b5..72f2d6a0e 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -20,6 +20,19 @@
+
+
+ + + + + + + + +
+
+
-
+

Notifications

@@ -201,8 +214,17 @@ export default { } - diff --git a/src/util.js b/src/util.js index 8e80cb61a..44630993a 100644 --- a/src/util.js +++ b/src/util.js @@ -29,7 +29,7 @@ function ucfirst(str) { exports.ucfirst = ucfirst; function debug(msg) { if (process.env.NODE_ENV === "development") { - console.log(msg); + console.debug(msg); } } exports.debug = debug; diff --git a/src/util.ts b/src/util.ts index 4d5323208..1ed6d4c64 100644 --- a/src/util.ts +++ b/src/util.ts @@ -39,6 +39,6 @@ export function ucfirst(str) { export function debug(msg) { if (process.env.NODE_ENV === "development") { - console.log(msg) + console.debug(msg); } } From a79e6aa338447b795956984239979a51373c0cac Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sun, 8 Aug 2021 15:02:33 +0800 Subject: [PATCH 069/470] dark theme for multiselect --- src/assets/app.scss | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/assets/app.scss b/src/assets/app.scss index 0c32f2b8c..e70bf71a1 100644 --- a/src/assets/app.scss +++ b/src/assets/app.scss @@ -132,4 +132,27 @@ border-color: $dark-border-color; color: $dark-font-color; } + + // Multiselect + .multiselect__tags { + background-color: $dark-bg2; + border-color: $dark-border-color; + } + + .multiselect__input, .multiselect__single { + background-color: $dark-bg2; + color: $dark-font-color; + } + + .multiselect__content-wrapper { + background-color: $dark-bg2; + } + + .multiselect__option--selected.multiselect__option--highlight { + + } + + .multiselect__option--selected { + background-color: $dark-bg; + } } From 4ff68238c4fb19588627527cf74c14a62e8a8e2a Mon Sep 17 00:00:00 2001 From: Nelson Chan Date: Sun, 8 Aug 2021 15:04:20 +0800 Subject: [PATCH 070/470] Chore: Improve logging during db development --- server/database.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/database.js b/server/database.js index 8d6d4f5b7..b6e0d93f5 100644 --- a/server/database.js +++ b/server/database.js @@ -41,6 +41,8 @@ class Database { if (version === this.latestVersion) { console.info("Database no need to patch"); + } else if (version > this.latestVersion) { + console.info("Warning: Database version is newer than expected"); } else { console.info("Database patch is needed") From 3265c3cbc33a796a15e0b30a199c8d8e40e97502 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sun, 8 Aug 2021 21:03:10 +0800 Subject: [PATCH 071/470] improve multiselect --- server/server.js | 3 ++- src/assets/app.scss | 16 +++++++++++++++- src/pages/EditMonitor.vue | 26 ++++++++++++++++++++++---- src/util.js | 2 +- src/util.ts | 2 +- 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/server/server.js b/server/server.js index f14095eb5..5ebf6180b 100644 --- a/server/server.js +++ b/server/server.js @@ -1,4 +1,5 @@ -console.log("Welcome to Uptime Kuma") +console.log("Welcome to Uptime Kuma"); +console.log("Node Env: " + process.env.NODE_ENV); const { sleep, debug } = require("../src/util"); diff --git a/src/assets/app.scss b/src/assets/app.scss index e70bf71a1..45f09f0bc 100644 --- a/src/assets/app.scss +++ b/src/assets/app.scss @@ -5,6 +5,15 @@ font-family: ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol,noto color emoji; } +::-webkit-scrollbar { + width: 10px; +} + +::-webkit-scrollbar-thumb { + background: #CCC; + border-radius: 20px; +} + .modal { backdrop-filter: blur(3px); } @@ -26,7 +35,7 @@ .shadow-box { - overflow: hidden; + //overflow: hidden; // Forget why add this, but multiple select hide by this box-shadow: 0 15px 70px rgba(0, 0, 0, .1); padding: 10px; border-radius: 10px; @@ -62,6 +71,10 @@ background-color: #090C10; color: $dark-font-color; + &::-webkit-scrollbar-thumb { + background: $dark-border-color; + } + .shadow-box { background-color: $dark-bg; } @@ -146,6 +159,7 @@ .multiselect__content-wrapper { background-color: $dark-bg2; + border-color: $dark-border-color; } .multiselect__option--selected.multiselect__option--highlight { diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index cd7598423..576566b04 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -96,9 +96,20 @@
- - - + + +
Select status codes which are considered as a successful response.
@@ -248,7 +259,7 @@ export default { @import "../assets/vars.scss"; .multiselect__tags { - border-radius: 2rem; + border-radius: 1.5rem; border: 1px solid #ced4da; } @@ -265,8 +276,15 @@ export default { } .multiselect__tag { + border-radius: 50rem; background: $primary !important; } + + .dark { + .multiselect__tag { + color: $dark-font-color2; + } + } From 974672f7c1b9b9912e0443b291dd711ae4b12054 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Tue, 10 Aug 2021 13:09:36 +0800 Subject: [PATCH 104/470] Delete deploy.template.yaml --- .do/deploy.template.yaml | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 .do/deploy.template.yaml diff --git a/.do/deploy.template.yaml b/.do/deploy.template.yaml deleted file mode 100644 index ecbcea7f8..000000000 --- a/.do/deploy.template.yaml +++ /dev/null @@ -1,11 +0,0 @@ -spec: - name: uptime-kuma - services: - - name: server - git: - repo_clone_url: https://github.com/louislam/uptime-kuma - branch: master - http_port: 3001 - build_command: npm run setup - run_command: npm run start-server - From 1e4f9c7e1543799dc2845271c15fb1129c116527 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Tue, 10 Aug 2021 13:10:03 +0800 Subject: [PATCH 105/470] Update README.md --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index 794ee01df..d1c8b383f 100644 --- a/README.md +++ b/README.md @@ -80,15 +80,6 @@ Unlikely other web apps, Uptime Kuma is based on WebSocket. You need two more he Please read wiki for more info: https://github.com/louislam/uptime-kuma/wiki/Reverse-Proxy -### One-click Deploy - - - -[![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/louislam/uptime-kuma/tree/master&refcode=e2c7eb658434) - ## How to Update ### Docker From 9ba1743900bba33cba2f097afb3742d91801ab09 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Tue, 10 Aug 2021 15:02:46 +0800 Subject: [PATCH 106/470] split mobile mixin from socket mixin --- src/layouts/Layout.vue | 22 +++++++++++++++++++--- src/main.js | 4 +++- src/mixins/mobile.js | 25 +++++++++++++++++++++++++ src/mixins/socket.js | 9 --------- 4 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 src/mixins/mobile.js diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue index 93ad065bc..d63f209f1 100644 --- a/src/layouts/Layout.vue +++ b/src/layouts/Layout.vue @@ -1,5 +1,5 @@ + +
-
+
@@ -153,10 +153,6 @@ export default { } } -.hideHeartbeatBar { - display: none; -} - .monitorItem { width: 100%; } From d218661f3db3231022c561de1f4c62aa1fe0ea2e Mon Sep 17 00:00:00 2001 From: LouisLam Date: Tue, 17 Aug 2021 23:08:35 +0800 Subject: [PATCH 174/470] wip: implementing install script --- extra/compile-install-script.ps1 | 3 +- extra/install.batsh | 69 +++++++++++++++++++++ install.sh | 52 ++++++++++++++++ package.json | 3 +- test/test_install_script/centos7.dockerfile | 9 +++ 5 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 extra/install.batsh create mode 100644 install.sh create mode 100644 test/test_install_script/centos7.dockerfile diff --git a/extra/compile-install-script.ps1 b/extra/compile-install-script.ps1 index 4b25b55a2..dd44798ea 100644 --- a/extra/compile-install-script.ps1 +++ b/extra/compile-install-script.ps1 @@ -1 +1,2 @@ -docker run -it --rm -v ${pwd}:/app louislam/batsh /usr/bin/batsh bash --output ./install.sh ./extra/install.batsh \ No newline at end of file +# Must enable File Sharing in Docker Desktop +docker run -it --rm -v ${pwd}:/app louislam/batsh /usr/bin/batsh bash --output ./install.sh ./extra/install.batsh diff --git a/extra/install.batsh b/extra/install.batsh new file mode 100644 index 000000000..005b2db4d --- /dev/null +++ b/extra/install.batsh @@ -0,0 +1,69 @@ +println("====================="); +println("Uptime Kuma Installer"); +println("====================="); +println(""); +println("---------------------------------------"); +println("This script is designed for Linux and basic usage."); +println("For advanced usage, please go to https://github.com/louislam/uptime-kuma/wiki/Installation"); +println("---------------------------------------"); +println(""); +println("Local - Install Uptime Kuma in your current machine with git, Node.js 14 and pm2"); +println("Docker - Install Uptime Kuma Docker container"); +println(""); + +if ("$1" != "") { + type = "$1"; +} else { + call("read", "-p", "Which installation method do you prefer? [DOCKER/local]: ", "type"); +} + +if (type == "local") { + + if ("$1" != "") { + port = "$3"; + } else { + call("read", "-p", "Listening Port [3001]: ", "port"); + } + + if (exists("/etc/redhat-release")) { + os = call("cat", "/etc/redhat-release"); + distribution = "rhel"; + } + + bash("arch=$(uname -i)"); + + println("Your OS: " ++ os); + println("Distribution: " ++ distribution); + println("Arch: " ++ arch); + + if (distribution == "rhel") { + bash("nodePath=$(command -v node)"); + + if (nodePath != "") { + bash("nodeVersion=$(node -e 'console.log(process.versions.node.split(`.`)[0])')"); + println("Node Version: " ++ nodeVersion); + + if (nodeVersion < "12") { + println("Error: Required Node.js 14"); + call("exit", "1"); + + } else { + if (nodeVersion == "12") { + println("Warning: NodeJS " ++ nodeVersion ++ " is not tested."); + } + println("OK"); + } + + } else { + + } + + + + call("yum", "install", "git", "-y"); + } + +} else { + call("read", "-p", "Expose Port [3001]: ", "port"); + call("read", "-p", "Volume Name [uptime-kuma]: ", "volume"); +} diff --git a/install.sh b/install.sh new file mode 100644 index 000000000..8e9c82823 --- /dev/null +++ b/install.sh @@ -0,0 +1,52 @@ +"echo" "-e" "=====================" +"echo" "-e" "Uptime Kuma Installer" +"echo" "-e" "=====================" +"echo" "-e" "" +"echo" "-e" "---------------------------------------" +"echo" "-e" "This script is designed for Linux and basic usage." +"echo" "-e" "For advanced usage, please go to https://github.com/louislam/uptime-kuma/wiki/Installation" +"echo" "-e" "---------------------------------------" +"echo" "-e" "" +"echo" "-e" "Local - Install Uptime Kuma in your current machine with git, Node.js 14 and pm2" +"echo" "-e" "Docker - Install Uptime Kuma Docker container" +"echo" "-e" "" +"echo" "-e" "$1" +if [ "$1" != "" ]; then + type="$1" +else + "read" "-p" "Which installation method do you prefer? [DOCKER/local]: " "type" +fi +if [ "$type" == "local" ]; then + "read" "-p" "Listening Port [3001]: " "port" + if [ -e "/etc/redhat-release" ]; then + os=$("cat" "/etc/redhat-release") + distribution="rhel" +fi + arch=$(uname -i) + "echo" "-e" "Your OS: ""$os" + "echo" "-e" "Distribution: ""$distribution" + "echo" "-e" "Arch: ""$arch" + if [ "$distribution" == "rhel" ]; then + nodePath=$(command -v node) + if [ "$nodePath" != "" ]; then + nodeVersion=$(node -e 'console.log(process.versions.node.split(`.`)[0])') + "echo" "-e" "Node Version: ""$nodeVersion" + _0="12" + if [ $(($nodeVersion < $_0)) == 1 ]; then + "echo" "-e" "Error: Required Node.js 14" + "exit" "1" + else + if [ "$nodeVersion" == "12" ]; then + "echo" "-e" "Warning: NodeJS ""$nodeVersion"" is not tested." +fi + "echo" "-e" "OK" + fi + else +- + fi + "yum" "install" "git" "-y" +fi +else + "read" "-p" "Expose Port [3001]: " "port" + "read" "-p" "Volume Name [uptime-kuma]: " "volume" +fi diff --git a/package.json b/package.json index 891806830..c0ef04f04 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,8 @@ "update-version": "node extra/update-version.js", "mark-as-nightly": "node extra/mark-as-nightly.js", "reset-password": "node extra/reset-password.js", - "compile-install-script": "@powershell -NoProfile -ExecutionPolicy Unrestricted -Command ./extra/compile-install-script.ps1" + "compile-install-script": "@powershell -NoProfile -ExecutionPolicy Unrestricted -Command ./extra/compile-install-script.ps1", + "test-install-script": "docker build --no-cache -f test/test_install_script/centos7.dockerfile ." }, "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.36", diff --git a/test/test_install_script/centos7.dockerfile b/test/test_install_script/centos7.dockerfile new file mode 100644 index 000000000..ef3ec5b61 --- /dev/null +++ b/test/test_install_script/centos7.dockerfile @@ -0,0 +1,9 @@ +FROM centos:7 + +RUN useradd -ms /bin/bash test_user +USER test_user +WORKDIR /home/test_user + +COPY ./install.sh . +RUN ls +RUN bash install.sh local /opt/uptime-kuma 3000 0.0.0.0 From 8a48f5dd7174c3bbe36920ec8240eb59823c3605 Mon Sep 17 00:00:00 2001 From: Ismail D Date: Tue, 17 Aug 2021 17:59:34 +0200 Subject: [PATCH 175/470] Fix typo in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 285f14708..7984a31aa 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Browse to http://localhost:3001 after started. If you want to change **port** and **volume**, or need to browse via a reserve proxy, please read wiki. -### 💪🏻 Without Docker (Recommanded for x86/x64 only) +### 💪🏻 Without Docker (Recommended for x86/x64 only) Required Tools: Node.js >= 14, git and pm2. From f72cdcc663ba7a909599dbe6e456a8b7142a554f Mon Sep 17 00:00:00 2001 From: Nelson Chan Date: Wed, 18 Aug 2021 11:40:20 +0800 Subject: [PATCH 176/470] Feat: Add time to beat tooltip, misc. fixes --- src/components/HeartbeatBar.vue | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/components/HeartbeatBar.vue b/src/components/HeartbeatBar.vue index ddd1617c8..1f4ec1e0e 100644 --- a/src/components/HeartbeatBar.vue +++ b/src/components/HeartbeatBar.vue @@ -7,7 +7,7 @@ class="beat" :class="{ 'empty' : (beat === 0), 'down' : (beat.status === 0), 'pending' : (beat.status === 2) }" :style="beatStyle" - :title="beat.msg" + :title="getBeatTitle(beat)" />
@@ -21,7 +21,10 @@ export default { type: String, default: "big", }, - monitorId: Number, + monitorId: { + type: Number, + required: true, + }, }, data() { return { @@ -36,9 +39,6 @@ export default { computed: { beatList() { - if (! (this.monitorId in this.$root.heartbeatList)) { - this.$root.heartbeatList[this.monitorId] = []; - } return this.$root.heartbeatList[this.monitorId] }, @@ -113,6 +113,11 @@ export default { unmounted() { window.removeEventListener("resize", this.resize); }, + beforeMount() { + if (! (this.monitorId in this.$root.heartbeatList)) { + this.$root.heartbeatList[this.monitorId] = []; + } + }, mounted() { if (this.size === "small") { this.beatWidth = 5.6; @@ -129,6 +134,10 @@ export default { this.maxBeat = Math.floor(this.$refs.wrap.clientWidth / (this.beatWidth + this.beatMargin * 2)) } }, + + getBeatTitle(beat) { + return `${this.$root.datetime(beat.time)} - ${beat.msg}`; + } }, } From 269ac2410b2b586bacd8654ca972f4960ebab0f5 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 18 Aug 2021 14:55:03 +0800 Subject: [PATCH 177/470] install.sh add supports for CentOS --- extra/install.batsh | 95 +++++++++++++++---- install.sh | 84 +++++++++++++--- test/test_install_script/centos7.dockerfile | 5 - test/test_install_script/centos8.dockerfile | 4 + .../test_install_script/ubuntu1604.dockerfile | 4 + 5 files changed, 158 insertions(+), 34 deletions(-) create mode 100644 test/test_install_script/centos8.dockerfile create mode 100644 test/test_install_script/ubuntu1604.dockerfile diff --git a/extra/install.batsh b/extra/install.batsh index 005b2db4d..a89254f8f 100644 --- a/extra/install.batsh +++ b/extra/install.batsh @@ -1,9 +1,13 @@ +// install.sh is generated by ./extra/install.batsh, do not modify it directly. +// "npm run compile-install-script" to compile install.sh +// The command is working on Windows PowerShell and Docker for Windows only. println("====================="); println("Uptime Kuma Installer"); println("====================="); println(""); println("---------------------------------------"); println("This script is designed for Linux and basic usage."); +println("Tested with CentOS 7/8"); println("For advanced usage, please go to https://github.com/louislam/uptime-kuma/wiki/Installation"); println("---------------------------------------"); println(""); @@ -18,16 +22,19 @@ if ("$1" != "") { } if (type == "local") { - - if ("$1" != "") { - port = "$3"; - } else { - call("read", "-p", "Listening Port [3001]: ", "port"); - } + defaultPort = "3001"; + defaultInstallPath = "/opt/uptime-kuma"; if (exists("/etc/redhat-release")) { os = call("cat", "/etc/redhat-release"); distribution = "rhel"; + + } else if (exists("/etc/issue")) { + bash("os=$(head -n1 /etc/issue | cut -f 1 -d ' ')"); + if (os == "Ubuntu") { + distribution = "ubuntu"; + } + } bash("arch=$(uname -i)"); @@ -36,33 +43,89 @@ if (type == "local") { println("Distribution: " ++ distribution); println("Arch: " ++ arch); - if (distribution == "rhel") { - bash("nodePath=$(command -v node)"); + if ("$3" != "") { + port = "$3"; + } else { + call("read", "-p", "Listening Port [$port]: ", "port"); - if (nodePath != "") { + if (port == "") { + port = defaultPort; + } + } + + if ("$2" != "") { + installPath = "$2"; + } else { + call("read", "-p", "Installation Path [$installPath]: ", "installPath"); + + if (installPath == "") { + installPath = defaultInstallPath; + } + } + + if (distribution == "rhel") { + bash("nodeCheck=$(node -v)"); + + if (nodeCheck != "") { bash("nodeVersion=$(node -e 'console.log(process.versions.node.split(`.`)[0])')"); println("Node Version: " ++ nodeVersion); if (nodeVersion < "12") { println("Error: Required Node.js 14"); call("exit", "1"); - - } else { - if (nodeVersion == "12") { - println("Warning: NodeJS " ++ nodeVersion ++ " is not tested."); - } - println("OK"); } + if (nodeVersion == "12") { + println("Warning: NodeJS " ++ nodeVersion ++ " is not tested."); + } } else { + bash("curlCheck=$(curl --version)"); + if (curlCheck == "") { + println("Installing Curl"); + bash("yum -y -q install curl"); + } + + println("Installing Node.js 14"); + bash("curl -sL https://rpm.nodesource.com/setup_14.x | bash - > log.txt"); + bash("yum install -y -q nodejs"); + bash("node -v"); + + bash("nodeCheckAgain=$(node -v)"); + + if (nodeCheckAgain == "") { + println("Error during Node.js installation"); + bash("exit 1"); + } } + bash("check=$(git --version)"); + if (check == "") { + println("Installing Git"); + bash("yum -y -q install git"); + } + bash("check=$(pm2 --version)"); + if (check == "") { + println("Installing PM2"); + bash("npm install pm2 -g"); + bash("pm2 startup"); + } - call("yum", "install", "git", "-y"); + bash("mkdir -p $installPath"); + bash("cd $installPath"); + bash("git clone https://github.com/louislam/uptime-kuma.git ."); + bash("npm run setup"); + + bash("pm2 start npm --name uptime-kuma -- run start-server -- --port=$port"); + bash("pm2 list"); } + if (distribution == "ubuntu") { + println("TODO"); + // TODO + } + } else { call("read", "-p", "Expose Port [3001]: ", "port"); call("read", "-p", "Volume Name [uptime-kuma]: ", "volume"); diff --git a/install.sh b/install.sh index 8e9c82823..2d4479a82 100644 --- a/install.sh +++ b/install.sh @@ -1,50 +1,108 @@ +# install.sh is generated by ./extra/install.batsh, do not modify it directly. +# "npm run compile-install-script" to compile install.sh +# The command is working on Windows PowerShell and Docker for Windows only. "echo" "-e" "=====================" "echo" "-e" "Uptime Kuma Installer" "echo" "-e" "=====================" "echo" "-e" "" "echo" "-e" "---------------------------------------" "echo" "-e" "This script is designed for Linux and basic usage." +"echo" "-e" "Tested with CentOS 7/8" "echo" "-e" "For advanced usage, please go to https://github.com/louislam/uptime-kuma/wiki/Installation" "echo" "-e" "---------------------------------------" "echo" "-e" "" "echo" "-e" "Local - Install Uptime Kuma in your current machine with git, Node.js 14 and pm2" "echo" "-e" "Docker - Install Uptime Kuma Docker container" "echo" "-e" "" -"echo" "-e" "$1" if [ "$1" != "" ]; then type="$1" else "read" "-p" "Which installation method do you prefer? [DOCKER/local]: " "type" fi if [ "$type" == "local" ]; then - "read" "-p" "Listening Port [3001]: " "port" + defaultPort="3001" + defaultInstallPath="/opt/uptime-kuma" if [ -e "/etc/redhat-release" ]; then os=$("cat" "/etc/redhat-release") - distribution="rhel" + distribution="rhel" + else + if [ -e "/etc/issue" ]; then + os=$(head -n1 /etc/issue | cut -f 1 -d ' ') + if [ "$os" == "Ubuntu" ]; then + distribution="ubuntu" +fi fi + fi arch=$(uname -i) "echo" "-e" "Your OS: ""$os" "echo" "-e" "Distribution: ""$distribution" "echo" "-e" "Arch: ""$arch" + if [ "$3" != "" ]; then + port="$3" + else + "read" "-p" "Listening Port [$port]: " "port" + if [ "$port" == "" ]; then + port="$defaultPort" +fi + fi + if [ "$2" != "" ]; then + installPath="$2" + else + "read" "-p" "Installation Path [$installPath]: " "installPath" + if [ "$installPath" == "" ]; then + installPath="$defaultInstallPath" +fi + fi if [ "$distribution" == "rhel" ]; then - nodePath=$(command -v node) - if [ "$nodePath" != "" ]; then + nodeCheck=$(node -v) + if [ "$nodeCheck" != "" ]; then nodeVersion=$(node -e 'console.log(process.versions.node.split(`.`)[0])') "echo" "-e" "Node Version: ""$nodeVersion" _0="12" if [ $(($nodeVersion < $_0)) == 1 ]; then "echo" "-e" "Error: Required Node.js 14" - "exit" "1" - else - if [ "$nodeVersion" == "12" ]; then - "echo" "-e" "Warning: NodeJS ""$nodeVersion"" is not tested." + "exit" "1" +fi + if [ "$nodeVersion" == "12" ]; then + "echo" "-e" "Warning: NodeJS ""$nodeVersion"" is not tested." fi - "echo" "-e" "OK" - fi else -- + curlCheck=$(curl --version) + if [ "$curlCheck" == "" ]; then + "echo" "-e" "Installing Curl" + yum -y -q install curl +fi + "echo" "-e" "Installing Node.js 14" + curl -sL https://rpm.nodesource.com/setup_14.x | bash - > log.txt + yum install -y -q nodejs + node -v + nodeCheckAgain=$(node -v) + if [ "$nodeCheckAgain" == "" ]; then + "echo" "-e" "Error during Node.js installation" + exit 1 +fi fi - "yum" "install" "git" "-y" + check=$(git --version) + if [ "$check" == "" ]; then + "echo" "-e" "Installing Git" + yum -y -q install git +fi + check=$(pm2 --version) + if [ "$check" == "" ]; then + "echo" "-e" "Installing PM2" + npm install pm2 -g + pm2 startup +fi + mkdir -p $installPath + cd $installPath + git clone https://github.com/louislam/uptime-kuma.git . + npm run setup + pm2 start npm --name uptime-kuma -- run start-server -- --port=$port + pm2 list +fi + if [ "$distribution" == "ubuntu" ]; then + "echo" "-e" "TODO" + # TODO fi else "read" "-p" "Expose Port [3001]: " "port" diff --git a/test/test_install_script/centos7.dockerfile b/test/test_install_script/centos7.dockerfile index ef3ec5b61..6e50b9192 100644 --- a/test/test_install_script/centos7.dockerfile +++ b/test/test_install_script/centos7.dockerfile @@ -1,9 +1,4 @@ FROM centos:7 -RUN useradd -ms /bin/bash test_user -USER test_user -WORKDIR /home/test_user - COPY ./install.sh . -RUN ls RUN bash install.sh local /opt/uptime-kuma 3000 0.0.0.0 diff --git a/test/test_install_script/centos8.dockerfile b/test/test_install_script/centos8.dockerfile new file mode 100644 index 000000000..7a121f728 --- /dev/null +++ b/test/test_install_script/centos8.dockerfile @@ -0,0 +1,4 @@ +FROM centos:8 + +COPY ./install.sh . +RUN bash install.sh local /opt/uptime-kuma 3000 0.0.0.0 diff --git a/test/test_install_script/ubuntu1604.dockerfile b/test/test_install_script/ubuntu1604.dockerfile new file mode 100644 index 000000000..8cc6e1449 --- /dev/null +++ b/test/test_install_script/ubuntu1604.dockerfile @@ -0,0 +1,4 @@ +FROM ubuntu:16.04 + +COPY ./install.sh . +RUN bash install.sh local /opt/uptime-kuma 3000 0.0.0.0 From 60b0ee2959d911c721cafee0e8c9ce3be61e3a34 Mon Sep 17 00:00:00 2001 From: Carl Sander Date: Wed, 18 Aug 2021 08:38:05 +0000 Subject: [PATCH 178/470] added K8s-Deployment and edited README --- README.md | 4 +++ kubernetes/README.md | 27 ++++++++++++++++ kubernetes/kustomization.yml | 10 ++++++ kubernetes/uptime-kuma/deployment.yml | 34 +++++++++++++++++++++ kubernetes/uptime-kuma/ingressroute.yml | 39 ++++++++++++++++++++++++ kubernetes/uptime-kuma/kustomization.yml | 5 +++ kubernetes/uptime-kuma/pvc.yml | 10 ++++++ kubernetes/uptime-kuma/service.yml | 13 ++++++++ 8 files changed, 142 insertions(+) create mode 100644 kubernetes/README.md create mode 100644 kubernetes/kustomization.yml create mode 100644 kubernetes/uptime-kuma/deployment.yml create mode 100644 kubernetes/uptime-kuma/ingressroute.yml create mode 100644 kubernetes/uptime-kuma/kustomization.yml create mode 100644 kubernetes/uptime-kuma/pvc.yml create mode 100644 kubernetes/uptime-kuma/service.yml diff --git a/README.md b/README.md index 7984a31aa..82970675e 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,10 @@ docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name upti Browse to http://localhost:3001 after started. +### ☸️ Kubernetes + +See more [here](kubernetes/README.md) + If you want to change **port** and **volume**, or need to browse via a reserve proxy, please read wiki. diff --git a/kubernetes/README.md b/kubernetes/README.md new file mode 100644 index 000000000..1f243b524 --- /dev/null +++ b/kubernetes/README.md @@ -0,0 +1,27 @@ +# Uptime-Kuma K8s Deployment +## How does it work? + +Kustomize is a tool which builds a complete deployment file for all config elements. +You can edit the files in the ```uptime-kuma``` folder except the ```kustomization.yml``` until you know what you're doing. + +It creates a certificate with the specified Issuer and creates the Ingress for the Uptime-Kuma ClusterIP-Service + +## What do i have to edit? +You have to edit the ```ingressroute.yml``` to your needs. +This ingressroute.yml is for the [nginx-ingress-controller](https://kubernetes.github.io/ingress-nginx/) in combination with the [cert-manager](https://cert-manager.io/). + +- host +- secrets and secret names +- (Cluster)Issuer (optional) +- the Version in the Deployment-File + - update: + - change to newer version and run the above commands, it will update the pods one after another + +## How To use: + +- install [kustomize](https://kubectl.docs.kubernetes.io/installation/kustomize/) +- Edit files mentioned above to your needs +- run ```kustomize build > apply.yml``` +- run ```kubectl apply -f apply.yml``` + +Now you should see some k8s magic and Uptime-Kuma should be available at the specified address. \ No newline at end of file diff --git a/kubernetes/kustomization.yml b/kubernetes/kustomization.yml new file mode 100644 index 000000000..0daf10f4d --- /dev/null +++ b/kubernetes/kustomization.yml @@ -0,0 +1,10 @@ +namespace: uptime-kuma +namePrefix: uptime-kuma- + +commonLabels: + app: uptime-kuma + +bases: + - uptime-kuma + + diff --git a/kubernetes/uptime-kuma/deployment.yml b/kubernetes/uptime-kuma/deployment.yml new file mode 100644 index 000000000..9ea1bdffc --- /dev/null +++ b/kubernetes/uptime-kuma/deployment.yml @@ -0,0 +1,34 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + component: uptime-kuma + name: uptime-kuma +spec: + selector: + matchLabels: + component: uptime-kuma + replicas: 3 + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + + template: + metadata: + labels: + component: uptime-kuma + spec: + containers: + - name: uptime-kuma + image: louislam/uptime-kuma:1.2.0 + ports: + - containerPort: 3001 + volumeMounts: + - mountPath: /app/data + name: uptime-kuma-storage + volumes: + - name: uptime-kuma-storage + persistentVolumeClaim: + claimName: uptime-kuma-pvc diff --git a/kubernetes/uptime-kuma/ingressroute.yml b/kubernetes/uptime-kuma/ingressroute.yml new file mode 100644 index 000000000..66ad6fb7e --- /dev/null +++ b/kubernetes/uptime-kuma/ingressroute.yml @@ -0,0 +1,39 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + kubernetes.io/ingress.class: nginx + cert-manager.io/cluster-issuer: letsencrypt-prod + nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" + nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" + nginx.ingress.kubernetes.io/server-snippets: | + location / { + proxy_set_header Upgrade $http_upgrade; + proxy_http_version 1.1; + proxy_set_header X-Forwarded-Host $http_host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header Host $host; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Upgrade $http_upgrade; + proxy_cache_bypass $http_upgrade; + } + name: uptime-kuma-ingress +spec: + tls: + - hosts: + - monitor.cxde.link + secretName: monitor-cxde-link-tls + rules: + - host: monitor.cxde.link + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: uptime-kuma-uptime-kuma + port: + number: 3001 diff --git a/kubernetes/uptime-kuma/kustomization.yml b/kubernetes/uptime-kuma/kustomization.yml new file mode 100644 index 000000000..638a2ab69 --- /dev/null +++ b/kubernetes/uptime-kuma/kustomization.yml @@ -0,0 +1,5 @@ +resources: + - deployment.yml + - service.yml + - ingressroute.yml + - pvc.yml \ No newline at end of file diff --git a/kubernetes/uptime-kuma/pvc.yml b/kubernetes/uptime-kuma/pvc.yml new file mode 100644 index 000000000..c20e5d06c --- /dev/null +++ b/kubernetes/uptime-kuma/pvc.yml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: uptime-kuma-pvc +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 4Gi \ No newline at end of file diff --git a/kubernetes/uptime-kuma/service.yml b/kubernetes/uptime-kuma/service.yml new file mode 100644 index 000000000..67f50a370 --- /dev/null +++ b/kubernetes/uptime-kuma/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: uptime-kuma +spec: + selector: + component: uptime-kuma + type: ClusterIP + ports: + - name: http + port: 3001 + targetPort: 3001 + protocol: TCP From cf5168a4e6e13c14d2c8553077f285dadcee0320 Mon Sep 17 00:00:00 2001 From: Nelson Chan Date: Wed, 18 Aug 2021 12:21:16 +0800 Subject: [PATCH 179/470] Fix: Resize chart on screen breakpoints --- src/components/PingChart.vue | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/PingChart.vue b/src/components/PingChart.vue index 596ca004b..53a837994 100644 --- a/src/components/PingChart.vue +++ b/src/components/PingChart.vue @@ -1,5 +1,5 @@ + + diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue index 5db704085..707017931 100644 --- a/src/pages/Dashboard.vue +++ b/src/pages/Dashboard.vue @@ -1,38 +1,13 @@ @@ -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 25db162721ad31cd137951e4c6716cbb2072185a Mon Sep 17 00:00:00 2001 From: kometchtech <5137077+kometchtech@users.noreply.github.com> Date: Wed, 1 Sep 2021 13:23:44 +0900 Subject: [PATCH 298/470] Create ja.js * Created a Japanese language file. --- src/languages/ja.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/languages/ja.js diff --git a/src/languages/ja.js b/src/languages/ja.js new file mode 100644 index 000000000..da688af07 --- /dev/null +++ b/src/languages/ja.js @@ -0,0 +1,19 @@ +export default { + languageName: "Japanese", + checkEverySecond: "{0}秒ごとにチェックします。", + "Avg.": "平均 ", + retriesDescription: "サービスがダウンとしてマークされ、通知が送信されるまでの最大リトライ数", + ignoreTLSError: "HTTPS ウェブサイトの TLS/SSL エラーを無視する", + upsideDownModeDescription: "ステータスの扱いを逆にします。サービスに到達可能な場合は、DOWNとなる。", + maxRedirectDescription: "フォローするリダイレクトの最大数。リダイレクトを無効にするには0を設定する。", + acceptedStatusCodesDescription: "成功した応答とみなされるステータスコードを選択する。", + passwordNotMatchMsg: "繰り返しのパスワードが一致しません。", + notificationDescription: "監視を機能させるには、監視に通知を割り当ててください。", + keywordDescription: "プレーンHTMLまたはJSON応答でキーワードを検索し、大文字と小文字を区別します", + pauseDashboardHome: "一時停止", + deleteMonitorMsg: "この監視を削除してよろしいですか?", + deleteNotificationMsg: "全ての監視のこの通知を削除してよろしいですか?", + resoverserverDescription: "Cloudflareがデフォルトのサーバーですが、いつでもリゾルバサーバーを変更できます。", + rrtypeDescription: "監視するRRタイプを選択します", + pauseMonitorMsg: "一時停止しますか?", +} From cd1a3a2fb96920e54884dcc26fa87deddeb0682e Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 1 Sep 2021 14:33:00 +0800 Subject: [PATCH 299/470] revert back to node-sqlite3, as better-sqlite3 causes a lot of installation problems --- dockerfile | 7 + package-lock.json | 1574 +++++++++++++++++++++++++++----------------- package.json | 6 +- server/database.js | 3 - 4 files changed, 987 insertions(+), 603 deletions(-) diff --git a/dockerfile b/dockerfile index e08a02395..8674b9993 100644 --- a/dockerfile +++ b/dockerfile @@ -2,6 +2,13 @@ FROM node:14-alpine3.12 AS release WORKDIR /app +# split the sqlite install here, so that it can caches the arm prebuilt +RUN apk add --no-cache --virtual .build-deps make g++ python3 python3-dev git && \ + ln -s /usr/bin/python3 /usr/bin/python && \ + npm install mapbox/node-sqlite3#593c9d && \ + apk del .build-deps && \ + rm -f /usr/bin/python + # Install apprise RUN apk add --no-cache python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib RUN pip3 --no-cache-dir install apprise && \ diff --git a/package-lock.json b/package-lock.json index b9ca8fa00..25be14778 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,18 @@ { "name": "uptime-kuma", - "version": "1.3.2", + "version": "1.5.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "uptime-kuma", - "version": "1.3.2", + "version": "1.5.0", "license": "MIT", "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.36", "@fortawesome/free-regular-svg-icons": "^5.15.4", "@fortawesome/free-solid-svg-icons": "^5.15.4", "@fortawesome/vue-fontawesome": "^3.0.0-4", - "@louislam/better-sqlite3-with-prebuilds": "^7.4.3", "@popperjs/core": "^2.9.3", "args-parser": "^1.3.0", "axios": "^0.21.1", @@ -36,6 +35,7 @@ "redbean-node": "0.1.2", "socket.io": "^4.1.3", "socket.io-client": "^4.1.3", + "sqlite3": "github:mapbox/node-sqlite3#593c9d", "tcp-ping": "^0.1.1", "v-pagination-3": "^0.1.6", "vue": "^3.2.2", @@ -732,18 +732,55 @@ "node": ">= 10" } }, - "node_modules/@louislam/better-sqlite3-with-prebuilds": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@louislam/better-sqlite3-with-prebuilds/-/better-sqlite3-with-prebuilds-7.4.3.tgz", - "integrity": "sha512-v9FFkq47dOtrWBuChce4jPQ+gHzCL7NYkWhk5Z7OvbUmcJ+/v4O6NwI4hA4Ei0XLceVYnAhGK/Vr6Zd8nTnyAw==", - "hasInstallScript": true, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", + "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", "dependencies": { - "@types/integer": "latest", - "bindings": "^1.5.0", - "prebuild-install": "^6.0.1", + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.1", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.4", "tar": "^6.1.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -918,11 +955,6 @@ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q==" }, - "node_modules/@types/integer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/integer/-/integer-4.0.1.tgz", - "integrity": "sha512-QQojPymFcV1hrvWXA1h0pP9RmFBFNuWikZcUEjjVsS19IyKO+jqOX24lp2ZHF4A21EmkosJhJDX7CLG67F2s7A==" - }, "node_modules/@types/jquery": { "version": "3.5.6", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.6.tgz", @@ -1166,6 +1198,11 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.6.tgz", "integrity": "sha512-uwX0Qs2e6kdF+WmxwuxJxOnKs/wEkMArtYpHSm7W+VY/23Tl8syMRyjnzEeXrNCAP0/8HZxEGkHJsjPEDNRuHw==" }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1199,11 +1236,22 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "devOptional": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1312,6 +1360,24 @@ "node": ">=0.10.0" } }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "optional": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -1454,6 +1520,21 @@ "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.1.0.tgz", "integrity": "sha512-t7Zm5YGgEEc/3eYAicF32m/TNvL+XOeYZy9CvBUeJY/szM7frLolFylhrlZNWV/ohWhcUXygrBGjYmoQdxF4CQ==" }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "optional": true + }, "node_modules/axios": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", @@ -1495,25 +1576,6 @@ "node": ">= 0.6.0" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", @@ -1533,6 +1595,15 @@ "node": ">= 0.8" } }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "optional": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -1556,47 +1627,11 @@ "node": ">=8" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/bintrees": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz", "integrity": "sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ=" }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -1692,29 +1727,6 @@ "url": "https://opencollective.com/browserslist" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -1773,6 +1785,12 @@ "url": "https://opencollective.com/browserslist" } }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "optional": true + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2078,6 +2096,18 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz", "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/dayjs": { "version": "1.10.6", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", @@ -2130,25 +2160,6 @@ "node": ">=0.10.0" } }, - "node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -2278,6 +2289,16 @@ "domelementtype": "1" } }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "optional": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -2320,14 +2341,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/engine.io": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.0.tgz", @@ -2399,6 +2412,15 @@ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2726,14 +2748,6 @@ "node": ">=8" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, "node_modules/express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -2799,13 +2813,22 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "devOptional": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ], + "optional": true }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "devOptional": true }, "node_modules/fast-glob": { "version": "3.2.7", @@ -2827,7 +2850,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "devOptional": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -2862,11 +2885,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2960,6 +2978,15 @@ } } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true, + "engines": { + "node": "*" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -2989,11 +3016,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -3104,10 +3126,14 @@ "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz", "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==" }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0" + } }, "node_modules/glob": { "version": "7.1.7", @@ -3243,6 +3269,35 @@ "node": ">=0.6.0" } }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "optional": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "optional": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -3381,6 +3436,33 @@ "node": ">=4.0.0" } }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -3410,25 +3492,6 @@ "postcss": "^8.1.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -3498,7 +3561,8 @@ "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "node_modules/interpret": { "version": "2.2.0", @@ -3675,7 +3739,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "devOptional": true }, "node_modules/is-unicode-supported": { "version": "0.1.0", @@ -3698,7 +3762,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "devOptional": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true }, "node_modules/js-tokens": { "version": "4.0.0", @@ -3719,6 +3789,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -3737,11 +3813,17 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "optional": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "devOptional": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -3749,6 +3831,12 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "optional": true + }, "node_modules/json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -3790,6 +3878,21 @@ "semver": "bin/semver" } }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], + "optional": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "node_modules/jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -4038,6 +4141,20 @@ "sourcemap-codec": "^1.4.4" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/map-obj": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", @@ -4250,17 +4367,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -4284,7 +4390,8 @@ "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true }, "node_modules/minimist-options": { "version": "4.1.0", @@ -4344,11 +4451,6 @@ "node": ">=10" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4365,11 +4467,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -4384,22 +4481,76 @@ "node": ">= 0.6" } }, - "node_modules/node-abi": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", - "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", - "dependencies": { - "semver": "^5.4.1" + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" } }, - "node_modules/node-abi/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, "bin": { - "semver": "bin/semver" + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" } }, + "node_modules/node-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, "node_modules/node-releases": { "version": "1.1.75", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", @@ -4414,6 +4565,20 @@ "node": ">=6.0.0" } }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", @@ -4511,6 +4676,15 @@ "node": ">=0.10.0" } }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "optional": true, + "engines": { + "node": "*" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4713,6 +4887,12 @@ "node": ">=8" } }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "optional": true + }, "node_modules/pg-connection-string": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", @@ -5337,32 +5517,6 @@ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, - "node_modules/prebuild-install": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", - "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", - "dependencies": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.21.0", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5433,20 +5587,17 @@ "node": ">= 0.10" } }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "optional": true }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6" } @@ -5510,28 +5661,6 @@ "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -5745,6 +5874,61 @@ "node": ">=0.10" } }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "optional": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "optional": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -5789,7 +5973,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -5867,7 +6050,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -5963,35 +6145,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6151,6 +6304,52 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/sqlite3": { + "version": "5.0.2", + "resolved": "git+ssh://git@github.com/mapbox/node-sqlite3.git#593c9d498be2510d286349134537e3bf89401c4a", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^3.0.0" + }, + "optionalDependencies": { + "node-gyp": "7.x" + }, + "peerDependencies": { + "node-gyp": "7.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "optional": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -6694,50 +6893,6 @@ "node": ">= 10" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -6806,6 +6961,19 @@ "node": ">=0.6" } }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "optional": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -6829,6 +6997,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "optional": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -6836,6 +7005,12 @@ "node": "*" } }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6969,7 +7144,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, + "devOptional": true, "dependencies": { "punycode": "^2.1.0" } @@ -6987,6 +7162,16 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "optional": true, + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/v-pagination-3": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/v-pagination-3/-/v-pagination-3-0.1.6.tgz", @@ -7021,6 +7206,20 @@ "node": ">= 0.8" } }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "node_modules/vfile": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", @@ -7231,7 +7430,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "devOptional": true, "dependencies": { "isexe": "^2.0.0" }, @@ -7769,7 +7968,8 @@ "@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==" + "integrity": "sha512-dQVhhMRcUPCb0aqk5ohm0KGk5OJ7wFZ9aYapLzJB3Z+xs7LhkRWLTb87reelUAG5PFDjutDAXuloT9hi6cz72A==", + "requires": {} }, "@humanwhocodes/config-array": { "version": "0.5.0", @@ -7849,15 +8049,43 @@ "@intlify/shared": "9.1.7" } }, - "@louislam/better-sqlite3-with-prebuilds": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@louislam/better-sqlite3-with-prebuilds/-/better-sqlite3-with-prebuilds-7.4.3.tgz", - "integrity": "sha512-v9FFkq47dOtrWBuChce4jPQ+gHzCL7NYkWhk5Z7OvbUmcJ+/v4O6NwI4hA4Ei0XLceVYnAhGK/Vr6Zd8nTnyAw==", + "@mapbox/node-pre-gyp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", + "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", "requires": { - "@types/integer": "latest", - "bindings": "^1.5.0", - "prebuild-install": "^6.0.1", + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.1", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.4", "tar": "^6.1.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "@nodelib/fs.scandir": { @@ -8013,11 +8241,6 @@ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q==" }, - "@types/integer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/integer/-/integer-4.0.1.tgz", - "integrity": "sha512-QQojPymFcV1hrvWXA1h0pP9RmFBFNuWikZcUEjjVsS19IyKO+jqOX24lp2ZHF4A21EmkosJhJDX7CLG67F2s7A==" - }, "@types/jquery": { "version": "3.5.6", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.6.tgz", @@ -8140,7 +8363,8 @@ "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 + "dev": true, + "requires": {} }, "@vue/compiler-core": { "version": "3.2.6", @@ -8249,6 +8473,11 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.6.tgz", "integrity": "sha512-uwX0Qs2e6kdF+WmxwuxJxOnKs/wEkMArtYpHSm7W+VY/23Tl8syMRyjnzEeXrNCAP0/8HZxEGkHJsjPEDNRuHw==" }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -8268,13 +8497,22 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "devOptional": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -8358,6 +8596,21 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "optional": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -8469,6 +8722,18 @@ "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.1.0.tgz", "integrity": "sha512-t7Zm5YGgEEc/3eYAicF32m/TNvL+XOeYZy9CvBUeJY/szM7frLolFylhrlZNWV/ohWhcUXygrBGjYmoQdxF4CQ==" }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "optional": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "optional": true + }, "axios": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", @@ -8503,11 +8768,6 @@ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, "base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", @@ -8521,6 +8781,15 @@ "safe-buffer": "5.1.2" } }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, "bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -8538,46 +8807,11 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "bintrees": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz", "integrity": "sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ=" }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -8619,7 +8853,8 @@ "bootstrap": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.0.tgz", - "integrity": "sha512-bs74WNI9BgBo3cEovmdMHikSKoXnDgA6VQjJ7TyTotU6L7d41ZyCEEelPwkYEzsG/Zjv3ie9IE3EMAje0W9Xew==" + "integrity": "sha512-bs74WNI9BgBo3cEovmdMHikSKoXnDgA6VQjJ7TyTotU6L7d41ZyCEEelPwkYEzsG/Zjv3ie9IE3EMAje0W9Xew==", + "requires": {} }, "brace-expansion": { "version": "1.1.11", @@ -8652,15 +8887,6 @@ "node-releases": "^1.1.75" } }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -8700,6 +8926,12 @@ "integrity": "sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "optional": true + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8736,7 +8968,8 @@ "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==" + "integrity": "sha512-EnbVqTJGFKLpg1TROLdCEufrzbmIa2oeLGx8O2Wdjw2EoMudoOo9+YFu+6CM0Z0hQ/v3yq/e/Y6efQMu22n8Jg==", + "requires": {} }, "chokidar": { "version": "3.5.2", @@ -8928,6 +9161,15 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz", "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "dayjs": { "version": "1.10.6", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", @@ -8965,19 +9207,6 @@ } } }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -9082,6 +9311,16 @@ "domelementtype": "1" } }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -9118,14 +9357,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, "engine.io": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.0.tgz", @@ -9187,6 +9418,12 @@ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -9432,11 +9669,6 @@ "clone-regexp": "^2.1.0" } }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -9501,13 +9733,19 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "devOptional": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "optional": true }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "devOptional": true }, "fast-glob": { "version": "3.2.7", @@ -9526,7 +9764,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "devOptional": true }, "fast-levenshtein": { "version": "2.0.6", @@ -9558,11 +9796,6 @@ "flat-cache": "^3.0.4" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -9632,6 +9865,12 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.2.tgz", "integrity": "sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA==" }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true + }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -9652,11 +9891,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -9744,10 +9978,14 @@ "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz", "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==" }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } }, "glob": { "version": "7.1.7", @@ -9848,6 +10086,28 @@ "minimist": "^1.2.5" } }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "optional": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "optional": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "optional": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, "hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -9963,6 +10223,26 @@ "debug": "^4.3.1" } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -9981,12 +10261,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "dev": true, + "requires": {} }, "ignore": { "version": "4.0.6", @@ -10039,7 +10315,8 @@ "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "interpret": { "version": "2.2.0", @@ -10153,7 +10430,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "devOptional": true }, "is-unicode-supported": { "version": "0.1.0", @@ -10170,7 +10447,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "devOptional": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true }, "js-tokens": { "version": "4.0.0", @@ -10188,6 +10471,12 @@ "esprima": "^4.0.0" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -10200,11 +10489,17 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "optional": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "devOptional": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -10212,6 +10507,12 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "optional": true + }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -10245,6 +10546,18 @@ } } }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -10447,6 +10760,14 @@ "sourcemap-codec": "^1.4.4" } }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, "map-obj": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", @@ -10593,11 +10914,6 @@ "mime-db": "1.49.0" } }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" - }, "min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -10615,7 +10931,8 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true }, "minimist-options": { "version": "4.1.0", @@ -10664,11 +10981,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -10679,11 +10991,6 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==" }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -10695,18 +11002,57 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, - "node-abi": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", - "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "optional": true, "requires": { - "semver": "^5.4.1" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true } } }, @@ -10721,6 +11067,14 @@ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.3.tgz", "integrity": "sha512-faZFufgTMrphYoDjvyVpbpJcYzwyFnbAMmQtj1lVBYAUSm3SOy2fIdd9+Mr4UxPosBa0JRw9bJoIwQn+nswiew==" }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, "normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", @@ -10799,6 +11153,12 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "optional": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -10946,6 +11306,12 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "optional": true + }, "pg-connection-string": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", @@ -11097,7 +11463,8 @@ "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 + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -11416,7 +11783,8 @@ "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 + "dev": true, + "requires": {} }, "postcss-value-parser": { "version": "4.1.0", @@ -11424,26 +11792,6 @@ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, - "prebuild-install": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", - "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.21.0", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -11501,20 +11849,17 @@ "ipaddr.js": "1.9.1" } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "optional": true }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "devOptional": true }, "qs": { "version": "6.7.0", @@ -11549,24 +11894,6 @@ "unpipe": "1.0.0" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - } - } - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -11738,6 +12065,53 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "optional": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "optional": true + } + } + }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -11769,7 +12143,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -11814,8 +12187,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "send": { "version": "0.17.1", @@ -11900,21 +12272,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -12046,6 +12403,32 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sqlite3": { + "version": "git+ssh://git@github.com/mapbox/node-sqlite3.git#593c9d498be2510d286349134537e3bf89401c4a", + "from": "sqlite3@github:mapbox/node-sqlite3#593c9d", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^3.0.0", + "node-gyp": "7.x" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -12297,7 +12680,8 @@ "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 + "dev": true, + "requires": {} }, "stylelint-config-standard": { "version": "22.0.0", @@ -12489,48 +12873,6 @@ } } }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "tarn": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.1.tgz", @@ -12579,6 +12921,16 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "optional": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, "trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -12595,10 +12947,17 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "optional": true, "requires": { "safe-buffer": "^5.0.1" } }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -12693,7 +13052,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, + "devOptional": true, "requires": { "punycode": "^2.1.0" } @@ -12708,6 +13067,12 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "optional": true + }, "v-pagination-3": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/v-pagination-3/-/v-pagination-3-0.1.6.tgz", @@ -12739,6 +13104,17 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "vfile": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", @@ -12800,12 +13176,14 @@ "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==" + "integrity": "sha512-gTo1bMDWOLd/6ihmWv8VlPxhc9QaKoE5YqlsKydUOfrrQ3Q3taljF6yI+1TMtAtJLrvZ8DYrePhgBhY1VCJzbQ==", + "requires": {} }, "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==" + "integrity": "sha512-L6Oi+BvmMv6YXvqv5rJNCFHEKSVu7llpWWJczqmAQYOdmPPw5PNYoz1KKS//Fxhi+4QP64dsPjtmvnYGo1jemA==", + "requires": {} }, "vue-eslint-parser": { "version": "7.10.0", @@ -12868,13 +13246,14 @@ "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==" + "integrity": "sha512-hjauv/FyesNZdwcr5m1SCyvu1JmlB+Ts5bTptDLDmsYYlj6Oqv8NYakiElpCF+Abwkn9J/AChh6FwkTL1HOb7Q==", + "requires": {} }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "devOptional": true, "requires": { "isexe": "^2.0.0" } @@ -12913,7 +13292,8 @@ "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} }, "xmlhttprequest-ssl": { "version": "2.0.0", diff --git a/package.json b/package.json index aa106c892..cc8bccb6e 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "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.0 --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.0 && npm install --legacy-peer-deps && npm run build && npm prune", + "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.0 && 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", @@ -32,7 +33,6 @@ "test-install-script-alpine3": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/alpine3.dockerfile .", "test-install-script-ubuntu": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu.dockerfile .", "test-install-script-ubuntu1604": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu1604.dockerfile .", - "test-install-script-debian": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/debian.dockerfile .", "simple-dns-server": "node extra/simple-dns-server.js" }, "dependencies": { @@ -40,7 +40,6 @@ "@fortawesome/free-regular-svg-icons": "^5.15.4", "@fortawesome/free-solid-svg-icons": "^5.15.4", "@fortawesome/vue-fontawesome": "^3.0.0-4", - "@louislam/better-sqlite3-with-prebuilds": "^7.4.3", "@popperjs/core": "^2.9.3", "args-parser": "^1.3.0", "axios": "^0.21.1", @@ -63,6 +62,7 @@ "redbean-node": "0.1.2", "socket.io": "^4.1.3", "socket.io-client": "^4.1.3", + "sqlite3": "github:mapbox/node-sqlite3#593c9d", "tcp-ping": "^0.1.1", "v-pagination-3": "^0.1.6", "vue": "^3.2.2", diff --git a/server/database.js b/server/database.js index 7ce81be11..98b7062aa 100644 --- a/server/database.js +++ b/server/database.js @@ -13,9 +13,6 @@ class Database { static async connect() { const acquireConnectionTimeout = 120 * 1000; - R.useBetterSQLite3 = true; - R.betterSQLite3Options.timeout = acquireConnectionTimeout; - R.setup("sqlite", { filename: Database.path, useNullAsDefault: true, From f1238ab76205485c43c27cc655478c832e7ee5b0 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 1 Sep 2021 14:41:06 +0800 Subject: [PATCH 300/470] update to 1.5.1 --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index cc8bccb6e..e292076ec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uptime-kuma", - "version": "1.5.0", + "version": "1.5.1", "license": "MIT", "repository": { "type": "git", @@ -20,11 +20,11 @@ "update": "", "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.0 --target release . --push", + "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.1 --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.0 && npm install --legacy-peer-deps && node node_modules/esbuild/install.js && npm run build && npm prune", + "setup": "git checkout 1.5.1 && 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 bc70ecfba7ab3a729624e478a74184512d5fb98d Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 1 Sep 2021 14:56:19 +0800 Subject: [PATCH 301/470] fix install script --- extra/install.batsh | 4 ++-- install.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extra/install.batsh b/extra/install.batsh index d0ac2794f..bca0b095f 100644 --- a/extra/install.batsh +++ b/extra/install.batsh @@ -212,8 +212,8 @@ if (type == "local") { bash("check=$(docker info)"); bash("if [[ \"$check\" == *\"Is the docker daemon running\"* ]]; then - echo \"Error: docker is not running\" - exit 1 + \"echo\" \"Error: docker is not running\" + \"exit\" \"1\" fi"); if ("$3" != "") { diff --git a/install.sh b/install.sh index ede9f4641..37d675317 100644 --- a/install.sh +++ b/install.sh @@ -176,8 +176,8 @@ else fi check=$(docker info) if [[ "$check" == *"Is the docker daemon running"* ]]; then - echo "Error: docker is not running" - exit 1 + "echo" "Error: docker is not running" + "exit" "1" fi if [ "$3" != "" ]; then port="$3" From e4b76717bebb952299f3e7472b61803abe85ee02 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 1 Sep 2021 15:02:04 +0800 Subject: [PATCH 302/470] revert back to node-sqlite3 --- server/database.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/server/database.js b/server/database.js index 98b7062aa..c0a53a9b8 100644 --- a/server/database.js +++ b/server/database.js @@ -121,11 +121,8 @@ class Database { return statement !== ""; }) - // Use better-sqlite3 to run, prevent "This statement does not return data. Use run() instead" - const db = await this.getBetterSQLite3Database(); - for (let statement of statements) { - db.prepare(statement).run(); + await R.exec(statement); } } From a5e62141d5bd70a6801f0af65c70b4eb82fc3648 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 1 Sep 2021 15:04:31 +0800 Subject: [PATCH 303/470] update to 1.5.2 --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index e292076ec..ce05d56d8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uptime-kuma", - "version": "1.5.1", + "version": "1.5.2", "license": "MIT", "repository": { "type": "git", @@ -20,11 +20,11 @@ "update": "", "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.1 --target release . --push", + "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-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.1 && npm install --legacy-peer-deps && node node_modules/esbuild/install.js && npm run build && npm prune", + "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", "reset-password": "node extra/reset-password.js", From 22095c09b1e8e19ec25ebc2fe31ae5f062818480 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 1 Sep 2021 15:49:35 +0800 Subject: [PATCH 304/470] add translation guide --- src/languages/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/languages/README.md diff --git a/src/languages/README.md b/src/languages/README.md new file mode 100644 index 000000000..d747eaf8d --- /dev/null +++ b/src/languages/README.md @@ -0,0 +1,11 @@ +# How to translate + +1. Fork this repo. +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-file` +4. Your language file should be filled in. You can now translate now. +5. Make a pull request when you have done. + +If you do not have programming skills, let me know in Issue section. I will assist you. 😏 + From ad38e61c263835838d83fccc0b40e1845685c2d3 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 1 Sep 2021 17:08:27 +0800 Subject: [PATCH 305/470] add language file preparation script --- extra/update-language-files/.gitignore | 3 + extra/update-language-files/index.js | 75 ++++++++++++++++++++ extra/update-language-files/package.json | 12 ++++ package.json | 3 +- src/languages/README.md | 7 +- src/languages/de-DE.js | 5 +- src/languages/en.js | 89 ++++++++++++++++++++++++ src/languages/fr.js | 6 +- src/languages/zh-HK.js | 6 +- 9 files changed, 195 insertions(+), 11 deletions(-) create mode 100644 extra/update-language-files/.gitignore create mode 100644 extra/update-language-files/index.js create mode 100644 extra/update-language-files/package.json diff --git a/extra/update-language-files/.gitignore b/extra/update-language-files/.gitignore new file mode 100644 index 000000000..410c913ca --- /dev/null +++ b/extra/update-language-files/.gitignore @@ -0,0 +1,3 @@ +package-lock.json +test.js +languages/ diff --git a/extra/update-language-files/index.js b/extra/update-language-files/index.js new file mode 100644 index 000000000..65032fd7f --- /dev/null +++ b/extra/update-language-files/index.js @@ -0,0 +1,75 @@ +// Need to use es6 to read language files + +import fs from "fs"; +import path from "path"; +import util from "util"; + +// https://stackoverflow.com/questions/13786160/copy-folder-recursively-in-node-js +/** + * Look ma, it's cp -R. + * @param {string} src The path to the thing to copy. + * @param {string} dest The path to the new copy. + */ +const copyRecursiveSync = function (src, dest) { + let exists = fs.existsSync(src); + let stats = exists && fs.statSync(src); + let isDirectory = exists && stats.isDirectory(); + if (isDirectory) { + fs.mkdirSync(dest); + fs.readdirSync(src).forEach(function (childItemName) { + copyRecursiveSync(path.join(src, childItemName), + path.join(dest, childItemName)); + }); + } else { + fs.copyFileSync(src, dest); + } +}; +console.log(process.argv) +const baseLangCode = process.argv[2] || "zh-HK"; +console.log("Base Lang: " + baseLangCode); +fs.rmdirSync("./languages", { recursive: true }); +copyRecursiveSync("../../src/languages", "./languages"); + +const en = (await import("./languages/en.js")).default; +const baseLang = (await import(`./languages/${baseLangCode}.js`)).default; +const files = fs.readdirSync("./languages"); +console.log(files); +for (const file of files) { + if (file.endsWith(".js")) { + console.log("Processing " + file); + const lang = await import("./languages/" + file); + + let obj; + + if (lang.default) { + console.log("is js module"); + obj = lang.default; + } else { + console.log("empty file"); + obj = {}; + } + + // En first + for (const key in en) { + if (! obj[key]) { + obj[key] = en[key]; + } + } + + // Base second + for (const key in baseLang) { + if (! obj[key]) { + obj[key] = key; + } + } + + const code = "export default " + util.inspect(obj, { + depth: null, + }); + + fs.writeFileSync(`../../src/languages/${file}`, code); + + } +} + +fs.rmdirSync("./languages", { recursive: true }); diff --git a/extra/update-language-files/package.json b/extra/update-language-files/package.json new file mode 100644 index 000000000..c7295175a --- /dev/null +++ b/extra/update-language-files/package.json @@ -0,0 +1,12 @@ +{ + "name": "update-language-files", + "type": "module", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} diff --git a/package.json b/package.json index ce05d56d8..f279351ec 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,8 @@ "test-install-script-alpine3": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/alpine3.dockerfile .", "test-install-script-ubuntu": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu.dockerfile .", "test-install-script-ubuntu1604": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu1604.dockerfile .", - "simple-dns-server": "node extra/simple-dns-server.js" + "simple-dns-server": "node extra/simple-dns-server.js", + "update-language-files": "cd extra/update-language-files && node index.js %npm_config_base_lang% && eslint ../../src/languages/**.js --fix" }, "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.36", diff --git a/src/languages/README.md b/src/languages/README.md index d747eaf8d..3da55e8dc 100644 --- a/src/languages/README.md +++ b/src/languages/README.md @@ -2,10 +2,9 @@ 1. Fork this repo. 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-file` -4. Your language file should be filled in. You can now translate now. -5. Make a pull request when you have done. +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 when you have done. If you do not have programming skills, let me know in Issue section. I will assist you. 😏 diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index ba852cf32..943034aff 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -93,8 +93,8 @@ export default { "No Monitors, please": "Keine Monitore, bitte", "add one": "hinzufügen", "Notification Type": "Benachrichtigungs Dienst", - "Email": "E-Mail", - "Test": "Test", + 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.", deleteMonitorMsg: "Bist du sicher das du den Monitor löschen möchtest?", @@ -104,4 +104,5 @@ 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?", + "Resource Record Type": "Resource Record Type" } diff --git a/src/languages/en.js b/src/languages/en.js index 75c25dd57..f32df2a57 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -16,4 +16,93 @@ 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?", + Settings: "Settings", + Dashboard: "Dashboard", + "New Update": "New Update", + Language: "Language", + Appearance: "Appearance", + Theme: "Theme", + General: "General", + Version: "Version", + "Check Update On GitHub": "Check Update On GitHub", + List: "List", + Add: "Add", + "Add New Monitor": "Add New Monitor", + "Quick Stats": "Quick Stats", + Up: "Up", + Down: "Down", + Pending: "Pending", + Unknown: "Unknown", + Pause: "Pause", + Name: "Name", + Status: "Status", + DateTime: "DateTime", + Message: "Message", + "No important events": "No important events", + Resume: "Resume", + Edit: "Edit", + Delete: "Delete", + Current: "Current", + Uptime: "Uptime", + "Cert Exp.": "Cert Exp.", + days: "days", + day: "day", + "-day": "-day", + hour: "hour", + "-hour": "-hour", + Response: "Response", + Ping: "Ping", + "Monitor Type": "Monitor Type", + Keyword: "Keyword", + "Friendly Name": "Friendly Name", + URL: "URL", + Hostname: "Hostname", + Port: "Port", + "Heartbeat Interval": "Heartbeat Interval", + Retries: "Retries", + Advanced: "Advanced", + "Upside Down Mode": "Upside Down Mode", + "Max. Redirects": "Max. Redirects", + "Accepted Status Codes": "Accepted Status Codes", + Save: "Save", + Notifications: "Notifications", + "Not available, please setup.": "Not available, please setup.", + "Setup Notification": "Setup Notification", + Light: "Light", + Dark: "Dark", + Auto: "Auto", + "Theme - Heartbeat Bar": "Theme - Heartbeat Bar", + Normal: "Normal", + Bottom: "Bottom", + None: "None", + Timezone: "Timezone", + "Search Engine Visibility": "Search Engine Visibility", + "Allow indexing": "Allow indexing", + "Discourage search engines from indexing site": "Discourage search engines from indexing site", + "Change Password": "Change Password", + "Current Password": "Current Password", + "New Password": "New Password", + "Repeat New Password": "Repeat New Password", + "Update Password": "Update Password", + "Disable Auth": "Disable Auth", + "Enable Auth": "Enable Auth", + Logout: "Logout", + Leave: "Leave", + "I understand, please disable": "I understand, please disable", + Confirm: "Confirm", + Yes: "Yes", + No: "No", + Username: "Username", + Password: "Password", + "Remember me": "Remember me", + Login: "Login", + "No Monitors, please": "No Monitors, please", + "add one": "add one", + "Notification Type": "Notification Type", + Email: "Email", + Test: "Test", + "Certificate Info": "Certificate Info", + "Resolver Server": "Resolver Server", + "Resource Record Type": "Resource Record Type", + "Last Result": "Last Result" } diff --git a/src/languages/fr.js b/src/languages/fr.js index ee409e511..6cc42c450 100644 --- a/src/languages/fr.js +++ b/src/languages/fr.js @@ -93,8 +93,8 @@ export default { "No Monitors, please": "Pas de monitor, veuillez ", "add one": "en ajouter un.", "Notification Type": "Type de notification", - "Email": "Email", - "Test": "Tester", + Email: "Email", + Test: "Tester", keywordDescription: "Le mot clé sera cherché dans la réponse HTML/JSON reçue du site internet.", "Certificate Info": "Des informations sur le certificat SSL", deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer ce monitor ?", @@ -103,4 +103,6 @@ export default { "Resource Record Type": "Type d'enregistrement DNS recherché", resoverserverDescription: "Le DNS de cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.", rrtypeDescription: "Veuillez séléctionner un type d'enregistrement DNS", + pauseMonitorMsg: "Are you sure want to pause?", + "Last Result": "Last Result" } diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js index d0cd334a6..0d060ecb1 100644 --- a/src/languages/zh-HK.js +++ b/src/languages/zh-HK.js @@ -93,8 +93,8 @@ export default { "No Monitors, please": "沒有監測器,請", "add one": "新增", "Notification Type": "通知類型", - "Email": "電郵", - "Test": "測試", + Email: "電郵", + Test: "測試", keywordDescription: "搜索 HTML 或 JSON 裡是否有出現關鍵字(注意英文大細階)", "Certificate Info": "憑證詳細資料", deleteMonitorMsg: "是否確定刪除這個監測器", @@ -103,4 +103,6 @@ export default { "Resource Record Type": "DNS 記錄類型", resoverserverDescription: "預設值為 Cloudflare DNS 伺服器,你可以轉用其他 DNS 伺服器。", rrtypeDescription: "請選擇 DNS 記錄類型", + pauseMonitorMsg: "Are you sure want to pause?", + "Last Result": "Last Result" } From 923d325b4463783d52242ad9eb215fb3b8b99c61 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 1 Sep 2021 17:10:12 +0800 Subject: [PATCH 306/470] add language file preparation script --- extra/update-language-files/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extra/update-language-files/index.js b/extra/update-language-files/index.js index 65032fd7f..bf580594d 100644 --- a/extra/update-language-files/index.js +++ b/extra/update-language-files/index.js @@ -46,7 +46,9 @@ for (const file of files) { obj = lang.default; } else { console.log("empty file"); - obj = {}; + obj = { + languageName: "" + }; } // En first From e37cf9b1a74d30cfbb876060a7e6464b42279f27 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 1 Sep 2021 17:32:41 +0800 Subject: [PATCH 307/470] add missing and add Japanese to the list --- src/languages/ja.js | 91 ++++++++++++++++++++++++++++++++++++++++++++- src/main.js | 2 + 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/src/languages/ja.js b/src/languages/ja.js index da688af07..171c3d12b 100644 --- a/src/languages/ja.js +++ b/src/languages/ja.js @@ -1,5 +1,5 @@ export default { - languageName: "Japanese", + languageName: "日本語", checkEverySecond: "{0}秒ごとにチェックします。", "Avg.": "平均 ", retriesDescription: "サービスがダウンとしてマークされ、通知が送信されるまでの最大リトライ数", @@ -16,4 +16,93 @@ export default { resoverserverDescription: "Cloudflareがデフォルトのサーバーですが、いつでもリゾルバサーバーを変更できます。", rrtypeDescription: "監視するRRタイプを選択します", pauseMonitorMsg: "一時停止しますか?", + Settings: "Settings", + Dashboard: "Dashboard", + "New Update": "New Update", + Language: "Language", + Appearance: "Appearance", + Theme: "Theme", + General: "General", + Version: "Version", + "Check Update On GitHub": "Check Update On GitHub", + List: "List", + Add: "Add", + "Add New Monitor": "Add New Monitor", + "Quick Stats": "Quick Stats", + Up: "Up", + Down: "Down", + Pending: "Pending", + Unknown: "Unknown", + Pause: "Pause", + Name: "Name", + Status: "Status", + DateTime: "DateTime", + Message: "Message", + "No important events": "No important events", + Resume: "Resume", + Edit: "Edit", + Delete: "Delete", + Current: "Current", + Uptime: "Uptime", + "Cert Exp.": "Cert Exp.", + days: "days", + day: "day", + "-day": "-day", + hour: "hour", + "-hour": "-hour", + Response: "Response", + Ping: "Ping", + "Monitor Type": "Monitor Type", + Keyword: "Keyword", + "Friendly Name": "Friendly Name", + URL: "URL", + Hostname: "Hostname", + Port: "Port", + "Heartbeat Interval": "Heartbeat Interval", + Retries: "Retries", + Advanced: "Advanced", + "Upside Down Mode": "Upside Down Mode", + "Max. Redirects": "Max. Redirects", + "Accepted Status Codes": "Accepted Status Codes", + Save: "Save", + Notifications: "Notifications", + "Not available, please setup.": "Not available, please setup.", + "Setup Notification": "Setup Notification", + Light: "Light", + Dark: "Dark", + Auto: "Auto", + "Theme - Heartbeat Bar": "Theme - Heartbeat Bar", + Normal: "Normal", + Bottom: "Bottom", + None: "None", + Timezone: "Timezone", + "Search Engine Visibility": "Search Engine Visibility", + "Allow indexing": "Allow indexing", + "Discourage search engines from indexing site": "Discourage search engines from indexing site", + "Change Password": "Change Password", + "Current Password": "Current Password", + "New Password": "New Password", + "Repeat New Password": "Repeat New Password", + "Update Password": "Update Password", + "Disable Auth": "Disable Auth", + "Enable Auth": "Enable Auth", + Logout: "Logout", + Leave: "Leave", + "I understand, please disable": "I understand, please disable", + Confirm: "Confirm", + Yes: "Yes", + No: "No", + Username: "Username", + Password: "Password", + "Remember me": "Remember me", + Login: "Login", + "No Monitors, please": "No Monitors, please", + "add one": "add one", + "Notification Type": "Notification Type", + Email: "Email", + Test: "Test", + "Certificate Info": "Certificate Info", + "Resolver Server": "Resolver Server", + "Resource Record Type": "Resource Record Type", + "Last Result": "Last Result" } diff --git a/src/main.js b/src/main.js index cdf379981..a77e47ac4 100644 --- a/src/main.js +++ b/src/main.js @@ -27,6 +27,7 @@ import en from "./languages/en"; import zhHK from "./languages/zh-HK"; import deDE from "./languages/de-DE"; import fr from "./languages/fr"; +import ja from "./languages/ja"; const routes = [ { @@ -94,6 +95,7 @@ const languageList = { "zh-HK": zhHK, "de-DE": deDE, "fr": fr, + "ja": ja, }; const i18n = createI18n({ From 6376d4eb925013b33ca33cb359a9a5445f1fed48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20S=C3=B8rensen?= Date: Wed, 1 Sep 2021 11:51:22 +0200 Subject: [PATCH 308/470] Translated to Danish --- src/languages/da-DK.js | 109 +++++++++++++++++++++++++++++++++++++++++ src/main.js | 2 + 2 files changed, 111 insertions(+) create mode 100644 src/languages/da-DK.js diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js new file mode 100644 index 000000000..51e6cfce9 --- /dev/null +++ b/src/languages/da-DK.js @@ -0,0 +1,109 @@ +export default { + languageName: "Danish", + Settings: "Indstillinger", + Dashboard: "Dashboard", + "New Update": "Opdatering tilgængelig", + Language: "Sprog", + Appearance: "Udseende", + Theme: "Tema", + General: "Generelt", + Version: "Version", + "Check Update On GitHub": "Tjek efter opdateringer på Github", + List: "Liste", + Add: "Tilføj", + "Add New Monitor": "Tilføj ny Overvåger", + "Quick Stats": "Oversigt", + Up: "Aktiv", + Down: "Inaktiv", + Pending: "Afventer", + Unknown: "Ukendt", + Pause: "Pause", + pauseDashboardHome: "Pauset", + Name: "Navn", + Status: "Status", + DateTime: "Dato / Tid", + Message: "Beskeder", + "No important events": "Inden vigtige begivenheder", + Resume: "Fortsæt", + Edit: "Rediger", + Delete: "Slet", + Current: "Aktuelt", + Uptime: "Oppetid", + "Cert Exp.": "Certifikatets udløb", + days: "Dage", + day: "Dag", + "-day": "-Dage", + hour: "Timer", + "-hour": "-Timer", + checkEverySecond: "Tjek hvert {0} sekund", + "Avg.": "Gennemsnit", + Response: " Respons", + Ping: "Ping", + "Monitor Type": "Overvåger Type", + Keyword: "Nøgleord", + "Friendly Name": "Visningsnavn", + URL: "URL", + Hostname: "Hostname", + Port: "Port", + "Heartbeat Interval": "Taktinterval", + Retries: "Gentagelser", + retriesDescription: "Maksimalt antal gentagelser, før tjenesten markeres som inaktiv og sender en meddelelse.", + Advanced: "Avanceret", + ignoreTLSError: "Ignorere TLS/SSL web fejl", + "Upside Down Mode": "Omvendt tilstand", + upsideDownModeDescription: "Håndter tilstanden omvendt. Hvis tjenesten er tilgængelig, vises den som inaktiv.", + "Max. Redirects": "Maks. Omdirigeringer", + maxRedirectDescription: "Maksimalt antal omdirigeringer, der skal følges. Indstil til 0 for at deaktivere omdirigeringer.", + "Accepted Status Codes": "Tilladte HTTP-Statuskoder", + acceptedStatusCodesDescription: "Vælg de statuskoder, der stadig skal vurderes som vellykkede.", + Save: "Gem", + Notifications: "Underretninger", + "Not available, please setup.": "Ikke tilgængelige, opsæt venligst.", + "Setup Notification": "Opsæt underretninger", + Light: "Lys", + Dark: "Mørk", + Auto: "Auto", + "Theme - Heartbeat Bar": "Tema - Tidslinje", + Normal: "Normal", + Bottom: "Bunden", + None: "Ingen", + Timezone: "Tidszone", + "Search Engine Visibility": "Søgemaskine synlighed", + "Allow indexing": "Tillad indeksering", + "Discourage search engines from indexing site": "Frabed søgemaskiner at indeksere webstedet", + "Change Password": "Ændre adgangskode", + "Current Password": "Nuværende adgangskode", + "New Password": "Ny adgangskode", + "Repeat New Password": "Gentag den nye adgangskode", + passwordNotMatchMsg: "Adgangskoderne er ikke ens.", + "Update Password": "Opdater adgangskode", + "Disable Auth": "Deaktiver autentificering", + "Enable Auth": "Aktiver autentificering", + Logout: "Log ud", + notificationDescription: "Tildel underretninger til Overvåger(e), så denne funktion træder i kraft.", + Leave: "Verlassen", + "I understand, please disable": "Jeg er indforstået, deaktiver venligst", + Confirm: "Bekræft", + Yes: "Ja", + No: "Nej", + Username: "Brugernavn", + Password: "Adgangskode", + "Remember me": "Husk mig", + Login: "Log ind", + "No Monitors, please": "Ingen Overvågere", + "add one": "tilføj en", + "Notification Type": "Underretningstype", + "Email": "E-Mail", + "Test": "Test", + "Certificate Info": "Certifikatoplysninger", + keywordDescription: "Søg efter et søgeord i almindelig HTML- eller JSON -output. Bemærk, at der skelnes mellem store og små bogstaver.", + deleteMonitorMsg: "Er du sikker på, at du vil slette overvågeren?", + deleteNotificationMsg: "Er du sikker på, at du vil slette denne underretning for alle overvågere? ", + resoverserverDescription: "Cloudflare er standardserveren, den kan til enhver tid ændres.", + "Resolver Server": "Navne-server", + rrtypeDescription: "Vælg den type RR, du vil overvåge.", + "Last Result": "Seneste resultat", + pauseMonitorMsg: "Er du sikker på, at du vil pause Overvågeren?", + "Create your admin account": "Opret din administratorkonto", + "Repeat Password": "Gentag adgangskoden", +} diff --git a/src/main.js b/src/main.js index cdf379981..4f6a55750 100644 --- a/src/main.js +++ b/src/main.js @@ -27,6 +27,7 @@ import en from "./languages/en"; import zhHK from "./languages/zh-HK"; import deDE from "./languages/de-DE"; import fr from "./languages/fr"; +import daDK from "./languages/da-DK"; const routes = [ { @@ -94,6 +95,7 @@ const languageList = { "zh-HK": zhHK, "de-DE": deDE, "fr": fr, + "da-DK": daDK, }; const i18n = createI18n({ From 3a3f1762ac36639e402d3a842b778cc8a93bea0f Mon Sep 17 00:00:00 2001 From: kometchtech <5137077+kometchtech@users.noreply.github.com> Date: Wed, 1 Sep 2021 19:04:35 +0900 Subject: [PATCH 309/470] Update ja.js * Perform translation for added keys. --- src/languages/ja.js | 148 ++++++++++++++++++++++---------------------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/src/languages/ja.js b/src/languages/ja.js index 171c3d12b..a96e869f9 100644 --- a/src/languages/ja.js +++ b/src/languages/ja.js @@ -16,93 +16,93 @@ export default { resoverserverDescription: "Cloudflareがデフォルトのサーバーですが、いつでもリゾルバサーバーを変更できます。", rrtypeDescription: "監視するRRタイプを選択します", pauseMonitorMsg: "一時停止しますか?", - Settings: "Settings", - Dashboard: "Dashboard", + Settings: "設定", + Dashboard: "ダッシュボード", "New Update": "New Update", - Language: "Language", - Appearance: "Appearance", - Theme: "Theme", + Language: "言語", + Appearance: "外観", + Theme: "テーマ", General: "General", - Version: "Version", - "Check Update On GitHub": "Check Update On GitHub", - List: "List", - Add: "Add", - "Add New Monitor": "Add New Monitor", - "Quick Stats": "Quick Stats", + Version: "バージョン", + "Check Update On GitHub": "GitHubでアップデートを確認する", + List: "一覧", + Add: "追加", + "Add New Monitor": "監視の追加", + "Quick Stats": "統計", Up: "Up", Down: "Down", - Pending: "Pending", - Unknown: "Unknown", - Pause: "Pause", - Name: "Name", - Status: "Status", - DateTime: "DateTime", - Message: "Message", - "No important events": "No important events", - Resume: "Resume", - Edit: "Edit", - Delete: "Delete", - Current: "Current", - Uptime: "Uptime", - "Cert Exp.": "Cert Exp.", - days: "days", - day: "day", - "-day": "-day", - hour: "hour", - "-hour": "-hour", - Response: "Response", + Pending: "中止", + Unknown: "不明", + Pause: "一時停止", + Name: "名前", + Status: "ステータス", + DateTime: "日時", + Message: "メッセージ", + "No important events": "重要なイベントなし", + Resume: "再開", + Edit: "編集", + Delete: "削除", + Current: "現在", + Uptime: "起動時間", + "Cert Exp.": "証明書有効期限", + days: "日間", + day: "日", + "-day": "-日", + hour: "時間", + "-hour": "-時間", + Response: "レスポンス", Ping: "Ping", - "Monitor Type": "Monitor Type", - Keyword: "Keyword", + "Monitor Type": "監視タイプ", + Keyword: "キーワード", "Friendly Name": "Friendly Name", URL: "URL", - Hostname: "Hostname", - Port: "Port", - "Heartbeat Interval": "Heartbeat Interval", + Hostname: "ホスト名", + Port: "ポート", + "Heartbeat Interval": "監視間隔", Retries: "Retries", Advanced: "Advanced", "Upside Down Mode": "Upside Down Mode", - "Max. Redirects": "Max. Redirects", - "Accepted Status Codes": "Accepted Status Codes", - Save: "Save", - Notifications: "Notifications", - "Not available, please setup.": "Not available, please setup.", - "Setup Notification": "Setup Notification", + "Max. Redirects": "最大リダイレクト数", + "Accepted Status Codes": "承認されたステータスコード", + Save: "保存", + Notifications: "通知", + "Not available, please setup.": "利用できません。設定してください。", + "Setup Notification": "通知設定", Light: "Light", Dark: "Dark", Auto: "Auto", "Theme - Heartbeat Bar": "Theme - Heartbeat Bar", - Normal: "Normal", - Bottom: "Bottom", - None: "None", - Timezone: "Timezone", - "Search Engine Visibility": "Search Engine Visibility", - "Allow indexing": "Allow indexing", - "Discourage search engines from indexing site": "Discourage search engines from indexing site", - "Change Password": "Change Password", - "Current Password": "Current Password", - "New Password": "New Password", - "Repeat New Password": "Repeat New Password", - "Update Password": "Update Password", - "Disable Auth": "Disable Auth", - "Enable Auth": "Enable Auth", - Logout: "Logout", - Leave: "Leave", - "I understand, please disable": "I understand, please disable", - Confirm: "Confirm", - Yes: "Yes", - No: "No", - Username: "Username", - Password: "Password", - "Remember me": "Remember me", - Login: "Login", - "No Monitors, please": "No Monitors, please", + Normal: "通常", + Bottom: "下部", + None: "なし", + Timezone: "タイムゾーン", + "Search Engine Visibility": "検索エンジンでの表示", + "Allow indexing": "インデックス作成を許可する", + "Discourage search engines from indexing site": "検索エンジンにインデックスさせないようにする", + "Change Password": "パスワード変更", + "Current Password": "現在のパスワード", + "New Password": "新しいパスワード", + "Repeat New Password": "確認のため新しいパスワードをもう一度", + "Update Password": "パスワードの更新", + "Disable Auth": "認証の無効化", + "Enable Auth": "認証の有効化", + Logout: "ログアウト", + Leave: "作業を中止する", + "I understand, please disable": "理解した上で無効化する", + Confirm: "確認", + Yes: "はい", + No: "いいえ", + Username: "ユーザー名", + Password: "パスワード", + "Remember me": "パスワードを忘れた場合", + Login: "ログイン", + "No Monitors, please": "監視がありません", "add one": "add one", - "Notification Type": "Notification Type", - Email: "Email", - Test: "Test", - "Certificate Info": "Certificate Info", - "Resolver Server": "Resolver Server", - "Resource Record Type": "Resource Record Type", - "Last Result": "Last Result" + "Notification Type": "通知タイプ", + Email: "Eメール", + Test: "テスト", + "Certificate Info": "証明書情報", + "Resolver Server": "問い合わせ先DNSサーバ", + "Resource Record Type": "DNSレコード設定", + "Last Result": "最終結果" } From c7e6cb9f37560a0ba712debedd2970ac55e226b9 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Wed, 1 Sep 2021 20:10:54 +0800 Subject: [PATCH 310/470] update language files --- extra/update-language-files/index.js | 1 + src/languages/da-DK.js | 5 +++-- src/languages/en.js | 4 +++- src/languages/fr.js | 4 +++- src/languages/ja.js | 4 +++- src/languages/zh-HK.js | 4 +++- 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/extra/update-language-files/index.js b/extra/update-language-files/index.js index bf580594d..ee7c0b5ea 100644 --- a/extra/update-language-files/index.js +++ b/extra/update-language-files/index.js @@ -75,3 +75,4 @@ for (const file of files) { } fs.rmdirSync("./languages", { recursive: true }); +console.log("Done, fix the format by eslint now"); diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js index 51e6cfce9..245ba5ba7 100644 --- a/src/languages/da-DK.js +++ b/src/languages/da-DK.js @@ -93,8 +93,8 @@ export default { "No Monitors, please": "Ingen Overvågere", "add one": "tilføj en", "Notification Type": "Underretningstype", - "Email": "E-Mail", - "Test": "Test", + Email: "E-Mail", + Test: "Test", "Certificate Info": "Certifikatoplysninger", keywordDescription: "Søg efter et søgeord i almindelig HTML- eller JSON -output. Bemærk, at der skelnes mellem store og små bogstaver.", deleteMonitorMsg: "Er du sikker på, at du vil slette overvågeren?", @@ -106,4 +106,5 @@ export default { pauseMonitorMsg: "Er du sikker på, at du vil pause Overvågeren?", "Create your admin account": "Opret din administratorkonto", "Repeat Password": "Gentag adgangskoden", + "Resource Record Type": "Resource Record Type" } diff --git a/src/languages/en.js b/src/languages/en.js index f32df2a57..2781ba819 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -104,5 +104,7 @@ export default { "Certificate Info": "Certificate Info", "Resolver Server": "Resolver Server", "Resource Record Type": "Resource Record Type", - "Last Result": "Last Result" + "Last Result": "Last Result", + "Create your admin account": "Create your admin account", + "Repeat Password": "Repeat Password" } diff --git a/src/languages/fr.js b/src/languages/fr.js index 6cc42c450..ac7aa8a54 100644 --- a/src/languages/fr.js +++ b/src/languages/fr.js @@ -104,5 +104,7 @@ export default { resoverserverDescription: "Le DNS de cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.", rrtypeDescription: "Veuillez séléctionner un type d'enregistrement DNS", pauseMonitorMsg: "Are you sure want to pause?", - "Last Result": "Last Result" + "Last Result": "Last Result", + "Create your admin account": "Create your admin account", + "Repeat Password": "Repeat Password" } diff --git a/src/languages/ja.js b/src/languages/ja.js index a96e869f9..e32e53d69 100644 --- a/src/languages/ja.js +++ b/src/languages/ja.js @@ -104,5 +104,7 @@ export default { "Certificate Info": "証明書情報", "Resolver Server": "問い合わせ先DNSサーバ", "Resource Record Type": "DNSレコード設定", - "Last Result": "最終結果" + "Last Result": "最終結果", + "Create your admin account": "Create your admin account", + "Repeat Password": "Repeat Password" } diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js index 0d060ecb1..12ebb79de 100644 --- a/src/languages/zh-HK.js +++ b/src/languages/zh-HK.js @@ -104,5 +104,7 @@ export default { resoverserverDescription: "預設值為 Cloudflare DNS 伺服器,你可以轉用其他 DNS 伺服器。", rrtypeDescription: "請選擇 DNS 記錄類型", pauseMonitorMsg: "Are you sure want to pause?", - "Last Result": "Last Result" + "Last Result": "Last Result", + "Create your admin account": "Create your admin account", + "Repeat Password": "Repeat Password" } From 3006d13aee733a8c7ab6cc40d809b0344a67e736 Mon Sep 17 00:00:00 2001 From: Adam Stachowicz Date: Wed, 1 Sep 2021 15:37:56 +0200 Subject: [PATCH 311/470] Update translation docs --- src/languages/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/languages/README.md b/src/languages/README.md index 3da55e8dc..1deeacd6f 100644 --- a/src/languages/README.md +++ b/src/languages/README.md @@ -1,10 +1,10 @@ # How to translate 1. Fork this repo. -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 +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 when you have done. +7. 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 Issue section. I will assist you. 😏 +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 00ac560bd616cd5aeb18c6ed9087cd35ac2c7003 Mon Sep 17 00:00:00 2001 From: Levi Date: Wed, 1 Sep 2021 16:30:08 +0200 Subject: [PATCH 312/470] Create sv-SE.js --- src/languages/sv-SE.js | 110 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/languages/sv-SE.js diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js new file mode 100644 index 000000000..666851f64 --- /dev/null +++ b/src/languages/sv-SE.js @@ -0,0 +1,110 @@ +export default { + languageName: "Swedish", + checkEverySecond: "Uppdatera var {0} sekund.", + "Avg.": "Genomsnitt ", + 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ösenorder stämmer ej överens.", + notificationDescription: "Vänligen lägg till en notistjänst till övervakaren.", + 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?", + deleteNotificationMsg: "Är du säker på att du vill ta bort den här notisen för alla övervakare?", + resoverserverDescription: "Cloudflare är den förvalda servern. Du kan byta resolver när som helst.", + rrtypeDescription: "Välj den RR-typ du vill övervaka", + pauseMonitorMsg: "Är du säker på att du vill pausa?", + Settings: "Inställningar", + Dashboard: "Infopanel", + "New Update": "Ny uppdatering", + Language: "Språk", + Appearance: "Utseende", + Theme: "Tema", + General: "Allmänt", + Version: "Version", + "Check Update On GitHub": "Sök efter uppdatering på GitHub", + List: "Lista", + Add: "Lägg till", + "Add New Monitor": "Lägg Till Ny Övervakare", + "Quick Stats": "Snabbstatistik", + Up: "Uppe", + Down: "Nere", + Pending: "Pågående", + Unknown: "Okänt", + Pause: "Paus", + Name: "Namn", + Status: "Status", + DateTime: "DatumTid", + Message: "Meddelande", + "No important events": "Inga viktiga händelser", + Resume: "Återuppta", + Edit: "Redigera", + Delete: "Ta bort", + Current: "Nuvarande", + Uptime: "Drifttid", + "Cert Exp.": "Certifikatsutgång", + days: "dagar", + day: "dag", + "-day": "-dag", + hour: "timme", + "-hour": "-timme", + Response: "Svar", + Ping: "Ping", + "Monitor Type": "Övervakningstyp", + Keyword: "Nyckelord", + "Friendly Name": "Vänligt Namn", + URL: "URL", + Hostname: "Värdnamn", + Port: "Port", + "Heartbeat Interval": "Hjärtslagsintervall", + Retries: "Försök", + Advanced: "Avancerat", + "Upside Down Mode": "Upp och ner-läge", + "Max. Redirects": "Max antal omdirigeringar", + "Accepted Status Codes": "Tillåtna statuskoder", + Save: "Spara", + Notifications: "Notiser", + "Not available, please setup.": "Ej tillgänglig, vänligen konfigurera.", + "Setup Notification": "Konfigurera Notis", + Light: "Ljust", + Dark: "Mörkt", + Auto: "Automatisk", + "Theme - Heartbeat Bar": "Tema - Heartbeat Bar", + Normal: "Normal", + Bottom: "Botten", + None: "Ingen", + Timezone: "Tidszon", + "Search Engine Visibility": "Synlighet på Sökmotorer", + "Allow indexing": "Tillåt indexering", + "Discourage search engines from indexing site": "Hindra sökmotorer från att indexera sidan", + "Change Password": "Byt Lösenord", + "Current Password": "Nuvarande Lösenord", + "New Password": "Nytt Lösenord", + "Repeat New Password": "Upprepa Nytt Lösenord", + "Update Password": "Uppdatera Lösenord", + "Disable Auth": "Avaktivera Autentisering", + "Enable Auth": "Aktivera Autentisering", + Logout: "Logga ut", + Leave: "Lämna", + "I understand, please disable": "Jag förstår, vänligen avaktivera", + Confirm: "Bekräfta", + Yes: "Ja", + No: "Nej", + Username: "Användarnamn", + Password: "Lösenord", + "Remember me": "Kom ihåg mig", + Login: "Logga in", + "No Monitors, please": "Inga Övervakare, tack", + "add one": "lägg till en", + "Notification Type": "Notistyp", + Email: "Email", + Test: "Test", + "Certificate Info": "Certifikatsinfo", + "Resolver Server": "Resolverserver", + "Resource Record Type": "RR-typ", + "Last Result": "Senaste resultat", + "Create your admin account": "Skapa ditt administratörskonto", + "Repeat Password": "Upprepa Lösenord" +} From ed5c75282c2c874d31771ed5397cae1ae1d42dee Mon Sep 17 00:00:00 2001 From: Levi Date: Wed, 1 Sep 2021 16:38:05 +0200 Subject: [PATCH 313/470] Update main.js --- src/main.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.js b/src/main.js index e0f59dae4..3c261d82a 100644 --- a/src/main.js +++ b/src/main.js @@ -29,6 +29,7 @@ import deDE from "./languages/de-DE"; import fr from "./languages/fr"; import ja from "./languages/ja"; import daDK from "./languages/da-DK"; +import svSE from "./languages/sv-SE"; const routes = [ { @@ -98,6 +99,7 @@ const languageList = { "fr": fr, "ja": ja, "da-DK": daDK, + "sv-SE": svSE, }; const i18n = createI18n({ From dce2ba8f9f8b9002924ee0c08aaa0b6303a9c45c Mon Sep 17 00:00:00 2001 From: Levi Date: Wed, 1 Sep 2021 16:41:51 +0200 Subject: [PATCH 314/470] Update sv-SE.js --- 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 666851f64..068f5d597 100644 --- a/src/languages/sv-SE.js +++ b/src/languages/sv-SE.js @@ -7,7 +7,7 @@ export default { 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ösenorder stämmer ej överens.", + passwordNotMatchMsg: "Det bekräftade lösenordet stämmer ej överens.", notificationDescription: "Vänligen lägg till en notistjänst till övervakaren.", keywordDescription: "Sök efter nyckelord i ren HTML eller JSON-svar. Sökningen är skiftkänslig.", pauseDashboardHome: "Pausa", From 2f6c5963c5076c246de1591ae41b92b26ab00932 Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Wed, 1 Sep 2021 17:09:32 +0200 Subject: [PATCH 315/470] 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 4aae402b36d239860164f53b5b1fd09011297ea6 Mon Sep 17 00:00:00 2001 From: dhfhfk Date: Thu, 2 Sep 2021 00:29:01 +0900 Subject: [PATCH 316/470] Update main.js --- src/main.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.js b/src/main.js index e0f59dae4..9aab000c6 100644 --- a/src/main.js +++ b/src/main.js @@ -29,6 +29,7 @@ import deDE from "./languages/de-DE"; import fr from "./languages/fr"; import ja from "./languages/ja"; import daDK from "./languages/da-DK"; +import koKR from "./languages/ko-KR"; const routes = [ { @@ -98,6 +99,7 @@ const languageList = { "fr": fr, "ja": ja, "da-DK": daDK, + "ko-KR": koKR, }; const i18n = createI18n({ From 1c4e5b79be47040287250c99e8d1d656542bd8df Mon Sep 17 00:00:00 2001 From: dhfhfk Date: Thu, 2 Sep 2021 00:30:08 +0900 Subject: [PATCH 317/470] Create ko-KR.js --- src/languages/ko-KR.js | 110 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/languages/ko-KR.js diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js new file mode 100644 index 000000000..ff4a79366 --- /dev/null +++ b/src/languages/ko-KR.js @@ -0,0 +1,110 @@ +export default { + languageName: '한국어', + checkEverySecond: '{0} 초마다 체크해요.', + 'Avg.': '평균 ', + retriesDescription: '서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수', + ignoreTLSError: 'HTTPS 웹사이트에서 TLS/SSL 에러 무시하기', + upsideDownModeDescription: '서버 상태를 반대로 표시해요. 서버가 작동하면 DOWN으로 표시할 거에요.', + maxRedirectDescription: '최대 리다이렉트 횟수에요. 0을 입력하면 리다이렉트를 꺼요.', + acceptedStatusCodesDescription: '응답 성공으로 간주할 상태 코드를 정해요.', + passwordNotMatchMsg: '비밀번호 재입력이 일치하지 않아요.', + notificationDescription: '모니터링에 알림을 설정할 수 있어요.', + keywordDescription: 'Html 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.', + pauseDashboardHome: '일시 정지', + deleteMonitorMsg: '정말 이 모니터링을 삭제할까요?', + deleteNotificationMsg: '정말 이 알림을 모든 모니터링에서 삭제할까요?', + resoverserverDescription: 'Cloudflare가 기본 서버에요, 원한다면 언제나 다른 resolver 서버로 변경할 수 있어요.', + rrtypeDescription: '모니터링할 RR-Type을 선택해요.', + pauseMonitorMsg: '정말 이 모니터링을 일시 정지 할까요?', + Settings: '설정', + Dashboard: '대시보드', + 'New Update': '새로운 업데이트', + Language: '언어', + Appearance: '외형', + Theme: '테마', + General: '일반', + Version: '버전', + 'Check Update On GitHub': '깃허브에서 업데이트 확인', + List: '목록', + Add: '추가', + 'Add New Monitor': '새로운 모니터링 추가하기', + 'Quick Stats': '간단한 정보', + Up: '온라인', + Down: '오프라인', + Pending: '대기 중', + Unknown: '알 수 없음', + Pause: '일시 정지', + Name: '이름', + Status: '상태', + DateTime: '날짜', + Message: '메시지', + 'No important events': '중요 이벤트 없음', + Resume: '재개', + Edit: '수정', + Delete: '삭제', + Current: '현재', + Uptime: '업타임', + 'Cert Exp.': '인증서 만료', + days: '일', + day: '일', + '-day': '-일', + hour: '시간', + '-hour': '-시간', + Response: '응답', + Ping: '핑', + 'Monitor Type': '모니터링 종류', + Keyword: '키워드', + 'Friendly Name': '이름', + URL: 'URL', + Hostname: '호스트네임', + Port: '포트', + 'Heartbeat Interval': '하트비트 주기', + Retries: '재시도', + Advanced: '고급', + 'Upside Down Mode': '상태 반전 모드', + 'Max. Redirects': '최대 리다이렉트', + 'Accepted Status Codes': '응답 성공 상태 코드', + Save: '저장', + Notifications: '알림', + 'Not available, please setup.': '존재하지 않아요, 새로운거 하나 만드는건 어때요?', + 'Setup Notification': '알림 설정', + Light: '라이트', + Dark: '다크', + Auto: '자동', + 'Theme - Heartbeat Bar': '테마 - 하트비트 바', + Normal: '기본값', + Bottom: '가운데', + None: '제거', + Timezone: '시간대', + 'Search Engine Visibility': '검색 엔진 활성화', + 'Allow indexing': '인덱싱 허용', + 'Discourage search engines from indexing site': '검색 엔진 인덱싱 거부', + 'Change Password': '비밀번호 변경', + 'Current Password': '기존 비밀번호', + 'New Password': '새로운 비밀번호', + 'Repeat New Password': '새로운 비밀번호 재입력', + 'Update Password': '비밀번호 변경', + 'Disable Auth': '인증 끄기', + 'Enable Auth': '인증 켜기', + Logout: '로그아웃', + Leave: '나가기', + 'I understand, please disable': '기능에 대해 이해했어요.', + Confirm: '확인', + Yes: '확인', + No: '취소', + Username: '이름', + Password: '비밀번호', + 'Remember me': '비밀번호 기억하기', + Login: '로그인', + 'No Monitors, please': '모니터링이 없어요,', + 'add one': '하나 추가해봐요', + 'Notification Type': '알림 종류', + Email: '이메일', + Test: '테스트', + 'Certificate Info': '인증서 정보', + 'Resolver Server': 'Resolver 서버', + 'Resource Record Type': '자원 레코드 유형', + 'Last Result': '최근 결과', + 'Create your admin account': '관리자 계정 만들기', + 'Repeat Password': '비밀번호 재입력' +}; \ No newline at end of file From 0cc5053f142efc883ff626b0ccb7d5d03a8c739b Mon Sep 17 00:00:00 2001 From: dhfhfk Date: Thu, 2 Sep 2021 00:35:50 +0900 Subject: [PATCH 318/470] Update ko-KR.js --- src/languages/ko-KR.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js index ff4a79366..91f8f9b22 100644 --- a/src/languages/ko-KR.js +++ b/src/languages/ko-KR.js @@ -4,7 +4,7 @@ export default { 'Avg.': '평균 ', retriesDescription: '서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수', ignoreTLSError: 'HTTPS 웹사이트에서 TLS/SSL 에러 무시하기', - upsideDownModeDescription: '서버 상태를 반대로 표시해요. 서버가 작동하면 DOWN으로 표시할 거에요.', + upsideDownModeDescription: '서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거에요.', maxRedirectDescription: '최대 리다이렉트 횟수에요. 0을 입력하면 리다이렉트를 꺼요.', acceptedStatusCodesDescription: '응답 성공으로 간주할 상태 코드를 정해요.', passwordNotMatchMsg: '비밀번호 재입력이 일치하지 않아요.', From 2d408732db087d8044690b67f5de828c187b6d6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=98=A4=EB=A1=9C=EB=9D=BC?= <68490827+dhfhfk@users.noreply.github.com> Date: Thu, 2 Sep 2021 01:01:18 +0900 Subject: [PATCH 319/470] Update main.js Prevent conflict with #304 (Added Swedish Language) --- src/main.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.js b/src/main.js index 9aab000c6..435caf218 100644 --- a/src/main.js +++ b/src/main.js @@ -29,6 +29,7 @@ import deDE from "./languages/de-DE"; import fr from "./languages/fr"; import ja from "./languages/ja"; import daDK from "./languages/da-DK"; +import svSE from "./languages/sv-SE"; import koKR from "./languages/ko-KR"; const routes = [ @@ -99,6 +100,7 @@ const languageList = { "fr": fr, "ja": ja, "da-DK": daDK, + "sv-SE": svSE, "ko-KR": koKR, }; From 8e1e4b9204f0799d8d1504c93eb0bfbd8daceea5 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 01:51:51 +0800 Subject: [PATCH 320/470] 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 eeb00a55113b5d2a63feab07a57b43ccdad1ebd1 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 01:56:02 +0800 Subject: [PATCH 321/470] fix data type --- src/pages/Dashboard.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue index b9c82e00a..1cf237ce7 100644 --- a/src/pages/Dashboard.vue +++ b/src/pages/Dashboard.vue @@ -5,7 +5,7 @@
{{ $t("Add New Monitor") }}
- +
From e1f378ee6c8ede64f6de654e9c913e6292b4f162 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Thu, 2 Sep 2021 02:11:44 +0800 Subject: [PATCH 322/470] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 45a1a338f..925b8798e 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,10 @@ I will mark requests/issues to the next milestone. https://github.com/louislam/uptime-kuma/milestones +Project Plan: + +https://github.com/louislam/uptime-kuma/projects/1 + ## 🖼 More Screenshots Dark Mode: From a2cf7f394e52f0fae9e9fbf11d6ae348baaf2613 Mon Sep 17 00:00:00 2001 From: DX37 Date: Thu, 2 Sep 2021 01:37:01 +0700 Subject: [PATCH 323/470] Add Russian translation --- src/languages/ru-RU.js | 110 +++++++++++++++++++++++++++++++++++++++++ src/main.js | 2 + 2 files changed, 112 insertions(+) create mode 100644 src/languages/ru-RU.js diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js new file mode 100644 index 000000000..c9de68614 --- /dev/null +++ b/src/languages/ru-RU.js @@ -0,0 +1,110 @@ +export default { + languageName: "Русский", + checkEverySecond: "Проверять каждые {0} секунд.", + "Avg.": "Средн. ", + retriesDescription: "Максимальное количество попыток перед пометкой сервиса как недоступного и отправкой уведомления", + ignoreTLSError: "Игнорировать ошибку TLS/SSL для HTTPS сайтов", + upsideDownModeDescription: "Реверс статуса сервиса. Если сервис доступен, то он помечается как НЕДОСТУПНЫЙ.", + maxRedirectDescription: "Максимальное количество перенаправлений. Поставьте 0, чтобы отключить перенаправления.", + acceptedStatusCodesDescription: "Выберите коды статусов, которые должны считаться за успешный ответ.", + passwordNotMatchMsg: "Повтор пароля не совпадает.", + notificationDescription: "Привяжите уведомления к мониторам.", + keywordDescription: "Поиск слова в чистом HTML или в JSON-ответе (чувствительно к регистру)", + pauseDashboardHome: "Пауза", + deleteMonitorMsg: "Вы действительно хотите удалить данный монитор?", + deleteNotificationMsg: "Вы действительно хотите удалить это уведомление для всех мониторов?", + resoverserverDescription: "Cloudflare является сервером по умолчанию. Вы всегда можете сменить данный сервер.", + rrtypeDescription: "Выберите тип ресурсной записи, который вы хотите отслеживать", + pauseMonitorMsg: "Вы действительно хотите поставить на паузу?", + Settings: "Настройки", + Dashboard: "Панель", + "New Update": "Обновление", + Language: "Язык", + Appearance: "Внешний вид", + Theme: "Тема", + General: "Общее", + Version: "Версия", + "Check Update On GitHub": "Проверить обновления на GitHub", + List: "Список", + Add: "Добавить", + "Add New Monitor": "Новый монитор", + "Quick Stats": "Статистика", + Up: "Доступно", + Down: "Недоступно", + Pending: "Ожидание", + Unknown: "Неизвестно", + Pause: "Пауза", + Name: "Имя", + Status: "Статус", + DateTime: "Дата и время", + Message: "Сообщение", + "No important events": "Важных событий нет", + Resume: "Возобновить", + Edit: "Изменить", + Delete: "Удалить", + Current: "Текущий", + Uptime: "Аптайм", + "Cert Exp.": "Сертификат просрочен", + days: "дней", + day: "день", + "-day": " дней", + hour: "час", + "-hour": " часа", + Response: "Ответ", + Ping: "Пинг", + "Monitor Type": "Тип монитора", + Keyword: "Слово", + "Friendly Name": "Имя", + URL: "URL", + Hostname: "Имя хоста", + Port: "Порт", + "Heartbeat Interval": "Частота опроса", + Retries: "Попыток", + Advanced: "Дополнительно", + "Upside Down Mode": "Режим реверса статуса", + "Max. Redirects": "Макс. перенаправлений", + "Accepted Status Codes": "Допустимые коды статуса", + Save: "Сохранить", + Notifications: "Уведомления", + "Not available, please setup.": "Доступных уведомлений нет, необходима настройка.", + "Setup Notification": "Настроить уведомления", + Light: "Светлая", + Dark: "Тёмная", + Auto: "Авто", + "Theme - Heartbeat Bar": "Тема - Полоса частоты опроса", + Normal: "Обычный", + Bottom: "Снизу", + None: "Отсутствует", + Timezone: "Часовой пояс", + "Search Engine Visibility": "Видимость поисковым движком", + "Allow indexing": "Разрешить индексирование", + "Discourage search engines from indexing site": "Не позволять индексировать сайт", + "Change Password": "Сменить пароль", + "Current Password": "Текущий пароль", + "New Password": "Новый пароль", + "Repeat New Password": "Повтор нового пароля", + "Update Password": "Обновить пароль", + "Disable Auth": "Отключить авторизацию", + "Enable Auth": "Включить авторизацию", + Logout: "Выйти", + Leave: "Отмена", + "I understand, please disable": "Я понимаю, всё равно отключить", + Confirm: "Подтвердить", + Yes: "Да", + No: "Нет", + Username: "Логин", + Password: "Пароль", + "Remember me": "Запомнить меня", + Login: "Вход в систему", + "No Monitors, please": "Мониторов нет, пожалуйста", + "add one": "создайте новый", + "Notification Type": "Тип уведомления", + Email: "Почта", + Test: "Проверка", + "Certificate Info": "Информация о сертификате", + "Resolver Server": "DNS сервер", + "Resource Record Type": "Тип ресурсной записи", + "Last Result": "Последний результат", + "Create your admin account": "Создайте аккаунт администратора", + "Repeat Password": "Повторите пароль" +} diff --git a/src/main.js b/src/main.js index 435caf218..fe35d3815 100644 --- a/src/main.js +++ b/src/main.js @@ -31,6 +31,7 @@ import ja from "./languages/ja"; import daDK from "./languages/da-DK"; import svSE from "./languages/sv-SE"; import koKR from "./languages/ko-KR"; +import ruRU from "./languages/ru-RU"; const routes = [ { @@ -102,6 +103,7 @@ const languageList = { "da-DK": daDK, "sv-SE": svSE, "ko-KR": koKR, + "ru-RU": ruRU, }; const i18n = createI18n({ From e7929f461d878af218d70c86bfbe694b84ee450f Mon Sep 17 00:00:00 2001 From: Adam Stachowicz Date: Wed, 1 Sep 2021 20:53:12 +0200 Subject: [PATCH 324/470] 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 7a109689d96a4ffdeee99776a0c44671e88be4f7 Mon Sep 17 00:00:00 2001 From: Adam Stachowicz Date: Wed, 1 Sep 2021 21:17:50 +0200 Subject: [PATCH 325/470] Make `Resp. Time (ms)` and `N/A` i18n --- src/components/PingChart.vue | 2 +- src/components/Uptime.vue | 2 +- src/languages/en.js | 4 +++- src/pages/Details.vue | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/components/PingChart.vue b/src/components/PingChart.vue index 8f53ea766..0baa9881d 100644 --- a/src/components/PingChart.vue +++ b/src/components/PingChart.vue @@ -85,7 +85,7 @@ export default { y: { title: { display: true, - text: "Resp. Time (ms)", + text: this.$t("respTime"), }, offset: false, grid: { diff --git a/src/components/Uptime.vue b/src/components/Uptime.vue index b1f3a018e..a4bf22f68 100644 --- a/src/components/Uptime.vue +++ b/src/components/Uptime.vue @@ -22,7 +22,7 @@ export default { return Math.round(this.$root.uptimeList[key] * 10000) / 100 + "%"; } - return "N/A" + return this.$t("notAvailableShort") }, color() { diff --git a/src/languages/en.js b/src/languages/en.js index 2781ba819..f0e4ae969 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -106,5 +106,7 @@ 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", + respTime: "Resp. Time (ms)", + notAvailableShort: "N/A" } diff --git a/src/pages/Details.vue b/src/pages/Details.vue index 44cac8186..badcc687e 100644 --- a/src/pages/Details.vue +++ b/src/pages/Details.vue @@ -238,7 +238,7 @@ export default { return this.lastHeartBeat.ping; } - return "N/A" + return this.$t("notAvailableShort") }, avgPing() { @@ -246,7 +246,7 @@ export default { return this.$root.avgPingList[this.monitor.id]; } - return "N/A" + return this.$t("notAvailableShort") }, importantHeartBeatList() { From c13cc62d3d06f931b755250536e97ffebb5d2d74 Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Wed, 1 Sep 2021 21:32:33 +0200 Subject: [PATCH 326/470] 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 9116654a33077da96a8de658ef0eeafbd073cf08 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 15:21:46 +0800 Subject: [PATCH 327/470] update language files and run eslint on these --- src/languages/da-DK.js | 4 +- src/languages/de-DE.js | 4 +- src/languages/fr.js | 4 +- src/languages/ja.js | 4 +- src/languages/ko-KR.js | 220 +++++++++++++++++++++-------------------- src/languages/ru-RU.js | 4 +- src/languages/sv-SE.js | 4 +- src/languages/zh-HK.js | 10 +- 8 files changed, 135 insertions(+), 119 deletions(-) diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js index 245ba5ba7..713eecfe2 100644 --- a/src/languages/da-DK.js +++ b/src/languages/da-DK.js @@ -106,5 +106,7 @@ export default { pauseMonitorMsg: "Er du sikker på, at du vil pause Overvågeren?", "Create your admin account": "Opret din administratorkonto", "Repeat Password": "Gentag adgangskoden", - "Resource Record Type": "Resource Record Type" + "Resource Record Type": "Resource Record Type", + respTime: "Resp. Time (ms)", + notAvailableShort: "N/A" } diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index 7a8cb52a4..7febaad7b 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -106,5 +106,7 @@ 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", + respTime: "Resp. Time (ms)", + notAvailableShort: "N/A" } diff --git a/src/languages/fr.js b/src/languages/fr.js index ac7aa8a54..694f4d285 100644 --- a/src/languages/fr.js +++ b/src/languages/fr.js @@ -106,5 +106,7 @@ export default { pauseMonitorMsg: "Are you sure want to pause?", "Last Result": "Last Result", "Create your admin account": "Create your admin account", - "Repeat Password": "Repeat Password" + "Repeat Password": "Repeat Password", + respTime: "Resp. Time (ms)", + notAvailableShort: "N/A" } diff --git a/src/languages/ja.js b/src/languages/ja.js index e32e53d69..23de640cf 100644 --- a/src/languages/ja.js +++ b/src/languages/ja.js @@ -106,5 +106,7 @@ export default { "Resource Record Type": "DNSレコード設定", "Last Result": "最終結果", "Create your admin account": "Create your admin account", - "Repeat Password": "Repeat Password" + "Repeat Password": "Repeat Password", + respTime: "Resp. Time (ms)", + notAvailableShort: "N/A" } diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js index 91f8f9b22..f913bbb97 100644 --- a/src/languages/ko-KR.js +++ b/src/languages/ko-KR.js @@ -1,110 +1,112 @@ export default { - languageName: '한국어', - checkEverySecond: '{0} 초마다 체크해요.', - 'Avg.': '평균 ', - retriesDescription: '서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수', - ignoreTLSError: 'HTTPS 웹사이트에서 TLS/SSL 에러 무시하기', - upsideDownModeDescription: '서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거에요.', - maxRedirectDescription: '최대 리다이렉트 횟수에요. 0을 입력하면 리다이렉트를 꺼요.', - acceptedStatusCodesDescription: '응답 성공으로 간주할 상태 코드를 정해요.', - passwordNotMatchMsg: '비밀번호 재입력이 일치하지 않아요.', - notificationDescription: '모니터링에 알림을 설정할 수 있어요.', - keywordDescription: 'Html 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.', - pauseDashboardHome: '일시 정지', - deleteMonitorMsg: '정말 이 모니터링을 삭제할까요?', - deleteNotificationMsg: '정말 이 알림을 모든 모니터링에서 삭제할까요?', - resoverserverDescription: 'Cloudflare가 기본 서버에요, 원한다면 언제나 다른 resolver 서버로 변경할 수 있어요.', - rrtypeDescription: '모니터링할 RR-Type을 선택해요.', - pauseMonitorMsg: '정말 이 모니터링을 일시 정지 할까요?', - Settings: '설정', - Dashboard: '대시보드', - 'New Update': '새로운 업데이트', - Language: '언어', - Appearance: '외형', - Theme: '테마', - General: '일반', - Version: '버전', - 'Check Update On GitHub': '깃허브에서 업데이트 확인', - List: '목록', - Add: '추가', - 'Add New Monitor': '새로운 모니터링 추가하기', - 'Quick Stats': '간단한 정보', - Up: '온라인', - Down: '오프라인', - Pending: '대기 중', - Unknown: '알 수 없음', - Pause: '일시 정지', - Name: '이름', - Status: '상태', - DateTime: '날짜', - Message: '메시지', - 'No important events': '중요 이벤트 없음', - Resume: '재개', - Edit: '수정', - Delete: '삭제', - Current: '현재', - Uptime: '업타임', - 'Cert Exp.': '인증서 만료', - days: '일', - day: '일', - '-day': '-일', - hour: '시간', - '-hour': '-시간', - Response: '응답', - Ping: '핑', - 'Monitor Type': '모니터링 종류', - Keyword: '키워드', - 'Friendly Name': '이름', - URL: 'URL', - Hostname: '호스트네임', - Port: '포트', - 'Heartbeat Interval': '하트비트 주기', - Retries: '재시도', - Advanced: '고급', - 'Upside Down Mode': '상태 반전 모드', - 'Max. Redirects': '최대 리다이렉트', - 'Accepted Status Codes': '응답 성공 상태 코드', - Save: '저장', - Notifications: '알림', - 'Not available, please setup.': '존재하지 않아요, 새로운거 하나 만드는건 어때요?', - 'Setup Notification': '알림 설정', - Light: '라이트', - Dark: '다크', - Auto: '자동', - 'Theme - Heartbeat Bar': '테마 - 하트비트 바', - Normal: '기본값', - Bottom: '가운데', - None: '제거', - Timezone: '시간대', - 'Search Engine Visibility': '검색 엔진 활성화', - 'Allow indexing': '인덱싱 허용', - 'Discourage search engines from indexing site': '검색 엔진 인덱싱 거부', - 'Change Password': '비밀번호 변경', - 'Current Password': '기존 비밀번호', - 'New Password': '새로운 비밀번호', - 'Repeat New Password': '새로운 비밀번호 재입력', - 'Update Password': '비밀번호 변경', - 'Disable Auth': '인증 끄기', - 'Enable Auth': '인증 켜기', - Logout: '로그아웃', - Leave: '나가기', - 'I understand, please disable': '기능에 대해 이해했어요.', - Confirm: '확인', - Yes: '확인', - No: '취소', - Username: '이름', - Password: '비밀번호', - 'Remember me': '비밀번호 기억하기', - Login: '로그인', - 'No Monitors, please': '모니터링이 없어요,', - 'add one': '하나 추가해봐요', - 'Notification Type': '알림 종류', - Email: '이메일', - Test: '테스트', - 'Certificate Info': '인증서 정보', - 'Resolver Server': 'Resolver 서버', - 'Resource Record Type': '자원 레코드 유형', - 'Last Result': '최근 결과', - 'Create your admin account': '관리자 계정 만들기', - 'Repeat Password': '비밀번호 재입력' -}; \ No newline at end of file + languageName: "한국어", + checkEverySecond: "{0} 초마다 체크해요.", + "Avg.": "평균 ", + retriesDescription: "서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수", + ignoreTLSError: "HTTPS 웹사이트에서 TLS/SSL 에러 무시하기", + upsideDownModeDescription: "서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거에요.", + maxRedirectDescription: "최대 리다이렉트 횟수에요. 0을 입력하면 리다이렉트를 꺼요.", + acceptedStatusCodesDescription: "응답 성공으로 간주할 상태 코드를 정해요.", + passwordNotMatchMsg: "비밀번호 재입력이 일치하지 않아요.", + notificationDescription: "모니터링에 알림을 설정할 수 있어요.", + keywordDescription: "Html 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.", + pauseDashboardHome: "일시 정지", + deleteMonitorMsg: "정말 이 모니터링을 삭제할까요?", + deleteNotificationMsg: "정말 이 알림을 모든 모니터링에서 삭제할까요?", + resoverserverDescription: "Cloudflare가 기본 서버에요, 원한다면 언제나 다른 resolver 서버로 변경할 수 있어요.", + rrtypeDescription: "모니터링할 RR-Type을 선택해요.", + pauseMonitorMsg: "정말 이 모니터링을 일시 정지 할까요?", + Settings: "설정", + Dashboard: "대시보드", + "New Update": "새로운 업데이트", + Language: "언어", + Appearance: "외형", + Theme: "테마", + General: "일반", + Version: "버전", + "Check Update On GitHub": "깃허브에서 업데이트 확인", + List: "목록", + Add: "추가", + "Add New Monitor": "새로운 모니터링 추가하기", + "Quick Stats": "간단한 정보", + Up: "온라인", + Down: "오프라인", + Pending: "대기 중", + Unknown: "알 수 없음", + Pause: "일시 정지", + Name: "이름", + Status: "상태", + DateTime: "날짜", + Message: "메시지", + "No important events": "중요 이벤트 없음", + Resume: "재개", + Edit: "수정", + Delete: "삭제", + Current: "현재", + Uptime: "업타임", + "Cert Exp.": "인증서 만료", + days: "일", + day: "일", + "-day": "-일", + hour: "시간", + "-hour": "-시간", + Response: "응답", + Ping: "핑", + "Monitor Type": "모니터링 종류", + Keyword: "키워드", + "Friendly Name": "이름", + URL: "URL", + Hostname: "호스트네임", + Port: "포트", + "Heartbeat Interval": "하트비트 주기", + Retries: "재시도", + Advanced: "고급", + "Upside Down Mode": "상태 반전 모드", + "Max. Redirects": "최대 리다이렉트", + "Accepted Status Codes": "응답 성공 상태 코드", + Save: "저장", + Notifications: "알림", + "Not available, please setup.": "존재하지 않아요, 새로운거 하나 만드는건 어때요?", + "Setup Notification": "알림 설정", + Light: "라이트", + Dark: "다크", + Auto: "자동", + "Theme - Heartbeat Bar": "테마 - 하트비트 바", + Normal: "기본값", + Bottom: "가운데", + None: "제거", + Timezone: "시간대", + "Search Engine Visibility": "검색 엔진 활성화", + "Allow indexing": "인덱싱 허용", + "Discourage search engines from indexing site": "검색 엔진 인덱싱 거부", + "Change Password": "비밀번호 변경", + "Current Password": "기존 비밀번호", + "New Password": "새로운 비밀번호", + "Repeat New Password": "새로운 비밀번호 재입력", + "Update Password": "비밀번호 변경", + "Disable Auth": "인증 끄기", + "Enable Auth": "인증 켜기", + Logout: "로그아웃", + Leave: "나가기", + "I understand, please disable": "기능에 대해 이해했어요.", + Confirm: "확인", + Yes: "확인", + No: "취소", + Username: "이름", + Password: "비밀번호", + "Remember me": "비밀번호 기억하기", + Login: "로그인", + "No Monitors, please": "모니터링이 없어요,", + "add one": "하나 추가해봐요", + "Notification Type": "알림 종류", + Email: "이메일", + Test: "테스트", + "Certificate Info": "인증서 정보", + "Resolver Server": "Resolver 서버", + "Resource Record Type": "자원 레코드 유형", + "Last Result": "최근 결과", + "Create your admin account": "관리자 계정 만들기", + "Repeat Password": "비밀번호 재입력", + respTime: "Resp. Time (ms)", + notAvailableShort: "N/A" +} diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js index c9de68614..f42f9c256 100644 --- a/src/languages/ru-RU.js +++ b/src/languages/ru-RU.js @@ -106,5 +106,7 @@ export default { "Resource Record Type": "Тип ресурсной записи", "Last Result": "Последний результат", "Create your admin account": "Создайте аккаунт администратора", - "Repeat Password": "Повторите пароль" + "Repeat Password": "Повторите пароль", + respTime: "Resp. Time (ms)", + notAvailableShort: "N/A" } diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js index 068f5d597..502968891 100644 --- a/src/languages/sv-SE.js +++ b/src/languages/sv-SE.js @@ -106,5 +106,7 @@ export default { "Resource Record Type": "RR-typ", "Last Result": "Senaste resultat", "Create your admin account": "Skapa ditt administratörskonto", - "Repeat Password": "Upprepa Lösenord" + "Repeat Password": "Upprepa Lösenord", + respTime: "Resp. Time (ms)", + notAvailableShort: "N/A" } diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js index 12ebb79de..4bcc5029e 100644 --- a/src/languages/zh-HK.js +++ b/src/languages/zh-HK.js @@ -103,8 +103,10 @@ export default { "Resource Record Type": "DNS 記錄類型", resoverserverDescription: "預設值為 Cloudflare DNS 伺服器,你可以轉用其他 DNS 伺服器。", rrtypeDescription: "請選擇 DNS 記錄類型", - pauseMonitorMsg: "Are you sure want to pause?", - "Last Result": "Last Result", - "Create your admin account": "Create your admin account", - "Repeat Password": "Repeat Password" + pauseMonitorMsg: "是否確定暫停?", + "Last Result": "最後結果", + "Create your admin account": "製作你的管理員帳號", + "Repeat Password": "重複密碼", + respTime: "反應時間 (ms)", + notAvailableShort: "N/A" } From a0f372e946adb196d38d1246f2f5bbeceb7455ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B0=E9=80=B8Cary?= Date: Thu, 2 Sep 2021 15:34:46 +0800 Subject: [PATCH 328/470] Chinese Translation (from zh-CN.js) --- src/languages/zh-CN.js | 112 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 src/languages/zh-CN.js diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js new file mode 100644 index 000000000..b67f1d5a0 --- /dev/null +++ b/src/languages/zh-CN.js @@ -0,0 +1,112 @@ +export default { + languageName: "简体中文", + checkEverySecond: "检测频率 {0} 秒", + "Avg.": "平均 ", + retriesDescription: "最大重试次数", + ignoreTLSError: "忽略HTTPS站点的证书错误", + upsideDownModeDescription: "反向状态监控", + maxRedirectDescription: "最大重定向次数,设置为 0 禁止重定向", + acceptedStatusCodesDescription: "选择被视为成功响应的状态码", + passwordNotMatchMsg: "两次密码输入不一致", + notificationDescription: "请先设置一个消息通知", + keywordDescription: "检测响应内容中的关键字,区分大小写", + pauseDashboardHome: "Pause", + deleteMonitorMsg: "确定要删除此监控吗?", + deleteNotificationMsg: "确定要删除此消息通知吗?这将对所有监控生效。", + resoverserverDescription: "默认服务器 Cloudflare,可以修改为任意你想要使用的DNS服务器", + rrtypeDescription: "选择您要监控的资源记录类型", + pauseMonitorMsg: "确定要暂停吗?", + Settings: "设置", + Dashboard: "仪表盘", + "New Update": "有新版本更新", + Language: "语言", + Appearance: "外观设置", + Theme: "主题", + General: "基本设置", + Version: "Version", + "Check Update On GitHub": "检查更新", + List: "列表", + Add: "添加", + "Add New Monitor": "添加新的监控", + "Quick Stats": "状态速览", + Up: "正常", + Down: "故障", + Pending: "检测失败", + Unknown: "未知", + Pause: "暂停", + Name: "名称", + Status: "状态", + DateTime: "时间", + Message: "事件", + "No important events": "暂无重要事件", + Resume: "恢复", + Edit: "修改", + Delete: "删除", + Current: "当前", + Uptime: "可用率", + "Cert Exp.": "证书过期", + days: "天", + day: "天", + "-day": " 天", + hour: "小时", + "-hour": " 小时", + Response: "响应", + Ping: "Ping", + "Monitor Type": "监控类型", + Keyword: "关键字", + "Friendly Name": "名称", + URL: "网址", + Hostname: "主机名", + Port: "端口号", + "Heartbeat Interval": "心跳间隔", + Retries: "重试次数", + Advanced: "高级选项", + "Upside Down Mode": "反向监控", + "Max. Redirects": "重定向次数", + "Accepted Status Codes": "有效状态码", + Save: "保存", + Notifications: "消息通知", + "Not available, please setup.": "不可用,请设置", + "Setup Notification": "设置通知", + Light: "明亮", + Dark: "黑暗", + Auto: "自动", + "Theme - Heartbeat Bar": "心跳状态显示", + Normal: "正常显示", + Bottom: "靠下显示", + None: "不显示", + Timezone: "时区", + "Search Engine Visibility": "搜索引擎设置", + "Allow indexing": "允许索引", + "Discourage search engines from indexing site": "阻止搜索引擎索引网站", + "Change Password": "修改密码", + "Current Password": "当前密码", + "New Password": "新密码", + "Repeat New Password": "重复新密码", + "Update Password": "更新密码", + "Disable Auth": "禁用身份验证", + "Enable Auth": "启用身份验证", + Logout: "退出", + Leave: "离开", + "I understand, please disable": "我已经了解,继续禁用", + Confirm: "确认", + Yes: "是的", + No: "不是", + Username: "用户名", + Password: "密码", + "Remember me": "请记住我", + Login: "登录", + "No Monitors, please": "没有监控,", + "add one": "添加一个", + "Notification Type": "消息类型", + Email: "邮件", + Test: "测试一下", + "Certificate Info": "证书信息", + "Resolver Server": "解析服务器", + "Resource Record Type": "资源记录类型", + "Last Result": "Last Result", + "Create your admin account": "创建管理员账号", + "Repeat Password": "重复密码", + respTime: "响应时间 (ms)", + notAvailableShort: "N/A" +} From 2dd392e609757fd3b0bec7841ac7d4c97ef96afa Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Thu, 2 Sep 2021 10:15:25 +0200 Subject: [PATCH 329/470] 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 330/470] 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 941788db49bc1643f6b2e0cfa301da779abb483a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B0=E9=80=B8Cary?= Date: Thu, 2 Sep 2021 18:33:09 +0800 Subject: [PATCH 331/470] Chinese Translation (from zh-CN.js) --- src/main.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.js b/src/main.js index fe35d3815..fba4b91e7 100644 --- a/src/main.js +++ b/src/main.js @@ -32,6 +32,7 @@ import daDK from "./languages/da-DK"; import svSE from "./languages/sv-SE"; import koKR from "./languages/ko-KR"; import ruRU from "./languages/ru-RU"; +import zhCN from "./languages/zh-CN"; const routes = [ { @@ -104,6 +105,7 @@ const languageList = { "sv-SE": svSE, "ko-KR": koKR, "ru-RU": ruRU, + "zh-CN": zhCN, }; const i18n = createI18n({ From b88b357b55022cc17b202529d4227d82bc91f23a Mon Sep 17 00:00:00 2001 From: LouisLam Date: Thu, 2 Sep 2021 20:18:27 +0800 Subject: [PATCH 332/470] 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 333/470] 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 334/470] 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 335/470] 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 336/470] 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 337/470] 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 338/470] 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 339/470] 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 340/470] 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 341/470] 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 342/470] 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 343/470] 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 351/470] 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 352/470] 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 353/470] 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 312aedf391139e6a121876e4fd29af88c5a06389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B0=E9=80=B8Cary?= Date: Fri, 3 Sep 2021 13:33:26 +0800 Subject: [PATCH 354/470] =?UTF-8?q?Update=20Chinese=20Translation=EF=BC=88?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AE=80=E4=BD=93=E4=B8=AD=E6=96=87=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E7=BF=BB=E8=AF=91=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/languages/zh-CN.js | 42 +++++++++++++++++++++--------------------- src/pages/Settings.vue | 6 ++++++ 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js index b67f1d5a0..d179a91af 100644 --- a/src/languages/zh-CN.js +++ b/src/languages/zh-CN.js @@ -1,20 +1,20 @@ export default { languageName: "简体中文", checkEverySecond: "检测频率 {0} 秒", - "Avg.": "平均 ", - retriesDescription: "最大重试次数", + "Avg.": "平均", + retriesDescription: "最大重试失败次数", ignoreTLSError: "忽略HTTPS站点的证书错误", - upsideDownModeDescription: "反向状态监控", + upsideDownModeDescription: "反向状态监控(状态码范围外为有效状态,反之为无效)", maxRedirectDescription: "最大重定向次数,设置为 0 禁止重定向", acceptedStatusCodesDescription: "选择被视为成功响应的状态码", passwordNotMatchMsg: "两次密码输入不一致", - notificationDescription: "请先设置一个消息通知", + notificationDescription: "请为监控项配置消息通知", keywordDescription: "检测响应内容中的关键字,区分大小写", - pauseDashboardHome: "Pause", + pauseDashboardHome: "暂停", deleteMonitorMsg: "确定要删除此监控吗?", deleteNotificationMsg: "确定要删除此消息通知吗?这将对所有监控生效。", resoverserverDescription: "默认服务器 Cloudflare,可以修改为任意你想要使用的DNS服务器", - rrtypeDescription: "选择您要监控的资源记录类型", + rrtypeDescription: "选择要监控的资源记录类型", pauseMonitorMsg: "确定要暂停吗?", Settings: "设置", Dashboard: "仪表盘", @@ -27,7 +27,7 @@ export default { "Check Update On GitHub": "检查更新", List: "列表", Add: "添加", - "Add New Monitor": "添加新的监控", + "Add New Monitor": "创建监控项", "Quick Stats": "状态速览", Up: "正常", Down: "故障", @@ -50,12 +50,12 @@ export default { "-day": " 天", hour: "小时", "-hour": " 小时", - Response: "响应", + Response: "响应时长", Ping: "Ping", "Monitor Type": "监控类型", Keyword: "关键字", - "Friendly Name": "名称", - URL: "网址", + "Friendly Name": "自定义名称", + URL: "网址URL", Hostname: "主机名", Port: "端口号", "Heartbeat Interval": "心跳间隔", @@ -66,12 +66,12 @@ export default { "Accepted Status Codes": "有效状态码", Save: "保存", Notifications: "消息通知", - "Not available, please setup.": "不可用,请设置", + "Not available, please setup.": "无可用通道,请先设置", "Setup Notification": "设置通知", Light: "明亮", Dark: "黑暗", Auto: "自动", - "Theme - Heartbeat Bar": "心跳状态显示", + "Theme - Heartbeat Bar": "状态显示", Normal: "正常显示", Bottom: "靠下显示", None: "不显示", @@ -81,23 +81,23 @@ export default { "Discourage search engines from indexing site": "阻止搜索引擎索引网站", "Change Password": "修改密码", "Current Password": "当前密码", - "New Password": "新密码", - "Repeat New Password": "重复新密码", + "New Password": "新的密码", + "Repeat New Password": "重复新的密码", "Update Password": "更新密码", "Disable Auth": "禁用身份验证", "Enable Auth": "启用身份验证", Logout: "退出", Leave: "离开", - "I understand, please disable": "我已经了解,继续禁用", + "I understand, please disable": "我已了解,继续禁用", Confirm: "确认", - Yes: "是的", - No: "不是", + Yes: "确定", + No: "取消", Username: "用户名", Password: "密码", - "Remember me": "请记住我", + "Remember me": "记住登录", Login: "登录", - "No Monitors, please": "没有监控,", - "add one": "添加一个", + "No Monitors, please": "还没有监控项,", + "add one": "点击新增", "Notification Type": "消息类型", Email: "邮件", Test: "测试一下", @@ -107,6 +107,6 @@ export default { "Last Result": "Last Result", "Create your admin account": "创建管理员账号", "Repeat Password": "重复密码", - respTime: "响应时间 (ms)", + respTime: "Resp. Time (ms)", notAvailableShort: "N/A" } diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index d71ec109b..a1cdd17c5 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -178,6 +178,12 @@

請小心使用。

+ + + + From b98ec0c3d4efa70510538b5bed61c9abe6076db6 Mon Sep 17 00:00:00 2001 From: Ponkhy Date: Sat, 4 Sep 2021 01:26:06 +0200 Subject: [PATCH 360/470] 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 361/470] 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 362/470] 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 363/470] 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 364/470] 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 365/470] 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 366/470] 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 367/470] 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 368/470] 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 369/470] 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 370/470] 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 371/470] 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 372/470] 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 373/470] 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 374/470] 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 375/470] 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 376/470] 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 377/470] 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 378/470] 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 379/470] 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 380/470] 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; + // 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 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; - } + 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 381/470] 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 382/470] 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 383/470] 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 384/470] 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 385/470] 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 386/470] 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 387/470] [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 388/470] 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 389/470] 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 390/470] 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 391/470] 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") }} +
+ +
+ +
+ + +
+