mirror of
https://github.com/gethomepage/homepage.git
synced 2025-12-06 21:57:48 +01:00
Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
794ec127cd | ||
|
|
912ae0adfc | ||
|
|
7c3dcf20ef | ||
|
|
c12a5c01f6 | ||
|
|
6fd2b6b6dc | ||
|
|
bf0a766302 | ||
|
|
be4da9d010 | ||
|
|
b7ca6244dd | ||
|
|
e6cf86ed4a | ||
|
|
3736c1fcab | ||
|
|
3af86ffebb | ||
|
|
0aea6a6c3f | ||
|
|
261c907f52 | ||
|
|
2a6debbc79 | ||
|
|
e9a31bafab | ||
|
|
bf2efce74d | ||
|
|
7cbba1ff90 | ||
|
|
c347677402 | ||
|
|
fd75f22e16 | ||
|
|
aac573a48d | ||
|
|
2245cdda55 | ||
|
|
cf9109384e | ||
|
|
db1fb4b899 | ||
|
|
20048ff567 | ||
|
|
e6c7692677 | ||
|
|
19bdc0ec34 | ||
|
|
cd8c224ffa | ||
|
|
b1ca6b8e1a | ||
|
|
3fd8247a40 | ||
|
|
798ca3dea9 | ||
|
|
5c5b6f17d9 | ||
|
|
8e6c7ec152 | ||
|
|
2cc38b9a4f | ||
|
|
50aa416612 | ||
|
|
96bd6eedc2 | ||
|
|
d12b0d5a53 | ||
|
|
e2d6794d12 | ||
|
|
50ccb0b14d |
2
.github/DISCUSSION_TEMPLATE/support.yml
vendored
2
.github/DISCUSSION_TEMPLATE/support.yml
vendored
@@ -5,7 +5,7 @@ body:
|
|||||||
### ⚠️ Before opening a discussion:
|
### ⚠️ Before opening a discussion:
|
||||||
|
|
||||||
- [Check the troubleshooting guide](https://gethomepage.dev/troubleshooting/).
|
- [Check the troubleshooting guide](https://gethomepage.dev/troubleshooting/).
|
||||||
- [Search existing issues](https://github.com/gethomepage/homepage/search?q=&type=issues) [and discussions](https://github.com/gethomepage/homepage/search?q=&type=discussions).
|
- [Search existing issues](https://github.com/gethomepage/homepage/search?q=&type=issues) [and discussions](https://github.com/gethomepage/homepage/search?q=&type=discussions) (including closed ones!).
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: description
|
id: description
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
20
.github/workflows/reaction-comments.yml
vendored
Normal file
20
.github/workflows/reaction-comments.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
name: 'Reaction Comments'
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created, edited]
|
||||||
|
pull_request_review_comment:
|
||||||
|
types: [created, edited]
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
actions: write
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
action:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: dessant/reaction-comments@v4
|
||||||
@@ -8,7 +8,7 @@ icon: simple/docker
|
|||||||
You have a few options for deploying homepage, depending on your needs. We offer docker images for a majority of platforms. You can also install and run homepage from source if Docker is not your thing. It can even be installed on Kubernetes with Helm.
|
You have a few options for deploying homepage, depending on your needs. We offer docker images for a majority of platforms. You can also install and run homepage from source if Docker is not your thing. It can even be installed on Kubernetes with Helm.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
!!! danger
|
!!! warning
|
||||||
|
|
||||||
Please note that when using features such as widgets, Homepage can access personal information (for example from your home automation system) and Homepage currently does not (and is not planned to) include any authentication layer itself. Thus, we recommend homepage be deployed behind a reverse proxy including authentication, SSL etc, and / or behind a VPN.
|
Please note that when using features such as widgets, Homepage can access personal information (for example from your home automation system) and Homepage currently does not (and is not planned to) include any authentication layer itself. Thus, we recommend homepage be deployed behind a reverse proxy including authentication, SSL etc, and / or behind a VPN.
|
||||||
|
|
||||||
|
|||||||
@@ -48,15 +48,14 @@ self-hosted / open-source alternative, we ask that any widgets, etc. are develop
|
|||||||
|
|
||||||
## New Feature Guidelines
|
## New Feature Guidelines
|
||||||
|
|
||||||
- New features should be linked to an existing feature request with at least 10 'up-votes'. The purpose of this requirement is to avoid the addition (and maintenance) of features that might only benefit a small number of users.
|
- New features should usually be linked to an existing feature request. The purpose of this requirement is to avoid the addition (and maintenance) of features that might only benefit a small number of users.
|
||||||
- If you have ideas for a larger feature, please open a discussion first.
|
- If you have ideas for a larger feature you may want to open a discussion first.
|
||||||
- Please note that though it is a requirement, a discussion with 10 'up-votes' in no way guarantees that a PR will be merged.
|
|
||||||
|
|
||||||
## Service Widget Guidelines
|
## Service Widget Guidelines
|
||||||
|
|
||||||
To ensure cohesiveness of various widgets, the following should be used as a guide for developing new widgets:
|
To ensure cohesiveness of various widgets, the following should be used as a guide for developing new widgets:
|
||||||
|
|
||||||
- Please only submit widgets that have been requested and have at least 10 'up-votes'. The purpose of this requirement is to avoid the addition (and maintenance) of service widgets that might only benefit a small number of users.
|
- Please only submit widgets that target a feature request discussion with at least 10 'up-votes'. The purpose of this requirement is to avoid the addition (and maintenance) of service widgets that might only benefit a small number of users.
|
||||||
- Note that we reserve the right to decline widgets for projects that are very young (eg < ~1y) or those with a small reach (eg low GitHub stars). Again, this is in an effort to keep overall widget maintenance under control.
|
- Note that we reserve the right to decline widgets for projects that are very young (eg < ~1y) or those with a small reach (eg low GitHub stars). Again, this is in an effort to keep overall widget maintenance under control.
|
||||||
- Widgets should be only one row of blocks
|
- Widgets should be only one row of blocks
|
||||||
- Widgets should be no more than 4 blocks wide and generally conform to the styling / design choices of other widgets
|
- Widgets should be no more than 4 blocks wide and generally conform to the styling / design choices of other widgets
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ Homepage provides a set of common translations that you can use in your widgets.
|
|||||||
| `common.ms` | `1,000 ms` | Format a number in milliseconds. |
|
| `common.ms` | `1,000 ms` | Format a number in milliseconds. |
|
||||||
| `common.date` | `2024-01-01` | Format a date. |
|
| `common.date` | `2024-01-01` | Format a date. |
|
||||||
| `common.relativeDate` | `1 day ago` | Format a relative date. |
|
| `common.relativeDate` | `1 day ago` | Format a relative date. |
|
||||||
| `common.uptime` | `1 day, 1 hour` | Format an uptime. |
|
| `common.duration` | `1 day, 1 hour` | Format an duration. |
|
||||||
|
|
||||||
### Text
|
### Text
|
||||||
|
|
||||||
|
|||||||
20
docs/widgets/services/beszel.md
Normal file
20
docs/widgets/services/beszel.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
title: Beszel
|
||||||
|
description: Beszel Widget Configuration
|
||||||
|
---
|
||||||
|
|
||||||
|
Learn more about [Beszel]()
|
||||||
|
|
||||||
|
The widget has two modes, a single system with detailed info if `systemId` is provided, or an overview of all systems if `systemId` is not provided.
|
||||||
|
|
||||||
|
Allowed fields for 'overview' mode: `["systems", "up"]`
|
||||||
|
Allowed fields for a single system: `["name", "status", "updated", "cpu", "memory", "disk", "network"]`
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
widget:
|
||||||
|
type: beszel
|
||||||
|
url: http://beszel.host.or.ip
|
||||||
|
username: username # email
|
||||||
|
password: password
|
||||||
|
systemId: systemId # optional
|
||||||
|
```
|
||||||
19
docs/widgets/services/headscale.md
Normal file
19
docs/widgets/services/headscale.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
title: Headscale
|
||||||
|
description: Headscale Widget Configuration
|
||||||
|
---
|
||||||
|
|
||||||
|
Learn more about [Headscale](https://headscale.net/).
|
||||||
|
|
||||||
|
You will need to generate an API access token from the [command line](https://headscale.net/ref/remote-cli/#create-an-api-key) using `headscale apikeys create` command.
|
||||||
|
|
||||||
|
To find your node ID, you can use `headscale nodes list` command.
|
||||||
|
|
||||||
|
Allowed fields: `["name", "address", "last_seen", "status"]`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
widget:
|
||||||
|
type: headscale
|
||||||
|
nodeId: nodeid
|
||||||
|
key: headscaleapiaccesstoken
|
||||||
|
```
|
||||||
@@ -5,6 +5,11 @@ description: Immich Widget Configuration
|
|||||||
|
|
||||||
Learn more about [Immich](https://github.com/immich-app/immich).
|
Learn more about [Immich](https://github.com/immich-app/immich).
|
||||||
|
|
||||||
|
| Immich Version | Homepage Widget Version |
|
||||||
|
| -------------- | ----------------------- |
|
||||||
|
| < v1.118 | 1 (default) |
|
||||||
|
| >= v1.118 | 2 |
|
||||||
|
|
||||||
Find your API key under `Account Settings > API Keys`.
|
Find your API key under `Account Settings > API Keys`.
|
||||||
|
|
||||||
Allowed fields: `["users" ,"photos", "videos", "storage"]`.
|
Allowed fields: `["users" ,"photos", "videos", "storage"]`.
|
||||||
@@ -16,4 +21,5 @@ widget:
|
|||||||
type: immich
|
type: immich
|
||||||
url: http://immich.host.or.ip
|
url: http://immich.host.or.ip
|
||||||
key: adminapikeyadminapikeyadminapikey
|
key: adminapikeyadminapikeyadminapikey
|
||||||
|
version: 2 # optional, default is 1
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ You can also find a list of all available service widgets in the sidebar navigat
|
|||||||
- [Autobrr](autobrr.md)
|
- [Autobrr](autobrr.md)
|
||||||
- [Azure DevOps](azuredevops.md)
|
- [Azure DevOps](azuredevops.md)
|
||||||
- [Bazarr](bazarr.md)
|
- [Bazarr](bazarr.md)
|
||||||
|
- [Beszel](beszel.md)
|
||||||
- [Caddy](caddy.md)
|
- [Caddy](caddy.md)
|
||||||
- [Calendar](calendar.md)
|
- [Calendar](calendar.md)
|
||||||
- [Calibre-Web](calibre-web.md)
|
- [Calibre-Web](calibre-web.md)
|
||||||
@@ -44,6 +45,7 @@ You can also find a list of all available service widgets in the sidebar navigat
|
|||||||
- [Gotify](gotify.md)
|
- [Gotify](gotify.md)
|
||||||
- [Grafana](grafana.md)
|
- [Grafana](grafana.md)
|
||||||
- [HDHomeRun](hdhomerun.md)
|
- [HDHomeRun](hdhomerun.md)
|
||||||
|
- [Headscale](headscale.md)
|
||||||
- [Healthchecks](healthchecks.md)
|
- [Healthchecks](healthchecks.md)
|
||||||
- [Home Assistant](homeassistant.md)
|
- [Home Assistant](homeassistant.md)
|
||||||
- [HomeBox](homebox.md)
|
- [HomeBox](homebox.md)
|
||||||
@@ -128,6 +130,7 @@ You can also find a list of all available service widgets in the sidebar navigat
|
|||||||
- [Uptime Kuma](uptime-kuma.md)
|
- [Uptime Kuma](uptime-kuma.md)
|
||||||
- [UptimeRobot](uptimerobot.md)
|
- [UptimeRobot](uptimerobot.md)
|
||||||
- [UrBackup](urbackup.md)
|
- [UrBackup](urbackup.md)
|
||||||
|
- [Vikunja](vikunja.md)
|
||||||
- [Watchtower](watchtower.md)
|
- [Watchtower](watchtower.md)
|
||||||
- [WGEasy](wgeasy.md)
|
- [WGEasy](wgeasy.md)
|
||||||
- [WhatsUpDocker](whatsupdocker.md)
|
- [WhatsUpDocker](whatsupdocker.md)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ Learn more about [LubeLogger](https://github.com/hargata/lubelog) (v1.3.7 or hig
|
|||||||
The widget comes in two 'flavors', one shows data for all vehicles or for just a specific vehicle with the `vehicleID` parameter.
|
The widget comes in two 'flavors', one shows data for all vehicles or for just a specific vehicle with the `vehicleID` parameter.
|
||||||
|
|
||||||
Allowed fields: `["vehicles", "serviceRecords", "reminders"]`.
|
Allowed fields: `["vehicles", "serviceRecords", "reminders"]`.
|
||||||
For the single-vehicle version: `["vehicle", "serviceRecords", "reminders", "nextReminder"]
|
For the single-vehicle version: `["vehicle", "serviceRecords", "reminders", "nextReminder"]`.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
widget:
|
widget:
|
||||||
|
|||||||
@@ -9,8 +9,11 @@ _Note that the project was renamed from PiAlert to NetAlertX._
|
|||||||
|
|
||||||
Allowed fields: `["total", "connected", "new_devices", "down_alerts"]`.
|
Allowed fields: `["total", "connected", "new_devices", "down_alerts"]`.
|
||||||
|
|
||||||
|
If you have enabled a password on your NetAlertX instance, you will need to provide the `SYNC_api_token` as the `key` in your config.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
widget:
|
widget:
|
||||||
type: netalertx
|
type: netalertx
|
||||||
url: http://ip:port
|
url: http://ip:port
|
||||||
|
key: netalertxsyncapitoken # optional, only if password is enabled
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -14,5 +14,5 @@ widget:
|
|||||||
type: pihole
|
type: pihole
|
||||||
url: http://pi.hole.or.ip
|
url: http://pi.hole.or.ip
|
||||||
version: 6 # required if running v6 or higher, defaults to 5
|
version: 6 # required if running v6 or higher, defaults to 5
|
||||||
key: yourpiholeapikey # optional
|
key: yourpiholeapikey # optional, in v6 can be your password or app password
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ Learn more about [Unifi Controller](https://ui.com/).
|
|||||||
|
|
||||||
_(Find the Unifi Controller information widget [here](../info/unifi_controller.md))_
|
_(Find the Unifi Controller information widget [here](../info/unifi_controller.md))_
|
||||||
|
|
||||||
You can display general connectivity status from your Unifi (Network) Controller. When authenticating you will want to use an account that has at least read privileges.
|
You can display general connectivity status from your Unifi (Network) Controller. When authenticating you will want to use a local account that has at least read privileges.
|
||||||
|
|
||||||
An optional 'site' parameter can be supplied, if it is not the widget will use the default site for the controller.
|
An optional 'site' parameter can be supplied, if it is not the widget will use the default site for the controller.
|
||||||
|
|
||||||
|
|||||||
18
docs/widgets/services/vikunja.md
Normal file
18
docs/widgets/services/vikunja.md
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
title: Vikunja
|
||||||
|
description: Vikunja Widget Configuration
|
||||||
|
---
|
||||||
|
|
||||||
|
Learn more about [Vikunja](https://vikunja.io).
|
||||||
|
|
||||||
|
Allowed fields: `["projects", "tasks7d", "tasksOverdue", "tasksInProgress"]`.
|
||||||
|
|
||||||
|
A list of the next 5 tasks ordered by due date is disabled by default, but can be enabled with the `enableTaskList` option.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
widget:
|
||||||
|
type: vikunja
|
||||||
|
url: http[s]://vikunja.host.or.ip[:port]
|
||||||
|
key: vikunjaapikey
|
||||||
|
enableTaskList: true # optional, defaults to false
|
||||||
|
```
|
||||||
@@ -37,6 +37,7 @@ nav:
|
|||||||
- widgets/services/autobrr.md
|
- widgets/services/autobrr.md
|
||||||
- widgets/services/azuredevops.md
|
- widgets/services/azuredevops.md
|
||||||
- widgets/services/bazarr.md
|
- widgets/services/bazarr.md
|
||||||
|
- widgets/services/beszel.md
|
||||||
- widgets/services/caddy.md
|
- widgets/services/caddy.md
|
||||||
- widgets/services/calendar.md
|
- widgets/services/calendar.md
|
||||||
- widgets/services/calibre-web.md
|
- widgets/services/calibre-web.md
|
||||||
@@ -67,6 +68,7 @@ nav:
|
|||||||
- widgets/services/gotify.md
|
- widgets/services/gotify.md
|
||||||
- widgets/services/grafana.md
|
- widgets/services/grafana.md
|
||||||
- widgets/services/hdhomerun.md
|
- widgets/services/hdhomerun.md
|
||||||
|
- widgets/services/headscale.md
|
||||||
- widgets/services/healthchecks.md
|
- widgets/services/healthchecks.md
|
||||||
- widgets/services/homeassistant.md
|
- widgets/services/homeassistant.md
|
||||||
- widgets/services/homebox.md
|
- widgets/services/homebox.md
|
||||||
@@ -151,6 +153,7 @@ nav:
|
|||||||
- widgets/services/uptime-kuma.md
|
- widgets/services/uptime-kuma.md
|
||||||
- widgets/services/uptimerobot.md
|
- widgets/services/uptimerobot.md
|
||||||
- widgets/services/urbackup.md
|
- widgets/services/urbackup.md
|
||||||
|
- widgets/services/vikunja.md
|
||||||
- widgets/services/watchtower.md
|
- widgets/services/watchtower.md
|
||||||
- widgets/services/wgeasy.md
|
- widgets/services/wgeasy.md
|
||||||
- widgets/services/whatsupdocker.md
|
- widgets/services/whatsupdocker.md
|
||||||
|
|||||||
@@ -84,12 +84,12 @@ function prettyBytes(number, options) {
|
|||||||
return `${prefix + numberString} ${unit}`;
|
return `${prefix + numberString} ${unit}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function uptime(uptimeInSeconds, i18next) {
|
function duration(durationInSeconds, i18next) {
|
||||||
const mo = Math.floor(uptimeInSeconds / (3600 * 24 * 31));
|
const mo = Math.floor(durationInSeconds / (3600 * 24 * 31));
|
||||||
const d = Math.floor((uptimeInSeconds % (3600 * 24 * 31)) / (3600 * 24));
|
const d = Math.floor((durationInSeconds % (3600 * 24 * 31)) / (3600 * 24));
|
||||||
const h = Math.floor((uptimeInSeconds % (3600 * 24)) / 3600);
|
const h = Math.floor((durationInSeconds % (3600 * 24)) / 3600);
|
||||||
const m = Math.floor((uptimeInSeconds % 3600) / 60);
|
const m = Math.floor((durationInSeconds % 3600) / 60);
|
||||||
const s = Math.floor(uptimeInSeconds % 60);
|
const s = Math.floor(durationInSeconds % 60);
|
||||||
|
|
||||||
const moDisplay = mo > 0 ? mo + i18next.t("common.months") : "";
|
const moDisplay = mo > 0 ? mo + i18next.t("common.months") : "";
|
||||||
const dDisplay = d > 0 ? d + i18next.t("common.days") : "";
|
const dDisplay = d > 0 ? d + i18next.t("common.days") : "";
|
||||||
@@ -156,7 +156,7 @@ module.exports = {
|
|||||||
i18next.services.formatter.add("relativeDate", (value, lng, options) =>
|
i18next.services.formatter.add("relativeDate", (value, lng, options) =>
|
||||||
relativeDate(new Date(value), new Intl.RelativeTimeFormat(lng, { ...options })),
|
relativeDate(new Date(value), new Intl.RelativeTimeFormat(lng, { ...options })),
|
||||||
);
|
);
|
||||||
i18next.services.formatter.add("uptime", (value, lng) => uptime(value, i18next));
|
i18next.services.formatter.add("duration", (value, lng) => duration(value, i18next));
|
||||||
},
|
},
|
||||||
type: "3rdParty",
|
type: "3rdParty",
|
||||||
},
|
},
|
||||||
|
|||||||
116
package-lock.json
generated
116
package-lock.json
generated
@@ -14,7 +14,7 @@
|
|||||||
"classnames": "^2.5.1",
|
"classnames": "^2.5.1",
|
||||||
"compare-versions": "^6.1.0",
|
"compare-versions": "^6.1.0",
|
||||||
"dockerode": "^4.0.2",
|
"dockerode": "^4.0.2",
|
||||||
"follow-redirects": "^1.15.6",
|
"follow-redirects": "^1.15.9",
|
||||||
"gamedig": "^5.1.2",
|
"gamedig": "^5.1.2",
|
||||||
"i18next": "^21.10.0",
|
"i18next": "^21.10.0",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
@@ -36,27 +36,27 @@
|
|||||||
"swr": "^1.3.0",
|
"swr": "^1.3.0",
|
||||||
"systeminformation": "^5.23.2",
|
"systeminformation": "^5.23.2",
|
||||||
"tough-cookie": "^4.1.3",
|
"tough-cookie": "^4.1.3",
|
||||||
"urbackup-server-api": "^0.52.0",
|
"urbackup-server-api": "^0.52.1",
|
||||||
"winston": "^3.11.0",
|
"winston": "^3.11.0",
|
||||||
"xml-js": "^1.6.11"
|
"xml-js": "^1.6.11"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tailwindcss/forms": "^0.5.8",
|
"@tailwindcss/forms": "^0.5.8",
|
||||||
"autoprefixer": "^10.4.20",
|
"autoprefixer": "^10.4.20",
|
||||||
"eslint": "^8.57.0",
|
"eslint": "^8.57.1",
|
||||||
"eslint-config-airbnb": "^19.0.4",
|
"eslint-config-airbnb": "^19.0.4",
|
||||||
"eslint-config-next": "^14.2.3",
|
"eslint-config-next": "^14.2.3",
|
||||||
"eslint-config-prettier": "^9.1.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-plugin-import": "^2.29.1",
|
"eslint-plugin-import": "^2.31.0",
|
||||||
"eslint-plugin-jsx-a11y": "^6.8.0",
|
"eslint-plugin-jsx-a11y": "^6.8.0",
|
||||||
"eslint-plugin-prettier": "^5.2.1",
|
"eslint-plugin-prettier": "^5.2.1",
|
||||||
"eslint-plugin-react": "^7.36.1",
|
"eslint-plugin-react": "^7.37.1",
|
||||||
"eslint-plugin-react-hooks": "^4.6.2",
|
"eslint-plugin-react-hooks": "^4.6.2",
|
||||||
"postcss": "^8.4.38",
|
"postcss": "^8.4.47",
|
||||||
"prettier": "^3.2.5",
|
"prettier": "^3.2.5",
|
||||||
"tailwind-scrollbar": "^3.0.5",
|
"tailwind-scrollbar": "^3.0.5",
|
||||||
"tailwindcss": "^3.4.13",
|
"tailwindcss": "^3.4.14",
|
||||||
"typescript": "^5.4.5"
|
"typescript": "^5.6.3"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"osx-temperature-sensor": "^1.0.8"
|
"osx-temperature-sensor": "^1.0.8"
|
||||||
@@ -164,11 +164,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@eslint/js": {
|
"node_modules/@eslint/js": {
|
||||||
"version": "8.57.0",
|
"version": "8.57.1",
|
||||||
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
|
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
|
||||||
"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
|
"integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||||
}
|
}
|
||||||
@@ -191,14 +190,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@humanwhocodes/config-array": {
|
"node_modules/@humanwhocodes/config-array": {
|
||||||
"version": "0.11.14",
|
"version": "0.13.0",
|
||||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
|
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
|
||||||
"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
|
"integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
|
||||||
"deprecated": "Use @eslint/config-array instead",
|
"deprecated": "Use @eslint/config-array instead",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "Apache-2.0",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@humanwhocodes/object-schema": "^2.0.2",
|
"@humanwhocodes/object-schema": "^2.0.3",
|
||||||
"debug": "^4.3.1",
|
"debug": "^4.3.1",
|
||||||
"minimatch": "^3.0.5"
|
"minimatch": "^3.0.5"
|
||||||
},
|
},
|
||||||
@@ -225,8 +223,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
|
||||||
"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
|
"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
|
||||||
"deprecated": "Use @eslint/object-schema instead",
|
"deprecated": "Use @eslint/object-schema instead",
|
||||||
"dev": true,
|
"dev": true
|
||||||
"license": "BSD-3-Clause"
|
|
||||||
},
|
},
|
||||||
"node_modules/@isaacs/cliui": {
|
"node_modules/@isaacs/cliui": {
|
||||||
"version": "8.0.2",
|
"version": "8.0.2",
|
||||||
@@ -2942,17 +2939,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/eslint": {
|
"node_modules/eslint": {
|
||||||
"version": "8.57.0",
|
"version": "8.57.1",
|
||||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
|
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
|
||||||
"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
|
"integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/eslint-utils": "^4.2.0",
|
"@eslint-community/eslint-utils": "^4.2.0",
|
||||||
"@eslint-community/regexpp": "^4.6.1",
|
"@eslint-community/regexpp": "^4.6.1",
|
||||||
"@eslint/eslintrc": "^2.1.4",
|
"@eslint/eslintrc": "^2.1.4",
|
||||||
"@eslint/js": "8.57.0",
|
"@eslint/js": "8.57.1",
|
||||||
"@humanwhocodes/config-array": "^0.11.14",
|
"@humanwhocodes/config-array": "^0.13.0",
|
||||||
"@humanwhocodes/module-importer": "^1.0.1",
|
"@humanwhocodes/module-importer": "^1.0.1",
|
||||||
"@nodelib/fs.walk": "^1.2.8",
|
"@nodelib/fs.walk": "^1.2.8",
|
||||||
"@ungap/structured-clone": "^1.2.0",
|
"@ungap/structured-clone": "^1.2.0",
|
||||||
@@ -3139,11 +3135,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/eslint-module-utils": {
|
"node_modules/eslint-module-utils": {
|
||||||
"version": "2.9.0",
|
"version": "2.12.0",
|
||||||
"resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.9.0.tgz",
|
"resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
|
||||||
"integrity": "sha512-McVbYmwA3NEKwRQY5g4aWMdcZE5xZxV8i8l7CqJSrameuGSQJtSWaL/LxTEzSKKaCcOhlpDR8XEfYXWPrdo/ZQ==",
|
"integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"debug": "^3.2.7"
|
"debug": "^3.2.7"
|
||||||
},
|
},
|
||||||
@@ -3167,11 +3162,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/eslint-plugin-import": {
|
"node_modules/eslint-plugin-import": {
|
||||||
"version": "2.30.0",
|
"version": "2.31.0",
|
||||||
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz",
|
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
|
||||||
"integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==",
|
"integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@rtsao/scc": "^1.1.0",
|
"@rtsao/scc": "^1.1.0",
|
||||||
"array-includes": "^3.1.8",
|
"array-includes": "^3.1.8",
|
||||||
@@ -3181,7 +3175,7 @@
|
|||||||
"debug": "^3.2.7",
|
"debug": "^3.2.7",
|
||||||
"doctrine": "^2.1.0",
|
"doctrine": "^2.1.0",
|
||||||
"eslint-import-resolver-node": "^0.3.9",
|
"eslint-import-resolver-node": "^0.3.9",
|
||||||
"eslint-module-utils": "^2.9.0",
|
"eslint-module-utils": "^2.12.0",
|
||||||
"hasown": "^2.0.2",
|
"hasown": "^2.0.2",
|
||||||
"is-core-module": "^2.15.1",
|
"is-core-module": "^2.15.1",
|
||||||
"is-glob": "^4.0.3",
|
"is-glob": "^4.0.3",
|
||||||
@@ -3190,13 +3184,14 @@
|
|||||||
"object.groupby": "^1.0.3",
|
"object.groupby": "^1.0.3",
|
||||||
"object.values": "^1.2.0",
|
"object.values": "^1.2.0",
|
||||||
"semver": "^6.3.1",
|
"semver": "^6.3.1",
|
||||||
|
"string.prototype.trimend": "^1.0.8",
|
||||||
"tsconfig-paths": "^3.15.0"
|
"tsconfig-paths": "^3.15.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
|
"eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/eslint-plugin-import/node_modules/debug": {
|
"node_modules/eslint-plugin-import/node_modules/debug": {
|
||||||
@@ -3285,9 +3280,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/eslint-plugin-react": {
|
"node_modules/eslint-plugin-react": {
|
||||||
"version": "7.36.1",
|
"version": "7.37.1",
|
||||||
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.36.1.tgz",
|
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz",
|
||||||
"integrity": "sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==",
|
"integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"array-includes": "^3.1.8",
|
"array-includes": "^3.1.8",
|
||||||
@@ -3658,16 +3653,15 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/follow-redirects": {
|
"node_modules/follow-redirects": {
|
||||||
"version": "1.15.8",
|
"version": "1.15.9",
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.8.tgz",
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
|
||||||
"integrity": "sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==",
|
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "individual",
|
"type": "individual",
|
||||||
"url": "https://github.com/sponsors/RubenVerborgh"
|
"url": "https://github.com/sponsors/RubenVerborgh"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=4.0"
|
"node": ">=4.0"
|
||||||
},
|
},
|
||||||
@@ -6192,9 +6186,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "8.4.45",
|
"version": "8.4.47",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
|
||||||
"integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==",
|
"integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -6210,11 +6204,10 @@
|
|||||||
"url": "https://github.com/sponsors/ai"
|
"url": "https://github.com/sponsors/ai"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"nanoid": "^3.3.7",
|
"nanoid": "^3.3.7",
|
||||||
"picocolors": "^1.0.1",
|
"picocolors": "^1.1.0",
|
||||||
"source-map-js": "^1.2.0"
|
"source-map-js": "^1.2.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^10 || ^12 || >=14"
|
"node": "^10 || ^12 || >=14"
|
||||||
@@ -7188,10 +7181,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/source-map-js": {
|
"node_modules/source-map-js": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
|
||||||
"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
|
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
|
||||||
"license": "BSD-3-Clause",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
@@ -7720,9 +7712,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tailwindcss": {
|
"node_modules/tailwindcss": {
|
||||||
"version": "3.4.13",
|
"version": "3.4.14",
|
||||||
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz",
|
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz",
|
||||||
"integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==",
|
"integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@alloc/quick-lru": "^5.2.0",
|
"@alloc/quick-lru": "^5.2.0",
|
||||||
@@ -8109,11 +8101,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/typescript": {
|
"node_modules/typescript": {
|
||||||
"version": "5.5.4",
|
"version": "5.6.3",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
|
||||||
"integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
|
"integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "Apache-2.0",
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"tsc": "bin/tsc",
|
"tsc": "bin/tsc",
|
||||||
"tsserver": "bin/tsserver"
|
"tsserver": "bin/tsserver"
|
||||||
@@ -8194,10 +8185,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/urbackup-server-api": {
|
"node_modules/urbackup-server-api": {
|
||||||
"version": "0.52.0",
|
"version": "0.52.1",
|
||||||
"resolved": "https://registry.npmjs.org/urbackup-server-api/-/urbackup-server-api-0.52.0.tgz",
|
"resolved": "https://registry.npmjs.org/urbackup-server-api/-/urbackup-server-api-0.52.1.tgz",
|
||||||
"integrity": "sha512-KfroCFZEWCuCkWye1F1JwI2fkO1za/Mf1a8TNGTujzxU0ZGzDqhA1zCOcvV97q7nH1TKFNpw5tMZ06fSCKv2UA==",
|
"integrity": "sha512-gAxF9MdXxnceqUr/1Uj2LuGZQb/bvZ3Ply9zH/UTSWGkwKL5C0qMPrBvKRyTHbPMG/NBuHF6BzavkF7GNvOLew==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async-mutex": "^0.5.0",
|
"async-mutex": "^0.5.0",
|
||||||
"node-fetch": "^2.7.0"
|
"node-fetch": "^2.7.0"
|
||||||
|
|||||||
16
package.json
16
package.json
@@ -16,7 +16,7 @@
|
|||||||
"classnames": "^2.5.1",
|
"classnames": "^2.5.1",
|
||||||
"compare-versions": "^6.1.0",
|
"compare-versions": "^6.1.0",
|
||||||
"dockerode": "^4.0.2",
|
"dockerode": "^4.0.2",
|
||||||
"follow-redirects": "^1.15.6",
|
"follow-redirects": "^1.15.9",
|
||||||
"gamedig": "^5.1.2",
|
"gamedig": "^5.1.2",
|
||||||
"i18next": "^21.10.0",
|
"i18next": "^21.10.0",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
@@ -38,27 +38,27 @@
|
|||||||
"swr": "^1.3.0",
|
"swr": "^1.3.0",
|
||||||
"systeminformation": "^5.23.2",
|
"systeminformation": "^5.23.2",
|
||||||
"tough-cookie": "^4.1.3",
|
"tough-cookie": "^4.1.3",
|
||||||
"urbackup-server-api": "^0.52.0",
|
"urbackup-server-api": "^0.52.1",
|
||||||
"winston": "^3.11.0",
|
"winston": "^3.11.0",
|
||||||
"xml-js": "^1.6.11"
|
"xml-js": "^1.6.11"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tailwindcss/forms": "^0.5.8",
|
"@tailwindcss/forms": "^0.5.8",
|
||||||
"autoprefixer": "^10.4.20",
|
"autoprefixer": "^10.4.20",
|
||||||
"eslint": "^8.57.0",
|
"eslint": "^8.57.1",
|
||||||
"eslint-config-airbnb": "^19.0.4",
|
"eslint-config-airbnb": "^19.0.4",
|
||||||
"eslint-config-next": "^14.2.3",
|
"eslint-config-next": "^14.2.3",
|
||||||
"eslint-config-prettier": "^9.1.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-plugin-import": "^2.29.1",
|
"eslint-plugin-import": "^2.31.0",
|
||||||
"eslint-plugin-jsx-a11y": "^6.8.0",
|
"eslint-plugin-jsx-a11y": "^6.8.0",
|
||||||
"eslint-plugin-prettier": "^5.2.1",
|
"eslint-plugin-prettier": "^5.2.1",
|
||||||
"eslint-plugin-react": "^7.36.1",
|
"eslint-plugin-react": "^7.37.1",
|
||||||
"eslint-plugin-react-hooks": "^4.6.2",
|
"eslint-plugin-react-hooks": "^4.6.2",
|
||||||
"postcss": "^8.4.38",
|
"postcss": "^8.4.47",
|
||||||
"prettier": "^3.2.5",
|
"prettier": "^3.2.5",
|
||||||
"tailwind-scrollbar": "^3.0.5",
|
"tailwind-scrollbar": "^3.0.5",
|
||||||
"tailwindcss": "^3.4.13",
|
"tailwindcss": "^3.4.14",
|
||||||
"typescript": "^5.4.5"
|
"typescript": "^5.6.3"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"osx-temperature-sensor": "^1.0.8"
|
"osx-temperature-sensor": "^1.0.8"
|
||||||
|
|||||||
337
pnpm-lock.yaml
generated
337
pnpm-lock.yaml
generated
@@ -27,8 +27,8 @@ importers:
|
|||||||
specifier: ^4.0.2
|
specifier: ^4.0.2
|
||||||
version: 4.0.2
|
version: 4.0.2
|
||||||
follow-redirects:
|
follow-redirects:
|
||||||
specifier: ^1.15.6
|
specifier: ^1.15.9
|
||||||
version: 1.15.8
|
version: 1.15.9
|
||||||
gamedig:
|
gamedig:
|
||||||
specifier: ^5.1.2
|
specifier: ^5.1.2
|
||||||
version: 5.1.3
|
version: 5.1.3
|
||||||
@@ -93,8 +93,8 @@ importers:
|
|||||||
specifier: ^4.1.3
|
specifier: ^4.1.3
|
||||||
version: 4.1.4
|
version: 4.1.4
|
||||||
urbackup-server-api:
|
urbackup-server-api:
|
||||||
specifier: ^0.52.0
|
specifier: ^0.52.1
|
||||||
version: 0.52.0
|
version: 0.52.1
|
||||||
winston:
|
winston:
|
||||||
specifier: ^3.11.0
|
specifier: ^3.11.0
|
||||||
version: 3.14.2
|
version: 3.14.2
|
||||||
@@ -108,52 +108,52 @@ importers:
|
|||||||
devDependencies:
|
devDependencies:
|
||||||
'@tailwindcss/forms':
|
'@tailwindcss/forms':
|
||||||
specifier: ^0.5.8
|
specifier: ^0.5.8
|
||||||
version: 0.5.9(tailwindcss@3.4.13)
|
version: 0.5.9(tailwindcss@3.4.14)
|
||||||
autoprefixer:
|
autoprefixer:
|
||||||
specifier: ^10.4.20
|
specifier: ^10.4.20
|
||||||
version: 10.4.20(postcss@8.4.45)
|
version: 10.4.20(postcss@8.4.47)
|
||||||
eslint:
|
eslint:
|
||||||
specifier: ^8.57.0
|
specifier: ^8.57.1
|
||||||
version: 8.57.0
|
version: 8.57.1
|
||||||
eslint-config-airbnb:
|
eslint-config-airbnb:
|
||||||
specifier: ^19.0.4
|
specifier: ^19.0.4
|
||||||
version: 19.0.4(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.36.1(eslint@8.57.0))(eslint@8.57.0)
|
version: 19.0.4(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.1(eslint@8.57.1))(eslint@8.57.1)
|
||||||
eslint-config-next:
|
eslint-config-next:
|
||||||
specifier: ^14.2.3
|
specifier: ^14.2.3
|
||||||
version: 14.2.8(eslint@8.57.0)(typescript@5.5.4)
|
version: 14.2.8(eslint@8.57.1)(typescript@5.6.3)
|
||||||
eslint-config-prettier:
|
eslint-config-prettier:
|
||||||
specifier: ^9.1.0
|
specifier: ^9.1.0
|
||||||
version: 9.1.0(eslint@8.57.0)
|
version: 9.1.0(eslint@8.57.1)
|
||||||
eslint-plugin-import:
|
eslint-plugin-import:
|
||||||
specifier: ^2.29.1
|
specifier: ^2.31.0
|
||||||
version: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
|
version: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
|
||||||
eslint-plugin-jsx-a11y:
|
eslint-plugin-jsx-a11y:
|
||||||
specifier: ^6.8.0
|
specifier: ^6.8.0
|
||||||
version: 6.10.0(eslint@8.57.0)
|
version: 6.10.0(eslint@8.57.1)
|
||||||
eslint-plugin-prettier:
|
eslint-plugin-prettier:
|
||||||
specifier: ^5.2.1
|
specifier: ^5.2.1
|
||||||
version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3)
|
version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3)
|
||||||
eslint-plugin-react:
|
eslint-plugin-react:
|
||||||
specifier: ^7.36.1
|
specifier: ^7.37.1
|
||||||
version: 7.36.1(eslint@8.57.0)
|
version: 7.37.1(eslint@8.57.1)
|
||||||
eslint-plugin-react-hooks:
|
eslint-plugin-react-hooks:
|
||||||
specifier: ^4.6.2
|
specifier: ^4.6.2
|
||||||
version: 4.6.2(eslint@8.57.0)
|
version: 4.6.2(eslint@8.57.1)
|
||||||
postcss:
|
postcss:
|
||||||
specifier: ^8.4.38
|
specifier: ^8.4.47
|
||||||
version: 8.4.45
|
version: 8.4.47
|
||||||
prettier:
|
prettier:
|
||||||
specifier: ^3.2.5
|
specifier: ^3.2.5
|
||||||
version: 3.3.3
|
version: 3.3.3
|
||||||
tailwind-scrollbar:
|
tailwind-scrollbar:
|
||||||
specifier: ^3.0.5
|
specifier: ^3.0.5
|
||||||
version: 3.1.0(tailwindcss@3.4.13)
|
version: 3.1.0(tailwindcss@3.4.14)
|
||||||
tailwindcss:
|
tailwindcss:
|
||||||
specifier: ^3.4.13
|
specifier: ^3.4.14
|
||||||
version: 3.4.13
|
version: 3.4.14
|
||||||
typescript:
|
typescript:
|
||||||
specifier: ^5.4.5
|
specifier: ^5.6.3
|
||||||
version: 5.5.4
|
version: 5.6.3
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
@@ -189,8 +189,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
|
resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
|
|
||||||
'@eslint/js@8.57.0':
|
'@eslint/js@8.57.1':
|
||||||
resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
|
resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
|
|
||||||
'@headlessui/react@1.7.19':
|
'@headlessui/react@1.7.19':
|
||||||
@@ -200,8 +200,8 @@ packages:
|
|||||||
react: ^16 || ^17 || ^18
|
react: ^16 || ^17 || ^18
|
||||||
react-dom: ^16 || ^17 || ^18
|
react-dom: ^16 || ^17 || ^18
|
||||||
|
|
||||||
'@humanwhocodes/config-array@0.11.14':
|
'@humanwhocodes/config-array@0.13.0':
|
||||||
resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
|
resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==}
|
||||||
engines: {node: '>=10.10.0'}
|
engines: {node: '>=10.10.0'}
|
||||||
deprecated: Use @eslint/config-array instead
|
deprecated: Use @eslint/config-array instead
|
||||||
|
|
||||||
@@ -1077,6 +1077,27 @@ packages:
|
|||||||
eslint-plugin-import-x:
|
eslint-plugin-import-x:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
eslint-module-utils@2.12.0:
|
||||||
|
resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==}
|
||||||
|
engines: {node: '>=4'}
|
||||||
|
peerDependencies:
|
||||||
|
'@typescript-eslint/parser': '*'
|
||||||
|
eslint: '*'
|
||||||
|
eslint-import-resolver-node: '*'
|
||||||
|
eslint-import-resolver-typescript: '*'
|
||||||
|
eslint-import-resolver-webpack: '*'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
'@typescript-eslint/parser':
|
||||||
|
optional: true
|
||||||
|
eslint:
|
||||||
|
optional: true
|
||||||
|
eslint-import-resolver-node:
|
||||||
|
optional: true
|
||||||
|
eslint-import-resolver-typescript:
|
||||||
|
optional: true
|
||||||
|
eslint-import-resolver-webpack:
|
||||||
|
optional: true
|
||||||
|
|
||||||
eslint-module-utils@2.9.0:
|
eslint-module-utils@2.9.0:
|
||||||
resolution: {integrity: sha512-McVbYmwA3NEKwRQY5g4aWMdcZE5xZxV8i8l7CqJSrameuGSQJtSWaL/LxTEzSKKaCcOhlpDR8XEfYXWPrdo/ZQ==}
|
resolution: {integrity: sha512-McVbYmwA3NEKwRQY5g4aWMdcZE5xZxV8i8l7CqJSrameuGSQJtSWaL/LxTEzSKKaCcOhlpDR8XEfYXWPrdo/ZQ==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
@@ -1098,12 +1119,12 @@ packages:
|
|||||||
eslint-import-resolver-webpack:
|
eslint-import-resolver-webpack:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
eslint-plugin-import@2.30.0:
|
eslint-plugin-import@2.31.0:
|
||||||
resolution: {integrity: sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==}
|
resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@typescript-eslint/parser': '*'
|
'@typescript-eslint/parser': '*'
|
||||||
eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
|
eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
|
||||||
peerDependenciesMeta:
|
peerDependenciesMeta:
|
||||||
'@typescript-eslint/parser':
|
'@typescript-eslint/parser':
|
||||||
optional: true
|
optional: true
|
||||||
@@ -1134,8 +1155,8 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
|
eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
|
||||||
|
|
||||||
eslint-plugin-react@7.36.1:
|
eslint-plugin-react@7.37.1:
|
||||||
resolution: {integrity: sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==}
|
resolution: {integrity: sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
|
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
|
||||||
@@ -1148,9 +1169,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
|
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
|
|
||||||
eslint@8.57.0:
|
eslint@8.57.1:
|
||||||
resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
|
resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
|
deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
espree@9.6.1:
|
espree@9.6.1:
|
||||||
@@ -1239,10 +1261,9 @@ packages:
|
|||||||
fn.name@1.1.0:
|
fn.name@1.1.0:
|
||||||
resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
|
resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
|
||||||
|
|
||||||
follow-redirects@1.15.8:
|
follow-redirects@1.15.9:
|
||||||
resolution: {integrity: sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==}
|
resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
|
||||||
engines: {node: '>=4.0'}
|
engines: {node: '>=4.0'}
|
||||||
deprecated: Browser detection issues fixed in v1.15.9
|
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
debug: '*'
|
debug: '*'
|
||||||
peerDependenciesMeta:
|
peerDependenciesMeta:
|
||||||
@@ -2096,8 +2117,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
|
resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
|
||||||
engines: {node: ^10 || ^12 || >=14}
|
engines: {node: ^10 || ^12 || >=14}
|
||||||
|
|
||||||
postcss@8.4.45:
|
postcss@8.4.47:
|
||||||
resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==}
|
resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
|
||||||
engines: {node: ^10 || ^12 || >=14}
|
engines: {node: ^10 || ^12 || >=14}
|
||||||
|
|
||||||
prelude-ls@1.2.1:
|
prelude-ls@1.2.1:
|
||||||
@@ -2372,6 +2393,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
|
resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
|
source-map-js@1.2.1:
|
||||||
|
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
|
||||||
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
split-ca@1.0.1:
|
split-ca@1.0.1:
|
||||||
resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==}
|
resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==}
|
||||||
|
|
||||||
@@ -2507,8 +2532,8 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
tailwindcss: 3.x
|
tailwindcss: 3.x
|
||||||
|
|
||||||
tailwindcss@3.4.13:
|
tailwindcss@3.4.14:
|
||||||
resolution: {integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==}
|
resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==}
|
||||||
engines: {node: '>=14.0.0'}
|
engines: {node: '>=14.0.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -2621,8 +2646,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
|
resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
typescript@5.5.4:
|
typescript@5.6.3:
|
||||||
resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==}
|
resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
|
||||||
engines: {node: '>=14.17'}
|
engines: {node: '>=14.17'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -2646,8 +2671,8 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
browserslist: '>= 4.21.0'
|
browserslist: '>= 4.21.0'
|
||||||
|
|
||||||
urbackup-server-api@0.52.0:
|
urbackup-server-api@0.52.1:
|
||||||
resolution: {integrity: sha512-KfroCFZEWCuCkWye1F1JwI2fkO1za/Mf1a8TNGTujzxU0ZGzDqhA1zCOcvV97q7nH1TKFNpw5tMZ06fSCKv2UA==}
|
resolution: {integrity: sha512-gAxF9MdXxnceqUr/1Uj2LuGZQb/bvZ3Ply9zH/UTSWGkwKL5C0qMPrBvKRyTHbPMG/NBuHF6BzavkF7GNvOLew==}
|
||||||
|
|
||||||
uri-js@4.4.1:
|
uri-js@4.4.1:
|
||||||
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
||||||
@@ -2785,9 +2810,9 @@ snapshots:
|
|||||||
enabled: 2.0.0
|
enabled: 2.0.0
|
||||||
kuler: 2.0.0
|
kuler: 2.0.0
|
||||||
|
|
||||||
'@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)':
|
'@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
eslint-visitor-keys: 3.4.3
|
eslint-visitor-keys: 3.4.3
|
||||||
|
|
||||||
'@eslint-community/regexpp@4.11.0': {}
|
'@eslint-community/regexpp@4.11.0': {}
|
||||||
@@ -2806,7 +2831,7 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@eslint/js@8.57.0': {}
|
'@eslint/js@8.57.1': {}
|
||||||
|
|
||||||
'@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
'@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2815,7 +2840,7 @@ snapshots:
|
|||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
|
||||||
'@humanwhocodes/config-array@0.11.14':
|
'@humanwhocodes/config-array@0.13.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@humanwhocodes/object-schema': 2.0.3
|
'@humanwhocodes/object-schema': 2.0.3
|
||||||
debug: 4.3.6
|
debug: 4.3.6
|
||||||
@@ -2953,10 +2978,10 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
defer-to-connect: 2.0.1
|
defer-to-connect: 2.0.1
|
||||||
|
|
||||||
'@tailwindcss/forms@0.5.9(tailwindcss@3.4.13)':
|
'@tailwindcss/forms@0.5.9(tailwindcss@3.4.14)':
|
||||||
dependencies:
|
dependencies:
|
||||||
mini-svg-data-uri: 1.4.4
|
mini-svg-data-uri: 1.4.4
|
||||||
tailwindcss: 3.4.13
|
tailwindcss: 3.4.14
|
||||||
|
|
||||||
'@tanstack/react-virtual@3.10.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
'@tanstack/react-virtual@3.10.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3012,36 +3037,36 @@ snapshots:
|
|||||||
|
|
||||||
'@types/triple-beam@1.3.5': {}
|
'@types/triple-beam@1.3.5': {}
|
||||||
|
|
||||||
'@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)':
|
'@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/regexpp': 4.11.0
|
'@eslint-community/regexpp': 4.11.0
|
||||||
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4)
|
'@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
|
||||||
'@typescript-eslint/scope-manager': 7.2.0
|
'@typescript-eslint/scope-manager': 7.2.0
|
||||||
'@typescript-eslint/type-utils': 7.2.0(eslint@8.57.0)(typescript@5.5.4)
|
'@typescript-eslint/type-utils': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
|
||||||
'@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.5.4)
|
'@typescript-eslint/utils': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
|
||||||
'@typescript-eslint/visitor-keys': 7.2.0
|
'@typescript-eslint/visitor-keys': 7.2.0
|
||||||
debug: 4.3.6
|
debug: 4.3.6
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
graphemer: 1.4.0
|
graphemer: 1.4.0
|
||||||
ignore: 5.3.2
|
ignore: 5.3.2
|
||||||
natural-compare: 1.4.0
|
natural-compare: 1.4.0
|
||||||
semver: 7.6.3
|
semver: 7.6.3
|
||||||
ts-api-utils: 1.3.0(typescript@5.5.4)
|
ts-api-utils: 1.3.0(typescript@5.6.3)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.5.4
|
typescript: 5.6.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4)':
|
'@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/scope-manager': 7.2.0
|
'@typescript-eslint/scope-manager': 7.2.0
|
||||||
'@typescript-eslint/types': 7.2.0
|
'@typescript-eslint/types': 7.2.0
|
||||||
'@typescript-eslint/typescript-estree': 7.2.0(typescript@5.5.4)
|
'@typescript-eslint/typescript-estree': 7.2.0(typescript@5.6.3)
|
||||||
'@typescript-eslint/visitor-keys': 7.2.0
|
'@typescript-eslint/visitor-keys': 7.2.0
|
||||||
debug: 4.3.6
|
debug: 4.3.6
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.5.4
|
typescript: 5.6.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
@@ -3050,21 +3075,21 @@ snapshots:
|
|||||||
'@typescript-eslint/types': 7.2.0
|
'@typescript-eslint/types': 7.2.0
|
||||||
'@typescript-eslint/visitor-keys': 7.2.0
|
'@typescript-eslint/visitor-keys': 7.2.0
|
||||||
|
|
||||||
'@typescript-eslint/type-utils@7.2.0(eslint@8.57.0)(typescript@5.5.4)':
|
'@typescript-eslint/type-utils@7.2.0(eslint@8.57.1)(typescript@5.6.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/typescript-estree': 7.2.0(typescript@5.5.4)
|
'@typescript-eslint/typescript-estree': 7.2.0(typescript@5.6.3)
|
||||||
'@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.5.4)
|
'@typescript-eslint/utils': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
|
||||||
debug: 4.3.6
|
debug: 4.3.6
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
ts-api-utils: 1.3.0(typescript@5.5.4)
|
ts-api-utils: 1.3.0(typescript@5.6.3)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.5.4
|
typescript: 5.6.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@typescript-eslint/types@7.2.0': {}
|
'@typescript-eslint/types@7.2.0': {}
|
||||||
|
|
||||||
'@typescript-eslint/typescript-estree@7.2.0(typescript@5.5.4)':
|
'@typescript-eslint/typescript-estree@7.2.0(typescript@5.6.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/types': 7.2.0
|
'@typescript-eslint/types': 7.2.0
|
||||||
'@typescript-eslint/visitor-keys': 7.2.0
|
'@typescript-eslint/visitor-keys': 7.2.0
|
||||||
@@ -3073,21 +3098,21 @@ snapshots:
|
|||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
minimatch: 9.0.3
|
minimatch: 9.0.3
|
||||||
semver: 7.6.3
|
semver: 7.6.3
|
||||||
ts-api-utils: 1.3.0(typescript@5.5.4)
|
ts-api-utils: 1.3.0(typescript@5.6.3)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.5.4
|
typescript: 5.6.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.5.4)':
|
'@typescript-eslint/utils@7.2.0(eslint@8.57.1)(typescript@5.6.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
|
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1)
|
||||||
'@types/json-schema': 7.0.15
|
'@types/json-schema': 7.0.15
|
||||||
'@types/semver': 7.5.8
|
'@types/semver': 7.5.8
|
||||||
'@typescript-eslint/scope-manager': 7.2.0
|
'@typescript-eslint/scope-manager': 7.2.0
|
||||||
'@typescript-eslint/types': 7.2.0
|
'@typescript-eslint/types': 7.2.0
|
||||||
'@typescript-eslint/typescript-estree': 7.2.0(typescript@5.5.4)
|
'@typescript-eslint/typescript-estree': 7.2.0(typescript@5.6.3)
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
semver: 7.6.3
|
semver: 7.6.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
@@ -3221,14 +3246,14 @@ snapshots:
|
|||||||
|
|
||||||
asynckit@0.4.0: {}
|
asynckit@0.4.0: {}
|
||||||
|
|
||||||
autoprefixer@10.4.20(postcss@8.4.45):
|
autoprefixer@10.4.20(postcss@8.4.47):
|
||||||
dependencies:
|
dependencies:
|
||||||
browserslist: 4.23.3
|
browserslist: 4.23.3
|
||||||
caniuse-lite: 1.0.30001657
|
caniuse-lite: 1.0.30001657
|
||||||
fraction.js: 4.3.7
|
fraction.js: 4.3.7
|
||||||
normalize-range: 0.1.2
|
normalize-range: 0.1.2
|
||||||
picocolors: 1.1.0
|
picocolors: 1.1.0
|
||||||
postcss: 8.4.45
|
postcss: 8.4.47
|
||||||
postcss-value-parser: 4.2.0
|
postcss-value-parser: 4.2.0
|
||||||
|
|
||||||
available-typed-arrays@1.0.7:
|
available-typed-arrays@1.0.7:
|
||||||
@@ -3756,49 +3781,49 @@ snapshots:
|
|||||||
|
|
||||||
escape-string-regexp@4.0.0: {}
|
escape-string-regexp@4.0.0: {}
|
||||||
|
|
||||||
eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0):
|
eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
confusing-browser-globals: 1.0.11
|
confusing-browser-globals: 1.0.11
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
|
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
|
||||||
object.assign: 4.1.5
|
object.assign: 4.1.5
|
||||||
object.entries: 1.1.8
|
object.entries: 1.1.8
|
||||||
semver: 6.3.1
|
semver: 6.3.1
|
||||||
|
|
||||||
eslint-config-airbnb@19.0.4(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.36.1(eslint@8.57.0))(eslint@8.57.0):
|
eslint-config-airbnb@19.0.4(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.1(eslint@8.57.1))(eslint@8.57.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0)
|
eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1)
|
||||||
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
|
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
|
||||||
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.0)
|
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1)
|
||||||
eslint-plugin-react: 7.36.1(eslint@8.57.0)
|
eslint-plugin-react: 7.37.1(eslint@8.57.1)
|
||||||
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0)
|
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1)
|
||||||
object.assign: 4.1.5
|
object.assign: 4.1.5
|
||||||
object.entries: 1.1.8
|
object.entries: 1.1.8
|
||||||
|
|
||||||
eslint-config-next@14.2.8(eslint@8.57.0)(typescript@5.5.4):
|
eslint-config-next@14.2.8(eslint@8.57.1)(typescript@5.6.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@next/eslint-plugin-next': 14.2.8
|
'@next/eslint-plugin-next': 14.2.8
|
||||||
'@rushstack/eslint-patch': 1.10.4
|
'@rushstack/eslint-patch': 1.10.4
|
||||||
'@typescript-eslint/eslint-plugin': 7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)
|
'@typescript-eslint/eslint-plugin': 7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)
|
||||||
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4)
|
'@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
eslint-import-resolver-node: 0.3.9
|
eslint-import-resolver-node: 0.3.9
|
||||||
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0)
|
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
|
||||||
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
|
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
|
||||||
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.0)
|
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1)
|
||||||
eslint-plugin-react: 7.36.1(eslint@8.57.0)
|
eslint-plugin-react: 7.37.1(eslint@8.57.1)
|
||||||
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0)
|
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.5.4
|
typescript: 5.6.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- eslint-import-resolver-webpack
|
- eslint-import-resolver-webpack
|
||||||
- eslint-plugin-import-x
|
- eslint-plugin-import-x
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
eslint-config-prettier@9.1.0(eslint@8.57.0):
|
eslint-config-prettier@9.1.0(eslint@8.57.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
|
|
||||||
eslint-import-resolver-node@0.3.9:
|
eslint-import-resolver-node@0.3.9:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3808,37 +3833,48 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0):
|
eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nolyfill/is-core-module': 1.0.39
|
'@nolyfill/is-core-module': 1.0.39
|
||||||
debug: 4.3.6
|
debug: 4.3.6
|
||||||
enhanced-resolve: 5.17.1
|
enhanced-resolve: 5.17.1
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
eslint-module-utils: 2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0)
|
eslint-module-utils: 2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1)
|
||||||
fast-glob: 3.3.2
|
fast-glob: 3.3.2
|
||||||
get-tsconfig: 4.8.0
|
get-tsconfig: 4.8.0
|
||||||
is-bun-module: 1.1.0
|
is-bun-module: 1.1.0
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
|
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@typescript-eslint/parser'
|
- '@typescript-eslint/parser'
|
||||||
- eslint-import-resolver-node
|
- eslint-import-resolver-node
|
||||||
- eslint-import-resolver-webpack
|
- eslint-import-resolver-webpack
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
eslint-module-utils@2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0):
|
eslint-module-utils@2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 3.2.7
|
debug: 3.2.7
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4)
|
'@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
eslint-import-resolver-node: 0.3.9
|
eslint-import-resolver-node: 0.3.9
|
||||||
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0)
|
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0):
|
eslint-module-utils@2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1):
|
||||||
|
dependencies:
|
||||||
|
debug: 3.2.7
|
||||||
|
optionalDependencies:
|
||||||
|
'@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
|
||||||
|
eslint: 8.57.1
|
||||||
|
eslint-import-resolver-node: 0.3.9
|
||||||
|
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
|
eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@rtsao/scc': 1.1.0
|
'@rtsao/scc': 1.1.0
|
||||||
array-includes: 3.1.8
|
array-includes: 3.1.8
|
||||||
@@ -3847,9 +3883,9 @@ snapshots:
|
|||||||
array.prototype.flatmap: 1.3.2
|
array.prototype.flatmap: 1.3.2
|
||||||
debug: 3.2.7
|
debug: 3.2.7
|
||||||
doctrine: 2.1.0
|
doctrine: 2.1.0
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
eslint-import-resolver-node: 0.3.9
|
eslint-import-resolver-node: 0.3.9
|
||||||
eslint-module-utils: 2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0)
|
eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1)
|
||||||
hasown: 2.0.2
|
hasown: 2.0.2
|
||||||
is-core-module: 2.15.1
|
is-core-module: 2.15.1
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
@@ -3858,15 +3894,16 @@ snapshots:
|
|||||||
object.groupby: 1.0.3
|
object.groupby: 1.0.3
|
||||||
object.values: 1.2.0
|
object.values: 1.2.0
|
||||||
semver: 6.3.1
|
semver: 6.3.1
|
||||||
|
string.prototype.trimend: 1.0.8
|
||||||
tsconfig-paths: 3.15.0
|
tsconfig-paths: 3.15.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4)
|
'@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.3)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- eslint-import-resolver-typescript
|
- eslint-import-resolver-typescript
|
||||||
- eslint-import-resolver-webpack
|
- eslint-import-resolver-webpack
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.0):
|
eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
aria-query: 5.1.3
|
aria-query: 5.1.3
|
||||||
array-includes: 3.1.8
|
array-includes: 3.1.8
|
||||||
@@ -3877,7 +3914,7 @@ snapshots:
|
|||||||
damerau-levenshtein: 1.0.8
|
damerau-levenshtein: 1.0.8
|
||||||
emoji-regex: 9.2.2
|
emoji-regex: 9.2.2
|
||||||
es-iterator-helpers: 1.0.19
|
es-iterator-helpers: 1.0.19
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
hasown: 2.0.2
|
hasown: 2.0.2
|
||||||
jsx-ast-utils: 3.3.5
|
jsx-ast-utils: 3.3.5
|
||||||
language-tags: 1.0.9
|
language-tags: 1.0.9
|
||||||
@@ -3886,20 +3923,20 @@ snapshots:
|
|||||||
safe-regex-test: 1.0.3
|
safe-regex-test: 1.0.3
|
||||||
string.prototype.includes: 2.0.0
|
string.prototype.includes: 2.0.0
|
||||||
|
|
||||||
eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3):
|
eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
prettier: 3.3.3
|
prettier: 3.3.3
|
||||||
prettier-linter-helpers: 1.0.0
|
prettier-linter-helpers: 1.0.0
|
||||||
synckit: 0.9.1
|
synckit: 0.9.1
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
eslint-config-prettier: 9.1.0(eslint@8.57.0)
|
eslint-config-prettier: 9.1.0(eslint@8.57.1)
|
||||||
|
|
||||||
eslint-plugin-react-hooks@4.6.2(eslint@8.57.0):
|
eslint-plugin-react-hooks@4.6.2(eslint@8.57.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
|
|
||||||
eslint-plugin-react@7.36.1(eslint@8.57.0):
|
eslint-plugin-react@7.37.1(eslint@8.57.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
array-includes: 3.1.8
|
array-includes: 3.1.8
|
||||||
array.prototype.findlast: 1.2.5
|
array.prototype.findlast: 1.2.5
|
||||||
@@ -3907,7 +3944,7 @@ snapshots:
|
|||||||
array.prototype.tosorted: 1.1.4
|
array.prototype.tosorted: 1.1.4
|
||||||
doctrine: 2.1.0
|
doctrine: 2.1.0
|
||||||
es-iterator-helpers: 1.0.19
|
es-iterator-helpers: 1.0.19
|
||||||
eslint: 8.57.0
|
eslint: 8.57.1
|
||||||
estraverse: 5.3.0
|
estraverse: 5.3.0
|
||||||
hasown: 2.0.2
|
hasown: 2.0.2
|
||||||
jsx-ast-utils: 3.3.5
|
jsx-ast-utils: 3.3.5
|
||||||
@@ -3928,13 +3965,13 @@ snapshots:
|
|||||||
|
|
||||||
eslint-visitor-keys@3.4.3: {}
|
eslint-visitor-keys@3.4.3: {}
|
||||||
|
|
||||||
eslint@8.57.0:
|
eslint@8.57.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
|
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1)
|
||||||
'@eslint-community/regexpp': 4.11.0
|
'@eslint-community/regexpp': 4.11.0
|
||||||
'@eslint/eslintrc': 2.1.4
|
'@eslint/eslintrc': 2.1.4
|
||||||
'@eslint/js': 8.57.0
|
'@eslint/js': 8.57.1
|
||||||
'@humanwhocodes/config-array': 0.11.14
|
'@humanwhocodes/config-array': 0.13.0
|
||||||
'@humanwhocodes/module-importer': 1.0.1
|
'@humanwhocodes/module-importer': 1.0.1
|
||||||
'@nodelib/fs.walk': 1.2.8
|
'@nodelib/fs.walk': 1.2.8
|
||||||
'@ungap/structured-clone': 1.2.0
|
'@ungap/structured-clone': 1.2.0
|
||||||
@@ -4056,7 +4093,7 @@ snapshots:
|
|||||||
|
|
||||||
fn.name@1.1.0: {}
|
fn.name@1.1.0: {}
|
||||||
|
|
||||||
follow-redirects@1.15.8: {}
|
follow-redirects@1.15.9: {}
|
||||||
|
|
||||||
for-each@0.3.3:
|
for-each@0.3.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -4855,28 +4892,28 @@ snapshots:
|
|||||||
|
|
||||||
possible-typed-array-names@1.0.0: {}
|
possible-typed-array-names@1.0.0: {}
|
||||||
|
|
||||||
postcss-import@15.1.0(postcss@8.4.45):
|
postcss-import@15.1.0(postcss@8.4.47):
|
||||||
dependencies:
|
dependencies:
|
||||||
postcss: 8.4.45
|
postcss: 8.4.47
|
||||||
postcss-value-parser: 4.2.0
|
postcss-value-parser: 4.2.0
|
||||||
read-cache: 1.0.0
|
read-cache: 1.0.0
|
||||||
resolve: 1.22.8
|
resolve: 1.22.8
|
||||||
|
|
||||||
postcss-js@4.0.1(postcss@8.4.45):
|
postcss-js@4.0.1(postcss@8.4.47):
|
||||||
dependencies:
|
dependencies:
|
||||||
camelcase-css: 2.0.1
|
camelcase-css: 2.0.1
|
||||||
postcss: 8.4.45
|
postcss: 8.4.47
|
||||||
|
|
||||||
postcss-load-config@4.0.2(postcss@8.4.45):
|
postcss-load-config@4.0.2(postcss@8.4.47):
|
||||||
dependencies:
|
dependencies:
|
||||||
lilconfig: 3.1.2
|
lilconfig: 3.1.2
|
||||||
yaml: 2.5.1
|
yaml: 2.5.1
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
postcss: 8.4.45
|
postcss: 8.4.47
|
||||||
|
|
||||||
postcss-nested@6.2.0(postcss@8.4.45):
|
postcss-nested@6.2.0(postcss@8.4.47):
|
||||||
dependencies:
|
dependencies:
|
||||||
postcss: 8.4.45
|
postcss: 8.4.47
|
||||||
postcss-selector-parser: 6.1.2
|
postcss-selector-parser: 6.1.2
|
||||||
|
|
||||||
postcss-selector-parser@6.1.2:
|
postcss-selector-parser@6.1.2:
|
||||||
@@ -4892,11 +4929,11 @@ snapshots:
|
|||||||
picocolors: 1.1.0
|
picocolors: 1.1.0
|
||||||
source-map-js: 1.2.0
|
source-map-js: 1.2.0
|
||||||
|
|
||||||
postcss@8.4.45:
|
postcss@8.4.47:
|
||||||
dependencies:
|
dependencies:
|
||||||
nanoid: 3.3.7
|
nanoid: 3.3.7
|
||||||
picocolors: 1.1.0
|
picocolors: 1.1.0
|
||||||
source-map-js: 1.2.0
|
source-map-js: 1.2.1
|
||||||
|
|
||||||
prelude-ls@1.2.1: {}
|
prelude-ls@1.2.1: {}
|
||||||
|
|
||||||
@@ -5202,6 +5239,8 @@ snapshots:
|
|||||||
|
|
||||||
source-map-js@1.2.0: {}
|
source-map-js@1.2.0: {}
|
||||||
|
|
||||||
|
source-map-js@1.2.1: {}
|
||||||
|
|
||||||
split-ca@1.0.1: {}
|
split-ca@1.0.1: {}
|
||||||
|
|
||||||
ssh2@1.15.0:
|
ssh2@1.15.0:
|
||||||
@@ -5350,11 +5389,11 @@ snapshots:
|
|||||||
|
|
||||||
systeminformation@5.23.5: {}
|
systeminformation@5.23.5: {}
|
||||||
|
|
||||||
tailwind-scrollbar@3.1.0(tailwindcss@3.4.13):
|
tailwind-scrollbar@3.1.0(tailwindcss@3.4.14):
|
||||||
dependencies:
|
dependencies:
|
||||||
tailwindcss: 3.4.13
|
tailwindcss: 3.4.14
|
||||||
|
|
||||||
tailwindcss@3.4.13:
|
tailwindcss@3.4.14:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@alloc/quick-lru': 5.2.0
|
'@alloc/quick-lru': 5.2.0
|
||||||
arg: 5.0.2
|
arg: 5.0.2
|
||||||
@@ -5370,11 +5409,11 @@ snapshots:
|
|||||||
normalize-path: 3.0.0
|
normalize-path: 3.0.0
|
||||||
object-hash: 3.0.0
|
object-hash: 3.0.0
|
||||||
picocolors: 1.1.0
|
picocolors: 1.1.0
|
||||||
postcss: 8.4.45
|
postcss: 8.4.47
|
||||||
postcss-import: 15.1.0(postcss@8.4.45)
|
postcss-import: 15.1.0(postcss@8.4.47)
|
||||||
postcss-js: 4.0.1(postcss@8.4.45)
|
postcss-js: 4.0.1(postcss@8.4.47)
|
||||||
postcss-load-config: 4.0.2(postcss@8.4.45)
|
postcss-load-config: 4.0.2(postcss@8.4.47)
|
||||||
postcss-nested: 6.2.0(postcss@8.4.45)
|
postcss-nested: 6.2.0(postcss@8.4.47)
|
||||||
postcss-selector-parser: 6.1.2
|
postcss-selector-parser: 6.1.2
|
||||||
resolve: 1.22.8
|
resolve: 1.22.8
|
||||||
sucrase: 3.35.0
|
sucrase: 3.35.0
|
||||||
@@ -5449,9 +5488,9 @@ snapshots:
|
|||||||
|
|
||||||
triple-beam@1.4.1: {}
|
triple-beam@1.4.1: {}
|
||||||
|
|
||||||
ts-api-utils@1.3.0(typescript@5.5.4):
|
ts-api-utils@1.3.0(typescript@5.6.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
typescript: 5.5.4
|
typescript: 5.6.3
|
||||||
|
|
||||||
ts-interface-checker@0.1.13: {}
|
ts-interface-checker@0.1.13: {}
|
||||||
|
|
||||||
@@ -5510,7 +5549,7 @@ snapshots:
|
|||||||
is-typed-array: 1.1.13
|
is-typed-array: 1.1.13
|
||||||
possible-typed-array-names: 1.0.0
|
possible-typed-array-names: 1.0.0
|
||||||
|
|
||||||
typescript@5.5.4: {}
|
typescript@5.6.3: {}
|
||||||
|
|
||||||
unbox-primitive@1.0.2:
|
unbox-primitive@1.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -5531,7 +5570,7 @@ snapshots:
|
|||||||
escalade: 3.2.0
|
escalade: 3.2.0
|
||||||
picocolors: 1.1.0
|
picocolors: 1.1.0
|
||||||
|
|
||||||
urbackup-server-api@0.52.0:
|
urbackup-server-api@0.52.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
async-mutex: 0.5.0
|
async-mutex: 0.5.0
|
||||||
node-fetch: 2.7.0
|
node-fetch: 2.7.0
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
"ms": "{{value, number}}",
|
"ms": "{{value, number}}",
|
||||||
"date": "{{value, date}}",
|
"date": "{{value, date}}",
|
||||||
"relativeDate": "{{value, relativeDate}}",
|
"relativeDate": "{{value, relativeDate}}",
|
||||||
"uptime": "{{value, uptime}}",
|
"duration": "{{value, duration}}",
|
||||||
"months": "mo",
|
"months": "mo",
|
||||||
"days": "d",
|
"days": "d",
|
||||||
"hours": "h",
|
"hours": "h",
|
||||||
@@ -953,5 +953,30 @@
|
|||||||
"reminders": "Reminders",
|
"reminders": "Reminders",
|
||||||
"nextReminder": "Next Reminder",
|
"nextReminder": "Next Reminder",
|
||||||
"none": "None"
|
"none": "None"
|
||||||
|
},
|
||||||
|
"vikunja": {
|
||||||
|
"projects": "Active Projects",
|
||||||
|
"tasks7d": "Tasks Due This Week",
|
||||||
|
"tasksOverdue": "Overdue Tasks",
|
||||||
|
"tasksInProgress": "Tasks In Progress"
|
||||||
|
},
|
||||||
|
"headscale": {
|
||||||
|
"name": "Name",
|
||||||
|
"address": "Address",
|
||||||
|
"last_seen": "Last Seen",
|
||||||
|
"status": "Status",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline"
|
||||||
|
},
|
||||||
|
"beszel": {
|
||||||
|
"name": "Name",
|
||||||
|
"systems": "Systems",
|
||||||
|
"up": "Up",
|
||||||
|
"status": "Status",
|
||||||
|
"updated": "Updated",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "MEM",
|
||||||
|
"disk": "Disk",
|
||||||
|
"network": "NET"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export default function BookmarksGroup({ bookmarks, layout, disableCollapse, gro
|
|||||||
className={classNames(
|
className={classNames(
|
||||||
"bookmark-group",
|
"bookmark-group",
|
||||||
layout?.style === "row" ? "basis-full" : "basis-full md:basis-1/4 lg:basis-1/5 xl:basis-1/6",
|
layout?.style === "row" ? "basis-full" : "basis-full md:basis-1/4 lg:basis-1/5 xl:basis-1/6",
|
||||||
layout?.header === false ? "flex-1 px-1 -my-1" : "flex-1 p-1",
|
layout?.header === false ? "flex-1 px-1 -my-1 overflow-hidden" : "flex-1 p-1 overflow-hidden",
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<Disclosure defaultOpen={!(layout?.initiallyCollapsed ?? groupsInitiallyCollapsed) ?? true}>
|
<Disclosure defaultOpen={!(layout?.initiallyCollapsed ?? groupsInitiallyCollapsed) ?? true}>
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export default function Item({ bookmark }) {
|
|||||||
<a
|
<a
|
||||||
href={bookmark.href}
|
href={bookmark.href}
|
||||||
title={bookmark.name}
|
title={bookmark.name}
|
||||||
|
rel="noreferrer"
|
||||||
target={bookmark.target ?? settings.target ?? "_blank"}
|
target={bookmark.target ?? settings.target ?? "_blank"}
|
||||||
className={classNames(
|
className={classNames(
|
||||||
settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? "-" : ""}${settings.cardBlur}`,
|
settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? "-" : ""}${settings.cardBlur}`,
|
||||||
@@ -28,9 +29,9 @@ export default function Item({ bookmark }) {
|
|||||||
)}
|
)}
|
||||||
{!bookmark.icon && bookmark.abbr}
|
{!bookmark.icon && bookmark.abbr}
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-1 flex items-center justify-between rounded-r-md bookmark-text">
|
<div className="flex-1 overflow-hidden flex items-center justify-between rounded-r-md bookmark-text">
|
||||||
<div className="flex-1 grow pl-3 py-2 text-xs bookmark-name">{bookmark.name}</div>
|
<div className="pl-3 py-2 text-xs bookmark-name">{bookmark.name}</div>
|
||||||
<div className="px-2 py-2 truncate text-theme-500 dark:text-theme-300 text-xs bookmark-description">
|
<div className="shrink truncate px-2 py-2 text-theme-500 dark:text-theme-300 text-xs bookmark-description">
|
||||||
{description}
|
{description}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -98,6 +98,12 @@ export default function QuickLaunch({ servicesAndBookmarks, searchString, setSea
|
|||||||
} else if (event.key === "ArrowUp" && currentItemIndex > 0) {
|
} else if (event.key === "ArrowUp" && currentItemIndex > 0) {
|
||||||
setCurrentItemIndex(currentItemIndex - 1);
|
setCurrentItemIndex(currentItemIndex - 1);
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
} else if (
|
||||||
|
event.key === "ArrowRight" &&
|
||||||
|
results[currentItemIndex] &&
|
||||||
|
results[currentItemIndex].type === "searchSuggestion"
|
||||||
|
) {
|
||||||
|
setSearchString(results[currentItemIndex].name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ export default function Uptime({ refresh = 1500 }) {
|
|||||||
return (
|
return (
|
||||||
<Resource
|
<Resource
|
||||||
icon={FaRegClock}
|
icon={FaRegClock}
|
||||||
value={t("common.uptime", { value: data.uptime })}
|
value={t("common.duration", { value: data.uptime })}
|
||||||
label={t("resources.uptime")}
|
label={t("resources.uptime")}
|
||||||
percentage={percent}
|
percentage={percent}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ export default function Document() {
|
|||||||
name="description"
|
name="description"
|
||||||
content="A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations."
|
content="A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations."
|
||||||
/>
|
/>
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
<meta name="mobile-web-app-capable" content="yes" />
|
||||||
<link rel="manifest" href="/site.webmanifest?v=4" crossOrigin="use-credentials" />
|
<link rel="manifest" href="/site.webmanifest?v=4" crossOrigin="use-credentials" />
|
||||||
</Head>
|
</Head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ export default async function handler(req, res) {
|
|||||||
|
|
||||||
if (!widget) {
|
if (!widget) {
|
||||||
logger.debug("Unknown proxy service type: %s", type);
|
logger.debug("Unknown proxy service type: %s", type);
|
||||||
return res.status(403).json({ error: "Unkown proxy service type" });
|
return res.status(403).json({ error: "Unknown proxy service type" });
|
||||||
}
|
}
|
||||||
|
|
||||||
const serviceProxyHandler = widget.proxyHandler || genericProxyHandler;
|
const serviceProxyHandler = widget.proxyHandler || genericProxyHandler;
|
||||||
@@ -107,7 +107,7 @@ export default async function handler(req, res) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
logger.debug("Unknown proxy service type: %s", type);
|
logger.debug("Unknown proxy service type: %s", type);
|
||||||
return res.status(403).json({ error: "Unkown proxy service type" });
|
return res.status(403).json({ error: "Unknown proxy service type" });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e) logger.error(e);
|
if (e) logger.error(e);
|
||||||
return res.status(500).send({ error: "Unexpected error" });
|
return res.status(500).send({ error: "Unexpected error" });
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import cachedFetch from "utils/proxy/cached-fetch";
|
|||||||
|
|
||||||
export default async function handler(req, res) {
|
export default async function handler(req, res) {
|
||||||
const { latitude, longitude, units, cache, timezone } = req.query;
|
const { latitude, longitude, units, cache, timezone } = req.query;
|
||||||
const degrees = units === "imperial" ? "fahrenheit" : "celsius";
|
const degrees = units === "metric" ? "celsius" : "fahrenheit";
|
||||||
const timezeone = timezone ?? "auto";
|
const timezeone = timezone ?? "auto";
|
||||||
const apiUrl = `https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}&daily=sunrise,sunset¤t_weather=true&temperature_unit=${degrees}&timezone=${timezeone}`;
|
const apiUrl = `https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}&daily=sunrise,sunset¤t_weather=true&temperature_unit=${degrees}&timezone=${timezeone}`;
|
||||||
return res.send(await cachedFetch(apiUrl, cache));
|
return res.send(await cachedFetch(apiUrl, cache));
|
||||||
|
|||||||
@@ -368,6 +368,9 @@ export function cleanServiceGroups(groups) {
|
|||||||
repositoryId,
|
repositoryId,
|
||||||
userEmail,
|
userEmail,
|
||||||
|
|
||||||
|
// beszel
|
||||||
|
systemId,
|
||||||
|
|
||||||
// calendar
|
// calendar
|
||||||
firstDayInWeek,
|
firstDayInWeek,
|
||||||
integrations,
|
integrations,
|
||||||
@@ -406,7 +409,7 @@ export function cleanServiceGroups(groups) {
|
|||||||
// frigate
|
// frigate
|
||||||
enableRecentEvents,
|
enableRecentEvents,
|
||||||
|
|
||||||
// glances, mealie, pihole, pfsense
|
// glances, immich, mealie, pihole, pfsense
|
||||||
version,
|
version,
|
||||||
|
|
||||||
// glances
|
// glances
|
||||||
@@ -478,6 +481,9 @@ export function cleanServiceGroups(groups) {
|
|||||||
// unifi
|
// unifi
|
||||||
site,
|
site,
|
||||||
|
|
||||||
|
// vikunja
|
||||||
|
enableTaskList,
|
||||||
|
|
||||||
// wgeasy
|
// wgeasy
|
||||||
threshold,
|
threshold,
|
||||||
|
|
||||||
@@ -508,6 +514,10 @@ export function cleanServiceGroups(groups) {
|
|||||||
if (repositoryId) cleanedService.widget.repositoryId = repositoryId;
|
if (repositoryId) cleanedService.widget.repositoryId = repositoryId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (type === "beszel") {
|
||||||
|
if (systemId) cleanedService.widget.systemId = systemId;
|
||||||
|
}
|
||||||
|
|
||||||
if (type === "coinmarketcap") {
|
if (type === "coinmarketcap") {
|
||||||
if (currency) cleanedService.widget.currency = currency;
|
if (currency) cleanedService.widget.currency = currency;
|
||||||
if (symbols) cleanedService.widget.symbols = symbols;
|
if (symbols) cleanedService.widget.symbols = symbols;
|
||||||
@@ -568,8 +578,8 @@ export function cleanServiceGroups(groups) {
|
|||||||
if (snapshotHost) cleanedService.widget.snapshotHost = snapshotHost;
|
if (snapshotHost) cleanedService.widget.snapshotHost = snapshotHost;
|
||||||
if (snapshotPath) cleanedService.widget.snapshotPath = snapshotPath;
|
if (snapshotPath) cleanedService.widget.snapshotPath = snapshotPath;
|
||||||
}
|
}
|
||||||
if (["glances", "mealie", "pfsense", "pihole"].includes(type)) {
|
if (["glances", "immich", "mealie", "pfsense", "pihole"].includes(type)) {
|
||||||
if (version) cleanedService.widget.version = version;
|
if (version) cleanedService.widget.version = parseInt(version, 10);
|
||||||
}
|
}
|
||||||
if (type === "glances") {
|
if (type === "glances") {
|
||||||
if (metric) cleanedService.widget.metric = metric;
|
if (metric) cleanedService.widget.metric = metric;
|
||||||
@@ -631,7 +641,10 @@ export function cleanServiceGroups(groups) {
|
|||||||
if (range !== undefined) cleanedService.widget.range = range;
|
if (range !== undefined) cleanedService.widget.range = range;
|
||||||
}
|
}
|
||||||
if (type === "lubelogger") {
|
if (type === "lubelogger") {
|
||||||
if (vehicleID !== undefined) cleanedService.widget.vehicleID = vehicleID;
|
if (vehicleID !== undefined) cleanedService.widget.vehicleID = parseInt(vehicleID, 10);
|
||||||
|
}
|
||||||
|
if (type === "vikunja") {
|
||||||
|
if (enableTaskList !== undefined) cleanedService.widget.enableTaskList = !!enableTaskList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,11 +39,14 @@ export default async function credentialedProxyHandler(req, res, map) {
|
|||||||
"authentik",
|
"authentik",
|
||||||
"cloudflared",
|
"cloudflared",
|
||||||
"ghostfolio",
|
"ghostfolio",
|
||||||
|
"headscale",
|
||||||
"linkwarden",
|
"linkwarden",
|
||||||
"mealie",
|
"mealie",
|
||||||
|
"netalertx",
|
||||||
"tailscale",
|
"tailscale",
|
||||||
"tandoor",
|
"tandoor",
|
||||||
"pterodactyl",
|
"pterodactyl",
|
||||||
|
"vikunja",
|
||||||
].includes(widget.type)
|
].includes(widget.type)
|
||||||
) {
|
) {
|
||||||
headers.Authorization = `Bearer ${widget.key}`;
|
headers.Authorization = `Bearer ${widget.key}`;
|
||||||
|
|||||||
@@ -39,11 +39,8 @@ export default function Component({ service }) {
|
|||||||
<Block label="audiobookshelf.podcasts" value={t("common.number", { value: totalPodcasts })} />
|
<Block label="audiobookshelf.podcasts" value={t("common.number", { value: totalPodcasts })} />
|
||||||
<Block
|
<Block
|
||||||
label="audiobookshelf.podcastsDuration"
|
label="audiobookshelf.podcastsDuration"
|
||||||
value={t("common.number", {
|
value={t("common.duration", {
|
||||||
value: totalPodcastsDuration / 60,
|
value: totalPodcastsDuration,
|
||||||
maximumFractionDigits: 0,
|
|
||||||
style: "unit",
|
|
||||||
unit: "minute",
|
|
||||||
})}
|
})}
|
||||||
/>
|
/>
|
||||||
<Block label="audiobookshelf.books" value={t("common.number", { value: totalBooks })} />
|
<Block label="audiobookshelf.books" value={t("common.number", { value: totalBooks })} />
|
||||||
|
|||||||
60
src/widgets/beszel/component.jsx
Normal file
60
src/widgets/beszel/component.jsx
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Container from "components/services/widget/container";
|
||||||
|
import Block from "components/services/widget/block";
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const { widget } = service;
|
||||||
|
const { systemId } = widget;
|
||||||
|
|
||||||
|
const { data: systems, error: systemsError } = useWidgetAPI(widget, "systems");
|
||||||
|
|
||||||
|
const MAX_ALLOWED_FIELDS = 4;
|
||||||
|
if (!widget.fields?.length > 0) {
|
||||||
|
widget.fields = systemId ? ["name", "status", "cpu", "memory"] : ["systems", "up"];
|
||||||
|
}
|
||||||
|
if (widget.fields?.length > MAX_ALLOWED_FIELDS) {
|
||||||
|
widget.fields = widget.fields.slice(0, MAX_ALLOWED_FIELDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (systemsError) {
|
||||||
|
return <Container service={service} error={systemsError} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!systems) {
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="beszel.systems" />
|
||||||
|
<Block label="beszel.up" />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (systemId) {
|
||||||
|
const system = systems.items.find((item) => item.id === systemId);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="beszel.name" value={system.name} />
|
||||||
|
<Block label="beszel.status" value={t(`beszel.${system.status}`)} />
|
||||||
|
<Block label="beszel.updated" value={t("common.relativeDate", { value: system.updated })} />
|
||||||
|
<Block label="beszel.cpu" value={t("common.percent", { value: system.info.cpu, maximumFractionDigits: 2 })} />
|
||||||
|
<Block label="beszel.memory" value={t("common.percent", { value: system.info.mp, maximumFractionDigits: 2 })} />
|
||||||
|
<Block label="beszel.disk" value={t("common.percent", { value: system.info.dp, maximumFractionDigits: 2 })} />
|
||||||
|
<Block label="beszel.network" value={t("common.percent", { value: system.info.b, maximumFractionDigits: 2 })} />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const upTotal = systems.items.filter((item) => item.status === "up").length;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="beszel.systems" value={systems.totalItems} />
|
||||||
|
<Block label="beszel.up" value={`${upTotal} / ${systems.totalItems}`} />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
99
src/widgets/beszel/proxy.js
Normal file
99
src/widgets/beszel/proxy.js
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
import cache from "memory-cache";
|
||||||
|
|
||||||
|
import getServiceWidget from "utils/config/service-helpers";
|
||||||
|
import { formatApiCall } from "utils/proxy/api-helpers";
|
||||||
|
import { httpProxy } from "utils/proxy/http";
|
||||||
|
import widgets from "widgets/widgets";
|
||||||
|
import createLogger from "utils/logger";
|
||||||
|
|
||||||
|
const proxyName = "beszelProxyHandler";
|
||||||
|
const tokenCacheKey = `${proxyName}__token`;
|
||||||
|
const logger = createLogger(proxyName);
|
||||||
|
|
||||||
|
async function login(loginUrl, username, password, service) {
|
||||||
|
const authResponse = await httpProxy(loginUrl, {
|
||||||
|
method: "POST",
|
||||||
|
body: JSON.stringify({ identity: username, password }),
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const status = authResponse[0];
|
||||||
|
let data = authResponse[2];
|
||||||
|
try {
|
||||||
|
data = JSON.parse(Buffer.from(authResponse[2]).toString());
|
||||||
|
|
||||||
|
if (status === 200) {
|
||||||
|
cache.put(`${tokenCacheKey}.${service}`, data.token);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
logger.error(`Error ${status} logging into beszel`, JSON.stringify(authResponse[2]));
|
||||||
|
}
|
||||||
|
return [status, data.token ?? data];
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function beszelProxyHandler(req, res) {
|
||||||
|
const { group, service, endpoint } = req.query;
|
||||||
|
|
||||||
|
if (group && service) {
|
||||||
|
const widget = await getServiceWidget(group, service);
|
||||||
|
|
||||||
|
if (!widgets?.[widget.type]?.api) {
|
||||||
|
return res.status(403).json({ error: "Service does not support API calls" });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (widget) {
|
||||||
|
const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
|
||||||
|
const loginUrl = formatApiCall(widgets[widget.type].api, { endpoint: "admins/auth-with-password", ...widget });
|
||||||
|
|
||||||
|
let status;
|
||||||
|
let data;
|
||||||
|
|
||||||
|
let token = cache.get(`${tokenCacheKey}.${service}`);
|
||||||
|
if (!token) {
|
||||||
|
[status, token] = await login(loginUrl, widget.username, widget.password, service);
|
||||||
|
if (status !== 200) {
|
||||||
|
logger.debug(`HTTTP ${status} logging into npm api: ${token}`);
|
||||||
|
return res.status(status).send(token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[status, , data] = await httpProxy(url, {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (status === 403) {
|
||||||
|
logger.debug(`HTTTP ${status} retrieving data from npm api, logging in and trying again.`);
|
||||||
|
cache.del(`${tokenCacheKey}.${service}`);
|
||||||
|
[status, token] = await login(loginUrl, widget.username, widget.password, service);
|
||||||
|
|
||||||
|
if (status !== 200) {
|
||||||
|
logger.debug(`HTTTP ${status} logging into npm api: ${data}`);
|
||||||
|
return res.status(status).send(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
[status, , data] = await httpProxy(url, {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status !== 200) {
|
||||||
|
return res.status(status).send(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.send(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||||
|
}
|
||||||
14
src/widgets/beszel/widget.js
Normal file
14
src/widgets/beszel/widget.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import beszelProxyHandler from "./proxy";
|
||||||
|
|
||||||
|
const widget = {
|
||||||
|
api: "{url}/api/{endpoint}",
|
||||||
|
proxyHandler: beszelProxyHandler,
|
||||||
|
|
||||||
|
mappings: {
|
||||||
|
systems: {
|
||||||
|
endpoint: "collections/systems/records?page=1&perPage=500&sort=%2Bcreated",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default widget;
|
||||||
@@ -8,6 +8,7 @@ const components = {
|
|||||||
autobrr: dynamic(() => import("./autobrr/component")),
|
autobrr: dynamic(() => import("./autobrr/component")),
|
||||||
azuredevops: dynamic(() => import("./azuredevops/component")),
|
azuredevops: dynamic(() => import("./azuredevops/component")),
|
||||||
bazarr: dynamic(() => import("./bazarr/component")),
|
bazarr: dynamic(() => import("./bazarr/component")),
|
||||||
|
beszel: dynamic(() => import("./beszel/component")),
|
||||||
caddy: dynamic(() => import("./caddy/component")),
|
caddy: dynamic(() => import("./caddy/component")),
|
||||||
calendar: dynamic(() => import("./calendar/component")),
|
calendar: dynamic(() => import("./calendar/component")),
|
||||||
calibreweb: dynamic(() => import("./calibreweb/component")),
|
calibreweb: dynamic(() => import("./calibreweb/component")),
|
||||||
@@ -41,6 +42,7 @@ const components = {
|
|||||||
gotify: dynamic(() => import("./gotify/component")),
|
gotify: dynamic(() => import("./gotify/component")),
|
||||||
grafana: dynamic(() => import("./grafana/component")),
|
grafana: dynamic(() => import("./grafana/component")),
|
||||||
hdhomerun: dynamic(() => import("./hdhomerun/component")),
|
hdhomerun: dynamic(() => import("./hdhomerun/component")),
|
||||||
|
headscale: dynamic(() => import("./headscale/component")),
|
||||||
peanut: dynamic(() => import("./peanut/component")),
|
peanut: dynamic(() => import("./peanut/component")),
|
||||||
homeassistant: dynamic(() => import("./homeassistant/component")),
|
homeassistant: dynamic(() => import("./homeassistant/component")),
|
||||||
homebox: dynamic(() => import("./homebox/component")),
|
homebox: dynamic(() => import("./homebox/component")),
|
||||||
@@ -125,6 +127,7 @@ const components = {
|
|||||||
uptimekuma: dynamic(() => import("./uptimekuma/component")),
|
uptimekuma: dynamic(() => import("./uptimekuma/component")),
|
||||||
uptimerobot: dynamic(() => import("./uptimerobot/component")),
|
uptimerobot: dynamic(() => import("./uptimerobot/component")),
|
||||||
urbackup: dynamic(() => import("./urbackup/component")),
|
urbackup: dynamic(() => import("./urbackup/component")),
|
||||||
|
vikunja: dynamic(() => import("./vikunja/component")),
|
||||||
watchtower: dynamic(() => import("./watchtower/component")),
|
watchtower: dynamic(() => import("./watchtower/component")),
|
||||||
wgeasy: dynamic(() => import("./wgeasy/component")),
|
wgeasy: dynamic(() => import("./wgeasy/component")),
|
||||||
whatsupdocker: dynamic(() => import("./whatsupdocker/component")),
|
whatsupdocker: dynamic(() => import("./whatsupdocker/component")),
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ export default function Component({ service }) {
|
|||||||
/>
|
/>
|
||||||
<Block
|
<Block
|
||||||
label="frigate.uptime"
|
label="frigate.uptime"
|
||||||
value={t("common.uptime", {
|
value={t("common.duration", {
|
||||||
value: data.uptime,
|
value: data.uptime,
|
||||||
})}
|
})}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ export default function Component({ service }) {
|
|||||||
return (
|
return (
|
||||||
<Container service={service}>
|
<Container service={service}>
|
||||||
<Block label="fritzbox.connectionStatus" value={t(`fritzbox.connectionStatus${fritzboxData.connectionStatus}`)} />
|
<Block label="fritzbox.connectionStatus" value={t(`fritzbox.connectionStatus${fritzboxData.connectionStatus}`)} />
|
||||||
<Block label="fritzbox.uptime" value={t("common.uptime", { value: fritzboxData.uptime })} />
|
<Block label="fritzbox.uptime" value={t("common.duration", { value: fritzboxData.uptime })} />
|
||||||
<Block label="fritzbox.maxDown" value={t("common.byterate", { value: fritzboxData.maxDown / 8, decimals: 1 })} />
|
<Block label="fritzbox.maxDown" value={t("common.byterate", { value: fritzboxData.maxDown / 8, decimals: 1 })} />
|
||||||
<Block label="fritzbox.maxUp" value={t("common.byterate", { value: fritzboxData.maxUp / 8, decimals: 1 })} />
|
<Block label="fritzbox.maxUp" value={t("common.byterate", { value: fritzboxData.maxUp / 8, decimals: 1 })} />
|
||||||
<Block label="fritzbox.down" value={t("common.byterate", { value: fritzboxData.down, decimals: 1 })} />
|
<Block label="fritzbox.down" value={t("common.byterate", { value: fritzboxData.down, decimals: 1 })} />
|
||||||
|
|||||||
43
src/widgets/headscale/component.jsx
Normal file
43
src/widgets/headscale/component.jsx
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Container from "components/services/widget/container";
|
||||||
|
import Block from "components/services/widget/block";
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { widget } = service;
|
||||||
|
|
||||||
|
const { data: nodeData, error: nodeError } = useWidgetAPI(widget, "node");
|
||||||
|
|
||||||
|
if (nodeError) {
|
||||||
|
return <Container service={service} error={nodeError} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!nodeData) {
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="headscale.name" />
|
||||||
|
<Block label="headscale.address" />
|
||||||
|
<Block label="headscale.last_seen" />
|
||||||
|
<Block label="headscale.status" />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const {
|
||||||
|
givenName,
|
||||||
|
ipAddresses: [address],
|
||||||
|
lastSeen,
|
||||||
|
online,
|
||||||
|
} = nodeData.node;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="headscale.name" value={givenName} />
|
||||||
|
<Block label="headscale.address" value={address} />
|
||||||
|
<Block label="headscale.last_seen" value={t("common.relativeDate", { value: lastSeen })} />
|
||||||
|
<Block label="headscale.status" value={t(online ? "headscale.online" : "headscale.offline")} />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
14
src/widgets/headscale/widget.js
Normal file
14
src/widgets/headscale/widget.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||||
|
|
||||||
|
const widget = {
|
||||||
|
api: "{url}/api/v1/{endpoint}/{nodeId}",
|
||||||
|
proxyHandler: credentialedProxyHandler,
|
||||||
|
|
||||||
|
mappings: {
|
||||||
|
node: {
|
||||||
|
endpoint: "node",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default widget;
|
||||||
@@ -8,11 +8,19 @@ export default function Component({ service }) {
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { widget } = service;
|
const { widget } = service;
|
||||||
|
|
||||||
const { data: versionData, error: versionError } = useWidgetAPI(widget, "version");
|
const { version = 1 } = widget;
|
||||||
// see https://github.com/gethomepage/homepage/issues/2282
|
|
||||||
const endpoint =
|
const versionEndpoint = version === 2 ? "version_v2" : "version";
|
||||||
versionData?.major > 1 || (versionData?.major === 1 && versionData?.minor > 84) ? "statistics" : "stats";
|
|
||||||
const { data: immichData, error: immichError } = useWidgetAPI(widget, endpoint);
|
const { data: versionData, error: versionError } = useWidgetAPI(widget, versionEndpoint);
|
||||||
|
|
||||||
|
let statsEndpoint = version === 2 ? "statistics_v2" : "stats";
|
||||||
|
if (version === 1) {
|
||||||
|
// see https://github.com/gethomepage/homepage/issues/2282
|
||||||
|
statsEndpoint =
|
||||||
|
versionData?.major > 1 || (versionData?.major === 1 && versionData?.minor > 84) ? "statistics" : "stats";
|
||||||
|
}
|
||||||
|
const { data: immichData, error: immichError } = useWidgetAPI(widget, statsEndpoint);
|
||||||
|
|
||||||
if (immichError || versionError || immichData?.statusCode === 401) {
|
if (immichError || versionError || immichData?.statusCode === 401) {
|
||||||
return <Container service={service} error={immichData ?? immichError ?? versionError} />;
|
return <Container service={service} error={immichData ?? immichError ?? versionError} />;
|
||||||
|
|||||||
@@ -1,18 +1,24 @@
|
|||||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||||
|
|
||||||
const widget = {
|
const widget = {
|
||||||
api: "{url}/api/server-info/{endpoint}",
|
api: "{url}/api/{endpoint}",
|
||||||
proxyHandler: credentialedProxyHandler,
|
proxyHandler: credentialedProxyHandler,
|
||||||
|
|
||||||
mappings: {
|
mappings: {
|
||||||
version: {
|
version: {
|
||||||
endpoint: "version",
|
endpoint: "server-info/version",
|
||||||
},
|
},
|
||||||
statistics: {
|
statistics: {
|
||||||
endpoint: "statistics",
|
endpoint: "server-info/statistics",
|
||||||
},
|
},
|
||||||
stats: {
|
stats: {
|
||||||
endpoint: "stats",
|
endpoint: "server-info/stats",
|
||||||
|
},
|
||||||
|
version_v2: {
|
||||||
|
endpoint: "server/version",
|
||||||
|
},
|
||||||
|
statistics_v2: {
|
||||||
|
endpoint: "server/statistics",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ export default function Component({ service }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const domains = resultData.length;
|
const domains = resultData.length;
|
||||||
const mailboxes = resultData.reduce((acc, val) => acc + val.mboxes_in_domain, 0);
|
const mailboxes = resultData.reduce((acc, val) => acc + parseInt(val.mboxes_in_domain, 10), 0);
|
||||||
const mails = resultData.reduce((acc, val) => acc + val.msgs_total, 0);
|
const mails = resultData.reduce((acc, val) => acc + parseInt(val.msgs_total, 10), 0);
|
||||||
const storage = resultData.reduce((acc, val) => acc + val.bytes_total, 0);
|
const storage = resultData.reduce((acc, val) => acc + parseInt(val.bytes_total, 10), 0);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container service={service}>
|
<Container service={service}>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||||
|
|
||||||
const widget = {
|
const widget = {
|
||||||
api: "{url}/php/server/devices.php?action=getDevicesTotals",
|
api: "{url}/php/server/devices.php?action=getDevicesTotals",
|
||||||
proxyHandler: genericProxyHandler,
|
proxyHandler: credentialedProxyHandler,
|
||||||
|
|
||||||
mappings: {
|
mappings: {
|
||||||
data: {
|
data: {
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ export default function Component({ service }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const enabled = infoData.filter((c) => c.enabled === 1).length;
|
const enabled = infoData.filter((c) => !!c.enabled).length;
|
||||||
const disabled = infoData.filter((c) => c.enabled === 0).length;
|
const disabled = infoData.filter((c) => !c.enabled).length;
|
||||||
const total = infoData.length;
|
const total = infoData.length;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ async function login(loginUrl, username, password, service) {
|
|||||||
cache.put(`${tokenCacheKey}.${service}`, data.token, expiration - 5 * 60 * 1000); // expiration -5 minutes
|
cache.put(`${tokenCacheKey}.${service}`, data.token, expiration - 5 * 60 * 1000); // expiration -5 minutes
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger.error(`Error ${status} logging into npm`, authResponse[2]);
|
logger.error(`Error ${status} logging into npm`, JSON.stringify(authResponse[2]));
|
||||||
}
|
}
|
||||||
return [status, data.token ?? data];
|
return [status, data.token ?? data];
|
||||||
}
|
}
|
||||||
@@ -50,7 +50,6 @@ export default async function npmProxyHandler(req, res) {
|
|||||||
const loginUrl = `${widget.url}/api/tokens`;
|
const loginUrl = `${widget.url}/api/tokens`;
|
||||||
|
|
||||||
let status;
|
let status;
|
||||||
let contentType;
|
|
||||||
let data;
|
let data;
|
||||||
|
|
||||||
let token = cache.get(`${tokenCacheKey}.${service}`);
|
let token = cache.get(`${tokenCacheKey}.${service}`);
|
||||||
@@ -62,7 +61,7 @@ export default async function npmProxyHandler(req, res) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[status, contentType, data] = await httpProxy(url, {
|
[status, , data] = await httpProxy(url, {
|
||||||
method: "GET",
|
method: "GET",
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
@@ -81,7 +80,7 @@ export default async function npmProxyHandler(req, res) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line no-unused-vars
|
// eslint-disable-next-line no-unused-vars
|
||||||
[status, contentType, data] = await httpProxy(url, {
|
[status, , data] = await httpProxy(url, {
|
||||||
method: "GET",
|
method: "GET",
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Container service={service}>
|
<Container service={service}>
|
||||||
<Block label="openwrt.uptime" value={t("common.uptime", { value: uptime })} />
|
<Block label="openwrt.uptime" value={t("common.duration", { value: uptime })} />
|
||||||
<Block label="openwrt.cpuLoad" value={cpuLoad} />
|
<Block label="openwrt.cpuLoad" value={cpuLoad} />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ async function fetchFromPyloadAPI(url, sessionId, params, service) {
|
|||||||
const options = {
|
const options = {
|
||||||
body: params
|
body: params
|
||||||
? Object.keys(params)
|
? Object.keys(params)
|
||||||
.map((prop) => `${prop}=${params[prop]}`)
|
.map((prop) => `${prop}=${encodeURIComponent(params[prop])}`)
|
||||||
.join("&")
|
.join("&")
|
||||||
: `session=${sessionId}`,
|
: `session=${sessionId}`,
|
||||||
method: "POST",
|
method: "POST",
|
||||||
|
|||||||
@@ -12,7 +12,10 @@ const widget = {
|
|||||||
wanted: jsonArrayFilter(data, (item) => item.monitored && !item.hasFile && item.isAvailable).length,
|
wanted: jsonArrayFilter(data, (item) => item.monitored && !item.hasFile && item.isAvailable).length,
|
||||||
have: jsonArrayFilter(data, (item) => item.hasFile).length,
|
have: jsonArrayFilter(data, (item) => item.hasFile).length,
|
||||||
missing: jsonArrayFilter(data, (item) => item.monitored && !item.hasFile).length,
|
missing: jsonArrayFilter(data, (item) => item.monitored && !item.hasFile).length,
|
||||||
all: asJson(data),
|
all: asJson(data).map((entry) => ({
|
||||||
|
title: entry.title,
|
||||||
|
id: entry.id,
|
||||||
|
})),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
"queue/status": {
|
"queue/status": {
|
||||||
|
|||||||
@@ -46,12 +46,12 @@ export default function Component({ service }) {
|
|||||||
<Block label="stash.scenes" value={t("common.number", { value: stats.scene_count })} />
|
<Block label="stash.scenes" value={t("common.number", { value: stats.scene_count })} />
|
||||||
<Block label="stash.scenesPlayed" value={t("common.number", { value: stats.scenes_played })} />
|
<Block label="stash.scenesPlayed" value={t("common.number", { value: stats.scenes_played })} />
|
||||||
<Block label="stash.playCount" value={t("common.number", { value: stats.total_play_count })} />
|
<Block label="stash.playCount" value={t("common.number", { value: stats.total_play_count })} />
|
||||||
<Block label="stash.playDuration" value={t("common.uptime", { value: stats.total_play_duration })} />
|
<Block label="stash.playDuration" value={t("common.duration", { value: stats.total_play_duration })} />
|
||||||
<Block
|
<Block
|
||||||
label="stash.sceneSize"
|
label="stash.sceneSize"
|
||||||
value={t("common.bbytes", { value: stats.scenes_size, maximumFractionDigits: 1 })}
|
value={t("common.bbytes", { value: stats.scenes_size, maximumFractionDigits: 1 })}
|
||||||
/>
|
/>
|
||||||
<Block label="stash.sceneDuration" value={t("common.uptime", { value: stats.scenes_duration })} />
|
<Block label="stash.sceneDuration" value={t("common.duration", { value: stats.scenes_duration })} />
|
||||||
|
|
||||||
<Block label="stash.images" value={t("common.number", { value: stats.image_count })} />
|
<Block label="stash.images" value={t("common.number", { value: stats.image_count })} />
|
||||||
<Block
|
<Block
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ export default function Component({ service }) {
|
|||||||
<>
|
<>
|
||||||
<Container service={service}>
|
<Container service={service}>
|
||||||
<Block label="truenas.load" value={t("common.number", { value: statusData.loadavg[0] })} />
|
<Block label="truenas.load" value={t("common.number", { value: statusData.loadavg[0] })} />
|
||||||
<Block label="truenas.uptime" value={t("common.uptime", { value: statusData.uptime_seconds })} />
|
<Block label="truenas.uptime" value={t("common.duration", { value: statusData.uptime_seconds })} />
|
||||||
<Block label="truenas.alerts" value={t("common.number", { value: alertData.pending })} />
|
<Block label="truenas.alerts" value={t("common.number", { value: alertData.pending })} />
|
||||||
</Container>
|
</Container>
|
||||||
{enablePools &&
|
{enablePools &&
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
|
||||||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||||
|
|
||||||
const widget = {
|
const widget = {
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ export default function Component({ service }) {
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
status = t("uptimerobot.up");
|
status = t("uptimerobot.up");
|
||||||
uptime = t("common.uptime", { value: monitor.logs[0].duration });
|
uptime = t("common.duration", { value: monitor.logs[0].duration });
|
||||||
logIndex = 1;
|
logIndex = 1;
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
@@ -73,7 +73,7 @@ export default function Component({ service }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const lastDown = new Date(monitor.logs[logIndex].datetime * 1000).toLocaleString();
|
const lastDown = new Date(monitor.logs[logIndex].datetime * 1000).toLocaleString();
|
||||||
const downDuration = t("common.uptime", { value: monitor.logs[logIndex].duration });
|
const downDuration = t("common.duration", { value: monitor.logs[logIndex].duration });
|
||||||
const hideDown = logIndex === 1 && monitor.logs[logIndex].type !== 1;
|
const hideDown = logIndex === 1 && monitor.logs[logIndex].type !== 1;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
68
src/widgets/vikunja/component.jsx
Normal file
68
src/widgets/vikunja/component.jsx
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Container from "components/services/widget/container";
|
||||||
|
import Block from "components/services/widget/block";
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { widget } = service;
|
||||||
|
|
||||||
|
const { data: projectsData, error: projectsError } = useWidgetAPI(widget, "projects");
|
||||||
|
const { data: tasksData, error: tasksError } = useWidgetAPI(widget, "tasks");
|
||||||
|
|
||||||
|
if (projectsError || tasksError) {
|
||||||
|
return <Container service={service} error={projectsError ?? tasksError} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!projectsData || !tasksData) {
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="vikunja.projects" />
|
||||||
|
<Block label="vikunja.tasks7d" />
|
||||||
|
<Block label="vikunja.tasksOverdue" />
|
||||||
|
<Block label="vikunja.tasksInProgress" />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const projects = projectsData.filter((project) => project.id > 0); // saved filters have id < 0
|
||||||
|
|
||||||
|
const oneWeekFromNow = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);
|
||||||
|
const tasksWithDueDate = tasksData.filter((task) => !task.dueDateIsDefault);
|
||||||
|
const tasks7d = tasksWithDueDate.filter((task) => new Date(task.dueDate) <= oneWeekFromNow);
|
||||||
|
const tasksOverdue = tasksWithDueDate.filter((task) => new Date(task.dueDate) <= new Date(Date.now()));
|
||||||
|
const tasksInProgress = tasksData.filter((task) => task.inProgress);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="vikunja.projects" value={t("common.number", { value: projects.length })} />
|
||||||
|
<Block label="vikunja.tasks7d" value={t("common.number", { value: tasks7d.length })} />
|
||||||
|
<Block label="vikunja.tasksOverdue" value={t("common.number", { value: tasksOverdue.length })} />
|
||||||
|
<Block label="vikunja.tasksInProgress" value={t("common.number", { value: tasksInProgress.length })} />
|
||||||
|
</Container>
|
||||||
|
{widget.enableTaskList &&
|
||||||
|
tasksData.slice(0, 5).map((task) => (
|
||||||
|
<div
|
||||||
|
key={task.id}
|
||||||
|
className="text-theme-700 dark:text-theme-200 relative h-5 rounded-md bg-theme-200/50 dark:bg-theme-900/20 m-1 px-1 flex"
|
||||||
|
>
|
||||||
|
<div className="text-xs z-10 self-center ml-2 relative h-4 grow mr-2">
|
||||||
|
<div className="absolute w-full h-4 whitespace-nowrap text-ellipsis overflow-hidden text-left">
|
||||||
|
{task.title}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{!task.dueDateIsDefault && (
|
||||||
|
<div className="self-center text-xs flex justify-end mr-1.5 pl-1 z-10 text-ellipsis overflow-hidden whitespace-nowrap">
|
||||||
|
{t("common.relativeDate", {
|
||||||
|
value: task.dueDate,
|
||||||
|
formatParams: { value: { style: "narrow", numeric: "auto" } },
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
27
src/widgets/vikunja/widget.js
Normal file
27
src/widgets/vikunja/widget.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||||
|
import { asJson } from "utils/proxy/api-helpers";
|
||||||
|
|
||||||
|
const widget = {
|
||||||
|
api: `{url}/api/v1/{endpoint}`,
|
||||||
|
proxyHandler: credentialedProxyHandler,
|
||||||
|
|
||||||
|
mappings: {
|
||||||
|
projects: {
|
||||||
|
endpoint: "projects",
|
||||||
|
},
|
||||||
|
tasks: {
|
||||||
|
endpoint: "tasks/all?filter=done%3Dfalse&sort_by=due_date",
|
||||||
|
map: (data) =>
|
||||||
|
asJson(data).map((task) => ({
|
||||||
|
id: task.id,
|
||||||
|
title: task.title,
|
||||||
|
priority: task.priority,
|
||||||
|
dueDate: task.due_date,
|
||||||
|
dueDateIsDefault: task.due_date === "0001-01-01T00:00:00Z",
|
||||||
|
inProgress: task.percent_done > 0 && task.percent_done < 1,
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default widget;
|
||||||
@@ -38,7 +38,7 @@ export default function Component({ service }) {
|
|||||||
<Container service={service}>
|
<Container service={service}>
|
||||||
<Block label="wgeasy.connected" value={connected} />
|
<Block label="wgeasy.connected" value={connected} />
|
||||||
<Block label="wgeasy.enabled" value={enabled} />
|
<Block label="wgeasy.enabled" value={enabled} />
|
||||||
<Block label="wgeasy.diabled" value={disabled} />
|
<Block label="wgeasy.disabled" value={disabled} />
|
||||||
<Block label="wgeasy.total" value={infoData.length} />
|
<Block label="wgeasy.total" value={infoData.length} />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import authentik from "./authentik/widget";
|
|||||||
import autobrr from "./autobrr/widget";
|
import autobrr from "./autobrr/widget";
|
||||||
import azuredevops from "./azuredevops/widget";
|
import azuredevops from "./azuredevops/widget";
|
||||||
import bazarr from "./bazarr/widget";
|
import bazarr from "./bazarr/widget";
|
||||||
|
import beszel from "./beszel/widget";
|
||||||
import caddy from "./caddy/widget";
|
import caddy from "./caddy/widget";
|
||||||
import calendar from "./calendar/widget";
|
import calendar from "./calendar/widget";
|
||||||
import calibreweb from "./calibreweb/widget";
|
import calibreweb from "./calibreweb/widget";
|
||||||
@@ -35,6 +36,7 @@ import gluetun from "./gluetun/widget";
|
|||||||
import gotify from "./gotify/widget";
|
import gotify from "./gotify/widget";
|
||||||
import grafana from "./grafana/widget";
|
import grafana from "./grafana/widget";
|
||||||
import hdhomerun from "./hdhomerun/widget";
|
import hdhomerun from "./hdhomerun/widget";
|
||||||
|
import headscale from "./headscale/widget";
|
||||||
import homeassistant from "./homeassistant/widget";
|
import homeassistant from "./homeassistant/widget";
|
||||||
import homebox from "./homebox/widget";
|
import homebox from "./homebox/widget";
|
||||||
import homebridge from "./homebridge/widget";
|
import homebridge from "./homebridge/widget";
|
||||||
@@ -115,6 +117,7 @@ import unifi from "./unifi/widget";
|
|||||||
import unmanic from "./unmanic/widget";
|
import unmanic from "./unmanic/widget";
|
||||||
import uptimekuma from "./uptimekuma/widget";
|
import uptimekuma from "./uptimekuma/widget";
|
||||||
import uptimerobot from "./uptimerobot/widget";
|
import uptimerobot from "./uptimerobot/widget";
|
||||||
|
import vikunja from "./vikunja/widget";
|
||||||
import watchtower from "./watchtower/widget";
|
import watchtower from "./watchtower/widget";
|
||||||
import wgeasy from "./wgeasy/widget";
|
import wgeasy from "./wgeasy/widget";
|
||||||
import whatsupdocker from "./whatsupdocker/widget";
|
import whatsupdocker from "./whatsupdocker/widget";
|
||||||
@@ -131,6 +134,7 @@ const widgets = {
|
|||||||
autobrr,
|
autobrr,
|
||||||
azuredevops,
|
azuredevops,
|
||||||
bazarr,
|
bazarr,
|
||||||
|
beszel,
|
||||||
caddy,
|
caddy,
|
||||||
calibreweb,
|
calibreweb,
|
||||||
changedetectionio,
|
changedetectionio,
|
||||||
@@ -160,6 +164,7 @@ const widgets = {
|
|||||||
gotify,
|
gotify,
|
||||||
grafana,
|
grafana,
|
||||||
hdhomerun,
|
hdhomerun,
|
||||||
|
headscale,
|
||||||
homeassistant,
|
homeassistant,
|
||||||
homebox,
|
homebox,
|
||||||
homebridge,
|
homebridge,
|
||||||
@@ -246,6 +251,7 @@ const widgets = {
|
|||||||
uptimekuma,
|
uptimekuma,
|
||||||
uptimerobot,
|
uptimerobot,
|
||||||
urbackup,
|
urbackup,
|
||||||
|
vikunja,
|
||||||
watchtower,
|
watchtower,
|
||||||
wgeasy,
|
wgeasy,
|
||||||
whatsupdocker,
|
whatsupdocker,
|
||||||
|
|||||||
Reference in New Issue
Block a user