mirror of
https://github.com/gethomepage/homepage.git
synced 2025-12-07 21:59:50 +01:00
Compare commits
30 Commits
3ef7031eb0
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cd34796b9d | ||
|
|
0d788e3d06 | ||
|
|
ed1dafadde | ||
|
|
96ac9046b3 | ||
|
|
6d5f35f07e | ||
|
|
c77dfa4c64 | ||
|
|
307d7f4b2d | ||
|
|
fb9927ab0c | ||
|
|
d13165699b | ||
|
|
65ff248ee7 | ||
|
|
87e5643892 | ||
|
|
8887281246 | ||
|
|
5b50e8ff81 | ||
|
|
c36c6a9012 | ||
|
|
cf990063b9 | ||
|
|
610f1bd974 | ||
|
|
4031178831 | ||
|
|
b65c8399d8 | ||
|
|
6b63cfd491 | ||
|
|
196c51bf73 | ||
|
|
17c9b2631e | ||
|
|
1a21189643 | ||
|
|
b6b428363c | ||
|
|
e707fa46cf | ||
|
|
3d040362cb | ||
|
|
57b193b037 | ||
|
|
8a75c9b6e3 | ||
|
|
0dafc792f7 | ||
|
|
afc0fe29ee | ||
|
|
817a9bbce5 |
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -38,3 +38,4 @@ What type of change does your PR introduce to Homepage?
|
|||||||
- [ ] If applicable, I have reviewed the [feature / enhancement](https://gethomepage.dev/more/development/#new-feature-guidelines) and / or [service widget guidelines](https://gethomepage.dev/more/development/#service-widget-guidelines).
|
- [ ] If applicable, I have reviewed the [feature / enhancement](https://gethomepage.dev/more/development/#new-feature-guidelines) and / or [service widget guidelines](https://gethomepage.dev/more/development/#service-widget-guidelines).
|
||||||
- [ ] I have checked that all code style checks pass using [pre-commit hooks](https://gethomepage.dev/more/development/#code-formatting-with-pre-commit-hooks) and [linting checks](https://gethomepage.dev/more/development/#code-linting).
|
- [ ] I have checked that all code style checks pass using [pre-commit hooks](https://gethomepage.dev/more/development/#code-formatting-with-pre-commit-hooks) and [linting checks](https://gethomepage.dev/more/development/#code-linting).
|
||||||
- [ ] If applicable, I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers.
|
- [ ] If applicable, I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers.
|
||||||
|
- [ ] In the description above I have disclosed the use of AI tools in the coding of this PR.
|
||||||
|
|||||||
2
.github/workflows/crowdin.yml
vendored
2
.github/workflows/crowdin.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
- name: crowdin action
|
- name: crowdin action
|
||||||
uses: crowdin/github-action@v2
|
uses: crowdin/github-action@v2
|
||||||
with:
|
with:
|
||||||
|
|||||||
6
.github/workflows/docker-publish.yml
vendored
6
.github/workflows/docker-publish.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
|||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Install python
|
- name: Install python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
@@ -35,6 +35,7 @@ jobs:
|
|||||||
- name: Install pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
|
version: 10
|
||||||
run_install: false
|
run_install: false
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
@@ -61,7 +62,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Extract Docker metadata
|
- name: Extract Docker metadata
|
||||||
id: meta
|
id: meta
|
||||||
@@ -93,6 +94,7 @@ jobs:
|
|||||||
- name: Install pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
|
version: 10
|
||||||
run_install: false
|
run_install: false
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
|
|||||||
6
.github/workflows/docs-publish.yml
vendored
6
.github/workflows/docs-publish.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
|||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
- name: Install python
|
- name: Install python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
@@ -32,7 +32,7 @@ jobs:
|
|||||||
needs:
|
needs:
|
||||||
- pre-commit
|
- pre-commit
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- uses: actions/setup-python@v6
|
- uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: 3.x
|
python-version: 3.x
|
||||||
@@ -54,7 +54,7 @@ jobs:
|
|||||||
needs:
|
needs:
|
||||||
- pre-commit
|
- pre-commit
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Configure Git Credentials
|
- name: Configure Git Credentials
|
||||||
run: |
|
run: |
|
||||||
git config user.name github-actions[bot]
|
git config user.name github-actions[bot]
|
||||||
|
|||||||
@@ -51,6 +51,8 @@ COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static
|
|||||||
|
|
||||||
RUN apk add --no-cache su-exec iputils-ping shadow
|
RUN apk add --no-cache su-exec iputils-ping shadow
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
ENV HOSTNAME=0.0.0.0
|
ENV HOSTNAME=0.0.0.0
|
||||||
ENV PORT=3000
|
ENV PORT=3000
|
||||||
|
|||||||
@@ -57,8 +57,8 @@ if [ -d /app/.next ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Drop privileges (when asked to) if root, otherwise run as current user
|
# Drop privileges (when asked to) if root, otherwise run as current user
|
||||||
if [ "$(id -u)" == "0" ] && [ "${PUID}" != "0" ]; then
|
if [ "$(id -u)" = "0" ] && [ "${PUID}" != "0" ]; then
|
||||||
su-exec ${PUID}:${PGID} "$@"
|
exec su-exec ${PUID}:${PGID} "$@"
|
||||||
else
|
else
|
||||||
exec "$@"
|
exec "$@"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -159,6 +159,19 @@ Widgets can tint their metric block text automatically based on rules defined al
|
|||||||
|
|
||||||
Supported numeric operators for the `when` property are `gt`, `gte`, `lt`, `lte`, `eq`, `ne`, `between`, and `outside`. String rules support `equals`, `includes`, `startsWith`, `endsWith`, and `regex`. Each rule can be inverted with `negate: true`, and string rules may pass `caseSensitive: true` or custom regex `flags`. The highlight engine does its best to coerce formatted values, but you will get the most reliable results when you pass plain numbers or strings into `<Block>`.
|
Supported numeric operators for the `when` property are `gt`, `gte`, `lt`, `lte`, `eq`, `ne`, `between`, and `outside`. String rules support `equals`, `includes`, `startsWith`, `endsWith`, and `regex`. Each rule can be inverted with `negate: true`, and string rules may pass `caseSensitive: true` or custom regex `flags`. The highlight engine does its best to coerce formatted values, but you will get the most reliable results when you pass plain numbers or strings into `<Block>`.
|
||||||
|
|
||||||
|
#### Value Only Highlighting
|
||||||
|
|
||||||
|
You can optionally apply highlighting only to the value portion of a block (not the label) by setting `valueOnly: true` on the field configuration. This keeps the label visible while highlighting only the metric value itself.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- Sonarr:
|
||||||
|
...
|
||||||
|
highlight:
|
||||||
|
queued:
|
||||||
|
valueOnly: true
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
## Descriptions
|
## Descriptions
|
||||||
|
|
||||||
Services may have descriptions,
|
Services may have descriptions,
|
||||||
|
|||||||
@@ -396,7 +396,9 @@ Set your desired language using:
|
|||||||
language: fr
|
language: fr
|
||||||
```
|
```
|
||||||
|
|
||||||
Currently supported languages: ca, de, en, es, fr, he, hr, hu, it, nb-NO, nl, pt, ru, sv, vi, zh-CN, zh-Hant
|
Currently supported languages: ca, de, en, es, fr, he, hr, hu, it, nb-NO, nl, pt, ru, sv, vi, zh-Hans (Simplified), zh-Hant (Traditional)
|
||||||
|
|
||||||
|
`zh-CN` will still work and is automatically mapped to `zh-Hans` for backwards compatibility.
|
||||||
|
|
||||||
You can also specify locales e.g. for the DateTime widget, e.g. en-AU, en-GB, etc.
|
You can also specify locales e.g. for the DateTime widget, e.g. en-AU, en-GB, etc.
|
||||||
|
|
||||||
@@ -571,3 +573,18 @@ or per service widget (`services.yaml`) with:
|
|||||||
```
|
```
|
||||||
|
|
||||||
If either value is set to true, the error message will be hidden.
|
If either value is set to true, the error message will be hidden.
|
||||||
|
|
||||||
|
## Disable Search Engine Indexing
|
||||||
|
|
||||||
|
You can request that search engines not to index your Homepage instance by enabling the `disableIndexing` setting.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
disableIndexing: true
|
||||||
|
```
|
||||||
|
|
||||||
|
When enabled, this will:
|
||||||
|
|
||||||
|
- Disallow all crawlers in `robots.txt`
|
||||||
|
- Add `<meta name="robots" content="noindex, nofollow">` tags to prevent indexing
|
||||||
|
|
||||||
|
By default this feature is disabled.
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ services:
|
|||||||
- 3000:3000
|
- 3000:3000
|
||||||
volumes:
|
volumes:
|
||||||
- /path/to/config:/app/config # Make sure your local config directory exists
|
- /path/to/config:/app/config # Make sure your local config directory exists
|
||||||
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations
|
- /var/run/docker.sock:/var/run/docker.sock:ro # (optional) For docker integrations
|
||||||
environment:
|
environment:
|
||||||
HOMEPAGE_ALLOWED_HOSTS: gethomepage.dev # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts
|
HOMEPAGE_ALLOWED_HOSTS: gethomepage.dev # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts
|
||||||
```
|
```
|
||||||
@@ -36,7 +36,7 @@ services:
|
|||||||
- 3000:3000
|
- 3000:3000
|
||||||
volumes:
|
volumes:
|
||||||
- /path/to/config:/app/config # Make sure your local config directory exists
|
- /path/to/config:/app/config # Make sure your local config directory exists
|
||||||
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations, see alternative methods
|
- /var/run/docker.sock:/var/run/docker.sock:ro # (optional) For docker integrations, see alternative methods
|
||||||
environment:
|
environment:
|
||||||
HOMEPAGE_ALLOWED_HOSTS: gethomepage.dev # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts
|
HOMEPAGE_ALLOWED_HOSTS: gethomepage.dev # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts
|
||||||
PUID: $PUID
|
PUID: $PUID
|
||||||
|
|||||||
@@ -68,7 +68,19 @@ All service widgets work essentially the same, that is, homepage makes a proxied
|
|||||||
|
|
||||||
If, after correctly adding and mapping your custom icons via the [Icons](../configs/services.md#icons) instructions, you are still unable to see your icons please try recreating your container.
|
If, after correctly adding and mapping your custom icons via the [Icons](../configs/services.md#icons) instructions, you are still unable to see your icons please try recreating your container.
|
||||||
|
|
||||||
## Disabling IPv6
|
## Enabling IPv6 for the homepage container
|
||||||
|
|
||||||
|
To enable IPv6 support for the homepage container, you can set the `HOSTNAME` environment variable, for example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
homepage:
|
||||||
|
...
|
||||||
|
environment:
|
||||||
|
- HOSTNAME=::
|
||||||
|
```
|
||||||
|
|
||||||
|
## Disabling IPv6 for http requests {#disabling-ipv6}
|
||||||
|
|
||||||
If you are having issues with certain widgets that are unable to reach public APIs (e.g. weather), in certain setups you may need to disable IPv6. You can set the environment variable `HOMEPAGE_PROXY_DISABLE_IPV6` to `true` to disable IPv6 for the homepage proxy.
|
If you are having issues with certain widgets that are unable to reach public APIs (e.g. weather), in certain setups you may need to disable IPv6. You can set the environment variable `HOMEPAGE_PROXY_DISABLE_IPV6` to `true` to disable IPv6 for the homepage proxy.
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,9 @@ Learn more about [Crowdsec](https://crowdsec.net).
|
|||||||
See the [crowdsec docs](https://docs.crowdsec.net/docs/local_api/intro/#machines) for information about registering a machine,
|
See the [crowdsec docs](https://docs.crowdsec.net/docs/local_api/intro/#machines) for information about registering a machine,
|
||||||
in most instances you can use the default credentials (`/etc/crowdsec/local_api_credentials.yaml`).
|
in most instances you can use the default credentials (`/etc/crowdsec/local_api_credentials.yaml`).
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
Without the `limit24h` option, the widget will fetch all alerts which is limited to 100 by the API to avoid performance issues.
|
||||||
|
|
||||||
Allowed fields: `["alerts", "bans"]`.
|
Allowed fields: `["alerts", "bans"]`.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
@@ -16,4 +19,5 @@ widget:
|
|||||||
url: http://crowdsechostorip:port
|
url: http://crowdsechostorip:port
|
||||||
username: localhost # machine_id in crowdsec
|
username: localhost # machine_id in crowdsec
|
||||||
password: password
|
password: password
|
||||||
|
limit24h: true # optional, limits alerts to last 24h. Default: false
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -14,4 +14,6 @@ widget:
|
|||||||
type: frigate
|
type: frigate
|
||||||
url: http://frigate.host.or.ip:port
|
url: http://frigate.host.or.ip:port
|
||||||
enableRecentEvents: true # Optional, defaults to false
|
enableRecentEvents: true # Optional, defaults to false
|
||||||
|
username: username # optional
|
||||||
|
password: password # optional
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ See the [official docs](https://github.com/ghostfolio/ghostfolio#authorization-b
|
|||||||
|
|
||||||
_Note that the Bearer token is valid for 6 months, after which a new one must be generated._
|
_Note that the Bearer token is valid for 6 months, after which a new one must be generated._
|
||||||
|
|
||||||
Allowed fields: `["gross_percent_today", "gross_percent_1y", "gross_percent_max"]`
|
Allowed fields: `["gross_percent_today", "gross_percent_1y", "gross_percent_max", "net_worth"]`
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
widget:
|
widget:
|
||||||
|
|||||||
@@ -12,11 +12,17 @@ Learn more about [Gluetun](https://github.com/qdm12/gluetun).
|
|||||||
Allowed fields: `["public_ip", "region", "country", "port_forwarded"]`.
|
Allowed fields: `["public_ip", "region", "country", "port_forwarded"]`.
|
||||||
Default fields: `["public_ip", "region", "country"]`.
|
Default fields: `["public_ip", "region", "country"]`.
|
||||||
|
|
||||||
To setup authentication, follow [the official Gluetun documentation](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md#authentication). Note that to use the api key method, you must add the route `GET /v1/publicip/ip` to the `routes` array in your Gluetun config.toml. Similarly, if you want to include the `port_forwarded` field, you must add the route `GET /v1/openvpn/portforwarded` to your Gluetun config.toml.
|
To setup authentication, follow [the official Gluetun documentation](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md#authentication). Note that to use the api key method, you must add the route `GET /v1/publicip/ip` to the `routes` array in your Gluetun config.toml. Similarly, if you want to include the `port_forwarded` field, you must add the route `GET /v1/openvpn/portforwarded` (or `/v1/portforward`) to your Gluetun config.toml.
|
||||||
|
|
||||||
|
| Gluetun Version | Homepage Widget Version |
|
||||||
|
| --------------- | ----------------------- |
|
||||||
|
| < 3.40.1 | 1 (default) |
|
||||||
|
| >= 3.40.1 | 2 |
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
widget:
|
widget:
|
||||||
type: gluetun
|
type: gluetun
|
||||||
url: http://gluetun.host.or.ip:port
|
url: http://gluetun.host.or.ip:port
|
||||||
key: gluetunkey # Not required if /v1/publicip/ip endpoint is configured with `auth = none`
|
key: gluetunkey # Not required if /v1/publicip/ip endpoint is configured with `auth = none`
|
||||||
|
version: 2 # optional, default is 1
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -17,6 +17,6 @@ widget:
|
|||||||
url: http://komodo.hostname.or.ip:port
|
url: http://komodo.hostname.or.ip:port
|
||||||
key: K-xxxxxx...
|
key: K-xxxxxx...
|
||||||
secret: S-xxxxxx...
|
secret: S-xxxxxx...
|
||||||
showSummary: true # optional, default: false
|
showSummary: true # optional, default: false. Takes precedence over showStacks
|
||||||
showStacks: true # optional, default: false
|
showStacks: true # optional, default: false
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ title: Omada
|
|||||||
description: Omada Widget Configuration
|
description: Omada Widget Configuration
|
||||||
---
|
---
|
||||||
|
|
||||||
The widget supports controller versions 3, 4 and 5.
|
The widget supports controller versions 3, 4, 5 and 6.
|
||||||
|
|
||||||
Allowed fields: `["connectedAp", "activeUser", "alerts", "connectedGateways", "connectedSwitches"]`.
|
Allowed fields: `["connectedAp", "activeUser", "alerts", "connectedGateways", "connectedSwitches"]`.
|
||||||
|
|
||||||
|
|||||||
17
package.json
17
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "homepage",
|
"name": "homepage",
|
||||||
"version": "1.6.1",
|
"version": "1.7.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"preinstall": "npx only-allow pnpm",
|
"preinstall": "npx only-allow pnpm",
|
||||||
@@ -25,18 +25,18 @@
|
|||||||
"luxon": "^3.6.1",
|
"luxon": "^3.6.1",
|
||||||
"memory-cache": "^0.2.0",
|
"memory-cache": "^0.2.0",
|
||||||
"minecraftstatuspinger": "^1.2.2",
|
"minecraftstatuspinger": "^1.2.2",
|
||||||
"next": "^15.5.2",
|
"next": "^15.5.7",
|
||||||
"next-i18next": "^12.1.0",
|
"next-i18next": "^12.1.0",
|
||||||
"ping": "^0.4.4",
|
"ping": "^0.4.4",
|
||||||
"pretty-bytes": "^7.1.0",
|
"pretty-bytes": "^7.1.0",
|
||||||
"raw-body": "^3.0.1",
|
"raw-body": "^3.0.2",
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1",
|
"react-dom": "^18.3.1",
|
||||||
"react-i18next": "^15.5.3",
|
"react-i18next": "^15.5.3",
|
||||||
"react-icons": "^5.4.0",
|
"react-icons": "^5.4.0",
|
||||||
"recharts": "^3.1.2",
|
"recharts": "^3.1.2",
|
||||||
"swr": "^2.3.3",
|
"swr": "^2.3.3",
|
||||||
"systeminformation": "^5.27.7",
|
"systeminformation": "^5.27.11",
|
||||||
"tough-cookie": "^6.0.0",
|
"tough-cookie": "^6.0.0",
|
||||||
"urbackup-server-api": "^0.8.9",
|
"urbackup-server-api": "^0.8.9",
|
||||||
"winston": "^3.17.0",
|
"winston": "^3.17.0",
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
"eslint-plugin-react": "^7.37.4",
|
"eslint-plugin-react": "^7.37.4",
|
||||||
"eslint-plugin-react-hooks": "^5.2.0",
|
"eslint-plugin-react-hooks": "^5.2.0",
|
||||||
"postcss": "^8.5.6",
|
"postcss": "^8.5.6",
|
||||||
"prettier": "^3.6.2",
|
"prettier": "^3.7.3",
|
||||||
"prettier-plugin-organize-imports": "^4.3.0",
|
"prettier-plugin-organize-imports": "^4.3.0",
|
||||||
"tailwind-scrollbar": "^4.0.2",
|
"tailwind-scrollbar": "^4.0.2",
|
||||||
"tailwindcss": "^4.0.9",
|
"tailwindcss": "^4.0.9",
|
||||||
@@ -63,13 +63,6 @@
|
|||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"osx-temperature-sensor": "^1.0.8"
|
"osx-temperature-sensor": "^1.0.8"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.8.1",
|
|
||||||
"devEngines": {
|
|
||||||
"packageManager": {
|
|
||||||
"name": "pnpm",
|
|
||||||
"version": "10.8.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
"onlyBuiltDependencies": [
|
"onlyBuiltDependencies": [
|
||||||
"osx-temperature-sensor",
|
"osx-temperature-sensor",
|
||||||
|
|||||||
434
pnpm-lock.yaml
generated
434
pnpm-lock.yaml
generated
@@ -51,11 +51,11 @@ importers:
|
|||||||
specifier: ^1.2.2
|
specifier: ^1.2.2
|
||||||
version: 1.2.2
|
version: 1.2.2
|
||||||
next:
|
next:
|
||||||
specifier: ^15.5.2
|
specifier: ^15.5.7
|
||||||
version: 15.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
version: 15.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
next-i18next:
|
next-i18next:
|
||||||
specifier: ^12.1.0
|
specifier: ^12.1.0
|
||||||
version: 12.1.0(next@15.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
version: 12.1.0(next@15.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
ping:
|
ping:
|
||||||
specifier: ^0.4.4
|
specifier: ^0.4.4
|
||||||
version: 0.4.4
|
version: 0.4.4
|
||||||
@@ -63,8 +63,8 @@ importers:
|
|||||||
specifier: ^7.1.0
|
specifier: ^7.1.0
|
||||||
version: 7.1.0
|
version: 7.1.0
|
||||||
raw-body:
|
raw-body:
|
||||||
specifier: ^3.0.1
|
specifier: ^3.0.2
|
||||||
version: 3.0.1
|
version: 3.0.2
|
||||||
react:
|
react:
|
||||||
specifier: ^18.3.1
|
specifier: ^18.3.1
|
||||||
version: 18.3.1
|
version: 18.3.1
|
||||||
@@ -84,8 +84,8 @@ importers:
|
|||||||
specifier: ^2.3.3
|
specifier: ^2.3.3
|
||||||
version: 2.3.3(react@18.3.1)
|
version: 2.3.3(react@18.3.1)
|
||||||
systeminformation:
|
systeminformation:
|
||||||
specifier: ^5.27.7
|
specifier: ^5.27.11
|
||||||
version: 5.27.7
|
version: 5.27.11
|
||||||
tough-cookie:
|
tough-cookie:
|
||||||
specifier: ^6.0.0
|
specifier: ^6.0.0
|
||||||
version: 6.0.0
|
version: 6.0.0
|
||||||
@@ -122,7 +122,7 @@ importers:
|
|||||||
version: 6.10.2(eslint@9.25.1(jiti@2.6.1))
|
version: 6.10.2(eslint@9.25.1(jiti@2.6.1))
|
||||||
eslint-plugin-prettier:
|
eslint-plugin-prettier:
|
||||||
specifier: ^5.5.4
|
specifier: ^5.5.4
|
||||||
version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.25.1(jiti@2.6.1)))(eslint@9.25.1(jiti@2.6.1))(prettier@3.6.2)
|
version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.25.1(jiti@2.6.1)))(eslint@9.25.1(jiti@2.6.1))(prettier@3.7.3)
|
||||||
eslint-plugin-react:
|
eslint-plugin-react:
|
||||||
specifier: ^7.37.4
|
specifier: ^7.37.4
|
||||||
version: 7.37.4(eslint@9.25.1(jiti@2.6.1))
|
version: 7.37.4(eslint@9.25.1(jiti@2.6.1))
|
||||||
@@ -133,11 +133,11 @@ importers:
|
|||||||
specifier: ^8.5.6
|
specifier: ^8.5.6
|
||||||
version: 8.5.6
|
version: 8.5.6
|
||||||
prettier:
|
prettier:
|
||||||
specifier: ^3.6.2
|
specifier: ^3.7.3
|
||||||
version: 3.6.2
|
version: 3.7.3
|
||||||
prettier-plugin-organize-imports:
|
prettier-plugin-organize-imports:
|
||||||
specifier: ^4.3.0
|
specifier: ^4.3.0
|
||||||
version: 4.3.0(prettier@3.6.2)(typescript@5.7.3)
|
version: 4.3.0(prettier@3.7.3)(typescript@5.7.3)
|
||||||
tailwind-scrollbar:
|
tailwind-scrollbar:
|
||||||
specifier: ^4.0.2
|
specifier: ^4.0.2
|
||||||
version: 4.0.2(react@18.3.1)(tailwindcss@4.0.9)
|
version: 4.0.2(react@18.3.1)(tailwindcss@4.0.9)
|
||||||
@@ -183,8 +183,8 @@ packages:
|
|||||||
'@emnapi/core@1.4.0':
|
'@emnapi/core@1.4.0':
|
||||||
resolution: {integrity: sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==}
|
resolution: {integrity: sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==}
|
||||||
|
|
||||||
'@emnapi/runtime@1.5.0':
|
'@emnapi/runtime@1.7.1':
|
||||||
resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==}
|
resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==}
|
||||||
|
|
||||||
'@emnapi/wasi-threads@1.0.1':
|
'@emnapi/wasi-threads@1.0.1':
|
||||||
resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==}
|
resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==}
|
||||||
@@ -284,124 +284,139 @@ packages:
|
|||||||
resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==}
|
resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==}
|
||||||
engines: {node: '>=18.18'}
|
engines: {node: '>=18.18'}
|
||||||
|
|
||||||
'@img/sharp-darwin-arm64@0.34.3':
|
'@img/colour@1.0.0':
|
||||||
resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==}
|
resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
|
'@img/sharp-darwin-arm64@0.34.5':
|
||||||
|
resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@img/sharp-darwin-x64@0.34.3':
|
'@img/sharp-darwin-x64@0.34.5':
|
||||||
resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==}
|
resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@img/sharp-libvips-darwin-arm64@1.2.0':
|
'@img/sharp-libvips-darwin-arm64@1.2.4':
|
||||||
resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==}
|
resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@img/sharp-libvips-darwin-x64@1.2.0':
|
'@img/sharp-libvips-darwin-x64@1.2.4':
|
||||||
resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==}
|
resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@img/sharp-libvips-linux-arm64@1.2.0':
|
'@img/sharp-libvips-linux-arm64@1.2.4':
|
||||||
resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==}
|
resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-libvips-linux-arm@1.2.0':
|
'@img/sharp-libvips-linux-arm@1.2.4':
|
||||||
resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==}
|
resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-libvips-linux-ppc64@1.2.0':
|
'@img/sharp-libvips-linux-ppc64@1.2.4':
|
||||||
resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==}
|
resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
|
||||||
cpu: [ppc64]
|
cpu: [ppc64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-libvips-linux-s390x@1.2.0':
|
'@img/sharp-libvips-linux-riscv64@1.2.4':
|
||||||
resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==}
|
resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
|
||||||
|
cpu: [riscv64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linux-s390x@1.2.4':
|
||||||
|
resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
|
||||||
cpu: [s390x]
|
cpu: [s390x]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-libvips-linux-x64@1.2.0':
|
'@img/sharp-libvips-linux-x64@1.2.4':
|
||||||
resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==}
|
resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-libvips-linuxmusl-arm64@1.2.0':
|
'@img/sharp-libvips-linuxmusl-arm64@1.2.4':
|
||||||
resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==}
|
resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-libvips-linuxmusl-x64@1.2.0':
|
'@img/sharp-libvips-linuxmusl-x64@1.2.4':
|
||||||
resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==}
|
resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-linux-arm64@0.34.3':
|
'@img/sharp-linux-arm64@0.34.5':
|
||||||
resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==}
|
resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-linux-arm@0.34.3':
|
'@img/sharp-linux-arm@0.34.5':
|
||||||
resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==}
|
resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-linux-ppc64@0.34.3':
|
'@img/sharp-linux-ppc64@0.34.5':
|
||||||
resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==}
|
resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
cpu: [ppc64]
|
cpu: [ppc64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-linux-s390x@0.34.3':
|
'@img/sharp-linux-riscv64@0.34.5':
|
||||||
resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==}
|
resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [riscv64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-linux-s390x@0.34.5':
|
||||||
|
resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
cpu: [s390x]
|
cpu: [s390x]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-linux-x64@0.34.3':
|
'@img/sharp-linux-x64@0.34.5':
|
||||||
resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==}
|
resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-linuxmusl-arm64@0.34.3':
|
'@img/sharp-linuxmusl-arm64@0.34.5':
|
||||||
resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==}
|
resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-linuxmusl-x64@0.34.3':
|
'@img/sharp-linuxmusl-x64@0.34.5':
|
||||||
resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==}
|
resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@img/sharp-wasm32@0.34.3':
|
'@img/sharp-wasm32@0.34.5':
|
||||||
resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==}
|
resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
cpu: [wasm32]
|
cpu: [wasm32]
|
||||||
|
|
||||||
'@img/sharp-win32-arm64@0.34.3':
|
'@img/sharp-win32-arm64@0.34.5':
|
||||||
resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==}
|
resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@img/sharp-win32-ia32@0.34.3':
|
'@img/sharp-win32-ia32@0.34.5':
|
||||||
resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==}
|
resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
cpu: [ia32]
|
cpu: [ia32]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@img/sharp-win32-x64@0.34.3':
|
'@img/sharp-win32-x64@0.34.5':
|
||||||
resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==}
|
resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
@@ -451,56 +466,56 @@ packages:
|
|||||||
'@napi-rs/wasm-runtime@0.2.8':
|
'@napi-rs/wasm-runtime@0.2.8':
|
||||||
resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==}
|
resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==}
|
||||||
|
|
||||||
'@next/env@15.5.2':
|
'@next/env@15.5.7':
|
||||||
resolution: {integrity: sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==}
|
resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==}
|
||||||
|
|
||||||
'@next/eslint-plugin-next@15.2.4':
|
'@next/eslint-plugin-next@15.2.4':
|
||||||
resolution: {integrity: sha512-O8ScvKtnxkp8kL9TpJTTKnMqlkZnS+QxwoQnJwPGBxjBbzd6OVVPEJ5/pMNrktSyXQD/chEfzfFzYLM6JANOOQ==}
|
resolution: {integrity: sha512-O8ScvKtnxkp8kL9TpJTTKnMqlkZnS+QxwoQnJwPGBxjBbzd6OVVPEJ5/pMNrktSyXQD/chEfzfFzYLM6JANOOQ==}
|
||||||
|
|
||||||
'@next/swc-darwin-arm64@15.5.2':
|
'@next/swc-darwin-arm64@15.5.7':
|
||||||
resolution: {integrity: sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==}
|
resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@next/swc-darwin-x64@15.5.2':
|
'@next/swc-darwin-x64@15.5.7':
|
||||||
resolution: {integrity: sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==}
|
resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@next/swc-linux-arm64-gnu@15.5.2':
|
'@next/swc-linux-arm64-gnu@15.5.7':
|
||||||
resolution: {integrity: sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==}
|
resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@next/swc-linux-arm64-musl@15.5.2':
|
'@next/swc-linux-arm64-musl@15.5.7':
|
||||||
resolution: {integrity: sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==}
|
resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@next/swc-linux-x64-gnu@15.5.2':
|
'@next/swc-linux-x64-gnu@15.5.7':
|
||||||
resolution: {integrity: sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==}
|
resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@next/swc-linux-x64-musl@15.5.2':
|
'@next/swc-linux-x64-musl@15.5.7':
|
||||||
resolution: {integrity: sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==}
|
resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@next/swc-win32-arm64-msvc@15.5.2':
|
'@next/swc-win32-arm64-msvc@15.5.7':
|
||||||
resolution: {integrity: sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==}
|
resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@next/swc-win32-x64-msvc@15.5.2':
|
'@next/swc-win32-x64-msvc@15.5.7':
|
||||||
resolution: {integrity: sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==}
|
resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
@@ -1105,8 +1120,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
|
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
caniuse-lite@1.0.30001739:
|
caniuse-lite@1.0.30001759:
|
||||||
resolution: {integrity: sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==}
|
resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==}
|
||||||
|
|
||||||
chalk@4.1.2:
|
chalk@4.1.2:
|
||||||
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
|
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
|
||||||
@@ -1152,10 +1167,6 @@ packages:
|
|||||||
color@3.2.1:
|
color@3.2.1:
|
||||||
resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==}
|
resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==}
|
||||||
|
|
||||||
color@4.2.3:
|
|
||||||
resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
|
|
||||||
engines: {node: '>=12.5.0'}
|
|
||||||
|
|
||||||
colorspace@1.1.4:
|
colorspace@1.1.4:
|
||||||
resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==}
|
resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==}
|
||||||
|
|
||||||
@@ -1309,14 +1320,14 @@ packages:
|
|||||||
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
|
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
detect-libc@2.0.4:
|
|
||||||
resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
|
|
||||||
engines: {node: '>=8'}
|
|
||||||
|
|
||||||
detect-libc@2.1.1:
|
detect-libc@2.1.1:
|
||||||
resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==}
|
resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
|
detect-libc@2.1.2:
|
||||||
|
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
docker-modem@5.0.6:
|
docker-modem@5.0.6:
|
||||||
resolution: {integrity: sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==}
|
resolution: {integrity: sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==}
|
||||||
engines: {node: '>= 8.0'}
|
engines: {node: '>= 8.0'}
|
||||||
@@ -1749,8 +1760,8 @@ packages:
|
|||||||
http-cache-semantics@4.2.0:
|
http-cache-semantics@4.2.0:
|
||||||
resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
|
resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
|
||||||
|
|
||||||
http-errors@2.0.0:
|
http-errors@2.0.1:
|
||||||
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
|
resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
|
|
||||||
http2-wrapper@2.2.1:
|
http2-wrapper@2.2.1:
|
||||||
@@ -2201,8 +2212,8 @@ packages:
|
|||||||
next: '>= 10.0.0'
|
next: '>= 10.0.0'
|
||||||
react: '>= 16.8.0'
|
react: '>= 16.8.0'
|
||||||
|
|
||||||
next@15.5.2:
|
next@15.5.7:
|
||||||
resolution: {integrity: sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q==}
|
resolution: {integrity: sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==}
|
||||||
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
|
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2371,8 +2382,8 @@ packages:
|
|||||||
vue-tsc:
|
vue-tsc:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
prettier@3.6.2:
|
prettier@3.7.3:
|
||||||
resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
|
resolution: {integrity: sha512-QgODejq9K3OzoBbuyobZlUhznP5SKwPqp+6Q6xw6o8gnhr4O85L2U915iM2IDcfF2NPXVaM9zlo9tdwipnYwzg==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -2409,8 +2420,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
|
resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
raw-body@3.0.1:
|
raw-body@3.0.2:
|
||||||
resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==}
|
resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}
|
||||||
engines: {node: '>= 0.10'}
|
engines: {node: '>= 0.10'}
|
||||||
|
|
||||||
react-dom@18.3.1:
|
react-dom@18.3.1:
|
||||||
@@ -2597,8 +2608,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
|
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
semver@7.7.2:
|
semver@7.7.3:
|
||||||
resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
|
resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -2617,8 +2628,8 @@ packages:
|
|||||||
setprototypeof@1.2.0:
|
setprototypeof@1.2.0:
|
||||||
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
|
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
|
||||||
|
|
||||||
sharp@0.34.3:
|
sharp@0.34.5:
|
||||||
resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==}
|
resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
|
||||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
|
||||||
shebang-command@2.0.0:
|
shebang-command@2.0.0:
|
||||||
@@ -2669,8 +2680,8 @@ packages:
|
|||||||
stack-trace@0.0.10:
|
stack-trace@0.0.10:
|
||||||
resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
|
resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
|
||||||
|
|
||||||
statuses@2.0.1:
|
statuses@2.0.2:
|
||||||
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
|
resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
|
|
||||||
stop-iteration-iterator@1.1.0:
|
stop-iteration-iterator@1.1.0:
|
||||||
@@ -2776,8 +2787,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==}
|
resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==}
|
||||||
engines: {node: ^14.18.0 || >=16.0.0}
|
engines: {node: ^14.18.0 || >=16.0.0}
|
||||||
|
|
||||||
systeminformation@5.27.7:
|
systeminformation@5.27.11:
|
||||||
resolution: {integrity: sha512-saaqOoVEEFaux4v0K8Q7caiauRwjXC4XbD2eH60dxHXbpKxQ8kH9Rf7Jh+nryKpOUSEFxtCdBlSUx0/lO6rwRg==}
|
resolution: {integrity: sha512-K3Lto/2m3K2twmKHdgx5B+0in9qhXK4YnoT9rIlgwN/4v7OV5c8IjbeAUkuky/6VzCQC7iKCAqi8rZathCdjHg==}
|
||||||
engines: {node: '>=8.0.0'}
|
engines: {node: '>=8.0.0'}
|
||||||
os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
|
os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
|
||||||
hasBin: true
|
hasBin: true
|
||||||
@@ -3078,7 +3089,7 @@ snapshots:
|
|||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@emnapi/runtime@1.5.0':
|
'@emnapi/runtime@1.7.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
optional: true
|
optional: true
|
||||||
@@ -3192,90 +3203,101 @@ snapshots:
|
|||||||
|
|
||||||
'@humanwhocodes/retry@0.4.2': {}
|
'@humanwhocodes/retry@0.4.2': {}
|
||||||
|
|
||||||
'@img/sharp-darwin-arm64@0.34.3':
|
'@img/colour@1.0.0':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-darwin-arm64@0.34.5':
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@img/sharp-libvips-darwin-arm64': 1.2.0
|
'@img/sharp-libvips-darwin-arm64': 1.2.4
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-darwin-x64@0.34.3':
|
'@img/sharp-darwin-x64@0.34.5':
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@img/sharp-libvips-darwin-x64': 1.2.0
|
'@img/sharp-libvips-darwin-x64': 1.2.4
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-libvips-darwin-arm64@1.2.0':
|
'@img/sharp-libvips-darwin-arm64@1.2.4':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-libvips-darwin-x64@1.2.0':
|
'@img/sharp-libvips-darwin-x64@1.2.4':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-libvips-linux-arm64@1.2.0':
|
'@img/sharp-libvips-linux-arm64@1.2.4':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-libvips-linux-arm@1.2.0':
|
'@img/sharp-libvips-linux-arm@1.2.4':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-libvips-linux-ppc64@1.2.0':
|
'@img/sharp-libvips-linux-ppc64@1.2.4':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-libvips-linux-s390x@1.2.0':
|
'@img/sharp-libvips-linux-riscv64@1.2.4':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-libvips-linux-x64@1.2.0':
|
'@img/sharp-libvips-linux-s390x@1.2.4':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-libvips-linuxmusl-arm64@1.2.0':
|
'@img/sharp-libvips-linux-x64@1.2.4':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-libvips-linuxmusl-x64@1.2.0':
|
'@img/sharp-libvips-linuxmusl-arm64@1.2.4':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-linux-arm64@0.34.3':
|
'@img/sharp-libvips-linuxmusl-x64@1.2.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-linux-arm64@0.34.5':
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@img/sharp-libvips-linux-arm64': 1.2.0
|
'@img/sharp-libvips-linux-arm64': 1.2.4
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-linux-arm@0.34.3':
|
'@img/sharp-linux-arm@0.34.5':
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@img/sharp-libvips-linux-arm': 1.2.0
|
'@img/sharp-libvips-linux-arm': 1.2.4
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-linux-ppc64@0.34.3':
|
'@img/sharp-linux-ppc64@0.34.5':
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@img/sharp-libvips-linux-ppc64': 1.2.0
|
'@img/sharp-libvips-linux-ppc64': 1.2.4
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-linux-s390x@0.34.3':
|
'@img/sharp-linux-riscv64@0.34.5':
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@img/sharp-libvips-linux-s390x': 1.2.0
|
'@img/sharp-libvips-linux-riscv64': 1.2.4
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-linux-x64@0.34.3':
|
'@img/sharp-linux-s390x@0.34.5':
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@img/sharp-libvips-linux-x64': 1.2.0
|
'@img/sharp-libvips-linux-s390x': 1.2.4
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-linuxmusl-arm64@0.34.3':
|
'@img/sharp-linux-x64@0.34.5':
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@img/sharp-libvips-linuxmusl-arm64': 1.2.0
|
'@img/sharp-libvips-linux-x64': 1.2.4
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-linuxmusl-x64@0.34.3':
|
'@img/sharp-linuxmusl-arm64@0.34.5':
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@img/sharp-libvips-linuxmusl-x64': 1.2.0
|
'@img/sharp-libvips-linuxmusl-arm64': 1.2.4
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-wasm32@0.34.3':
|
'@img/sharp-linuxmusl-x64@0.34.5':
|
||||||
|
optionalDependencies:
|
||||||
|
'@img/sharp-libvips-linuxmusl-x64': 1.2.4
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-wasm32@0.34.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@emnapi/runtime': 1.5.0
|
'@emnapi/runtime': 1.7.1
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-win32-arm64@0.34.3':
|
'@img/sharp-win32-arm64@0.34.5':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-win32-ia32@0.34.3':
|
'@img/sharp-win32-ia32@0.34.5':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@img/sharp-win32-x64@0.34.3':
|
'@img/sharp-win32-x64@0.34.5':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@isaacs/cliui@8.0.2':
|
'@isaacs/cliui@8.0.2':
|
||||||
@@ -3348,38 +3370,38 @@ snapshots:
|
|||||||
'@napi-rs/wasm-runtime@0.2.8':
|
'@napi-rs/wasm-runtime@0.2.8':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@emnapi/core': 1.4.0
|
'@emnapi/core': 1.4.0
|
||||||
'@emnapi/runtime': 1.5.0
|
'@emnapi/runtime': 1.7.1
|
||||||
'@tybys/wasm-util': 0.9.0
|
'@tybys/wasm-util': 0.9.0
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/env@15.5.2': {}
|
'@next/env@15.5.7': {}
|
||||||
|
|
||||||
'@next/eslint-plugin-next@15.2.4':
|
'@next/eslint-plugin-next@15.2.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
fast-glob: 3.3.1
|
fast-glob: 3.3.1
|
||||||
|
|
||||||
'@next/swc-darwin-arm64@15.5.2':
|
'@next/swc-darwin-arm64@15.5.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-darwin-x64@15.5.2':
|
'@next/swc-darwin-x64@15.5.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-linux-arm64-gnu@15.5.2':
|
'@next/swc-linux-arm64-gnu@15.5.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-linux-arm64-musl@15.5.2':
|
'@next/swc-linux-arm64-musl@15.5.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-linux-x64-gnu@15.5.2':
|
'@next/swc-linux-x64-gnu@15.5.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-linux-x64-musl@15.5.2':
|
'@next/swc-linux-x64-musl@15.5.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-win32-arm64-msvc@15.5.2':
|
'@next/swc-win32-arm64-msvc@15.5.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-win32-x64-msvc@15.5.2':
|
'@next/swc-win32-x64-msvc@15.5.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@nodelib/fs.scandir@2.1.5':
|
'@nodelib/fs.scandir@2.1.5':
|
||||||
@@ -3727,7 +3749,7 @@ snapshots:
|
|||||||
fast-glob: 3.3.3
|
fast-glob: 3.3.3
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
minimatch: 9.0.5
|
minimatch: 9.0.5
|
||||||
semver: 7.7.2
|
semver: 7.7.3
|
||||||
ts-api-utils: 2.1.0(typescript@5.7.3)
|
ts-api-utils: 2.1.0(typescript@5.7.3)
|
||||||
typescript: 5.7.3
|
typescript: 5.7.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
@@ -4002,7 +4024,7 @@ snapshots:
|
|||||||
|
|
||||||
callsites@3.1.0: {}
|
callsites@3.1.0: {}
|
||||||
|
|
||||||
caniuse-lite@1.0.30001739: {}
|
caniuse-lite@1.0.30001759: {}
|
||||||
|
|
||||||
chalk@4.1.2:
|
chalk@4.1.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -4047,12 +4069,6 @@ snapshots:
|
|||||||
color-convert: 1.9.3
|
color-convert: 1.9.3
|
||||||
color-string: 1.9.1
|
color-string: 1.9.1
|
||||||
|
|
||||||
color@4.2.3:
|
|
||||||
dependencies:
|
|
||||||
color-convert: 2.0.1
|
|
||||||
color-string: 1.9.1
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
colorspace@1.1.4:
|
colorspace@1.1.4:
|
||||||
dependencies:
|
dependencies:
|
||||||
color: 3.2.1
|
color: 3.2.1
|
||||||
@@ -4184,11 +4200,11 @@ snapshots:
|
|||||||
|
|
||||||
dequal@2.0.3: {}
|
dequal@2.0.3: {}
|
||||||
|
|
||||||
detect-libc@2.0.4:
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
detect-libc@2.1.1: {}
|
detect-libc@2.1.1: {}
|
||||||
|
|
||||||
|
detect-libc@2.1.2:
|
||||||
|
optional: true
|
||||||
|
|
||||||
docker-modem@5.0.6:
|
docker-modem@5.0.6:
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.4.1
|
debug: 4.4.1
|
||||||
@@ -4506,10 +4522,10 @@ snapshots:
|
|||||||
safe-regex-test: 1.1.0
|
safe-regex-test: 1.1.0
|
||||||
string.prototype.includes: 2.0.1
|
string.prototype.includes: 2.0.1
|
||||||
|
|
||||||
eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.25.1(jiti@2.6.1)))(eslint@9.25.1(jiti@2.6.1))(prettier@3.6.2):
|
eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.25.1(jiti@2.6.1)))(eslint@9.25.1(jiti@2.6.1))(prettier@3.7.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 9.25.1(jiti@2.6.1)
|
eslint: 9.25.1(jiti@2.6.1)
|
||||||
prettier: 3.6.2
|
prettier: 3.7.3
|
||||||
prettier-linter-helpers: 1.0.0
|
prettier-linter-helpers: 1.0.0
|
||||||
synckit: 0.11.11
|
synckit: 0.11.11
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
@@ -4850,12 +4866,12 @@ snapshots:
|
|||||||
|
|
||||||
http-cache-semantics@4.2.0: {}
|
http-cache-semantics@4.2.0: {}
|
||||||
|
|
||||||
http-errors@2.0.0:
|
http-errors@2.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
depd: 2.0.0
|
depd: 2.0.0
|
||||||
inherits: 2.0.4
|
inherits: 2.0.4
|
||||||
setprototypeof: 1.2.0
|
setprototypeof: 1.2.0
|
||||||
statuses: 2.0.1
|
statuses: 2.0.2
|
||||||
toidentifier: 1.0.1
|
toidentifier: 1.0.1
|
||||||
|
|
||||||
http2-wrapper@2.2.1:
|
http2-wrapper@2.2.1:
|
||||||
@@ -4931,7 +4947,7 @@ snapshots:
|
|||||||
|
|
||||||
is-bun-module@2.0.0:
|
is-bun-module@2.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
semver: 7.7.2
|
semver: 7.7.3
|
||||||
|
|
||||||
is-callable@1.2.7: {}
|
is-callable@1.2.7: {}
|
||||||
|
|
||||||
@@ -5243,7 +5259,7 @@ snapshots:
|
|||||||
|
|
||||||
net@1.0.2: {}
|
net@1.0.2: {}
|
||||||
|
|
||||||
next-i18next@12.1.0(next@15.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
next-i18next@12.1.0(next@15.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/runtime': 7.26.9
|
'@babel/runtime': 7.26.9
|
||||||
'@types/hoist-non-react-statics': 3.3.6
|
'@types/hoist-non-react-statics': 3.3.6
|
||||||
@@ -5251,32 +5267,32 @@ snapshots:
|
|||||||
hoist-non-react-statics: 3.3.2
|
hoist-non-react-statics: 3.3.2
|
||||||
i18next: 21.10.0
|
i18next: 21.10.0
|
||||||
i18next-fs-backend: 1.2.0
|
i18next-fs-backend: 1.2.0
|
||||||
next: 15.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
next: 15.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-i18next: 11.18.6(i18next@21.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
react-i18next: 11.18.6(i18next@21.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- react-dom
|
- react-dom
|
||||||
- react-native
|
- react-native
|
||||||
|
|
||||||
next@15.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
next@15.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@next/env': 15.5.2
|
'@next/env': 15.5.7
|
||||||
'@swc/helpers': 0.5.15
|
'@swc/helpers': 0.5.15
|
||||||
caniuse-lite: 1.0.30001739
|
caniuse-lite: 1.0.30001759
|
||||||
postcss: 8.4.31
|
postcss: 8.4.31
|
||||||
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)
|
||||||
styled-jsx: 5.1.6(react@18.3.1)
|
styled-jsx: 5.1.6(react@18.3.1)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@next/swc-darwin-arm64': 15.5.2
|
'@next/swc-darwin-arm64': 15.5.7
|
||||||
'@next/swc-darwin-x64': 15.5.2
|
'@next/swc-darwin-x64': 15.5.7
|
||||||
'@next/swc-linux-arm64-gnu': 15.5.2
|
'@next/swc-linux-arm64-gnu': 15.5.7
|
||||||
'@next/swc-linux-arm64-musl': 15.5.2
|
'@next/swc-linux-arm64-musl': 15.5.7
|
||||||
'@next/swc-linux-x64-gnu': 15.5.2
|
'@next/swc-linux-x64-gnu': 15.5.7
|
||||||
'@next/swc-linux-x64-musl': 15.5.2
|
'@next/swc-linux-x64-musl': 15.5.7
|
||||||
'@next/swc-win32-arm64-msvc': 15.5.2
|
'@next/swc-win32-arm64-msvc': 15.5.7
|
||||||
'@next/swc-win32-x64-msvc': 15.5.2
|
'@next/swc-win32-x64-msvc': 15.5.7
|
||||||
sharp: 0.34.3
|
sharp: 0.34.5
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@babel/core'
|
- '@babel/core'
|
||||||
- babel-plugin-macros
|
- babel-plugin-macros
|
||||||
@@ -5416,12 +5432,12 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
fast-diff: 1.3.0
|
fast-diff: 1.3.0
|
||||||
|
|
||||||
prettier-plugin-organize-imports@4.3.0(prettier@3.6.2)(typescript@5.7.3):
|
prettier-plugin-organize-imports@4.3.0(prettier@3.7.3)(typescript@5.7.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
prettier: 3.6.2
|
prettier: 3.7.3
|
||||||
typescript: 5.7.3
|
typescript: 5.7.3
|
||||||
|
|
||||||
prettier@3.6.2: {}
|
prettier@3.7.3: {}
|
||||||
|
|
||||||
pretty-bytes@7.1.0: {}
|
pretty-bytes@7.1.0: {}
|
||||||
|
|
||||||
@@ -5465,10 +5481,10 @@ snapshots:
|
|||||||
|
|
||||||
quick-lru@5.1.1: {}
|
quick-lru@5.1.1: {}
|
||||||
|
|
||||||
raw-body@3.0.1:
|
raw-body@3.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
bytes: 3.1.2
|
bytes: 3.1.2
|
||||||
http-errors: 2.0.0
|
http-errors: 2.0.1
|
||||||
iconv-lite: 0.7.0
|
iconv-lite: 0.7.0
|
||||||
unpipe: 1.0.0
|
unpipe: 1.0.0
|
||||||
|
|
||||||
@@ -5668,7 +5684,7 @@ snapshots:
|
|||||||
|
|
||||||
semver@6.3.1: {}
|
semver@6.3.1: {}
|
||||||
|
|
||||||
semver@7.7.2: {}
|
semver@7.7.3: {}
|
||||||
|
|
||||||
set-function-length@1.2.2:
|
set-function-length@1.2.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -5694,34 +5710,36 @@ snapshots:
|
|||||||
|
|
||||||
setprototypeof@1.2.0: {}
|
setprototypeof@1.2.0: {}
|
||||||
|
|
||||||
sharp@0.34.3:
|
sharp@0.34.5:
|
||||||
dependencies:
|
dependencies:
|
||||||
color: 4.2.3
|
'@img/colour': 1.0.0
|
||||||
detect-libc: 2.0.4
|
detect-libc: 2.1.2
|
||||||
semver: 7.7.2
|
semver: 7.7.3
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@img/sharp-darwin-arm64': 0.34.3
|
'@img/sharp-darwin-arm64': 0.34.5
|
||||||
'@img/sharp-darwin-x64': 0.34.3
|
'@img/sharp-darwin-x64': 0.34.5
|
||||||
'@img/sharp-libvips-darwin-arm64': 1.2.0
|
'@img/sharp-libvips-darwin-arm64': 1.2.4
|
||||||
'@img/sharp-libvips-darwin-x64': 1.2.0
|
'@img/sharp-libvips-darwin-x64': 1.2.4
|
||||||
'@img/sharp-libvips-linux-arm': 1.2.0
|
'@img/sharp-libvips-linux-arm': 1.2.4
|
||||||
'@img/sharp-libvips-linux-arm64': 1.2.0
|
'@img/sharp-libvips-linux-arm64': 1.2.4
|
||||||
'@img/sharp-libvips-linux-ppc64': 1.2.0
|
'@img/sharp-libvips-linux-ppc64': 1.2.4
|
||||||
'@img/sharp-libvips-linux-s390x': 1.2.0
|
'@img/sharp-libvips-linux-riscv64': 1.2.4
|
||||||
'@img/sharp-libvips-linux-x64': 1.2.0
|
'@img/sharp-libvips-linux-s390x': 1.2.4
|
||||||
'@img/sharp-libvips-linuxmusl-arm64': 1.2.0
|
'@img/sharp-libvips-linux-x64': 1.2.4
|
||||||
'@img/sharp-libvips-linuxmusl-x64': 1.2.0
|
'@img/sharp-libvips-linuxmusl-arm64': 1.2.4
|
||||||
'@img/sharp-linux-arm': 0.34.3
|
'@img/sharp-libvips-linuxmusl-x64': 1.2.4
|
||||||
'@img/sharp-linux-arm64': 0.34.3
|
'@img/sharp-linux-arm': 0.34.5
|
||||||
'@img/sharp-linux-ppc64': 0.34.3
|
'@img/sharp-linux-arm64': 0.34.5
|
||||||
'@img/sharp-linux-s390x': 0.34.3
|
'@img/sharp-linux-ppc64': 0.34.5
|
||||||
'@img/sharp-linux-x64': 0.34.3
|
'@img/sharp-linux-riscv64': 0.34.5
|
||||||
'@img/sharp-linuxmusl-arm64': 0.34.3
|
'@img/sharp-linux-s390x': 0.34.5
|
||||||
'@img/sharp-linuxmusl-x64': 0.34.3
|
'@img/sharp-linux-x64': 0.34.5
|
||||||
'@img/sharp-wasm32': 0.34.3
|
'@img/sharp-linuxmusl-arm64': 0.34.5
|
||||||
'@img/sharp-win32-arm64': 0.34.3
|
'@img/sharp-linuxmusl-x64': 0.34.5
|
||||||
'@img/sharp-win32-ia32': 0.34.3
|
'@img/sharp-wasm32': 0.34.5
|
||||||
'@img/sharp-win32-x64': 0.34.3
|
'@img/sharp-win32-arm64': 0.34.5
|
||||||
|
'@img/sharp-win32-ia32': 0.34.5
|
||||||
|
'@img/sharp-win32-x64': 0.34.5
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
shebang-command@2.0.0:
|
shebang-command@2.0.0:
|
||||||
@@ -5780,7 +5798,7 @@ snapshots:
|
|||||||
|
|
||||||
stack-trace@0.0.10: {}
|
stack-trace@0.0.10: {}
|
||||||
|
|
||||||
statuses@2.0.1: {}
|
statuses@2.0.2: {}
|
||||||
|
|
||||||
stop-iteration-iterator@1.1.0:
|
stop-iteration-iterator@1.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -5905,7 +5923,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@pkgr/core': 0.2.9
|
'@pkgr/core': 0.2.9
|
||||||
|
|
||||||
systeminformation@5.27.7: {}
|
systeminformation@5.27.11: {}
|
||||||
|
|
||||||
tabbable@6.3.0: {}
|
tabbable@6.3.0: {}
|
||||||
|
|
||||||
|
|||||||
@@ -759,7 +759,8 @@
|
|||||||
"ghostfolio": {
|
"ghostfolio": {
|
||||||
"gross_percent_today": "Today",
|
"gross_percent_today": "Today",
|
||||||
"gross_percent_1y": "One year",
|
"gross_percent_1y": "One year",
|
||||||
"gross_percent_max": "All time"
|
"gross_percent_max": "All time",
|
||||||
|
"net_worth": "Net Worth"
|
||||||
},
|
},
|
||||||
"audiobookshelf": {
|
"audiobookshelf": {
|
||||||
"podcasts": "Podcasts",
|
"podcasts": "Podcasts",
|
||||||
|
|||||||
@@ -1,750 +0,0 @@
|
|||||||
{
|
|
||||||
"widget": {
|
|
||||||
"missing_type": "缺少小部件类型:{{type}}",
|
|
||||||
"api_error": "API错误",
|
|
||||||
"status": "状态",
|
|
||||||
"information": "信息",
|
|
||||||
"url": "URL",
|
|
||||||
"raw_error": "原始错误",
|
|
||||||
"response_data": "返回数据"
|
|
||||||
},
|
|
||||||
"search": {
|
|
||||||
"placeholder": "搜索…"
|
|
||||||
},
|
|
||||||
"resources": {
|
|
||||||
"total": "总计",
|
|
||||||
"free": "空闲",
|
|
||||||
"used": "已用",
|
|
||||||
"load": "负载",
|
|
||||||
"cpu": "处理器",
|
|
||||||
"mem": "内存",
|
|
||||||
"temp": "温度",
|
|
||||||
"max": "最大",
|
|
||||||
"uptime": "运行时间",
|
|
||||||
"months": "月",
|
|
||||||
"days": "天",
|
|
||||||
"hours": "时",
|
|
||||||
"minutes": "分"
|
|
||||||
},
|
|
||||||
"docker": {
|
|
||||||
"rx": "接收",
|
|
||||||
"tx": "发送",
|
|
||||||
"mem": "内存",
|
|
||||||
"cpu": "处理器",
|
|
||||||
"offline": "离线",
|
|
||||||
"error": "错误",
|
|
||||||
"unknown": "未知问题",
|
|
||||||
"starting": "启动中",
|
|
||||||
"unhealthy": "不健康的",
|
|
||||||
"not_found": "未找到",
|
|
||||||
"running": "运行中",
|
|
||||||
"exited": "已退出",
|
|
||||||
"partial": "部分",
|
|
||||||
"healthy": "健康的"
|
|
||||||
},
|
|
||||||
"emby": {
|
|
||||||
"playing": "播放中",
|
|
||||||
"transcoding": "转码",
|
|
||||||
"bitrate": "比特率",
|
|
||||||
"no_active": "暂无播放",
|
|
||||||
"movies": "电影",
|
|
||||||
"series": "系列",
|
|
||||||
"episodes": "剧集",
|
|
||||||
"songs": "歌曲"
|
|
||||||
},
|
|
||||||
"tautulli": {
|
|
||||||
"playing": "播放中",
|
|
||||||
"transcoding": "转码",
|
|
||||||
"bitrate": "比特率",
|
|
||||||
"no_active": "暂无播放",
|
|
||||||
"plex_connection_error": "Check Plex Connection"
|
|
||||||
},
|
|
||||||
"rutorrent": {
|
|
||||||
"active": "活动中",
|
|
||||||
"upload": "上传",
|
|
||||||
"download": "下载"
|
|
||||||
},
|
|
||||||
"sonarr": {
|
|
||||||
"wanted": "想看",
|
|
||||||
"queued": "排队",
|
|
||||||
"series": "系列",
|
|
||||||
"queue": "Queue",
|
|
||||||
"unknown": "Unknown"
|
|
||||||
},
|
|
||||||
"radarr": {
|
|
||||||
"wanted": "想看",
|
|
||||||
"queued": "队列",
|
|
||||||
"movies": "电影",
|
|
||||||
"missing": "丢失",
|
|
||||||
"queue": "Queue",
|
|
||||||
"unknown": "Unknown"
|
|
||||||
},
|
|
||||||
"readarr": {
|
|
||||||
"wanted": "订阅",
|
|
||||||
"queued": "队列",
|
|
||||||
"books": "书籍"
|
|
||||||
},
|
|
||||||
"ombi": {
|
|
||||||
"pending": "待办的",
|
|
||||||
"approved": "已批准",
|
|
||||||
"available": "可用的"
|
|
||||||
},
|
|
||||||
"jellyseerr": {
|
|
||||||
"pending": "待办的",
|
|
||||||
"approved": "得到正式认可的",
|
|
||||||
"available": "可用的"
|
|
||||||
},
|
|
||||||
"pihole": {
|
|
||||||
"queries": "查询",
|
|
||||||
"blocked": "阻止",
|
|
||||||
"gravity": "重力",
|
|
||||||
"blocked_percent": "拦截 %"
|
|
||||||
},
|
|
||||||
"speedtest": {
|
|
||||||
"upload": "上传",
|
|
||||||
"download": "下载",
|
|
||||||
"ping": "ping"
|
|
||||||
},
|
|
||||||
"portainer": {
|
|
||||||
"running": "运行中",
|
|
||||||
"stopped": "停止",
|
|
||||||
"total": "总计"
|
|
||||||
},
|
|
||||||
"traefik": {
|
|
||||||
"routers": "路由器",
|
|
||||||
"services": "服务",
|
|
||||||
"middleware": "中间件"
|
|
||||||
},
|
|
||||||
"npm": {
|
|
||||||
"enabled": "已启用",
|
|
||||||
"disabled": "禁用",
|
|
||||||
"total": "全部的"
|
|
||||||
},
|
|
||||||
"weather": {
|
|
||||||
"current": "当前定位",
|
|
||||||
"allow": "点击并允许",
|
|
||||||
"updating": "更新中",
|
|
||||||
"wait": "请稍候"
|
|
||||||
},
|
|
||||||
"overseerr": {
|
|
||||||
"pending": "待办",
|
|
||||||
"approved": "已批准",
|
|
||||||
"available": "可用",
|
|
||||||
"processing": "处理中"
|
|
||||||
},
|
|
||||||
"sabnzbd": {
|
|
||||||
"rate": "速率",
|
|
||||||
"queue": "队列",
|
|
||||||
"timeleft": "剩余时间"
|
|
||||||
},
|
|
||||||
"nzbget": {
|
|
||||||
"rate": "速率",
|
|
||||||
"remaining": "剩余",
|
|
||||||
"downloaded": "下载"
|
|
||||||
},
|
|
||||||
"coinmarketcap": {
|
|
||||||
"configure": "配置一个或多个需要追踪的加密",
|
|
||||||
"1hour": "1小时",
|
|
||||||
"1day": "1天",
|
|
||||||
"7days": "7天",
|
|
||||||
"30days": "30天"
|
|
||||||
},
|
|
||||||
"gotify": {
|
|
||||||
"apps": "应用",
|
|
||||||
"clients": "客户端",
|
|
||||||
"messages": "信息"
|
|
||||||
},
|
|
||||||
"prowlarr": {
|
|
||||||
"enableIndexers": "索引器",
|
|
||||||
"numberOfGrabs": "抓取",
|
|
||||||
"numberOfQueries": "查询",
|
|
||||||
"numberOfFailGrabs": "抓取失败",
|
|
||||||
"numberOfFailQueries": "查询失败"
|
|
||||||
},
|
|
||||||
"transmission": {
|
|
||||||
"download": "下载",
|
|
||||||
"upload": "上传",
|
|
||||||
"leech": "下载中",
|
|
||||||
"seed": "做种"
|
|
||||||
},
|
|
||||||
"jackett": {
|
|
||||||
"configured": "已配置",
|
|
||||||
"errored": "出错了"
|
|
||||||
},
|
|
||||||
"bazarr": {
|
|
||||||
"missingEpisodes": "缺少的剧集",
|
|
||||||
"missingMovies": "缺少的电影"
|
|
||||||
},
|
|
||||||
"lidarr": {
|
|
||||||
"wanted": "订阅",
|
|
||||||
"queued": "队列",
|
|
||||||
"artists": "Artists"
|
|
||||||
},
|
|
||||||
"adguard": {
|
|
||||||
"queries": "查询",
|
|
||||||
"blocked": "阻止",
|
|
||||||
"filtered": "过滤",
|
|
||||||
"latency": "延迟"
|
|
||||||
},
|
|
||||||
"qbittorrent": {
|
|
||||||
"download": "下载",
|
|
||||||
"upload": "上传",
|
|
||||||
"leech": "下载中",
|
|
||||||
"seed": "做种"
|
|
||||||
},
|
|
||||||
"mastodon": {
|
|
||||||
"user_count": "用户",
|
|
||||||
"status_count": "帖子",
|
|
||||||
"domain_count": "域"
|
|
||||||
},
|
|
||||||
"strelaysrv": {
|
|
||||||
"numActiveSessions": "会话",
|
|
||||||
"dataRelayed": "中继",
|
|
||||||
"numConnections": "连接",
|
|
||||||
"transferRate": "速度"
|
|
||||||
},
|
|
||||||
"authentik": {
|
|
||||||
"users": "用户",
|
|
||||||
"loginsLast24H": "登录 (24h)",
|
|
||||||
"failedLoginsLast24H": "登录失败 (24h)"
|
|
||||||
},
|
|
||||||
"proxmox": {
|
|
||||||
"mem": "内存",
|
|
||||||
"cpu": "处理器",
|
|
||||||
"lxc": "容器",
|
|
||||||
"vms": "虚拟机"
|
|
||||||
},
|
|
||||||
"unifi": {
|
|
||||||
"users": "用户",
|
|
||||||
"uptime": "系统运行时间",
|
|
||||||
"days": "天",
|
|
||||||
"wan": "广域网",
|
|
||||||
"lan_users": "局域网用户",
|
|
||||||
"wlan_users": "无线局域网用户",
|
|
||||||
"up": "向上",
|
|
||||||
"down": "向下",
|
|
||||||
"wait": "请稍候",
|
|
||||||
"lan": "局域网",
|
|
||||||
"wlan": "无线局域网",
|
|
||||||
"devices": "设备",
|
|
||||||
"lan_devices": "局域网设备",
|
|
||||||
"wlan_devices": "无线局域网设备",
|
|
||||||
"empty_data": "子系统状态未知"
|
|
||||||
},
|
|
||||||
"plex": {
|
|
||||||
"streams": "活动流",
|
|
||||||
"movies": "电影",
|
|
||||||
"tv": "电视节目",
|
|
||||||
"albums": "专辑"
|
|
||||||
},
|
|
||||||
"glances": {
|
|
||||||
"cpu": "处理器",
|
|
||||||
"wait": "请稍等",
|
|
||||||
"temp": "温度",
|
|
||||||
"uptime": "运行时间",
|
|
||||||
"days": "天",
|
|
||||||
"hours": "时",
|
|
||||||
"load": "Load",
|
|
||||||
"warn": "Warn",
|
|
||||||
"total": "Total",
|
|
||||||
"free": "Free",
|
|
||||||
"used": "Used",
|
|
||||||
"crit": "Crit",
|
|
||||||
"read": "Read",
|
|
||||||
"write": "Write",
|
|
||||||
"gpu": "GPU",
|
|
||||||
"mem": "Mem",
|
|
||||||
"swap": "Swap",
|
|
||||||
"_temp": "Temp"
|
|
||||||
},
|
|
||||||
"changedetectionio": {
|
|
||||||
"totalObserved": "观察到的总数",
|
|
||||||
"diffsDetected": "检测到差异"
|
|
||||||
},
|
|
||||||
"wmo": {
|
|
||||||
"0-day": "晴天",
|
|
||||||
"0-night": "晴朗",
|
|
||||||
"1-day": "主要是晴天",
|
|
||||||
"3-day": "阴天",
|
|
||||||
"3-night": "阴天",
|
|
||||||
"45-day": "有雾",
|
|
||||||
"48-day": "有雾",
|
|
||||||
"51-day": "小雨",
|
|
||||||
"73-night": "中雪",
|
|
||||||
"75-day": "大雪",
|
|
||||||
"1-night": "大部晴朗",
|
|
||||||
"2-day": "多云",
|
|
||||||
"2-night": "多云",
|
|
||||||
"45-night": "有雾",
|
|
||||||
"48-night": "有雾",
|
|
||||||
"51-night": "小雨",
|
|
||||||
"53-day": "小雨",
|
|
||||||
"53-night": "小雨",
|
|
||||||
"55-day": "毛毛雨",
|
|
||||||
"55-night": "毛毛雨",
|
|
||||||
"56-day": "小冻毛雨",
|
|
||||||
"56-night": "小冻毛雨",
|
|
||||||
"57-day": "冻毛雨",
|
|
||||||
"57-night": "冻毛雨",
|
|
||||||
"61-day": "小雨",
|
|
||||||
"61-night": "小雨",
|
|
||||||
"63-day": "雨",
|
|
||||||
"63-night": "雨",
|
|
||||||
"65-day": "大雨",
|
|
||||||
"65-night": "大雨",
|
|
||||||
"66-day": "冻雨",
|
|
||||||
"66-night": "冻雨",
|
|
||||||
"67-day": "冻雨",
|
|
||||||
"67-night": "冻雨",
|
|
||||||
"71-day": "小雪",
|
|
||||||
"71-night": "小雪",
|
|
||||||
"73-day": "中雪",
|
|
||||||
"75-night": "大雪",
|
|
||||||
"77-day": "雪粒",
|
|
||||||
"77-night": "雪粒",
|
|
||||||
"80-day": "微阵雨",
|
|
||||||
"80-night": "微阵雨",
|
|
||||||
"81-day": "阵雨",
|
|
||||||
"81-night": "阵雨",
|
|
||||||
"82-day": "强阵雨",
|
|
||||||
"82-night": "强阵雨",
|
|
||||||
"85-day": "阵雪",
|
|
||||||
"85-night": "阵雪",
|
|
||||||
"86-day": "阵雪",
|
|
||||||
"86-night": "阵雪",
|
|
||||||
"95-day": "雷雨",
|
|
||||||
"95-night": "雷雨",
|
|
||||||
"96-day": "雷雨伴随冰雹",
|
|
||||||
"96-night": "雷雨伴随冰雹",
|
|
||||||
"99-day": "雷雨伴随冰雹",
|
|
||||||
"99-night": "雷雨伴随冰雹"
|
|
||||||
},
|
|
||||||
"quicklaunch": {
|
|
||||||
"bookmark": "书签",
|
|
||||||
"service": "服务",
|
|
||||||
"search": "搜索",
|
|
||||||
"custom": "自定",
|
|
||||||
"visit": "访问",
|
|
||||||
"url": "网址"
|
|
||||||
},
|
|
||||||
"homebridge": {
|
|
||||||
"available_update": "System",
|
|
||||||
"updates": "更新",
|
|
||||||
"update_available": "有可用的更新",
|
|
||||||
"up_to_date": "Up to Date",
|
|
||||||
"child_bridges": "子网桥",
|
|
||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
|
||||||
"up": "Up",
|
|
||||||
"pending": "待定中",
|
|
||||||
"down": "Down"
|
|
||||||
},
|
|
||||||
"autobrr": {
|
|
||||||
"approvedPushes": "已核准",
|
|
||||||
"rejectedPushes": "拒绝",
|
|
||||||
"filters": "Filters",
|
|
||||||
"indexers": "索引器"
|
|
||||||
},
|
|
||||||
"watchtower": {
|
|
||||||
"containers_scanned": "已扫描",
|
|
||||||
"containers_updated": "已升级",
|
|
||||||
"containers_failed": "失败"
|
|
||||||
},
|
|
||||||
"tubearchivist": {
|
|
||||||
"downloads": "队列",
|
|
||||||
"videos": "影片",
|
|
||||||
"channels": "频道",
|
|
||||||
"playlists": "播放清单"
|
|
||||||
},
|
|
||||||
"truenas": {
|
|
||||||
"load": "系统负载",
|
|
||||||
"uptime": "运行时间",
|
|
||||||
"alerts": "警报",
|
|
||||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
|
||||||
},
|
|
||||||
"navidrome": {
|
|
||||||
"nothing_streaming": "暂无播放",
|
|
||||||
"please_wait": "请等待"
|
|
||||||
},
|
|
||||||
"pyload": {
|
|
||||||
"speed": "速度",
|
|
||||||
"active": "Active",
|
|
||||||
"queue": "队列",
|
|
||||||
"total": "Total"
|
|
||||||
},
|
|
||||||
"gluetun": {
|
|
||||||
"public_ip": "公网 IP",
|
|
||||||
"region": "区域",
|
|
||||||
"country": "国家"
|
|
||||||
},
|
|
||||||
"hdhomerun": {
|
|
||||||
"channels": "频道",
|
|
||||||
"hd": "HD"
|
|
||||||
},
|
|
||||||
"ping": {
|
|
||||||
"error": "错误",
|
|
||||||
"ping": "Ping",
|
|
||||||
"up": "Up",
|
|
||||||
"down": "Down"
|
|
||||||
},
|
|
||||||
"scrutiny": {
|
|
||||||
"passed": "通过",
|
|
||||||
"failed": "失败",
|
|
||||||
"unknown": "未知的"
|
|
||||||
},
|
|
||||||
"paperlessngx": {
|
|
||||||
"inbox": "收件箱",
|
|
||||||
"total": "Total"
|
|
||||||
},
|
|
||||||
"deluge": {
|
|
||||||
"download": "下载",
|
|
||||||
"upload": "上传",
|
|
||||||
"leech": "下载中",
|
|
||||||
"seed": "做种"
|
|
||||||
},
|
|
||||||
"flood": {
|
|
||||||
"leech": "下载中",
|
|
||||||
"download": "下载",
|
|
||||||
"upload": "上传",
|
|
||||||
"seed": "做种"
|
|
||||||
},
|
|
||||||
"tdarr": {
|
|
||||||
"saved": "已保存",
|
|
||||||
"queue": "队列",
|
|
||||||
"processed": "已处理",
|
|
||||||
"errored": "出错"
|
|
||||||
},
|
|
||||||
"miniflux": {
|
|
||||||
"read": "已读",
|
|
||||||
"unread": "未读"
|
|
||||||
},
|
|
||||||
"nextdns": {
|
|
||||||
"wait": "请稍候",
|
|
||||||
"no_devices": "没有接收到设备数据"
|
|
||||||
},
|
|
||||||
"common": {
|
|
||||||
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
|
|
||||||
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
|
|
||||||
},
|
|
||||||
"omada": {
|
|
||||||
"connectedAp": "连接中的AP",
|
|
||||||
"activeUser": "活跃设备",
|
|
||||||
"alerts": "警报",
|
|
||||||
"connectedGateway": "已连接网关",
|
|
||||||
"connectedSwitches": "已连接开关"
|
|
||||||
},
|
|
||||||
"downloadstation": {
|
|
||||||
"download": "下载",
|
|
||||||
"upload": "上传",
|
|
||||||
"leech": "下载中",
|
|
||||||
"seed": "做种"
|
|
||||||
},
|
|
||||||
"mikrotik": {
|
|
||||||
"cpuLoad": "处理器",
|
|
||||||
"memoryUsed": "内存",
|
|
||||||
"uptime": "运行时间",
|
|
||||||
"numberOfLeases": "租约"
|
|
||||||
},
|
|
||||||
"xteve": {
|
|
||||||
"streams_all": "所有播放活动",
|
|
||||||
"streams_active": "正在播放",
|
|
||||||
"streams_xepg": "XEPG 频道"
|
|
||||||
},
|
|
||||||
"opnsense": {
|
|
||||||
"cpu": "处理器",
|
|
||||||
"memory": "内存",
|
|
||||||
"wanUpload": "WAN上传",
|
|
||||||
"wanDownload": "WAN下载"
|
|
||||||
},
|
|
||||||
"moonraker": {
|
|
||||||
"printer_state": "打印机状态",
|
|
||||||
"print_status": "打印状态",
|
|
||||||
"print_progress": "打印进程",
|
|
||||||
"layers": "层"
|
|
||||||
},
|
|
||||||
"medusa": {
|
|
||||||
"wanted": "关注中",
|
|
||||||
"queued": "已加入队列",
|
|
||||||
"series": "Series"
|
|
||||||
},
|
|
||||||
"octoprint": {
|
|
||||||
"printer_state": "打印机状态",
|
|
||||||
"temp_tool": "喷头温度",
|
|
||||||
"temp_bed": "平台温度",
|
|
||||||
"job_completion": "完成度"
|
|
||||||
},
|
|
||||||
"cloudflared": {
|
|
||||||
"origin_ip": "源IP",
|
|
||||||
"status": "状态"
|
|
||||||
},
|
|
||||||
"proxmoxbackupserver": {
|
|
||||||
"datastore_usage": "数据存储",
|
|
||||||
"failed_tasks_24h": "24h失败任务",
|
|
||||||
"cpu_usage": "处理器",
|
|
||||||
"memory_usage": "内存"
|
|
||||||
},
|
|
||||||
"immich": {
|
|
||||||
"users": "使用者",
|
|
||||||
"photos": "照片",
|
|
||||||
"videos": "影片",
|
|
||||||
"storage": "储存空间"
|
|
||||||
},
|
|
||||||
"uptimekuma": {
|
|
||||||
"up": "在线网站",
|
|
||||||
"down": "离线网站",
|
|
||||||
"uptime": "运行时间",
|
|
||||||
"incident": "严重事件",
|
|
||||||
"m": "m"
|
|
||||||
},
|
|
||||||
"komga": {
|
|
||||||
"libraries": "书库",
|
|
||||||
"series": "系列",
|
|
||||||
"books": "书刊"
|
|
||||||
},
|
|
||||||
"mylar": {
|
|
||||||
"series": "系列",
|
|
||||||
"issues": "问题",
|
|
||||||
"wanted": "关注中"
|
|
||||||
},
|
|
||||||
"photoprism": {
|
|
||||||
"albums": "相册",
|
|
||||||
"photos": "照片",
|
|
||||||
"videos": "视频",
|
|
||||||
"people": "人物"
|
|
||||||
},
|
|
||||||
"diskstation": {
|
|
||||||
"uptime": "运行时间",
|
|
||||||
"volumeAvailable": "剩余存储",
|
|
||||||
"days": "天"
|
|
||||||
},
|
|
||||||
"fileflows": {
|
|
||||||
"queue": "队列",
|
|
||||||
"processing": "处理中",
|
|
||||||
"processed": "已处理",
|
|
||||||
"time": "时间"
|
|
||||||
},
|
|
||||||
"grafana": {
|
|
||||||
"totalalerts": "警报总数",
|
|
||||||
"dashboards": "控制面板",
|
|
||||||
"datasources": "数据来源",
|
|
||||||
"alertstriggered": "触发的警报"
|
|
||||||
},
|
|
||||||
"nextcloud": {
|
|
||||||
"cpuload": "处理器",
|
|
||||||
"memoryusage": "内存",
|
|
||||||
"freespace": "剩余空间",
|
|
||||||
"activeusers": "活跃用户",
|
|
||||||
"numfiles": "Files",
|
|
||||||
"numshares": "共享项目"
|
|
||||||
},
|
|
||||||
"kopia": {
|
|
||||||
"status": "状态",
|
|
||||||
"size": "大小",
|
|
||||||
"lastrun": "最后运行",
|
|
||||||
"nextrun": "下次运行",
|
|
||||||
"failed": "失败"
|
|
||||||
},
|
|
||||||
"unmanic": {
|
|
||||||
"active_workers": "在线工作节点",
|
|
||||||
"total_workers": "工作节点总数",
|
|
||||||
"records_total": "队列长度"
|
|
||||||
},
|
|
||||||
"healthchecks": {
|
|
||||||
"new": "新建立",
|
|
||||||
"up": "在线的",
|
|
||||||
"grace": "延缓中",
|
|
||||||
"down": "离线",
|
|
||||||
"paused": "暂停",
|
|
||||||
"status": "状态",
|
|
||||||
"last_ping": "上次检查",
|
|
||||||
"never": "尚未检查"
|
|
||||||
},
|
|
||||||
"pterodactyl": {
|
|
||||||
"servers": "服务器",
|
|
||||||
"nodes": "节点"
|
|
||||||
},
|
|
||||||
"prometheus": {
|
|
||||||
"targets_up": "目标上线",
|
|
||||||
"targets_down": "目标在线",
|
|
||||||
"targets_total": "总目标"
|
|
||||||
},
|
|
||||||
"minecraft": {
|
|
||||||
"players": "玩家",
|
|
||||||
"version": "版本",
|
|
||||||
"status": "状态",
|
|
||||||
"up": "在线的",
|
|
||||||
"down": "离线"
|
|
||||||
},
|
|
||||||
"ghostfolio": {
|
|
||||||
"gross_percent_today": "今天",
|
|
||||||
"gross_percent_1y": "一年",
|
|
||||||
"gross_percent_max": "所有时间"
|
|
||||||
},
|
|
||||||
"audiobookshelf": {
|
|
||||||
"podcasts": "播客",
|
|
||||||
"books": "图书",
|
|
||||||
"podcastsDuration": "持续时间",
|
|
||||||
"booksDuration": "持续时间"
|
|
||||||
},
|
|
||||||
"homeassistant": {
|
|
||||||
"people_home": "房间",
|
|
||||||
"lights_on": "照明开",
|
|
||||||
"switches_on": "开关开"
|
|
||||||
},
|
|
||||||
"freshrss": {
|
|
||||||
"subscriptions": "订阅",
|
|
||||||
"unread": "未读"
|
|
||||||
},
|
|
||||||
"channelsdvrserver": {
|
|
||||||
"shows": "节目",
|
|
||||||
"recordings": "录像",
|
|
||||||
"scheduled": "已计划的",
|
|
||||||
"passes": "通行证"
|
|
||||||
},
|
|
||||||
"whatsupdocker": {
|
|
||||||
"monitoring": "监测中",
|
|
||||||
"updates": "可更新"
|
|
||||||
},
|
|
||||||
"tailscale": {
|
|
||||||
"address": "地址",
|
|
||||||
"expires": "失效",
|
|
||||||
"never": "从不",
|
|
||||||
"last_seen": "最后上线",
|
|
||||||
"days": "{{number}}d",
|
|
||||||
"hours": "{{number}}h",
|
|
||||||
"minutes": "{{number}}m",
|
|
||||||
"seconds": "{{number}}s",
|
|
||||||
"ago": "{{value}} 以前",
|
|
||||||
"now": "现在",
|
|
||||||
"years": "{{number}}年",
|
|
||||||
"weeks": "{{number}}周"
|
|
||||||
},
|
|
||||||
"qnap": {
|
|
||||||
"cpuUsage": "处理器",
|
|
||||||
"memUsage": "内存",
|
|
||||||
"systemTempC": "系统温度",
|
|
||||||
"poolUsage": "存储池",
|
|
||||||
"volumeUsage": "Volume Usage",
|
|
||||||
"invalid": "Invalid"
|
|
||||||
},
|
|
||||||
"pfsense": {
|
|
||||||
"load": "平均负载",
|
|
||||||
"memory": "内存",
|
|
||||||
"wanStatus": "WAN 状态",
|
|
||||||
"up": "上传",
|
|
||||||
"down": "下载",
|
|
||||||
"temp": "温度",
|
|
||||||
"disk": "磁盘",
|
|
||||||
"wanIP": "WAN IP"
|
|
||||||
},
|
|
||||||
"caddy": {
|
|
||||||
"upstreams": "上游",
|
|
||||||
"requests": "当前请求",
|
|
||||||
"requests_failed": "失败请求"
|
|
||||||
},
|
|
||||||
"evcc": {
|
|
||||||
"pv_power": "正式环境",
|
|
||||||
"battery_soc": "Battery",
|
|
||||||
"grid_power": "Grid",
|
|
||||||
"home_power": "Consumption",
|
|
||||||
"charge_power": "Charger",
|
|
||||||
"watt_hour": "Wh"
|
|
||||||
},
|
|
||||||
"pialert": {
|
|
||||||
"total": "Total",
|
|
||||||
"connected": "Connected",
|
|
||||||
"new_devices": "New Devices",
|
|
||||||
"down_alerts": "Down Alerts"
|
|
||||||
},
|
|
||||||
"jdownloader": {
|
|
||||||
"downloadCount": "Queue Count",
|
|
||||||
"downloadSpeed": "Download Speed",
|
|
||||||
"downloadBytesRemaining": "Remaining",
|
|
||||||
"downloadTotalBytes": "Size"
|
|
||||||
},
|
|
||||||
"kavita": {
|
|
||||||
"seriesCount": "系列",
|
|
||||||
"totalFiles": "文件"
|
|
||||||
},
|
|
||||||
"gamedig": {
|
|
||||||
"name": "Name",
|
|
||||||
"map": "Map",
|
|
||||||
"currentPlayers": "Current players",
|
|
||||||
"players": "Players",
|
|
||||||
"maxPlayers": "Max players",
|
|
||||||
"bots": "Bots",
|
|
||||||
"ping": "Ping",
|
|
||||||
"status": "Status",
|
|
||||||
"online": "Online",
|
|
||||||
"offline": "Offline"
|
|
||||||
},
|
|
||||||
"azuredevops": {
|
|
||||||
"canceled": "Canceled",
|
|
||||||
"inProgress": "In Progress",
|
|
||||||
"result": "Result",
|
|
||||||
"status": "Status",
|
|
||||||
"buildId": "Build ID",
|
|
||||||
"succeeded": "Succeeded",
|
|
||||||
"notStarted": "Not Started",
|
|
||||||
"failed": "Failed",
|
|
||||||
"totalPrs": "Total PRs",
|
|
||||||
"myPrs": "My PRs",
|
|
||||||
"approved": "Approved"
|
|
||||||
},
|
|
||||||
"urbackup": {
|
|
||||||
"ok": "Ok",
|
|
||||||
"errored": "Errors",
|
|
||||||
"noRecent": "Out of Date",
|
|
||||||
"totalUsed": "Used Storage"
|
|
||||||
},
|
|
||||||
"openmediavault": {
|
|
||||||
"downloading": "Downloading",
|
|
||||||
"total": "Total",
|
|
||||||
"running": "Running",
|
|
||||||
"stopped": "Stopped",
|
|
||||||
"passed": "Passed",
|
|
||||||
"failed": "Failed"
|
|
||||||
},
|
|
||||||
"mealie": {
|
|
||||||
"recipes": "Recipes",
|
|
||||||
"users": "Users",
|
|
||||||
"categories": "Categories",
|
|
||||||
"tags": "Tags"
|
|
||||||
},
|
|
||||||
"atsumeru": {
|
|
||||||
"series": "Series",
|
|
||||||
"archives": "Archives",
|
|
||||||
"chapters": "Chapters",
|
|
||||||
"categories": "Categories"
|
|
||||||
},
|
|
||||||
"calibreweb": {
|
|
||||||
"books": "书籍",
|
|
||||||
"authors": "作者",
|
|
||||||
"categories": "分类",
|
|
||||||
"series": "丛书"
|
|
||||||
},
|
|
||||||
"uptimerobot": {
|
|
||||||
"status": "Status",
|
|
||||||
"uptime": "Uptime",
|
|
||||||
"lastDown": "Last Downtime",
|
|
||||||
"downDuration": "Downtime Duration",
|
|
||||||
"sitesUp": "Sites Up",
|
|
||||||
"sitesDown": "Sites Down",
|
|
||||||
"paused": "Paused",
|
|
||||||
"notyetchecked": "Not Yet Checked",
|
|
||||||
"up": "Up",
|
|
||||||
"seemsdown": "Seems Down",
|
|
||||||
"down": "Down",
|
|
||||||
"unknown": "Unknown"
|
|
||||||
},
|
|
||||||
"opendtu": {
|
|
||||||
"relativePower": "Power %",
|
|
||||||
"yieldDay": "Today",
|
|
||||||
"limit": "Limit",
|
|
||||||
"absolutePower": "Power"
|
|
||||||
},
|
|
||||||
"calendar": {
|
|
||||||
"physicalRelease": "Physical release",
|
|
||||||
"inCinemas": "In cinemas",
|
|
||||||
"digitalRelease": "Digital release"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -200,10 +200,10 @@
|
|||||||
"rutorrent": {
|
"rutorrent": {
|
||||||
"active": "活动中",
|
"active": "活动中",
|
||||||
"upload": "Upload",
|
"upload": "Upload",
|
||||||
"download": "Download"
|
"download": "下载"
|
||||||
},
|
},
|
||||||
"transmission": {
|
"transmission": {
|
||||||
"download": "Download",
|
"download": "下载",
|
||||||
"upload": "",
|
"upload": "",
|
||||||
"leech": "Leech",
|
"leech": "Leech",
|
||||||
"seed": "Seed"
|
"seed": "Seed"
|
||||||
@@ -223,8 +223,8 @@
|
|||||||
"invalid": "Invalid"
|
"invalid": "Invalid"
|
||||||
},
|
},
|
||||||
"deluge": {
|
"deluge": {
|
||||||
"download": "Download",
|
"download": "下载",
|
||||||
"upload": "Upload",
|
"upload": "上传",
|
||||||
"leech": "Leech",
|
"leech": "Leech",
|
||||||
"seed": "Seed"
|
"seed": "Seed"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ export default function Block({ value, label, field }) {
|
|||||||
return getHighlightClass(highlight.level, highlightConfig);
|
return getHighlightClass(highlight.level, highlightConfig);
|
||||||
}, [highlight, highlightConfig]);
|
}, [highlight, highlightConfig]);
|
||||||
|
|
||||||
|
const applyToValueOnly = highlight?.valueOnly === true;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={classNames(
|
className={classNames(
|
||||||
@@ -44,7 +46,11 @@ export default function Block({ value, label, field }) {
|
|||||||
data-highlight-source={highlight?.source}
|
data-highlight-source={highlight?.source}
|
||||||
>
|
>
|
||||||
<div className="font-thin text-sm">{value === undefined || value === null ? "-" : value}</div>
|
<div className="font-thin text-sm">{value === undefined || value === null ? "-" : value}</div>
|
||||||
<div className="font-bold text-xs uppercase">{t(label)}</div>
|
<div
|
||||||
|
className={classNames("font-bold text-xs uppercase", applyToValueOnly && "text-theme-700 dark:text-theme-200")}
|
||||||
|
>
|
||||||
|
{t(label)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ export default function Error({ error }) {
|
|||||||
|
|
||||||
if (typeof error === "string") {
|
if (typeof error === "string") {
|
||||||
error = { message: error }; // eslint-disable-line no-param-reassign
|
error = { message: error }; // eslint-disable-line no-param-reassign
|
||||||
|
} else if (typeof error === "number") {
|
||||||
|
error = { message: `Error ${error}` }; // eslint-disable-line no-param-reassign
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error?.data?.error) {
|
if (error?.data?.error) {
|
||||||
|
|||||||
@@ -41,6 +41,17 @@ const Version = dynamic(() => import("components/version"), {
|
|||||||
|
|
||||||
const rightAlignedWidgets = ["weatherapi", "openweathermap", "weather", "openmeteo", "search", "datetime"];
|
const rightAlignedWidgets = ["weatherapi", "openweathermap", "weather", "openmeteo", "search", "datetime"];
|
||||||
|
|
||||||
|
// Normalize language codes so older config values like zh-CN still point to Crowdin-provided ones
|
||||||
|
const LANGUAGE_ALIASES = {
|
||||||
|
"zh-cn": "zh-Hans",
|
||||||
|
};
|
||||||
|
|
||||||
|
const normalizeLanguage = (language) => {
|
||||||
|
if (!language) return "en";
|
||||||
|
const alias = LANGUAGE_ALIASES[language.toLowerCase()];
|
||||||
|
return alias || language;
|
||||||
|
};
|
||||||
|
|
||||||
export async function getStaticProps() {
|
export async function getStaticProps() {
|
||||||
let logger;
|
let logger;
|
||||||
try {
|
try {
|
||||||
@@ -50,6 +61,7 @@ export async function getStaticProps() {
|
|||||||
const services = await servicesResponse();
|
const services = await servicesResponse();
|
||||||
const bookmarks = await bookmarksResponse();
|
const bookmarks = await bookmarksResponse();
|
||||||
const widgets = await widgetsResponse();
|
const widgets = await widgetsResponse();
|
||||||
|
const language = normalizeLanguage(settings.language);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
props: {
|
props: {
|
||||||
@@ -60,7 +72,7 @@ export async function getStaticProps() {
|
|||||||
"/api/widgets": widgets,
|
"/api/widgets": widgets,
|
||||||
"/api/hash": false,
|
"/api/hash": false,
|
||||||
},
|
},
|
||||||
...(await serverSideTranslations(settings.language ?? "en")),
|
...(await serverSideTranslations(language)),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -218,8 +230,9 @@ function Home({ initialSettings }) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (settings.language) {
|
const language = normalizeLanguage(settings.language);
|
||||||
i18n.changeLanguage(settings.language);
|
if (language) {
|
||||||
|
i18n.changeLanguage(language);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings.theme && theme !== settings.theme) {
|
if (settings.theme && theme !== settings.theme) {
|
||||||
@@ -400,6 +413,7 @@ function Home({ initialSettings }) {
|
|||||||
"A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations."
|
"A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations."
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
{settings.disableIndexing && <meta name="robots" content="noindex, nofollow" />}
|
||||||
{settings.base && <base href={settings.base} />}
|
{settings.base && <base href={settings.base} />}
|
||||||
{settings.favicon ? (
|
{settings.favicon ? (
|
||||||
<>
|
<>
|
||||||
|
|||||||
19
src/pages/robots.txt.js
Normal file
19
src/pages/robots.txt.js
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { getSettings } from "utils/config/config";
|
||||||
|
|
||||||
|
export async function getServerSideProps({ res }) {
|
||||||
|
const settings = getSettings();
|
||||||
|
const content = ["User-agent: *", !!settings.disableIndexing ? "Disallow: /" : "Allow: /"].join("\n");
|
||||||
|
|
||||||
|
res.setHeader("Content-Type", "text/plain");
|
||||||
|
res.write(content);
|
||||||
|
res.end();
|
||||||
|
|
||||||
|
return {
|
||||||
|
props: {},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function RobotsTxt() {
|
||||||
|
// placeholder component
|
||||||
|
return null;
|
||||||
|
}
|
||||||
@@ -111,7 +111,7 @@ export async function servicesFromDocker() {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
let substitutedVal = substituteEnvironmentVars(containerLabels[label]);
|
let substitutedVal = substituteEnvironmentVars(containerLabels[label]);
|
||||||
if (value === "widget.version") {
|
if (value === "widget.version" || /^widgets\[\d+\]\.version$/.test(value)) {
|
||||||
substitutedVal = parseInt(substitutedVal, 10);
|
substitutedVal = parseInt(substitutedVal, 10);
|
||||||
}
|
}
|
||||||
shvl.set(constructedService, value, substitutedVal);
|
shvl.set(constructedService, value, substitutedVal);
|
||||||
@@ -279,6 +279,9 @@ export function cleanServiceGroups(groups) {
|
|||||||
slugs,
|
slugs,
|
||||||
symbols,
|
symbols,
|
||||||
|
|
||||||
|
// crowdsec
|
||||||
|
limit24h,
|
||||||
|
|
||||||
// customapi
|
// customapi
|
||||||
mappings,
|
mappings,
|
||||||
display,
|
display,
|
||||||
@@ -473,6 +476,10 @@ export function cleanServiceGroups(groups) {
|
|||||||
if (defaultinterval) widget.defaultinterval = defaultinterval;
|
if (defaultinterval) widget.defaultinterval = defaultinterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (limit24h !== undefined) {
|
||||||
|
widget.limit24h = !!limit24h;
|
||||||
|
}
|
||||||
|
|
||||||
if (type === "docker") {
|
if (type === "docker") {
|
||||||
if (server) widget.server = server;
|
if (server) widget.server = server;
|
||||||
if (container) widget.container = container;
|
if (container) widget.container = container;
|
||||||
@@ -556,6 +563,7 @@ export function cleanServiceGroups(groups) {
|
|||||||
"speedtest",
|
"speedtest",
|
||||||
"wgeasy",
|
"wgeasy",
|
||||||
"grafana",
|
"grafana",
|
||||||
|
"gluetun",
|
||||||
].includes(type)
|
].includes(type)
|
||||||
) {
|
) {
|
||||||
if (version) widget.version = parseInt(version, 10);
|
if (version) widget.version = parseInt(version, 10);
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ const ensureArray = (value) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const findHighlightLevel = (ruleSet, numericValue, stringValue) => {
|
const findHighlightLevel = (ruleSet, numericValue, stringValue) => {
|
||||||
const { numeric, string } = ruleSet;
|
const { numeric, string, valueOnly } = ruleSet;
|
||||||
|
|
||||||
if (numeric && numericValue !== undefined) {
|
if (numeric && numericValue !== undefined) {
|
||||||
const numericRules = ensureArray(numeric);
|
const numericRules = ensureArray(numeric);
|
||||||
@@ -208,7 +208,7 @@ const findHighlightLevel = (ruleSet, numericValue, stringValue) => {
|
|||||||
for (const candidate of numericCandidates) {
|
for (const candidate of numericCandidates) {
|
||||||
for (const rule of numericRules) {
|
for (const rule of numericRules) {
|
||||||
if (rule?.level && evaluateNumericRule(candidate, rule)) {
|
if (rule?.level && evaluateNumericRule(candidate, rule)) {
|
||||||
return { level: rule.level, source: "numeric", rule };
|
return { level: rule.level, source: "numeric", rule, valueOnly };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -218,7 +218,7 @@ const findHighlightLevel = (ruleSet, numericValue, stringValue) => {
|
|||||||
const stringRules = ensureArray(string);
|
const stringRules = ensureArray(string);
|
||||||
for (const rule of stringRules) {
|
for (const rule of stringRules) {
|
||||||
if (rule?.level && evaluateStringRule(stringValue, rule)) {
|
if (rule?.level && evaluateStringRule(stringValue, rule)) {
|
||||||
return { level: rule.level, source: "string", rule };
|
return { level: rule.level, source: "string", rule, valueOnly };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ export async function cachedRequest(url, duration = 5, ua = "homepage") {
|
|||||||
export async function httpProxy(url, params = {}) {
|
export async function httpProxy(url, params = {}) {
|
||||||
const constructedUrl = new URL(url);
|
const constructedUrl = new URL(url);
|
||||||
const disableIpv6 = process.env.HOMEPAGE_PROXY_DISABLE_IPV6 === "true";
|
const disableIpv6 = process.env.HOMEPAGE_PROXY_DISABLE_IPV6 === "true";
|
||||||
const agentOptions = disableIpv6 ? { family: 4, autoSelectFamily: false } : {};
|
const agentOptions = disableIpv6 ? { family: 4, autoSelectFamily: false } : { autoSelectFamilyAttemptTimeout: 500 };
|
||||||
|
|
||||||
let request = null;
|
let request = null;
|
||||||
if (constructedUrl.protocol === "https:") {
|
if (constructedUrl.protocol === "https:") {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
const { widget } = service;
|
const { widget } = service;
|
||||||
|
|
||||||
const { data: alerts, error: alertsError } = useWidgetAPI(widget, "alerts");
|
const { data: alerts, error: alertsError } = useWidgetAPI(widget, !!widget.limit24h ? "alerts24h" : "alerts");
|
||||||
const { data: bans, error: bansError } = useWidgetAPI(widget, "bans");
|
const { data: bans, error: bansError } = useWidgetAPI(widget, "bans");
|
||||||
|
|
||||||
if (alertsError || bansError) {
|
if (alertsError || bansError) {
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ const widget = {
|
|||||||
alerts: {
|
alerts: {
|
||||||
endpoint: "alerts",
|
endpoint: "alerts",
|
||||||
},
|
},
|
||||||
|
alerts24h: {
|
||||||
|
endpoint: "alerts?limit=0&since=24h",
|
||||||
|
},
|
||||||
bans: {
|
bans: {
|
||||||
endpoint: "alerts?decision_type=ban&origin=crowdsec&has_active_decision=1",
|
endpoint: "alerts?decision_type=ban&origin=crowdsec&has_active_decision=1",
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -166,7 +166,11 @@ export default function Component({ service }) {
|
|||||||
refreshInterval: Math.max(1000, refreshInterval),
|
refreshInterval: Math.max(1000, refreshInterval),
|
||||||
});
|
});
|
||||||
|
|
||||||
if (customError) {
|
// if mappings includes an error field and the data contains an error field then show data even if there is an error
|
||||||
|
const mappingsIncludesError = Array.isArray(mappings) && mappings.find((mapping) => mapping.field === "error");
|
||||||
|
const errorIsData = customData && typeof customData === "object" && "error" in customData;
|
||||||
|
|
||||||
|
if (customError && !(mappingsIncludesError && errorIsData)) {
|
||||||
return <Container service={service} error={customError} />;
|
return <Container service={service} error={customError} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,12 @@ export default function Component({ service }) {
|
|||||||
return <Container service={service} error={resultError} />;
|
return <Container service={service} error={resultError} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!widget.fields || widget.fields.length === 0) {
|
||||||
|
widget.fields = ["online", "offline", "offline_alt", "total"];
|
||||||
|
} else if (widget.fields.length > 4) {
|
||||||
|
widget.fields = widget.fields.slice(0, 4);
|
||||||
|
}
|
||||||
|
|
||||||
if (!resultData) {
|
if (!resultData) {
|
||||||
return (
|
return (
|
||||||
<Container service={service}>
|
<Container service={service}>
|
||||||
|
|||||||
95
src/widgets/frigate/proxy.js
Normal file
95
src/widgets/frigate/proxy.js
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
import getServiceWidget from "utils/config/service-helpers";
|
||||||
|
import createLogger from "utils/logger";
|
||||||
|
import { asJson, formatApiCall, sanitizeErrorURL } from "utils/proxy/api-helpers";
|
||||||
|
import { addCookieToJar } from "utils/proxy/cookie-jar";
|
||||||
|
import { httpProxy } from "utils/proxy/http";
|
||||||
|
import widgets from "widgets/widgets";
|
||||||
|
|
||||||
|
const proxyName = "frigateProxyHandler";
|
||||||
|
const logger = createLogger(proxyName);
|
||||||
|
|
||||||
|
export default async function frigateProxyHandler(req, res, map) {
|
||||||
|
const { group, service, endpoint, index } = req.query;
|
||||||
|
|
||||||
|
if (group && service) {
|
||||||
|
const widget = await getServiceWidget(group, service, index);
|
||||||
|
|
||||||
|
if (!widgets?.[widget.type]?.api) {
|
||||||
|
return res.status(403).json({ error: "Service does not support API calls" });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (widget) {
|
||||||
|
const url = formatApiCall(widgets[widget.type].api, { endpoint, ...widget });
|
||||||
|
|
||||||
|
const params = {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
let [status, , data] = await httpProxy(url, params);
|
||||||
|
|
||||||
|
if (status === 401 && widget.username && widget.password) {
|
||||||
|
const loginUrl = `${widget.url}/api/login`;
|
||||||
|
logger.debug("Attempting login to Frigate at %s", loginUrl);
|
||||||
|
const [loginStatus, , , loginResponseHeaders] = await httpProxy(loginUrl, {
|
||||||
|
method: "POST",
|
||||||
|
body: JSON.stringify({ user: widget.username, password: widget.password }),
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (loginStatus !== 200) {
|
||||||
|
logger.error("HTTP Error %d calling %s", loginStatus, sanitizeErrorURL(loginUrl));
|
||||||
|
return res.status(status).json({
|
||||||
|
error: {
|
||||||
|
message: `HTTP Error ${status} while trying to login to Frigate`,
|
||||||
|
url: sanitizeErrorURL(url),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
addCookieToJar(url, loginResponseHeaders);
|
||||||
|
// Retry original request with cookie set
|
||||||
|
[status, , data] = await httpProxy(url, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status >= 400) {
|
||||||
|
logger.error("HTTP Error %d calling %s", status, sanitizeErrorURL(url));
|
||||||
|
return res.status(status).json({
|
||||||
|
error: {
|
||||||
|
message: `HTTP Error ${status} from Frigate`,
|
||||||
|
url: sanitizeErrorURL(url),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
data = asJson(data);
|
||||||
|
|
||||||
|
if (endpoint == "stats") {
|
||||||
|
res.status(status).send({
|
||||||
|
num_cameras: data?.cameras !== undefined ? Object.keys(data?.cameras).length : 0,
|
||||||
|
uptime: data?.service?.uptime,
|
||||||
|
version: data?.service.version,
|
||||||
|
});
|
||||||
|
} else if (endpoint == "events") {
|
||||||
|
return res.status(status).send(
|
||||||
|
data.slice(0, 5).map((event) => ({
|
||||||
|
id: event.id,
|
||||||
|
camera: event.camera,
|
||||||
|
label: event.label,
|
||||||
|
start_time: new Date(event.start_time * 1000),
|
||||||
|
thumbnail: event.thumbnail,
|
||||||
|
score: event.data.score,
|
||||||
|
type: event.data.type,
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.debug("Invalid or missing proxy service type '%s' in group '%s'", service, group);
|
||||||
|
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||||
|
}
|
||||||
@@ -1,37 +1,12 @@
|
|||||||
import { asJson } from "utils/proxy/api-helpers";
|
import frigateProxyHandler from "./proxy";
|
||||||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
|
||||||
|
|
||||||
const widget = {
|
const widget = {
|
||||||
api: "{url}/api/{endpoint}",
|
api: "{url}/api/{endpoint}",
|
||||||
proxyHandler: genericProxyHandler,
|
proxyHandler: frigateProxyHandler,
|
||||||
|
|
||||||
mappings: {
|
mappings: {
|
||||||
stats: {
|
stats: { endpoint: "stats" },
|
||||||
endpoint: "stats",
|
events: { endpoint: "events" },
|
||||||
map: (data) => {
|
|
||||||
const jsonData = asJson(data);
|
|
||||||
return {
|
|
||||||
num_cameras: jsonData?.cameras !== undefined ? Object.keys(jsonData?.cameras).length : 0,
|
|
||||||
uptime: jsonData?.service?.uptime,
|
|
||||||
version: jsonData?.service.version,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
},
|
|
||||||
events: {
|
|
||||||
endpoint: "events",
|
|
||||||
map: (data) =>
|
|
||||||
asJson(data)
|
|
||||||
.slice(0, 5)
|
|
||||||
.map((event) => ({
|
|
||||||
id: event.id,
|
|
||||||
camera: event.camera,
|
|
||||||
label: event.label,
|
|
||||||
start_time: new Date(event.start_time * 1000),
|
|
||||||
thumbnail: event.thumbnail,
|
|
||||||
score: event.data.score,
|
|
||||||
type: event.data.type,
|
|
||||||
})),
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -38,11 +38,7 @@ export default function Component({ service }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const status = serverData.online ? (
|
const status = serverData.online ? t("gamedig.online") : t("gamedig.offline");
|
||||||
<span className="text-green-500">{t("gamedig.online")}</span>
|
|
||||||
) : (
|
|
||||||
<span className="text-red-500">{t("gamedig.offline")}</span>
|
|
||||||
);
|
|
||||||
const name = serverData.online ? serverData.name : "-";
|
const name = serverData.online ? serverData.name : "-";
|
||||||
const map = serverData.online ? serverData.map : "-";
|
const map = serverData.online ? serverData.map : "-";
|
||||||
const currentPlayers = serverData.online ? `${serverData.players} / ${serverData.maxplayers}` : "-";
|
const currentPlayers = serverData.online ? `${serverData.players} / ${serverData.maxplayers}` : "-";
|
||||||
|
|||||||
@@ -20,13 +20,15 @@ function getPerformancePercent(t, performanceRange) {
|
|||||||
export default function Component({ service }) {
|
export default function Component({ service }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { widget } = service;
|
const { widget } = service;
|
||||||
|
const includeNetWorth = widget.fields?.includes("net_worth");
|
||||||
|
|
||||||
const { data: performanceToday, error: ghostfolioErrorToday } = useWidgetAPI(widget, "today");
|
const { data: performanceToday, error: ghostfolioErrorToday } = useWidgetAPI(widget, "today");
|
||||||
const { data: performanceYear, error: ghostfolioErrorYear } = useWidgetAPI(widget, "year");
|
const { data: performanceYear, error: ghostfolioErrorYear } = useWidgetAPI(widget, "year");
|
||||||
const { data: performanceMax, error: ghostfolioErrorMax } = useWidgetAPI(widget, "max");
|
const { data: performanceMax, error: ghostfolioErrorMax } = useWidgetAPI(widget, "max");
|
||||||
|
const { data: userInfo, error: ghostfolioErrorUserInfo } = useWidgetAPI(widget, includeNetWorth ? "userInfo" : "");
|
||||||
|
|
||||||
if (ghostfolioErrorToday || ghostfolioErrorYear || ghostfolioErrorMax) {
|
if (ghostfolioErrorToday || ghostfolioErrorYear || ghostfolioErrorMax || ghostfolioErrorUserInfo) {
|
||||||
const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax;
|
const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax ?? ghostfolioErrorUserInfo;
|
||||||
return <Container service={service} error={finalError} />;
|
return <Container service={service} error={finalError} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,12 +36,13 @@ export default function Component({ service }) {
|
|||||||
return <Container service={service} error={performanceToday} />;
|
return <Container service={service} error={performanceToday} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!performanceToday || !performanceYear || !performanceMax) {
|
if (!performanceToday || !performanceYear || !performanceMax || (includeNetWorth && !userInfo)) {
|
||||||
return (
|
return (
|
||||||
<Container service={service}>
|
<Container service={service}>
|
||||||
<Block label="ghostfolio.gross_percent_today" />
|
<Block label="ghostfolio.gross_percent_today" />
|
||||||
<Block label="ghostfolio.gross_percent_1y" />
|
<Block label="ghostfolio.gross_percent_1y" />
|
||||||
<Block label="ghostfolio.gross_percent_max" />
|
<Block label="ghostfolio.gross_percent_max" />
|
||||||
|
{includeNetWorth && <Block label="ghostfolio.net_worth" />}
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -49,6 +52,12 @@ export default function Component({ service }) {
|
|||||||
<Block label="ghostfolio.gross_percent_today" value={getPerformancePercent(t, performanceToday)} />
|
<Block label="ghostfolio.gross_percent_today" value={getPerformancePercent(t, performanceToday)} />
|
||||||
<Block label="ghostfolio.gross_percent_1y" value={getPerformancePercent(t, performanceYear)} />
|
<Block label="ghostfolio.gross_percent_1y" value={getPerformancePercent(t, performanceYear)} />
|
||||||
<Block label="ghostfolio.gross_percent_max" value={getPerformancePercent(t, performanceMax)} />
|
<Block label="ghostfolio.gross_percent_max" value={getPerformancePercent(t, performanceMax)} />
|
||||||
|
{includeNetWorth && (
|
||||||
|
<Block
|
||||||
|
label="ghostfolio.net_worth"
|
||||||
|
value={`${performanceToday.performance.currentNetWorth.toFixed(2)} ${userInfo?.settings?.currency ?? ""}`}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,21 @@
|
|||||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||||
|
|
||||||
const widget = {
|
const widget = {
|
||||||
api: "{url}/api/v2/portfolio/performance?range={endpoint}",
|
api: "{url}/api/{endpoint}",
|
||||||
proxyHandler: credentialedProxyHandler,
|
proxyHandler: credentialedProxyHandler,
|
||||||
|
|
||||||
mappings: {
|
mappings: {
|
||||||
today: {
|
today: {
|
||||||
endpoint: "1d",
|
endpoint: "v2/portfolio/performance?range=1d",
|
||||||
},
|
},
|
||||||
year: {
|
year: {
|
||||||
endpoint: "1y",
|
endpoint: "v2/portfolio/performance?range=1y",
|
||||||
},
|
},
|
||||||
max: {
|
max: {
|
||||||
endpoint: "max",
|
endpoint: "v2/portfolio/performance?range=max",
|
||||||
|
},
|
||||||
|
userInfo: {
|
||||||
|
endpoint: "v1/user",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,10 +12,8 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip");
|
const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip");
|
||||||
const includePF = widget.fields.includes("port_forwarded");
|
const includePF = widget.fields.includes("port_forwarded");
|
||||||
const { data: portForwardedData, error: portForwardedError } = useWidgetAPI(
|
const pfEndpoint = widget.version > 1 ? "port_forwarded_v2" : "port_forwarded";
|
||||||
widget,
|
const { data: portForwardedData, error: portForwardedError } = useWidgetAPI(widget, includePF ? pfEndpoint : "");
|
||||||
includePF ? "port_forwarded" : "",
|
|
||||||
);
|
|
||||||
|
|
||||||
if (gluetunError || (includePF && portForwardedError)) {
|
if (gluetunError || (includePF && portForwardedError)) {
|
||||||
return <Container service={service} error={gluetunError || portForwardedError} />;
|
return <Container service={service} error={gluetunError || portForwardedError} />;
|
||||||
|
|||||||
@@ -13,6 +13,10 @@ const widget = {
|
|||||||
endpoint: "openvpn/portforwarded",
|
endpoint: "openvpn/portforwarded",
|
||||||
validate: ["port"],
|
validate: ["port"],
|
||||||
},
|
},
|
||||||
|
port_forwarded_v2: {
|
||||||
|
endpoint: "portforward",
|
||||||
|
validate: ["port"],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -22,11 +22,7 @@ export default function Component({ service }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const statusIndicator = serverData.online ? (
|
const statusIndicator = serverData.online ? t("minecraft.up") : t("minecraft.down");
|
||||||
<span className="text-green-500">{t("minecraft.up")}</span>
|
|
||||||
) : (
|
|
||||||
<span className="text-red-500">{t("minecraft.down")}</span>
|
|
||||||
);
|
|
||||||
const players = serverData.players ? `${serverData.players.online} / ${serverData.players.max}` : "-";
|
const players = serverData.players ? `${serverData.players.online} / ${serverData.players.max}` : "-";
|
||||||
const version = serverData.version || "-";
|
const version = serverData.version || "-";
|
||||||
|
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ export default function Component({ service }) {
|
|||||||
if (!data || (data && data.length === 0)) {
|
if (!data || (data && data.length === 0)) {
|
||||||
return (
|
return (
|
||||||
<Container service={service}>
|
<Container service={service}>
|
||||||
<Block label="myspeed.ping" />
|
|
||||||
<Block label="myspeed.download" />
|
<Block label="myspeed.download" />
|
||||||
<Block label="myspeed.upload" />
|
<Block label="myspeed.upload" />
|
||||||
|
<Block label="myspeed.ping" />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,16 +20,7 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Container service={service}>
|
<Container service={service}>
|
||||||
<Block
|
<Block label="widget.status" value={up ? t("openwrt.up") : t("openwrt.down")} />
|
||||||
label="widget.status"
|
|
||||||
value={
|
|
||||||
up ? (
|
|
||||||
<span className="text-green-500">{t("openwrt.up")}</span>
|
|
||||||
) : (
|
|
||||||
<span className="text-red-500">{t("openwrt.down")}</span>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
<Block label="openwrt.bytesTx" value={t("common.bytes", { value: bytesTx })} />
|
<Block label="openwrt.bytesTx" value={t("common.bytes", { value: bytesTx })} />
|
||||||
<Block label="openwrt.bytesRx" value={t("common.bytes", { value: bytesRx })} />
|
<Block label="openwrt.bytesRx" value={t("common.bytes", { value: bytesRx })} />
|
||||||
</Container>
|
</Container>
|
||||||
|
|||||||
@@ -56,16 +56,7 @@ export default function Component({ service }) {
|
|||||||
label="pfsense.temp"
|
label="pfsense.temp"
|
||||||
value={t("common.number", { value: systemData.data.temp_c, style: "unit", unit: "celsius" })}
|
value={t("common.number", { value: systemData.data.temp_c, style: "unit", unit: "celsius" })}
|
||||||
/>
|
/>
|
||||||
<Block
|
<Block label="pfsense.wanStatus" value={wan.status === "up" ? t("pfsense.up") : t("pfsense.down")} />
|
||||||
label="pfsense.wanStatus"
|
|
||||||
value={
|
|
||||||
wan.status === "up" ? (
|
|
||||||
<span className="text-green-500">{t("pfsense.up")}</span>
|
|
||||||
) : (
|
|
||||||
<span className="text-red-500">{t("pfsense.down")}</span>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
{showWanIP && <Block label="pfsense.wanIP" value={wan.ipaddr} />}
|
{showWanIP && <Block label="pfsense.wanIP" value={wan.ipaddr} />}
|
||||||
{showDiskUsage && <Block label="pfsense.disk" value={t("common.percent", { value: diskUsage.toFixed(2) })} />}
|
{showDiskUsage && <Block label="pfsense.disk" value={t("common.percent", { value: diskUsage.toFixed(2) })} />}
|
||||||
</Container>
|
</Container>
|
||||||
|
|||||||
Reference in New Issue
Block a user