Compare commits

...
115 Commits
Author SHA1 Message Date
Alexander Holliday c8d3e3b70c Merge pull request #2921 from bluewave-labs/develop
develop -> master
2025-09-04 15:46:30 -07:00
Alexander Holliday cb57ff5cc2 Merge pull request #2920 from bluewave-labs/fix/arm
fix/arm
2025-09-04 15:44:44 -07:00
Alex Holliday 72f070fbcb fix multiarch build 2025-09-04 15:15:09 -07:00
Alex Holliday fb0a86d37c update docker compoes and docker file 2025-09-04 13:39:53 -07:00
Alexander Holliday 36402dfefa Merge pull request #2870 from bluewave-labs/feat/add-team-member
Add direct user registration for team management
2025-09-03 09:58:35 -07:00
karenvicent c61874dbdd fix format error 2025-09-03 12:34:35 -04:00
Alex Holliday 20848f28d5 package 2025-09-03 09:21:24 -07:00
Alexander Holliday 5d23966f00 Merge pull request #2919 from bluewave-labs/fix/format-action
update format action, no need for ci
2025-09-03 09:20:43 -07:00
Alex Holliday 294cc66e4a update format action, no need for ci 2025-09-03 09:20:15 -07:00
Alex Holliday 0fd2e7032a update package-lock 2025-09-03 09:17:19 -07:00
Alex Holliday 340b85043e Merge branch 'feat/add-team-member' of github.com:bluewave-labs/checkmate into feat/add-team-member 2025-09-03 09:15:22 -07:00
Alex Holliday 1821ae3c2b add root gitignore 2025-09-03 09:14:30 -07:00
karenvicent c536cb2afa run format 2025-09-03 10:18:09 -04:00
karenvicent 3f79b4c2f6 Merge branch 'develop' into feat/add-team-member 2025-09-03 09:56:31 -04:00
karenvicent 137ba9185e fix details 2025-09-03 09:55:53 -04:00
Alexander Holliday 2f6a0913dc Merge pull request #2917 from bluewave-labs/fix/bump-scheduler
bump scheduler
2025-09-02 10:35:09 -07:00
Alex Holliday 2c7336d440 bump scheduler 2025-09-02 10:34:33 -07:00
Gorkem Cetin (BWL) 5a022ff3f6 Create .coderabbit.yml so it doesnt add summary to the PR 2025-09-01 19:33:33 -04:00
Alexander Holliday fe4855500e Merge pull request #2896 from PaiJi/feat/update-i18n-scripts
feat(i18n): add zh-CN
2025-09-01 10:46:21 -07:00
Alexander Holliday ce8f5cbe0c Merge pull request #2878 from antonstrover/fix/failed-prop-type-status
Fixed Bar component
2025-09-01 10:43:43 -07:00
Alexander Holliday 7a90a6f9f4 Merge pull request #2915 from bluewave-labs/develop
develop->master
2025-09-01 10:33:09 -07:00
Alexander Holliday b6bebe33fe Merge branch 'master' into develop 2025-09-01 10:32:59 -07:00
Alexander Holliday 9cf8072c1e Merge pull request #2914 from bluewave-labs/fix/bump-multiarch-node
Fix/bump multiarch node
2025-09-01 10:30:51 -07:00
Alex Holliday 0ca00ca6a1 esbuild 2025-09-01 10:28:41 -07:00
Alex Holliday 619c5242db bump versions 2025-09-01 10:14:57 -07:00
Alexander Holliday ff07854590 Merge pull request #2913 from bluewave-labs/revert-2910-fix/alpine-to-slim
Revert "pin dependency"
2025-09-01 09:27:03 -07:00
Alexander Holliday ba99989c66 Revert "pin dependency" 2025-09-01 09:26:51 -07:00
Alexander Holliday 3c75933cf2 Merge pull request #2912 from bluewave-labs/revert-2911-develop
Revert "develop->master"
2025-09-01 09:26:35 -07:00
Alexander Holliday ea9ef7afd3 Revert "develop->master" 2025-09-01 09:26:23 -07:00
Alexander Holliday f5e633a781 Merge pull request #2911 from bluewave-labs/develop
develop->master
2025-09-01 09:23:01 -07:00
Alexander Holliday 90b94816dd Merge pull request #2910 from bluewave-labs/fix/alpine-to-slim
pin dependency
2025-09-01 09:22:26 -07:00
Alex Holliday 11dcaef3ff pin 2025-09-01 09:21:56 -07:00
Alex Holliday 3f3e7f71ec pin dependency 2025-09-01 09:21:11 -07:00
Alexander Holliday b6070572cf Merge pull request #2909 from bluewave-labs/develop
develop->master
2025-09-01 09:15:48 -07:00
Alexander Holliday e818a02a2a Merge pull request #2908 from bluewave-labs/fix/alpine-to-slim
fix build
2025-09-01 09:15:17 -07:00
Alex Holliday d8c8e222c8 fix build 2025-09-01 09:14:35 -07:00
Alexander Holliday f12b9715bc Merge pull request #2907 from bluewave-labs/develop
develop -> master
2025-09-01 09:07:57 -07:00
Alexander Holliday 31c65d3e0b Merge pull request #2906 from bluewave-labs/fix/alpine-to-slim
add omit optional flag
2025-09-01 09:07:21 -07:00
Alex Holliday fcd6741cf9 add omit optional flag 2025-09-01 09:06:42 -07:00
Alexander Holliday d663b9230f Merge pull request #2905 from bluewave-labs/develop
Develop -> Master
2025-09-01 09:00:25 -07:00
Alexander Holliday 5f2d61ad7a Merge pull request #2904 from bluewave-labs/fix/alpine-to-slim
remove alpine fix
2025-09-01 08:58:42 -07:00
Alex Holliday ec80a2dc0b remove alpine fix 2025-09-01 08:57:55 -07:00
Alexander Holliday 2cece3de59 Merge pull request #2902 from bluewave-labs/develop
develop -> master
2025-09-01 08:54:38 -07:00
Alexander Holliday 79eb580802 Merge pull request #2901 from bluewave-labs/fix/alpine-to-slim
alpine -> slim
2025-09-01 08:54:10 -07:00
Alex Holliday b93e3327a7 alpine -> slim 2025-09-01 08:53:03 -07:00
anton.strover f01030a47a move width out of sx object 2025-09-01 11:44:10 +01:00
JiPai 3cbd907c09 feat(i18n): add zh-CN 2025-09-01 04:53:24 +08:00
karenvicent 8fae69b7a4 Merge branch 'develop' into feat/add-team-member 2025-08-31 10:19:01 -04:00
karenvicent e45dd4240e fix errors 2025-08-31 10:18:15 -04:00
Alexander Holliday 16a8552e6c Merge pull request #2890 from bluewave-labs/develop
develop->master
2025-08-30 19:31:37 -07:00
Alexander Holliday c953ec6152 Merge pull request #2889 from bluewave-labs/fix/package-lock
regenerate package-lock
2025-08-30 19:31:02 -07:00
Alex Holliday a433f10240 regenerate package-lock 2025-08-30 19:30:24 -07:00
Alexander Holliday b73b97b5e9 Merge pull request #2887 from bluewave-labs/feat/add-maintenance-window-description
Update maintenance window description
2025-08-30 19:01:45 -07:00
gorkem-bwl 0607e0b228 refactor: simplify maintenance window description per feedback
- Remove redundant words 'active' and 'completely'
- Remove technical details about specific check types
- Keep the description concise while maintaining clarity
- Maintain all key information about maintenance behavior
2025-08-30 21:57:17 -04:00
gorkem-bwl 3bd4f67ec7 docs: add comprehensive maintenance window behavior description
- Update maintenance window description to clearly explain what happens during maintenance
- Clarify that ALL monitoring types are suspended (pings, HTTP, port checks, etc.)
- Explain that no notifications or alerts will be triggered
- Describe status page behavior (maintenance indicator shown)
- Note that monitoring resumes automatically when maintenance ends
- Clarify that maintenance periods don't affect uptime calculations
- Provide users with complete understanding of maintenance window impact
2025-08-30 21:31:44 -04:00
Alexander Holliday 845d5a5d51 Merge pull request #2885 from bluewave-labs/develop
develop->master
2025-08-30 16:23:40 -07:00
Alexander Holliday 0101da731f Merge pull request #2884 from bluewave-labs/fix/bump-version
bump version
2025-08-30 16:23:03 -07:00
Alex Holliday 68592acd39 bump version 2025-08-30 16:22:16 -07:00
Alexander Holliday b86fc5edb3 Merge pull request #2883 from bluewave-labs/develop
develop -> master
2025-08-30 16:21:19 -07:00
Alexander Holliday 32b54ddf11 Merge pull request #2882 from bluewave-labs/feat/migration
add migration for statusWindowThreshold
2025-08-30 16:20:23 -07:00
Alex Holliday f8a0741e6c <= -> < 2025-08-30 16:19:17 -07:00
Alex Holliday 652d231771 add migration for statusWindowThreshold 2025-08-30 16:07:03 -07:00
Alexander Holliday 1c3c5f4fec Merge pull request #2881 from bluewave-labs/fix/queue
fix: queue
2025-08-30 11:30:38 -07:00
Alex Holliday e7006a4a44 fix default value 2025-08-30 11:28:54 -07:00
Alex Holliday 0f81d54f25 remove success toast 2025-08-30 11:18:05 -07:00
Alex Holliday f3121c24c6 add interval to queue table 2025-08-30 11:17:34 -07:00
Alex Holliday 7abd0f2cd4 add root level gitignore 2025-08-30 11:13:53 -07:00
Alex Holliday 46b342005a update monitor interval and data 2025-08-30 11:11:58 -07:00
Alex Holliday 4e0349bd58 bump queue 2025-08-30 11:11:19 -07:00
Alexander Holliday 30a569233b Merge pull request #2873 from bluewave-labs/feat/docker-container-name-monitoring
feat: Enable Docker container monitoring by name in addition to ID
2025-08-29 09:33:45 -07:00
Alex Holliday 44ba6b4d0f early returns 2025-08-29 09:22:02 -07:00
Alexander Holliday 9065070eb2 Merge pull request #2871 from bluewave-labs/feat/incident-tooltip
feat:incident tooltip
2025-08-29 09:07:35 -07:00
anton.strover fd951bfdd5 Fixed Bar component
Moved width prop from direct prop to sx prop, updated PropTypes to accept string|object.
2025-08-29 11:24:57 +01:00
gorkem-bwl ba757b9aa4 style: fix prettier formatting in validation.js 2025-08-29 00:58:03 -04:00
gorkem-bwlandClaude c445463c0c refactor: improve Docker container matching with deterministic priority-based logic
Address code review feedback to eliminate ambiguity issues and improve reliability:

**Backend Improvements:**
- Implement priority-based matching: exact ID → exact name → partial ID
- Add input normalization (strip leading slashes, case-insensitive)
- Add ambiguity detection with warning logs for debugging
- Maintain full backwards compatibility with existing monitors

**Frontend Improvements:**
- Update validation regex to support leading slashes (/container-name)
- Improve error message clarity for user guidance

**Resolves Ambiguity Issues:**
- Container name "abc" vs Container ID "abc123..." now deterministic
- Multiple containers with similar names handled predictably
- Case-insensitive matching for better user experience

**Priority Order:**
1. Exact full ID match (64-char) - highest priority
2. Exact container name match - case-insensitive
3. Partial ID match - backwards compatibility fallback

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-29 00:53:40 -04:00
gorkem-bwlandClaude 4693177e4b feat: add Docker container monitoring by name
- Update Docker monitoring to support both container names and IDs
- Maintain backward compatibility with existing container ID monitoring
- Add logic to find containers by name (with or without "/" prefix)
- Update frontend UI labels and placeholders to reflect name/ID support
- Update instructions to clarify both name and ID are supported

Resolves user request: "It would be great if we could monitor docker containers by name and not just ID - given that the ID changes when containers are taken down for any reason"

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-29 00:27:01 -04:00
Alex Holliday 30b135eba3 add tooltip to incident table 2025-08-28 12:21:34 -07:00
Alex Holliday bda48e07f1 add optional tooltip 2025-08-28 12:21:23 -07:00
karenvicent 7c8ab64e34 fix sucess toast msg 2025-08-28 13:38:05 -04:00
karenvicent ec7855bd02 Merge branch 'develop' into feat/add-team-member 2025-08-28 13:21:20 -04:00
karenvicent d401eefd6b Add direct user registration 2025-08-28 12:58:38 -04:00
Alexander Holliday 0ad759a384 Merge pull request #2865 from bluewave-labs/fix/status-page-deletion-error
Fix status page deletion error
2025-08-27 14:49:45 -07:00
gorkem-bwl d3d20b29c3 Fix status page deletion error - missing module reference
- Fix deleteStatusPage method call to use statusPageModule
- Change this.db.deleteStatusPage to this.db.statusPageModule.deleteStatusPage
- Ensures consistency with other controller methods
- Resolves "this.db.deleteStatusPage is not a function" error

Fixes bug where status page deletion failed due to incorrect database module reference.
2025-08-27 17:47:11 -04:00
Alexander Holliday fbb570c0d5 Merge pull request #2862 from bluewave-labs/fix/advanced-matching
fix: advanced matching
2025-08-26 14:56:20 -07:00
Alex Holliday 2318082bb8 fix advanced matching 2025-08-26 14:54:24 -07:00
Alexander Holliday 05dd5f7de2 Merge pull request #2858 from bluewave-labs/develop
develop -> master
2025-08-25 15:06:19 -07:00
Alexander Holliday 841251d09e Merge pull request #2857 from bluewave-labs/fix/model-types
fix/model types
2025-08-25 15:05:41 -07:00
Alexander Holliday a4dd8f70f0 Merge branch 'develop' into fix/model-types 2025-08-25 15:05:30 -07:00
Alex Holliday 9d0d1329b6 bump version 2025-08-25 15:04:44 -07:00
Alex Holliday 7a929777b4 fix model types 2025-08-25 15:03:31 -07:00
Alexander Holliday ce3ec99c9f Merge pull request #2855 from bluewave-labs/develop
develop -> master
2025-08-25 14:38:06 -07:00
Alexander Holliday 4f7847275e Merge pull request #2854 from bluewave-labs/feat/bump-version
bump version
2025-08-25 14:37:21 -07:00
Alex Holliday 9a5ddb22b3 bump version 2025-08-25 14:37:00 -07:00
Alexander Holliday b1322cbec3 Merge pull request #2853 from bluewave-labs/fix/string-service-path
fix: string service path, resolves #2847, resolves #2848
2025-08-25 14:32:21 -07:00
Alex Holliday 637bc84136 fix string service path 2025-08-25 14:30:41 -07:00
Alexander Holliday 3147f02b6a Merge pull request #2843 from bluewave-labs/fix/notification-channel-validation
fix notification validation
2025-08-22 11:34:38 -07:00
Alex Holliday dabff74946 fix notification validation 2025-08-22 11:33:14 -07:00
Gorkem Cetin (BWL) de99577b9d Merge pull request #2838 from bluewave-labs/disabledbydefault
Fix Settings Page Select Component Value Handling for URL Visibility Option
2025-08-22 10:38:16 -04:00
Alexander Holliday 1846432601 Merge pull request #2839 from bluewave-labs/fix/docker-compose-arm
fix: update arm dist docker compose
2025-08-21 22:39:03 -07:00
Alex Holliday 6f307dc822 update arm dist docker compose 2025-08-21 22:37:59 -07:00
imjainish f43210e29e Address PR Comments - Format 2025-08-21 23:13:50 -04:00
imjainish 50b9be4eca Address PR Comments 2025-08-21 23:05:50 -04:00
imjainish 1a38222974 Fix Disabled Field in Settings 2025-08-21 22:39:41 -04:00
Alexander Holliday cb9cd0a43c Merge pull request #2829 from bluewave-labs/fix-timestamps-format
fix: add missing tooltip date format for 'recent' timeframe in charts
2025-08-21 11:39:13 -07:00
Alexander Holliday c2e2ae8dbd Merge pull request #2834 from bluewave-labs/develop
develop -> master
2025-08-21 10:13:48 -07:00
Alexander Holliday df790a92be Merge pull request #2836 from bluewave-labs/fix/bump-version
bump version
2025-08-21 10:13:13 -07:00
Alex Holliday e1f9242b34 bump version 2025-08-21 10:12:44 -07:00
Alexander Holliday 9d2a52e639 Merge pull request #2833 from bluewave-labs/translation-update-77
🌐 Updated Translations from POEditor
2025-08-21 09:25:38 -07:00
GitHub Action 5cbca9457e feat: translations updated from POEditor 2025-08-21 16:22:53 +00:00
Alexander Holliday 25c66cff43 Merge pull request #2831 from bluewave-labs/develop
develop -> master
2025-08-21 09:15:40 -07:00
karenvicent 75a2e0deee Merge branch 'develop' into fix-timestamps-format 2025-08-20 18:16:50 -04:00
karenvicent b857137f1a fix data format in uptime and infrastructure charts 2025-08-20 18:14:42 -04:00
Alexander Holliday 40141cdcb0 Merge pull request #2828 from bluewave-labs/fix/version-bump
Fix/version bump
2025-08-20 14:10:16 -07:00
Alex Holliday c5c1d6903e 3.1 2025-08-20 14:09:41 -07:00
Alex Holliday f15c8188b9 bump again 2025-08-20 14:07:30 -07:00
65 changed files with 3756 additions and 2766 deletions

No files matched your search

+1
View File
@@ -0,0 +1 @@
release_notes: false
+1 -1
View File
@@ -7,7 +7,7 @@ import { URLSearchParams } from "url";
const API_TOKEN = process.env.POEDITOR_API;
const PROJECT_ID = process.env.POEDITOR_PROJECT_ID;
const LANGUAGES = (
process.env.LANGUAGES || "ar,zh-tw,cs,en,fi,fr,de,pt-br,ru,es,tr,ja"
process.env.LANGUAGES || "ar,zh-tw,cs,en,fi,fr,de,pt-br,ru,es,tr,ja,zh-cn"
).split(",");
const EXPORT_FORMAT = process.env.EXPORT_FORMAT || "key_value_json";
+2 -2
View File
@@ -16,7 +16,7 @@ jobs:
- name: Install client dependencies
working-directory: client
run: npm ci
run: npm install
- name: Check client formatting
working-directory: client
@@ -34,7 +34,7 @@ jobs:
- name: Install server dependencies
working-directory: server
run: npm ci
run: npm install
- name: Check server formatting
working-directory: server
+1 -1
View File
@@ -7,7 +7,7 @@ on:
languages:
description: "Languages to synchronize (comma separated, e.g.: tr,en,es)"
required: false
default: "ar,zh-tw,cs,en,fi,fr,de,pt-br,ru,es,tr,ja"
default: "ar,zh-tw,cs,en,fi,fr,de,pt-br,ru,es,tr,ja,zh-cn"
format:
description: "Export format (key_value_json or json)"
required: false
+1
View File
@@ -0,0 +1 @@
.vscode
+12 -633
View File
@@ -21,7 +21,7 @@
"dayjs": "1.11.13",
"flag-icons": "7.3.2",
"html2canvas": "^1.4.1",
"i18next": "^24.2.2",
"i18next": "25.4.2",
"joi": "17.13.3",
"mui-color-input": "^6.0.0",
"react": "18.3.1",
@@ -46,9 +46,6 @@
"eslint-plugin-react-refresh": "^0.4.6",
"prettier": "^3.3.3",
"vite": "6.3.5"
},
"optionalDependencies": {
"@rollup/rollup-linux-arm64-musl": "4.41.0"
}
},
"node_modules/@ampproject/remapping": {
@@ -283,9 +280,9 @@
}
},
"node_modules/@babel/runtime": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
"integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
"version": "7.28.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz",
"integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -491,262 +488,6 @@
"integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
"license": "MIT"
},
"node_modules/@esbuild/aix-ppc64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz",
"integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==",
"cpu": [
"ppc64"
],
"license": "MIT",
"optional": true,
"os": [
"aix"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/android-arm": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz",
"integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==",
"cpu": [
"arm"
],
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/android-arm64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz",
"integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/android-x64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz",
"integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/darwin-arm64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz",
"integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/darwin-x64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz",
"integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/freebsd-arm64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz",
"integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/freebsd-x64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz",
"integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-arm": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz",
"integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==",
"cpu": [
"arm"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-arm64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz",
"integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-ia32": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz",
"integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==",
"cpu": [
"ia32"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-loong64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz",
"integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==",
"cpu": [
"loong64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-mips64el": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz",
"integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==",
"cpu": [
"mips64el"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-ppc64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz",
"integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==",
"cpu": [
"ppc64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-riscv64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz",
"integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==",
"cpu": [
"riscv64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-s390x": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz",
"integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==",
"cpu": [
"s390x"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-x64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz",
@@ -763,134 +504,6 @@
"node": ">=18"
}
},
"node_modules/@esbuild/netbsd-arm64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz",
"integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/netbsd-x64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz",
"integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/openbsd-arm64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz",
"integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/openbsd-x64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz",
"integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/sunos-x64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz",
"integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"sunos"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/win32-arm64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz",
"integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/win32-ia32": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz",
"integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==",
"cpu": [
"ia32"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/win32-x64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz",
"integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
@@ -2063,123 +1676,6 @@
}
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz",
"integrity": "sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==",
"cpu": [
"arm"
],
"license": "MIT",
"optional": true,
"os": [
"android"
]
},
"node_modules/@rollup/rollup-android-arm64": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz",
"integrity": "sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"android"
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz",
"integrity": "sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@rollup/rollup-darwin-x64": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz",
"integrity": "sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz",
"integrity": "sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"freebsd"
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz",
"integrity": "sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"freebsd"
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz",
"integrity": "sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==",
"cpu": [
"arm"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz",
"integrity": "sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==",
"cpu": [
"arm"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz",
"integrity": "sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz",
@@ -2193,71 +1689,6 @@
"linux"
]
},
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz",
"integrity": "sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==",
"cpu": [
"loong64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz",
"integrity": "sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==",
"cpu": [
"ppc64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz",
"integrity": "sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==",
"cpu": [
"riscv64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz",
"integrity": "sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==",
"cpu": [
"riscv64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz",
"integrity": "sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==",
"cpu": [
"s390x"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz",
@@ -2284,45 +1715,6 @@
"linux"
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz",
"integrity": "sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz",
"integrity": "sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==",
"cpu": [
"ia32"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz",
"integrity": "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@sideway/address": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
@@ -4342,14 +3734,15 @@
}
},
"node_modules/form-data": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
"integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
@@ -4363,20 +3756,6 @@
"dev": true,
"license": "ISC"
},
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -4690,9 +4069,9 @@
}
},
"node_modules/i18next": {
"version": "24.2.3",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-24.2.3.tgz",
"integrity": "sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A==",
"version": "25.4.2",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-25.4.2.tgz",
"integrity": "sha512-gD4T25a6ovNXsfXY1TwHXXXLnD/K2t99jyYMCSimSCBnBRJVQr5j+VAaU83RJCPzrTGhVQ6dqIga66xO2rtd5g==",
"funding": [
{
"type": "individual",
@@ -4709,7 +4088,7 @@
],
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.26.10"
"@babel/runtime": "^7.27.6"
},
"peerDependencies": {
"typescript": "^5"
+1 -4
View File
@@ -26,7 +26,7 @@
"dayjs": "1.11.13",
"flag-icons": "7.3.2",
"html2canvas": "^1.4.1",
"i18next": "^24.2.2",
"i18next": "25.4.2",
"joi": "17.13.3",
"mui-color-input": "^6.0.0",
"react": "18.3.1",
@@ -59,8 +59,5 @@
"eslint-plugin-react-refresh": "^0.4.6",
"prettier": "^3.3.3",
"vite": "6.3.5"
},
"optionalDependencies": {
"@rollup/rollup-linux-arm64-musl": "4.41.0"
}
}
@@ -22,8 +22,8 @@ const Bar = ({ width, height, backgroundColor, borderRadius, children }) => {
return (
<Box
position="relative"
width={width}
position="relative"
height={height}
backgroundColor={backgroundColor}
sx={{
@@ -36,7 +36,7 @@ const Bar = ({ width, height, backgroundColor, borderRadius, children }) => {
};
Bar.propTypes = {
width: PropTypes.string.isRequired,
width: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired,
height: PropTypes.string.isRequired,
backgroundColor: PropTypes.string.isRequired,
borderRadius: PropTypes.string,
@@ -1,5 +1,6 @@
export const tooltipDateFormatLookup = (dateRange) => {
const dateFormatLookup = {
recent: "ddd. MMMM D, YYYY, hh:mm A",
day: "ddd. MMMM D, YYYY, hh:mm A",
week: "ddd. MMMM D, YYYY, hh:mm A",
month: "ddd. MMMM D, YYYY",
+1 -1
View File
@@ -65,7 +65,7 @@ const Check = ({ text, noHighlightText, variant = "info", outlined = false }) =>
};
Check.propTypes = {
text: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired,
text: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
noHighlightText: PropTypes.string,
variant: PropTypes.oneOf(["info", "error", "success"]),
outlined: PropTypes.bool,
@@ -2,7 +2,7 @@ import { useId } from "react";
import PropTypes from "prop-types";
import { Modal, Stack, Typography } from "@mui/material";
const GenericDialog = ({ title, description, open, onClose, theme, children }) => {
const GenericDialog = ({ title, description, open, onClose, theme, children, width }) => {
const titleId = useId();
const descriptionId = useId();
const ariaDescribedBy = description?.length > 0 ? descriptionId : "";
@@ -16,6 +16,7 @@ const GenericDialog = ({ title, description, open, onClose, theme, children }) =
>
<Stack
gap={theme.spacing(2)}
width={width}
sx={{
position: "absolute",
top: "50%",
@@ -39,6 +40,7 @@ const GenericDialog = ({ title, description, open, onClose, theme, children }) =
fontSize={16}
color={theme.palette.primary.contrastText}
fontWeight={600}
marginBottom={theme.spacing(4)}
>
{title}
</Typography>
@@ -46,6 +48,7 @@ const GenericDialog = ({ title, description, open, onClose, theme, children }) =
<Typography
id={descriptionId}
color={theme.palette.primary.contrastTextTertiary}
marginBottom={theme.spacing(4)}
>
{description}
</Typography>
@@ -64,6 +67,7 @@ GenericDialog.propTypes = {
theme: PropTypes.object.isRequired,
children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])
.isRequired,
width: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.object]),
};
export { GenericDialog };
+48 -16
View File
@@ -7,6 +7,7 @@ import {
TableHead,
TableRow,
} from "@mui/material";
import Tooltip from "@mui/material/Tooltip";
import SkeletonLayout from "./skeleton";
import PropTypes from "prop-types";
import { useTheme } from "@emotion/react";
@@ -41,6 +42,7 @@ const DataTable = ({
data = [],
config = {
emptyView: "No data",
tooltipContent: null,
onRowClick: () => {},
},
}) => {
@@ -101,24 +103,54 @@ const DataTable = ({
data.map((row) => {
const key = row.id || row._id || Math.random();
return (
<TableRow
<Tooltip
key={key}
sx={config?.rowSX ?? {}}
onClick={config?.onRowClick ? () => config.onRowClick(row) : null}
followCursor
enterDelay={500}
enterNextDelay={500}
title={
typeof config.tooltipContent === "function"
? config.tooltipContent(row)
: config.tooltipContent
}
slotProps={{
tooltip: {
sx: {
background: "unset",
},
},
popper: {
modifiers: [
{
name: "offset",
options: {
offset: ({ popper }) => {
return [popper.width / 2 + 20, -popper.height / 8];
},
},
},
],
},
}}
>
{headers.map((header, index) => {
return (
<TableCell
align={index === 0 ? "left" : "center"}
key={header.id}
onClick={header.onClick ? (e) => header.onClick(e, row) : null}
sx={header.getCellSx ? header.getCellSx(row) : {}}
>
{header.render(row)}
</TableCell>
);
})}
</TableRow>
<TableRow
sx={config?.rowSX ?? {}}
onClick={config?.onRowClick ? () => config.onRowClick(row) : null}
>
{headers.map((header, index) => {
return (
<TableCell
align={index === 0 ? "left" : "center"}
key={header.id}
onClick={header.onClick ? (e) => header.onClick(e, row) : null}
sx={header.getCellSx ? header.getCellSx(row) : {}}
>
{header.render(row)}
</TableCell>
);
})}
</TableRow>
</Tooltip>
);
})
)}
+31 -12
View File
@@ -14,25 +14,25 @@ const useGetInviteToken = () => {
const clearToken = () => {
setToken(undefined);
};
const fetchToken = async (email, role) => {
const response = await networkService.requestInvitationToken({ email, role });
const token = response?.data?.data?.token;
if (typeof token === "undefined") {
throw new Error(t("inviteNoTokenFound"));
}
return token;
};
const getInviteToken = async ({ email, role }) => {
try {
const response = await networkService.requestInvitationToken({
email,
role,
});
const token = response?.data?.data?.token;
if (typeof token === "undefined") {
throw new Error(t("inviteNoTokenFound"));
}
setIsLoading(true);
const token = await fetchToken(email, role);
let inviteLink = token;
if (typeof CLIENT_HOST !== "undefined") {
inviteLink = `${CLIENT_HOST}/register/${token}`;
}
setToken(inviteLink);
return token;
} catch (error) {
setError(error);
} finally {
@@ -40,7 +40,26 @@ const useGetInviteToken = () => {
}
};
return [getInviteToken, clearToken, isLoading, error, token];
const addTeamMember = async (formData, role) => {
try {
setIsLoading(true);
const token = await fetchToken(formData.email, role);
const toSubmit = {
...formData,
inviteToken: token,
};
delete toSubmit.confirm;
const responseRegister = await networkService.registerUser(toSubmit);
return responseRegister;
} catch (error) {
setError(error);
throw error;
} finally {
setIsLoading(false);
}
};
return [getInviteToken, clearToken, isLoading, error, token, addTeamMember];
};
export { useGetInviteToken };
-3
View File
@@ -15,9 +15,6 @@ const useFetchLogs = () => {
setIsLoading(true);
const response = await networkService.getLogs();
setLogs(response.data.data);
createToast({
body: t("logsPage.toast.fetchLogsSuccess"),
});
} catch (error) {
setError(error);
createToast({
@@ -0,0 +1,68 @@
import { useState } from "react";
import Button from "@mui/material/Button";
import Menu from "@mui/material/Menu";
import MenuItem from "@mui/material/MenuItem";
import { useTheme } from "@emotion/react";
import ArrowDropDownIcon from "@mui/icons-material/ArrowDropDown";
import { useTranslation } from "react-i18next";
import Proptypes from "prop-types";
const AddMemberMenu = ({ handleInviteOpen, handleIsRegisterOpen }) => {
const [anchorEl, setAnchorEl] = useState(null);
const open = Boolean(anchorEl);
const { t } = useTranslation();
const theme = useTheme();
const handleClick = (event) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
return (
<>
<Button
variant="contained"
color="accent"
endIcon={<ArrowDropDownIcon sx={{ color: theme.palette.secondary.light }} />}
onClick={handleClick}
>
{t("teamPanel.addTeamMember.addMemberMenu")}
</Button>
<Menu
anchorEl={anchorEl}
open={open}
onClose={handleClose}
sx={{
"& .MuiPaper-root": {
minWidth: anchorEl?.offsetWidth || "auto",
},
}}
>
<MenuItem
onClick={() => {
handleClose();
handleInviteOpen();
}}
>
{t("teamPanel.inviteTeamMember")}
</MenuItem>
<MenuItem
onClick={() => {
handleClose();
handleIsRegisterOpen(true);
}}
>
{t("teamPanel.register")}
</MenuItem>
</Menu>
</>
);
};
AddMemberMenu.propTypes = {
handleInviteOpen: Proptypes.func.isRequired,
handleIsRegisterOpen: Proptypes.func.isRequired,
};
export default AddMemberMenu;
@@ -0,0 +1,48 @@
import { useState } from "react";
import { newOrChangedCredentials } from "../../../../../Validation/validation";
import { useTranslation } from "react-i18next";
const useAddTeamMember = () => {
const { t } = useTranslation();
const [errors, setErrors] = useState({});
const clearErrors = () => setErrors({});
const validateFields = (name, value, formData) => {
const { error } = newOrChangedCredentials.validate(
{ [name]: value },
{ abortEarly: false, context: { password: formData.password } }
);
setErrors((prev) => ({
...prev,
[name]: error?.details?.[0]?.message || "",
}));
};
const validateForm = (formData, role) => {
const { error } = newOrChangedCredentials.validate(formData, {
abortEarly: false,
context: { password: formData.password },
});
const formErrors = {};
if (error) {
for (const err of error.details) {
formErrors[err.path[0]] = err.message;
}
}
if (!role[0] || role.length === 0) {
formErrors.role = t(
"teamPanel.registerTeamMember.auth.common.inputs.role.errors.empty"
);
}
if (Object.keys(formErrors).length > 0) {
setErrors(formErrors);
return false;
}
setErrors({});
return true;
};
return { errors, setErrors, clearErrors, validateFields, validateForm };
};
export default useAddTeamMember;
@@ -0,0 +1,213 @@
import { Button, Stack } from "@mui/material";
import { GenericDialog } from "../../../../Components/Dialog/genericDialog";
import TextInput from "../../../../Components/Inputs/TextInput";
import Select from "../../../../Components/Inputs/Select";
import { useGetInviteToken } from "../../../../Hooks/inviteHooks";
import { useTheme } from "@emotion/react";
import { useTranslation } from "react-i18next";
import { createToast } from "../../../../Utils/toastUtils";
import { useState } from "react";
import PasswordTooltip from "../../../Auth/components/PasswordTooltip";
import useAddTeamMember from "./hooks/useAddTeamMember";
import usePasswordFeedback from "../../../Auth/hooks/usePasswordFeedback";
import { PasswordEndAdornment } from "../../../../Components/Inputs/TextInput/Adornments";
import PropTypes from "prop-types";
const INITIAL_FORM_STATE = {
firstName: "",
lastName: "",
email: "",
password: "",
confirm: "",
teamId: "",
};
const INITIAL_ROLE_STATE = ["user"];
const AddTeamMember = ({ handleIsRegisterOpen, isRegisterOpen, onMemberAdded }) => {
const theme = useTheme();
const { t } = useTranslation();
const { errors, setErrors, clearErrors, validateFields, validateForm } =
useAddTeamMember();
const { feedback, handlePasswordFeedback } = usePasswordFeedback();
const [getInviteToken, clearToken, isLoading, error, token, addTeamMember] =
useGetInviteToken();
const [form, setForm] = useState(INITIAL_FORM_STATE);
const [role, setRole] = useState(INITIAL_ROLE_STATE);
const [isLoadingSubmit, setIsLoadingSubmit] = useState(false);
const closeAddMemberModal = () => {
handleIsRegisterOpen(false);
setForm(INITIAL_FORM_STATE);
setRole(INITIAL_ROLE_STATE);
clearErrors();
clearToken();
};
const onChange = (e) => {
let { name, value } = e.target;
if (name === "email") value = value.toLowerCase();
const updatedForm = { ...form, [name]: value };
validateFields(name, value, updatedForm);
setForm(updatedForm);
if (name === "password" || name === "confirm") {
handlePasswordFeedback(updatedForm, name, value, form, errors, setErrors);
}
};
const onsubmitAddMember = async (event) => {
event.preventDefault();
if (!validateForm(form, role)) return;
try {
setIsLoadingSubmit(true);
await addTeamMember(form, role);
createToast({
body: t("teamPanel.registerToast.success"),
});
onMemberAdded();
closeAddMemberModal();
} catch (error) {
const errorMsg = error.response?.data?.msg || error.message || "unknownError";
createToast({
type: "error",
body: t(errorMsg),
});
} finally {
setIsLoadingSubmit(false);
}
};
const tErr = (key) => (key ? t([`teamPanel.registerTeamMember.${key}`, key]) : "");
return (
<>
<GenericDialog
title={t("teamPanel.addTeamMember.title")}
description={t("teamPanel.addTeamMember.description")}
open={isRegisterOpen}
onClose={closeAddMemberModal}
theme={theme}
width={{ sm: "55%", md: "50%", lg: "40%", xl: "30%" }}
>
<TextInput
name="firstName"
label={t("auth.common.inputs.firstName.label")}
isRequired={true}
gap={theme.spacing(4)}
placeholder={t("auth.common.inputs.firstName.placeholder")}
value={form.firstName}
onChange={onChange}
error={errors.firstName ? true : false}
helperText={errors.firstName ? tErr(errors.firstName) : null}
sx={{ mb: errors.firstName ? theme.spacing(15) : theme.spacing(5) }}
/>
<TextInput
name="lastName"
label={t("auth.common.inputs.lastName.label")}
isRequired={true}
gap={theme.spacing(4)}
placeholder={t("auth.common.inputs.lastName.placeholder")}
value={form.lastName}
onChange={onChange}
error={errors.lastName ? true : false}
helperText={errors.lastName ? tErr(errors.lastName) : null}
sx={{ mb: errors.lastName ? theme.spacing(15) : theme.spacing(5) }}
/>
<TextInput
type="email"
label={t("auth.common.inputs.email.label")}
name="email"
gap={theme.spacing(4)}
isRequired={true}
id="input-team-member"
placeholder={t("teamPanel.email")}
value={form.email}
onChange={onChange}
error={errors.email ? true : false}
helperText={errors.email ? tErr(errors.email) : null}
sx={{ mb: errors.email ? theme.spacing(15) : theme.spacing(5) }}
/>
<Select
label={t("teamPanel.role")}
id="team-member-role"
name="role"
required={true}
placeholder={t("teamPanel.selectRole")}
isHidden={true}
value={role[0] || ""}
sx={{ mb: theme.spacing(5) }}
onChange={(event) => setRole([event.target.value])}
items={[
{ _id: "admin", name: t("roles.admin") },
{ _id: "user", name: t("roles.teamMember") },
]}
/>
<PasswordTooltip
feedback={feedback}
form={form}
>
<TextInput
type="password"
id="register-password-input"
name="password"
label={t("auth.common.inputs.password.label")}
isRequired={true}
placeholder="••••••••••"
value={form.password}
onChange={onChange}
error={errors.password && errors.password[0] ? true : false}
endAdornment={<PasswordEndAdornment />}
sx={{ mb: theme.spacing(5) }}
/>
</PasswordTooltip>
<TextInput
type="password"
id="register-confirm-input"
name="confirm"
label={t("auth.common.inputs.passwordConfirm.label")}
gap={theme.spacing(4)}
isRequired={true}
placeholder={t("auth.common.inputs.passwordConfirm.placeholder")}
autoComplete="current-password"
value={form.confirm}
onChange={onChange}
error={errors.confirm && errors.confirm[0] ? true : false}
endAdornment={<PasswordEndAdornment />}
sx={{ mb: theme.spacing(5) }}
/>
<Stack
direction="row"
spacing={theme.spacing(10)}
mt={theme.spacing(8)}
justifyContent="flex-end"
>
<Button
variant="contained"
color="error"
onClick={closeAddMemberModal}
disabled={isLoadingSubmit}
>
{t("teamPanel.cancel")}
</Button>
<Button
variant="contained"
color="accent"
onClick={onsubmitAddMember}
disabled={isLoadingSubmit}
>
{t("teamPanel.addTeamMember.addButton")}
</Button>
</Stack>
</GenericDialog>
</>
);
};
AddTeamMember.propTypes = {
handleIsRegisterOpen: PropTypes.func.isRequired,
isRegisterOpen: PropTypes.bool.isRequired,
onMemberAdded: PropTypes.func.isRequired,
};
export default AddTeamMember;
@@ -9,10 +9,12 @@ import { networkService } from "../../../main";
import { createToast } from "../../../Utils/toastUtils";
import Select from "../../../Components/Inputs/Select";
import { GenericDialog } from "../../../Components/Dialog/genericDialog";
import AddTeamMember from "../components/AddTeamMember";
import DataTable from "../../../Components/Table";
import { useGetInviteToken } from "../../../Hooks/inviteHooks";
import { useNavigate } from "react-router-dom";
import { useIsSuperAdmin } from "../../../Hooks/useIsAdmin";
import AddMemberMenu from "./AddMemberMenu";
/**
* TeamPanel component manages the organization and team members,
* providing functionalities like renaming the organization, managing team members,
@@ -65,7 +67,10 @@ const TeamPanel = () => {
render: (row) => row.role,
},
];
const [refreshTrigger, setRefreshTrigger] = useState(false);
const refreshTeamList = () => {
setRefreshTrigger((prev) => !prev);
};
useEffect(() => {
const fetchTeam = async () => {
try {
@@ -79,7 +84,7 @@ const TeamPanel = () => {
};
fetchTeam();
}, []);
}, [refreshTrigger]);
useEffect(() => {
const ROLE_MAP = {
@@ -109,6 +114,10 @@ const TeamPanel = () => {
setIsDisabled(Object.keys(errors).length !== 0 || toInvite.email === "");
}, [errors, toInvite.email]);
const [isOpen, setIsOpen] = useState(false);
const [isRegisterOpen, setIsRegisterOpen] = useState(false);
const handleIsRegisterOpen = (open) => {
setIsRegisterOpen(open);
};
const handleChange = (event) => {
const { value } = event.target;
@@ -138,7 +147,6 @@ const TeamPanel = () => {
const handleGetToken = async () => {
await getInviteToken({ email: toInvite.email, role: toInvite.role });
};
const handleInviteMember = async () => {
if (!toInvite.email) {
setErrors((prev) => ({ ...prev, email: "Email is required." }));
@@ -239,13 +247,16 @@ const TeamPanel = () => {
</Button>
</ButtonGroup>
</Stack>
<Button
variant="contained"
color="accent"
onClick={() => setIsOpen(true)}
>
{t("teamPanel.inviteTeamMember")}
</Button>
<AddTeamMember
handleIsRegisterOpen={handleIsRegisterOpen}
isRegisterOpen={isRegisterOpen}
onMemberAdded={refreshTeamList}
/>
<AddMemberMenu
handleInviteOpen={() => setIsOpen(true)}
handleIsRegisterOpen={handleIsRegisterOpen}
/>
</Stack>
<DataTable
@@ -264,7 +275,6 @@ const TeamPanel = () => {
}}
/>
</Stack>
<GenericDialog
title={t("teamPanel.inviteNewTeamMember")}
description={t("teamPanel.inviteDescription")}
@@ -93,14 +93,14 @@ const PasswordTooltip = ({ feedback, form, children }) => {
},
}}
>
{children}
<span style={{ display: "inline-block", width: "100%" }}>{children}</span>
</Tooltip>
);
};
PasswordTooltip.propTypes = {
feedback: PropTypes.shape({
length: PropTypes.string.isRequired,
length: PropTypes.string,
special: PropTypes.string,
number: PropTypes.string,
uppercase: PropTypes.string,
@@ -0,0 +1,71 @@
import { useState } from "react";
import { newOrChangedCredentials } from "../../../Validation/validation";
const usePasswordFeedback = () => {
const [feedback, setFeedback] = useState({});
const getFeedbackStatus = (form, errors, field, criteria) => {
const fieldErrors = errors?.[field];
const isFieldEmpty = form?.[field]?.length === 0;
const hasError = fieldErrors?.includes(criteria) || fieldErrors?.includes("empty");
const isCorrect = !isFieldEmpty && !hasError;
if (isCorrect) {
return "success";
} else if (hasError) {
return "error";
} else {
return "info";
}
};
const handlePasswordFeedback = (updatedForm, name, value, form, errors, setErrors) => {
const validateValue = { [name]: value };
const validateOptions = { abortEarly: false, context: { password: form.password } };
if (name === "password" && form.confirm.length > 0) {
validateValue.confirm = form.confirm;
validateOptions.context = { password: value };
} else if (name === "confirm") {
validateValue.password = form.password;
}
const { error } = newOrChangedCredentials.validate(validateValue, validateOptions);
const pwdErrors = error?.details.map((error) => ({
path: error.path[0],
type: error.type,
}));
const errorsByPath =
pwdErrors &&
pwdErrors.reduce((acc, { path, type }) => {
if (!acc[path]) {
acc[path] = [];
}
acc[path].push(type);
return acc;
}, {});
const oldErrors = { ...errors };
if (name === "password") {
oldErrors.password = undefined;
} else if (name === "confirm") {
oldErrors.confirm = undefined;
}
const newErrors = { ...oldErrors, ...errorsByPath };
setErrors(newErrors);
const newFeedback = {
length: getFeedbackStatus(updatedForm, errorsByPath, "password", "string.min"),
special: getFeedbackStatus(updatedForm, errorsByPath, "password", "special"),
number: getFeedbackStatus(updatedForm, errorsByPath, "password", "number"),
uppercase: getFeedbackStatus(updatedForm, errorsByPath, "password", "uppercase"),
lowercase: getFeedbackStatus(updatedForm, errorsByPath, "password", "lowercase"),
confirm: getFeedbackStatus(updatedForm, errorsByPath, "confirm", "different"),
};
setFeedback(newFeedback);
};
return { feedback, handlePasswordFeedback, getFeedbackStatus };
};
export default usePasswordFeedback;
@@ -1,5 +1,10 @@
//Components
import Table from "../../../../Components/Table";
import Stack from "@mui/material/Stack";
import DataTable from "../../../../Components/Table";
import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody";
import TableRow from "@mui/material/TableRow";
import TableCell from "@mui/material/TableCell";
import TableSkeleton from "../../../../Components/Table/skeleton";
import Pagination from "../../../../Components/Table/TablePagination";
import { StatusLabel } from "../../../../Components/Label";
@@ -16,7 +21,68 @@ import { useTranslation } from "react-i18next";
import { useFetchChecksTeam } from "../../../../Hooks/checkHooks";
import { useFetchChecksByMonitor } from "../../../../Hooks/checkHooks";
import { useResolveIncident } from "../../../../Hooks/checkHooks";
import { Button, Typography } from "@mui/material";
import { Button, Typography, useTheme } from "@mui/material";
import { lighten } from "@mui/material/styles";
const GetTooltip = (row) => {
const theme = useTheme();
const phases = row?.timings?.phases;
const phaseKeyFormattingMap = {
firstByte: "first byte",
};
return (
<Stack
backgroundColor={lighten(theme.palette.primary.main, 0.1)}
border={`1px solid ${theme.palette.primary.lowContrast}`}
borderRadius={theme.shape.borderRadius}
py={theme.spacing(2)}
px={theme.spacing(4)}
>
<Typography
variant="body2"
color={theme.palette.primary.contrastText}
>{`Status code: ${row?.statusCode}`}</Typography>
<Typography
variant="body2"
color={theme.palette.primary.contrastText}
>{`Response time: ${row?.responseTime} ms`}</Typography>
{phases && (
<>
<Typography
variant="body2"
color={theme.palette.primary.contrastText}
>{`Request timing: `}</Typography>
<Table
size="small"
sx={{ ml: theme.spacing(2), mt: theme.spacing(2) }}
>
<TableBody>
{Object.keys(phases)?.map((phaseKey) => (
<TableRow key={phaseKey}>
<TableCell sx={{ border: "none", p: 0 }}>
<Typography
variant="body2"
color="success"
>
{`${phaseKeyFormattingMap[phaseKey] || phaseKey}:`}
</Typography>
</TableCell>
<TableCell sx={{ border: "none", p: 0 }}>
<Typography
color={theme.palette.primary.contrastText}
variant="body2"
>{`${phases[phaseKey]} ms`}</Typography>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</>
)}
</Stack>
);
};
const IncidentTable = ({
isLoading,
@@ -167,9 +233,10 @@ const IncidentTable = ({
return (
<>
<Table
<DataTable
headers={headers}
data={checks}
config={{ tooltipContent: GetTooltip }}
/>
<Pagination
paginationLabel={t("incidentsTablePaginationLabel")}
@@ -121,6 +121,7 @@ const InfrastructureDetails = () => {
<AreaChartBoxes
shouldRender={!isLoading}
monitor={monitor}
dateRange={dateRange}
/>
</>
)}
@@ -46,6 +46,11 @@ const JobTable = ({ jobs = [] }) => {
content: t("queuePage.jobTable.urlHeader"),
render: (row) => row.monitorUrl,
},
{
id: "interval",
content: t("queuePage.jobTable.intervalHeader"),
render: (row) => `${row.monitorInterval} ms`,
},
{
id: "type",
content: t("queuePage.jobTable.typeHeader"),
+1 -1
View File
@@ -29,7 +29,7 @@ const SettingsURL = ({ HEADING_SX, handleChange, showURL = false }) => {
<Select
name="showURL"
label={t("settingsPage.urlSettings.label")}
value={showURL || ""}
value={showURL === true}
onChange={handleChange}
items={[
{ _id: true, name: t("settingsPage.urlSettings.selectEnabled") },
+1 -1
View File
@@ -223,7 +223,7 @@ const Routes = () => {
<Route
exact
path="/register/:token"
element={<AuthRegister />}
element={<AuthRegister superAdminExists={true} />}
/>
<Route
+4 -2
View File
@@ -130,10 +130,12 @@ const monitorValidation = joi.object({
then: joi
.string()
.trim()
.regex(/^[a-z0-9]{64}$/)
.regex(
/^(\/+)?([a-zA-Z0-9][a-zA-Z0-9_.-]*[a-zA-Z0-9]|[a-zA-Z0-9]+|[a-f0-9]{12,64})$/
)
.messages({
"string.empty": "This field is required.",
"string.pattern.base": "Please enter a valid 64-character Docker container ID.",
"string.pattern.base": "Please enter a valid container name or ID.",
}),
otherwise: joi
.string()
+85 -5
View File
@@ -260,7 +260,6 @@
"notifyEmails": "",
"seperateEmails": "",
"checkFrequency": "",
"chooseGame": "",
"matchMethod": "",
"expectedValue": "",
"deleteDialogTitle": "",
@@ -569,7 +568,8 @@
"password": {
"incorrect": ""
}
}
},
"welcome": ""
},
"registration": {
"heading": {
@@ -595,7 +595,8 @@
},
"toasts": {
"success": ""
}
},
"welcome": ""
},
"forgotPassword": {
"heading": "",
@@ -847,6 +848,10 @@
"selectDisabled": "",
"selectEnabled": "",
"title": ""
},
"globalThresholds": {
"title": "",
"description": ""
}
},
"statusPageCreate": {
@@ -915,7 +920,12 @@
"twentyMinutes": "",
"oneHour": "",
"oneDay": "",
"oneWeek": ""
"oneWeek": "",
"fourMinutes": "",
"oneMinute": "",
"twoMinutes": "",
"fifteenSeconds": "",
"thirtySeconds": ""
},
"general": {
"noOptionsFound": ""
@@ -967,5 +977,75 @@
}
},
"incidentsPageActionResolveMonitor": "",
"incidentsPageActionResolveAll": ""
"incidentsPageActionResolveAll": "",
"matchMethodOptions": {
"equal": "",
"equalPlaceholder": "",
"include": "",
"includePlaceholder": "",
"regex": "",
"regexPlaceholder": "",
"text": ""
},
"monitorType": {
"docker": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"http": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"ping": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"port": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"game": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
}
},
"uptimeAdvancedMatching": {
"jsonPath": ""
},
"bytesPerSecond": "",
"bytesReceived": "",
"bytesSent": "",
"chooseGame": "",
"createMonitorPage": {
"incidentConfigDescription": "",
"incidentConfigStatusWindowLabel": "",
"incidentConfigStatusWindowThresholdLabel": "",
"incidentConfigTitle": ""
},
"dataRate": "",
"dataReceived": "",
"dataSent": "",
"details": "",
"drops": "",
"errors": "",
"errorsIn": "",
"errorsOut": "",
"gameServerMonitoring": "",
"gameServerMonitoringDescription": "",
"network": "",
"networkDrops": "",
"networkErrors": "",
"networkInterface": "",
"noNetworkStatsAvailable": "",
"packetsPerSecond": "",
"packetsReceived": "",
"packetsReceivedRate": "",
"packetsSent": "",
"rate": "",
"selectInterface": ""
}
+85 -5
View File
@@ -260,7 +260,6 @@
"notifyEmails": "",
"seperateEmails": "",
"checkFrequency": "",
"chooseGame": "",
"matchMethod": "",
"expectedValue": "",
"deleteDialogTitle": "",
@@ -569,7 +568,8 @@
"password": {
"incorrect": ""
}
}
},
"welcome": ""
},
"registration": {
"heading": {
@@ -595,7 +595,8 @@
},
"toasts": {
"success": "Vítejte! Váš účet byl úspěšně vytvořen."
}
},
"welcome": ""
},
"forgotPassword": {
"heading": "Zapomenuté heslo",
@@ -847,6 +848,10 @@
"selectDisabled": "",
"selectEnabled": "",
"title": ""
},
"globalThresholds": {
"title": "",
"description": ""
}
},
"statusPageCreate": {
@@ -915,7 +920,12 @@
"twentyMinutes": "",
"oneHour": "",
"oneDay": "",
"oneWeek": ""
"oneWeek": "",
"fourMinutes": "",
"oneMinute": "",
"twoMinutes": "",
"fifteenSeconds": "",
"thirtySeconds": ""
},
"general": {
"noOptionsFound": ""
@@ -967,5 +977,75 @@
}
},
"incidentsPageActionResolveMonitor": "",
"incidentsPageActionResolveAll": ""
"incidentsPageActionResolveAll": "",
"matchMethodOptions": {
"equal": "",
"equalPlaceholder": "",
"include": "",
"includePlaceholder": "",
"regex": "",
"regexPlaceholder": "",
"text": ""
},
"monitorType": {
"docker": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"http": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"ping": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"port": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"game": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
}
},
"uptimeAdvancedMatching": {
"jsonPath": ""
},
"bytesPerSecond": "",
"bytesReceived": "",
"bytesSent": "",
"chooseGame": "",
"createMonitorPage": {
"incidentConfigDescription": "",
"incidentConfigStatusWindowLabel": "",
"incidentConfigStatusWindowThresholdLabel": "",
"incidentConfigTitle": ""
},
"dataRate": "",
"dataReceived": "",
"dataSent": "",
"details": "",
"drops": "",
"errors": "",
"errorsIn": "",
"errorsOut": "",
"gameServerMonitoring": "",
"gameServerMonitoringDescription": "",
"network": "",
"networkDrops": "",
"networkErrors": "",
"networkInterface": "",
"noNetworkStatsAvailable": "",
"packetsPerSecond": "",
"packetsReceived": "",
"packetsReceivedRate": "",
"packetsSent": "",
"rate": "",
"selectInterface": ""
}
+325 -220
View File
@@ -51,14 +51,14 @@
"label": "Slack",
"description": "Um Slack-Benachrichtigungen zu aktivieren, erstelle eine Slack-App und aktiviere eingehende Webhooks. Danach gib einfach die Webhook-URL hier ein.",
"webhookLabel": "Webhook URL",
"webhookPlaceholder": "",
"webhookPlaceholder": "https://hooks.slack.com/services/...",
"webhookRequired": "Slack webhook URL wird benötigt"
},
"discord": {
"label": "Discord",
"description": "Um Daten von Checkmate an einen Discord-Kanal über Discord-Benachrichtigungen mithilfe von Webhooks zu senden, kannst Du die eingehenden Webhooks von Discord verwenden.",
"webhookLabel": "Discord Webhook URL",
"webhookPlaceholder": "",
"webhookPlaceholder": "https://discord.com/api/webhooks/...",
"webhookRequired": "Discord webhook URL wird benötigt"
},
"telegram": {
@@ -78,33 +78,37 @@
"urlRequired": "Webhook URL wird benötigt"
},
"testNotificationDevelop": "Testbenachrichtigung 2",
"integrationButton": "",
"testSuccess": "",
"testFailed": "",
"unsupportedType": "",
"networkError": "",
"integrationButton": "Benachrichtigungsintegration",
"testSuccess": "Testbenachrichtigung erfolgreich gesendet!",
"testFailed": "Senden der Testbenachrichtigung fehlgeschlagen",
"unsupportedType": "Nicht unterstützter Benachrichtigungstyp",
"networkError": "Netzwerkfehler aufgetreten",
"fallback": {
"title": "",
"checks": [""],
"actionButton": ""
"title": "Ein Benachrichtigungskanal wird verwendet, um:",
"checks": [
"Teams über Ausfallzeiten oder Leistungsprobleme informieren",
"Informieren Sie Techniker über Vorfälle",
"Informieren Sie Administratoren über Systemänderungen"
],
"actionButton": "Lassen Sie uns Ihren ersten Benachrichtigungskanal erstellen!"
},
"createButton": "",
"createTitle": "",
"createButton": "Benachrichtigungskanal erstellen",
"createTitle": "Benachrichtigungskanal",
"create": {
"success": "",
"failed": ""
"success": "Benachrichtigung erfolgreich erstellt",
"failed": "Benachrichtigung konnte nicht erstellt werden"
},
"fetch": {
"success": "",
"failed": ""
"success": "Benachrichtigungen erfolgreich abgerufen",
"failed": "Abrufen der Benachrichtigungen fehlgeschlagen"
},
"delete": {
"success": "",
"failed": ""
"success": "Benachrichtigung erfolgreich gelöscht",
"failed": "Benachrichtigung konnte nicht gelöscht werden"
},
"edit": {
"success": "",
"failed": ""
"success": "Benachrichtigung erfolgreich aktualisiert",
"failed": "Benachrichtigung konnte nicht aktualisiert werden"
},
"test": {
"success": "Test Benachrichtigung erfolgreich gesendet",
@@ -227,7 +231,7 @@
"createMaintenance": "Erstelle Wartungsfenster",
"editMaintenance": "Ändere Wartungsfenster",
"maintenanceWindowName": "Name des Wartungsfensters",
"friendlyNameInput": "",
"friendlyNameInput": "Freundlicher Name",
"friendlyNamePlaceholder": "Wartung um __ : __ für ___ Minuten",
"maintenanceRepeat": "Wartungsfenster wiederholen",
"maintenance": "Wartungsfenster",
@@ -247,7 +251,7 @@
"edit": "Ändern",
"createA": "Erstelle ein",
"remove": "Löschen",
"maintenanceWindowDescription": "",
"maintenanceWindowDescription": "Pings werden während dieses Zeitraums nicht gesendet",
"startTime": "Anfangszeit",
"timeZoneInfo": "Alle Daten und Zeiten sind in der Zeitzone GMT+0.",
"monitorsToApply": "Monitore, auf die das Wartungsfenster angewendet werden soll",
@@ -260,79 +264,78 @@
"notifyEmails": "Benachrichtige auch per E-Mail an mehrere Adressen (kommt bald)",
"seperateEmails": "Du kannst mehrere E-Mails mit einem Komma trennen",
"checkFrequency": "Überprüfungsfrequenz",
"chooseGame": "",
"matchMethod": "",
"matchMethod": "Übereinstimmungsmethode",
"expectedValue": "Erwarteter Wert",
"deleteDialogTitle": "Möchtest du diesen Monitor wirklich löschen?",
"deleteDialogDescription": "Sobald dieser Monitor gelöscht ist, kann er nicht wiederhergestellt werden.",
"pageSpeedMonitor": "",
"shown": "",
"pageSpeedMonitor": "PageSpeed-Monitor",
"shown": "Gezeigt",
"ago": "vor",
"companyName": "",
"pageSpeedDetailsPerformanceReport": "",
"pageSpeedDetailsPerformanceReportCalculator": "",
"checkingEvery": "",
"statusPageCreateSettings": "",
"basicInformation": "",
"statusPageCreateBasicInfoDescription": "",
"statusPageCreateSelectTimeZoneDescription": "",
"statusPageCreateAppearanceDescription": "",
"statusPageCreateSettingsCheckboxLabel": "",
"statusPageCreateBasicInfoStatusPageAddress": "",
"statusPageCreateTabsContent": "",
"statusPageCreateTabsContentDescription": "",
"statusPageCreateTabsContentFeaturesDescription": "",
"showCharts": "",
"showUptimePercentage": "",
"companyName": "Name der Firma",
"pageSpeedDetailsPerformanceReport": "Die Werte sind geschätzt und können variieren.",
"pageSpeedDetailsPerformanceReportCalculator": "Rechner öffnen",
"checkingEvery": "Überprüfen alle",
"statusPageCreateSettings": "Wenn Ihre Statusseite fertig ist, können Sie sie als veröffentlicht markieren.",
"basicInformation": "Grundlegende Informationen",
"statusPageCreateBasicInfoDescription": "Definieren Sie den Firmennamen und die Subdomäne, auf die Ihre Statusseite verweist.",
"statusPageCreateSelectTimeZoneDescription": "Wählen Sie die Zeitzone aus, in der Ihre Statusseite angezeigt wird.",
"statusPageCreateAppearanceDescription": "Definieren Sie das Standard-Erscheinungsbild Ihrer öffentlichen Statusseite.",
"statusPageCreateSettingsCheckboxLabel": "Veröffentlicht und für die Öffentlichkeit sichtbar",
"statusPageCreateBasicInfoStatusPageAddress": "Ihre Statusseitenadresse",
"statusPageCreateTabsContent": "Statusseitenserver",
"statusPageCreateTabsContentDescription": "Sie können Ihrer Statusseite beliebig viele Server hinzufügen, die Sie überwachen. Sie die Reihenfolge der Server ändern.",
"statusPageCreateTabsContentFeaturesDescription": "Mehr Details auf der Statusseite anzeigen",
"showCharts": "Diagramme anzeigen",
"showUptimePercentage": "Verfügbarkeitsprozentsatz anzeigen",
"removeLogo": "Entferne Logo",
"statusPageStatus": "",
"statusPageStatusContactAdmin": "",
"statusPageStatusNotPublic": "",
"statusPageStatusNoPage": "",
"statusPageStatusServiceStatus": "",
"deleteStatusPage": "",
"deleteStatusPageConfirm": "",
"deleteStatusPageDescription": "",
"uptimeCreate": "",
"uptimeCreateJsonPath": "",
"uptimeCreateJsonPathQuery": "",
"maintenanceTableActionMenuDialogTitle": "",
"infrastructureEditYour": "",
"infrastructureEditMonitor": "",
"infrastructureMonitorCreated": "",
"infrastructureMonitorUpdated": "",
"errorInvalidTypeId": "",
"errorInvalidFieldId": "",
"inviteNoTokenFound": "",
"pageSpeedWarning": "",
"statusPageStatus": "Eine öffentliche Statusseite ist nicht eingerichtet.",
"statusPageStatusContactAdmin": "Bitte wenden Sie sich an Ihren Administrator",
"statusPageStatusNotPublic": "Diese Statusseite ist nicht öffentlich.",
"statusPageStatusNoPage": "Hier gibt es keine Statusseite.",
"statusPageStatusServiceStatus": "Dienststatus",
"deleteStatusPage": "Möchten Sie diese Statusseite löschen?",
"deleteStatusPageConfirm": "Ja, Statusseite löschen",
"deleteStatusPageDescription": "Nach dem Löschen kann Ihre Statusseite nicht mehr abgerufen werden.",
"uptimeCreate": "Der erwartete Wert wird zum Abgleich mit dem Antwortergebnis verwendet und die Übereinstimmung bestimmt den Status.",
"uptimeCreateJsonPath": "Dieser Ausdruck wird anhand der JSON-Antwortdaten ausgewertet und das Ergebnis wird zum Abgleich mit dem erwarteten Wert verwendet. Siehe",
"uptimeCreateJsonPathQuery": "für die Dokumentation der Abfragesprache.",
"maintenanceTableActionMenuDialogTitle": "Möchten Sie dieses Wartungsfenster wirklich entfernen?",
"infrastructureEditYour": "Bearbeiten Sie Ihre",
"infrastructureEditMonitor": "Infrastrukturmonitor speichern",
"infrastructureMonitorCreated": "Infrastrukturmonitor erfolgreich erstellt!",
"infrastructureMonitorUpdated": "Infrastrukturmonitor erfolgreich aktualisiert!",
"errorInvalidTypeId": "Ungültiger Benachrichtigungstyp angegeben",
"errorInvalidFieldId": "Ungültige Feld-ID angegeben",
"inviteNoTokenFound": "Kein Einladungstoken gefunden",
"pageSpeedWarning": "Warnung: Sie haben noch keinen Google PageSpeed API-Schlüssel hinzugefügt. Ohne diesen funktioniert der PageSpeed-Monitor nicht.",
"pageSpeedLearnMoreLink": "Hier klicken",
"pageSpeedAddApiKey": "um einen API key einzutragen",
"update": "Update",
"invalidFileFormat": "Nicht unterstützes Dateiformat",
"invalidFileSize": "Dateigröße zu groß!",
"ClickUpload": "",
"ClickUpload": "Zum Hochladen klicken",
"DragandDrop": "drag and drop",
"MaxSize": "Maximalgröße",
"SupportedFormats": "Unterstützte Formate",
"FirstName": "Vorname",
"LastName": "Zuname",
"EmailDescriptionText": "",
"EmailDescriptionText": "Dies ist Ihre aktuelle E-Mail-Adresse – sie kann nicht geändert werden.",
"YourPhoto": "Profilphoto",
"PhotoDescriptionText": "",
"PhotoDescriptionText": "Dieses Foto wird auf Ihrer Profilseite angezeigt.",
"save": "Speichern",
"DeleteDescriptionText": "",
"DeleteAccountWarning": "",
"DeleteDescriptionText": "Dadurch werden das Konto und alle zugehörigen Daten vom Server entfernt. Dieser Vorgang kann nicht rückgängig gemacht werden.",
"DeleteAccountWarning": "Wenn Sie Ihr Konto löschen, können Sie sich nicht mehr anmelden und alle Ihre Daten werden gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.",
"DeleteWarningTitle": "Account wirklich löschen?",
"bulkImport": {
"title": "",
"selectFileTips": "",
"selectFileDescription": "",
"title": "Massenimport",
"selectFileTips": "Wählen Sie die CSV-Datei zum Hochladen aus",
"selectFileDescription": "Sie können unsere <template>Vorlage</template> oder <sample>Beispiel</sample> herunterladen.",
"selectFile": "Datei auswählen",
"parsingFailed": "",
"parsingFailed": "Parsen fehlgeschlagen",
"uploadSuccess": "Monitore erfolgreich erstellt!",
"validationFailed": "Prüfung fehlgeschlagen",
"noFileSelected": "Keine Datei ausgewählt",
"fallbackPage": "",
"fallbackPage": "Importieren Sie eine Datei, um eine Liste von Servern gleichzeitig hochzuladen",
"invalidFileType": "Ungültiger Dateityp",
"uploadFailed": "Upload fehlgeschlagen"
},
@@ -347,8 +350,8 @@
"createNew": "Neu anlegen",
"greeting": {
"prepend": "Hallo",
"append": "",
"overview": ""
"append": "Der Nachmittag gehört Ihnen – machen wir ihn episch!",
"overview": "Hier ist eine Übersicht Ihrer {{type}}-Monitore."
},
"roles": {
"superAdmin": "Super admin",
@@ -364,7 +367,7 @@
},
"inviteTeamMember": "Team Mirglied einladen",
"inviteNewTeamMember": "Neues Team Mirglied einladen",
"inviteDescription": "",
"inviteDescription": "Wenn Sie ein neues Teammitglied hinzufügen, erhält dieses Zugriff auf alle Monitore.",
"email": "Email",
"selectRole": "Rolle auswählen",
"inviteLink": "Einladungslink",
@@ -381,17 +384,17 @@
},
"monitorState": {
"paused": "Pausiert",
"resumed": "",
"resumed": "Wiederaufgenommen",
"active": "Aktiv"
},
"menu": {
"uptime": "Uptime",
"pagespeed": "",
"infrastructure": "",
"incidents": "",
"pagespeed": "Pagespeed",
"infrastructure": "Infrastruktur",
"incidents": "Vorfälle",
"statusPages": "Statusseite",
"maintenance": "Wartung",
"integrations": "",
"integrations": "Integrationen",
"settings": "Einstellungen",
"support": "Support",
"discussions": "Diskussionen",
@@ -404,12 +407,12 @@
"notifications": "Benachrichtigungen",
"logs": "Logs"
},
"settingsEmailUser": "",
"state": "",
"settingsEmailUser": "E-Mail-Benutzer – Benutzername zur Authentifizierung, überschreibt die E-Mail-Adresse, falls angegeben",
"state": "Zustand",
"statusBreadCrumbsStatusPages": "Statusseite",
"statusBreadCrumbsDetails": "Details",
"commonSaving": "Speichere...",
"navControls": "",
"navControls": "Steuerungen",
"incidentsPageTitle": "Ereignisse",
"passwordPanel": {
"passwordChangedSuccess": "Dein Passwort wurde erfolgreich geändert.",
@@ -430,22 +433,22 @@
"settingsTestEmailUnknownError": "Unbekannter Fehler",
"statusMsg": {
"paused": "Monitoring pausiert",
"up": "",
"down": "",
"pending": ""
"up": "Ihre Site ist online.",
"down": "Ihre Site ist nicht erreichbar.",
"pending": "Ausstehend..."
},
"uptimeGeneralInstructions": {
"http": "",
"ping": "",
"docker": "",
"port": "",
"http": "Geben Sie die zu überwachende URL oder IP ein (z. B. https://example.com/ oder 192.168.1.100) und fügen Sie einen eindeutigen Anzeigenamen hinzu, der auf dem Dashboard angezeigt wird.",
"ping": "Geben Sie die IP-Adresse oder den Hostnamen ein, der angepingt werden soll (z. B. 192.168.1.100 oder example.com), und fügen Sie einen eindeutigen Anzeigenamen hinzu, der auf dem Dashboard angezeigt wird.",
"docker": "Geben Sie die Docker-ID Ihres Containers ein. Docker-IDs müssen die vollständige 64-Zeichen-ID sein. Sie können docker inspect <short_id> ausführen, um die vollständige Container-ID abzurufen.",
"port": "Geben Sie die URL oder IP des Servers, die Portnummer und einen eindeutigen Anzeigenamen ein, der auf dem Dashboard angezeigt wird.",
"game": ""
},
"common": {
"appName": "Checkmate",
"monitoringAgentName": "Capture",
"buttons": {
"toggleTheme": ""
"toggleTheme": "Schaltet hell und dunkel um"
},
"toasts": {
"networkError": "Netzwerkfehler",
@@ -465,7 +468,7 @@
"placeholder": "jordan.ellis@domain.com",
"errors": {
"empty": "Email adresse eingeben um fortzufahren",
"invalid": ""
"invalid": "Bitte überprüfen Sie die Gültigkeit der eingegebenen E-Mail-Adresse erneut"
}
},
"password": {
@@ -492,7 +495,7 @@
"highlighted": "einen Kleinbuchstaben enthalten"
},
"match": {
"beginning": "",
"beginning": "Passwort und Kennwort bestätigen",
"highlighted": "muß übereinstimmen"
}
},
@@ -544,7 +547,7 @@
},
"role": {
"errors": {
"min": ""
"min": "Mindestens eine Rolle ist erforderlich"
}
}
}
@@ -569,7 +572,8 @@
"password": {
"incorrect": "Das Passwort stimmt nicht mit dem gespeicherten überein"
}
}
},
"welcome": ""
},
"registration": {
"heading": {
@@ -577,25 +581,26 @@
"user": "Anmelden"
},
"subheadings": {
"stepOne": "",
"stepOne": "Geben Sie Ihre persönlichen Daten ein",
"stepTwo": "Email eingeben",
"stepThree": "Passwort eingeben"
},
"description": {
"superAdmin": "Super admin account anlegen um zu beginnen",
"user": ""
"user": "Melden Sie sich als Benutzer an und bitten Sie den Superadministrator um Zugriff auf Ihre Monitore"
},
"gettingStartedButton": {
"superAdmin": "Super admin account anlegen",
"user": "Normalen Benutzer anlegen"
},
"termsAndPolicies": "",
"termsAndPolicies": "Indem Sie ein Konto erstellen, stimmen Sie unseren <a1>Servicebedingungen</a1> und <a2>Datenschutzrichtlinien</a2> zu.",
"links": {
"login": "Du hast bereits einen Benutzer? <a>Anmelden</a>"
},
"toasts": {
"success": "Willkommen! Benutzer erfolgreich angelegt"
}
},
"welcome": ""
},
"forgotPassword": {
"heading": "Passwort vergessen?",
@@ -624,7 +629,7 @@
"emailNotFound": "Email nicht gefunden.",
"redirect": "Umleitung in <seconds/>...",
"success": "Passwort erfolgreich zurückgesetzt.",
"error": ""
"error": "Kennwort konnte nicht zurückgesetzt werden. Bitte versuchen Sie es später erneut oder wenden Sie sich an den Support."
}
}
},
@@ -635,7 +640,7 @@
"stillUnreachable": "Server immer noch nicht erreichbar. Bitte später erneut versuchen."
},
"alertBox": "Server Verbindungsfehler",
"description": "",
"description": "Wir können keine Verbindung zum Server herstellen. Bitte überprüfen Sie Ihre Internetverbindung oder Ihre Bereitstellungskonfiguration, falls das Problem weiterhin besteht.",
"retryButton": {
"default": "Verbindung erneut versuchen",
"processing": "Verbinde..."
@@ -643,16 +648,16 @@
}
},
"createNotifications": {
"title": "",
"title": "Benachrichtigungskanal erstellen",
"nameSettings": {
"title": "Name",
"description": "",
"description": "Ein beschreibender Name für Ihre Integration.",
"nameLabel": "Name",
"namePlaceholder": "z.B. Slack Benachrichtigung"
},
"typeSettings": {
"title": "Typ",
"description": "",
"description": "Wählen Sie den Typ des Benachrichtigungskanals aus, den Sie erstellen möchten.",
"typeLabel": "Typ"
},
"emailSettings": {
@@ -665,7 +670,7 @@
"title": "Slack",
"description": "Slack webhook hier konfigurieren",
"webhookLabel": "Slack webhook URL",
"webhookPlaceholder": ""
"webhookPlaceholder": "https://hooks.slack.com/services/..."
},
"pagerdutySettings": {
"title": "PagerDuty",
@@ -685,38 +690,38 @@
"webhookLabel": "Webhook URL",
"webhookPlaceholder": "https://your-server.com/webhook"
},
"testNotification": "",
"dialogDeleteTitle": "",
"dialogDeleteConfirm": ""
"testNotification": "Testbenachrichtigung",
"dialogDeleteTitle": "Möchten Sie diese Benachrichtigung wirklich löschen?",
"dialogDeleteConfirm": "Löschen"
},
"notificationConfig": {
"title": "Benachrichtigungen",
"description": ""
"description": "Wählen Sie die Benachrichtigungskanäle aus, die Sie verwenden möchten"
},
"monitorStatus": {
"checkingEvery": "",
"withCaptureAgent": "",
"checkingEvery": "Überprüfung alle {{interval}}",
"withCaptureAgent": "mit Capture-Agent {{version}}",
"up": "hoch",
"down": "runter",
"paused": "pausiert"
},
"advancedMatching": "",
"advancedMatching": "Erweiterter Abgleich",
"sendTestNotifications": "Test Benachrichtigung senden",
"selectAll": "Alle auswählen",
"showAdminLoginLink": "",
"showAdminLoginLink": "Link „Administrator? Hier anmelden“ auf der Statusseite anzeigen",
"logsPage": {
"title": "Logs",
"description": "",
"description": "Systemprotokolle – letzte 1000 Zeilen",
"tabs": {
"queue": "Warteschlange",
"logs": "Server logs",
"diagnostics": ""
"diagnostics": "Diagnose"
},
"toast": {
"fetchLogsSuccess": ""
"fetchLogsSuccess": "Protokolle erfolgreich abgerufen"
},
"logLevelSelect": {
"title": "",
"title": "Protokollebene",
"values": {
"all": "Alle",
"info": "Info",
@@ -736,7 +741,7 @@
"urlHeader": "URL",
"typeHeader": "Typ",
"activeHeader": "Aktiv",
"lockedAtHeader": "",
"lockedAtHeader": "Gesperrt bei",
"runCountHeader": "Anzahl Läufe",
"failCountHeader": "Anzahl Fehler",
"lastRunHeader": "Letzter Lauf um",
@@ -744,8 +749,8 @@
"lastRunTookHeader": "Letzter Lauf dauerte"
},
"metricsTable": {
"title": "",
"metricHeader": "",
"title": "Warteschlangenmetriken",
"metricHeader": "Metrisch",
"valueHeader": "Wert"
},
"failedJobTable": {
@@ -766,9 +771,9 @@
"title": "Export/Import",
"import": "Monitore importieren",
"export": "Monitore exportieren",
"deleteSuccess": "",
"deleteFailed": "",
"details": ""
"deleteSuccess": "Monitor erfolgreich gelöscht",
"deleteFailed": "Monitor konnte nicht gelöscht werden",
"details": "Details"
},
"settingsPage": {
"aboutSettings": {
@@ -783,43 +788,43 @@
},
"emailSettings": {
"buttonSendTestEmail": "Test-Email senden",
"description": "",
"descriptionTransport": "",
"labelAddress": "",
"labelConnectionHost": "",
"labelHost": "",
"description": "Konfigurieren Sie die E-Mail-Einstellungen für Ihr System. Diese werden zum Senden von Benachrichtigungen und Warnungen verwendet.",
"descriptionTransport": "Dies erstellt einen SMTP-Transport für NodeMailer",
"labelAddress": "E-Mail-Adresse - Wird zur Authentifizierung verwendet",
"labelConnectionHost": "E-Mail-Verbindungshost – Hostname zur Verwendung in der HELO/EHLO-Begrüßung",
"labelHost": "E-Mail-Host – Hostname oder IP-Adresse, mit der eine Verbindung hergestellt werden soll",
"labelIgnoreTLS": "STARTTLS abschalten: TLS nicht nutzen, selbst wenn der Server es unterstützt",
"labelPassword": "Email password - Password für Anmeldung",
"labelPasswordSet": "Passwort erstellt. Reset drücken um es zu ändern.",
"labelPool": "",
"labelPool": "Verbindungspooling aktivieren: Vorhandene Verbindungen wiederverwenden, um die Leistung zu verbessern",
"labelPort": "Email port - Port zum verbinden",
"labelRejectUnauthorized": "Ungültige Zertifikate ablehnen. Verbindungen mit self-signed oder nicht vertrauenswürdigen Zertifikaten ablehnen.",
"labelRequireTLS": "",
"labelRequireTLS": "STARTTLS erzwingen: TLS-Upgrade erforderlich, schlägt fehl, wenn nicht unterstützt",
"labelSecure": "SSL verwenden (empfohlen): Verbindung mit SSL/TLS verschlüsseln",
"labelTLSServername": "",
"labelUser": "",
"linkTransport": "",
"labelTLSServername": "TLS-Servername – Optionaler Hostname für die TLS-Validierung, wenn der Host eine IP ist",
"labelUser": "E-Mail-Benutzer – Benutzername zur Authentifizierung, überschreibt die E-Mail-Adresse, falls angegeben",
"linkTransport": "Spezifikationen finden Sie hier",
"placeholderUser": "Leer lassen, wenn nicht benötigt",
"title": "Email",
"toastEmailRequiredFieldsError": ""
"toastEmailRequiredFieldsError": "E-Mail-Adresse, Host, Port und Passwort sind erforderlich"
},
"pageSpeedSettings": {
"description": "",
"description": "Geben Sie Ihren Google PageSpeed API-Schlüssel ein, um die Google PageSpeed-Überwachung zu aktivieren. Klicken Sie auf „Zurücksetzen“, um den Schlüssel zu aktualisieren.",
"labelApiKeySet": "API key erstellt. Reset drücken um ihn zu ändern.",
"labelApiKey": "PageSpeed API key",
"title": "Google PageSpeed API key"
},
"saveButtonLabel": "Speichern",
"statsSettings": {
"clearAllStatsButton": "",
"clearAllStatsDescription": "",
"clearAllStatsDialogConfirm": "",
"clearAllStatsDialogDescription": "",
"clearAllStatsDialogTitle": "",
"description": "",
"labelTTL": "",
"clearAllStatsButton": "Alle Statistiken löschen",
"clearAllStatsDescription": "Alle Statistiken löschen. Dies ist irreversibel.",
"clearAllStatsDialogConfirm": "Ja, alle Statistiken löschen",
"clearAllStatsDialogDescription": "Nach dem Entfernen können der Überwachungsverlauf und die Statistiken nicht mehr abgerufen werden.",
"clearAllStatsDialogTitle": "Möchten Sie alle Statistiken löschen?",
"description": "Legen Sie fest, wie lange Sie historische Daten aufbewahren möchten. Sie können auch alle vorhandenen Daten löschen.",
"labelTTL": "Die Tage, an denen Sie den Überwachungsverlauf beibehalten möchten.",
"labelTTLOptional": "0 für unendlich",
"title": ""
"title": "Monitorverlauf"
},
"systemResetSettings": {
"buttonRemoveAllMonitors": "Alle Monitore löschen",
@@ -830,142 +835,242 @@
"title": "System zurücksetzen"
},
"timezoneSettings": {
"description": "",
"description": "Wählen Sie die Zeitzone aus, die zum Anzeigen von Datum und Uhrzeit in der gesamten Anwendung verwendet wird.",
"label": "Zeitzone",
"title": "Zeitzone"
},
"title": "Einstellungen",
"uiSettings": {
"description": "",
"description": "Wechseln Sie zwischen hellem und dunklem Modus oder ändern Sie die Sprache der Benutzeroberfläche.",
"labelLanguage": "Sprache",
"labelTheme": "",
"title": ""
"labelTheme": "Themenmodus",
"title": "Aussehen"
},
"urlSettings": {
"description": "",
"label": "",
"description": "Zeigt die IP-Adresse oder URL des Monitors auf der öffentlichen Statusseite an. Wenn diese Option deaktiviert ist, wird zum Schutz vertraulicher Informationen nur der Monitorname angezeigt.",
"label": "IP/URL auf der Statusseite anzeigen",
"selectDisabled": "Inaktiv",
"selectEnabled": "Aktiv",
"title": ""
"title": "Überwachen Sie IP/URL auf der Statusseite"
},
"globalThresholds": {
"title": "",
"description": ""
}
},
"statusPageCreate": {
"buttonSave": "Speichern"
},
"incidentsOptionsHeaderFilterResolved": "",
"incidentsOptionsHeaderFilterResolved": "Gelöst",
"settingsSave": "Speichern",
"statusPageCreateAppearanceTitle": "",
"statusPageCreateAppearanceTitle": "Aussehen",
"confirmPassword": "Passwort bestätigen",
"monitorHooks": {
"failureAddDemoMonitors": "Demo Monitor konnte nicht hinzugefügt werden",
"successAddDemoMonitors": "Demo Monitor erfolgreich hinzugefügt"
},
"settingsAppearance": "",
"settingsDisplayTimezone": "",
"settingsGeneralSettings": "",
"incidentsOptionsHeaderTotalIncidents": "",
"settingsAppearance": "Aussehen",
"settingsDisplayTimezone": "Zeitzone anzeigen",
"settingsGeneralSettings": "Allgemeine Einstellungen",
"incidentsOptionsHeaderTotalIncidents": "Gesamtanzahl der Vorfälle",
"statusPage": {
"deleteSuccess": "",
"deleteFailed": "",
"createSuccess": "",
"updateSuccess": "",
"generalSettings": "",
"contents": "",
"deleteSuccess": "Statusseite erfolgreich gelöscht",
"deleteFailed": "Löschen der Statusseite fehlgeschlagen",
"createSuccess": "Statusseite erfolgreich erstellt",
"updateSuccess": "Statusseite erfolgreich aktualisiert",
"generalSettings": "Allgemeine Einstellungen",
"contents": "Inhalt",
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"checks": [
"Überwachen und zeigen Sie den Zustand Ihrer Dienste in Echtzeit an.",
"Verfolgen Sie mehrere Dienste und teilen Sie deren Status.",
"Informieren Sie Nutzer über Ausfälle und Leistung."
],
"title": "Eine Statusseite wird verwendet, um:",
"actionButton": "Lassen Sie uns Ihre erste Statusseite erstellen!"
}
},
"testNotificationsDisabled": "",
"incidentsTableResolvedAt": "",
"incidentsTableActionResolve": "",
"testNotificationsDisabled": "Für diesen Monitor sind keine Benachrichtigungen eingerichtet. Sie müssen eine hinzufügen, indem Sie auf die Schaltfläche „Konfigurieren“ klicken.",
"incidentsTableResolvedAt": "Gelöst am",
"incidentsTableActionResolve": "Lösen",
"checkHooks": {
"failureResolveOne": "",
"failureResolveAll": "",
"failureResolveMonitor": ""
"failureResolveOne": "Der Vorfall konnte nicht gelöst werden.",
"failureResolveAll": "Es konnten nicht alle Vorfälle gelöst werden.",
"failureResolveMonitor": "Monitorvorfälle konnten nicht behoben werden."
},
"checkFormError": "",
"checkFormError": "Bitte überprüfen Sie das Formular auf Fehler.",
"diagnosticsPage": {
"diagnosticDescription": "",
"statsDescription": "",
"diagnosticDescription": "Systemdiagnose",
"statsDescription": "Systemstatistiken",
"gauges": {
"heapAllocationTitle": "",
"heapAllocationSubtitle": "",
"heapUsageTitle": "",
"heapUsageSubtitle": "",
"heapUtilizationTitle": "",
"heapUtilizationSubtitle": "",
"instantCpuUsageTitle": "",
"instantCpuUsageSubtitle": ""
"heapAllocationTitle": "Heap-Zuweisung",
"heapAllocationSubtitle": "% des verfügbaren Speichers",
"heapUsageTitle": "Heap-Nutzung",
"heapUsageSubtitle": "% des verfügbaren Speichers",
"heapUtilizationTitle": "Heap-Auslastung",
"heapUtilizationSubtitle": "% der zugewiesenen",
"instantCpuUsageTitle": "Sofortige CPU-Auslastung",
"instantCpuUsageSubtitle": "% der von der CPU genutzten 1s"
},
"stats": {
"eventLoopDelayTitle": "",
"uptimeTitle": "",
"usedHeapSizeTitle": "",
"totalHeapSizeTitle": "",
"osMemoryLimitTitle": ""
"eventLoopDelayTitle": "Ereignisschleifenverzögerung",
"uptimeTitle": "Betriebszeit",
"usedHeapSizeTitle": "Verwendete Heap-Größe",
"totalHeapSizeTitle": "Gesamtgröße des Heapspeichers",
"osMemoryLimitTitle": "Betriebssystem-Speicherlimit"
}
},
"pageSpeedLighthouseAPI": "",
"pageSpeedLighthouseAPI": "Verwenden Sie die Lighthouse PageSpeed API, um Ihre Website zu überwachen",
"time": {
"threeMinutes": "",
"fiveMinutes": "",
"tenMinutes": "",
"twentyMinutes": "",
"oneHour": "",
"oneDay": "",
"oneWeek": ""
"threeMinutes": "3 Minuten",
"fiveMinutes": "5 Minuten",
"tenMinutes": "10 Minuten",
"twentyMinutes": "20 Minuten",
"oneHour": "1 Stunde",
"oneDay": "1 Tag",
"oneWeek": "1 Woche",
"fourMinutes": "",
"oneMinute": "",
"twoMinutes": "",
"fifteenSeconds": "",
"thirtySeconds": ""
},
"general": {
"noOptionsFound": ""
"noOptionsFound": "Keine {{unit}} gefunden"
},
"infrastructureMonitor": {
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"checks": [
"Verfolgen Sie die Leistung Ihrer Server",
"Identifizieren Sie Engpässe und optimieren Sie die Nutzung",
"Sorgen Sie für Zuverlässigkeit durch Echtzeitüberwachung"
],
"title": "Ein Infrastrukturmonitor wird verwendet, um:",
"actionButton": "Lassen Sie uns Ihren ersten Infrastrukturmonitor erstellen!"
}
},
"maintenanceWindow": {
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"checks": [
"Markieren Sie Ihre Wartungszeiträume.",
"Beseitigen Sie Missverständnisse.",
"Beenden Sie das Senden von Warnmeldungen in Wartungsfenstern."
],
"title": "Ein Wartungsfenster wird verwendet, um:",
"actionButton": "Lassen Sie uns Ihr erstes Wartungsfenster erstellen!"
}
},
"pageSpeed": {
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"checks": [
"Berichten Sie über die Benutzerfreundlichkeit einer Seite.",
"Helfen Sie bei der Analyse der Webseitengeschwindigkeit.",
"Geben Sie Verbesserungsvorschläge für die Seite."
],
"title": "Ein PageSpeed-Monitor wird verwendet, um:",
"actionButton": "Lassen Sie uns Ihren ersten PageSpeed-Monitor erstellen!"
}
},
"uptimeMonitor": {
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"checks": [
"Prüfen Sie, ob Websites oder Server online und reaktionsfähig sind.",
"Benachrichtigen Sie Ihre Teams über Ausfallzeiten oder Leistungsprobleme.",
"Überwachen Sie HTTP-Endpunkte, Pings, Container und Ports.",
"Verfolgen Sie historische Verfügbarkeits- und Zuverlässigkeitstrends."
],
"title": "Ein Uptime-Monitor wird verwendet, um:",
"actionButton": "Lassen Sie uns Ihren ersten Uptime-Monitor erstellen!"
}
},
"editUserPage": {
"form": {
"email": "",
"firstName": "",
"lastName": "",
"role": "",
"save": ""
"email": "E-Mail",
"firstName": "Vorname",
"lastName": "Nachname",
"role": "Rollen",
"save": "Speichern"
},
"table": {
"actionHeader": "",
"roleHeader": ""
"actionHeader": "Aktion",
"roleHeader": "Rolle"
},
"title": "",
"title": "Benutzer bearbeiten",
"toast": {
"successUserUpdate": "",
"validationErrors": ""
"successUserUpdate": "Benutzer erfolgreich aktualisiert",
"validationErrors": "Validierungsfehler"
}
},
"incidentsPageActionResolveMonitor": "",
"incidentsPageActionResolveAll": ""
"incidentsPageActionResolveMonitor": "Monitor-Vorfälle beheben",
"incidentsPageActionResolveAll": "Alle Vorfälle lösen",
"matchMethodOptions": {
"equal": "",
"equalPlaceholder": "",
"include": "",
"includePlaceholder": "",
"regex": "",
"regexPlaceholder": "",
"text": ""
},
"monitorType": {
"docker": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"http": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"ping": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"port": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"game": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
}
},
"uptimeAdvancedMatching": {
"jsonPath": ""
},
"bytesPerSecond": "",
"bytesReceived": "",
"bytesSent": "",
"chooseGame": "",
"createMonitorPage": {
"incidentConfigDescription": "",
"incidentConfigStatusWindowLabel": "",
"incidentConfigStatusWindowThresholdLabel": "",
"incidentConfigTitle": ""
},
"dataRate": "",
"dataReceived": "",
"dataSent": "",
"details": "",
"drops": "",
"errors": "",
"errorsIn": "",
"errorsOut": "",
"gameServerMonitoring": "",
"gameServerMonitoringDescription": "",
"network": "",
"networkDrops": "",
"networkErrors": "",
"networkInterface": "",
"noNetworkStatsAvailable": "",
"packetsPerSecond": "",
"packetsReceived": "",
"packetsReceivedRate": "",
"packetsSent": "",
"rate": "",
"selectInterface": ""
}
+933 -887
View File
File diff suppressed because it is too large. Load diff
+85 -5
View File
@@ -260,7 +260,6 @@
"notifyEmails": "",
"seperateEmails": "",
"checkFrequency": "",
"chooseGame": "",
"matchMethod": "",
"expectedValue": "",
"deleteDialogTitle": "",
@@ -569,7 +568,8 @@
"password": {
"incorrect": ""
}
}
},
"welcome": ""
},
"registration": {
"heading": {
@@ -595,7 +595,8 @@
},
"toasts": {
"success": ""
}
},
"welcome": ""
},
"forgotPassword": {
"heading": "",
@@ -847,6 +848,10 @@
"selectDisabled": "",
"selectEnabled": "",
"title": ""
},
"globalThresholds": {
"title": "",
"description": ""
}
},
"statusPageCreate": {
@@ -915,7 +920,12 @@
"twentyMinutes": "",
"oneHour": "",
"oneDay": "",
"oneWeek": ""
"oneWeek": "",
"fourMinutes": "",
"oneMinute": "",
"twoMinutes": "",
"fifteenSeconds": "",
"thirtySeconds": ""
},
"general": {
"noOptionsFound": ""
@@ -967,5 +977,75 @@
}
},
"incidentsPageActionResolveMonitor": "",
"incidentsPageActionResolveAll": ""
"incidentsPageActionResolveAll": "",
"matchMethodOptions": {
"equal": "",
"equalPlaceholder": "",
"include": "",
"includePlaceholder": "",
"regex": "",
"regexPlaceholder": "",
"text": ""
},
"monitorType": {
"docker": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"http": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"ping": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"port": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"game": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
}
},
"uptimeAdvancedMatching": {
"jsonPath": ""
},
"bytesPerSecond": "",
"bytesReceived": "",
"bytesSent": "",
"chooseGame": "",
"createMonitorPage": {
"incidentConfigDescription": "",
"incidentConfigStatusWindowLabel": "",
"incidentConfigStatusWindowThresholdLabel": "",
"incidentConfigTitle": ""
},
"dataRate": "",
"dataReceived": "",
"dataSent": "",
"details": "",
"drops": "",
"errors": "",
"errorsIn": "",
"errorsOut": "",
"gameServerMonitoring": "",
"gameServerMonitoringDescription": "",
"network": "",
"networkDrops": "",
"networkErrors": "",
"networkInterface": "",
"noNetworkStatsAvailable": "",
"packetsPerSecond": "",
"packetsReceived": "",
"packetsReceivedRate": "",
"packetsSent": "",
"rate": "",
"selectInterface": ""
}
+85 -5
View File
@@ -260,7 +260,6 @@
"notifyEmails": "",
"seperateEmails": "",
"checkFrequency": "",
"chooseGame": "",
"matchMethod": "",
"expectedValue": "",
"deleteDialogTitle": "",
@@ -569,7 +568,8 @@
"password": {
"incorrect": ""
}
}
},
"welcome": ""
},
"registration": {
"heading": {
@@ -595,7 +595,8 @@
},
"toasts": {
"success": ""
}
},
"welcome": ""
},
"forgotPassword": {
"heading": "",
@@ -847,6 +848,10 @@
"selectDisabled": "",
"selectEnabled": "",
"title": ""
},
"globalThresholds": {
"title": "",
"description": ""
}
},
"statusPageCreate": {
@@ -915,7 +920,12 @@
"twentyMinutes": "",
"oneHour": "",
"oneDay": "",
"oneWeek": ""
"oneWeek": "",
"fourMinutes": "",
"oneMinute": "",
"twoMinutes": "",
"fifteenSeconds": "",
"thirtySeconds": ""
},
"general": {
"noOptionsFound": ""
@@ -967,5 +977,75 @@
}
},
"incidentsPageActionResolveMonitor": "",
"incidentsPageActionResolveAll": ""
"incidentsPageActionResolveAll": "",
"matchMethodOptions": {
"equal": "",
"equalPlaceholder": "",
"include": "",
"includePlaceholder": "",
"regex": "",
"regexPlaceholder": "",
"text": ""
},
"monitorType": {
"docker": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"http": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"ping": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"port": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"game": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
}
},
"uptimeAdvancedMatching": {
"jsonPath": ""
},
"bytesPerSecond": "",
"bytesReceived": "",
"bytesSent": "",
"chooseGame": "",
"createMonitorPage": {
"incidentConfigDescription": "",
"incidentConfigStatusWindowLabel": "",
"incidentConfigStatusWindowThresholdLabel": "",
"incidentConfigTitle": ""
},
"dataRate": "",
"dataReceived": "",
"dataSent": "",
"details": "",
"drops": "",
"errors": "",
"errorsIn": "",
"errorsOut": "",
"gameServerMonitoring": "",
"gameServerMonitoringDescription": "",
"network": "",
"networkDrops": "",
"networkErrors": "",
"networkInterface": "",
"noNetworkStatsAvailable": "",
"packetsPerSecond": "",
"packetsReceived": "",
"packetsReceivedRate": "",
"packetsSent": "",
"rate": "",
"selectInterface": ""
}
+130 -29
View File
@@ -90,7 +90,7 @@
"Informez les ingénieurs lorsque des incidents se produisent",
"Tenez les administrateurs informés des changements apportés au système"
],
"actionButton": ""
"actionButton": "Créez votre premier canal de notification !"
},
"createButton": "Créer un canal de notification",
"createTitle": "Canal de notification",
@@ -264,7 +264,6 @@
"notifyEmails": "Envoyer également une notification par email à plusieurs adresses (bientôt).",
"seperateEmails": "Vous pouvez ajouter plusieurs adresses emails en les séparant par une virgule",
"checkFrequency": "Vérifier la fréquence",
"chooseGame": "",
"matchMethod": "Méthode de rapprochement",
"expectedValue": "Valeur attendue",
"deleteDialogTitle": "Voulez-vous vraiment supprimer ce moniteur ?",
@@ -548,7 +547,7 @@
},
"role": {
"errors": {
"min": ""
"min": "Au moins un rôle est requis"
}
}
}
@@ -573,7 +572,8 @@
"password": {
"incorrect": "Le mot de passe fourni est erroné"
}
}
},
"welcome": "Bon retour sur Checkmate !"
},
"registration": {
"heading": {
@@ -599,7 +599,8 @@
},
"toasts": {
"success": "Bienvenue ! Votre compte a été créé avec succès."
}
},
"welcome": "Bienvenue sur Checkmate !"
},
"forgotPassword": {
"heading": "Mot de passe oublié ?",
@@ -851,6 +852,10 @@
"selectDisabled": "Désactivé",
"selectEnabled": "Activé",
"title": "IP/URL du moniteur sur la page de statut"
},
"globalThresholds": {
"title": "Seuils globaux",
"description": "Configurez des seuils globaux pour le CPU, la mémoire, le disque et la température. Si une valeur est fournie, elle sera automatiquement activée pour la surveillance."
}
},
"statusPageCreate": {
@@ -876,9 +881,13 @@
"generalSettings": "Paramètres généraux",
"contents": "Contenus",
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"checks": [
"Surveillez et affichez l’état de santé de vos services en temps réel",
"Suivez plusieurs services et partagez leur statut",
"Tenez les utilisateurs informés des pannes et des performances"
],
"title": "Une page de status est utilisée pour :",
"actionButton": "Créer votre première page de status !"
}
},
"testNotificationsDisabled": "Il n'y aucune notification paramétrée pour ce moniteur. Vous pouvez en ajouter une en cliquant sur le bouton 'Configurer'",
@@ -919,57 +928,149 @@
"twentyMinutes": "20 minutes",
"oneHour": "1 heure",
"oneDay": "1 jour",
"oneWeek": "1 semaine"
"oneWeek": "1 semaine",
"fourMinutes": "4 minutes",
"oneMinute": "1 minute",
"twoMinutes": "2 minutes",
"fifteenSeconds": "15 secondes",
"thirtySeconds": "30 secondes"
},
"general": {
"noOptionsFound": ""
"noOptionsFound": "Aucune {{unit}} trouvée"
},
"infrastructureMonitor": {
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"checks": [
"Suivez les performances de vos serveurs",
"Identifiez les points de blocage et optimisez l’utilisation",
"Assurez la fiabilité grâce à la surveillance en temps réel"
],
"title": "Une surveillance d'infrastructure est utilisé pour :",
"actionButton": "Créer votre premier moniteur d'infrastructure !"
}
},
"maintenanceWindow": {
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"checks": [
"Marquez vos périodes de maintenance",
"Éliminez tout malentendu",
"Arrêtez d’envoyer des alertes pendant les fenêtres de maintenance"
],
"title": "Une fenêtre de maintenance est utilisé pour :",
"actionButton": "Créer votre première fenêtre de maintenance !"
}
},
"pageSpeed": {
"fallback": {
"checks": [""],
"checks": [
"Rapport sur l’expérience utilisateur d’une page",
"Aider à analyser la vitesse de la page web",
"Donner des suggestions sur la façon dont la page peut être améliorée"
],
"title": "",
"actionButton": ""
}
},
"uptimeMonitor": {
"fallback": {
"checks": [""],
"checks": [
"Vérifiez si les sites web ou serveurs sont en ligne et réactifs",
"Alertez les équipes en cas de panne ou de problème de performance",
"Surveillez les points de terminaison HTTP, les pings, les conteneurs et les ports",
"Suivez l’historique de la disponibilité et les tendances de fiabilité"
],
"title": "",
"actionButton": ""
}
},
"editUserPage": {
"form": {
"email": "",
"firstName": "",
"lastName": "",
"role": "",
"save": ""
"email": "Email",
"firstName": "Prénom",
"lastName": "Nom",
"role": "Rôles",
"save": "Enregistrer"
},
"table": {
"actionHeader": "",
"roleHeader": ""
"actionHeader": "Action",
"roleHeader": "Rôle"
},
"title": "",
"title": "Modifier l'utilisateur",
"toast": {
"successUserUpdate": "",
"successUserUpdate": "L'utilisateur à bien été modifié",
"validationErrors": ""
}
},
"incidentsPageActionResolveMonitor": "",
"incidentsPageActionResolveAll": ""
"incidentsPageActionResolveMonitor": "Résoudres les incidents de surveillance",
"incidentsPageActionResolveAll": "Résoudre tous les incidents",
"matchMethodOptions": {
"equal": "Égal",
"equalPlaceholder": "",
"include": "Inclure",
"includePlaceholder": "ok",
"regex": "Regex",
"regexPlaceholder": "",
"text": ""
},
"monitorType": {
"docker": {
"label": "ID du conteneur",
"namePlaceholder": "Mon conteneur",
"placeholder": "abcd1234"
},
"http": {
"label": "URL à surveiller",
"namePlaceholder": "Google",
"placeholder": "google.com"
},
"ping": {
"label": "Adresse IP à surveiller",
"namePlaceholder": "Google",
"placeholder": "1.1.1.1"
},
"port": {
"label": "URL à surveiller",
"namePlaceholder": "",
"placeholder": "localhost"
},
"game": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
}
},
"uptimeAdvancedMatching": {
"jsonPath": "Chemin JSON"
},
"bytesPerSecond": "",
"bytesReceived": "",
"bytesSent": "",
"chooseGame": "",
"createMonitorPage": {
"incidentConfigDescription": "",
"incidentConfigStatusWindowLabel": "",
"incidentConfigStatusWindowThresholdLabel": "",
"incidentConfigTitle": ""
},
"dataRate": "",
"dataReceived": "",
"dataSent": "",
"details": "",
"drops": "",
"errors": "",
"errorsIn": "",
"errorsOut": "",
"gameServerMonitoring": "",
"gameServerMonitoringDescription": "",
"network": "",
"networkDrops": "",
"networkErrors": "",
"networkInterface": "",
"noNetworkStatsAvailable": "",
"packetsPerSecond": "",
"packetsReceived": "",
"packetsReceivedRate": "",
"packetsSent": "",
"rate": "",
"selectInterface": ""
}
+85 -5
View File
@@ -264,7 +264,6 @@
"notifyEmails": "複数のアドレスにメールでも通知(近日公開)",
"seperateEmails": "複数のメールはカンマで区切ることができます",
"checkFrequency": "チェック頻度",
"chooseGame": "",
"matchMethod": "マッチ方法",
"expectedValue": "期待値",
"deleteDialogTitle": "本当にこのモニターを削除しますか?",
@@ -573,7 +572,8 @@
"password": {
"incorrect": "入力されたパスワードが記録と一致しません"
}
}
},
"welcome": ""
},
"registration": {
"heading": {
@@ -599,7 +599,8 @@
},
"toasts": {
"success": "ようこそ!アカウントが正常に作成されました。"
}
},
"welcome": ""
},
"forgotPassword": {
"heading": "パスワードを忘れましたか?",
@@ -851,6 +852,10 @@
"selectDisabled": "無効",
"selectEnabled": "有効",
"title": "ステータスページのモニターIP/URL"
},
"globalThresholds": {
"title": "",
"description": ""
}
},
"statusPageCreate": {
@@ -919,7 +924,12 @@
"twentyMinutes": "20分",
"oneHour": "1時間",
"oneDay": "1日",
"oneWeek": "1週間"
"oneWeek": "1週間",
"fourMinutes": "",
"oneMinute": "",
"twoMinutes": "",
"fifteenSeconds": "",
"thirtySeconds": ""
},
"general": {
"noOptionsFound": ""
@@ -971,5 +981,75 @@
}
},
"incidentsPageActionResolveMonitor": "",
"incidentsPageActionResolveAll": ""
"incidentsPageActionResolveAll": "",
"matchMethodOptions": {
"equal": "",
"equalPlaceholder": "",
"include": "",
"includePlaceholder": "",
"regex": "",
"regexPlaceholder": "",
"text": ""
},
"monitorType": {
"docker": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"http": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"ping": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"port": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"game": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
}
},
"uptimeAdvancedMatching": {
"jsonPath": ""
},
"bytesPerSecond": "",
"bytesReceived": "",
"bytesSent": "",
"chooseGame": "",
"createMonitorPage": {
"incidentConfigDescription": "",
"incidentConfigStatusWindowLabel": "",
"incidentConfigStatusWindowThresholdLabel": "",
"incidentConfigTitle": ""
},
"dataRate": "",
"dataReceived": "",
"dataSent": "",
"details": "",
"drops": "",
"errors": "",
"errorsIn": "",
"errorsOut": "",
"gameServerMonitoring": "",
"gameServerMonitoringDescription": "",
"network": "",
"networkDrops": "",
"networkErrors": "",
"networkInterface": "",
"noNetworkStatsAvailable": "",
"packetsPerSecond": "",
"packetsReceived": "",
"packetsReceivedRate": "",
"packetsSent": "",
"rate": "",
"selectInterface": ""
}
+400 -295
View File
@@ -84,31 +84,35 @@
"unsupportedType": "Tipo de notificação não suportado",
"networkError": "Ocorreu um erro de rede",
"fallback": {
"title": "",
"checks": [""],
"actionButton": ""
"title": "Um canal de notificação é usado para:",
"checks": [
"Alerte as equipes sobre tempo de inatividade ou problemas de desempenho",
"Informe os engenheiros sobre incidentes",
"Mantenha os administradores informados sobre as mudanças no sistema"
],
"actionButton": "Vamos criar seu primeiro canal de notificação!"
},
"createButton": "",
"createTitle": "",
"createButton": "Criar canal de notificação",
"createTitle": "Canal de notificação",
"create": {
"success": "",
"failed": ""
"success": "Notificação criada com sucesso",
"failed": "Falha ao criar notificação"
},
"fetch": {
"success": "",
"failed": ""
"success": "Notificações obtidas com sucesso",
"failed": "Falha ao buscar notificações"
},
"delete": {
"success": "",
"failed": ""
"success": "Notificação excluída com sucesso",
"failed": "Falha ao excluir a notificação"
},
"edit": {
"success": "",
"failed": ""
"success": "Notificação atualizada com sucesso",
"failed": "Falha ao atualizar a notificação"
},
"test": {
"success": "",
"failed": ""
"success": "Notificação de teste enviada com sucesso",
"failed": "Falha ao enviar notificação de teste"
}
},
"testLocale": "testLocale",
@@ -260,7 +264,6 @@
"notifyEmails": "Também notificar por e-mail para vários endereços (em breve)",
"seperateEmails": "Você pode separar vários e-mails com uma vírgula",
"checkFrequency": "Verifique a frequência",
"chooseGame": "",
"matchMethod": "Método de correspondência",
"expectedValue": "Valor esperado",
"deleteDialogTitle": "Você realmente deseja excluir este monitor?",
@@ -333,8 +336,8 @@
"validationFailed": "Falha na validação",
"noFileSelected": "Nenhum arquivo selecionado",
"fallbackPage": "Importe um arquivo para enviar uma lista de servidores em massa",
"invalidFileType": "",
"uploadFailed": ""
"invalidFileType": "Tipo de arquivo inválido",
"uploadFailed": "Falha no upload"
},
"DeleteAccountTitle": "Remover conta",
"DeleteAccountButton": "Remover conta",
@@ -401,8 +404,8 @@
"password": "Senha",
"team": "Equipe",
"logOut": "Sair",
"notifications": "",
"logs": ""
"notifications": "Notificações",
"logs": "Registros"
},
"settingsEmailUser": "Usuário de e-mail - Nome de usuário para autenticação, substitui o endereço de e-mail, se especificado",
"state": "Estado",
@@ -477,41 +480,41 @@
},
"special": {
"beginning": "Deve conter pelo menos",
"highlighted": ""
"highlighted": "um caractere especial"
},
"number": {
"beginning": "",
"highlighted": ""
"beginning": "Deve ter pelo menos",
"highlighted": "um número"
},
"uppercase": {
"beginning": "",
"highlighted": ""
"beginning": "Deve ter pelo menos",
"highlighted": "uma letra maiúscula"
},
"lowercase": {
"beginning": "",
"highlighted": ""
"beginning": "Deve ter pelo menos",
"highlighted": "uma letra minúscula"
},
"match": {
"beginning": "",
"highlighted": ""
"beginning": "Senha e confirmação de senha",
"highlighted": "devem combinar"
}
},
"errors": {
"empty": "Por favor, digite sua senha",
"length": "A senha deve ter pelo menos 8 caracteres",
"uppercase": "A senha deve conter pelo menos 1 letra maiúscula",
"lowercase": "",
"number": "",
"special": "",
"incorrect": ""
"lowercase": "Senha deve ter pelo menos uma letra minúscula",
"number": "Senha deve ter pelo menos um número",
"special": "Senha deve ter pelo menos um caractere especial",
"incorrect": "A senha que você forneceu não está registrada"
}
},
"passwordConfirm": {
"label": "",
"placeholder": "",
"label": "Confirme a senha",
"placeholder": "Informe a senha novamente para confirmar",
"errors": {
"empty": "",
"different": ""
"empty": "Por favor, informe a senha novamente para confirmação (cuidado com erros de digitação)",
"different": "As senhas informadas não combinam, então uma deve estar errada"
}
},
"firstName": {
@@ -539,12 +542,12 @@
"fields": {
"password": {
"errors": {
"incorrect": ""
"incorrect": "A senha que você forneceu não corresponde aos nossos registros"
}
},
"role": {
"errors": {
"min": ""
"min": "Pelo menos uma função é necessária"
}
}
}
@@ -558,8 +561,8 @@
"links": {
"forgotPassword": "Esqueceu sua senha?",
"register": "Não tem uma conta?",
"forgotPasswordLink": "",
"registerLink": ""
"forgotPasswordLink": "Redefinir senha",
"registerLink": "Registre-se aqui"
},
"toasts": {
"success": "Bem-vindo de volta! Você está autenticado.",
@@ -567,9 +570,10 @@
},
"errors": {
"password": {
"incorrect": ""
"incorrect": "A senha que você forneceu não corresponde aos nossos registros"
}
}
},
"welcome": ""
},
"registration": {
"heading": {
@@ -577,42 +581,43 @@
"user": "Se inscrever"
},
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": ""
"stepOne": "Informe seus dados pessoais",
"stepTwo": "Informe seu email",
"stepThree": "Crie sua senha"
},
"description": {
"superAdmin": "",
"user": ""
"superAdmin": "Crie sua conta de superadministrador para começar",
"user": "Cadastre-se como usuário e peça ao superadministrador acesso aos seus monitores"
},
"gettingStartedButton": {
"superAdmin": "",
"user": ""
"superAdmin": "Criar conta de superadministrador",
"user": "Cadastre-se como usuário normal"
},
"termsAndPolicies": "",
"termsAndPolicies": "Ao criar uma conta, você concorda com nossos <a1>Termos de Serviço</a1> e <a2>Política de Privacidade</a2>.",
"links": {
"login": ""
"login": "Já tem uma conta? <a>Entrar</a>"
},
"toasts": {
"success": ""
}
"success": "Bem-vindo! Sua conta foi criada com sucesso."
},
"welcome": ""
},
"forgotPassword": {
"heading": "",
"heading": "Esqueceu sua senha?",
"subheadings": {
"stepOne": "",
"stepTwo": "",
"stepThree": "",
"stepFour": ""
"stepOne": "Não se preocupe, enviaremos instruções de redefinição.",
"stepTwo": "Enviamos um link de redefinição de senha para <email/>",
"stepThree": "Sua nova senha deve ser diferente das senhas usadas anteriormente.",
"stepFour": "Sua senha foi redefinida com sucesso. Clique abaixo para fazer login magicamente."
},
"buttons": {
"openEmail": "",
"resetPassword": ""
"openEmail": "Abra o aplicativo de e-mail",
"resetPassword": "Redefinir senha"
},
"imageAlts": {
"passwordKey": "",
"email": "",
"lock": "",
"passwordKey": "Ícone de chave de senha",
"email": "Ícone de e-mail",
"lock": "Ícone de cadeado",
"passwordConfirm": "Ícone de confirmação de senha"
},
"links": {
@@ -620,352 +625,452 @@
"resend": "Não recebeu o email? <a>Clique para reenviar</a>"
},
"toasts": {
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"error": ""
"sent": "Instruções enviadas para <email/>.",
"emailNotFound": "E-mail não encontrado.",
"redirect": "Redirecionando em <segundos/>...",
"success": "Sua senha foi redefinida com sucesso.",
"error": "Não foi possível redefinir a senha. Tente novamente mais tarde ou entre em contato com o suporte."
}
}
},
"errorPages": {
"serverUnreachable": {
"toasts": {
"reconnected": "",
"stillUnreachable": ""
"reconnected": "Reconectado ao servidor com sucesso.",
"stillUnreachable": "O servidor ainda está inacessível. Tente novamente mais tarde."
},
"alertBox": "",
"description": "",
"alertBox": "Erro de conexão do servidor",
"description": "Não conseguimos conectar ao servidor. Verifique sua conexão com a internet ou sua configuração de implantação se o problema persistir.",
"retryButton": {
"default": "",
"processing": ""
"default": "Tentar conectar novamente",
"processing": "Conectando..."
}
}
},
"createNotifications": {
"title": "",
"title": "Criar canal de notificação",
"nameSettings": {
"title": "",
"description": "",
"nameLabel": "",
"namePlaceholder": ""
"title": "Nome",
"description": "Um nome descritivo para sua integração.",
"nameLabel": "Nome",
"namePlaceholder": "por exemplo, notificações do Slack"
},
"typeSettings": {
"title": "",
"description": "",
"typeLabel": ""
"title": "Tipo",
"description": "Selecione o tipo de canal de notificação que você deseja criar.",
"typeLabel": "Tipo"
},
"emailSettings": {
"title": "",
"description": "",
"emailLabel": "",
"emailPlaceholder": ""
"title": "E-mail",
"description": "Endereços de e-mail de destino.",
"emailLabel": "Endereço de email",
"emailPlaceholder": "por exemplo john@example.com"
},
"slackSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
"title": "Folga",
"description": "Configure seu webhook do Slack aqui",
"webhookLabel": "URL do webhook do Slack",
"webhookPlaceholder": "https://hooks.slack.com/services/..."
},
"pagerdutySettings": {
"title": "",
"description": "",
"integrationKeyLabel": "",
"integrationKeyPlaceholder": ""
"title": "PagerDuty",
"description": "Configure sua integração com o PagerDuty aqui",
"integrationKeyLabel": "Chave de integração",
"integrationKeyPlaceholder": "1234567890"
},
"discordSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
"title": "Discórdia",
"description": "Configure seu webhook do Discord aqui",
"webhookLabel": "URL do webhook do Discord",
"webhookPlaceholder": "https://seu-servidor.com/webhook"
},
"webhookSettings": {
"title": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
"title": "Webhook",
"description": "Configure seu webhook aqui",
"webhookLabel": "URL do webhook",
"webhookPlaceholder": "https://seu-servidor.com/webhook"
},
"testNotification": "",
"dialogDeleteTitle": "",
"dialogDeleteConfirm": ""
"testNotification": "Notificação de teste",
"dialogDeleteTitle": "Tem certeza de que deseja excluir esta notificação?",
"dialogDeleteConfirm": "Excluir"
},
"notificationConfig": {
"title": "",
"description": ""
"title": "Notificações",
"description": "Selecione os canais de notificação que deseja usar"
},
"monitorStatus": {
"checkingEvery": "",
"withCaptureAgent": "",
"up": "",
"down": "",
"paused": ""
"checkingEvery": "Verificando a cada {{intervalo}}",
"withCaptureAgent": "com agente de captura {{versão}}",
"up": "acima",
"down": "abaixo",
"paused": "pausado"
},
"advancedMatching": "",
"sendTestNotifications": "",
"selectAll": "",
"showAdminLoginLink": "",
"advancedMatching": "Correspondência avançada",
"sendTestNotifications": "Enviar notificações de teste",
"selectAll": "Selecionar tudo",
"showAdminLoginLink": "Mostrar o link \"Administrador? Efetue login aqui\" na página de status",
"logsPage": {
"title": "",
"description": "",
"title": "Registros",
"description": "Logs do sistema - últimas 1000 linhas",
"tabs": {
"queue": "",
"logs": "",
"diagnostics": ""
"queue": "Fila de tarefas",
"logs": "Logs do servidor",
"diagnostics": "Diagnóstico"
},
"toast": {
"fetchLogsSuccess": ""
"fetchLogsSuccess": "Logs obtidos com sucesso"
},
"logLevelSelect": {
"title": "",
"title": "Nível de log",
"values": {
"all": "",
"info": "",
"warn": "",
"error": "",
"debug": ""
"all": "Todos",
"info": "Informações",
"warn": "Avisar",
"error": "Erro",
"debug": "Depurar"
}
}
},
"queuePage": {
"title": "",
"refreshButton": "",
"flushButton": "",
"title": "Fila",
"refreshButton": "Atualizar",
"flushButton": "Fila de descarga",
"jobTable": {
"title": "",
"idHeader": "",
"urlHeader": "",
"typeHeader": "",
"activeHeader": "",
"lockedAtHeader": "",
"runCountHeader": "",
"failCountHeader": "",
"lastRunHeader": "",
"lastFinishedAtHeader": "",
"lastRunTookHeader": ""
"title": "Empregos atualmente na fila",
"idHeader": "ID do monitor",
"urlHeader": "URL",
"typeHeader": "Tipo",
"activeHeader": "Ativo",
"lockedAtHeader": "Trancado em",
"runCountHeader": "Contagem de corridas",
"failCountHeader": "Contagem de falhas",
"lastRunHeader": "Última corrida em",
"lastFinishedAtHeader": "Última conclusão em",
"lastRunTookHeader": "A última corrida aconteceu"
},
"metricsTable": {
"title": "",
"metricHeader": "",
"valueHeader": ""
"title": "Métricas de fila",
"metricHeader": "Métrica",
"valueHeader": "Valor"
},
"failedJobTable": {
"title": "",
"monitorIdHeader": "",
"monitorUrlHeader": "",
"failCountHeader": "",
"failedAtHeader": "",
"failReasonHeader": ""
"title": "Trabalhos com falha",
"monitorIdHeader": "ID do monitor",
"monitorUrlHeader": "URL do monitor",
"failCountHeader": "Contagem de falhas",
"failedAtHeader": "Última falha em",
"failReasonHeader": "Motivo da falha"
}
},
"export": {
"title": "",
"success": "",
"failed": ""
"title": "Monitores de Exportação",
"success": "Monitores exportados com sucesso!",
"failed": "Falha ao exportar monitores"
},
"monitorActions": {
"title": "",
"import": "",
"export": "",
"deleteSuccess": "",
"deleteFailed": "",
"details": ""
"title": "Exportação/Importação",
"import": "Monitores de importação",
"export": "Monitores de Exportação",
"deleteSuccess": "Monitor excluído com sucesso",
"deleteFailed": "Falha ao excluir o monitor",
"details": "Detalhes"
},
"settingsPage": {
"aboutSettings": {
"labelDevelopedBy": "",
"labelVersion": "",
"title": ""
"labelDevelopedBy": "Desenvolvido pela Bluewave Labs",
"labelVersion": "Versão",
"title": "Sobre"
},
"demoMonitorsSettings": {
"buttonAddMonitors": "",
"description": "",
"title": ""
"buttonAddMonitors": "Adicionar monitores de demonstração",
"description": "Adicione monitores de amostra para fins de demonstração.",
"title": "Monitores de demonstração"
},
"emailSettings": {
"buttonSendTestEmail": "",
"description": "",
"descriptionTransport": "",
"labelAddress": "",
"labelConnectionHost": "",
"labelHost": "",
"labelIgnoreTLS": "",
"labelPassword": "",
"labelPasswordSet": "",
"labelPool": "",
"labelPort": "",
"labelRejectUnauthorized": "",
"labelRequireTLS": "",
"labelSecure": "",
"labelTLSServername": "",
"labelUser": "",
"linkTransport": "",
"placeholderUser": "",
"title": "",
"toastEmailRequiredFieldsError": ""
"buttonSendTestEmail": "Enviar e-mail de teste",
"description": "Configure as configurações de e-mail do seu sistema. Elas são usadas para enviar notificações e alertas.",
"descriptionTransport": "Isso cria um transporte SMTP para o NodeMailer",
"labelAddress": "Endereço de e-mail - Usado para autenticação",
"labelConnectionHost": "Host de conexão de e-mail - Nome do host a ser usado na saudação HELO/EHLO",
"labelHost": "Host de e-mail - Nome do host ou endereço IP para conectar",
"labelIgnoreTLS": "Desabilitar STARTTLS: Não use TLS mesmo que o servidor suporte",
"labelPassword": "Senha de e-mail - Senha para autenticação",
"labelPasswordSet": "A senha foi definida. Clique em Redefinir para alterá-la.",
"labelPool": "Habilitar pool de conexões: Reutilize conexões existentes para melhorar o desempenho",
"labelPort": "Porta de e-mail - Porta para conectar",
"labelRejectUnauthorized": "Rejeitar certificados inválidos: rejeitar conexões com certificados autoassinados ou não confiáveis",
"labelRequireTLS": "Forçar STARTTLS: requer atualização de TLS, falha se não for suportado",
"labelSecure": "Usar SSL (recomendado): criptografar a conexão usando SSL/TLS",
"labelTLSServername": "Nome do servidor TLS - Nome do host opcional para validação TLS quando o host é um IP",
"labelUser": "Usuário de e-mail - Nome de usuário para autenticação, substitui o endereço de e-mail, se especificado",
"linkTransport": "Veja as especificações aqui",
"placeholderUser": "Deixe em branco se não for necessário",
"title": "E-mail",
"toastEmailRequiredFieldsError": "Endereço de e-mail, host, porta e senha são obrigatórios"
},
"pageSpeedSettings": {
"description": "",
"labelApiKeySet": "",
"labelApiKey": "",
"title": ""
"description": "Insira sua chave da API do Google PageSpeed para ativar o monitoramento do Google PageSpeed. Clique em Redefinir para atualizar a chave.",
"labelApiKeySet": "A chave de API está definida. Clique em Redefinir para alterá-la.",
"labelApiKey": "Chave da API do PageSpeed",
"title": "Chave da API do Google PageSpeed"
},
"saveButtonLabel": "",
"saveButtonLabel": "Salvar",
"statsSettings": {
"clearAllStatsButton": "",
"clearAllStatsDescription": "",
"clearAllStatsDialogConfirm": "",
"clearAllStatsDialogDescription": "",
"clearAllStatsDialogTitle": "",
"description": "",
"labelTTL": "",
"labelTTLOptional": "",
"title": ""
"clearAllStatsButton": "Limpar todas as estatísticas",
"clearAllStatsDescription": "Limpe todas as estatísticas. Isso é irreversível.",
"clearAllStatsDialogConfirm": "Sim, limpar todas as estatísticas",
"clearAllStatsDialogDescription": "Uma vez removido, o histórico de monitoramento e as estatísticas não podem ser recuperados.",
"clearAllStatsDialogTitle": "Você quer limpar todas as estatísticas?",
"description": "Defina por quanto tempo você deseja manter os dados históricos. Você também pode limpar todos os dados existentes.",
"labelTTL": "Os dias em que você deseja continuar monitorando o histórico.",
"labelTTLOptional": "0 para infinito",
"title": "Histórico do monitor"
},
"systemResetSettings": {
"buttonRemoveAllMonitors": "",
"description": "",
"dialogConfirm": "",
"dialogDescription": "",
"dialogTitle": "",
"title": ""
"buttonRemoveAllMonitors": "Remover todos os monitores",
"description": "Remova todos os monitores do seu sistema.",
"dialogConfirm": "Sim, remova todos os monitores",
"dialogDescription": "Uma vez removidos, os monitores não podem ser recuperados.",
"dialogTitle": "Você deseja remover todos os monitores?",
"title": "Reinicialização do sistema"
},
"timezoneSettings": {
"description": "",
"label": "",
"title": ""
"description": "Selecione o fuso horário usado para exibir datas e horas em todo o aplicativo.",
"label": "Exibir fuso horário",
"title": "Exibir fuso horário"
},
"title": "",
"title": "Configurações",
"uiSettings": {
"description": "",
"labelLanguage": "",
"labelTheme": "",
"title": ""
"description": "Alterne entre o modo claro e escuro ou altere o idioma da interface do usuário.",
"labelLanguage": "Linguagem",
"labelTheme": "Modo de tema",
"title": "Aparência"
},
"urlSettings": {
"description": "",
"label": "",
"selectDisabled": "",
"selectEnabled": "",
"title": ""
"description": "Exiba o endereço IP ou URL do monitor na página de status pública. Se estiver desabilitado, apenas o nome do monitor será exibido para proteger informações confidenciais.",
"label": "Exibir IP/URL na página de status",
"selectDisabled": "Desabilitado",
"selectEnabled": "Habilitado",
"title": "Monitorar IP/URL na página de status"
},
"globalThresholds": {
"title": "Limites Globais",
"description": "Configurar limites globais da CPU, Memória, Disco e Temperatura. Se um valor for fornecido, o monitoramento será ativado automaticamente"
}
},
"statusPageCreate": {
"buttonSave": ""
"buttonSave": "Salvar"
},
"incidentsOptionsHeaderFilterResolved": "",
"settingsSave": "",
"statusPageCreateAppearanceTitle": "",
"confirmPassword": "",
"incidentsOptionsHeaderFilterResolved": "Resolvido",
"settingsSave": "Salvar",
"statusPageCreateAppearanceTitle": "Aparência",
"confirmPassword": "Confirme sua senha",
"monitorHooks": {
"failureAddDemoMonitors": "",
"successAddDemoMonitors": ""
"failureAddDemoMonitors": "Falha ao adicionar monitores de demonstração",
"successAddDemoMonitors": "Monitores de demonstração adicionados com sucesso"
},
"settingsAppearance": "",
"settingsDisplayTimezone": "",
"settingsGeneralSettings": "",
"incidentsOptionsHeaderTotalIncidents": "",
"settingsAppearance": "Aparência",
"settingsDisplayTimezone": "Exibir fuso horário",
"settingsGeneralSettings": "Configurações gerais",
"incidentsOptionsHeaderTotalIncidents": "Total de incidentes",
"statusPage": {
"deleteSuccess": "",
"deleteFailed": "",
"createSuccess": "",
"updateSuccess": "",
"generalSettings": "",
"contents": "",
"deleteSuccess": "Página de status excluída com sucesso",
"deleteFailed": "Falha ao excluir a página de status",
"createSuccess": "Página de status criada com sucesso",
"updateSuccess": "Página de status atualizada com sucesso",
"generalSettings": "Configurações gerais",
"contents": "Conteúdo",
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"checks": [
"Monitore e exiba a integridade dos seus serviços em tempo real",
"Acompanhe vários serviços e compartilhe seus status",
"Mantenha os usuários informados sobre interrupções e desempenho"
],
"title": "Uma página de status é usada para:",
"actionButton": "Vamos criar sua primeira página de status!"
}
},
"testNotificationsDisabled": "",
"incidentsTableResolvedAt": "",
"incidentsTableActionResolve": "",
"testNotificationsDisabled": "Não há notificações configuradas para este monitor. Você precisa adicionar uma clicando no botão \"Configurar\".",
"incidentsTableResolvedAt": "Resolvido em",
"incidentsTableActionResolve": "Resolver",
"checkHooks": {
"failureResolveOne": "",
"failureResolveAll": "",
"failureResolveMonitor": ""
"failureResolveOne": "Falha ao resolver o incidente.",
"failureResolveAll": "Falha ao resolver todos os incidentes.",
"failureResolveMonitor": "Falha ao resolver incidentes do monitor."
},
"checkFormError": "",
"checkFormError": "Verifique se há erros no formulário.",
"diagnosticsPage": {
"diagnosticDescription": "",
"statsDescription": "",
"diagnosticDescription": "Diagnóstico do sistema",
"statsDescription": "Estatísticas do sistema",
"gauges": {
"heapAllocationTitle": "",
"heapAllocationSubtitle": "",
"heapUsageTitle": "",
"heapUsageSubtitle": "",
"heapUtilizationTitle": "",
"heapUtilizationSubtitle": "",
"instantCpuUsageTitle": "",
"instantCpuUsageSubtitle": ""
"heapAllocationTitle": "Alocação de heap",
"heapAllocationSubtitle": "% de memória disponível",
"heapUsageTitle": "Uso de heap",
"heapUsageSubtitle": "% de memória disponível",
"heapUtilizationTitle": "Utilização de heap",
"heapUtilizationSubtitle": "% do alocado",
"instantCpuUsageTitle": "Uso instantâneo da CPU",
"instantCpuUsageSubtitle": "% de 1s usados pela CPU"
},
"stats": {
"eventLoopDelayTitle": "",
"uptimeTitle": "",
"usedHeapSizeTitle": "",
"totalHeapSizeTitle": "",
"osMemoryLimitTitle": ""
"eventLoopDelayTitle": "Atraso do loop de eventos",
"uptimeTitle": "Tempo de atividade",
"usedHeapSizeTitle": "Tamanho de heap usado",
"totalHeapSizeTitle": "Tamanho total do heap",
"osMemoryLimitTitle": "Limite de memória do sistema operacional"
}
},
"pageSpeedLighthouseAPI": "",
"pageSpeedLighthouseAPI": "Use a API Lighthouse PageSpeed para monitorar seu site",
"time": {
"threeMinutes": "",
"fiveMinutes": "",
"tenMinutes": "",
"twentyMinutes": "",
"oneHour": "",
"oneDay": "",
"oneWeek": ""
"threeMinutes": "3 minutos",
"fiveMinutes": "5 minutos",
"tenMinutes": "10 minutos",
"twentyMinutes": "20 minutos",
"oneHour": "1 hora",
"oneDay": "1 dia",
"oneWeek": "1 semana",
"fourMinutes": "4 minutos",
"oneMinute": "1 minuto",
"twoMinutes": "2 minutos",
"fifteenSeconds": "",
"thirtySeconds": ""
},
"general": {
"noOptionsFound": ""
"noOptionsFound": "Nenhuma {{unidade}} encontrada"
},
"infrastructureMonitor": {
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"checks": [
"Acompanhe o desempenho dos seus servidores",
"Identifique gargalos e otimize o uso",
"Garanta a confiabilidade com monitoramento em tempo real"
],
"title": "Um monitor de infraestrutura é usado para:",
"actionButton": "Vamos criar seu primeiro monitor de infraestrutura!"
}
},
"maintenanceWindow": {
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"checks": [
"Marque seus períodos de manutenção",
"Elimine qualquer mal-entendido",
"Pare de enviar alertas em janelas de manutenção"
],
"title": "Uma janela de manutenção é usada para:",
"actionButton": "Vamos criar sua primeira janela de manutenção!"
}
},
"pageSpeed": {
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"checks": [
"Relatar a experiência do usuário em uma página",
"Ajudar a analisar a velocidade da página",
"Dar sugestões sobre como a página pode ser melhorada"
],
"title": "Um monitor PageSpeed é usado para:",
"actionButton": "Vamos criar seu primeiro monitor PageSpeed!"
}
},
"uptimeMonitor": {
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"checks": [
"Verifique se sites ou servidores estão online e responsivos",
"Alerte as equipes sobre tempo de inatividade ou problemas de desempenho",
"Monitore endpoints HTTP, pings, contêineres e portas",
"Acompanhe o histórico de tempo de atividade e tendências de confiabilidade"
],
"title": "Um monitor de tempo de atividade é usado para:",
"actionButton": "Vamos criar seu primeiro monitor de tempo de atividade!"
}
},
"editUserPage": {
"form": {
"email": "",
"firstName": "",
"lastName": "",
"role": "",
"save": ""
"email": "E-mail",
"firstName": "Primeiro nome",
"lastName": "Sobrenome",
"role": "Funções",
"save": "Salvar"
},
"table": {
"actionHeader": "",
"roleHeader": ""
"actionHeader": "Ação",
"roleHeader": "Papel"
},
"title": "",
"title": "Editar usuário",
"toast": {
"successUserUpdate": "",
"validationErrors": ""
"successUserUpdate": "Usuário atualizado com sucesso",
"validationErrors": "Erros de validação"
}
},
"incidentsPageActionResolveMonitor": "",
"incidentsPageActionResolveAll": ""
"incidentsPageActionResolveMonitor": "Resolver incidentes de monitoramento",
"incidentsPageActionResolveAll": "Resolver todos os incidentes",
"matchMethodOptions": {
"equal": "",
"equalPlaceholder": "",
"include": "",
"includePlaceholder": "",
"regex": "Regex",
"regexPlaceholder": "",
"text": ""
},
"monitorType": {
"docker": {
"label": "",
"namePlaceholder": "Meu Contêiner",
"placeholder": "abcd1234"
},
"http": {
"label": "URL para monitorar",
"namePlaceholder": "Google",
"placeholder": "google.com"
},
"ping": {
"label": "Endereço IP para monitorar",
"namePlaceholder": "Google",
"placeholder": "1.1.1.1"
},
"port": {
"label": "URL para monitorar",
"namePlaceholder": "Localhost:5173",
"placeholder": "localhost"
},
"game": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
}
},
"uptimeAdvancedMatching": {
"jsonPath": ""
},
"bytesPerSecond": "",
"bytesReceived": "",
"bytesSent": "",
"chooseGame": "",
"createMonitorPage": {
"incidentConfigDescription": "",
"incidentConfigStatusWindowLabel": "",
"incidentConfigStatusWindowThresholdLabel": "",
"incidentConfigTitle": ""
},
"dataRate": "",
"dataReceived": "",
"dataSent": "",
"details": "",
"drops": "",
"errors": "",
"errorsIn": "",
"errorsOut": "",
"gameServerMonitoring": "",
"gameServerMonitoringDescription": "",
"network": "",
"networkDrops": "",
"networkErrors": "",
"networkInterface": "",
"noNetworkStatsAvailable": "",
"packetsPerSecond": "",
"packetsReceived": "",
"packetsReceivedRate": "",
"packetsSent": "",
"rate": "",
"selectInterface": ""
}
+100 -20
View File
@@ -260,7 +260,6 @@
"notifyEmails": "Также уведомлять по электронной почте на несколько адресов (скоро)",
"seperateEmails": "Вы можете разделить несколько адресов электронной почты запятой.",
"checkFrequency": "Проверить частоту",
"chooseGame": "",
"matchMethod": "Метод сопоставления",
"expectedValue": "Ожидаемое значение",
"deleteDialogTitle": "Вы действительно хотите удалить этот монитор?",
@@ -427,7 +426,7 @@
"settingsTestEmailSuccess": "",
"settingsTestEmailFailed": "",
"settingsTestEmailFailedWithReason": "",
"settingsTestEmailUnknownError": "",
"settingsTestEmailUnknownError": "Неизвестная ошибка",
"statusMsg": {
"paused": "",
"up": "",
@@ -450,46 +449,46 @@
"toasts": {
"networkError": "",
"checkConnection": "",
"unknownError": ""
"unknownError": "Неизвестная ошибка"
}
},
"auth": {
"common": {
"navigation": {
"continue": "",
"back": ""
"back": "Назад"
},
"inputs": {
"email": {
"label": "",
"placeholder": "",
"errors": {
"empty": "",
"empty": "Для продолжения введите свой адрес электронной почты",
"invalid": ""
}
},
"password": {
"label": "",
"label": "Пароль",
"rules": {
"length": {
"beginning": "",
"highlighted": ""
"beginning": "Должен быть как минимум",
"highlighted": "8 символов в длину"
},
"special": {
"beginning": "",
"highlighted": ""
"beginning": "Должен содержать как минимум",
"highlighted": "один спецсимвол"
},
"number": {
"beginning": "",
"highlighted": ""
"beginning": "Должен содержать как минимум",
"highlighted": "одно число"
},
"uppercase": {
"beginning": "",
"highlighted": ""
"beginning": "Должен содержать как минимум",
"highlighted": "одну заглавную букву"
},
"lowercase": {
"beginning": "",
"highlighted": ""
"beginning": "Должен содержать как минимум",
"highlighted": "одну прописную букву"
},
"match": {
"beginning": "",
@@ -569,7 +568,8 @@
"password": {
"incorrect": ""
}
}
},
"welcome": ""
},
"registration": {
"heading": {
@@ -595,7 +595,8 @@
},
"toasts": {
"success": ""
}
},
"welcome": ""
},
"forgotPassword": {
"heading": "",
@@ -847,6 +848,10 @@
"selectDisabled": "",
"selectEnabled": "",
"title": ""
},
"globalThresholds": {
"title": "",
"description": ""
}
},
"statusPageCreate": {
@@ -915,7 +920,12 @@
"twentyMinutes": "",
"oneHour": "",
"oneDay": "",
"oneWeek": ""
"oneWeek": "",
"fourMinutes": "",
"oneMinute": "",
"twoMinutes": "",
"fifteenSeconds": "",
"thirtySeconds": ""
},
"general": {
"noOptionsFound": ""
@@ -967,5 +977,75 @@
}
},
"incidentsPageActionResolveMonitor": "",
"incidentsPageActionResolveAll": ""
"incidentsPageActionResolveAll": "",
"matchMethodOptions": {
"equal": "",
"equalPlaceholder": "",
"include": "",
"includePlaceholder": "",
"regex": "",
"regexPlaceholder": "",
"text": ""
},
"monitorType": {
"docker": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"http": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"ping": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"port": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"game": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
}
},
"uptimeAdvancedMatching": {
"jsonPath": ""
},
"bytesPerSecond": "",
"bytesReceived": "",
"bytesSent": "",
"chooseGame": "",
"createMonitorPage": {
"incidentConfigDescription": "",
"incidentConfigStatusWindowLabel": "",
"incidentConfigStatusWindowThresholdLabel": "",
"incidentConfigTitle": ""
},
"dataRate": "",
"dataReceived": "",
"dataSent": "",
"details": "",
"drops": "",
"errors": "",
"errorsIn": "",
"errorsOut": "",
"gameServerMonitoring": "",
"gameServerMonitoringDescription": "",
"network": "",
"networkDrops": "",
"networkErrors": "",
"networkInterface": "",
"noNetworkStatsAvailable": "",
"packetsPerSecond": "",
"packetsReceived": "",
"packetsReceivedRate": "",
"packetsSent": "",
"rate": "",
"selectInterface": ""
}
+85 -5
View File
@@ -260,7 +260,6 @@
"notifyEmails": "Ayrıca birden fazla eposta adresine bildirim gönderebilirsiniz (yakında geliyor)",
"seperateEmails": "Birden fazla epostayı virgülle ayırabilirsiniz",
"checkFrequency": "Frekansı denetle",
"chooseGame": "Oyun seç",
"matchMethod": "Eşleşme yöntemi",
"expectedValue": "Beklenen değer",
"deleteDialogTitle": "Gerçekten bu monitörü silmek istiyor musunuz?",
@@ -569,7 +568,8 @@
"password": {
"incorrect": "Giriş yaptığınız parola sistemdekiyle uyuşmuyor"
}
}
},
"welcome": ""
},
"registration": {
"heading": {
@@ -595,7 +595,8 @@
},
"toasts": {
"success": "Hoşgeldiniz! Hesabınız başarıyla oluşturuldu."
}
},
"welcome": ""
},
"forgotPassword": {
"heading": "Parolanızı mı kaybettiniz?",
@@ -847,6 +848,10 @@
"selectDisabled": "Kapalı",
"selectEnabled": "Etkin",
"title": ""
},
"globalThresholds": {
"title": "",
"description": ""
}
},
"statusPageCreate": {
@@ -915,7 +920,12 @@
"twentyMinutes": "",
"oneHour": "1 saat",
"oneDay": "1 gün",
"oneWeek": "1 hafta"
"oneWeek": "1 hafta",
"fourMinutes": "",
"oneMinute": "",
"twoMinutes": "",
"fifteenSeconds": "",
"thirtySeconds": ""
},
"general": {
"noOptionsFound": ""
@@ -967,5 +977,75 @@
}
},
"incidentsPageActionResolveMonitor": "",
"incidentsPageActionResolveAll": ""
"incidentsPageActionResolveAll": "",
"matchMethodOptions": {
"equal": "",
"equalPlaceholder": "",
"include": "",
"includePlaceholder": "",
"regex": "",
"regexPlaceholder": "",
"text": ""
},
"monitorType": {
"docker": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"http": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"ping": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"port": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"game": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
}
},
"uptimeAdvancedMatching": {
"jsonPath": ""
},
"bytesPerSecond": "",
"bytesReceived": "",
"bytesSent": "",
"chooseGame": "",
"createMonitorPage": {
"incidentConfigDescription": "",
"incidentConfigStatusWindowLabel": "",
"incidentConfigStatusWindowThresholdLabel": "",
"incidentConfigTitle": ""
},
"dataRate": "",
"dataReceived": "",
"dataSent": "",
"details": "",
"drops": "",
"errors": "",
"errorsIn": "",
"errorsOut": "",
"gameServerMonitoring": "",
"gameServerMonitoringDescription": "",
"network": "",
"networkDrops": "",
"networkErrors": "",
"networkInterface": "",
"noNetworkStatsAvailable": "",
"packetsPerSecond": "",
"packetsReceived": "",
"packetsReceivedRate": "",
"packetsSent": "",
"rate": "",
"selectInterface": ""
}
+284 -200
View File
@@ -3,81 +3,81 @@
"title": "名稱",
"distributedStatusHeaderText": "實時、真實設備覆蓋",
"distributedStatusSubHeaderText": "由全球數百萬個設備提供支持,您可以按全球區域、國家或城市查看系統效能",
"settingsDisabled": "",
"settingsSuccessSaved": "",
"settingsFailedToSave": "",
"settingsStatsCleared": "",
"settingsFailedToClearStats": "",
"settingsMonitorsDeleted": "",
"settingsFailedToDeleteMonitors": "",
"starPromptTitle": "",
"starPromptDescription": "",
"https": "",
"http": "",
"monitor": "",
"aboutus": "",
"now": "",
"delete": "",
"configure": "",
"responseTime": "",
"ms": "",
"bar": "",
"area": "",
"country": "",
"city": "",
"response": "",
"settingsDisabled": "已停用",
"settingsSuccessSaved": "設定已成功儲存",
"settingsFailedToSave": "無法儲存設定",
"settingsStatsCleared": "統計數據已成功清除",
"settingsFailedToClearStats": "無法清除統計數據",
"settingsMonitorsDeleted": "已成功刪除所有監視器",
"settingsFailedToDeleteMonitors": "無法刪除所有監視器",
"starPromptTitle": "星標Checkmate",
"starPromptDescription": "查看最新版本發布及在 GitHub 上幫助社區成長",
"https": "HTTPS",
"http": "HTTP",
"monitor": "監控",
"aboutus": "關於我們",
"now": "現在",
"delete": "刪除",
"configure": "設定",
"responseTime": "回應時間",
"ms": "毫秒",
"bar": "條",
"area": "區域",
"country": "國家",
"city": "城市",
"response": "回應",
"monitorStatusUp": "",
"monitorStatusDown": "",
"webhookSendSuccess": "",
"webhookSendSuccess": "Webhook 通知發送成功",
"webhookSendError": "",
"webhookUnsupportedPlatform": "",
"distributedRightCategoryTitle": "",
"distributedStatusServerMonitors": "",
"distributedStatusServerMonitorsDescription": "",
"distributedUptimeCreateSelectURL": "",
"distributedUptimeCreateChecks": "",
"distributedUptimeCreateChecksDescription": "",
"distributedUptimeCreateIncidentNotification": "",
"distributedUptimeCreateIncidentDescription": "",
"distributedUptimeCreateAdvancedSettings": "",
"distributedUptimeDetailsNoMonitorHistory": "",
"distributedUptimeDetailsStatusHeaderUptime": "",
"distributedUptimeDetailsStatusHeaderLastUpdate": "",
"webhookUnsupportedPlatform": "不支援的平台: {platform}",
"distributedRightCategoryTitle": "監控",
"distributedStatusServerMonitors": "伺服器監控",
"distributedStatusServerMonitorsDescription": "監控相關伺服器狀態",
"distributedUptimeCreateSelectURL": "你可以在這裡選擇主機的 URL,同時選擇監視器類型。",
"distributedUptimeCreateChecks": "要執行的檢查項目",
"distributedUptimeCreateChecksDescription": "你可以在新增網站後,隨時新增或移除檢查項目。",
"distributedUptimeCreateIncidentNotification": "事故通知",
"distributedUptimeCreateIncidentDescription": "事故發生時,向用戶發送通知。",
"distributedUptimeCreateAdvancedSettings": "進階設定",
"distributedUptimeDetailsNoMonitorHistory": "此監控尚無檢查記錄。",
"distributedUptimeDetailsStatusHeaderUptime": "正常運行時間:",
"distributedUptimeDetailsStatusHeaderLastUpdate": "最後更新",
"notifications": {
"enableNotifications": "",
"testNotification": "",
"addOrEditNotifications": "",
"testNotification": "測試通知",
"addOrEditNotifications": "新增或編輯通知",
"slack": {
"label": "",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": "",
"webhookRequired": ""
"label": "Slack",
"description": "要啟用 Slack 通知,請建立一個 Slack 應用程式並啟用傳入 Webhook。完成後,請在此提供 Webhook URL 即可。",
"webhookLabel": "Webhook URL",
"webhookPlaceholder": "https://hooks.slack.com/services/...",
"webhookRequired": "Slack webhook URL is required"
},
"discord": {
"label": "",
"label": "Discord",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": "",
"webhookLabel": "Discord Webhook URL",
"webhookPlaceholder": "https://discord.com/api/webhooks/...",
"webhookRequired": ""
},
"telegram": {
"label": "",
"description": "",
"tokenLabel": "",
"tokenPlaceholder": "",
"chatIdLabel": "",
"chatIdPlaceholder": "",
"label": "Telegram",
"description": "要啟用 Telegram 通知,請使用 BotFather 用於創建和管理 Telegram 的官方機器來建立一個 Telegram 機器人。接著,取得 API 金鑰和聊天室 ID,並在此處填寫。",
"tokenLabel": "你的機器人金鑰",
"tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
"chatIdLabel": "你的聊天 ID",
"chatIdPlaceholder": "-1001234567890",
"fieldsRequired": ""
},
"webhook": {
"label": "",
"description": "",
"urlLabel": "",
"urlPlaceholder": "",
"label": "Webhooks",
"description": "你可以設定自訂 webhook,在事件發生時接收通知。",
"urlLabel": "Webhook URL",
"urlPlaceholder": "https://your-server.com/webhook",
"urlRequired": ""
},
"testNotificationDevelop": "",
"testNotificationDevelop": "測試通知 2",
"integrationButton": "",
"testSuccess": "",
"testFailed": "",
@@ -85,8 +85,12 @@
"networkError": "",
"fallback": {
"title": "",
"checks": [""],
"actionButton": ""
"checks": [
"提醒團隊有關停機或性能問題",
"讓工程師知道事件發生時的情況",
"讓管理員了解系統變更情況"
],
"actionButton": "讓我們建立您的第一個通知頻道!"
},
"createButton": "",
"createTitle": "",
@@ -111,35 +115,35 @@
"failed": ""
}
},
"testLocale": "",
"add": "",
"testLocale": "測試語言環境",
"add": "新增",
"monitors": "",
"distributedUptimeStatusCreateStatusPage": "",
"distributedUptimeStatusCreateStatusPageAccess": "",
"distributedUptimeStatusCreateStatusPageReady": "",
"distributedUptimeStatusBasicInfoHeader": "",
"distributedUptimeStatusBasicInfoHeader": "基本資料",
"distributedUptimeStatusBasicInfoDescription": "",
"distributedUptimeStatusLogoHeader": "",
"distributedUptimeStatusLogoHeader": "標誌",
"distributedUptimeStatusLogoDescription": "",
"distributedUptimeStatusLogoUploadButton": "",
"distributedUptimeStatusLogoUploadButton": "上傳標誌",
"distributedUptimeStatusStandardMonitorsHeader": "",
"distributedUptimeStatusStandardMonitorsDescription": "",
"distributedUptimeStatusCreateYour": "",
"distributedUptimeStatusEditYour": "",
"distributedUptimeStatusPublishedLabel": "",
"distributedUptimeStatusCompanyNameLabel": "",
"distributedUptimeStatusCompanyNameLabel": "公司名稱",
"distributedUptimeStatusPageAddressLabel": "",
"distributedUptimeStatus30Days": "",
"distributedUptimeStatus60Days": "",
"distributedUptimeStatus90Days": "",
"distributedUptimeStatus30Days": "30日",
"distributedUptimeStatus60Days": "60日",
"distributedUptimeStatus90Days": "90日",
"distributedUptimeStatusPageNotSetUp": "",
"distributedUptimeStatusContactAdmin": "",
"distributedUptimeStatusPageNotPublic": "",
"distributedUptimeStatusPageDeleteDialog": "",
"distributedUptimeStatusPageDeleteConfirm": "",
"distributedUptimeStatusPageDeleteDescription": "",
"distributedUptimeStatusDevices": "",
"distributedUptimeStatusUpt": "",
"distributedUptimeStatusDevices": "設備",
"distributedUptimeStatusUpt": "UPT",
"distributedUptimeStatusUptBurned": "",
"distributedUptimeStatusUptLogo": "",
"incidentsTableNoIncidents": "",
@@ -169,53 +173,53 @@
"infrastructureServerUrlLabel": "",
"infrastructureDisplayNameLabel": "",
"infrastructureAuthorizationSecretLabel": "",
"gb": "",
"mb": "",
"mem": "",
"gb": "GB",
"mb": "MB",
"mem": "Mem",
"memoryUsage": "",
"cpu": "",
"cpuUsage": "",
"cpuTemperature": "",
"cpu": "CPU",
"cpuUsage": "CPU 使用量",
"cpuTemperature": "CPU 溫度",
"diskUsage": "",
"used": "",
"total": "",
"cores": "",
"cores": "核",
"frequency": "",
"status": "",
"cpuPhysical": "",
"cpuLogical": "",
"cpuFrequency": "",
"avgCpuTemperature": "",
"cpuPhysical": "CPU (實體核心)",
"cpuLogical": "CPU (邏輯核心)",
"cpuFrequency": "CPU 頻率",
"avgCpuTemperature": "平均 CPU 溫度",
"memory": "",
"disk": "",
"uptime": "",
"os": "",
"os": "OS",
"host": "",
"actions": "",
"actions": "行動",
"integrations": "",
"integrationsPrism": "",
"integrationsSlack": "",
"integrationsSlack": "Slack",
"integrationsSlackInfo": "",
"integrationsDiscord": "",
"integrationsDiscordInfo": "",
"integrationsZapier": "",
"integrationsZapierInfo": "",
"commonSave": "",
"commonSave": "儲存",
"createYour": "",
"createMonitor": "",
"pause": "",
"resume": "",
"editing": "",
"url": "",
"access": "",
"timezone": "",
"url": "UR:",
"access": "存取",
"timezone": "時區",
"features": "",
"administrator": "",
"administrator": "系統管理員?",
"loginHere": "",
"displayName": "",
"urlMonitor": "",
"portToMonitor": "",
"websiteMonitoring": "",
"websiteMonitoring": "網站監控",
"websiteMonitoringDescription": "",
"pingMonitoring": "",
"pingMonitoringDescription": "",
@@ -232,15 +236,15 @@
"maintenanceRepeat": "",
"maintenance": "",
"duration": "",
"addMonitors": "",
"addMonitors": "新增監視器",
"window": "",
"cancel": "",
"cancel": "取消",
"message": "",
"low": "",
"high": "",
"low": "低",
"high": "高",
"statusCode": "",
"date&Time": "",
"type": "",
"date&Time": "日期與時間",
"type": "類型",
"statusPageName": "",
"publicURL": "",
"repeat": "",
@@ -259,21 +263,20 @@
"notifySMS": "",
"notifyEmails": "",
"seperateEmails": "",
"checkFrequency": "",
"chooseGame": "",
"checkFrequency": "檢查頻率",
"matchMethod": "",
"expectedValue": "",
"deleteDialogTitle": "",
"deleteDialogDescription": "",
"deleteDialogTitle": "您確定要刪除此監視器嗎?",
"deleteDialogDescription": "一旦刪除,該監視器無法恢復。",
"pageSpeedMonitor": "",
"shown": "",
"ago": "",
"companyName": "",
"companyName": "公司名稱",
"pageSpeedDetailsPerformanceReport": "",
"pageSpeedDetailsPerformanceReportCalculator": "",
"checkingEvery": "",
"statusPageCreateSettings": "",
"basicInformation": "",
"basicInformation": "基本資料",
"statusPageCreateBasicInfoDescription": "",
"statusPageCreateSelectTimeZoneDescription": "",
"statusPageCreateAppearanceDescription": "",
@@ -307,24 +310,24 @@
"pageSpeedWarning": "",
"pageSpeedLearnMoreLink": "",
"pageSpeedAddApiKey": "",
"update": "",
"update": "更新",
"invalidFileFormat": "",
"invalidFileSize": "",
"ClickUpload": "",
"ClickUpload": "點擊上傳",
"DragandDrop": "",
"MaxSize": "",
"SupportedFormats": "",
"FirstName": "",
"LastName": "",
"EmailDescriptionText": "",
"YourPhoto": "",
"YourPhoto": "頭像",
"PhotoDescriptionText": "",
"save": "",
"DeleteDescriptionText": "",
"DeleteAccountWarning": "",
"DeleteDescriptionText": "這將刪除帳號以及所有相關的伺服器資料,此操作不可逆轉。",
"DeleteAccountWarning": "刪除您的帳號表示您將無法再次登入,且所有資料都會被移除。此操作不可逆轉。",
"DeleteWarningTitle": "",
"bulkImport": {
"title": "",
"title": "批量匯入",
"selectFileTips": "",
"selectFileDescription": "",
"selectFile": "",
@@ -336,8 +339,8 @@
"invalidFileType": "",
"uploadFailed": ""
},
"DeleteAccountTitle": "",
"DeleteAccountButton": "",
"DeleteAccountTitle": "刪除帳戶",
"DeleteAccountButton": "刪除帳戶",
"publicLink": "",
"maskedPageSpeedKeyPlaceholder": "",
"reset": "",
@@ -352,14 +355,14 @@
},
"roles": {
"superAdmin": "",
"admin": "",
"admin": "管理員",
"teamMember": "",
"demoUser": ""
"demoUser": "示範用戶"
},
"teamPanel": {
"teamMembers": "",
"filter": {
"all": "",
"all": "全部",
"member": ""
},
"inviteTeamMember": "",
@@ -368,7 +371,7 @@
"email": "",
"selectRole": "",
"inviteLink": "",
"cancel": "",
"cancel": "取消",
"noMembers": "",
"getToken": "",
"emailToken": "",
@@ -382,7 +385,7 @@
"monitorState": {
"paused": "",
"resumed": "",
"active": ""
"active": "啟用中"
},
"menu": {
"uptime": "",
@@ -396,7 +399,7 @@
"support": "",
"discussions": "",
"docs": "",
"changelog": "",
"changelog": "版本變更記錄",
"profile": "",
"password": "",
"team": "",
@@ -408,17 +411,17 @@
"state": "",
"statusBreadCrumbsStatusPages": "",
"statusBreadCrumbsDetails": "",
"commonSaving": "",
"commonSaving": "儲存中...",
"navControls": "",
"incidentsPageTitle": "",
"passwordPanel": {
"passwordChangedSuccess": "",
"passwordInputIncorrect": "",
"currentPassword": "",
"currentPassword": "當前密碼",
"enterCurrentPassword": "",
"newPassword": "",
"enterNewPassword": "",
"confirmNewPassword": "",
"confirmNewPassword": "確認新密碼",
"passwordRequirements": "",
"saving": ""
},
@@ -442,22 +445,22 @@
"game": ""
},
"common": {
"appName": "",
"appName": "Checkmate",
"monitoringAgentName": "",
"buttons": {
"toggleTheme": ""
},
"toasts": {
"networkError": "",
"checkConnection": "",
"checkConnection": "請檢查您的連線",
"unknownError": ""
}
},
"auth": {
"common": {
"navigation": {
"continue": "",
"back": ""
"continue": "繼續",
"back": "返回"
},
"inputs": {
"email": {
@@ -472,23 +475,23 @@
"label": "",
"rules": {
"length": {
"beginning": "",
"beginning": "必須至少",
"highlighted": ""
},
"special": {
"beginning": "",
"beginning": "必須至少包含",
"highlighted": ""
},
"number": {
"beginning": "",
"beginning": "必須至少包含",
"highlighted": ""
},
"uppercase": {
"beginning": "",
"beginning": "必須至少包含",
"highlighted": ""
},
"lowercase": {
"beginning": "",
"beginning": "必須至少包含",
"highlighted": ""
},
"match": {
@@ -562,14 +565,15 @@
"registerLink": ""
},
"toasts": {
"success": "",
"success": "歡迎回來!您已成功登入。",
"incorrectPassword": ""
},
"errors": {
"password": {
"incorrect": ""
}
}
},
"welcome": ""
},
"registration": {
"heading": {
@@ -594,8 +598,9 @@
"login": ""
},
"toasts": {
"success": ""
}
"success": "歡迎!您的帳號已成功建立。"
},
"welcome": ""
},
"forgotPassword": {
"heading": "",
@@ -623,7 +628,7 @@
"sent": "",
"emailNotFound": "",
"redirect": "",
"success": "",
"success": "您的密碼已成功重設。",
"error": ""
}
}
@@ -634,10 +639,10 @@
"reconnected": "",
"stillUnreachable": ""
},
"alertBox": "",
"description": "",
"alertBox": "伺服器連線錯誤",
"description": "我們無法連接到伺服器。請檢查您的網路連線,若問題持續,請確認您的部署設定是否正確。",
"retryButton": {
"default": "",
"default": "重新嘗試連線",
"processing": ""
}
}
@@ -645,42 +650,42 @@
"createNotifications": {
"title": "",
"nameSettings": {
"title": "",
"description": "",
"title": "姓名",
"description": "為您的整合設定描述名稱。",
"nameLabel": "",
"namePlaceholder": ""
},
"typeSettings": {
"title": "",
"description": "",
"typeLabel": ""
"title": "類型",
"description": "請選擇您想要建立的通知頻道類型。",
"typeLabel": "類型"
},
"emailSettings": {
"title": "",
"description": "",
"title": "電郵",
"description": "目的地電子郵件位址。",
"emailLabel": "",
"emailPlaceholder": ""
},
"slackSettings": {
"title": "",
"description": "",
"title": "Slack",
"description": "在此配置您的 Slack webhook",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"pagerdutySettings": {
"title": "",
"description": "",
"title": "PagerDuty",
"description": "在此配置您的 PagerDuty 整合",
"integrationKeyLabel": "",
"integrationKeyPlaceholder": ""
},
"discordSettings": {
"title": "",
"description": "",
"title": "Discord",
"description": "在此配置您的 Discord webhook",
"webhookLabel": "",
"webhookPlaceholder": ""
},
"webhookSettings": {
"title": "",
"title": "Webhook",
"description": "",
"webhookLabel": "",
"webhookPlaceholder": ""
@@ -690,8 +695,8 @@
"dialogDeleteConfirm": ""
},
"notificationConfig": {
"title": "",
"description": ""
"title": "通知",
"description": "請選擇您想要使用的通知頻道"
},
"monitorStatus": {
"checkingEvery": "",
@@ -700,7 +705,7 @@
"down": "",
"paused": ""
},
"advancedMatching": "",
"advancedMatching": "進階匹配",
"sendTestNotifications": "",
"selectAll": "",
"showAdminLoginLink": "",
@@ -718,11 +723,11 @@
"logLevelSelect": {
"title": "",
"values": {
"all": "",
"all": "全部",
"info": "",
"warn": "",
"error": "",
"debug": ""
"debug": "除錯"
}
}
},
@@ -734,8 +739,8 @@
"title": "",
"idHeader": "",
"urlHeader": "",
"typeHeader": "",
"activeHeader": "",
"typeHeader": "類型",
"activeHeader": "啟用中",
"lockedAtHeader": "",
"runCountHeader": "",
"failCountHeader": "",
@@ -774,7 +779,7 @@
"aboutSettings": {
"labelDevelopedBy": "",
"labelVersion": "",
"title": ""
"title": "關於"
},
"demoMonitorsSettings": {
"buttonAddMonitors": "",
@@ -782,7 +787,7 @@
"title": ""
},
"emailSettings": {
"buttonSendTestEmail": "",
"buttonSendTestEmail": "發送測試電子郵件",
"description": "",
"descriptionTransport": "",
"labelAddress": "",
@@ -800,25 +805,25 @@
"labelUser": "",
"linkTransport": "",
"placeholderUser": "",
"title": "",
"title": "電郵",
"toastEmailRequiredFieldsError": ""
},
"pageSpeedSettings": {
"description": "",
"labelApiKeySet": "",
"labelApiKey": "",
"title": ""
"title": "Google PageSpeed API 金鑰"
},
"saveButtonLabel": "",
"statsSettings": {
"clearAllStatsButton": "",
"clearAllStatsDescription": "",
"clearAllStatsDialogConfirm": "",
"clearAllStatsDialogDescription": "",
"clearAllStatsDialogTitle": "",
"clearAllStatsButton": "清除所有統計數據",
"clearAllStatsDescription": "清除所有統計數據,此操作不可逆轉。",
"clearAllStatsDialogConfirm": "是,請清除所有統計數據",
"clearAllStatsDialogDescription": "一旦刪除,監控歷史和統計數據將無法復原。",
"clearAllStatsDialogTitle": "您是否要清除所有統計數據?",
"description": "",
"labelTTL": "",
"labelTTLOptional": "",
"labelTTLOptional": "0 表示無限",
"title": ""
},
"systemResetSettings": {
@@ -827,19 +832,19 @@
"dialogConfirm": "",
"dialogDescription": "",
"dialogTitle": "",
"title": ""
"title": "系統重設"
},
"timezoneSettings": {
"description": "",
"label": "",
"title": ""
"title": "顯示時區"
},
"title": "",
"title": "設定",
"uiSettings": {
"description": "",
"labelLanguage": "",
"labelTheme": "",
"title": ""
"title": "外觀"
},
"urlSettings": {
"description": "",
@@ -847,15 +852,19 @@
"selectDisabled": "",
"selectEnabled": "",
"title": ""
},
"globalThresholds": {
"title": "",
"description": ""
}
},
"statusPageCreate": {
"buttonSave": ""
"buttonSave": "儲存"
},
"incidentsOptionsHeaderFilterResolved": "",
"settingsSave": "",
"statusPageCreateAppearanceTitle": "",
"confirmPassword": "",
"confirmPassword": "確認密碼",
"monitorHooks": {
"failureAddDemoMonitors": "",
"successAddDemoMonitors": ""
@@ -866,15 +875,15 @@
"incidentsOptionsHeaderTotalIncidents": "",
"statusPage": {
"deleteSuccess": "",
"deleteFailed": "",
"deleteFailed": "刪除狀態頁面失敗",
"createSuccess": "",
"updateSuccess": "",
"generalSettings": "",
"contents": "",
"contents": "內容",
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"actionButton": "讓我們建立您的第一個狀態頁面!"
}
},
"testNotificationsDisabled": "",
@@ -909,63 +918,138 @@
},
"pageSpeedLighthouseAPI": "",
"time": {
"threeMinutes": "",
"fiveMinutes": "",
"tenMinutes": "",
"twentyMinutes": "",
"oneHour": "",
"oneDay": "",
"oneWeek": ""
"threeMinutes": "3分鐘",
"fiveMinutes": "5分鐘",
"tenMinutes": "10分鐘",
"twentyMinutes": "20分鐘",
"oneHour": "1小時",
"oneDay": "1日",
"oneWeek": "1星期",
"fourMinutes": "",
"oneMinute": "",
"twoMinutes": "",
"fifteenSeconds": "",
"thirtySeconds": ""
},
"general": {
"noOptionsFound": ""
},
"infrastructureMonitor": {
"fallback": {
"checks": [""],
"checks": ["追蹤伺服器的效能", "識別瓶頸並優化資源使用", "透過即時監控確保可靠性"],
"title": "",
"actionButton": ""
"actionButton": "讓我們建立您的第一個基礎設施監視器!"
}
},
"maintenanceWindow": {
"fallback": {
"checks": [""],
"checks": ["標記您的維護期間", "消除任何誤解", "在維護時段停止發送警報"],
"title": "",
"actionButton": ""
"actionButton": "讓我們建立您的第一個維護時段!"
}
},
"pageSpeed": {
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"actionButton": "讓我們建立您的第一個 PageSpeed 監視器!"
}
},
"uptimeMonitor": {
"fallback": {
"checks": [""],
"title": "",
"actionButton": ""
"actionButton": "讓我們建立您的第一個正常運行時間監視器!"
}
},
"editUserPage": {
"form": {
"email": "",
"firstName": "",
"lastName": "",
"role": "",
"save": ""
"email": "電郵",
"firstName": "名",
"lastName": "姓",
"role": "角色",
"save": "儲存"
},
"table": {
"actionHeader": "",
"roleHeader": ""
"actionHeader": "行動",
"roleHeader": "角色"
},
"title": "",
"title": "編輯用戶",
"toast": {
"successUserUpdate": "",
"validationErrors": ""
}
},
"incidentsPageActionResolveMonitor": "",
"incidentsPageActionResolveAll": ""
"incidentsPageActionResolveMonitor": "解決監視器事故",
"incidentsPageActionResolveAll": "解決所有事故",
"matchMethodOptions": {
"equal": "",
"equalPlaceholder": "",
"include": "",
"includePlaceholder": "",
"regex": "",
"regexPlaceholder": "",
"text": ""
},
"monitorType": {
"docker": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"http": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"ping": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"port": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
},
"game": {
"label": "",
"namePlaceholder": "",
"placeholder": ""
}
},
"uptimeAdvancedMatching": {
"jsonPath": ""
},
"bytesPerSecond": "",
"bytesReceived": "",
"bytesSent": "",
"chooseGame": "",
"createMonitorPage": {
"incidentConfigDescription": "",
"incidentConfigStatusWindowLabel": "",
"incidentConfigStatusWindowThresholdLabel": "",
"incidentConfigTitle": ""
},
"dataRate": "",
"dataReceived": "",
"dataSent": "",
"details": "",
"drops": "",
"errors": "",
"errorsIn": "",
"errorsOut": "",
"gameServerMonitoring": "",
"gameServerMonitoringDescription": "",
"network": "",
"networkDrops": "",
"networkErrors": "",
"networkInterface": "",
"noNetworkStatsAvailable": "",
"packetsPerSecond": "",
"packetsReceived": "",
"packetsReceivedRate": "",
"packetsSent": "",
"rate": "",
"selectInterface": ""
}
+1 -1
View File
@@ -5,7 +5,7 @@ import { execSync } from "child_process";
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, process.cwd(), "");
let version = "3.1-beta";
let version = "3.1.5";
return {
base: "/",
+1 -10
View File
@@ -1,18 +1,9 @@
FROM node:20-alpine AS build
FROM node:20-slim AS build
ENV NODE_OPTIONS="--max-old-space-size=4096"
WORKDIR /app
RUN apk add --no-cache \
python3 \
make g++ \
gcc \
libc-dev \
linux-headers \
libusb-dev \
eudev-dev
COPY ./client/package*.json ./
RUN npm install
+1 -1
View File
@@ -1,4 +1,4 @@
FROM node:20-alpine
FROM node:20-slim
WORKDIR /app
+1 -11
View File
@@ -1,19 +1,9 @@
FROM node:20-alpine AS build
FROM node:20-slim AS build
ENV NODE_OPTIONS="--max-old-space-size=4096"
WORKDIR /app
RUN apk add --no-cache \
python3 \
make g++ \
gcc \
libc-dev \
linux-headers \
libusb-dev \
eudev-dev
COPY ./client/package*.json ./
RUN npm install
+1 -1
View File
@@ -1,4 +1,4 @@
FROM node:20-alpine
FROM node:20-slim
WORKDIR /app
+2 -2
View File
@@ -2,6 +2,7 @@ services:
server:
image: ghcr.io/bluewave-labs/checkmate-backend-mono-multiarch:latest
restart: always
pull_policy: always
ports:
- "52345:52345"
environment:
@@ -15,9 +16,8 @@ services:
- mongodb
mongodb:
image: mongo:4.4.18
container_name: checkmate-mongodb
restart: always
command: ["mongod", "--replSet", "rs0", "--bind_ip_all"]
command: ["mongod", "--quiet", "--bind_ip_all"]
ports:
- "27017:27017"
volumes:
+19 -7
View File
@@ -1,25 +1,37 @@
FROM node:20-alpine AS frontend-build
# ---------------------
# Frontend build stage
# ---------------------
FROM node:24-slim AS frontend-build
WORKDIR /app/client
COPY client/package*.json ./
RUN npm ci
COPY client/package.json ./
RUN npm install
RUN npm install esbuild@0.25.5 --build-from-source
COPY client ./
RUN npm run build
FROM node:20-alpine AS backend
# ---------------------
# Backend stage
# ---------------------
FROM node:24-slim AS backend
WORKDIR /app/server
COPY server/package.json ./
RUN npm install
COPY server ./
COPY --from=frontend-build /app/client/dist ./public
RUN npm ci
RUN chmod +x ./scripts/inject-vars.sh
EXPOSE 52345
CMD ./scripts/inject-vars.sh && node ./src/index.js
CMD ["sh", "-c", "./scripts/inject-vars.sh && node ./src/index.js"]
+2 -2
View File
@@ -1,4 +1,4 @@
FROM node:20-alpine AS frontend-build
FROM node:20-slim AS frontend-build
WORKDIR /app/client
@@ -8,7 +8,7 @@ RUN npm install
COPY client ./
RUN npm run build
FROM node:20-alpine AS app
FROM node:20-slim AS app
WORKDIR /app/server
+1 -10
View File
@@ -1,18 +1,9 @@
FROM node:20-alpine AS build
FROM node:20-slim AS build
ENV NODE_OPTIONS="--max-old-space-size=4096"
WORKDIR /app
RUN apk add --no-cache \
python3 \
make g++ \
gcc \
libc-dev \
linux-headers \
libusb-dev \
eudev-dev
COPY ./client/package*.json ./
RUN npm install
+1 -1
View File
@@ -1,4 +1,4 @@
FROM node:20-alpine
FROM node:20-slim
WORKDIR /app
+1 -10
View File
@@ -1,18 +1,9 @@
FROM node:20-alpine AS build
FROM node:20-slim AS build
ENV NODE_OPTIONS="--max-old-space-size=4096"
WORKDIR /app
RUN apk add --no-cache \
python3 \
make g++ \
gcc \
libc-dev \
linux-headers \
libusb-dev \
eudev-dev
COPY ./client/package*.json ./
RUN npm install
+1 -1
View File
@@ -1,4 +1,4 @@
FROM node:20-alpine
FROM node:20-slim
ENV NODE_OPTIONS="--max-old-space-size=2048"
+1 -11
View File
@@ -1,19 +1,9 @@
FROM node:20-alpine AS build
FROM node:20-slim AS build
ENV NODE_OPTIONS="--max-old-space-size=4096"
WORKDIR /app
RUN apk add --no-cache \
python3 \
make g++ \
gcc \
libc-dev \
linux-headers \
libusb-dev \
eudev-dev
COPY ./client/package*.json ./
RUN npm install
+1 -1
View File
@@ -1,4 +1,4 @@
FROM node:20-alpine
FROM node:20-slim
ENV NODE_OPTIONS="--max-old-space-size=2048"
+285 -281
View File
@@ -39,7 +39,7 @@
"ping": "0.4.4",
"sharp": "0.33.5",
"ssl-checker": "2.0.10",
"super-simple-scheduler": "1.3.0",
"super-simple-scheduler": "1.4.1",
"swagger-ui-express": "5.0.1",
"winston": "^3.13.0"
},
@@ -94,9 +94,9 @@
}
},
"node_modules/@babel/runtime": {
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
"integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
"version": "7.28.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz",
"integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -128,9 +128,9 @@
}
},
"node_modules/@csstools/color-helpers": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz",
"integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==",
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz",
"integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==",
"funding": [
{
"type": "github",
@@ -170,9 +170,9 @@
}
},
"node_modules/@csstools/css-color-parser": {
"version": "3.0.10",
"resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz",
"integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==",
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz",
"integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==",
"funding": [
{
"type": "github",
@@ -185,7 +185,7 @@
],
"license": "MIT",
"dependencies": {
"@csstools/color-helpers": "^5.0.2",
"@csstools/color-helpers": "^5.1.0",
"@csstools/css-calc": "^2.1.4"
},
"engines": {
@@ -249,9 +249,9 @@
}
},
"node_modules/@emnapi/runtime": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz",
"integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==",
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz",
"integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==",
"license": "MIT",
"optional": true,
"dependencies": {
@@ -259,9 +259,9 @@
}
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
"integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz",
"integrity": "sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -316,9 +316,9 @@
}
},
"node_modules/@eslint/config-helpers": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz",
"integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==",
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz",
"integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -326,9 +326,9 @@
}
},
"node_modules/@eslint/core": {
"version": "0.15.1",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
"integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
"version": "0.15.2",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz",
"integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -376,9 +376,9 @@
}
},
"node_modules/@eslint/js": {
"version": "9.31.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz",
"integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==",
"version": "9.34.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz",
"integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -399,13 +399,13 @@
}
},
"node_modules/@eslint/plugin-kit": {
"version": "0.3.4",
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz",
"integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==",
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz",
"integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@eslint/core": "^0.15.1",
"@eslint/core": "^0.15.2",
"levn": "^0.4.1"
},
"engines": {
@@ -469,33 +469,19 @@
}
},
"node_modules/@humanfs/node": {
"version": "0.16.6",
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
"integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
"version": "0.16.7",
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
"integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@humanfs/core": "^0.19.1",
"@humanwhocodes/retry": "^0.3.0"
"@humanwhocodes/retry": "^0.4.0"
},
"engines": {
"node": ">=18.18.0"
}
},
"node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
"integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=18.18"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/nzakas"
}
},
"node_modules/@humanwhocodes/module-importer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
@@ -886,9 +872,9 @@
}
},
"node_modules/@ioredis/commands": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz",
"integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==",
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.3.1.tgz",
"integrity": "sha512-bYtU8avhGIcje3IhvF9aSjsa5URMZBHnwKtOvXsT4sfYy9gppW11gLPT/9oNqlJZD47yPKveQFTAFWpHjKvUoQ==",
"license": "MIT"
},
"node_modules/@isaacs/cliui": {
@@ -929,16 +915,16 @@
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
"integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==",
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.29",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz",
"integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==",
"version": "0.3.30",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz",
"integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1198,14 +1184,13 @@
}
},
"node_modules/@sinonjs/samsam": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz",
"integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==",
"version": "8.0.3",
"resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.3.tgz",
"integrity": "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"@sinonjs/commons": "^3.0.1",
"lodash.get": "^4.4.2",
"type-detect": "^4.1.0"
}
},
@@ -1238,6 +1223,17 @@
"node": ">=14.16"
}
},
"node_modules/@trysound/sax": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
"integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
"license": "ISC",
"optional": true,
"peer": true,
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/@types/estree": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
@@ -1266,14 +1262,20 @@
"license": "MIT"
},
"node_modules/@types/node": {
"version": "24.1.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz",
"integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==",
"version": "24.3.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz",
"integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
"license": "MIT",
"dependencies": {
"undici-types": "~7.8.0"
"undici-types": "~7.10.0"
}
},
"node_modules/@types/relateurl": {
"version": "0.2.33",
"resolved": "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.33.tgz",
"integrity": "sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw==",
"license": "MIT"
},
"node_modules/@types/triple-beam": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
@@ -1383,9 +1385,9 @@
}
},
"node_modules/ansi-regex": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
"integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -1503,12 +1505,6 @@
"readable-stream": "~1.0.2"
}
},
"node_modules/barse/node_modules/isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
"license": "MIT"
},
"node_modules/barse/node_modules/readable-stream": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
@@ -1664,9 +1660,9 @@
"license": "ISC"
},
"node_modules/browserslist": {
"version": "4.25.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz",
"integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==",
"version": "4.25.4",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz",
"integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==",
"funding": [
{
"type": "opencollective",
@@ -1683,8 +1679,8 @@
],
"license": "MIT",
"dependencies": {
"caniuse-lite": "^1.0.30001726",
"electron-to-chromium": "^1.5.173",
"caniuse-lite": "^1.0.30001737",
"electron-to-chromium": "^1.5.211",
"node-releases": "^2.0.19",
"update-browserslist-db": "^1.1.3"
},
@@ -1909,9 +1905,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001727",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz",
"integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==",
"version": "1.0.30001739",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz",
"integrity": "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==",
"funding": [
{
"type": "opencollective",
@@ -2303,6 +2299,12 @@
"typedarray": "^0.0.6"
}
},
"node_modules/concat-stream/node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"license": "MIT"
},
"node_modules/concat-stream/node_modules/readable-stream": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
@@ -2362,9 +2364,9 @@
"license": "MIT"
},
"node_modules/cookie": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
"integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
"integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -2383,15 +2385,6 @@
"node": ">= 0.8.0"
}
},
"node_modules/cookie-parser/node_modules/cookie": {
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
"integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
@@ -2511,6 +2504,21 @@
"url": "https://github.com/sponsors/fb55"
}
},
"node_modules/css-tree": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
"integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"mdn-data": "2.0.30",
"source-map-js": "^1.0.1"
},
"engines": {
"node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
}
},
"node_modules/css-what": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
@@ -2536,12 +2544,12 @@
}
},
"node_modules/cssnano": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.0.tgz",
"integrity": "sha512-Pu3rlKkd0ZtlCUzBrKL1Z4YmhKppjC1H9jo7u1o4qaKqyhvixFgu5qLyNIAOjSTg9DjVPtUqdROq2EfpVMEe+w==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.1.tgz",
"integrity": "sha512-fm4D8ti0dQmFPeF8DXSAA//btEmqCOgAc/9Oa3C1LW94h5usNrJEfrON7b4FkPZgnDEn6OUs5NdxiJZmAtGOpQ==",
"license": "MIT",
"dependencies": {
"cssnano-preset-default": "^7.0.8",
"cssnano-preset-default": "^7.0.9",
"lilconfig": "^3.1.3"
},
"engines": {
@@ -2556,9 +2564,9 @@
}
},
"node_modules/cssnano-preset-default": {
"version": "7.0.8",
"resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.8.tgz",
"integrity": "sha512-d+3R2qwrUV3g4LEMOjnndognKirBZISylDZAF/TPeCWVjEwlXS2e4eN4ICkoobRe7pD3H6lltinKVyS1AJhdjQ==",
"version": "7.0.9",
"resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.9.tgz",
"integrity": "sha512-tCD6AAFgYBOVpMBX41KjbvRh9c2uUjLXRyV7KHSIrwHiq5Z9o0TFfUCoM3TwVrRsRteN3sVXGNvjVNxYzkpTsA==",
"license": "MIT",
"dependencies": {
"browserslist": "^4.25.1",
@@ -2566,7 +2574,7 @@
"cssnano-utils": "^5.0.1",
"postcss-calc": "^10.1.1",
"postcss-colormin": "^7.0.4",
"postcss-convert-values": "^7.0.6",
"postcss-convert-values": "^7.0.7",
"postcss-discard-comments": "^7.0.4",
"postcss-discard-duplicates": "^7.0.2",
"postcss-discard-empty": "^7.0.1",
@@ -3012,9 +3020,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
"version": "1.5.190",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.190.tgz",
"integrity": "sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw==",
"version": "1.5.213",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.213.tgz",
"integrity": "sha512-xr9eRzSLNa4neDO0xVFrkXu3vyIzG4Ay08dApecw42Z1NbmCt+keEpXdvlYGVe0wtvY5dhW0Ay0lY0IOfsCg0Q==",
"license": "ISC"
},
"node_modules/emitter-component": {
@@ -3196,20 +3204,20 @@
}
},
"node_modules/eslint": {
"version": "9.31.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz",
"integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==",
"version": "9.34.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz",
"integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.21.0",
"@eslint/config-helpers": "^0.3.0",
"@eslint/core": "^0.15.0",
"@eslint/config-helpers": "^0.3.1",
"@eslint/core": "^0.15.2",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "9.31.0",
"@eslint/plugin-kit": "^0.3.1",
"@eslint/js": "9.34.0",
"@eslint/plugin-kit": "^0.3.5",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
@@ -3290,6 +3298,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint-plugin-mocha/node_modules/type-fest": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint-scope": {
"version": "8.4.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
@@ -3503,6 +3524,15 @@
"express": ">= 4.11"
}
},
"node_modules/express/node_modules/cookie": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
"integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/express/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -3705,9 +3735,9 @@
"license": "MIT"
},
"node_modules/follow-redirects": {
"version": "1.15.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"version": "1.15.11",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"funding": [
{
"type": "individual",
@@ -3960,6 +3990,18 @@
"node": ">=14"
}
},
"node_modules/gaxios/node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"license": "MIT",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/gbxremote": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/gbxremote/-/gbxremote-0.2.1.tgz",
@@ -4037,18 +4079,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/get-stream/node_modules/is-stream": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
"integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
@@ -4156,18 +4186,6 @@
"url": "https://github.com/sindresorhus/got?sponsor=1"
}
},
"node_modules/got/node_modules/type-fest": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
"integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/handlebars": {
"version": "4.7.8",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
@@ -4277,11 +4295,12 @@
"license": "MIT"
},
"node_modules/htmlnano": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.1.2.tgz",
"integrity": "sha512-8Fst+0bhAfU362S6oHVb4wtJj/UYEFr0qiCLAEi8zioqmp1JYBQx5crZAADlFVX0Ly/6s/IQz6G7PL9/hgoJaQ==",
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.1.3.tgz",
"integrity": "sha512-mzTUHhxdfDw80X36rv5qFvjvor7r0uCwXI5mzo8CW61tImbe5Jpvl3JzPAetVh54wUYVuoa8x3qw8LFn8B3gHQ==",
"license": "MIT",
"dependencies": {
"@types/relateurl": "^0.2.33",
"cosmiconfig": "^9.0.0",
"posthtml": "^0.16.5"
},
@@ -4493,12 +4512,12 @@
"license": "ISC"
},
"node_modules/ioredis": {
"version": "5.6.1",
"resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz",
"integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==",
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.7.0.tgz",
"integrity": "sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==",
"license": "MIT",
"dependencies": {
"@ioredis/commands": "^1.1.1",
"@ioredis/commands": "^1.3.0",
"cluster-key-slot": "^1.1.0",
"debug": "^4.3.4",
"denque": "^2.1.0",
@@ -4614,12 +4633,12 @@
"license": "MIT"
},
"node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
"integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
"license": "MIT",
"engines": {
"node": ">=8"
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -4639,9 +4658,9 @@
}
},
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
"license": "MIT"
},
"node_modules/isexe": {
@@ -4717,9 +4736,9 @@
}
},
"node_modules/istanbul-reports": {
"version": "3.1.7",
"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
"integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
"integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -5066,14 +5085,6 @@
"integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==",
"license": "MIT"
},
"node_modules/lodash.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
"deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.",
"dev": true,
"license": "MIT"
},
"node_modules/lodash.includes": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
@@ -5182,9 +5193,9 @@
"license": "Apache-2.0"
},
"node_modules/loupe": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz",
"integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==",
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz",
"integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==",
"dev": true,
"license": "MIT"
},
@@ -5251,6 +5262,14 @@
"node": ">= 0.4"
}
},
"node_modules/mdn-data": {
"version": "2.0.30",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
"integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
"license": "CC0-1.0",
"optional": true,
"peer": true
},
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -5919,9 +5938,9 @@
}
},
"node_modules/mongodb": {
"version": "6.18.0",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.18.0.tgz",
"integrity": "sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==",
"version": "6.19.0",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.19.0.tgz",
"integrity": "sha512-H3GtYujOJdeKIMLKBT9PwlDhGrQfplABNF1G904w6r5ZXKWyv77aB0X9B+rhmaAwjtllHzaEkvi9mkGVZxs2Bw==",
"license": "Apache-2.0",
"dependencies": {
"@mongodb-js/saslprep": "^1.1.9",
@@ -5937,7 +5956,7 @@
"gcp-metadata": "^5.2.0",
"kerberos": "^2.0.1",
"mongodb-client-encryption": ">=6.0.0 <7",
"snappy": "^7.2.2",
"snappy": "^7.3.2",
"socks": "^2.7.1"
},
"peerDependenciesMeta": {
@@ -5975,14 +5994,14 @@
}
},
"node_modules/mongoose": {
"version": "8.16.4",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.16.4.tgz",
"integrity": "sha512-jslgdQ8pY2vcNSKPv3Dbi5ogo/NT8zcvf6kPDyD8Sdsjsa1at3AFAF0F5PT+jySPGSPbvlNaQ49nT9h+Kx2UDA==",
"version": "8.18.0",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.18.0.tgz",
"integrity": "sha512-3TixPihQKBdyaYDeJqRjzgb86KbilEH07JmzV8SoSjgoskNTpa6oTBmDxeoF9p8YnWQoz7shnCyPkSV/48y3yw==",
"license": "MIT",
"dependencies": {
"bson": "^6.10.4",
"kareem": "2.6.3",
"mongodb": "~6.17.0",
"mongodb": "~6.18.0",
"mpath": "0.9.0",
"mquery": "5.0.0",
"ms": "2.1.3",
@@ -5997,9 +6016,9 @@
}
},
"node_modules/mongoose/node_modules/mongodb": {
"version": "6.17.0",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.17.0.tgz",
"integrity": "sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==",
"version": "6.18.0",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.18.0.tgz",
"integrity": "sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==",
"license": "Apache-2.0",
"dependencies": {
"@mongodb-js/saslprep": "^1.1.9",
@@ -6187,13 +6206,14 @@
}
},
"node_modules/nise/node_modules/path-to-regexp": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
"integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
"integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=16"
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
"node_modules/node-abort-controller": {
@@ -6751,9 +6771,9 @@
}
},
"node_modules/postcss-convert-values": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.6.tgz",
"integrity": "sha512-MD/eb39Mr60hvgrqpXsgbiqluawYg/8K4nKsqRsuDX9f+xN1j6awZCUv/5tLH8ak3vYp/EMXwdcnXvfZYiejCQ==",
"version": "7.0.7",
"resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.7.tgz",
"integrity": "sha512-HR9DZLN04Xbe6xugRH6lS4ZQH2zm/bFh/ZyRkpedZozhvh+awAfbA0P36InO4fZfDhvYfNJeNvlTf1sjwGbw/A==",
"license": "MIT",
"dependencies": {
"browserslist": "^4.25.1",
@@ -7351,9 +7371,9 @@
"license": "MIT"
},
"node_modules/protobufjs": {
"version": "7.5.3",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz",
"integrity": "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==",
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz",
"integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -7995,9 +8015,9 @@
"license": "ISC"
},
"node_modules/ssh2": {
"version": "1.16.0",
"resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz",
"integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==",
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz",
"integrity": "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==",
"hasInstallScript": true,
"dependencies": {
"asn1": "^0.2.6",
@@ -8008,7 +8028,7 @@
},
"optionalDependencies": {
"cpu-features": "~0.0.10",
"nan": "^2.20.0"
"nan": "^2.23.0"
}
},
"node_modules/ssl-checker": {
@@ -8077,6 +8097,12 @@
"readable-stream": "^2.1.0"
}
},
"node_modules/string-to-stream/node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"license": "MIT"
},
"node_modules/string-to-stream/node_modules/readable-stream": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
@@ -8245,86 +8271,15 @@
}
},
"node_modules/super-simple-scheduler": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/super-simple-scheduler/-/super-simple-scheduler-1.3.0.tgz",
"integrity": "sha512-iEGZ+a9Xv7pIaA+XhVuHSGaasQg2T6/afTRlQhosQiiU/7ykpZBsiZB/L2Hqfem5YUrbr3Q8tzrjjXCXKMg81A==",
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/super-simple-scheduler/-/super-simple-scheduler-1.4.1.tgz",
"integrity": "sha512-jKVwxdRBXOHrUstA2pvO4jBZIA3CUinKiQ6k5C2Wn5tscoV3srppPxW0zG3VNKTCaGxo3yPn6Zaf3IDVBcAwRA==",
"license": "MIT",
"dependencies": {
"human-interval": "2.0.1",
"ioredis": "5.6.1",
"mongoose": "8.16.1",
"uuid": "11.1.0",
"winston": "3.17.0"
}
},
"node_modules/super-simple-scheduler/node_modules/mongodb": {
"version": "6.17.0",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.17.0.tgz",
"integrity": "sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==",
"license": "Apache-2.0",
"dependencies": {
"@mongodb-js/saslprep": "^1.1.9",
"bson": "^6.10.4",
"mongodb-connection-string-url": "^3.0.0"
},
"engines": {
"node": ">=16.20.1"
},
"peerDependencies": {
"@aws-sdk/credential-providers": "^3.188.0",
"@mongodb-js/zstd": "^1.1.0 || ^2.0.0",
"gcp-metadata": "^5.2.0",
"kerberos": "^2.0.1",
"mongodb-client-encryption": ">=6.0.0 <7",
"snappy": "^7.2.2",
"socks": "^2.7.1"
},
"peerDependenciesMeta": {
"@aws-sdk/credential-providers": {
"optional": true
},
"@mongodb-js/zstd": {
"optional": true
},
"gcp-metadata": {
"optional": true
},
"kerberos": {
"optional": true
},
"mongodb-client-encryption": {
"optional": true
},
"snappy": {
"optional": true
},
"socks": {
"optional": true
}
}
},
"node_modules/super-simple-scheduler/node_modules/mongoose": {
"version": "8.16.1",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.16.1.tgz",
"integrity": "sha512-Q+0TC+KLdY4SYE+u9gk9pdW1tWu/pl0jusyEkMGTgBoAbvwQdfy4f9IM8dmvCwb/blSfp7IfLkob7v76x6ZGpQ==",
"license": "MIT",
"dependencies": {
"bson": "^6.10.4",
"kareem": "2.6.3",
"mongodb": "~6.17.0",
"mpath": "0.9.0",
"mquery": "5.0.0",
"ms": "2.1.3",
"sift": "17.1.3"
},
"engines": {
"node": ">=16.20.1"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mongoose"
}
},
"node_modules/super-simple-scheduler/node_modules/uuid": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
@@ -8351,10 +8306,48 @@
"node": ">=8"
}
},
"node_modules/svgo": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz",
"integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==",
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@trysound/sax": "0.2.0",
"commander": "^7.2.0",
"css-select": "^5.1.0",
"css-tree": "^2.3.1",
"css-what": "^6.1.0",
"csso": "^5.0.5",
"picocolors": "^1.0.0"
},
"bin": {
"svgo": "bin/svgo"
},
"engines": {
"node": ">=14.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/svgo"
}
},
"node_modules/svgo/node_modules/commander": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"license": "MIT",
"optional": true,
"peer": true,
"engines": {
"node": ">= 10"
}
},
"node_modules/swagger-ui-dist": {
"version": "5.27.0",
"resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.27.0.tgz",
"integrity": "sha512-tS6LRyBhY6yAqxrfsA9IYpGWPUJOri6sclySa7TdC7XQfGLvTwDY531KLgfQwHEtQsn+sT4JlUspbeQDBVGWig==",
"version": "5.28.1",
"resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.28.1.tgz",
"integrity": "sha512-IvPrtNi8MvjiuDgoSmPYgg27Lvu38fnLD1OSd8Y103xXsPAqezVNnNeHnVCZ/d+CMXJblflGaIyHxAYIF3O71w==",
"license": "Apache-2.0",
"dependencies": {
"@scarf/scarf": "=1.4.0"
@@ -8588,13 +8581,12 @@
}
},
"node_modules/type-fest": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"dev": true,
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
"integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=10"
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -8640,18 +8632,18 @@
"license": "MIT"
},
"node_modules/undici": {
"version": "7.12.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.12.0.tgz",
"integrity": "sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==",
"version": "7.15.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.15.0.tgz",
"integrity": "sha512-7oZJCPvvMvTd0OlqWsIxTuItTpJBpU1tcbVl24FMn3xt3+VSunwUasmfPJRE57oNO1KsZ4PgA1xTdAX4hq8NyQ==",
"license": "MIT",
"engines": {
"node": ">=20.18.1"
}
},
"node_modules/undici-types": {
"version": "7.8.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
"integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
"version": "7.10.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
"integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
"license": "MIT"
},
"node_modules/unfetch": {
@@ -9031,6 +9023,18 @@
"node": ">= 12.0.0"
}
},
"node_modules/winston/node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"license": "MIT",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+1 -1
View File
@@ -46,7 +46,7 @@
"ping": "0.4.4",
"sharp": "0.33.5",
"ssl-checker": "2.0.10",
"super-simple-scheduler": "1.3.0",
"super-simple-scheduler": "1.4.1",
"swagger-ui-express": "5.0.1",
"winston": "^3.13.0"
},
@@ -95,7 +95,7 @@ class StatusPageController extends BaseController {
deleteStatusPage = this.asyncHandler(
async (req, res) => {
await this.db.deleteStatusPage(req.params.url);
await this.db.statusPageModule.deleteStatusPage(req.params.url);
return res.success({
msg: this.stringService.statusPageDelete,
});
+1 -1
View File
@@ -72,7 +72,7 @@ const CheckSchema = new mongoose.Schema(
},
type: {
type: String,
enum: ["http", "hardware", "pagespeed", "distributed"],
enum: ["http", "ping", "pagespeed", "hardware", "docker", "port", "game"],
required: true,
index: true,
},
+1 -1
View File
@@ -38,7 +38,7 @@ const MonitorSchema = mongoose.Schema(
},
statusWindowThreshold: {
type: Number,
default: 0.6,
default: 60,
},
type: {
type: String,
+3 -1
View File
@@ -1,6 +1,6 @@
import mongoose from "mongoose";
import AppSettings from "../models/AppSettings.js";
import { runMigrations } from "./migration/index.js";
class MongoDB {
static SERVICE_NAME = "MongoDB";
@@ -65,6 +65,8 @@ class MongoDB {
service: this.SERVICE_NAME,
method: "connect",
});
await runMigrations();
} catch (error) {
this.logger.error({
message: error.message,
@@ -0,0 +1,18 @@
import Monitor from "../../models/Monitor.js";
async function migrateStatusWindowThreshold() {
try {
const monitors = await Monitor.find({ statusWindowThreshold: { $lt: 1 } });
for (const monitor of monitors) {
monitor.statusWindowThreshold = monitor.statusWindowThreshold * 100;
await monitor.save();
console.log(`Migrated monitor ${monitor._id}: statusWindowThreshold set to ${monitor.statusWindowThreshold}`);
}
console.log("StatusWindowThreshold migration complete.");
return true;
} catch (err) {
console.error("Migration error:", err);
return false;
}
}
export { migrateStatusWindowThreshold };
+7
View File
@@ -0,0 +1,7 @@
import { migrateStatusWindowThreshold } from "./0001_migrateStatusWindowThreshold.js";
const runMigrations = async () => {
await migrateStatusWindowThreshold();
};
export { runMigrations };
@@ -88,7 +88,7 @@ class SuperSimpleQueue {
};
updateJob = async (monitor) => {
this.scheduler.updateJob(monitor._id.toString(), monitor.interval);
this.scheduler.updateJob(monitor._id.toString(), { repeat: monitor.interval, data: monitor.toObject() });
};
shutdown = async () => {
@@ -141,6 +141,7 @@ class SuperSimpleQueue {
monitorId: job.id,
monitorUrl: job?.data?.url || null,
monitorType: job?.data?.type || null,
monitorInterval: job?.data?.interval || null,
active: job.active,
lockedAt: job.lockedAt,
runCount: job.runCount || 0,
@@ -1,3 +1,5 @@
import { match } from "assert";
const SERVICE_NAME = "NetworkService";
class NetworkService {
@@ -147,16 +149,24 @@ class NetworkService {
httpResponse.payload = payload;
httpResponse.timings = response.timings || {};
if (!expectedValue) {
if (!expectedValue && !jsonPath) {
return httpResponse;
}
this.logger.info({
service: this.SERVICE_NAME,
method: "requestHttp",
message: `Job: [${name}](${_id}) match result with expected value`,
details: { expectedValue, payload, jsonPath, matchMethod },
});
if (expectedValue) {
let ok = false;
if (matchMethod === "equal") ok = payload === expectedValue;
if (matchMethod === "include") ok = payload.includes(expectedValue);
if (matchMethod === "regex") ok = new RegExp(expectedValue).test(payload);
if (ok === true) {
return httpResponse;
} else {
httpResponse.code = 500;
httpResponse.status = false;
return httpResponse;
}
}
if (jsonPath) {
const contentType = response.headers["content-type"];
@@ -243,24 +253,76 @@ class NetworkService {
handleError: true, // Enable error handling
});
const containers = await docker.listContainers({ all: true });
const containerExists = containers.some((c) => c.Id.startsWith(monitor.url));
if (!containerExists) {
throw new Error(this.stringService.dockerNotFound);
}
const container = docker.getContainer(monitor.url);
const { response, responseTime, error } = await this.timeRequest(() => container.inspect());
const dockerResponse = {
monitorId: monitor._id,
type: monitor.type,
responseTime,
status: response?.State?.Status === "running" ? true : false,
code: 200,
message: "Docker container status fetched successfully",
};
const containers = await docker.listContainers({ all: true });
// Normalize input: strip leading slashes and convert to lowercase for comparison
const normalizedInput = monitor.url.replace(/^\/+/, "").toLowerCase();
// Priority-based matching to avoid ambiguity:
// 1. Exact full ID match (64-char)
let exactIdMatch = containers.find((c) => c.Id.toLowerCase() === normalizedInput);
// 2. Exact container name match (case-insensitive)
let exactNameMatch = containers.find((c) =>
c.Names.some((name) => {
const cleanName = name.replace(/^\/+/, "").toLowerCase();
return cleanName === normalizedInput;
})
);
// 3. Partial ID match (fallback for backwards compatibility)
let partialIdMatch = containers.find((c) => c.Id.toLowerCase().startsWith(normalizedInput));
// Select container based on priority
let targetContainer = exactIdMatch || exactNameMatch || partialIdMatch;
// Return negative response if no container
if (!targetContainer) {
this.logger.warn({
message: `No container found for "${monitor.url}".`,
service: this.SERVICE_NAME,
method: "requestDocker",
details: { url: monitor.url },
});
dockerResponse.code = 404;
dockerResponse.status = false;
dockerResponse.message = this.stringService.dockerNotFound;
return dockerResponse;
}
// Return negative response if ambiguous matches exist
const matchTypes = [];
if (exactIdMatch) matchTypes.push("exact ID");
if (exactNameMatch) matchTypes.push("exact name");
if (partialIdMatch && !exactIdMatch) matchTypes.push("partial ID");
if (matchTypes.length > 1) {
this.logger.warn({
message: `Ambiguous container match for "${monitor.url}". Matched by: ${matchTypes.join(", ")}. Using ${exactIdMatch ? "exact ID" : exactNameMatch ? "exact name" : "partial ID"} match.`,
service: this.SERVICE_NAME,
method: "requestDocker",
details: { url: monitor.url },
});
dockerResponse.status = 404;
dockerResponse.status = false;
dockerResponse.message = `Ambiguous container match for "${monitor.url}". Matched by: ${matchTypes.join(", ")}. Using ${exactIdMatch ? "exact ID" : exactNameMatch ? "exact name" : "partial ID"} match.`;
return dockerResponse;
}
const container = docker.getContainer(targetContainer.Id);
const { response, responseTime, error } = await this.timeRequest(() => container.inspect());
dockerResponse.responseTime = responseTime;
dockerResponse.status = response?.State?.Status === "running" ? true : false;
dockerResponse.code = 200;
dockerResponse.message = "Docker container status fetched successfully";
if (error) {
dockerResponse.status = false;
dockerResponse.code = error.statusCode || this.NETWORK_ERROR;
@@ -158,7 +158,7 @@ class StatusService {
statusChanged = true;
}
// If the failure rate is below the threshold and the monitor is down, recover:
else if (failureRate <= monitor.statusWindowThreshold && monitor.status === false) {
else if (failureRate < monitor.statusWindowThreshold && monitor.status === false) {
newStatus = true;
statusChanged = true;
}
@@ -7,7 +7,7 @@ class TranslationService {
this.logger = logger;
this.translations = {};
this._language = "en";
this.localesDir = path.join(process.cwd(), "locales");
this.localesDir = path.join(process.cwd(), "src/locales");
}
get serviceName() {
+25 -11
View File
@@ -580,17 +580,31 @@ const createNotificationBodyValidation = joi.object({
}),
address: joi.when("type", {
is: "email",
then: joi.string().email().required().messages({
"string.empty": "E-mail address cannot be empty",
"any.required": "E-mail address is required",
"string.email": "Please enter a valid e-mail address",
}),
otherwise: joi.string().uri().required().messages({
"string.empty": "Webhook URL cannot be empty",
"any.required": "Webhook URL is required",
"string.uri": "Please enter a valid Webhook URL",
}),
switch: [
{
is: "email",
then: joi.string().email().required().messages({
"string.empty": "E-mail address cannot be empty",
"any.required": "E-mail address is required",
"string.email": "Please enter a valid e-mail address",
}),
},
{
is: "pager_duty",
then: joi.string().required().messages({
"string.empty": "PagerDuty integration key cannot be empty",
"any.required": "PagerDuty integration key is required",
}),
},
{
is: joi.string().valid("webhook", "slack", "discord"),
then: joi.string().uri().required().messages({
"string.empty": "Webhook URL cannot be empty",
"any.required": "Webhook URL is required",
"string.uri": "Please enter a valid Webhook URL",
}),
},
],
}),
});