-
+
+
+ } @if (invalidCredentials) {
+
+ } @if (invalid2faCode) {
+
}
-
- @if (invalidCredentials) {
-
{{ 'login.invalid_credentials' | translate }}
- } @if (invalid2faCode) {
-
{{ 'login.message_invalid_2fa_code' | translate }}
- }
-
diff --git a/ui/src/app/modules/login/login.component.scss b/ui/src/app/modules/login/login.component.scss
index 5dce47bf6..2c1ec541a 100644
--- a/ui/src/app/modules/login/login.component.scss
+++ b/ui/src/app/modules/login/login.component.scss
@@ -1,38 +1,60 @@
-.login-container {
- background-color: #f4f4f4;
- background-size: cover;
- position: absolute;
- top: 0;
- bottom: 0;
- right: 0;
- left: 0;
+::ng-deep body {
+ overflow: scroll !important;
}
-.login-card {
- max-width: 500px;
- background-color: rgba(255, 255, 255, 0.9);
-
- @media screen and (min-height: 800px) {
- margin-bottom: 12em;
+::ng-deep body.dark-mode {
+ .login-card {
+ background-color: #2b2b2b;
+ color: #ffffff;
}
}
-.login-logo {
- position: absolute;
- top: -35%;
- z-index: 2000;
- max-width: 450px;
+.login-container {
+ z-index: -1;
+ padding-top: 2em;
+ padding-bottom: 2em;
+ min-height: 100%;
+ background-size: 300% 300%;
+ -webkit-animation: gradient 20s ease infinite;
+ -moz-animation: gradient 20s ease infinite;
+ -o-animation: gradient 20s ease infinite;
+ animation: gradient 20s ease infinite;
+}
- @media screen and (max-width: 450px) {
- max-width: 320px;
- top: -25%;
+@keyframes gradient {
+ 0% {
+ background-position: 0 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0 50%;
}
+}
+
+.login-card {
+ max-width: 550px;
+ border-radius: 1rem;
+ padding-right: 25px;
+ padding-left: 25px;
+ background-color: rgba(255, 255, 255, 0.9);
- @media screen and (max-width: 320px) {
- max-width: 280px;
+ .form-control:focus {
+ background-color: inherit !important;
}
- @media screen and (max-height: 450px) {
- display: none;
+ @media screen and (max-width: 575px) {
+ margin-left: 1em;
+ margin-right: 1em;
}
}
+
+.homebridge-logo {
+ margin-bottom: 10px;
+}
+
+.btn-primary {
+ background-color: #4a266c !important;
+ border-color: #4a266c !important;
+}
diff --git a/ui/src/app/modules/login/login.component.ts b/ui/src/app/modules/login/login.component.ts
index a60d2b85c..ccda38270 100644
--- a/ui/src/app/modules/login/login.component.ts
+++ b/ui/src/app/modules/login/login.component.ts
@@ -1,5 +1,5 @@
-import { NgClass, NgStyle } from '@angular/common'
-import { Component, ElementRef, inject, OnInit, viewChild } from '@angular/core'
+import { NgClass, NgOptimizedImage, NgStyle } from '@angular/common'
+import { AfterViewChecked, ChangeDetectorRef, Component, ElementRef, inject, OnInit, viewChild } from '@angular/core'
import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'
import { Router } from '@angular/router'
import { TranslatePipe } from '@ngx-translate/core'
@@ -20,9 +20,10 @@ import { environment } from '@/environments/environment'
ReactiveFormsModule,
NgClass,
TranslatePipe,
+ NgOptimizedImage,
],
})
-export class LoginComponent implements OnInit {
+export class LoginComponent implements OnInit, AfterViewChecked {
private $auth = inject(AuthService)
private $router = inject(Router)
private $settings = inject(SettingsService)
@@ -42,9 +43,10 @@ export class LoginComponent implements OnInit {
public invalid2faCode = false
public twoFactorCodeRequired = false
public inProgress = false
+
private targetRoute: string
- constructor() {}
+ constructor(private cdr: ChangeDetectorRef) {}
ngOnInit() {
this.form = new FormGroup({
@@ -63,16 +65,20 @@ export class LoginComponent implements OnInit {
this.setBackground()
}
+ ngAfterViewChecked(): void {
+ this.cdr.detectChanges()
+ }
+
async setBackground() {
if (!this.$settings.settingsLoaded) {
await firstValueFrom(this.$settings.onSettingsLoaded)
}
if (this.$settings.env.customWallpaperHash) {
- const backgroundImageUrl = this.$settings.env.customWallpaperHash
- ? `${environment.api.base}/auth/wallpaper/${this.$settings.env.customWallpaperHash}`
- : '/assets/snapshot.jpg'
- this.backgroundStyle = `url('${backgroundImageUrl}') center/cover`
+ if (this.$settings.env.customWallpaperHash) {
+ const backgroundImageUrl = `${environment.api.base}/auth/wallpaper/${this.$settings.env.customWallpaperHash}`
+ this.backgroundStyle = `url('${backgroundImageUrl}') center/cover`
+ }
}
}
@@ -80,6 +86,7 @@ export class LoginComponent implements OnInit {
this.invalidCredentials = false
this.invalid2faCode = false
this.inProgress = true
+ document.getElementById('submit-button')?.blur()
// Grab the values from the native element as they may be "populated" via autofill.
const passwordInputValue = this.passwordInput()?.nativeElement.value
@@ -99,32 +106,30 @@ export class LoginComponent implements OnInit {
}
}
- await this.$auth.login(this.form.getRawValue())
- .then(() => {
- this.$router.navigateByUrl(this.targetRoute)
- window.sessionStorage.removeItem('target_route')
- })
- .catch((err) => {
- if (err.status === 412) {
- if (!this.form.controls.otp) {
- this.form.addControl('otp', new FormControl('', [
- Validators.required,
- Validators.minLength(6),
- Validators.maxLength(6),
- ]))
- } else {
- this.form.controls.otp.setErrors(['Invalid Code'])
- this.invalid2faCode = true
- }
- this.twoFactorCodeRequired = true
- setTimeout(() => {
- document.getElementById('form-ota').focus()
- }, 100)
+ try {
+ await this.$auth.login(this.form.getRawValue())
+ this.$router.navigateByUrl(this.targetRoute)
+ window.sessionStorage.removeItem('target_route')
+ } catch (error) {
+ if (error.status === 412) {
+ if (!this.form.controls.otp) {
+ this.form.addControl('otp', new FormControl('', [
+ Validators.required,
+ Validators.minLength(6),
+ Validators.maxLength(6),
+ ]))
} else {
- this.invalidCredentials = true
+ this.form.controls.otp.setErrors(['Invalid Code'])
+ this.invalid2faCode = true
}
- })
-
+ this.twoFactorCodeRequired = true
+ setTimeout(() => {
+ document.getElementById('form-ota').focus()
+ }, 100)
+ } else {
+ this.invalidCredentials = true
+ }
+ }
this.inProgress = false
}
}
diff --git a/ui/src/app/modules/login/login.module.ts b/ui/src/app/modules/login/login.module.ts
index c25b10c57..653764677 100644
--- a/ui/src/app/modules/login/login.module.ts
+++ b/ui/src/app/modules/login/login.module.ts
@@ -1,4 +1,4 @@
-import { CommonModule } from '@angular/common'
+import { CommonModule, NgOptimizedImage } from '@angular/common'
import { NgModule } from '@angular/core'
import { FormsModule, ReactiveFormsModule } from '@angular/forms'
import { TranslateModule } from '@ngx-translate/core'
@@ -13,6 +13,7 @@ import { LoginGuard } from '@/app/modules/login/login.guard'
ReactiveFormsModule,
TranslateModule,
LoginComponent,
+ NgOptimizedImage,
],
providers: [
LoginGuard,
diff --git a/ui/src/i18n/bg.json b/ui/src/i18n/bg.json
index 5c87e18a7..94e029d56 100644
--- a/ui/src/i18n/bg.json
+++ b/ui/src/i18n/bg.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Unlock",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "Вписване",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Грешно потребителско име или парола",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Two Factor Authentication Code",
- "login.message_invalid_2fa_code": "The code entered is incorrect or has expired.",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Homebridge log files may contain personal information, passwords or access tokens. Please review the log file and remove any sensitive information before sharing with others.",
"logs.log_file_truncated": "Log file truncated.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Актуализиран",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Use the search bar above to find your first plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Търсете добавки, които да инсталирате…",
diff --git a/ui/src/i18n/ca.json b/ui/src/i18n/ca.json
index 73823672f..965f4dee3 100644
--- a/ui/src/i18n/ca.json
+++ b/ui/src/i18n/ca.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Desbloquejar",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continuar",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "Iniciar Sesión",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Usuari o contrasenya incorrecte",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Codi 2FA",
- "login.message_invalid_2fa_code": "Usuario o contraseña incorrecto",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "L'arxiu de logs de Homebridge pot contenir informació personal, contrasenyes o tokens d'accés. Si us plau revisi l'arxiu de log i elimini qualsevol informació sensible abans de compartir-lo amb els altres.",
"logs.log_file_truncated": "Arxiu de logs truncat.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Actualitzat",
"plugins.manage.verified_message": "L'equip del projecte Homebridge ha revisat els plugins d'Homebridge que estan marcats com a verificats per assegurar-se que compleixen diversos requisits que fomenten les millors pràctiques i una experiència d'usuari sense problemes.",
"plugins.manage.verified_subtitle": "Aquest plugin està verificat.",
- "plugins.node_update.continue": "Continuar",
"plugins.placeholder_search_first": "Utiliza la barra de cerca de dalt per trobar el teu primer plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Cercar plugins per instal·lar…",
diff --git a/ui/src/i18n/cs.json b/ui/src/i18n/cs.json
index 42b1243e0..e1359cf58 100644
--- a/ui/src/i18n/cs.json
+++ b/ui/src/i18n/cs.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Odemknout",
"form.button_unpair": "Odpárovat",
"form.label.changes_kept": "Upozorňujeme, že stávající výběry/změny zůstávají zachovány při přepínání mezi položkami.",
+ "form.label_continue": "Pokračovat",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automaticky (Použijí se nastavení prohlížeče)",
- "login.button_login": "Přihlásit se",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Neplatné uživatelské jméno a heslo",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Neplatné heslo",
"login.label_2fa_code": "Dvoufaktorový kód",
- "login.message_invalid_2fa_code": "Zadaný kód je nesprávný nebo jeho platnost vypršela.",
"logs.download.error": "Nepodařilo se stáhnout soubor protokolu.",
"logs.download_warning": "Soubory protokolu Homebridge mohou obsahovat osobní údaje, hesla nebo přístupové tokeny. Před sdílením s ostatními si soubor protokolu prohlédněte a odstraňte z něj veškeré citlivé informace.",
"logs.log_file_truncated": "Soubor protokolu zkrácen.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Aktualizováno",
"plugins.manage.verified_message": "Homebridge pluginy označené jako ověřené prošly kontrolou týmem projektu Homebridge, aby bylo zajištěno, že splňují různé požadavky podporující osvědčené postupy a bezproblémový uživatelský zážitek.",
"plugins.manage.verified_subtitle": "Tento plugin je ověřený.",
- "plugins.node_update.continue": "Pokračovat",
"plugins.placeholder_search_first": "Použijte vyhledávací lištu výše, abyste našli svůj první plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Vyhledejte pluginy k instalaci…",
diff --git a/ui/src/i18n/de.json b/ui/src/i18n/de.json
index c15b4756d..89e601e8a 100644
--- a/ui/src/i18n/de.json
+++ b/ui/src/i18n/de.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Freischalten",
"form.button_unpair": "Entkoppeln",
"form.label.changes_kept": "Beachte, dass bestehende Auswahlen/Änderungen beim Umschalten zwischen Elementen erhalten bleiben.",
+ "form.label_continue": "Weiter",
"form.label_invalid": "Konfigurationsüberprüfung fehlgeschlagen - Änderungen können dennoch gespeichert werden.",
"form.label_invalid_strict": "Konfigurationsüberprüfung fehlgeschlagen - bitte überprüfen Sie alles vor dem Speichern.",
"form.label_valid": "Konfigurationsüberprüfung bestanden.",
"form.select.auto": "Automatisch (Browsereinstellungen verwenden)",
- "login.button_login": "Anmeldung",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Ungültiger Benutzername und / oder Passwort",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Falsches Passwort",
"login.label_2fa_code": "Zwei-Faktor-Authentifizierungs-Code",
- "login.message_invalid_2fa_code": "Der eingegebene Code ist falsch oder abgelaufen.",
"logs.download.error": "Download der Log-Datei fehlgeschlagen.",
"logs.download_warning": "Homebridge-Log-Dateien können persönliche Informationen, Passwörter or Zugrifftokens beinhalten. Bitte sieh dir die Log-Datei an und entferne alle sensitiven Informationen, bevor du sie mit anderen teilst.",
"logs.log_file_truncated": "Log-Datei abgeschnitten.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "aktualisiert",
"plugins.manage.verified_message": "Homebridge-Plugins, die als verifiziert gekennzeichnet sind, wurden vom Homebridge-Projektteam überprüft, um sicherzustellen, dass sie verschiedene Anforderungen erfüllen, die Best Practices und eine problemlose Benutzererfahrung fördern.",
"plugins.manage.verified_subtitle": "Dieses Plugin ist verifiziert.",
- "plugins.node_update.continue": "Weiter",
"plugins.placeholder_search_first": "Verwenden Sie die Suchleiste oben, um Ihr erstes Plugin zu finden",
"plugins.placeholder_search_none": "Keine Ergebnisse gefunden",
"plugins.placeholder_search_plugin": "Suche nach installierbaren Plugins …",
diff --git a/ui/src/i18n/en.json b/ui/src/i18n/en.json
index 8282b5970..1c1348211 100644
--- a/ui/src/i18n/en.json
+++ b/ui/src/i18n/en.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Unlock",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "Log in",
- "login.invalid_credentials": "Invalid Username or Password",
+ "login.invalid_code": "The code entered is incorrect or has expired",
+ "login.invalid_credentials": "Invalid username or password",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Two Factor Authentication Code",
- "login.message_invalid_2fa_code": "The code entered is incorrect or has expired.",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Homebridge log files may contain personal information, passwords or access tokens. Please review the log file and remove any sensitive information before sharing with others.",
"logs.log_file_truncated": "Log file truncated.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Updated",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Use the search bar above to find your first plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Search for plugins to install…",
diff --git a/ui/src/i18n/es.json b/ui/src/i18n/es.json
index c2557b14b..401864c81 100644
--- a/ui/src/i18n/es.json
+++ b/ui/src/i18n/es.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Desbloquear",
"form.button_unpair": "Desvincular",
"form.label.changes_kept": "Ten en cuenta que las selecciones/cambios existentes se conservan al cambiar entre elementos.",
+ "form.label_continue": "Continuar",
"form.label_invalid": "La validación de la configuración falló - aún puedes guardar tus cambios.",
"form.label_invalid_strict": "La validación de la configuración falló - por favor revisa el formulario antes de guardar.",
"form.label_valid": "La validación de la configuración fue exitosa.",
"form.select.auto": "Automático (Usar ajustes del navegador)",
- "login.button_login": "Iniciar sesión",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Usuario o contraseña incorrectos",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Contraseña Inválida",
"login.label_2fa_code": "Código de autenticación de dos factores",
- "login.message_invalid_2fa_code": "El código ingresado es incorrecto o ha expirado.",
"logs.download.error": "Error al descargar el archivo de registro.",
"logs.download_warning": "El archivo de registros de Homebridge puede contener información personal, contraseñas o tokens de acceso. Por favor, revisa el archivo de registro y elimina cualquier información sensible antes de compartirlo con otros.",
"logs.log_file_truncated": "Archivo de registros truncado.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Actualizado",
"plugins.manage.verified_message": "Los plugins de Homebridge marcados como \"verificados\" han sido revisados por el equipo del proyecto Homebridge para garantizar que cumplan con diversos requisitos que fomentan las buenas prácticas y una experiencia de usuario sin problemas.",
"plugins.manage.verified_subtitle": "Este plugin está verificado.",
- "plugins.node_update.continue": "Continuar",
"plugins.placeholder_search_first": "Usa la barra de búsqueda que encontrarás arriba para buscar tu primer plugin.",
"plugins.placeholder_search_none": "No se encontraron resultados",
"plugins.placeholder_search_plugin": "Buscar plugins disponibles para instalar…",
diff --git a/ui/src/i18n/fi.json b/ui/src/i18n/fi.json
index 5cbfa9931..3e907b02b 100644
--- a/ui/src/i18n/fi.json
+++ b/ui/src/i18n/fi.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Poista lukitus",
"form.button_unpair": "Pura pariliitos",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Jatka",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automattinen (Käytä selaimen asetuksia)",
- "login.button_login": "Kirjaudu",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Väärä käyttäjätunnus tai salasana",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Kaksivaiheisen tunnistautumisen koodi",
- "login.message_invalid_2fa_code": "Syötetty koodi on väärä tai vanhentunut.",
"logs.download.error": "Lokitiedoston lataus epäonnistui.",
"logs.download_warning": "Homebridge lokitiedosto voi sisältää henkilökohtaisia tietoja, salasanoja tai pääsykoodeja. Ole hyvä ja tarkasta lokitiedosto ja poista arkaluontoiset tiedot ennen jakamista.",
"logs.log_file_truncated": "Lokitiedosto katkaistu.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Päivitetty",
"plugins.manage.verified_message": "Laajennukset jotka on merkitty vahvistetuksi ovat läpäisseet Homebridge project teamin hyväksymisprosessin jossa varmistetaan että ne täyttävät erilaisia vaatimuksia jotka kannustavat parhaisiin käytäntöihin ja ongelmattomaan käyttökokemukseen.",
"plugins.manage.verified_subtitle": "This plugin on vahvistettu.",
- "plugins.node_update.continue": "Jatka",
"plugins.placeholder_search_first": "Käytä yläpuolista hakukenttää löytääksesi ensimmäisen laajennuksesi",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Etsi aennettavia laajennuksia",
diff --git a/ui/src/i18n/fr.json b/ui/src/i18n/fr.json
index 47ae7c8b9..f5757d041 100644
--- a/ui/src/i18n/fr.json
+++ b/ui/src/i18n/fr.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Déverrouiller",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "Connexion",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Nom d'utilisateur ou mot de passe incorrect",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Code d'authentification à deux facteurs",
- "login.message_invalid_2fa_code": "Le code entré est incorrect ou a expiré.",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Les fichiers de journalisation d'Homebridge peuvent contenir des informations personnelles, des mots de passe ou des jetons d'accès. Vérifiez vos fichiers de journalisation et supprimez toute information sensible si vous souhaitez les partager avec des tiers SVP.",
"logs.log_file_truncated": "Fichier de journalisation tronqué.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Mis à jour",
"plugins.manage.verified_message": "Les Plugins d'Homebridge indiqués comme vérifiés ont fait l'objet d'une vérification par l'équipe du projet Homebridge afin de s'assurer qu'ils remplissaient différentes exigences encourageant les bonnes pratiques et une expérience utilisateur optimale.",
"plugins.manage.verified_subtitle": "This plugin est vérifié.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Utilisez la barre de recherche ci-dessus pour trouver votre premier plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Rechercher des plugins à installer…",
diff --git a/ui/src/i18n/he.json b/ui/src/i18n/he.json
index 9a59edf97..ba37ba7a0 100644
--- a/ui/src/i18n/he.json
+++ b/ui/src/i18n/he.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Unlock",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "התחבר",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "שם משתמש וסיסמה לא תקינים",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "קוד גישה דו שלבית",
- "login.message_invalid_2fa_code": "הקוד שהוכנס לא נכון או פג תוקף.",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Homebridge log files may contain personal information, passwords or access tokens. Please review the log file and remove any sensitive information before sharing with others.",
"logs.log_file_truncated": "קובץ הלוג נמחק לגמרי",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "עודכן",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Use the search bar above to find your first plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "חפש תוספים להתקנה…",
diff --git a/ui/src/i18n/hu.json b/ui/src/i18n/hu.json
index 29c29a66b..760126b9a 100644
--- a/ui/src/i18n/hu.json
+++ b/ui/src/i18n/hu.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Unlock",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "Bejelentkezés",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Hibás felhasználónév vagy jelszó",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Two Factor Authentication Code",
- "login.message_invalid_2fa_code": "The code entered is incorrect or has expired.",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Homebridge log files may contain personal information, passwords or access tokens. Please review the log file and remove any sensitive information before sharing with others.",
"logs.log_file_truncated": "Log file truncated.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Frissítve",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Use the search bar above to find your first plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Pluginek keresése…",
diff --git a/ui/src/i18n/id.json b/ui/src/i18n/id.json
index e33e1c916..a3fa587c4 100644
--- a/ui/src/i18n/id.json
+++ b/ui/src/i18n/id.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Buka kunci",
"form.button_unpair": "Cabut pasangan",
"form.label.changes_kept": "Perhatikan bahwa pilihan/perubahan yang ada akan dipertahankan saat peralihan antara bagan-bagan.",
+ "form.label_continue": "Melanjutkan",
"form.label_invalid": "Validasi konfigurasi gagal - Anda masih dapat menyimpan perubahan Anda.",
"form.label_invalid_strict": "Validasi konfigurasi gagal - harap tinjau formulir sebelum menyimpan.",
"form.label_valid": "Validasi konfigurasi berhasil.",
"form.select.auto": "Otomatis (Gunakan Pengaturan Peramban)",
- "login.button_login": "Masuk",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Nama Pengguna dan Kata Sandi Salah",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Kata kunci tidak valid",
"login.label_2fa_code": "Kode Otentikasi Dua Faktor (2FA)",
- "login.message_invalid_2fa_code": "Kode yang dimasukkan salah atau telah kedaluwarsa.",
"logs.download.error": "Gagal mengunduh berkas log.",
"logs.download_warning": "Berkas catatan berkas log Homebridge mungkin mengandung informasi personal, password atau token akses. Harap review berkas catatan dan hapus informasi sensitif sebelum dibagikan.",
"logs.log_file_truncated": "Berkas catatan terpotong.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Diperbarui",
"plugins.manage.verified_message": "Plugin Homebridge yang ditandai sebagai diverifikasi telah ditinjau oleh tim proyek Homebridge untuk memastikan mereka memenuhi berbagai persyaratan yang mendorong praktik terbaik dan pengalaman pengguna yang bebas masalah.",
"plugins.manage.verified_subtitle": "Plugin ini terverifikasi.",
- "plugins.node_update.continue": "Melanjutkan",
"plugins.placeholder_search_first": "Gunakan bilah pencarian di atas untuk menemukan plugin pertama Anda",
"plugins.placeholder_search_none": "Tidak ada hasil yang ditemukan",
"plugins.placeholder_search_plugin": "Cari plugin untuk dipasang…",
diff --git a/ui/src/i18n/it.json b/ui/src/i18n/it.json
index be02e741c..94143ec4c 100644
--- a/ui/src/i18n/it.json
+++ b/ui/src/i18n/it.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Unlock",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "Accedi",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Utente o password non validi",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Codice di autenticazione a 2 fattori",
- "login.message_invalid_2fa_code": "Il codice inserito è sbagliato o scaduto.",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "I file dei log di Homebridge potrebbero contenere informazioni personali, password o chiavi di accesso. Per piacere verifica il file dei log e rimuovi qualunque informazione riservata prima di condividerlo con terzi.",
"logs.log_file_truncated": "File di log troncato.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Aggiornato",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Use the search bar above to find your first plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Cerca plugin da installare…",
diff --git a/ui/src/i18n/ja.json b/ui/src/i18n/ja.json
index ca2c89670..c9c5a2675 100644
--- a/ui/src/i18n/ja.json
+++ b/ui/src/i18n/ja.json
@@ -167,15 +167,16 @@
"form.button_unlock": "ロック解除",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "ログイン",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "ユーザー名・パスワードが間違っています",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "二段階認証コード",
- "login.message_invalid_2fa_code": "入力されたコードは間違っているか、期限切れです。",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Homebridgeのログファイルには、個人情報、パスワード、またはアクセストークンが含まれている可能性があります。第三者と共有する前にログファイルを確認し、機密情報を削除してください。",
"logs.log_file_truncated": "ログファイルを削除しました",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "更新済",
"plugins.manage.verified_message": "検証済みと表示されているHomebridgeプラグインは、Homebridgeプロジェクトチームによってレビューされ、ベストプラクティスとトラブルのないユーザーエクスペリエンスを促進する様々な要件を満たしていることが確認されています。",
"plugins.manage.verified_subtitle": "This plugin は検証済み。",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "上部の検索バーを使って最初のプラグインを見つける",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "インストールするプラグインを検索…",
diff --git a/ui/src/i18n/ko.json b/ui/src/i18n/ko.json
index da243b29d..d0fed2c8d 100644
--- a/ui/src/i18n/ko.json
+++ b/ui/src/i18n/ko.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Unlock",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "계속",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "자동 (브라우저 설정 사용)",
- "login.button_login": "로그인",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "유효하지 않은 사용자명 또는 비밀번호입니다",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "2차 인증 코드",
- "login.message_invalid_2fa_code": "입력된 코드는 만료되었거나 유효하지 않은 값입니다.",
"logs.download.error": "로그 파일 다운로드에 실패했습니다.",
"logs.download_warning": "Homebridge 로그파일에는 개인정보, 비밀번호, 액세스토큰이 포함될 수 있습니다. 다른 사람과 공유하기 전에 로그 파일을 검토하고 민감한 정보를 제거하십시오.",
"logs.log_file_truncated": "로그파일이 잘렸습니다.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "업데이트됨",
"plugins.manage.verified_message": "검증된 것으로 표시된 Homebridge 플러그인은 최상의 실행 방법과 문제 없는 사용자 경험을 보장하기 위해 Homebridge 프로젝트 팀이 다양한 요구 사항을 검토한 플러그인입니다.",
"plugins.manage.verified_subtitle": "This plugin 은(는) 검증되지 않았습니다.",
- "plugins.node_update.continue": "계속",
"plugins.placeholder_search_first": "위 검색창을 사용해 첫 플러그인을 찾아보세요.",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "설치할 플러그인 검색…",
diff --git a/ui/src/i18n/mk.json b/ui/src/i18n/mk.json
index 476e97856..a86e78ea6 100644
--- a/ui/src/i18n/mk.json
+++ b/ui/src/i18n/mk.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Unlock",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "Најави се",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Погрешно корисничко име или лозинка",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Two-Factor автентикациски код",
- "login.message_invalid_2fa_code": "Кодот кој го внесовте е погрешен или истечен.",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Логирачките фајлови од Homebridge може да содржат лични информации, лозинки, или токени. Разгледајте ги логирачките фајлови и отстранете било какви сензитивни информации пред да споделите со други лица.",
"logs.log_file_truncated": "Логирачкиот фајл е скратен.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Ажурирано",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Use the search bar above to find your first plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Барајте плагини достапни за инсталација…",
diff --git a/ui/src/i18n/nl.json b/ui/src/i18n/nl.json
index 5b9254623..917ea8be9 100644
--- a/ui/src/i18n/nl.json
+++ b/ui/src/i18n/nl.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Ontgrendelen",
"form.button_unpair": "Ontkoppelen",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Doorgaan",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatisch (Gebruik Browser Instellingen)",
- "login.button_login": "Inloggen",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Ongeldige gebruikersnaam of wachtwoord.",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Twee Factor Authenticatie Code",
- "login.message_invalid_2fa_code": "De ingevoerde code is ongeldig of verlopen.",
"logs.download.error": "Download log bestand mislukt.",
"logs.download_warning": "Homebridge log bestanden bevatten mogelijk persoonlijke gegevens, wachtwoorden of toegangs tokens. Bekijk de log bestanden en verwijdere gevoeglige data alvorens je dit bestand deelt met anderen.",
"logs.log_file_truncated": "Log bestand afgekapt.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Bijgewerkt",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Doorgaan",
"plugins.placeholder_search_first": "Gebruik de zoekbalk hierboven om je eerste plugin te zoeken.",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Zoeken naar plug-ins om te installeren…",
diff --git a/ui/src/i18n/no.json b/ui/src/i18n/no.json
index a0554d811..61f51d975 100644
--- a/ui/src/i18n/no.json
+++ b/ui/src/i18n/no.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Unlock",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "Logg inn",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Ugyldig brukernavn eller passord",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Two Factor Authentication Code",
- "login.message_invalid_2fa_code": "The code entered is incorrect or has expired.",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Homebridge log files may contain personal information, passwords or access tokens. Please review the log file and remove any sensitive information before sharing with others.",
"logs.log_file_truncated": "Log file truncated.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Oppdatert",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Use the search bar above to find your first plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Søk etter plugins å installere…",
diff --git a/ui/src/i18n/pl.json b/ui/src/i18n/pl.json
index c82c1c657..91bf12fd8 100644
--- a/ui/src/i18n/pl.json
+++ b/ui/src/i18n/pl.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Odblokuj",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Kontynuuj",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatycznie (użyj ustawień przeglądarki)",
- "login.button_login": "Zaloguj",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Nieprawidłowa nazwa lub hasło użytkownika",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Kod uwierzytelniania 2FA",
- "login.message_invalid_2fa_code": "Wpisany kod nie jest poprawny lub wygasł.",
"logs.download.error": "Nie udało się pobrać pliku logu.",
"logs.download_warning": "Log może zawierać informacje osobiste, hasła dostępu, tokeny. Sprawdź zawarte w nim informacje zanim udostępnisz go innym osobom.",
"logs.log_file_truncated": "Log wyczyszczony.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Zaktualizowane",
"plugins.manage.verified_message": "Wtyczki Homebridge oznaczone jako zweryfikowane zostały sprawdzone przez zespół Homebridge aby upewnić się, że spełniają różne wymagania, które zachęcają do najlepszych praktyk i bezproblemowego doświadczenia użytkownika.",
"plugins.manage.verified_subtitle": "This plugin jest zweryfikowana.",
- "plugins.node_update.continue": "Kontynuuj",
"plugins.placeholder_search_first": "Użyj paska wyszukiwania powyżej, aby znaleźć swoją pierwszą wtyczkę.",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Wyszukaj dostępne wtyczki…",
diff --git a/ui/src/i18n/pt-BR.json b/ui/src/i18n/pt-BR.json
index 2f7ec83c6..a23b05d7f 100644
--- a/ui/src/i18n/pt-BR.json
+++ b/ui/src/i18n/pt-BR.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Unlock",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "Entrar",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Utilizador e/ou Senha Inválida",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Código de Autenticação de Dois Fatores",
- "login.message_invalid_2fa_code": "O código introduzido está incorreto ou expirado.",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Os arquivos de LOG do homebridge podem conter informações sensíveis(como tokens e senhas) e devem ser revisados antes de serem compartilhados.",
"logs.log_file_truncated": "Os arquivos de log serão truncados.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Atualizado",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Use the search bar above to find your first plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Procurar plugins para instalação…",
diff --git a/ui/src/i18n/pt.json b/ui/src/i18n/pt.json
index 582c14a85..499699b3d 100644
--- a/ui/src/i18n/pt.json
+++ b/ui/src/i18n/pt.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Unlock",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "Entrar",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Utilizador e/ou Palavra-passe Inválida",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Código de Autenticação de Dois Fatores",
- "login.message_invalid_2fa_code": "O código introduzido está incorreto ou expirado.",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Os ficheiros de registo do Homebridge podem conter informações pessoais, palavra-passes ou tokens de acesso. Por favor verifique o ficheiro de registo e remova qualquer informação sensível antes de partilhar com outros.",
"logs.log_file_truncated": "Ficheiro de registo eliminado",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Atualizado",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Use the search bar above to find your first plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Procurar plugins para instalação…",
diff --git a/ui/src/i18n/ru.json b/ui/src/i18n/ru.json
index 8a64af4e8..c49948161 100644
--- a/ui/src/i18n/ru.json
+++ b/ui/src/i18n/ru.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Разблокировать",
"form.button_unpair": "Удалить привязку",
"form.label.changes_kept": "Обратите внимание, что текущие выборы/изменения сохраняются при переключении между элементами.",
+ "form.label_continue": "Продолжить",
"form.label_invalid": "Ошибка проверки конфигурации — вы все ещё можете сохранить изменения.",
"form.label_invalid_strict": "Ошибка проверки конфигурации — пожалуйста, проверьте форму перед сохранением.",
"form.label_valid": "Проверка конфигурации успешно пройдена.",
"form.select.auto": "Автоматически (использовать настройки браузера)",
- "login.button_login": "Войти",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Неверное имя пользователя или пароль",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Неверный пароль",
"login.label_2fa_code": "Код двухфакторной аутентификации",
- "login.message_invalid_2fa_code": "Введённый код неверен или срок его действия истёк.",
"logs.download.error": "Не удалось скачать файл журнала.",
"logs.download_warning": "Файлы журналов Homebridge могут содержать личную информацию, пароли или токены доступа. Пожалуйста, проверьте журнал и удалите конфиденциальную информацию перед публикацией.",
"logs.log_file_truncated": "Файл журнала был усечён.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Обновлено",
"plugins.manage.verified_message": "Плагины Homebridge, отмеченные как проверенные, прошли проверку командой проекта Homebridge, что подтверждает их соответствие требованиям надёжности и наилучшим практикам использования.",
"plugins.manage.verified_subtitle": "Этот плагин проверен.",
- "plugins.node_update.continue": "Продолжить",
"plugins.placeholder_search_first": "Используйте строку поиска выше, чтобы найти свой первый плагин",
"plugins.placeholder_search_none": "Ничего не найдено",
"plugins.placeholder_search_plugin": "Поиск плагинов для установки…",
diff --git a/ui/src/i18n/sl.json b/ui/src/i18n/sl.json
index 01724ccee..c3fef529a 100644
--- a/ui/src/i18n/sl.json
+++ b/ui/src/i18n/sl.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Unlock",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "Vpiši se",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Neveljavno uporabniško ime in geslo",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Dvofaktorska koda za preverjanje pristnosti",
- "login.message_invalid_2fa_code": "Vnesena koda je napačna ali je potekla.",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Dnevniške datoteke Homebridge lahko vsebujejo osebne podatke, gesla ali žetone za dostop. Preglejte datoteko dnevnika in odstranite vse občutljive podatke, preden jih delite z drugimi.",
"logs.log_file_truncated": "Dnevnik je skrajšan.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Posodobljeno",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Use the search bar above to find your first plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Poiščite vtičnike za namestitev …",
diff --git a/ui/src/i18n/sv.json b/ui/src/i18n/sv.json
index 72a89c47c..d7a60fa91 100644
--- a/ui/src/i18n/sv.json
+++ b/ui/src/i18n/sv.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Lås upp",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "Logga in",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Ogiltigt användarnamn och lösenord",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "Tvåfaktorautentiseringskod",
- "login.message_invalid_2fa_code": "Den angivna koden är felaktig eller har upphört att gälla.",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Homebridge loggfiler kan innehålla personlig information, lösenord eller åtkomsttoken. Granska loggfilen och ta bort all känslig information innan du delar med andra.",
"logs.log_file_truncated": "Loggfil rensad.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Uppdaterad",
"plugins.manage.verified_message": "Homebridge-plugins markerade som verifierade har granskats av Homebridge projektteam för att säkerställa att de uppfyller krav som uppmuntrar till god praxis och en problemfri användarupplevelse.",
"plugins.manage.verified_subtitle": "This plugin är verifierad.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Använd sökfältet ovan för att hitta din första plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Sök efter plugins att installera…",
diff --git a/ui/src/i18n/th.json b/ui/src/i18n/th.json
index 705366adc..3d6e175f0 100644
--- a/ui/src/i18n/th.json
+++ b/ui/src/i18n/th.json
@@ -167,15 +167,16 @@
"form.button_unlock": "ปลดล๊อค",
"form.button_unpair": "ยกเลิกการจับคู่",
"form.label.changes_kept": "โปรดทราบว่าการเลือก/การเปลี่ยนแปลงที่มีอยู่จะยังคงอยู่เมื่อมีการสลับระหว่างรายการ",
+ "form.label_continue": "ดำเนินการต่อ",
"form.label_invalid": "การตรวจสอบการกำหนดค่าล้มเหลว - คุณยังสามารถบันทึกการเปลี่ยนแปลงของคุณได้",
"form.label_invalid_strict": "การตรวจสอบการกำหนดค่าล้มเหลว - โปรดตรวจสอบแบบฟอร์มก่อนบันทึก",
"form.label_valid": "ผ่านการตรวจสอบการกำหนดค่าแล้ว",
"form.select.auto": "อัตโนมัติ (ใช้การตั้งค่าเบราว์เซอร์)",
- "login.button_login": "เข้าสู่ระบบ",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "ชื่อผู้ใช้และรหัสผ่านไม่ถูกต้อง",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "รหัสผ่านไม่ถูกต้อง",
"login.label_2fa_code": "รหัสรับรองความถูกต้องสองปัจจัย",
- "login.message_invalid_2fa_code": "รหัสที่ป้อนไม่ถูกต้องหรือหมดอายุแล้ว",
"logs.download.error": "ไม่สามารถดาวน์โหลดไฟล์ log ได้",
"logs.download_warning": "ไฟล์บันทึกของ Homebridge อาจมีข้อมูลส่วนบุคคลรหัสผ่านหรือโทเค็นการเข้าถึง โปรดตรวจสอบไฟล์บันทึกและลบข้อมูลที่ละเอียดอ่อนออกก่อนแบ่งปันกับผู้อื่น",
"logs.log_file_truncated": "ไฟล์บันทึกถูกตัดให้สั้นลง",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "อัปเดทแล้ว",
"plugins.manage.verified_message": "ปลั๊กอิน Homebridge ที่ทำเครื่องหมายว่าตรวจสอบแล้วได้รับการตรวจสอบโดยทีมงานโครงการ Homebridge เพื่อให้แน่ใจว่าเป็นไปตามข้อกำหนดต่างๆ ที่ส่งเสริมแนวทางปฏิบัติที่ดีที่สุดและประสบการณ์ผู้ใช้ที่ปราศจากปัญหา",
"plugins.manage.verified_subtitle": "ปลั๊กอินนี้ได้รับการรับรอง",
- "plugins.node_update.continue": "ดำเนินการต่อ",
"plugins.placeholder_search_first": "ใช้แถบค้นหาด้านบนเพื่อค้นหาปลั๊กอินแรกของคุณ",
"plugins.placeholder_search_none": "ไม่พบผลลัพธ์",
"plugins.placeholder_search_plugin": "ค้นหาปลั๊กอินที่จะติดตั้ง…",
diff --git a/ui/src/i18n/tr.json b/ui/src/i18n/tr.json
index 335fc5586..1627975bd 100644
--- a/ui/src/i18n/tr.json
+++ b/ui/src/i18n/tr.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Unlock",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "Oturum Aç",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Geçersiz Kullanıcı Adı ve Parola",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "İki Aşamalı Doğrulama Kodu",
- "login.message_invalid_2fa_code": "Girilen kod geçrsiz veya süresi doldu.",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Homebridge günlük dosyaları kişisel bilgiler, parolalar ve erişim belirteçleri içeriyor olabilir. Lütfen başka kişilerle paylaşmadan önce günlük dosyasını inceleyin ve tüm hassas bilgileri kaldırın.",
"logs.log_file_truncated": "Günlük dosyası budandı.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Güncellendi",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Use the search bar above to find your first plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "Yüklemek için eklentiler arayın…",
diff --git a/ui/src/i18n/uk.json b/ui/src/i18n/uk.json
index 2624b693c..9d05a8fd8 100644
--- a/ui/src/i18n/uk.json
+++ b/ui/src/i18n/uk.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Розблокувати",
"form.button_unpair": "Розірвати пару",
"form.label.changes_kept": "Зауважте, що наявні вибрані/зміни зберігаються під час перемикання між елементами.",
+ "form.label_continue": "Продовжити",
"form.label_invalid": "Помилка перевірки конфігурації – Ви все ще можете зберегти зміни.",
"form.label_invalid_strict": "Помилка перевірки конфігурації – будь ласка, перегляньте форму перед збереженням.",
"form.label_valid": "Перевірку конфігурації пройдено.",
"form.select.auto": "Автоматично (використовувати налаштування браузера)",
- "login.button_login": "Увійти",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "Неправильне ім'я користувача або пароль.",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Невірний пароль",
"login.label_2fa_code": "Код 2FA",
- "login.message_invalid_2fa_code": "Введений код неправильний або термін його дії минув.",
"logs.download.error": "Не вдалося завантажити файл журналу.",
"logs.download_warning": "Файли журналу Homebridge можуть містити особисту інформацію, паролі або маркери доступу. Будь ласка, перегляньте файл журналу та видаліть будь-яку конфіденційну інформацію, перш ніж поділитися з іншими.",
"logs.log_file_truncated": "Файл журналу скорочено.",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "Оновлено",
"plugins.manage.verified_message": "Плагіни Homebridge, позначені як перевірені, були верифіковані командою проекту Homebridge, щоб переконатися, що вони відповідають різним вимогам, які заохочують передові практики та безпроблемну роботу користувача.",
"plugins.manage.verified_subtitle": "Цей плагін перевірено.",
- "plugins.node_update.continue": "Продовжити",
"plugins.placeholder_search_first": "Використойте рядок пошуку вище, щоб знайти свій перший плагін",
"plugins.placeholder_search_none": "Результати не знайдені",
"plugins.placeholder_search_plugin": "Пошук плагінів для встановлення…",
diff --git a/ui/src/i18n/zh-CN.json b/ui/src/i18n/zh-CN.json
index 41641508b..5db926c83 100644
--- a/ui/src/i18n/zh-CN.json
+++ b/ui/src/i18n/zh-CN.json
@@ -167,15 +167,16 @@
"form.button_unlock": "Unlock",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "登录",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "无效的用户名或密码",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "两步验证代码",
- "login.message_invalid_2fa_code": "您输入的代码不正确或已过期。",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Homebridge 日志文件包含了个人信息,密码或者访问令牌。 在分享给他人之前请查看日志问卷并移除任何敏感信息。",
"logs.log_file_truncated": "日志文件已截断。",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "已更新",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Use the search bar above to find your first plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "搜索插件…",
diff --git a/ui/src/i18n/zh-TW.json b/ui/src/i18n/zh-TW.json
index 969933bbb..535f788e4 100644
--- a/ui/src/i18n/zh-TW.json
+++ b/ui/src/i18n/zh-TW.json
@@ -167,15 +167,16 @@
"form.button_unlock": "解鎖",
"form.button_unpair": "Unpair",
"form.label.changes_kept": "Note that existing selections/changes are preserved when switching between items.",
+ "form.label_continue": "Continue",
"form.label_invalid": "Config validation failed - you can still save your changes.",
"form.label_invalid_strict": "Config validation failed - please review the form before saving.",
"form.label_valid": "Config validation passed.",
"form.select.auto": "Automatic (Use Browser Settings)",
- "login.button_login": "登錄",
+ "login.invalid_code": "The code entered is incorrect or has expired",
"login.invalid_credentials": "無效的使用者名稱和密碼",
+ "login.invalid_credentials_2": "To reset your credentials or 2fa code, delete the
auth.json
file in your Homebridge storage directory, restart Homebridge, then login with
admin
/
admin
.",
"login.invalid_password": "Invalid Password",
"login.label_2fa_code": "雙重驗證碼",
- "login.message_invalid_2fa_code": "所輸入的驗證碼錯誤或已過期。",
"logs.download.error": "Failed to download log file.",
"logs.download_warning": "Homebridge 日誌檔案可能包含部分個人資料、密碼或存取密鑰。請於與他人分享前再次確認並移除任何敏感資訊。",
"logs.log_file_truncated": "日誌檔案已截去。",
@@ -288,7 +289,6 @@
"plugins.manage.updated": "更新完成",
"plugins.manage.verified_message": "Homebridge plugins that are marked as verified have been reviewed by the Homebridge project team to ensure they meet various requirements that encourage best practices and a trouble-free user experience.",
"plugins.manage.verified_subtitle": "This plugin is verified.",
- "plugins.node_update.continue": "Continue",
"plugins.placeholder_search_first": "Use the search bar above to find your first plugin",
"plugins.placeholder_search_none": "No results were found",
"plugins.placeholder_search_plugin": "搜尋 Plugin 並且安裝…",
diff --git a/ui/src/scss/themes/themes-dark.scss b/ui/src/scss/themes/themes-dark.scss
index 04b23fd33..c65ad1bc8 100644
--- a/ui/src/scss/themes/themes-dark.scss
+++ b/ui/src/scss/themes/themes-dark.scss
@@ -432,6 +432,10 @@
}
}
}
+
+ .gradient {
+ background: linear-gradient(130deg, $darkModePrimary, #4a266c, #2b2b2b);
+ }
}
}
diff --git a/ui/src/scss/themes/themes-light.scss b/ui/src/scss/themes/themes-light.scss
index 036a518ef..948e5e254 100644
--- a/ui/src/scss/themes/themes-light.scss
+++ b/ui/src/scss/themes/themes-light.scss
@@ -215,6 +215,10 @@
padding-top: 0;
padding-bottom: 0;
}
+
+ .gradient {
+ background: linear-gradient(130deg, $primary, #4a266c, $primary-dark);
+ }
}
}
From 89e0f417791e8e11f36f7bc0bd5d27ab43c6c016 Mon Sep 17 00:00:00 2001
From: Ben <43026681+bwp91@users.noreply.github.com>
Date: Mon, 2 Jun 2025 20:12:57 +0100
Subject: [PATCH 08/40] bump `plugin-ui-utils` for new theme method
f
---
CHANGELOG.md | 3 +-
package-lock.json | 589 ++++++++++--------
package.json | 6 +-
ui/package-lock.json | 373 +++++++----
ui/package.json | 38 +-
.../airpurifier.manage.component.ts | 7 +-
.../types/door/door.manage.component.ts | 7 +-
.../types/fan/fan.manage.component.ts | 7 +-
.../types/fanv2/fanv2.manage.component.ts | 7 +-
.../heatercooler.manage.component.ts | 2 +-
...humidifierdehumidifier.manage.component.ts | 2 +-
.../lightbulb/lightbulb.manage.component.ts | 13 +-
.../types/speaker/speaker.manage.component.ts | 7 +-
.../thermostat/thermostat.manage.component.ts | 9 +-
.../types/valve/valve.manage.component.ts | 7 +-
.../types/window/window.manage.component.ts | 7 +-
.../windowcovering.manage.component.ts | 7 +-
.../custom-plugins.component.ts | 4 +
18 files changed, 637 insertions(+), 458 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 703d6135c..045b9fbe6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -27,12 +27,13 @@ All notable changes to `homebridge-config-ui-x` will be documented in this file.
### Other Changes
- upgrade to angular `v20`
+- bump `plugin-ui-utils` for new theme method
### Homebridge Dependencies
- `@homebridge/hap-client` @ `v2.2.0`
- `@homebridge/node-pty-prebuilt-multiarch` @ `v0.11.14`
-- `@homebridge/plugin-ui-utils` @ `v2.0.2`
+- `@homebridge/plugin-ui-utils` @ `v2.1.0`
## v4.75.0 (2025-05-25)
diff --git a/package-lock.json b/package-lock.json
index d7d8bdf5d..91427e772 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -64,7 +64,7 @@
"homebridge-config-ui-x": "dist/bin/standalone.js"
},
"devDependencies": {
- "@antfu/eslint-config": "^4.13.2",
+ "@antfu/eslint-config": "^4.13.3",
"@nestjs/testing": "^10.4.18",
"@prettier/plugin-xml": "^3.4.1",
"@types/fs-extra": "^11.0.4",
@@ -76,7 +76,7 @@
"@types/tail": "^2.2.3",
"@types/tcp-port-used": "^1.0.4",
"@types/unzipper": "^0.10.11",
- "@vitest/coverage-v8": "^3.1.4",
+ "@vitest/coverage-v8": "^3.2.1",
"concurrently": "^9.1.2",
"eslint-plugin-format": "^1.0.1",
"form-data": "^4.0.2",
@@ -87,7 +87,7 @@
"tsconfig-paths": "^4.2.0",
"typescript": "^5.8.3",
"unplugin-swc": "^1.5.4",
- "vitest": "^3.1.4"
+ "vitest": "^3.2.1"
},
"engines": {
"homebridge": "^1.8.0 || ^2.0.0-beta.0",
@@ -109,42 +109,42 @@
}
},
"node_modules/@antfu/eslint-config": {
- "version": "4.13.2",
- "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-4.13.2.tgz",
- "integrity": "sha512-F+IVIQUCfw6eW4H06c9a9USJ3UOnoBx4I0qsTL3kO6GcyJB6mwk+nawFf95DfHKT3fJKv58YPPz0XCmsY/w0XA==",
+ "version": "4.13.3",
+ "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-4.13.3.tgz",
+ "integrity": "sha512-jo3tjyZoRSPTuSwcaHRbPHaHYvrFosPj0ySLL2jFBCjK9wvo9w1fasKqLRMnc/qCKCMDGCH0egheJV801lJgiA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@antfu/install-pkg": "^1.1.0",
- "@clack/prompts": "^0.10.1",
+ "@clack/prompts": "^0.11.0",
"@eslint-community/eslint-plugin-eslint-comments": "^4.5.0",
"@eslint/markdown": "^6.4.0",
- "@stylistic/eslint-plugin": "^4.2.0",
- "@typescript-eslint/eslint-plugin": "^8.32.1",
- "@typescript-eslint/parser": "^8.32.1",
- "@vitest/eslint-plugin": "^1.2.0",
- "ansis": "^4.0.0",
+ "@stylistic/eslint-plugin": "^5.0.0-beta.1",
+ "@typescript-eslint/eslint-plugin": "^8.33.1",
+ "@typescript-eslint/parser": "^8.33.1",
+ "@vitest/eslint-plugin": "^1.2.1",
+ "ansis": "^4.1.0",
"cac": "^6.7.14",
"eslint-config-flat-gitignore": "^2.1.0",
"eslint-flat-config-utils": "^2.1.0",
"eslint-merge-processors": "^2.0.0",
"eslint-plugin-antfu": "^3.1.1",
- "eslint-plugin-command": "^3.2.0",
- "eslint-plugin-import-x": "^4.12.2",
- "eslint-plugin-jsdoc": "^50.6.17",
+ "eslint-plugin-command": "^3.2.1",
+ "eslint-plugin-import-x": "^4.15.0",
+ "eslint-plugin-jsdoc": "^50.7.1",
"eslint-plugin-jsonc": "^2.20.1",
- "eslint-plugin-n": "^17.18.0",
+ "eslint-plugin-n": "^17.19.0",
"eslint-plugin-no-only-tests": "^3.3.0",
- "eslint-plugin-perfectionist": "^4.13.0",
+ "eslint-plugin-perfectionist": "^4.14.0",
"eslint-plugin-pnpm": "^0.3.1",
- "eslint-plugin-regexp": "^2.7.0",
+ "eslint-plugin-regexp": "^2.8.0",
"eslint-plugin-toml": "^0.12.0",
"eslint-plugin-unicorn": "^59.0.1",
"eslint-plugin-unused-imports": "^4.1.4",
"eslint-plugin-vue": "^10.1.0",
"eslint-plugin-yml": "^1.18.0",
"eslint-processor-vue-blocks": "^2.0.0",
- "globals": "^16.1.0",
+ "globals": "^16.2.0",
"jsonc-eslint-parser": "^2.4.0",
"local-pkg": "^1.1.1",
"parse-gitignore": "^2.0.0",
@@ -255,9 +255,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.27.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.4.tgz",
- "integrity": "sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==",
+ "version": "7.27.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz",
+ "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -295,9 +295,9 @@
}
},
"node_modules/@clack/core": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.4.2.tgz",
- "integrity": "sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg==",
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.5.0.tgz",
+ "integrity": "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -306,13 +306,13 @@
}
},
"node_modules/@clack/prompts": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.10.1.tgz",
- "integrity": "sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw==",
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.11.0.tgz",
+ "integrity": "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@clack/core": "0.4.2",
+ "@clack/core": "0.5.0",
"picocolors": "^1.0.0",
"sisteransi": "^1.0.5"
}
@@ -2285,9 +2285,9 @@
"license": "MIT"
},
"node_modules/@stylistic/eslint-plugin": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.4.0.tgz",
- "integrity": "sha512-bIh/d9X+OQLCAMdhHtps+frvyjvAM4B1YlSJzcEEhl7wXLIqPar3ngn9DrHhkBOrTA/z9J0bUMtctAspe0dxdQ==",
+ "version": "5.0.0-beta.1",
+ "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.0.0-beta.1.tgz",
+ "integrity": "sha512-26syM7oRlnfUVoQ58GoPVXAXS3rSknWtD9dAx3XHIYxSQsqmd1Uuw7ILG0E6YSO+VYTlhuOcmikP/dg8Cu9d0Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2617,6 +2617,16 @@
"@types/node": "*"
}
},
+ "node_modules/@types/chai": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz",
+ "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/deep-eql": "*"
+ }
+ },
"node_modules/@types/connect": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
@@ -2646,6 +2656,13 @@
"@types/ms": "*"
}
},
+ "node_modules/@types/deep-eql": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/eslint": {
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
@@ -2910,17 +2927,17 @@
"license": "MIT"
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.33.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.0.tgz",
- "integrity": "sha512-CACyQuqSHt7ma3Ns601xykeBK/rDeZa3w6IS6UtMQbixO5DWy+8TilKkviGDH6jtWCo8FGRKEK5cLLkPvEammQ==",
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz",
+ "integrity": "sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.33.0",
- "@typescript-eslint/type-utils": "8.33.0",
- "@typescript-eslint/utils": "8.33.0",
- "@typescript-eslint/visitor-keys": "8.33.0",
+ "@typescript-eslint/scope-manager": "8.33.1",
+ "@typescript-eslint/type-utils": "8.33.1",
+ "@typescript-eslint/utils": "8.33.1",
+ "@typescript-eslint/visitor-keys": "8.33.1",
"graphemer": "^1.4.0",
"ignore": "^7.0.0",
"natural-compare": "^1.4.0",
@@ -2934,7 +2951,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.33.0",
+ "@typescript-eslint/parser": "^8.33.1",
"eslint": "^8.57.0 || ^9.0.0",
"typescript": ">=4.8.4 <5.9.0"
}
@@ -2950,16 +2967,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.33.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.33.0.tgz",
- "integrity": "sha512-JaehZvf6m0yqYp34+RVnihBAChkqeH+tqqhS0GuX1qgPpwLvmTPheKEs6OeCK6hVJgXZHJ2vbjnC9j119auStQ==",
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.33.1.tgz",
+ "integrity": "sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.33.0",
- "@typescript-eslint/types": "8.33.0",
- "@typescript-eslint/typescript-estree": "8.33.0",
- "@typescript-eslint/visitor-keys": "8.33.0",
+ "@typescript-eslint/scope-manager": "8.33.1",
+ "@typescript-eslint/types": "8.33.1",
+ "@typescript-eslint/typescript-estree": "8.33.1",
+ "@typescript-eslint/visitor-keys": "8.33.1",
"debug": "^4.3.4"
},
"engines": {
@@ -2975,14 +2992,14 @@
}
},
"node_modules/@typescript-eslint/project-service": {
- "version": "8.33.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.0.tgz",
- "integrity": "sha512-d1hz0u9l6N+u/gcrk6s6gYdl7/+pp8yHheRTqP6X5hVDKALEaTn8WfGiit7G511yueBEL3OpOEpD+3/MBdoN+A==",
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.1.tgz",
+ "integrity": "sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.33.0",
- "@typescript-eslint/types": "^8.33.0",
+ "@typescript-eslint/tsconfig-utils": "^8.33.1",
+ "@typescript-eslint/types": "^8.33.1",
"debug": "^4.3.4"
},
"engines": {
@@ -2991,17 +3008,20 @@
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.33.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.0.tgz",
- "integrity": "sha512-LMi/oqrzpqxyO72ltP+dBSP6V0xiUb4saY7WLtxSfiNEBI8m321LLVFU9/QDJxjDQG9/tjSqKz/E3380TEqSTw==",
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz",
+ "integrity": "sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.33.0",
- "@typescript-eslint/visitor-keys": "8.33.0"
+ "@typescript-eslint/types": "8.33.1",
+ "@typescript-eslint/visitor-keys": "8.33.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3012,9 +3032,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.33.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.0.tgz",
- "integrity": "sha512-sTkETlbqhEoiFmGr1gsdq5HyVbSOF0145SYDJ/EQmXHtKViCaGvnyLqWFFHtEXoS0J1yU8Wyou2UGmgW88fEug==",
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz",
+ "integrity": "sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3029,14 +3049,14 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.33.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.33.0.tgz",
- "integrity": "sha512-lScnHNCBqL1QayuSrWeqAL5GmqNdVUQAAMTaCwdYEdWfIrSrOGzyLGRCHXcCixa5NK6i5l0AfSO2oBSjCjf4XQ==",
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz",
+ "integrity": "sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/typescript-estree": "8.33.0",
- "@typescript-eslint/utils": "8.33.0",
+ "@typescript-eslint/typescript-estree": "8.33.1",
+ "@typescript-eslint/utils": "8.33.1",
"debug": "^4.3.4",
"ts-api-utils": "^2.1.0"
},
@@ -3053,9 +3073,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.33.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.0.tgz",
- "integrity": "sha512-DKuXOKpM5IDT1FA2g9x9x1Ug81YuKrzf4mYX8FAVSNu5Wo/LELHWQyM1pQaDkI42bX15PWl0vNPt1uGiIFUOpg==",
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.1.tgz",
+ "integrity": "sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3067,16 +3087,16 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.33.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.0.tgz",
- "integrity": "sha512-vegY4FQoB6jL97Tu/lWRsAiUUp8qJTqzAmENH2k59SJhw0Th1oszb9Idq/FyyONLuNqT1OADJPXfyUNOR8SzAQ==",
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz",
+ "integrity": "sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/project-service": "8.33.0",
- "@typescript-eslint/tsconfig-utils": "8.33.0",
- "@typescript-eslint/types": "8.33.0",
- "@typescript-eslint/visitor-keys": "8.33.0",
+ "@typescript-eslint/project-service": "8.33.1",
+ "@typescript-eslint/tsconfig-utils": "8.33.1",
+ "@typescript-eslint/types": "8.33.1",
+ "@typescript-eslint/visitor-keys": "8.33.1",
"debug": "^4.3.4",
"fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
@@ -3096,16 +3116,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.33.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.0.tgz",
- "integrity": "sha512-lPFuQaLA9aSNa7D5u2EpRiqdAUhzShwGg/nhpBlc4GR6kcTABttCuyjFs8BcEZ8VWrjCBof/bePhP3Q3fS+Yrw==",
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.1.tgz",
+ "integrity": "sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.33.0",
- "@typescript-eslint/types": "8.33.0",
- "@typescript-eslint/typescript-estree": "8.33.0"
+ "@typescript-eslint/scope-manager": "8.33.1",
+ "@typescript-eslint/types": "8.33.1",
+ "@typescript-eslint/typescript-estree": "8.33.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3120,13 +3140,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.33.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.0.tgz",
- "integrity": "sha512-7RW7CMYoskiz5OOGAWjJFxgb7c5UNjTG292gYhWeOAcFmYCtVCSqjqSBj5zMhxbXo2JOW95YYrUWJfU0zrpaGQ==",
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz",
+ "integrity": "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.33.0",
+ "@typescript-eslint/types": "8.33.1",
"eslint-visitor-keys": "^4.2.0"
},
"engines": {
@@ -3138,9 +3158,9 @@
}
},
"node_modules/@unrs/resolver-binding-darwin-arm64": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.8.tgz",
- "integrity": "sha512-rsRK8T7yxraNRDmpFLZCWqpea6OlXPNRRCjWMx24O1V86KFol7u2gj9zJCv6zB1oJjtnzWceuqdnCgOipFcJPA==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.9.tgz",
+ "integrity": "sha512-hWbcVTcNqgUirY5DC3heOLrz35D926r2izfxveBmuIgDwx9KkUHfqd93g8PtROJX01lvhmyAc3E09/ma6jhyqQ==",
"cpu": [
"arm64"
],
@@ -3152,9 +3172,9 @@
]
},
"node_modules/@unrs/resolver-binding-darwin-x64": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.8.tgz",
- "integrity": "sha512-16yEMWa+Olqkk8Kl6Bu0ltT5OgEedkSAsxcz1B3yEctrDYp3EMBu/5PPAGhWVGnwhtf3hNe3y15gfYBAjOv5tQ==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.9.tgz",
+ "integrity": "sha512-NCZb/oaXELjt8jtm6ztlNPpAxKZsKIxsGYPSxkwQdQ/zl7X2PfyCpWqwoGE4A9vCP6gAgJnvH3e22nE0qk9ieA==",
"cpu": [
"x64"
],
@@ -3166,9 +3186,9 @@
]
},
"node_modules/@unrs/resolver-binding-freebsd-x64": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.8.tgz",
- "integrity": "sha512-ST4uqF6FmdZQgv+Q73FU1uHzppeT4mhX3IIEmHlLObrv5Ep50olWRz0iQ4PWovadjHMTAmpuJAGaAuCZYb7UAQ==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.9.tgz",
+ "integrity": "sha512-/AYheGgFn9Pw3X3pYFCohznydaUA9980/wlwgbgCsVxnY4IbqVoZhTLQZ4JWKKaOWBwwmM8FseHf5h5OawyOQQ==",
"cpu": [
"x64"
],
@@ -3180,9 +3200,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.8.tgz",
- "integrity": "sha512-Z/A/4Rm2VWku2g25C3tVb986fY6unx5jaaCFpx1pbAj0OKkyuJ5wcQLHvNbIcJ9qhiYwXfrkB7JNlxrAbg7YFg==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.9.tgz",
+ "integrity": "sha512-RYV9sEH3o6SZum5wGb9evXlgibsVfluuiyi09hXVD+qPRrCSB45h3z1HjZpe9+c25GiN53CEy149fYS0fLVBtw==",
"cpu": [
"arm"
],
@@ -3194,9 +3214,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.8.tgz",
- "integrity": "sha512-HN0p7o38qKmDo3bZUiQa6gP7Qhf0sKgJZtRfSHi6JL2Gi4NaUVF0EO1sQ1RHbeQ4VvfjUGMh3QE5dxEh06BgQQ==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.9.tgz",
+ "integrity": "sha512-0ishMZMCYNJd4SNjHnjByHWh6ia7EDVZrOVAW8wf9Vz2PTZ0pLrFwu5c9voHouGKg7s2cnzPz87c0OK7dwimUQ==",
"cpu": [
"arm"
],
@@ -3208,9 +3228,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.8.tgz",
- "integrity": "sha512-HsoVqDBt9G69AN0KWeDNJW+7i8KFlwxrbbnJffgTGpiZd6Jw+Q95sqkXp8y458KhKduKLmXfVZGnKBTNxAgPjw==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.9.tgz",
+ "integrity": "sha512-FOspRldYylONzWCkF5n/B1MMYKXXlg2bzgcgESEVcP4LFh0eom/0XsWvfy+dlfBJ+FkYfJjvBJeje14xOBOa6g==",
"cpu": [
"arm64"
],
@@ -3222,9 +3242,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-arm64-musl": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.8.tgz",
- "integrity": "sha512-VfR2yTDUbUvn+e/Aw22CC9fQg9zdShHAfwWctNBdOk7w9CHWl2OtYlcMvjzMAns8QxoHQoqn3/CEnZ4Ts7hfrA==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.9.tgz",
+ "integrity": "sha512-P1S5jTht888/1mZVrBZx8IOxpikRDPoECxod1CcAHYUZGUNr+PNp1m5eB9FWMK2zRCJ8HgHNZfdRyDf9pNCrlQ==",
"cpu": [
"arm64"
],
@@ -3236,9 +3256,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.8.tgz",
- "integrity": "sha512-xUauVQNz4uDgs4UJJiUAwMe3N0PA0wvtImh7V0IFu++UKZJhssXbKHBRR4ecUJpUHCX2bc4Wc8sGsB6P+7BANg==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.9.tgz",
+ "integrity": "sha512-cD9+BPxlFSiIkGWknSgKdTMGZIzCtSIg/O7GJ1LoC+jGtUOBNBJYMn6FyEPRvdpphewYzaCuPsikrMkpdX303Q==",
"cpu": [
"ppc64"
],
@@ -3250,9 +3270,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.8.tgz",
- "integrity": "sha512-GqyIB+CuSHGhhc8ph5RrurtNetYJjb6SctSHafqmdGcRuGi6uyTMR8l18hMEhZFsXdFMc/MpInPLvmNV22xn+A==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.9.tgz",
+ "integrity": "sha512-Z6IuWg9u0257dCVgc/x/zIKamqJhrmaOFuq3AYsSt6ZtyEHoyD5kxdXQUvEgBAd/Fn1b8tsX+VD9mB9al5306Q==",
"cpu": [
"riscv64"
],
@@ -3264,9 +3284,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.8.tgz",
- "integrity": "sha512-eEU3rWIFRv60xaAbtsgwHNWRZGD7cqkpCvNtio/f1TjEE3HfKLzPNB24fA9X/8ZXQrGldE65b7UKK3PmO4eWIQ==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.9.tgz",
+ "integrity": "sha512-HpINrXLJVEpvkHHIla6pqhMAKbQBrY+2946i6rF6OlByONLTuObg65bcv3A38qV9yqJ7vtE0FyfNn68k0uQKbg==",
"cpu": [
"riscv64"
],
@@ -3278,9 +3298,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.8.tgz",
- "integrity": "sha512-GVLI0f4I4TlLqEUoOFvTWedLsJEdvsD0+sxhdvQ5s+N+m2DSynTs8h9jxR0qQbKlpHWpc2Ortz3z48NHRT4l+w==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.9.tgz",
+ "integrity": "sha512-ZXZFfaPFXnrDIPpkFoAZmxzXwqqfCHfnFdZhrEd+mrc/hHTQyxINyzrFMFCqtAa5eIjD7vgzNIXsMFU2QBnCPw==",
"cpu": [
"s390x"
],
@@ -3292,9 +3312,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-x64-gnu": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.8.tgz",
- "integrity": "sha512-GX1pZ/4ncUreB0Rlp1l7bhKAZ8ZmvDIgXdeb5V2iK0eRRF332+6gRfR/r5LK88xfbtOpsmRHU6mQ4N8ZnwvGEA==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.9.tgz",
+ "integrity": "sha512-EzeeaZnuQOa93ox08oa9DqgQc8sK59jfs+apOUrZZSJCDG1ZbtJINPc8uRqE7p3Z66FPAe/uO3+7jZTkWbVDfg==",
"cpu": [
"x64"
],
@@ -3306,9 +3326,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-x64-musl": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.8.tgz",
- "integrity": "sha512-n1N84MnsvDupzVuYqJGj+2pb9s8BI1A5RgXHvtVFHedGZVBCFjDpQVRlmsFMt6xZiKwDPaqsM16O/1isCUGt7w==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.9.tgz",
+ "integrity": "sha512-a07ezNt0OY8Vv/iDreJo7ZkKtwRb6UCYaCcMY2nm3ext7rTtDFS7X1GePqrbByvIbRFd6E5q1CKBPzJk6M360Q==",
"cpu": [
"x64"
],
@@ -3320,9 +3340,9 @@
]
},
"node_modules/@unrs/resolver-binding-wasm32-wasi": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.8.tgz",
- "integrity": "sha512-x94WnaU5g+pCPDVedfnXzoG6lCOF2xFGebNwhtbJCWfceE94Zj8aysSxdxotlrZrxnz5D3ijtyFUYtpz04n39Q==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.9.tgz",
+ "integrity": "sha512-d0fHnxgtrv75Po6LKJLjo1LFC5S0E8vv86H/5wGDFLG0AvS/0k+SghgUW6zAzjM2XRAic/qcy9+O7n/5JOjxFA==",
"cpu": [
"wasm32"
],
@@ -3337,9 +3357,9 @@
}
},
"node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.8.tgz",
- "integrity": "sha512-vst2u8EJZ5L6jhJ6iLis3w9rg16aYqRxQuBAMYQRVrPMI43693hLP7DuqyOBRKgsQXy9/jgh204k0ViHkqQgdg==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.9.tgz",
+ "integrity": "sha512-0MFcaQDsUYxNqRxjPdsMKg1OGtmsqLzPY2Nwiiyalx6HFvkcHxgRCAOppgeUuDucpUEf76k/4tBzfzPxjYkFUg==",
"cpu": [
"arm64"
],
@@ -3351,9 +3371,9 @@
]
},
"node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.8.tgz",
- "integrity": "sha512-yb3LZOLMFqnA+/ShlE1E5bpYPGDsA590VHHJPB+efnyowT776GJXBoh82em6O9WmYBUq57YblGTcMYAFBm72HA==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.9.tgz",
+ "integrity": "sha512-SiewmebiN32RpzrV1Dvbw7kdDCRuPThdgEWKJvDNcEGnVEV3ScYGuk5smJjKHXszqNX3mIXG/PcCXqHsE/7XGA==",
"cpu": [
"ia32"
],
@@ -3365,9 +3385,9 @@
]
},
"node_modules/@unrs/resolver-binding-win32-x64-msvc": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.8.tgz",
- "integrity": "sha512-hHKFx+opG5BA3/owMXon8ypwSotBGTdblG6oda/iOu9+OEYnk0cxD2uIcGyGT8jCK578kV+xMrNxqbn8Zjlpgw==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.9.tgz",
+ "integrity": "sha512-hORofIRZCm85+TUZ9OmHQJNlgtOmK/TPfvYeSplKAl+zQvAwMGyy6DZcSbrF+KdB1EDoGISwU7dX7PE92haOXg==",
"cpu": [
"x64"
],
@@ -3379,15 +3399,16 @@
]
},
"node_modules/@vitest/coverage-v8": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.4.tgz",
- "integrity": "sha512-G4p6OtioySL+hPV7Y6JHlhpsODbJzt1ndwHAFkyk6vVjpK03PFsKnauZIzcd0PrK4zAbc5lc+jeZ+eNGiMA+iw==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.1.tgz",
+ "integrity": "sha512-6dy0uF/0BE3jpUW9bFzg0V2S4F7XVaZHL/7qma1XANvHPQGoJuc3wtx911zSoAgUnpfvcLVK1vancNJ95d+uxQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.3.0",
"@bcoe/v8-coverage": "^1.0.2",
- "debug": "^4.4.0",
+ "ast-v8-to-istanbul": "^0.3.3",
+ "debug": "^4.4.1",
"istanbul-lib-coverage": "^3.2.2",
"istanbul-lib-report": "^3.0.1",
"istanbul-lib-source-maps": "^5.0.6",
@@ -3402,8 +3423,8 @@
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
- "@vitest/browser": "3.1.4",
- "vitest": "3.1.4"
+ "@vitest/browser": "3.2.1",
+ "vitest": "3.2.1"
},
"peerDependenciesMeta": {
"@vitest/browser": {
@@ -3435,14 +3456,15 @@
}
},
"node_modules/@vitest/expect": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.4.tgz",
- "integrity": "sha512-xkD/ljeliyaClDYqHPNCiJ0plY5YIcM0OlRiZizLhlPmpXWpxnGMyTZXOHFhFeG7w9P5PBeL4IdtJ/HeQwTbQA==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.1.tgz",
+ "integrity": "sha512-FqS/BnDOzV6+IpxrTg5GQRyLOCtcJqkwMwcS8qGCI2IyRVDwPAtutztaf1CjtPHlZlWtl1yUPCd7HM0cNiDOYw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/spy": "3.1.4",
- "@vitest/utils": "3.1.4",
+ "@types/chai": "^5.2.2",
+ "@vitest/spy": "3.2.1",
+ "@vitest/utils": "3.2.1",
"chai": "^5.2.0",
"tinyrainbow": "^2.0.0"
},
@@ -3451,13 +3473,13 @@
}
},
"node_modules/@vitest/mocker": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.4.tgz",
- "integrity": "sha512-8IJ3CvwtSw/EFXqWFL8aCMu+YyYXG2WUSrQbViOZkWTKTVicVwZ/YiEZDSqD00kX+v/+W+OnxhNWoeVKorHygA==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.1.tgz",
+ "integrity": "sha512-OXxMJnx1lkB+Vl65Re5BrsZEHc90s5NMjD23ZQ9NlU7f7nZiETGoX4NeKZSmsKjseuMq2uOYXdLOeoM0pJU+qw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/spy": "3.1.4",
+ "@vitest/spy": "3.2.1",
"estree-walker": "^3.0.3",
"magic-string": "^0.30.17"
},
@@ -3466,7 +3488,7 @@
},
"peerDependencies": {
"msw": "^2.4.9",
- "vite": "^5.0.0 || ^6.0.0"
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
},
"peerDependenciesMeta": {
"msw": {
@@ -3488,9 +3510,9 @@
}
},
"node_modules/@vitest/pretty-format": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.4.tgz",
- "integrity": "sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.1.tgz",
+ "integrity": "sha512-xBh1X2GPlOGBupp6E1RcUQWIxw0w/hRLd3XyBS6H+dMdKTAqHDNsIR2AnJwPA3yYe9DFy3VUKTe3VRTrAiQ01g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3501,13 +3523,13 @@
}
},
"node_modules/@vitest/runner": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.4.tgz",
- "integrity": "sha512-djTeF1/vt985I/wpKVFBMWUlk/I7mb5hmD5oP8K9ACRmVXgKTae3TUOtXAEBfslNKPzUQvnKhNd34nnRSYgLNQ==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.1.tgz",
+ "integrity": "sha512-kygXhNTu/wkMYbwYpS3z/9tBe0O8qpdBuC3dD/AW9sWa0LE/DAZEjnHtWA9sIad7lpD4nFW1yQ+zN7mEKNH3yA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/utils": "3.1.4",
+ "@vitest/utils": "3.2.1",
"pathe": "^2.0.3"
},
"funding": {
@@ -3515,13 +3537,13 @@
}
},
"node_modules/@vitest/snapshot": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.4.tgz",
- "integrity": "sha512-JPHf68DvuO7vilmvwdPr9TS0SuuIzHvxeaCkxYcCD4jTk67XwL45ZhEHFKIuCm8CYstgI6LZ4XbwD6ANrwMpFg==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.1.tgz",
+ "integrity": "sha512-5xko/ZpW2Yc65NVK9Gpfg2y4BFvcF+At7yRT5AHUpTg9JvZ4xZoyuRY4ASlmNcBZjMslV08VRLDrBOmUe2YX3g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "3.1.4",
+ "@vitest/pretty-format": "3.2.1",
"magic-string": "^0.30.17",
"pathe": "^2.0.3"
},
@@ -3530,26 +3552,26 @@
}
},
"node_modules/@vitest/spy": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.4.tgz",
- "integrity": "sha512-Xg1bXhu+vtPXIodYN369M86K8shGLouNjoVI78g8iAq2rFoHFdajNvJJ5A/9bPMFcfQqdaCpOgWKEoMQg/s0Yg==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.1.tgz",
+ "integrity": "sha512-Nbfib34Z2rfcJGSetMxjDCznn4pCYPZOtQYox2kzebIJcgH75yheIKd5QYSFmR8DIZf2M8fwOm66qSDIfRFFfQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "tinyspy": "^3.0.2"
+ "tinyspy": "^4.0.3"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/utils": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.4.tgz",
- "integrity": "sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.1.tgz",
+ "integrity": "sha512-KkHlGhePEKZSub5ViknBcN5KEF+u7dSUr9NW8QsVICusUojrgrOnnY3DEWWO877ax2Pyopuk2qHmt+gkNKnBVw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "3.1.4",
+ "@vitest/pretty-format": "3.2.1",
"loupe": "^3.1.3",
"tinyrainbow": "^2.0.0"
},
@@ -4018,13 +4040,13 @@
}
},
"node_modules/are-docs-informative": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.1.0.tgz",
- "integrity": "sha512-CplVvB5za1z5Zn528h0EUogt/McTT7lvHZKFtb2NYldodL7G3u2O49Mgws3mP/TrKhpNuDjKPHYxmh8t2DGTtQ==",
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz",
+ "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=18"
+ "node": ">=14"
}
},
"node_modules/arg": {
@@ -4050,6 +4072,28 @@
"node": ">=12"
}
},
+ "node_modules/ast-v8-to-istanbul": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.3.tgz",
+ "integrity": "sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "estree-walker": "^3.0.3",
+ "js-tokens": "^9.0.1"
+ }
+ },
+ "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -4319,9 +4363,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001720",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001720.tgz",
- "integrity": "sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==",
+ "version": "1.0.30001721",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz",
+ "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==",
"dev": true,
"funding": [
{
@@ -5102,9 +5146,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.161",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.161.tgz",
- "integrity": "sha512-hwtetwfKNZo/UlwHIVBlKZVdy7o8bIZxxKs0Mv/ROPiQQQmDgdm5a+KvKtBsxM8ZjFzTaCeLoodZ8jiBE3o9rA==",
+ "version": "1.5.165",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz",
+ "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==",
"dev": true,
"license": "ISC"
},
@@ -5452,14 +5496,14 @@
}
},
"node_modules/eslint-import-context": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.6.tgz",
- "integrity": "sha512-/e2ZNPDLCrU8niIy0pddcvXuoO2YrKjf3NAIX+60mHJBT4yv7mqCqvVdyCW2E720e25e4S/1OSVef4U6efGLFg==",
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.7.tgz",
+ "integrity": "sha512-gRkcGvLn+lYEBmv8OSzHciuS0Py6MPd0EEb112C1iHOgvrbnaveqL/f3nEccqHuN8+jGDVOADu0JCMrikCgm3w==",
"dev": true,
"license": "MIT",
"dependencies": {
"get-tsconfig": "^4.10.1",
- "stable-hash": "^0.0.5"
+ "stable-hash": "^0.0.6"
},
"engines": {
"node": "^12.20.0 || ^14.18.0 || >=16.0.0"
@@ -5476,6 +5520,13 @@
}
}
},
+ "node_modules/eslint-import-context/node_modules/stable-hash": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.6.tgz",
+ "integrity": "sha512-0afH4mobqTybYZsXImQRLOjHV4gvOW+92HdUIax9t7a8d9v54KWykEuMVIcXhD9BCi+w3kS4x7O6fmZQ3JlG/g==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/eslint-json-compat-utils": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/eslint-json-compat-utils/-/eslint-json-compat-utils-0.2.1.tgz",
@@ -5645,14 +5696,14 @@
}
},
"node_modules/eslint-plugin-jsdoc": {
- "version": "50.7.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.7.0.tgz",
- "integrity": "sha512-fMeHWVtdxXvLfMmKLXJWObJSt57zBz31RCLZYj3bLSHBqnEsyO50N1OLDi5XP5wh+Gte5van9WTtOnemKAZrSw==",
+ "version": "50.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.7.1.tgz",
+ "integrity": "sha512-XBnVA5g2kUVokTNUiE1McEPse5n9/mNUmuJcx52psT6zBs2eVcXSmQBvjfa7NZdfLVSy3u1pEDDUxoxpwy89WA==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"@es-joy/jsdoccomment": "~0.50.2",
- "are-docs-informative": "^0.1.0",
+ "are-docs-informative": "^0.0.2",
"comment-parser": "1.4.1",
"debug": "^4.4.1",
"escape-string-regexp": "^4.0.0",
@@ -5725,20 +5776,22 @@
}
},
"node_modules/eslint-plugin-n": {
- "version": "17.18.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.18.0.tgz",
- "integrity": "sha512-hvZ/HusueqTJ7VDLoCpjN0hx4N4+jHIWTXD4TMLHy9F23XkDagR9v+xQWRWR57yY55GPF8NnD4ox9iGTxirY8A==",
+ "version": "17.19.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.19.0.tgz",
+ "integrity": "sha512-qxn1NaDHtizbhVAPpbMT8wWFaLtPnwhfN/e+chdu2i6Vgzmo/tGM62tcJ1Hf7J5Ie4dhse3DOPMmDxduzfifzw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.5.0",
+ "@typescript-eslint/utils": "^8.26.1",
"enhanced-resolve": "^5.17.1",
"eslint-plugin-es-x": "^7.8.0",
"get-tsconfig": "^4.8.1",
"globals": "^15.11.0",
"ignore": "^5.3.2",
"minimatch": "^9.0.5",
- "semver": "^7.6.3"
+ "semver": "^7.6.3",
+ "ts-declaration-location": "^1.0.6"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5774,14 +5827,14 @@
}
},
"node_modules/eslint-plugin-perfectionist": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-4.13.0.tgz",
- "integrity": "sha512-dsPwXwV7IrG26PJ+h1crQ1f5kxay/gQAU0NJnbVTQc91l5Mz9kPjyIZ7fXgie+QSgi8a+0TwGbfaJx+GIhzuoQ==",
+ "version": "4.14.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-4.14.0.tgz",
+ "integrity": "sha512-BkhiOqzdum8vQSFgj1/q5+6UUWPMn4GELdxuX7uIsGegmAeH/+LnWsiVxgMrxalD0p68sYfMeKaHF1NfrpI/mg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "^8.32.1",
- "@typescript-eslint/utils": "^8.32.1",
+ "@typescript-eslint/types": "^8.33.1",
+ "@typescript-eslint/utils": "^8.33.1",
"natural-orderby": "^5.0.0"
},
"engines": {
@@ -5820,9 +5873,9 @@
}
},
"node_modules/eslint-plugin-regexp": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-regexp/-/eslint-plugin-regexp-2.7.0.tgz",
- "integrity": "sha512-U8oZI77SBtH8U3ulZ05iu0qEzIizyEDXd+BWHvyVxTOjGwcDcvy/kEpgFG4DYca2ByRLiVPFZ2GeH7j1pdvZTA==",
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-regexp/-/eslint-plugin-regexp-2.8.0.tgz",
+ "integrity": "sha512-xme90IvkMgdyS+NJC21FM0H6ek4urGsdlIFTXpZRqH2BKJKVSd8hRbyrCpbcqfGBi2jth3eQoLiO3RC1gxZHiw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7253,6 +7306,13 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
+ "node_modules/js-tokens": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -10347,9 +10407,9 @@
}
},
"node_modules/shell-quote": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz",
- "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==",
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
+ "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -11135,9 +11195,9 @@
}
},
"node_modules/tinyspy": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
- "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz",
+ "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -11260,6 +11320,29 @@
"typescript": ">=4.8.4"
}
},
+ "node_modules/ts-declaration-location": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz",
+ "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "ko-fi",
+ "url": "https://ko-fi.com/rebeccastevens"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/ts-declaration-location"
+ }
+ ],
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "picomatch": "^4.0.2"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.0.0"
+ }
+ },
"node_modules/ts-loader": {
"version": "9.5.2",
"resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz",
@@ -11538,9 +11621,9 @@
}
},
"node_modules/unrs-resolver": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.8.tgz",
- "integrity": "sha512-2zsXwyOXmCX9nGz4vhtZRYhe30V78heAv+KDc21A/KMdovGHbZcixeD5JHEF0DrFXzdytwuzYclcPbvp8A3Jlw==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.9.tgz",
+ "integrity": "sha512-hhFtY782YKwpz54G1db49YYS1RuMn8mBylIrCldrjb9BxZKnQ2xHw7+2zcl7H6fnUlTHGWv23/+677cpufhfxQ==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -11551,23 +11634,23 @@
"url": "https://opencollective.com/unrs-resolver"
},
"optionalDependencies": {
- "@unrs/resolver-binding-darwin-arm64": "1.7.8",
- "@unrs/resolver-binding-darwin-x64": "1.7.8",
- "@unrs/resolver-binding-freebsd-x64": "1.7.8",
- "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.8",
- "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.8",
- "@unrs/resolver-binding-linux-arm64-gnu": "1.7.8",
- "@unrs/resolver-binding-linux-arm64-musl": "1.7.8",
- "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.8",
- "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.8",
- "@unrs/resolver-binding-linux-riscv64-musl": "1.7.8",
- "@unrs/resolver-binding-linux-s390x-gnu": "1.7.8",
- "@unrs/resolver-binding-linux-x64-gnu": "1.7.8",
- "@unrs/resolver-binding-linux-x64-musl": "1.7.8",
- "@unrs/resolver-binding-wasm32-wasi": "1.7.8",
- "@unrs/resolver-binding-win32-arm64-msvc": "1.7.8",
- "@unrs/resolver-binding-win32-ia32-msvc": "1.7.8",
- "@unrs/resolver-binding-win32-x64-msvc": "1.7.8"
+ "@unrs/resolver-binding-darwin-arm64": "1.7.9",
+ "@unrs/resolver-binding-darwin-x64": "1.7.9",
+ "@unrs/resolver-binding-freebsd-x64": "1.7.9",
+ "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.9",
+ "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.9",
+ "@unrs/resolver-binding-linux-arm64-gnu": "1.7.9",
+ "@unrs/resolver-binding-linux-arm64-musl": "1.7.9",
+ "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.9",
+ "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.9",
+ "@unrs/resolver-binding-linux-riscv64-musl": "1.7.9",
+ "@unrs/resolver-binding-linux-s390x-gnu": "1.7.9",
+ "@unrs/resolver-binding-linux-x64-gnu": "1.7.9",
+ "@unrs/resolver-binding-linux-x64-musl": "1.7.9",
+ "@unrs/resolver-binding-wasm32-wasi": "1.7.9",
+ "@unrs/resolver-binding-win32-arm64-msvc": "1.7.9",
+ "@unrs/resolver-binding-win32-ia32-msvc": "1.7.9",
+ "@unrs/resolver-binding-win32-x64-msvc": "1.7.9"
}
},
"node_modules/unzipper": {
@@ -11741,17 +11824,17 @@
}
},
"node_modules/vite-node": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.4.tgz",
- "integrity": "sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.1.tgz",
+ "integrity": "sha512-V4EyKQPxquurNJPtQJRZo8hKOoKNBRIhxcDbQFPFig0JdoWcUhwRgK8yoCXXrfYVPKS6XwirGHPszLnR8FbjCA==",
"dev": true,
"license": "MIT",
"dependencies": {
"cac": "^6.7.14",
- "debug": "^4.4.0",
+ "debug": "^4.4.1",
"es-module-lexer": "^1.7.0",
"pathe": "^2.0.3",
- "vite": "^5.0.0 || ^6.0.0"
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
},
"bin": {
"vite-node": "vite-node.mjs"
@@ -11764,32 +11847,34 @@
}
},
"node_modules/vitest": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.4.tgz",
- "integrity": "sha512-Ta56rT7uWxCSJXlBtKgIlApJnT6e6IGmTYxYcmxjJ4ujuZDI59GUQgVDObXXJujOmPDBYXHK1qmaGtneu6TNIQ==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.1.tgz",
+ "integrity": "sha512-VZ40MBnlE1/V5uTgdqY3DmjUgZtIzsYq758JGlyQrv5syIsaYcabkfPkEuWML49Ph0D/SoqpVFd0dyVTr551oA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/expect": "3.1.4",
- "@vitest/mocker": "3.1.4",
- "@vitest/pretty-format": "^3.1.4",
- "@vitest/runner": "3.1.4",
- "@vitest/snapshot": "3.1.4",
- "@vitest/spy": "3.1.4",
- "@vitest/utils": "3.1.4",
+ "@types/chai": "^5.2.2",
+ "@vitest/expect": "3.2.1",
+ "@vitest/mocker": "3.2.1",
+ "@vitest/pretty-format": "^3.2.1",
+ "@vitest/runner": "3.2.1",
+ "@vitest/snapshot": "3.2.1",
+ "@vitest/spy": "3.2.1",
+ "@vitest/utils": "3.2.1",
"chai": "^5.2.0",
- "debug": "^4.4.0",
+ "debug": "^4.4.1",
"expect-type": "^1.2.1",
"magic-string": "^0.30.17",
"pathe": "^2.0.3",
+ "picomatch": "^4.0.2",
"std-env": "^3.9.0",
"tinybench": "^2.9.0",
"tinyexec": "^0.3.2",
- "tinyglobby": "^0.2.13",
- "tinypool": "^1.0.2",
+ "tinyglobby": "^0.2.14",
+ "tinypool": "^1.1.0",
"tinyrainbow": "^2.0.0",
- "vite": "^5.0.0 || ^6.0.0",
- "vite-node": "3.1.4",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0",
+ "vite-node": "3.2.1",
"why-is-node-running": "^2.3.0"
},
"bin": {
@@ -11805,8 +11890,8 @@
"@edge-runtime/vm": "*",
"@types/debug": "^4.1.12",
"@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
- "@vitest/browser": "3.1.4",
- "@vitest/ui": "3.1.4",
+ "@vitest/browser": "3.2.1",
+ "@vitest/ui": "3.2.1",
"happy-dom": "*",
"jsdom": "*"
},
@@ -11946,9 +12031,9 @@
}
},
"node_modules/webpack-sources": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.0.tgz",
- "integrity": "sha512-77R0RDmJfj9dyv5p3bM5pOHa+X8/ZkO9c7kpDstigkC4nIDobadsfSGCwB4bKhMVxqAok8tajaoR8rirM7+VFQ==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.2.tgz",
+ "integrity": "sha512-ykKKus8lqlgXX/1WjudpIEjqsafjOTcOJqxnAbMLAu/KCsDCJ6GBtvscewvTkrn24HsnvFwrSCbenFrhtcCsAA==",
"dev": true,
"license": "MIT",
"peer": true,
diff --git a/package.json b/package.json
index 9d67212d1..9ca5b03e5 100644
--- a/package.json
+++ b/package.json
@@ -120,7 +120,7 @@
"unzipper": "0.12.3"
},
"devDependencies": {
- "@antfu/eslint-config": "^4.13.2",
+ "@antfu/eslint-config": "^4.13.3",
"@nestjs/testing": "^10.4.18",
"@prettier/plugin-xml": "^3.4.1",
"@types/fs-extra": "^11.0.4",
@@ -132,7 +132,7 @@
"@types/tail": "^2.2.3",
"@types/tcp-port-used": "^1.0.4",
"@types/unzipper": "^0.10.11",
- "@vitest/coverage-v8": "^3.1.4",
+ "@vitest/coverage-v8": "^3.2.1",
"concurrently": "^9.1.2",
"eslint-plugin-format": "^1.0.1",
"form-data": "^4.0.2",
@@ -143,7 +143,7 @@
"tsconfig-paths": "^4.2.0",
"typescript": "^5.8.3",
"unplugin-swc": "^1.5.4",
- "vitest": "^3.1.4"
+ "vitest": "^3.2.1"
},
"overrides": {
"@nestjs/platform-fastify": {
diff --git a/ui/package-lock.json b/ui/package-lock.json
index fb0ca3a8c..f4dd964fe 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -10,15 +10,15 @@
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
- "@angular/animations": "20.0.0",
- "@angular/common": "20.0.0",
- "@angular/compiler": "20.0.0",
- "@angular/core": "20.0.0",
- "@angular/forms": "20.0.0",
- "@angular/localize": "20.0.0",
- "@angular/platform-browser": "20.0.0",
- "@angular/platform-browser-dynamic": "20.0.0",
- "@angular/router": "20.0.0",
+ "@angular/animations": "20.0.1",
+ "@angular/common": "20.0.1",
+ "@angular/compiler": "20.0.1",
+ "@angular/core": "20.0.1",
+ "@angular/forms": "20.0.1",
+ "@angular/localize": "20.0.1",
+ "@angular/platform-browser": "20.0.1",
+ "@angular/platform-browser-dynamic": "20.0.1",
+ "@angular/router": "20.0.1",
"@auth0/angular-jwt": "5.2.0",
"@homebridge/hap-client": "2.2.0",
"@ng-bootstrap/ng-bootstrap": "18.0.0",
@@ -55,12 +55,12 @@
"zone.js": "0.15.1"
},
"devDependencies": {
- "@angular/build": "^20.0.0",
- "@angular/cli": "^20.0.0",
- "@angular/compiler-cli": "^20.0.0",
- "@angular/language-service": "^20.0.0",
+ "@angular/build": "^20.0.1",
+ "@angular/cli": "^20.0.1",
+ "@angular/compiler-cli": "^20.0.1",
+ "@angular/language-service": "^20.0.1",
"@fortawesome/fontawesome-free": "^6.7.2",
- "@homebridge/plugin-ui-utils": "^2.0.2",
+ "@homebridge/plugin-ui-utils": "^2.1.0",
"@types/emoji-js": "^3.5.2",
"@types/file-saver": "^2.0.7",
"@types/lodash-es": "^4.17.12",
@@ -87,13 +87,13 @@
}
},
"node_modules/@angular-devkit/architect": {
- "version": "0.2000.0",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2000.0.tgz",
- "integrity": "sha512-6accOuvf1BY6hTO5LzYcxp2Dpl0bThgYF3KdwVWqrYF5+6PWfQLdy+rKxBiCIv0+0OngZVI79RuAtUKFowFM/A==",
+ "version": "0.2000.1",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2000.1.tgz",
+ "integrity": "sha512-EcOGU1xEhARYpDF391VaeUg/+YRym9OxzJMcc0rSHl3YLK8/m+24ap2YAQY5N7n9+mmEqHVu/q31ldFpOoMCTw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "20.0.0",
+ "@angular-devkit/core": "20.0.1",
"rxjs": "7.8.2"
},
"engines": {
@@ -103,9 +103,9 @@
}
},
"node_modules/@angular-devkit/core": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.0.tgz",
- "integrity": "sha512-cnB/I1QQC3WoIcb+f/7hknOOkgIFjAuxd7nW1RnS+pn0qQTWyjnXjq2jocx2TBMwZRikycc7f3mlA1DgWzJUuQ==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.1.tgz",
+ "integrity": "sha512-Ilafyj8JVwq3NZsaiGw5UDkP4EAkGKiEvZ4TC3WVidZbM4EpKt9/Jd7ZpsTRGDLG429U+fGhay+ZQeCFGqy5rA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -131,13 +131,13 @@
}
},
"node_modules/@angular-devkit/schematics": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.0.0.tgz",
- "integrity": "sha512-35WbWP8ARnaqVjOzy7IOyWsY/jeyUqfVj4KgHG2O4fHAhIhaBqhP8dDDP+SwM+bToIqklg0fzHUUhFTRxzzyoQ==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.0.1.tgz",
+ "integrity": "sha512-bSr/5YIdjtwKYqylkYrlOVP+tuFz+tfOldmLfWHAsDGnJUznb5t4ckx6yyROp+iDQfu2Aez09p+l4KfUBq+H9A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "20.0.0",
+ "@angular-devkit/core": "20.0.1",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.17",
"ora": "8.2.0",
@@ -150,9 +150,9 @@
}
},
"node_modules/@angular/animations": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.0.0.tgz",
- "integrity": "sha512-yU4hUH6AheY0dnMSaLRMfgnXhg/JUSUvrhE+lHzIiSKdEf0lyo1Ri6bkPD1CbamxZ94BqhRNCApvbvTbibGICQ==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.0.1.tgz",
+ "integrity": "sha512-wBEiZakiDe7YLMhsra4VszVejYSATHwTOaSW0qr21rBgjiy7+zE7hfqOcnb46P35AlH8mivkMSl2dc+k28dWDQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -161,19 +161,19 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.0",
- "@angular/core": "20.0.0"
+ "@angular/common": "20.0.1",
+ "@angular/core": "20.0.1"
}
},
"node_modules/@angular/build": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.0.0.tgz",
- "integrity": "sha512-b/FAvvUbsMEgr+UlvTtDz4NCv+BFi+55swtKRmaritvZ2rDfhF1x9tUmSkT6GebGXkI/Gg0kl5rJoD5iv5lY3A==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.0.1.tgz",
+ "integrity": "sha512-m/0jtXIeOaoU/WXtMLRuvq7UaGRxNHpoRKVVoJrifvZuNBYGM4e2lzxlIlo8kiQhPpZQc0zcAMoosbmzKKdkUQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
- "@angular-devkit/architect": "0.2000.0",
+ "@angular-devkit/architect": "0.2000.1",
"@babel/core": "7.27.1",
"@babel/helper-annotate-as-pure": "7.27.1",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -215,7 +215,7 @@
"@angular/platform-browser": "^20.0.0",
"@angular/platform-server": "^20.0.0",
"@angular/service-worker": "^20.0.0",
- "@angular/ssr": "^20.0.0",
+ "@angular/ssr": "^20.0.1",
"karma": "^6.4.0",
"less": "^4.2.0",
"ng-packagr": "^20.0.0",
@@ -265,9 +265,9 @@
}
},
"node_modules/@angular/cdk": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.0.1.tgz",
- "integrity": "sha512-llJIyKdF9D0hJ9/PNy9A5vmayNgHr7MtQrtjpeLyPuK8qkUnxQd9Hzv5olqixRrbxxDs/Lt0l1T2ViHGy7WYhg==",
+ "version": "20.0.2",
+ "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.0.2.tgz",
+ "integrity": "sha512-gRQcpTNhnwBxXSmpnrljODUHQmB2Hnxc6L2Ad6mSMV+c3opd9KIFxL5eG2WOOPHGAaPrV4gNFw+t1i01U4grTg==",
"license": "MIT",
"peer": true,
"dependencies": {
@@ -281,18 +281,18 @@
}
},
"node_modules/@angular/cli": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.0.0.tgz",
- "integrity": "sha512-k9EDaaLYTMWkBbayUh6Tf0PJ+E0e6jRPrjOSPsOJHRh+S5BsNdLIsKJmThGXkq2wnD35+2CKPy9UQyvfaIA5KQ==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.0.1.tgz",
+ "integrity": "sha512-OU91byvG/WsDDUVmXIJr3/sU89U6g8G8IXrqgVRVPgjXKEQMnUNBlmygD2rMUR5C02g2lGc6s2j0hnOJ/dDNOw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/architect": "0.2000.0",
- "@angular-devkit/core": "20.0.0",
- "@angular-devkit/schematics": "20.0.0",
+ "@angular-devkit/architect": "0.2000.1",
+ "@angular-devkit/core": "20.0.1",
+ "@angular-devkit/schematics": "20.0.1",
"@inquirer/prompts": "7.5.1",
"@listr2/prompt-adapter-inquirer": "2.0.22",
- "@schematics/angular": "20.0.0",
+ "@schematics/angular": "20.0.1",
"@yarnpkg/lockfile": "1.1.0",
"ini": "5.0.0",
"jsonc-parser": "3.3.1",
@@ -314,9 +314,9 @@
}
},
"node_modules/@angular/common": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.0.0.tgz",
- "integrity": "sha512-tZTvxDjx+wH74/hIpip63u4tlaXNVXkq1iVf4gk7RPQGCAYLNPDWma8X+RpXMXWikn4/mA5NS1VBBtStTbS+gg==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.0.1.tgz",
+ "integrity": "sha512-Pim+2VSRh2etw/ElsGFKnZy1/8ZTrvwlWM2G9TB0oqCaAlsT1WQBwGDMpG/W0obFOFMrs7R5DiB5NCQv6RbH7A==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -325,14 +325,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/core": "20.0.0",
+ "@angular/core": "20.0.1",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.0.0.tgz",
- "integrity": "sha512-RzS7MFNy/f8Tft0u6Q1zszzFTeki4408zsBALwmS91a8O8x/jaEvfwA7swC7RiqiX9KKmAyuBJ0qiv42v1T5dA==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.0.1.tgz",
+ "integrity": "sha512-JIpbJeapf9NzAGX9NbZg6dMAN3yqShT105vSpmEqGWe5Hi7r7cU1+89KbTt2fb0PlQWxVSZK7dglNahJj0IKXA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -342,9 +342,9 @@
}
},
"node_modules/@angular/compiler-cli": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.0.0.tgz",
- "integrity": "sha512-dPFp/YyRJkiyppnoI85mZz0CJv0ulc5MpJV16Lx0qdrRyoKmBrGmdaGEP0DOhhBLVAmJ5J2wvShvWfE2pjMMWw==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.0.1.tgz",
+ "integrity": "sha512-A3OZkxg5qbzjTFWkzqU1MD4JR68sRSydaq3dRctU5tdP1RCGYtVlYx4CYcS2VdtdaQB88IeP1o5lLBmFvTge7Q==",
"license": "MIT",
"dependencies": {
"@babel/core": "7.27.1",
@@ -354,7 +354,7 @@
"reflect-metadata": "^0.2.0",
"semver": "^7.0.0",
"tslib": "^2.3.0",
- "yargs": "^17.2.1"
+ "yargs": "^18.0.0"
},
"bin": {
"ng-xi18n": "bundles/src/bin/ng_xi18n.js",
@@ -364,7 +364,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/compiler": "20.0.0",
+ "@angular/compiler": "20.0.1",
"typescript": ">=5.8 <5.9"
},
"peerDependenciesMeta": {
@@ -373,10 +373,67 @@
}
}
},
+ "node_modules/@angular/compiler-cli/node_modules/cliui": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
+ "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^7.2.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@angular/compiler-cli/node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@angular/compiler-cli/node_modules/yargs": {
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz",
+ "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^9.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "string-width": "^7.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^22.0.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
+ "node_modules/@angular/compiler-cli/node_modules/yargs-parser": {
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
+ "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
+ "license": "ISC",
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
"node_modules/@angular/core": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.0.0.tgz",
- "integrity": "sha512-2UjKbTtYSY8omY+LE4G6hQ1/R4PkE6NY7/2u99TxLH/oOnc9broCH1g9ITU+n0eJURcOFeK0/w6RdSrK+di3pg==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.0.1.tgz",
+ "integrity": "sha512-RbcVUV0fCYprbtBl8m3ihRJI9bdmrA3um/IWlC+Ix+sLdTdUd6AnBDKKQ6D+bBJjDGZmiBJVsswXJZ2o3wA23g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -385,7 +442,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/compiler": "20.0.0",
+ "@angular/compiler": "20.0.1",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0"
},
@@ -399,9 +456,9 @@
}
},
"node_modules/@angular/forms": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.0.0.tgz",
- "integrity": "sha512-6yeb99IrNyeyj7o0bbd+n3JTZrXX2dJfdYLJH3tlXVlO9wg63bq+YR1AeM+RDCYMs+YDJis0lQpF6s+OICJv4g==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.0.1.tgz",
+ "integrity": "sha512-wCLVjik83diKZRSHh4UpdkDeJQkcjLq1MyXTOpYI2Gad3PS6NFdSpojfup5XPcipXqAe8/KpsQyAWNGxiMmDvw==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -410,16 +467,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.0",
- "@angular/core": "20.0.0",
- "@angular/platform-browser": "20.0.0",
+ "@angular/common": "20.0.1",
+ "@angular/core": "20.0.1",
+ "@angular/platform-browser": "20.0.1",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/language-service": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-20.0.0.tgz",
- "integrity": "sha512-lprUUz56dk3ORWGD6Z7Hmzo2MqxezW5qXaxpJHOow3+8/Jx6q+PPWCZrFSEyTtaKr/oRGzHLVCEzB+tmB980Fw==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-20.0.1.tgz",
+ "integrity": "sha512-ijSUEKO3Z21FvdBBfEv8T3Fs871RsPEz6w/mURJdGAj9AdYsUSvARFacOw8ZTHsVLZaW9OMS3Q07a9/YFzXTgA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -427,15 +484,15 @@
}
},
"node_modules/@angular/localize": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-20.0.0.tgz",
- "integrity": "sha512-sGu8QA2lj/4soCRhK1LtWc5yhBPPfb/7M+3p+jUgzPiO5ZaeDjvi/NLwJjIlBkUAfTVpRxADLJjAziRGar5gtw==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-20.0.1.tgz",
+ "integrity": "sha512-N9vuTuH1hsM7pJIk4TUgvxMRgYCMHW7zPKChDUu1muCqDW88NLRQwxBiN1M2zZpis218Gf+QM13k6mwptlrHsQ==",
"license": "MIT",
"dependencies": {
"@babel/core": "7.27.1",
"@types/babel__core": "7.20.5",
"tinyglobby": "^0.2.12",
- "yargs": "^17.2.1"
+ "yargs": "^18.0.0"
},
"bin": {
"localize-extract": "tools/bundles/src/extract/cli.js",
@@ -446,14 +503,71 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/compiler": "20.0.0",
- "@angular/compiler-cli": "20.0.0"
+ "@angular/compiler": "20.0.1",
+ "@angular/compiler-cli": "20.0.1"
+ }
+ },
+ "node_modules/@angular/localize/node_modules/cliui": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
+ "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^7.2.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@angular/localize/node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@angular/localize/node_modules/yargs": {
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz",
+ "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^9.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "string-width": "^7.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^22.0.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
+ "node_modules/@angular/localize/node_modules/yargs-parser": {
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
+ "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
+ "license": "ISC",
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
}
},
"node_modules/@angular/platform-browser": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.0.0.tgz",
- "integrity": "sha512-FP9YjT2beF0tov0wub6+eUQqJd2MwyYqEQQ6+Qx67ukd04plIryhrcImORehrsN24DbnHkyTqhCvUyNAZs2uwA==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.0.1.tgz",
+ "integrity": "sha512-mQ/Zh68Vn7oAq2dkKSW0XcFd0aZXF/+QJhI4m9/7OaJNt+bCvgsV2zimTZTt05e9+kkW25JEQtlaEyaLOV861w==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -462,9 +576,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/animations": "20.0.0",
- "@angular/common": "20.0.0",
- "@angular/core": "20.0.0"
+ "@angular/animations": "20.0.1",
+ "@angular/common": "20.0.1",
+ "@angular/core": "20.0.1"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -473,9 +587,9 @@
}
},
"node_modules/@angular/platform-browser-dynamic": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.0.0.tgz",
- "integrity": "sha512-AACq3Ijuq59SdLDmfxWU8hYlo8O4Br9OHWNAga2W0X6p/7HlpeZZVdTlb/KGVYRKJvGpgSB10QYlRPfm215q9Q==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.0.1.tgz",
+ "integrity": "sha512-vsAgU+srKzxWFozEPeSD1AJjnjdmpDvc+5E2lQmKcI/D0Zq4rn3lKIYLAyUaF8umvbutHGCrP8Y+yyMYFCL0ig==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -484,16 +598,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.0",
- "@angular/compiler": "20.0.0",
- "@angular/core": "20.0.0",
- "@angular/platform-browser": "20.0.0"
+ "@angular/common": "20.0.1",
+ "@angular/compiler": "20.0.1",
+ "@angular/core": "20.0.1",
+ "@angular/platform-browser": "20.0.1"
}
},
"node_modules/@angular/router": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.0.0.tgz",
- "integrity": "sha512-RQ7rU4NaZDSvvOfMZQmB50q7de+jrHYb+f0ExLKBvr80B1MK3oc9VvI2BzBkGfM4aGx71MMa0UizjOiT/31kqw==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.0.1.tgz",
+ "integrity": "sha512-7KoR5krVPXdbRYYBDF+SMIee+USh4Vb4wfISeXalPm86RkcaGAQ71NWJ292WTDvvJg/zBb0Mq39rMAETEdxpkg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -502,9 +616,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.0",
- "@angular/core": "20.0.0",
- "@angular/platform-browser": "20.0.0",
+ "@angular/common": "20.0.1",
+ "@angular/core": "20.0.1",
+ "@angular/platform-browser": "20.0.1",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
@@ -535,9 +649,9 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.27.3",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz",
- "integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==",
+ "version": "7.27.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz",
+ "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -589,12 +703,12 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.27.3",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz",
- "integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==",
+ "version": "7.27.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz",
+ "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.27.3",
+ "@babel/parser": "^7.27.5",
"@babel/types": "^7.27.3",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
@@ -726,9 +840,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.27.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.4.tgz",
- "integrity": "sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==",
+ "version": "7.27.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz",
+ "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.27.3"
@@ -1258,9 +1372,9 @@
}
},
"node_modules/@homebridge/plugin-ui-utils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@homebridge/plugin-ui-utils/-/plugin-ui-utils-2.0.2.tgz",
- "integrity": "sha512-2o81veVuJ09GSm/epnw8Mn6CLpyqdqV7AclHt3psTYyaKdwNw3cGLpEyEteVNBwOU/ChMDNMNzJpeQ8pvlLojg==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@homebridge/plugin-ui-utils/-/plugin-ui-utils-2.1.0.tgz",
+ "integrity": "sha512-tv395ATHOk79PHtnpK7xT642B2vGugGXhNv+4MY0J+tPaq+5yLkZAgOErxP7v8Z36xzsN9MEit6uPL52dzhaRQ==",
"dev": true,
"license": "MIT"
},
@@ -3118,14 +3232,14 @@
]
},
"node_modules/@schematics/angular": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.0.0.tgz",
- "integrity": "sha512-lK5TvxEoeaoPnxM31qeNWhHUJ3kKMnRHknYhOfOmS8xfme78nS01FdU7TODLkg2p4GNEVVtXoxhj3FmrG3srKw==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.0.1.tgz",
+ "integrity": "sha512-29T9vUAjZnbXM+vImIQcdqG/ibdcfj5+pybo5cbiMSwVPVyerXgnD0HKC4dyZ34V2RFZa8cmyCLe/5bYoPQ+0g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "20.0.0",
- "@angular-devkit/schematics": "20.0.0",
+ "@angular-devkit/core": "20.0.1",
+ "@angular-devkit/schematics": "20.0.1",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -3531,7 +3645,6 @@
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -3544,7 +3657,6 @@
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -3862,9 +3974,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001720",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001720.tgz",
- "integrity": "sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==",
+ "version": "1.0.30001721",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz",
+ "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==",
"funding": [
{
"type": "opencollective",
@@ -4014,6 +4126,7 @@
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
@@ -4028,6 +4141,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -4037,6 +4151,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
@@ -4052,12 +4167,14 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
"license": "MIT"
},
"node_modules/cliui/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -4067,6 +4184,7 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
@@ -4081,6 +4199,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
@@ -4093,6 +4212,7 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
@@ -4452,9 +4572,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
- "version": "1.5.161",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.161.tgz",
- "integrity": "sha512-hwtetwfKNZo/UlwHIVBlKZVdy7o8bIZxxKs0Mv/ROPiQQQmDgdm5a+KvKtBsxM8ZjFzTaCeLoodZ8jiBE3o9rA==",
+ "version": "1.5.165",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz",
+ "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==",
"license": "ISC"
},
"node_modules/emoji-datasource": {
@@ -4476,7 +4596,6 @@
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
"integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
- "dev": true,
"license": "MIT"
},
"node_modules/encoding": {
@@ -4922,7 +5041,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
"integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
@@ -7789,7 +7907,6 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^10.3.0",
@@ -7863,7 +7980,6 @@
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^6.0.1"
@@ -8657,6 +8773,7 @@
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
@@ -8675,6 +8792,7 @@
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
"license": "ISC",
"engines": {
"node": ">=12"
@@ -8684,6 +8802,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -8693,12 +8812,14 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
"license": "MIT"
},
"node_modules/yargs/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -8708,6 +8829,7 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
@@ -8722,6 +8844,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
diff --git a/ui/package.json b/ui/package.json
index b517a7b4c..39b8e021a 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -12,15 +12,15 @@
"postinstall": "patch-package"
},
"dependencies": {
- "@angular/animations": "20.0.0",
- "@angular/common": "20.0.0",
- "@angular/compiler": "20.0.0",
- "@angular/core": "20.0.0",
- "@angular/forms": "20.0.0",
- "@angular/localize": "20.0.0",
- "@angular/platform-browser": "20.0.0",
- "@angular/platform-browser-dynamic": "20.0.0",
- "@angular/router": "20.0.0",
+ "@angular/animations": "20.0.1",
+ "@angular/common": "20.0.1",
+ "@angular/compiler": "20.0.1",
+ "@angular/core": "20.0.1",
+ "@angular/forms": "20.0.1",
+ "@angular/localize": "20.0.1",
+ "@angular/platform-browser": "20.0.1",
+ "@angular/platform-browser-dynamic": "20.0.1",
+ "@angular/router": "20.0.1",
"@auth0/angular-jwt": "5.2.0",
"@homebridge/hap-client": "2.2.0",
"@ng-bootstrap/ng-bootstrap": "18.0.0",
@@ -57,12 +57,12 @@
"zone.js": "0.15.1"
},
"devDependencies": {
- "@angular/build": "^20.0.0",
- "@angular/cli": "^20.0.0",
- "@angular/compiler-cli": "^20.0.0",
- "@angular/language-service": "^20.0.0",
+ "@angular/build": "^20.0.1",
+ "@angular/cli": "^20.0.1",
+ "@angular/compiler-cli": "^20.0.1",
+ "@angular/language-service": "^20.0.1",
"@fortawesome/fontawesome-free": "^6.7.2",
- "@homebridge/plugin-ui-utils": "^2.0.2",
+ "@homebridge/plugin-ui-utils": "^2.1.0",
"@types/emoji-js": "^3.5.2",
"@types/file-saver": "^2.0.7",
"@types/lodash-es": "^4.17.12",
@@ -75,10 +75,10 @@
"typescript": "^5.8.3"
},
"overrides": {
- "@angular/animations": "20.0.0",
- "@angular/common": "20.0.0",
- "@angular/core": "20.0.0",
- "@angular/forms": "20.0.0",
- "@angular/localize": "20.0.0"
+ "@angular/animations": "20.0.1",
+ "@angular/common": "20.0.1",
+ "@angular/core": "20.0.1",
+ "@angular/forms": "20.0.1",
+ "@angular/localize": "20.0.1"
}
}
diff --git a/ui/src/app/core/accessories/types/airpurifier/airpurifier.manage.component.ts b/ui/src/app/core/accessories/types/airpurifier/airpurifier.manage.component.ts
index 1ed118bd6..25f1f9905 100644
--- a/ui/src/app/core/accessories/types/airpurifier/airpurifier.manage.component.ts
+++ b/ui/src/app/core/accessories/types/airpurifier/airpurifier.manage.component.ts
@@ -5,7 +5,7 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { TranslatePipe } from '@ngx-translate/core'
import { NouisliderComponent } from 'ng2-nouislider'
import { Subject } from 'rxjs'
-import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
+import { debounceTime } from 'rxjs/operators'
import { ServiceTypeX } from '@/app/core/accessories/accessories.interfaces'
@@ -34,10 +34,7 @@ export class AirpurifierManageComponent implements OnInit {
constructor() {
this.targetRotationSpeedChanged
- .pipe(
- debounceTime(300),
- distinctUntilChanged(),
- )
+ .pipe(debounceTime(500))
.subscribe(() => {
this.service.getCharacteristic('RotationSpeed').setValue(this.targetRotationSpeed.value)
diff --git a/ui/src/app/core/accessories/types/door/door.manage.component.ts b/ui/src/app/core/accessories/types/door/door.manage.component.ts
index 12dac86cf..8251eb37b 100644
--- a/ui/src/app/core/accessories/types/door/door.manage.component.ts
+++ b/ui/src/app/core/accessories/types/door/door.manage.component.ts
@@ -4,7 +4,7 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { TranslatePipe } from '@ngx-translate/core'
import { NouisliderComponent } from 'ng2-nouislider'
import { Subject } from 'rxjs'
-import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
+import { debounceTime } from 'rxjs/operators'
import { ServiceTypeX } from '@/app/core/accessories/accessories.interfaces'
@@ -35,10 +35,7 @@ export class DoorManageComponent implements OnInit {
constructor() {
this.targetPositionChanged
- .pipe(
- debounceTime(300),
- distinctUntilChanged(),
- )
+ .pipe(debounceTime(500))
.subscribe(() => {
if (this.service.getCharacteristic('CurrentPosition').value < this.targetPosition.value) {
this.service.values.PositionState = 1
diff --git a/ui/src/app/core/accessories/types/fan/fan.manage.component.ts b/ui/src/app/core/accessories/types/fan/fan.manage.component.ts
index 26792ffa9..c7c4bc102 100644
--- a/ui/src/app/core/accessories/types/fan/fan.manage.component.ts
+++ b/ui/src/app/core/accessories/types/fan/fan.manage.component.ts
@@ -5,7 +5,7 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { TranslatePipe } from '@ngx-translate/core'
import { NouisliderComponent } from 'ng2-nouislider'
import { Subject } from 'rxjs'
-import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
+import { debounceTime } from 'rxjs/operators'
import { ServiceTypeX } from '@/app/core/accessories/accessories.interfaces'
@@ -32,10 +32,7 @@ export class FanManageComponent implements OnInit {
constructor() {
this.targetRotationSpeedChanged
- .pipe(
- debounceTime(300),
- distinctUntilChanged(),
- )
+ .pipe(debounceTime(500))
.subscribe(() => {
this.service.getCharacteristic('RotationSpeed').setValue(this.targetRotationSpeed.value)
diff --git a/ui/src/app/core/accessories/types/fanv2/fanv2.manage.component.ts b/ui/src/app/core/accessories/types/fanv2/fanv2.manage.component.ts
index 10745e6f6..b5967ffb1 100644
--- a/ui/src/app/core/accessories/types/fanv2/fanv2.manage.component.ts
+++ b/ui/src/app/core/accessories/types/fanv2/fanv2.manage.component.ts
@@ -5,7 +5,7 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { TranslatePipe } from '@ngx-translate/core'
import { NouisliderComponent } from 'ng2-nouislider'
import { Subject } from 'rxjs'
-import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
+import { debounceTime } from 'rxjs/operators'
import { ServiceTypeX } from '@/app/core/accessories/accessories.interfaces'
@@ -32,10 +32,7 @@ export class Fanv2ManageComponent implements OnInit {
constructor() {
this.targetRotationSpeedChanged
- .pipe(
- debounceTime(300),
- distinctUntilChanged(),
- )
+ .pipe(debounceTime(500))
.subscribe(() => {
this.service.getCharacteristic('RotationSpeed').setValue(this.targetRotationSpeed.value)
diff --git a/ui/src/app/core/accessories/types/heatercooler/heatercooler.manage.component.ts b/ui/src/app/core/accessories/types/heatercooler/heatercooler.manage.component.ts
index 991c39d52..ce1302ae2 100644
--- a/ui/src/app/core/accessories/types/heatercooler/heatercooler.manage.component.ts
+++ b/ui/src/app/core/accessories/types/heatercooler/heatercooler.manage.component.ts
@@ -46,7 +46,7 @@ export class HeaterCoolerManageComponent implements OnInit {
constructor() {
this.targetTemperatureChanged
- .pipe(debounceTime(300))
+ .pipe(debounceTime(500))
.subscribe(() => {
if (this.HeatingThresholdTemperature) {
this.service.getCharacteristic('HeatingThresholdTemperature').setValue(this.targetHeatingTemp)
diff --git a/ui/src/app/core/accessories/types/humidifierdehumidifier/humidifierdehumidifier.manage.component.ts b/ui/src/app/core/accessories/types/humidifierdehumidifier/humidifierdehumidifier.manage.component.ts
index 548367c6e..f7761285c 100644
--- a/ui/src/app/core/accessories/types/humidifierdehumidifier/humidifierdehumidifier.manage.component.ts
+++ b/ui/src/app/core/accessories/types/humidifierdehumidifier/humidifierdehumidifier.manage.component.ts
@@ -40,7 +40,7 @@ export class HumidifierDehumidifierManageComponent implements OnInit {
constructor() {
this.targetHumidityChanged
- .pipe(debounceTime(300))
+ .pipe(debounceTime(500))
.subscribe(() => {
if (this.RelativeHumidityHumidifierThreshold) {
this.service.getCharacteristic('RelativeHumidityHumidifierThreshold').setValue(this.targetHumidifierHumidity)
diff --git a/ui/src/app/core/accessories/types/lightbulb/lightbulb.manage.component.ts b/ui/src/app/core/accessories/types/lightbulb/lightbulb.manage.component.ts
index 0e2f553fa..a45f31d88 100644
--- a/ui/src/app/core/accessories/types/lightbulb/lightbulb.manage.component.ts
+++ b/ui/src/app/core/accessories/types/lightbulb/lightbulb.manage.component.ts
@@ -5,7 +5,7 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { TranslatePipe } from '@ngx-translate/core'
import { NouisliderComponent } from 'ng2-nouislider'
import { BehaviorSubject, Subject } from 'rxjs'
-import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
+import { debounceTime } from 'rxjs/operators'
import { ServiceTypeX } from '@/app/core/accessories/accessories.interfaces'
@@ -39,10 +39,7 @@ export class LightbulbManageComponent implements OnInit {
constructor() {
this.targetBrightnessChanged
- .pipe(
- debounceTime(300),
- distinctUntilChanged(),
- )
+ .pipe(debounceTime(500))
.subscribe(() => {
this.service.getCharacteristic('Brightness').setValue(this.targetBrightness.value)
@@ -57,10 +54,7 @@ export class LightbulbManageComponent implements OnInit {
})
this.targetHueChanged
- .pipe(
- debounceTime(300),
- distinctUntilChanged(),
- )
+ .pipe(debounceTime(500))
.subscribe(() => {
this.service.getCharacteristic('Hue').setValue(this.targetHue.value)
if (this.service.values.Saturation !== 100) {
@@ -71,7 +65,6 @@ export class LightbulbManageComponent implements OnInit {
this.targetColorTemperatureChanged
.pipe(
debounceTime(500),
- distinctUntilChanged(),
)
.subscribe(() => {
this.service.getCharacteristic('ColorTemperature').setValue(this.kelvinToMired(this.targetColorTemperature.value))
diff --git a/ui/src/app/core/accessories/types/speaker/speaker.manage.component.ts b/ui/src/app/core/accessories/types/speaker/speaker.manage.component.ts
index 856423ddb..533a42c94 100644
--- a/ui/src/app/core/accessories/types/speaker/speaker.manage.component.ts
+++ b/ui/src/app/core/accessories/types/speaker/speaker.manage.component.ts
@@ -5,7 +5,7 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { TranslatePipe } from '@ngx-translate/core'
import { NouisliderComponent } from 'ng2-nouislider'
import { Subject } from 'rxjs'
-import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
+import { debounceTime } from 'rxjs/operators'
import { ServiceTypeX } from '@/app/core/accessories/accessories.interfaces'
@@ -32,10 +32,7 @@ export class SpeakerManageComponent implements OnInit {
constructor() {
this.targetVolumeChanged
- .pipe(
- debounceTime(300),
- distinctUntilChanged(),
- )
+ .pipe(debounceTime(500))
.subscribe(() => {
this.service.getCharacteristic('Volume').setValue(this.targetVolume.value)
})
diff --git a/ui/src/app/core/accessories/types/thermostat/thermostat.manage.component.ts b/ui/src/app/core/accessories/types/thermostat/thermostat.manage.component.ts
index cd7bbb749..a459483eb 100644
--- a/ui/src/app/core/accessories/types/thermostat/thermostat.manage.component.ts
+++ b/ui/src/app/core/accessories/types/thermostat/thermostat.manage.component.ts
@@ -7,7 +7,7 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { TranslatePipe } from '@ngx-translate/core'
import { NouisliderComponent } from 'ng2-nouislider'
import { Subject } from 'rxjs'
-import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
+import { debounceTime } from 'rxjs/operators'
import { ServiceTypeX } from '@/app/core/accessories/accessories.interfaces'
import { ConvertTempPipe } from '@/app/core/pipes/convert-temp.pipe'
@@ -48,16 +48,13 @@ export class ThermostatManageComponent implements OnInit {
constructor() {
this.targetTemperatureChanged
- .pipe(
- debounceTime(300),
- distinctUntilChanged(),
- )
+ .pipe(debounceTime(500))
.subscribe(() => {
this.service.getCharacteristic('TargetTemperature').setValue(this.targetTemperature.value)
})
this.targetThresholdChanged
- .pipe(debounceTime(300))
+ .pipe(debounceTime(500))
.subscribe(() => {
if (this.HeatingThresholdTemperature) {
this.service.getCharacteristic('HeatingThresholdTemperature').setValue(this.targetHeatingTemp)
diff --git a/ui/src/app/core/accessories/types/valve/valve.manage.component.ts b/ui/src/app/core/accessories/types/valve/valve.manage.component.ts
index 462f7cd7b..4df3d25ce 100644
--- a/ui/src/app/core/accessories/types/valve/valve.manage.component.ts
+++ b/ui/src/app/core/accessories/types/valve/valve.manage.component.ts
@@ -5,7 +5,7 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { TranslatePipe } from '@ngx-translate/core'
import { NouisliderComponent } from 'ng2-nouislider'
import { Subject } from 'rxjs'
-import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
+import { debounceTime } from 'rxjs/operators'
import { ServiceTypeX } from '@/app/core/accessories/accessories.interfaces'
import { DurationPipe } from '@/app/core/pipes/duration.pipe'
@@ -32,10 +32,7 @@ export class ValveManageComponent implements OnInit {
constructor() {
this.targetSetDurationChanged
- .pipe(
- debounceTime(300),
- distinctUntilChanged(),
- )
+ .pipe(debounceTime(500))
.subscribe(() => {
this.service.getCharacteristic('SetDuration').setValue(this.targetSetDuration.value)
})
diff --git a/ui/src/app/core/accessories/types/window/window.manage.component.ts b/ui/src/app/core/accessories/types/window/window.manage.component.ts
index b57cd6628..8fcdbc319 100644
--- a/ui/src/app/core/accessories/types/window/window.manage.component.ts
+++ b/ui/src/app/core/accessories/types/window/window.manage.component.ts
@@ -4,7 +4,7 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { TranslatePipe } from '@ngx-translate/core'
import { NouisliderComponent } from 'ng2-nouislider'
import { Subject } from 'rxjs'
-import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
+import { debounceTime } from 'rxjs/operators'
import { ServiceTypeX } from '@/app/core/accessories/accessories.interfaces'
@@ -35,10 +35,7 @@ export class WindowManageComponent implements OnInit {
constructor() {
this.targetPositionChanged
- .pipe(
- debounceTime(300),
- distinctUntilChanged(),
- )
+ .pipe(debounceTime(500))
.subscribe(() => {
if (this.service.getCharacteristic('CurrentPosition').value < this.targetPosition.value) {
this.service.values.PositionState = 1
diff --git a/ui/src/app/core/accessories/types/windowcovering/windowcovering.manage.component.ts b/ui/src/app/core/accessories/types/windowcovering/windowcovering.manage.component.ts
index 2d967b5a2..0a1454b29 100644
--- a/ui/src/app/core/accessories/types/windowcovering/windowcovering.manage.component.ts
+++ b/ui/src/app/core/accessories/types/windowcovering/windowcovering.manage.component.ts
@@ -4,7 +4,7 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { TranslatePipe } from '@ngx-translate/core'
import { NouisliderComponent } from 'ng2-nouislider'
import { Subject } from 'rxjs'
-import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
+import { debounceTime } from 'rxjs/operators'
import { ServiceTypeX } from '@/app/core/accessories/accessories.interfaces'
@@ -35,10 +35,7 @@ export class WindowcoveringManageComponent implements OnInit {
constructor() {
this.targetPositionChanged
- .pipe(
- debounceTime(300),
- distinctUntilChanged(),
- )
+ .pipe(debounceTime(500))
.subscribe(() => {
if (this.service.getCharacteristic('CurrentPosition').value < this.targetPosition.value) {
this.service.values.PositionState = 1
diff --git a/ui/src/app/core/manage-plugins/custom-plugins/custom-plugins.component.ts b/ui/src/app/core/manage-plugins/custom-plugins/custom-plugins.component.ts
index f8f2f69b3..6c9448869 100644
--- a/ui/src/app/core/manage-plugins/custom-plugins/custom-plugins.component.ts
+++ b/ui/src/app/core/manage-plugins/custom-plugins/custom-plugins.component.ts
@@ -192,6 +192,10 @@ export class CustomPluginsComponent implements OnInit, OnDestroy {
this.formEnd()
break
}
+ case 'user.lightingMode': {
+ this.requestResponse(e, this.$settings.actualLightingMode)
+ break
+ }
case 'i18n.lang': {
this.requestResponse(e, this.$translate.currentLang)
break
From a8925387dc9b8f85ce7103f45ea0edca40b4eda7 Mon Sep 17 00:00:00 2001
From: Ben <43026681+bwp91@users.noreply.github.com>
Date: Wed, 4 Jun 2025 20:32:42 +0100
Subject: [PATCH 09/40] improve wallpaper selection with new modal to upload a
file
---
CHANGELOG.md | 1 +
config.schema.json | 2 +-
src/core/config/config.service.ts | 36 +-
src/modules/server/server.controller.ts | 45 ++-
src/modules/server/server.service.ts | 68 +++-
test/e2e/server.e2e-spec.ts | 83 +++-
test/mocks/persist/wallpaper.png | Bin 0 -> 95 bytes
ui/package-lock.json | 365 ++++++------------
ui/src/app/core/settings.service.ts | 6 +-
ui/src/app/modules/login/login.component.html | 1 +
ui/src/app/modules/login/login.component.scss | 3 +
.../modules/settings/settings.component.html | 40 +-
.../modules/settings/settings.component.ts | 22 +-
.../app/modules/settings/settings.module.ts | 2 +
.../wallpaper/wallpaper.component.html | 74 ++++
.../wallpaper/wallpaper.component.scss | 18 +
.../settings/wallpaper/wallpaper.component.ts | 97 +++++
ui/src/i18n/bg.json | 7 +-
ui/src/i18n/ca.json | 7 +-
ui/src/i18n/cs.json | 7 +-
ui/src/i18n/de.json | 7 +-
ui/src/i18n/en.json | 7 +-
ui/src/i18n/es.json | 7 +-
ui/src/i18n/fi.json | 7 +-
ui/src/i18n/fr.json | 7 +-
ui/src/i18n/he.json | 7 +-
ui/src/i18n/hu.json | 7 +-
ui/src/i18n/id.json | 7 +-
ui/src/i18n/it.json | 7 +-
ui/src/i18n/ja.json | 7 +-
ui/src/i18n/ko.json | 7 +-
ui/src/i18n/mk.json | 7 +-
ui/src/i18n/nl.json | 7 +-
ui/src/i18n/no.json | 7 +-
ui/src/i18n/pl.json | 7 +-
ui/src/i18n/pt-BR.json | 7 +-
ui/src/i18n/pt.json | 7 +-
ui/src/i18n/ru.json | 7 +-
ui/src/i18n/sl.json | 7 +-
ui/src/i18n/sv.json | 7 +-
ui/src/i18n/th.json | 7 +-
ui/src/i18n/tr.json | 7 +-
ui/src/i18n/uk.json | 7 +-
ui/src/i18n/zh-CN.json | 7 +-
ui/src/i18n/zh-TW.json | 7 +-
45 files changed, 691 insertions(+), 368 deletions(-)
create mode 100644 test/mocks/persist/wallpaper.png
create mode 100644 ui/src/app/modules/settings/wallpaper/wallpaper.component.html
create mode 100644 ui/src/app/modules/settings/wallpaper/wallpaper.component.scss
create mode 100644 ui/src/app/modules/settings/wallpaper/wallpaper.component.ts
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 045b9fbe6..4ac48f3ef 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -23,6 +23,7 @@ All notable changes to `homebridge-config-ui-x` will be documented in this file.
- use `ajv-keywords` to allow validation of unique properties in arrays
- fix form field error state font colour (make it red)
- redesigned login page
+- improve wallpaper selection with new modal to upload a file
### Other Changes
diff --git a/config.schema.json b/config.schema.json
index 6a01af15f..bbaba9ed9 100644
--- a/config.schema.json
+++ b/config.schema.json
@@ -392,7 +392,7 @@
}
]
},
- "loginWallpaper": {
+ "wallpaper": {
"title": "Login Wallpaper Path",
"description": "The full path to the .jpg file.",
"type": "string",
diff --git a/src/core/config/config.service.ts b/src/core/config/config.service.ts
index 9402e3b71..875693fd0 100644
--- a/src/core/config/config.service.ts
+++ b/src/core/config/config.service.ts
@@ -71,7 +71,6 @@ export class ConfigService {
public setupWizardComplete = true
// Custom wallpaper
- public customWallpaperPath = resolve(this.storagePath, 'ui-wallpaper.jpg')
public customWallpaperHash: string
// Set true to force the ui to restart on next restart request
@@ -108,7 +107,7 @@ export class ConfigService {
}
temp?: string
tempUnits?: string
- loginWallpaper?: string
+ wallpaper?: string
noFork?: boolean
linux?: {
shutdown?: string
@@ -237,7 +236,7 @@ export class ConfigService {
temperatureUnits: this.ui.tempUnits || 'c',
usePnpm: this.usePnpm,
},
- loginWallpaper: this.ui.loginWallpaper,
+ wallpaper: this.ui.wallpaper,
}
}
@@ -296,7 +295,7 @@ export class ConfigService {
}
this.ui.theme = this.ui.theme || process.env.HOMEBRIDGE_CONFIG_UI_THEME || 'orange'
this.ui.auth = this.ui.auth || process.env.HOMEBRIDGE_CONFIG_UI_AUTH as 'form' | 'none' || 'form'
- this.ui.loginWallpaper = this.ui.loginWallpaper || process.env.HOMEBRIDGE_CONFIG_UI_LOGIN_WALLPAPER || undefined
+ this.ui.wallpaper = this.ui.wallpaper || process.env.HOMEBRIDGE_CONFIG_UI_LOGIN_WALLPAPER || undefined
}
/**
@@ -357,15 +356,29 @@ export class ConfigService {
*/
private async getCustomWallpaperHash(): Promise
{
try {
- const fileStat = await stat(this.ui.loginWallpaper || this.customWallpaperPath)
- const hash = createHash('sha256')
- hash.update(`${fileStat.birthtime}${fileStat.ctime}${fileStat.size}${fileStat.blocks}`)
- this.customWallpaperHash = `${hash.digest('hex')}.jpg`
+ if (this.ui.wallpaper) {
+ const filePath = resolve(this.storagePath, this.ui.wallpaper)
+ const fileStat = await stat(filePath)
+ const hash = createHash('sha256')
+ hash.update(`${fileStat.birthtime}${fileStat.ctime}${fileStat.size}${fileStat.blocks}`)
+ this.customWallpaperHash = `${hash.digest('hex')}.jpg`
+ }
} catch (e) {
// Do nothing
}
}
+ public removeWallpaperCache() {
+ this.customWallpaperHash = undefined
+ }
+
+ /**
+ * Stream the custom wallpaper
+ */
+ public streamCustomWallpaper(): ReadStream {
+ return createReadStream(resolve(this.storagePath, this.ui.wallpaper))
+ }
+
/**
* Checks to see if we are running on a Raspberry Pi
*/
@@ -376,13 +389,6 @@ export class ConfigService {
this.runningOnRaspberryPi = false
}
}
-
- /**
- * Stream the custom wallpaper
- */
- public streamCustomWallpaper(): ReadStream {
- return createReadStream(this.ui.loginWallpaper || this.customWallpaperPath)
- }
}
export interface HomebridgeConfig {
diff --git a/src/modules/server/server.controller.ts b/src/modules/server/server.controller.ts
index f3e4f55b7..395f6796e 100644
--- a/src/modules/server/server.controller.ts
+++ b/src/modules/server/server.controller.ts
@@ -1,18 +1,24 @@
+import type { FastifyRequest } from 'fastify'
+
import {
Body,
Controller,
Delete,
Get,
HttpCode,
+ InternalServerErrorException,
Param,
+ Post,
Put,
Query,
+ Req,
UseGuards,
} from '@nestjs/common'
import { AuthGuard } from '@nestjs/passport'
-import { ApiBearerAuth, ApiBody, ApiOperation, ApiParam, ApiQuery, ApiTags } from '@nestjs/swagger'
+import { ApiBearerAuth, ApiBody, ApiConsumes, ApiOperation, ApiParam, ApiQuery, ApiTags } from '@nestjs/swagger'
import { AdminGuard } from '../../core/auth/guards/admin.guard'
+import { Logger } from '../../core/logger/logger.service'
import { ChildBridgesService } from '../child-bridges/child-bridges.service'
import { HomebridgeMdnsSettingDto, HomebridgeNetworkInterfacesDto } from './server.dto'
import { ServerService } from './server.service'
@@ -25,6 +31,7 @@ export class ServerController {
constructor(
private serverService: ServerService,
private childBridgesService: ChildBridgesService,
+ private logger: Logger,
) {}
@Put('/restart')
@@ -244,4 +251,40 @@ export class ServerController {
setHomebridgePort(@Body() body: { port: number }) {
return this.serverService.setHomebridgePort(body.port)
}
+
+ @UseGuards(AdminGuard)
+ @Post('/wallpaper')
+ @ApiOperation({ summary: 'Upload an image file to the Homebridge storage directory and reference this as a wallpaper in the config file.' })
+ @ApiConsumes('multipart/form-data')
+ @ApiBody({
+ schema: {
+ type: 'object',
+ properties: {
+ file: {
+ type: 'string',
+ format: 'binary',
+ },
+ },
+ },
+ })
+ async uploadWallpaper(@Req() req: FastifyRequest) {
+ try {
+ const data = await req.file()
+ if (data.file.truncated) {
+ throw new InternalServerErrorException(`Wallpaper exceeds maximum size ${globalThis.backup.maxBackupSizeText}.`)
+ }
+ await this.serverService.uploadWallpaper(data)
+ } catch (err) {
+ this.logger.error(`Wallpaper upload failed as ${err.message}`)
+ throw new InternalServerErrorException(err.message)
+ }
+ }
+
+ @UseGuards(AdminGuard)
+ @ApiOperation({ summary: 'Delete the current wallpaper file and remove the reference from the config file.' })
+ @Delete('/wallpaper')
+ @HttpCode(204)
+ async deleteWallpaper(): Promise {
+ await this.serverService.deleteWallpaper()
+ }
}
diff --git a/src/modules/server/server.service.ts b/src/modules/server/server.service.ts
index 3e1991f7d..b5e035e89 100644
--- a/src/modules/server/server.service.ts
+++ b/src/modules/server/server.service.ts
@@ -1,9 +1,12 @@
+import type { MultipartFile } from '@fastify/multipart'
import type { Systeminformation } from 'systeminformation'
import { Buffer } from 'node:buffer'
import { exec, spawn } from 'node:child_process'
-import { join, resolve } from 'node:path'
+import { extname, join, resolve } from 'node:path'
import process from 'node:process'
+import { pipeline } from 'node:stream'
+import { promisify } from 'node:util'
import { Categories } from '@homebridge/hap-client/dist/hap-types'
import {
@@ -14,6 +17,7 @@ import {
ServiceUnavailableException,
} from '@nestjs/common'
import {
+ createWriteStream,
pathExists,
readdir,
readJson,
@@ -32,6 +36,8 @@ import { AccessoriesService } from '../accessories/accessories.service'
import { ConfigEditorService } from '../config-editor/config-editor.service'
import { HomebridgeMdnsSettingDto } from './server.dto'
+const pump = promisify(pipeline)
+
@Injectable()
export class ServerService {
private serverServiceCache = new NodeCache({ stdTTL: 300 })
@@ -701,4 +707,64 @@ export class ServerService {
})
})
}
+
+ /**
+ * Upload and set a new wallpaper. Will delete an old wallpaper if it exists.
+ * File upload handler
+ */
+ async uploadWallpaper(data: MultipartFile) {
+ // Get the config file and find the UI config block
+ const configFile = await this.configEditorService.getConfigFile()
+ const uiConfigBlock = configFile.platforms.find(x => x.platform === 'config')
+
+ if (uiConfigBlock) {
+ // Delete the old wallpaper if it exists
+ if (uiConfigBlock.wallpaper) {
+ const oldPath = join(this.configService.storagePath, uiConfigBlock.wallpaper)
+ if (await pathExists(oldPath)) {
+ try {
+ await unlink(oldPath)
+ this.logger.log(`Old wallpaper file ${oldPath} deleted successfully.`)
+ } catch (e) {
+ this.logger.error(`Failed to delete old wallpaper ${oldPath} as ${e.message}.`)
+ }
+ }
+ }
+
+ // Save the uploaded image file to the storage path
+ const fileExtension = extname(data.filename)
+ const newPath = join(this.configService.storagePath, `ui-wallpaper${fileExtension}`)
+ await pump(data.file, createWriteStream(newPath))
+
+ // Update the config file with the new wallpaper path
+ uiConfigBlock.wallpaper = `ui-wallpaper${fileExtension}`
+ await this.configEditorService.updateConfigFile(configFile)
+ this.logger.log('Wallpaper uploaded and set in the config file.')
+ }
+ }
+
+ async deleteWallpaper(): Promise {
+ // Get the config file and find the UI config block
+ const configFile = await this.configEditorService.getConfigFile()
+ const uiConfigBlock = configFile.platforms.find(x => x.platform === 'config')
+ const fullPath = join(this.configService.storagePath, uiConfigBlock.wallpaper)
+
+ // Delete the wallpaper file if it exists
+ if (uiConfigBlock && uiConfigBlock.wallpaper) {
+ if (await pathExists(fullPath)) {
+ try {
+ await unlink(fullPath)
+ this.logger.log(`Wallpaper file ${uiConfigBlock.wallpaper} deleted successfully.`)
+ } catch (e) {
+ this.logger.error(`Failed to delete wallpaper file (${uiConfigBlock.wallpaper}) as ${e.message}.`)
+ }
+ }
+
+ // Remove the wallpaper path from the config file
+ delete uiConfigBlock.wallpaper
+ await this.configEditorService.updateConfigFile(configFile)
+ this.configService.removeWallpaperCache()
+ this.logger.log('Wallpaper reference removed from the config file.')
+ }
+ }
}
diff --git a/test/e2e/server.e2e-spec.ts b/test/e2e/server.e2e-spec.ts
index 3f9316a06..321050683 100644
--- a/test/e2e/server.e2e-spec.ts
+++ b/test/e2e/server.e2e-spec.ts
@@ -6,10 +6,12 @@ import type { HomebridgeConfig } from '../../src/core/config/config.service'
import { resolve } from 'node:path'
import process from 'node:process'
+import fastifyMultipart from '@fastify/multipart'
import { ValidationPipe } from '@nestjs/common'
import { FastifyAdapter } from '@nestjs/platform-fastify'
import { Test } from '@nestjs/testing'
-import { copy, pathExists, readJson, remove, writeJson } from 'fs-extra'
+import FormData from 'form-data'
+import { copy, pathExists, readFile, readJson, remove, writeJson } from 'fs-extra'
import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'
import { AuthModule } from '../../src/core/auth/auth.module'
@@ -17,6 +19,8 @@ import { ConfigService } from '../../src/core/config/config.service'
import { ServerModule } from '../../src/modules/server/server.module'
import { ServerService } from '../../src/modules/server/server.service'
+import '../../src/globalDefaults'
+
describe('ServerController (e2e)', () => {
let app: NestFastifyApplication
@@ -49,7 +53,16 @@ describe('ServerController (e2e)', () => {
imports: [ServerModule, AuthModule],
}).compile()
- app = moduleFixture.createNestApplication(new FastifyAdapter())
+ const fAdapter = new FastifyAdapter()
+
+ fAdapter.register(fastifyMultipart, {
+ limits: {
+ files: 1,
+ fileSize: globalThis.backup.maxBackupSize,
+ },
+ })
+
+ app = moduleFixture.createNestApplication(fAdapter)
app.useGlobalPipes(new ValidationPipe({
whitelist: true,
@@ -537,6 +550,72 @@ describe('ServerController (e2e)', () => {
expect(res.json().port).toBeLessThanOrEqual(60000)
})
+ it('POST /server/wallpaper', async () => {
+ // create multipart form
+ const payload = new FormData()
+ payload.append('wallpaper', await readFile(resolve(__dirname, '../mocks/persist/wallpaper.png')), 'wallpaper.png')
+
+ const headers = payload.getHeaders()
+ headers.authorization = authorization
+
+ const res = await app.inject({
+ method: 'POST',
+ path: '/server/wallpaper',
+ headers,
+ payload,
+ })
+
+ expect(res.statusCode).toBe(201)
+
+ await new Promise(r => setTimeout(r, 100))
+
+ // Two things to ensure:
+ // 1. The wallpaper was saved to the correct location
+ const wallpaperPath = resolve(process.env.UIX_STORAGE_PATH, 'ui-wallpaper.png')
+ expect(await pathExists(wallpaperPath)).toBe(true)
+
+ // 2. The wallpaper was set in the config
+ const config = await readJson(configService.configPath)
+ expect(config.platforms[0].wallpaper).toBe('ui-wallpaper.png')
+ })
+
+ it('DELETE /server/wallpaper', async () => {
+ // Create wallpaper first (same as test above)
+ const payload = new FormData()
+ payload.append('wallpaper', await readFile(resolve(__dirname, '../mocks/persist/wallpaper.png')), 'wallpaper.png')
+
+ const headers = payload.getHeaders()
+ headers.authorization = authorization
+
+ const res = await app.inject({
+ method: 'POST',
+ path: '/server/wallpaper',
+ headers,
+ payload,
+ })
+
+ expect(res.statusCode).toBe(201)
+
+ await new Promise(r => setTimeout(r, 100))
+
+ // Now delete the wallpaper
+ const deleteRes = await app.inject({
+ method: 'DELETE',
+ path: '/server/wallpaper',
+ headers,
+ })
+
+ expect(deleteRes.statusCode).toBe(204)
+
+ // Check the wallpaper file was removed
+ const wallpaperPath = resolve(process.env.UIX_STORAGE_PATH, 'ui-wallpaper.png')
+ expect(await pathExists(wallpaperPath)).toBe(false)
+
+ // Check the config file was updated
+ const config = await readJson(configService.configPath)
+ expect(config.platforms[0].wallpaper).toBeUndefined()
+ })
+
afterAll(async () => {
await app.close()
})
diff --git a/test/mocks/persist/wallpaper.png b/test/mocks/persist/wallpaper.png
new file mode 100644
index 0000000000000000000000000000000000000000..1914264c08781d1f30ee0b8482bccf44586f2dc1
GIT binary patch
literal 95
zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga%mF?ju0VQumF+E%TuG2$FoVOh
l8)-lem#2$k2*>s01R$Gz9%CSj!PC{xWt~$(697H@6ZHT9
literal 0
HcmV?d00001
diff --git a/ui/package-lock.json b/ui/package-lock.json
index f4dd964fe..d42c5b293 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -10,15 +10,15 @@
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
- "@angular/animations": "20.0.1",
- "@angular/common": "20.0.1",
- "@angular/compiler": "20.0.1",
- "@angular/core": "20.0.1",
- "@angular/forms": "20.0.1",
- "@angular/localize": "20.0.1",
- "@angular/platform-browser": "20.0.1",
- "@angular/platform-browser-dynamic": "20.0.1",
- "@angular/router": "20.0.1",
+ "@angular/animations": "20.0.0",
+ "@angular/common": "20.0.0",
+ "@angular/compiler": "20.0.0",
+ "@angular/core": "20.0.0",
+ "@angular/forms": "20.0.0",
+ "@angular/localize": "20.0.0",
+ "@angular/platform-browser": "20.0.0",
+ "@angular/platform-browser-dynamic": "20.0.0",
+ "@angular/router": "20.0.0",
"@auth0/angular-jwt": "5.2.0",
"@homebridge/hap-client": "2.2.0",
"@ng-bootstrap/ng-bootstrap": "18.0.0",
@@ -55,10 +55,10 @@
"zone.js": "0.15.1"
},
"devDependencies": {
- "@angular/build": "^20.0.1",
- "@angular/cli": "^20.0.1",
- "@angular/compiler-cli": "^20.0.1",
- "@angular/language-service": "^20.0.1",
+ "@angular/build": "^20.0.0",
+ "@angular/cli": "^20.0.0",
+ "@angular/compiler-cli": "^20.0.0",
+ "@angular/language-service": "^20.0.0",
"@fortawesome/fontawesome-free": "^6.7.2",
"@homebridge/plugin-ui-utils": "^2.1.0",
"@types/emoji-js": "^3.5.2",
@@ -87,13 +87,13 @@
}
},
"node_modules/@angular-devkit/architect": {
- "version": "0.2000.1",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2000.1.tgz",
- "integrity": "sha512-EcOGU1xEhARYpDF391VaeUg/+YRym9OxzJMcc0rSHl3YLK8/m+24ap2YAQY5N7n9+mmEqHVu/q31ldFpOoMCTw==",
+ "version": "0.2000.0",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2000.0.tgz",
+ "integrity": "sha512-6accOuvf1BY6hTO5LzYcxp2Dpl0bThgYF3KdwVWqrYF5+6PWfQLdy+rKxBiCIv0+0OngZVI79RuAtUKFowFM/A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "20.0.1",
+ "@angular-devkit/core": "20.0.0",
"rxjs": "7.8.2"
},
"engines": {
@@ -103,9 +103,9 @@
}
},
"node_modules/@angular-devkit/core": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.1.tgz",
- "integrity": "sha512-Ilafyj8JVwq3NZsaiGw5UDkP4EAkGKiEvZ4TC3WVidZbM4EpKt9/Jd7ZpsTRGDLG429U+fGhay+ZQeCFGqy5rA==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.0.tgz",
+ "integrity": "sha512-cnB/I1QQC3WoIcb+f/7hknOOkgIFjAuxd7nW1RnS+pn0qQTWyjnXjq2jocx2TBMwZRikycc7f3mlA1DgWzJUuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -131,13 +131,13 @@
}
},
"node_modules/@angular-devkit/schematics": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.0.1.tgz",
- "integrity": "sha512-bSr/5YIdjtwKYqylkYrlOVP+tuFz+tfOldmLfWHAsDGnJUznb5t4ckx6yyROp+iDQfu2Aez09p+l4KfUBq+H9A==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.0.0.tgz",
+ "integrity": "sha512-35WbWP8ARnaqVjOzy7IOyWsY/jeyUqfVj4KgHG2O4fHAhIhaBqhP8dDDP+SwM+bToIqklg0fzHUUhFTRxzzyoQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "20.0.1",
+ "@angular-devkit/core": "20.0.0",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.17",
"ora": "8.2.0",
@@ -150,9 +150,9 @@
}
},
"node_modules/@angular/animations": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.0.1.tgz",
- "integrity": "sha512-wBEiZakiDe7YLMhsra4VszVejYSATHwTOaSW0qr21rBgjiy7+zE7hfqOcnb46P35AlH8mivkMSl2dc+k28dWDQ==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.0.0.tgz",
+ "integrity": "sha512-yU4hUH6AheY0dnMSaLRMfgnXhg/JUSUvrhE+lHzIiSKdEf0lyo1Ri6bkPD1CbamxZ94BqhRNCApvbvTbibGICQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -161,19 +161,19 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.1",
- "@angular/core": "20.0.1"
+ "@angular/common": "20.0.0",
+ "@angular/core": "20.0.0"
}
},
"node_modules/@angular/build": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.0.1.tgz",
- "integrity": "sha512-m/0jtXIeOaoU/WXtMLRuvq7UaGRxNHpoRKVVoJrifvZuNBYGM4e2lzxlIlo8kiQhPpZQc0zcAMoosbmzKKdkUQ==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.0.0.tgz",
+ "integrity": "sha512-b/FAvvUbsMEgr+UlvTtDz4NCv+BFi+55swtKRmaritvZ2rDfhF1x9tUmSkT6GebGXkI/Gg0kl5rJoD5iv5lY3A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
- "@angular-devkit/architect": "0.2000.1",
+ "@angular-devkit/architect": "0.2000.0",
"@babel/core": "7.27.1",
"@babel/helper-annotate-as-pure": "7.27.1",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -215,7 +215,7 @@
"@angular/platform-browser": "^20.0.0",
"@angular/platform-server": "^20.0.0",
"@angular/service-worker": "^20.0.0",
- "@angular/ssr": "^20.0.1",
+ "@angular/ssr": "^20.0.0",
"karma": "^6.4.0",
"less": "^4.2.0",
"ng-packagr": "^20.0.0",
@@ -265,9 +265,9 @@
}
},
"node_modules/@angular/cdk": {
- "version": "20.0.2",
- "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.0.2.tgz",
- "integrity": "sha512-gRQcpTNhnwBxXSmpnrljODUHQmB2Hnxc6L2Ad6mSMV+c3opd9KIFxL5eG2WOOPHGAaPrV4gNFw+t1i01U4grTg==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.0.1.tgz",
+ "integrity": "sha512-llJIyKdF9D0hJ9/PNy9A5vmayNgHr7MtQrtjpeLyPuK8qkUnxQd9Hzv5olqixRrbxxDs/Lt0l1T2ViHGy7WYhg==",
"license": "MIT",
"peer": true,
"dependencies": {
@@ -281,18 +281,18 @@
}
},
"node_modules/@angular/cli": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.0.1.tgz",
- "integrity": "sha512-OU91byvG/WsDDUVmXIJr3/sU89U6g8G8IXrqgVRVPgjXKEQMnUNBlmygD2rMUR5C02g2lGc6s2j0hnOJ/dDNOw==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.0.0.tgz",
+ "integrity": "sha512-k9EDaaLYTMWkBbayUh6Tf0PJ+E0e6jRPrjOSPsOJHRh+S5BsNdLIsKJmThGXkq2wnD35+2CKPy9UQyvfaIA5KQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/architect": "0.2000.1",
- "@angular-devkit/core": "20.0.1",
- "@angular-devkit/schematics": "20.0.1",
+ "@angular-devkit/architect": "0.2000.0",
+ "@angular-devkit/core": "20.0.0",
+ "@angular-devkit/schematics": "20.0.0",
"@inquirer/prompts": "7.5.1",
"@listr2/prompt-adapter-inquirer": "2.0.22",
- "@schematics/angular": "20.0.1",
+ "@schematics/angular": "20.0.0",
"@yarnpkg/lockfile": "1.1.0",
"ini": "5.0.0",
"jsonc-parser": "3.3.1",
@@ -314,9 +314,9 @@
}
},
"node_modules/@angular/common": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.0.1.tgz",
- "integrity": "sha512-Pim+2VSRh2etw/ElsGFKnZy1/8ZTrvwlWM2G9TB0oqCaAlsT1WQBwGDMpG/W0obFOFMrs7R5DiB5NCQv6RbH7A==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.0.0.tgz",
+ "integrity": "sha512-tZTvxDjx+wH74/hIpip63u4tlaXNVXkq1iVf4gk7RPQGCAYLNPDWma8X+RpXMXWikn4/mA5NS1VBBtStTbS+gg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -325,14 +325,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/core": "20.0.1",
+ "@angular/core": "20.0.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.0.1.tgz",
- "integrity": "sha512-JIpbJeapf9NzAGX9NbZg6dMAN3yqShT105vSpmEqGWe5Hi7r7cU1+89KbTt2fb0PlQWxVSZK7dglNahJj0IKXA==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.0.0.tgz",
+ "integrity": "sha512-RzS7MFNy/f8Tft0u6Q1zszzFTeki4408zsBALwmS91a8O8x/jaEvfwA7swC7RiqiX9KKmAyuBJ0qiv42v1T5dA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -342,9 +342,9 @@
}
},
"node_modules/@angular/compiler-cli": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.0.1.tgz",
- "integrity": "sha512-A3OZkxg5qbzjTFWkzqU1MD4JR68sRSydaq3dRctU5tdP1RCGYtVlYx4CYcS2VdtdaQB88IeP1o5lLBmFvTge7Q==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.0.0.tgz",
+ "integrity": "sha512-dPFp/YyRJkiyppnoI85mZz0CJv0ulc5MpJV16Lx0qdrRyoKmBrGmdaGEP0DOhhBLVAmJ5J2wvShvWfE2pjMMWw==",
"license": "MIT",
"dependencies": {
"@babel/core": "7.27.1",
@@ -354,7 +354,7 @@
"reflect-metadata": "^0.2.0",
"semver": "^7.0.0",
"tslib": "^2.3.0",
- "yargs": "^18.0.0"
+ "yargs": "^17.2.1"
},
"bin": {
"ng-xi18n": "bundles/src/bin/ng_xi18n.js",
@@ -364,7 +364,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/compiler": "20.0.1",
+ "@angular/compiler": "20.0.0",
"typescript": ">=5.8 <5.9"
},
"peerDependenciesMeta": {
@@ -373,67 +373,10 @@
}
}
},
- "node_modules/@angular/compiler-cli/node_modules/cliui": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
- "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
- "license": "ISC",
- "dependencies": {
- "string-width": "^7.2.0",
- "strip-ansi": "^7.1.0",
- "wrap-ansi": "^9.0.0"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/@angular/compiler-cli/node_modules/wrap-ansi": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
- "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^6.2.1",
- "string-width": "^7.0.0",
- "strip-ansi": "^7.1.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/@angular/compiler-cli/node_modules/yargs": {
- "version": "18.0.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz",
- "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==",
- "license": "MIT",
- "dependencies": {
- "cliui": "^9.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "string-width": "^7.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^22.0.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=23"
- }
- },
- "node_modules/@angular/compiler-cli/node_modules/yargs-parser": {
- "version": "22.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
- "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
- "license": "ISC",
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=23"
- }
- },
"node_modules/@angular/core": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.0.1.tgz",
- "integrity": "sha512-RbcVUV0fCYprbtBl8m3ihRJI9bdmrA3um/IWlC+Ix+sLdTdUd6AnBDKKQ6D+bBJjDGZmiBJVsswXJZ2o3wA23g==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.0.0.tgz",
+ "integrity": "sha512-2UjKbTtYSY8omY+LE4G6hQ1/R4PkE6NY7/2u99TxLH/oOnc9broCH1g9ITU+n0eJURcOFeK0/w6RdSrK+di3pg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -442,7 +385,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/compiler": "20.0.1",
+ "@angular/compiler": "20.0.0",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0"
},
@@ -456,9 +399,9 @@
}
},
"node_modules/@angular/forms": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.0.1.tgz",
- "integrity": "sha512-wCLVjik83diKZRSHh4UpdkDeJQkcjLq1MyXTOpYI2Gad3PS6NFdSpojfup5XPcipXqAe8/KpsQyAWNGxiMmDvw==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.0.0.tgz",
+ "integrity": "sha512-6yeb99IrNyeyj7o0bbd+n3JTZrXX2dJfdYLJH3tlXVlO9wg63bq+YR1AeM+RDCYMs+YDJis0lQpF6s+OICJv4g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -467,16 +410,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.1",
- "@angular/core": "20.0.1",
- "@angular/platform-browser": "20.0.1",
+ "@angular/common": "20.0.0",
+ "@angular/core": "20.0.0",
+ "@angular/platform-browser": "20.0.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/language-service": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-20.0.1.tgz",
- "integrity": "sha512-ijSUEKO3Z21FvdBBfEv8T3Fs871RsPEz6w/mURJdGAj9AdYsUSvARFacOw8ZTHsVLZaW9OMS3Q07a9/YFzXTgA==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-20.0.0.tgz",
+ "integrity": "sha512-lprUUz56dk3ORWGD6Z7Hmzo2MqxezW5qXaxpJHOow3+8/Jx6q+PPWCZrFSEyTtaKr/oRGzHLVCEzB+tmB980Fw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -484,15 +427,15 @@
}
},
"node_modules/@angular/localize": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-20.0.1.tgz",
- "integrity": "sha512-N9vuTuH1hsM7pJIk4TUgvxMRgYCMHW7zPKChDUu1muCqDW88NLRQwxBiN1M2zZpis218Gf+QM13k6mwptlrHsQ==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-20.0.0.tgz",
+ "integrity": "sha512-sGu8QA2lj/4soCRhK1LtWc5yhBPPfb/7M+3p+jUgzPiO5ZaeDjvi/NLwJjIlBkUAfTVpRxADLJjAziRGar5gtw==",
"license": "MIT",
"dependencies": {
"@babel/core": "7.27.1",
"@types/babel__core": "7.20.5",
"tinyglobby": "^0.2.12",
- "yargs": "^18.0.0"
+ "yargs": "^17.2.1"
},
"bin": {
"localize-extract": "tools/bundles/src/extract/cli.js",
@@ -503,71 +446,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/compiler": "20.0.1",
- "@angular/compiler-cli": "20.0.1"
- }
- },
- "node_modules/@angular/localize/node_modules/cliui": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
- "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
- "license": "ISC",
- "dependencies": {
- "string-width": "^7.2.0",
- "strip-ansi": "^7.1.0",
- "wrap-ansi": "^9.0.0"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/@angular/localize/node_modules/wrap-ansi": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
- "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^6.2.1",
- "string-width": "^7.0.0",
- "strip-ansi": "^7.1.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/@angular/localize/node_modules/yargs": {
- "version": "18.0.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz",
- "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==",
- "license": "MIT",
- "dependencies": {
- "cliui": "^9.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "string-width": "^7.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^22.0.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=23"
- }
- },
- "node_modules/@angular/localize/node_modules/yargs-parser": {
- "version": "22.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
- "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
- "license": "ISC",
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=23"
+ "@angular/compiler": "20.0.0",
+ "@angular/compiler-cli": "20.0.0"
}
},
"node_modules/@angular/platform-browser": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.0.1.tgz",
- "integrity": "sha512-mQ/Zh68Vn7oAq2dkKSW0XcFd0aZXF/+QJhI4m9/7OaJNt+bCvgsV2zimTZTt05e9+kkW25JEQtlaEyaLOV861w==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.0.0.tgz",
+ "integrity": "sha512-FP9YjT2beF0tov0wub6+eUQqJd2MwyYqEQQ6+Qx67ukd04plIryhrcImORehrsN24DbnHkyTqhCvUyNAZs2uwA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -576,9 +462,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/animations": "20.0.1",
- "@angular/common": "20.0.1",
- "@angular/core": "20.0.1"
+ "@angular/animations": "20.0.0",
+ "@angular/common": "20.0.0",
+ "@angular/core": "20.0.0"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -587,9 +473,9 @@
}
},
"node_modules/@angular/platform-browser-dynamic": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.0.1.tgz",
- "integrity": "sha512-vsAgU+srKzxWFozEPeSD1AJjnjdmpDvc+5E2lQmKcI/D0Zq4rn3lKIYLAyUaF8umvbutHGCrP8Y+yyMYFCL0ig==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.0.0.tgz",
+ "integrity": "sha512-AACq3Ijuq59SdLDmfxWU8hYlo8O4Br9OHWNAga2W0X6p/7HlpeZZVdTlb/KGVYRKJvGpgSB10QYlRPfm215q9Q==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -598,16 +484,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.1",
- "@angular/compiler": "20.0.1",
- "@angular/core": "20.0.1",
- "@angular/platform-browser": "20.0.1"
+ "@angular/common": "20.0.0",
+ "@angular/compiler": "20.0.0",
+ "@angular/core": "20.0.0",
+ "@angular/platform-browser": "20.0.0"
}
},
"node_modules/@angular/router": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.0.1.tgz",
- "integrity": "sha512-7KoR5krVPXdbRYYBDF+SMIee+USh4Vb4wfISeXalPm86RkcaGAQ71NWJ292WTDvvJg/zBb0Mq39rMAETEdxpkg==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.0.0.tgz",
+ "integrity": "sha512-RQ7rU4NaZDSvvOfMZQmB50q7de+jrHYb+f0ExLKBvr80B1MK3oc9VvI2BzBkGfM4aGx71MMa0UizjOiT/31kqw==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -616,9 +502,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.1",
- "@angular/core": "20.0.1",
- "@angular/platform-browser": "20.0.1",
+ "@angular/common": "20.0.0",
+ "@angular/core": "20.0.0",
+ "@angular/platform-browser": "20.0.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
@@ -649,9 +535,9 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.27.5",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz",
- "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==",
+ "version": "7.27.3",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz",
+ "integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -703,12 +589,12 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.27.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz",
- "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==",
+ "version": "7.27.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz",
+ "integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.27.5",
+ "@babel/parser": "^7.27.3",
"@babel/types": "^7.27.3",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
@@ -840,9 +726,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.27.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz",
- "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
+ "version": "7.27.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.4.tgz",
+ "integrity": "sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.27.3"
@@ -3232,14 +3118,14 @@
]
},
"node_modules/@schematics/angular": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.0.1.tgz",
- "integrity": "sha512-29T9vUAjZnbXM+vImIQcdqG/ibdcfj5+pybo5cbiMSwVPVyerXgnD0HKC4dyZ34V2RFZa8cmyCLe/5bYoPQ+0g==",
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.0.0.tgz",
+ "integrity": "sha512-lK5TvxEoeaoPnxM31qeNWhHUJ3kKMnRHknYhOfOmS8xfme78nS01FdU7TODLkg2p4GNEVVtXoxhj3FmrG3srKw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "20.0.1",
- "@angular-devkit/schematics": "20.0.1",
+ "@angular-devkit/core": "20.0.0",
+ "@angular-devkit/schematics": "20.0.0",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -3645,6 +3531,7 @@
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -3657,6 +3544,7 @@
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -3974,9 +3862,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001721",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz",
- "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==",
+ "version": "1.0.30001720",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001720.tgz",
+ "integrity": "sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==",
"funding": [
{
"type": "opencollective",
@@ -4126,7 +4014,6 @@
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
@@ -4141,7 +4028,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -4151,7 +4037,6 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
@@ -4167,14 +4052,12 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
"license": "MIT"
},
"node_modules/cliui/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -4184,7 +4067,6 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
@@ -4199,7 +4081,6 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
@@ -4212,7 +4093,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
@@ -4572,9 +4452,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
- "version": "1.5.165",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz",
- "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==",
+ "version": "1.5.162",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.162.tgz",
+ "integrity": "sha512-hQA+Zb5QQwoSaXJWEAGEw1zhk//O7qDzib05Z4qTqZfNju/FAkrm5ZInp0JbTp4Z18A6bilopdZWEYrFSsfllA==",
"license": "ISC"
},
"node_modules/emoji-datasource": {
@@ -4596,6 +4476,7 @@
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
"integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/encoding": {
@@ -5041,6 +4922,7 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
"integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
@@ -7907,6 +7789,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^10.3.0",
@@ -7980,6 +7863,7 @@
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^6.0.1"
@@ -8773,7 +8657,6 @@
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
- "dev": true,
"license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
@@ -8792,7 +8675,6 @@
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
- "dev": true,
"license": "ISC",
"engines": {
"node": ">=12"
@@ -8802,7 +8684,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -8812,14 +8693,12 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
"license": "MIT"
},
"node_modules/yargs/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -8829,7 +8708,6 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
@@ -8844,7 +8722,6 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
diff --git a/ui/src/app/core/settings.service.ts b/ui/src/app/core/settings.service.ts
index 246c86122..8b01192b3 100644
--- a/ui/src/app/core/settings.service.ts
+++ b/ui/src/app/core/settings.service.ts
@@ -43,7 +43,7 @@ interface AppSettingsInterface {
theme: string
lightingMode: 'auto' | 'light' | 'dark'
menuMode: 'default' | 'freeze'
- loginWallpaper: string
+ wallpaper: string
serverTimestamp: string
}
@@ -65,7 +65,7 @@ export class SettingsService {
public actualLightingMode: 'light' | 'dark'
public browserLightingMode: 'light' | 'dark'
public menuMode: 'default' | 'freeze'
- public loginWallpaper: string
+ public wallpaper: string
public serverTimeOffset = 0
private readonly defaultTheme = 'orange'
public readonly themeList = [
@@ -101,7 +101,7 @@ export class SettingsService {
this.formAuth = data.formAuth
this.env = data.env
this.lightingMode = data.lightingMode
- this.loginWallpaper = data.loginWallpaper
+ this.wallpaper = data.wallpaper
this.setLightingMode(this.lightingMode, 'user')
this.setTheme(data.theme)
this.setMenuMode(data.menuMode)
diff --git a/ui/src/app/modules/login/login.component.html b/ui/src/app/modules/login/login.component.html
index 9a6541a16..e3fa92d06 100644
--- a/ui/src/app/modules/login/login.component.html
+++ b/ui/src/app/modules/login/login.component.html
@@ -1,6 +1,7 @@
![]()
@if (showFields.general) {
-
-
- {{ 'settings.display.login_wallpaper' | translate }}
-
-
-
-
-
-
-
{{ 'settings.display.temp_units' | translate }}
@@ -220,18 +199,17 @@
- @if (hasChangedLoginWallpaper) {
-
- {{ 'settings.changes.saved' | translate }}
+
+ {{ 'settings.display.wallpaper' | translate }}
- {{ 'menu.tooltip_restart' | translate }}
+
- }
}
diff --git a/ui/src/app/modules/settings/settings.component.ts b/ui/src/app/modules/settings/settings.component.ts
index 4c27d5533..784640c31 100644
--- a/ui/src/app/modules/settings/settings.component.ts
+++ b/ui/src/app/modules/settings/settings.component.ts
@@ -18,6 +18,7 @@ import { RemoveIndividualAccessoriesComponent } from '@/app/modules/settings/rem
import { ResetAllBridgesComponent } from '@/app/modules/settings/reset-all-bridges/reset-all-bridges.component'
import { ResetIndividualBridgesComponent } from '@/app/modules/settings/reset-individual-bridges/reset-individual-bridges.component'
import { SelectNetworkInterfacesComponent } from '@/app/modules/settings/select-network-interfaces/select-network-interfaces.component'
+import { WallpaperComponent } from '@/app/modules/settings/wallpaper/wallpaper.component'
@Component({
templateUrl: './settings.component.html',
@@ -51,7 +52,6 @@ export class SettingsComponent implements OnInit {
port: 0,
}
- public originalLoginWallpaper = ''
public originalMdnsSetting = ''
public originalBridgeNetworkAdapters: string[] = []
public originalHbPort = 0
@@ -63,7 +63,6 @@ export class SettingsComponent implements OnInit {
public hasChangedBridgeNetworkAdapters = false
public hasChangedHbPort = false
public hasChangedHbName = false
- public hasChangedLoginWallpaper = false
public isInvalidHbPort = false
public isInvalidHbName = false
@@ -81,7 +80,6 @@ export class SettingsComponent implements OnInit {
port: new FormControl(0),
})
- public loginWallpaper = ''
public legacyMdnsFormControl = new UntypedFormControl(false)
public showAvahiMdnsOption = false
public showResolvedMdnsOption = false
@@ -99,7 +97,6 @@ export class SettingsComponent implements OnInit {
cache: true,
}
- public readonly file = 'ui-wallpaper.jpg'
public readonly linkDebug = ''
constructor() {}
@@ -111,7 +108,6 @@ export class SettingsComponent implements OnInit {
this.originalHbName = this.$settings.env.homebridgeInstanceName
this.initUiSettingsForm()
- this.initDisplaySettingsForm()
this.initNetworkingOptions()
if (this.$settings.env.serviceMode) {
this.initServiceModeForm()
@@ -153,11 +149,6 @@ export class SettingsComponent implements OnInit {
})
}
- initDisplaySettingsForm() {
- this.originalLoginWallpaper = this.$settings.loginWallpaper
- this.loginWallpaper = this.$settings.loginWallpaper
- }
-
saveUiSettingChange(key: string, value: any) {
// Extra things to do per key
switch (key) {
@@ -177,10 +168,6 @@ export class SettingsComponent implements OnInit {
case 'tempUnits':
this.$settings.setEnvItem('temperatureUnits', value)
break
- case 'loginWallpaper':
- this.$settings.setEnvItem('loginWallpaper', value)
- this.hasChangedLoginWallpaper = value !== this.originalLoginWallpaper
- break
case 'port':
if (!value || typeof value !== 'number' || value < 1025 || value > 65533 || Number.isInteger(value) === false || value === this.hbPortFormControl.value) {
this.isInvalidHbUiPort = true
@@ -215,6 +202,13 @@ export class SettingsComponent implements OnInit {
})
}
+ openWallpaperModal() {
+ this.$modal.open(WallpaperComponent, {
+ size: 'lg',
+ backdrop: 'static',
+ })
+ }
+
saveServiceModeSettings(data = this.serviceForm.value) {
this.$api.put('/platform-tools/hb-service/homebridge-startup-settings', data).subscribe({
next: () => {
diff --git a/ui/src/app/modules/settings/settings.module.ts b/ui/src/app/modules/settings/settings.module.ts
index 7f5dd941f..c2be4fdf4 100644
--- a/ui/src/app/modules/settings/settings.module.ts
+++ b/ui/src/app/modules/settings/settings.module.ts
@@ -14,6 +14,7 @@ import { ResetIndividualBridgesComponent } from '@/app/modules/settings/reset-in
import { SelectNetworkInterfacesComponent } from '@/app/modules/settings/select-network-interfaces/select-network-interfaces.component'
import { SettingsRoutingModule } from '@/app/modules/settings/settings-routing.module'
import { SettingsComponent } from '@/app/modules/settings/settings.component'
+import { WallpaperComponent } from '@/app/modules/settings/wallpaper/wallpaper.component'
@NgModule({
imports: [
@@ -32,6 +33,7 @@ import { SettingsComponent } from '@/app/modules/settings/settings.component'
SelectNetworkInterfacesComponent,
RestoreComponent,
BackupComponent,
+ WallpaperComponent,
],
})
export class SettingsModule {}
diff --git a/ui/src/app/modules/settings/wallpaper/wallpaper.component.html b/ui/src/app/modules/settings/wallpaper/wallpaper.component.html
new file mode 100644
index 000000000..5b5cb4a10
--- /dev/null
+++ b/ui/src/app/modules/settings/wallpaper/wallpaper.component.html
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+ - {{ 'settings.display.wallpaper_intro' | translate }}
+ - {{ 'settings.display.wallpaper_rule' | translate: { maxFileSizeText: maxFileSizeText } }}
+ - {{ 'settings.display.wallpaper_rule2' | translate }}
+
+
+ @if (wallpaperUrl) {
+
+
![Current Wallpaper]()
+
+
+
+
+ } @else {
+
+ }
+
+
+
+
+
+
+
diff --git a/ui/src/app/modules/settings/wallpaper/wallpaper.component.scss b/ui/src/app/modules/settings/wallpaper/wallpaper.component.scss
new file mode 100644
index 000000000..a926d335b
--- /dev/null
+++ b/ui/src/app/modules/settings/wallpaper/wallpaper.component.scss
@@ -0,0 +1,18 @@
+.anim {
+ -webkit-animation: gradient 20s ease infinite;
+ -moz-animation: gradient 20s ease infinite;
+ -o-animation: gradient 20s ease infinite;
+ animation: gradient 20s ease infinite;
+}
+
+@keyframes gradient {
+ 0% {
+ background-position: 0 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0 50%;
+ }
+}
diff --git a/ui/src/app/modules/settings/wallpaper/wallpaper.component.ts b/ui/src/app/modules/settings/wallpaper/wallpaper.component.ts
new file mode 100644
index 000000000..62c567177
--- /dev/null
+++ b/ui/src/app/modules/settings/wallpaper/wallpaper.component.ts
@@ -0,0 +1,97 @@
+import { Component, ElementRef, inject, ViewChild } from '@angular/core'
+import { ReactiveFormsModule } from '@angular/forms'
+import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'
+import { TranslatePipe, TranslateService } from '@ngx-translate/core'
+import { ToastrService } from 'ngx-toastr'
+
+import { ApiService } from '@/app/core/api.service'
+import { SettingsService } from '@/app/core/settings.service'
+import { environment } from '@/environments/environment'
+
+@Component({
+ templateUrl: './wallpaper.component.html',
+ styleUrls: ['./wallpaper.component.scss'],
+ standalone: true,
+ imports: [ReactiveFormsModule, TranslatePipe],
+})
+export class WallpaperComponent {
+ $activeModal = inject(NgbActiveModal)
+ private $api = inject(ApiService)
+ private $modal = inject(NgbModal)
+ private $settings = inject(SettingsService)
+ private $toastr = inject(ToastrService)
+ private $translate = inject(TranslateService)
+
+ public clicked = false
+ public maxFileSizeText = globalThis.backup.maxBackupSizeText
+ public selectedFile: File
+ public wallpaperUrl: string = null
+ public originalWallpaperUrl: string = null
+
+ @ViewChild('wallpaperInput') wallpaperInput!: ElementRef
+
+ constructor() {}
+
+ ngOnInit() {
+ if (this.$settings.env.customWallpaperHash) {
+ this.wallpaperUrl = `${environment.api.base}/auth/wallpaper/${this.$settings.env.customWallpaperHash}`
+ this.originalWallpaperUrl = this.wallpaperUrl
+ }
+ }
+
+ onFileChange(files: FileList) {
+ if (files.length) {
+ this.selectedFile = files[0]
+ const reader = new FileReader()
+ reader.onload = (e: any) => {
+ this.wallpaperUrl = e.target.result
+ }
+ reader.readAsDataURL(this.selectedFile)
+ } else {
+ delete this.selectedFile
+ this.wallpaperUrl = this.originalWallpaperUrl
+ }
+ }
+
+ saveWallpaper() {
+ this.clicked = true
+ if (this.selectedFile) {
+ const formData: FormData = new FormData()
+ formData.append('wallpaper', this.selectedFile, this.selectedFile.name)
+ this.$api.post('/server/wallpaper', formData).subscribe({
+ next: () => {
+ this.$activeModal.close()
+ this.$toastr.success(this.$translate.instant('settings.display.wallpaper_success'), this.$translate.instant('toast.title_success'))
+ },
+ error: (error) => {
+ console.error(error)
+ this.$toastr.error(error.error?.message, this.$translate.instant('toast.title_error'))
+ this.clicked = false
+ },
+ })
+ } else {
+ this.$api.delete('/server/wallpaper').subscribe({
+ next: () => {
+ this.$activeModal.close()
+ },
+ error: (error) => {
+ console.error(error)
+ this.$toastr.error(error.error?.message, this.$translate.instant('toast.title_error'))
+ this.clicked = false
+ },
+ })
+ }
+ }
+
+ clearWallpaper() {
+ this.selectedFile = null
+ this.wallpaperUrl = this.wallpaperUrl === this.originalWallpaperUrl
+ ? null
+ : this.originalWallpaperUrl
+ this.wallpaperInput.nativeElement.value = ''
+ }
+
+ cancel() {
+ this.$activeModal.dismiss()
+ }
+}
diff --git a/ui/src/i18n/bg.json b/ui/src/i18n/bg.json
index 94e029d56..8e9558fee 100644
--- a/ui/src/i18n/bg.json
+++ b/ui/src/i18n/bg.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "mDNS Advertiser",
diff --git a/ui/src/i18n/ca.json b/ui/src/i18n/ca.json
index 965f4dee3..ebbac6078 100644
--- a/ui/src/i18n/ca.json
+++ b/ui/src/i18n/ca.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "Mètode de difusió mDNS",
diff --git a/ui/src/i18n/cs.json b/ui/src/i18n/cs.json
index e1359cf58..1d6374bef 100644
--- a/ui/src/i18n/cs.json
+++ b/ui/src/i18n/cs.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Jazyk",
"settings.display.light": "Světla",
"settings.display.lighting_mode": "Režim osvětlení",
- "settings.display.login_wallpaper": "Úvodní tapeta",
- "settings.display.login_wallpaper_desc": "Vlastní úvodní tapetu můžete nastavit přidáním souboru ui-wallpaper.jpg
do adresáře úložiště Homebridge, nebo poskytnutím plné cesty k místnímu obrázkovému souboru zde.",
"settings.display.menu_default": "Výchozí",
"settings.display.menu_freeze": "Nechat zavřené (na počítači)",
"settings.display.menu_mode": "Režim Menu",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsia (°C)",
"settings.display.temp_units.f": "Fahrenheita (°F)",
"settings.display.theme": "Téma",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Displej",
"settings.general.title_general": "Obecné",
"settings.mdns_advertiser": "mDNS Inzerent",
diff --git a/ui/src/i18n/de.json b/ui/src/i18n/de.json
index 89e601e8a..7c282a5d9 100644
--- a/ui/src/i18n/de.json
+++ b/ui/src/i18n/de.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Sprache",
"settings.display.light": "Hell",
"settings.display.lighting_mode": "Helligkeitsmodus",
- "settings.display.login_wallpaper": "Login-Hintergrundbild",
- "settings.display.login_wallpaper_desc": "Ein benutzerdefiniertes Login-Hintergrundbild können Sie festlegen, indem Sie eine {{ file }}-Datei zu Ihrem Homebridge-Speicherverzeichnis hinzufügen, oder indem Sie einen vollständigen Pfad zu einer lokalen Bilddatei hier angeben.",
"settings.display.menu_default": "Standard",
"settings.display.menu_freeze": "Geschlossen halten (auf dem Desktop)",
"settings.display.menu_mode": "Menü-Modus",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Anzeige",
"settings.general.title_general": "Allgemein",
"settings.mdns_advertiser": "mDNS Advertiser",
diff --git a/ui/src/i18n/en.json b/ui/src/i18n/en.json
index 1c1348211..9b6b8f10f 100644
--- a/ui/src/i18n/en.json
+++ b/ui/src/i18n/en.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "mDNS Advertiser",
diff --git a/ui/src/i18n/es.json b/ui/src/i18n/es.json
index 401864c81..a9f19b455 100644
--- a/ui/src/i18n/es.json
+++ b/ui/src/i18n/es.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Idioma",
"settings.display.light": "Claro",
"settings.display.lighting_mode": "Modo de Iluminación",
- "settings.display.login_wallpaper": "Fondo de Inicio de Sesión",
- "settings.display.login_wallpaper_desc": "Se puede establecer un fondo de inicio de sesión personalizado añadiendo un archivo {{ file }} a tu directorio de almacenamiento de Homebridge, o proporcionando aquí una ruta completa a un archivo de imagen local.",
"settings.display.menu_default": "Predeterminado",
"settings.display.menu_freeze": "Mantener Cerrado (En Escritorio)",
"settings.display.menu_mode": "Modo de Menú",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Tema",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Pantalla",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "Difusión mDNS",
diff --git a/ui/src/i18n/fi.json b/ui/src/i18n/fi.json
index 3e907b02b..43c4c1c3b 100644
--- a/ui/src/i18n/fi.json
+++ b/ui/src/i18n/fi.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Kieli",
"settings.display.light": "Valoisa",
"settings.display.lighting_mode": "Näkymän valoisuus",
- "settings.display.login_wallpaper": "Kirjautumisen taustakuva",
- "settings.display.login_wallpaper_desc": "Kirjautumisen taustakuvan saat muutettua lisäämällä {{ file }} tiedoston Homebridgen tallennus hakemistoon, tai kirjoittamalla kuvatiedoston koko polun ja tiedostonimen tähän.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Teema",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Näyttö",
"settings.general.title_general": "Yleiset",
"settings.mdns_advertiser": "mDNS mainostaja",
diff --git a/ui/src/i18n/fr.json b/ui/src/i18n/fr.json
index f5757d041..97063244e 100644
--- a/ui/src/i18n/fr.json
+++ b/ui/src/i18n/fr.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "Général",
"settings.mdns_advertiser": "Diffuseur mDNS",
diff --git a/ui/src/i18n/he.json b/ui/src/i18n/he.json
index ba37ba7a0..681c2756e 100644
--- a/ui/src/i18n/he.json
+++ b/ui/src/i18n/he.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "mDNS Advertiser",
diff --git a/ui/src/i18n/hu.json b/ui/src/i18n/hu.json
index 760126b9a..89c867930 100644
--- a/ui/src/i18n/hu.json
+++ b/ui/src/i18n/hu.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "mDNS Advertiser",
diff --git a/ui/src/i18n/id.json b/ui/src/i18n/id.json
index a3fa587c4..6c01ff580 100644
--- a/ui/src/i18n/id.json
+++ b/ui/src/i18n/id.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Bahasa",
"settings.display.light": "Lampu",
"settings.display.lighting_mode": "Mode Pencahayaan",
- "settings.display.login_wallpaper": "Wallpaper Login",
- "settings.display.login_wallpaper_desc": "Wallpaper login khusus dapat diatur dengan menambahkan file {{ file }} ke direktori penyimpanan homebridge Anda, atau dengan memberikan jalur lengkap ke file gambar lokal di sini.",
"settings.display.menu_default": "Bawaan",
"settings.display.menu_freeze": "Tetap Tertutup (di Desktop)",
"settings.display.menu_mode": "Mode Menu",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celcius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Tema",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Penampilan",
"settings.general.title_general": "Umum",
"settings.mdns_advertiser": "Pengiklan mDNS",
diff --git a/ui/src/i18n/it.json b/ui/src/i18n/it.json
index 94143ec4c..35ce60a57 100644
--- a/ui/src/i18n/it.json
+++ b/ui/src/i18n/it.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "Annunciatore mDNS",
diff --git a/ui/src/i18n/ja.json b/ui/src/i18n/ja.json
index c9c5a2675..9a8115748 100644
--- a/ui/src/i18n/ja.json
+++ b/ui/src/i18n/ja.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "mDNS広告主",
diff --git a/ui/src/i18n/ko.json b/ui/src/i18n/ko.json
index d0fed2c8d..91d71d208 100644
--- a/ui/src/i18n/ko.json
+++ b/ui/src/i18n/ko.json
@@ -394,8 +394,6 @@
"settings.display.lang": "언어",
"settings.display.light": "밝은",
"settings.display.lighting_mode": "조명 모드",
- "settings.display.login_wallpaper": "로그인 배경화면",
- "settings.display.login_wallpaper_desc": "사용자 지정 로그인 배경화면은 Homebridge 저장소 디렉토리에 {{ file }} 파일을 추가하거나 여기에 로컬 이미지 파일의 전체 경로를 제공하여 설정할 수 있습니다.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "섭씨 (°C)",
"settings.display.temp_units.f": "화씨 (°F)",
"settings.display.theme": "테마",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "디스플레이",
"settings.general.title_general": "일반",
"settings.mdns_advertiser": "mDNS 광고자",
diff --git a/ui/src/i18n/mk.json b/ui/src/i18n/mk.json
index a86e78ea6..da2f075ef 100644
--- a/ui/src/i18n/mk.json
+++ b/ui/src/i18n/mk.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "mDNS Advertiser",
diff --git a/ui/src/i18n/nl.json b/ui/src/i18n/nl.json
index 917ea8be9..19de3fc0e 100644
--- a/ui/src/i18n/nl.json
+++ b/ui/src/i18n/nl.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Taal",
"settings.display.light": "Lich",
"settings.display.lighting_mode": "Verlichting Modus",
- "settings.display.login_wallpaper": "Login Achtergrond",
- "settings.display.login_wallpaper_desc": "Een maatwerk login achtergrond kan ingesteld worden door het toevoegen van {{ file }} bestand aan de Homebridge opslag folder, of door het hier vermelden van een volledig pad naar een lokaal afbeelding bestand.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Thema",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Scherm",
"settings.general.title_general": "Algemeen",
"settings.mdns_advertiser": "mDNS Advertiser",
diff --git a/ui/src/i18n/no.json b/ui/src/i18n/no.json
index 61f51d975..a9dfce521 100644
--- a/ui/src/i18n/no.json
+++ b/ui/src/i18n/no.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "mDNS Advertiser",
diff --git a/ui/src/i18n/pl.json b/ui/src/i18n/pl.json
index 91bf12fd8..577082dea 100644
--- a/ui/src/i18n/pl.json
+++ b/ui/src/i18n/pl.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Język",
"settings.display.light": "Jasny",
"settings.display.lighting_mode": "Motyw (jasny / ciemny)",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Motyw (kolor)",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Wygląd",
"settings.general.title_general": "Ogólne",
"settings.mdns_advertiser": "Rozgłaszacz mDNS",
diff --git a/ui/src/i18n/pt-BR.json b/ui/src/i18n/pt-BR.json
index a23b05d7f..70e9d6343 100644
--- a/ui/src/i18n/pt-BR.json
+++ b/ui/src/i18n/pt-BR.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "Anunciante mDNS",
diff --git a/ui/src/i18n/pt.json b/ui/src/i18n/pt.json
index 499699b3d..1675ebf3b 100644
--- a/ui/src/i18n/pt.json
+++ b/ui/src/i18n/pt.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "Encaminhamento mDNS",
diff --git a/ui/src/i18n/ru.json b/ui/src/i18n/ru.json
index c49948161..f845593d9 100644
--- a/ui/src/i18n/ru.json
+++ b/ui/src/i18n/ru.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Язык",
"settings.display.light": "Светлая",
"settings.display.lighting_mode": "Режим освещения",
- "settings.display.login_wallpaper": "Фоновое изображение на экране входа",
- "settings.display.login_wallpaper_desc": "Вы можете установить собственное фоновое изображение, добавив файл {{ file }} в каталог хранения Homebridge или указав здесь полный путь к локальному файлу изображения.",
"settings.display.menu_default": "По умолчанию",
"settings.display.menu_freeze": "Закрепить (на ПК)",
"settings.display.menu_mode": "Режим меню",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Цельсий (°C)",
"settings.display.temp_units.f": "Фаренгейт (°F)",
"settings.display.theme": "Тема оформления",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Отображение",
"settings.general.title_general": "Основные",
"settings.mdns_advertiser": "Рекламодатель mDNS",
diff --git a/ui/src/i18n/sl.json b/ui/src/i18n/sl.json
index c3fef529a..02953dcbd 100644
--- a/ui/src/i18n/sl.json
+++ b/ui/src/i18n/sl.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "mDNS oglaševalec",
diff --git a/ui/src/i18n/sv.json b/ui/src/i18n/sv.json
index d7a60fa91..d7b235f7b 100644
--- a/ui/src/i18n/sv.json
+++ b/ui/src/i18n/sv.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Språk",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Tema",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "Allmänt",
"settings.mdns_advertiser": "mDNS-annonsör",
diff --git a/ui/src/i18n/th.json b/ui/src/i18n/th.json
index 3d6e175f0..d3832a35f 100644
--- a/ui/src/i18n/th.json
+++ b/ui/src/i18n/th.json
@@ -394,8 +394,6 @@
"settings.display.lang": "ภาษา",
"settings.display.light": "สว่าง",
"settings.display.lighting_mode": "โหมดแสงสว่าง",
- "settings.display.login_wallpaper": "วอลเปเปอร์เข้าสู่ระบบ",
- "settings.display.login_wallpaper_desc": "คุณสามารถตั้งค่าวอลเปเปอร์การเข้าสู่ระบบแบบกำหนดเองได้โดยการเพิ่มไฟล์ {{ file }} ลงในไดเร็กทอรีที่จัดเก็บข้อมูล Homebridge ของคุณ หรือโดยการระบุเส้นทางเต็มไปยังไฟล์รูปภาพในเครื่องที่นี่",
"settings.display.menu_default": "ค่าเริ่มต้น",
"settings.display.menu_freeze": "ปิดไว้ (บนเดสก์ท็อป)",
"settings.display.menu_mode": "โหมดเมนู",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "เซลเซียส (°C)",
"settings.display.temp_units.f": "ฟาเรนไฮต์ (°F)",
"settings.display.theme": "ธีม",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "การแดงผล",
"settings.general.title_general": "ทั่วไป",
"settings.mdns_advertiser": "mDNS Advertiser",
diff --git a/ui/src/i18n/tr.json b/ui/src/i18n/tr.json
index 1627975bd..99f6eb2f5 100644
--- a/ui/src/i18n/tr.json
+++ b/ui/src/i18n/tr.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "mDNS Advertiser",
diff --git a/ui/src/i18n/uk.json b/ui/src/i18n/uk.json
index 9d05a8fd8..fb39a9d9e 100644
--- a/ui/src/i18n/uk.json
+++ b/ui/src/i18n/uk.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Мова",
"settings.display.light": "Світлий",
"settings.display.lighting_mode": "Вигляд",
- "settings.display.login_wallpaper": "Шпалери для входу",
- "settings.display.login_wallpaper_desc": "Індивідуальні шпалери для входу можна встановити, додавши файл {{ file }} до каталогу зберігання Homebridge або вказавши тут повний шлях до локального файлу зображення.",
"settings.display.menu_default": "За замовчуванням",
"settings.display.menu_freeze": "Залишити закритим (на робочому столі)",
"settings.display.menu_mode": "Режим меню",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Цельсій (°C)",
"settings.display.temp_units.f": "Фаренгейт (°F)",
"settings.display.theme": "Тема",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Дисплей",
"settings.general.title_general": "Загальні",
"settings.mdns_advertiser": "Рекламіст mDNS",
diff --git a/ui/src/i18n/zh-CN.json b/ui/src/i18n/zh-CN.json
index 5db926c83..cfab3a75d 100644
--- a/ui/src/i18n/zh-CN.json
+++ b/ui/src/i18n/zh-CN.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "mDNS Advertiser",
diff --git a/ui/src/i18n/zh-TW.json b/ui/src/i18n/zh-TW.json
index 535f788e4..edd335ed5 100644
--- a/ui/src/i18n/zh-TW.json
+++ b/ui/src/i18n/zh-TW.json
@@ -394,8 +394,6 @@
"settings.display.lang": "Language",
"settings.display.light": "Light",
"settings.display.lighting_mode": "Lighting Mode",
- "settings.display.login_wallpaper": "Login Wallpaper",
- "settings.display.login_wallpaper_desc": "A custom login wallpaper can be set by adding a {{ file }} file to your Homebridge storage directory, or by providing a full path to a local image file here.",
"settings.display.menu_default": "Default",
"settings.display.menu_freeze": "Keep Closed (On Desktop)",
"settings.display.menu_mode": "Menu Mode",
@@ -408,6 +406,11 @@
"settings.display.temp_units.c": "Celsius (°C)",
"settings.display.temp_units.f": "Fahrenheit (°F)",
"settings.display.theme": "Theme",
+ "settings.display.wallpaper": "Wallpaper",
+ "settings.display.wallpaper_intro": "Upload a wallpaper for your Homebridge UI. This is currently shown on the login screen.",
+ "settings.display.wallpaper_rule": "You can choose an image file which is up to {{ maxFileSizeText }}.",
+ "settings.display.wallpaper_rule2": "You will need to click Save to upload the wallpaper to your Homebridge storage directory.",
+ "settings.display.wallpaper_success": "Wallpaper was successfully updated.",
"settings.general.title_display": "Display",
"settings.general.title_general": "General",
"settings.mdns_advertiser": "mDNS Advertiser",
From 3a27dca7a9260b88cd755b385271608e89c8b63b Mon Sep 17 00:00:00 2001
From: Ben <43026681+bwp91@users.noreply.github.com>
Date: Wed, 4 Jun 2025 23:09:31 +0100
Subject: [PATCH 10/40] refactor HBv2 and UIv5 readiness modals
---
CHANGELOG.md | 1 +
package-lock.json | 984 +++++-------------
package.json | 10 +-
ui/package-lock.json | 494 ++++++---
ui/package.json | 30 +-
.../hb-update-confirm.component.html | 88 --
.../manage-plugin/manage-plugin.component.ts | 5 +-
.../manage-plugins/manage-plugins.module.ts | 4 +-
.../plugin-compatibility.component.html | 50 +-
.../plugin-card/plugin-card.component.html | 24 -
.../plugin-card/plugin-card.component.ts | 21 -
ui/src/app/modules/status/status.module.ts | 4 +-
.../hb-v2-modal/hb-v2-modal.component.html | 125 +++
.../hb-v2-modal/hb-v2-modal.component.ts} | 37 +-
.../ui-v5-modal/ui-v5-modal.component.html | 8 +-
.../ui-v5-modal/ui-v5-modal.component.ts | 0
.../update-info-widget.component.html | 19 +-
.../update-info-widget.component.ts | 16 +-
ui/src/i18n/bg.json | 3 +
ui/src/i18n/ca.json | 3 +
ui/src/i18n/cs.json | 3 +
ui/src/i18n/de.json | 3 +
ui/src/i18n/en.json | 3 +
ui/src/i18n/es.json | 3 +
ui/src/i18n/fi.json | 3 +
ui/src/i18n/fr.json | 3 +
ui/src/i18n/he.json | 3 +
ui/src/i18n/hu.json | 3 +
ui/src/i18n/id.json | 3 +
ui/src/i18n/it.json | 3 +
ui/src/i18n/ja.json | 3 +
ui/src/i18n/ko.json | 3 +
ui/src/i18n/mk.json | 3 +
ui/src/i18n/nl.json | 3 +
ui/src/i18n/no.json | 3 +
ui/src/i18n/pl.json | 3 +
ui/src/i18n/pt-BR.json | 3 +
ui/src/i18n/pt.json | 3 +
ui/src/i18n/ru.json | 3 +
ui/src/i18n/sl.json | 3 +
ui/src/i18n/sv.json | 3 +
ui/src/i18n/th.json | 3 +
ui/src/i18n/tr.json | 3 +
ui/src/i18n/uk.json | 3 +
ui/src/i18n/zh-CN.json | 3 +
ui/src/i18n/zh-TW.json | 3 +
46 files changed, 969 insertions(+), 1035 deletions(-)
delete mode 100644 ui/src/app/core/manage-plugins/hb-update-confirm/hb-update-confirm.component.html
create mode 100644 ui/src/app/modules/status/widgets/update-info-widget/hb-v2-modal/hb-v2-modal.component.html
rename ui/src/app/{core/manage-plugins/hb-update-confirm/hb-update-confirm.component.ts => modules/status/widgets/update-info-widget/hb-v2-modal/hb-v2-modal.component.ts} (64%)
rename ui/src/app/modules/status/widgets/{system-info-widget => update-info-widget}/ui-v5-modal/ui-v5-modal.component.html (92%)
rename ui/src/app/modules/status/widgets/{system-info-widget => update-info-widget}/ui-v5-modal/ui-v5-modal.component.ts (100%)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4ac48f3ef..e9c30ab9d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -24,6 +24,7 @@ All notable changes to `homebridge-config-ui-x` will be documented in this file.
- fix form field error state font colour (make it red)
- redesigned login page
- improve wallpaper selection with new modal to upload a file
+- refactor HBv2 and UIv5 readiness modals
### Other Changes
diff --git a/package-lock.json b/package-lock.json
index 91427e772..61023bde7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -64,22 +64,22 @@
"homebridge-config-ui-x": "dist/bin/standalone.js"
},
"devDependencies": {
- "@antfu/eslint-config": "^4.13.3",
+ "@antfu/eslint-config": "^4.14.1",
"@nestjs/testing": "^10.4.18",
"@prettier/plugin-xml": "^3.4.1",
"@types/fs-extra": "^11.0.4",
"@types/lodash": "^4.17.17",
- "@types/node": "^22.15.29",
+ "@types/node": "^22.15.30",
"@types/node-schedule": "^2.1.7",
"@types/passport-jwt": "^4.0.1",
"@types/semver": "^7.7.0",
"@types/tail": "^2.2.3",
"@types/tcp-port-used": "^1.0.4",
"@types/unzipper": "^0.10.11",
- "@vitest/coverage-v8": "^3.2.1",
+ "@vitest/coverage-v8": "^3.2.2",
"concurrently": "^9.1.2",
"eslint-plugin-format": "^1.0.1",
- "form-data": "^4.0.2",
+ "form-data": "^4.0.3",
"nodemon": "^3.1.10",
"rimraf": "^6.0.1",
"ts-loader": "^9.5.2",
@@ -87,7 +87,7 @@
"tsconfig-paths": "^4.2.0",
"typescript": "^5.8.3",
"unplugin-swc": "^1.5.4",
- "vitest": "^3.2.1"
+ "vitest": "^3.2.2"
},
"engines": {
"homebridge": "^1.8.0 || ^2.0.0-beta.0",
@@ -109,16 +109,16 @@
}
},
"node_modules/@antfu/eslint-config": {
- "version": "4.13.3",
- "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-4.13.3.tgz",
- "integrity": "sha512-jo3tjyZoRSPTuSwcaHRbPHaHYvrFosPj0ySLL2jFBCjK9wvo9w1fasKqLRMnc/qCKCMDGCH0egheJV801lJgiA==",
+ "version": "4.14.1",
+ "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-4.14.1.tgz",
+ "integrity": "sha512-SVGR33/jSUwMWvC8q3NGF/XEHWFJVfMg8yaQJDtRSGISXm23DVA/ANTADpRKhXpk7IjfnjzPpbT/+T6wFzOmUA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@antfu/install-pkg": "^1.1.0",
"@clack/prompts": "^0.11.0",
"@eslint-community/eslint-plugin-eslint-comments": "^4.5.0",
- "@eslint/markdown": "^6.4.0",
+ "@eslint/markdown": "^6.5.0",
"@stylistic/eslint-plugin": "^5.0.0-beta.1",
"@typescript-eslint/eslint-plugin": "^8.33.1",
"@typescript-eslint/parser": "^8.33.1",
@@ -130,7 +130,6 @@
"eslint-merge-processors": "^2.0.0",
"eslint-plugin-antfu": "^3.1.1",
"eslint-plugin-command": "^3.2.1",
- "eslint-plugin-import-x": "^4.15.0",
"eslint-plugin-jsdoc": "^50.7.1",
"eslint-plugin-jsonc": "^2.20.1",
"eslint-plugin-n": "^17.19.0",
@@ -141,7 +140,7 @@
"eslint-plugin-toml": "^0.12.0",
"eslint-plugin-unicorn": "^59.0.1",
"eslint-plugin-unused-imports": "^4.1.4",
- "eslint-plugin-vue": "^10.1.0",
+ "eslint-plugin-vue": "^10.2.0",
"eslint-plugin-yml": "^1.18.0",
"eslint-processor-vue-blocks": "^2.0.0",
"globals": "^16.2.0",
@@ -271,9 +270,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.27.3",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz",
- "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==",
+ "version": "7.27.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz",
+ "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -362,40 +361,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@emnapi/core": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz",
- "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/wasi-threads": "1.0.2",
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@emnapi/runtime": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz",
- "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@emnapi/wasi-threads": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz",
- "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
"node_modules/@es-joy/jsdoccomment": {
"version": "0.50.2",
"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.50.2.tgz",
@@ -972,9 +937,9 @@
}
},
"node_modules/@eslint/core": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz",
- "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==",
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
+ "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -1064,14 +1029,14 @@
}
},
"node_modules/@eslint/markdown": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-6.4.0.tgz",
- "integrity": "sha512-J07rR8uBSNFJ9iliNINrchilpkmCihPmTVotpThUeKEn5G8aBBZnkjNBy/zovhJA5LBk1vWU9UDlhqKSc/dViQ==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-6.5.0.tgz",
+ "integrity": "sha512-oSkF0p8X21vKEEAGTZASi7q3tbdTvlGduQ02Xz2A1AFncUP4RLVcNz27XurxVW4fs1JXuh0xBtvokXdtp/nN+Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@eslint/core": "^0.10.0",
- "@eslint/plugin-kit": "^0.2.5",
+ "@eslint/core": "^0.14.0",
+ "@eslint/plugin-kit": "^0.3.1",
"mdast-util-from-markdown": "^2.0.2",
"mdast-util-frontmatter": "^2.0.1",
"mdast-util-gfm": "^3.0.0",
@@ -1094,32 +1059,19 @@
}
},
"node_modules/@eslint/plugin-kit": {
- "version": "0.2.8",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz",
- "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==",
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz",
+ "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@eslint/core": "^0.13.0",
+ "@eslint/core": "^0.14.0",
"levn": "^0.4.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz",
- "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
"node_modules/@fastify/accept-negotiator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz",
@@ -1558,19 +1510,6 @@
"integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==",
"license": "MIT"
},
- "node_modules/@napi-rs/wasm-runtime": {
- "version": "0.2.10",
- "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.10.tgz",
- "integrity": "sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/core": "^1.4.3",
- "@emnapi/runtime": "^1.4.3",
- "@tybys/wasm-util": "^0.9.0"
- }
- },
"node_modules/@nestjs/axios": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-3.1.3.tgz",
@@ -1992,9 +1931,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz",
- "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.42.0.tgz",
+ "integrity": "sha512-gldmAyS9hpj+H6LpRNlcjQWbuKUtb94lodB9uCz71Jm+7BxK1VIOo7y62tZZwxhA7j1ylv/yQz080L5WkS+LoQ==",
"cpu": [
"arm"
],
@@ -2006,9 +1945,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz",
- "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.42.0.tgz",
+ "integrity": "sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw==",
"cpu": [
"arm64"
],
@@ -2020,9 +1959,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz",
- "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.42.0.tgz",
+ "integrity": "sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA==",
"cpu": [
"arm64"
],
@@ -2034,9 +1973,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz",
- "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.42.0.tgz",
+ "integrity": "sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA==",
"cpu": [
"x64"
],
@@ -2048,9 +1987,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz",
- "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.42.0.tgz",
+ "integrity": "sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ==",
"cpu": [
"arm64"
],
@@ -2062,9 +2001,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz",
- "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.42.0.tgz",
+ "integrity": "sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ==",
"cpu": [
"x64"
],
@@ -2076,9 +2015,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz",
- "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.42.0.tgz",
+ "integrity": "sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A==",
"cpu": [
"arm"
],
@@ -2090,9 +2029,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz",
- "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.42.0.tgz",
+ "integrity": "sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ==",
"cpu": [
"arm"
],
@@ -2104,9 +2043,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz",
- "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.42.0.tgz",
+ "integrity": "sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q==",
"cpu": [
"arm64"
],
@@ -2118,9 +2057,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz",
- "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.42.0.tgz",
+ "integrity": "sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g==",
"cpu": [
"arm64"
],
@@ -2132,9 +2071,9 @@
]
},
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz",
- "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.42.0.tgz",
+ "integrity": "sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg==",
"cpu": [
"loong64"
],
@@ -2146,9 +2085,9 @@
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz",
- "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.42.0.tgz",
+ "integrity": "sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA==",
"cpu": [
"ppc64"
],
@@ -2160,9 +2099,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz",
- "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.42.0.tgz",
+ "integrity": "sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA==",
"cpu": [
"riscv64"
],
@@ -2174,9 +2113,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz",
- "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.42.0.tgz",
+ "integrity": "sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw==",
"cpu": [
"riscv64"
],
@@ -2188,9 +2127,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz",
- "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.42.0.tgz",
+ "integrity": "sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw==",
"cpu": [
"s390x"
],
@@ -2202,9 +2141,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz",
- "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.42.0.tgz",
+ "integrity": "sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==",
"cpu": [
"x64"
],
@@ -2216,9 +2155,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz",
- "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.42.0.tgz",
+ "integrity": "sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==",
"cpu": [
"x64"
],
@@ -2230,9 +2169,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz",
- "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.42.0.tgz",
+ "integrity": "sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A==",
"cpu": [
"arm64"
],
@@ -2244,9 +2183,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz",
- "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.42.0.tgz",
+ "integrity": "sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g==",
"cpu": [
"ia32"
],
@@ -2258,9 +2197,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz",
- "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.42.0.tgz",
+ "integrity": "sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==",
"cpu": [
"x64"
],
@@ -2285,9 +2224,9 @@
"license": "MIT"
},
"node_modules/@stylistic/eslint-plugin": {
- "version": "5.0.0-beta.1",
- "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.0.0-beta.1.tgz",
- "integrity": "sha512-26syM7oRlnfUVoQ58GoPVXAXS3rSknWtD9dAx3XHIYxSQsqmd1Uuw7ILG0E6YSO+VYTlhuOcmikP/dg8Cu9d0Q==",
+ "version": "5.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.0.0-beta.3.tgz",
+ "integrity": "sha512-ItDjyhRyc5hx4W/IBy4/EhgPLbTrjeVPgcYG65pZApTg8Prf1nsWz0j7AY/nYd7OqzBAuRSmzrYFlab86ybePw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2305,9 +2244,9 @@
}
},
"node_modules/@swc/core": {
- "version": "1.11.29",
- "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.29.tgz",
- "integrity": "sha512-g4mThMIpWbNhV8G2rWp5a5/Igv8/2UFRJx2yImrLGMgrDDYZIopqZ/z0jZxDgqNA1QDx93rpwNF7jGsxVWcMlA==",
+ "version": "1.11.31",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.31.tgz",
+ "integrity": "sha512-mAby9aUnKRjMEA7v8cVZS9Ah4duoRBnX7X6r5qrhTxErx+68MoY1TPrVwj/66/SWN3Bl+jijqAqoB8Qx0QE34A==",
"dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
@@ -2324,16 +2263,16 @@
"url": "https://opencollective.com/swc"
},
"optionalDependencies": {
- "@swc/core-darwin-arm64": "1.11.29",
- "@swc/core-darwin-x64": "1.11.29",
- "@swc/core-linux-arm-gnueabihf": "1.11.29",
- "@swc/core-linux-arm64-gnu": "1.11.29",
- "@swc/core-linux-arm64-musl": "1.11.29",
- "@swc/core-linux-x64-gnu": "1.11.29",
- "@swc/core-linux-x64-musl": "1.11.29",
- "@swc/core-win32-arm64-msvc": "1.11.29",
- "@swc/core-win32-ia32-msvc": "1.11.29",
- "@swc/core-win32-x64-msvc": "1.11.29"
+ "@swc/core-darwin-arm64": "1.11.31",
+ "@swc/core-darwin-x64": "1.11.31",
+ "@swc/core-linux-arm-gnueabihf": "1.11.31",
+ "@swc/core-linux-arm64-gnu": "1.11.31",
+ "@swc/core-linux-arm64-musl": "1.11.31",
+ "@swc/core-linux-x64-gnu": "1.11.31",
+ "@swc/core-linux-x64-musl": "1.11.31",
+ "@swc/core-win32-arm64-msvc": "1.11.31",
+ "@swc/core-win32-ia32-msvc": "1.11.31",
+ "@swc/core-win32-x64-msvc": "1.11.31"
},
"peerDependencies": {
"@swc/helpers": ">=0.5.17"
@@ -2345,9 +2284,9 @@
}
},
"node_modules/@swc/core-darwin-arm64": {
- "version": "1.11.29",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.29.tgz",
- "integrity": "sha512-whsCX7URzbuS5aET58c75Dloby3Gtj/ITk2vc4WW6pSDQKSPDuONsIcZ7B2ng8oz0K6ttbi4p3H/PNPQLJ4maQ==",
+ "version": "1.11.31",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.31.tgz",
+ "integrity": "sha512-NTEaYOts0OGSbJZc0O74xsji+64JrF1stmBii6D5EevWEtrY4wlZhm8SiP/qPrOB+HqtAihxWIukWkP2aSdGSQ==",
"cpu": [
"arm64"
],
@@ -2363,9 +2302,9 @@
}
},
"node_modules/@swc/core-darwin-x64": {
- "version": "1.11.29",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.29.tgz",
- "integrity": "sha512-S3eTo/KYFk+76cWJRgX30hylN5XkSmjYtCBnM4jPLYn7L6zWYEPajsFLmruQEiTEDUg0gBEWLMNyUeghtswouw==",
+ "version": "1.11.31",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.31.tgz",
+ "integrity": "sha512-THSGaSwT96JwXDwuXQ6yFBbn+xDMdyw7OmBpnweAWsh5DhZmQkALEm1DgdQO3+rrE99MkmzwAfclc0UmYro/OA==",
"cpu": [
"x64"
],
@@ -2381,9 +2320,9 @@
}
},
"node_modules/@swc/core-linux-arm-gnueabihf": {
- "version": "1.11.29",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.29.tgz",
- "integrity": "sha512-o9gdshbzkUMG6azldHdmKklcfrcMx+a23d/2qHQHPDLUPAN+Trd+sDQUYArK5Fcm7TlpG4sczz95ghN0DMkM7g==",
+ "version": "1.11.31",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.31.tgz",
+ "integrity": "sha512-laKtQFnW7KHgE57Hx32os2SNAogcuIDxYE+3DYIOmDMqD7/1DCfJe6Rln2N9WcOw6HuDbDpyQavIwZNfSAa8vQ==",
"cpu": [
"arm"
],
@@ -2399,9 +2338,9 @@
}
},
"node_modules/@swc/core-linux-arm64-gnu": {
- "version": "1.11.29",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.29.tgz",
- "integrity": "sha512-sLoaciOgUKQF1KX9T6hPGzvhOQaJn+3DHy4LOHeXhQqvBgr+7QcZ+hl4uixPKTzxk6hy6Hb0QOvQEdBAAR1gXw==",
+ "version": "1.11.31",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.31.tgz",
+ "integrity": "sha512-T+vGw9aPE1YVyRxRr1n7NAdkbgzBzrXCCJ95xAZc/0+WUwmL77Z+js0J5v1KKTRxw4FvrslNCOXzMWrSLdwPSA==",
"cpu": [
"arm64"
],
@@ -2417,9 +2356,9 @@
}
},
"node_modules/@swc/core-linux-arm64-musl": {
- "version": "1.11.29",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.29.tgz",
- "integrity": "sha512-PwjB10BC0N+Ce7RU/L23eYch6lXFHz7r3NFavIcwDNa/AAqywfxyxh13OeRy+P0cg7NDpWEETWspXeI4Ek8otw==",
+ "version": "1.11.31",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.31.tgz",
+ "integrity": "sha512-Mztp5NZkyd5MrOAG+kl+QSn0lL4Uawd4CK4J7wm97Hs44N9DHGIG5nOz7Qve1KZo407Y25lTxi/PqzPKHo61zQ==",
"cpu": [
"arm64"
],
@@ -2435,9 +2374,9 @@
}
},
"node_modules/@swc/core-linux-x64-gnu": {
- "version": "1.11.29",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.29.tgz",
- "integrity": "sha512-i62vBVoPaVe9A3mc6gJG07n0/e7FVeAvdD9uzZTtGLiuIfVfIBta8EMquzvf+POLycSk79Z6lRhGPZPJPYiQaA==",
+ "version": "1.11.31",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.31.tgz",
+ "integrity": "sha512-DDVE0LZcXOWwOqFU1Xi7gdtiUg3FHA0vbGb3trjWCuI1ZtDZHEQYL4M3/2FjqKZtIwASrDvO96w91okZbXhvMg==",
"cpu": [
"x64"
],
@@ -2453,9 +2392,9 @@
}
},
"node_modules/@swc/core-linux-x64-musl": {
- "version": "1.11.29",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.29.tgz",
- "integrity": "sha512-YER0XU1xqFdK0hKkfSVX1YIyCvMDI7K07GIpefPvcfyNGs38AXKhb2byySDjbVxkdl4dycaxxhRyhQ2gKSlsFQ==",
+ "version": "1.11.31",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.31.tgz",
+ "integrity": "sha512-mJA1MzPPRIfaBUHZi0xJQ4vwL09MNWDeFtxXb0r4Yzpf0v5Lue9ymumcBPmw/h6TKWms+Non4+TDquAsweuKSw==",
"cpu": [
"x64"
],
@@ -2471,9 +2410,9 @@
}
},
"node_modules/@swc/core-win32-arm64-msvc": {
- "version": "1.11.29",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.29.tgz",
- "integrity": "sha512-po+WHw+k9g6FAg5IJ+sMwtA/fIUL3zPQ4m/uJgONBATCVnDDkyW6dBA49uHNVtSEvjvhuD8DVWdFP847YTcITw==",
+ "version": "1.11.31",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.31.tgz",
+ "integrity": "sha512-RdtakUkNVAb/FFIMw3LnfNdlH1/ep6KgiPDRlmyUfd0WdIQ3OACmeBegEFNFTzi7gEuzy2Yxg4LWf4IUVk8/bg==",
"cpu": [
"arm64"
],
@@ -2489,9 +2428,9 @@
}
},
"node_modules/@swc/core-win32-ia32-msvc": {
- "version": "1.11.29",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.29.tgz",
- "integrity": "sha512-h+NjOrbqdRBYr5ItmStmQt6x3tnhqgwbj9YxdGPepbTDamFv7vFnhZR0YfB3jz3UKJ8H3uGJ65Zw1VsC+xpFkg==",
+ "version": "1.11.31",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.31.tgz",
+ "integrity": "sha512-hErXdCGsg7swWdG1fossuL8542I59xV+all751mYlBoZ8kOghLSKObGQTkBbuNvc0sUKWfWg1X0iBuIhAYar+w==",
"cpu": [
"ia32"
],
@@ -2507,9 +2446,9 @@
}
},
"node_modules/@swc/core-win32-x64-msvc": {
- "version": "1.11.29",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.29.tgz",
- "integrity": "sha512-Q8cs2BDV9wqDvqobkXOYdC+pLUSEpX/KvI0Dgfun1F+LzuLotRFuDhrvkU9ETJA6OnD2+Fn/ieHgloiKA/Mn/g==",
+ "version": "1.11.31",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.31.tgz",
+ "integrity": "sha512-5t7SGjUBMMhF9b5j17ml/f/498kiBJNf4vZFNM421UGUEETdtjPN9jZIuQrowBkoFGJTCVL/ECM4YRtTH30u/A==",
"cpu": [
"x64"
],
@@ -2533,9 +2472,9 @@
"peer": true
},
"node_modules/@swc/types": {
- "version": "0.1.21",
- "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz",
- "integrity": "sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==",
+ "version": "0.1.22",
+ "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.22.tgz",
+ "integrity": "sha512-D13mY/ZA4PPEFSy6acki9eBT/3WgjMoRqNcdpIvjaYLQ44Xk5BdaL7UkDxAh6Z9UOe7tCCp67BVmZCojYp9owg==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
@@ -2595,21 +2534,10 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@tybys/wasm-util": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz",
- "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
"node_modules/@types/body-parser": {
- "version": "1.19.5",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
- "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
+ "version": "1.19.6",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
+ "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2638,9 +2566,9 @@
}
},
"node_modules/@types/cors": {
- "version": "2.8.18",
- "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz",
- "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==",
+ "version": "2.8.19",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz",
+ "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==",
"license": "MIT",
"dependencies": {
"@types/node": "*"
@@ -2688,16 +2616,16 @@
}
},
"node_modules/@types/estree": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
- "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/express": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.2.tgz",
- "integrity": "sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz",
+ "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2731,9 +2659,9 @@
}
},
"node_modules/@types/http-errors": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
- "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
+ "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
"dev": true,
"license": "MIT"
},
@@ -2795,9 +2723,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "22.15.29",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.29.tgz",
- "integrity": "sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==",
+ "version": "22.15.30",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.30.tgz",
+ "integrity": "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==",
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
@@ -2867,9 +2795,9 @@
"license": "MIT"
},
"node_modules/@types/send": {
- "version": "0.17.4",
- "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
- "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
+ "version": "0.17.5",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz",
+ "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2878,9 +2806,9 @@
}
},
"node_modules/@types/serve-static": {
- "version": "1.15.7",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
- "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
+ "version": "1.15.8",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz",
+ "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3157,251 +3085,10 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@unrs/resolver-binding-darwin-arm64": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.9.tgz",
- "integrity": "sha512-hWbcVTcNqgUirY5DC3heOLrz35D926r2izfxveBmuIgDwx9KkUHfqd93g8PtROJX01lvhmyAc3E09/ma6jhyqQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@unrs/resolver-binding-darwin-x64": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.9.tgz",
- "integrity": "sha512-NCZb/oaXELjt8jtm6ztlNPpAxKZsKIxsGYPSxkwQdQ/zl7X2PfyCpWqwoGE4A9vCP6gAgJnvH3e22nE0qk9ieA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@unrs/resolver-binding-freebsd-x64": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.9.tgz",
- "integrity": "sha512-/AYheGgFn9Pw3X3pYFCohznydaUA9980/wlwgbgCsVxnY4IbqVoZhTLQZ4JWKKaOWBwwmM8FseHf5h5OawyOQQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.9.tgz",
- "integrity": "sha512-RYV9sEH3o6SZum5wGb9evXlgibsVfluuiyi09hXVD+qPRrCSB45h3z1HjZpe9+c25GiN53CEy149fYS0fLVBtw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.9.tgz",
- "integrity": "sha512-0ishMZMCYNJd4SNjHnjByHWh6ia7EDVZrOVAW8wf9Vz2PTZ0pLrFwu5c9voHouGKg7s2cnzPz87c0OK7dwimUQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.9.tgz",
- "integrity": "sha512-FOspRldYylONzWCkF5n/B1MMYKXXlg2bzgcgESEVcP4LFh0eom/0XsWvfy+dlfBJ+FkYfJjvBJeje14xOBOa6g==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.9.tgz",
- "integrity": "sha512-P1S5jTht888/1mZVrBZx8IOxpikRDPoECxod1CcAHYUZGUNr+PNp1m5eB9FWMK2zRCJ8HgHNZfdRyDf9pNCrlQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.9.tgz",
- "integrity": "sha512-cD9+BPxlFSiIkGWknSgKdTMGZIzCtSIg/O7GJ1LoC+jGtUOBNBJYMn6FyEPRvdpphewYzaCuPsikrMkpdX303Q==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.9.tgz",
- "integrity": "sha512-Z6IuWg9u0257dCVgc/x/zIKamqJhrmaOFuq3AYsSt6ZtyEHoyD5kxdXQUvEgBAd/Fn1b8tsX+VD9mB9al5306Q==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.9.tgz",
- "integrity": "sha512-HpINrXLJVEpvkHHIla6pqhMAKbQBrY+2946i6rF6OlByONLTuObg65bcv3A38qV9yqJ7vtE0FyfNn68k0uQKbg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.9.tgz",
- "integrity": "sha512-ZXZFfaPFXnrDIPpkFoAZmxzXwqqfCHfnFdZhrEd+mrc/hHTQyxINyzrFMFCqtAa5eIjD7vgzNIXsMFU2QBnCPw==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.9.tgz",
- "integrity": "sha512-EzeeaZnuQOa93ox08oa9DqgQc8sK59jfs+apOUrZZSJCDG1ZbtJINPc8uRqE7p3Z66FPAe/uO3+7jZTkWbVDfg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-x64-musl": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.9.tgz",
- "integrity": "sha512-a07ezNt0OY8Vv/iDreJo7ZkKtwRb6UCYaCcMY2nm3ext7rTtDFS7X1GePqrbByvIbRFd6E5q1CKBPzJk6M360Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-wasm32-wasi": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.9.tgz",
- "integrity": "sha512-d0fHnxgtrv75Po6LKJLjo1LFC5S0E8vv86H/5wGDFLG0AvS/0k+SghgUW6zAzjM2XRAic/qcy9+O7n/5JOjxFA==",
- "cpu": [
- "wasm32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@napi-rs/wasm-runtime": "^0.2.10"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.9.tgz",
- "integrity": "sha512-0MFcaQDsUYxNqRxjPdsMKg1OGtmsqLzPY2Nwiiyalx6HFvkcHxgRCAOppgeUuDucpUEf76k/4tBzfzPxjYkFUg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.9.tgz",
- "integrity": "sha512-SiewmebiN32RpzrV1Dvbw7kdDCRuPThdgEWKJvDNcEGnVEV3ScYGuk5smJjKHXszqNX3mIXG/PcCXqHsE/7XGA==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.9.tgz",
- "integrity": "sha512-hORofIRZCm85+TUZ9OmHQJNlgtOmK/TPfvYeSplKAl+zQvAwMGyy6DZcSbrF+KdB1EDoGISwU7dX7PE92haOXg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
"node_modules/@vitest/coverage-v8": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.1.tgz",
- "integrity": "sha512-6dy0uF/0BE3jpUW9bFzg0V2S4F7XVaZHL/7qma1XANvHPQGoJuc3wtx911zSoAgUnpfvcLVK1vancNJ95d+uxQ==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.2.tgz",
+ "integrity": "sha512-RVAi5xnqedSKvaoQyCTWvncMk8eYZcTTOsLK7XmnfOEvdGP/O/upA0/MA8Ss+Qs++mj0GcSRi/whR0S5iBPpTQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3423,8 +3110,8 @@
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
- "@vitest/browser": "3.2.1",
- "vitest": "3.2.1"
+ "@vitest/browser": "3.2.2",
+ "vitest": "3.2.2"
},
"peerDependenciesMeta": {
"@vitest/browser": {
@@ -3456,15 +3143,15 @@
}
},
"node_modules/@vitest/expect": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.1.tgz",
- "integrity": "sha512-FqS/BnDOzV6+IpxrTg5GQRyLOCtcJqkwMwcS8qGCI2IyRVDwPAtutztaf1CjtPHlZlWtl1yUPCd7HM0cNiDOYw==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.2.tgz",
+ "integrity": "sha512-ipHw0z669vEMjzz3xQE8nJX1s0rQIb7oEl4jjl35qWTwm/KIHERIg/p/zORrjAaZKXfsv7IybcNGHwhOOAPMwQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/chai": "^5.2.2",
- "@vitest/spy": "3.2.1",
- "@vitest/utils": "3.2.1",
+ "@vitest/spy": "3.2.2",
+ "@vitest/utils": "3.2.2",
"chai": "^5.2.0",
"tinyrainbow": "^2.0.0"
},
@@ -3473,13 +3160,13 @@
}
},
"node_modules/@vitest/mocker": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.1.tgz",
- "integrity": "sha512-OXxMJnx1lkB+Vl65Re5BrsZEHc90s5NMjD23ZQ9NlU7f7nZiETGoX4NeKZSmsKjseuMq2uOYXdLOeoM0pJU+qw==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.2.tgz",
+ "integrity": "sha512-jKojcaRyIYpDEf+s7/dD3LJt53c0dPfp5zCPXz9H/kcGrSlovU/t1yEaNzM9oFME3dcd4ULwRI/x0Po1Zf+LTw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/spy": "3.2.1",
+ "@vitest/spy": "3.2.2",
"estree-walker": "^3.0.3",
"magic-string": "^0.30.17"
},
@@ -3510,9 +3197,9 @@
}
},
"node_modules/@vitest/pretty-format": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.1.tgz",
- "integrity": "sha512-xBh1X2GPlOGBupp6E1RcUQWIxw0w/hRLd3XyBS6H+dMdKTAqHDNsIR2AnJwPA3yYe9DFy3VUKTe3VRTrAiQ01g==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.2.tgz",
+ "integrity": "sha512-FY4o4U1UDhO9KMd2Wee5vumwcaHw7Vg4V7yR4Oq6uK34nhEJOmdRYrk3ClburPRUA09lXD/oXWZ8y/Sdma0aUQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3523,13 +3210,13 @@
}
},
"node_modules/@vitest/runner": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.1.tgz",
- "integrity": "sha512-kygXhNTu/wkMYbwYpS3z/9tBe0O8qpdBuC3dD/AW9sWa0LE/DAZEjnHtWA9sIad7lpD4nFW1yQ+zN7mEKNH3yA==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.2.tgz",
+ "integrity": "sha512-GYcHcaS3ejGRZYed2GAkvsjBeXIEerDKdX3orQrBJqLRiea4NSS9qvn9Nxmuy1IwIB+EjFOaxXnX79l8HFaBwg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/utils": "3.2.1",
+ "@vitest/utils": "3.2.2",
"pathe": "^2.0.3"
},
"funding": {
@@ -3537,13 +3224,13 @@
}
},
"node_modules/@vitest/snapshot": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.1.tgz",
- "integrity": "sha512-5xko/ZpW2Yc65NVK9Gpfg2y4BFvcF+At7yRT5AHUpTg9JvZ4xZoyuRY4ASlmNcBZjMslV08VRLDrBOmUe2YX3g==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.2.tgz",
+ "integrity": "sha512-aMEI2XFlR1aNECbBs5C5IZopfi5Lb8QJZGGpzS8ZUHML5La5wCbrbhLOVSME68qwpT05ROEEOAZPRXFpxZV2wA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "3.2.1",
+ "@vitest/pretty-format": "3.2.2",
"magic-string": "^0.30.17",
"pathe": "^2.0.3"
},
@@ -3552,9 +3239,9 @@
}
},
"node_modules/@vitest/spy": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.1.tgz",
- "integrity": "sha512-Nbfib34Z2rfcJGSetMxjDCznn4pCYPZOtQYox2kzebIJcgH75yheIKd5QYSFmR8DIZf2M8fwOm66qSDIfRFFfQ==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.2.tgz",
+ "integrity": "sha512-6Utxlx3o7pcTxvp0u8kUiXtRFScMrUg28KjB3R2hon7w4YqOFAEA9QwzPVVS1QNL3smo4xRNOpNZClRVfpMcYg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3565,13 +3252,13 @@
}
},
"node_modules/@vitest/utils": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.1.tgz",
- "integrity": "sha512-KkHlGhePEKZSub5ViknBcN5KEF+u7dSUr9NW8QsVICusUojrgrOnnY3DEWWO877ax2Pyopuk2qHmt+gkNKnBVw==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.2.tgz",
+ "integrity": "sha512-qJYMllrWpF/OYfWHP32T31QCaLa3BAzT/n/8mNGhPdVcjY+JYazQFO1nsJvXU12Kp1xMpNY4AGuljPTNjQve6A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "3.2.1",
+ "@vitest/pretty-format": "3.2.2",
"loupe": "^3.1.3",
"tinyrainbow": "^2.0.0"
},
@@ -5495,38 +5182,6 @@
"eslint": ">=8.40.0"
}
},
- "node_modules/eslint-import-context": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.7.tgz",
- "integrity": "sha512-gRkcGvLn+lYEBmv8OSzHciuS0Py6MPd0EEb112C1iHOgvrbnaveqL/f3nEccqHuN8+jGDVOADu0JCMrikCgm3w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "get-tsconfig": "^4.10.1",
- "stable-hash": "^0.0.6"
- },
- "engines": {
- "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint-import-context"
- },
- "peerDependencies": {
- "unrs-resolver": "^1.0.0"
- },
- "peerDependenciesMeta": {
- "unrs-resolver": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-import-context/node_modules/stable-hash": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.6.tgz",
- "integrity": "sha512-0afH4mobqTybYZsXImQRLOjHV4gvOW+92HdUIax9t7a8d9v54KWykEuMVIcXhD9BCi+w3kS4x7O6fmZQ3JlG/g==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/eslint-json-compat-utils": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/eslint-json-compat-utils/-/eslint-json-compat-utils-0.2.1.tgz",
@@ -5658,43 +5313,6 @@
"eslint": "^8.40.0 || ^9.0.0"
}
},
- "node_modules/eslint-plugin-import-x": {
- "version": "4.15.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.15.0.tgz",
- "integrity": "sha512-oqCESQlM8r0iRioPHmDqrblH69u11NuglErCnMIY2FcY0UfCCs7qlEuiuqkYKT0puJSQq+fXpDD0MvMTQsAhoQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "^8.33.0",
- "comment-parser": "^1.4.1",
- "debug": "^4.4.1",
- "eslint-import-context": "^0.1.6",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.3 || ^10.0.1",
- "semver": "^7.7.2",
- "stable-hash": "^0.0.5",
- "unrs-resolver": "^1.7.8"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint-plugin-import-x"
- },
- "peerDependencies": {
- "@typescript-eslint/utils": "^8.0.0",
- "eslint": "^8.57.0 || ^9.0.0",
- "eslint-import-resolver-node": "*"
- },
- "peerDependenciesMeta": {
- "@typescript-eslint/utils": {
- "optional": true
- },
- "eslint-import-resolver-node": {
- "optional": true
- }
- }
- },
"node_modules/eslint-plugin-jsdoc": {
"version": "50.7.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.7.1.tgz",
@@ -5951,6 +5569,33 @@
"eslint": ">=9.22.0"
}
},
+ "node_modules/eslint-plugin-unicorn/node_modules/@eslint/core": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz",
+ "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/eslint-plugin-unicorn/node_modules/@eslint/plugin-kit": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz",
+ "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.13.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
"node_modules/eslint-plugin-unused-imports": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.4.tgz",
@@ -5968,9 +5613,9 @@
}
},
"node_modules/eslint-plugin-vue": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.1.0.tgz",
- "integrity": "sha512-/VTiJ1eSfNLw6lvG9ENySbGmcVvz6wZ9nA7ZqXlLBY2RkaF15iViYKxglWiIch12KiLAj0j1iXPYU6W4wTROFA==",
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.2.0.tgz",
+ "integrity": "sha512-tl9s+KN3z0hN2b8fV2xSs5ytGl7Esk1oSCxULLwFcdaElhZ8btYYZFrWxvh4En+czrSDtuLCeCOGa8HhEZuBdQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6056,35 +5701,6 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/@eslint/core": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
- "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
- "dev": true,
- "license": "Apache-2.0",
- "peer": true,
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/eslint/node_modules/@eslint/plugin-kit": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz",
- "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==",
- "dev": true,
- "license": "Apache-2.0",
- "peer": true,
- "dependencies": {
- "@eslint/core": "^0.14.0",
- "levn": "^0.4.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
"node_modules/eslint/node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -6651,14 +6267,15 @@
}
},
"node_modules/form-data": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
- "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz",
+ "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
@@ -7533,9 +7150,9 @@
}
},
"node_modules/libphonenumber-js": {
- "version": "1.12.8",
- "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.8.tgz",
- "integrity": "sha512-f1KakiQJa9tdc7w1phC2ST+DyxWimy9c3g3yeF+84QtEanJr2K77wAmBPP22riU05xldniHsvXuflnLZ4oysqA==",
+ "version": "1.12.9",
+ "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.9.tgz",
+ "integrity": "sha512-VWwAdNeJgN7jFOD+wN4qx83DTPMVPPAUyx9/TUkBXKLiNkuWWk6anV0439tgdtwaJDrEdqkvdN22iA6J4bUCZg==",
"license": "MIT"
},
"node_modules/light-my-request": {
@@ -8916,22 +8533,6 @@
"integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
"license": "MIT"
},
- "node_modules/napi-postinstall": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.4.tgz",
- "integrity": "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "napi-postinstall": "lib/cli.js"
- },
- "engines": {
- "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/napi-postinstall"
- }
- },
"node_modules/natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
@@ -10140,9 +9741,9 @@
}
},
"node_modules/rollup": {
- "version": "4.41.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz",
- "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.42.0.tgz",
+ "integrity": "sha512-LW+Vse3BJPyGJGAJt1j8pWDKPd73QM8cRXYK1IxOBgL2AGLu7Xd2YOW0M2sLUBCkF5MshXXtMApyEAEzMVMsnw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10156,29 +9757,36 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.41.1",
- "@rollup/rollup-android-arm64": "4.41.1",
- "@rollup/rollup-darwin-arm64": "4.41.1",
- "@rollup/rollup-darwin-x64": "4.41.1",
- "@rollup/rollup-freebsd-arm64": "4.41.1",
- "@rollup/rollup-freebsd-x64": "4.41.1",
- "@rollup/rollup-linux-arm-gnueabihf": "4.41.1",
- "@rollup/rollup-linux-arm-musleabihf": "4.41.1",
- "@rollup/rollup-linux-arm64-gnu": "4.41.1",
- "@rollup/rollup-linux-arm64-musl": "4.41.1",
- "@rollup/rollup-linux-loongarch64-gnu": "4.41.1",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1",
- "@rollup/rollup-linux-riscv64-gnu": "4.41.1",
- "@rollup/rollup-linux-riscv64-musl": "4.41.1",
- "@rollup/rollup-linux-s390x-gnu": "4.41.1",
- "@rollup/rollup-linux-x64-gnu": "4.41.1",
- "@rollup/rollup-linux-x64-musl": "4.41.1",
- "@rollup/rollup-win32-arm64-msvc": "4.41.1",
- "@rollup/rollup-win32-ia32-msvc": "4.41.1",
- "@rollup/rollup-win32-x64-msvc": "4.41.1",
+ "@rollup/rollup-android-arm-eabi": "4.42.0",
+ "@rollup/rollup-android-arm64": "4.42.0",
+ "@rollup/rollup-darwin-arm64": "4.42.0",
+ "@rollup/rollup-darwin-x64": "4.42.0",
+ "@rollup/rollup-freebsd-arm64": "4.42.0",
+ "@rollup/rollup-freebsd-x64": "4.42.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.42.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.42.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.42.0",
+ "@rollup/rollup-linux-arm64-musl": "4.42.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.42.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.42.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.42.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.42.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.42.0",
+ "@rollup/rollup-linux-x64-gnu": "4.42.0",
+ "@rollup/rollup-linux-x64-musl": "4.42.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.42.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.42.0",
+ "@rollup/rollup-win32-x64-msvc": "4.42.0",
"fsevents": "~2.3.2"
}
},
+ "node_modules/rollup/node_modules/@types/estree": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
+ "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -10673,13 +10281,6 @@
"node": ">= 10.x"
}
},
- "node_modules/stable-hash": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
- "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/stackback": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
@@ -11042,9 +10643,9 @@
"license": "MIT"
},
"node_modules/terser": {
- "version": "5.40.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.40.0.tgz",
- "integrity": "sha512-cfeKl/jjwSR5ar7d0FGmave9hFGJT8obyo0z+CrQOylLDbk7X81nPU6vq9VORa5jU30SkDnT2FXjLbR8HLP+xA==",
+ "version": "5.41.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.41.0.tgz",
+ "integrity": "sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw==",
"dev": true,
"license": "BSD-2-Clause",
"peer": true,
@@ -11620,39 +11221,6 @@
"@swc/core": "^1.2.108"
}
},
- "node_modules/unrs-resolver": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.9.tgz",
- "integrity": "sha512-hhFtY782YKwpz54G1db49YYS1RuMn8mBylIrCldrjb9BxZKnQ2xHw7+2zcl7H6fnUlTHGWv23/+677cpufhfxQ==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "napi-postinstall": "^0.2.2"
- },
- "funding": {
- "url": "https://opencollective.com/unrs-resolver"
- },
- "optionalDependencies": {
- "@unrs/resolver-binding-darwin-arm64": "1.7.9",
- "@unrs/resolver-binding-darwin-x64": "1.7.9",
- "@unrs/resolver-binding-freebsd-x64": "1.7.9",
- "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.9",
- "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.9",
- "@unrs/resolver-binding-linux-arm64-gnu": "1.7.9",
- "@unrs/resolver-binding-linux-arm64-musl": "1.7.9",
- "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.9",
- "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.9",
- "@unrs/resolver-binding-linux-riscv64-musl": "1.7.9",
- "@unrs/resolver-binding-linux-s390x-gnu": "1.7.9",
- "@unrs/resolver-binding-linux-x64-gnu": "1.7.9",
- "@unrs/resolver-binding-linux-x64-musl": "1.7.9",
- "@unrs/resolver-binding-wasm32-wasi": "1.7.9",
- "@unrs/resolver-binding-win32-arm64-msvc": "1.7.9",
- "@unrs/resolver-binding-win32-ia32-msvc": "1.7.9",
- "@unrs/resolver-binding-win32-x64-msvc": "1.7.9"
- }
- },
"node_modules/unzipper": {
"version": "0.12.3",
"resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz",
@@ -11824,9 +11392,9 @@
}
},
"node_modules/vite-node": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.1.tgz",
- "integrity": "sha512-V4EyKQPxquurNJPtQJRZo8hKOoKNBRIhxcDbQFPFig0JdoWcUhwRgK8yoCXXrfYVPKS6XwirGHPszLnR8FbjCA==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.2.tgz",
+ "integrity": "sha512-Xj/jovjZvDXOq2FgLXu8NsY4uHUMWtzVmMC2LkCu9HWdr9Qu1Is5sanX3Z4jOFKdohfaWDnEJWp9pRP0vVpAcA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11847,20 +11415,20 @@
}
},
"node_modules/vitest": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.1.tgz",
- "integrity": "sha512-VZ40MBnlE1/V5uTgdqY3DmjUgZtIzsYq758JGlyQrv5syIsaYcabkfPkEuWML49Ph0D/SoqpVFd0dyVTr551oA==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.2.tgz",
+ "integrity": "sha512-fyNn/Rp016Bt5qvY0OQvIUCwW2vnaEBLxP42PmKbNIoasSYjML+8xyeADOPvBe+Xfl/ubIw4og7Lt9jflRsCNw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/chai": "^5.2.2",
- "@vitest/expect": "3.2.1",
- "@vitest/mocker": "3.2.1",
- "@vitest/pretty-format": "^3.2.1",
- "@vitest/runner": "3.2.1",
- "@vitest/snapshot": "3.2.1",
- "@vitest/spy": "3.2.1",
- "@vitest/utils": "3.2.1",
+ "@vitest/expect": "3.2.2",
+ "@vitest/mocker": "3.2.2",
+ "@vitest/pretty-format": "^3.2.2",
+ "@vitest/runner": "3.2.2",
+ "@vitest/snapshot": "3.2.2",
+ "@vitest/spy": "3.2.2",
+ "@vitest/utils": "3.2.2",
"chai": "^5.2.0",
"debug": "^4.4.1",
"expect-type": "^1.2.1",
@@ -11874,7 +11442,7 @@
"tinypool": "^1.1.0",
"tinyrainbow": "^2.0.0",
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0",
- "vite-node": "3.2.1",
+ "vite-node": "3.2.2",
"why-is-node-running": "^2.3.0"
},
"bin": {
@@ -11890,8 +11458,8 @@
"@edge-runtime/vm": "*",
"@types/debug": "^4.1.12",
"@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
- "@vitest/browser": "3.2.1",
- "@vitest/ui": "3.2.1",
+ "@vitest/browser": "3.2.2",
+ "@vitest/ui": "3.2.2",
"happy-dom": "*",
"jsdom": "*"
},
diff --git a/package.json b/package.json
index 9ca5b03e5..9de736b30 100644
--- a/package.json
+++ b/package.json
@@ -120,22 +120,22 @@
"unzipper": "0.12.3"
},
"devDependencies": {
- "@antfu/eslint-config": "^4.13.3",
+ "@antfu/eslint-config": "^4.14.1",
"@nestjs/testing": "^10.4.18",
"@prettier/plugin-xml": "^3.4.1",
"@types/fs-extra": "^11.0.4",
"@types/lodash": "^4.17.17",
- "@types/node": "^22.15.29",
+ "@types/node": "^22.15.30",
"@types/node-schedule": "^2.1.7",
"@types/passport-jwt": "^4.0.1",
"@types/semver": "^7.7.0",
"@types/tail": "^2.2.3",
"@types/tcp-port-used": "^1.0.4",
"@types/unzipper": "^0.10.11",
- "@vitest/coverage-v8": "^3.2.1",
+ "@vitest/coverage-v8": "^3.2.2",
"concurrently": "^9.1.2",
"eslint-plugin-format": "^1.0.1",
- "form-data": "^4.0.2",
+ "form-data": "^4.0.3",
"nodemon": "^3.1.10",
"rimraf": "^6.0.1",
"ts-loader": "^9.5.2",
@@ -143,7 +143,7 @@
"tsconfig-paths": "^4.2.0",
"typescript": "^5.8.3",
"unplugin-swc": "^1.5.4",
- "vitest": "^3.2.1"
+ "vitest": "^3.2.2"
},
"overrides": {
"@nestjs/platform-fastify": {
diff --git a/ui/package-lock.json b/ui/package-lock.json
index d42c5b293..2897aad1a 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -10,15 +10,15 @@
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
- "@angular/animations": "20.0.0",
- "@angular/common": "20.0.0",
- "@angular/compiler": "20.0.0",
- "@angular/core": "20.0.0",
- "@angular/forms": "20.0.0",
- "@angular/localize": "20.0.0",
- "@angular/platform-browser": "20.0.0",
- "@angular/platform-browser-dynamic": "20.0.0",
- "@angular/router": "20.0.0",
+ "@angular/animations": "20.0.2",
+ "@angular/common": "20.0.2",
+ "@angular/compiler": "20.0.2",
+ "@angular/core": "20.0.2",
+ "@angular/forms": "20.0.2",
+ "@angular/localize": "20.0.2",
+ "@angular/platform-browser": "20.0.2",
+ "@angular/platform-browser-dynamic": "20.0.2",
+ "@angular/router": "20.0.2",
"@auth0/angular-jwt": "5.2.0",
"@homebridge/hap-client": "2.2.0",
"@ng-bootstrap/ng-bootstrap": "18.0.0",
@@ -55,16 +55,16 @@
"zone.js": "0.15.1"
},
"devDependencies": {
- "@angular/build": "^20.0.0",
- "@angular/cli": "^20.0.0",
- "@angular/compiler-cli": "^20.0.0",
- "@angular/language-service": "^20.0.0",
+ "@angular/build": "^20.0.1",
+ "@angular/cli": "^20.0.1",
+ "@angular/compiler-cli": "^20.0.1",
+ "@angular/language-service": "^20.0.1",
"@fortawesome/fontawesome-free": "^6.7.2",
"@homebridge/plugin-ui-utils": "^2.1.0",
"@types/emoji-js": "^3.5.2",
"@types/file-saver": "^2.0.7",
"@types/lodash-es": "^4.17.12",
- "@types/node": "^22.15.29",
+ "@types/node": "^22.15.30",
"@types/qrcode": "^1.5.5",
"@types/semver": "^7.7.0",
"he": "^1.2.0",
@@ -87,13 +87,13 @@
}
},
"node_modules/@angular-devkit/architect": {
- "version": "0.2000.0",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2000.0.tgz",
- "integrity": "sha512-6accOuvf1BY6hTO5LzYcxp2Dpl0bThgYF3KdwVWqrYF5+6PWfQLdy+rKxBiCIv0+0OngZVI79RuAtUKFowFM/A==",
+ "version": "0.2000.1",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2000.1.tgz",
+ "integrity": "sha512-EcOGU1xEhARYpDF391VaeUg/+YRym9OxzJMcc0rSHl3YLK8/m+24ap2YAQY5N7n9+mmEqHVu/q31ldFpOoMCTw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "20.0.0",
+ "@angular-devkit/core": "20.0.1",
"rxjs": "7.8.2"
},
"engines": {
@@ -103,9 +103,9 @@
}
},
"node_modules/@angular-devkit/core": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.0.tgz",
- "integrity": "sha512-cnB/I1QQC3WoIcb+f/7hknOOkgIFjAuxd7nW1RnS+pn0qQTWyjnXjq2jocx2TBMwZRikycc7f3mlA1DgWzJUuQ==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.1.tgz",
+ "integrity": "sha512-Ilafyj8JVwq3NZsaiGw5UDkP4EAkGKiEvZ4TC3WVidZbM4EpKt9/Jd7ZpsTRGDLG429U+fGhay+ZQeCFGqy5rA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -131,13 +131,13 @@
}
},
"node_modules/@angular-devkit/schematics": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.0.0.tgz",
- "integrity": "sha512-35WbWP8ARnaqVjOzy7IOyWsY/jeyUqfVj4KgHG2O4fHAhIhaBqhP8dDDP+SwM+bToIqklg0fzHUUhFTRxzzyoQ==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.0.1.tgz",
+ "integrity": "sha512-bSr/5YIdjtwKYqylkYrlOVP+tuFz+tfOldmLfWHAsDGnJUznb5t4ckx6yyROp+iDQfu2Aez09p+l4KfUBq+H9A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "20.0.0",
+ "@angular-devkit/core": "20.0.1",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.17",
"ora": "8.2.0",
@@ -150,9 +150,9 @@
}
},
"node_modules/@angular/animations": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.0.0.tgz",
- "integrity": "sha512-yU4hUH6AheY0dnMSaLRMfgnXhg/JUSUvrhE+lHzIiSKdEf0lyo1Ri6bkPD1CbamxZ94BqhRNCApvbvTbibGICQ==",
+ "version": "20.0.2",
+ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.0.2.tgz",
+ "integrity": "sha512-p9TqZdVOFWMF75lfxk++5GZOBGO3K7qVdAXiQw89VLac8yqsu9iXFlcq34x256McHxONTjrrKBeP5oU1T8rxCw==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -161,19 +161,19 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.0",
- "@angular/core": "20.0.0"
+ "@angular/common": "20.0.2",
+ "@angular/core": "20.0.2"
}
},
"node_modules/@angular/build": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.0.0.tgz",
- "integrity": "sha512-b/FAvvUbsMEgr+UlvTtDz4NCv+BFi+55swtKRmaritvZ2rDfhF1x9tUmSkT6GebGXkI/Gg0kl5rJoD5iv5lY3A==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.0.1.tgz",
+ "integrity": "sha512-m/0jtXIeOaoU/WXtMLRuvq7UaGRxNHpoRKVVoJrifvZuNBYGM4e2lzxlIlo8kiQhPpZQc0zcAMoosbmzKKdkUQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
- "@angular-devkit/architect": "0.2000.0",
+ "@angular-devkit/architect": "0.2000.1",
"@babel/core": "7.27.1",
"@babel/helper-annotate-as-pure": "7.27.1",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -215,7 +215,7 @@
"@angular/platform-browser": "^20.0.0",
"@angular/platform-server": "^20.0.0",
"@angular/service-worker": "^20.0.0",
- "@angular/ssr": "^20.0.0",
+ "@angular/ssr": "^20.0.1",
"karma": "^6.4.0",
"less": "^4.2.0",
"ng-packagr": "^20.0.0",
@@ -265,9 +265,9 @@
}
},
"node_modules/@angular/cdk": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.0.1.tgz",
- "integrity": "sha512-llJIyKdF9D0hJ9/PNy9A5vmayNgHr7MtQrtjpeLyPuK8qkUnxQd9Hzv5olqixRrbxxDs/Lt0l1T2ViHGy7WYhg==",
+ "version": "20.0.2",
+ "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.0.2.tgz",
+ "integrity": "sha512-gRQcpTNhnwBxXSmpnrljODUHQmB2Hnxc6L2Ad6mSMV+c3opd9KIFxL5eG2WOOPHGAaPrV4gNFw+t1i01U4grTg==",
"license": "MIT",
"peer": true,
"dependencies": {
@@ -281,18 +281,18 @@
}
},
"node_modules/@angular/cli": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.0.0.tgz",
- "integrity": "sha512-k9EDaaLYTMWkBbayUh6Tf0PJ+E0e6jRPrjOSPsOJHRh+S5BsNdLIsKJmThGXkq2wnD35+2CKPy9UQyvfaIA5KQ==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.0.1.tgz",
+ "integrity": "sha512-OU91byvG/WsDDUVmXIJr3/sU89U6g8G8IXrqgVRVPgjXKEQMnUNBlmygD2rMUR5C02g2lGc6s2j0hnOJ/dDNOw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/architect": "0.2000.0",
- "@angular-devkit/core": "20.0.0",
- "@angular-devkit/schematics": "20.0.0",
+ "@angular-devkit/architect": "0.2000.1",
+ "@angular-devkit/core": "20.0.1",
+ "@angular-devkit/schematics": "20.0.1",
"@inquirer/prompts": "7.5.1",
"@listr2/prompt-adapter-inquirer": "2.0.22",
- "@schematics/angular": "20.0.0",
+ "@schematics/angular": "20.0.1",
"@yarnpkg/lockfile": "1.1.0",
"ini": "5.0.0",
"jsonc-parser": "3.3.1",
@@ -314,9 +314,9 @@
}
},
"node_modules/@angular/common": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.0.0.tgz",
- "integrity": "sha512-tZTvxDjx+wH74/hIpip63u4tlaXNVXkq1iVf4gk7RPQGCAYLNPDWma8X+RpXMXWikn4/mA5NS1VBBtStTbS+gg==",
+ "version": "20.0.2",
+ "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.0.2.tgz",
+ "integrity": "sha512-dqzKFL2MgPpQiaY9ZyDhGZYWEXblsqofW6czH/+HkmlNgSmDCBaY/UhNQShxNQ0KQbR1o08OWuQr29zxkY1CMA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -325,14 +325,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/core": "20.0.0",
+ "@angular/core": "20.0.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.0.0.tgz",
- "integrity": "sha512-RzS7MFNy/f8Tft0u6Q1zszzFTeki4408zsBALwmS91a8O8x/jaEvfwA7swC7RiqiX9KKmAyuBJ0qiv42v1T5dA==",
+ "version": "20.0.2",
+ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.0.2.tgz",
+ "integrity": "sha512-BJYXGUZaY9awYvgt0w9TDq73A1+m8W5eMRn/krWeQcfWakwTgs27BSxmhfJhD45KrMrky5yxAvGgqSfMKrLeng==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -342,19 +342,19 @@
}
},
"node_modules/@angular/compiler-cli": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.0.0.tgz",
- "integrity": "sha512-dPFp/YyRJkiyppnoI85mZz0CJv0ulc5MpJV16Lx0qdrRyoKmBrGmdaGEP0DOhhBLVAmJ5J2wvShvWfE2pjMMWw==",
+ "version": "20.0.2",
+ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.0.2.tgz",
+ "integrity": "sha512-kVKHS5ZRadTR+rRuBl3Dsccsv/jiHXdJJYlDQwQW87afd4RtAu75P3RsSd8jaUj+7P9O4Ve4vwCZVtgOh0yxbw==",
"license": "MIT",
"dependencies": {
- "@babel/core": "7.27.1",
+ "@babel/core": "7.27.4",
"@jridgewell/sourcemap-codec": "^1.4.14",
"chokidar": "^4.0.0",
"convert-source-map": "^1.5.1",
"reflect-metadata": "^0.2.0",
"semver": "^7.0.0",
"tslib": "^2.3.0",
- "yargs": "^17.2.1"
+ "yargs": "^18.0.0"
},
"bin": {
"ng-xi18n": "bundles/src/bin/ng_xi18n.js",
@@ -364,7 +364,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/compiler": "20.0.0",
+ "@angular/compiler": "20.0.2",
"typescript": ">=5.8 <5.9"
},
"peerDependenciesMeta": {
@@ -373,10 +373,112 @@
}
}
},
+ "node_modules/@angular/compiler-cli/node_modules/@babel/core": {
+ "version": "7.27.4",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz",
+ "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.27.3",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-module-transforms": "^7.27.3",
+ "@babel/helpers": "^7.27.4",
+ "@babel/parser": "^7.27.4",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.27.4",
+ "@babel/types": "^7.27.3",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "license": "MIT"
+ },
+ "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@angular/compiler-cli/node_modules/cliui": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
+ "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^7.2.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@angular/compiler-cli/node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@angular/compiler-cli/node_modules/yargs": {
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz",
+ "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^9.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "string-width": "^7.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^22.0.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
+ "node_modules/@angular/compiler-cli/node_modules/yargs-parser": {
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
+ "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
+ "license": "ISC",
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
"node_modules/@angular/core": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.0.0.tgz",
- "integrity": "sha512-2UjKbTtYSY8omY+LE4G6hQ1/R4PkE6NY7/2u99TxLH/oOnc9broCH1g9ITU+n0eJURcOFeK0/w6RdSrK+di3pg==",
+ "version": "20.0.2",
+ "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.0.2.tgz",
+ "integrity": "sha512-z9L8WPrHTkfupHtpO6aW4KqcqigIhxcQwCaEMgXWc5WJkoiMJSfo/dk+cyiGjCfTkc5Y6DO6f6ERi0IWYWWbPA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -385,7 +487,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/compiler": "20.0.0",
+ "@angular/compiler": "20.0.2",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0"
},
@@ -399,9 +501,9 @@
}
},
"node_modules/@angular/forms": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.0.0.tgz",
- "integrity": "sha512-6yeb99IrNyeyj7o0bbd+n3JTZrXX2dJfdYLJH3tlXVlO9wg63bq+YR1AeM+RDCYMs+YDJis0lQpF6s+OICJv4g==",
+ "version": "20.0.2",
+ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.0.2.tgz",
+ "integrity": "sha512-RrQKwzFZsEDXsvesNXS4XxndEKZHC+VexIdRr1vlxx7isfvpl4htOxceW0D+Gvku1mnaS99eB/AWS50HxW3B3Q==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -410,16 +512,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.0",
- "@angular/core": "20.0.0",
- "@angular/platform-browser": "20.0.0",
+ "@angular/common": "20.0.2",
+ "@angular/core": "20.0.2",
+ "@angular/platform-browser": "20.0.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/language-service": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-20.0.0.tgz",
- "integrity": "sha512-lprUUz56dk3ORWGD6Z7Hmzo2MqxezW5qXaxpJHOow3+8/Jx6q+PPWCZrFSEyTtaKr/oRGzHLVCEzB+tmB980Fw==",
+ "version": "20.0.2",
+ "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-20.0.2.tgz",
+ "integrity": "sha512-CUkKyuMUvRqJR5BeSDQ4gGX8z5vxRkQ0mqIq4uMXrFs/rMn7cYqfzr3rjxp0S69wsOKF4G/6pgN5xpUhnqhdgw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -427,15 +529,15 @@
}
},
"node_modules/@angular/localize": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-20.0.0.tgz",
- "integrity": "sha512-sGu8QA2lj/4soCRhK1LtWc5yhBPPfb/7M+3p+jUgzPiO5ZaeDjvi/NLwJjIlBkUAfTVpRxADLJjAziRGar5gtw==",
+ "version": "20.0.2",
+ "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-20.0.2.tgz",
+ "integrity": "sha512-k872tsni1WhrxZNEreCrPatcs35le1LZiLYXg6iGvDmwr8K125DiI2cC6l0dSoD6b3qwP2g+BtRT5lR8V6ROrg==",
"license": "MIT",
"dependencies": {
- "@babel/core": "7.27.1",
+ "@babel/core": "7.27.4",
"@types/babel__core": "7.20.5",
"tinyglobby": "^0.2.12",
- "yargs": "^17.2.1"
+ "yargs": "^18.0.0"
},
"bin": {
"localize-extract": "tools/bundles/src/extract/cli.js",
@@ -446,14 +548,116 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/compiler": "20.0.0",
- "@angular/compiler-cli": "20.0.0"
+ "@angular/compiler": "20.0.2",
+ "@angular/compiler-cli": "20.0.2"
+ }
+ },
+ "node_modules/@angular/localize/node_modules/@babel/core": {
+ "version": "7.27.4",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz",
+ "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.27.3",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-module-transforms": "^7.27.3",
+ "@babel/helpers": "^7.27.4",
+ "@babel/parser": "^7.27.4",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.27.4",
+ "@babel/types": "^7.27.3",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@angular/localize/node_modules/cliui": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
+ "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^7.2.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@angular/localize/node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "license": "MIT"
+ },
+ "node_modules/@angular/localize/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@angular/localize/node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@angular/localize/node_modules/yargs": {
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz",
+ "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^9.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "string-width": "^7.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^22.0.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
+ "node_modules/@angular/localize/node_modules/yargs-parser": {
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
+ "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
+ "license": "ISC",
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
}
},
"node_modules/@angular/platform-browser": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.0.0.tgz",
- "integrity": "sha512-FP9YjT2beF0tov0wub6+eUQqJd2MwyYqEQQ6+Qx67ukd04plIryhrcImORehrsN24DbnHkyTqhCvUyNAZs2uwA==",
+ "version": "20.0.2",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.0.2.tgz",
+ "integrity": "sha512-4adMQSVlwxjY9z/LEk3Q5hr4/qbM9UD9FcqbyZOt3+BL+F2GwGdKzwg6Dj4Dv0Tv8/dudNSVgHc8lIdQ4C7K1w==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -462,9 +666,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/animations": "20.0.0",
- "@angular/common": "20.0.0",
- "@angular/core": "20.0.0"
+ "@angular/animations": "20.0.2",
+ "@angular/common": "20.0.2",
+ "@angular/core": "20.0.2"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -473,9 +677,9 @@
}
},
"node_modules/@angular/platform-browser-dynamic": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.0.0.tgz",
- "integrity": "sha512-AACq3Ijuq59SdLDmfxWU8hYlo8O4Br9OHWNAga2W0X6p/7HlpeZZVdTlb/KGVYRKJvGpgSB10QYlRPfm215q9Q==",
+ "version": "20.0.2",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.0.2.tgz",
+ "integrity": "sha512-8MDGsgcxUxSldcX6HRGB5dj+xOCQ8qmx8Vog9unEBNkuPH0vqvOepqn3prdV6dM31jYfJ9JAEKeEfNZFjuWSkA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -484,16 +688,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.0",
- "@angular/compiler": "20.0.0",
- "@angular/core": "20.0.0",
- "@angular/platform-browser": "20.0.0"
+ "@angular/common": "20.0.2",
+ "@angular/compiler": "20.0.2",
+ "@angular/core": "20.0.2",
+ "@angular/platform-browser": "20.0.2"
}
},
"node_modules/@angular/router": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.0.0.tgz",
- "integrity": "sha512-RQ7rU4NaZDSvvOfMZQmB50q7de+jrHYb+f0ExLKBvr80B1MK3oc9VvI2BzBkGfM4aGx71MMa0UizjOiT/31kqw==",
+ "version": "20.0.2",
+ "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.0.2.tgz",
+ "integrity": "sha512-UyuTeoXkkZw1eFFNwrTfb1JXow6HKVdLNb3n9MhqDz+3ekdiqDH8EBaKhxYZxlcpNoa6cNbECZJYtaHy1lw38g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -502,9 +706,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.0",
- "@angular/core": "20.0.0",
- "@angular/platform-browser": "20.0.0",
+ "@angular/common": "20.0.2",
+ "@angular/core": "20.0.2",
+ "@angular/platform-browser": "20.0.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
@@ -535,9 +739,9 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.27.3",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz",
- "integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==",
+ "version": "7.27.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz",
+ "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -589,12 +793,12 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.27.3",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz",
- "integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==",
+ "version": "7.27.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz",
+ "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.27.3",
+ "@babel/parser": "^7.27.5",
"@babel/types": "^7.27.3",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
@@ -713,22 +917,22 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.27.4",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.4.tgz",
- "integrity": "sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==",
+ "version": "7.27.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz",
+ "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==",
"license": "MIT",
"dependencies": {
"@babel/template": "^7.27.2",
- "@babel/types": "^7.27.3"
+ "@babel/types": "^7.27.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
- "version": "7.27.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.4.tgz",
- "integrity": "sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==",
+ "version": "7.27.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz",
+ "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.27.3"
@@ -773,9 +977,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.27.3",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz",
- "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==",
+ "version": "7.27.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz",
+ "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
@@ -3118,14 +3322,14 @@
]
},
"node_modules/@schematics/angular": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.0.0.tgz",
- "integrity": "sha512-lK5TvxEoeaoPnxM31qeNWhHUJ3kKMnRHknYhOfOmS8xfme78nS01FdU7TODLkg2p4GNEVVtXoxhj3FmrG3srKw==",
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.0.1.tgz",
+ "integrity": "sha512-29T9vUAjZnbXM+vImIQcdqG/ibdcfj5+pybo5cbiMSwVPVyerXgnD0HKC4dyZ34V2RFZa8cmyCLe/5bYoPQ+0g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "20.0.0",
- "@angular-devkit/schematics": "20.0.0",
+ "@angular-devkit/core": "20.0.1",
+ "@angular-devkit/schematics": "20.0.1",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -3359,9 +3563,9 @@
}
},
"node_modules/@types/node": {
- "version": "22.15.29",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.29.tgz",
- "integrity": "sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==",
+ "version": "22.15.30",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.30.tgz",
+ "integrity": "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3531,7 +3735,6 @@
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -3544,7 +3747,6 @@
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -3862,9 +4064,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001720",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001720.tgz",
- "integrity": "sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==",
+ "version": "1.0.30001721",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz",
+ "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==",
"funding": [
{
"type": "opencollective",
@@ -4014,6 +4216,7 @@
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
@@ -4028,6 +4231,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -4037,6 +4241,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
@@ -4052,12 +4257,14 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
"license": "MIT"
},
"node_modules/cliui/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -4067,6 +4274,7 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
@@ -4081,6 +4289,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
@@ -4093,6 +4302,7 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
@@ -4452,9 +4662,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
- "version": "1.5.162",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.162.tgz",
- "integrity": "sha512-hQA+Zb5QQwoSaXJWEAGEw1zhk//O7qDzib05Z4qTqZfNju/FAkrm5ZInp0JbTp4Z18A6bilopdZWEYrFSsfllA==",
+ "version": "1.5.165",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz",
+ "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==",
"license": "ISC"
},
"node_modules/emoji-datasource": {
@@ -4476,7 +4686,6 @@
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
"integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
- "dev": true,
"license": "MIT"
},
"node_modules/encoding": {
@@ -4826,14 +5035,15 @@
}
},
"node_modules/form-data": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
- "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz",
+ "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
@@ -4922,7 +5132,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
"integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
@@ -7789,7 +7998,6 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^10.3.0",
@@ -7863,7 +8071,6 @@
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^6.0.1"
@@ -8265,9 +8472,9 @@
}
},
"node_modules/validate-npm-package-name": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz",
- "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.1.tgz",
+ "integrity": "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==",
"dev": true,
"license": "ISC",
"engines": {
@@ -8657,6 +8864,7 @@
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
@@ -8675,6 +8883,7 @@
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
"license": "ISC",
"engines": {
"node": ">=12"
@@ -8684,6 +8893,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -8693,12 +8903,14 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
"license": "MIT"
},
"node_modules/yargs/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -8708,6 +8920,7 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
@@ -8722,6 +8935,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
diff --git a/ui/package.json b/ui/package.json
index 39b8e021a..253a3f135 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -12,15 +12,15 @@
"postinstall": "patch-package"
},
"dependencies": {
- "@angular/animations": "20.0.1",
- "@angular/common": "20.0.1",
- "@angular/compiler": "20.0.1",
- "@angular/core": "20.0.1",
- "@angular/forms": "20.0.1",
- "@angular/localize": "20.0.1",
- "@angular/platform-browser": "20.0.1",
- "@angular/platform-browser-dynamic": "20.0.1",
- "@angular/router": "20.0.1",
+ "@angular/animations": "20.0.2",
+ "@angular/common": "20.0.2",
+ "@angular/compiler": "20.0.2",
+ "@angular/core": "20.0.2",
+ "@angular/forms": "20.0.2",
+ "@angular/localize": "20.0.2",
+ "@angular/platform-browser": "20.0.2",
+ "@angular/platform-browser-dynamic": "20.0.2",
+ "@angular/router": "20.0.2",
"@auth0/angular-jwt": "5.2.0",
"@homebridge/hap-client": "2.2.0",
"@ng-bootstrap/ng-bootstrap": "18.0.0",
@@ -66,7 +66,7 @@
"@types/emoji-js": "^3.5.2",
"@types/file-saver": "^2.0.7",
"@types/lodash-es": "^4.17.12",
- "@types/node": "^22.15.29",
+ "@types/node": "^22.15.30",
"@types/qrcode": "^1.5.5",
"@types/semver": "^7.7.0",
"he": "^1.2.0",
@@ -75,10 +75,10 @@
"typescript": "^5.8.3"
},
"overrides": {
- "@angular/animations": "20.0.1",
- "@angular/common": "20.0.1",
- "@angular/core": "20.0.1",
- "@angular/forms": "20.0.1",
- "@angular/localize": "20.0.1"
+ "@angular/animations": "20.0.2",
+ "@angular/common": "20.0.2",
+ "@angular/core": "20.0.2",
+ "@angular/forms": "20.0.2",
+ "@angular/localize": "20.0.2"
}
}
diff --git a/ui/src/app/core/manage-plugins/hb-update-confirm/hb-update-confirm.component.html b/ui/src/app/core/manage-plugins/hb-update-confirm/hb-update-confirm.component.html
deleted file mode 100644
index eaf2c3ac1..000000000
--- a/ui/src/app/core/manage-plugins/hb-update-confirm/hb-update-confirm.component.html
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
- @if (loading) {
-
-
-
- } @if (!loading) { @if (allPluginsSupported) {
-
-
-
-
- -
- All your plugins are marked as compatible with the new version of Homebridge. You are all set to continue below.
-
-
- } @if (!allPluginsSupported) {
-
-
-
-
- - Some of your plugins are not explicitly marked as compatible with the new version of Homebridge.
- -
- This does not necessarily mean that they won't work. We just can't guarantee that
- they will.
-
- -
- For more information about this update, please see the
- wiki page.
-
- - To ignore this warning and continue with the update, click continue below.
-
- }
-
- @for (plugin of installedPlugins; track plugin) {
- -
- {{ plugin.displayName }} @if (plugin.hb2Ready === 'supported') {
-
- } @if (plugin.hb2Ready === 'unknown') {
-
- }
-
- }
-
- }
-
-
-
diff --git a/ui/src/app/core/manage-plugins/manage-plugin/manage-plugin.component.ts b/ui/src/app/core/manage-plugins/manage-plugin/manage-plugin.component.ts
index b1acc453d..fb4d32ef8 100644
--- a/ui/src/app/core/manage-plugins/manage-plugin/manage-plugin.component.ts
+++ b/ui/src/app/core/manage-plugins/manage-plugin/manage-plugin.component.ts
@@ -13,10 +13,10 @@ import { FitAddon } from 'xterm-addon-fit'
import { ApiService } from '@/app/core/api.service'
import { RestartHomebridgeComponent } from '@/app/core/components/restart-homebridge/restart-homebridge.component'
import { PluginsMarkdownDirective } from '@/app/core/directives/plugins.markdown.directive'
-import { HbUpdateConfirmComponent } from '@/app/core/manage-plugins/hb-update-confirm/hb-update-confirm.component'
import { PluginLogsComponent } from '@/app/core/manage-plugins/plugin-logs/plugin-logs.component'
import { SettingsService } from '@/app/core/settings.service'
import { IoNamespace, WsService } from '@/app/core/ws.service'
+import { HbV2ModalComponent } from '@/app/modules/status/widgets/update-info-widget/hb-v2-modal/hb-v2-modal.component'
@Component({
templateUrl: './manage-plugin.component.html',
@@ -223,10 +223,11 @@ export class ManagePluginComponent implements OnInit, OnDestroy {
Number(this.installedVersion.split('.')[0]) < 2
&& ['2', 'alpha', 'beta'].includes(this.targetVersion.split('.')[0])
) {
- const ref = this.$modal.open(HbUpdateConfirmComponent, {
+ const ref = this.$modal.open(HbV2ModalComponent, {
size: 'lg',
backdrop: 'static',
})
+ ref.componentInstance.isUpdating = true
res = await ref.result
}
diff --git a/ui/src/app/core/manage-plugins/manage-plugins.module.ts b/ui/src/app/core/manage-plugins/manage-plugins.module.ts
index 58a13de7d..3bd8f0d78 100644
--- a/ui/src/app/core/manage-plugins/manage-plugins.module.ts
+++ b/ui/src/app/core/manage-plugins/manage-plugins.module.ts
@@ -9,7 +9,6 @@ import { MonacoEditorModule } from 'ngx-monaco-editor-v2'
import { CustomPluginsModule } from '@/app/core/manage-plugins/custom-plugins/custom-plugins.module'
import { DisablePluginComponent } from '@/app/core/manage-plugins/disable-plugin/disable-plugin.component'
import { DonateComponent } from '@/app/core/manage-plugins/donate/donate.component'
-import { HbUpdateConfirmComponent } from '@/app/core/manage-plugins/hb-update-confirm/hb-update-confirm.component'
import { InterpolateMdPipe } from '@/app/core/manage-plugins/interpolate-md.pipe'
import { ManagePluginComponent } from '@/app/core/manage-plugins/manage-plugin/manage-plugin.component'
import { ManagePluginsService } from '@/app/core/manage-plugins/manage-plugins.service'
@@ -22,6 +21,7 @@ import { PluginLogsComponent } from '@/app/core/manage-plugins/plugin-logs/plugi
import { ResetAccessoriesComponent } from '@/app/core/manage-plugins/reset-accessories/reset-accessories.component'
import { SwitchToScopedComponent } from '@/app/core/manage-plugins/switch-to-scoped/switch-to-scoped.component'
import { UninstallPluginComponent } from '@/app/core/manage-plugins/uninstall-plugin/uninstall-plugin.component'
+import { HbV2ModalComponent } from '@/app/modules/status/widgets/update-info-widget/hb-v2-modal/hb-v2-modal.component'
@NgModule({
imports: [
@@ -46,7 +46,7 @@ import { UninstallPluginComponent } from '@/app/core/manage-plugins/uninstall-pl
DonateComponent,
ResetAccessoriesComponent,
DisablePluginComponent,
- HbUpdateConfirmComponent,
+ HbV2ModalComponent,
SwitchToScopedComponent,
],
providers: [
diff --git a/ui/src/app/core/manage-plugins/plugin-compatibility/plugin-compatibility.component.html b/ui/src/app/core/manage-plugins/plugin-compatibility/plugin-compatibility.component.html
index 4886127f1..17c4ae6f7 100644
--- a/ui/src/app/core/manage-plugins/plugin-compatibility/plugin-compatibility.component.html
+++ b/ui/src/app/core/manage-plugins/plugin-compatibility/plugin-compatibility.component.html
@@ -18,16 +18,26 @@ {{ 'plugins.compat.title' | translate }}
style="font-size: 75px"
>