From ab4a70bfb677288e6ea6d8c1218cab270bfbaa0f Mon Sep 17 00:00:00 2001 From: Maximiliano Simonazzi Date: Sun, 8 Mar 2026 05:09:37 +0000 Subject: [PATCH 01/23] Translated using Weblate (Spanish) Currently translated at 86.7% (1308 of 1508 strings) Translated using Weblate (Spanish) Currently translated at 86.5% (1297 of 1499 strings) Translated using Weblate (Spanish) Currently translated at 84.7% (1271 of 1499 strings) Co-authored-by: Maximiliano Simonazzi Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/es/ Translation: Uptime Kuma/Uptime Kuma --- src/lang/es-ES.json | 89 +++++++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 23 deletions(-) diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json index edbb65cc1..5f6b90c61 100644 --- a/src/lang/es-ES.json +++ b/src/lang/es-ES.json @@ -155,7 +155,7 @@ "Skip existing": "Omitir existente", "Overwrite": "Sobrescribir", "Options": "Opciones", - "Keep both": "Manténer ambos", + "Keep both": "Mantener ambos", "Tags": "Etiquetas", "Add New below or Select...": "Agregar nuevo a continuación o seleccionar…", "Tag with this name already exist.": "Una etiqueta con este nombre ya existe.", @@ -510,7 +510,7 @@ "Octopush API Version": "Versión API Octopush", "From Name/Number": "De Nombre/Número", "Recipient Number": "Número de Destinatario", - "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "El token de acceso de larga duración se puede crear haciendo clic en el nombre de su perfil (abajo a la izquierda) y desplazándose hasta la parte inferior y luego haciendo clic en Crear token. ", + "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "El token de acceso de larga duración puede crearse haciendo clic en el nombre de su perfil (abajo a la izquierda), desplazándose hasta la parte inferior y luego haciendo clic en Crear token.", "backupOutdatedWarning": "Obsoleto: dado que se agregaron muchas funciones y esta función de copia de seguridad no se mantiene desde hace un tiempo, no puede generar ni restaurar una copia de seguridad completa.", "Optional": "Opcional", "loadingError": "No se pueden obtener los datos, inténtelo de nuevo más tarde.", @@ -597,7 +597,7 @@ "checkPrice": "Consultar {0} precios:", "apiCredentials": "Credenciales de API", "Check octopush prices": "Consulta los precios de octopush {0}.", - "octopushPhoneNumber": "Número de teléfono (en formato internacional, ejemplo: +33612345678) ", + "octopushPhoneNumber": "Número de teléfono (en formato internacional, ejemplo: +33612345678)", "octopushSMSSender": "Nombre de Remitente del SMS: 3-11 caracteres alfanuméricos y espacio (a-zA-Z0-9)", "LunaSea Device ID": "ID Dispositivo LunaSea", "goAlert": "GoAlert", @@ -649,7 +649,7 @@ "alertaEnvironment": "Entorno", "PushDeer Key": "Key de PushDeer", "onebotSafetyTips": "Por seguridad, deberías colocara el token de acceso", - "wayToGetClickSendSMSToken": "Puedes obtener Nombre de Usuario de la API y la llave {aquí}.", + "wayToGetClickSendSMSToken": "Puedes obtener Usuario de API y llave de API {aquí}.", "Apprise URL": "URL Apprise", "gorush": "Gorush", "squadcast": "Squadcast", @@ -680,7 +680,7 @@ "smseagleGroup": "Nombre(s) de grupo(s) de Guía Telefónica", "Unpin": "Dejar de Fijar", "Prefix Custom Message": "Prefijo personalizado", - "markdownSupported": "Sintaxis de Markdown soportada", + "markdownSupported": "Sintaxis de Markdown soportada. Si estas usando HTML, evita espacios al principio para prevenir problemas de formato.", "Server Address": "Dirección del Servidor", "Learn More": "Aprende Más", "Pick a RR-Type...": "Seleccione un Tipo RR…", @@ -846,7 +846,7 @@ "toastSuccessTimeout": "Tiempo de espera para notificaciones de éxito", "toastErrorTimeout": "Tiempo de espera para notificaciones de error", "setupDatabaseChooseDatabase": "¿Qué base de datos te gustaría usar?", - "setupDatabaseEmbeddedMariaDB": "No necesitas configurar nada. Esta imagen de Docker tiene incorporada y configurada MariaDB automáticamente para ti. Uptime Kuma se conectará a esta base de datos a través de un socket Unix.", + "setupDatabaseEmbeddedMariaDB": "No necesitas configurar nada. Esta imagen de Docker tiene incorporado y configurado MariaDB para ti automáticamente. Uptime Kuma se conectará a esta base de datos a través de un socket Unix.", "setupDatabaseMariaDB": "Conectarse a una base de datos MariaDB externa. Debe configurar la información de conexión a la base de datos.", "setupDatabaseSQLite": "Un archivo de base de datos simple, recomendado para despliegues a pequeña escala. Antes de la versión 2.0.0, Uptime Kuma utilizaba SQLite como base de datos predeterminada.", "dbName": "Nombre de la Base de Datos", @@ -854,7 +854,7 @@ "authIncorrectCreds": "Nombre de usuario o contraseña incorrectos.", "2faEnabled": "2FA habilitado.", "2faDisabled": "2FA deshabilitado.", - "liquidIntroduction": "La plantilla se logra a través del lenguaje de plantillas Liquid. Consulte {0} para obtener instrucciones de uso. Estas son las variables disponibles:", + "liquidIntroduction": "El plantillaje se logra a través del lenguaje de plantillas Liquid. Consulte {0} para obtener instrucciones de uso.", "templateLimitedToUpDownCertNotifications": "solo disponible para notificaciones FUNCIONAL/CAÍDO/Caducidad de certificado", "emailTemplateMsg": "mensaje de la notificación", "emailTemplateLimitedToUpDownNotification": "sólo disponible para latidos FUNCIONAL/CAÍDO, de lo contrario nulo", @@ -939,7 +939,7 @@ "threemaSenderIdentity": "ID de Gateway", "threemaSenderIdentityFormat": "8 caracteres, generalmente comienza con *", "Host URL": "URL del anfitrión", - "Either enter the hostname of the server you want to connect to or localhost if you intend to use a locally configured mail transfer agent": "Ingresa el nombre del host del servidor al que deseas conectarte, o {localhost} si deseas usar un {local_mta}", + "Either enter the hostname of the server you want to connect to or localhost if you intend to use a locally configured mail transfer agent": "Ingresa el nombre del host del servidor al que deseas conectarte o {localhost} si deseas usar un {local_mta}", "smspartnerPhoneNumberHelptext": "El número debe estar en el formato internacional {0}, {1}. Múltiples números deben estar separados por {2}", "smspartnerSenderName": "Nombre del emisor del SMS", "smspartnerApiurl": "Puedes encontrar tu clave API en tu panel de control en {0}", @@ -1213,19 +1213,19 @@ "Number of retry attempts if webhook fails": "Número de intentos de reintento (cada 60–180 segundos) si el webhook falla.", "Maximum Retries": "Máximo de reintentos", "sipsakPingWarning": "Para poder utilizar el monitor de SIP Options Ping, necesitas instalar Uptime Kuma sin Docker e instalar el cliente Sipsak en tu servidor.", - "Plausible": "Plausible", + "Plausible": "Admisible", "Select All": "Seleccionar todo", "Deselect All": "Desmarcar todo", "HTTP Method": "Método HTTP", - "webhookPostMethodDesc": "POST es aceptado para la mayoría de servidores HTTP.", + "webhookPostMethodDesc": "POST es adecuado para la mayoría de servidores HTTP.", "resendApiKey": "Reenviar la llave API", - "deleteGroupMsg": "¿Estás seguro de querer eliminar este grupo?", + "deleteGroupMsg": "¿Está seguro que quiere eliminar este grupo?", "settingsDomainExpiry": "Expiración de dominio", "labelDomainExpiry": "Exp. de dominio", "message": "mensaje", "domainExpiryDescription": "Lanzar notificación cuando el nombre de dominio expire en:", "year": "año | años", - "descriptionHelpText": "Se muestra en el panel principal interno. El código Markdown está permitido y se senea (preserva los espacios y las identaciones) antes de mostrarse.", + "descriptionHelpText": "Mostrar en el panel de control interno. Se permite markdown limpio (conserva el espacio y la sangría) antes de mostrarse.", "json_value": "Valor JSON", "Press Enter to add node": "Pulsa Enter para añadir el nodo", "resendApiHelp": "Crear una llave de API aquí {0}", @@ -1235,7 +1235,7 @@ "wsCodeDescription": "Para más información acerca de los códigos de estado, por favor consulta {rfc6455}", "Subprotocol(s)": "Subprotocolo(s)", "certHostnameMismatch": "El nombre de host del certificado no coincide con la URL del monitor.", - "twilioMessagingServiceSID": "Servicio de mensajería SID (opcional)", + "twilioMessagingServiceSID": "SID del servicio de Mensajería (opcional)", "resendFromEmail": "Correo electrónico del remitente", "resendLeaveBlankForDefaultSubject": "Deja en blanco para utilizar el asunto por defecto", "ignoreSecWebsocketAcceptHeaderDescription": "En caso de que la actualización del websocket sea satisfactoria, permite al servidor no responder con la cabecera Sec-WebSocket-Accept.", @@ -1261,7 +1261,7 @@ "systemServiceDescriptionWindows": "Comprueba si el gestor de servicios {service_name} de Windows está ejecutándose", "invalidURL": "URL no válida", "Clone Maintenance": "Clonar Mantenimiento", - "ariaPauseMaintenance": "Pausar este horario de mantenimiento", + "ariaPauseMaintenance": "Pausar este cronograma de mantenimiento", "systemServiceName": "Nombre del servicio", "systemService": "Servicio del sistema", "systemServiceCommandHint": "Comando utilizado: {command}", @@ -1276,15 +1276,15 @@ "Browser not supported": "Navegador no permitido", "labelDomainNameExpiryNotification": "Notificación de expiración de dominio", "Duration (Minutes)": "Duración (Minutos)", - "ariaResumeMaintenance": "Reanudar este horario de mantenimiento", - "ariaCloneMaintenance": "Crear una copia de este horario de mantenimiento", - "ariaEditMaintenance": "Editar este horario de mantenimiento", - "ariaDeleteMaintenance": "Eliminar este horario de mantenimiento", + "ariaResumeMaintenance": "Reanudar este cronograma de mantenimiento", + "ariaCloneMaintenance": "Crear una copia de este cronograma de mantenimiento", + "ariaEditMaintenance": "Editar este cronograma de mantenimiento", + "ariaDeleteMaintenance": "Eliminar este cronograma de mantenimiento", "SMTP Security": "Seguridad SMTP", "Ignore STARTTLS": "Ignorar STARTTLS", "Use STARTTLS": "Utilizar STARTTLS", - "twilloMessagingServiceSIDHelptext": "Introduce el SID de tu servicio de mensajería si utilizas {twillo_messaging_service_help_link} para genstionar los remitentes y las características", - "webhookGetMethodDesc": "GET envía los datos como parámetros de la búsqueda y no permite configurar un cuerpo de mensaje. Útil para disparar los monitores Push de Uptime Kuma.", + "twilloMessagingServiceSIDHelptext": "Ingrese el SID del Servicio de Mensajería aquí si está usando {twillo_messaging_service_help_link} para administrar los remitentes y características", + "webhookGetMethodDesc": "GET envía los datos como parámetros de consulta y no permite la configuración del cuerpo de la consulta. Útil para disparar monitores PUSH de Uptime Kuma.", "showOnlyLastHeartbeat": "Mostrar solo el último latido", "Analytics Type": "Tipo de analíticas", "Google": "Google", @@ -1298,7 +1298,7 @@ "checkPriceAt": "Comprueba los precios de {service} en {url}", "noMonitorsOrStatusPagesSelectedError": "No se puede crear un mantenimiento sin monitores afectados o páginas de estado", "noMonitorsSelectedWarning": "Estás creando un mantenimiento sin ningún monitor afectado. ¿Estás seguro de que deseas continuar?", - "deleteChildrenMonitors": "Borra también los sub-monitores y sus descendientes si los tuvieran|Borra también todos los {count} sub-monitores directos y sus descendientes si los tuvieran", + "deleteChildrenMonitors": "Tambien elimina los monitores hijos directos y sus descendientes si los tuvieran | Tambien elimina todos los {count} monitores hijos directos y sus descendientes si los tuvieran", "OptionalParameters": "Parámetros Opcionales", "aliyun-template-requirements-and-parameters": "La plantilla de SMS de aliyun debe de contener los siguientes parámetros: {parameters}", "aliyun-template-optional-parameters": "Parámetros opcionales: {parameters}", @@ -1310,7 +1310,7 @@ "enableSSL": "Habilitar SSL/TLS", "mariadbCaCertificateLabel": "Certificado CA", "unknownDays": "Días desconocidos", - "No incidents recorded": "No se registraron incidentes.", + "No incidents recorded": "No se registraron incidentes", "Load More": "Cargar más", "mariadbUseSSLHelptext": "Habilita el uso de una conexión cifrada a tu base de datos. Requerido para la mayoría de las bases de datos en la nube.", "mariadbCaCertificateHelptext": "Pegue el certificado CA en formato PEM para utilizarlo con certificados autofirmados. Déjelo en blanco si su base de datos utiliza un certificado firmado por una CA pública.", @@ -1329,5 +1329,48 @@ "Only retry if status code check fails": "Reintentar solo si la comprobación del código de estado falla", "retryOnlyOnStatusCodeFailureDescription": "Si está habilitado, los reintentos solo se realizarán cuando falle la comprobación del código de estado HTTP (por ejemplo, si el servidor está caído). Si la comprobación del código de estado es correcta pero falla la consulta JSON, el monitor se marcará como inactivo inmediatamente, sin reintentos.", "responseMaxLengthDescription": "Tamaño máximo de los datos de la respuesta que se van a almacenar. Establezca 0 para ilimitado. Las respuestas más grandes se truncarán. Valor por defecto: 1024 (1 KB)", - "logoutCurrentUser": "Cerrar sesión de {username}" + "logoutCurrentUser": "Cerrar sesión de {username}", + "Incident description": "Descripción del incidente", + "twilioApiKeyHelptext": "La llave de la API es opcional pero recomendada. Puede proporcionar el SID de la cuenta y el Token de Autorizacion desde la consola de Twilio o el SID de la cuenta y la llave de la API junto con el secreto de la llave de la API", + "monitorTypeGameServer": "Servidor de Juego", + "monitorTypeDatabase": "Tipo de Monitor de Base de Datos", + "monitorTypeSpecial": "Especial", + "Recipient Numbers": "Números de destinatarios", + "Incident not found or access denied": "No se encontró incidente o acceso denegado", + "Past Incidents": "Incidentes pasados", + "Incident title": "Título del incidente", + "example": "Ejemplo", + "Result": "Resultado", + "lastUpdatedAt": "Última actualización: {date}", + "Actions": "Acciones", + "selectAllMonitorsAria": "Seleccionar todos los monitores", + "deselectAllMonitorsAria": "Deseleccionar todos los monitores", + "lastUpdatedAtFromNow": "Última actualización: {date} ({fromNow})", + "See Jira Cloud Docs": "Ver la documentación de Jura Cloud", + "Cloud ID": "ID de nube", + "API Token": "Token de API", + "templateAvailableVariables": "Variables disponibles", + "selectMonitorMsg": "Selecciona monitores para realizar acciones", + "Examples:": "Ejemplos: {0}", + "Pinned incidents are shown prominently on the status page": "Incidentes marcados se muestran prominentemente en la pagina de estado", + "Edit Incident": "Editar incidente", + "Please input title": "Por favor ingresa título", + "Resolve": "Resolver", + "Resolved": "Resuelto", + "createdAt": "Creado: {date}", + "deleteIncidentMsg": "Estas seguro que quieres eliminar este incidente?", + "Certificate Chain:": "Cadena de certificado:", + "Please input content": "Por favor ingresa contenido", + "dateCreatedAtFromNow": "Fecha de creación: {date} ({fromNow})", + "360messengerAuthToken": "Clave de la API 360messenger", + "360messengerGroupId": "ID de grupo 360messenger", + "360messengerGroupList": "Grupos de WhatsApp", + "ntfyUseTemplateDescription": "Habilite esta opción para personalizar los títulos y mensajes de notificación mediante plantillas LiquidJS", + "ntfyCustomTitle": "Plantilla de título personalizado", + "ntfyCustomMessage": "Plantilla de mensaje personalizado", + "ntfyNotificationTemplateFallback": "Dejar en blanco para utilizar el formato predeterminado de Uptime Kuma", + "Screenshot Delay": "Retraso de captura de pantalla (espera {milliseconds})", + "milliseconds": "{n} milisegundos | {n} milisegundos", + "snmpV3Username": "Nombre de usuario SNMPv3", + "ntfyUseTemplate": "Personalizar plantillas de notificación" } From 39f9ce8b9c7be0ad986543c02c49528f967522e0 Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Sun, 8 Mar 2026 05:09:37 +0000 Subject: [PATCH 02/23] Translated using Weblate (Slovak) Currently translated at 99.9% (1498 of 1499 strings) Co-authored-by: Jozef Gaal Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/sk/ Translation: Uptime Kuma/Uptime Kuma --- src/lang/sk.json | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/lang/sk.json b/src/lang/sk.json index 4584c900f..228d31e2c 100644 --- a/src/lang/sk.json +++ b/src/lang/sk.json @@ -1431,7 +1431,7 @@ "legacyOctopushEndpoint": "Staršia verzia Octopush-DM (koncový bod: {url})", "Suppress Notifications": "Stlmiť oznámenia", "discordSuppressNotificationsHelptext": "Ak je táto funkcia povolená, správy budú odosielané do kanála, ale nebudú spúšťať push alebo desktopové notifikácie pre príjemcov.", - "domain_expiry_unsupported_is_icann": "Doména „{domain}“ nie je kandidátom na monitorovanie vypršania platnosti domény, pretože jej verejná prípona „.{publicSuffix}“ nie je ICAN", + "domain_expiry_unsupported_is_icann": "Doména „{domain}“ nie je kandidátom na monitorovanie vypršania platnosti domény, pretože jej verejná prípona „.{publicSuffix}“ nie je spravovaná organizáciou ICANN", "snmpV3Username": "Používateľské meno SNMPv3", "WeCom Mentioned Mobile List Description": "Zadajte telefónne čísla, ktoré chcete označiť. Viac čísel oddeľte čiarkami. Použite {'@'}all, aby ste označili všetkých.", "WeCom Mentioned Mobile List": "WeCom zoznam zmienených", @@ -1546,5 +1546,28 @@ "certificateExpiryNotificationHelp": "Počet dní vopred je možné nastaviť v nastaveniach.", "signalUseTemplate": "Použite vlastnú šablónu správy", "signalUseTemplateDescription": "Ak je táto funkcia povolená, správa bude odoslaná pomocou vlastnej šablóny. Na prispôsobenie formátu oznámenia môžete použiť šablóny Liquid.", - "domainExpiryNotificationHelp": "Počet dní vopred je možné nastaviť v nastaveniach." + "domainExpiryNotificationHelp": "Počet dní vopred je možné nastaviť v nastaveniach.", + "monitorTypeDatabase": "Typ monitoru databázy", + "monitorTypeGameServer": "Herný server", + "monitorTypeSpecial": "Špeciálny", + "360messengerAuthToken": "API kľúč 360messenger", + "360messengerRecipient": "Telefónne číslo/a príjemcu", + "360messengerGroupId": "360messenger ID skupiny", + "360messengerUseTemplate": "Použite vlastnú šablónu správy", + "360messengerTemplate": "Šablóna správy 360messenger", + "360messengerGroupList": "Skupiny WhatsApp", + "360messengerSelectGroupList": "Vyberte skupinu, ktorú chcete pridať", + "360messengerSelectedGroupID": "Vybrané ID skupiny/ín", + "360messengerEnableSendToGroup": "Povoliť odosielanie do skupín WhatsApp", + "360messengerCustomMessageTemplate": "Šablóna vlastnej správy", + "360messengerEnableCustomMessage": "Povoliť vlastnú šablónu správy namiesto predvolenej správy.", + "360messengerMessageTemplate": "Šablóna správy", + "360messengerWayToWriteRecipient": "Zadajte jedno alebo viacero telefónnych čísel v medzinárodnom formáte bez predpony plus (napr. {0}). Viacero čísel oddeľte čiarkami.", + "360messengerErrorNoApiKey": "Najskôr zadajte svoj API kľúč 360messenger.", + "360messengerErrorApi": "Nie je možné načítať zoznam skupín WhatsApp (Chyba {statusCode}: {message}).", + "360messengerErrorGeneric": "Nie je možné načítať zoznam skupín WhatsApp: {message}", + "GlobalpingMultipleLocationsError": "Viacnásobné polohy nie sú podporované, pre každý monitor použite jednu polohu.", + "360messengerWayToGetUrlAndToken": "API kľúč pre 360messenger môžete získať na {0}.", + "360messengerErrorNoGroups": "Pre tento účet neboli nájdené žiadne skupiny WhatsApp.", + "GlobalpingLocationDescription": "Do poľa polohy môžete zadávať kontinenty, krajiny, regióny, mestá, ASN, ISP alebo cloudové regióny. Filtre môžete kombinovať pomocou znaku {plus} (napr. {amazonPlusGermany} alebo {comcastPlusCalifornia}). Ak je dôležitým ukazovateľom latencia, použite filtre na zúženie polohy na malý región, aby ste sa vyhli výkyvom, a pre lepšiu stabilitu nastavte filter {datacenter}. {fullDocs}." } From 1c97445370e39cf05b4d51e482fb0ddf276eb9e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sun, 8 Mar 2026 05:09:37 +0000 Subject: [PATCH 03/23] Translated using Weblate (Irish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (1499 of 1499 strings) Co-authored-by: Aindriú Mac Giolla Eoin Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ga/ Translation: Uptime Kuma/Uptime Kuma --- src/lang/ga.json | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/lang/ga.json b/src/lang/ga.json index c3328ba6a..f704401aa 100644 --- a/src/lang/ga.json +++ b/src/lang/ga.json @@ -1377,7 +1377,7 @@ "TLS Alert Spec": "RFC 8446", "Suppress Notifications": "Fógraí a Chosc", "discordSuppressNotificationsHelptext": "Nuair a bheidh sé cumasaithe, cuirfear teachtaireachtaí chuig an gcainéal ach ní spreagfar fógraí brú ná fógraí deisce do fhaighteoirí.", - "domain_expiry_unsupported_is_icann": "Ní iarrthóir é an fearann \"{domain}\" le haghaidh monatóireachta ar dhul in éag fearainn, toisc nach bhfuil a iarmhír phoiblí \".{publicSuffix}\" ICAN", + "domain_expiry_unsupported_is_icann": "Ní iarrthóir é an fearann \"{domain}\" le haghaidh monatóireachta ar dhul in éag fearainn, toisc nach bhfuil a iarmhír phoiblí \".{publicSuffix}\" á bhainistiú ag ICANN", "notificationUniversal": "Uilíoch", "notificationChatPlatforms": "Ardáin Comhrá", "notificationPushServices": "Seirbhísí Brúigh", @@ -1540,5 +1540,30 @@ "GlobalpingIpFamilyInfo": "An leagan IP le húsáid. Ní cheadaítear é seo ach amháin má tá an sprioc ina hainm óstach.", "GlobalpingResolverInfo": "Seoladh IPv4/IPv6 nó Ainm Fearainn Cáilithe go Lán (FQDN). Is é an réamhshocrú ná réiteoir líonra áitiúil an tóireadóra. Is féidir leat an freastalaí réiteora a athrú am ar bith.", "Jira Service Management": "Bainistíocht Seirbhíse Jira", - "Google Apps Script Webhook URL": "URL Gréasáin-chrúca Script Google Apps" + "Google Apps Script Webhook URL": "URL Gréasáin-chrúca Script Google Apps", + "360messengerEnableSendToGroup": "Cumasaigh seoltaí chuig grúpa(í) WhatsApp", + "360messengerAuthToken": "Eochair API 360messenger", + "360messengerRecipient": "Uimhir(í) theileafóin an fhaighteora", + "360messengerGroupId": "Aitheantas Grúpa 360messenger", + "360messengerUseTemplate": "Úsáid teimpléad teachtaireachta saincheaptha", + "360messengerTemplate": "Teimpléad Teachtaireachta 360messenger", + "360messengerGroupList": "Grúpaí WhatsApp", + "360messengerSelectGroupList": "Roghnaigh grúpa le cur leis", + "360messengerSelectedGroupID": "Aitheantais Ghrúpa Roghnaithe", + "360messengerCustomMessageTemplate": "Teimpléad teachtaireachta saincheaptha", + "360messengerEnableCustomMessage": "Cumasaigh teimpléad teachtaireachta saincheaptha in ionad an teachtaireachta réamhshocraithe.", + "360messengerMessageTemplate": "Teimpléad teachtaireachta", + "360messengerWayToGetUrlAndToken": "Is féidir leat d'eochair API 360messenger a fháil ó {0}.", + "360messengerErrorNoApiKey": "Cuir isteach d’eochair API 360messenger ar dtús.", + "360messengerErrorNoGroups": "Ní bhfuarthas aon ghrúpaí WhatsApp don chuntas seo.", + "360messengerErrorApi": "Ní féidir liosta na ngrúpaí WhatsApp a luchtú (Earráid {statusCode}: {message}).", + "360messengerErrorGeneric": "Ní féidir an liosta grúpa WhatsApp a luchtú: {message}", + "GlobalpingLocationDescription": "Glacann an réimse suímh le hilchríocha, tíortha, réigiúin, cathracha, ASNanna, ISPanna, nó réigiúin scamall. Is féidir leat scagairí a chomhcheangal le {plus} (m.sh. {amazonPlusGermany} nó {comcastPlusCalifornia}). Más méadracht thábhachtach í an mhoill, bain úsáid as scagairí chun an suíomh a chúngú síos go réigiún beag chun spící a sheachaint agus socraigh an scagaire {datacenter} ar mhaithe le cobhsaíocht níos fearr. {fullDocs}.", + "GlobalpingMultipleLocationsError": "Ní thacaítear le hilshuíomhanna, bain úsáid as suíomh amháin do gach monatóir le do thoil.", + "360messengerWayToWriteRecipient": "Cuir isteach uimhir theileafóin amháin nó níos mó i bhformáid idirnáisiúnta gan móide tosaigh (m.sh. {0}). Scar uimhreacha iolracha le camóga.", + "signalUseTemplate": "Úsáid teimpléad teachtaireachta saincheaptha", + "signalUseTemplateDescription": "Má tá sé cumasaithe, seolfar an teachtaireacht ag baint úsáide as teimpléad saincheaptha. Is féidir leat teimpléadú Liquid a úsáid chun formáid an fhógra a shaincheapadh.", + "monitorTypeGameServer": "Freastalaí Cluiche", + "monitorTypeDatabase": "Cineál Monatóra Bunachar Sonraí", + "monitorTypeSpecial": "Speisialta" } From 3b69b98ff9d07262459e9fb7d5027be5d96a2857 Mon Sep 17 00:00:00 2001 From: Kristaps Date: Sun, 8 Mar 2026 05:09:37 +0000 Subject: [PATCH 04/23] Translated using Weblate (Latvian) Currently translated at 4.8% (72 of 1499 strings) Co-authored-by: Kristaps Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/lv/ Translation: Uptime Kuma/Uptime Kuma --- src/lang/lv.json | 69 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/src/lang/lv.json b/src/lang/lv.json index c069c7303..0dd43a47b 100644 --- a/src/lang/lv.json +++ b/src/lang/lv.json @@ -3,5 +3,72 @@ "setupDatabaseChooseDatabase": "Kuru datubāzi izmantosiet?", "setupDatabaseEmbeddedMariaDB": "Jums nav nekas jādara. Docker imidžā ir iebūvēta un automātiski konfigurēta MariaDB datubāze. Uptime Kuma pieslēgsies šai datubāzei izmantojot unix soketu.", "setupDatabaseSQLite": "Vienkāršs datu bāzes fails, iesakāms maza izmēra risinājumiem. Pirms versijas v2.0.0 SQLite bija noklusējuma datubāze.", - "setupDatabaseMariaDB": "Pieslēgties ārējai MariaDB datubāzei. Jums būs jākonfigurē datubāzes pieslēgšanās informācija." + "setupDatabaseMariaDB": "Pieslēgties ārējai MariaDB datubāzei. Jums būs jākonfigurē datubāzes pieslēgšanās informācija.", + "Name": "Nosaukums", + "Ping": "Ping", + "Dashboard": "Panelis", + "dbName": "Datubāzes nosaukums", + "enableSSL": "Iespējot SSL/TLS", + "Settings": "Iestatījumi", + "Help": "Palīdzība", + "New Update": "Jauns atjauninājums", + "Language": "Valoda", + "Appearance": "Izskats", + "Theme": "Tēma", + "General": "Vispārīgi", + "Game": "Spēle", + "mariadbCaCertificateLabel": "CA sertifikāts", + "Primary Base URL": "Galvenais bāzes URL", + "Check Update On GitHub": "Pārbaudīt atjauninājumu GitHub", + "List": "Saraksts", + "Home": "Sākums", + "Add": "Pievienot", + "Add New Monitor": "Pievienot jaunu monitoru", + "Quick Stats": "Ātrā statistika", + "Down": "Nedarbojas", + "Pending": "Rindā", + "statusMaintenance": "Tehniskā apkope", + "Maintenance": "Tehniskā apkope", + "Unknown": "Nezināms", + "unknownDays": "Nezināms dienu skaits", + "Cannot connect to the socket server": "Nevar izveidot savienojumu ar soketa serveri", + "Reconnecting...": "Savienojas...", + "General Monitor Type": "Vispārīgais monitora veids", + "pauseDashboardHome": "Pauze", + "Pause": "Pauze", + "DateTime": "Datums un laiks", + "Specific Monitor Type": "Specifiskais monitora veids", + "settingUpDatabaseMSG": "Tiek uzstādīta datubāze. Uzgaidiet, lūdzu, tas var prasīt laiku.", + "mariadbUseSSLHelptext": "Iespējot šifrētu savienojumu ar jūsu datubāzi. Nepieciešams lielākajai daļai mākoņdatubāžu.", + "mariadbCaCertificateHelptext": "Ielīmējiet CA sertifikātu PEM formātā, lai to izmantotu ar pašparakstītiem sertifikātiem. Atstājiet tukšu, ja jūsu datubāze izmanto publiskas sertifikācijas iestādes parakstītu sertifikātu.", + "Passive Monitor Type": "Pasīvais monitora veids", + "markdownSupported": "Tiek atbalstīta Markdown sintakse. Ja izmantojat HTML, izvairieties no atstarpēm rindas sākumā, lai novērstu formatēšanas problēmas.", + "versionIs": "Versija: {version}", + "monitorTypeGameServer": "Spēļu serveris", + "monitorTypeDatabase": "Datubāzes monitora veids", + "monitorTypeSpecial": "Specifisks", + "Message": "Ziņa", + "No incidents recorded": "Nav reģistrētu incidentu", + "Load More": "Ielādēt vairāk", + "Loading...": "Ielāde...", + "No important events": "Nav svarīgu notikumu", + "Resume": "Turpināt", + "Edit": "Labot", + "Delete": "Dzēst", + "Current": "Pašreizējais", + "Uptime": "Darbības laiks", + "Cert Exp.": "Sert. term.", + "Monitors": "{n} monitors | {n} monitori", + "now": "tagad", + "time ago": "pirms {0}", + "days": "{n} diena | {n} dienas", + "hours": "{n} stunda | {n} stundas", + "minutes": "{n} minūte | {n} minūtes", + "minuteShort": "{n} minūte | {n} minūtes", + "years": "{n} gads| {n} gadi", + "Response": "Atbilde", + "Pin this incident": "Piespraust šo incidentu", + "Monitor Type": "Monitora tips", + "Up": "Darbojas", + "Status": "Status" } From 27132ccc7410163842a67a87b555eaff5baf3514 Mon Sep 17 00:00:00 2001 From: riccardo Date: Sun, 8 Mar 2026 05:09:37 +0000 Subject: [PATCH 05/23] Translated using Weblate (Italian) Currently translated at 79.5% (1193 of 1499 strings) Co-authored-by: riccardo Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/it/ Translation: Uptime Kuma/Uptime Kuma --- src/lang/it-IT.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lang/it-IT.json b/src/lang/it-IT.json index 664d93b7a..ffc22fbaa 100644 --- a/src/lang/it-IT.json +++ b/src/lang/it-IT.json @@ -1275,5 +1275,8 @@ "Ignore STARTTLS": "Ignora STARTTLS", "Use STARTTLS": "Utilizza STARTTLS", "Enter the list of nodes": "Inserisci l'elenco dei nodi di gestione RabbitMQ", - "Press Enter to add node": "Premi Invio per aggiungere il nodo" + "Press Enter to add node": "Premi Invio per aggiungere il nodo", + "enableSSL": "Abilita SSL/TLS", + "mariadbUseSSLHelptext": "Abilita per usare una connessione criptata per il tuo database. Richiesto dalla maggior parte dei database cloud.", + "mariadbCaCertificateLabel": "Certificato CA" } From 747b8c21fc39bad7563a66e6190366b5ae0e6d95 Mon Sep 17 00:00:00 2001 From: Aluisio Date: Sun, 8 Mar 2026 05:09:37 +0000 Subject: [PATCH 06/23] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (1508 of 1508 strings) Co-authored-by: Aluisio Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/pt_BR/ Translation: Uptime Kuma/Uptime Kuma --- src/lang/pt-BR.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json index b6a19c0a7..dd16d50e7 100644 --- a/src/lang/pt-BR.json +++ b/src/lang/pt-BR.json @@ -1578,5 +1578,14 @@ "360messengerWayToWriteRecipient": "Insira um ou mais números de telefone no formato internacional, sem o sinal de mais inicial (por exemplo, {0}). Separe vários números com vírgulas.", "360messengerErrorApi": "Não foi possível carregar a lista de grupos do WhatsApp (Erro {statusCode}: {message}).", "GlobalpingMultipleLocationsError": "Não é possível realizar várias localizações; utilize uma única localização para cada monitor.", - "GlobalpingLocationDescription": "O campo de localização aceita continentes, países, regiões, cidades, ASNs, ISPs ou regiões de nuvem. Você pode combinar filtros com {plus} (por exemplo, {amazonPlusGermany} ou {comcastPlusCalifornia}). Se a latência for uma métrica importante, use filtros para restringir a localização a uma região pequena para evitar picos e, para maior estabilidade, defina o filtro {datacenter}. {fullDocs}." + "GlobalpingLocationDescription": "O campo de localização aceita continentes, países, regiões, cidades, ASNs, ISPs ou regiões de nuvem. Você pode combinar filtros com {plus} (por exemplo, {amazonPlusGermany} ou {comcastPlusCalifornia}). Se a latência for uma métrica importante, use filtros para restringir a localização a uma região pequena para evitar picos e, para maior estabilidade, defina o filtro {datacenter}. {fullDocs}.", + "fluxerMessageFormat": "Formato da mensagem", + "fluxerMessageFormatNormal": "Normal (rich embeds)", + "fluxerMessageFormatMinimalist": "Minimalista (status curto)", + "fluxerUseMessageTemplate": "Use um modelo de mensagem personalizado", + "fluxerMessageTemplate": "Modelo de mensagem", + "fluxerMessageFormatCustom": "Modelo personalizado", + "fluxerUseMessageTemplateDescription": "Se ativada, a mensagem será enviada usando um modelo personalizado (LiquidJS). Deixe em branco para usar o formato padrão do Uptime Kuma.", + "Fluxer Webhook URL": "URL do Webhook do Fluxer", + "wayToGetFluxerURL": "Você pode obter essa informação acessando as configurações do canal de destino > Webhooks > Criar Webhook > Copiar URL do Webhook." } From 64b32ff133f25b58dcdede6c60ad6daee5bb3861 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Sun, 8 Mar 2026 05:09:38 +0000 Subject: [PATCH 07/23] Added translation using Weblate (English (United Kingdom)) Co-authored-by: Louis Lam --- src/lang/en_GB.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/lang/en_GB.json diff --git a/src/lang/en_GB.json b/src/lang/en_GB.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/src/lang/en_GB.json @@ -0,0 +1 @@ +{} From aedac237d0049b0821d2c82406b62e823088541a Mon Sep 17 00:00:00 2001 From: Teemu Risikko Date: Mon, 9 Mar 2026 12:46:33 +0200 Subject: [PATCH 08/23] fix: isParentActive return type to boolean (#7121) --- server/model/monitor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/model/monitor.js b/server/model/monitor.js index bd773bfff..2ad572e53 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -2059,7 +2059,7 @@ class Monitor extends BeanModel { } const parentActive = await Monitor.isParentActive(parent.id); - return parent.active && parentActive; + return parent.active === 1 && parentActive; } /** From 483daa2e151305ab0ae421967f4c8ae6efdd6045 Mon Sep 17 00:00:00 2001 From: MrEddX Date: Sun, 8 Mar 2026 12:44:44 +0000 Subject: [PATCH 09/23] Translated using Weblate (Bulgarian) Currently translated at 100.0% (1508 of 1508 strings) Co-authored-by: MrEddX Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/bg/ Translation: Uptime Kuma/Uptime Kuma --- src/lang/bg-BG.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json index 273ff53ab..5b5b3bef7 100644 --- a/src/lang/bg-BG.json +++ b/src/lang/bg-BG.json @@ -1611,5 +1611,14 @@ "360messengerWayToGetUrlAndToken": "Можете да получите вашия API ключ за 360messenger от {0}.", "360messengerWayToWriteRecipient": "Въведете един или повече телефонни номера в международен формат без водещ плюс (напр. {0}). Разделете отделните номера със запетая.", "GlobalpingMultipleLocationsError": "Не се поддържат множество местоположения, моля, използвайте едно местоположение за всеки монитор.", - "GlobalpingLocationDescription": "Полето за местоположение приема континенти, държави, региони, градове, ASN, интернет доставчици или облачни региони. Можете да комбинирате филтри с {plus} (напр. {amazonPlusGermany} или {comcastPlusCalifornia}). Ако латентността е важен показател, използвайте филтри, за да стесните местоположението до малък регион, за да избегнете пикове, и за по-добра стабилност задайте филтъра {datacenter}. {fullDocs}." + "GlobalpingLocationDescription": "Полето за местоположение приема континенти, държави, региони, градове, ASN, интернет доставчици или облачни региони. Можете да комбинирате филтри с {plus} (напр. {amazonPlusGermany} или {comcastPlusCalifornia}). Ако латентността е важен показател, използвайте филтри, за да стесните местоположението до малък регион, за да избегнете пикове, и за по-добра стабилност задайте филтъра {datacenter}. {fullDocs}.", + "fluxerMessageFormat": "Формат на съобщението", + "fluxerMessageFormatNormal": "Нормално (с вграден rich)", + "fluxerMessageFormatCustom": "Персонализиран шаблон", + "fluxerUseMessageTemplate": "Използвай персонализиран шаблон за съобщение", + "fluxerMessageTemplate": "Шаблон за съобщение", + "Fluxer Webhook URL": "Fluxer URL адрес за уебкука", + "fluxerMessageFormatMinimalist": "Минималистичен (кратък статус)", + "fluxerUseMessageTemplateDescription": "Ако е активирано, съобщението ще бъде изпратено с помощта на персонализиран шаблон (LiquidJS). Оставете празно, за да използвате Uptime Kuma формат, който е по подразбиране.", + "wayToGetFluxerURL": "Можете да получите, като отидете в настройките на целевия канал > Уеб куки > Създаване на уеб кука > Копиране на URL адрес на уеб кука." } From 37452628e6b591abf45065054e5a3f322b437b74 Mon Sep 17 00:00:00 2001 From: Cyril59310 Date: Sun, 8 Mar 2026 12:44:44 +0000 Subject: [PATCH 10/23] Translated using Weblate (French) Currently translated at 100.0% (1508 of 1508 strings) Co-authored-by: Cyril59310 Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/ Translation: Uptime Kuma/Uptime Kuma --- src/lang/fr-FR.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json index ef09f720c..e8d23b4a0 100644 --- a/src/lang/fr-FR.json +++ b/src/lang/fr-FR.json @@ -1611,5 +1611,14 @@ "360messengerWayToWriteRecipient": "Saisissez un ou plusieurs numéros de téléphone au format international sans signe plus (par exemple : {0}). Séparez les numéros par des virgules.", "monitorTypeSpecial": "Spécial", "monitorTypeGameServer": "Serveur de jeu", - "monitorTypeDatabase": "Sonde de Type base de données" + "monitorTypeDatabase": "Sonde de Type base de données", + "fluxerMessageFormatNormal": "Normal (intégrations riches)", + "fluxerUseMessageTemplate": "Utiliser un modèle de message personnalisé", + "Fluxer Webhook URL": "URL du Webhook de Fluxer", + "wayToGetFluxerURL": "Vous pouvez obtenir cela en allant dans les paramètres du canal cible > Webhooks > Créer un webhook > Copier l’URL du webhook.", + "fluxerMessageFormat": "Format du message", + "fluxerMessageFormatCustom": "Modèle personnalisé", + "fluxerMessageTemplate": "Modèle de message", + "fluxerMessageFormatMinimalist": "Minimalist (statut court", + "fluxerUseMessageTemplateDescription": "Si activé, le message sera envoyé en utilisant un modèle personnalisé (LiquidJS). Laissez vide pour utiliser le format Uptime Kuma par défaut." } From 48a2efa38d28e5bb225ea79c06f452ec3f2a3af8 Mon Sep 17 00:00:00 2001 From: fabianovich Date: Sun, 8 Mar 2026 12:44:44 +0000 Subject: [PATCH 11/23] Translated using Weblate (Dutch) Currently translated at 97.6% (1472 of 1508 strings) Co-authored-by: fabianovich Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/nl/ Translation: Uptime Kuma/Uptime Kuma --- src/lang/nl-NL.json | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/lang/nl-NL.json b/src/lang/nl-NL.json index 10036ab60..51de48ad6 100644 --- a/src/lang/nl-NL.json +++ b/src/lang/nl-NL.json @@ -994,7 +994,7 @@ "and": "en", "snmpCommunityStringHelptext": "Deze string fungeert als een wachtwoord om toegang tot SNMP-apparaten te verifiëren en te beheren. Match het met de configuratie van uw SNMP-apparaat.", "groupOnesenderDesc": "Zorg ervoor dat de GroupID juist is. Om een bericht naar een groep te sturen, bijvoorbeeld: 628123456789-342345", - "privateOnesenderDesc": "Zorg ervoor dat het telefoonnummer juist is. Om een bericht te sturen naar een privenummer, bijvoorbeeld: 628123456789", + "privateOnesenderDesc": "Zorg ervoor dat het telefoonnummer juist is. Om een bericht te sturen naar een privénummer, bijvoorbeeld: 628123456789", "now": "nu", "time ago": "{0} geleden", "-year": "-jaar", @@ -1007,7 +1007,7 @@ "Host Onesender": "Host Onesender", "Token Onesender": "Token Onesender", "Recipient Type": "Ontvanger Type", - "Private Number": "Privenummer", + "Private Number": "Privénummer", "Group ID": "Groep ID", "wayToGetOnesenderUrlandToken": "U kunt de URL en Token krijgen door naar de Onesender website te gaan. Meer informatie {0}", "Add Remote Browser": "Externe browser toevoegen", @@ -1551,5 +1551,27 @@ "expectedTlsAlertDescription": "Selecteer de TLS-waarschuwing waarvan u verwacht dat de server deze retourneert. Gebruik {code} om te verifiëren dat mTLS-eindpunten verbindingen weigeren zonder clientcertificaten. Zie {link} voor details.", "Protocol": "Protocol", "domain_expiry_unsupported_missing_target": "Geen geldige domeinnaam of hostnaam is ingesteld voor deze monitor", - "Endpoint": "Endpoint" + "Endpoint": "Endpoint", + "signalUseTemplate": "Gebruik een persoonlijk berichtensjabloon", + "signalUseTemplateDescription": "Indien ingeschakeld, wordt het bericht verzonden met een persoonlijk sjabloon. U kunt Liquid-templating gebruiken om het meldingsformaat aan te passen.", + "360messengerAuthToken": "360messenger API Sleutel", + "360messengerRecipient": "Telefoonnummer (s) van de ontvanger", + "360messengerGroupId": "360messenger Groep ID", + "360messengerUseTemplate": "Gebruik een persoonlijk berichtensjabloon", + "360messengerTemplate": "360messenger berichtensjabloon", + "360messengerGroupList": "WhatsApp groepen", + "360messengerSelectGroupList": "Selecteer een groep om toe te voegen", + "360messengerSelectedGroupID": "Geselecteerde Groep ID(s)", + "360messengerEnableSendToGroup": "Schakel versturen naar WhatsApp groep(en) in", + "360messengerCustomMessageTemplate": "Persoonlijk berichtensjabloon", + "360messengerEnableCustomMessage": "Schakel een persoonlijk berichtensjabloon in i.p.v. het standaardbericht.", + "360messengerMessageTemplate": "Berichtensjabloon", + "teamsEnableTags": "Inclusief tags", + "teamsEnableTagsDescription": "Indien ingeschakeld zal het bericht de monitortags bevatten.", + "certificateExpiryNotificationHelp": "De hoeveelheid dagen op voorhand kan in de instellingen worden geconfigureerd.", + "matrixUseTemplate": "Gebruik een persoonlijk berichtensjabloon", + "matrixUseTemplateDescription": "Indien ingeschakeld, wordt het bericht verzonden met een persoonlijk sjabloon.", + "monitorTypeGameServer": "Spelserver", + "monitorTypeDatabase": "Databank Monitor Type", + "monitorTypeSpecial": "Speciaal" } From 4364699f12461f49ec7c0e78a7b0495499c70aa2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 10:14:21 +0800 Subject: [PATCH 12/23] chore: Update dependencies (#7120) --- package-lock.json | 1019 ++++++++++++++++++++++++++++----------------- 1 file changed, 648 insertions(+), 371 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2afef43ec..45c32263b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -331,46 +331,46 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.1004.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.1004.0.tgz", - "integrity": "sha512-iRFVMN0Rlh9tjEuz1c6eQnv9EiYH0uxIvobsn5IvOjsM0PdfsKpGdRKiQIA/OgmpTPfuYyySwaRRtDFH9TMlQw==", + "version": "3.1005.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.1005.0.tgz", + "integrity": "sha512-vYZCaQPvawj2W76UtQCu2VCV0vEQnHxL1MOKri4jICLSRiFPlHTosUuwJDzJIIrvTuFgR2DolbcBLRSCLBo/oQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/credential-provider-node": "^3.972.18", + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/credential-provider-node": "^3.972.19", "@aws-sdk/middleware-host-header": "^3.972.7", "@aws-sdk/middleware-logger": "^3.972.7", "@aws-sdk/middleware-recursion-detection": "^3.972.7", - "@aws-sdk/middleware-user-agent": "^3.972.19", + "@aws-sdk/middleware-user-agent": "^3.972.20", "@aws-sdk/region-config-resolver": "^3.972.7", "@aws-sdk/types": "^3.973.5", "@aws-sdk/util-endpoints": "^3.996.4", "@aws-sdk/util-user-agent-browser": "^3.972.7", - "@aws-sdk/util-user-agent-node": "^3.973.4", + "@aws-sdk/util-user-agent-node": "^3.973.5", "@smithy/config-resolver": "^4.4.10", - "@smithy/core": "^3.23.8", + "@smithy/core": "^3.23.9", "@smithy/fetch-http-handler": "^5.3.13", "@smithy/hash-node": "^4.2.11", "@smithy/invalid-dependency": "^4.2.11", "@smithy/middleware-content-length": "^4.2.11", - "@smithy/middleware-endpoint": "^4.4.22", - "@smithy/middleware-retry": "^4.4.39", + "@smithy/middleware-endpoint": "^4.4.23", + "@smithy/middleware-retry": "^4.4.40", "@smithy/middleware-serde": "^4.2.12", "@smithy/middleware-stack": "^4.2.11", "@smithy/node-config-provider": "^4.3.11", "@smithy/node-http-handler": "^4.4.14", "@smithy/protocol-http": "^5.3.11", - "@smithy/smithy-client": "^4.12.2", + "@smithy/smithy-client": "^4.12.3", "@smithy/types": "^4.13.0", "@smithy/url-parser": "^4.2.11", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.38", - "@smithy/util-defaults-mode-node": "^4.2.41", + "@smithy/util-defaults-mode-browser": "^4.3.39", + "@smithy/util-defaults-mode-node": "^4.2.42", "@smithy/util-endpoints": "^3.3.2", "@smithy/util-middleware": "^4.2.11", "@smithy/util-retry": "^4.2.11", @@ -382,20 +382,20 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.973.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.18.tgz", - "integrity": "sha512-GUIlegfcK2LO1J2Y98sCJy63rQSiLiDOgVw7HiHPRqfI2vb3XozTVqemwO0VSGXp54ngCnAQz0Lf0YPCBINNxA==", + "version": "3.973.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.19.tgz", + "integrity": "sha512-56KePyOcZnKTWCd89oJS1G6j3HZ9Kc+bh/8+EbvtaCCXdP6T7O7NzCiPuHRhFLWnzXIaXX3CxAz0nI5My9spHQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@aws-sdk/types": "^3.973.5", "@aws-sdk/xml-builder": "^3.972.10", - "@smithy/core": "^3.23.8", + "@smithy/core": "^3.23.9", "@smithy/node-config-provider": "^4.3.11", "@smithy/property-provider": "^4.2.11", "@smithy/protocol-http": "^5.3.11", "@smithy/signature-v4": "^5.3.11", - "@smithy/smithy-client": "^4.12.2", + "@smithy/smithy-client": "^4.12.3", "@smithy/types": "^4.13.0", "@smithy/util-base64": "^4.3.2", "@smithy/util-middleware": "^4.2.11", @@ -407,13 +407,13 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.10.tgz", - "integrity": "sha512-R7saD8TvU6En8tFstAgbM9w6wlFxTwXrvMEpheVdGyDMKSxK412aRy87VNb2Mc2By0vL58OIE487afpxOc/rVQ==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.11.tgz", + "integrity": "sha512-yHBjinYauxSvikf15EtgXyZ9TBIMVHUSWFPycQtPltTINpK+uv6K22zKkVsbxpB0gvsdRdIWP0UG5gejM+jPuQ==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/nested-clients": "^3.996.7", + "@aws-sdk/nested-clients": "^3.996.8", "@aws-sdk/types": "^3.973.5", "@smithy/property-provider": "^4.2.11", "@smithy/types": "^4.13.0", @@ -424,13 +424,13 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.16", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.16.tgz", - "integrity": "sha512-HrdtnadvTGAQUr18sPzGlE5El3ICphnH6SU7UQOMOWFgRKbTRNN8msTxM4emzguUso9CzaHU2xy5ctSrmK5YNA==", + "version": "3.972.17", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.17.tgz", + "integrity": "sha512-MBAMW6YELzE1SdkOniqr51mrjapQUv8JXSGxtwRjQV0mwVDutVsn22OPAUt4RcLRvdiHQmNBDEFP9iTeSVCOlA==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/core": "^3.973.18", + "@aws-sdk/core": "^3.973.19", "@aws-sdk/types": "^3.973.5", "@smithy/property-provider": "^4.2.11", "@smithy/types": "^4.13.0", @@ -441,19 +441,19 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.18.tgz", - "integrity": "sha512-NyB6smuZAixND5jZumkpkunQ0voc4Mwgkd+SZ6cvAzIB7gK8HV8Zd4rS8Kn5MmoGgusyNfVGG+RLoYc4yFiw+A==", + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.19.tgz", + "integrity": "sha512-9EJROO8LXll5a7eUFqu48k6BChrtokbmgeMWmsH7lBb6lVbtjslUYz/ShLi+SHkYzTomiGBhmzTW7y+H4BxsnA==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/core": "^3.973.18", + "@aws-sdk/core": "^3.973.19", "@aws-sdk/types": "^3.973.5", "@smithy/fetch-http-handler": "^5.3.13", "@smithy/node-http-handler": "^4.4.14", "@smithy/property-provider": "^4.2.11", "@smithy/protocol-http": "^5.3.11", - "@smithy/smithy-client": "^4.12.2", + "@smithy/smithy-client": "^4.12.3", "@smithy/types": "^4.13.0", "@smithy/util-stream": "^4.5.17", "tslib": "^2.6.2" @@ -463,20 +463,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.17", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.17.tgz", - "integrity": "sha512-dFqh7nfX43B8dO1aPQHOcjC0SnCJ83H3F+1LoCh3X1P7E7N09I+0/taID0asU6GCddfDExqnEvQtDdkuMe5tKQ==", + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.18.tgz", + "integrity": "sha512-vthIAXJISZnj2576HeyLBj4WTeX+I7PwWeRkbOa0mVX39K13SCGxCgOFuKj2ytm9qTlLOmXe4cdEnroteFtJfw==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/credential-provider-env": "^3.972.16", - "@aws-sdk/credential-provider-http": "^3.972.18", - "@aws-sdk/credential-provider-login": "^3.972.17", - "@aws-sdk/credential-provider-process": "^3.972.16", - "@aws-sdk/credential-provider-sso": "^3.972.17", - "@aws-sdk/credential-provider-web-identity": "^3.972.17", - "@aws-sdk/nested-clients": "^3.996.7", + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/credential-provider-env": "^3.972.17", + "@aws-sdk/credential-provider-http": "^3.972.19", + "@aws-sdk/credential-provider-login": "^3.972.18", + "@aws-sdk/credential-provider-process": "^3.972.17", + "@aws-sdk/credential-provider-sso": "^3.972.18", + "@aws-sdk/credential-provider-web-identity": "^3.972.18", + "@aws-sdk/nested-clients": "^3.996.8", "@aws-sdk/types": "^3.973.5", "@smithy/credential-provider-imds": "^4.2.11", "@smithy/property-provider": "^4.2.11", @@ -489,14 +489,14 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.17", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.17.tgz", - "integrity": "sha512-gf2E5b7LpKb+JX2oQsRIDxdRZjBFZt2olCGlWCdb3vBERbXIPgm2t1R5mEnwd4j0UEO/Tbg5zN2KJbHXttJqwA==", + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.18.tgz", + "integrity": "sha512-kINzc5BBxdYBkPZ0/i1AMPMOk5b5QaFNbYMElVw5QTX13AKj6jcxnv/YNl9oW9mg+Y08ti19hh01HhyEAxsSJQ==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/nested-clients": "^3.996.7", + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/nested-clients": "^3.996.8", "@aws-sdk/types": "^3.973.5", "@smithy/property-provider": "^4.2.11", "@smithy/protocol-http": "^5.3.11", @@ -509,18 +509,18 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.18.tgz", - "integrity": "sha512-ZDJa2gd1xiPg/nBDGhUlat02O8obaDEnICBAVS8qieZ0+nDfaB0Z3ec6gjZj27OqFTjnB/Q5a0GwQwb7rMVViw==", + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.19.tgz", + "integrity": "sha512-yDWQ9dFTr+IMxwanFe7+tbN5++q8psZBjlUwOiCXn1EzANoBgtqBwcpYcHaMGtn0Wlfj4NuXdf2JaEx1lz5RaQ==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.16", - "@aws-sdk/credential-provider-http": "^3.972.18", - "@aws-sdk/credential-provider-ini": "^3.972.17", - "@aws-sdk/credential-provider-process": "^3.972.16", - "@aws-sdk/credential-provider-sso": "^3.972.17", - "@aws-sdk/credential-provider-web-identity": "^3.972.17", + "@aws-sdk/credential-provider-env": "^3.972.17", + "@aws-sdk/credential-provider-http": "^3.972.19", + "@aws-sdk/credential-provider-ini": "^3.972.18", + "@aws-sdk/credential-provider-process": "^3.972.17", + "@aws-sdk/credential-provider-sso": "^3.972.18", + "@aws-sdk/credential-provider-web-identity": "^3.972.18", "@aws-sdk/types": "^3.973.5", "@smithy/credential-provider-imds": "^4.2.11", "@smithy/property-provider": "^4.2.11", @@ -533,13 +533,13 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.16", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.16.tgz", - "integrity": "sha512-n89ibATwnLEg0ZdZmUds5bq8AfBAdoYEDpqP3uzPLaRuGelsKlIvCYSNNvfgGLi8NaHPNNhs1HjJZYbqkW9b+g==", + "version": "3.972.17", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.17.tgz", + "integrity": "sha512-c8G8wT1axpJDgaP3xzcy+q8Y1fTi9A2eIQJvyhQ9xuXrUZhlCfXbC0vM9bM1CUXiZppFQ1p7g0tuUMvil/gCPg==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/core": "^3.973.18", + "@aws-sdk/core": "^3.973.19", "@aws-sdk/types": "^3.973.5", "@smithy/property-provider": "^4.2.11", "@smithy/shared-ini-file-loader": "^4.4.6", @@ -551,15 +551,15 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.17", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.17.tgz", - "integrity": "sha512-wGtte+48xnhnhHMl/MsxzacBPs5A+7JJedjiP452IkHY7vsbYKcvQBqFye8LwdTJVeHtBHv+JFeTscnwepoWGg==", + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.18.tgz", + "integrity": "sha512-YHYEfj5S2aqInRt5ub8nDOX8vAxgMvd84wm2Y3WVNfFa/53vOv9T7WOAqXI25qjj3uEcV46xxfqdDQk04h5XQA==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/nested-clients": "^3.996.7", - "@aws-sdk/token-providers": "3.1004.0", + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/nested-clients": "^3.996.8", + "@aws-sdk/token-providers": "3.1005.0", "@aws-sdk/types": "^3.973.5", "@smithy/property-provider": "^4.2.11", "@smithy/shared-ini-file-loader": "^4.4.6", @@ -571,14 +571,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.17", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.17.tgz", - "integrity": "sha512-8aiVJh6fTdl8gcyL+sVNcNwTtWpmoFa1Sh7xlj6Z7L/cZ/tYMEBHq44wTYG8Kt0z/PpGNopD89nbj3FHl9QmTA==", + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.18.tgz", + "integrity": "sha512-OqlEQpJ+J3T5B96qtC1zLLwkBloechP+fezKbCH0sbd2cCc0Ra55XpxWpk/hRj69xAOYtHvoC4orx6eTa4zU7g==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/nested-clients": "^3.996.7", + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/nested-clients": "^3.996.8", "@aws-sdk/types": "^3.973.5", "@smithy/property-provider": "^4.2.11", "@smithy/shared-ini-file-loader": "^4.4.6", @@ -590,27 +590,27 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.1004.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.1004.0.tgz", - "integrity": "sha512-THsua88i7DrPoO8WCIWLPWb8706s2ytl2ej+WB9sv39VPCJNc7YwGtTA51reziyzlLnJUGHkI+krp0oTHEGaBw==", + "version": "3.1005.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.1005.0.tgz", + "integrity": "sha512-H6Prb37+8TdTkGsYH1WkWjupWdM4aHTmF6VLdyTwOWmg4WFkKAb1OJcMrxNCJ8Yy/UvxOca4jk6z2ej+T1pjtQ==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.1004.0", - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/credential-provider-cognito-identity": "^3.972.10", - "@aws-sdk/credential-provider-env": "^3.972.16", - "@aws-sdk/credential-provider-http": "^3.972.18", - "@aws-sdk/credential-provider-ini": "^3.972.17", - "@aws-sdk/credential-provider-login": "^3.972.17", - "@aws-sdk/credential-provider-node": "^3.972.18", - "@aws-sdk/credential-provider-process": "^3.972.16", - "@aws-sdk/credential-provider-sso": "^3.972.17", - "@aws-sdk/credential-provider-web-identity": "^3.972.17", - "@aws-sdk/nested-clients": "^3.996.7", + "@aws-sdk/client-cognito-identity": "3.1005.0", + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/credential-provider-cognito-identity": "^3.972.11", + "@aws-sdk/credential-provider-env": "^3.972.17", + "@aws-sdk/credential-provider-http": "^3.972.19", + "@aws-sdk/credential-provider-ini": "^3.972.18", + "@aws-sdk/credential-provider-login": "^3.972.18", + "@aws-sdk/credential-provider-node": "^3.972.19", + "@aws-sdk/credential-provider-process": "^3.972.17", + "@aws-sdk/credential-provider-sso": "^3.972.18", + "@aws-sdk/credential-provider-web-identity": "^3.972.18", + "@aws-sdk/nested-clients": "^3.996.8", "@aws-sdk/types": "^3.973.5", "@smithy/config-resolver": "^4.4.10", - "@smithy/core": "^3.23.8", + "@smithy/core": "^3.23.9", "@smithy/credential-provider-imds": "^4.2.11", "@smithy/node-config-provider": "^4.3.11", "@smithy/property-provider": "^4.2.11", @@ -670,16 +670,16 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.19", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.19.tgz", - "integrity": "sha512-Km90fcXt3W/iqujHzuM6IaDkYCj73gsYufcuWXApWdzoTy6KGk8fnchAjePMARU0xegIR3K4N3yIo1vy7OVe8A==", + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.20.tgz", + "integrity": "sha512-3kNTLtpUdeahxtnJRnj/oIdLAUdzTfr9N40KtxNhtdrq+Q1RPMdCJINRXq37m4t5+r3H70wgC3opW46OzFcZYA==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/core": "^3.973.18", + "@aws-sdk/core": "^3.973.19", "@aws-sdk/types": "^3.973.5", "@aws-sdk/util-endpoints": "^3.996.4", - "@smithy/core": "^3.23.8", + "@smithy/core": "^3.23.9", "@smithy/protocol-http": "^5.3.11", "@smithy/types": "^4.13.0", "@smithy/util-retry": "^4.2.11", @@ -690,45 +690,45 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.996.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.7.tgz", - "integrity": "sha512-MlGWA8uPaOs5AiTZ5JLM4uuWDm9EEAnm9cqwvqQIc6kEgel/8s1BaOWm9QgUcfc9K8qd7KkC3n43yDbeXOA2tg==", + "version": "3.996.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.8.tgz", + "integrity": "sha512-6HlLm8ciMW8VzfB80kfIx16PBA9lOa9Dl+dmCBi78JDhvGlx3I7Rorwi5PpVRkL31RprXnYna3yBf6UKkD/PqA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.18", + "@aws-sdk/core": "^3.973.19", "@aws-sdk/middleware-host-header": "^3.972.7", "@aws-sdk/middleware-logger": "^3.972.7", "@aws-sdk/middleware-recursion-detection": "^3.972.7", - "@aws-sdk/middleware-user-agent": "^3.972.19", + "@aws-sdk/middleware-user-agent": "^3.972.20", "@aws-sdk/region-config-resolver": "^3.972.7", "@aws-sdk/types": "^3.973.5", "@aws-sdk/util-endpoints": "^3.996.4", "@aws-sdk/util-user-agent-browser": "^3.972.7", - "@aws-sdk/util-user-agent-node": "^3.973.4", + "@aws-sdk/util-user-agent-node": "^3.973.5", "@smithy/config-resolver": "^4.4.10", - "@smithy/core": "^3.23.8", + "@smithy/core": "^3.23.9", "@smithy/fetch-http-handler": "^5.3.13", "@smithy/hash-node": "^4.2.11", "@smithy/invalid-dependency": "^4.2.11", "@smithy/middleware-content-length": "^4.2.11", - "@smithy/middleware-endpoint": "^4.4.22", - "@smithy/middleware-retry": "^4.4.39", + "@smithy/middleware-endpoint": "^4.4.23", + "@smithy/middleware-retry": "^4.4.40", "@smithy/middleware-serde": "^4.2.12", "@smithy/middleware-stack": "^4.2.11", "@smithy/node-config-provider": "^4.3.11", "@smithy/node-http-handler": "^4.4.14", "@smithy/protocol-http": "^5.3.11", - "@smithy/smithy-client": "^4.12.2", + "@smithy/smithy-client": "^4.12.3", "@smithy/types": "^4.13.0", "@smithy/url-parser": "^4.2.11", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.38", - "@smithy/util-defaults-mode-node": "^4.2.41", + "@smithy/util-defaults-mode-browser": "^4.3.39", + "@smithy/util-defaults-mode-node": "^4.2.42", "@smithy/util-endpoints": "^3.3.2", "@smithy/util-middleware": "^4.2.11", "@smithy/util-retry": "^4.2.11", @@ -757,14 +757,14 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.1004.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1004.0.tgz", - "integrity": "sha512-j9BwZZId9sFp+4GPhf6KrwO8Tben2sXibZA8D1vv2I1zBdvkUHcBA2g4pkqIpTRalMTLC0NPkBPX0gERxfy/iA==", + "version": "3.1005.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1005.0.tgz", + "integrity": "sha512-vMxd+ivKqSxU9bHx5vmAlFKDAkjGotFU56IOkDa5DaTu1WWwbcse0yFHEm9I537oVvodaiwMl3VBwgHfzQ2rvw==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/nested-clients": "^3.996.7", + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/nested-clients": "^3.996.8", "@aws-sdk/types": "^3.973.5", "@smithy/property-provider": "^4.2.11", "@smithy/shared-ini-file-loader": "^4.4.6", @@ -833,13 +833,13 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.973.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.4.tgz", - "integrity": "sha512-uqKeLqZ9D3nQjH7HGIERNXK9qnSpUK08l4MlJ5/NZqSSdeJsVANYp437EM9sEzwU28c2xfj2V6qlkqzsgtKs6Q==", + "version": "3.973.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.5.tgz", + "integrity": "sha512-Dyy38O4GeMk7UQ48RupfHif//gqnOPbq/zlvRssc11E2mClT+aUfc3VS2yD8oLtzqO3RsqQ9I3gOBB4/+HjPOw==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.19", + "@aws-sdk/middleware-user-agent": "^3.972.20", "@aws-sdk/types": "^3.973.5", "@smithy/node-config-provider": "^4.3.11", "@smithy/types": "^4.13.0", @@ -1192,6 +1192,15 @@ "node": ">=16" } }, + "node_modules/@azure/msal-node/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -4841,114 +4850,114 @@ "license": "MIT" }, "node_modules/@vue/reactivity": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.29.tgz", - "integrity": "sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.30.tgz", + "integrity": "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==", "dev": true, "license": "MIT", "dependencies": { - "@vue/shared": "3.5.29" + "@vue/shared": "3.5.30" } }, "node_modules/@vue/reactivity/node_modules/@vue/shared": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.29.tgz", - "integrity": "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", "dev": true, "license": "MIT" }, "node_modules/@vue/runtime-core": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.29.tgz", - "integrity": "sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.30.tgz", + "integrity": "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.29", - "@vue/shared": "3.5.29" + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" } }, "node_modules/@vue/runtime-core/node_modules/@vue/shared": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.29.tgz", - "integrity": "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", "dev": true, "license": "MIT" }, "node_modules/@vue/runtime-dom": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.29.tgz", - "integrity": "sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.30.tgz", + "integrity": "sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.29", - "@vue/runtime-core": "3.5.29", - "@vue/shared": "3.5.29", + "@vue/reactivity": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/shared": "3.5.30", "csstype": "^3.2.3" } }, "node_modules/@vue/runtime-dom/node_modules/@vue/shared": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.29.tgz", - "integrity": "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", "dev": true, "license": "MIT" }, "node_modules/@vue/server-renderer": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.29.tgz", - "integrity": "sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.30.tgz", + "integrity": "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.29", - "@vue/shared": "3.5.29" + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" }, "peerDependencies": { - "vue": "3.5.29" + "vue": "3.5.30" } }, "node_modules/@vue/server-renderer/node_modules/@vue/compiler-core": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.29.tgz", - "integrity": "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", - "@vue/shared": "3.5.29", + "@vue/shared": "3.5.30", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/server-renderer/node_modules/@vue/compiler-dom": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.29.tgz", - "integrity": "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.29", - "@vue/shared": "3.5.29" + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" } }, "node_modules/@vue/server-renderer/node_modules/@vue/compiler-ssr": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.29.tgz", - "integrity": "sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.29", - "@vue/shared": "3.5.29" + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" } }, "node_modules/@vue/server-renderer/node_modules/@vue/shared": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.29.tgz", - "integrity": "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", "dev": true, "license": "MIT" }, @@ -5058,9 +5067,9 @@ } }, "node_modules/aedes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/aedes/-/aedes-1.0.0.tgz", - "integrity": "sha512-9NNdArUy/EChVc/cnvZfgpBLxPsg9EZdh/hXogy6Dnm3aQLh3EMIemiQImwzd7brkCV1gyqcp8pvzNa5vswVMA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/aedes/-/aedes-1.0.1.tgz", + "integrity": "sha512-DDS1q5aehzNvZISZi2Dx8IN/rnm5VB9gjKGoSQMuRQE5I8T7cpZI3xEBGCpLR+73IqywI2vdX9asc2t+cx36/A==", "dev": true, "license": "MIT", "dependencies": { @@ -5114,6 +5123,18 @@ "node": ">=14" } }, + "node_modules/aedes-packet/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/aedes-packet/node_modules/mqtt-packet": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-7.1.2.tgz", @@ -5126,6 +5147,31 @@ "process-nextick-args": "^2.0.1" } }, + "node_modules/aedes-packet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/aedes-packet/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/aedes-persistence": { "version": "10.2.2", "resolved": "https://registry.npmjs.org/aedes-persistence/-/aedes-persistence-10.2.2.tgz", @@ -5140,20 +5186,6 @@ "node": ">=20" } }, - "node_modules/aedes/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -5394,6 +5426,16 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/archiver/node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -5436,6 +5478,16 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/archiver/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/are-docs-informative": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", @@ -5460,6 +5512,29 @@ "node": ">=10" } }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -5828,30 +5903,6 @@ "readable-stream": "~1.0.2" } }, - "node_modules/barse/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/barse/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/barse/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -5948,14 +5999,64 @@ "license": "MIT" }, "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.6.tgz", + "integrity": "sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==", "license": "MIT", "dependencies": { - "buffer": "^5.5.0", + "@types/readable-stream": "^4.0.0", + "buffer": "^6.0.3", "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "readable-stream": "^4.2.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" } }, "node_modules/bn.js": { @@ -6706,6 +6807,16 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/compress-commons/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -6772,6 +6883,29 @@ "typedarray": "^0.0.6" } }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/concurrently": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", @@ -6994,6 +7128,16 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/crc32-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/croner": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/croner/-/croner-8.1.2.tgz", @@ -7554,6 +7698,31 @@ "node": ">= 8.0" } }, + "node_modules/docker-modem/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/docker-modem/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/dockerode": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.9.tgz", @@ -7606,6 +7775,18 @@ "node": ">=6" } }, + "node_modules/dockerode/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/dockerode/node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -7638,6 +7819,31 @@ "node": ">=12.0.0" } }, + "node_modules/dockerode/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/dockerode/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/dockerode/node_modules/tar-fs": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", @@ -7798,6 +8004,29 @@ "stream-shift": "^1.0.2" } }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -8929,9 +9158,9 @@ } }, "node_modules/flatted": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.4.tgz", - "integrity": "sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz", + "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", "dev": true, "license": "ISC" }, @@ -9687,6 +9916,29 @@ "readable-stream": "^3.6.0" } }, + "node_modules/help-me/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/help-me/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -9802,9 +10054,9 @@ } }, "node_modules/http-graceful-shutdown": { - "version": "3.1.15", - "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.15.tgz", - "integrity": "sha512-7BzY5XxGV4g7QaOZ8xf5Hco8vJMMUFDl+AcB8AuOOdS1wTOZ88aV3EIADUnyAItj2QW+QfBPz08/PzxKiDKh6Q==", + "version": "3.1.16", + "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.16.tgz", + "integrity": "sha512-984h5GmEjnlPR2xW73Z/+r5rguYowKbIYlAN0uqXClo9xjZm+8ZeVN0hMh+0mlw6+H3CThchhZREr0/IHqUO7w==", "license": "MIT", "dependencies": { "debug": "^4.3.4" @@ -9874,6 +10126,16 @@ "uuid-parse": "^1.1.0" } }, + "node_modules/hyperid/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -10587,10 +10849,9 @@ } }, "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "license": "MIT" }, "node_modules/isexe": { @@ -11804,59 +12065,15 @@ "process-nextick-args": "^2.0.1" } }, - "node_modules/mqtt-packet/node_modules/bl": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.6.tgz", - "integrity": "sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==", - "dev": true, + "node_modules/mqtt/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", "dependencies": { - "@types/readable-stream": "^4.0.0", - "buffer": "^6.0.3", + "buffer": "^5.5.0", "inherits": "^2.0.4", - "readable-stream": "^4.2.0" - } - }, - "node_modules/mqtt-packet/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/mqtt-packet/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "readable-stream": "^3.4.0" } }, "node_modules/mqtt/node_modules/mqtt-packet": { @@ -11870,6 +12087,29 @@ "process-nextick-args": "^2.0.1" } }, + "node_modules/mqtt/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/mqtt/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/mqtt/node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", @@ -12156,6 +12396,31 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/node-gyp/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-gyp/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/node-radius-utils": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/node-radius-utils/-/node-radius-utils-1.2.0.tgz", @@ -13706,17 +13971,15 @@ } }, "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, "node_modules/readdir-glob": { @@ -14343,6 +14606,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -14380,6 +14650,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", @@ -14996,6 +15273,29 @@ "readable-stream": "^3.0.0" } }, + "node_modules/split2/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/split2/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", @@ -15115,13 +15415,10 @@ } }, "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "license": "MIT" }, "node_modules/string-to-stream": { "version": "1.1.1", @@ -15705,42 +16002,6 @@ "node": ">=18.17" } }, - "node_modules/tedious/node_modules/bl": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.6.tgz", - "integrity": "sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==", - "license": "MIT", - "dependencies": { - "@types/readable-stream": "^4.0.0", - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^4.2.0" - } - }, - "node_modules/tedious/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/tedious/node_modules/iconv-lite": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", @@ -15757,22 +16018,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/tedious/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/teex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", @@ -15883,6 +16128,16 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/test/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/testcontainers": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-11.12.0.tgz", @@ -16350,12 +16605,17 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/uuid-parse": { @@ -16510,17 +16770,17 @@ } }, "node_modules/vue": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.29.tgz", - "integrity": "sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", + "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.29", - "@vue/compiler-sfc": "3.5.29", - "@vue/runtime-dom": "3.5.29", - "@vue/server-renderer": "3.5.29", - "@vue/shared": "3.5.29" + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" }, "peerDependencies": { "typescript": "*" @@ -16717,63 +16977,63 @@ } }, "node_modules/vue/node_modules/@vue/compiler-core": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.29.tgz", - "integrity": "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", - "@vue/shared": "3.5.29", + "@vue/shared": "3.5.30", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/vue/node_modules/@vue/compiler-dom": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.29.tgz", - "integrity": "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.29", - "@vue/shared": "3.5.29" + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" } }, "node_modules/vue/node_modules/@vue/compiler-sfc": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.29.tgz", - "integrity": "sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", - "@vue/compiler-core": "3.5.29", - "@vue/compiler-dom": "3.5.29", - "@vue/compiler-ssr": "3.5.29", - "@vue/shared": "3.5.29", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", - "postcss": "^8.5.6", + "postcss": "^8.5.8", "source-map-js": "^1.2.1" } }, "node_modules/vue/node_modules/@vue/compiler-ssr": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.29.tgz", - "integrity": "sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.29", - "@vue/shared": "3.5.29" + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" } }, "node_modules/vue/node_modules/@vue/shared": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.29.tgz", - "integrity": "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", "dev": true, "license": "MIT" }, @@ -16962,6 +17222,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/which-collection": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", @@ -17374,6 +17641,16 @@ "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } + }, + "node_modules/zip-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } } } } From 3752a59f72a4e1b89f5bd1d835918d13f6aa8140 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 10:24:07 +0800 Subject: [PATCH 13/23] chore: update to 2.2.1 (#7126) --- package-lock.json | 4 ++-- package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 45c32263b..2d34f73bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "uptime-kuma", - "version": "2.2.0", + "version": "2.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "uptime-kuma", - "version": "2.2.0", + "version": "2.2.1", "license": "MIT", "dependencies": { "@grpc/grpc-js": "~1.8.22", diff --git a/package.json b/package.json index af586ea37..700e15e86 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uptime-kuma", - "version": "2.2.0", + "version": "2.2.1", "license": "MIT", "repository": { "type": "git", @@ -44,7 +44,7 @@ "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test2 --target pr-test2 . --push", "upload-artifacts": "node extra/release/upload-artifacts.mjs", "upload-artifacts-beta": "node extra/release/upload-artifacts-beta.mjs", - "setup": "git checkout 2.2.0 && npm ci --omit dev --no-audit && npm run download-dist", + "setup": "git checkout 2.2.1 && npm ci --omit dev --no-audit && npm run download-dist", "download-dist": "node extra/download-dist.js", "mark-as-nightly": "node extra/mark-as-nightly.js", "reset-password": "node extra/reset-password.js", From 0462b6f87b76872482c52f8259a12d0fe6fa1b9d Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Mar 2026 12:15:12 +0000 Subject: [PATCH 14/23] =?UTF-8?q?fix:=20Update=20Home=20Assistant=20notifi?= =?UTF-8?q?cation=20help=20text=20for=20HA=202024=20Services=E2=86=92Actio?= =?UTF-8?q?ns=20rename=20(#7128)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: CommanderStorm <26258709+CommanderStorm@users.noreply.github.com> Co-authored-by: Frank Elsinga Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Manu <4445816+tr4nt0r@users.noreply.github.com> --- src/components/notifications/HomeAssistant.vue | 10 ++-------- src/lang/en.json | 4 ++-- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/components/notifications/HomeAssistant.vue b/src/components/notifications/HomeAssistant.vue index 49aa91ffa..afd7d6719 100644 --- a/src/components/notifications/HomeAssistant.vue +++ b/src/components/notifications/HomeAssistant.vue @@ -38,7 +38,7 @@
- +
-

- {{ - $t( - 'A list of Notification Services can be found in Home Assistant under "Developer Tools > Services" search for "notification" to find your device/phone name.' - ) - }} -

+

{{ $t("homeAssistantNotificationActionHelptext") }}

{{ $t("Automations can optionally be triggered in Home Assistant:") }}

{{ $t("Trigger type:") }} diff --git a/src/lang/en.json b/src/lang/en.json index 5f01aafc7..0bebb4f52 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -514,9 +514,9 @@ "Home Assistant URL": "Home Assistant URL", "Long-Lived Access Token": "Long-Lived Access Token", "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token.", - "Notification Service": "Notification Service", + "Notification Action": "Notification Action", "default: notify all devices": "default: notify all devices", - "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.", + "homeAssistantNotificationActionHelptext": "A list of Notification Actions can be found in Home Assistant under \"Settings > Developer Tools > Actions\". Search for \"notify\" to find your actions. Enter only the part after \"notify.\", e.g. for the action \"notify.mobile_app_xyz\" enter \"mobile_app_xyz\". For built-in mobile notifications, look for \"Send a notification via mobile_app_xyz\" (not \"Send a notification\").", "Automations can optionally be triggered in Home Assistant:": "Automations can optionally be triggered in Home Assistant:", "Trigger type:": "Trigger type:", "Event type:": "Event type:", From 448643fcf06df6b4f5a66d5f292738b790c74a7c Mon Sep 17 00:00:00 2001 From: Nic Jansma Date: Tue, 10 Mar 2026 12:29:35 -0400 Subject: [PATCH 15/23] fix: prometheus metrics have two series for a single monitor when that monitor has tags (#7125) --- server/routers/api-router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/routers/api-router.js b/server/routers/api-router.js index 2752593f7..9e98bad62 100644 --- a/server/routers/api-router.js +++ b/server/routers/api-router.js @@ -129,7 +129,7 @@ router.all("/api/push/:pushToken", async (request, response) => { Monitor.sendStats(io, monitor.id, monitor.user_id); try { - new Prometheus(monitor, []).update(bean, undefined); + new Prometheus(monitor, await monitor.getTags()).update(bean, undefined); } catch (e) { log.error("prometheus", "Please submit an issue to our GitHub repo. Prometheus update error: ", e.message); } From 59345444e507574846abf48459edc7907fe02900 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Sat, 14 Mar 2026 19:34:24 +0800 Subject: [PATCH 16/23] chore: Add monthly workflow to build `push` Docker image (#7146) Co-authored-by: louislam <1336778+louislam@users.noreply.github.com> --- .github/workflows/build-docker-push.yml | 49 +++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/build-docker-push.yml diff --git a/.github/workflows/build-docker-push.yml b/.github/workflows/build-docker-push.yml new file mode 100644 index 000000000..aaab745e8 --- /dev/null +++ b/.github/workflows/build-docker-push.yml @@ -0,0 +1,49 @@ +name: Build Docker Push Image + +on: + schedule: + # Runs at 2:00 AM UTC on the 1st of every month + - cron: "0 2 1 * *" + workflow_dispatch: # Allow manual trigger + +permissions: {} + +jobs: + build-docker-push: + # Only run on the original repository, not on forks + if: github.repository == 'louislam/uptime-kuma' + runs-on: ubuntu-latest + timeout-minutes: 120 + permissions: + contents: read + + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + with: { persist-credentials: false } + + - name: Set up QEMU + uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@988b5a0280414f521da01fcc63a27aeeb4b104db # v3.6.1 + + - name: Login to Docker Hub + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Use Node.js 20 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + with: + node-version: 20 + + - name: Set up Go + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 + + - name: Install cross-env + run: npm install -g cross-env + + - name: Build and push Docker image + working-directory: extra/uptime-kuma-push + run: npm run build-docker From aa40ffdf2348cda83ce0e5b9e9c8ad051de52bdf Mon Sep 17 00:00:00 2001 From: otbutz Date: Mon, 16 Mar 2026 16:18:05 +0100 Subject: [PATCH 17/23] fix(database): knex propagate create errors (#7155) --- server/database.js | 1 - 1 file changed, 1 deletion(-) diff --git a/server/database.js b/server/database.js index c0e3eb3ef..6b5de40bf 100644 --- a/server/database.js +++ b/server/database.js @@ -275,7 +275,6 @@ class Database { // See: https://github.com/knex/knex/issues/3176#issuecomment-3389054899 min: 0, max: 20, - propagateCreateError: false, acquireTimeoutMillis: acquireConnectionTimeout, afterCreate: (rawConn, done) => { this.initSQLite(rawConn, testMode) From 9b28ddd92358c0f85af5dbbd70e2c726fd851fd7 Mon Sep 17 00:00:00 2001 From: 0xRozier Date: Mon, 16 Mar 2026 23:57:04 +0100 Subject: [PATCH 18/23] fix: monitor graph gaps for sub-millisecond TCP pings (#7159) --- src/components/PingChart.vue | 6 ++-- test/backend-test/test-ping-chart.js | 50 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 test/backend-test/test-ping-chart.js diff --git a/src/components/PingChart.vue b/src/components/PingChart.vue index 5035739c2..46fd30a0a 100644 --- a/src/components/PingChart.vue +++ b/src/components/PingChart.vue @@ -310,15 +310,15 @@ export default { // Show ping values if it was up in this period avgPingData.push({ x, - y: datapoint.up > 0 && datapoint.avgPing > 0 ? datapoint.avgPing : null, + y: datapoint.up > 0 && datapoint.avgPing != null ? datapoint.avgPing : null, }); minPingData.push({ x, - y: datapoint.up > 0 && datapoint.avgPing > 0 ? datapoint.minPing : null, + y: datapoint.up > 0 && datapoint.avgPing != null ? datapoint.minPing : null, }); maxPingData.push({ x, - y: datapoint.up > 0 && datapoint.avgPing > 0 ? datapoint.maxPing : null, + y: datapoint.up > 0 && datapoint.avgPing != null ? datapoint.maxPing : null, }); downData.push({ x, diff --git a/test/backend-test/test-ping-chart.js b/test/backend-test/test-ping-chart.js new file mode 100644 index 000000000..55c781fa1 --- /dev/null +++ b/test/backend-test/test-ping-chart.js @@ -0,0 +1,50 @@ +const { describe, test } = require("node:test"); +const assert = require("node:assert"); + +/** + * Extracts the ping value filtering logic from PingChart.vue pushDatapoint(). + * This mirrors the condition: datapoint.up > 0 && datapoint.avgPing != null + * @param {object} datapoint Datapoint with up, avgPing, minPing, maxPing + * @returns {number|null} The avgPing value or null if filtered out + */ +function filterPingValue(datapoint) { + return datapoint.up > 0 && datapoint.avgPing != null ? datapoint.avgPing : null; +} + +describe("PingChart pushDatapoint filtering", () => { + test("avgPing of 0 should be rendered, not filtered out (#7143)", () => { + const datapoint = { up: 1, down: 0, avgPing: 0, minPing: 0, maxPing: 0 }; + const result = filterPingValue(datapoint); + assert.strictEqual(result, 0, "avgPing of 0 must not be converted to null"); + }); + + test("avgPing of 1 should be rendered", () => { + const datapoint = { up: 1, down: 0, avgPing: 1, minPing: 1, maxPing: 1 }; + const result = filterPingValue(datapoint); + assert.strictEqual(result, 1); + }); + + test("avgPing of null should be filtered out", () => { + const datapoint = { up: 1, down: 0, avgPing: null, minPing: null, maxPing: null }; + const result = filterPingValue(datapoint); + assert.strictEqual(result, null); + }); + + test("avgPing of undefined should be filtered out", () => { + const datapoint = { up: 1, down: 0, avgPing: undefined, minPing: undefined, maxPing: undefined }; + const result = filterPingValue(datapoint); + assert.strictEqual(result, null); + }); + + test("datapoint with no up counts should be filtered out", () => { + const datapoint = { up: 0, down: 1, avgPing: 5, minPing: 5, maxPing: 5 }; + const result = filterPingValue(datapoint); + assert.strictEqual(result, null); + }); + + test("normal ping value with up count should be rendered", () => { + const datapoint = { up: 3, down: 0, avgPing: 42, minPing: 30, maxPing: 55 }; + const result = filterPingValue(datapoint); + assert.strictEqual(result, 42); + }); +}); From 77425f7a71c2a90cf738e9c43599c4c5c88bd4f8 Mon Sep 17 00:00:00 2001 From: Ryan Date: Wed, 18 Mar 2026 19:04:13 +0800 Subject: [PATCH 19/23] feat: add OracleDB monitor (#7156) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- package-lock.json | 46 +++- package.json | 2 + server/monitor-types/oracledb.js | 155 +++++++++++++ server/uptime-kuma-server.js | 2 + src/lang/en.json | 1 + src/pages/Details.vue | 7 + src/pages/EditMonitor.vue | 55 ++++- test/backend-test/monitors/test-oracledb.js | 232 ++++++++++++++++++++ 8 files changed, 484 insertions(+), 16 deletions(-) create mode 100644 server/monitor-types/oracledb.js create mode 100644 test/backend-test/monitors/test-oracledb.js diff --git a/package-lock.json b/package-lock.json index 2d34f73bb..4c66721c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,6 +66,7 @@ "nostr-tools": "~2.20.0", "notp": "~2.0.3", "openid-client": "~5.7.1", + "oracledb": "~6.10.0", "password-hash": "~1.2.2", "pg": "~8.11.6", "pg-connection-string": "~2.6.4", @@ -104,6 +105,7 @@ "@testcontainers/mariadb": "^10.28.0", "@testcontainers/mssqlserver": "^10.28.0", "@testcontainers/mysql": "^11.12.0", + "@testcontainers/oraclefree": "^11.13.0", "@testcontainers/postgresql": "^11.12.0", "@testcontainers/rabbitmq": "^10.28.0", "@types/bootstrap": "~5.1.13", @@ -4133,6 +4135,16 @@ "testcontainers": "^11.12.0" } }, + "node_modules/@testcontainers/oraclefree": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@testcontainers/oraclefree/-/oraclefree-11.13.0.tgz", + "integrity": "sha512-qYy7Q9L5XOM++4aCjcJnmxvRIXaAkyR0zOL0Sa6nkI2YfTeLgZ+GUFaLht4Tox3COuCEw5po8DJWqYcKmmgtjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "testcontainers": "^11.13.0" + } + }, "node_modules/@testcontainers/postgresql": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/@testcontainers/postgresql/-/postgresql-11.12.0.tgz", @@ -7670,9 +7682,9 @@ "license": "MIT" }, "node_modules/docker-compose": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-1.3.1.tgz", - "integrity": "sha512-rF0wH69G3CCcmkN9J1RVMQBaKe8o77LT/3XmqcLIltWWVxcWAzp2TnO7wS3n/umZHN3/EVrlT3exSBMal+Ou1w==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-1.3.2.tgz", + "integrity": "sha512-FO/Jemn08gf9o9E6qtqOPQpyauwf2rQAzfpoUlMyqNpdaVb0ImR/wXKoutLZKp1tks58F8Z8iR7va7H1ne09cw==", "dev": true, "license": "MIT", "dependencies": { @@ -12731,6 +12743,16 @@ "node": ">= 0.8.0" } }, + "node_modules/oracledb": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/oracledb/-/oracledb-6.10.0.tgz", + "integrity": "sha512-kGUumXmrEWbSpBuKJyb9Ip3rXcNgKK6grunI3/cLPzrRvboZ6ZoLi9JQ+z6M/RIG924tY8BLflihL4CKKQAYMA==", + "hasInstallScript": true, + "license": "(Apache-2.0 OR UPL-1.0)", + "engines": { + "node": ">=14.17" + } + }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -16139,9 +16161,9 @@ } }, "node_modules/testcontainers": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-11.12.0.tgz", - "integrity": "sha512-VWtH+UQejVYYvb53ohEZRbx2naxyDvwO9lQ6A0VgmVE2Oh8r9EF09I+BfmrXpd9N9ntpzhao9di2yNwibSz5KA==", + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-11.13.0.tgz", + "integrity": "sha512-fzTvgOtd6U/esOzgmDatJh79OSK0tU6vjDOJ3B6ICrrJf0dqCWtFdpOr6f/g/KixMxKDTDbszmZYjSORJXsVCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16151,21 +16173,21 @@ "async-lock": "^1.4.1", "byline": "^5.0.0", "debug": "^4.4.3", - "docker-compose": "^1.3.1", + "docker-compose": "^1.3.2", "dockerode": "^4.0.9", "get-port": "^7.1.0", "proper-lockfile": "^4.1.2", "properties-reader": "^3.0.1", "ssh-remote-port-forward": "^1.0.4", - "tar-fs": "^3.1.1", + "tar-fs": "^3.1.2", "tmp": "^0.2.5", - "undici": "^7.22.0" + "undici": "^7.24.3" } }, "node_modules/testcontainers/node_modules/undici": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", - "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", + "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 700e15e86..9ea5c35c4 100644 --- a/package.json +++ b/package.json @@ -126,6 +126,7 @@ "nostr-tools": "~2.20.0", "notp": "~2.0.3", "openid-client": "~5.7.1", + "oracledb": "~6.10.0", "password-hash": "~1.2.2", "pg": "~8.11.6", "pg-connection-string": "~2.6.4", @@ -164,6 +165,7 @@ "@testcontainers/mariadb": "^10.28.0", "@testcontainers/mssqlserver": "^10.28.0", "@testcontainers/mysql": "^11.12.0", + "@testcontainers/oraclefree": "^11.13.0", "@testcontainers/postgresql": "^11.12.0", "@testcontainers/rabbitmq": "^10.28.0", "@types/bootstrap": "~5.1.13", diff --git a/server/monitor-types/oracledb.js b/server/monitor-types/oracledb.js new file mode 100644 index 000000000..8b5af9731 --- /dev/null +++ b/server/monitor-types/oracledb.js @@ -0,0 +1,155 @@ +const { MonitorType } = require("./monitor-type"); +const { log, UP } = require("../../src/util"); +const dayjs = require("dayjs"); +const oracledb = require("oracledb"); +const { ConditionVariable } = require("../monitor-conditions/variables"); +const { defaultStringOperators } = require("../monitor-conditions/operators"); +const { ConditionExpressionGroup } = require("../monitor-conditions/expression"); +const { evaluateExpressionGroup } = require("../monitor-conditions/evaluator"); + +class OracleDbMonitorType extends MonitorType { + name = "oracledb"; + + supportsConditions = true; + conditionVariables = [new ConditionVariable("result", defaultStringOperators)]; + + /** + * @inheritdoc + */ + async check(monitor, heartbeat, _server) { + let query = monitor.databaseQuery; + if (!query || (typeof query === "string" && query.trim() === "")) { + query = "SELECT 1 FROM DUAL"; + } + + const conditions = monitor.conditions ? ConditionExpressionGroup.fromMonitor(monitor) : null; + const hasConditions = conditions && conditions.children && conditions.children.length > 0; + + const startTime = dayjs().valueOf(); + try { + if (hasConditions) { + const result = await this.oracledbQuerySingleValue( + monitor.databaseConnectionString, + query, + monitor.basic_auth_user, + monitor.basic_auth_pass + ); + heartbeat.ping = dayjs().valueOf() - startTime; + + const conditionsResult = evaluateExpressionGroup(conditions, { result: String(result) }); + + if (!conditionsResult) { + throw new Error(`Query result did not meet the specified conditions (${result})`); + } + + heartbeat.status = UP; + heartbeat.msg = "Query did meet specified conditions"; + } else { + const result = await this.oracledbQuery( + monitor.databaseConnectionString, + query, + monitor.basic_auth_user, + monitor.basic_auth_pass + ); + heartbeat.ping = dayjs().valueOf() - startTime; + heartbeat.status = UP; + heartbeat.msg = result; + } + } catch (error) { + heartbeat.ping = dayjs().valueOf() - startTime; + if (error.message.includes("did not meet the specified conditions")) { + throw error; + } + throw new Error(`Database connection/query failed: ${error.message}`); + } + } + + /** + * Run a query on Oracle Database. + * @param {string} connectionString The Oracle DB connection string + * @param {string} query The query to execute + * @param {string} username Oracle DB username + * @param {string} password Oracle DB password + * @returns {Promise} Row count or execution message + */ + async oracledbQuery(connectionString, query, username, password) { + let connection; + try { + connection = await oracledb.getConnection({ + connectString: connectionString.trim(), + user: username.trim(), + password: password.trim(), + }); + const result = await connection.execute(query, [], { + outFormat: oracledb.OUT_FORMAT_OBJECT, + }); + + if (Array.isArray(result.rows)) { + return `Rows: ${result.rows.length}`; + } + + if (typeof result.rowsAffected === "number") { + return `Rows affected: ${result.rowsAffected}`; + } + + return "Query executed successfully"; + } catch (error) { + log.debug(this.name, "Error caught in the query execution.", error.message); + throw error; + } finally { + if (connection) { + await connection.close(); + } + } + } + + /** + * Run a query on Oracle Database expecting a single value result. + * @param {string} connectionString The Oracle DB connection string + * @param {string} query The query to execute + * @param {string} username Oracle DB username + * @param {string} password Oracle DB password + * @returns {Promise} Single value from the first column of the first row + */ + async oracledbQuerySingleValue(connectionString, query, username, password) { + let connection; + try { + connection = await oracledb.getConnection({ + connectString: connectionString, + user: username, + password: password, + }); + const result = await connection.execute(query, [], { + outFormat: oracledb.OUT_FORMAT_OBJECT, + }); + + if (!result.rows || result.rows.length === 0) { + throw new Error("Query returned no results"); + } + + if (result.rows.length > 1) { + throw new Error("Multiple values were found, expected only one value"); + } + + const firstRow = result.rows[0]; + const columnNames = Object.keys(firstRow); + + if (columnNames.length > 1) { + throw new Error("Multiple columns were found, expected only one value"); + } + + return firstRow[columnNames[0]]; + } catch (error) { + log.debug(this.name, "Error caught in the query execution.", error.message); + throw error; + } finally { + if (connection) { + await connection.close(); + } + } + } +} + +module.exports = { + OracleDbMonitorType, +}; diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js index 6709065b9..a1ee80485 100644 --- a/server/uptime-kuma-server.js +++ b/server/uptime-kuma-server.js @@ -131,6 +131,7 @@ class UptimeKumaServer { UptimeKumaServer.monitorTypeList["system-service"] = new SystemServiceMonitorType(); UptimeKumaServer.monitorTypeList["sqlserver"] = new MssqlMonitorType(); UptimeKumaServer.monitorTypeList["mysql"] = new MysqlMonitorType(); + UptimeKumaServer.monitorTypeList["oracledb"] = new OracleDbMonitorType(); // Allow all CORS origins (polling) in development let cors = undefined; @@ -582,4 +583,5 @@ const { RedisMonitorType } = require("./monitor-types/redis"); const { SystemServiceMonitorType } = require("./monitor-types/system-service"); const { MssqlMonitorType } = require("./monitor-types/mssql"); const { MysqlMonitorType } = require("./monitor-types/mysql"); +const { OracleDbMonitorType } = require("./monitor-types/oracledb"); const Monitor = require("./model/monitor"); diff --git a/src/lang/en.json b/src/lang/en.json index 0bebb4f52..f75f32db5 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -6,6 +6,7 @@ "setupDatabaseSQLite": "A simple database file, recommended for small-scale deployments. Prior to v2.0.0, Uptime Kuma used SQLite as the default database.", "settingUpDatabaseMSG": "Setting up the database. It may take a while, please be patient.", "dbName": "Database Name", + "oracledbConnectionString": "Oracle Database: {connectionString}", "enableSSL": "Enable SSL/TLS", "mariadbUseSSLHelptext": "Enable to use a encrypted connection to your database. Required for most cloud databases.", "mariadbCaCertificateLabel": "CA Certificate", diff --git a/src/pages/Details.vue b/src/pages/Details.vue index 2a4bb867e..6d02a1839 100644 --- a/src/pages/Details.vue +++ b/src/pages/Details.vue @@ -86,6 +86,13 @@ MQTT: {{ monitor.hostname }}:{{ monitor.port }}/{{ monitor.mqttTopic }} {{ filterPassword(monitor.databaseConnectionString) }} + + {{ + $t("oracledbConnectionString", { + connectionString: filterPassword(monitor.databaseConnectionString), + }) + }} + {{ filterPassword(monitor.databaseConnectionString) }} Push: diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index 3f3cf95f9..ac152a87d 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -98,6 +98,7 @@ + @@ -1161,12 +1162,13 @@

- + + + - + @@ -2880,6 +2910,8 @@ const monitorDefaults = { docker_container: "", docker_host: null, proxyId: null, + basic_auth_user: "", + basic_auth_pass: "", mqttUsername: "", mqttPassword: "", mqttTopic: "", @@ -2944,6 +2976,7 @@ export default { "Server=,;Database=;User Id=;Password=;Encrypt=;TrustServerCertificate=;Connection Timeout=", postgres: "postgres://username:password@host:port/database", mysql: "mysql://username:password@host:port/database", + oracledb: "localhost:1521/FREEPDB1", redis: "redis://user:password@host:port", mongodb: "mongodb://username:password@host:port/database", }, @@ -3842,6 +3875,20 @@ message HealthCheckResponse { this.monitor.url = this.monitor.url.trim(); } + if (this.monitor.databaseConnectionString) { + this.monitor.databaseConnectionString = this.monitor.databaseConnectionString.trim(); + } + + if (this.monitor.type === "oracledb") { + if (this.monitor.basic_auth_user) { + this.monitor.basic_auth_user = this.monitor.basic_auth_user.trim(); + } + + if (this.monitor.basic_auth_pass) { + this.monitor.basic_auth_pass = this.monitor.basic_auth_pass.trim(); + } + } + let createdNewParent = false; if (this.draftGroupName && this.monitor.parent === -1) { diff --git a/test/backend-test/monitors/test-oracledb.js b/test/backend-test/monitors/test-oracledb.js new file mode 100644 index 000000000..6859eec3b --- /dev/null +++ b/test/backend-test/monitors/test-oracledb.js @@ -0,0 +1,232 @@ +const { after, before, describe, test } = require("node:test"); +const assert = require("node:assert"); +const { OracleDbContainer } = require("@testcontainers/oraclefree"); +const { OracleDbMonitorType } = require("../../../server/monitor-types/oracledb"); +const { UP, PENDING } = require("../../../src/util"); + +const ORACLE_IMAGE = "gvenzl/oracle-free:23-slim-faststart"; +const APP_USER = "uptimekuma"; +const APP_USER_PASSWORD = "Oracle123"; + +/** + * Create a monitor payload for Oracle monitor tests. + * @param {object} overrides Partial monitor overrides + * @returns {object} Monitor payload + */ +function createMonitor(overrides = {}) { + return { + basic_auth_user: APP_USER, + basic_auth_pass: APP_USER_PASSWORD, + conditions: "[]", + ...overrides, + }; +} + +/** + * Create a baseline heartbeat object for Oracle monitor tests. + * @returns {{msg: string, status: string}} Heartbeat payload + */ +function createHeartbeat() { + return { + msg: "", + status: PENDING, + }; +} + +/** + * Helper function to create and start an Oracle container. + * @returns {Promise<{container: import("@testcontainers/oraclefree").StartedOracleDbContainer, connectString: string}>} + */ +async function createAndStartOracleContainer() { + const container = await new OracleDbContainer(ORACLE_IMAGE) + .withUsername(APP_USER) + .withPassword(APP_USER_PASSWORD) + .start(); + + return { + container, + connectString: container.getUrl(), + }; +} + +describe( + "Oracle Database Monitor", + { + skip: !!process.env.CI && (process.platform !== "linux" || process.arch !== "x64"), + }, + () => { + /** @type {import("@testcontainers/oraclefree").StartedOracleDbContainer | undefined} */ + let container; + /** @type {string | undefined} */ + let connectString; + + before(async () => { + const oracle = await createAndStartOracleContainer(); + container = oracle.container; + connectString = oracle.connectString; + }); + + after(async () => { + if (container) { + await container.stop(); + } + }); + + test("check() sets status to UP when Oracle server is reachable", async () => { + const oracleMonitor = new OracleDbMonitorType(); + const monitor = createMonitor({ + databaseConnectionString: connectString, + }); + const heartbeat = createHeartbeat(); + + await oracleMonitor.check(monitor, heartbeat, {}); + assert.strictEqual(heartbeat.status, UP, `Expected status ${UP} but got ${heartbeat.status}`); + }); + + test("check() rejects when Oracle server is not reachable", async () => { + const oracleMonitor = new OracleDbMonitorType(); + const monitor = createMonitor({ + databaseConnectionString: "localhost:1/FREEPDB1", + }); + const heartbeat = createHeartbeat(); + + await assert.rejects(oracleMonitor.check(monitor, heartbeat, {}), (err) => { + assert.ok( + err.message.includes("Database connection/query failed"), + `Expected error message to include "Database connection/query failed" but got: ${err.message}` + ); + return true; + }); + assert.notStrictEqual(heartbeat.status, UP, `Expected status should not be ${UP}`); + }); + + test("check() sets status to UP when custom query returns single value", async () => { + const oracleMonitor = new OracleDbMonitorType(); + const monitor = createMonitor({ + databaseConnectionString: connectString, + databaseQuery: "SELECT 42 FROM DUAL", + }); + const heartbeat = createHeartbeat(); + + await oracleMonitor.check(monitor, heartbeat, {}); + assert.strictEqual(heartbeat.status, UP, `Expected status ${UP} but got ${heartbeat.status}`); + }); + + test("check() sets status to UP when custom query result meets condition", async () => { + const oracleMonitor = new OracleDbMonitorType(); + const monitor = createMonitor({ + databaseConnectionString: connectString, + databaseQuery: "SELECT 42 AS value FROM DUAL", + conditions: JSON.stringify([ + { + type: "expression", + andOr: "and", + variable: "result", + operator: "equals", + value: "42", + }, + ]), + }); + const heartbeat = createHeartbeat(); + + await oracleMonitor.check(monitor, heartbeat, {}); + assert.strictEqual(heartbeat.status, UP, `Expected status ${UP} but got ${heartbeat.status}`); + }); + + test("check() rejects when custom query result does not meet condition", async () => { + const oracleMonitor = new OracleDbMonitorType(); + const monitor = createMonitor({ + databaseConnectionString: connectString, + databaseQuery: "SELECT 99 AS value FROM DUAL", + conditions: JSON.stringify([ + { + type: "expression", + andOr: "and", + variable: "result", + operator: "equals", + value: "42", + }, + ]), + }); + const heartbeat = createHeartbeat(); + + await assert.rejects( + oracleMonitor.check(monitor, heartbeat, {}), + new Error("Query result did not meet the specified conditions (99)") + ); + assert.strictEqual(heartbeat.status, PENDING, `Expected status should not be ${heartbeat.status}`); + }); + + test("check() rejects when query returns no results with conditions", async () => { + const oracleMonitor = new OracleDbMonitorType(); + const monitor = createMonitor({ + databaseConnectionString: connectString, + databaseQuery: "SELECT 1 AS value FROM DUAL WHERE 1 = 0", + conditions: JSON.stringify([ + { + type: "expression", + andOr: "and", + variable: "result", + operator: "equals", + value: "1", + }, + ]), + }); + const heartbeat = createHeartbeat(); + + await assert.rejects( + oracleMonitor.check(monitor, heartbeat, {}), + new Error("Database connection/query failed: Query returned no results") + ); + assert.strictEqual(heartbeat.status, PENDING, `Expected status should not be ${heartbeat.status}`); + }); + + test("check() rejects when query returns multiple rows with conditions", async () => { + const oracleMonitor = new OracleDbMonitorType(); + const monitor = createMonitor({ + databaseConnectionString: connectString, + databaseQuery: "SELECT 1 AS value FROM DUAL UNION ALL SELECT 2 AS value FROM DUAL", + conditions: JSON.stringify([ + { + type: "expression", + andOr: "and", + variable: "result", + operator: "equals", + value: "1", + }, + ]), + }); + const heartbeat = createHeartbeat(); + + await assert.rejects( + oracleMonitor.check(monitor, heartbeat, {}), + new Error("Database connection/query failed: Multiple values were found, expected only one value") + ); + assert.strictEqual(heartbeat.status, PENDING, `Expected status should not be ${heartbeat.status}`); + }); + + test("check() rejects when query returns multiple columns with conditions", async () => { + const oracleMonitor = new OracleDbMonitorType(); + const monitor = createMonitor({ + databaseConnectionString: connectString, + databaseQuery: "SELECT 1 AS col1, 2 AS col2 FROM DUAL", + conditions: JSON.stringify([ + { + type: "expression", + andOr: "and", + variable: "result", + operator: "equals", + value: "1", + }, + ]), + }); + const heartbeat = createHeartbeat(); + + await assert.rejects( + oracleMonitor.check(monitor, heartbeat, {}), + new Error("Database connection/query failed: Multiple columns were found, expected only one value") + ); + assert.strictEqual(heartbeat.status, PENDING, `Expected status should not be ${heartbeat.status}`); + }); + } +); From 45868969782cd725144fae1091b5832917f0882a Mon Sep 17 00:00:00 2001 From: Aleksey Kravchenko Date: Wed, 18 Mar 2026 19:33:02 +0300 Subject: [PATCH 20/23] feat: Add MAX messenger notification provider (#7160) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- server/notification-providers/max.js | 47 +++++++++++++++ server/notification.js | 2 + src/components/NotificationDialog.vue | 1 + src/components/notifications/Max.vue | 82 +++++++++++++++++++++++++++ src/components/notifications/index.js | 2 + src/lang/en.json | 7 +++ 6 files changed, 141 insertions(+) create mode 100644 server/notification-providers/max.js create mode 100644 src/components/notifications/Max.vue diff --git a/server/notification-providers/max.js b/server/notification-providers/max.js new file mode 100644 index 000000000..4bf0ed39b --- /dev/null +++ b/server/notification-providers/max.js @@ -0,0 +1,47 @@ +const NotificationProvider = require("./notification-provider"); +const axios = require("axios"); + +class Max extends NotificationProvider { + name = "max"; + + /** + * @inheritdoc + */ + async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + const okMsg = "Sent Successfully."; + const baseUrl = (notification.maxApiUrl || "https://platform-api.max.ru").replace(/\/$/, ""); + const chatId = notification.maxChatID; + + try { + const config = this.getAxiosConfigWithProxy({ + headers: { + Authorization: notification.maxBotToken, + "Content-Type": "application/json", + }, + }); + + const body = { + text: msg, + }; + + if (notification.maxUseTemplate && notification.maxTemplate) { + const rendered = await this.renderTemplate(notification.maxTemplate, msg, monitorJSON, heartbeatJSON); + + body.text = rendered; + + if (notification.maxTemplateFormat && notification.maxTemplateFormat !== "plain") { + body.format = notification.maxTemplateFormat; + } + } + + const url = `${baseUrl}/messages?chat_id=${encodeURIComponent(chatId)}`; + await axios.post(url, body, config); + + return okMsg; + } catch (error) { + this.throwGeneralAxiosError(error); + } + } +} + +module.exports = Max; diff --git a/server/notification.js b/server/notification.js index 3e9085747..6aeba5835 100644 --- a/server/notification.js +++ b/server/notification.js @@ -90,6 +90,7 @@ const { commandExists } = require("./util-server"); const Whatsapp360messenger = require("./notification-providers/360messenger"); const Webpush = require("./notification-providers/Webpush"); const HaloPSA = require("./notification-providers/HaloPSA"); +const Max = require("./notification-providers/max"); class Notification { providerList = {}; @@ -195,6 +196,7 @@ class Notification { new Whatsapp360messenger(), new Webpush(), new HaloPSA(), + new Max(), ]; for (let item of list) { if (!item.name) { diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue index 10aebd544..57bfd5f31 100644 --- a/src/components/NotificationDialog.vue +++ b/src/components/NotificationDialog.vue @@ -215,6 +215,7 @@ export default { bale: "Bale", Bitrix24: "Bitrix24", discord: "Discord", + max: this.$t("maxMessenger"), fluxer: "Fluxer", GoogleChat: "Google Chat (Google Workspace)", gorush: "Gorush", diff --git a/src/components/notifications/Max.vue b/src/components/notifications/Max.vue new file mode 100644 index 000000000..a6abf5ae5 --- /dev/null +++ b/src/components/notifications/Max.vue @@ -0,0 +1,82 @@ + + + diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js index e27ad4d01..433258227 100644 --- a/src/components/notifications/index.js +++ b/src/components/notifications/index.js @@ -87,6 +87,7 @@ import SMSIR from "./SMSIR.vue"; import Webpush from "./Webpush.vue"; import HaloPSA from "./HaloPSA.vue"; import Resend from "./Resend.vue"; +import Max from "./Max.vue"; /** * Manage all notification form. @@ -182,6 +183,7 @@ const NotificationFormList = { SMSPlanet: SMSPlanet, Webpush: Webpush, HaloPSA: HaloPSA, + max: Max, }; export default NotificationFormList; diff --git a/src/lang/en.json b/src/lang/en.json index f75f32db5..6235dbf30 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -487,6 +487,8 @@ "Packet Size": "Packet Size", "Bot Token": "Bot Token", "wayToGetTelegramToken": "You can get a token from {0}.", + "wayToGetMaxToken": "You can get a MAX bot token and other details from {0}.", + "maxMessenger": "MAX messenger", "Chat ID": "Chat ID", "telegramMessageThreadID": "(Optional) Message Thread ID", "telegramMessageThreadIDDescription": "Optional Unique identifier for the target message thread (topic) of the forum; for forum supergroups only", @@ -501,6 +503,11 @@ "telegramTemplateFormatDescription": "Telegram allows using different markup languages for messages, see Telegram {0} for specifc details.", "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID", "wayToGetTelegramChatID": "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:", + "maxApiUrlDescription": "Base API URL for MAX messenger. Default: https://platform-api.max.ru", + "wayToGetMaxChatID": "Specify the chat identifier in MAX where messages should be delivered.", + "maxUseTemplate": "Use custom message template", + "maxUseTemplateDescription": "If enabled, the message will be sent using a custom template.", + "maxTemplateFormatDescription": "MAX messenger supports plain text, Markdown and HTML formatting.", "telegramServerUrl": "(Optional) Server Url", "telegramServerUrlDescription": "To lift Telegram's bot api limitations or gain access in blocked areas (China, Iran, etc). For more information click {0}. Default: {1}", "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE", From cdfca84664841c91f58619bee2b46dc57c8a8860 Mon Sep 17 00:00:00 2001 From: Marco Carvalho Date: Wed, 18 Mar 2026 14:41:57 -0300 Subject: [PATCH 21/23] feat: add collapsible groups to status page (#7154) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- src/components/PublicGroupList.vue | 259 +++++++++++++++++++---------- 1 file changed, 168 insertions(+), 91 deletions(-) diff --git a/src/components/PublicGroupList.vue b/src/components/PublicGroupList.vue index d9c13aa24..7512190e0 100644 --- a/src/components/PublicGroupList.vue +++ b/src/components/PublicGroupList.vue @@ -17,11 +17,20 @@ class="action remove me-3" @click="removeGroup(group.index)" /> + + +
@@ -33,97 +42,101 @@ /> -
-
- {{ $t("No Monitors") }} -
+ +
+
+ {{ $t("No Monitors") }} +
- - - - + +
+
@@ -183,6 +196,59 @@ export default { // Sorting is now handled by GroupSortDropdown component }, methods: { + /** + * Toggle collapsed state for a group + * @param {object} group Group to toggle + * @returns {void} + */ + toggleGroup(group) { + if (!this.$router) { + return; + } + + const groupId = this.getGroupIdentifier(group); + const collapsed = this.getCollapsedList(); + const index = collapsed.indexOf(groupId); + + if (index >= 0) { + collapsed.splice(index, 1); + } else { + collapsed.push(groupId); + } + + const query = { ...this.$route.query }; + if (collapsed.length > 0) { + query.collapse = collapsed; + } else { + delete query.collapse; + } + + this.$router.push({ query }).catch(() => {}); + }, + + /** + * Check if a group is collapsed + * @param {object} group Group to check + * @returns {boolean} Whether the group is collapsed + */ + isGroupCollapsed(group) { + return this.getCollapsedList().includes(this.getGroupIdentifier(group)); + }, + + /** + * Get list of collapsed group identifiers from the query param. + * Vue Router normalises repeated params (?collapse=1&collapse=2) into an array. + * @returns {string[]} Collapsed group identifiers + */ + getCollapsedList() { + const raw = this.$route.query.collapse; + if (!raw) { + return []; + } + // Normalise to array: a single query param is a string, repeated params are already an array + return [].concat(raw); + }, + /** * Remove the specified group * @param {number} index Index of group to remove @@ -278,14 +344,10 @@ export default { * @returns {string} group identifier */ getGroupIdentifier(group) { - // Use the name directly if available - if (group.name) { - // Only remove spaces and use encodeURIComponent for URL safety - const cleanName = group.name.replace(/\s+/g, ""); - return cleanName; + if (group.id !== undefined && group.id !== null) { + return group.id.toString(); } - // Fallback to ID or index - return group.id ? `group${group.id}` : `group${this.$root.publicGroupList.indexOf(group)}`; + return `group${this.$root.publicGroupList.indexOf(group)}`; }, }, }; @@ -363,6 +425,21 @@ export default { } } +.collapse-toggle { + cursor: pointer; + padding: 2px; +} + +.chevron { + font-size: 0.8em; + color: #bbb; + transition: all 0.2s $easing-in; + + &.collapsed { + transform: rotate(-90deg); + } +} + .mobile { .item { padding: 13px 0 10px; From 4a6161c5790d79d99fd259dc3ef50d6b37096df0 Mon Sep 17 00:00:00 2001 From: FunNikita <49103946+FunNikita@users.noreply.github.com> Date: Sun, 22 Mar 2026 00:07:45 +0400 Subject: [PATCH 22/23] feat: Add VK notification provider (#7182) --- server/notification-providers/vk.js | 44 +++++++++++++++++++++ server/notification.js | 2 + src/components/NotificationDialog.vue | 1 + src/components/notifications/VK.vue | 57 +++++++++++++++++++++++++++ src/components/notifications/index.js | 2 + src/lang/en.json | 6 +++ 6 files changed, 112 insertions(+) create mode 100644 server/notification-providers/vk.js create mode 100644 src/components/notifications/VK.vue diff --git a/server/notification-providers/vk.js b/server/notification-providers/vk.js new file mode 100644 index 000000000..9912fa9a9 --- /dev/null +++ b/server/notification-providers/vk.js @@ -0,0 +1,44 @@ +const NotificationProvider = require("./notification-provider"); +const axios = require("axios"); + +class VK extends NotificationProvider { + name = "VK"; + + /** + * @inheritdoc + */ + async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + const okMsg = "Sent Successfully."; + const url = "https://api.vk.ru/method/messages.send"; + + try { + const data = new URLSearchParams({ + access_token: notification.vkAccessToken, + v: notification.vkApiVersion, + peer_id: notification.vkPeerId, + message: msg, + dont_parse_links: notification.vkDontParseLinks ? "1" : "0", + random_id: String(Math.floor(Math.random() * 2147483647)), + }); + + const config = this.getAxiosConfigWithProxy({}); + const response = await axios.post(url, data, config); + + if (response.data?.error) { + throw new Error( + `VK API returned error ${response.data.error.error_code}: ${response.data.error.error_msg}` + ); + } + + if (typeof response.data?.response === "undefined") { + throw new Error("Invalid VK API response"); + } + + return okMsg; + } catch (error) { + this.throwGeneralAxiosError(error); + } + } +} + +module.exports = VK; diff --git a/server/notification.js b/server/notification.js index 6aeba5835..f790db432 100644 --- a/server/notification.js +++ b/server/notification.js @@ -91,6 +91,7 @@ const Whatsapp360messenger = require("./notification-providers/360messenger"); const Webpush = require("./notification-providers/Webpush"); const HaloPSA = require("./notification-providers/HaloPSA"); const Max = require("./notification-providers/max"); +const VK = require("./notification-providers/vk"); class Notification { providerList = {}; @@ -197,6 +198,7 @@ class Notification { new Webpush(), new HaloPSA(), new Max(), + new VK(), ]; for (let item of list) { if (!item.name) { diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue index 57bfd5f31..e9370b37e 100644 --- a/src/components/NotificationDialog.vue +++ b/src/components/NotificationDialog.vue @@ -334,6 +334,7 @@ export default { WPush: "WPush(wpush.cn)", YZJ: "YZJ (云之家自定义机器人)", SMSPlanet: "SMSPlanet.pl", + VK: "VK", }; // Sort by notification name alphabetically diff --git a/src/components/notifications/VK.vue b/src/components/notifications/VK.vue new file mode 100644 index 000000000..507d7465e --- /dev/null +++ b/src/components/notifications/VK.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js index 433258227..abb5a7636 100644 --- a/src/components/notifications/index.js +++ b/src/components/notifications/index.js @@ -88,6 +88,7 @@ import Webpush from "./Webpush.vue"; import HaloPSA from "./HaloPSA.vue"; import Resend from "./Resend.vue"; import Max from "./Max.vue"; +import VK from "./VK.vue"; /** * Manage all notification form. @@ -184,6 +185,7 @@ const NotificationFormList = { Webpush: Webpush, HaloPSA: HaloPSA, max: Max, + VK: VK, }; export default NotificationFormList; diff --git a/src/lang/en.json b/src/lang/en.json index 6235dbf30..378472d5f 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -660,6 +660,7 @@ "Number": "Number", "Recipients": "Recipients", "Access Token": "Access Token", + "API Version": "API Version", "Channel access token": "Channel access token", "Channel access token (Long-lived)": "Channel access token (Long-lived)", "Line Developers Console": "Line Developers Console", @@ -718,6 +719,11 @@ "noMonitorsOrStatusPagesSelectedError": "Cannot create maintenance without affected monitors or status pages", "passwordNotMatchMsg": "The repeat password does not match.", "notificationDescription": "Notifications must be assigned to a monitor to function.", + "Peer ID": "Peer ID", + "vkApiVersionDescription": "VK API version used for requests. Leave the default unless you specifically need another VK API version for compatibility.", + "vkDontParseLinks": "Disable link snippets", + "vkDontParseLinksDescription": "If enabled, VK will not generate link previews/snippets.", + "vkPeerIdDescription": "Enter the target VK peer_id. This value is sent to the API as-is.", "keywordDescription": "Search keyword in plain HTML or JSON response. The search is case-sensitive.", "invertKeywordDescription": "Look for the keyword to be absent rather than present.", "jsonQueryDescription": "Parse and extract specific data from the server's JSON response using JSON query or use \"$\" for the raw response, if not expecting JSON. The result is then compared to the expected value, as strings. See {0} for documentation and use {1} to experiment with queries.", From a53158af98dbdd11850ba34dc0066af1c5a259ba Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Wed, 25 Mar 2026 02:10:28 +0800 Subject: [PATCH 23/23] fix: Revert "add sorting to status pages" (#7194) --- src/components/GroupSortDropdown.vue | 493 --------------------------- src/components/PublicGroupList.vue | 83 ++--- src/icon.js | 4 - 3 files changed, 19 insertions(+), 561 deletions(-) delete mode 100644 src/components/GroupSortDropdown.vue diff --git a/src/components/GroupSortDropdown.vue b/src/components/GroupSortDropdown.vue deleted file mode 100644 index 87de8dcda..000000000 --- a/src/components/GroupSortDropdown.vue +++ /dev/null @@ -1,493 +0,0 @@ - - - - - diff --git a/src/components/PublicGroupList.vue b/src/components/PublicGroupList.vue index 7512190e0..6701217e3 100644 --- a/src/components/PublicGroupList.vue +++ b/src/components/PublicGroupList.vue @@ -5,40 +5,27 @@

-
+ + + - - - - - -
- - +

@@ -150,7 +137,6 @@ import HeartbeatBar from "./HeartbeatBar.vue"; import Uptime from "./Uptime.vue"; import Tag from "./Tag.vue"; import Status from "./Status.vue"; -import GroupSortDropdown from "./GroupSortDropdown.vue"; export default { components: { @@ -160,7 +146,6 @@ export default { Uptime, Tag, Status, - GroupSortDropdown, }, props: { /** Are we in edit mode? */ @@ -189,12 +174,6 @@ export default { return this.$root.publicGroupList.length >= 2; }, }, - watch: { - // No watchers needed - sorting is handled by GroupSortDropdown component - }, - created() { - // Sorting is now handled by GroupSortDropdown component - }, methods: { /** * Toggle collapsed state for a group @@ -328,16 +307,6 @@ export default { return "#DC2626"; }, - /** - * Update group properties - * @param {number} groupIndex Index of group to update - * @param {object} updates Object with properties to update - * @returns {void} - */ - updateGroup(groupIndex, updates) { - Object.assign(this.$root.publicGroupList[groupIndex], updates); - }, - /** * Get unique identifier for a group * @param {object} group object @@ -410,15 +379,6 @@ export default { } .group-title { - display: flex; - justify-content: space-between; - align-items: center; - - .title-section { - display: flex; - align-items: center; - } - span { display: inline-block; min-width: 15px; @@ -444,11 +404,6 @@ export default { .item { padding: 13px 0 10px; } - - .group-title { - flex-direction: column; - align-items: flex-start; - } } .bg-maintenance { diff --git a/src/icon.js b/src/icon.js index f2ce479e7..eeb953f80 100644 --- a/src/icon.js +++ b/src/icon.js @@ -8,8 +8,6 @@ import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; // 2) add the icon name to the library.add() statement below. import { faArrowAltCircleUp, - faArrowDown, - faArrowUp, faCog, faEdit, faExclamationTriangle, @@ -59,8 +57,6 @@ import { library.add( faArrowAltCircleUp, - faArrowDown, - faArrowUp, faCog, faEdit, faExclamationTriangle,