Merge branch 'louislam:master' into master

This commit is contained in:
Phuong Nguyen Minh 2021-12-06 15:47:06 +07:00 committed by GitHub
commit e67e41e05a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
33 changed files with 788 additions and 524 deletions

View file

@ -25,4 +25,4 @@ Please delete options that are not relevant.
## Screenshots (if any) ## Screenshots (if any)
Please do not use any external image service. Instead, just paste in or drag and drop the image here and it will be uploaded automatically. Please do not use any external image service. Instead, just paste in or drag and drop the image here, and it will be uploaded automatically.

View file

@ -2,7 +2,7 @@
First of all, thank you everyone who made pull requests for Uptime Kuma, I never thought GitHub Community can be that nice! And also because of this, I also never thought other people actually read my code and edit my code. It is not structured and commented so well, lol. Sorry about that. First of all, thank you everyone who made pull requests for Uptime Kuma, I never thought GitHub Community can be that nice! And also because of this, I also never thought other people actually read my code and edit my code. It is not structured and commented so well, lol. Sorry about that.
The project was created with vite.js (vue3). Then I created a sub-directory called "server" for server part. Both frontend and backend share the same package.json. The project was created with vite.js (vue3). Then I created a subdirectory called "server" for server part. Both frontend and backend share the same package.json.
The frontend code build into "dist" directory. The server (express.js) exposes the "dist" directory as root of the endpoint. This is how production is working. The frontend code build into "dist" directory. The server (express.js) exposes the "dist" directory as root of the endpoint. This is how production is working.
@ -27,11 +27,10 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
## Can I create a pull request for Uptime Kuma? ## Can I create a pull request for Uptime Kuma?
Generally, if the pull request is working fine and it do not affect any existing logic, workflow and performance, I will merge into the master branch once it is tested. Generally, if the pull request is working fine, and it does not affect any existing logic, workflow and performance, I will merge into the master branch once it is tested.
If you are not sure whether I will accept your pull request, feel free to create an empty pull request draft first. If you are not sure whether I will accept your pull request, feel free to create an empty pull request draft first.
### Recommended Pull Request Guideline ### Recommended Pull Request Guideline
1. Fork the project 1. Fork the project
@ -66,7 +65,7 @@ I do not have such knowledge to test it.
#### ⚠ Low Priority - Harsh Mode #### ⚠ Low Priority - Harsh Mode
Some pull requests are required to modify the core. To be honest, I do not want anyone to try to do that, because it would spend a lot of your time. I will review your pull request harshly. Also you may need to write a lot of unit tests to ensure that there is no breaking change. Some pull requests are required to modify the core. To be honest, I do not want anyone to try to do that, because it would spend a lot of your time. I will review your pull request harshly. Also, you may need to write a lot of unit tests to ensure that there is no breaking change.
- Touch large parts of code of any very important features - Touch large parts of code of any very important features
- Touch monitoring logic - Touch monitoring logic
@ -74,7 +73,6 @@ Some pull requests are required to modify the core. To be honest, I do not want
- Touch the entry point of Docker or Node.js - Touch the entry point of Docker or Node.js
- Modify auth - Modify auth
#### *️⃣ Low Priority #### *️⃣ Low Priority
It changed my current workflow and require further studies. It changed my current workflow and require further studies.
@ -143,7 +141,7 @@ express.js is just used for serving the frontend built files (index.html, .js an
- modules/ (Modified 3rd-party modules) - modules/ (Modified 3rd-party modules)
- notification-providers/ (individual notification logic) - notification-providers/ (individual notification logic)
- routers/ (Express Routers) - routers/ (Express Routers)
- scoket-handler (Socket.io Handlers) - socket-handler (Socket.io Handlers)
- server.js (Server main logic) - server.js (Server main logic)
## How to start the Frontend Dev Server ## How to start the Frontend Dev Server
@ -201,7 +199,7 @@ ncu -u -t patch
npm install npm install
``` ```
Since previously updating vite 2.5.10 to 2.6.0 broke the application completely, from now on, it should update patch release version only. Since previously updating Vite 2.5.10 to 2.6.0 broke the application completely, from now on, it should update patch release version only.
Patch release = the third digit ([Semantic Versioning](https://semver.org/)) Patch release = the third digit ([Semantic Versioning](https://semver.org/))
@ -209,20 +207,19 @@ Patch release = the third digit ([Semantic Versioning](https://semver.org/))
Please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages Please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages
## Wiki ## Wiki
Since there is no way to make a pull request to wiki's repo, I have setup another repo to do that. Since there is no way to make a pull request to wiki's repo, I have set up another repo to do that.
https://github.com/louislam/uptime-kuma-wiki https://github.com/louislam/uptime-kuma-wiki
## Maintainer ## Maintainer
Check the latest issues and pull requests: Check the latest issues and pull requests:
https://github.com/louislam/uptime-kuma/issues?q=sort%3Aupdated-desc https://github.com/louislam/uptime-kuma/issues?q=sort%3Aupdated-desc
### Release Procedures ### Release Procedures
1. Draft a release note 1. Draft a release note
1. Make sure the repo is cleared 1. Make sure the repo is cleared
1. `npm run update-version 1.X.X` 1. `npm run update-version 1.X.X`
@ -234,22 +231,24 @@ https://github.com/louislam/uptime-kuma/issues?q=sort%3Aupdated-desc
1. SSH to demo site server and update to 1.X.X 1. SSH to demo site server and update to 1.X.X
Checking: Checking:
- Check all tags is fine on https://hub.docker.com/r/louislam/uptime-kuma/tags - Check all tags is fine on https://hub.docker.com/r/louislam/uptime-kuma/tags
- Try the Docker image with tag 1.X.X (Clean install / amd64 / arm64 / armv7) - Try the Docker image with tag 1.X.X (Clean install / amd64 / arm64 / armv7)
- Try clean install with Node.js - Try clean installation with Node.js
### Release Wiki ### Release Wiki
#### Setup Repo #### Setup Repo
```
```bash
git clone https://github.com/louislam/uptime-kuma-wiki.git git clone https://github.com/louislam/uptime-kuma-wiki.git
cd uptime-kuma-wiki cd uptime-kuma-wiki
git remote add production https://github.com/louislam/uptime-kuma.wiki.git git remote add production https://github.com/louislam/uptime-kuma.wiki.git
``` ```
#### Push to Production Wiki #### Push to Production Wiki
```
```bash
git pull git pull
git push production master git push production master
``` ```

View file

@ -17,13 +17,13 @@ Try it!
https://demo.uptime.kuma.pet https://demo.uptime.kuma.pet
It is a temporary live demo, all data will be deleted after 10 minutes. The server is located at Tokyo, so if you live far from there it may affect your experience. I suggest that you should install and try it out for the best demo experience. It is a temporary live demo, all data will be deleted after 10 minutes. The server is located in Tokyo, so if you live far from there, it may affect your experience. I suggest that you should install and try it out for the best demo experience.
VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollective.com/uptime-kuma)! Thank you so much! VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollective.com/uptime-kuma)! Thank you so much!
## ⭐ Features ## ⭐ Features
* Monitoring uptime for HTTP(s) / TCP / Ping / DNS Record / Push. * Monitoring uptime for HTTP(s) / TCP / HTTP(s) Keyword / Ping / DNS Record / Push / Steam Game Server.
* Fancy, Reactive, Fast UI/UX. * Fancy, Reactive, Fast UI/UX.
* Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and [70+ notification services, click here for the full list](https://github.com/louislam/uptime-kuma/tree/master/src/components/notifications). * Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and [70+ notification services, click here for the full list](https://github.com/louislam/uptime-kuma/tree/master/src/components/notifications).
* 20 second intervals. * 20 second intervals.
@ -67,7 +67,7 @@ Browse to http://localhost:3001 after starting.
### Advanced Installation ### Advanced Installation
If you need more options or need to browse via a reserve proxy, please read: If you need more options or need to browse via a reverse proxy, please read:
https://github.com/louislam/uptime-kuma/wiki/%F0%9F%94%A7-How-to-Install https://github.com/louislam/uptime-kuma/wiki/%F0%9F%94%A7-How-to-Install
@ -120,7 +120,7 @@ If you love this project, please consider giving me a ⭐.
### Issues Page ### Issues Page
You can discuss or ask for help in [Issues](https://github.com/louislam/uptime-kuma/issues). You can discuss or ask for help in [issues](https://github.com/louislam/uptime-kuma/issues).
### Subreddit ### Subreddit
@ -132,8 +132,8 @@ https://www.reddit.com/r/UptimeKuma/
If you want to report a bug or request a new feature. Free feel to open a [new issue](https://github.com/louislam/uptime-kuma/issues). If you want to report a bug or request a new feature. Free feel to open a [new issue](https://github.com/louislam/uptime-kuma/issues).
If you want to translate Uptime Kuma into your langauge, please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages If you want to translate Uptime Kuma into your language, please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages
If you want to modify Uptime Kuma, this guideline may be useful for you: https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md If you want to modify Uptime Kuma, this guideline may be useful for you: https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md
English proofreading is needed too because my grammar is not that great sadly. Feel free to correct my grammar in this readme, source code, or wiki. English proofreading is needed too because my grammar is not that great, sadly. Feel free to correct my grammar in this README, source code, or wiki.

View file

@ -4,5 +4,5 @@ WORKDIR /app
# Install apprise, iputils for non-root ping, setpriv # Install apprise, iputils for non-root ping, setpriv
RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib && \ RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib && \
pip3 --no-cache-dir install apprise && \ pip3 --no-cache-dir install apprise==0.9.6 && \
rm -rf /root/.cache rm -rf /root/.cache

View file

@ -4,9 +4,9 @@ FROM node:14-buster-slim
WORKDIR /app WORKDIR /app
# Install Apprise, add sqlite3 cli for debugging in the future, iputils-ping for ping, util-linux for setpriv # Install Apprise, add sqlite3 cli for debugging in the future, iputils-ping for ping, util-linux for setpriv
# Stupid python3 and python3-pip actually install a lot of useless things into Debian, specific --no-install-recommends to skip them, make the base even smaller than alpine! # Stupid python3 and python3-pip actually install a lot of useless things into Debian, specify --no-install-recommends to skip them, make the base even smaller than alpine!
RUN apt update && \ RUN apt update && \
apt --yes --no-install-recommends install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \ apt --yes --no-install-recommends install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \
sqlite3 iputils-ping util-linux dumb-init && \ sqlite3 iputils-ping util-linux dumb-init && \
pip3 --no-cache-dir install apprise && \ pip3 --no-cache-dir install apprise==0.9.6 && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*

492
package-lock.json generated
View file

@ -19,7 +19,7 @@
"axios": "~0.21.4", "axios": "~0.21.4",
"bcryptjs": "~2.4.3", "bcryptjs": "~2.4.3",
"bootstrap": "5.1.3", "bootstrap": "5.1.3",
"bree": "~6.3.1", "bree": "~7.1.0",
"chardet": "^1.3.0", "chardet": "^1.3.0",
"chart.js": "~3.6.0", "chart.js": "~3.6.0",
"chartjs-adapter-dayjs": "~1.0.0", "chartjs-adapter-dayjs": "~1.0.0",
@ -42,7 +42,7 @@
"postcss-scss": "~4.0.2", "postcss-scss": "~4.0.2",
"prom-client": "~13.2.0", "prom-client": "~13.2.0",
"prometheus-api-metrics": "~3.2.0", "prometheus-api-metrics": "~3.2.0",
"qrcode": "~1.4.4", "qrcode": "~1.5.0",
"redbean-node": "0.1.3", "redbean-node": "0.1.3",
"socket.io": "~4.2.0", "socket.io": "~4.2.0",
"socket.io-client": "~4.2.0", "socket.io-client": "~4.2.0",
@ -86,7 +86,7 @@
"vite": "~2.6.14" "vite": "~2.6.14"
}, },
"engines": { "engines": {
"node": "14.*" "node": "14.* || >=16.*"
} }
}, },
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
@ -3437,6 +3437,7 @@
"version": "3.2.1", "version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"dependencies": { "dependencies": {
"color-convert": "^1.9.0" "color-convert": "^1.9.0"
}, },
@ -3891,6 +3892,7 @@
"version": "1.5.1", "version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true,
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@ -4044,27 +4046,24 @@
} }
}, },
"node_modules/bree": { "node_modules/bree": {
"version": "6.3.1", "version": "7.1.0",
"resolved": "https://registry.npmjs.org/bree/-/bree-6.3.1.tgz", "resolved": "https://registry.npmjs.org/bree/-/bree-7.1.0.tgz",
"integrity": "sha512-FADpEV5c+3ZuFIBothyyRUxZClJD2PetIo0lmqAFJ3ZMI9WsSmQmmstZ86Dy0G4Gyw3nPNdfYTjV7+9pPtlB8g==", "integrity": "sha512-1bKJDODePYjIIUvt/ImO5PnitRQjZnTfMnsXq64LAWf2muXn9lCju0PnKoayIHdYzEMKepXr+YYY+Y+cmaVkHA==",
"deprecated": "bree@7.0.0 drops support for the browser, Node <12.11.0, and removes bthreads entirely. Either upgrade to v7.0.0 or lock your bree version to v6.5.0.",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.12.5", "@breejs/later": "^4.1.0",
"@breejs/later": "^4.0.2", "boolean": "^3.1.4",
"boolean": "^3.0.2",
"bthreads": "^0.5.1",
"combine-errors": "^3.0.3", "combine-errors": "^3.0.3",
"cron-validate": "^1.4.1", "cron-validate": "^1.4.3",
"debug": "^4.3.1", "debug": "^4.3.2",
"human-interval": "^2.0.0", "human-interval": "^2.0.1",
"is-string-and-not-blank": "^0.0.2", "is-string-and-not-blank": "^0.0.2",
"is-valid-path": "^0.1.1", "is-valid-path": "^0.1.1",
"ms": "^2.1.2", "ms": "^2.1.3",
"p-wait-for": "3.1.0", "p-wait-for": "3",
"safe-timers": "^1.1.0" "safe-timers": "^1.1.0"
}, },
"engines": { "engines": {
"node": ">= 10" "node": ">= 12.11.0"
} }
}, },
"node_modules/browser-process-hrtime": { "node_modules/browser-process-hrtime": {
@ -4105,21 +4104,11 @@
"node-int64": "^0.4.0" "node-int64": "^0.4.0"
} }
}, },
"node_modules/bthreads": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/bthreads/-/bthreads-0.5.1.tgz",
"integrity": "sha512-nK7Jo9ll+r1FRMNPWEFRTZMQrX6HhX8JjPAofxmbTNILHqWVIJPmWzCi9JlX/K0DL5AKZTFZg2Qser5C6gVs9A==",
"dependencies": {
"bufio": "~1.0.5"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/buffer": { "node_modules/buffer": {
"version": "5.7.1", "version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@ -4139,20 +4128,6 @@
"ieee754": "^1.1.13" "ieee754": "^1.1.13"
} }
}, },
"node_modules/buffer-alloc": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
"integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
"dependencies": {
"buffer-alloc-unsafe": "^1.1.0",
"buffer-fill": "^1.0.0"
}
},
"node_modules/buffer-alloc-unsafe": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
"integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
},
"node_modules/buffer-crc32": { "node_modules/buffer-crc32": {
"version": "0.2.13", "version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
@ -4167,23 +4142,11 @@
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
}, },
"node_modules/buffer-fill": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
"integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
},
"node_modules/buffer-from": { "node_modules/buffer-from": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
}, "dev": true
"node_modules/bufio": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/bufio/-/bufio-1.0.7.tgz",
"integrity": "sha512-bd1dDQhiC+bEbEfg56IdBv7faWa6OipMs/AFFFvtFnB3wAYjlwQpQRZ0pm6ZkgtfL0pILRXhKxOiQj6UzoMR7A==",
"engines": {
"node": ">=8.0.0"
}
}, },
"node_modules/bytes": { "node_modules/bytes": {
"version": "3.1.0", "version": "3.1.0",
@ -4465,6 +4428,7 @@
"version": "1.9.3", "version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"dependencies": { "dependencies": {
"color-name": "1.1.3" "color-name": "1.1.3"
} }
@ -4472,7 +4436,8 @@
"node_modules/color-name": { "node_modules/color-name": {
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
}, },
"node_modules/color-support": { "node_modules/color-support": {
"version": "1.1.3", "version": "1.1.3",
@ -5061,6 +5026,11 @@
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
}, },
"node_modules/encode-utf8": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
"integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
},
"node_modules/encodeurl": { "node_modules/encodeurl": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
@ -6384,7 +6354,6 @@
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"dependencies": { "dependencies": {
"locate-path": "^5.0.0", "locate-path": "^5.0.0",
"path-exists": "^4.0.0" "path-exists": "^4.0.0"
@ -6976,6 +6945,7 @@
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true,
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@ -7380,11 +7350,6 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/isarray": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
},
"node_modules/isexe": { "node_modules/isexe": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@ -9713,7 +9678,6 @@
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"dependencies": { "dependencies": {
"p-locate": "^4.1.0" "p-locate": "^4.1.0"
}, },
@ -10783,7 +10747,6 @@
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"dependencies": { "dependencies": {
"p-limit": "^2.2.0" "p-limit": "^2.2.0"
}, },
@ -11033,11 +10996,11 @@
} }
}, },
"node_modules/pngjs": { "node_modules/pngjs": {
"version": "3.4.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
"integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
"engines": { "engines": {
"node": ">=4.0.0" "node": ">=10.13.0"
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
@ -11516,133 +11479,73 @@
} }
}, },
"node_modules/qrcode": { "node_modules/qrcode": {
"version": "1.4.4", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.0.tgz",
"integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==", "integrity": "sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ==",
"dependencies": { "dependencies": {
"buffer": "^5.4.3",
"buffer-alloc": "^1.2.0",
"buffer-from": "^1.1.1",
"dijkstrajs": "^1.0.1", "dijkstrajs": "^1.0.1",
"isarray": "^2.0.1", "encode-utf8": "^1.0.3",
"pngjs": "^3.3.0", "pngjs": "^5.0.0",
"yargs": "^13.2.4" "yargs": "^15.3.1"
}, },
"bin": { "bin": {
"qrcode": "bin/qrcode" "qrcode": "bin/qrcode"
}, },
"engines": { "engines": {
"node": ">=4" "node": ">=10.13.0"
} }
}, },
"node_modules/qrcode/node_modules/ansi-regex": { "node_modules/qrcode/node_modules/ansi-styles": {
"version": "4.1.0", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": { "engines": {
"node": ">=6" "node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
} }
}, },
"node_modules/qrcode/node_modules/cliui": { "node_modules/qrcode/node_modules/cliui": {
"version": "5.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dependencies": { "dependencies": {
"string-width": "^3.1.0", "string-width": "^4.2.0",
"strip-ansi": "^5.2.0", "strip-ansi": "^6.0.0",
"wrap-ansi": "^5.1.0" "wrap-ansi": "^6.2.0"
} }
}, },
"node_modules/qrcode/node_modules/emoji-regex": { "node_modules/qrcode/node_modules/color-convert": {
"version": "7.0.3", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
},
"node_modules/qrcode/node_modules/find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dependencies": { "dependencies": {
"locate-path": "^3.0.0" "color-name": "~1.1.4"
}, },
"engines": { "engines": {
"node": ">=6" "node": ">=7.0.0"
} }
}, },
"node_modules/qrcode/node_modules/is-fullwidth-code-point": { "node_modules/qrcode/node_modules/color-name": {
"version": "2.0.0", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
"engines": {
"node": ">=4"
}
},
"node_modules/qrcode/node_modules/locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dependencies": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/qrcode/node_modules/p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dependencies": {
"p-limit": "^2.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/qrcode/node_modules/path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
"engines": {
"node": ">=4"
}
},
"node_modules/qrcode/node_modules/string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dependencies": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/qrcode/node_modules/strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dependencies": {
"ansi-regex": "^4.1.0"
},
"engines": {
"node": ">=6"
}
}, },
"node_modules/qrcode/node_modules/wrap-ansi": { "node_modules/qrcode/node_modules/wrap-ansi": {
"version": "5.1.0", "version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dependencies": { "dependencies": {
"ansi-styles": "^3.2.0", "ansi-styles": "^4.0.0",
"string-width": "^3.0.0", "string-width": "^4.1.0",
"strip-ansi": "^5.0.0" "strip-ansi": "^6.0.0"
}, },
"engines": { "engines": {
"node": ">=6" "node": ">=8"
} }
}, },
"node_modules/qrcode/node_modules/y18n": { "node_modules/qrcode/node_modules/y18n": {
@ -11651,29 +11554,36 @@
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
}, },
"node_modules/qrcode/node_modules/yargs": { "node_modules/qrcode/node_modules/yargs": {
"version": "13.3.2", "version": "15.4.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
"integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"dependencies": { "dependencies": {
"cliui": "^5.0.0", "cliui": "^6.0.0",
"find-up": "^3.0.0", "decamelize": "^1.2.0",
"find-up": "^4.1.0",
"get-caller-file": "^2.0.1", "get-caller-file": "^2.0.1",
"require-directory": "^2.1.1", "require-directory": "^2.1.1",
"require-main-filename": "^2.0.0", "require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0", "set-blocking": "^2.0.0",
"string-width": "^3.0.0", "string-width": "^4.2.0",
"which-module": "^2.0.0", "which-module": "^2.0.0",
"y18n": "^4.0.0", "y18n": "^4.0.0",
"yargs-parser": "^13.1.2" "yargs-parser": "^18.1.2"
},
"engines": {
"node": ">=8"
} }
}, },
"node_modules/qrcode/node_modules/yargs-parser": { "node_modules/qrcode/node_modules/yargs-parser": {
"version": "13.1.2", "version": "18.1.3",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
"integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"dependencies": { "dependencies": {
"camelcase": "^5.0.0", "camelcase": "^5.0.0",
"decamelize": "^1.2.0" "decamelize": "^1.2.0"
},
"engines": {
"node": ">=6"
} }
}, },
"node_modules/qs": { "node_modules/qs": {
@ -17087,6 +16997,7 @@
"version": "3.2.1", "version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": { "requires": {
"color-convert": "^1.9.0" "color-convert": "^1.9.0"
} }
@ -17447,7 +17358,8 @@
"base64-js": { "base64-js": {
"version": "1.5.1", "version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true
}, },
"base64id": { "base64id": {
"version": "2.0.0", "version": "2.0.0",
@ -17567,22 +17479,20 @@
} }
}, },
"bree": { "bree": {
"version": "6.3.1", "version": "7.1.0",
"resolved": "https://registry.npmjs.org/bree/-/bree-6.3.1.tgz", "resolved": "https://registry.npmjs.org/bree/-/bree-7.1.0.tgz",
"integrity": "sha512-FADpEV5c+3ZuFIBothyyRUxZClJD2PetIo0lmqAFJ3ZMI9WsSmQmmstZ86Dy0G4Gyw3nPNdfYTjV7+9pPtlB8g==", "integrity": "sha512-1bKJDODePYjIIUvt/ImO5PnitRQjZnTfMnsXq64LAWf2muXn9lCju0PnKoayIHdYzEMKepXr+YYY+Y+cmaVkHA==",
"requires": { "requires": {
"@babel/runtime": "^7.12.5", "@breejs/later": "^4.1.0",
"@breejs/later": "^4.0.2", "boolean": "^3.1.4",
"boolean": "^3.0.2",
"bthreads": "^0.5.1",
"combine-errors": "^3.0.3", "combine-errors": "^3.0.3",
"cron-validate": "^1.4.1", "cron-validate": "^1.4.3",
"debug": "^4.3.1", "debug": "^4.3.2",
"human-interval": "^2.0.0", "human-interval": "^2.0.1",
"is-string-and-not-blank": "^0.0.2", "is-string-and-not-blank": "^0.0.2",
"is-valid-path": "^0.1.1", "is-valid-path": "^0.1.1",
"ms": "^2.1.2", "ms": "^2.1.3",
"p-wait-for": "3.1.0", "p-wait-for": "3",
"safe-timers": "^1.1.0" "safe-timers": "^1.1.0"
} }
}, },
@ -17614,37 +17524,16 @@
"node-int64": "^0.4.0" "node-int64": "^0.4.0"
} }
}, },
"bthreads": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/bthreads/-/bthreads-0.5.1.tgz",
"integrity": "sha512-nK7Jo9ll+r1FRMNPWEFRTZMQrX6HhX8JjPAofxmbTNILHqWVIJPmWzCi9JlX/K0DL5AKZTFZg2Qser5C6gVs9A==",
"requires": {
"bufio": "~1.0.5"
}
},
"buffer": { "buffer": {
"version": "5.7.1", "version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
"requires": { "requires": {
"base64-js": "^1.3.1", "base64-js": "^1.3.1",
"ieee754": "^1.1.13" "ieee754": "^1.1.13"
} }
}, },
"buffer-alloc": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
"integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
"requires": {
"buffer-alloc-unsafe": "^1.1.0",
"buffer-fill": "^1.0.0"
}
},
"buffer-alloc-unsafe": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
"integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
},
"buffer-crc32": { "buffer-crc32": {
"version": "0.2.13", "version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
@ -17656,20 +17545,11 @@
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
}, },
"buffer-fill": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
"integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
},
"buffer-from": { "buffer-from": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
}, "dev": true
"bufio": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/bufio/-/bufio-1.0.7.tgz",
"integrity": "sha512-bd1dDQhiC+bEbEfg56IdBv7faWa6OipMs/AFFFvtFnB3wAYjlwQpQRZ0pm6ZkgtfL0pILRXhKxOiQj6UzoMR7A=="
}, },
"bytes": { "bytes": {
"version": "3.1.0", "version": "3.1.0",
@ -17884,6 +17764,7 @@
"version": "1.9.3", "version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": { "requires": {
"color-name": "1.1.3" "color-name": "1.1.3"
} }
@ -17891,7 +17772,8 @@
"color-name": { "color-name": {
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
}, },
"color-support": { "color-support": {
"version": "1.1.3", "version": "1.1.3",
@ -18361,6 +18243,11 @@
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
}, },
"encode-utf8": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
"integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
},
"encodeurl": { "encodeurl": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
@ -19330,7 +19217,6 @@
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": { "requires": {
"locate-path": "^5.0.0", "locate-path": "^5.0.0",
"path-exists": "^4.0.0" "path-exists": "^4.0.0"
@ -19769,7 +19655,8 @@
"ieee754": { "ieee754": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true
}, },
"ignore": { "ignore": {
"version": "4.0.6", "version": "4.0.6",
@ -20053,11 +19940,6 @@
"integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=",
"dev": true "dev": true
}, },
"isarray": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
},
"isexe": { "isexe": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@ -21809,7 +21691,6 @@
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": { "requires": {
"p-locate": "^4.1.0" "p-locate": "^4.1.0"
} }
@ -22630,7 +22511,6 @@
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": { "requires": {
"p-limit": "^2.2.0" "p-limit": "^2.2.0"
} }
@ -22810,9 +22690,9 @@
"integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8="
}, },
"pngjs": { "pngjs": {
"version": "3.4.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
"integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="
}, },
"postcss": { "postcss": {
"version": "8.3.11", "version": "8.3.11",
@ -23170,100 +23050,55 @@
} }
}, },
"qrcode": { "qrcode": {
"version": "1.4.4", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.0.tgz",
"integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==", "integrity": "sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ==",
"requires": { "requires": {
"buffer": "^5.4.3",
"buffer-alloc": "^1.2.0",
"buffer-from": "^1.1.1",
"dijkstrajs": "^1.0.1", "dijkstrajs": "^1.0.1",
"isarray": "^2.0.1", "encode-utf8": "^1.0.3",
"pngjs": "^3.3.0", "pngjs": "^5.0.0",
"yargs": "^13.2.4" "yargs": "^15.3.1"
}, },
"dependencies": { "dependencies": {
"ansi-regex": { "ansi-styles": {
"version": "4.1.0", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"requires": {
"color-convert": "^2.0.1"
}
}, },
"cliui": { "cliui": {
"version": "5.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"requires": { "requires": {
"string-width": "^3.1.0", "string-width": "^4.2.0",
"strip-ansi": "^5.2.0", "strip-ansi": "^6.0.0",
"wrap-ansi": "^5.1.0" "wrap-ansi": "^6.2.0"
} }
}, },
"emoji-regex": { "color-convert": {
"version": "7.0.3", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
},
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"requires": { "requires": {
"locate-path": "^3.0.0" "color-name": "~1.1.4"
} }
}, },
"is-fullwidth-code-point": { "color-name": {
"version": "2.0.0", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"requires": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
}
},
"p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"requires": {
"p-limit": "^2.0.0"
}
},
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
},
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"requires": {
"ansi-regex": "^4.1.0"
}
}, },
"wrap-ansi": { "wrap-ansi": {
"version": "5.1.0", "version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"requires": { "requires": {
"ansi-styles": "^3.2.0", "ansi-styles": "^4.0.0",
"string-width": "^3.0.0", "string-width": "^4.1.0",
"strip-ansi": "^5.0.0" "strip-ansi": "^6.0.0"
} }
}, },
"y18n": { "y18n": {
@ -23272,26 +23107,27 @@
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
}, },
"yargs": { "yargs": {
"version": "13.3.2", "version": "15.4.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
"integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"requires": { "requires": {
"cliui": "^5.0.0", "cliui": "^6.0.0",
"find-up": "^3.0.0", "decamelize": "^1.2.0",
"find-up": "^4.1.0",
"get-caller-file": "^2.0.1", "get-caller-file": "^2.0.1",
"require-directory": "^2.1.1", "require-directory": "^2.1.1",
"require-main-filename": "^2.0.0", "require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0", "set-blocking": "^2.0.0",
"string-width": "^3.0.0", "string-width": "^4.2.0",
"which-module": "^2.0.0", "which-module": "^2.0.0",
"y18n": "^4.0.0", "y18n": "^4.0.0",
"yargs-parser": "^13.1.2" "yargs-parser": "^18.1.2"
} }
}, },
"yargs-parser": { "yargs-parser": {
"version": "13.1.2", "version": "18.1.3",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
"integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"requires": { "requires": {
"camelcase": "^5.0.0", "camelcase": "^5.0.0",
"decamelize": "^1.2.0" "decamelize": "^1.2.0"

View file

@ -7,7 +7,7 @@
"url": "https://github.com/louislam/uptime-kuma.git" "url": "https://github.com/louislam/uptime-kuma.git"
}, },
"engines": { "engines": {
"node": "14.*" "node": "14.* || >=16.*"
}, },
"scripts": { "scripts": {
"install-legacy": "npm install --legacy-peer-deps", "install-legacy": "npm install --legacy-peer-deps",
@ -22,7 +22,7 @@
"build": "vite build --config ./config/vite.config.js", "build": "vite build --config ./config/vite.config.js",
"test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --test", "test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --test",
"test-with-build": "npm run build && npm test", "test-with-build": "npm run build && npm test",
"jest": "node test/prepare-jest.js && npm run jest-frontend && npm run jest-backend && jest --runInBand --config=./config/jest.config.js", "jest": "node test/prepare-jest.js && npm run jest-frontend && npm run jest-backend",
"jest-frontend": "cross-env TEST_FRONTEND=1 jest --config=./config/jest-frontend.config.js", "jest-frontend": "cross-env TEST_FRONTEND=1 jest --config=./config/jest-frontend.config.js",
"jest-backend": "cross-env TEST_BACKEND=1 jest --config=./config/jest-backend.config.js", "jest-backend": "cross-env TEST_BACKEND=1 jest --config=./config/jest-backend.config.js",
"tsc": "tsc", "tsc": "tsc",
@ -64,7 +64,7 @@
"axios": "~0.21.4", "axios": "~0.21.4",
"bcryptjs": "~2.4.3", "bcryptjs": "~2.4.3",
"bootstrap": "5.1.3", "bootstrap": "5.1.3",
"bree": "~6.3.1", "bree": "~7.1.0",
"chardet": "^1.3.0", "chardet": "^1.3.0",
"chart.js": "~3.6.0", "chart.js": "~3.6.0",
"chartjs-adapter-dayjs": "~1.0.0", "chartjs-adapter-dayjs": "~1.0.0",
@ -87,7 +87,7 @@
"postcss-scss": "~4.0.2", "postcss-scss": "~4.0.2",
"prom-client": "~13.2.0", "prom-client": "~13.2.0",
"prometheus-api-metrics": "~3.2.0", "prometheus-api-metrics": "~3.2.0",
"qrcode": "~1.4.4", "qrcode": "~1.5.0",
"redbean-node": "0.1.3", "redbean-node": "0.1.3",
"socket.io": "~4.2.0", "socket.io": "~4.2.0",
"socket.io-client": "~4.2.0", "socket.io-client": "~4.2.0",

View file

@ -7,12 +7,12 @@ class Pushover extends NotificationProvider {
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully."; let okMsg = "Sent Successfully.";
let pushoverlink = "https://api.pushover.net/1/messages.json" let pushoverlink = "https://api.pushover.net/1/messages.json";
try { try {
if (heartbeatJSON == null) { if (heartbeatJSON == null) {
let data = { let data = {
"message": "<b>Uptime Kuma Pushover testing successful.</b>", "message": msg,
"user": notification.pushoveruserkey, "user": notification.pushoveruserkey,
"token": notification.pushoverapptoken, "token": notification.pushoverapptoken,
"sound": notification.pushoversounds, "sound": notification.pushoversounds,
@ -21,8 +21,8 @@ class Pushover extends NotificationProvider {
"retry": "30", "retry": "30",
"expire": "3600", "expire": "3600",
"html": 1, "html": 1,
} };
await axios.post(pushoverlink, data) await axios.post(pushoverlink, data);
return okMsg; return okMsg;
} }
@ -36,11 +36,11 @@ class Pushover extends NotificationProvider {
"retry": "30", "retry": "30",
"expire": "3600", "expire": "3600",
"html": 1, "html": 1,
} };
await axios.post(pushoverlink, data) await axios.post(pushoverlink, data);
return okMsg; return okMsg;
} catch (error) { } catch (error) {
this.throwGeneralAxiosError(error) this.throwGeneralAxiosError(error);
} }
} }

View file

@ -0,0 +1,44 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
class SerwerSMS extends NotificationProvider {
name = "serwersms";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully.";
try {
let config = {
headers: {
"Content-Type": "application/json",
}
};
let data = {
"username": notification.serwersmsUsername,
"password": notification.serwersmsPassword,
"phone": notification.serwersmsPhoneNumber,
"text": msg.replace(/[^\x00-\x7F]/g, ""),
"sender": notification.serwersmsSenderName,
};
let resp = await axios.post("https://api2.serwersms.pl/messages/send_sms", data, config);
if (!resp.data.success) {
if (resp.data.error) {
let error = `SerwerSMS.pl API returned error code ${resp.data.error.code} (${resp.data.error.type}) with error message: ${resp.data.error.message}`;
this.throwGeneralAxiosError(error);
} else {
let error = "SerwerSMS.pl API returned an unexpected response";
this.throwGeneralAxiosError(error);
}
}
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = SerwerSMS;

View file

@ -0,0 +1,41 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { setting } = require("../util-server");
const { getMonitorRelativeURL } = require("../../src/util");
class Stackfield extends NotificationProvider {
name = "stackfield";
async send(notification, msg, monitorJSON = null) {
let okMsg = "Sent Successfully.";
try {
// Stackfield message formatting: https://www.stackfield.com/help/formatting-messages-2001
let textMsg = "+Uptime Kuma Alert+";
if (monitorJSON && monitorJSON.name) {
textMsg += `\n*${monitorJSON.name}*`;
}
textMsg += `\n${msg}`;
const baseURL = await setting("primaryBaseURL");
if (baseURL) {
textMsg += `\n${baseURL + getMonitorRelativeURL(monitorJSON.id)}`;
}
const data = {
"Title": textMsg,
};
await axios.post(notification.stackfieldwebhookURL, data);
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = Stackfield;

View file

@ -23,6 +23,8 @@ const Feishu = require("./notification-providers/feishu");
const AliyunSms = require("./notification-providers/aliyun-sms"); const AliyunSms = require("./notification-providers/aliyun-sms");
const DingDing = require("./notification-providers/dingding"); const DingDing = require("./notification-providers/dingding");
const Bark = require("./notification-providers/bark"); const Bark = require("./notification-providers/bark");
const SerwerSMS = require("./notification-providers/serwersms");
const Stackfield = require("./notification-providers/stackfield");
class Notification { class Notification {
@ -58,6 +60,8 @@ class Notification {
new Telegram(), new Telegram(),
new Webhook(), new Webhook(),
new Bark(), new Bark(),
new SerwerSMS(),
new Stackfield(),
]; ];
for (let item of list) { for (let item of list) {

View file

@ -3,7 +3,7 @@
<label for="clicksendsms-login" class="form-label">API Username</label> <label for="clicksendsms-login" class="form-label">API Username</label>
<div class="form-text"> <div class="form-text">
{{ $t("apiCredentials") }} {{ $t("apiCredentials") }}
<a href="http://dashboard.clicksend.com/account/subaccounts" target="_blank">here</a> <a href="http://dashboard.clicksend.com/account/subaccounts" target="_blank">{{ $t("here") }}</a>
</div> </div>
<input id="clicksendsms-login" v-model="$parent.notification.clicksendsmsLogin" type="text" class="form-control" required> <input id="clicksendsms-login" v-model="$parent.notification.clicksendsmsLogin" type="text" class="form-control" required>
<label for="clicksendsms-key" class="form-label">API Key</label> <label for="clicksendsms-key" class="form-label">API Key</label>

View file

@ -10,7 +10,7 @@
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="secure" class="form-label">Secure</label> <label for="secure" class="form-label">{{ $t("Security") }}</label>
<select id="secure" v-model="$parent.notification.smtpSecure" class="form-select"> <select id="secure" v-model="$parent.notification.smtpSecure" class="form-select">
<option :value="false">{{ $t("secureOptionNone") }}</option> <option :value="false">{{ $t("secureOptionNone") }}</option>
<option :value="true">{{ $t("secureOptionTLS") }}</option> <option :value="true">{{ $t("secureOptionTLS") }}</option>

View file

@ -0,0 +1,28 @@
<template>
<div class="mb-3">
<label for="serwersms-username" class="form-label">{{ $t('serwersmsAPIUser') }}</label>
<input id="serwersms-username" v-model="$parent.notification.serwersmsUsername" type="text" class="form-control" required>
</div>
<div class="mb-3">
<label for="serwersms-key" class="form-label">{{ $t('serwersmsAPIPassword') }}</label>
<HiddenInput id="serwersms-key" v-model="$parent.notification.serwersmsPassword" :required="true" autocomplete="one-time-code"></HiddenInput>
</div>
<div class="mb-3">
<label for="serwersms-phone-number" class="form-label">{{ $t("serwersmsPhoneNumber") }}</label>
<input id="serwersms-phone-number" v-model="$parent.notification.serwersmsPhoneNumber" type="text" class="form-control" required>
</div>
<div class="mb-3">
<label for="serwersms-sender-name" class="form-label">{{ $t("serwersmsSenderName") }}</label>
<input id="serwersms-sender-name" v-model="$parent.notification.serwersmsSenderName" type="text" minlength="3" maxlength="11" class="form-control">
</div>
</template>
<script>
import HiddenInput from "../HiddenInput.vue";
export default {
components: {
HiddenInput,
},
};
</script>

View file

@ -0,0 +1,13 @@
<template>
<div class="mb-3">
<label for="stackfield-webhook-url" class="form-label">{{ $t("Webhook URL") }}<span style="color: red;"><sup>*</sup></span></label>
<input id="stackfield-webhook-url" v-model="$parent.notification.stackfieldwebhookURL" type="text" class="form-control" required>
<div class="form-text">
<span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
<i18n-t tag="p" keypath="aboutWebhooks" style="margin-top: 8px;">
<a href="https://www.stackfield.com/developer-api#AnchorAPI2" target="_blank">https://www.stackfield.com/developer-api#AnchorAPI2</a>
</i18n-t>
</div>
</div>
</template>

View file

@ -25,13 +25,7 @@
</p> </p>
<p style="margin-top: 8px;"> <p style="margin-top: 8px;">
<template v-if="$parent.notification.telegramBotToken"> <a :href="telegramGetUpdatesURL('withToken')" target="_blank" style="word-break: break-word;">{{ telegramGetUpdatesURL("masked") }}</a>
<a :href="telegramGetUpdatesURL" target="_blank" style="word-break: break-word;">{{ telegramGetUpdatesURL }}</a>
</template>
<template v-else>
{{ telegramGetUpdatesURL }}
</template>
</p> </p>
</div> </div>
</div> </div>
@ -40,49 +34,51 @@
<script> <script>
import HiddenInput from "../HiddenInput.vue"; import HiddenInput from "../HiddenInput.vue";
import axios from "axios"; import axios from "axios";
import { useToast } from "vue-toastification" import { useToast } from "vue-toastification";
const toast = useToast(); const toast = useToast();
export default { export default {
components: { components: {
HiddenInput, HiddenInput,
}, },
computed: { methods: {
telegramGetUpdatesURL() { telegramGetUpdatesURL(mode = "masked") {
let token = `<${this.$t("YOUR BOT TOKEN HERE")}>` let token = `<${this.$t("YOUR BOT TOKEN HERE")}>`;
if (this.$parent.notification.telegramBotToken) { if (this.$parent.notification.telegramBotToken) {
token = this.$parent.notification.telegramBotToken; if (mode === "withToken") {
token = this.$parent.notification.telegramBotToken;
} else if (mode === "masked") {
token = "*".repeat(this.$parent.notification.telegramBotToken.length);
}
} }
return `https://api.telegram.org/bot${token}/getUpdates`; return `https://api.telegram.org/bot${token}/getUpdates`;
}, },
},
methods: {
async autoGetTelegramChatID() { async autoGetTelegramChatID() {
try { try {
let res = await axios.get(this.telegramGetUpdatesURL) let res = await axios.get(this.telegramGetUpdatesURL("withToken"));
if (res.data.result.length >= 1) { if (res.data.result.length >= 1) {
let update = res.data.result[res.data.result.length - 1] let update = res.data.result[res.data.result.length - 1];
if (update.channel_post) { if (update.channel_post) {
this.notification.telegramChatID = update.channel_post.chat.id; this.notification.telegramChatID = update.channel_post.chat.id;
} else if (update.message) { } else if (update.message) {
this.notification.telegramChatID = update.message.chat.id; this.notification.telegramChatID = update.message.chat.id;
} else { } else {
throw new Error(this.$t("chatIDNotFound")) throw new Error(this.$t("chatIDNotFound"));
} }
} else { } else {
throw new Error(this.$t("chatIDNotFound")) throw new Error(this.$t("chatIDNotFound"));
} }
} catch (error) { } catch (error) {
toast.error(error.message) toast.error(error.message);
} }
}, },
} }
} };
</script> </script>

View file

@ -22,6 +22,8 @@ import Matrix from "./Matrix.vue";
import AliyunSMS from "./AliyunSms.vue"; import AliyunSMS from "./AliyunSms.vue";
import DingDing from "./DingDing.vue"; import DingDing from "./DingDing.vue";
import Bark from "./Bark.vue"; import Bark from "./Bark.vue";
import SerwerSMS from "./SerwerSMS.vue";
import Stackfield from './Stackfield.vue';
/** /**
* Manage all notification form. * Manage all notification form.
@ -52,7 +54,9 @@ const NotificationFormList = {
"mattermost": Mattermost, "mattermost": Mattermost,
"matrix": Matrix, "matrix": Matrix,
"DingDing": DingDing, "DingDing": DingDing,
"Bark": Bark "Bark": Bark,
"serwersms": SerwerSMS,
"stackfield": Stackfield,
} }
export default NotificationFormList export default NotificationFormList

View file

@ -4,7 +4,7 @@
<label for="language" class="form-label"> <label for="language" class="form-label">
{{ $t("Language") }} {{ $t("Language") }}
</label> </label>
<select id="language" v-model="$i18n.locale" class="form-select"> <select id="language" v-model="$root.language" class="form-select">
<option <option
v-for="(lang, i) in $i18n.availableLocales" v-for="(lang, i) in $i18n.availableLocales"
:key="`Lang${i}`" :key="`Lang${i}`"
@ -116,14 +116,8 @@
</template> </template>
<script> <script>
import { setPageLocale } from "../../util-frontend";
export default { export default {
watch: {
"$i18n.locale"() {
localStorage.locale = this.$i18n.locale;
setPageLocale();
},
},
}; };
</script> </script>

View file

@ -122,6 +122,7 @@
<HiddenInput <HiddenInput
id="steamAPIKey" id="steamAPIKey"
v-model="settings.steamAPIKey" v-model="settings.steamAPIKey"
autocomplete="one-time-code"
/> />
<div class="form-text"> <div class="form-text">
{{ $t("steamApiKeyDescription") }} {{ $t("steamApiKeyDescription") }}

View file

@ -1,62 +1,45 @@
import { createI18n } from "vue-i18n/index"; import { createI18n } from "vue-i18n/index";
import daDK from "./languages/da-DK";
import deDE from "./languages/de-DE";
import en from "./languages/en"; import en from "./languages/en";
import esEs from "./languages/es-ES";
import etEE from "./languages/et-EE";
import fa from "./languages/fa";
import frFR from "./languages/fr-FR";
import hu from "./languages/hu";
import hrHR from "./languages/hr-HR";
import itIT from "./languages/it-IT";
import idID from "./languages/id-ID";
import ja from "./languages/ja";
import koKR from "./languages/ko-KR";
import nlNL from "./languages/nl-NL";
import nbNO from "./languages/nb-NO";
import pl from "./languages/pl";
import ptBR from "./languages/pt-BR";
import bgBG from "./languages/bg-BG";
import ruRU from "./languages/ru-RU";
import sr from "./languages/sr";
import srLatn from "./languages/sr-latn";
import svSE from "./languages/sv-SE";
import trTR from "./languages/tr-TR";
import vi from "./languages/vi";
import zhCN from "./languages/zh-CN";
import zhHK from "./languages/zh-HK";
import zhTW from "./languages/zh-TW";
const languageList = { const languageList = {
en, "zh-HK": "繁體中文 (香港)",
"zh-HK": zhHK, "bg-BG": "Български",
"bg-BG": bgBG, "de-DE": "Deutsch (Deutschland)",
"de-DE": deDE, "nl-NL": "Nederlands",
"nl-NL": nlNL, "nb-NO": "Norsk",
"nb-NO": nbNO, "es-ES": "Español",
"es-ES": esEs, "fa": "Farsi",
"fa": fa, "pt-BR": "Português (Brasileiro)",
"pt-BR": ptBR, "fr-FR": "Français (France)",
"fr-FR": frFR, "hu": "Magyar",
"hu": hu, "hr-HR": "Hrvatski",
"hr-HR": hrHR, "it-IT": "Italiano (Italian)",
"it-IT": itIT, "id-ID": "Bahasa Indonesia (Indonesian)",
"id-ID" : idID, "ja": "日本語",
"ja": ja, "da-DK": "Danish (Danmark)",
"da-DK": daDK, "sr": "Српски",
"sr": sr, "sr-latn": "Srpski",
"sr-latn": srLatn, "sv-SE": "Svenska",
"sv-SE": svSE, "tr-TR": "Türkçe",
"tr-TR": trTR, "ko-KR": "한국어",
"ko-KR": koKR, "ru-RU": "Русский",
"ru-RU": ruRU, "zh-CN": "简体中文",
"zh-CN": zhCN, "pl": "Polski",
"pl": pl, "et-EE": "eesti",
"et-EE": etEE, "vi": "Vietnamese",
"vi": vi, "zh-TW": "繁體中文 (台灣)"
"zh-TW": zhTW
}; };
let messages = {
en,
};
for (let lang in languageList) {
messages[lang] = {
languageName: languageList[lang]
};
}
const rtlLangs = ["fa"]; const rtlLangs = ["fa"];
export const currentLocale = () => localStorage.locale export const currentLocale = () => localStorage.locale
@ -73,5 +56,5 @@ export const i18n = createI18n({
fallbackLocale: "en", fallbackLocale: "en",
silentFallbackWarn: true, silentFallbackWarn: true,
silentTranslationWarn: true, silentTranslationWarn: true,
messages: languageList, messages: messages,
}); });

View file

@ -5,10 +5,7 @@
3. Run `npm run update-language-files`. You can also use this command to check if there are new strings to translate for your language. 3. Run `npm run update-language-files`. You can also use this command to check if there are new strings to translate for your language.
4. Your language file should be filled in. You can translate now. 4. Your language file should be filled in. You can translate now.
5. Translate `src/components/settings/Security.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`). 5. Translate `src/components/settings/Security.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`).
6. Import your language file in `src/i18n.js` and add it to `languageList` constant. 6. Add it into `languageList` constant.
7. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done. 7. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
One of good examples: If you do not have programming skills, let me know in [the issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏
https://github.com/louislam/uptime-kuma/pull/316/files
If you do not have programming skills, let me know in [Issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏

View file

@ -89,7 +89,7 @@ export default {
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": "Нова парола",
@ -307,4 +307,5 @@ export default {
PasswordsDoNotMatch: "Паролите не съвпадат.", PasswordsDoNotMatch: "Паролите не съвпадат.",
"Current User": "Текущ потребител", "Current User": "Текущ потребител",
recent: "Скорошни", recent: "Скорошни",
shrinkDatabaseDescription: "Инициира \"VACUUM\" за \"SQLite\" база данни. Ако Вашата база данни е създадена след версия 1.10.0, \"AUTO_VACUUM\" функцията е активна и това действие не нужно.",
}; };

View file

@ -307,5 +307,49 @@ export default {
steamApiKeyDescription: "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ", steamApiKeyDescription: "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ",
"Current User": "Current User", "Current User": "Current User",
recent: "Recent", recent: "Recent",
Done: "Done",
Info: "Info",
Security: "Security",
"Steam API Key": "Steam API Key",
"Shrink Database": "Shrink Database",
"Pick a RR-Type...": "Pick a RR-Type...",
"Pick Accepted Status Codes...": "Pick Accepted Status Codes...",
Default: "Default",
"HTTP Options": "HTTP Options",
"Create Incident": "Create Incident",
Title: "Title",
Content: "Content",
Style: "Style",
info: "info",
warning: "warning",
danger: "danger",
primary: "primary",
light: "light",
dark: "dark",
Post: "Post",
"Please input title and content": "Please input title and content",
Created: "Created",
"Last Updated": "Last Updated",
Unpin: "Unpin",
"Switch to Light Theme": "Switch to Light Theme",
"Switch to Dark Theme": "Switch to Dark Theme",
"Show Tags": "Show Tags",
"Hide Tags": "Hide Tags",
Description: "Description",
"No monitors available.": "No monitors available.",
"Add one": "Add one",
"No Monitors": "No Monitors",
"Add one": "Add one",
"Untitled Group": "Untitled Group",
Services: "Services",
Discard: "Discard",
Cancel: "Cancel",
"Powered by": "Powered by",
shrinkDatabaseDescription: "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.", shrinkDatabaseDescription: "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
serwersmsAPIPassword: "API Password",
serwersmsPhoneNumber: "Phone number",
serwersmsSenderName: "SMS Sender Name (registered via customer portal)",
"stackfield": "Stackfield",
}; };

View file

@ -308,4 +308,43 @@ export default {
steamApiKeyDescription: "Za praćenje Steam poslužitelja za igru, potrebno je imati Steam Web-API ključ. Možete registrirati vlastiti ključ ovdje: ", steamApiKeyDescription: "Za praćenje Steam poslužitelja za igru, potrebno je imati Steam Web-API ključ. Možete registrirati vlastiti ključ ovdje: ",
"Current User": "Trenutni korisnik", "Current User": "Trenutni korisnik",
recent: "Nedavno", recent: "Nedavno",
Done: "Gotovo",
Info: "Informacije",
Security: "Sigurnost",
"Shrink Database": "Smanji bazu podataka",
"Pick a RR-Type...": "Odaberite vrstu DNS zapisa od navedenih...",
"Pick Accepted Status Codes...": "Odaberite HTTP statusne kodove koji će biti prihvaćeni...",
"Steam API Key": "Steam API ključ",
Default: "Zadano",
"HTTP Options": "HTTP Postavke",
"Create Incident": "Novi izvještaj o incidentu",
Title: "Naslov",
Content: "Sadržaj",
Style: "Stil",
info: "informacija",
warning: "upozorenje",
danger: "opasnost",
primary: "primarno",
light: "svijetlo",
dark: "tamno",
Post: "Objavi",
Created: "Stvoreno",
"Last Updated": "Uređeno",
"Please input title and content": "Naslov i sadržaj ne mogu biti prazni",
Unpin: "Ukloni",
"Switch to Light Theme": "Prebaci na svijetli način",
"Switch to Dark Theme": "Prebaci na tamni način",
"Show Tags": "Pokaži oznake",
"Hide Tags": "Sakrij oznake",
Description: "Opis",
"No monitors available.": "Nema dostupnih monitora.",
"Add one": "Add one",
"No Monitors": "Bez monitora",
"Add one": "Stvori jednog",
"Untitled Group": "Bezimena grupa",
Services: "Usluge",
Discard: "Odbaci",
Cancel: "Otkaži",
"Powered by": "Pokreće",
Saved: "Spremljeno",
}; };

View file

@ -2,26 +2,26 @@ export default {
languageName: "Magyar", languageName: "Magyar",
checkEverySecond: "Ellenőrzés {0} másodpercenként", checkEverySecond: "Ellenőrzés {0} másodpercenként",
retryCheckEverySecond: "Újrapróbál {0} másodpercenként.", retryCheckEverySecond: "Újrapróbál {0} másodpercenként.",
retriesDescription: "Maximális próbálkozás mielőtt a szolgáltatás leállt jelőlést kap és értesítés kerül kiküldésre", retriesDescription: "Maximális próbálkozás mielőtt a szolgáltatás 'Leállt' jelölést kap és értesítés kerül kiküldésre",
ignoreTLSError: "TLS/SSL hibák figyelnen kívül hagyása HTTPS weboldalaknál", ignoreTLSError: "TLS/SSL hibák figyelmen kívül hagyása HTTPS weboldalaknál",
upsideDownModeDescription: "Az állapot megfordítása. Ha a szolgáltatás elérhető, akkor lesz leállt állapotú.", upsideDownModeDescription: "Az állapot megfordítása. Ha a szolgáltatás elérhető, akkor lesz leállt állapotú.",
maxRedirectDescription: "Az átirányítások maximális száma. állítsa 0-ra az átirányítás tiltásához.", maxRedirectDescription: "Az átirányítások maximális száma. állítsa 0-ra az átirányítás tiltásához.",
acceptedStatusCodesDescription: "Válassza ki az állapot kódokat amelyek sikeres válasznak fognak számítani.", acceptedStatusCodesDescription: "Válassza ki az állapot kódokat amelyek sikeres válasznak fognak számítani.",
passwordNotMatchMsg: "A megismételt jelszó nem egyezik.", passwordNotMatchMsg: "A megismételt jelszó nem egyezik.",
notificationDescription: "Kérem, rendeljen egy értesítést a figyeléshez, hogy működjön.", notificationDescription: "Kérem, rendeljen egy értesítést a figyeléshez, hogy működjön.",
keywordDescription: "Kulcsszó keresése a html-ben vagy a JSON válaszban. (kis-nagybetű érzékeny)", keywordDescription: "Kulcsszó keresése a HTML-ben vagy a JSON válaszban. (kis-nagybetű érzékeny)",
pauseDashboardHome: "Szünetel", pauseDashboardHome: "Szünetel",
deleteMonitorMsg: "Biztos, hogy törölni akarja ezt a figyelőt?", deleteMonitorMsg: "Biztos, hogy törölni akarja ezt a figyelőt?",
deleteNotificationMsg: "Biztos, hogy törölni akarja ezt az értesítést az összes figyelőnél?", deleteNotificationMsg: "Biztos, hogy törölni akarja ezt az értesítést az összes figyelőnél?",
resoverserverDescription: "A Cloudflare az alapértelmezett szerver, bármikor meg tudja változtatni a resolver server-t.", resoverserverDescription: "A Cloudflare az alapértelmezett szerver, bármikor meg tudja változtatni a resolver server-t.",
rrtypeDescription: "Válassza ki az RR-Típust a figyelőhöz", rrtypeDescription: "Válassza ki az RR-típust a figyelőhöz",
pauseMonitorMsg: "Biztos, hogy szüneteltetni akarja?", pauseMonitorMsg: "Biztos, hogy szüneteltetni akarja?",
enableDefaultNotificationDescription: "Minden új figyelőhöz ez az értesítés engedélyezett lesz alapértelmezetten. Kikapcsolhatja az értesítést külön minden figyelőnél.", enableDefaultNotificationDescription: "Minden új figyelőhöz ez az értesítés engedélyezett lesz alapértelmezetten. Kikapcsolhatja az értesítést külön minden figyelőnél.",
clearEventsMsg: "Biztos, hogy törölni akar miden eseményt ennél a figyelnél?", clearEventsMsg: "Biztos, hogy törölni akar miden eseményt ennél a figyelnél?",
clearHeartbeatsMsg: "Biztos, hogy törölni akar minden heartbeat-et ennél a figyelőnél?", clearHeartbeatsMsg: "Biztos, hogy törölni akar minden életjelet ennél a figyelőnél?",
confirmClearStatisticsMsg: "Biztos, hogy törölni akat MINDEN statisztikát?", confirmClearStatisticsMsg: "Biztos, hogy törölni akar MINDEN statisztikát?",
importHandleDescription: "Válassza a 'Meglévő kihagyását', ha ki szeretné hagyni az azonos nevő figyelőket vagy értesítésket. A 'Felülírás' törölni fog minden meglévő figyelőt és értesítést.", importHandleDescription: "Válassza a 'Meglévő kihagyását', ha ki szeretné hagyni az azonos nevő figyelőket vagy értesítésket. A 'Felülírás' törölni fog minden meglévő figyelőt és értesítést.",
confirmImportMsg: "Biztos, hogy importálja a mentést? Győzödjön meg róla, hogy jól választotta ki az importálás opciót.", confirmImportMsg: "Biztos, hogy importálja a mentést? Győződjön meg róla, hogy jól választotta ki az importálás opciót.",
twoFAVerifyLabel: "Kérem, adja meg a token-t, hogy a 2FA működését ellenőrizzük", twoFAVerifyLabel: "Kérem, adja meg a token-t, hogy a 2FA működését ellenőrizzük",
tokenValidSettingsMsg: "A token érvényes! El tudja menteni a 2FA beállításait.", tokenValidSettingsMsg: "A token érvényes! El tudja menteni a 2FA beállításait.",
confirmEnableTwoFAMsg: "Biztosan engedélyezi a 2FA-t?", confirmEnableTwoFAMsg: "Biztosan engedélyezi a 2FA-t?",
@ -54,23 +54,23 @@ export default {
Delete: "Törlés", Delete: "Törlés",
Current: "Aktuális", Current: "Aktuális",
Uptime: "Uptime", Uptime: "Uptime",
"Cert Exp.": "Tanúsítvány lejár", "Cert Exp.": "SSL lejárat",
days: "napok", days: "nap",
day: "nap", day: "nap",
"-day": "-nap", "-day": " nap",
hour: "óra", hour: "óra",
"-hour": "-óra", "-hour": " óra",
Response: "Válasz", Response: "Válasz",
Ping: "Ping", Ping: "Ping",
"Monitor Type": "Figyelő típusa", "Monitor Type": "Figyelő típusa",
Keyword: "Kulcsszó", Keyword: "Kulcsszó",
"Friendly Name": "Rövid név", "Friendly Name": "Rövid név",
URL: "URL", URL: "URL",
Hostname: "Hostnév", Hostname: "Hosztnév",
Port: "Port", Port: "Port",
"Heartbeat Interval": "Heartbeat időköz", "Heartbeat Interval": "Életjel időköz",
Retries: "Újrapróbálkozás", Retries: "Újrapróbálkozás",
"Heartbeat Retry Interval": "Heartbeat újrapróbálkozások időköze", "Heartbeat Retry Interval": "Életjel újrapróbálkozások időköze",
Advanced: "Haladó", Advanced: "Haladó",
"Upside Down Mode": "Fordított mód", "Upside Down Mode": "Fordított mód",
"Max. Redirects": "Max. átirányítás", "Max. Redirects": "Max. átirányítás",
@ -82,8 +82,8 @@ export default {
Light: "Világos", Light: "Világos",
Dark: "Sötét", Dark: "Sötét",
Auto: "Auto", Auto: "Auto",
"Theme - Heartbeat Bar": "Téma - Heartbeat Bar", "Theme - Heartbeat Bar": "Téma - Életjel sáv",
Normal: "Normal", Normal: "Normál",
Bottom: "Nyomógomb", Bottom: "Nyomógomb",
None: "Nincs", None: "Nincs",
Timezone: "Időzóna", Timezone: "Időzóna",
@ -97,9 +97,9 @@ export default {
"Update Password": "Jelszó módosítása", "Update Password": "Jelszó módosítása",
"Disable Auth": "Hitelesítés tiltása", "Disable Auth": "Hitelesítés tiltása",
"Enable Auth": "Hitelesítés engedélyezése", "Enable Auth": "Hitelesítés engedélyezése",
Logout: "Kijelenetkezés", Logout: "Kijelentkezés",
Leave: "Elhagy", Leave: "Elhagy",
"I understand, please disable": "Megértettem, kérem tilsa le", "I understand, please disable": "Megértettem, kérem tiltsa le",
Confirm: "Megerősítés", Confirm: "Megerősítés",
Yes: "Igen", Yes: "Igen",
No: "Nem", No: "Nem",
@ -113,7 +113,7 @@ export default {
Email: "Email", Email: "Email",
Test: "Teszt", Test: "Teszt",
"Certificate Info": "Tanúsítvány információk", "Certificate Info": "Tanúsítvány információk",
"Resolver Server": "Resolver szerver", "Resolver Server": "DNS szerver",
"Resource Record Type": "Resource Record típusa", "Resource Record Type": "Resource Record típusa",
"Last Result": "Utolsó eredmény", "Last Result": "Utolsó eredmény",
"Create your admin account": "Hozza létre az adminisztrátor felhasználót", "Create your admin account": "Hozza létre az adminisztrátor felhasználót",
@ -129,11 +129,11 @@ export default {
Create: "Létrehozás", Create: "Létrehozás",
"Clear Data": "Adatok törlése", "Clear Data": "Adatok törlése",
Events: "Események", Events: "Események",
Heartbeats: "Heartbeats", Heartbeats: "Életjelek",
"Auto Get": "Auto Get", "Auto Get": "Auto lekérd.",
backupDescription: "Ki tudja menteni az összes figyelőt és értesítést egy JSON fájlba.", backupDescription: "Mentheti az összes figyelőt és értesítést egy JSON fájlba.",
backupDescription2: "Ui.: Történeti és esemény adatokat nem tartalmaz.", backupDescription2: "Megj: Történeti és esemény adatokat nem tartalmaz.",
backupDescription3: "Érzékeny adatok, pl. szolgáltatás kulcsok is vannak az export fájlban. Figyelmesen őrizze!", backupDescription3: "Érzékeny adatok, pl. szolgáltatás kulcsok is vannak az export fájlban. Figyeljen erre!",
alertNoFile: "Válaszzon ki egy fájlt az importáláshoz.", alertNoFile: "Válaszzon ki egy fájlt az importáláshoz.",
alertWrongFileType: "Válasszon egy JSON fájlt.", alertWrongFileType: "Válasszon egy JSON fájlt.",
"Clear all statistics": "Összes statisztika törlése", "Clear all statistics": "Összes statisztika törlése",
@ -144,17 +144,17 @@ export default {
"Verify Token": "Token ellenőrzése", "Verify Token": "Token ellenőrzése",
"Setup 2FA": "2FA beállítása", "Setup 2FA": "2FA beállítása",
"Enable 2FA": "2FA engedélyezése", "Enable 2FA": "2FA engedélyezése",
"Disable 2FA": "2FA toltása", "Disable 2FA": "2FA tiltása",
"2FA Settings": "2FA beállítások", "2FA Settings": "2FA beállítások",
"Two Factor Authentication": "Two Factor Authentication", "Two Factor Authentication": "Kétfaktoros hitelesítés",
Active: "Aktív", Active: "Aktív",
Inactive: "Inaktív", Inactive: "Inaktív",
Token: "Token", Token: "Token",
"Show URI": "URI megmutatása", "Show URI": "URI megmutatása",
Tags: "Cimkék", Tags: "Címkék",
"Add New below or Select...": "Adjon hozzá lentre vagy válasszon...", "Add New below or Select...": "Adjon hozzá lentre vagy válasszon...",
"Tag with this name already exist.": "Ilyen nevű cimke már létezik.", "Tag with this name already exist.": "Ilyen nevű címke már létezik.",
"Tag with this value already exist.": "Ilyen értékű cimke már létezik.", "Tag with this value already exist.": "Ilyen értékű címke már létezik.",
color: "szín", color: "szín",
"value (optional)": "érték (opcionális)", "value (optional)": "érték (opcionális)",
Gray: "Szürke", Gray: "Szürke",
@ -169,15 +169,15 @@ export default {
"Avg. Ping": "Átl. ping", "Avg. Ping": "Átl. ping",
"Avg. Response": "Átl. válasz", "Avg. Response": "Átl. válasz",
"Entry Page": "Nyitólap", "Entry Page": "Nyitólap",
statusPageNothing: "Semmi nincs itt, kérem, adjon hozzá egy figyelőt.", statusPageNothing: "Semmi nincs itt. Adjon hozzá egy vagy több figyelőt.",
"No Services": "Nincs szolgáltatás", "No Services": "Nincs szolgáltatás",
"All Systems Operational": "Minden rendszer működik", "All Systems Operational": "Minden rendszer működik",
"Partially Degraded Service": "Részlegesen leállt szolgáltatás", "Partially Degraded Service": "Részlegesen leállt szolgáltatás",
"Degraded Service": "Leállt szolgáltatás", "Degraded Service": "Leállt szolgáltatás",
"Add Group": "Csoport hozzáadása", "Add Group": "Csoport hozzáadása",
"Add a monitor": "Figyelő hozzáadása", "Add a monitor": "Figyelő hozzáadása",
"Edit Status Page": "Sátusz oldal szerkesztése", "Edit Status Page": "Státusz oldal szerkesztése",
"Go to Dashboard": "Menj az irányítópulthoz", "Go to Dashboard": "Irányítópulthoz",
telegram: "Telegram", telegram: "Telegram",
webhook: "Webhook", webhook: "Webhook",
smtp: "Email (SMTP)", smtp: "Email (SMTP)",
@ -192,9 +192,162 @@ export default {
octopush: "Octopush", octopush: "Octopush",
promosms: "PromoSMS", promosms: "PromoSMS",
lunasea: "LunaSea", lunasea: "LunaSea",
apprise: "Apprise (Support 50+ Notification services)", apprise: "Apprise (50+ értesítési szolgáltatás)",
pushbullet: "Pushbullet", pushbullet: "Pushbullet",
line: "Line Messenger", line: "Line Messenger",
mattermost: "Mattermost", mattermost: "Mattermost",
"Status Page": "Status Page", "Status Page": "Státusz oldal",
"Primary Base URL": "Elsődleges URL",
"Push URL": "Meghívandó URL",
needPushEvery: "Ezt az URL-t kell meghívni minden {0} másodpercben.",
pushOptionalParams: "Opcionális paraméterek: {0}",
defaultNotificationName: "{notification} értesítésem ({number})",
here: "itt",
Required: "Kötelező",
"Bot Token": "BOT token",
wayToGetTelegramToken: "Innen kaphat token-t: {0}.",
"Chat ID": "Csevegés ID",
supportTelegramChatID: "Támogatja a közvetlen csevegést, csoportnak küldést és csatona ID-t is",
wayToGetTelegramChatID: "A csevegés ID-t kinyerheti azzal, hogy küld egy üzenetet a bot-nak és erre az URL-re ellátogat, ahol láthatja a chat_id:-t",
"YOUR BOT TOKEN HERE": "AZ ÖN BOT TOKENJE ITT",
chatIDNotFound: "Csevegés ID nem található, küldjön egy első üzenetet a bot-nak",
"Post URL": "Cél URL (Post)",
"Content Type": "Tartalom típus (Content Type)",
webhookJsonDesc: "{0} ideális a moderh HTTP szerverekhez, mint az Express.js",
webhookFormDataDesc: "{multipart} ideális a PHP-hez. A JSON értelmezhető ezzel: {decodeFunction}",
secureOptionNone: "Nincs / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "TLS hiba figyelmen kívül hagyása",
"From Email": "Feladó email",
emailCustomSubject: "Egyedi tárgy",
"To Email": "Cél email",
smtpCC: "Másolat",
smtpBCC: "Titkos másolat",
"Discord Webhook URL": "Discord cím (webhook URL)",
wayToGetDiscordURL: "Kaphat egy ilyet, ha ellátogat a Server Settings -> Integrations -> Create Webhook oldalra",
"Bot Display Name": "Bot megjelenő neve",
"Prefix Custom Message": "Egyedi előtét üzenet",
"Hello @everyone is...": "Hello {'@'}mindenki...",
"Webhook URL": "Cím (webhook URL)",
wayToGetTeamsURL: "Itt megnézheti, hogy kell ilyen URL-t készíteni: {0}.",
Number: "Szám",
Recipients: "Címzettek",
needSignalAPI: "Egy Signal kliensre van szüksége, amihez REST API tartozik.",
wayToCheckSignalURL: "Itt megnézheti, hogy hozhat létre egyet:",
signalImportant: "FONTOS! Nem keverheti a csoportokat és számokat a címzetteknél.",
"Application Token": "Alkalmazás token",
"Server URL": "Szerver URL",
Priority: "Prioritás",
"Icon Emoji": "Emoji ikonok",
"Channel Name": "Csatorna neve",
"Uptime Kuma URL": "Uptime Kuma cím",
aboutWebhooks: "Webhook-okról több info: {0}",
aboutChannelName: "Adja meg a {0} csatorna nevét ha szeretné elkerülni a webhook-ot. Pl: #masik-csatorna",
aboutKumaURL: "Ha üresen hagyja a Uptime Kuma cím mezőt, akkor a projekt GitHub oldala lesz az alapértelmezett.",
emojiCheatSheet: "Emoji csalás: {0}",
clicksendsms: "ClickSend SMS",
"User Key": "Felhasználói kulcs",
Device: "Eszköz",
"Message Title": "Üzenet címe",
"Notification Sound": "Értesítési hang",
"More info on:": "További információ: {0}",
pushoverDesc1: "A vészhelyzeti prioritásnak (2) 30 másodperc az újrapróbálkozási alapértéke és egy óra után lejár.",
pushoverDesc2: "Ha különböző eszközökre szeretne értesítést küldeni, töltse ki az Eszköz mezőt.",
"SMS Type": "SMS típusa",
octopushTypePremium: "Premium (Fast - recommended for alerting)",
octopushTypeLowCost: "Low Cost (Slow - sometimes blocked by operator)",
checkPrice: "Nézze meg az {0} féle árat:",
apiCredentials: "API kulcsok",
octopushLegacyHint: "Az Octopush régi (2011-2020) verzióját használja vagy az újat?",
"Check octopush prices": "Nézze meg az Octopush {0} féle árát.",
octopushPhoneNumber: "Telefonszám (nemz. formátum, pl : +36705554433) ",
octopushSMSSender: "SMS küldő neve : 3-11 betű/szám (a-zA-Z0-9) vagy szóköz",
"LunaSea Device ID": "LunaSea eszköz ID",
"Apprise URL": "Apprise cím (URL)",
"Example:": "Például: {0}",
"Read more:": "Itt olvashat róla: {0}",
"Status:": "Állapot: {0}",
"Read more": "Tovább olvasom",
appriseInstalled: "Apprise telepítve.",
appriseNotInstalled: "Apprise nincs telepítve. {0}",
"Access Token": "Elérési token",
"Channel access token": "Csatorna elérési token",
"Line Developers Console": "Line Developers konzol",
lineDevConsoleTo: "Line Developers konzol - {0}",
"Basic Settings": "Alap beállítások",
"User ID": "Felhasználó ID",
"Messaging API": "Üzenet API",
wayToGetLineChannelToken: "{0} első eléréséhez készítsen egy Provider-t és csatornát (Messaging API), utána kaphatja meg a csatorna elérési token-t és felhasználó ID-t az alábbi menüpontban.",
"Icon URL": "Ikon cím (URL)",
aboutIconURL: "Megadhat egy webcímet az Ikon cím mezőben, ezzel felülírva az alapértelmezet képet. Nem kerül felhasználásra, ha az Emoji-k be vannak állítva.",
aboutMattermostChannelName: "Felülírhatja az alapértelmezett csatornát, ahova a webhook az adatokat küldi. Ehhez töltse ki a \"Csatorna neve\" mezőt (pl: #egyeb-csatorna). A Mattermost webhook beállításaiban további engedélyek szükségesek",
matrix: "Matrix",
promosmsTypeEco: "SMS ECO - olcsó, de lassú, gyakran túlterhelt. Csak lengyel címzettekhez.",
promosmsTypeFlash: "SMS FLASH - Az üzenet automatikusan megjelenik a fogadó eszközön. Csak lengyel címzettekhez.",
promosmsTypeFull: "SMS FULL - Prémium szintje az SMS-nek. Megadható a feladó neve, de előtte jóváhagyás szükséges. Ideális értesítésekhez.",
promosmsTypeSpeed: "SMS SPEED - A legmagasabb prioritás a rendszerben. Nagyon gyors és pontos, de költséges (kb. duplája a hagyományos SMS-nek).",
promosmsPhoneNumber: "Telefonszám (lengyel címzett esetén az országkód elhagyható)",
promosmsSMSSender: "SMS feladónév: Előre beállított név vagy az alábbiak egyike: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
"Feishu WebHookUrl": "Feishu webhook cím (URL)",
matrixHomeserverURL: "Homeserver cím (URL http(s):// előtaggal és opcionálisan port-tal)",
"Internal Room Id": "Belső Szoba ID",
matrixDesc1: "A belső szoba ID-t a szpbák speciális beállítások között találja meg a Matrix kliens programban. Így kell kinéznie: !QMdRCpUIfLwsfjxye6:home.server.",
matrixDesc2: "Erősen ajánlott készíteni egy új felhasználót és nem a teljes joggal rendelkező felhasználót használni. Az új felhasználó létrehozása után csak azokba a szobákba kell megjhívni a felhasználót, ahol értesítéseket szeretne kapni. Ezzel a művelettel lehet elérési token-t kérni: {0}",
Method: "Metódus",
Body: "Törzs",
Headers: "Fejlécek",
PushUrl: "Push cím (URL)",
HeadersInvalidFormat: "A kérés fejléc nem egy valós JSON: ",
BodyInvalidFormat: "A kérés törzse nem egy valós JSON: ",
"Monitor History": "Vizsgálatok előzményei",
clearDataOlderThan: "Előzmények megtartása {0} napig.",
PasswordsDoNotMatch: "Jelszó nem egyezik.",
records: "sorok",
"One record": "Egy sor",
steamApiKeyDescription: "Steam Game Server ellenőrzéséhez szükséges egy Steam Web-API kulcs. Itt létrehozhat egy API kulcsot: ",
"Current User": "Felhasználó",
recent: "Legújabb",
Done: "Kész",
Info: "Infó",
Security: "Biztonság",
"Steam API Key": "Steam API kulcs",
"Shrink Database": "Adatbázis tömörítése",
"Pick a RR-Type...": "Válasszon egy RR-típust...",
"Pick Accepted Status Codes...": "Válasszon olyan kódot, ami elfogadottnak számít...",
Default: "Alapért.",
"HTTP Options": "HTTP beállítások",
"Create Incident": "Incidens létrehozása",
Title: "Cím",
Content: "Tartalom",
Style: "Stílus",
info: "info",
warning: "warning",
danger: "danger",
primary: "primary",
light: "light",
dark: "dark",
Post: "Bejegyzés",
"Please input title and content": "Adjon meg címet és tartalmat",
Created: "Létrehozva",
"Last Updated": "Utolsó mód.",
Unpin: "Leválaszt",
"Switch to Light Theme": "Világos témára váltás",
"Switch to Dark Theme": "Sötét témára váltás",
"Show Tags": "Címkék mutatása",
"Hide Tags": "Címkék elrejtése",
Description: "Leírás",
"No monitors available.": "Nincs még figyelő beállítva.",
"Add one": "Adjon hozzá egyet",
"No Monitors": "Nincs figyelő",
"Untitled Group": "Névtelen csoport",
Services: "Szolgáltatások",
Discard: "Elvet",
Cancel: "Mégsem",
"Powered by": "A megoldást szállítja az",
shrinkDatabaseDescription: "VACUUM futtatása az SQLite-on. Ha az adatbázisod 1.10.0-nál újabb, akkor az AUTO_VACUUM engedélyezve van, nincs szükség a műveletre.",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "API felhasználónév (webapi_ előtaggal együtt)",
serwersmsAPIPassword: "API jelszó",
serwersmsPhoneNumber: "Telefonszám",
serwersmsSenderName: "SMS feladó neve (regisztrált név az oldalon)",
}; };

View file

@ -166,7 +166,7 @@ export default {
Orange: "Arancione", Orange: "Arancione",
Green: "Verde", Green: "Verde",
Blue: "Blu", Blue: "Blu",
Indigo: "Indigo", Indigo: "Indaco",
Purple: "Viola", Purple: "Viola",
Pink: "Rosa", Pink: "Rosa",
"Search...": "Cerca...", "Search...": "Cerca...",
@ -295,9 +295,9 @@ export default {
matrixDesc2: "È altamente raccomandata la creazione di un nuovo utente e di non utilizare il proprio token di accesso Matrix poiché darà pieno controllo al proprio account e a tutte le stanze in cui si ha accesso. Piuttosto, si crei un nuovo utente per invitarlo nella stanza dove si vuole ricevere le notifiche. Si può accedere al token eseguendo {0}", matrixDesc2: "È altamente raccomandata la creazione di un nuovo utente e di non utilizare il proprio token di accesso Matrix poiché darà pieno controllo al proprio account e a tutte le stanze in cui si ha accesso. Piuttosto, si crei un nuovo utente per invitarlo nella stanza dove si vuole ricevere le notifiche. Si può accedere al token eseguendo {0}",
Method: "Metodo", Method: "Metodo",
Body: "Corpo", Body: "Corpo",
Headers: "Headers", Headers: "Intestazioni",
PushUrl: "URL di Push", PushUrl: "URL di Push",
HeadersInvalidFormat: "L'header di richiesta non è un JSON valido: ", HeadersInvalidFormat: "L'intestazione di richiesta non è un JSON valido: ",
BodyInvalidFormat: "Il corpo di richiesta non è un JSON valido: ", BodyInvalidFormat: "Il corpo di richiesta non è un JSON valido: ",
"Monitor History": "Storico monitoraggio", "Monitor History": "Storico monitoraggio",
clearDataOlderThan: "Mantieni lo storico per {0} giorni.", clearDataOlderThan: "Mantieni lo storico per {0} giorni.",
@ -307,5 +307,48 @@ export default {
steamApiKeyDescription: "Per monitorare un server di gioco Steam si necessita della chiave Web-API di Steam. È possibile registrare la propria chiave API qui: ", steamApiKeyDescription: "Per monitorare un server di gioco Steam si necessita della chiave Web-API di Steam. È possibile registrare la propria chiave API qui: ",
"Current User": "Utente corrente", "Current User": "Utente corrente",
recent: "Recenti", recent: "Recenti",
Done: "Fatto",
Info: "Info",
Security: "Sicurezza",
"Steam API Key": "Chiave API di Steam",
"Shrink Database": "Comprimi Database",
"Pick a RR-Type...": "Scegli un tipo di RR...",
"Pick Accepted Status Codes...": "Scegli i codici di Stato Accettati...",
Default: "Predefinito",
"HTTP Options": "Opzioni HTTP",
"Create Incident": "Crea Incident",
Title: "Titolo",
Content: "Contenuto",
Style: "Stile",
info: "informativo",
warning: "attenzione",
danger: "critico",
primary: "primario",
light: "chiaro",
dark: "scuro",
Post: "Posta",
"Please input title and content": "Inserire il titolo e il contenuto",
Created: "Creato",
"Last Updated": "Ultima modifica",
Unpin: "Stacca",
"Switch to Light Theme": "Utilizza tema chiaro",
"Switch to Dark Theme": "Utilizza tema scuro",
"Show Tags": "Mostra etichette",
"Hide Tags": "Nascondi etichette",
Description: "Descrizione",
"No monitors available.": "Nessun monitoraggio disponibile.",
"Add one": "Aggiungi",
"No Monitors": "Nessun monitoraggio",
"Add one": "Aggiungi",
"Untitled Group": "Gruppo senza titolo",
Services: "Servizi",
Discard: "Scarta",
Cancel: "Annulla",
"Powered by": "Servito da",
shrinkDatabaseDescription: "Lancia il comando VACUUM sul database SQLite. Se il database è stato creato dopo la versione 1.10.0, AUTO_VACUUM è già abilitato e questa azione non è necessaria.", shrinkDatabaseDescription: "Lancia il comando VACUUM sul database SQLite. Se il database è stato creato dopo la versione 1.10.0, AUTO_VACUUM è già abilitato e questa azione non è necessaria.",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "Nome utente API (incl. prefisso webapi_)",
serwersmsAPIPassword: "Password API",
serwersmsPhoneNumber: "Numero di Telefono",
serwersmsSenderName: "Nome del mittente SMS (registrato via portale cliente)",
}; };

View file

@ -307,4 +307,9 @@ export default {
recent: "Ostatnie", recent: "Ostatnie",
clicksendsms: "ClickSend SMS", clicksendsms: "ClickSend SMS",
apiCredentials: "Poświadczenia API", apiCredentials: "Poświadczenia API",
serwersms: "SerwerSMS.pl",
serwersmsAPIUser: "Nazwa użytkownika API (z prefiksem webapi_)",
serwersmsAPIPassword: "Hasło API",
serwersmsPhoneNumber: "Numer telefonu",
serwersmsSenderName: "Nazwa nadawcy (zatwierdzona w panelu klienta)",
}; };

View file

@ -12,6 +12,7 @@ import mobile from "./mixins/mobile";
import publicMixin from "./mixins/public"; import publicMixin from "./mixins/public";
import socket from "./mixins/socket"; import socket from "./mixins/socket";
import theme from "./mixins/theme"; import theme from "./mixins/theme";
import lang from "./mixins/lang";
import { router } from "./router"; import { router } from "./router";
import { appName } from "./util.ts"; import { appName } from "./util.ts";
@ -22,6 +23,7 @@ const app = createApp({
mobile, mobile,
datetime, datetime,
publicMixin, publicMixin,
lang,
], ],
data() { data() {
return { return {

33
src/mixins/lang.js Normal file
View file

@ -0,0 +1,33 @@
import { currentLocale } from "../i18n";
import { setPageLocale } from "../util-frontend";
const langModules = import.meta.glob("../languages/*.js");
export default {
data() {
return {
language: currentLocale(),
};
},
async created() {
if (this.language !== "en") {
await this.changeLang(this.language);
}
},
watch: {
async language(lang) {
await this.changeLang(lang);
},
},
methods: {
async changeLang(lang) {
let message = (await langModules["../languages/" + lang + ".js"]()).default;
this.$i18n.setLocaleMessage(lang, message);
this.$i18n.locale = lang;
localStorage.locale = lang;
setPageLocale();
}
}
};

View file

@ -103,7 +103,7 @@
:close-on-select="true" :close-on-select="true"
:clear-on-select="false" :clear-on-select="false"
:preserve-search="false" :preserve-search="false"
placeholder="Pick a RR-Type..." :placeholder="$t('Pick a RR-Type...')"
:preselect-first="false" :preselect-first="false"
:max-height="500" :max-height="500"
:taggable="false" :taggable="false"
@ -177,7 +177,7 @@
:close-on-select="false" :close-on-select="false"
:clear-on-select="false" :clear-on-select="false"
:preserve-search="true" :preserve-search="true"
placeholder="Pick Accepted Status Codes..." :placeholder="$t('Pick Accepted Status Codes...')"
:preselect-first="false" :preselect-first="false"
:max-height="600" :max-height="600"
:taggable="true" :taggable="true"
@ -215,7 +215,7 @@
<a href="#" @click="$refs.notificationDialog.show(notification.id)">{{ $t("Edit") }}</a> <a href="#" @click="$refs.notificationDialog.show(notification.id)">{{ $t("Edit") }}</a>
</label> </label>
<span v-if="notification.isDefault == true" class="badge bg-primary ms-2">Default</span> <span v-if="notification.isDefault == true" class="badge bg-primary ms-2">{{ $t("Default") }}</span>
</div> </div>
<button class="btn btn-primary me-2" type="button" @click="$refs.notificationDialog.show()"> <button class="btn btn-primary me-2" type="button" @click="$refs.notificationDialog.show()">
@ -353,17 +353,17 @@ export default {
}, },
bodyPlaceholder() { bodyPlaceholder() {
return `Example: return this.$t("Example:", [`
{ {
"key": "value" "key": "value"
}`; }`]);
}, },
headersPlaceholder() { headersPlaceholder() {
return `Example: return this.$t("Example:", [`
{ {
"HeaderName": "HeaderValue" "HeaderName": "HeaderValue"
}`; }`]);
} }
}, },

View file

@ -44,8 +44,20 @@ export default {
settings: {}, settings: {},
settingsLoaded: false, settingsLoaded: false,
};
},
subMenus: { computed: {
currentPage() {
let pathEnd = useRoute().path.split("/").at(-1);
if (pathEnd == "settings" || pathEnd == null) {
return "general";
}
return pathEnd;
},
subMenus() {
return {
general: { general: {
title: this.$t("General"), title: this.$t("General"),
}, },
@ -67,17 +79,7 @@ export default {
about: { about: {
title: this.$t("About"), title: this.$t("About"),
}, },
}, };
};
},
computed: {
currentPage() {
let pathEnd = useRoute().path.split("/").at(-1);
if (pathEnd == "settings" || pathEnd == null) {
return "general";
}
return pathEnd;
}, },
}, },

View file

@ -101,9 +101,9 @@
<!-- Incident Date --> <!-- Incident Date -->
<div class="date mt-3"> <div class="date mt-3">
Created: {{ $root.datetime(incident.createdDate) }} ({{ dateFromNow(incident.createdDate) }})<br /> {{ $t("Created") }}: {{ $root.datetime(incident.createdDate) }} ({{ dateFromNow(incident.createdDate) }})<br />
<span v-if="incident.lastUpdatedDate"> <span v-if="incident.lastUpdatedDate">
Last Updated: {{ $root.datetime(incident.lastUpdatedDate) }} ({{ dateFromNow(incident.lastUpdatedDate) }}) {{ $t("Last Updated") }}: {{ $root.datetime(incident.lastUpdatedDate) }} ({{ dateFromNow(incident.lastUpdatedDate) }})
</span> </span>
</div> </div>
@ -125,15 +125,15 @@
<div v-if="editIncidentMode" class="dropdown d-inline-block me-2"> <div v-if="editIncidentMode" class="dropdown d-inline-block me-2">
<button id="dropdownMenuButton1" class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false"> <button id="dropdownMenuButton1" class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
Style: {{ incident.style }} {{ $t("Style") }}: {{ $t(incident.style) }}
</button> </button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1"> <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1">
<li><a class="dropdown-item" href="#" @click="incident.style = 'info'">info</a></li> <li><a class="dropdown-item" href="#" @click="incident.style = 'info'">{{ $t("info") }}</a></li>
<li><a class="dropdown-item" href="#" @click="incident.style = 'warning'">warning</a></li> <li><a class="dropdown-item" href="#" @click="incident.style = 'warning'">{{ $t("warning") }}</a></li>
<li><a class="dropdown-item" href="#" @click="incident.style = 'danger'">danger</a></li> <li><a class="dropdown-item" href="#" @click="incident.style = 'danger'">{{ $t("danger") }}</a></li>
<li><a class="dropdown-item" href="#" @click="incident.style = 'primary'">primary</a></li> <li><a class="dropdown-item" href="#" @click="incident.style = 'primary'">{{ $t("primary") }}</a></li>
<li><a class="dropdown-item" href="#" @click="incident.style = 'light'">light</a></li> <li><a class="dropdown-item" href="#" @click="incident.style = 'light'">{{ $t("light") }}</a></li>
<li><a class="dropdown-item" href="#" @click="incident.style = 'dark'">dark</a></li> <li><a class="dropdown-item" href="#" @click="incident.style = 'dark'">{{ $t("dark") }}</a></li>
</ul> </ul>
</div> </div>
@ -468,10 +468,10 @@ export default {
}, },
addGroup() { addGroup() {
let groupName = "Untitled Group"; let groupName = this.$t("Untitled Group");
if (this.$root.publicGroupList.length === 0) { if (this.$root.publicGroupList.length === 0) {
groupName = "Services"; groupName = this.$t("Services");
} }
this.$root.publicGroupList.unshift({ this.$root.publicGroupList.unshift({
@ -536,7 +536,7 @@ export default {
postIncident() { postIncident() {
if (this.incident.title == "" || this.incident.content == "") { if (this.incident.title == "" || this.incident.content == "") {
toast.error("Please input title and content."); toast.error(this.$t("Please input title and content"));
return; return;
} }

View file

@ -83,6 +83,7 @@ describe("Init", () => {
}); });
// Settings Page // Settings Page
/*
describe("Settings", () => { describe("Settings", () => {
beforeEach(async () => { beforeEach(async () => {
await page.goto(baseURL + "/settings"); await page.goto(baseURL + "/settings");
@ -261,6 +262,7 @@ describe("Init", () => {
// }, { timeout: 3000 }); // }, { timeout: 3000 });
// }); // });
}); });
*/
/* /*
* TODO * TODO