From bb94ce75c118dae180beb02705d26dc6639ab5c1 Mon Sep 17 00:00:00 2001 From: Louis Tran's Date: Wed, 19 Nov 2025 11:27:42 +0700 Subject: [PATCH 01/55] Update IntlProvider.tsx Correct Vietnam flag --- frontend/src/locale/IntlProvider.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/locale/IntlProvider.tsx b/frontend/src/locale/IntlProvider.tsx index 42b98b65..209da8d7 100755 --- a/frontend/src/locale/IntlProvider.tsx +++ b/frontend/src/locale/IntlProvider.tsx @@ -47,6 +47,7 @@ const getFlagCodeForLocale = (locale?: string) => { const specialCases: Record = { ja: "jp", // Japan zh: "cn", // China + vi: "vn, // Vietnam }; if (specialCases[thisLocale]) { From e3cdc8bb300a172fbebe4f83ccf8f73e2b140037 Mon Sep 17 00:00:00 2001 From: Louis Tran's Date: Wed, 19 Nov 2025 11:37:20 +0700 Subject: [PATCH 02/55] Update IntlProvider.tsx --- frontend/src/locale/IntlProvider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/IntlProvider.tsx b/frontend/src/locale/IntlProvider.tsx index 209da8d7..5482f63c 100755 --- a/frontend/src/locale/IntlProvider.tsx +++ b/frontend/src/locale/IntlProvider.tsx @@ -47,7 +47,7 @@ const getFlagCodeForLocale = (locale?: string) => { const specialCases: Record = { ja: "jp", // Japan zh: "cn", // China - vi: "vn, // Vietnam + vi: "vn", // Vietnam }; if (specialCases[thisLocale]) { From fec9bffe2900826d408fa5b1e455c63e9e07fd7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 19 Nov 2025 09:13:55 +0100 Subject: [PATCH 03/55] fixes1 --- frontend/src/locale/src/pl.json | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/frontend/src/locale/src/pl.json b/frontend/src/locale/src/pl.json index 9853c7bc..e4004787 100644 --- a/frontend/src/locale/src/pl.json +++ b/frontend/src/locale/src/pl.json @@ -38,6 +38,12 @@ "action.add-location": { "defaultMessage": "Dodaj lokalizację" }, + "action.allow": { + "defaultMessage": "Zezwól" + }, + "action.deny": { + "defaultMessage": "Odrzuć" + }, "action.close": { "defaultMessage": "Zamknij" }, @@ -66,16 +72,16 @@ "defaultMessage": "Pokaż szczegóły" }, "auditlogs": { - "defaultMessage": "Logi audytu" + "defaultMessage": "Logi" }, "cancel": { "defaultMessage": "Anuluj" }, "certificate": { - "defaultMessage": "Certyfikat" + "defaultMessage": "certyfikat" }, "certificate.custom-certificate": { - "defaultMessage": "Certyfikat" + "defaultMessage": "certyfikat" }, "certificate.custom-certificate-key": { "defaultMessage": "Klucz certyfikatu" @@ -105,7 +111,7 @@ "defaultMessage": "Certyfikaty" }, "certificates.custom": { - "defaultMessage": "Certyfikat własny" + "defaultMessage": "Własny certyfikat" }, "certificates.custom.warning": { "defaultMessage": "Pliki kluczy chronione hasłem nie są obsługiwane." @@ -159,7 +165,7 @@ "defaultMessage": "z Let's Encrypt" }, "certificates.request.title": { - "defaultMessage": "Zamów nowy certyfikat" + "defaultMessage": "Wygeneruj nowy certyfikat" }, "column.access": { "defaultMessage": "Dostęp" @@ -237,7 +243,7 @@ "defaultMessage": "Panel" }, "dead-host": { - "defaultMessage": "Host 404" + "defaultMessage": "host 404" }, "dead-hosts": { "defaultMessage": "Hosty 404" @@ -489,13 +495,13 @@ "defaultMessage": "Tylko utworzone elementy" }, "proxy-host": { - "defaultMessage": "Host proxy" + "defaultMessage": "proxy host" }, "proxy-host.forward-host": { "defaultMessage": "Przekieruj na hostname / IP" }, "proxy-hosts": { - "defaultMessage": "Hosty proxy" + "defaultMessage": "Proxy" }, "proxy-hosts.count": { "defaultMessage": "{count} {count, plural, one {Host proxy} few {Hosty proxy} other {Hostów proxy}}" @@ -504,7 +510,7 @@ "defaultMessage": "Publiczne" }, "redirection-host": { - "defaultMessage": "Host przekierowania" + "defaultMessage": "Przekierowanie" }, "redirection-host.forward-domain": { "defaultMessage": "Domena docelowa" @@ -513,10 +519,10 @@ "defaultMessage": "Kod HTTP" }, "redirection-hosts": { - "defaultMessage": "Hosty przekierowań" + "defaultMessage": "Przekierowania" }, "redirection-hosts.count": { - "defaultMessage": "{count} {count, plural, one {Host przekierowania} few {Hosty przekierowań} other {Hostów przekierowań}}" + "defaultMessage": "{count} {count, plural, one {przekierowanie} few {przekierowań} other {przekierowań}}" }, "role.admin": { "defaultMessage": "Administrator" @@ -594,7 +600,7 @@ "defaultMessage": "Test" }, "user": { - "defaultMessage": "Użytkownik" + "defaultMessage": "użytkownik" }, "user.change-password": { "defaultMessage": "Zmień hasło" From 5c114e9db7ada637d568009c69b39566cfac71e4 Mon Sep 17 00:00:00 2001 From: angioletto Date: Wed, 19 Nov 2025 09:56:05 +0100 Subject: [PATCH 04/55] Update Italian locale message for empty objects Wrong translation of line 431 --- frontend/src/locale/src/it.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/it.json b/frontend/src/locale/src/it.json index 3301218f..a3455818 100644 --- a/frontend/src/locale/src/it.json +++ b/frontend/src/locale/src/it.json @@ -429,7 +429,7 @@ "defaultMessage": "Modifica {object}" }, "object.empty": { - "defaultMessage": "Nessun {objects} presente" + "defaultMessage": "Non ci sono {objects} presenti" }, "object.event.created": { "defaultMessage": "{object} creato" From 91a1f39c02f715e4e2171f81fab10cd1deba15f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 19 Nov 2025 10:53:55 +0100 Subject: [PATCH 05/55] fixes1 --- frontend/src/locale/src/pl.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/src/locale/src/pl.json b/frontend/src/locale/src/pl.json index e4004787..3023713f 100644 --- a/frontend/src/locale/src/pl.json +++ b/frontend/src/locale/src/pl.json @@ -81,7 +81,7 @@ "defaultMessage": "certyfikat" }, "certificate.custom-certificate": { - "defaultMessage": "certyfikat" + "defaultMessage": "Certyfikat" }, "certificate.custom-certificate-key": { "defaultMessage": "Klucz certyfikatu" @@ -111,7 +111,7 @@ "defaultMessage": "Certyfikaty" }, "certificates.custom": { - "defaultMessage": "Własny certyfikat" + "defaultMessage": "własny certyfikat" }, "certificates.custom.warning": { "defaultMessage": "Pliki kluczy chronione hasłem nie są obsługiwane." @@ -177,7 +177,7 @@ "defaultMessage": "Autoryzacje" }, "column.custom-locations": { - "defaultMessage": "Własne lokalizacje" + "defaultMessage": "Własne ustawienia lokalizacji" }, "column.destination": { "defaultMessage": "Cel" @@ -246,10 +246,10 @@ "defaultMessage": "host 404" }, "dead-hosts": { - "defaultMessage": "Hosty 404" + "defaultMessage": "404" }, "dead-hosts.count": { - "defaultMessage": "{count} {count, plural, one {Host 404} few {Hosty 404} other {Hostów 404}}" + "defaultMessage": "{count} {count, plural, one {host 404} few {hosty 404} other {hostów 404}}" }, "disabled": { "defaultMessage": "Wyłączone" @@ -342,7 +342,7 @@ "defaultMessage": "Blokuj typowe exploity" }, "host.flags.cache-assets": { - "defaultMessage": "Buforuj zasoby" + "defaultMessage": "Buforuj(cache) zasoby statyczne" }, "host.flags.preserve-path": { "defaultMessage": "Zachowaj ścieżkę" @@ -576,7 +576,7 @@ "defaultMessage": "Certyfikat SSL" }, "stream": { - "defaultMessage": "Strumień" + "defaultMessage": "strumień" }, "stream.forward-host": { "defaultMessage": "Host docelowy" @@ -588,7 +588,7 @@ "defaultMessage": "Strumienie" }, "streams.count": { - "defaultMessage": "{count} {count, plural, one {Strumień} few {Strumienie} other {Strumieni}}" + "defaultMessage": "{count} {count, plural, one {strumień} few {strumienie} other {strumieni}}" }, "streams.tcp": { "defaultMessage": "TCP" @@ -615,7 +615,7 @@ "defaultMessage": "Edytuj profil" }, "user.full-name": { - "defaultMessage": "Pełne imię i nazwisko" + "defaultMessage": "Imię/nazwisko" }, "user.login-as": { "defaultMessage": "Zaloguj jako {name}" From 86b7394620b9dadc03499a41d2891ed059ebf027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 19 Nov 2025 11:01:25 +0100 Subject: [PATCH 06/55] fixes1 --- frontend/src/locale/src/pl.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/locale/src/pl.json b/frontend/src/locale/src/pl.json index 3023713f..a5741a4e 100644 --- a/frontend/src/locale/src/pl.json +++ b/frontend/src/locale/src/pl.json @@ -1,6 +1,6 @@ { "access-list": { - "defaultMessage": "Lista dostępu" + "defaultMessage": "wpis listy dostępu" }, "access-list.access-count": { "defaultMessage": "{count} {count, plural, one {Reguła} few {Reguły} other {Reguł}}" @@ -111,7 +111,7 @@ "defaultMessage": "Certyfikaty" }, "certificates.custom": { - "defaultMessage": "własny certyfikat" + "defaultMessage": "Własny certyfikat" }, "certificates.custom.warning": { "defaultMessage": "Pliki kluczy chronione hasłem nie są obsługiwane." @@ -504,13 +504,13 @@ "defaultMessage": "Proxy" }, "proxy-hosts.count": { - "defaultMessage": "{count} {count, plural, one {Host proxy} few {Hosty proxy} other {Hostów proxy}}" + "defaultMessage": "{count} {count, plural, one {host proxy} few {hosty proxy} other {hostów proxy}}" }, "public": { "defaultMessage": "Publiczne" }, "redirection-host": { - "defaultMessage": "Przekierowanie" + "defaultMessage": "adres przekierowania" }, "redirection-host.forward-domain": { "defaultMessage": "Domena docelowa" @@ -606,7 +606,7 @@ "defaultMessage": "Zmień hasło" }, "user.confirm-password": { - "defaultMessage": "Potwierdź hasło" + "defaultMessage": "Potwierdź nowe hasło" }, "user.current-password": { "defaultMessage": "Aktualne hasło" From 20e2d5ffb30381d09e350c0b3c29c2dcba00da19 Mon Sep 17 00:00:00 2001 From: 7heMech <83923848+7heMech@users.noreply.github.com> Date: Wed, 19 Nov 2025 13:00:06 +0200 Subject: [PATCH 07/55] Increase max propagation seconds to 7200 --- frontend/src/components/Form/DNSProviderFields.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/Form/DNSProviderFields.tsx b/frontend/src/components/Form/DNSProviderFields.tsx index ac0c81eb..18265481 100644 --- a/frontend/src/components/Form/DNSProviderFields.tsx +++ b/frontend/src/components/Form/DNSProviderFields.tsx @@ -116,7 +116,7 @@ export function DNSProviderFields({ showBoundaryBox = false }: Props) { type="number" className="form-control" min={0} - max={600} + max={7200} {...field} /> From b55f51bd637e9ae41d2633eb159e2bb4bc43383f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 19 Nov 2025 15:10:56 +0100 Subject: [PATCH 08/55] fixes1 in pl --- frontend/src/locale/src/pl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/pl.json b/frontend/src/locale/src/pl.json index a5741a4e..907e143d 100644 --- a/frontend/src/locale/src/pl.json +++ b/frontend/src/locale/src/pl.json @@ -495,7 +495,7 @@ "defaultMessage": "Tylko utworzone elementy" }, "proxy-host": { - "defaultMessage": "proxy host" + "defaultMessage": "host proxy" }, "proxy-host.forward-host": { "defaultMessage": "Przekieruj na hostname / IP" From 56875bba5244103a6b392688cbf43611d089a583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 19 Nov 2025 21:23:23 +0100 Subject: [PATCH 09/55] pretty :) --- frontend/src/locale/src/pl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/pl.json b/frontend/src/locale/src/pl.json index 907e143d..2533ebcc 100644 --- a/frontend/src/locale/src/pl.json +++ b/frontend/src/locale/src/pl.json @@ -615,7 +615,7 @@ "defaultMessage": "Edytuj profil" }, "user.full-name": { - "defaultMessage": "Imię/nazwisko" + "defaultMessage": "Imię / Nazwisko" }, "user.login-as": { "defaultMessage": "Zaloguj jako {name}" From 03b0513a24c02f445d2a852854c56cd2e63f4bda Mon Sep 17 00:00:00 2001 From: abinas <144870133+abinas-hdb@users.noreply.github.com> Date: Sat, 22 Nov 2025 00:12:33 +0900 Subject: [PATCH 10/55] Add Korean translation --- frontend/src/locale/src/ko.json | 683 +++++++++++++++++++++++++ frontend/src/locale/src/lang-list.json | 3 + 2 files changed, 686 insertions(+) create mode 100644 frontend/src/locale/src/ko.json diff --git a/frontend/src/locale/src/ko.json b/frontend/src/locale/src/ko.json new file mode 100644 index 00000000..f9d82d85 --- /dev/null +++ b/frontend/src/locale/src/ko.json @@ -0,0 +1,683 @@ +{ + "access-list": { + "defaultMessage": "접근 정책" + }, + "access-list.access-count": { + "defaultMessage": "{count}개의 정책" + }, + "access-list.auth-count": { + "defaultMessage": "{count}명의 사용자" + }, + "access-list.help-rules-last": { + "defaultMessage": "규칙이 하나라도 있으면 아래 ‘전체 거부’ 규칙이 마지막에 추가됩니다." + }, + "access-list.help.rules-order": { + "defaultMessage": "허용/거부 규칙은 정의된 순서대로 적용됩니다." + }, + "access-list.pass-auth": { + "defaultMessage": "인증 정보를 원본 서버로 전달" + }, + "access-list.public": { + "defaultMessage": "누구나 접근 가능" + }, + "access-list.public.subtitle": { + "defaultMessage": "기본 인증 필요 없음" + }, + "access-list.rule-source.placeholder": { + "defaultMessage": "192.168.1.100 / 192.168.1.0/24 / IPv6" + }, + "access-list.satisfy-any": { + "defaultMessage": "조건 중 하나라도 충족" + }, + "access-list.subtitle": { + "defaultMessage": "{users}명 {users, plural, one {사용자} other {사용자}}, {rules}개 {rules, plural, one {규칙} other {규칙}} - 생성일: {date}" + }, + "access-lists": { + "defaultMessage": "접근 정책" + }, + "action.add": { + "defaultMessage": "추가" + }, + "action.add-location": { + "defaultMessage": "경로 추가" + }, + "action.allow": { + "defaultMessage": "허용" + }, + "action.close": { + "defaultMessage": "닫기" + }, + "action.delete": { + "defaultMessage": "삭제" + }, + "action.deny": { + "defaultMessage": "거부" + }, + "action.disable": { + "defaultMessage": "비활성화" + }, + "action.download": { + "defaultMessage": "다운로드" + }, + "action.edit": { + "defaultMessage": "편집" + }, + "action.enable": { + "defaultMessage": "활성화" + }, + "action.permissions": { + "defaultMessage": "권한" + }, + "action.renew": { + "defaultMessage": "갱신" + }, + "action.view-details": { + "defaultMessage": "자세히 보기" + }, + "auditlogs": { + "defaultMessage": "감사 로그" + }, + "auto": { + "defaultMessage": "자동" + }, + "cancel": { + "defaultMessage": "취소" + }, + "certificate": { + "defaultMessage": "인증서" + }, + "certificate.custom-certificate": { + "defaultMessage": "인증서" + }, + "certificate.custom-certificate-key": { + "defaultMessage": "인증서 키" + }, + "certificate.custom-intermediate": { + "defaultMessage": "중간 인증서" + }, + "certificate.in-use": { + "defaultMessage": "사용 중" + }, + "certificate.none.subtitle": { + "defaultMessage": "지정된 인증서 없음" + }, + "certificate.none.subtitle.for-http": { + "defaultMessage": "이 호스트는 HTTPS를 사용하지 않습니다." + }, + "certificate.none.title": { + "defaultMessage": "없음" + }, + "certificate.not-in-use": { + "defaultMessage": "사용 안 함" + }, + "certificate.renew": { + "defaultMessage": "인증서 갱신" + }, + "certificates": { + "defaultMessage": "인증서" + }, + "certificates.custom": { + "defaultMessage": "사용자 지정 인증서" + }, + "certificates.custom.warning": { + "defaultMessage": "비밀번호로 보호된 키 파일은 지원되지 않습니다." + }, + "certificates.dns.credentials": { + "defaultMessage": "DNS 자격 증명 입력" + }, + "certificates.dns.credentials-note": { + "defaultMessage": "이 플러그인은 API 토큰 등이 포함된 설정 파일이 필요합니다." + }, + "certificates.dns.credentials-warning": { + "defaultMessage": "입력한 정보는 데이터베이스와 파일에 평문으로 저장됩니다." + }, + "certificates.dns.propagation-seconds": { + "defaultMessage": "DNS 전파 시간" + }, + "certificates.dns.propagation-seconds-note": { + "defaultMessage": "비워두면 기본값을 사용합니다. DNS 전파를 기다리는 시간(초)입니다." + }, + "certificates.dns.provider": { + "defaultMessage": "DNS 공급자" + }, + "certificates.dns.provider.placeholder": { + "defaultMessage": "공급자를 선택하세요..." + }, + "certificates.dns.warning": { + "defaultMessage": "이 기능을 사용하려면 Certbot과 DNS 플러그인에 대한 기본적인 이해가 필요합니다. 자세한 내용은 관련 문서를 참고해 주세요." + }, + "certificates.http.reachability-404": { + "defaultMessage": "해당 도메인에서 서버가 탐지되었지만 Nginx Proxy Manager가 아닌 것으로 보입니다. 도메인이 NPM이 실행 중인 IP를 가리키는지 확인하세요." + }, + "certificates.http.reachability-failed-to-check": { + "defaultMessage": "site24x7.com과의 통신 오류로 인해 도달 가능 여부를 확인할 수 없습니다." + }, + "certificates.http.reachability-not-resolved": { + "defaultMessage": "해당 도메인에 접근 가능한 서버가 없습니다. 도메인이 존재하며 NPM이 실행되는 IP를 가리키고, 필요하면 라우터에서 80포트가 포워딩되어 있는지 확인하세요." + }, + "certificates.http.reachability-ok": { + "defaultMessage": "서버에 정상적으로 접근할 수 있으며 인증서 발급이 가능합니다." + }, + "certificates.http.reachability-other": { + "defaultMessage": "해당 도메인에서 서버가 발견되었지만 예상치 못한 상태 코드 {code}를 반환했습니다. NPM 서버가 맞는지 확인하세요." + }, + "certificates.http.reachability-wrong-data": { + "defaultMessage": "서버가 응답했지만 예상치 못한 데이터를 반환했습니다. NPM 서버가 맞는지 확인하세요." + }, + "certificates.http.test-results": { + "defaultMessage": "테스트 결과" + }, + "certificates.http.warning": { + "defaultMessage": "도메인이 이 서버를 가리키도록 설정되어 있어야 합니다." + }, + "certificates.request.subtitle": { + "defaultMessage": "Let's Encrypt 사용" + }, + "certificates.request.title": { + "defaultMessage": "새 인증서 요청" + }, + "column.access": { + "defaultMessage": "접근 정책" + }, + "column.authorization": { + "defaultMessage": "인증 사용자" + }, + "column.authorizations": { + "defaultMessage": "인증 사용자" + }, + "column.custom-locations": { + "defaultMessage": "사용자 지정 경로" + }, + "column.destination": { + "defaultMessage": "전달 대상" + }, + "column.details": { + "defaultMessage": "기본 설정" + }, + "column.email": { + "defaultMessage": "이메일" + }, + "column.event": { + "defaultMessage": "이벤트" + }, + "column.expires": { + "defaultMessage": "만료일" + }, + "column.http-code": { + "defaultMessage": "HTTP 코드" + }, + "column.incoming-port": { + "defaultMessage": "수신 포트" + }, + "column.name": { + "defaultMessage": "이름" + }, + "column.protocol": { + "defaultMessage": "프로토콜" + }, + "column.provider": { + "defaultMessage": "공급자" + }, + "column.roles": { + "defaultMessage": "권한" + }, + "column.rules": { + "defaultMessage": "IP 정책" + }, + "column.satisfy": { + "defaultMessage": "조건 방식" + }, + "column.satisfy-all": { + "defaultMessage": "모두 충족" + }, + "column.satisfy-any": { + "defaultMessage": "하나라도 충족" + }, + "column.scheme": { + "defaultMessage": "프로토콜" + }, + "column.source": { + "defaultMessage": "도메인" + }, + "column.ssl": { + "defaultMessage": "SSL" + }, + "column.status": { + "defaultMessage": "상태" + }, + "created-on": { + "defaultMessage": "생성일: {date}" + }, + "dashboard": { + "defaultMessage": "대시보드" + }, + "dead-host": { + "defaultMessage": "404 호스트" + }, + "dead-hosts": { + "defaultMessage": "404 호스트" + }, + "dead-hosts.count": { + "defaultMessage": "{count}개의 404 호스트" + }, + "disabled": { + "defaultMessage": "비활성화" + }, + "domain-names": { + "defaultMessage": "도메인 이름" + }, + "domain-names.max": { + "defaultMessage": "최대 {count}개의 도메인 이름" + }, + "domain-names.placeholder": { + "defaultMessage": "도메인을 입력해주세요." + }, + "domain-names.wildcards-not-permitted": { + "defaultMessage": "HTTP 방식으로는 와일드카드 인증서를 발급할 수 없습니다." + }, + "domain-names.wildcards-not-supported": { + "defaultMessage": "이 인증 기관(CA)은 와일드카드를 지원하지 않습니다." + }, + "domains.force-ssl": { + "defaultMessage": "SSL 강제 적용" + }, + "domains.hsts-enabled": { + "defaultMessage": "HSTS 활성화" + }, + "domains.hsts-subdomains": { + "defaultMessage": "HSTS 서브도메인 포함" + }, + "domains.http2-support": { + "defaultMessage": "HTTP/2 지원" + }, + "domains.use-dns": { + "defaultMessage": "DNS 챌린지 사용" + }, + "email-address": { + "defaultMessage": "이메일 주소" + }, + "empty-search": { + "defaultMessage": "검색 결과 없음" + }, + "empty-subtitle": { + "defaultMessage": "하나 만들어 보는 건 어떨까요?" + }, + "enabled": { + "defaultMessage": "활성화" + }, + "error.access.at-least-one": { + "defaultMessage": "인증 또는 접근 규칙 중 하나는 반드시 필요합니다." + }, + "error.access.duplicate-usernames": { + "defaultMessage": "인증 사용자 이름은 중복될 수 없습니다." + }, + "error.invalid-auth": { + "defaultMessage": "이메일 또는 비밀번호가 잘못되었습니다." + }, + "error.invalid-domain": { + "defaultMessage": "잘못된 도메인: {domain}" + }, + "error.invalid-email": { + "defaultMessage": "잘못된 이메일 주소입니다." + }, + "error.max-character-length": { + "defaultMessage": "최대 길이는 {max}자입니다." + }, + "error.max-domains": { + "defaultMessage": "도메인이 너무 많습니다. 최대 {max}개까지 가능합니다." + }, + "error.maximum": { + "defaultMessage": "최댓값은 {max}입니다." + }, + "error.min-character-length": { + "defaultMessage": "최소 길이는 {min}자입니다." + }, + "error.minimum": { + "defaultMessage": "최솟값은 {min}입니다." + }, + "error.passwords-must-match": { + "defaultMessage": "비밀번호가 일치해야 합니다." + }, + "error.required": { + "defaultMessage": "필수 항목입니다." + }, + "expires.on": { + "defaultMessage": "만료일: {date}" + }, + "footer.github-fork": { + "defaultMessage": "GitHub에서 포크하기" + }, + "host.flags.block-exploits": { + "defaultMessage": "일반적인 공격 차단" + }, + "host.flags.cache-assets": { + "defaultMessage": "정적 에셋 캐싱" + }, + "host.flags.preserve-path": { + "defaultMessage": "요청 경로 유지" + }, + "host.flags.protocols": { + "defaultMessage": "프로토콜" + }, + "host.flags.websockets-upgrade": { + "defaultMessage": "웹소켓 지원" + }, + "host.forward-port": { + "defaultMessage": "전달할 포트" + }, + "host.forward-scheme": { + "defaultMessage": "프로토콜" + }, + "hosts": { + "defaultMessage": "호스트 목록" + }, + "http-only": { + "defaultMessage": "HTTP 전용" + }, + "lets-encrypt": { + "defaultMessage": "Let's Encrypt" + }, + "lets-encrypt-via-dns": { + "defaultMessage": "Let's Encrypt (DNS 방식)" + }, + "lets-encrypt-via-http": { + "defaultMessage": "Let's Encrypt (HTTP 방식)" + }, + "loading": { + "defaultMessage": "불러오는 중…" + }, + "login.title": { + "defaultMessage": "로그인" + }, + "nginx-config.label": { + "defaultMessage": "사용자 지정 Nginx 설정" + }, + "nginx-config.placeholder": { + "defaultMessage": "# 위험을 감수하고 여기에 사용자 지정 Nginx 설정을 입력하세요!" + }, + "no-permission-error": { + "defaultMessage": "이 내용을 볼 권한이 없습니다." + }, + "notfound.action": { + "defaultMessage": "홈으로 이동" + }, + "notfound.content": { + "defaultMessage": "죄송합니다. 찾으시는 페이지를 찾을 수 없습니다." + }, + "notfound.title": { + "defaultMessage": "이런… 오류 페이지에 도착했습니다." + }, + "notification.error": { + "defaultMessage": "오류" + }, + "notification.object-deleted": { + "defaultMessage": "{object}이(가) 삭제되었습니다." + }, + "notification.object-disabled": { + "defaultMessage": "{object}이(가) 비활성화되었습니다." + }, + "notification.object-enabled": { + "defaultMessage": "{object}이(가) 활성화되었습니다." + }, + "notification.object-renewed": { + "defaultMessage": "{object}이(가) 갱신되었습니다." + }, + "notification.object-saved": { + "defaultMessage": "{object}이(가) 저장되었습니다." + }, + "notification.success": { + "defaultMessage": "성공" + }, + "object.actions-title": { + "defaultMessage": "{object} #{id}" + }, + "object.add": { + "defaultMessage": "{object} 추가" + }, + "object.delete": { + "defaultMessage": "{object} 삭제" + }, + "object.delete.content": { + "defaultMessage": "이 {object}을(를) 정말 삭제하시겠습니까?" + }, + "object.edit": { + "defaultMessage": "{object} 편집" + }, + "object.empty": { + "defaultMessage": "{objects}이(가) 없습니다." + }, + "object.event.created": { + "defaultMessage": "{object}이(가) 생성됨" + }, + "object.event.deleted": { + "defaultMessage": "{object}이(가) 삭제됨" + }, + "object.event.disabled": { + "defaultMessage": "{object}이(가) 비활성화됨" + }, + "object.event.enabled": { + "defaultMessage": "{object}이(가) 활성화됨" + }, + "object.event.renewed": { + "defaultMessage": "{object}이(가) 갱신됨" + }, + "object.event.updated": { + "defaultMessage": "{object}이(가) 업데이트됨" + }, + "offline": { + "defaultMessage": "비활성화" + }, + "online": { + "defaultMessage": "활성화" + }, + "options": { + "defaultMessage": "옵션" + }, + "password": { + "defaultMessage": "비밀번호" + }, + "password.generate": { + "defaultMessage": "무작위 비밀번호 생성" + }, + "password.hide": { + "defaultMessage": "비밀번호 숨기기" + }, + "password.show": { + "defaultMessage": "비밀번호 표시" + }, + "permissions.hidden": { + "defaultMessage": "숨김" + }, + "permissions.manage": { + "defaultMessage": "관리" + }, + "permissions.view": { + "defaultMessage": "보기 전용" + }, + "permissions.visibility.all": { + "defaultMessage": "모든 항목" + }, + "permissions.visibility.title": { + "defaultMessage": "항목 표시 설정" + }, + "permissions.visibility.user": { + "defaultMessage": "내가 만든 항목만" + }, + "proxy-host": { + "defaultMessage": "프록시 호스트" + }, + "proxy-host.forward-host": { + "defaultMessage": "전달할 호스트명 / IP" + }, + "proxy-hosts": { + "defaultMessage": "프록시 호스트" + }, + "proxy-hosts.count": { + "defaultMessage": "{count}개의 프록시 호스트" + }, + "public": { + "defaultMessage": "공개" + }, + "redirection-host": { + "defaultMessage": "리다이렉션 호스트" + }, + "redirection-host.forward-domain": { + "defaultMessage": "전달할 도메인" + }, + "redirection-host.forward-http-code": { + "defaultMessage": "HTTP 코드" + }, + "redirection-hosts": { + "defaultMessage": "리다이렉션 호스트" + }, + "redirection-hosts.count": { + "defaultMessage": "{count}개의 리다이렉션 호스트" + }, + "redirection-hosts.http-code.300": { + "defaultMessage": "300 Multiple Choices" + }, + "redirection-hosts.http-code.301": { + "defaultMessage": "301 Moved permanently" + }, + "redirection-hosts.http-code.302": { + "defaultMessage": "302 Moved temporarily" + }, + "redirection-hosts.http-code.303": { + "defaultMessage": "303 See other" + }, + "redirection-hosts.http-code.307": { + "defaultMessage": "307 Temporary redirect" + }, + "redirection-hosts.http-code.308": { + "defaultMessage": "308 Permanent redirect" + }, + "role.admin": { + "defaultMessage": "관리자" + }, + "role.standard-user": { + "defaultMessage": "일반 사용자" + }, + "save": { + "defaultMessage": "저장" + }, + "setting": { + "defaultMessage": "설정" + }, + "settings": { + "defaultMessage": "설정" + }, + "settings.default-site": { + "defaultMessage": "기본 사이트" + }, + "settings.default-site.404": { + "defaultMessage": "404 페이지" + }, + "settings.default-site.444": { + "defaultMessage": "응답 없음 (444)" + }, + "settings.default-site.congratulations": { + "defaultMessage": "축하 페이지" + }, + "settings.default-site.description": { + "defaultMessage": "알 수 없는 호스트로 요청이 들어왔을 때 표시할 내용" + }, + "settings.default-site.html": { + "defaultMessage": "사용자 지정 HTML" + }, + "settings.default-site.html.placeholder": { + "defaultMessage": "" + }, + "settings.default-site.redirect": { + "defaultMessage": "리다이렉트" + }, + "setup.preamble": { + "defaultMessage": "관리자 계정을 만들어 시작하세요." + }, + "setup.title": { + "defaultMessage": "환영합니다!" + }, + "sign-in": { + "defaultMessage": "로그인" + }, + "ssl-certificate": { + "defaultMessage": "SSL 인증서" + }, + "stream": { + "defaultMessage": "호스트 스트림" + }, + "stream.forward-host": { + "defaultMessage": "전달할 호스트" + }, + "stream.forward-host.placeholder": { + "defaultMessage": "example.com / 10.0.0.1 / IPv6" + }, + "stream.incoming-port": { + "defaultMessage": "수신 포트" + }, + "streams": { + "defaultMessage": "호스트 스트림" + }, + "streams.count": { + "defaultMessage": "{count}개의 호스트 스트림" + }, + "streams.tcp": { + "defaultMessage": "TCP" + }, + "streams.udp": { + "defaultMessage": "UDP" + }, + "test": { + "defaultMessage": "테스트" + }, + "update-available": { + "defaultMessage": "업데이트 가능: {latestVersion}" + }, + "user": { + "defaultMessage": "사용자" + }, + "user.change-password": { + "defaultMessage": "비밀번호 변경" + }, + "user.confirm-password": { + "defaultMessage": "비밀번호 확인" + }, + "user.current-password": { + "defaultMessage": "현재 비밀번호" + }, + "user.edit-profile": { + "defaultMessage": "프로필 편집" + }, + "user.full-name": { + "defaultMessage": "전체 이름" + }, + "user.login-as": { + "defaultMessage": "{name}으로 로그인" + }, + "user.logout": { + "defaultMessage": "로그아웃" + }, + "user.new-password": { + "defaultMessage": "새 비밀번호" + }, + "user.nickname": { + "defaultMessage": "닉네임" + }, + "user.set-password": { + "defaultMessage": "비밀번호 설정" + }, + "user.set-permissions": { + "defaultMessage": "{name}의 권한 설정" + }, + "user.switch-dark": { + "defaultMessage": "다크 모드로 전환" + }, + "user.switch-light": { + "defaultMessage": "라이트 모드로 전환" + }, + "username": { + "defaultMessage": "사용자 이름" + }, + "users": { + "defaultMessage": "사용자" + } +} diff --git a/frontend/src/locale/src/lang-list.json b/frontend/src/locale/src/lang-list.json index 8bbf0e97..a539a4cd 100755 --- a/frontend/src/locale/src/lang-list.json +++ b/frontend/src/locale/src/lang-list.json @@ -31,5 +31,8 @@ }, "locale-nl-NL": { "defaultMessage": "Nederlands" + }, + "locale-ko-KR": { + "defaultMessage": "한국어" } } From 3cb124d5a08190e49acb122f3fcc6b5ceb964ffe Mon Sep 17 00:00:00 2001 From: abinas <144870133+abinas-hdb@users.noreply.github.com> Date: Sat, 22 Nov 2025 00:14:45 +0900 Subject: [PATCH 11/55] Update Korean language support --- frontend/src/locale/IntlProvider.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/locale/IntlProvider.tsx b/frontend/src/locale/IntlProvider.tsx index 5482f63c..9113df07 100755 --- a/frontend/src/locale/IntlProvider.tsx +++ b/frontend/src/locale/IntlProvider.tsx @@ -11,6 +11,7 @@ import langRu from "./lang/ru.json"; import langSk from "./lang/sk.json"; import langVi from "./lang/vi.json"; import langZh from "./lang/zh.json"; +import langKo from "./lang/ko.json"; // first item of each array should be the language code, // not the country code @@ -27,6 +28,7 @@ const localeOptions = [ ["sk", "sk-SK", langSk], ["vi", "vi-VN", langVi], ["zh", "zh-CN", langZh], + ["ko", "ko-KR", langKo], ]; const loadMessages = (locale?: string): typeof langList & typeof langEn => { @@ -47,7 +49,7 @@ const getFlagCodeForLocale = (locale?: string) => { const specialCases: Record = { ja: "jp", // Japan zh: "cn", // China - vi: "vn", // Vietnam + ko: "kr", // Korea }; if (specialCases[thisLocale]) { From 80cf4406d5849f9f740afac661bc40e0cf696a3a Mon Sep 17 00:00:00 2001 From: abinas <144870133+abinas-hdb@users.noreply.github.com> Date: Sat, 22 Nov 2025 00:15:08 +0900 Subject: [PATCH 12/55] Update Korean language support --- frontend/check-locales.cjs | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/check-locales.cjs b/frontend/check-locales.cjs index bd871169..31c970b6 100755 --- a/frontend/check-locales.cjs +++ b/frontend/check-locales.cjs @@ -18,6 +18,7 @@ const allLocales = [ ["sk", "sk-SK"], ["vi", "vi-VN"], ["zh", "zh-CN"], + ["ko", "ko-KR"], ]; const ignoreUnused = [ From c076ad145ce3195d760884473b3625ff6a431f86 Mon Sep 17 00:00:00 2001 From: abinas <144870133+abinas-hdb@users.noreply.github.com> Date: Sat, 22 Nov 2025 00:18:19 +0900 Subject: [PATCH 13/55] Add Korean translation --- frontend/src/locale/src/HelpDoc/ko/ProxyHosts.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 frontend/src/locale/src/HelpDoc/ko/ProxyHosts.md diff --git a/frontend/src/locale/src/HelpDoc/ko/ProxyHosts.md b/frontend/src/locale/src/HelpDoc/ko/ProxyHosts.md new file mode 100644 index 00000000..d94ae111 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ko/ProxyHosts.md @@ -0,0 +1,7 @@ +## 프록시 호스트란? + +프록시 호스트는 외부에서 들어오는 웹 요청을 받아 지정한 전달 대상으로 전달하는 역할을 합니다. + +원래 SSL을 지원하지 않는 대상이라도, 프록시 호스트를 통해 SSL(HTTPS) 연결을 적용할 수 있습니다. + +프록시 호스트는 Nginx Proxy Manager에서 가장 일반적으로 사용되는 기능입니다. From 991bddf891e1096c000ae48c3d116c243204b10a Mon Sep 17 00:00:00 2001 From: abinas <144870133+abinas-hdb@users.noreply.github.com> Date: Sat, 22 Nov 2025 00:18:36 +0900 Subject: [PATCH 14/55] Add Korean translation --- .../src/locale/src/HelpDoc/ko/AccessLists.md | 11 ++++++++ .../src/locale/src/HelpDoc/ko/Certificates.md | 28 +++++++++++++++++++ .../src/locale/src/HelpDoc/ko/DeadHosts.md | 10 +++++++ .../src/locale/src/HelpDoc/ko/ProxyHosts.md | 1 + .../locale/src/HelpDoc/ko/RedirectionHosts.md | 7 +++++ frontend/src/locale/src/HelpDoc/ko/Streams.md | 7 +++++ frontend/src/locale/src/HelpDoc/ko/index.ts | 7 +++++ 7 files changed, 71 insertions(+) create mode 100644 frontend/src/locale/src/HelpDoc/ko/AccessLists.md create mode 100644 frontend/src/locale/src/HelpDoc/ko/Certificates.md create mode 100644 frontend/src/locale/src/HelpDoc/ko/DeadHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/ko/RedirectionHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/ko/Streams.md create mode 100644 frontend/src/locale/src/HelpDoc/ko/index.ts diff --git a/frontend/src/locale/src/HelpDoc/ko/AccessLists.md b/frontend/src/locale/src/HelpDoc/ko/AccessLists.md new file mode 100644 index 00000000..8e967012 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ko/AccessLists.md @@ -0,0 +1,11 @@ +## 접근 정책이란? + +접근 정책은 특정 클라이언트 IP 주소를 허용하거나 거부할 수 있으며, +프록시 호스트에 기본 HTTP 인증(Basic Auth) 을 적용할 수 있는 기능입니다. + +하나의 접근 목록에 여러 클라이언트 규칙과 사용자 이름, 비밀번호를 추가한 뒤 +이를 하나 이상의 프록시 호스트에 적용할 수 있습니다. + +이 기능은 인증 기능이 없는 웹 서비스에 인증을 추가하거나, +알 수 없는 클라이언트로부터 서비스를 보호할 때 유용합니다. + diff --git a/frontend/src/locale/src/HelpDoc/ko/Certificates.md b/frontend/src/locale/src/HelpDoc/ko/Certificates.md new file mode 100644 index 00000000..660f3962 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ko/Certificates.md @@ -0,0 +1,28 @@ +## 인증서 도움말 + +### HTTP 인증서 + +HTTP 검증 방식의 인증서는 Let's Encrypt 서버가 **HTTPS가 아닌 HTTP로** 해당 도메인에 접속을 시도해 응답이 확인되면 인증서를 발급하는 방식입니다. + +이 방식을 사용하려면 도메인에 대한 **프록시 호스트가 미리 생성되어 있어야 하며**, HTTP로 접근할 수 있어야 하고 Nginx Proxy Manager가 설치된 서버를 가리켜야 합니다. 인증서가 발급된 이후에는 해당 프록시 호스트에 HTTPS용 인증서를 적용할 수 있습니다. + +다만, **인증서 자동 갱신을 위해서는 HTTP 접근이 계속 필요합니다.** + +이 방식은 **와일드카드 도메인을 지원하지 않습니다.** + +--- + +### DNS 인증서 + +DNS 검증 방식의 인증서는 DNS 공급자 플러그인을 사용해야 합니다. 이 플러그인은 도메인에 임시 DNS 레코드를 생성하며, Let's Encrypt는 해당 레코드를 조회해 도메인 소유 여부를 확인합니다. 검증이 성공하면 인증서가 발급됩니다. + +이 방식은 인증서를 요청하기 전에 **프록시 호스트를 생성할 필요가 없으며**, 프록시 호스트에 HTTP 접근을 설정할 필요도 없습니다. + +이 방식은 **와일드카드 도메인을 지원합니다.** + +--- + +### 사용자 지정 인증서 + +이 옵션을 사용하면 직접 보유한 인증 기관(CA)에서 발급한 SSL 인증서를 직접 업로드하여 사용할 수 있습니다. + diff --git a/frontend/src/locale/src/HelpDoc/ko/DeadHosts.md b/frontend/src/locale/src/HelpDoc/ko/DeadHosts.md new file mode 100644 index 00000000..032a23c9 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ko/DeadHosts.md @@ -0,0 +1,10 @@ +## 404 호스트란? + +404 호스트는 404 오류 페이지를 표시하도록 구성된 호스트입니다. + +이 기능은 도메인이 검색 엔진에 이미 색인되어 있을 때, +더 깔끔한 오류 페이지를 제공하거나 해당 페이지가 더 이상 존재하지 않음을 +검색 엔진에게 명확하게 알려야 할 때 유용합니다. + +또한 404 호스트를 사용하면 접근 로그를 확인하고, 어떤 경로(Referrer)를 통해 들어왔는지 추적할 수 있다는 장점도 있습니다. + diff --git a/frontend/src/locale/src/HelpDoc/ko/ProxyHosts.md b/frontend/src/locale/src/HelpDoc/ko/ProxyHosts.md index d94ae111..3212fde7 100644 --- a/frontend/src/locale/src/HelpDoc/ko/ProxyHosts.md +++ b/frontend/src/locale/src/HelpDoc/ko/ProxyHosts.md @@ -5,3 +5,4 @@ 원래 SSL을 지원하지 않는 대상이라도, 프록시 호스트를 통해 SSL(HTTPS) 연결을 적용할 수 있습니다. 프록시 호스트는 Nginx Proxy Manager에서 가장 일반적으로 사용되는 기능입니다. + diff --git a/frontend/src/locale/src/HelpDoc/ko/RedirectionHosts.md b/frontend/src/locale/src/HelpDoc/ko/RedirectionHosts.md new file mode 100644 index 00000000..7494885d --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ko/RedirectionHosts.md @@ -0,0 +1,7 @@ +## 리다이렉션 호스트란? + +리다이렉션 호스트는 외부에서 들어오는 도메인 요청을 다른 도메인으로 자동 이동(리다이렉트)시키는 역할을 합니다. + +이 유형의 호스트는 주로 웹사이트의 도메인이 변경되었지만, +검색 엔진이나 다른 사이트에 이전 도메인 링크가 남아 있을 때 사용하면 가장 효과적입니다. + diff --git a/frontend/src/locale/src/HelpDoc/ko/Streams.md b/frontend/src/locale/src/HelpDoc/ko/Streams.md new file mode 100644 index 00000000..45107b2c --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ko/Streams.md @@ -0,0 +1,7 @@ +## 호스트 스트림이란? + +호스트 스트림은 비교적 최근에 Nginx에 추가된 기능으로, +TCP/UDP 트래픽을 네트워크 내의 다른 컴퓨터로 직접 전달하는 데 사용됩니다. + +게임 서버나 FTP, SSH 서버 등을 운영할 때 유용하게 사용할 수 있습니다. + diff --git a/frontend/src/locale/src/HelpDoc/ko/index.ts b/frontend/src/locale/src/HelpDoc/ko/index.ts new file mode 100644 index 00000000..33e015cc --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ko/index.ts @@ -0,0 +1,7 @@ +export * as AccessLists from "./AccessLists.md"; +export * as Certificates from "./Certificates.md"; +export * as DeadHosts from "./DeadHosts.md"; +export * as ProxyHosts from "./ProxyHosts.md"; +export * as RedirectionHosts from "./RedirectionHosts.md"; +export * as Streams from "./Streams.md"; + From e353a665569778c11af641e040ec64775696075a Mon Sep 17 00:00:00 2001 From: abinas <144870133+abinas-hdb@users.noreply.github.com> Date: Sat, 22 Nov 2025 00:33:27 +0900 Subject: [PATCH 15/55] Update IntlProvider.tsx --- frontend/src/locale/IntlProvider.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/locale/IntlProvider.tsx b/frontend/src/locale/IntlProvider.tsx index 9113df07..3377df2a 100755 --- a/frontend/src/locale/IntlProvider.tsx +++ b/frontend/src/locale/IntlProvider.tsx @@ -49,6 +49,7 @@ const getFlagCodeForLocale = (locale?: string) => { const specialCases: Record = { ja: "jp", // Japan zh: "cn", // China + vi: "vn", // Vietnam ko: "kr", // Korea }; From a1fb54c394a55db9d53f735421ef3adf19e6e71a Mon Sep 17 00:00:00 2001 From: Bare7a Date: Mon, 24 Nov 2025 18:04:50 +0200 Subject: [PATCH 16/55] Before Translating --- frontend/check-locales.cjs | 1 + frontend/src/locale/IntlProvider.tsx | 2 + .../src/locale/src/HelpDoc/bg/AccessLists.md | 7 + .../src/locale/src/HelpDoc/bg/Certificates.md | 32 + .../src/locale/src/HelpDoc/bg/DeadHosts.md | 10 + .../src/locale/src/HelpDoc/bg/ProxyHosts.md | 7 + .../locale/src/HelpDoc/bg/RedirectionHosts.md | 7 + frontend/src/locale/src/HelpDoc/bg/Streams.md | 6 + frontend/src/locale/src/HelpDoc/bg/index.ts | 6 + frontend/src/locale/src/bg.json | 683 ++++++++++++++++++ frontend/src/locale/src/lang-list.json | 3 + 11 files changed, 764 insertions(+) create mode 100644 frontend/src/locale/src/HelpDoc/bg/AccessLists.md create mode 100644 frontend/src/locale/src/HelpDoc/bg/Certificates.md create mode 100644 frontend/src/locale/src/HelpDoc/bg/DeadHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/bg/ProxyHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/bg/RedirectionHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/bg/Streams.md create mode 100644 frontend/src/locale/src/HelpDoc/bg/index.ts create mode 100644 frontend/src/locale/src/bg.json diff --git a/frontend/check-locales.cjs b/frontend/check-locales.cjs index bd871169..6f133944 100755 --- a/frontend/check-locales.cjs +++ b/frontend/check-locales.cjs @@ -18,6 +18,7 @@ const allLocales = [ ["sk", "sk-SK"], ["vi", "vi-VN"], ["zh", "zh-CN"], + ["bg", "bg-BG"], ]; const ignoreUnused = [ diff --git a/frontend/src/locale/IntlProvider.tsx b/frontend/src/locale/IntlProvider.tsx index 5482f63c..aaefae84 100755 --- a/frontend/src/locale/IntlProvider.tsx +++ b/frontend/src/locale/IntlProvider.tsx @@ -11,6 +11,7 @@ import langRu from "./lang/ru.json"; import langSk from "./lang/sk.json"; import langVi from "./lang/vi.json"; import langZh from "./lang/zh.json"; +import langBg from "./lang/bg.json"; // first item of each array should be the language code, // not the country code @@ -27,6 +28,7 @@ const localeOptions = [ ["sk", "sk-SK", langSk], ["vi", "vi-VN", langVi], ["zh", "zh-CN", langZh], + ["bg", "bg-BG", langBg], ]; const loadMessages = (locale?: string): typeof langList & typeof langEn => { diff --git a/frontend/src/locale/src/HelpDoc/bg/AccessLists.md b/frontend/src/locale/src/HelpDoc/bg/AccessLists.md new file mode 100644 index 00000000..cef58263 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/bg/AccessLists.md @@ -0,0 +1,7 @@ +## What is an Access List? + +Access Lists provide a blacklist or whitelist of specific client IP addresses along with authentication for the Proxy Hosts via Basic HTTP Authentication. + +You can configure multiple client rules, usernames and passwords for a single Access List and then apply that to one or more _Proxy Hosts_. + +This is most useful for forwarded web services that do not have authentication mechanisms built in or when you want to protect from unknown clients. diff --git a/frontend/src/locale/src/HelpDoc/bg/Certificates.md b/frontend/src/locale/src/HelpDoc/bg/Certificates.md new file mode 100644 index 00000000..d79dd04b --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/bg/Certificates.md @@ -0,0 +1,32 @@ +## Certificates Help + +### HTTP Certificate + +A HTTP validated certificate means Let's Encrypt servers will +attempt to reach your domains over HTTP (not HTTPS!) and if successful, they +will issue your certificate. + +For this method, you will have to have a _Proxy Host_ created for your domains(s) that +is accessible with HTTP and pointing to this Nginx installation. After a certificate +has been given, you can modify the _Proxy Host_ to also use this certificate for HTTPS +connections. However, the _Proxy Host_ will still need to be configured for HTTP access +in order for the certificate to renew. + +This process _does not_ support wildcard domains. + +### DNS Certificate + +A DNS validated certificate requires you to use a DNS Provider plugin. This DNS +Provider will be used to create temporary records on your domain and then Let's +Encrypt will query those records to be sure you're the owner and if successful, they +will issue your certificate. + +You do not need a _Proxy Host_ to be created prior to requesting this type of +certificate. Nor do you need to have your _Proxy Host_ configured for HTTP access. + +This process _does_ support wildcard domains. + +### Custom Certificate + +Use this option to upload your own SSL Certificate, as provided by your own +Certificate Authority. diff --git a/frontend/src/locale/src/HelpDoc/bg/DeadHosts.md b/frontend/src/locale/src/HelpDoc/bg/DeadHosts.md new file mode 100644 index 00000000..ef4f3bc4 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/bg/DeadHosts.md @@ -0,0 +1,10 @@ +## What is a 404 Host? + +A 404 Host is simply a host setup that shows a 404 page. + +This can be useful when your domain is listed in search engines and you want +to provide a nicer error page or specifically to tell the search indexers that +the domain pages no longer exist. + +Another benefit of having this host is to track the logs for hits to it and +view the referrers. diff --git a/frontend/src/locale/src/HelpDoc/bg/ProxyHosts.md b/frontend/src/locale/src/HelpDoc/bg/ProxyHosts.md new file mode 100644 index 00000000..e9630d05 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/bg/ProxyHosts.md @@ -0,0 +1,7 @@ +## What is a Proxy Host? + +A Proxy Host is the incoming endpoint for a web service that you want to forward. + +It provides optional SSL termination for your service that might not have SSL support built in. + +Proxy Hosts are the most common use for the Nginx Proxy Manager. diff --git a/frontend/src/locale/src/HelpDoc/bg/RedirectionHosts.md b/frontend/src/locale/src/HelpDoc/bg/RedirectionHosts.md new file mode 100644 index 00000000..e57b1b80 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/bg/RedirectionHosts.md @@ -0,0 +1,7 @@ +## What is a Redirection Host? + +A Redirection Host will redirect requests from the incoming domain and push the +viewer to another domain. + +The most common reason to use this type of host is when your website changes +domains but you still have search engine or referrer links pointing to the old domain. diff --git a/frontend/src/locale/src/HelpDoc/bg/Streams.md b/frontend/src/locale/src/HelpDoc/bg/Streams.md new file mode 100644 index 00000000..358f3e5a --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/bg/Streams.md @@ -0,0 +1,6 @@ +## What is a Stream? + +A relatively new feature for Nginx, a Stream will serve to forward TCP/UDP +traffic directly to another computer on the network. + +If you're running game servers, FTP or SSH servers this can come in handy. diff --git a/frontend/src/locale/src/HelpDoc/bg/index.ts b/frontend/src/locale/src/HelpDoc/bg/index.ts new file mode 100644 index 00000000..a9bb46ba --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/bg/index.ts @@ -0,0 +1,6 @@ +export * as AccessLists from "./AccessLists.md"; +export * as Certificates from "./Certificates.md"; +export * as DeadHosts from "./DeadHosts.md"; +export * as ProxyHosts from "./ProxyHosts.md"; +export * as RedirectionHosts from "./RedirectionHosts.md"; +export * as Streams from "./Streams.md"; diff --git a/frontend/src/locale/src/bg.json b/frontend/src/locale/src/bg.json new file mode 100644 index 00000000..355d0db7 --- /dev/null +++ b/frontend/src/locale/src/bg.json @@ -0,0 +1,683 @@ +{ + "access-list": { + "defaultMessage": "Access List" + }, + "access-list.access-count": { + "defaultMessage": "{count} {count, plural, one {Rule} other {Rules}}" + }, + "access-list.auth-count": { + "defaultMessage": "{count} {count, plural, one {User} other {Users}}" + }, + "access-list.help-rules-last": { + "defaultMessage": "When at least 1 rule exists, this deny all rule will be added last" + }, + "access-list.help.rules-order": { + "defaultMessage": "Note that the allow and deny directives will be applied in the order they are defined." + }, + "access-list.pass-auth": { + "defaultMessage": "Pass Auth to Upstream" + }, + "access-list.public": { + "defaultMessage": "Publicly Accessible" + }, + "access-list.public.subtitle": { + "defaultMessage": "No basic auth required" + }, + "access-list.rule-source.placeholder": { + "defaultMessage": "192.168.1.100 or 192.168.1.0/24 or 2001:0db8::/32" + }, + "access-list.satisfy-any": { + "defaultMessage": "Satisfy Any" + }, + "access-list.subtitle": { + "defaultMessage": "{users} {users, plural, one {User} other {Users}}, {rules} {rules, plural, one {Rule} other {Rules}} - Created: {date}" + }, + "access-lists": { + "defaultMessage": "Access Lists" + }, + "action.add": { + "defaultMessage": "Add" + }, + "action.add-location": { + "defaultMessage": "Add Location" + }, + "action.allow": { + "defaultMessage": "Allow" + }, + "action.close": { + "defaultMessage": "Close" + }, + "action.delete": { + "defaultMessage": "Delete" + }, + "action.deny": { + "defaultMessage": "Deny" + }, + "action.disable": { + "defaultMessage": "Disable" + }, + "action.download": { + "defaultMessage": "Download" + }, + "action.edit": { + "defaultMessage": "Edit" + }, + "action.enable": { + "defaultMessage": "Enable" + }, + "action.permissions": { + "defaultMessage": "Permissions" + }, + "action.renew": { + "defaultMessage": "Renew" + }, + "action.view-details": { + "defaultMessage": "View Details" + }, + "auditlogs": { + "defaultMessage": "Audit Logs" + }, + "auto": { + "defaultMessage": "Auto" + }, + "cancel": { + "defaultMessage": "Cancel" + }, + "certificate": { + "defaultMessage": "Certificate" + }, + "certificate.custom-certificate": { + "defaultMessage": "Certificate" + }, + "certificate.custom-certificate-key": { + "defaultMessage": "Certificate Key" + }, + "certificate.custom-intermediate": { + "defaultMessage": "Intermediate Certificate" + }, + "certificate.in-use": { + "defaultMessage": "In Use" + }, + "certificate.none.subtitle": { + "defaultMessage": "No certificate assigned" + }, + "certificate.none.subtitle.for-http": { + "defaultMessage": "This host will not use HTTPS" + }, + "certificate.none.title": { + "defaultMessage": "None" + }, + "certificate.not-in-use": { + "defaultMessage": "Not Used" + }, + "certificate.renew": { + "defaultMessage": "Renew Certificate" + }, + "certificates": { + "defaultMessage": "Certificates" + }, + "certificates.custom": { + "defaultMessage": "Custom Certificate" + }, + "certificates.custom.warning": { + "defaultMessage": "Key files protected with a passphrase are not supported." + }, + "certificates.dns.credentials": { + "defaultMessage": "Credentials File Content" + }, + "certificates.dns.credentials-note": { + "defaultMessage": "This plugin requires a configuration file containing an API token or other credentials for your provider" + }, + "certificates.dns.credentials-warning": { + "defaultMessage": "This data will be stored as plaintext in the database and in a file!" + }, + "certificates.dns.propagation-seconds": { + "defaultMessage": "Propagation Seconds" + }, + "certificates.dns.propagation-seconds-note": { + "defaultMessage": "Leave empty to use the plugins default value. Number of seconds to wait for DNS propagation." + }, + "certificates.dns.provider": { + "defaultMessage": "DNS Provider" + }, + "certificates.dns.provider.placeholder": { + "defaultMessage": "Select a Provider..." + }, + "certificates.dns.warning": { + "defaultMessage": "This section requires some knowledge about Certbot and its DNS plugins. Please consult the respective plugins documentation." + }, + "certificates.http.reachability-404": { + "defaultMessage": "There is a server found at this domain but it does not seem to be Nginx Proxy Manager. Please make sure your domain points to the IP where your NPM instance is running." + }, + "certificates.http.reachability-failed-to-check": { + "defaultMessage": "Failed to check the reachability due to a communication error with site24x7.com." + }, + "certificates.http.reachability-not-resolved": { + "defaultMessage": "There is no server available at this domain. Please make sure your domain exists and points to the IP where your NPM instance is running and if necessary port 80 is forwarded in your router." + }, + "certificates.http.reachability-ok": { + "defaultMessage": "Your server is reachable and creating certificates should be possible." + }, + "certificates.http.reachability-other": { + "defaultMessage": "There is a server found at this domain but it returned an unexpected status code {code}. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running." + }, + "certificates.http.reachability-wrong-data": { + "defaultMessage": "There is a server found at this domain but it returned an unexpected data. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running." + }, + "certificates.http.test-results": { + "defaultMessage": "Test Results" + }, + "certificates.http.warning": { + "defaultMessage": "These domains must be already configured to point to this installation." + }, + "certificates.request.subtitle": { + "defaultMessage": "with Let's Encrypt" + }, + "certificates.request.title": { + "defaultMessage": "Request a new Certificate" + }, + "column.access": { + "defaultMessage": "Access" + }, + "column.authorization": { + "defaultMessage": "Authorization" + }, + "column.authorizations": { + "defaultMessage": "Authorizations" + }, + "column.custom-locations": { + "defaultMessage": "Custom Locations" + }, + "column.destination": { + "defaultMessage": "Destination" + }, + "column.details": { + "defaultMessage": "Details" + }, + "column.email": { + "defaultMessage": "Email" + }, + "column.event": { + "defaultMessage": "Event" + }, + "column.expires": { + "defaultMessage": "Expires" + }, + "column.http-code": { + "defaultMessage": "HTTP Code" + }, + "column.incoming-port": { + "defaultMessage": "Incoming Port" + }, + "column.name": { + "defaultMessage": "Name" + }, + "column.protocol": { + "defaultMessage": "Protocol" + }, + "column.provider": { + "defaultMessage": "Provider" + }, + "column.roles": { + "defaultMessage": "Roles" + }, + "column.rules": { + "defaultMessage": "Rules" + }, + "column.satisfy": { + "defaultMessage": "Satisfy" + }, + "column.satisfy-all": { + "defaultMessage": "All" + }, + "column.satisfy-any": { + "defaultMessage": "Any" + }, + "column.scheme": { + "defaultMessage": "Scheme" + }, + "column.source": { + "defaultMessage": "Source" + }, + "column.ssl": { + "defaultMessage": "SSL" + }, + "column.status": { + "defaultMessage": "Status" + }, + "created-on": { + "defaultMessage": "Created: {date}" + }, + "dashboard": { + "defaultMessage": "Dashboard" + }, + "dead-host": { + "defaultMessage": "404 Host" + }, + "dead-hosts": { + "defaultMessage": "404 Hosts" + }, + "dead-hosts.count": { + "defaultMessage": "{count} {count, plural, one {404 Host} other {404 Hosts}}" + }, + "disabled": { + "defaultMessage": "Disabled" + }, + "domain-names": { + "defaultMessage": "Domain Names" + }, + "domain-names.max": { + "defaultMessage": "{count} domain names maximum" + }, + "domain-names.placeholder": { + "defaultMessage": "Start typing to add domain..." + }, + "domain-names.wildcards-not-permitted": { + "defaultMessage": "Wildcards not permitted for this type" + }, + "domain-names.wildcards-not-supported": { + "defaultMessage": "Wildcards not supported for this CA" + }, + "domains.force-ssl": { + "defaultMessage": "Force SSL" + }, + "domains.hsts-enabled": { + "defaultMessage": "HSTS Enabled" + }, + "domains.hsts-subdomains": { + "defaultMessage": "HSTS Sub-domains" + }, + "domains.http2-support": { + "defaultMessage": "HTTP/2 Support" + }, + "domains.use-dns": { + "defaultMessage": "Use DNS Challenge" + }, + "email-address": { + "defaultMessage": "Email address" + }, + "empty-search": { + "defaultMessage": "No results found" + }, + "empty-subtitle": { + "defaultMessage": "Why don't you create one?" + }, + "enabled": { + "defaultMessage": "Enabled" + }, + "error.access.at-least-one": { + "defaultMessage": "Either one Authorization or one Access Rule is required" + }, + "error.access.duplicate-usernames": { + "defaultMessage": "Authorization Usernames must be unique" + }, + "error.invalid-auth": { + "defaultMessage": "Invalid email or password" + }, + "error.invalid-domain": { + "defaultMessage": "Invalid domain: {domain}" + }, + "error.invalid-email": { + "defaultMessage": "Invalid email address" + }, + "error.max-character-length": { + "defaultMessage": "Maximum length is {max} character{max, plural, one {} other {s}}" + }, + "error.max-domains": { + "defaultMessage": "Too many domains, max is {max}" + }, + "error.maximum": { + "defaultMessage": "Maximum is {max}" + }, + "error.min-character-length": { + "defaultMessage": "Minimum length is {min} character{min, plural, one {} other {s}}" + }, + "error.minimum": { + "defaultMessage": "Minimum is {min}" + }, + "error.passwords-must-match": { + "defaultMessage": "Passwords must match" + }, + "error.required": { + "defaultMessage": "This is required" + }, + "expires.on": { + "defaultMessage": "Expires: {date}" + }, + "footer.github-fork": { + "defaultMessage": "Fork me on Github" + }, + "host.flags.block-exploits": { + "defaultMessage": "Block Common Exploits" + }, + "host.flags.cache-assets": { + "defaultMessage": "Cache Assets" + }, + "host.flags.preserve-path": { + "defaultMessage": "Preserve Path" + }, + "host.flags.protocols": { + "defaultMessage": "Protocols" + }, + "host.flags.websockets-upgrade": { + "defaultMessage": "Websockets Support" + }, + "host.forward-port": { + "defaultMessage": "Forward Port" + }, + "host.forward-scheme": { + "defaultMessage": "Scheme" + }, + "hosts": { + "defaultMessage": "Hosts" + }, + "http-only": { + "defaultMessage": "HTTP Only" + }, + "lets-encrypt": { + "defaultMessage": "Let's Encrypt" + }, + "lets-encrypt-via-dns": { + "defaultMessage": "Let's Encrypt via DNS" + }, + "lets-encrypt-via-http": { + "defaultMessage": "Let's Encrypt via HTTP" + }, + "loading": { + "defaultMessage": "Loading…" + }, + "login.title": { + "defaultMessage": "Login to your account" + }, + "nginx-config.label": { + "defaultMessage": "Custom Nginx Configuration" + }, + "nginx-config.placeholder": { + "defaultMessage": "# Enter your custom Nginx configuration here at your own risk!" + }, + "no-permission-error": { + "defaultMessage": "You do not have access to view this." + }, + "notfound.action": { + "defaultMessage": "Take me home" + }, + "notfound.content": { + "defaultMessage": "We are sorry but the page you are looking for was not found" + }, + "notfound.title": { + "defaultMessage": "Oops… You just found an error page" + }, + "notification.error": { + "defaultMessage": "Error" + }, + "notification.object-deleted": { + "defaultMessage": "{object} has been deleted" + }, + "notification.object-disabled": { + "defaultMessage": "{object} has been disabled" + }, + "notification.object-enabled": { + "defaultMessage": "{object} has been enabled" + }, + "notification.object-renewed": { + "defaultMessage": "{object} has been renewed" + }, + "notification.object-saved": { + "defaultMessage": "{object} has been saved" + }, + "notification.success": { + "defaultMessage": "Success" + }, + "object.actions-title": { + "defaultMessage": "{object} #{id}" + }, + "object.add": { + "defaultMessage": "Add {object}" + }, + "object.delete": { + "defaultMessage": "Delete {object}" + }, + "object.delete.content": { + "defaultMessage": "Are you sure you want to delete this {object}?" + }, + "object.edit": { + "defaultMessage": "Edit {object}" + }, + "object.empty": { + "defaultMessage": "There are no {objects}" + }, + "object.event.created": { + "defaultMessage": "Created {object}" + }, + "object.event.deleted": { + "defaultMessage": "Deleted {object}" + }, + "object.event.disabled": { + "defaultMessage": "Disabled {object}" + }, + "object.event.enabled": { + "defaultMessage": "Enabled {object}" + }, + "object.event.renewed": { + "defaultMessage": "Renewed {object}" + }, + "object.event.updated": { + "defaultMessage": "Updated {object}" + }, + "offline": { + "defaultMessage": "Offline" + }, + "online": { + "defaultMessage": "Online" + }, + "options": { + "defaultMessage": "Options" + }, + "password": { + "defaultMessage": "Password" + }, + "password.generate": { + "defaultMessage": "Generate random password" + }, + "password.hide": { + "defaultMessage": "Hide Password" + }, + "password.show": { + "defaultMessage": "Show Password" + }, + "permissions.hidden": { + "defaultMessage": "Hidden" + }, + "permissions.manage": { + "defaultMessage": "Manage" + }, + "permissions.view": { + "defaultMessage": "View Only" + }, + "permissions.visibility.all": { + "defaultMessage": "All Items" + }, + "permissions.visibility.title": { + "defaultMessage": "Item Visibility" + }, + "permissions.visibility.user": { + "defaultMessage": "Created Items Only" + }, + "proxy-host": { + "defaultMessage": "Proxy Host" + }, + "proxy-host.forward-host": { + "defaultMessage": "Forward Hostname / IP" + }, + "proxy-hosts": { + "defaultMessage": "Proxy Hosts" + }, + "proxy-hosts.count": { + "defaultMessage": "{count} {count, plural, one {Proxy Host} other {Proxy Hosts}}" + }, + "public": { + "defaultMessage": "Public" + }, + "redirection-host": { + "defaultMessage": "Redirection Host" + }, + "redirection-host.forward-domain": { + "defaultMessage": "Forward Domain" + }, + "redirection-host.forward-http-code": { + "defaultMessage": "HTTP Code" + }, + "redirection-hosts": { + "defaultMessage": "Redirection Hosts" + }, + "redirection-hosts.count": { + "defaultMessage": "{count} {count, plural, one {Redirection Host} other {Redirection Hosts}}" + }, + "redirection-hosts.http-code.300": { + "defaultMessage": "300 Multiple Choices" + }, + "redirection-hosts.http-code.301": { + "defaultMessage": "301 Moved permanently" + }, + "redirection-hosts.http-code.302": { + "defaultMessage": "302 Moved temporarily" + }, + "redirection-hosts.http-code.303": { + "defaultMessage": "303 See other" + }, + "redirection-hosts.http-code.307": { + "defaultMessage": "307 Temporary redirect" + }, + "redirection-hosts.http-code.308": { + "defaultMessage": "308 Permanent redirect" + }, + "role.admin": { + "defaultMessage": "Administrator" + }, + "role.standard-user": { + "defaultMessage": "Standard User" + }, + "save": { + "defaultMessage": "Save" + }, + "setting": { + "defaultMessage": "Setting" + }, + "settings": { + "defaultMessage": "Settings" + }, + "settings.default-site": { + "defaultMessage": "Default Site" + }, + "settings.default-site.404": { + "defaultMessage": "404 Page" + }, + "settings.default-site.444": { + "defaultMessage": "No Response (444)" + }, + "settings.default-site.congratulations": { + "defaultMessage": "Congratulations Page" + }, + "settings.default-site.description": { + "defaultMessage": "What to show when Nginx is hit with an unknown Host" + }, + "settings.default-site.html": { + "defaultMessage": "Custom HTML" + }, + "settings.default-site.html.placeholder": { + "defaultMessage": "" + }, + "settings.default-site.redirect": { + "defaultMessage": "Redirect" + }, + "setup.preamble": { + "defaultMessage": "Get started by creating your admin account." + }, + "setup.title": { + "defaultMessage": "Welcome!" + }, + "sign-in": { + "defaultMessage": "Sign in" + }, + "ssl-certificate": { + "defaultMessage": "SSL Certificate" + }, + "stream": { + "defaultMessage": "Stream" + }, + "stream.forward-host": { + "defaultMessage": "Forward Host" + }, + "stream.forward-host.placeholder": { + "defaultMessage": "example.com or 10.0.0.1 or 2001:db8:3333:4444:5555:6666:7777:8888" + }, + "stream.incoming-port": { + "defaultMessage": "Incoming Port" + }, + "streams": { + "defaultMessage": "Streams" + }, + "streams.count": { + "defaultMessage": "{count} {count, plural, one {Stream} other {Streams}}" + }, + "streams.tcp": { + "defaultMessage": "TCP" + }, + "streams.udp": { + "defaultMessage": "UDP" + }, + "test": { + "defaultMessage": "Test" + }, + "update-available": { + "defaultMessage": "Update Available: {latestVersion}" + }, + "user": { + "defaultMessage": "User" + }, + "user.change-password": { + "defaultMessage": "Change Password" + }, + "user.confirm-password": { + "defaultMessage": "Confirm Password" + }, + "user.current-password": { + "defaultMessage": "Current Password" + }, + "user.edit-profile": { + "defaultMessage": "Edit Profile" + }, + "user.full-name": { + "defaultMessage": "Full Name" + }, + "user.login-as": { + "defaultMessage": "Sign in as {name}" + }, + "user.logout": { + "defaultMessage": "Logout" + }, + "user.new-password": { + "defaultMessage": "New Password" + }, + "user.nickname": { + "defaultMessage": "Nickname" + }, + "user.set-password": { + "defaultMessage": "Set Password" + }, + "user.set-permissions": { + "defaultMessage": "Set Permissions for {name}" + }, + "user.switch-dark": { + "defaultMessage": "Switch to Dark mode" + }, + "user.switch-light": { + "defaultMessage": "Switch to Light mode" + }, + "username": { + "defaultMessage": "Username" + }, + "users": { + "defaultMessage": "Users" + } +} diff --git a/frontend/src/locale/src/lang-list.json b/frontend/src/locale/src/lang-list.json index 8bbf0e97..1f1e9d5d 100755 --- a/frontend/src/locale/src/lang-list.json +++ b/frontend/src/locale/src/lang-list.json @@ -31,5 +31,8 @@ }, "locale-nl-NL": { "defaultMessage": "Nederlands" + }, + "locale-bg-BG": { + "defaultMessage": "Български" } } From 4712633568e2e3b5d209b05286f71e237106ab8e Mon Sep 17 00:00:00 2001 From: Bare7a Date: Mon, 24 Nov 2025 18:07:46 +0200 Subject: [PATCH 17/55] After Translate --- .../src/locale/src/HelpDoc/bg/AccessLists.md | 8 +- .../src/locale/src/HelpDoc/bg/Certificates.md | 33 +- .../src/locale/src/HelpDoc/bg/DeadHosts.md | 14 +- .../src/locale/src/HelpDoc/bg/ProxyHosts.md | 8 +- .../locale/src/HelpDoc/bg/RedirectionHosts.md | 10 +- frontend/src/locale/src/HelpDoc/bg/Streams.md | 8 +- frontend/src/locale/src/bg.json | 442 +++++++++--------- 7 files changed, 256 insertions(+), 267 deletions(-) diff --git a/frontend/src/locale/src/HelpDoc/bg/AccessLists.md b/frontend/src/locale/src/HelpDoc/bg/AccessLists.md index cef58263..8e7f2507 100644 --- a/frontend/src/locale/src/HelpDoc/bg/AccessLists.md +++ b/frontend/src/locale/src/HelpDoc/bg/AccessLists.md @@ -1,7 +1,7 @@ -## What is an Access List? +## Какво представлява Списъкът за достъп? -Access Lists provide a blacklist or whitelist of specific client IP addresses along with authentication for the Proxy Hosts via Basic HTTP Authentication. +Списъците за достъп предоставят черен или бял списък от конкретни клиентски IP адреси, както и удостоверяване за Прокси хостове чрез базова HTTP автентикация. -You can configure multiple client rules, usernames and passwords for a single Access List and then apply that to one or more _Proxy Hosts_. +Можете да конфигурирате множество клиентски правила, потребителски имена и пароли в един Списък за достъп и след това да го приложите към един или повече _Прокси хостове_. -This is most useful for forwarded web services that do not have authentication mechanisms built in or when you want to protect from unknown clients. +Това е най-полезно при препращани уеб услуги, които нямат вградени механизми за удостоверяване, или когато искате да защитите достъпа от неизвестни клиенти. diff --git a/frontend/src/locale/src/HelpDoc/bg/Certificates.md b/frontend/src/locale/src/HelpDoc/bg/Certificates.md index d79dd04b..c138a753 100644 --- a/frontend/src/locale/src/HelpDoc/bg/Certificates.md +++ b/frontend/src/locale/src/HelpDoc/bg/Certificates.md @@ -1,32 +1,21 @@ -## Certificates Help +## Помощ за сертификати -### HTTP Certificate +### HTTP сертификат -A HTTP validated certificate means Let's Encrypt servers will -attempt to reach your domains over HTTP (not HTTPS!) and if successful, they -will issue your certificate. +HTTP валидираният сертификат означава, че сървърите на Let’s Encrypt ще се опитат да достигнат вашите домейни по HTTP (не по HTTPS!) и ако успеят, ще издадат сертификата. -For this method, you will have to have a _Proxy Host_ created for your domains(s) that -is accessible with HTTP and pointing to this Nginx installation. After a certificate -has been given, you can modify the _Proxy Host_ to also use this certificate for HTTPS -connections. However, the _Proxy Host_ will still need to be configured for HTTP access -in order for the certificate to renew. +За този метод трябва да имате създаден _Прокси хост_ за вашия/вашите домейни, който да е достъпен по HTTP и да сочи към тази Nginx инсталация. След като бъде издаден сертификат, можете да промените _Прокси хоста_ така, че да използва сертификата и за HTTPS връзки. Въпреки това, _Прокси хостът_ трябва да остане конфигуриран за достъп по HTTP, за да може сертификатът да се подновява. -This process _does not_ support wildcard domains. +Този процес _не_ поддържа wildcard домейни. -### DNS Certificate +### DNS сертификат -A DNS validated certificate requires you to use a DNS Provider plugin. This DNS -Provider will be used to create temporary records on your domain and then Let's -Encrypt will query those records to be sure you're the owner and if successful, they -will issue your certificate. +DNS валидираният сертификат изисква използването на DNS Provider плъгин. Този DNS Provider ще бъде използван за временно създаване на записи във вашия домейн, след което Let’s Encrypt ще ги провери, за да се увери, че сте собственикът, и при успех ще издаде сертификата. -You do not need a _Proxy Host_ to be created prior to requesting this type of -certificate. Nor do you need to have your _Proxy Host_ configured for HTTP access. +Не е необходимо да имате _Прокси хост_, създаден предварително, за да заявите този тип сертификат. Нито е нужно вашият _Прокси хост_ да бъде конфигуриран за достъп по HTTP. -This process _does_ support wildcard domains. +Този процес _поддържа_ wildcard домейни. -### Custom Certificate +### Персонализиран сертификат -Use this option to upload your own SSL Certificate, as provided by your own -Certificate Authority. +Използвайте тази опция, за да качите собствен SSL сертификат, предоставен от ваша сертификатна агенция. diff --git a/frontend/src/locale/src/HelpDoc/bg/DeadHosts.md b/frontend/src/locale/src/HelpDoc/bg/DeadHosts.md index ef4f3bc4..79ad960b 100644 --- a/frontend/src/locale/src/HelpDoc/bg/DeadHosts.md +++ b/frontend/src/locale/src/HelpDoc/bg/DeadHosts.md @@ -1,10 +1,10 @@ -## What is a 404 Host? +## Какво представлява 404 хост? -A 404 Host is simply a host setup that shows a 404 page. +404 хост е просто конфигурация на хост, който показва страница с грешка 404. -This can be useful when your domain is listed in search engines and you want -to provide a nicer error page or specifically to tell the search indexers that -the domain pages no longer exist. +Това може да е полезно, когато вашият домейн е индексиран в търсачките и искате +да предоставите по-приятна страница за грешка или да уведомите индексиращите системи, +че страниците на домейна вече не съществуват. -Another benefit of having this host is to track the logs for hits to it and -view the referrers. +Допълнително предимство на този хост е възможността да проследявате логовете на заявките +към него и да виждате реферерите. diff --git a/frontend/src/locale/src/HelpDoc/bg/ProxyHosts.md b/frontend/src/locale/src/HelpDoc/bg/ProxyHosts.md index e9630d05..ef82c393 100644 --- a/frontend/src/locale/src/HelpDoc/bg/ProxyHosts.md +++ b/frontend/src/locale/src/HelpDoc/bg/ProxyHosts.md @@ -1,7 +1,7 @@ -## What is a Proxy Host? +## Какво представлява Прокси хост? -A Proxy Host is the incoming endpoint for a web service that you want to forward. +Прокси хост е входна точка за уеб услуга, която искате да препращате. -It provides optional SSL termination for your service that might not have SSL support built in. +Той предоставя възможност за SSL терминaция на услуга, която може да няма вградена поддръжка на SSL. -Proxy Hosts are the most common use for the Nginx Proxy Manager. +Прокси хостовете са най-често използваната функция в Nginx Proxy Manager. diff --git a/frontend/src/locale/src/HelpDoc/bg/RedirectionHosts.md b/frontend/src/locale/src/HelpDoc/bg/RedirectionHosts.md index e57b1b80..06890dc6 100644 --- a/frontend/src/locale/src/HelpDoc/bg/RedirectionHosts.md +++ b/frontend/src/locale/src/HelpDoc/bg/RedirectionHosts.md @@ -1,7 +1,7 @@ -## What is a Redirection Host? +## Какво представлява Хост за пренасочване? -A Redirection Host will redirect requests from the incoming domain and push the -viewer to another domain. +Хостът за пренасочване пренасочва заявките от входящия домейн и прехвърля +потребителя към друг домейн. -The most common reason to use this type of host is when your website changes -domains but you still have search engine or referrer links pointing to the old domain. +Най-честата причина за използване на този тип хост е, когато вашият уебсайт +промени домейна си, но все още има линкове от търсачки или реферери, които сочат към стария домейн. diff --git a/frontend/src/locale/src/HelpDoc/bg/Streams.md b/frontend/src/locale/src/HelpDoc/bg/Streams.md index 358f3e5a..4beb381d 100644 --- a/frontend/src/locale/src/HelpDoc/bg/Streams.md +++ b/frontend/src/locale/src/HelpDoc/bg/Streams.md @@ -1,6 +1,6 @@ -## What is a Stream? +## Какво представлява Потокът (Stream)? -A relatively new feature for Nginx, a Stream will serve to forward TCP/UDP -traffic directly to another computer on the network. +Относително нова функция за Nginx, Потокът позволява препращане на TCP/UDP +трафик директно към друг компютър в мрежата. -If you're running game servers, FTP or SSH servers this can come in handy. +Това е полезно, ако хоствате игрови сървъри, FTP или SSH сървъри. diff --git a/frontend/src/locale/src/bg.json b/frontend/src/locale/src/bg.json index 355d0db7..274eca1f 100644 --- a/frontend/src/locale/src/bg.json +++ b/frontend/src/locale/src/bg.json @@ -1,624 +1,624 @@ { "access-list": { - "defaultMessage": "Access List" + "defaultMessage": "Списък за достъп" }, "access-list.access-count": { - "defaultMessage": "{count} {count, plural, one {Rule} other {Rules}}" + "defaultMessage": "{count} {count, plural, one {правило} other {правила}}" }, "access-list.auth-count": { - "defaultMessage": "{count} {count, plural, one {User} other {Users}}" + "defaultMessage": "{count} {count, plural, one {потребител} other {потребители}}" }, "access-list.help-rules-last": { - "defaultMessage": "When at least 1 rule exists, this deny all rule will be added last" + "defaultMessage": "Когато съществува поне 1 правило, това правило за отказ се добавя последно" }, "access-list.help.rules-order": { - "defaultMessage": "Note that the allow and deny directives will be applied in the order they are defined." + "defaultMessage": "Обърнете внимание, че правилата Позволяване и Отказване се прилагат в реда, в който са зададени." }, "access-list.pass-auth": { - "defaultMessage": "Pass Auth to Upstream" + "defaultMessage": "Предаване на автентикация към Upstream" }, "access-list.public": { - "defaultMessage": "Publicly Accessible" + "defaultMessage": "Публичен достъп" }, "access-list.public.subtitle": { - "defaultMessage": "No basic auth required" + "defaultMessage": "Без базова автентикация" }, "access-list.rule-source.placeholder": { - "defaultMessage": "192.168.1.100 or 192.168.1.0/24 or 2001:0db8::/32" + "defaultMessage": "192.168.1.100 или 192.168.1.0/24 или 2001:0db8::/32" }, "access-list.satisfy-any": { - "defaultMessage": "Satisfy Any" + "defaultMessage": "Удовлетворяване на което и да е" }, "access-list.subtitle": { - "defaultMessage": "{users} {users, plural, one {User} other {Users}}, {rules} {rules, plural, one {Rule} other {Rules}} - Created: {date}" + "defaultMessage": "{users} {users, plural, one {потребител} other {потребители}}, {rules} {rules, plural, one {правило} other {правила}} - Създадено: {date}" }, "access-lists": { - "defaultMessage": "Access Lists" + "defaultMessage": "Списъци за достъп" }, "action.add": { - "defaultMessage": "Add" + "defaultMessage": "Добавяне" }, "action.add-location": { - "defaultMessage": "Add Location" + "defaultMessage": "Добавяне на маршрут" }, "action.allow": { - "defaultMessage": "Allow" + "defaultMessage": "Разрешаване" }, "action.close": { - "defaultMessage": "Close" + "defaultMessage": "Затваряне" }, "action.delete": { - "defaultMessage": "Delete" + "defaultMessage": "Изтриване" }, "action.deny": { - "defaultMessage": "Deny" + "defaultMessage": "Отказване" }, "action.disable": { - "defaultMessage": "Disable" + "defaultMessage": "Деактивиране" }, "action.download": { - "defaultMessage": "Download" + "defaultMessage": "Изтегляне" }, "action.edit": { - "defaultMessage": "Edit" + "defaultMessage": "Редактиране" }, "action.enable": { - "defaultMessage": "Enable" + "defaultMessage": "Активиране" }, "action.permissions": { - "defaultMessage": "Permissions" + "defaultMessage": "Права" }, "action.renew": { - "defaultMessage": "Renew" + "defaultMessage": "Подновяване" }, "action.view-details": { - "defaultMessage": "View Details" + "defaultMessage": "Преглед на детайли" }, "auditlogs": { - "defaultMessage": "Audit Logs" + "defaultMessage": "Журнали за одит" }, "auto": { - "defaultMessage": "Auto" + "defaultMessage": "Автоматично" }, "cancel": { - "defaultMessage": "Cancel" + "defaultMessage": "Отказ" }, "certificate": { - "defaultMessage": "Certificate" + "defaultMessage": "Сертификат" }, "certificate.custom-certificate": { - "defaultMessage": "Certificate" + "defaultMessage": "Сертификат" }, "certificate.custom-certificate-key": { - "defaultMessage": "Certificate Key" + "defaultMessage": "Ключ на сертификата" }, "certificate.custom-intermediate": { - "defaultMessage": "Intermediate Certificate" + "defaultMessage": "Междинен сертификат" }, "certificate.in-use": { - "defaultMessage": "In Use" + "defaultMessage": "Използва се" }, "certificate.none.subtitle": { - "defaultMessage": "No certificate assigned" + "defaultMessage": "Не е назначен сертификат" }, "certificate.none.subtitle.for-http": { - "defaultMessage": "This host will not use HTTPS" + "defaultMessage": "Този хост няма да използва HTTPS" }, "certificate.none.title": { - "defaultMessage": "None" + "defaultMessage": "Без сертификат" }, "certificate.not-in-use": { - "defaultMessage": "Not Used" + "defaultMessage": "Не се използва" }, "certificate.renew": { - "defaultMessage": "Renew Certificate" + "defaultMessage": "Подновяване на сертификат" }, "certificates": { - "defaultMessage": "Certificates" + "defaultMessage": "Сертификати" }, "certificates.custom": { - "defaultMessage": "Custom Certificate" + "defaultMessage": "Потребителски сертификат" }, "certificates.custom.warning": { - "defaultMessage": "Key files protected with a passphrase are not supported." + "defaultMessage": "Ключове, защитени с парола, не се поддържат." }, "certificates.dns.credentials": { - "defaultMessage": "Credentials File Content" + "defaultMessage": "Съдържание на файл с удостоверения" }, "certificates.dns.credentials-note": { - "defaultMessage": "This plugin requires a configuration file containing an API token or other credentials for your provider" + "defaultMessage": "Този плъгин изисква конфигурационен файл с API токен или други идентификационни данни." }, "certificates.dns.credentials-warning": { - "defaultMessage": "This data will be stored as plaintext in the database and in a file!" + "defaultMessage": "Тези данни ще бъдат съхранени като обикновен текст в базата и във файл!" }, "certificates.dns.propagation-seconds": { - "defaultMessage": "Propagation Seconds" + "defaultMessage": "Секунди за разпространение" }, "certificates.dns.propagation-seconds-note": { - "defaultMessage": "Leave empty to use the plugins default value. Number of seconds to wait for DNS propagation." + "defaultMessage": "Оставете празно, за да се използва стойността по подразбиране. Брой секунди за изчакване на DNS разпространение." }, "certificates.dns.provider": { - "defaultMessage": "DNS Provider" + "defaultMessage": "DNS доставчик" }, "certificates.dns.provider.placeholder": { - "defaultMessage": "Select a Provider..." + "defaultMessage": "Изберете доставчик..." }, "certificates.dns.warning": { - "defaultMessage": "This section requires some knowledge about Certbot and its DNS plugins. Please consult the respective plugins documentation." + "defaultMessage": "Този раздел изисква познания за Certbot и неговите DNS плъгини. Моля, консултирайте се с документацията." }, "certificates.http.reachability-404": { - "defaultMessage": "There is a server found at this domain but it does not seem to be Nginx Proxy Manager. Please make sure your domain points to the IP where your NPM instance is running." + "defaultMessage": "Сървър е намерен на този домейн, но не изглежда да е Nginx Proxy Manager. Уверете се, че домейнът сочи към IP адреса, където работи NPM." }, "certificates.http.reachability-failed-to-check": { - "defaultMessage": "Failed to check the reachability due to a communication error with site24x7.com." + "defaultMessage": "Неуспешна проверка поради грешка в комуникацията със site24x7.com." }, "certificates.http.reachability-not-resolved": { - "defaultMessage": "There is no server available at this domain. Please make sure your domain exists and points to the IP where your NPM instance is running and if necessary port 80 is forwarded in your router." + "defaultMessage": "Няма достъпен сървър на този домейн. Проверете, че домейнът съществува и сочи към IP-та, където се изпълнява NPM, и ако е необходимо, че порт 80 е пренасочен." }, "certificates.http.reachability-ok": { - "defaultMessage": "Your server is reachable and creating certificates should be possible." + "defaultMessage": "Вашият сървър е достъпен и създаването на сертификати е възможно." }, "certificates.http.reachability-other": { - "defaultMessage": "There is a server found at this domain but it returned an unexpected status code {code}. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running." + "defaultMessage": "Намерен е сървър, но върна неочакван код {code}. Това NPM ли е? Уверете се, че домейнът сочи към вашия NPM сървър." }, "certificates.http.reachability-wrong-data": { - "defaultMessage": "There is a server found at this domain but it returned an unexpected data. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running." + "defaultMessage": "Намерен е сървър, но върна неочаквани данни. Това NPM ли е? Уверете се, че домейнът сочи към вашия NPM сървър." }, "certificates.http.test-results": { - "defaultMessage": "Test Results" + "defaultMessage": "Резултати от теста" }, "certificates.http.warning": { - "defaultMessage": "These domains must be already configured to point to this installation." + "defaultMessage": "Тези домейни трябва вече да сочат към тази инсталация." }, "certificates.request.subtitle": { - "defaultMessage": "with Let's Encrypt" + "defaultMessage": "с Let's Encrypt" }, "certificates.request.title": { - "defaultMessage": "Request a new Certificate" + "defaultMessage": "Заявка за нов сертификат" }, "column.access": { - "defaultMessage": "Access" + "defaultMessage": "Достъп" }, "column.authorization": { - "defaultMessage": "Authorization" + "defaultMessage": "Автентикация" }, "column.authorizations": { - "defaultMessage": "Authorizations" + "defaultMessage": "Автентикации" }, "column.custom-locations": { - "defaultMessage": "Custom Locations" + "defaultMessage": "Персонализирани маршрути" }, "column.destination": { - "defaultMessage": "Destination" + "defaultMessage": "Дестинация" }, "column.details": { - "defaultMessage": "Details" + "defaultMessage": "Детайли" }, "column.email": { - "defaultMessage": "Email" + "defaultMessage": "Имейл" }, "column.event": { - "defaultMessage": "Event" + "defaultMessage": "Събитие" }, "column.expires": { - "defaultMessage": "Expires" + "defaultMessage": "Изтича" }, "column.http-code": { - "defaultMessage": "HTTP Code" + "defaultMessage": "HTTP код" }, "column.incoming-port": { - "defaultMessage": "Incoming Port" + "defaultMessage": "Входящ порт" }, "column.name": { - "defaultMessage": "Name" + "defaultMessage": "Име" }, "column.protocol": { - "defaultMessage": "Protocol" + "defaultMessage": "Протокол" }, "column.provider": { - "defaultMessage": "Provider" + "defaultMessage": "Доставчик" }, "column.roles": { - "defaultMessage": "Roles" + "defaultMessage": "Роли" }, "column.rules": { - "defaultMessage": "Rules" + "defaultMessage": "Правила" }, "column.satisfy": { - "defaultMessage": "Satisfy" + "defaultMessage": "Удовлетворяване" }, "column.satisfy-all": { - "defaultMessage": "All" + "defaultMessage": "Всички" }, "column.satisfy-any": { - "defaultMessage": "Any" + "defaultMessage": "Кое и да е" }, "column.scheme": { - "defaultMessage": "Scheme" + "defaultMessage": "Схема" }, "column.source": { - "defaultMessage": "Source" + "defaultMessage": "Източник" }, "column.ssl": { "defaultMessage": "SSL" }, "column.status": { - "defaultMessage": "Status" + "defaultMessage": "Статус" }, "created-on": { - "defaultMessage": "Created: {date}" + "defaultMessage": "Създадено: {date}" }, "dashboard": { - "defaultMessage": "Dashboard" + "defaultMessage": "Табло" }, "dead-host": { - "defaultMessage": "404 Host" + "defaultMessage": "404 хост" }, "dead-hosts": { - "defaultMessage": "404 Hosts" + "defaultMessage": "404 хостове" }, "dead-hosts.count": { - "defaultMessage": "{count} {count, plural, one {404 Host} other {404 Hosts}}" + "defaultMessage": "{count} {count, plural, one {404 хост} other {404 хостове}}" }, "disabled": { - "defaultMessage": "Disabled" + "defaultMessage": "Деактивиран" }, "domain-names": { - "defaultMessage": "Domain Names" + "defaultMessage": "Домейн имена" }, "domain-names.max": { - "defaultMessage": "{count} domain names maximum" + "defaultMessage": "Максимум {count} домейна" }, "domain-names.placeholder": { - "defaultMessage": "Start typing to add domain..." + "defaultMessage": "Започнете да въвеждате, за да добавите домейн..." }, "domain-names.wildcards-not-permitted": { - "defaultMessage": "Wildcards not permitted for this type" + "defaultMessage": "Wildcard не е разрешен за този тип" }, "domain-names.wildcards-not-supported": { - "defaultMessage": "Wildcards not supported for this CA" + "defaultMessage": "Wildcard не се поддържа от това CA" }, "domains.force-ssl": { - "defaultMessage": "Force SSL" + "defaultMessage": "Принудително SSL" }, "domains.hsts-enabled": { - "defaultMessage": "HSTS Enabled" + "defaultMessage": "HSTS активирано" }, "domains.hsts-subdomains": { - "defaultMessage": "HSTS Sub-domains" + "defaultMessage": "HSTS за поддомейни" }, "domains.http2-support": { - "defaultMessage": "HTTP/2 Support" + "defaultMessage": "Поддръжка на HTTP/2" }, "domains.use-dns": { - "defaultMessage": "Use DNS Challenge" + "defaultMessage": "Използване на DNS Challenge" }, "email-address": { - "defaultMessage": "Email address" + "defaultMessage": "Имейл адрес" }, "empty-search": { - "defaultMessage": "No results found" + "defaultMessage": "Няма резултати" }, "empty-subtitle": { - "defaultMessage": "Why don't you create one?" + "defaultMessage": "Защо не създадете един?" }, "enabled": { - "defaultMessage": "Enabled" + "defaultMessage": "Активиран" }, "error.access.at-least-one": { - "defaultMessage": "Either one Authorization or one Access Rule is required" + "defaultMessage": "Необходимо е поне една Автентикация или едно Правило за достъп" }, "error.access.duplicate-usernames": { - "defaultMessage": "Authorization Usernames must be unique" + "defaultMessage": "Потребителските имена за достъп трябва да са уникални" }, "error.invalid-auth": { - "defaultMessage": "Invalid email or password" + "defaultMessage": "Невалиден имейл или парола" }, "error.invalid-domain": { - "defaultMessage": "Invalid domain: {domain}" + "defaultMessage": "Невалиден домейн: {domain}" }, "error.invalid-email": { - "defaultMessage": "Invalid email address" + "defaultMessage": "Невалиден имейл адрес" }, "error.max-character-length": { - "defaultMessage": "Maximum length is {max} character{max, plural, one {} other {s}}" + "defaultMessage": "Максималната дължина е {max} знак{max, plural, one {} other {а}}" }, "error.max-domains": { - "defaultMessage": "Too many domains, max is {max}" + "defaultMessage": "Твърде много домейни, максимум {max}" }, "error.maximum": { - "defaultMessage": "Maximum is {max}" + "defaultMessage": "Максимум {max}" }, "error.min-character-length": { - "defaultMessage": "Minimum length is {min} character{min, plural, one {} other {s}}" + "defaultMessage": "Минималната дължина е {min} знак{min, plural, one {} other {а}}" }, "error.minimum": { - "defaultMessage": "Minimum is {min}" + "defaultMessage": "Минимум e {min}" }, "error.passwords-must-match": { - "defaultMessage": "Passwords must match" + "defaultMessage": "Паролите трябва да съвпадат" }, "error.required": { - "defaultMessage": "This is required" + "defaultMessage": "Това поле е задължително" }, "expires.on": { - "defaultMessage": "Expires: {date}" + "defaultMessage": "Изтича: {date}" }, "footer.github-fork": { - "defaultMessage": "Fork me on Github" + "defaultMessage": "Fork в GitHub" }, "host.flags.block-exploits": { - "defaultMessage": "Block Common Exploits" + "defaultMessage": "Блокиране на често срещани експлойти" }, "host.flags.cache-assets": { - "defaultMessage": "Cache Assets" + "defaultMessage": "Кеширане на ресурси" }, "host.flags.preserve-path": { - "defaultMessage": "Preserve Path" + "defaultMessage": "Запазване на пътя" }, "host.flags.protocols": { - "defaultMessage": "Protocols" + "defaultMessage": "Протоколи" }, "host.flags.websockets-upgrade": { - "defaultMessage": "Websockets Support" + "defaultMessage": "Поддръжка на WebSockets" }, "host.forward-port": { - "defaultMessage": "Forward Port" + "defaultMessage": "Препращане на порт" }, "host.forward-scheme": { - "defaultMessage": "Scheme" + "defaultMessage": "Схема" }, "hosts": { - "defaultMessage": "Hosts" + "defaultMessage": "Хостове" }, "http-only": { - "defaultMessage": "HTTP Only" + "defaultMessage": "Само HTTP" }, "lets-encrypt": { "defaultMessage": "Let's Encrypt" }, "lets-encrypt-via-dns": { - "defaultMessage": "Let's Encrypt via DNS" + "defaultMessage": "Let's Encrypt чрез DNS" }, "lets-encrypt-via-http": { - "defaultMessage": "Let's Encrypt via HTTP" + "defaultMessage": "Let's Encrypt чрез HTTP" }, "loading": { - "defaultMessage": "Loading…" + "defaultMessage": "Зареждане…" }, "login.title": { - "defaultMessage": "Login to your account" + "defaultMessage": "Вход в акаунта" }, "nginx-config.label": { - "defaultMessage": "Custom Nginx Configuration" + "defaultMessage": "Персонализирана Nginx конфигурация" }, "nginx-config.placeholder": { - "defaultMessage": "# Enter your custom Nginx configuration here at your own risk!" + "defaultMessage": "# Въведете вашата персонализирана Nginx конфигурация на собствен риск!" }, "no-permission-error": { - "defaultMessage": "You do not have access to view this." + "defaultMessage": "Нямате достъп до тази страница." }, "notfound.action": { - "defaultMessage": "Take me home" + "defaultMessage": "Към началната страница" }, "notfound.content": { - "defaultMessage": "We are sorry but the page you are looking for was not found" + "defaultMessage": "Страницата, която търсите, не беше намерена" }, "notfound.title": { - "defaultMessage": "Oops… You just found an error page" + "defaultMessage": "Упс… Намерихте грешка" }, "notification.error": { - "defaultMessage": "Error" + "defaultMessage": "Грешка" }, "notification.object-deleted": { - "defaultMessage": "{object} has been deleted" + "defaultMessage": "{object} беше изтрит" }, "notification.object-disabled": { - "defaultMessage": "{object} has been disabled" + "defaultMessage": "{object} беше деактивиран" }, "notification.object-enabled": { - "defaultMessage": "{object} has been enabled" + "defaultMessage": "{object} беше активиран" }, "notification.object-renewed": { - "defaultMessage": "{object} has been renewed" + "defaultMessage": "{object} беше подновен" }, "notification.object-saved": { - "defaultMessage": "{object} has been saved" + "defaultMessage": "{object} беше запазен" }, "notification.success": { - "defaultMessage": "Success" + "defaultMessage": "Успех" }, "object.actions-title": { - "defaultMessage": "{object} #{id}" + "defaultMessage": "{object} №{id}" }, "object.add": { - "defaultMessage": "Add {object}" + "defaultMessage": "Добавяне: {object}" }, "object.delete": { - "defaultMessage": "Delete {object}" + "defaultMessage": "Изтриване: {object}" }, "object.delete.content": { - "defaultMessage": "Are you sure you want to delete this {object}?" + "defaultMessage": "Сигурни ли сте, че искате да изтриете {object}?" }, "object.edit": { - "defaultMessage": "Edit {object}" + "defaultMessage": "Редактиране: {object}" }, "object.empty": { - "defaultMessage": "There are no {objects}" + "defaultMessage": "Няма налични {objects}" }, "object.event.created": { - "defaultMessage": "Created {object}" + "defaultMessage": "Създаден {object}" }, "object.event.deleted": { - "defaultMessage": "Deleted {object}" + "defaultMessage": "Изтрит {object}" }, "object.event.disabled": { - "defaultMessage": "Disabled {object}" + "defaultMessage": "Деактивиран {object}" }, "object.event.enabled": { - "defaultMessage": "Enabled {object}" + "defaultMessage": "Активиран {object}" }, "object.event.renewed": { - "defaultMessage": "Renewed {object}" + "defaultMessage": "Подновен {object}" }, "object.event.updated": { - "defaultMessage": "Updated {object}" + "defaultMessage": "Актуализиран {object}" }, "offline": { - "defaultMessage": "Offline" + "defaultMessage": "Офлайн" }, "online": { - "defaultMessage": "Online" + "defaultMessage": "Онлайн" }, "options": { - "defaultMessage": "Options" + "defaultMessage": "Опции" }, "password": { - "defaultMessage": "Password" + "defaultMessage": "Парола" }, "password.generate": { - "defaultMessage": "Generate random password" + "defaultMessage": "Генериране на случайна парола" }, "password.hide": { - "defaultMessage": "Hide Password" + "defaultMessage": "Скриване на паролата" }, "password.show": { - "defaultMessage": "Show Password" + "defaultMessage": "Показване на паролата" }, "permissions.hidden": { - "defaultMessage": "Hidden" + "defaultMessage": "Скрито" }, "permissions.manage": { - "defaultMessage": "Manage" + "defaultMessage": "Управление" }, "permissions.view": { - "defaultMessage": "View Only" + "defaultMessage": "Само преглед" }, "permissions.visibility.all": { - "defaultMessage": "All Items" + "defaultMessage": "Всички елементи" }, "permissions.visibility.title": { - "defaultMessage": "Item Visibility" + "defaultMessage": "Видимост на елементите" }, "permissions.visibility.user": { - "defaultMessage": "Created Items Only" + "defaultMessage": "Само създадените от потребителя" }, "proxy-host": { - "defaultMessage": "Proxy Host" + "defaultMessage": "Прокси хост" }, "proxy-host.forward-host": { - "defaultMessage": "Forward Hostname / IP" + "defaultMessage": "Хост/IP за препращане" }, "proxy-hosts": { - "defaultMessage": "Proxy Hosts" + "defaultMessage": "Прокси хостове" }, "proxy-hosts.count": { - "defaultMessage": "{count} {count, plural, one {Proxy Host} other {Proxy Hosts}}" + "defaultMessage": "{count} {count, plural, one {прокси хост} other {прокси хостове}}" }, "public": { - "defaultMessage": "Public" + "defaultMessage": "Публичен" }, "redirection-host": { - "defaultMessage": "Redirection Host" + "defaultMessage": "Хост за пренасочване" }, "redirection-host.forward-domain": { - "defaultMessage": "Forward Domain" + "defaultMessage": "Домейн за пренасочване" }, "redirection-host.forward-http-code": { - "defaultMessage": "HTTP Code" + "defaultMessage": "HTTP код" }, "redirection-hosts": { - "defaultMessage": "Redirection Hosts" + "defaultMessage": "Хостове за пренасочване" }, "redirection-hosts.count": { - "defaultMessage": "{count} {count, plural, one {Redirection Host} other {Redirection Hosts}}" + "defaultMessage": "{count} {count, plural, one {хост за пренасочване} other {хостове за пренасочване}}" }, "redirection-hosts.http-code.300": { "defaultMessage": "300 Multiple Choices" }, "redirection-hosts.http-code.301": { - "defaultMessage": "301 Moved permanently" + "defaultMessage": "301 Преместено постоянно" }, "redirection-hosts.http-code.302": { - "defaultMessage": "302 Moved temporarily" + "defaultMessage": "302 Преместено временно" }, "redirection-hosts.http-code.303": { "defaultMessage": "303 See other" }, "redirection-hosts.http-code.307": { - "defaultMessage": "307 Temporary redirect" + "defaultMessage": "307 Временно пренасочване" }, "redirection-hosts.http-code.308": { - "defaultMessage": "308 Permanent redirect" + "defaultMessage": "308 Постоянно пренасочване" }, "role.admin": { - "defaultMessage": "Administrator" + "defaultMessage": "Администратор" }, "role.standard-user": { - "defaultMessage": "Standard User" + "defaultMessage": "Обикновен потребител" }, "save": { - "defaultMessage": "Save" + "defaultMessage": "Запазване" }, "setting": { - "defaultMessage": "Setting" + "defaultMessage": "Настройка" }, "settings": { - "defaultMessage": "Settings" + "defaultMessage": "Настройки" }, "settings.default-site": { - "defaultMessage": "Default Site" + "defaultMessage": "Сайт по подразбиране" }, "settings.default-site.404": { - "defaultMessage": "404 Page" + "defaultMessage": "404 страница" }, "settings.default-site.444": { - "defaultMessage": "No Response (444)" + "defaultMessage": "Без отговор (444)" }, "settings.default-site.congratulations": { - "defaultMessage": "Congratulations Page" + "defaultMessage": "Страница поздравление" }, "settings.default-site.description": { - "defaultMessage": "What to show when Nginx is hit with an unknown Host" + "defaultMessage": "Какво да се показва при заявка към неизвестен хост" }, "settings.default-site.html": { - "defaultMessage": "Custom HTML" + "defaultMessage": "Персонализиран HTML" }, "settings.default-site.html.placeholder": { - "defaultMessage": "" + "defaultMessage": "" }, "settings.default-site.redirect": { - "defaultMessage": "Redirect" + "defaultMessage": "Пренасочване" }, "setup.preamble": { - "defaultMessage": "Get started by creating your admin account." + "defaultMessage": "Започнете, като създадете администраторски акаунт." }, "setup.title": { - "defaultMessage": "Welcome!" + "defaultMessage": "Добре дошли!" }, "sign-in": { - "defaultMessage": "Sign in" + "defaultMessage": "Вход" }, "ssl-certificate": { - "defaultMessage": "SSL Certificate" + "defaultMessage": "SSL сертификат" }, "stream": { - "defaultMessage": "Stream" + "defaultMessage": "Поток" }, "stream.forward-host": { - "defaultMessage": "Forward Host" + "defaultMessage": "Хост за препращане" }, "stream.forward-host.placeholder": { - "defaultMessage": "example.com or 10.0.0.1 or 2001:db8:3333:4444:5555:6666:7777:8888" + "defaultMessage": "example.com или 10.0.0.1 или 2001:db8:3333:4444:5555:6666:7777:8888" }, "stream.incoming-port": { - "defaultMessage": "Incoming Port" + "defaultMessage": "Входящ порт" }, "streams": { - "defaultMessage": "Streams" + "defaultMessage": "Потоци" }, "streams.count": { - "defaultMessage": "{count} {count, plural, one {Stream} other {Streams}}" + "defaultMessage": "{count} {count, plural, one {поток} other {потоци}}" }, "streams.tcp": { "defaultMessage": "TCP" @@ -627,57 +627,57 @@ "defaultMessage": "UDP" }, "test": { - "defaultMessage": "Test" + "defaultMessage": "Тест" }, "update-available": { - "defaultMessage": "Update Available: {latestVersion}" + "defaultMessage": "Налична актуализация: {latestVersion}" }, "user": { - "defaultMessage": "User" + "defaultMessage": "Потребител" }, "user.change-password": { - "defaultMessage": "Change Password" + "defaultMessage": "Смяна на парола" }, "user.confirm-password": { - "defaultMessage": "Confirm Password" + "defaultMessage": "Потвърждение на парола" }, "user.current-password": { - "defaultMessage": "Current Password" + "defaultMessage": "Текуща парола" }, "user.edit-profile": { - "defaultMessage": "Edit Profile" + "defaultMessage": "Редактиране на профил" }, "user.full-name": { - "defaultMessage": "Full Name" + "defaultMessage": "Пълно име" }, "user.login-as": { - "defaultMessage": "Sign in as {name}" + "defaultMessage": "Вход като {name}" }, "user.logout": { - "defaultMessage": "Logout" + "defaultMessage": "Изход" }, "user.new-password": { - "defaultMessage": "New Password" + "defaultMessage": "Нова парола" }, "user.nickname": { - "defaultMessage": "Nickname" + "defaultMessage": "Псевдоним" }, "user.set-password": { - "defaultMessage": "Set Password" + "defaultMessage": "Задаване на парола" }, "user.set-permissions": { - "defaultMessage": "Set Permissions for {name}" + "defaultMessage": "Настройка на права за {name}" }, "user.switch-dark": { - "defaultMessage": "Switch to Dark mode" + "defaultMessage": "Тъмна тема" }, "user.switch-light": { - "defaultMessage": "Switch to Light mode" + "defaultMessage": "Светла тема" }, "username": { - "defaultMessage": "Username" + "defaultMessage": "Потребителско име" }, "users": { - "defaultMessage": "Users" + "defaultMessage": "Потребители" } } From e8ca72fb6a5f12a3c8f90d2995c31bf7ac720431 Mon Sep 17 00:00:00 2001 From: Bare7a Date: Mon, 24 Nov 2025 18:14:16 +0200 Subject: [PATCH 18/55] Adds bg inside HelpDoc index.ts file --- frontend/src/locale/src/HelpDoc/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/locale/src/HelpDoc/index.ts b/frontend/src/locale/src/HelpDoc/index.ts index adb351a3..b7c9f373 100644 --- a/frontend/src/locale/src/HelpDoc/index.ts +++ b/frontend/src/locale/src/HelpDoc/index.ts @@ -8,8 +8,9 @@ import * as ru from "./ru/index"; import * as sk from "./sk/index"; import * as vi from "./vi/index"; import * as zh from "./zh/index"; +import * as bg from "./bg/index"; -const items: any = { en, de, ja, sk, zh, pl, ru, it, vi, nl }; +const items: any = { en, de, ja, sk, zh, pl, ru, it, vi, nl, bg }; const fallbackLang = "en"; From 1c6f54fa3c22b142afaa8c6360430ca3637e5518 Mon Sep 17 00:00:00 2001 From: Bare7a Date: Mon, 24 Nov 2025 18:23:40 +0200 Subject: [PATCH 19/55] Changed the port translation --- frontend/src/locale/src/bg.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/bg.json b/frontend/src/locale/src/bg.json index 274eca1f..81cab598 100644 --- a/frontend/src/locale/src/bg.json +++ b/frontend/src/locale/src/bg.json @@ -363,7 +363,7 @@ "defaultMessage": "Поддръжка на WebSockets" }, "host.forward-port": { - "defaultMessage": "Препращане на порт" + "defaultMessage": "Порт" }, "host.forward-scheme": { "defaultMessage": "Схема" From 4ff402fff457c5a39bbec54414bdb42a3880cb8e Mon Sep 17 00:00:00 2001 From: Bare7a Date: Mon, 24 Nov 2025 18:28:49 +0200 Subject: [PATCH 20/55] Update Locale README.md to include HelpDoc/index.tsx --- frontend/src/locale/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/locale/README.md b/frontend/src/locale/README.md index 0a63cc18..7016cf62 100644 --- a/frontend/src/locale/README.md +++ b/frontend/src/locale/README.md @@ -40,6 +40,7 @@ not be complete by the time you're reading this: - frontend/src/locale/src/[yourlang].json - frontend/src/locale/src/lang-list.json - frontend/src/locale/src/HelpDoc/[yourlang]/* +- frontend/src/locale/src/HelpDoc/index.tsx - frontend/src/locale/IntlProvider.tsx - frontend/check-locales.cjs From 45bc44c6fac39c4504aad074073d02478e32aaae Mon Sep 17 00:00:00 2001 From: Ville Alatalo Date: Tue, 25 Nov 2025 07:46:32 +0200 Subject: [PATCH 21/55] Add Glesys certbot plugin --- backend/certbot/dns-plugins.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend/certbot/dns-plugins.json b/backend/certbot/dns-plugins.json index 102734d2..4eadd078 100644 --- a/backend/certbot/dns-plugins.json +++ b/backend/certbot/dns-plugins.json @@ -255,6 +255,14 @@ "credentials": "dns_gcore_apitoken = 0123456789abcdef0123456789abcdef01234567", "full_plugin_name": "dns-gcore" }, + "glesys": { + "name": "Glesys", + "package_name": "certbot-dns-glesys", + "version": "~=2.1.0", + "dependencies": "", + "credentials": "dns_glesys_user = CL00000\ndns_glesys_password = apikeyvalue", + "full_plugin_name": "dns-glesys" + }, "godaddy": { "name": "GoDaddy", "package_name": "certbot-dns-godaddy", From bf4eab541a936b4468c86f40b908673bd3f5e33d Mon Sep 17 00:00:00 2001 From: abinas <144870133+abinas-hdb@users.noreply.github.com> Date: Wed, 26 Nov 2025 11:57:05 +0900 Subject: [PATCH 22/55] Update index.ts Fix missing 'ko' in index.ts --- frontend/src/locale/src/HelpDoc/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/locale/src/HelpDoc/index.ts b/frontend/src/locale/src/HelpDoc/index.ts index b7c9f373..f70dff69 100644 --- a/frontend/src/locale/src/HelpDoc/index.ts +++ b/frontend/src/locale/src/HelpDoc/index.ts @@ -8,9 +8,10 @@ import * as ru from "./ru/index"; import * as sk from "./sk/index"; import * as vi from "./vi/index"; import * as zh from "./zh/index"; +import * as ko from "./ko/index"; import * as bg from "./bg/index"; -const items: any = { en, de, ja, sk, zh, pl, ru, it, vi, nl, bg }; +const items: any = { en, de, ja, sk, zh, pl, ru, it, vi, nl, bg, ko }; const fallbackLang = "en"; From 8403a0c7610883faa9049e7b895bb064bcc5765c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 26 Nov 2025 10:42:48 +0100 Subject: [PATCH 23/55] changes --- frontend/src/locale/src/pl.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/locale/src/pl.json b/frontend/src/locale/src/pl.json index 2533ebcc..afbc61df 100644 --- a/frontend/src/locale/src/pl.json +++ b/frontend/src/locale/src/pl.json @@ -6,7 +6,7 @@ "defaultMessage": "{count} {count, plural, one {Reguła} few {Reguły} other {Reguł}}" }, "access-list.auth-count": { - "defaultMessage": "{count} {count, plural, one {Użytkownik} few {Użytkowników} other {Użytkowników}}" + "defaultMessage": "{count} {count, plural, one {Użytkownik} few {Użytkownicy} other {Użytkowników}}" }, "access-list.help-rules-last": { "defaultMessage": "Gdy istnieje co najmniej 1 reguła, ta reguła blokująca wszystko zostanie dodana na końcu" @@ -504,7 +504,7 @@ "defaultMessage": "Proxy" }, "proxy-hosts.count": { - "defaultMessage": "{count} {count, plural, one {host proxy} few {hosty proxy} other {hostów proxy}}" + "defaultMessage": "{count} {count, plural, one {host proxy} few {hosty proxy} many {hostów proxy} other {hostów proxy}}" }, "public": { "defaultMessage": "Publiczne" @@ -522,7 +522,7 @@ "defaultMessage": "Przekierowania" }, "redirection-hosts.count": { - "defaultMessage": "{count} {count, plural, one {przekierowanie} few {przekierowań} other {przekierowań}}" + "defaultMessage": "{count} {count, plural, one {przekierowanie} few {przekierowania} many {przekierowań} other {przekierowań}}" }, "role.admin": { "defaultMessage": "Administrator" @@ -588,7 +588,7 @@ "defaultMessage": "Strumienie" }, "streams.count": { - "defaultMessage": "{count} {count, plural, one {strumień} few {strumienie} other {strumieni}}" + "defaultMessage": "{count} {count, plural, one {strumień} few {strumienie} many {strumieni} other {strumieni}}" }, "streams.tcp": { "defaultMessage": "TCP" From 2c9f8f4d64339f72f163535d6c623548577ea7de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 26 Nov 2025 10:50:41 +0100 Subject: [PATCH 24/55] changes --- frontend/src/locale/src/pl.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/locale/src/pl.json b/frontend/src/locale/src/pl.json index afbc61df..058ce266 100644 --- a/frontend/src/locale/src/pl.json +++ b/frontend/src/locale/src/pl.json @@ -342,7 +342,7 @@ "defaultMessage": "Blokuj typowe exploity" }, "host.flags.cache-assets": { - "defaultMessage": "Buforuj(cache) zasoby statyczne" + "defaultMessage": "Buforuj zasoby statyczne (ang. cache)" }, "host.flags.preserve-path": { "defaultMessage": "Zachowaj ścieżkę" @@ -354,7 +354,7 @@ "defaultMessage": "Obsługa WebSockets" }, "host.forward-port": { - "defaultMessage": "Port przekierowania" + "defaultMessage": "Port docelowy" }, "host.forward-scheme": { "defaultMessage": "Schemat" From 168078eb406e6d524e74e6899762743d301e191e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 26 Nov 2025 10:54:30 +0100 Subject: [PATCH 25/55] changes --- frontend/src/locale/src/pl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/pl.json b/frontend/src/locale/src/pl.json index 058ce266..3af07f48 100644 --- a/frontend/src/locale/src/pl.json +++ b/frontend/src/locale/src/pl.json @@ -273,7 +273,7 @@ "defaultMessage": "Wymuś SSL" }, "domains.hsts-enabled": { - "defaultMessage": "HSTS włączone" + "defaultMessage": "Włącz HSTS " }, "domains.hsts-subdomains": { "defaultMessage": "HSTS dla subdomen" From fec8b3b083e825526ff35b1cda60584d983d4439 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Tue, 2 Dec 2025 07:09:54 +1000 Subject: [PATCH 26/55] Show full swagger validation errors in tests --- test/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/package.json b/test/package.json index 7af42dff..7e882e6d 100644 --- a/test/package.json +++ b/test/package.json @@ -24,7 +24,7 @@ "cypress": "HTTP_PROXY=127.0.0.1:8128 HTTPS_PROXY=127.0.0.1:8128 cypress open --config-file=cypress/config/ci.js", "cypress:headless": "HTTP_PROXY=127.0.0.1:8128 HTTPS_PROXY=127.0.0.1:8128 cypress run --config-file=cypress/config/ci.js", "cypress:dev": "cypress run --config-file=cypress/config/dev.js", - "swagger-lint": "vacuum lint -b -q -d -a -n=warn" + "swagger-lint": "vacuum lint -b -q -d -a --no-clip -n=warn" }, "author": "", "license": "ISC" From 073ee95e569cfe39ecee6e1d9401014fc4801700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Tue, 2 Dec 2025 12:57:09 +0100 Subject: [PATCH 27/55] change --- frontend/src/locale/src/pl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/pl.json b/frontend/src/locale/src/pl.json index 3af07f48..03ec5be8 100644 --- a/frontend/src/locale/src/pl.json +++ b/frontend/src/locale/src/pl.json @@ -159,7 +159,7 @@ "defaultMessage": "Wyniki testu" }, "certificates.http.warning": { - "defaultMessage": "Te domeny muszą być już skonfigurowane tak, aby wskazywały na ten serwer www" + "defaultMessage": "Te domeny muszą być już skonfigurowane tak, aby wskazywały na ten serwer" }, "certificates.request.subtitle": { "defaultMessage": "z Let's Encrypt" From 4abea1247d6787397c8755b0a5a671e09b24f0d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 16:58:07 +0000 Subject: [PATCH 28/55] Bump jws from 3.2.2 to 3.2.3 in /backend Bumps [jws](https://github.com/brianloveswords/node-jws) from 3.2.2 to 3.2.3. - [Release notes](https://github.com/brianloveswords/node-jws/releases) - [Changelog](https://github.com/auth0/node-jws/blob/master/CHANGELOG.md) - [Commits](https://github.com/brianloveswords/node-jws/compare/v3.2.2...v3.2.3) --- updated-dependencies: - dependency-name: jws dependency-version: 3.2.3 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- backend/yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/yarn.lock b/backend/yarn.lock index b6f7a948..66e333b3 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -1462,7 +1462,7 @@ jsonwebtoken@^9.0.2: ms "^2.1.1" semver "^7.5.4" -jwa@^1.4.1: +jwa@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.2.tgz#16011ac6db48de7b102777e57897901520eec7b9" integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw== @@ -1472,11 +1472,11 @@ jwa@^1.4.1: safe-buffer "^5.0.1" jws@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" - integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + version "3.2.3" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.3.tgz#5ac0690b460900a27265de24520526853c0b8ca1" + integrity sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g== dependencies: - jwa "^1.4.1" + jwa "^1.4.2" safe-buffer "^5.0.1" knex@2.4.2: From 1b8f1fbb79740f253320978ef15522785a58c838 Mon Sep 17 00:00:00 2001 From: CamelT0E <59985723+CamelT0E@users.noreply.github.com> Date: Sat, 6 Dec 2025 01:30:56 +0100 Subject: [PATCH 29/55] Update German locale message from 'German' to 'Deutsch' --- frontend/src/locale/src/lang-list.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/lang-list.json b/frontend/src/locale/src/lang-list.json index 520eef24..3e596c2e 100755 --- a/frontend/src/locale/src/lang-list.json +++ b/frontend/src/locale/src/lang-list.json @@ -6,7 +6,7 @@ "defaultMessage": "Español" }, "locale-de-DE": { - "defaultMessage": "German" + "defaultMessage": "Deutsch" }, "locale-ja-JP": { "defaultMessage": "日本語" From 6b322582b9d74d96187915c7c9d8c9ce405af7c6 Mon Sep 17 00:00:00 2001 From: dupsatou Date: Mon, 8 Dec 2025 09:45:11 -0600 Subject: [PATCH 30/55] Add Hurricane Electric DDNS plugin configuration Add support for dns verification using Hurricane Electric DDNS credentials as a more secure way over account root credentials. More information available here: https://github.com/mafredri/certbot-dns-he-ddns --- backend/certbot/dns-plugins.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend/certbot/dns-plugins.json b/backend/certbot/dns-plugins.json index 4eadd078..fa0afbb3 100644 --- a/backend/certbot/dns-plugins.json +++ b/backend/certbot/dns-plugins.json @@ -295,6 +295,14 @@ "credentials": "dns_he_user = Me\ndns_he_pass = my HE password", "full_plugin_name": "dns-he" }, + "he-ddns": { + "name": "Hurricane Electric - DDNS", + "package_name": "certbot-dns-he-ddns", + "version": "~=0.1.0", + "dependencies": "", + "credentials": "dns_he_ddns_password = verysecurepassword", + "full_plugin_name": "dns-he-ddns" + }, "hetzner": { "name": "Hetzner", "package_name": "certbot-dns-hetzner", From b13ebb2247b068ce1c6d103cf8cfd991cec58797 Mon Sep 17 00:00:00 2001 From: Hajime MIZUNO Date: Wed, 10 Dec 2025 23:28:53 +0900 Subject: [PATCH 31/55] Fix Japanese translate --- frontend/src/locale/src/ja.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/ja.json b/frontend/src/locale/src/ja.json index 1ace1c64..c61bee18 100644 --- a/frontend/src/locale/src/ja.json +++ b/frontend/src/locale/src/ja.json @@ -570,7 +570,7 @@ "defaultMessage": "ストリーム" }, "stream.forward-host": { - "defaultMessage": "転送ポート" + "defaultMessage": "転送ホスト" }, "stream.incoming-port": { "defaultMessage": "受信ポート" From da519e72ba4da5d6760b2fba13a874a686f264e5 Mon Sep 17 00:00:00 2001 From: bzuro Date: Sun, 14 Dec 2025 00:35:22 +0100 Subject: [PATCH 32/55] Change visibility to permission_visibility in report.js fix for issue #2014 when even administrator with all_items visibility got 0 proxy hosts in dashboard. --- backend/internal/report.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/internal/report.js b/backend/internal/report.js index 8bad7ec2..59f13fe6 100644 --- a/backend/internal/report.js +++ b/backend/internal/report.js @@ -15,10 +15,10 @@ const internalReport = { const userId = access.token.getUserId(1); const promises = [ - internalProxyHost.getCount(userId, access_data.visibility), - internalRedirectionHost.getCount(userId, access_data.visibility), - internalStream.getCount(userId, access_data.visibility), - internalDeadHost.getCount(userId, access_data.visibility), + internalProxyHost.getCount(userId, access_data.permission_visibility), + internalRedirectionHost.getCount(userId, access_data.permission_visibility), + internalStream.getCount(userId, access_data.permission_visibility), + internalDeadHost.getCount(userId, access_data.permission_visibility), ]; return Promise.all(promises); From 5e6ead1eeecf0c175ff37bfd4578818f19a88e6e Mon Sep 17 00:00:00 2001 From: Francesco La Camera Date: Mon, 15 Dec 2025 09:54:18 +0100 Subject: [PATCH 33/55] security: bump react to 19.2.3 to fix CVE-2025-55182 (#5020) --- frontend/package.json | 10 +- frontend/yarn.lock | 1275 +++++++++++++++-------------------------- 2 files changed, 455 insertions(+), 830 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index da140951..e0a36a17 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -29,9 +29,9 @@ "generate-password-browser": "^1.1.0", "humps": "^2.0.1", "query-string": "^9.3.1", - "react": "^19.2.0", + "react": "^19.2.3", "react-bootstrap": "^2.10.10", - "react-dom": "^19.2.0", + "react-dom": "^19.2.3", "react-intl": "^7.1.14", "react-markdown": "^10.1.0", "react-router-dom": "^7.9.5", @@ -48,10 +48,10 @@ "@testing-library/react": "^16.3.0", "@types/country-flag-icons": "^1.2.2", "@types/humps": "^2.0.6", - "@types/react": "^19.2.2", - "@types/react-dom": "^19.2.2", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", "@types/react-table": "^7.7.20", - "@vitejs/plugin-react": "^5.1.0", + "@vitejs/plugin-react": "^5.1.2", "happy-dom": "^20.0.10", "postcss": "^8.5.6", "postcss-simple-vars": "^7.0.1", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index bf95adea..2c5d0db5 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -4,12 +4,12 @@ "@adobe/css-tools@^4.4.0": version "4.4.4" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.4.tgz#2856c55443d3d461693f32d2b96fb6ea92e1ffa9" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz" integrity sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg== "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: "@babel/helper-validator-identifier" "^7.27.1" @@ -18,23 +18,23 @@ "@babel/compat-data@^7.27.2": version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz" integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== -"@babel/core@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.4.tgz#12a550b8794452df4c8b084f95003bce1742d496" - integrity sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA== +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz" + integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== dependencies: "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.3" + "@babel/generator" "^7.28.5" "@babel/helper-compilation-targets" "^7.27.2" "@babel/helper-module-transforms" "^7.28.3" "@babel/helpers" "^7.28.4" - "@babel/parser" "^7.28.4" + "@babel/parser" "^7.28.5" "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.4" - "@babel/types" "^7.28.4" + "@babel/traverse" "^7.28.5" + "@babel/types" "^7.28.5" "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" @@ -42,20 +42,20 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.3.tgz#9626c1741c650cbac39121694a0f2d7451b8ef3e" - integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== +"@babel/generator@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz" + integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== dependencies: - "@babel/parser" "^7.28.3" - "@babel/types" "^7.28.2" + "@babel/parser" "^7.28.5" + "@babel/types" "^7.28.5" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" "@babel/helper-compilation-targets@^7.27.2": version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== dependencies: "@babel/compat-data" "^7.27.2" @@ -66,12 +66,12 @@ "@babel/helper-globals@^7.28.0": version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== dependencies: "@babel/traverse" "^7.27.1" @@ -79,7 +79,7 @@ "@babel/helper-module-transforms@^7.28.3": version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz" integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== dependencies: "@babel/helper-module-imports" "^7.27.1" @@ -88,124 +88,91 @@ "@babel/helper-plugin-utils@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== "@babel/helper-string-parser@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/helper-validator-identifier@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" - integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== +"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== "@babel/helper-validator-option@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== "@babel/helpers@^7.28.4": version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz" integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== dependencies: "@babel/template" "^7.27.2" "@babel/types" "^7.28.4" -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.2", "@babel/parser@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.3.tgz#d2d25b814621bca5fe9d172bc93792547e7a2a71" - integrity sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA== +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz" + integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== dependencies: - "@babel/types" "^7.28.2" - -"@babel/parser@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.4.tgz#da25d4643532890932cc03f7705fe19637e03fa8" - integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== - dependencies: - "@babel/types" "^7.28.4" + "@babel/types" "^7.28.5" "@babel/plugin-transform-react-jsx-self@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz" integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-react-jsx-source@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz" integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/runtime@^7.12.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.4.tgz#a70226016fabe25c5783b2f22d3e1c9bc5ca3326" - integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ== - -"@babel/runtime@^7.12.5", "@babel/runtime@^7.24.7", "@babel/runtime@^7.26.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.24.7", "@babel/runtime@^7.26.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7": version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.3.tgz#75c5034b55ba868121668be5d5bb31cc64e6e61a" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz" integrity sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA== "@babel/template@^7.27.2": version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== dependencies: "@babel/code-frame" "^7.27.1" "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" -"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.3.tgz#6911a10795d2cce43ec6a28cffc440cca2593434" - integrity sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ== +"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz" + integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== dependencies: "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.3" + "@babel/generator" "^7.28.5" "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.3" + "@babel/parser" "^7.28.5" "@babel/template" "^7.27.2" - "@babel/types" "^7.28.2" + "@babel/types" "^7.28.5" debug "^4.3.1" -"@babel/traverse@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.4.tgz#8d456101b96ab175d487249f60680221692b958b" - integrity sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.3" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.4" - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.4" - debug "^4.3.1" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.28.2": - version "7.28.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" - integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz" + integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== dependencies: "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" -"@babel/types@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a" - integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - -"@biomejs/biome@^2.3.2": +"@biomejs/biome@^2.3.2", "@biomejs/biome@>=1.7": version "2.3.2" - resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-2.3.2.tgz#aeeb5f12c39571a18f36a919be63ba7dbc7b290a" + resolved "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.2.tgz" integrity sha512-8e9tzamuDycx7fdrcJ/F/GDZ8SYukc5ud6tDicjjFqURKYFSWMl0H0iXNXZEGmcmNUmABgGuHThPykcM41INgg== optionalDependencies: "@biomejs/cli-darwin-arm64" "2.3.2" @@ -219,47 +186,12 @@ "@biomejs/cli-darwin-arm64@2.3.2": version "2.3.2" - resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.2.tgz#93f866161abe32e702987ccbddf492c1aabe016f" + resolved "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.2.tgz" integrity sha512-4LECm4kc3If0JISai4c3KWQzukoUdpxy4fRzlrPcrdMSRFksR9ZoXK7JBcPuLBmd2SoT4/d7CQS33VnZpgBjew== -"@biomejs/cli-darwin-x64@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.2.tgz#9c3dffdac12e4f4d8db7680ca20f58ace1f38c23" - integrity sha512-jNMnfwHT4N3wi+ypRfMTjLGnDmKYGzxVr1EYAPBcauRcDnICFXN81wD6wxJcSUrLynoyyYCdfW6vJHS/IAoTDA== - -"@biomejs/cli-linux-arm64-musl@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.2.tgz#a0424d2fe355cc43c375b3fbf3e42d39b7221d0e" - integrity sha512-2Zz4usDG1GTTPQnliIeNx6eVGGP2ry5vE/v39nT73a3cKN6t5H5XxjcEoZZh62uVZvED7hXXikclvI64vZkYqw== - -"@biomejs/cli-linux-arm64@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.2.tgz#f85717c04d420ede20523d173a1fc10df60d4d37" - integrity sha512-amnqvk+gWybbQleRRq8TMe0rIv7GHss8mFJEaGuEZYWg1Tw14YKOkeo8h6pf1c+d3qR+JU4iT9KXnBKGON4klw== - -"@biomejs/cli-linux-x64-musl@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.2.tgz#d3e114c744c32d2c50a77c13476bd941819c92d8" - integrity sha512-gzB19MpRdTuOuLtPpFBGrV3Lq424gHyq2lFj8wfX9tvLMLdmA/R9C7k/mqBp/spcbWuHeIEKgEs3RviOPcWGBA== - -"@biomejs/cli-linux-x64@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.2.tgz#f66ce85d2d757d45e6edecce04753a805bd816f0" - integrity sha512-8BG/vRAhFz1pmuyd24FQPhNeueLqPtwvZk6yblABY2gzL2H8fLQAF/Z2OPIc+BPIVPld+8cSiKY/KFh6k81xfA== - -"@biomejs/cli-win32-arm64@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.2.tgz#b46f8b47a3d97e766cc5ad5eb67d90eeb230b2cb" - integrity sha512-lCruqQlfWjhMlOdyf5pDHOxoNm4WoyY2vZ4YN33/nuZBRstVDuqPPjS0yBkbUlLEte11FbpW+wWSlfnZfSIZvg== - -"@biomejs/cli-win32-x64@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.2.tgz#a14f5e220dd496705278315ee3e5e028dd657344" - integrity sha512-6Ee9P26DTb4D8sN9nXxgbi9Dw5vSOfH98M7UlmkjKB2vtUbrRqCbZiNfryGiwnPIpd6YUoTl7rLVD2/x1CyEHQ== - "@emotion/babel-plugin@^11.13.5": version "11.13.5" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz#eab8d65dbded74e0ecfd28dc218e75607c4e7bc0" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz" integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ== dependencies: "@babel/helper-module-imports" "^7.16.7" @@ -276,7 +208,7 @@ "@emotion/cache@^11.14.0", "@emotion/cache@^11.4.0": version "11.14.0" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.14.0.tgz#ee44b26986eeb93c8be82bb92f1f7a9b21b2ed76" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz" integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA== dependencies: "@emotion/memoize" "^0.9.0" @@ -287,17 +219,17 @@ "@emotion/hash@^0.9.2": version "0.9.2" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz" integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== "@emotion/memoize@^0.9.0": version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz" integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== "@emotion/react@^11.8.1": version "11.14.0" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.14.0.tgz#cfaae35ebc67dd9ef4ea2e9acc6cd29e157dd05d" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz" integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA== dependencies: "@babel/runtime" "^7.18.3" @@ -311,7 +243,7 @@ "@emotion/serialize@^1.3.3": version "1.3.3" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.3.tgz#d291531005f17d704d0463a032fe679f376509e8" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz" integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA== dependencies: "@emotion/hash" "^0.9.2" @@ -322,169 +254,44 @@ "@emotion/sheet@^1.4.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz" integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== "@emotion/unitless@^0.10.0": version "0.10.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz" integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== "@emotion/use-insertion-effect-with-fallbacks@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz#8a8cb77b590e09affb960f4ff1e9a89e532738bf" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz" integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg== "@emotion/utils@^1.4.2": version "1.4.2" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.2.tgz#6df6c45881fcb1c412d6688a311a98b7f59c1b52" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz" integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA== "@emotion/weak-memoize@^0.4.0": version "0.4.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz" integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== -"@esbuild/aix-ppc64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz#bef96351f16520055c947aba28802eede3c9e9a9" - integrity sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA== - -"@esbuild/android-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz#d2e70be7d51a529425422091e0dcb90374c1546c" - integrity sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg== - -"@esbuild/android-arm@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.9.tgz#d2a753fe2a4c73b79437d0ba1480e2d760097419" - integrity sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ== - -"@esbuild/android-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.9.tgz#5278836e3c7ae75761626962f902a0d55352e683" - integrity sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw== - "@esbuild/darwin-arm64@0.25.9": version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz#f1513eaf9ec8fa15dcaf4c341b0f005d3e8b47ae" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz" integrity sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg== -"@esbuild/darwin-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz#e27dbc3b507b3a1cea3b9280a04b8b6b725f82be" - integrity sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ== - -"@esbuild/freebsd-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz#364e3e5b7a1fd45d92be08c6cc5d890ca75908ca" - integrity sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q== - -"@esbuild/freebsd-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz#7c869b45faeb3df668e19ace07335a0711ec56ab" - integrity sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg== - -"@esbuild/linux-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz#48d42861758c940b61abea43ba9a29b186d6cb8b" - integrity sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw== - -"@esbuild/linux-arm@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz#6ce4b9cabf148274101701d112b89dc67cc52f37" - integrity sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw== - -"@esbuild/linux-ia32@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz#207e54899b79cac9c26c323fc1caa32e3143f1c4" - integrity sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A== - -"@esbuild/linux-loong64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz#0ba48a127159a8f6abb5827f21198b999ffd1fc0" - integrity sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ== - -"@esbuild/linux-mips64el@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz#a4d4cc693d185f66a6afde94f772b38ce5d64eb5" - integrity sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA== - -"@esbuild/linux-ppc64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz#0f5805c1c6d6435a1dafdc043cb07a19050357db" - integrity sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w== - -"@esbuild/linux-riscv64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz#6776edece0f8fca79f3386398b5183ff2a827547" - integrity sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg== - -"@esbuild/linux-s390x@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz#3f6f29ef036938447c2218d309dc875225861830" - integrity sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA== - -"@esbuild/linux-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz#831fe0b0e1a80a8b8391224ea2377d5520e1527f" - integrity sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg== - -"@esbuild/netbsd-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz#06f99d7eebe035fbbe43de01c9d7e98d2a0aa548" - integrity sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q== - -"@esbuild/netbsd-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz#db99858e6bed6e73911f92a88e4edd3a8c429a52" - integrity sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g== - -"@esbuild/openbsd-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz#afb886c867e36f9d86bb21e878e1185f5d5a0935" - integrity sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ== - -"@esbuild/openbsd-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz#30855c9f8381fac6a0ef5b5f31ac6e7108a66ecf" - integrity sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA== - -"@esbuild/openharmony-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz#2f2144af31e67adc2a8e3705c20c2bd97bd88314" - integrity sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg== - -"@esbuild/sunos-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz#69b99a9b5bd226c9eb9c6a73f990fddd497d732e" - integrity sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw== - -"@esbuild/win32-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz#d789330a712af916c88325f4ffe465f885719c6b" - integrity sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ== - -"@esbuild/win32-ia32@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz#52fc735406bd49688253e74e4e837ac2ba0789e3" - integrity sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww== - -"@esbuild/win32-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz#585624dc829cfb6e7c0aa6c3ca7d7e6daa87e34f" - integrity sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ== - "@floating-ui/core@^1.7.3": version "1.7.3" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.3.tgz#462d722f001e23e46d86fd2bd0d21b7693ccb8b7" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz" integrity sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w== dependencies: "@floating-ui/utils" "^0.2.10" "@floating-ui/dom@^1.0.1": version "1.7.4" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.4.tgz#ee667549998745c9c3e3e84683b909c31d6c9a77" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz" integrity sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA== dependencies: "@floating-ui/core" "^1.7.3" @@ -492,17 +299,17 @@ "@floating-ui/utils@^0.2.10": version "0.2.10" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.10.tgz#a2a1e3812d14525f725d011a73eceb41fef5bc1c" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz" integrity sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ== "@formatjs/cli@^6.7.4": version "6.7.4" - resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-6.7.4.tgz#21fdab4e215763034682abf148b64b4f8d9d4a5c" + resolved "https://registry.npmjs.org/@formatjs/cli/-/cli-6.7.4.tgz" integrity sha512-k6uqdeZDAjDd7iKKQ8yFYizFpbi5Y9H9NkV+hoIhmxaMSGvWRnRusQJaIQ+2rI14MH6knW6fx7tnO15C+ijDiw== "@formatjs/ecma402-abstract@2.3.6": version "2.3.6" - resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz#d6ca9d3579054fe1e1a0a0b5e872e0d64922e4e1" + resolved "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz" integrity sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw== dependencies: "@formatjs/fast-memoize" "2.2.7" @@ -512,14 +319,14 @@ "@formatjs/fast-memoize@2.2.7": version "2.2.7" - resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz#707f9ddaeb522a32f6715bb7950b0831f4cc7b15" + resolved "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz" integrity sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ== dependencies: tslib "^2.8.0" "@formatjs/icu-messageformat-parser@2.11.4": version "2.11.4" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.4.tgz#63bd2cd82d08ae2bef55adeeb86486df68826f32" + resolved "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.4.tgz" integrity sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw== dependencies: "@formatjs/ecma402-abstract" "2.3.6" @@ -528,7 +335,7 @@ "@formatjs/icu-skeleton-parser@1.8.16": version "1.8.16" - resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.16.tgz#13f81f6845c7cf6599623006aacaf7d6b4ad2970" + resolved "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.16.tgz" integrity sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ== dependencies: "@formatjs/ecma402-abstract" "2.3.6" @@ -536,14 +343,14 @@ "@formatjs/intl-localematcher@0.6.2": version "0.6.2" - resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.6.2.tgz#e9ebe0b4082d7d48e5b2d753579fb7ece4eaefea" + resolved "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.6.2.tgz" integrity sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA== dependencies: tslib "^2.8.0" "@formatjs/intl@3.1.8": version "3.1.8" - resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-3.1.8.tgz#17f4a5721f32cd077ab04949be558f9f767c39f5" + resolved "https://registry.npmjs.org/@formatjs/intl/-/intl-3.1.8.tgz" integrity sha512-LWXgwI5zTMatvR8w8kCNh/priDTOF/ZssokMBHJ7ZWXFoYLVOYo0EJERD9Eajv+xsfQO1QkuAt77KWQ1OI4mOQ== dependencies: "@formatjs/ecma402-abstract" "2.3.6" @@ -554,7 +361,7 @@ "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" @@ -562,7 +369,7 @@ "@jridgewell/remapping@^2.3.5": version "2.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz" integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -570,90 +377,30 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": version "0.3.30" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz#4a76c4daeee5df09f5d3940e087442fb36ce2b99" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz" integrity sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@parcel/watcher-android-arm64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" - integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== - "@parcel/watcher-darwin-arm64@2.5.1": version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz#3d26dce38de6590ef79c47ec2c55793c06ad4f67" + resolved "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz" integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== -"@parcel/watcher-darwin-x64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" - integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== - -"@parcel/watcher-freebsd-x64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" - integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== - -"@parcel/watcher-linux-arm-glibc@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" - integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== - -"@parcel/watcher-linux-arm-musl@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" - integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== - -"@parcel/watcher-linux-arm64-glibc@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" - integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== - -"@parcel/watcher-linux-arm64-musl@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" - integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== - -"@parcel/watcher-linux-x64-glibc@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e" - integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== - -"@parcel/watcher-linux-x64-musl@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee" - integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== - -"@parcel/watcher-win32-arm64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" - integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== - -"@parcel/watcher-win32-ia32@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" - integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== - -"@parcel/watcher-win32-x64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" - integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== - "@parcel/watcher@^2.4.1": version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.1.tgz#342507a9cfaaf172479a882309def1e991fb1200" + resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz" integrity sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== dependencies: detect-libc "^1.0.3" @@ -677,33 +424,33 @@ "@popperjs/core@^2.11.8": version "2.11.8" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@react-aria/ssr@^3.5.0": version "3.9.10" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.10.tgz#7fdc09e811944ce0df1d7e713de1449abd7435e6" + resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz" integrity sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ== dependencies: "@swc/helpers" "^0.5.0" "@restart/hooks@^0.4.9": version "0.4.16" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.16.tgz#95ae8ac1cc7e2bd4fed5e39800ff85604c6d59fb" + resolved "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz" integrity sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w== dependencies: dequal "^2.0.3" "@restart/hooks@^0.5.0": version "0.5.1" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.5.1.tgz#6776b3859e33aea72b23b81fc47021edf17fd247" + resolved "https://registry.npmjs.org/@restart/hooks/-/hooks-0.5.1.tgz" integrity sha512-EMoH04NHS1pbn07iLTjIjgttuqb7qu4+/EyhAx27MHpoENcB2ZdSsLTNxmKD+WEPnZigo62Qc8zjGnNxoSE/5Q== dependencies: dequal "^2.0.3" "@restart/ui@^1.9.4": version "1.9.4" - resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.9.4.tgz#9d61f56f2647f5ab8a33d87b278b9ce183511a26" + resolved "https://registry.npmjs.org/@restart/ui/-/ui-1.9.4.tgz" integrity sha512-N4C7haUc3vn4LTwVUPlkJN8Ach/+yIMvRuTVIhjilNHqegY60SGLrzud6errOMNJwSnmYFnt1J0H/k8FE3A4KA== dependencies: "@babel/runtime" "^7.26.0" @@ -716,131 +463,31 @@ uncontrollable "^8.0.4" warning "^4.0.3" -"@rolldown/pluginutils@1.0.0-beta.43": - version "1.0.0-beta.43" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.43.tgz#fa8249860113711ad3c8053bc79cb07c79b77f62" - integrity sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ== - -"@rollup/rollup-android-arm-eabi@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz#939c1be9625d428d8513e4ab60d406fe8db23718" - integrity sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ== - -"@rollup/rollup-android-arm64@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz#b74005775903f7a8f4e363d2840c1dcef3776ff3" - integrity sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw== +"@rolldown/pluginutils@1.0.0-beta.53": + version "1.0.0-beta.53" + resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz" + integrity sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ== "@rollup/rollup-darwin-arm64@4.50.0": version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz#8c04603cdcf1ec0cd6b27152b3827e49295f2962" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz" integrity sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg== -"@rollup/rollup-darwin-x64@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz#19ec976f1cc663def2692cd7ffb32981f2b0b733" - integrity sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw== - -"@rollup/rollup-freebsd-arm64@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz#a96b4ad8346229f6fcbd9d57f1c53040b037c2da" - integrity sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ== - -"@rollup/rollup-freebsd-x64@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz#fa565a282bc57967ee6668607b181678bdd74e4a" - integrity sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA== - -"@rollup/rollup-linux-arm-gnueabihf@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz#dfc88f7295e1f98d77f25296be787e8a5d6ced75" - integrity sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w== - -"@rollup/rollup-linux-arm-musleabihf@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz#32cd70c87455ca031f0361090cf17da5a2ef66d5" - integrity sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg== - -"@rollup/rollup-linux-arm64-gnu@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz#0e7e1fe7241e3384f6c6b4ccdbcfa8ad8c78b869" - integrity sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g== - -"@rollup/rollup-linux-arm64-musl@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz#5d421f2f3e4a84786c4dfd9ce97e595c9b59e7f4" - integrity sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ== - -"@rollup/rollup-linux-loongarch64-gnu@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz#a0fb5c7d0e88319e18acfd9436f19ee39354b027" - integrity sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ== - -"@rollup/rollup-linux-ppc64-gnu@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz#a65b598af12f25210c3295da551a6e3616ea488d" - integrity sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg== - -"@rollup/rollup-linux-riscv64-gnu@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz#10ba776214ae2857c5bf4389690dabb2fbaf7d98" - integrity sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA== - -"@rollup/rollup-linux-riscv64-musl@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz#c2a46cbaa329d5f21e5808f5a66bb9c78cf68aac" - integrity sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ== - -"@rollup/rollup-linux-s390x-gnu@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz#a07447be069d64462e30c66611be20c4513963ed" - integrity sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ== - -"@rollup/rollup-linux-x64-gnu@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz#8887c58bd51242754ae9c56947d6e883332dcc74" - integrity sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA== - -"@rollup/rollup-linux-x64-musl@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz#6403fda72a2b3b9fbbeeff93d14f1c45ef9775f3" - integrity sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw== - -"@rollup/rollup-openharmony-arm64@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz#52809afccaff47e731b965a0c16e5686be819d5f" - integrity sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q== - -"@rollup/rollup-win32-arm64-msvc@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz#23fe00ddbb40b27a3889bc1e99e6310d97353ad5" - integrity sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg== - -"@rollup/rollup-win32-ia32-msvc@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz#520b588076b593413d919912d69dfd5728a1f305" - integrity sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw== - -"@rollup/rollup-win32-x64-msvc@4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz#d81efe6a12060c7feddf9805e2a94c3ab0679f48" - integrity sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg== - "@standard-schema/spec@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.0.0.tgz#f193b73dc316c4170f2e82a881da0f550d551b9c" + resolved "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz" integrity sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA== "@swc/helpers@^0.5.0": version "0.5.17" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.17.tgz#5a7be95ac0f0bf186e7e6e890e7a6f6cda6ce971" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz" integrity sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A== dependencies: tslib "^2.8.0" "@tabler/core@^1.4.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@tabler/core/-/core-1.4.0.tgz#9e011289d92cf6120655793cef6576fd67eb07f3" + resolved "https://registry.npmjs.org/@tabler/core/-/core-1.4.0.tgz" integrity sha512-5BigzOlbOH9N0Is4u0rYNRCiwtnUXWO57K9zwuscygcicAa8UV9MGaS4zTgQsZEtZ9tsNANhN/YD8gCBGKYCiw== dependencies: "@popperjs/core" "^2.11.8" @@ -848,55 +495,55 @@ "@tabler/icons-react@^3.35.0": version "3.35.0" - resolved "https://registry.yarnpkg.com/@tabler/icons-react/-/icons-react-3.35.0.tgz#27f295f36b42f8dc2e7841dd651c8905d0097818" + resolved "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.35.0.tgz" integrity sha512-XG7t2DYf3DyHT5jxFNp5xyLVbL4hMJYJhiSdHADzAjLRYfL7AnjlRfiHDHeXxkb2N103rEIvTsBRazxXtAUz2g== dependencies: "@tabler/icons" "3.35.0" "@tabler/icons@3.35.0": version "3.35.0" - resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-3.35.0.tgz#6f35247e41baba2a1b0f4dff048bb1335d6c1075" + resolved "https://registry.npmjs.org/@tabler/icons/-/icons-3.35.0.tgz" integrity sha512-yYXe+gJ56xlZFiXwV9zVoe3FWCGuZ/D7/G4ZIlDtGxSx5CGQK110wrnT29gUj52kEZoxqF7oURTk97GQxELOFQ== "@tanstack/query-core@5.90.6": version "5.90.6" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.90.6.tgz#e4627c442a4701adb350270dae5f6b72b2498eae" + resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.6.tgz" integrity sha512-AnZSLF26R8uX+tqb/ivdrwbVdGemdEDm1Q19qM6pry6eOZ6bEYiY7mWhzXT1YDIPTNEVcZ5kYP9nWjoxDLiIVw== "@tanstack/query-devtools@5.90.1": version "5.90.1" - resolved "https://registry.yarnpkg.com/@tanstack/query-devtools/-/query-devtools-5.90.1.tgz#c57a739a5293f4960a4a6b6fb4b7e4a56e6bd932" + resolved "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.90.1.tgz" integrity sha512-GtINOPjPUH0OegJExZ70UahT9ykmAhmtNVcmtdnOZbxLwT7R5OmRztR5Ahe3/Cu7LArEmR6/588tAycuaWb1xQ== "@tanstack/react-query-devtools@^5.90.2": version "5.90.2" - resolved "https://registry.yarnpkg.com/@tanstack/react-query-devtools/-/react-query-devtools-5.90.2.tgz#248d6ae89ace7dc2da816fa95cdc2b4f63c9e4d2" + resolved "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.90.2.tgz" integrity sha512-vAXJzZuBXtCQtrY3F/yUNJCV4obT/A/n81kb3+YqLbro5Z2+phdAbceO+deU3ywPw8B42oyJlp4FhO0SoivDFQ== dependencies: "@tanstack/query-devtools" "5.90.1" -"@tanstack/react-query@^5.90.6": +"@tanstack/react-query@^5.90.2", "@tanstack/react-query@^5.90.6": version "5.90.6" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.90.6.tgz#50f46ca81679c3fda185ea7d2c7787af78ed0364" + resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.6.tgz" integrity sha512-gB1sljYjcobZKxjPbKSa31FUTyr+ROaBdoH+wSSs9Dk+yDCmMs+TkTV3PybRRVLC7ax7q0erJ9LvRWnMktnRAw== dependencies: "@tanstack/query-core" "5.90.6" "@tanstack/react-table@^8.21.3": version "8.21.3" - resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.21.3.tgz#2c38c747a5731c1a07174fda764b9c2b1fb5e91b" + resolved "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz" integrity sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww== dependencies: "@tanstack/table-core" "8.21.3" "@tanstack/table-core@8.21.3": version "8.21.3" - resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.21.3.tgz#2977727d8fc8dfa079112d9f4d4c019110f1732c" + resolved "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz" integrity sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg== -"@testing-library/dom@^10.4.1": +"@testing-library/dom@^10.0.0", "@testing-library/dom@^10.4.1": version "10.4.1" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.1.tgz#d444f8a889e9a46e9a3b4f3b88e0fcb3efb6cf95" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz" integrity sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg== dependencies: "@babel/code-frame" "^7.10.4" @@ -910,7 +557,7 @@ "@testing-library/jest-dom@^6.9.1": version "6.9.1" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz#7613a04e146dd2976d24ddf019730d57a89d56c2" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz" integrity sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA== dependencies: "@adobe/css-tools" "^4.4.0" @@ -922,19 +569,19 @@ "@testing-library/react@^16.3.0": version "16.3.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.3.0.tgz#3a85bb9bdebf180cd76dba16454e242564d598a6" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz" integrity sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw== dependencies: "@babel/runtime" "^7.12.5" "@types/aria-query@^5.0.1": version "5.0.4" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz" integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== "@types/babel__core@^7.20.5": version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" @@ -945,14 +592,14 @@ "@types/babel__generator@*": version "7.27.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz" integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" @@ -960,161 +607,159 @@ "@types/babel__traverse@*": version "7.28.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz" integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== dependencies: "@babel/types" "^7.28.2" "@types/chai@^5.2.2": version "5.2.2" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.2.tgz#6f14cea18180ffc4416bc0fd12be05fdd73bdd6b" + resolved "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz" integrity sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== dependencies: "@types/deep-eql" "*" "@types/country-flag-icons@^1.2.2": version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/country-flag-icons/-/country-flag-icons-1.2.2.tgz#8f51089cab857f0f700feabd38b3960d006d64f2" + resolved "https://registry.npmjs.org/@types/country-flag-icons/-/country-flag-icons-1.2.2.tgz" integrity sha512-CefEn/J336TBDp7NX8JqzlDtCBOsm8M3r1Li0gEOt0HOMHF1XemNyrx9lSHjsafcb1yYWybU0N8ZAXuyCaND0w== -"@types/debug@^4.0.0": +"@types/debug@^4.0.0", "@types/debug@^4.1.12": version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" "@types/deep-eql@*": version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + resolved "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz" integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== "@types/estree-jsx@^1.0.0": version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" + resolved "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz" integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0": +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@1.0.8": version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/hast@^2.0.0": version "2.3.10" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz" integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== dependencies: "@types/unist" "^2" "@types/hast@^3.0.0": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz" integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== dependencies: "@types/unist" "*" "@types/hoist-non-react-statics@^3.3.1": version "3.3.7" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz#306e3a3a73828522efa1341159da4846e7573a6c" + resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz" integrity sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g== dependencies: hoist-non-react-statics "^3.3.0" "@types/humps@^2.0.6": version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/humps/-/humps-2.0.6.tgz#a358688fe092e40b5f50261e0a55e2fa6d68cabe" + resolved "https://registry.npmjs.org/@types/humps/-/humps-2.0.6.tgz" integrity sha512-Fagm1/a/1J9gDKzGdtlPmmTN5eSw/aaTzHtj740oSfo+MODsSY2WglxMmhTdOglC8nxqUhGGQ+5HfVtBvxo3Kg== "@types/mdast@^4.0.0": version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz" integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== dependencies: "@types/unist" "*" "@types/ms@*": version "2.1.0" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz" integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== -"@types/node@^20.0.0": +"@types/node@^20.0.0", "@types/node@^20.0.0 || ^22.0.0 || >=24.0.0", "@types/node@^20.19.0 || >=22.12.0": version "20.19.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.11.tgz#728cab53092bd5f143beed7fbba7ba99de3c16c4" + resolved "https://registry.npmjs.org/@types/node/-/node-20.19.11.tgz" integrity sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow== dependencies: undici-types "~6.21.0" "@types/parse-json@^4.0.0": version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz" integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/prismjs@^1.0.0": version "1.26.5" - resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.5.tgz#72499abbb4c4ec9982446509d2f14fb8483869d6" + resolved "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz" integrity sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ== "@types/prop-types@^15.7.12": version "15.7.15" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz" integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== -"@types/react-dom@^19.2.2": - version "19.2.2" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.2.2.tgz#a4cc874797b7ddc9cb180ef0d5dc23f596fc2332" - integrity sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw== +"@types/react-dom@^18.0.0 || ^19.0.0", "@types/react-dom@^19.2.3": + version "19.2.3" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz" + integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== "@types/react-table@^7.7.20": version "7.7.20" - resolved "https://registry.yarnpkg.com/@types/react-table/-/react-table-7.7.20.tgz#2f68e70ca7a703ad8011a8da55c38482f0eb4314" + resolved "https://registry.npmjs.org/@types/react-table/-/react-table-7.7.20.tgz" integrity sha512-ahMp4pmjVlnExxNwxyaDrFgmKxSbPwU23sGQw2gJK4EhCvnvmib2s/O/+y1dfV57dXOwpr2plfyBol+vEHbi2w== dependencies: "@types/react" "*" "@types/react-transition-group@^4.4.0", "@types/react-transition-group@^4.4.6": version "4.4.12" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz" integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== -"@types/react@*", "@types/react@16 || 17 || 18 || 19", "@types/react@>=16.9.11": - version "19.1.12" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.12.tgz#7bfaa76aabbb0b4fe0493c21a3a7a93d33e8937b" - integrity sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w== +"@types/react@*", "@types/react@^18.0.0 || ^19.0.0", "@types/react@^19.2.0", "@types/react@^19.2.7", "@types/react@>=16.14.8", "@types/react@>=16.9.11", "@types/react@>=18", "@types/react@16 || 17 || 18 || 19": + version "19.2.7" + resolved "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz" + integrity sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg== dependencies: - csstype "^3.0.2" - -"@types/react@^19.2.2": - version "19.2.2" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.2.tgz#ba123a75d4c2a51158697160a4ea2ff70aa6bf36" - integrity sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA== - dependencies: - csstype "^3.0.2" + csstype "^3.2.2" "@types/unist@*", "@types/unist@^3.0.0": version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz" integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== -"@types/unist@^2", "@types/unist@^2.0.0": +"@types/unist@^2": version "2.0.11" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== + +"@types/unist@^2.0.0": + version "2.0.11" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz" integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== "@types/warning@^3.0.3": version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.3.tgz#d1884c8cc4a426d1ac117ca2611bf333834c6798" + resolved "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz" integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q== "@types/whatwg-mimetype@^3.0.2": version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz#e5e06dcd3e92d4e622ef0129637707d66c28d6a4" + resolved "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz" integrity sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA== "@uiw/react-textarea-code-editor@^3.1.1": version "3.1.1" - resolved "https://registry.yarnpkg.com/@uiw/react-textarea-code-editor/-/react-textarea-code-editor-3.1.1.tgz#8ca1b706a3081a51c68bc0df91c9c3cdadd9944e" + resolved "https://registry.npmjs.org/@uiw/react-textarea-code-editor/-/react-textarea-code-editor-3.1.1.tgz" integrity sha512-AERRbp/d85vWR+UPgsB5hEgerNXuyszdmhWl2fV2H2jN63jgOobwEnjIpb76Vwy8SaGa/AdehaoJX2XZgNXtJA== dependencies: "@babel/runtime" "^7.18.6" @@ -1123,24 +768,24 @@ "@ungap/structured-clone@^1.0.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== -"@vitejs/plugin-react@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-5.1.0.tgz#1f37671a227571437d6e324b824256dac157570e" - integrity sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew== +"@vitejs/plugin-react@^5.1.2": + version "5.1.2" + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz" + integrity sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ== dependencies: - "@babel/core" "^7.28.4" + "@babel/core" "^7.28.5" "@babel/plugin-transform-react-jsx-self" "^7.27.1" "@babel/plugin-transform-react-jsx-source" "^7.27.1" - "@rolldown/pluginutils" "1.0.0-beta.43" + "@rolldown/pluginutils" "1.0.0-beta.53" "@types/babel__core" "^7.20.5" react-refresh "^0.18.0" "@vitest/expect@4.0.6": version "4.0.6" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-4.0.6.tgz#33df10e2f9728b7338c2a2331c75814d1f840ab7" + resolved "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.6.tgz" integrity sha512-5j8UUlBVhOjhj4lR2Nt9sEV8b4WtbcYh8vnfhTNA2Kn5+smtevzjNq+xlBuVhnFGXiyPPNzGrOVvmyHWkS5QGg== dependencies: "@standard-schema/spec" "^1.0.0" @@ -1152,7 +797,7 @@ "@vitest/mocker@4.0.6": version "4.0.6" - resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-4.0.6.tgz#3e27579d4444ca113685fc040961ce4b415ba5d2" + resolved "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.6.tgz" integrity sha512-3COEIew5HqdzBFEYN9+u0dT3i/NCwppLnO1HkjGfAP1Vs3vti1Hxm/MvcbC4DAn3Szo1M7M3otiAaT83jvqIjA== dependencies: "@vitest/spy" "4.0.6" @@ -1161,14 +806,14 @@ "@vitest/pretty-format@4.0.6": version "4.0.6" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-4.0.6.tgz#af838540d3cd6b29c5d434fbdd36eb2543b040a3" + resolved "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.6.tgz" integrity sha512-4vptgNkLIA1W1Nn5X4x8rLJBzPiJwnPc+awKtfBE5hNMVsoAl/JCCPPzNrbf+L4NKgklsis5Yp2gYa+XAS442g== dependencies: tinyrainbow "^3.0.3" "@vitest/runner@4.0.6": version "4.0.6" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-4.0.6.tgz#5a938015cfb202b96cbff4688400f1cd4899b40a" + resolved "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.6.tgz" integrity sha512-trPk5qpd7Jj+AiLZbV/e+KiiaGXZ8ECsRxtnPnCrJr9OW2mLB72Cb824IXgxVz/mVU3Aj4VebY+tDTPn++j1Og== dependencies: "@vitest/utils" "4.0.6" @@ -1176,7 +821,7 @@ "@vitest/snapshot@4.0.6": version "4.0.6" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-4.0.6.tgz#5cf47e396123cc379944632e908e74fb78d58f13" + resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.6.tgz" integrity sha512-PaYLt7n2YzuvxhulDDu6c9EosiRuIE+FI2ECKs6yvHyhoga+2TBWI8dwBjs+IeuQaMtZTfioa9tj3uZb7nev1g== dependencies: "@vitest/pretty-format" "4.0.6" @@ -1185,12 +830,12 @@ "@vitest/spy@4.0.6": version "4.0.6" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-4.0.6.tgz#3860eb53cfe333c5eefe8b510eb7d71da7f4bd70" + resolved "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.6.tgz" integrity sha512-g9jTUYPV1LtRPRCQfhbMintW7BTQz1n6WXYQYRQ25qkyffA4bjVXjkROokZnv7t07OqfaFKw1lPzqKGk1hmNuQ== "@vitest/utils@4.0.6": version "4.0.6" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-4.0.6.tgz#e8ce743a4a5adcd7228823249b643bc894c0955d" + resolved "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.6.tgz" integrity sha512-bG43VS3iYKrMIZXBo+y8Pti0O7uNju3KvNn6DrQWhQQKcLavMB+0NZfO1/QBAEbq0MaQ3QjNsnnXlGQvsh0Z6A== dependencies: "@vitest/pretty-format" "4.0.6" @@ -1198,29 +843,24 @@ ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -aria-query@5.3.0: +aria-query@^5.0.0, aria-query@5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" -aria-query@^5.0.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" - integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== - babel-plugin-macros@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== dependencies: "@babel/runtime" "^7.12.5" @@ -1229,29 +869,29 @@ babel-plugin-macros@^3.1.0: bail@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + resolved "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz" integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bootstrap@5.3.7: version "5.3.7" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.7.tgz#8640065036124d961d885d80b5945745e1154d90" + resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.7.tgz" integrity sha512-7KgiD8UHjfcPBHEpDNg+zGz8L3LqR3GVwqZiBRFX04a1BCArZOz1r2kjly2HQ0WokqTO0v1nF+QAt8dsW4lKlw== braces@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" -browserslist@^4.24.0: +browserslist@^4.24.0, "browserslist@>= 4.21.0": version "4.25.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.4.tgz#ebdd0e1d1cf3911834bab3a6cd7b917d9babf5af" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz" integrity sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg== dependencies: caniuse-lite "^1.0.30001737" @@ -1261,7 +901,7 @@ browserslist@^4.24.0: buffer@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -1269,84 +909,84 @@ buffer@^6.0.3: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caniuse-lite@^1.0.30001737: version "1.0.30001739" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz#b34ce2d56bfc22f4352b2af0144102d623a124f4" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz" integrity sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA== ccount@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== chai@^6.0.1: version "6.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-6.2.0.tgz#181bca6a219cddb99c3eeefb82483800ffa550ce" + resolved "https://registry.npmjs.org/chai/-/chai-6.2.0.tgz" integrity sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA== character-entities-html4@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== character-entities-legacy@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz" integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== character-entities@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== character-reference-invalid@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz" integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== chokidar@^4.0.0, chokidar@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== dependencies: readdirp "^4.0.1" classnames@^2.3.2, classnames@^2.5.1: version "2.5.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== clsx@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== comma-separated-tokens@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== convert-source-map@^1.5.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610" + resolved "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz" integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== cosmiconfig@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -1357,90 +997,83 @@ cosmiconfig@^7.0.0: country-flag-icons@^1.5.21: version "1.5.21" - resolved "https://registry.yarnpkg.com/country-flag-icons/-/country-flag-icons-1.5.21.tgz#f7502b144c523f5a6ad8d29de780c90a5f9a131e" + resolved "https://registry.npmjs.org/country-flag-icons/-/country-flag-icons-1.5.21.tgz" integrity sha512-0KmU4oeiyAM+F+atzK99ghQDQJKxEY3tiDhnRraVFL4o65rZgrmrx7xKi0b+hxcVpcEpuUbu+KCC6TKTZQTDcA== css.escape@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +csstype@^3.0.2, csstype@^3.2.2: + version "3.2.3" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz" + integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== date-fns@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-4.1.0.tgz#64b3d83fff5aa80438f5b1a633c2e83b8a1c2d14" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz" integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg== -debug@^4.0.0, debug@^4.4.3: +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.4.3: version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - decimal.js@^10.4.3: version "10.6.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz" integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== decode-named-character-reference@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz#25c32ae6dd5e21889549d40f676030e9514cc0ed" + resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz" integrity sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q== dependencies: character-entities "^2.0.0" decode-uri-component@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.4.1.tgz#2ac4859663c704be22bf7db760a1494a49ab2cc5" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz" integrity sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ== deepmerge@^2.1.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz" integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== dequal@^2.0.0, dequal@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== detect-libc@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz" integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== devlop@^1.0.0, devlop@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + resolved "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz" integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== dependencies: dequal "^2.0.0" dom-accessibility-api@^0.5.9: version "0.5.16" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== dom-accessibility-api@^0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz" integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: "@babel/runtime" "^7.8.7" @@ -1448,29 +1081,29 @@ dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: electron-to-chromium@^1.5.211: version "1.5.213" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.213.tgz#f434187f227fb7e67bfcf8243b959cf3ce14013e" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.213.tgz" integrity sha512-xr9eRzSLNa4neDO0xVFrkXu3vyIzG4Ay08dApecw42Z1NbmCt+keEpXdvlYGVe0wtvY5dhW0Ay0lY0IOfsCg0Q== entities@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" + resolved "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz" integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== error-ex@^1.3.1: version "1.3.4" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz" integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== dependencies: is-arrayish "^0.2.1" es-module-lexer@^1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz" integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== esbuild@^0.25.0: version "0.25.9" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.9.tgz#15ab8e39ae6cdc64c24ff8a2c0aef5b3fd9fa976" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz" integrity sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g== optionalDependencies: "@esbuild/aix-ppc64" "0.25.9" @@ -1502,71 +1135,71 @@ esbuild@^0.25.0: escalade@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== estree-util-is-identifier-name@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + resolved "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz" integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== estree-walker@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== dependencies: "@types/estree" "^1.0.0" expect-type@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.2.tgz#c030a329fb61184126c8447585bc75a7ec6fbff3" + resolved "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz" integrity sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA== extend@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== ez-modal-react@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/ez-modal-react/-/ez-modal-react-1.0.5.tgz#38d36c5e31f54f6b7cb7afa0cc79a8d1190c2805" + resolved "https://registry.npmjs.org/ez-modal-react/-/ez-modal-react-1.0.5.tgz" integrity sha512-/A8yLK54tpmWCMkW8Pwqc2xxspmimGOOw/m+1Y+tNtUIheuDHhLynHP1Q0utciJEGDAK849aQcd+6DrJ88hggQ== fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fdir@^6.4.4, fdir@^6.5.0: +fdir@^6.5.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" filter-obj@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-5.1.0.tgz#5bd89676000a713d7db2e197f660274428e524ed" + resolved "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz" integrity sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng== find-root@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== formik@^2.4.6: version "2.4.6" - resolved "https://registry.yarnpkg.com/formik/-/formik-2.4.6.tgz#4da75ca80f1a827ab35b08fd98d5a76e928c9686" + resolved "https://registry.npmjs.org/formik/-/formik-2.4.6.tgz" integrity sha512-A+2EI7U7aG296q2TLGvNapDNTZp1khVt5Vk0Q/fyfSROss0V/V6+txt2aJnwEos44IxTCW/LYAi/zgWzlevj+g== dependencies: "@types/hoist-non-react-statics" "^3.3.1" @@ -1580,17 +1213,17 @@ formik@^2.4.6: fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== generate-password-browser@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/generate-password-browser/-/generate-password-browser-1.1.0.tgz#ec1661d0f3ce0b36e2ffdf6099578725a43d12e9" + resolved "https://registry.npmjs.org/generate-password-browser/-/generate-password-browser-1.1.0.tgz" integrity sha512-qsQve0rVbCqGqAfKgZwjxKUfI1d1nyd22dz+kE8gn1iw1LxGkR+Slsl79XXfm2wxuK27IkopTs5KXcOEQnhg0w== dependencies: buffer "^6.0.3" @@ -1598,17 +1231,17 @@ generate-password-browser@^1.1.0: gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== globrex@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== -happy-dom@^20.0.10: +happy-dom@*, happy-dom@^20.0.10: version "20.0.10" - resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-20.0.10.tgz#01fb5f09426420994e47e966598e272102678dd2" + resolved "https://registry.npmjs.org/happy-dom/-/happy-dom-20.0.10.tgz" integrity sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g== dependencies: "@types/node" "^20.0.0" @@ -1617,14 +1250,14 @@ happy-dom@^20.0.10: hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hast-util-from-html@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz#485c74785358beb80c4ba6346299311ac4c49c82" + resolved "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz" integrity sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw== dependencies: "@types/hast" "^3.0.0" @@ -1636,7 +1269,7 @@ hast-util-from-html@^2.0.0: hast-util-from-parse5@^8.0.0: version "8.0.3" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz#830a35022fff28c3fea3697a98c2f4cc6b835a2e" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz" integrity sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg== dependencies: "@types/hast" "^3.0.0" @@ -1650,21 +1283,21 @@ hast-util-from-parse5@^8.0.0: hast-util-parse-selector@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz" integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== dependencies: "@types/hast" "^2.0.0" hast-util-parse-selector@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz" integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== dependencies: "@types/hast" "^3.0.0" hast-util-to-html@^9.0.0: version "9.0.5" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz#ccc673a55bb8e85775b08ac28380f72d47167005" + resolved "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz" integrity sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw== dependencies: "@types/hast" "^3.0.0" @@ -1681,7 +1314,7 @@ hast-util-to-html@^9.0.0: hast-util-to-jsx-runtime@^2.0.0: version "2.3.6" - resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz#ff31897aae59f62232e21594eac7ef6b63333e98" + resolved "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz" integrity sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg== dependencies: "@types/estree" "^1.0.0" @@ -1702,21 +1335,21 @@ hast-util-to-jsx-runtime@^2.0.0: hast-util-to-string@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz#a4f15e682849326dd211c97129c94b0c3e76527c" + resolved "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz" integrity sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A== dependencies: "@types/hast" "^3.0.0" hast-util-whitespace@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz" integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== dependencies: "@types/hast" "^3.0.0" hastscript@^7.0.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz" integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== dependencies: "@types/hast" "^2.0.0" @@ -1727,7 +1360,7 @@ hastscript@^7.0.0: hastscript@^9.0.0: version "9.0.1" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-9.0.1.tgz#dbc84bef6051d40084342c229c451cd9dc567dff" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz" integrity sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w== dependencies: "@types/hast" "^3.0.0" @@ -1738,39 +1371,39 @@ hastscript@^9.0.0: hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" html-url-attributes@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/html-url-attributes/-/html-url-attributes-3.0.1.tgz#83b052cd5e437071b756cd74ae70f708870c2d87" + resolved "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz" integrity sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ== html-void-elements@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz" integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== humps@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/humps/-/humps-2.0.1.tgz#dd02ea6081bd0568dc5d073184463957ba9ef9aa" + resolved "https://registry.npmjs.org/humps/-/humps-2.0.1.tgz" integrity sha512-E0eIbrFWUhwfXJmsbdjRQFQPrl5pTEoKlz163j1mTqqUnU9PgR4AgB8AIITzuB3vLBdxZXyZ9TDIrwB2OASz4g== ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== immutable@^5.0.2: version "5.1.3" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.3.tgz#e6486694c8b76c37c063cca92399fa64098634d4" + resolved "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz" integrity sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg== import-fresh@^3.2.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" @@ -1778,17 +1411,17 @@ import-fresh@^3.2.1: indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inline-style-parser@0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.4.tgz#f4af5fe72e612839fcd453d989a586566d695f22" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz" integrity sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q== intl-messageformat@10.7.18: version "10.7.18" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.7.18.tgz#51a6f387afbca9b0f881b2ec081566db8c540b0d" + resolved "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.18.tgz" integrity sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g== dependencies: "@formatjs/ecma402-abstract" "2.3.6" @@ -1798,19 +1431,19 @@ intl-messageformat@10.7.18: invariant@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" is-alphabetical@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz" integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== is-alphanumerical@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz" integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== dependencies: is-alphabetical "^2.0.0" @@ -1818,122 +1451,122 @@ is-alphanumerical@^2.0.0: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-core-module@^2.16.0: version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: hasown "^2.0.2" is-decimal@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz" integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-glob@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hexadecimal@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz" integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-obj@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== jsesc@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lodash-es@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== longest-streak@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lz-string@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== magic-string@^0.30.19: version "0.30.21" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz" integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== dependencies: "@jridgewell/sourcemap-codec" "^1.5.5" mdast-util-from-markdown@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz#4850390ca7cf17413a9b9a0fbefcd1bc0eb4160a" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz" integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== dependencies: "@types/mdast" "^4.0.0" @@ -1951,7 +1584,7 @@ mdast-util-from-markdown@^2.0.0: mdast-util-mdx-expression@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz#43f0abac9adc756e2086f63822a38c8d3c3a5096" + resolved "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz" integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== dependencies: "@types/estree-jsx" "^1.0.0" @@ -1963,7 +1596,7 @@ mdast-util-mdx-expression@^2.0.0: mdast-util-mdx-jsx@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz#fd04c67a2a7499efb905a8a5c578dddc9fdada0d" + resolved "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz" integrity sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q== dependencies: "@types/estree-jsx" "^1.0.0" @@ -1981,7 +1614,7 @@ mdast-util-mdx-jsx@^3.0.0: mdast-util-mdxjs-esm@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + resolved "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz" integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== dependencies: "@types/estree-jsx" "^1.0.0" @@ -1993,7 +1626,7 @@ mdast-util-mdxjs-esm@^2.0.0: mdast-util-phrasing@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" + resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz" integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== dependencies: "@types/mdast" "^4.0.0" @@ -2001,7 +1634,7 @@ mdast-util-phrasing@^4.0.0: mdast-util-to-hast@^13.0.0: version "13.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz" integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== dependencies: "@types/hast" "^3.0.0" @@ -2016,7 +1649,7 @@ mdast-util-to-hast@^13.0.0: mdast-util-to-markdown@^2.0.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz#f910ffe60897f04bb4b7e7ee434486f76288361b" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz" integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== dependencies: "@types/mdast" "^4.0.0" @@ -2031,19 +1664,19 @@ mdast-util-to-markdown@^2.0.0: mdast-util-to-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz" integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== dependencies: "@types/mdast" "^4.0.0" memoize-one@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz" integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== micromark-core-commonmark@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz#c691630e485021a68cf28dbc2b2ca27ebf678cd4" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz" integrity sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg== dependencies: decode-named-character-reference "^1.0.0" @@ -2065,7 +1698,7 @@ micromark-core-commonmark@^2.0.0: micromark-factory-destination@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639" + resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz" integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== dependencies: micromark-util-character "^2.0.0" @@ -2074,7 +1707,7 @@ micromark-factory-destination@^2.0.0: micromark-factory-label@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1" + resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz" integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== dependencies: devlop "^1.0.0" @@ -2084,7 +1717,7 @@ micromark-factory-label@^2.0.0: micromark-factory-space@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz" integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== dependencies: micromark-util-character "^2.0.0" @@ -2092,7 +1725,7 @@ micromark-factory-space@^2.0.0: micromark-factory-title@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94" + resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz" integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== dependencies: micromark-factory-space "^2.0.0" @@ -2102,7 +1735,7 @@ micromark-factory-title@^2.0.0: micromark-factory-whitespace@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1" + resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz" integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== dependencies: micromark-factory-space "^2.0.0" @@ -2112,7 +1745,7 @@ micromark-factory-whitespace@^2.0.0: micromark-util-character@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz" integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== dependencies: micromark-util-symbol "^2.0.0" @@ -2120,14 +1753,14 @@ micromark-util-character@^2.0.0: micromark-util-chunked@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051" + resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz" integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== dependencies: micromark-util-symbol "^2.0.0" micromark-util-classify-character@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629" + resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz" integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== dependencies: micromark-util-character "^2.0.0" @@ -2136,7 +1769,7 @@ micromark-util-classify-character@^2.0.0: micromark-util-combine-extensions@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9" + resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz" integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== dependencies: micromark-util-chunked "^2.0.0" @@ -2144,14 +1777,14 @@ micromark-util-combine-extensions@^2.0.0: micromark-util-decode-numeric-character-reference@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5" + resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz" integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== dependencies: micromark-util-symbol "^2.0.0" micromark-util-decode-string@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz#6cb99582e5d271e84efca8e61a807994d7161eb2" + resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz" integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== dependencies: decode-named-character-reference "^1.0.0" @@ -2161,31 +1794,31 @@ micromark-util-decode-string@^2.0.0: micromark-util-encode@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz" integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== micromark-util-html-tag-name@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825" + resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz" integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== micromark-util-normalize-identifier@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d" + resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz" integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== dependencies: micromark-util-symbol "^2.0.0" micromark-util-resolve-all@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b" + resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz" integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== dependencies: micromark-util-types "^2.0.0" micromark-util-sanitize-uri@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz" integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== dependencies: micromark-util-character "^2.0.0" @@ -2194,7 +1827,7 @@ micromark-util-sanitize-uri@^2.0.0: micromark-util-subtokenize@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz#d8ade5ba0f3197a1cf6a2999fbbfe6357a1a19ee" + resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz" integrity sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA== dependencies: devlop "^1.0.0" @@ -2204,17 +1837,17 @@ micromark-util-subtokenize@^2.0.0: micromark-util-symbol@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz" integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== micromark-util-types@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz#f00225f5f5a0ebc3254f96c36b6605c4b393908e" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz" integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== micromark@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.2.tgz#91395a3e1884a198e62116e33c9c568e39936fdb" + resolved "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz" integrity sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA== dependencies: "@types/debug" "^4.0.0" @@ -2237,7 +1870,7 @@ micromark@^4.0.0: micromatch@^4.0.5: version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" @@ -2245,32 +1878,32 @@ micromatch@^4.0.5: min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== nanoid@^3.3.11: version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== node-addon-api@^7.0.0: version "7.1.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz" integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== node-releases@^2.0.19: version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== npm-run-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-6.0.0.tgz#25cfdc4eae04976f3349c0b1afc089052c362537" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz" integrity sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA== dependencies: path-key "^4.0.0" @@ -2278,19 +1911,19 @@ npm-run-path@^6.0.0: object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-entities@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz" integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== dependencies: "@types/unist" "^2.0.0" @@ -2303,7 +1936,7 @@ parse-entities@^4.0.0: parse-json@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -2313,64 +1946,64 @@ parse-json@^5.0.0: parse-numeric-range@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== parse5@^7.0.0: version "7.3.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz" integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== dependencies: entities "^6.0.0" path-key@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathe@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz" integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== -picocolors@1.1.1, picocolors@^1.1.1: +picocolors@^1.1.1, picocolors@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^4.0.2, picomatch@^4.0.3: +"picomatch@^3 || ^4", picomatch@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== postcss-simple-vars@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-simple-vars/-/postcss-simple-vars-7.0.1.tgz#836b3097a54dcd13dbd3c36a5dbdd512fad2954c" + resolved "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-7.0.1.tgz" integrity sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A== -postcss@^8.5.6: +postcss@^8.2.1, postcss@^8.5.6: version "8.5.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== dependencies: nanoid "^3.3.11" @@ -2379,7 +2012,7 @@ postcss@^8.5.6: pretty-format@^27.0.2: version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: ansi-regex "^5.0.1" @@ -2388,7 +2021,7 @@ pretty-format@^27.0.2: prop-types-extra@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" + resolved "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz" integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== dependencies: react-is "^16.3.2" @@ -2396,7 +2029,7 @@ prop-types-extra@^1.1.0: prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -2405,17 +2038,17 @@ prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1: property-information@^6.0.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + resolved "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz" integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== property-information@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.1.0.tgz#b622e8646e02b580205415586b40804d3e8bfd5d" + resolved "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz" integrity sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ== query-string@^9.3.1: version "9.3.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-9.3.1.tgz#d0c93e6c7fb7c17bdf04aa09e382114580ede270" + resolved "https://registry.npmjs.org/query-string/-/query-string-9.3.1.tgz" integrity sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw== dependencies: decode-uri-component "^0.4.1" @@ -2424,21 +2057,21 @@ query-string@^9.3.1: raf@^3.4.1: version "3.4.1" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: performance-now "^2.1.0" randombytes@^2.0.5: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" react-bootstrap@^2.10.10: version "2.10.10" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.10.10.tgz#be0b0d951a69987152d75c0e6986c80425efdf21" + resolved "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.10.tgz" integrity sha512-gMckKUqn8aK/vCnfwoBpBVFUGT9SVQxwsYrp9yDHt0arXMamxALerliKBxr1TPbntirK/HGrUAHYbAeQTa9GHQ== dependencies: "@babel/runtime" "^7.24.7" @@ -2455,21 +2088,21 @@ react-bootstrap@^2.10.10: uncontrollable "^7.2.1" warning "^4.0.3" -react-dom@^19.2.0: - version "19.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.0.tgz#00ed1e959c365e9a9d48f8918377465466ec3af8" - integrity sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ== +"react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.2.3, react-dom@>=16.14.0, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.9.0, react-dom@>=18, react-dom@>16.8.0: + version "19.2.3" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz" + integrity sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg== dependencies: scheduler "^0.27.0" react-fast-compare@^2.0.1: version "2.0.4" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz" integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== react-intl@^7.1.14: version "7.1.14" - resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-7.1.14.tgz#5500f76b0bb35694a7bec418b1adf1533dad6752" + resolved "https://registry.npmjs.org/react-intl/-/react-intl-7.1.14.tgz" integrity sha512-VE/0Wi/lHJlBC7APQpCzLUdIt3GB5B0GZrRW8Q+ACbkHI4j+Wwgg9J1TniN6zmLHmPH5gxXcMy+fkSPfw5p1WQ== dependencies: "@formatjs/ecma402-abstract" "2.3.6" @@ -2483,22 +2116,22 @@ react-intl@^7.1.14: react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^17.0.1: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-lifecycles-compat@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== react-markdown@^10.1.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-10.1.0.tgz#e22bc20faddbc07605c15284255653c0f3bad5ca" + resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz" integrity sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ== dependencies: "@types/hast" "^3.0.0" @@ -2515,19 +2148,19 @@ react-markdown@^10.1.0: react-refresh@^0.18.0: version "0.18.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.18.0.tgz#2dce97f4fe932a4d8142fa1630e475c1729c8062" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz" integrity sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw== react-router-dom@^7.9.5: version "7.9.5" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.9.5.tgz#99a88cde83919bdfc84fbb3d6bf7c6fc18ca0758" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.5.tgz" integrity sha512-mkEmq/K8tKN63Ae2M7Xgz3c9l9YNbY+NHH6NNeUmLA3kDkhKXRsNb/ZpxaEunvGo2/3YXdk5EJU3Hxp3ocaBPw== dependencies: react-router "7.9.5" react-router@7.9.5: version "7.9.5" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.9.5.tgz#68722186b4c9f42be36e658d9fe5d62ac1e0808b" + resolved "https://registry.npmjs.org/react-router/-/react-router-7.9.5.tgz" integrity sha512-JmxqrnBZ6E9hWmf02jzNn9Jm3UqyeimyiwzD69NjxGySG6lIz/1LVPsoTCwN7NBX2XjCEa1LIX5EMz1j2b6u6A== dependencies: cookie "^1.0.1" @@ -2535,7 +2168,7 @@ react-router@7.9.5: react-select@^5.10.2: version "5.10.2" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.10.2.tgz#8dffc69dfd7d74684d9613e6eb27204e3b99e127" + resolved "https://registry.npmjs.org/react-select/-/react-select-5.10.2.tgz" integrity sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ== dependencies: "@babel/runtime" "^7.12.0" @@ -2550,14 +2183,14 @@ react-select@^5.10.2: react-toastify@^11.0.5: version "11.0.5" - resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-11.0.5.tgz#ce4c42d10eeb433988ab2264d3e445c4e9d13313" + resolved "https://registry.npmjs.org/react-toastify/-/react-toastify-11.0.5.tgz" integrity sha512-EpqHBGvnSTtHYhCPLxML05NLY2ZX0JURbAdNYa6BUkk+amz4wbKBQvoKQAB0ardvSarUBuY4Q4s1sluAzZwkmA== dependencies: clsx "^2.1.1" react-transition-group@^4.3.0, react-transition-group@^4.4.5: version "4.4.5" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: "@babel/runtime" "^7.5.5" @@ -2565,19 +2198,19 @@ react-transition-group@^4.3.0, react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" -react@^19.2.0: - version "19.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-19.2.0.tgz#d33dd1721698f4376ae57a54098cb47fc75d93a5" - integrity sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ== +"react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react@^18 || ^19", "react@^18.0.0 || ^19.0.0", react@^19.2.3, "react@>= 16", react@>=0.14.0, react@>=15.0.0, react@>=16.14.0, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=16.9.0, react@>=18, react@>16.8.0, "react@16 || 17 || 18 || 19": + version "19.2.3" + resolved "https://registry.npmjs.org/react/-/react-19.2.3.tgz" + integrity sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA== readdirp@^4.0.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== redent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" @@ -2585,7 +2218,7 @@ redent@^3.0.0: refractor@^4.8.0: version "4.9.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-4.9.0.tgz#2e1c7af0157230cdd2f9086660912eadc5f68323" + resolved "https://registry.npmjs.org/refractor/-/refractor-4.9.0.tgz" integrity sha512-nEG1SPXFoGGx+dcjftjv8cAjEusIh6ED1xhf5DG3C0x/k+rmZ2duKnc3QLpt6qeHv5fPb8uwN3VWN2BT7fr3Og== dependencies: "@types/hast" "^2.0.0" @@ -2595,7 +2228,7 @@ refractor@^4.8.0: rehype-parse@^9.0.0: version "9.0.1" - resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-9.0.1.tgz#9993bda129acc64c417a9d3654a7be38b2a94c20" + resolved "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz" integrity sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag== dependencies: "@types/hast" "^3.0.0" @@ -2604,7 +2237,7 @@ rehype-parse@^9.0.0: rehype-prism-plus@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/rehype-prism-plus/-/rehype-prism-plus-2.0.0.tgz#75b1e2d0dd7496125987a1732cb7d560de02a0fd" + resolved "https://registry.npmjs.org/rehype-prism-plus/-/rehype-prism-plus-2.0.0.tgz" integrity sha512-FeM/9V2N7EvDZVdR2dqhAzlw5YI49m9Tgn7ZrYJeYHIahM6gcXpH0K1y2gNnKanZCydOMluJvX2cB9z3lhY8XQ== dependencies: hast-util-to-string "^3.0.0" @@ -2616,7 +2249,7 @@ rehype-prism-plus@2.0.0: rehype-stringify@^10.0.0: version "10.0.1" - resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-10.0.1.tgz#2ec1ebc56c6aba07905d3b4470bdf0f684f30b75" + resolved "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz" integrity sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA== dependencies: "@types/hast" "^3.0.0" @@ -2625,7 +2258,7 @@ rehype-stringify@^10.0.0: rehype@~13.0.0: version "13.0.2" - resolved "https://registry.yarnpkg.com/rehype/-/rehype-13.0.2.tgz#ab0b3ac26573d7b265a0099feffad450e4cf1952" + resolved "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz" integrity sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A== dependencies: "@types/hast" "^3.0.0" @@ -2635,7 +2268,7 @@ rehype@~13.0.0: remark-parse@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz" integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== dependencies: "@types/mdast" "^4.0.0" @@ -2645,7 +2278,7 @@ remark-parse@^11.0.0: remark-rehype@^11.0.0: version "11.1.2" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.2.tgz#2addaadda80ca9bd9aa0da763e74d16327683b37" + resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz" integrity sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw== dependencies: "@types/hast" "^3.0.0" @@ -2656,12 +2289,12 @@ remark-rehype@^11.0.0: resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve@^1.19.0: version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: is-core-module "^2.16.0" @@ -2670,7 +2303,7 @@ resolve@^1.19.0: rollup@^4.43.0: version "4.50.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.50.0.tgz#6f237f598b7163ede33ce827af8534c929aaa186" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.50.0.tgz" integrity sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw== dependencies: "@types/estree" "1.0.8" @@ -2700,7 +2333,7 @@ rollup@^4.43.0: rooks@^9.3.0: version "9.3.0" - resolved "https://registry.yarnpkg.com/rooks/-/rooks-9.3.0.tgz#7a3eb44192b7d5b1321acdf15fafdee37987c348" + resolved "https://registry.npmjs.org/rooks/-/rooks-9.3.0.tgz" integrity sha512-ez9ReItW+a/GXsA92Lfh5KWTjhbzlp354KOlC5oh9RHVD5fs/GaWwBq72F2xkDXVblgCgFs0Nel1hxojtszhgw== dependencies: fast-deep-equal "^3.1.3" @@ -2710,12 +2343,12 @@ rooks@^9.3.0: safe-buffer@^5.1.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -sass@^1.93.3: +sass@^1.70.0, sass@^1.93.3: version "1.93.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.93.3.tgz#3ff0aa5879dc910d32eae10c282a2847bd63e758" + resolved "https://registry.npmjs.org/sass/-/sass-1.93.3.tgz" integrity sha512-elOcIZRTM76dvxNAjqYrucTSI0teAF/L2Lv0s6f6b7FOwcwIuA357bIE871580AjHJuSvLIRUosgV+lIWx6Rgg== dependencies: chokidar "^4.0.0" @@ -2726,57 +2359,57 @@ sass@^1.93.3: scheduler@^0.27.0: version "0.27.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz" integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== set-cookie-parser@^2.6.0: version "2.7.1" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz" integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== siginfo@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.1: +source-map-js@^1.2.1, "source-map-js@>=0.6.2 <2.0.0": version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map@^0.5.7: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== space-separated-tokens@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== split-on-first@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-3.0.0.tgz#f04959c9ea8101b9b0bbf35a61b9ebea784a23e7" + resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz" integrity sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA== stackback@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz" integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== std-env@^3.9.0: version "3.9.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz" integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== stringify-entities@^4.0.0: version "4.0.4" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== dependencies: character-entities-html4 "^2.0.0" @@ -2784,66 +2417,58 @@ stringify-entities@^4.0.0: strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" style-to-js@^1.0.0: version "1.1.18" - resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.18.tgz#3e6c13bd4c4db079bd2c2c94571cce5c758bc2ff" + resolved "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.18.tgz" integrity sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg== dependencies: style-to-object "1.0.11" style-to-object@1.0.11: version "1.0.11" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.11.tgz#cf252c4051758b7acb18a5efb296f91fb79bb9c4" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.11.tgz" integrity sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow== dependencies: inline-style-parser "0.2.4" stylis@4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== tiny-invariant@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz" integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== tiny-warning@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== tinybench@^2.9.0: version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz" integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== tinyexec@^0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz" integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== -tinyglobby@^0.2.14: - version "0.2.14" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" - integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== - dependencies: - fdir "^6.4.4" - picomatch "^4.0.2" - -tinyglobby@^0.2.15: +tinyglobby@^0.2.14, tinyglobby@^0.2.15: version "0.2.15" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz" integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== dependencies: fdir "^6.5.0" @@ -2851,49 +2476,49 @@ tinyglobby@^0.2.15: tinyrainbow@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-3.0.3.tgz#984a5b1c1b25854a9b6bccbe77964d0593d1ea42" + resolved "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz" integrity sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q== tmp@^0.2.5: version "0.2.5" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz" integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" trim-lines@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz" integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== trough@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + resolved "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz" integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== tsconfck@^3.0.3: version "3.1.6" - resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.1.6.tgz#da1f0b10d82237ac23422374b3fce1edb23c3ead" + resolved "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz" integrity sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w== tslib@^2.0.0, tslib@^2.8.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -typescript@5.9.3: +typescript@*, typescript@^5.0.0, typescript@^5.6.0, typescript@>4.0.0, typescript@5.9.3: version "5.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== uncontrollable@^7.2.1: version "7.2.1" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" + resolved "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz" integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== dependencies: "@babel/runtime" "^7.6.3" @@ -2903,22 +2528,22 @@ uncontrollable@^7.2.1: uncontrollable@^8.0.4: version "8.0.4" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-8.0.4.tgz#a0a8307f638795162fafd0550f4a1efa0f8c5eb6" + resolved "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz" integrity sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ== undici-types@~6.21.0: version "6.21.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz" integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== unicorn-magic@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104" + resolved "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz" integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== unified@^11.0.0: version "11.0.5" - resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" + resolved "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz" integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== dependencies: "@types/unist" "^3.0.0" @@ -2931,7 +2556,7 @@ unified@^11.0.0: unist-util-filter@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/unist-util-filter/-/unist-util-filter-5.0.1.tgz#f9f3a0bdee007e040964c274dda27bac663d0a39" + resolved "https://registry.npmjs.org/unist-util-filter/-/unist-util-filter-5.0.1.tgz" integrity sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw== dependencies: "@types/unist" "^3.0.0" @@ -2940,28 +2565,28 @@ unist-util-filter@^5.0.0: unist-util-is@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz" integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== dependencies: "@types/unist" "^3.0.0" unist-util-position@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz" integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== dependencies: "@types/unist" "^3.0.0" unist-util-stringify-position@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz" integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== dependencies: "@types/unist" "^3.0.0" unist-util-visit-parents@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz" integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== dependencies: "@types/unist" "^3.0.0" @@ -2969,7 +2594,7 @@ unist-util-visit-parents@^6.0.0: unist-util-visit@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz" integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== dependencies: "@types/unist" "^3.0.0" @@ -2978,7 +2603,7 @@ unist-util-visit@^5.0.0: update-browserslist-db@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: escalade "^3.2.0" @@ -2986,17 +2611,17 @@ update-browserslist-db@^1.1.3: use-isomorphic-layout-effect@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz#2f11a525628f56424521c748feabc2ffcc962fce" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz" integrity sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA== use-sync-external-store@^1.4.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz#55122e2a3edd2a6c106174c27485e0fd59bcfca0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz" integrity sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A== vfile-location@^5.0.0: version "5.0.3" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.3.tgz#cb9eacd20f2b6426d19451e0eafa3d0a846225c3" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz" integrity sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg== dependencies: "@types/unist" "^3.0.0" @@ -3004,7 +2629,7 @@ vfile-location@^5.0.0: vfile-message@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.3.tgz#87b44dddd7b70f0641c2e3ed0864ba73e2ea8df4" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz" integrity sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw== dependencies: "@types/unist" "^3.0.0" @@ -3012,7 +2637,7 @@ vfile-message@^4.0.0: vfile@^6.0.0: version "6.0.3" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" + resolved "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz" integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== dependencies: "@types/unist" "^3.0.0" @@ -3020,7 +2645,7 @@ vfile@^6.0.0: vite-plugin-checker@^0.11.0: version "0.11.0" - resolved "https://registry.yarnpkg.com/vite-plugin-checker/-/vite-plugin-checker-0.11.0.tgz#063ce180c3751b790a6472e19c5d1a352b215070" + resolved "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.11.0.tgz" integrity sha512-iUdO9Pl9UIBRPAragwi3as/BXXTtRu4G12L3CMrjx+WVTd9g/MsqNakreib9M/2YRVkhZYiTEwdH2j4Dm0w7lw== dependencies: "@babel/code-frame" "^7.27.1" @@ -3034,16 +2659,16 @@ vite-plugin-checker@^0.11.0: vite-tsconfig-paths@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz#d9a71106a7ff2c1c840c6f1708042f76a9212ed4" + resolved "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz" integrity sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w== dependencies: debug "^4.1.1" globrex "^0.1.2" tsconfck "^3.0.3" -"vite@^6.0.0 || ^7.0.0", vite@^7.1.12: +vite@*, "vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "vite@^6.0.0 || ^7.0.0", "vite@^6.0.0 || ^7.0.0-0", vite@^7.1.12, vite@>=5.4.20: version "7.1.12" - resolved "https://registry.yarnpkg.com/vite/-/vite-7.1.12.tgz#8b29a3f61eba23bcb93fc9ec9af4a3a1e83eecdb" + resolved "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz" integrity sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug== dependencies: esbuild "^0.25.0" @@ -3057,7 +2682,7 @@ vite-tsconfig-paths@^5.1.4: vitest@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-4.0.6.tgz#a0cbc78192cce8726d06c471b8e5b5b9cc6beea5" + resolved "https://registry.npmjs.org/vitest/-/vitest-4.0.6.tgz" integrity sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ== dependencies: "@vitest/expect" "4.0.6" @@ -3083,29 +2708,29 @@ vitest@^4.0.6: vscode-uri@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.1.0.tgz#dd09ec5a66a38b5c3fffc774015713496d14e09c" + resolved "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz" integrity sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== warning@^4.0.0, warning@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" web-namespaces@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== whatwg-mimetype@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== why-is-node-running@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz" integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== dependencies: siginfo "^2.0.0" @@ -3113,15 +2738,15 @@ why-is-node-running@^2.3.0: yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yaml@^1.10.0: version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== zwitch@^2.0.0, zwitch@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz" integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From 2f6e3ad804214474c224a757919436a5e7dd3c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Thu, 18 Dec 2025 18:21:14 +0000 Subject: [PATCH 34/55] Added Irish translation --- frontend/src/locale/IntlProvider.tsx | 2 + .../src/locale/src/HelpDoc/ga/AccessLists.md | 7 + .../src/locale/src/HelpDoc/ga/Certificates.md | 21 + .../src/locale/src/HelpDoc/ga/DeadHosts.md | 7 + .../src/locale/src/HelpDoc/ga/ProxyHosts.md | 7 + .../locale/src/HelpDoc/ga/RedirectionHosts.md | 5 + frontend/src/locale/src/HelpDoc/ga/Streams.md | 5 + frontend/src/locale/src/HelpDoc/ga/index.ts | 6 + frontend/src/locale/src/HelpDoc/index.ts | 3 +- frontend/src/locale/src/ga.json | 683 ++++++++++++++++++ frontend/src/locale/src/lang-list.json | 81 ++- 11 files changed, 787 insertions(+), 40 deletions(-) create mode 100644 frontend/src/locale/src/HelpDoc/ga/AccessLists.md create mode 100644 frontend/src/locale/src/HelpDoc/ga/Certificates.md create mode 100644 frontend/src/locale/src/HelpDoc/ga/DeadHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/ga/ProxyHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/ga/RedirectionHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/ga/Streams.md create mode 100644 frontend/src/locale/src/HelpDoc/ga/index.ts create mode 100644 frontend/src/locale/src/ga.json diff --git a/frontend/src/locale/IntlProvider.tsx b/frontend/src/locale/IntlProvider.tsx index d38df0d4..f41e260e 100755 --- a/frontend/src/locale/IntlProvider.tsx +++ b/frontend/src/locale/IntlProvider.tsx @@ -2,6 +2,7 @@ import { createIntl, createIntlCache } from "react-intl"; import langDe from "./lang/de.json"; import langEn from "./lang/en.json"; import langEs from "./lang/es.json"; +import langGa from "./lang/ga.json"; import langIt from "./lang/it.json"; import langJa from "./lang/ja.json"; import langList from "./lang/lang-list.json"; @@ -21,6 +22,7 @@ const localeOptions = [ ["en", "en-US", langEn], ["de", "de-DE", langDe], ["es", "es-ES", langEs], + ["ga", "ga-IE", langGa], ["ja", "ja-JP", langJa], ["it", "it-IT", langIt], ["nl", "nl-NL", langNl], diff --git a/frontend/src/locale/src/HelpDoc/ga/AccessLists.md b/frontend/src/locale/src/HelpDoc/ga/AccessLists.md new file mode 100644 index 00000000..64b35e99 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ga/AccessLists.md @@ -0,0 +1,7 @@ +## Cad is Liosta Rochtana ann? + +Soláthraíonn Liostaí Rochtana liosta dubh nó liosta bán de sheoltaí IP cliant ar leith mar aon le fíordheimhniú do na hÓstaigh Seachfhreastalaí trí Fhíordheimhniú Bunúsach HTTP. + +Is féidir leat rialacha cliant, ainmneacha úsáideora agus pasfhocail iolracha a chumrú le haghaidh Liosta Rochtana aonair agus ansin iad sin a chur i bhfeidhm ar _Óstach Seachfhreastalaí_ amháin nó níos mó. + +Tá sé seo an-úsáideach i gcás seirbhísí gréasáin atreoraithe nach bhfuil meicníochtaí fíordheimhnithe ionsuite iontu nó nuair is mian leat cosaint a dhéanamh ar chliaint anaithnide. diff --git a/frontend/src/locale/src/HelpDoc/ga/Certificates.md b/frontend/src/locale/src/HelpDoc/ga/Certificates.md new file mode 100644 index 00000000..c69d7b4a --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ga/Certificates.md @@ -0,0 +1,21 @@ +## Cabhair le Deimhnithe + +### Teastas HTTP + +Ciallaíonn deimhniú bailíochtaithe HTTP go ndéanfaidh freastalaithe Let's Encrypt iarracht teacht ar do fhearainn thar HTTP (ní HTTPS!) agus má éiríonn leo, eiseoidh siad do theastas. + +Chun an modh seo a dhéanamh, beidh ort _Óstach Proxy_ a chruthú do do fhearainn(eanna) atá inrochtana le HTTP agus ag pointeáil chuig an suiteáil Nginx seo. Tar éis deimhniú a thabhairt, is féidir leat an _Óstach Proxy_ a mhodhnú chun an deimhniú seo a úsáid le haghaidh naisc HTTPS freisin. Mar sin féin, beidh ort an _Óstach Proxy_ a chumrú fós le haghaidh rochtain HTTP chun go ndéanfar an deimhniú a athnuachan. + +_Ní thacaíonn_ an próiseas seo le fearainn fiáine. + +### Teastas DNS + +Éilíonn deimhniú bailíochtaithe DNS ort breiseán Soláthraí DNS a úsáid. Úsáidfear an Soláthraí DNS seo chun taifid shealadacha a chruthú ar do fhearann agus ansin déanfaidh Let's Encrypt fiosrúchán ar na taifid sin lena chinntiú gurb tusa an t-úinéir agus má éiríonn leo, eiseoidh siad do theastas. + +Ní gá duit _Óstach Proxy_ a chruthú sula n-iarrann tú an cineál seo teastais. Ní gá duit do _Óstach Proxy_ a chumrú le haghaidh rochtana HTTP ach an oiread. + +_Tacaíonn_ an próiseas seo le fearainn fiáine. + +### Teastas Saincheaptha + +Úsáid an rogha seo chun do Theastas SSL féin a uaslódáil, mar a sholáthraíonn d'Údarás Deimhnithe féin é. \ No newline at end of file diff --git a/frontend/src/locale/src/HelpDoc/ga/DeadHosts.md b/frontend/src/locale/src/HelpDoc/ga/DeadHosts.md new file mode 100644 index 00000000..f6d20ed4 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ga/DeadHosts.md @@ -0,0 +1,7 @@ +## Cad is Óstach 404 ann? + +Is socrú óstach a thaispeánann leathanach 404 é Óstach 404. + +Is féidir leis seo a bheith úsáideach nuair a bhíonn do fhearann liostaithe in innill chuardaigh agus más mian leat leathanach earráide níos deise a sholáthar nó a chur in iúl do na hinnéacsóirí cuardaigh go sonrach nach bhfuil na leathanaigh fearainn ann a thuilleadh. + +Buntáiste eile a bhaineann leis an óstach seo a bheith agat ná go bhfeictear na logaí le haghaidh amas agus go bhfeictear na tagairtí. \ No newline at end of file diff --git a/frontend/src/locale/src/HelpDoc/ga/ProxyHosts.md b/frontend/src/locale/src/HelpDoc/ga/ProxyHosts.md new file mode 100644 index 00000000..542b3ec9 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ga/ProxyHosts.md @@ -0,0 +1,7 @@ +## Cad is Óstach Seachfhreastalaí ann? + +Is é Óstach Seachfhreastalaí an críochphointe isteach do sheirbhís ghréasáin ar mhaith leat a atreorú. + +Soláthraíonn sé foirceannadh SSL roghnach do do sheirbhís nach bhfuil tacaíocht SSL ionsuite inti b'fhéidir. + +Is iad Óstaigh Seachfhreastalaí an úsáid is coitianta a bhaintear as Bainisteoir Seachfhreastalaí Nginx. \ No newline at end of file diff --git a/frontend/src/locale/src/HelpDoc/ga/RedirectionHosts.md b/frontend/src/locale/src/HelpDoc/ga/RedirectionHosts.md new file mode 100644 index 00000000..5995c142 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ga/RedirectionHosts.md @@ -0,0 +1,5 @@ +## Cad is Óstach Athsheolta ann? + +Déanfaidh Óstach Athsheolta iarratais a atreorú ón bhfearann ag teacht isteach agus an breathnóir a bhrú chuig fearann eile. + +Is é an chúis is coitianta le húsáid a bhaint as an gcineál seo óstála ná nuair a athraíonn do shuíomh Gréasáin fearainn ach go bhfuil naisc innill chuardaigh nó atreoraithe agat fós ag tagairt don seanfhearann. diff --git a/frontend/src/locale/src/HelpDoc/ga/Streams.md b/frontend/src/locale/src/HelpDoc/ga/Streams.md new file mode 100644 index 00000000..cac45da4 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ga/Streams.md @@ -0,0 +1,5 @@ +## Cad is Sruth ann? + +Gné réasúnta nua do Nginx is ea Sruth a sheolfaidh trácht TCP/UDP go díreach chuig ríomhaire eile ar an líonra. + +Más freastalaithe cluichí, freastalaithe FTP nó SSH atá á rith agat, d’fhéadfadh sé seo a bheith úsáideach. diff --git a/frontend/src/locale/src/HelpDoc/ga/index.ts b/frontend/src/locale/src/HelpDoc/ga/index.ts new file mode 100644 index 00000000..a9bb46ba --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/ga/index.ts @@ -0,0 +1,6 @@ +export * as AccessLists from "./AccessLists.md"; +export * as Certificates from "./Certificates.md"; +export * as DeadHosts from "./DeadHosts.md"; +export * as ProxyHosts from "./ProxyHosts.md"; +export * as RedirectionHosts from "./RedirectionHosts.md"; +export * as Streams from "./Streams.md"; diff --git a/frontend/src/locale/src/HelpDoc/index.ts b/frontend/src/locale/src/HelpDoc/index.ts index f70dff69..ef8ecad2 100644 --- a/frontend/src/locale/src/HelpDoc/index.ts +++ b/frontend/src/locale/src/HelpDoc/index.ts @@ -10,8 +10,9 @@ import * as vi from "./vi/index"; import * as zh from "./zh/index"; import * as ko from "./ko/index"; import * as bg from "./bg/index"; +import * as ga from './ga/index' -const items: any = { en, de, ja, sk, zh, pl, ru, it, vi, nl, bg, ko }; +const items: any = { en, de, ja, sk, zh, pl, ru, it, vi, nl, bg, ko, ga } const fallbackLang = "en"; diff --git a/frontend/src/locale/src/ga.json b/frontend/src/locale/src/ga.json new file mode 100644 index 00000000..66306f1d --- /dev/null +++ b/frontend/src/locale/src/ga.json @@ -0,0 +1,683 @@ +{ + "access-list": { + "defaultMessage": "Liosta Rochtana" + }, + "access-list.access-count": { + "defaultMessage": "{count} {count, plural, one {Rial} other {Rialacha}}" + }, + "access-list.auth-count": { + "defaultMessage": "{count} {count, plural, one {Úsáideoir} other {Úsáideoirí}}" + }, + "access-list.help-rules-last": { + "defaultMessage": "Nuair a bhíonn riail amháin ar a laghad ann, cuirfear an riail seo chun gach rud a dhiúltú leis an gceann deireanach." + }, + "access-list.help.rules-order": { + "defaultMessage": "Tabhair faoi deara go gcuirfear na treoracha ceadaigh agus diúltaigh i bhfeidhm san ord a shainmhínítear iad." + }, + "access-list.pass-auth": { + "defaultMessage": "Tabhair Údarú chuig an Sruth Uachtarach" + }, + "access-list.public": { + "defaultMessage": "Inrochtana don Phobal" + }, + "access-list.public.subtitle": { + "defaultMessage": "Níl aon údarú bunúsach ag teastáil" + }, + "access-list.rule-source.placeholder": { + "defaultMessage": "192.168.1.100 nó 192.168.1.0/24 nó 2001:0db8::/32" + }, + "access-list.satisfy-any": { + "defaultMessage": "Sásaigh Aon" + }, + "access-list.subtitle": { + "defaultMessage": "{users} {users, plural, one {Úsáideoir} other {Úsáideoirí}}, {rules} {rules, plural, one {Riail} other {Rialacha}} - Cruthaithe: {date}" + }, + "access-lists": { + "defaultMessage": "Liostaí Rochtana" + }, + "action.add": { + "defaultMessage": "Cuir leis" + }, + "action.add-location": { + "defaultMessage": "Cuir Suíomh leis" + }, + "action.allow": { + "defaultMessage": "Ceadaigh" + }, + "action.close": { + "defaultMessage": "Dún" + }, + "action.delete": { + "defaultMessage": "Scrios" + }, + "action.deny": { + "defaultMessage": "Diúltaigh" + }, + "action.disable": { + "defaultMessage": "Díchumasaigh" + }, + "action.download": { + "defaultMessage": "Íoslódáil" + }, + "action.edit": { + "defaultMessage": "Cuir in Eagar" + }, + "action.enable": { + "defaultMessage": "Cumasaigh" + }, + "action.permissions": { + "defaultMessage": "Ceadanna" + }, + "action.renew": { + "defaultMessage": "Athnuachan" + }, + "action.view-details": { + "defaultMessage": "Féach Sonraí" + }, + "auditlogs": { + "defaultMessage": "Logaí Iniúchta" + }, + "auto": { + "defaultMessage": "Uath" + }, + "cancel": { + "defaultMessage": "Cealaigh" + }, + "certificate": { + "defaultMessage": "Teastas" + }, + "certificate.custom-certificate": { + "defaultMessage": "Teastas" + }, + "certificate.custom-certificate-key": { + "defaultMessage": "Eochair Teastais" + }, + "certificate.custom-intermediate": { + "defaultMessage": "Teastas Idirmheánach" + }, + "certificate.in-use": { + "defaultMessage": "In Úsáid" + }, + "certificate.none.subtitle": { + "defaultMessage": "Níor sannadh aon deimhniú" + }, + "certificate.none.subtitle.for-http": { + "defaultMessage": "Ní úsáidfidh an t-óstach seo HTTPS" + }, + "certificate.none.title": { + "defaultMessage": "Dada" + }, + "certificate.not-in-use": { + "defaultMessage": "Níor Úsáideadh" + }, + "certificate.renew": { + "defaultMessage": "Athnuachan an Teastais" + }, + "certificates": { + "defaultMessage": "Teastais" + }, + "certificates.custom": { + "defaultMessage": "Teastas Saincheaptha" + }, + "certificates.custom.warning": { + "defaultMessage": "Ní thacaítear le comhaid eochair atá cosanta le frása faire." + }, + "certificates.dns.credentials": { + "defaultMessage": "Ábhar Comhaid Dintiúir" + }, + "certificates.dns.credentials-note": { + "defaultMessage": "Éilíonn an breiseán seo comhad cumraíochta ina bhfuil comhartha API nó dintiúir eile do do sholáthraí." + }, + "certificates.dns.credentials-warning": { + "defaultMessage": "Stórálfar an fhaisnéis seo mar théacs simplí sa bhunachar sonraí agus i gcomhad!" + }, + "certificates.dns.propagation-seconds": { + "defaultMessage": "Soicindí Iolraithe" + }, + "certificates.dns.propagation-seconds-note": { + "defaultMessage": "Fág folamh chun luach réamhshocraithe na mbreiseán a úsáid. Líon na soicindí le fanacht le haghaidh iomadú DNS." + }, + "certificates.dns.provider": { + "defaultMessage": "Soláthraí DNS" + }, + "certificates.dns.provider.placeholder": { + "defaultMessage": "Roghnaigh Soláthraí..." + }, + "certificates.dns.warning": { + "defaultMessage": "Éilíonn an chuid seo roinnt eolais faoi Certbot agus a bhreiseáin DNS. Féach ar dhoiciméadacht na mbreiseán faoi seach, le do thoil." + }, + "certificates.http.reachability-404": { + "defaultMessage": "Tá freastalaí aimsithe ag an bhfearann ​​seo ach ní cosúil gur Bainisteoir Proxy Nginx atá ann. Déan cinnte go bhfuil do fhearann ​​ag pointeáil chuig an seoladh IP ina bhfuil d'eispéireas NPM ag rith." + }, + "certificates.http.reachability-failed-to-check": { + "defaultMessage": "Theip ar sheiceáil an inrochtaineachta mar gheall ar earráid chumarsáide le site24x7.com." + }, + "certificates.http.reachability-not-resolved": { + "defaultMessage": "Níl aon fhreastalaí ar fáil ag an bhfearann ​​seo. Cinntigh le do thoil go bhfuil do fhearann ​​ann agus go bhfuil sé ag pointeáil chuig an seoladh IP ina bhfuil d'eispéireas NPM ag rith agus más gá, go bhfuil port 80 curtha ar aghaidh i do ródaire." + }, + "certificates.http.reachability-ok": { + "defaultMessage": "Tá rochtain ar do fhreastalaí agus ba cheart go mbeadh sé indéanta deimhnithe a chruthú." + }, + "certificates.http.reachability-other": { + "defaultMessage": "Tá freastalaí aimsithe ag an bhfearann ​​seo ach thug sé cód stádais gan choinne {code} ar ais. An é an freastalaí NPM atá ann? Déan cinnte go bhfuil do fhearann ​​ag pointeáil chuig an seoladh IP ina bhfuil d'eispéireas NPM ag rith." + }, + "certificates.http.reachability-wrong-data": { + "defaultMessage": "Tá freastalaí aimsithe ag an bhfearann ​​seo ach thug sé sonraí gan choinne ar ais. An é an freastalaí NPM atá ann? Déan cinnte go bhfuil do fhearann ​​ag pointeáil chuig an seoladh IP ina bhfuil d'eispéireas NPM ag rith." + }, + "certificates.http.test-results": { + "defaultMessage": "Torthaí Tástála" + }, + "certificates.http.warning": { + "defaultMessage": "Ní mór na fearainn seo a bheith cumraithe cheana féin chun pointeáil chuig an suiteáil seo." + }, + "certificates.request.subtitle": { + "defaultMessage": "le Let's Encrypt" + }, + "certificates.request.title": { + "defaultMessage": "Iarr Teastas nua" + }, + "column.access": { + "defaultMessage": "Rochtain" + }, + "column.authorization": { + "defaultMessage": "Údarú" + }, + "column.authorizations": { + "defaultMessage": "Údaruithe" + }, + "column.custom-locations": { + "defaultMessage": "Suíomhanna Saincheaptha" + }, + "column.destination": { + "defaultMessage": "Ceann Scríbe" + }, + "column.details": { + "defaultMessage": "Sonraí" + }, + "column.email": { + "defaultMessage": "Ríomhphost" + }, + "column.event": { + "defaultMessage": "Imeacht" + }, + "column.expires": { + "defaultMessage": "Éagaíonn" + }, + "column.http-code": { + "defaultMessage": "Cód HTTP" + }, + "column.incoming-port": { + "defaultMessage": "Port Isteach" + }, + "column.name": { + "defaultMessage": "Ainm" + }, + "column.protocol": { + "defaultMessage": "Prótacal" + }, + "column.provider": { + "defaultMessage": "Soláthraí" + }, + "column.roles": { + "defaultMessage": "Róil" + }, + "column.rules": { + "defaultMessage": "Rialacha" + }, + "column.satisfy": { + "defaultMessage": "Sásamh" + }, + "column.satisfy-all": { + "defaultMessage": "Gach" + }, + "column.satisfy-any": { + "defaultMessage": "Aon" + }, + "column.scheme": { + "defaultMessage": "Scéim" + }, + "column.source": { + "defaultMessage": "Foinse" + }, + "column.ssl": { + "defaultMessage": "SSL" + }, + "column.status": { + "defaultMessage": "Stádas" + }, + "created-on": { + "defaultMessage": "Cruthaithe: {date}" + }, + "dashboard": { + "defaultMessage": "Painéal Rialaithe" + }, + "dead-host": { + "defaultMessage": "Óstach 404" + }, + "dead-hosts": { + "defaultMessage": "404 Óstaigh" + }, + "dead-hosts.count": { + "defaultMessage": "{count} {count, plural, one {Óstach 404} other {Óstaigh 404}}" + }, + "disabled": { + "defaultMessage": "Míchumasaithe" + }, + "domain-names": { + "defaultMessage": "Ainmneacha Fearainn" + }, + "domain-names.max": { + "defaultMessage": "Uasmhéid d'ainmneacha fearainn: {count}" + }, + "domain-names.placeholder": { + "defaultMessage": "Tosaigh ag clóscríobh chun fearann ​​a chur leis..." + }, + "domain-names.wildcards-not-permitted": { + "defaultMessage": "Ní cheadaítear cártaí fiáine don chineál seo" + }, + "domain-names.wildcards-not-supported": { + "defaultMessage": "Ní thacaítear le cártaí fiáine don ÚD seo" + }, + "domains.force-ssl": { + "defaultMessage": "Fórsáil SSL" + }, + "domains.hsts-enabled": { + "defaultMessage": "Cumasaithe HSTS" + }, + "domains.hsts-subdomains": { + "defaultMessage": "Fo-fhearainn HSTS" + }, + "domains.http2-support": { + "defaultMessage": "Tacaíocht HTTP/2" + }, + "domains.use-dns": { + "defaultMessage": "Úsáid Dúshlán DNS" + }, + "email-address": { + "defaultMessage": "Seoladh ríomhphoist" + }, + "empty-search": { + "defaultMessage": "Níor aimsíodh aon torthaí" + }, + "empty-subtitle": { + "defaultMessage": "Cén fáth nach gcruthaíonn tú ceann?" + }, + "enabled": { + "defaultMessage": "Cumasaithe" + }, + "error.access.at-least-one": { + "defaultMessage": "Tá Údarú amháin nó Riail Rochtana amháin ag teastáil" + }, + "error.access.duplicate-usernames": { + "defaultMessage": "Ní mór d’ainmneacha úsáideora údaraithe a bheith uathúil" + }, + "error.invalid-auth": { + "defaultMessage": "Ríomhphost nó pasfhocal neamhbhailí" + }, + "error.invalid-domain": { + "defaultMessage": "Fearann ​​neamhbhailí: {domain}" + }, + "error.invalid-email": { + "defaultMessage": "Seoladh ríomhphoist neamhbhailí" + }, + "error.max-character-length": { + "defaultMessage": "Is é an fad uasta ná {max} carachtar{max, plural, one {} other {anna}}" + }, + "error.max-domains": { + "defaultMessage": "An iomarca fearainn, is é {max} an t-uasmhéid" + }, + "error.maximum": { + "defaultMessage": "Is é {max} an t-uasmhéid" + }, + "error.min-character-length": { + "defaultMessage": "Is é an fad íosta ná {min} carachtar{min, plural, one {} other {anna}}" + }, + "error.minimum": { + "defaultMessage": "Is é {min} an t-íosmhéid" + }, + "error.passwords-must-match": { + "defaultMessage": "Ní mór pasfhocail a bheith mar a chéile" + }, + "error.required": { + "defaultMessage": "Tá sé seo riachtanach" + }, + "expires.on": { + "defaultMessage": "Éagaíonn: {date}" + }, + "footer.github-fork": { + "defaultMessage": "Forc mé ar Github" + }, + "host.flags.block-exploits": { + "defaultMessage": "Blocáil Easnaimh Choitianta" + }, + "host.flags.cache-assets": { + "defaultMessage": "Sócmhainní Taisce" + }, + "host.flags.preserve-path": { + "defaultMessage": "Cosán a Chaomhnú" + }, + "host.flags.protocols": { + "defaultMessage": "Prótacail" + }, + "host.flags.websockets-upgrade": { + "defaultMessage": "Tacaíocht Websockets" + }, + "host.forward-port": { + "defaultMessage": "Port Ar Aghaidh" + }, + "host.forward-scheme": { + "defaultMessage": "Scéim" + }, + "hosts": { + "defaultMessage": "Óstaigh" + }, + "http-only": { + "defaultMessage": "HTTP Amháin" + }, + "lets-encrypt": { + "defaultMessage": "Let's Encrypt" + }, + "lets-encrypt-via-dns": { + "defaultMessage": "Let's Encrypt trí DNS" + }, + "lets-encrypt-via-http": { + "defaultMessage": "Let's Encrypt trí HTTP" + }, + "loading": { + "defaultMessage": "Ag lódáil…" + }, + "login.title": { + "defaultMessage": "Logáil isteach i do chuntas" + }, + "nginx-config.label": { + "defaultMessage": "Cumraíocht Nginx Saincheaptha" + }, + "nginx-config.placeholder": { + "defaultMessage": "# Cuir isteach do chumraíocht saincheaptha Nginx anseo ar do phriacal féin!" + }, + "no-permission-error": { + "defaultMessage": "Níl rochtain agat chun seo a fheiceáil." + }, + "notfound.action": { + "defaultMessage": "Tabhair abhaile mé" + }, + "notfound.content": { + "defaultMessage": "Tá brón orainn ach níor aimsíodh an leathanach atá á lorg agat" + }, + "notfound.title": { + "defaultMessage": "Úps… Fuair ​​tú leathanach earráide díreach anois." + }, + "notification.error": { + "defaultMessage": "Earráid" + }, + "notification.object-deleted": { + "defaultMessage": "Scriosadh {object}" + }, + "notification.object-disabled": { + "defaultMessage": "Tá {object} díchumasaithe" + }, + "notification.object-enabled": { + "defaultMessage": "Tá {object} cumasaithe" + }, + "notification.object-renewed": { + "defaultMessage": "Tá {object} athnuaite" + }, + "notification.object-saved": { + "defaultMessage": "Tá {object} sábháilte" + }, + "notification.success": { + "defaultMessage": "Rath" + }, + "object.actions-title": { + "defaultMessage": "{object} #{id}" + }, + "object.add": { + "defaultMessage": "Cuir {object} leis" + }, + "object.delete": { + "defaultMessage": "Scrios {object}" + }, + "object.delete.content": { + "defaultMessage": "An bhfuil tú cinnte gur mian leat an {object} seo a scriosadh?" + }, + "object.edit": { + "defaultMessage": "Cuir in eagar {object}" + }, + "object.empty": { + "defaultMessage": "Níl aon {objects} ann" + }, + "object.event.created": { + "defaultMessage": "Cruthaithe {object}" + }, + "object.event.deleted": { + "defaultMessage": "Scriosadh {object}" + }, + "object.event.disabled": { + "defaultMessage": "Díchumasaithe {object}" + }, + "object.event.enabled": { + "defaultMessage": "Cumasaithe {object}" + }, + "object.event.renewed": { + "defaultMessage": "Athnuaite {object}" + }, + "object.event.updated": { + "defaultMessage": "Nuashonraithe {object}" + }, + "offline": { + "defaultMessage": "As líne" + }, + "online": { + "defaultMessage": "Ar líne" + }, + "options": { + "defaultMessage": "Roghanna" + }, + "password": { + "defaultMessage": "Pasfhocal" + }, + "password.generate": { + "defaultMessage": "Gin pasfhocal randamach" + }, + "password.hide": { + "defaultMessage": "Folaigh Pasfhocal" + }, + "password.show": { + "defaultMessage": "Taispeáin Pasfhocal" + }, + "permissions.hidden": { + "defaultMessage": "I bhfolach" + }, + "permissions.manage": { + "defaultMessage": "Bainistigh" + }, + "permissions.view": { + "defaultMessage": "Amharc Amháin" + }, + "permissions.visibility.all": { + "defaultMessage": "Gach Míreanna" + }, + "permissions.visibility.title": { + "defaultMessage": "Infheictheacht Míre" + }, + "permissions.visibility.user": { + "defaultMessage": "Míreanna Cruthaithe Amháin" + }, + "proxy-host": { + "defaultMessage": "Óstach Seachfhreastalaí" + }, + "proxy-host.forward-host": { + "defaultMessage": "Ainm Óstach / IP Ar Aghaidh" + }, + "proxy-hosts": { + "defaultMessage": "Óstaigh Seachfhreastalaí" + }, + "proxy-hosts.count": { + "defaultMessage": "{count} {count, plural, one {Óstach Seachfhreastalaí} other {Óstaigh Seachfhreastalaí}}" + }, + "public": { + "defaultMessage": "Poiblí" + }, + "redirection-host": { + "defaultMessage": "Óstach Athsheolta" + }, + "redirection-host.forward-domain": { + "defaultMessage": "Fearann ​​Ar Aghaidh" + }, + "redirection-host.forward-http-code": { + "defaultMessage": "Cód HTTP" + }, + "redirection-hosts": { + "defaultMessage": "Óstaigh Athsheolta" + }, + "redirection-hosts.count": { + "defaultMessage": "{count} {count, iolra, one {Athsheoladh Óstach} other {Athsheoladh Óstaigh}}" + }, + "redirection-hosts.http-code.300": { + "defaultMessage": "300 Rogha Ilghnéitheach" + }, + "redirection-hosts.http-code.301": { + "defaultMessage": "301 Bogtha go buan" + }, + "redirection-hosts.http-code.302": { + "defaultMessage": "302 Bogtha go sealadach" + }, + "redirection-hosts.http-code.303": { + "defaultMessage": "303 Féach eile" + }, + "redirection-hosts.http-code.307": { + "defaultMessage": "307 Atreorú sealadach" + }, + "redirection-hosts.http-code.308": { + "defaultMessage": "308 Athsheoladh buan" + }, + "role.admin": { + "defaultMessage": "Riarthóir" + }, + "role.standard-user": { + "defaultMessage": "Úsáideoir Caighdeánach" + }, + "save": { + "defaultMessage": "Sábháil" + }, + "setting": { + "defaultMessage": "Socrú" + }, + "settings": { + "defaultMessage": "Socruithe" + }, + "settings.default-site": { + "defaultMessage": "Suíomh Réamhshocraithe" + }, + "settings.default-site.404": { + "defaultMessage": "Leathanach 404" + }, + "settings.default-site.444": { + "defaultMessage": "Gan Freagra (444)" + }, + "settings.default-site.congratulations": { + "defaultMessage": "Leathanach Comhghairdeas" + }, + "settings.default-site.description": { + "defaultMessage": "Cad atá le taispeáint nuair a bhuaileann óstach anaithnid Nginx" + }, + "settings.default-site.html": { + "defaultMessage": "HTML saincheaptha" + }, + "settings.default-site.html.placeholder": { + "defaultMessage": "" + }, + "settings.default-site.redirect": { + "defaultMessage": "Atreorú" + }, + "setup.preamble": { + "defaultMessage": "Tosaigh trí do chuntas riarthóra a chruthú." + }, + "setup.title": { + "defaultMessage": "Fáilte!" + }, + "sign-in": { + "defaultMessage": "Sínigh isteach" + }, + "ssl-certificate": { + "defaultMessage": "Teastas SSL" + }, + "stream": { + "defaultMessage": "Sruth" + }, + "stream.forward-host": { + "defaultMessage": "Óstach Ar Aghaidh" + }, + "stream.forward-host.placeholder": { + "defaultMessage": "example.com nó 10.0.0.1 nó 2001:db8:3333:4444:5555:6666:7777:8888" + }, + "stream.incoming-port": { + "defaultMessage": "Port Isteach" + }, + "streams": { + "defaultMessage": "Sruthanna" + }, + "streams.count": { + "defaultMessage": "{count} {count, plural, one {Sruth} other {Sruthanna}}" + }, + "streams.tcp": { + "defaultMessage": "TCP" + }, + "streams.udp": { + "defaultMessage": "UDP" + }, + "test": { + "defaultMessage": "Tástáil" + }, + "update-available": { + "defaultMessage": "Nuashonrú ar Fáil: {latestVersion}" + }, + "user": { + "defaultMessage": "Úsáideoir" + }, + "user.change-password": { + "defaultMessage": "Athraigh Pasfhocal" + }, + "user.confirm-password": { + "defaultMessage": "Deimhnigh Pasfhocal" + }, + "user.current-password": { + "defaultMessage": "Pasfhocal Reatha" + }, + "user.edit-profile": { + "defaultMessage": "Cuir Próifíl in Eagar" + }, + "user.full-name": { + "defaultMessage": "Ainm Iomlán" + }, + "user.login-as": { + "defaultMessage": "Sínigh isteach mar {name}" + }, + "user.logout": { + "defaultMessage": "Logáil Amach" + }, + "user.new-password": { + "defaultMessage": "Pasfhocal Nua" + }, + "user.nickname": { + "defaultMessage": "Leasainm" + }, + "user.set-password": { + "defaultMessage": "Socraigh Pasfhocal" + }, + "user.set-permissions": { + "defaultMessage": "Socraigh Ceadanna do {name}" + }, + "user.switch-dark": { + "defaultMessage": "Athraigh go Mód Dorcha" + }, + "user.switch-light": { + "defaultMessage": "Athraigh go mód Solais" + }, + "username": { + "defaultMessage": "Ainm úsáideora" + }, + "users": { + "defaultMessage": "Úsáideoirí" + } +} diff --git a/frontend/src/locale/src/lang-list.json b/frontend/src/locale/src/lang-list.json index 520eef24..9d6f71f4 100755 --- a/frontend/src/locale/src/lang-list.json +++ b/frontend/src/locale/src/lang-list.json @@ -1,41 +1,44 @@ { - "locale-en-US": { - "defaultMessage": "English" - }, - "locale-es-ES": { - "defaultMessage": "Español" - }, - "locale-de-DE": { - "defaultMessage": "German" - }, - "locale-ja-JP": { - "defaultMessage": "日本語" - }, - "locale-ru-RU": { - "defaultMessage": "Русский" - }, - "locale-sk-SK": { - "defaultMessage": "Slovenčina" - }, - "locale-zh-CN": { - "defaultMessage": "中文" - }, - "locale-pl-PL": { - "defaultMessage": "Polski" - }, - "locale-it-IT": { - "defaultMessage": "Italiano" - }, - "locale-vi-VN": { - "defaultMessage": "Tiếng Việt" - }, - "locale-nl-NL": { - "defaultMessage": "Nederlands" - }, - "locale-ko-KR": { - "defaultMessage": "한국어" - }, - "locale-bg-BG": { - "defaultMessage": "Български" - } + "locale-en-US": { + "defaultMessage": "English" + }, + "locale-es-ES": { + "defaultMessage": "Español" + }, + "locale-ie-GA": { + "defaultMessage": "Gaeilge" + }, + "locale-de-DE": { + "defaultMessage": "German" + }, + "locale-ja-JP": { + "defaultMessage": "日本語" + }, + "locale-ru-RU": { + "defaultMessage": "Русский" + }, + "locale-sk-SK": { + "defaultMessage": "Slovenčina" + }, + "locale-zh-CN": { + "defaultMessage": "中文" + }, + "locale-pl-PL": { + "defaultMessage": "Polski" + }, + "locale-it-IT": { + "defaultMessage": "Italiano" + }, + "locale-vi-VN": { + "defaultMessage": "Tiếng Việt" + }, + "locale-nl-NL": { + "defaultMessage": "Nederlands" + }, + "locale-ko-KR": { + "defaultMessage": "한국어" + }, + "locale-bg-BG": { + "defaultMessage": "Български" + } } From 6c2f6a9d39e958da8a4f80fe089b3a61971a15ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Fri, 19 Dec 2025 11:43:18 +0000 Subject: [PATCH 35/55] Fixing plural/iolra issue --- frontend/src/locale/src/ga.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/ga.json b/frontend/src/locale/src/ga.json index 66306f1d..66f762bc 100644 --- a/frontend/src/locale/src/ga.json +++ b/frontend/src/locale/src/ga.json @@ -531,7 +531,7 @@ "defaultMessage": "Óstaigh Athsheolta" }, "redirection-hosts.count": { - "defaultMessage": "{count} {count, iolra, one {Athsheoladh Óstach} other {Athsheoladh Óstaigh}}" + "defaultMessage": "{count} {count, plural, one {Athsheoladh Óstach} other {Athsheoladh Óstaigh}}" }, "redirection-hosts.http-code.300": { "defaultMessage": "300 Rogha Ilghnéitheach" From f0c0b465d9e4e45cacf8dcf8813b43d650c8188b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sat, 20 Dec 2025 17:53:05 +0000 Subject: [PATCH 36/55] Removiving 0x200b - Zero width space --- frontend/src/locale/src/ga.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/src/locale/src/ga.json b/frontend/src/locale/src/ga.json index 66f762bc..719b863b 100644 --- a/frontend/src/locale/src/ga.json +++ b/frontend/src/locale/src/ga.json @@ -147,22 +147,22 @@ "defaultMessage": "Éilíonn an chuid seo roinnt eolais faoi Certbot agus a bhreiseáin DNS. Féach ar dhoiciméadacht na mbreiseán faoi seach, le do thoil." }, "certificates.http.reachability-404": { - "defaultMessage": "Tá freastalaí aimsithe ag an bhfearann ​​seo ach ní cosúil gur Bainisteoir Proxy Nginx atá ann. Déan cinnte go bhfuil do fhearann ​​ag pointeáil chuig an seoladh IP ina bhfuil d'eispéireas NPM ag rith." + "defaultMessage": "Tá freastalaí aimsithe ag an bhfearann seo ach ní cosúil gur Bainisteoir Proxy Nginx atá ann. Déan cinnte go bhfuil do fhearann ag pointeáil chuig an seoladh IP ina bhfuil d'eispéireas NPM ag rith." }, "certificates.http.reachability-failed-to-check": { "defaultMessage": "Theip ar sheiceáil an inrochtaineachta mar gheall ar earráid chumarsáide le site24x7.com." }, "certificates.http.reachability-not-resolved": { - "defaultMessage": "Níl aon fhreastalaí ar fáil ag an bhfearann ​​seo. Cinntigh le do thoil go bhfuil do fhearann ​​ann agus go bhfuil sé ag pointeáil chuig an seoladh IP ina bhfuil d'eispéireas NPM ag rith agus más gá, go bhfuil port 80 curtha ar aghaidh i do ródaire." + "defaultMessage": "Níl aon fhreastalaí ar fáil ag an bhfearann seo. Cinntigh le do thoil go bhfuil do fhearann ann agus go bhfuil sé ag pointeáil chuig an seoladh IP ina bhfuil d'eispéireas NPM ag rith agus más gá, go bhfuil port 80 curtha ar aghaidh i do ródaire." }, "certificates.http.reachability-ok": { "defaultMessage": "Tá rochtain ar do fhreastalaí agus ba cheart go mbeadh sé indéanta deimhnithe a chruthú." }, "certificates.http.reachability-other": { - "defaultMessage": "Tá freastalaí aimsithe ag an bhfearann ​​seo ach thug sé cód stádais gan choinne {code} ar ais. An é an freastalaí NPM atá ann? Déan cinnte go bhfuil do fhearann ​​ag pointeáil chuig an seoladh IP ina bhfuil d'eispéireas NPM ag rith." + "defaultMessage": "Tá freastalaí aimsithe ag an bhfearann seo ach thug sé cód stádais gan choinne {code} ar ais. An é an freastalaí NPM atá ann? Déan cinnte go bhfuil do fhearann ag pointeáil chuig an seoladh IP ina bhfuil d'eispéireas NPM ag rith." }, "certificates.http.reachability-wrong-data": { - "defaultMessage": "Tá freastalaí aimsithe ag an bhfearann ​​seo ach thug sé sonraí gan choinne ar ais. An é an freastalaí NPM atá ann? Déan cinnte go bhfuil do fhearann ​​ag pointeáil chuig an seoladh IP ina bhfuil d'eispéireas NPM ag rith." + "defaultMessage": "Tá freastalaí aimsithe ag an bhfearann seo ach thug sé sonraí gan choinne ar ais. An é an freastalaí NPM atá ann? Déan cinnte go bhfuil do fhearann ag pointeáil chuig an seoladh IP ina bhfuil d'eispéireas NPM ag rith." }, "certificates.http.test-results": { "defaultMessage": "Torthaí Tástála" @@ -270,7 +270,7 @@ "defaultMessage": "Uasmhéid d'ainmneacha fearainn: {count}" }, "domain-names.placeholder": { - "defaultMessage": "Tosaigh ag clóscríobh chun fearann ​​a chur leis..." + "defaultMessage": "Tosaigh ag clóscríobh chun fearann a chur leis..." }, "domain-names.wildcards-not-permitted": { "defaultMessage": "Ní cheadaítear cártaí fiáine don chineál seo" @@ -315,7 +315,7 @@ "defaultMessage": "Ríomhphost nó pasfhocal neamhbhailí" }, "error.invalid-domain": { - "defaultMessage": "Fearann ​​neamhbhailí: {domain}" + "defaultMessage": "Fearann neamhbhailí: {domain}" }, "error.invalid-email": { "defaultMessage": "Seoladh ríomhphoist neamhbhailí" @@ -405,7 +405,7 @@ "defaultMessage": "Tá brón orainn ach níor aimsíodh an leathanach atá á lorg agat" }, "notfound.title": { - "defaultMessage": "Úps… Fuair ​​tú leathanach earráide díreach anois." + "defaultMessage": "Úps… Fuair tú leathanach earráide díreach anois." }, "notification.error": { "defaultMessage": "Earráid" @@ -522,7 +522,7 @@ "defaultMessage": "Óstach Athsheolta" }, "redirection-host.forward-domain": { - "defaultMessage": "Fearann ​​Ar Aghaidh" + "defaultMessage": "Fearann Ar Aghaidh" }, "redirection-host.forward-http-code": { "defaultMessage": "Cód HTTP" From bbe98a639a5a5ede56f213a2b5d78c195364bbd4 Mon Sep 17 00:00:00 2001 From: Teguh Rijanandi Date: Sat, 27 Dec 2025 22:35:17 +0700 Subject: [PATCH 37/55] Add Indonesian locale and help docs --- frontend/check-locales.cjs | 1 + frontend/src/locale/IntlProvider.tsx | 2 + .../src/locale/src/HelpDoc/id/AccessLists.md | 7 + .../src/locale/src/HelpDoc/id/Certificates.md | 32 + .../src/locale/src/HelpDoc/id/DeadHosts.md | 10 + .../src/locale/src/HelpDoc/id/ProxyHosts.md | 7 + .../locale/src/HelpDoc/id/RedirectionHosts.md | 5 + frontend/src/locale/src/HelpDoc/id/Streams.md | 6 + frontend/src/locale/src/HelpDoc/id/index.ts | 6 + frontend/src/locale/src/HelpDoc/index.ts | 3 +- frontend/src/locale/src/id.json | 683 ++++++++++++++++++ frontend/src/locale/src/lang-list.json | 3 + 12 files changed, 764 insertions(+), 1 deletion(-) create mode 100644 frontend/src/locale/src/HelpDoc/id/AccessLists.md create mode 100644 frontend/src/locale/src/HelpDoc/id/Certificates.md create mode 100644 frontend/src/locale/src/HelpDoc/id/DeadHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/id/ProxyHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/id/RedirectionHosts.md create mode 100644 frontend/src/locale/src/HelpDoc/id/Streams.md create mode 100644 frontend/src/locale/src/HelpDoc/id/index.ts create mode 100644 frontend/src/locale/src/id.json diff --git a/frontend/check-locales.cjs b/frontend/check-locales.cjs index 240b300c..f0889d50 100755 --- a/frontend/check-locales.cjs +++ b/frontend/check-locales.cjs @@ -20,6 +20,7 @@ const allLocales = [ ["zh", "zh-CN"], ["ko", "ko-KR"], ["bg", "bg-BG"], + ["id", "id-ID"], ]; const ignoreUnused = [ diff --git a/frontend/src/locale/IntlProvider.tsx b/frontend/src/locale/IntlProvider.tsx index d38df0d4..81925df2 100755 --- a/frontend/src/locale/IntlProvider.tsx +++ b/frontend/src/locale/IntlProvider.tsx @@ -13,6 +13,7 @@ import langVi from "./lang/vi.json"; import langZh from "./lang/zh.json"; import langKo from "./lang/ko.json"; import langBg from "./lang/bg.json"; +import langId from "./lang/id.json"; // first item of each array should be the language code, // not the country code @@ -31,6 +32,7 @@ const localeOptions = [ ["zh", "zh-CN", langZh], ["ko", "ko-KR", langKo], ["bg", "bg-BG", langBg], + ["id", "id-ID", langId], ]; const loadMessages = (locale?: string): typeof langList & typeof langEn => { diff --git a/frontend/src/locale/src/HelpDoc/id/AccessLists.md b/frontend/src/locale/src/HelpDoc/id/AccessLists.md new file mode 100644 index 00000000..33c0b493 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/id/AccessLists.md @@ -0,0 +1,7 @@ +## Apa itu Daftar Akses? + +Daftar Akses menyediakan daftar hitam atau daftar putih alamat IP klien tertentu beserta autentikasi untuk Host Proxy melalui Autentikasi HTTP Basic. + +Anda dapat mengonfigurasi beberapa aturan klien, nama pengguna, dan kata sandi untuk satu Daftar Akses lalu menerapkannya ke satu atau lebih _Host Proxy_. + +Ini paling berguna untuk layanan web yang diteruskan yang tidak memiliki mekanisme autentikasi bawaan atau ketika Anda ingin melindungi dari klien yang tidak dikenal. diff --git a/frontend/src/locale/src/HelpDoc/id/Certificates.md b/frontend/src/locale/src/HelpDoc/id/Certificates.md new file mode 100644 index 00000000..d58c922c --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/id/Certificates.md @@ -0,0 +1,32 @@ +## Bantuan Sertifikat + +### Sertifikat HTTP + +Sertifikat yang divalidasi HTTP berarti server Let's Encrypt akan +mencoba menjangkau domain Anda melalui HTTP (bukan HTTPS!) dan jika berhasil, mereka +akan menerbitkan sertifikat Anda. + +Untuk metode ini, Anda harus membuat _Host Proxy_ untuk domain Anda yang +dapat diakses dengan HTTP dan mengarah ke instalasi Nginx ini. Setelah sertifikat +diberikan, Anda dapat mengubah _Host Proxy_ agar juga menggunakan sertifikat ini untuk HTTPS +koneksi. Namun, _Host Proxy_ tetap perlu dikonfigurasi untuk akses HTTP +agar sertifikat dapat diperpanjang. + +Proses ini _tidak_ mendukung domain wildcard. + +### Sertifikat DNS + +Sertifikat yang divalidasi DNS mengharuskan Anda menggunakan plugin Penyedia DNS. Penyedia DNS ini +akan digunakan untuk membuat record sementara pada domain Anda dan kemudian Let's +Encrypt akan menanyakan record tersebut untuk memastikan Anda pemiliknya dan jika berhasil, mereka +akan menerbitkan sertifikat Anda. + +Anda tidak perlu membuat _Host Proxy_ sebelum meminta jenis sertifikat ini. +Anda juga tidak perlu mengonfigurasi _Host Proxy_ untuk akses HTTP. + +Proses ini _mendukung_ domain wildcard. + +### Sertifikat Kustom + +Gunakan opsi ini untuk mengunggah Sertifikat SSL Anda sendiri, sebagaimana disediakan oleh +Certificate Authority Anda. diff --git a/frontend/src/locale/src/HelpDoc/id/DeadHosts.md b/frontend/src/locale/src/HelpDoc/id/DeadHosts.md new file mode 100644 index 00000000..44b92bff --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/id/DeadHosts.md @@ -0,0 +1,10 @@ +## Apa itu Host 404? + +Host 404 adalah konfigurasi host yang menampilkan halaman 404. + +Ini dapat berguna ketika domain Anda terindeks di mesin pencari dan Anda ingin +menyediakan halaman error yang lebih baik atau secara khusus memberi tahu pengindeks pencarian bahwa +halaman domain tersebut sudah tidak ada. + +Manfaat lain memiliki host ini adalah melacak log untuk akses ke host tersebut dan +melihat perujuk. diff --git a/frontend/src/locale/src/HelpDoc/id/ProxyHosts.md b/frontend/src/locale/src/HelpDoc/id/ProxyHosts.md new file mode 100644 index 00000000..b05939a2 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/id/ProxyHosts.md @@ -0,0 +1,7 @@ +## Apa itu Host Proxy? + +Host Proxy adalah endpoint masuk untuk layanan web yang ingin Anda teruskan. + +Host ini menyediakan terminasi SSL opsional untuk layanan Anda yang mungkin tidak memiliki dukungan SSL bawaan. + +Host Proxy adalah penggunaan paling umum untuk Nginx Proxy Manager. diff --git a/frontend/src/locale/src/HelpDoc/id/RedirectionHosts.md b/frontend/src/locale/src/HelpDoc/id/RedirectionHosts.md new file mode 100644 index 00000000..7e31619a --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/id/RedirectionHosts.md @@ -0,0 +1,5 @@ +## Apa itu Host Pengalihan? + +Host Pengalihan akan mengalihkan permintaan dari domain masuk dan mengarahkan pengunjung ke domain lain. + +Alasan paling umum menggunakan jenis host ini adalah ketika situs Anda berpindah domain tetapi masih ada tautan mesin pencari atau perujuk yang mengarah ke domain lama. diff --git a/frontend/src/locale/src/HelpDoc/id/Streams.md b/frontend/src/locale/src/HelpDoc/id/Streams.md new file mode 100644 index 00000000..e74f6b41 --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/id/Streams.md @@ -0,0 +1,6 @@ +## Apa itu Stream? + +Fitur yang relatif baru untuk Nginx, Stream berfungsi untuk meneruskan trafik TCP/UDP +langsung ke komputer lain di jaringan. + +Jika Anda menjalankan server game, FTP, atau SSH, ini bisa sangat membantu. diff --git a/frontend/src/locale/src/HelpDoc/id/index.ts b/frontend/src/locale/src/HelpDoc/id/index.ts new file mode 100644 index 00000000..a9bb46ba --- /dev/null +++ b/frontend/src/locale/src/HelpDoc/id/index.ts @@ -0,0 +1,6 @@ +export * as AccessLists from "./AccessLists.md"; +export * as Certificates from "./Certificates.md"; +export * as DeadHosts from "./DeadHosts.md"; +export * as ProxyHosts from "./ProxyHosts.md"; +export * as RedirectionHosts from "./RedirectionHosts.md"; +export * as Streams from "./Streams.md"; diff --git a/frontend/src/locale/src/HelpDoc/index.ts b/frontend/src/locale/src/HelpDoc/index.ts index f70dff69..cb326f8b 100644 --- a/frontend/src/locale/src/HelpDoc/index.ts +++ b/frontend/src/locale/src/HelpDoc/index.ts @@ -10,8 +10,9 @@ import * as vi from "./vi/index"; import * as zh from "./zh/index"; import * as ko from "./ko/index"; import * as bg from "./bg/index"; +import * as id from "./id/index"; -const items: any = { en, de, ja, sk, zh, pl, ru, it, vi, nl, bg, ko }; +const items: any = { en, de, ja, sk, zh, pl, ru, it, vi, nl, bg, ko, id }; const fallbackLang = "en"; diff --git a/frontend/src/locale/src/id.json b/frontend/src/locale/src/id.json new file mode 100644 index 00000000..cb498f0d --- /dev/null +++ b/frontend/src/locale/src/id.json @@ -0,0 +1,683 @@ +{ + "access-list": { + "defaultMessage": "Daftar Akses" + }, + "access-list.access-count": { + "defaultMessage": "{count} {count, plural, one {Aturan} other {Aturan}}" + }, + "access-list.auth-count": { + "defaultMessage": "{count} {count, plural, one {Pengguna} other {Pengguna}}" + }, + "access-list.help-rules-last": { + "defaultMessage": "Jika setidaknya 1 aturan ada, aturan tolak semua ini akan ditambahkan paling akhir" + }, + "access-list.help.rules-order": { + "defaultMessage": "Perhatikan bahwa direktif izinkan dan tolak akan diterapkan sesuai urutan yang didefinisikan." + }, + "access-list.pass-auth": { + "defaultMessage": "Teruskan Auth ke Upstream" + }, + "access-list.public": { + "defaultMessage": "Dapat Diakses Publik" + }, + "access-list.public.subtitle": { + "defaultMessage": "Tidak perlu basic auth" + }, + "access-list.rule-source.placeholder": { + "defaultMessage": "192.168.1.100 atau 192.168.1.0/24 atau 2001:0db8::/32" + }, + "access-list.satisfy-any": { + "defaultMessage": "Penuhi Salah Satu" + }, + "access-list.subtitle": { + "defaultMessage": "{users} {users, plural, one {Pengguna} other {Pengguna}}, {rules} {rules, plural, one {Aturan} other {Aturan}} - Dibuat: {date}" + }, + "access-lists": { + "defaultMessage": "Daftar Akses" + }, + "action.add": { + "defaultMessage": "Tambah" + }, + "action.add-location": { + "defaultMessage": "Tambah Lokasi" + }, + "action.allow": { + "defaultMessage": "Izinkan" + }, + "action.close": { + "defaultMessage": "Tutup" + }, + "action.delete": { + "defaultMessage": "Hapus" + }, + "action.deny": { + "defaultMessage": "Tolak" + }, + "action.disable": { + "defaultMessage": "Nonaktifkan" + }, + "action.download": { + "defaultMessage": "Unduh" + }, + "action.edit": { + "defaultMessage": "Edit" + }, + "action.enable": { + "defaultMessage": "Aktifkan" + }, + "action.permissions": { + "defaultMessage": "Izin" + }, + "action.renew": { + "defaultMessage": "Perpanjang" + }, + "action.view-details": { + "defaultMessage": "Lihat Detail" + }, + "auditlogs": { + "defaultMessage": "Log Audit" + }, + "auto": { + "defaultMessage": "Otomatis" + }, + "cancel": { + "defaultMessage": "Batal" + }, + "certificate": { + "defaultMessage": "Sertifikat" + }, + "certificate.custom-certificate": { + "defaultMessage": "Sertifikat" + }, + "certificate.custom-certificate-key": { + "defaultMessage": "Kunci Sertifikat" + }, + "certificate.custom-intermediate": { + "defaultMessage": "Sertifikat Intermediate" + }, + "certificate.in-use": { + "defaultMessage": "Digunakan" + }, + "certificate.none.subtitle": { + "defaultMessage": "Tidak ada sertifikat yang ditetapkan" + }, + "certificate.none.subtitle.for-http": { + "defaultMessage": "Host ini tidak akan menggunakan HTTPS" + }, + "certificate.none.title": { + "defaultMessage": "Tidak Ada" + }, + "certificate.not-in-use": { + "defaultMessage": "Tidak Digunakan" + }, + "certificate.renew": { + "defaultMessage": "Perpanjang Sertifikat" + }, + "certificates": { + "defaultMessage": "Sertifikat" + }, + "certificates.custom": { + "defaultMessage": "Sertifikat Kustom" + }, + "certificates.custom.warning": { + "defaultMessage": "Berkas kunci yang dilindungi frasa sandi tidak didukung." + }, + "certificates.dns.credentials": { + "defaultMessage": "Konten File Kredensial" + }, + "certificates.dns.credentials-note": { + "defaultMessage": "Plugin ini memerlukan file konfigurasi yang berisi token API atau kredensial lain untuk penyedia Anda" + }, + "certificates.dns.credentials-warning": { + "defaultMessage": "Data ini akan disimpan sebagai teks biasa di database dan dalam file!" + }, + "certificates.dns.propagation-seconds": { + "defaultMessage": "Detik Propagasi" + }, + "certificates.dns.propagation-seconds-note": { + "defaultMessage": "Biarkan kosong untuk menggunakan nilai baku plugin. Jumlah detik menunggu propagasi DNS." + }, + "certificates.dns.provider": { + "defaultMessage": "Penyedia DNS" + }, + "certificates.dns.provider.placeholder": { + "defaultMessage": "Pilih Penyedia..." + }, + "certificates.dns.warning": { + "defaultMessage": "Bagian ini memerlukan pengetahuan tentang Certbot dan plugin DNS-nya. Silakan merujuk dokumentasi plugin terkait." + }, + "certificates.http.reachability-404": { + "defaultMessage": "Ada server yang ditemukan pada domain ini tetapi tampaknya bukan Nginx Proxy Manager. Pastikan domain Anda mengarah ke IP tempat instance NPM berjalan." + }, + "certificates.http.reachability-failed-to-check": { + "defaultMessage": "Gagal memeriksa keterjangkauan karena kesalahan komunikasi dengan site24x7.com." + }, + "certificates.http.reachability-not-resolved": { + "defaultMessage": "Tidak ada server yang tersedia pada domain ini. Pastikan domain Anda ada dan mengarah ke IP tempat instance NPM berjalan dan bila perlu port 80 diteruskan di router Anda." + }, + "certificates.http.reachability-ok": { + "defaultMessage": "Server Anda dapat dijangkau dan pembuatan sertifikat seharusnya memungkinkan." + }, + "certificates.http.reachability-other": { + "defaultMessage": "Ada server yang ditemukan pada domain ini tetapi mengembalikan kode status tak terduga {code}. Apakah itu server NPM? Pastikan domain Anda mengarah ke IP tempat instance NPM berjalan." + }, + "certificates.http.reachability-wrong-data": { + "defaultMessage": "Ada server yang ditemukan pada domain ini tetapi mengembalikan data yang tidak terduga. Apakah itu server NPM? Pastikan domain Anda mengarah ke IP tempat instance NPM berjalan." + }, + "certificates.http.test-results": { + "defaultMessage": "Hasil Uji" + }, + "certificates.http.warning": { + "defaultMessage": "Domain ini harus sudah dikonfigurasi agar mengarah ke instalasi ini." + }, + "certificates.request.subtitle": { + "defaultMessage": "dengan Let's Encrypt" + }, + "certificates.request.title": { + "defaultMessage": "Minta Sertifikat Baru" + }, + "column.access": { + "defaultMessage": "Akses" + }, + "column.authorization": { + "defaultMessage": "Otorisasi" + }, + "column.authorizations": { + "defaultMessage": "Otorisasi" + }, + "column.custom-locations": { + "defaultMessage": "Lokasi Kustom" + }, + "column.destination": { + "defaultMessage": "Tujuan" + }, + "column.details": { + "defaultMessage": "Detail" + }, + "column.email": { + "defaultMessage": "Email" + }, + "column.event": { + "defaultMessage": "Peristiwa" + }, + "column.expires": { + "defaultMessage": "Kedaluwarsa" + }, + "column.http-code": { + "defaultMessage": "Kode HTTP" + }, + "column.incoming-port": { + "defaultMessage": "Port Masuk" + }, + "column.name": { + "defaultMessage": "Nama" + }, + "column.protocol": { + "defaultMessage": "Protokol" + }, + "column.provider": { + "defaultMessage": "Penyedia" + }, + "column.roles": { + "defaultMessage": "Peran" + }, + "column.rules": { + "defaultMessage": "Aturan" + }, + "column.satisfy": { + "defaultMessage": "Pemenuhan" + }, + "column.satisfy-all": { + "defaultMessage": "Semua" + }, + "column.satisfy-any": { + "defaultMessage": "Salah Satu" + }, + "column.scheme": { + "defaultMessage": "Skema" + }, + "column.source": { + "defaultMessage": "Sumber" + }, + "column.ssl": { + "defaultMessage": "SSL" + }, + "column.status": { + "defaultMessage": "Status" + }, + "created-on": { + "defaultMessage": "Dibuat: {date}" + }, + "dashboard": { + "defaultMessage": "Dasbor" + }, + "dead-host": { + "defaultMessage": "Host 404" + }, + "dead-hosts": { + "defaultMessage": "Host 404" + }, + "dead-hosts.count": { + "defaultMessage": "{count} {count, plural, one {Host 404} other {Host 404}}" + }, + "disabled": { + "defaultMessage": "Nonaktif" + }, + "domain-names": { + "defaultMessage": "Nama Domain" + }, + "domain-names.max": { + "defaultMessage": "Maksimum {count} nama domain" + }, + "domain-names.placeholder": { + "defaultMessage": "Mulai mengetik untuk menambahkan domain..." + }, + "domain-names.wildcards-not-permitted": { + "defaultMessage": "Wildcard tidak diizinkan untuk tipe ini" + }, + "domain-names.wildcards-not-supported": { + "defaultMessage": "Wildcard tidak didukung untuk CA ini" + }, + "domains.force-ssl": { + "defaultMessage": "Paksa SSL" + }, + "domains.hsts-enabled": { + "defaultMessage": "HSTS Diaktifkan" + }, + "domains.hsts-subdomains": { + "defaultMessage": "HSTS Subdomain" + }, + "domains.http2-support": { + "defaultMessage": "Dukungan HTTP/2" + }, + "domains.use-dns": { + "defaultMessage": "Gunakan DNS Challenge" + }, + "email-address": { + "defaultMessage": "Alamat email" + }, + "empty-search": { + "defaultMessage": "Tidak ada hasil" + }, + "empty-subtitle": { + "defaultMessage": "Mengapa tidak membuatnya?" + }, + "enabled": { + "defaultMessage": "Aktif" + }, + "error.access.at-least-one": { + "defaultMessage": "Setidaknya satu Otorisasi atau satu Aturan Akses diperlukan" + }, + "error.access.duplicate-usernames": { + "defaultMessage": "Nama pengguna otorisasi harus unik" + }, + "error.invalid-auth": { + "defaultMessage": "Email atau kata sandi tidak valid" + }, + "error.invalid-domain": { + "defaultMessage": "Domain tidak valid: {domain}" + }, + "error.invalid-email": { + "defaultMessage": "Alamat email tidak valid" + }, + "error.max-character-length": { + "defaultMessage": "Panjang maksimum adalah {max} karakter{max, plural, one {} other {}}" + }, + "error.max-domains": { + "defaultMessage": "Terlalu banyak domain, maksimum {max}" + }, + "error.maximum": { + "defaultMessage": "Maksimum adalah {max}" + }, + "error.min-character-length": { + "defaultMessage": "Panjang minimum adalah {min} karakter{min, plural, one {} other {}}" + }, + "error.minimum": { + "defaultMessage": "Minimum adalah {min}" + }, + "error.passwords-must-match": { + "defaultMessage": "Kata sandi harus cocok" + }, + "error.required": { + "defaultMessage": "Ini wajib diisi" + }, + "expires.on": { + "defaultMessage": "Kedaluwarsa: {date}" + }, + "footer.github-fork": { + "defaultMessage": "Fork saya di GitHub" + }, + "host.flags.block-exploits": { + "defaultMessage": "Blokir Eksploit Umum" + }, + "host.flags.cache-assets": { + "defaultMessage": "Cache Aset" + }, + "host.flags.preserve-path": { + "defaultMessage": "Pertahankan Path" + }, + "host.flags.protocols": { + "defaultMessage": "Protokol" + }, + "host.flags.websockets-upgrade": { + "defaultMessage": "Dukungan Websocket" + }, + "host.forward-port": { + "defaultMessage": "Port Terusan" + }, + "host.forward-scheme": { + "defaultMessage": "Skema" + }, + "hosts": { + "defaultMessage": "Host" + }, + "http-only": { + "defaultMessage": "HTTP Saja" + }, + "lets-encrypt": { + "defaultMessage": "Let's Encrypt" + }, + "lets-encrypt-via-dns": { + "defaultMessage": "Let's Encrypt via DNS" + }, + "lets-encrypt-via-http": { + "defaultMessage": "Let's Encrypt via HTTP" + }, + "loading": { + "defaultMessage": "Memuat…" + }, + "login.title": { + "defaultMessage": "Masuk ke akun Anda" + }, + "nginx-config.label": { + "defaultMessage": "Konfigurasi Nginx Kustom" + }, + "nginx-config.placeholder": { + "defaultMessage": "# Masukkan konfigurasi Nginx kustom Anda di sini dengan risiko Anda sendiri!" + }, + "no-permission-error": { + "defaultMessage": "Anda tidak memiliki akses untuk melihat ini." + }, + "notfound.action": { + "defaultMessage": "Bawa saya pulang" + }, + "notfound.content": { + "defaultMessage": "Maaf, halaman yang Anda cari tidak ditemukan" + }, + "notfound.title": { + "defaultMessage": "Ups… Anda baru saja menemukan halaman error" + }, + "notification.error": { + "defaultMessage": "Kesalahan" + }, + "notification.object-deleted": { + "defaultMessage": "{object} telah dihapus" + }, + "notification.object-disabled": { + "defaultMessage": "{object} telah dinonaktifkan" + }, + "notification.object-enabled": { + "defaultMessage": "{object} telah diaktifkan" + }, + "notification.object-renewed": { + "defaultMessage": "{object} telah diperpanjang" + }, + "notification.object-saved": { + "defaultMessage": "{object} telah disimpan" + }, + "notification.success": { + "defaultMessage": "Berhasil" + }, + "object.actions-title": { + "defaultMessage": "{object} #{id}" + }, + "object.add": { + "defaultMessage": "Tambah {object}" + }, + "object.delete": { + "defaultMessage": "Hapus {object}" + }, + "object.delete.content": { + "defaultMessage": "Apakah Anda yakin ingin menghapus {object} ini?" + }, + "object.edit": { + "defaultMessage": "Edit {object}" + }, + "object.empty": { + "defaultMessage": "Tidak ada {objects}" + }, + "object.event.created": { + "defaultMessage": "{object} dibuat" + }, + "object.event.deleted": { + "defaultMessage": "{object} dihapus" + }, + "object.event.disabled": { + "defaultMessage": "{object} dinonaktifkan" + }, + "object.event.enabled": { + "defaultMessage": "{object} diaktifkan" + }, + "object.event.renewed": { + "defaultMessage": "{object} diperpanjang" + }, + "object.event.updated": { + "defaultMessage": "{object} diperbarui" + }, + "offline": { + "defaultMessage": "Offline" + }, + "online": { + "defaultMessage": "Online" + }, + "options": { + "defaultMessage": "Opsi" + }, + "password": { + "defaultMessage": "Kata sandi" + }, + "password.generate": { + "defaultMessage": "Buat kata sandi acak" + }, + "password.hide": { + "defaultMessage": "Sembunyikan Kata Sandi" + }, + "password.show": { + "defaultMessage": "Tampilkan Kata Sandi" + }, + "permissions.hidden": { + "defaultMessage": "Tersembunyi" + }, + "permissions.manage": { + "defaultMessage": "Kelola" + }, + "permissions.view": { + "defaultMessage": "Hanya Lihat" + }, + "permissions.visibility.all": { + "defaultMessage": "Semua Item" + }, + "permissions.visibility.title": { + "defaultMessage": "Visibilitas Item" + }, + "permissions.visibility.user": { + "defaultMessage": "Hanya Item yang Dibuat" + }, + "proxy-host": { + "defaultMessage": "Host Proxy" + }, + "proxy-host.forward-host": { + "defaultMessage": "Hostname / IP Terusan" + }, + "proxy-hosts": { + "defaultMessage": "Host Proxy" + }, + "proxy-hosts.count": { + "defaultMessage": "{count} {count, plural, one {Host Proxy} other {Host Proxy}}" + }, + "public": { + "defaultMessage": "Publik" + }, + "redirection-host": { + "defaultMessage": "Host Pengalihan" + }, + "redirection-host.forward-domain": { + "defaultMessage": "Domain Terusan" + }, + "redirection-host.forward-http-code": { + "defaultMessage": "Kode HTTP" + }, + "redirection-hosts": { + "defaultMessage": "Host Pengalihan" + }, + "redirection-hosts.count": { + "defaultMessage": "{count} {count, plural, one {Host Pengalihan} other {Host Pengalihan}}" + }, + "redirection-hosts.http-code.300": { + "defaultMessage": "300 Banyak Pilihan" + }, + "redirection-hosts.http-code.301": { + "defaultMessage": "301 Pindah permanen" + }, + "redirection-hosts.http-code.302": { + "defaultMessage": "302 Pindah sementara" + }, + "redirection-hosts.http-code.303": { + "defaultMessage": "303 Lihat lainnya" + }, + "redirection-hosts.http-code.307": { + "defaultMessage": "307 Pengalihan sementara" + }, + "redirection-hosts.http-code.308": { + "defaultMessage": "308 Pengalihan permanen" + }, + "role.admin": { + "defaultMessage": "Administrator" + }, + "role.standard-user": { + "defaultMessage": "Pengguna Standar" + }, + "save": { + "defaultMessage": "Simpan" + }, + "setting": { + "defaultMessage": "Pengaturan" + }, + "settings": { + "defaultMessage": "Pengaturan" + }, + "settings.default-site": { + "defaultMessage": "Situs Default" + }, + "settings.default-site.404": { + "defaultMessage": "Halaman 404" + }, + "settings.default-site.444": { + "defaultMessage": "Tidak Ada Respons (444)" + }, + "settings.default-site.congratulations": { + "defaultMessage": "Halaman Ucapan Selamat" + }, + "settings.default-site.description": { + "defaultMessage": "Apa yang ditampilkan saat Nginx diakses dengan Host yang tidak dikenal" + }, + "settings.default-site.html": { + "defaultMessage": "HTML Kustom" + }, + "settings.default-site.html.placeholder": { + "defaultMessage": "" + }, + "settings.default-site.redirect": { + "defaultMessage": "Alihkan" + }, + "setup.preamble": { + "defaultMessage": "Mulai dengan membuat akun admin Anda." + }, + "setup.title": { + "defaultMessage": "Selamat datang!" + }, + "sign-in": { + "defaultMessage": "Masuk" + }, + "ssl-certificate": { + "defaultMessage": "Sertifikat SSL" + }, + "stream": { + "defaultMessage": "Stream" + }, + "stream.forward-host": { + "defaultMessage": "Host Terusan" + }, + "stream.forward-host.placeholder": { + "defaultMessage": "example.com atau 10.0.0.1 atau 2001:db8:3333:4444:5555:6666:7777:8888" + }, + "stream.incoming-port": { + "defaultMessage": "Port Masuk" + }, + "streams": { + "defaultMessage": "Stream" + }, + "streams.count": { + "defaultMessage": "{count} {count, plural, one {Stream} other {Stream}}" + }, + "streams.tcp": { + "defaultMessage": "TCP" + }, + "streams.udp": { + "defaultMessage": "UDP" + }, + "test": { + "defaultMessage": "Uji" + }, + "update-available": { + "defaultMessage": "Pembaruan Tersedia: {latestVersion}" + }, + "user": { + "defaultMessage": "Pengguna" + }, + "user.change-password": { + "defaultMessage": "Ubah Kata Sandi" + }, + "user.confirm-password": { + "defaultMessage": "Konfirmasi Kata Sandi" + }, + "user.current-password": { + "defaultMessage": "Kata Sandi Saat Ini" + }, + "user.edit-profile": { + "defaultMessage": "Edit Profil" + }, + "user.full-name": { + "defaultMessage": "Nama Lengkap" + }, + "user.login-as": { + "defaultMessage": "Masuk sebagai {name}" + }, + "user.logout": { + "defaultMessage": "Keluar" + }, + "user.new-password": { + "defaultMessage": "Kata Sandi Baru" + }, + "user.nickname": { + "defaultMessage": "Nama Panggilan" + }, + "user.set-password": { + "defaultMessage": "Atur Kata Sandi" + }, + "user.set-permissions": { + "defaultMessage": "Atur Izin untuk {name}" + }, + "user.switch-dark": { + "defaultMessage": "Beralih ke mode gelap" + }, + "user.switch-light": { + "defaultMessage": "Beralih ke mode terang" + }, + "username": { + "defaultMessage": "Nama pengguna" + }, + "users": { + "defaultMessage": "Pengguna" + } +} diff --git a/frontend/src/locale/src/lang-list.json b/frontend/src/locale/src/lang-list.json index 520eef24..d500c19c 100755 --- a/frontend/src/locale/src/lang-list.json +++ b/frontend/src/locale/src/lang-list.json @@ -37,5 +37,8 @@ }, "locale-bg-BG": { "defaultMessage": "Български" + }, + "locale-id-ID": { + "defaultMessage": "Bahasa Indonesia" } } From 427afa55b41c14690f32dc3a34b941308e87b581 Mon Sep 17 00:00:00 2001 From: piotrfx Date: Sun, 28 Dec 2025 11:52:38 +0100 Subject: [PATCH 38/55] Add TOTP-based two-factor authentication - Add 2FA setup, enable, disable, and backup code management - Integrate 2FA challenge flow into login process - Add frontend modal for 2FA configuration - Support backup codes for account recovery --- backend/internal/2fa.js | 288 +++++++++++++++++ backend/internal/token.js | 81 +++++ backend/package.json | 1 + backend/routes/tokens.js | 31 ++ backend/routes/users.js | 183 +++++++++++ docs/src/2fa-implementation.md | 176 +++++++++++ frontend/src/api/backend/getToken.ts | 17 +- frontend/src/api/backend/index.ts | 1 + frontend/src/api/backend/responseTypes.ts | 19 ++ frontend/src/api/backend/twoFactor.ts | 58 ++++ frontend/src/components/SiteHeader.tsx | 15 +- frontend/src/context/AuthContext.tsx | 45 ++- frontend/src/locale/src/en.json | 75 +++++ frontend/src/modals/TwoFactorModal.tsx | 368 ++++++++++++++++++++++ frontend/src/modals/index.ts | 1 + frontend/src/pages/Login/index.tsx | 209 ++++++++---- 16 files changed, 1496 insertions(+), 72 deletions(-) create mode 100644 backend/internal/2fa.js create mode 100644 docs/src/2fa-implementation.md create mode 100644 frontend/src/api/backend/twoFactor.ts create mode 100644 frontend/src/modals/TwoFactorModal.tsx diff --git a/backend/internal/2fa.js b/backend/internal/2fa.js new file mode 100644 index 00000000..f270c85f --- /dev/null +++ b/backend/internal/2fa.js @@ -0,0 +1,288 @@ +import bcrypt from "bcrypt"; +import crypto from "node:crypto"; +import { authenticator } from "otplib"; +import authModel from "../models/auth.js"; +import userModel from "../models/user.js"; +import errs from "../lib/error.js"; + +const APP_NAME = "Nginx Proxy Manager"; +const BACKUP_CODE_COUNT = 8; + +/** + * Generate backup codes + * @returns {Promise<{plain: string[], hashed: string[]}>} + */ +const generateBackupCodes = async () => { + const plain = []; + const hashed = []; + + for (let i = 0; i < BACKUP_CODE_COUNT; i++) { + const code = crypto.randomBytes(4).toString("hex").toUpperCase(); + plain.push(code); + const hash = await bcrypt.hash(code, 10); + hashed.push(hash); + } + + return { plain, hashed }; +}; + +export default { + /** + * Generate a new TOTP secret + * @returns {string} + */ + generateSecret: () => { + return authenticator.generateSecret(); + }, + + /** + * Generate otpauth URL for QR code + * @param {string} email + * @param {string} secret + * @returns {string} + */ + generateOTPAuthURL: (email, secret) => { + return authenticator.keyuri(email, APP_NAME, secret); + }, + + /** + * Verify a TOTP code + * @param {string} secret + * @param {string} code + * @returns {boolean} + */ + verifyCode: (secret, code) => { + try { + return authenticator.verify({ token: code, secret }); + } catch { + return false; + } + }, + + /** + * Check if user has 2FA enabled + * @param {number} userId + * @returns {Promise} + */ + isEnabled: async (userId) => { + const auth = await authModel + .query() + .where("user_id", userId) + .where("type", "password") + .first(); + + if (!auth || !auth.meta) { + return false; + } + + return auth.meta.totp_enabled === true; + }, + + /** + * Get 2FA status for user + * @param {number} userId + * @returns {Promise<{enabled: boolean, backupCodesRemaining: number}>} + */ + getStatus: async (userId) => { + const auth = await authModel + .query() + .where("user_id", userId) + .where("type", "password") + .first(); + + if (!auth || !auth.meta || !auth.meta.totp_enabled) { + return { enabled: false, backupCodesRemaining: 0 }; + } + + const backupCodes = auth.meta.backup_codes || []; + return { + enabled: true, + backupCodesRemaining: backupCodes.length, + }; + }, + + /** + * Start 2FA setup - store pending secret + * @param {number} userId + * @returns {Promise<{secret: string, otpauthUrl: string}>} + */ + startSetup: async (userId) => { + const user = await userModel.query().where("id", userId).first(); + if (!user) { + throw new errs.ItemNotFoundError("User not found"); + } + + const secret = authenticator.generateSecret(); + const otpauthUrl = authenticator.keyuri(user.email, APP_NAME, secret); + + const auth = await authModel + .query() + .where("user_id", userId) + .where("type", "password") + .first(); + + if (!auth) { + throw new errs.ItemNotFoundError("Auth record not found"); + } + + const meta = auth.meta || {}; + meta.totp_pending_secret = secret; + + await authModel.query().where("id", auth.id).patch({ meta }); + + return { secret, otpauthUrl }; + }, + + /** + * Enable 2FA after verifying code + * @param {number} userId + * @param {string} code + * @returns {Promise<{backupCodes: string[]}>} + */ + enable: async (userId, code) => { + const auth = await authModel + .query() + .where("user_id", userId) + .where("type", "password") + .first(); + + if (!auth || !auth.meta || !auth.meta.totp_pending_secret) { + throw new errs.ValidationError("No pending 2FA setup found"); + } + + const secret = auth.meta.totp_pending_secret; + const valid = authenticator.verify({ token: code, secret }); + + if (!valid) { + throw new errs.ValidationError("Invalid verification code"); + } + + const { plain, hashed } = await generateBackupCodes(); + + const meta = { + ...auth.meta, + totp_secret: secret, + totp_enabled: true, + totp_enabled_at: new Date().toISOString(), + backup_codes: hashed, + }; + delete meta.totp_pending_secret; + + await authModel.query().where("id", auth.id).patch({ meta }); + + return { backupCodes: plain }; + }, + + /** + * Disable 2FA + * @param {number} userId + * @param {string} code + * @returns {Promise} + */ + disable: async (userId, code) => { + const auth = await authModel + .query() + .where("user_id", userId) + .where("type", "password") + .first(); + + if (!auth || !auth.meta || !auth.meta.totp_enabled) { + throw new errs.ValidationError("2FA is not enabled"); + } + + const valid = authenticator.verify({ + token: code, + secret: auth.meta.totp_secret, + }); + + if (!valid) { + throw new errs.ValidationError("Invalid verification code"); + } + + const meta = { ...auth.meta }; + delete meta.totp_secret; + delete meta.totp_enabled; + delete meta.totp_enabled_at; + delete meta.backup_codes; + + await authModel.query().where("id", auth.id).patch({ meta }); + }, + + /** + * Verify 2FA code for login + * @param {number} userId + * @param {string} code + * @returns {Promise} + */ + verifyForLogin: async (userId, code) => { + const auth = await authModel + .query() + .where("user_id", userId) + .where("type", "password") + .first(); + + if (!auth || !auth.meta || !auth.meta.totp_secret) { + return false; + } + + // Try TOTP code first + const valid = authenticator.verify({ + token: code, + secret: auth.meta.totp_secret, + }); + + if (valid) { + return true; + } + + // Try backup codes + const backupCodes = auth.meta.backup_codes || []; + for (let i = 0; i < backupCodes.length; i++) { + const match = await bcrypt.compare(code.toUpperCase(), backupCodes[i]); + if (match) { + // Remove used backup code + const updatedCodes = [...backupCodes]; + updatedCodes.splice(i, 1); + const meta = { ...auth.meta, backup_codes: updatedCodes }; + await authModel.query().where("id", auth.id).patch({ meta }); + return true; + } + } + + return false; + }, + + /** + * Regenerate backup codes + * @param {number} userId + * @param {string} code + * @returns {Promise<{backupCodes: string[]}>} + */ + regenerateBackupCodes: async (userId, code) => { + const auth = await authModel + .query() + .where("user_id", userId) + .where("type", "password") + .first(); + + if (!auth || !auth.meta || !auth.meta.totp_enabled) { + throw new errs.ValidationError("2FA is not enabled"); + } + + const valid = authenticator.verify({ + token: code, + secret: auth.meta.totp_secret, + }); + + if (!valid) { + throw new errs.ValidationError("Invalid verification code"); + } + + const { plain, hashed } = await generateBackupCodes(); + + const meta = { ...auth.meta, backup_codes: hashed }; + await authModel.query().where("id", auth.id).patch({ meta }); + + return { backupCodes: plain }; + }, +}; diff --git a/backend/internal/token.js b/backend/internal/token.js index 1935b16d..126283e2 100644 --- a/backend/internal/token.js +++ b/backend/internal/token.js @@ -4,9 +4,12 @@ import { parseDatePeriod } from "../lib/helpers.js"; import authModel from "../models/auth.js"; import TokenModel from "../models/token.js"; import userModel from "../models/user.js"; +import twoFactor from "./2fa.js"; const ERROR_MESSAGE_INVALID_AUTH = "Invalid email or password"; const ERROR_MESSAGE_INVALID_AUTH_I18N = "error.invalid-auth"; +const ERROR_MESSAGE_INVALID_2FA = "Invalid verification code"; +const ERROR_MESSAGE_INVALID_2FA_I18N = "error.invalid-2fa"; export default { /** @@ -59,6 +62,25 @@ export default { throw new errs.AuthError(`Invalid scope: ${data.scope}`); } + // Check if 2FA is enabled + const has2FA = await twoFactor.isEnabled(user.id); + if (has2FA) { + // Return challenge token instead of full token + const challengeToken = await Token.create({ + iss: issuer || "api", + attrs: { + id: user.id, + }, + scope: ["2fa-challenge"], + expiresIn: "5m", + }); + + return { + requires_2fa: true, + challenge_token: challengeToken.token, + }; + } + // Create a moment of the expiry expression const expiry = parseDatePeriod(data.expiry); if (expiry === null) { @@ -129,6 +151,65 @@ export default { throw new error.AssertionFailedError("Existing token contained invalid user data"); }, + /** + * Verify 2FA code and return full token + * @param {string} challengeToken + * @param {string} code + * @param {string} [expiry] + * @returns {Promise} + */ + verify2FA: async (challengeToken, code, expiry) => { + const Token = TokenModel(); + const tokenExpiry = expiry || "1d"; + + // Verify challenge token + let tokenData; + try { + tokenData = await Token.load(challengeToken); + } catch { + throw new errs.AuthError("Invalid or expired challenge token"); + } + + // Check scope + if (!tokenData.scope || tokenData.scope[0] !== "2fa-challenge") { + throw new errs.AuthError("Invalid challenge token"); + } + + const userId = tokenData.attrs?.id; + if (!userId) { + throw new errs.AuthError("Invalid challenge token"); + } + + // Verify 2FA code + const valid = await twoFactor.verifyForLogin(userId, code); + if (!valid) { + throw new errs.AuthError( + ERROR_MESSAGE_INVALID_2FA, + ERROR_MESSAGE_INVALID_2FA_I18N, + ); + } + + // Create full token + const expiryDate = parseDatePeriod(tokenExpiry); + if (expiryDate === null) { + throw new errs.AuthError(`Invalid expiry time: ${tokenExpiry}`); + } + + const signed = await Token.create({ + iss: "api", + attrs: { + id: userId, + }, + scope: ["user"], + expiresIn: tokenExpiry, + }); + + return { + token: signed.token, + expires: expiryDate.toISOString(), + }; + }, + /** * @param {Object} user * @returns {Promise} diff --git a/backend/package.json b/backend/package.json index 62b27039..5a43db8d 100644 --- a/backend/package.json +++ b/backend/package.json @@ -30,6 +30,7 @@ "mysql2": "^3.15.3", "node-rsa": "^1.1.1", "objection": "3.0.1", + "otplib": "^12.0.1", "path": "^0.12.7", "pg": "^8.16.3", "proxy-agent": "^6.5.0", diff --git a/backend/routes/tokens.js b/backend/routes/tokens.js index b8599319..f486294b 100644 --- a/backend/routes/tokens.js +++ b/backend/routes/tokens.js @@ -53,4 +53,35 @@ router } }); +router + .route("/2fa") + .options((_, res) => { + res.sendStatus(204); + }) + + /** + * POST /tokens/2fa + * + * Verify 2FA code and get full token + */ + .post(async (req, res, next) => { + try { + const { challenge_token, code } = req.body; + + if (!challenge_token || !code) { + return res.status(400).json({ + error: { + message: "Missing challenge_token or code", + }, + }); + } + + const result = await internalToken.verify2FA(challenge_token, code); + res.status(200).send(result); + } catch (err) { + debug(logger, `${req.method.toUpperCase()} ${req.path}: ${err}`); + next(err); + } + }); + export default router; diff --git a/backend/routes/users.js b/backend/routes/users.js index 7159b8b5..8f51db66 100644 --- a/backend/routes/users.js +++ b/backend/routes/users.js @@ -1,4 +1,5 @@ import express from "express"; +import internal2FA from "../internal/2fa.js"; import internalUser from "../internal/user.js"; import Access from "../lib/access.js"; import { isCI } from "../lib/config.js"; @@ -325,4 +326,186 @@ router } }); +/** + * User 2FA status + * + * /api/users/123/2fa + */ +router + .route("/:user_id/2fa") + .options((_, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + .all(userIdFromMe) + + /** + * GET /api/users/123/2fa + * + * Get 2FA status for a user + */ + .get(async (req, res, next) => { + try { + const userId = Number.parseInt(req.params.user_id, 10); + const access = res.locals.access; + + // Users can only view their own 2FA status + if (access.token.getUserId() !== userId && !access.token.hasScope("admin")) { + throw new errs.PermissionError("Cannot view 2FA status for other users"); + } + + const status = await internal2FA.getStatus(userId); + res.status(200).send(status); + } catch (err) { + debug(logger, `${req.method.toUpperCase()} ${req.path}: ${err}`); + next(err); + } + }) + + /** + * DELETE /api/users/123/2fa + * + * Disable 2FA for a user + */ + .delete(async (req, res, next) => { + try { + const userId = Number.parseInt(req.params.user_id, 10); + const access = res.locals.access; + + // Users can only disable their own 2FA + if (access.token.getUserId() !== userId && !access.token.hasScope("admin")) { + throw new errs.PermissionError("Cannot disable 2FA for other users"); + } + + const { code } = req.body; + if (!code) { + throw new errs.ValidationError("Verification code is required"); + } + + await internal2FA.disable(userId, code); + res.status(200).send({ success: true }); + } catch (err) { + debug(logger, `${req.method.toUpperCase()} ${req.path}: ${err}`); + next(err); + } + }); + +/** + * User 2FA setup + * + * /api/users/123/2fa/setup + */ +router + .route("/:user_id/2fa/setup") + .options((_, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + .all(userIdFromMe) + + /** + * POST /api/users/123/2fa/setup + * + * Start 2FA setup, returns QR code URL + */ + .post(async (req, res, next) => { + try { + const userId = Number.parseInt(req.params.user_id, 10); + const access = res.locals.access; + + // Users can only setup their own 2FA + if (access.token.getUserId() !== userId) { + throw new errs.PermissionError("Cannot setup 2FA for other users"); + } + + const result = await internal2FA.startSetup(userId); + res.status(200).send(result); + } catch (err) { + debug(logger, `${req.method.toUpperCase()} ${req.path}: ${err}`); + next(err); + } + }); + +/** + * User 2FA enable + * + * /api/users/123/2fa/enable + */ +router + .route("/:user_id/2fa/enable") + .options((_, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + .all(userIdFromMe) + + /** + * PUT /api/users/123/2fa/enable + * + * Verify code and enable 2FA + */ + .put(async (req, res, next) => { + try { + const userId = Number.parseInt(req.params.user_id, 10); + const access = res.locals.access; + + // Users can only enable their own 2FA + if (access.token.getUserId() !== userId) { + throw new errs.PermissionError("Cannot enable 2FA for other users"); + } + + const { code } = req.body; + if (!code) { + throw new errs.ValidationError("Verification code is required"); + } + + const result = await internal2FA.enable(userId, code); + res.status(200).send(result); + } catch (err) { + debug(logger, `${req.method.toUpperCase()} ${req.path}: ${err}`); + next(err); + } + }); + +/** + * User 2FA backup codes + * + * /api/users/123/2fa/backup-codes + */ +router + .route("/:user_id/2fa/backup-codes") + .options((_, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + .all(userIdFromMe) + + /** + * POST /api/users/123/2fa/backup-codes + * + * Regenerate backup codes + */ + .post(async (req, res, next) => { + try { + const userId = Number.parseInt(req.params.user_id, 10); + const access = res.locals.access; + + // Users can only regenerate their own backup codes + if (access.token.getUserId() !== userId) { + throw new errs.PermissionError("Cannot regenerate backup codes for other users"); + } + + const { code } = req.body; + if (!code) { + throw new errs.ValidationError("Verification code is required"); + } + + const result = await internal2FA.regenerateBackupCodes(userId, code); + res.status(200).send(result); + } catch (err) { + debug(logger, `${req.method.toUpperCase()} ${req.path}: ${err}`); + next(err); + } + }); + export default router; diff --git a/docs/src/2fa-implementation.md b/docs/src/2fa-implementation.md new file mode 100644 index 00000000..d1767ffd --- /dev/null +++ b/docs/src/2fa-implementation.md @@ -0,0 +1,176 @@ +# Two-Factor Authentication Implementation + +> **Note:** This document should be deleted after PR approval. It serves as a reference for reviewers to understand the scope of the contribution. + +--- + +**Acknowledgments** + +Thanks to all contributors and authors from the Inte.Team for the great work on Nginx Proxy Manager. It saves us time and effort, and we're happy to contribute back to the project. + +--- + +## Overview + +Add TOTP-based two-factor authentication to the login flow. Users can enable 2FA from their profile settings, scan a QR code with any authenticator app (Google Authenticator, Authy, etc.), and will be required to enter a 6-digit code on login. + +## Current Authentication Flow + +``` +POST /tokens {identity, secret} + -> Validate user exists and is not disabled + -> Verify password against auth.secret + -> Return JWT token +``` + +## Proposed 2FA Flow + +``` +POST /tokens {identity, secret} + -> Validate user exists and is not disabled + -> Verify password against auth.secret + -> If 2FA enabled: + Return {requires_2fa: true, challenge_token: } + -> Else: + Return {token: , expires: } + +POST /tokens/2fa {challenge_token, code} + -> Validate challenge_token + -> Verify TOTP code against user's secret + -> Return {token: , expires: } +``` + +## Database Changes + +Extend the existing `auth.meta` JSON column to store 2FA data: + +```json +{ + "totp_secret": "", + "totp_enabled": true, + "totp_enabled_at": "", + "backup_codes": ["", "", ...] +} +``` + +No new tables required. The `auth.meta` column is already designed for this purpose. + +## Backend Changes + +### New Files + +1. `backend/internal/2fa.js` - Core 2FA logic + - `generateSecret()` - Generate TOTP secret + - `generateQRCodeURL(user, secret)` - Generate otpauth URL + - `verifyCode(secret, code)` - Verify TOTP code + - `generateBackupCodes()` - Generate 8 backup codes + - `verifyBackupCode(user, code)` - Verify and consume backup code + +2. `backend/routes/2fa.js` - 2FA management endpoints + - `GET /users/:id/2fa` - Get 2FA status + - `POST /users/:id/2fa/setup` - Start 2FA setup, return QR code + - `PUT /users/:id/2fa/enable` - Verify code and enable 2FA + - `DELETE /users/:id/2fa` - Disable 2FA (requires code) + - `GET /users/:id/2fa/backup-codes` - View remaining backup codes count + - `POST /users/:id/2fa/backup-codes` - Regenerate backup codes + +### Modified Files + +1. `backend/internal/token.js` + - Update `getTokenFromEmail()` to check for 2FA + - Add `verifyTwoFactorChallenge()` function + - Add `createChallengeToken()` for short-lived 2FA tokens + +2. `backend/routes/tokens.js` + - Add `POST /tokens/2fa` endpoint + +3. `backend/index.js` + - Register new 2FA routes + +### Dependencies + +Add to `package.json`: +```json +"otplib": "^12.0.1" +``` + +## Frontend Changes + +### New Files + +1. `frontend/src/pages/Login2FA/index.tsx` - 2FA code entry page +2. `frontend/src/modals/TwoFactorSetupModal.tsx` - Setup wizard modal +3. `frontend/src/api/backend/twoFactor.ts` - 2FA API functions +4. `frontend/src/api/backend/verify2FA.ts` - Token verification + +### Modified Files + +1. `frontend/src/api/backend/responseTypes.ts` + - Add `TwoFactorChallengeResponse` type + - Add `TwoFactorStatusResponse` type + +2. `frontend/src/context/AuthContext.tsx` + - Add `twoFactorRequired` state + - Add `challengeToken` state + - Update `login()` to handle 2FA response + - Add `verify2FA()` function + +3. `frontend/src/pages/Login/index.tsx` + - Handle 2FA challenge response + - Redirect to 2FA entry when required + +4. `frontend/src/pages/Settings/` (or user profile) + - Add 2FA enable/disable section + +### Dependencies + +Add to `package.json`: +```json +"qrcode.react": "^3.1.0" +``` + +## API Endpoints Summary + +| Method | Endpoint | Auth | Description | +|--------|----------|------|-------------| +| POST | /tokens | No | Login (returns challenge if 2FA) | +| POST | /tokens/2fa | Challenge | Complete 2FA login | +| GET | /users/:id/2fa | JWT | Get 2FA status | +| POST | /users/:id/2fa/setup | JWT | Start setup, get QR code | +| PUT | /users/:id/2fa/enable | JWT | Verify and enable | +| DELETE | /users/:id/2fa | JWT | Disable (requires code) | +| GET | /users/:id/2fa/backup-codes | JWT | Get backup codes count | +| POST | /users/:id/2fa/backup-codes | JWT | Regenerate codes | + +## Security Considerations + +1. Challenge tokens expire in 5 minutes +2. TOTP secrets encrypted at rest +3. Backup codes hashed with bcrypt +4. Rate limit on 2FA attempts (5 attempts, 15 min lockout) +5. Backup codes single-use only +6. 2FA disable requires valid TOTP code + +## Implementation Order + +1. Backend: Add `otplib` dependency +2. Backend: Create `internal/2fa.js` module +3. Backend: Update `internal/token.js` for challenge flow +4. Backend: Add `POST /tokens/2fa` route +5. Backend: Create `routes/2fa.js` for management +6. Frontend: Add `qrcode.react` dependency +7. Frontend: Update API types and functions +8. Frontend: Update AuthContext for 2FA state +9. Frontend: Create Login2FA page +10. Frontend: Update Login to handle 2FA +11. Frontend: Add 2FA settings UI + +## Testing + +1. Enable 2FA for user +2. Login with password only - should get challenge +3. Submit correct TOTP - should get token +4. Submit wrong TOTP - should fail +5. Use backup code - should work once +6. Disable 2FA - should require valid code +7. Login after disable - should work without 2FA diff --git a/frontend/src/api/backend/getToken.ts b/frontend/src/api/backend/getToken.ts index 600f0529..7f62a0e7 100644 --- a/frontend/src/api/backend/getToken.ts +++ b/frontend/src/api/backend/getToken.ts @@ -1,9 +1,22 @@ import * as api from "./base"; -import type { TokenResponse } from "./responseTypes"; +import type { TokenResponse, TwoFactorChallengeResponse } from "./responseTypes"; -export async function getToken(identity: string, secret: string): Promise { +export type LoginResponse = TokenResponse | TwoFactorChallengeResponse; + +export function isTwoFactorChallenge(response: LoginResponse): response is TwoFactorChallengeResponse { + return "requires2fa" in response && response.requires2fa === true; +} + +export async function getToken(identity: string, secret: string): Promise { return await api.post({ url: "/tokens", data: { identity, secret }, }); } + +export async function verify2FA(challengeToken: string, code: string): Promise { + return await api.post({ + url: "/tokens/2fa", + data: { challengeToken, code }, + }); +} diff --git a/frontend/src/api/backend/index.ts b/frontend/src/api/backend/index.ts index 9ff0bbd8..40cb4142 100644 --- a/frontend/src/api/backend/index.ts +++ b/frontend/src/api/backend/index.ts @@ -60,3 +60,4 @@ export * from "./updateStream"; export * from "./updateUser"; export * from "./uploadCertificate"; export * from "./validateCertificate"; +export * from "./twoFactor"; diff --git a/frontend/src/api/backend/responseTypes.ts b/frontend/src/api/backend/responseTypes.ts index 1b0bc16b..2f88ede5 100644 --- a/frontend/src/api/backend/responseTypes.ts +++ b/frontend/src/api/backend/responseTypes.ts @@ -25,3 +25,22 @@ export interface VersionCheckResponse { latest: string | null; updateAvailable: boolean; } + +export interface TwoFactorChallengeResponse { + requires2fa: boolean; + challengeToken: string; +} + +export interface TwoFactorStatusResponse { + enabled: boolean; + backupCodesRemaining: number; +} + +export interface TwoFactorSetupResponse { + secret: string; + otpauthUrl: string; +} + +export interface TwoFactorEnableResponse { + backupCodes: string[]; +} diff --git a/frontend/src/api/backend/twoFactor.ts b/frontend/src/api/backend/twoFactor.ts new file mode 100644 index 00000000..13912387 --- /dev/null +++ b/frontend/src/api/backend/twoFactor.ts @@ -0,0 +1,58 @@ +import { camelizeKeys, decamelizeKeys } from "humps"; +import AuthStore from "src/modules/AuthStore"; +import type { + TwoFactorEnableResponse, + TwoFactorSetupResponse, + TwoFactorStatusResponse, +} from "./responseTypes"; +import * as api from "./base"; + +export async function get2FAStatus(userId: number | "me"): Promise { + return await api.get({ + url: `/users/${userId}/2fa`, + }); +} + +export async function start2FASetup(userId: number | "me"): Promise { + return await api.post({ + url: `/users/${userId}/2fa/setup`, + }); +} + +export async function enable2FA(userId: number | "me", code: string): Promise { + return await api.put({ + url: `/users/${userId}/2fa/enable`, + data: { code }, + }); +} + +export async function disable2FA(userId: number | "me", code: string): Promise<{ success: boolean }> { + const headers: Record = { + "Content-Type": "application/json", + }; + if (AuthStore.token) { + headers.Authorization = `Bearer ${AuthStore.token.token}`; + } + + const response = await fetch(`/api/users/${userId}/2fa`, { + method: "DELETE", + headers, + body: JSON.stringify(decamelizeKeys({ code })), + }); + + const payload = await response.json(); + if (!response.ok) { + throw new Error(payload.error?.messageI18n || payload.error?.message || "Failed to disable 2FA"); + } + return camelizeKeys(payload) as { success: boolean }; +} + +export async function regenerateBackupCodes( + userId: number | "me", + code: string, +): Promise { + return await api.post({ + url: `/users/${userId}/2fa/backup-codes`, + data: { code }, + }); +} diff --git a/frontend/src/components/SiteHeader.tsx b/frontend/src/components/SiteHeader.tsx index 3e419306..f00d38d6 100644 --- a/frontend/src/components/SiteHeader.tsx +++ b/frontend/src/components/SiteHeader.tsx @@ -1,9 +1,9 @@ -import { IconLock, IconLogout, IconUser } from "@tabler/icons-react"; +import { IconLock, IconLogout, IconShieldLock, IconUser } from "@tabler/icons-react"; import { LocalePicker, NavLink, ThemeSwitcher } from "src/components"; import { useAuthState } from "src/context"; import { useUser } from "src/hooks"; import { T } from "src/locale"; -import { showChangePasswordModal, showUserModal } from "src/modals"; +import { showChangePasswordModal, showTwoFactorModal, showUserModal } from "src/modals"; import styles from "./SiteHeader.module.css"; export function SiteHeader() { @@ -108,6 +108,17 @@ export function SiteHeader() { + { + e.preventDefault(); + showTwoFactorModal("me"); + }} + > + + +
Promise; + verifyTwoFactor: (code: string) => Promise; + cancelTwoFactor: () => void; loginAs: (id: number) => Promise; logout: () => void; token?: string; @@ -24,17 +39,35 @@ interface Props { function AuthProvider({ children, tokenRefreshInterval = 5 * 60 * 1000 }: Props) { const queryClient = useQueryClient(); const [authenticated, setAuthenticated] = useState(AuthStore.hasActiveToken()); + const [twoFactorChallenge, setTwoFactorChallenge] = useState(null); const handleTokenUpdate = (response: TokenResponse) => { AuthStore.set(response); setAuthenticated(true); + setTwoFactorChallenge(null); }; const login = async (identity: string, secret: string) => { const response = await getToken(identity, secret); + if (isTwoFactorChallenge(response)) { + setTwoFactorChallenge({ challengeToken: response.challengeToken }); + return; + } handleTokenUpdate(response); }; + const verifyTwoFactor = async (code: string) => { + if (!twoFactorChallenge) { + throw new Error("No 2FA challenge pending"); + } + const response = await verify2FA(twoFactorChallenge.challengeToken, code); + handleTokenUpdate(response); + }; + + const cancelTwoFactor = () => { + setTwoFactorChallenge(null); + }; + const loginAs = async (id: number) => { const response = await loginAsUser(id); AuthStore.add(response); @@ -69,7 +102,15 @@ function AuthProvider({ children, tokenRefreshInterval = 5 * 60 * 1000 }: Props) true, ); - const value = { authenticated, login, logout, loginAs }; + const value = { + authenticated, + twoFactorChallenge, + login, + verifyTwoFactor, + cancelTwoFactor, + loginAs, + logout, + }; return {children}; } diff --git a/frontend/src/locale/src/en.json b/frontend/src/locale/src/en.json index 355d0db7..e53946d9 100644 --- a/frontend/src/locale/src/en.json +++ b/frontend/src/locale/src/en.json @@ -1,4 +1,61 @@ { + "2fa.backup-codes-remaining": { + "defaultMessage": "Backup codes remaining: {count}" + }, + "2fa.backup-warning": { + "defaultMessage": "Save these backup codes in a secure place. Each code can only be used once." + }, + "2fa.disable": { + "defaultMessage": "Disable Two-Factor Authentication" + }, + "2fa.disable-confirm": { + "defaultMessage": "Disable 2FA" + }, + "2fa.disable-warning": { + "defaultMessage": "Disabling two-factor authentication will make your account less secure." + }, + "2fa.disabled": { + "defaultMessage": "Disabled" + }, + "2fa.done": { + "defaultMessage": "I have saved my backup codes" + }, + "2fa.enable": { + "defaultMessage": "Enable Two-Factor Authentication" + }, + "2fa.enabled": { + "defaultMessage": "Enabled" + }, + "2fa.enter-code": { + "defaultMessage": "Enter verification code" + }, + "2fa.enter-code-disable": { + "defaultMessage": "Enter verification code to disable" + }, + "2fa.regenerate": { + "defaultMessage": "Regenerate" + }, + "2fa.regenerate-backup": { + "defaultMessage": "Regenerate Backup Codes" + }, + "2fa.regenerate-instructions": { + "defaultMessage": "Enter a verification code to generate new backup codes. Your old codes will be invalidated." + }, + "2fa.secret-key": { + "defaultMessage": "Secret Key" + }, + "2fa.setup-instructions": { + "defaultMessage": "Scan this QR code with your authenticator app, or enter the secret manually." + }, + "2fa.status": { + "defaultMessage": "Status" + }, + "2fa.title": { + "defaultMessage": "Two-Factor Authentication" + }, + "2fa.verify-enable": { + "defaultMessage": "Verify and Enable" + }, "access-list": { "defaultMessage": "Access List" }, @@ -386,6 +443,21 @@ "loading": { "defaultMessage": "Loading…" }, + "login.2fa-code": { + "defaultMessage": "Verification Code" + }, + "login.2fa-code-placeholder": { + "defaultMessage": "Enter code" + }, + "login.2fa-description": { + "defaultMessage": "Enter the code from your authenticator app" + }, + "login.2fa-title": { + "defaultMessage": "Two-Factor Authentication" + }, + "login.2fa-verify": { + "defaultMessage": "Verify" + }, "login.title": { "defaultMessage": "Login to your account" }, @@ -674,6 +746,9 @@ "user.switch-light": { "defaultMessage": "Switch to Light mode" }, + "user.two-factor": { + "defaultMessage": "Two-Factor Auth" + }, "username": { "defaultMessage": "Username" }, diff --git a/frontend/src/modals/TwoFactorModal.tsx b/frontend/src/modals/TwoFactorModal.tsx new file mode 100644 index 00000000..b5dd480c --- /dev/null +++ b/frontend/src/modals/TwoFactorModal.tsx @@ -0,0 +1,368 @@ +import EasyModal, { type InnerModalProps } from "ez-modal-react"; +import { Field, Form, Formik } from "formik"; +import { type ReactNode, useCallback, useEffect, useState } from "react"; +import { Alert } from "react-bootstrap"; +import Modal from "react-bootstrap/Modal"; +import { + disable2FA, + enable2FA, + get2FAStatus, + regenerateBackupCodes, + start2FASetup, +} from "src/api/backend"; +import { Button } from "src/components"; +import { T } from "src/locale"; +import { validateString } from "src/modules/Validations"; + +type Step = "loading" | "status" | "setup" | "verify" | "backup" | "disable"; + +const showTwoFactorModal = (id: number | "me") => { + EasyModal.show(TwoFactorModal, { id }); +}; + +interface Props extends InnerModalProps { + id: number | "me"; +} + +const TwoFactorModal = EasyModal.create(({ id, visible, remove }: Props) => { + const [error, setError] = useState(null); + const [step, setStep] = useState("loading"); + const [isEnabled, setIsEnabled] = useState(false); + const [backupCodesRemaining, setBackupCodesRemaining] = useState(0); + const [setupData, setSetupData] = useState<{ secret: string; otpauthUrl: string } | null>(null); + const [backupCodes, setBackupCodes] = useState([]); + const [isSubmitting, setIsSubmitting] = useState(false); + + const loadStatus = useCallback(async () => { + try { + const status = await get2FAStatus(id); + setIsEnabled(status.enabled); + setBackupCodesRemaining(status.backupCodesRemaining); + setStep("status"); + } catch (err: any) { + setError(err.message || "Failed to load 2FA status"); + setStep("status"); + } + }, [id]); + + useEffect(() => { + loadStatus(); + }, [loadStatus]); + + const handleStartSetup = async () => { + setError(null); + setIsSubmitting(true); + try { + const data = await start2FASetup(id); + setSetupData(data); + setStep("setup"); + } catch (err: any) { + setError(err.message || "Failed to start 2FA setup"); + } + setIsSubmitting(false); + }; + + const handleVerify = async (values: { code: string }) => { + setError(null); + setIsSubmitting(true); + try { + const result = await enable2FA(id, values.code); + setBackupCodes(result.backupCodes); + setStep("backup"); + } catch (err: any) { + setError(err.message || "Failed to enable 2FA"); + } + setIsSubmitting(false); + }; + + const handleDisable = async (values: { code: string }) => { + setError(null); + setIsSubmitting(true); + try { + await disable2FA(id, values.code); + setIsEnabled(false); + setStep("status"); + } catch (err: any) { + setError(err.message || "Failed to disable 2FA"); + } + setIsSubmitting(false); + }; + + const handleRegenerateBackup = async (values: { code: string }) => { + setError(null); + setIsSubmitting(true); + try { + const result = await regenerateBackupCodes(id, values.code); + setBackupCodes(result.backupCodes); + setStep("backup"); + } catch (err: any) { + setError(err.message || "Failed to regenerate backup codes"); + } + setIsSubmitting(false); + }; + + const handleBackupDone = () => { + setIsEnabled(true); + setBackupCodes([]); + loadStatus(); + }; + + const renderContent = () => { + if (step === "loading") { + return ( +
+
+ Loading... +
+
+ ); + } + + if (step === "status") { + return ( +
+
+
+ + + + + {isEnabled ? : } + +
+ {isEnabled && ( +

+ +

+ )} +
+ {!isEnabled ? ( + + ) : ( +
+ + +
+ )} +
+ ); + } + + if (step === "setup" && setupData) { + return ( +
+

+ +

+
+ QR Code +
+ + + {() => ( +
+ + {({ field, form }: any) => ( + + )} + +
+ + +
+
+ )} +
+
+ ); + } + + if (step === "backup") { + return ( +
+ + + +
+
+ {backupCodes.map((code, index) => ( +
+ {code} +
+ ))} +
+
+ +
+ ); + } + + if (step === "disable") { + return ( +
+ + + + + {() => ( +
+ + {({ field, form }: any) => ( + + )} + +
+ + +
+
+ )} +
+
+ ); + } + + if (step === "verify") { + return ( +
+

+ +

+ + {() => ( +
+ + {({ field, form }: any) => ( + + )} + +
+ + +
+
+ )} +
+
+ ); + } + + return null; + }; + + return ( + + + + + + + + setError(null)} dismissible> + {error} + + {renderContent()} + + + ); +}); + +export { showTwoFactorModal }; diff --git a/frontend/src/modals/index.ts b/frontend/src/modals/index.ts index 4db26738..a06a0c0d 100644 --- a/frontend/src/modals/index.ts +++ b/frontend/src/modals/index.ts @@ -13,4 +13,5 @@ export * from "./RedirectionHostModal"; export * from "./RenewCertificateModal"; export * from "./SetPasswordModal"; export * from "./StreamModal"; +export * from "./TwoFactorModal"; export * from "./UserModal"; diff --git a/frontend/src/pages/Login/index.tsx b/frontend/src/pages/Login/index.tsx index 90209d1d..ebf7eeb3 100644 --- a/frontend/src/pages/Login/index.tsx +++ b/frontend/src/pages/Login/index.tsx @@ -8,8 +8,77 @@ import { intl, T } from "src/locale"; import { validateEmail, validateString } from "src/modules/Validations"; import styles from "./index.module.css"; -export default function Login() { - const emailRef = useRef(null); +function TwoFactorForm() { + const codeRef = useRef(null); + const [formErr, setFormErr] = useState(""); + const { verifyTwoFactor, cancelTwoFactor } = useAuthState(); + + const onSubmit = async (values: any, { setSubmitting }: any) => { + setFormErr(""); + try { + await verifyTwoFactor(values.code); + } catch (err) { + if (err instanceof Error) { + setFormErr(err.message); + } + } + setSubmitting(false); + }; + + useEffect(() => { + codeRef.current?.focus(); + }, []); + + return ( + <> +

+ +

+

+ +

+ {formErr !== "" && {formErr}} + + {({ isSubmitting }) => ( +
+
+ + {({ field, form }: any) => ( + + )} + +
+
+ + +
+
+ )} +
+ + ); +} + +function LoginForm() { + const emailRef = useRef(null); const [formErr, setFormErr] = useState(""); const { login } = useAuthState(); @@ -26,10 +95,79 @@ export default function Login() { }; useEffect(() => { - // @ts-expect-error ts-migrate(2531) FIXME: Object is possibly 'null'. - emailRef.current.focus(); + emailRef.current?.focus(); }, []); + return ( + <> +

+ +

+ {formErr !== "" && {formErr}} + + {({ isSubmitting }) => ( +
+
+ + {({ field, form }: any) => ( + + )} + +
+
+ + {({ field, form }: any) => ( + <> + + + )} + +
+
+ +
+
+ )} +
+ + ); +} + +export default function Login() { + const { twoFactorChallenge } = useAuthState(); const health = useHealth(); const getVersion = () => { @@ -56,68 +194,7 @@ export default function Login() {
-

- -

- {formErr !== "" && {formErr}} - - {({ isSubmitting }) => ( -
-
- - {({ field, form }: any) => ( - - )} - -
-
- - {({ field, form }: any) => ( - <> - - - )} - -
-
- -
-
- )} -
+ {twoFactorChallenge ? : }
{getVersion()}
From d2d204ab8e37a5bc013ea18a52b351e6b65110cc Mon Sep 17 00:00:00 2001 From: piotrfx Date: Sun, 28 Dec 2025 12:04:35 +0100 Subject: [PATCH 39/55] Trigger CI From aeb44244a720f453681648eff9c182a29aa62dcd Mon Sep 17 00:00:00 2001 From: Alex Kitsul Date: Tue, 30 Dec 2025 21:44:29 -0800 Subject: [PATCH 40/55] Added logging for streams based on port --- backend/templates/stream.conf | 8 +++++++- docker/rootfs/etc/nginx/conf.d/default.conf | 6 +++--- .../etc/nginx/conf.d/include/{log.conf => log-proxy.conf} | 2 +- docker/rootfs/etc/nginx/conf.d/include/log-stream.conf | 3 +++ docker/rootfs/etc/nginx/nginx.conf | 5 ++++- frontend/src/locale/src/ko.json | 2 +- 6 files changed, 19 insertions(+), 7 deletions(-) rename docker/rootfs/etc/nginx/conf.d/include/{log.conf => log-proxy.conf} (89%) create mode 100644 docker/rootfs/etc/nginx/conf.d/include/log-stream.conf diff --git a/backend/templates/stream.conf b/backend/templates/stream.conf index 7333aaee..3a10387b 100644 --- a/backend/templates/stream.conf +++ b/backend/templates/stream.conf @@ -12,6 +12,9 @@ server { proxy_pass {{ forwarding_host }}:{{ forwarding_port }}; + access_log /data/logs/stream-{{ id }}_access.log stream; + error_log /data/logs/stream-{{ id }}_error.log warn; + # Custom include /data/nginx/custom/server_stream[.]conf; include /data/nginx/custom/server_stream_tcp[.]conf; @@ -25,9 +28,12 @@ server { proxy_pass {{ forwarding_host }}:{{ forwarding_port }}; + access_log /data/logs/stream-{{ id }}_access.log stream; + error_log /data/logs/stream-{{ id }}_error.log warn; + # Custom include /data/nginx/custom/server_stream[.]conf; include /data/nginx/custom/server_stream_udp[.]conf; } {% endif %} -{% endif %} \ No newline at end of file +{% endif %} diff --git a/docker/rootfs/etc/nginx/conf.d/default.conf b/docker/rootfs/etc/nginx/conf.d/default.conf index e4262e1d..b3f61ebc 100644 --- a/docker/rootfs/etc/nginx/conf.d/default.conf +++ b/docker/rootfs/etc/nginx/conf.d/default.conf @@ -8,8 +8,8 @@ server { set $port "80"; server_name localhost-nginx-proxy-manager; - access_log /data/logs/fallback_access.log standard; - error_log /data/logs/fallback_error.log warn; + access_log /data/logs/fallback_http_access.log standard; + error_log /data/logs/fallback_http_error.log warn; include conf.d/include/assets.conf; include conf.d/include/block-exploits.conf; include conf.d/include/letsencrypt-acme-challenge.conf; @@ -30,7 +30,7 @@ server { set $port "443"; server_name localhost; - access_log /data/logs/fallback_access.log standard; + access_log /data/logs/fallback_http_access.log standard; error_log /dev/null crit; include conf.d/include/ssl-ciphers.conf; ssl_reject_handshake on; diff --git a/docker/rootfs/etc/nginx/conf.d/include/log.conf b/docker/rootfs/etc/nginx/conf.d/include/log-proxy.conf similarity index 89% rename from docker/rootfs/etc/nginx/conf.d/include/log.conf rename to docker/rootfs/etc/nginx/conf.d/include/log-proxy.conf index 0d740290..448b0529 100644 --- a/docker/rootfs/etc/nginx/conf.d/include/log.conf +++ b/docker/rootfs/etc/nginx/conf.d/include/log-proxy.conf @@ -1,4 +1,4 @@ log_format proxy '[$time_local] $upstream_cache_status $upstream_status $status - $request_method $scheme $host "$request_uri" [Client $remote_addr] [Length $body_bytes_sent] [Gzip $gzip_ratio] [Sent-to $server] "$http_user_agent" "$http_referer"'; log_format standard '[$time_local] $status - $request_method $scheme $host "$request_uri" [Client $remote_addr] [Length $body_bytes_sent] [Gzip $gzip_ratio] "$http_user_agent" "$http_referer"'; -access_log /data/logs/fallback_access.log proxy; +access_log /data/logs/fallback_http_access.log proxy; diff --git a/docker/rootfs/etc/nginx/conf.d/include/log-stream.conf b/docker/rootfs/etc/nginx/conf.d/include/log-stream.conf new file mode 100644 index 00000000..db3ad31f --- /dev/null +++ b/docker/rootfs/etc/nginx/conf.d/include/log-stream.conf @@ -0,0 +1,3 @@ +log_format stream '[$time_local] [Client $remote_addr:$remote_port] $protocol $status $bytes_sent $bytes_received $session_time [Sent-to $upstream_addr] [Sent $upstream_bytes_sent] [Received $upstream_bytes_received] [Time $upstream_connect_time] $ssl_protocol $ssl_cipher'; + +access_log /data/logs/fallback_stream_access.log stream; diff --git a/docker/rootfs/etc/nginx/nginx.conf b/docker/rootfs/etc/nginx/nginx.conf index 3a31e14c..0a83ef0c 100644 --- a/docker/rootfs/etc/nginx/nginx.conf +++ b/docker/rootfs/etc/nginx/nginx.conf @@ -47,7 +47,7 @@ http { proxy_cache_path /var/lib/nginx/cache/private levels=1:2 keys_zone=private-cache:5m max_size=1024m; # Log format and fallback log file - include /etc/nginx/conf.d/include/log.conf; + include /etc/nginx/conf.d/include/log-proxy.conf; # Dynamically generated resolvers file include /etc/nginx/conf.d/include/resolvers.conf; @@ -85,6 +85,9 @@ http { } stream { + # Log format and fallback log file + include /etc/nginx/conf.d/include/log-stream.conf; + # Files generated by NPM include /data/nginx/stream/*.conf; diff --git a/frontend/src/locale/src/ko.json b/frontend/src/locale/src/ko.json index f9d82d85..80f7dddf 100644 --- a/frontend/src/locale/src/ko.json +++ b/frontend/src/locale/src/ko.json @@ -218,7 +218,7 @@ "column.provider": { "defaultMessage": "공급자" }, - "column.roles": { + "column.roles": { "defaultMessage": "권한" }, "column.rules": { From 9211ba6d1a25aa87678b7799ab6c35a4a58953d9 Mon Sep 17 00:00:00 2001 From: mobilandi <38279246+mobilandi@users.noreply.github.com> Date: Sat, 3 Jan 2026 23:06:25 +0100 Subject: [PATCH 41/55] Add DNS plugin for All-Inkl provider --- backend/certbot/dns-plugins.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend/certbot/dns-plugins.json b/backend/certbot/dns-plugins.json index 4eadd078..e0ecca66 100644 --- a/backend/certbot/dns-plugins.json +++ b/backend/certbot/dns-plugins.json @@ -375,6 +375,14 @@ "credentials": "dns_joker_username = \ndns_joker_password = \ndns_joker_domain = ", "full_plugin_name": "dns-joker" }, + "kas": { + "name": "All-Inkl", + "package_name": "certbot-dns-kas", + "version": "==0.1.1", + "dependencies": "kasserver", + "credentials": "dns_kas_user = your_kas_user\ndns_kas_password = your_kas_password", + "full_plugin_name": "dns-kas" + }, "leaseweb": { "name": "LeaseWeb", "package_name": "certbot-dns-leaseweb", From f25afa35901649f462cea467bf3df193b6bda97b Mon Sep 17 00:00:00 2001 From: mobilandi <38279246+mobilandi@users.noreply.github.com> Date: Sat, 3 Jan 2026 23:08:34 +0100 Subject: [PATCH 42/55] Change version constraint for certbot-dns-kas --- backend/certbot/dns-plugins.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/certbot/dns-plugins.json b/backend/certbot/dns-plugins.json index e0ecca66..dd124edf 100644 --- a/backend/certbot/dns-plugins.json +++ b/backend/certbot/dns-plugins.json @@ -378,7 +378,7 @@ "kas": { "name": "All-Inkl", "package_name": "certbot-dns-kas", - "version": "==0.1.1", + "version": "~=0.1.1", "dependencies": "kasserver", "credentials": "dns_kas_user = your_kas_user\ndns_kas_password = your_kas_password", "full_plugin_name": "dns-kas" From 55a1e0a4e7ba0d75dd488462f3c180aef20c2286 Mon Sep 17 00:00:00 2001 From: Gert Rue Brigsted Date: Sun, 4 Jan 2026 21:50:47 +0100 Subject: [PATCH 43/55] Added support for DNS challenges with Simply.com --- backend/certbot/dns-plugins.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend/certbot/dns-plugins.json b/backend/certbot/dns-plugins.json index 4eadd078..b5a9859f 100644 --- a/backend/certbot/dns-plugins.json +++ b/backend/certbot/dns-plugins.json @@ -535,6 +535,14 @@ "credentials": "[default]\naws_access_key_id=AKIAIOSFODNN7EXAMPLE\naws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "full_plugin_name": "dns-route53" }, + "simply": { + "name": "Simply", + "package_name": "certbot-dns-simply", + "version": "~=0.1.2", + "dependencies": "", + "credentials": "dns_simply_account_name = UExxxxxx\ndns_simply_api_key = DsHJdsjh2812872sahj", + "full_plugin_name": "dns-simply" + }, "spaceship": { "name": "Spaceship", "package_name": "certbot-dns-spaceship", From 471b62c7fe52313cb97319d28b9bae104b3b7f62 Mon Sep 17 00:00:00 2001 From: "kk.cheng" Date: Wed, 7 Jan 2026 19:07:52 +0800 Subject: [PATCH 44/55] Add option to select RSA or ECDSA key type when creating certificates --- backend/internal/certificate.js | 20 +++++++++++++ .../schema/components/certificate-object.json | 5 ++++ frontend/src/locale/src/bg.json | 12 ++++++++ frontend/src/locale/src/de.json | 12 ++++++++ frontend/src/locale/src/en.json | 12 ++++++++ frontend/src/locale/src/es.json | 12 ++++++++ frontend/src/locale/src/it.json | 12 ++++++++ frontend/src/locale/src/ja.json | 12 ++++++++ frontend/src/locale/src/ko.json | 14 ++++++++- frontend/src/locale/src/nl.json | 12 ++++++++ frontend/src/locale/src/pl.json | 12 ++++++++ frontend/src/locale/src/ru.json | 12 ++++++++ frontend/src/locale/src/sk.json | 12 ++++++++ frontend/src/locale/src/vi.json | 12 ++++++++ frontend/src/locale/src/zh.json | 12 ++++++++ frontend/src/modals/DNSCertificateModal.tsx | 27 ++++++++++++++++- frontend/src/modals/HTTPCertificateModal.tsx | 29 ++++++++++++++++++- 17 files changed, 236 insertions(+), 3 deletions(-) diff --git a/backend/internal/certificate.js b/backend/internal/certificate.js index 0828878b..bde1bdca 100644 --- a/backend/internal/certificate.js +++ b/backend/internal/certificate.js @@ -798,6 +798,11 @@ const internalCertificate = { certificate.domain_names.join(","), ]; + // Add key-type parameter if specified + if (certificate.meta?.key_type) { + args.push("--key-type", certificate.meta.key_type); + } + const adds = internalCertificate.getAdditionalCertbotArgs(certificate.id); args.push(...adds.args); @@ -858,6 +863,11 @@ const internalCertificate = { ); } + // Add key-type parameter if specified + if (certificate.meta?.key_type) { + args.push("--key-type", certificate.meta.key_type); + } + const adds = internalCertificate.getAdditionalCertbotArgs(certificate.id, certificate.meta.dns_provider); args.push(...adds.args); @@ -938,6 +948,11 @@ const internalCertificate = { "--disable-hook-validation", ]; + // Add key-type parameter if specified + if (certificate.meta?.key_type) { + args.push("--key-type", certificate.meta.key_type); + } + const adds = internalCertificate.getAdditionalCertbotArgs(certificate.id, certificate.meta.dns_provider); args.push(...adds.args); @@ -979,6 +994,11 @@ const internalCertificate = { "--no-random-sleep-on-renew", ]; + // Add key-type parameter if specified + if (certificate.meta?.key_type) { + args.push("--key-type", certificate.meta.key_type); + } + const adds = internalCertificate.getAdditionalCertbotArgs(certificate.id, certificate.meta.dns_provider); args.push(...adds.args); diff --git a/backend/schema/components/certificate-object.json b/backend/schema/components/certificate-object.json index ef2d613f..80cd92be 100644 --- a/backend/schema/components/certificate-object.json +++ b/backend/schema/components/certificate-object.json @@ -71,6 +71,11 @@ "propagation_seconds": { "type": "integer", "minimum": 0 + }, + "key_type": { + "type": "string", + "enum": ["rsa", "ecdsa"], + "default": "rsa" } }, "example": { diff --git a/frontend/src/locale/src/bg.json b/frontend/src/locale/src/bg.json index 81cab598..5183fe31 100644 --- a/frontend/src/locale/src/bg.json +++ b/frontend/src/locale/src/bg.json @@ -170,6 +170,18 @@ "certificates.http.warning": { "defaultMessage": "Тези домейни трябва вече да сочат към тази инсталация." }, + "certificates.key-type": { + "defaultMessage": "Тип ключ" + }, + "certificates.key-type-description": { + "defaultMessage": "RSA е широко съвместим, ECDSA е по-бърз и по-сигурен, но може да не се поддържа от по-стари системи" + }, + "certificates.key-type-ecdsa": { + "defaultMessage": "ECDSA 256" + }, + "certificates.key-type-rsa": { + "defaultMessage": "RSA 2048" + }, "certificates.request.subtitle": { "defaultMessage": "с Let's Encrypt" }, diff --git a/frontend/src/locale/src/de.json b/frontend/src/locale/src/de.json index d36b259d..ae97a29b 100644 --- a/frontend/src/locale/src/de.json +++ b/frontend/src/locale/src/de.json @@ -155,6 +155,18 @@ "certificates.http.warning": { "defaultMessage": "Diese Domänen müssen bereits so konfiguriert sein, dass sie auf diese Installation verweisen." }, + "certificates.key-type": { + "defaultMessage": "Schlüsseltyp" + }, + "certificates.key-type-description": { + "defaultMessage": "RSA ist weit verbreitet, ECDSA ist schneller und sicherer, wird aber möglicherweise von älteren Systemen nicht unterstützt" + }, + "certificates.key-type-ecdsa": { + "defaultMessage": "ECDSA 256" + }, + "certificates.key-type-rsa": { + "defaultMessage": "RSA 2048" + }, "certificates.request.subtitle": { "defaultMessage": "Über Let's Encrypt" }, diff --git a/frontend/src/locale/src/en.json b/frontend/src/locale/src/en.json index 355d0db7..efc7335f 100644 --- a/frontend/src/locale/src/en.json +++ b/frontend/src/locale/src/en.json @@ -170,6 +170,18 @@ "certificates.http.warning": { "defaultMessage": "These domains must be already configured to point to this installation." }, + "certificates.key-type": { + "defaultMessage": "Key Type" + }, + "certificates.key-type-description": { + "defaultMessage": "RSA is widely compatible, ECDSA is faster and more secure but may not be supported by older systems" + }, + "certificates.key-type-ecdsa": { + "defaultMessage": "ECDSA 256" + }, + "certificates.key-type-rsa": { + "defaultMessage": "RSA 2048" + }, "certificates.request.subtitle": { "defaultMessage": "with Let's Encrypt" }, diff --git a/frontend/src/locale/src/es.json b/frontend/src/locale/src/es.json index 2b1ebfa4..c8b1edb0 100644 --- a/frontend/src/locale/src/es.json +++ b/frontend/src/locale/src/es.json @@ -170,6 +170,18 @@ "certificates.http.warning": { "defaultMessage": "Estos dominios ya deben estar configurados para apuntar a esta instalación." }, + "certificates.key-type": { + "defaultMessage": "Tipo de Clave" + }, + "certificates.key-type-description": { + "defaultMessage": "RSA es ampliamente compatible, ECDSA es más rápido y seguro pero puede no ser compatible con sistemas antiguos" + }, + "certificates.key-type-ecdsa": { + "defaultMessage": "ECDSA 256" + }, + "certificates.key-type-rsa": { + "defaultMessage": "RSA 2048" + }, "certificates.request.subtitle": { "defaultMessage": "con Let's Encrypt" }, diff --git a/frontend/src/locale/src/it.json b/frontend/src/locale/src/it.json index 3301218f..3bbc7316 100644 --- a/frontend/src/locale/src/it.json +++ b/frontend/src/locale/src/it.json @@ -155,6 +155,18 @@ "certificates.http.warning": { "defaultMessage": "Questi domini devono già essere configurati per puntare a questa installazione." }, + "certificates.key-type": { + "defaultMessage": "Tipo di Chiave" + }, + "certificates.key-type-description": { + "defaultMessage": "RSA è ampiamente compatibile, ECDSA è più veloce e sicuro ma potrebbe non essere supportato da sistemi più vecchi" + }, + "certificates.key-type-ecdsa": { + "defaultMessage": "ECDSA 256" + }, + "certificates.key-type-rsa": { + "defaultMessage": "RSA 2048" + }, "certificates.request.subtitle": { "defaultMessage": "con Let's Encrypt" }, diff --git a/frontend/src/locale/src/ja.json b/frontend/src/locale/src/ja.json index 1ace1c64..2ffadd0c 100644 --- a/frontend/src/locale/src/ja.json +++ b/frontend/src/locale/src/ja.json @@ -155,6 +155,18 @@ "certificates.http.warning": { "defaultMessage": "これらのドメインは、すでにこのインストール先を指すように設定されている必要がありますあ." }, + "certificates.key-type": { + "defaultMessage": "鍵タイプ" + }, + "certificates.key-type-description": { + "defaultMessage": "RSAは広く互換性があり、ECDSAはより高速で安全ですが、古いシステムではサポートされていない場合があります" + }, + "certificates.key-type-ecdsa": { + "defaultMessage": "ECDSA 256" + }, + "certificates.key-type-rsa": { + "defaultMessage": "RSA 2048" + }, "certificates.request.subtitle": { "defaultMessage": "Let's Encryptを使用する" }, diff --git a/frontend/src/locale/src/ko.json b/frontend/src/locale/src/ko.json index f9d82d85..9c009359 100644 --- a/frontend/src/locale/src/ko.json +++ b/frontend/src/locale/src/ko.json @@ -170,6 +170,18 @@ "certificates.http.warning": { "defaultMessage": "도메인이 이 서버를 가리키도록 설정되어 있어야 합니다." }, + "certificates.key-type": { + "defaultMessage": "키 유형" + }, + "certificates.key-type-description": { + "defaultMessage": "RSA는 호환성이 넓고, ECDSA는 더 빠르고 안전하지만 오래된 시스템에서 지원되지 않을 수 있습니다" + }, + "certificates.key-type-ecdsa": { + "defaultMessage": "ECDSA 256" + }, + "certificates.key-type-rsa": { + "defaultMessage": "RSA 2048" + }, "certificates.request.subtitle": { "defaultMessage": "Let's Encrypt 사용" }, @@ -218,7 +230,7 @@ "column.provider": { "defaultMessage": "공급자" }, - "column.roles": { + "column.roles": { "defaultMessage": "권한" }, "column.rules": { diff --git a/frontend/src/locale/src/nl.json b/frontend/src/locale/src/nl.json index 2732f5e4..91e71df7 100644 --- a/frontend/src/locale/src/nl.json +++ b/frontend/src/locale/src/nl.json @@ -155,6 +155,18 @@ "certificates.http.warning": { "defaultMessage": "Deze domeinen moeten al worden geconfigureerd om naar deze installatie te wijzen." }, + "certificates.key-type": { + "defaultMessage": "Sleuteltype" + }, + "certificates.key-type-description": { + "defaultMessage": "RSA is breed compatibel, ECDSA is sneller en veiliger maar wordt mogelijk niet ondersteund door oudere systemen" + }, + "certificates.key-type-ecdsa": { + "defaultMessage": "ECDSA 256" + }, + "certificates.key-type-rsa": { + "defaultMessage": "RSA 2048" + }, "certificates.request.subtitle": { "defaultMessage": "met Let's Encrypt" }, diff --git a/frontend/src/locale/src/pl.json b/frontend/src/locale/src/pl.json index 9853c7bc..faaebc5e 100644 --- a/frontend/src/locale/src/pl.json +++ b/frontend/src/locale/src/pl.json @@ -155,6 +155,18 @@ "certificates.http.warning": { "defaultMessage": "Te domeny muszą być już skonfigurowane tak, aby wskazywały na ten serwer www" }, + "certificates.key-type": { + "defaultMessage": "Typ klucza" + }, + "certificates.key-type-description": { + "defaultMessage": "RSA jest szeroko kompatybilny, ECDSA jest szybszy i bezpieczniejszy, ale może nie być obsługiwany przez starsze systemy" + }, + "certificates.key-type-ecdsa": { + "defaultMessage": "ECDSA 256" + }, + "certificates.key-type-rsa": { + "defaultMessage": "RSA 2048" + }, "certificates.request.subtitle": { "defaultMessage": "z Let's Encrypt" }, diff --git a/frontend/src/locale/src/ru.json b/frontend/src/locale/src/ru.json index dedcd513..44dff129 100644 --- a/frontend/src/locale/src/ru.json +++ b/frontend/src/locale/src/ru.json @@ -155,6 +155,18 @@ "certificates.http.warning": { "defaultMessage": "Эти домены должны быть настроены и указывать на этот экземпляр." }, + "certificates.key-type": { + "defaultMessage": "Тип ключа" + }, + "certificates.key-type-description": { + "defaultMessage": "RSA широко совместим, ECDSA быстрее и безопаснее, но может не поддерживаться старыми системами" + }, + "certificates.key-type-ecdsa": { + "defaultMessage": "ECDSA 256" + }, + "certificates.key-type-rsa": { + "defaultMessage": "RSA 2048" + }, "certificates.request.subtitle": { "defaultMessage": "через Let's Encrypt" }, diff --git a/frontend/src/locale/src/sk.json b/frontend/src/locale/src/sk.json index d006e555..6431643f 100644 --- a/frontend/src/locale/src/sk.json +++ b/frontend/src/locale/src/sk.json @@ -155,6 +155,18 @@ "certificates.http.warning": { "defaultMessage": "Tieto domény musia byť už nakonfigurované tak, aby smerovali na túto inštaláciu." }, + "certificates.key-type": { + "defaultMessage": "Typ kľúča" + }, + "certificates.key-type-description": { + "defaultMessage": "RSA je široko kompatibilný, ECDSA je rýchlejší a bezpečnejší, ale nemusí byť podporovaný staršími systémami" + }, + "certificates.key-type-ecdsa": { + "defaultMessage": "ECDSA 256" + }, + "certificates.key-type-rsa": { + "defaultMessage": "RSA 2048" + }, "certificates.request.subtitle": { "defaultMessage": "pomocou Let's Encrypt" }, diff --git a/frontend/src/locale/src/vi.json b/frontend/src/locale/src/vi.json index fc1ed85b..32d26d55 100644 --- a/frontend/src/locale/src/vi.json +++ b/frontend/src/locale/src/vi.json @@ -155,6 +155,18 @@ "certificates.http.warning": { "defaultMessage": "Các miền này phải được cấu hình sẵn để trỏ đến cài đặt này." }, + "certificates.key-type": { + "defaultMessage": "Loại khóa" + }, + "certificates.key-type-description": { + "defaultMessage": "RSA tương thích rộng rãi, ECDSA nhanh hơn và an toàn hơn nhưng có thể không được hỗ trợ bởi các hệ thống cũ" + }, + "certificates.key-type-ecdsa": { + "defaultMessage": "ECDSA 256" + }, + "certificates.key-type-rsa": { + "defaultMessage": "RSA 2048" + }, "certificates.request.subtitle": { "defaultMessage": "bằng Let's Encrypt" }, diff --git a/frontend/src/locale/src/zh.json b/frontend/src/locale/src/zh.json index 541093a6..d40ea39d 100755 --- a/frontend/src/locale/src/zh.json +++ b/frontend/src/locale/src/zh.json @@ -155,6 +155,18 @@ "certificates.http.warning": { "defaultMessage": "这些域名必须配置为指向本设备。" }, + "certificates.key-type": { + "defaultMessage": "密钥类型" + }, + "certificates.key-type-description": { + "defaultMessage": "RSA 兼容性更好,ECDSA 更快更安全但旧系统可能不支持" + }, + "certificates.key-type-ecdsa": { + "defaultMessage": "ECDSA 256" + }, + "certificates.key-type-rsa": { + "defaultMessage": "RSA 2048" + }, "certificates.request.subtitle": { "defaultMessage": "使用 Let's Encrypt" }, diff --git a/frontend/src/modals/DNSCertificateModal.tsx b/frontend/src/modals/DNSCertificateModal.tsx index 3c97fddd..f062e24d 100644 --- a/frontend/src/modals/DNSCertificateModal.tsx +++ b/frontend/src/modals/DNSCertificateModal.tsx @@ -1,6 +1,6 @@ import { useQueryClient } from "@tanstack/react-query"; import EasyModal, { type InnerModalProps } from "ez-modal-react"; -import { Form, Formik } from "formik"; +import { Form, Formik, Field } from "formik"; import { type ReactNode, useState } from "react"; import { Alert } from "react-bootstrap"; import Modal from "react-bootstrap/Modal"; @@ -44,6 +44,7 @@ const DNSCertificateModal = EasyModal.create(({ visible, remove }: InnerModalPro provider: "letsencrypt", meta: { dnsChallenge: true, + keyType: "ecdsa", }, } as any } @@ -63,6 +64,30 @@ const DNSCertificateModal = EasyModal.create(({ visible, remove }: InnerModalPro
+ + {({ field }: any) => ( +
+ + + + + +
+ )} +
diff --git a/frontend/src/modals/HTTPCertificateModal.tsx b/frontend/src/modals/HTTPCertificateModal.tsx index b996a7d6..a06df2c6 100644 --- a/frontend/src/modals/HTTPCertificateModal.tsx +++ b/frontend/src/modals/HTTPCertificateModal.tsx @@ -1,7 +1,7 @@ import { IconAlertTriangle } from "@tabler/icons-react"; import { useQueryClient } from "@tanstack/react-query"; import EasyModal, { type InnerModalProps } from "ez-modal-react"; -import { Form, Formik } from "formik"; +import { Form, Formik, Field } from "formik"; import { type ReactNode, useState } from "react"; import { Alert } from "react-bootstrap"; import Modal from "react-bootstrap/Modal"; @@ -115,6 +115,9 @@ const HTTPCertificateModal = EasyModal.create(({ visible, remove }: InnerModalPr { domainNames: [], provider: "letsencrypt", + meta: { + keyType: "ecdsa", + }, } as any } onSubmit={onSubmit} @@ -142,6 +145,30 @@ const HTTPCertificateModal = EasyModal.create(({ visible, remove }: InnerModalPr setTestResults(null); }} /> + + {({ field }: any) => ( +
+ + + + + +
+ )} +
{testResults ? (
From 336726db8dbec866e0a391f038f228f98af61afe Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Tue, 13 Jan 2026 14:40:10 +1000 Subject: [PATCH 45/55] Backend yarn lock updates --- backend/yarn.lock | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/backend/yarn.lock b/backend/yarn.lock index b6f7a948..5ffc47e5 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -138,6 +138,44 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@otplib/core@^12.0.1": + version "12.0.1" + resolved "https://registry.yarnpkg.com/@otplib/core/-/core-12.0.1.tgz#73720a8cedce211fe5b3f683cd5a9c098eaf0f8d" + integrity sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA== + +"@otplib/plugin-crypto@^12.0.1": + version "12.0.1" + resolved "https://registry.yarnpkg.com/@otplib/plugin-crypto/-/plugin-crypto-12.0.1.tgz#2b42c624227f4f9303c1c041fca399eddcbae25e" + integrity sha512-qPuhN3QrT7ZZLcLCyKOSNhuijUi9G5guMRVrxq63r9YNOxxQjPm59gVxLM+7xGnHnM6cimY57tuKsjK7y9LM1g== + dependencies: + "@otplib/core" "^12.0.1" + +"@otplib/plugin-thirty-two@^12.0.1": + version "12.0.1" + resolved "https://registry.yarnpkg.com/@otplib/plugin-thirty-two/-/plugin-thirty-two-12.0.1.tgz#5cc9b56e6e89f2a1fe4a2b38900ca4e11c87aa9e" + integrity sha512-MtT+uqRso909UkbrrYpJ6XFjj9D+x2Py7KjTO9JDPhL0bJUYVu5kFP4TFZW4NFAywrAtFRxOVY261u0qwb93gA== + dependencies: + "@otplib/core" "^12.0.1" + thirty-two "^1.0.2" + +"@otplib/preset-default@^12.0.1": + version "12.0.1" + resolved "https://registry.yarnpkg.com/@otplib/preset-default/-/preset-default-12.0.1.tgz#cb596553c08251e71b187ada4a2246ad2a3165ba" + integrity sha512-xf1v9oOJRyXfluBhMdpOkr+bsE+Irt+0D5uHtvg6x1eosfmHCsCC6ej/m7FXiWqdo0+ZUI6xSKDhJwc8yfiOPQ== + dependencies: + "@otplib/core" "^12.0.1" + "@otplib/plugin-crypto" "^12.0.1" + "@otplib/plugin-thirty-two" "^12.0.1" + +"@otplib/preset-v11@^12.0.1": + version "12.0.1" + resolved "https://registry.yarnpkg.com/@otplib/preset-v11/-/preset-v11-12.0.1.tgz#4c7266712e7230500b421ba89252963c838fc96d" + integrity sha512-9hSetMI7ECqbFiKICrNa4w70deTUfArtwXykPUvSHWOdzOlfa9ajglu7mNCntlvxycTiOAXkQGwjQCzzDEMRMg== + dependencies: + "@otplib/core" "^12.0.1" + "@otplib/plugin-crypto" "^12.0.1" + "@otplib/plugin-thirty-two" "^12.0.1" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -1978,6 +2016,15 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +otplib@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/otplib/-/otplib-12.0.1.tgz#c1d3060ab7aadf041ed2960302f27095777d1f73" + integrity sha512-xDGvUOQjop7RDgxTQ+o4pOol0/3xSZzawTiPKRrHnQWAy0WjhNs/5HdIDJCrqC4MBynmjXgULc6YfioaxZeFgg== + dependencies: + "@otplib/core" "^12.0.1" + "@otplib/preset-default" "^12.0.1" + "@otplib/preset-v11" "^12.0.1" + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -2736,6 +2783,11 @@ temp-write@^4.0.0: temp-dir "^1.0.0" uuid "^3.3.2" +thirty-two@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/thirty-two/-/thirty-two-1.0.2.tgz#4ca2fffc02a51290d2744b9e3f557693ca6b627a" + integrity sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA== + tildify@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" From 3e3396ba9a58c422dc2e2149781ce4aed3e10b69 Mon Sep 17 00:00:00 2001 From: jc21 Date: Tue, 13 Jan 2026 15:05:13 +1000 Subject: [PATCH 46/55] Update lang-list.json --- frontend/src/locale/src/lang-list.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locale/src/lang-list.json b/frontend/src/locale/src/lang-list.json index e61d39b3..d4017f13 100755 --- a/frontend/src/locale/src/lang-list.json +++ b/frontend/src/locale/src/lang-list.json @@ -13,7 +13,7 @@ }, "locale-id-ID": { "defaultMessage": "Bahasa Indonesia" - } + }, "locale-ja-JP": { "defaultMessage": "日本語" }, From 9c25410331c528ac224c677147e34088f52d9788 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Tue, 13 Jan 2026 22:15:43 +1000 Subject: [PATCH 47/55] Fix locale sort not to use sponge --- frontend/src/locale/scripts/locale-sort.sh | 2 +- frontend/src/locale/src/lang-list.json | 0 frontend/src/locale/src/nl.json | 2 +- frontend/src/locale/src/zh.json | 0 frontend/yarn.lock | 369 +++++++++++++++++++-- 5 files changed, 344 insertions(+), 29 deletions(-) mode change 100755 => 100644 frontend/src/locale/src/lang-list.json mode change 100755 => 100644 frontend/src/locale/src/zh.json diff --git a/frontend/src/locale/scripts/locale-sort.sh b/frontend/src/locale/scripts/locale-sort.sh index 916d6e61..f7458887 100755 --- a/frontend/src/locale/scripts/locale-sort.sh +++ b/frontend/src/locale/scripts/locale-sort.sh @@ -31,6 +31,6 @@ for file in *.json; do fi echo "Sorting $file" - jq --tab --sort-keys . "$file" | sponge "$file" + tmp=$(mktemp) && jq --tab --sort-keys . "$file" > "$tmp" && mv "$tmp" "$file" fi done diff --git a/frontend/src/locale/src/lang-list.json b/frontend/src/locale/src/lang-list.json old mode 100755 new mode 100644 diff --git a/frontend/src/locale/src/nl.json b/frontend/src/locale/src/nl.json index 91e71df7..81c37054 100644 --- a/frontend/src/locale/src/nl.json +++ b/frontend/src/locale/src/nl.json @@ -656,4 +656,4 @@ "users": { "defaultMessage": "Gebruikers" } -} \ No newline at end of file +} diff --git a/frontend/src/locale/src/zh.json b/frontend/src/locale/src/zh.json old mode 100755 new mode 100644 diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 2c5d0db5..0fe46ccd 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -21,7 +21,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz" integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.28.5": +"@babel/core@^7.28.5": version "7.28.5" resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz" integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== @@ -170,7 +170,7 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.28.5" -"@biomejs/biome@^2.3.2", "@biomejs/biome@>=1.7": +"@biomejs/biome@^2.3.2": version "2.3.2" resolved "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.2.tgz" integrity sha512-8e9tzamuDycx7fdrcJ/F/GDZ8SYukc5ud6tDicjjFqURKYFSWMl0H0iXNXZEGmcmNUmABgGuHThPykcM41INgg== @@ -189,6 +189,41 @@ resolved "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.2.tgz" integrity sha512-4LECm4kc3If0JISai4c3KWQzukoUdpxy4fRzlrPcrdMSRFksR9ZoXK7JBcPuLBmd2SoT4/d7CQS33VnZpgBjew== +"@biomejs/cli-darwin-x64@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.2.tgz#9c3dffdac12e4f4d8db7680ca20f58ace1f38c23" + integrity sha512-jNMnfwHT4N3wi+ypRfMTjLGnDmKYGzxVr1EYAPBcauRcDnICFXN81wD6wxJcSUrLynoyyYCdfW6vJHS/IAoTDA== + +"@biomejs/cli-linux-arm64-musl@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.2.tgz#a0424d2fe355cc43c375b3fbf3e42d39b7221d0e" + integrity sha512-2Zz4usDG1GTTPQnliIeNx6eVGGP2ry5vE/v39nT73a3cKN6t5H5XxjcEoZZh62uVZvED7hXXikclvI64vZkYqw== + +"@biomejs/cli-linux-arm64@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.2.tgz#f85717c04d420ede20523d173a1fc10df60d4d37" + integrity sha512-amnqvk+gWybbQleRRq8TMe0rIv7GHss8mFJEaGuEZYWg1Tw14YKOkeo8h6pf1c+d3qR+JU4iT9KXnBKGON4klw== + +"@biomejs/cli-linux-x64-musl@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.2.tgz#d3e114c744c32d2c50a77c13476bd941819c92d8" + integrity sha512-gzB19MpRdTuOuLtPpFBGrV3Lq424gHyq2lFj8wfX9tvLMLdmA/R9C7k/mqBp/spcbWuHeIEKgEs3RviOPcWGBA== + +"@biomejs/cli-linux-x64@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.2.tgz#f66ce85d2d757d45e6edecce04753a805bd816f0" + integrity sha512-8BG/vRAhFz1pmuyd24FQPhNeueLqPtwvZk6yblABY2gzL2H8fLQAF/Z2OPIc+BPIVPld+8cSiKY/KFh6k81xfA== + +"@biomejs/cli-win32-arm64@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.2.tgz#b46f8b47a3d97e766cc5ad5eb67d90eeb230b2cb" + integrity sha512-lCruqQlfWjhMlOdyf5pDHOxoNm4WoyY2vZ4YN33/nuZBRstVDuqPPjS0yBkbUlLEte11FbpW+wWSlfnZfSIZvg== + +"@biomejs/cli-win32-x64@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.2.tgz#a14f5e220dd496705278315ee3e5e028dd657344" + integrity sha512-6Ee9P26DTb4D8sN9nXxgbi9Dw5vSOfH98M7UlmkjKB2vtUbrRqCbZiNfryGiwnPIpd6YUoTl7rLVD2/x1CyEHQ== + "@emotion/babel-plugin@^11.13.5": version "11.13.5" resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz" @@ -277,11 +312,136 @@ resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz" integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== +"@esbuild/aix-ppc64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz#bef96351f16520055c947aba28802eede3c9e9a9" + integrity sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA== + +"@esbuild/android-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz#d2e70be7d51a529425422091e0dcb90374c1546c" + integrity sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg== + +"@esbuild/android-arm@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.9.tgz#d2a753fe2a4c73b79437d0ba1480e2d760097419" + integrity sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ== + +"@esbuild/android-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.9.tgz#5278836e3c7ae75761626962f902a0d55352e683" + integrity sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw== + "@esbuild/darwin-arm64@0.25.9": version "0.25.9" resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz" integrity sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg== +"@esbuild/darwin-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz#e27dbc3b507b3a1cea3b9280a04b8b6b725f82be" + integrity sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ== + +"@esbuild/freebsd-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz#364e3e5b7a1fd45d92be08c6cc5d890ca75908ca" + integrity sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q== + +"@esbuild/freebsd-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz#7c869b45faeb3df668e19ace07335a0711ec56ab" + integrity sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg== + +"@esbuild/linux-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz#48d42861758c940b61abea43ba9a29b186d6cb8b" + integrity sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw== + +"@esbuild/linux-arm@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz#6ce4b9cabf148274101701d112b89dc67cc52f37" + integrity sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw== + +"@esbuild/linux-ia32@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz#207e54899b79cac9c26c323fc1caa32e3143f1c4" + integrity sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A== + +"@esbuild/linux-loong64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz#0ba48a127159a8f6abb5827f21198b999ffd1fc0" + integrity sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ== + +"@esbuild/linux-mips64el@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz#a4d4cc693d185f66a6afde94f772b38ce5d64eb5" + integrity sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA== + +"@esbuild/linux-ppc64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz#0f5805c1c6d6435a1dafdc043cb07a19050357db" + integrity sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w== + +"@esbuild/linux-riscv64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz#6776edece0f8fca79f3386398b5183ff2a827547" + integrity sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg== + +"@esbuild/linux-s390x@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz#3f6f29ef036938447c2218d309dc875225861830" + integrity sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA== + +"@esbuild/linux-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz#831fe0b0e1a80a8b8391224ea2377d5520e1527f" + integrity sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg== + +"@esbuild/netbsd-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz#06f99d7eebe035fbbe43de01c9d7e98d2a0aa548" + integrity sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q== + +"@esbuild/netbsd-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz#db99858e6bed6e73911f92a88e4edd3a8c429a52" + integrity sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g== + +"@esbuild/openbsd-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz#afb886c867e36f9d86bb21e878e1185f5d5a0935" + integrity sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ== + +"@esbuild/openbsd-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz#30855c9f8381fac6a0ef5b5f31ac6e7108a66ecf" + integrity sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA== + +"@esbuild/openharmony-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz#2f2144af31e67adc2a8e3705c20c2bd97bd88314" + integrity sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg== + +"@esbuild/sunos-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz#69b99a9b5bd226c9eb9c6a73f990fddd497d732e" + integrity sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw== + +"@esbuild/win32-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz#d789330a712af916c88325f4ffe465f885719c6b" + integrity sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ== + +"@esbuild/win32-ia32@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz#52fc735406bd49688253e74e4e837ac2ba0789e3" + integrity sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww== + +"@esbuild/win32-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz#585624dc829cfb6e7c0aa6c3ca7d7e6daa87e34f" + integrity sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ== + "@floating-ui/core@^1.7.3": version "1.7.3" resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz" @@ -393,11 +553,71 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@parcel/watcher-android-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" + integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== + "@parcel/watcher-darwin-arm64@2.5.1": version "2.5.1" resolved "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz" integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== +"@parcel/watcher-darwin-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" + integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== + +"@parcel/watcher-freebsd-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" + integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== + +"@parcel/watcher-linux-arm-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" + integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== + +"@parcel/watcher-linux-arm-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" + integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== + +"@parcel/watcher-linux-arm64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" + integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== + +"@parcel/watcher-linux-arm64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" + integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== + +"@parcel/watcher-linux-x64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e" + integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== + +"@parcel/watcher-linux-x64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee" + integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== + +"@parcel/watcher-win32-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" + integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== + +"@parcel/watcher-win32-ia32@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" + integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== + +"@parcel/watcher-win32-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" + integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== + "@parcel/watcher@^2.4.1": version "2.5.1" resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz" @@ -468,11 +688,111 @@ resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz" integrity sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ== +"@rollup/rollup-android-arm-eabi@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz#939c1be9625d428d8513e4ab60d406fe8db23718" + integrity sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ== + +"@rollup/rollup-android-arm64@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz#b74005775903f7a8f4e363d2840c1dcef3776ff3" + integrity sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw== + "@rollup/rollup-darwin-arm64@4.50.0": version "4.50.0" resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz" integrity sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg== +"@rollup/rollup-darwin-x64@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz#19ec976f1cc663def2692cd7ffb32981f2b0b733" + integrity sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw== + +"@rollup/rollup-freebsd-arm64@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz#a96b4ad8346229f6fcbd9d57f1c53040b037c2da" + integrity sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ== + +"@rollup/rollup-freebsd-x64@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz#fa565a282bc57967ee6668607b181678bdd74e4a" + integrity sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA== + +"@rollup/rollup-linux-arm-gnueabihf@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz#dfc88f7295e1f98d77f25296be787e8a5d6ced75" + integrity sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w== + +"@rollup/rollup-linux-arm-musleabihf@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz#32cd70c87455ca031f0361090cf17da5a2ef66d5" + integrity sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg== + +"@rollup/rollup-linux-arm64-gnu@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz#0e7e1fe7241e3384f6c6b4ccdbcfa8ad8c78b869" + integrity sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g== + +"@rollup/rollup-linux-arm64-musl@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz#5d421f2f3e4a84786c4dfd9ce97e595c9b59e7f4" + integrity sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ== + +"@rollup/rollup-linux-loongarch64-gnu@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz#a0fb5c7d0e88319e18acfd9436f19ee39354b027" + integrity sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ== + +"@rollup/rollup-linux-ppc64-gnu@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz#a65b598af12f25210c3295da551a6e3616ea488d" + integrity sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg== + +"@rollup/rollup-linux-riscv64-gnu@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz#10ba776214ae2857c5bf4389690dabb2fbaf7d98" + integrity sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA== + +"@rollup/rollup-linux-riscv64-musl@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz#c2a46cbaa329d5f21e5808f5a66bb9c78cf68aac" + integrity sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ== + +"@rollup/rollup-linux-s390x-gnu@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz#a07447be069d64462e30c66611be20c4513963ed" + integrity sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ== + +"@rollup/rollup-linux-x64-gnu@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz#8887c58bd51242754ae9c56947d6e883332dcc74" + integrity sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA== + +"@rollup/rollup-linux-x64-musl@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz#6403fda72a2b3b9fbbeeff93d14f1c45ef9775f3" + integrity sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw== + +"@rollup/rollup-openharmony-arm64@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz#52809afccaff47e731b965a0c16e5686be819d5f" + integrity sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q== + +"@rollup/rollup-win32-arm64-msvc@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz#23fe00ddbb40b27a3889bc1e99e6310d97353ad5" + integrity sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg== + +"@rollup/rollup-win32-ia32-msvc@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz#520b588076b593413d919912d69dfd5728a1f305" + integrity sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw== + +"@rollup/rollup-win32-x64-msvc@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz#d81efe6a12060c7feddf9805e2a94c3ab0679f48" + integrity sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg== + "@standard-schema/spec@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz" @@ -522,7 +842,7 @@ dependencies: "@tanstack/query-devtools" "5.90.1" -"@tanstack/react-query@^5.90.2", "@tanstack/react-query@^5.90.6": +"@tanstack/react-query@^5.90.6": version "5.90.6" resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.6.tgz" integrity sha512-gB1sljYjcobZKxjPbKSa31FUTyr+ROaBdoH+wSSs9Dk+yDCmMs+TkTV3PybRRVLC7ax7q0erJ9LvRWnMktnRAw== @@ -541,7 +861,7 @@ resolved "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz" integrity sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg== -"@testing-library/dom@^10.0.0", "@testing-library/dom@^10.4.1": +"@testing-library/dom@^10.4.1": version "10.4.1" resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz" integrity sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg== @@ -624,7 +944,7 @@ resolved "https://registry.npmjs.org/@types/country-flag-icons/-/country-flag-icons-1.2.2.tgz" integrity sha512-CefEn/J336TBDp7NX8JqzlDtCBOsm8M3r1Li0gEOt0HOMHF1XemNyrx9lSHjsafcb1yYWybU0N8ZAXuyCaND0w== -"@types/debug@^4.0.0", "@types/debug@^4.1.12": +"@types/debug@^4.0.0": version "4.1.12" resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== @@ -643,7 +963,7 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@1.0.8": +"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0": version "1.0.8" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== @@ -686,7 +1006,7 @@ resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz" integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== -"@types/node@^20.0.0", "@types/node@^20.0.0 || ^22.0.0 || >=24.0.0", "@types/node@^20.19.0 || >=22.12.0": +"@types/node@^20.0.0": version "20.19.11" resolved "https://registry.npmjs.org/@types/node/-/node-20.19.11.tgz" integrity sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow== @@ -708,7 +1028,7 @@ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz" integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== -"@types/react-dom@^18.0.0 || ^19.0.0", "@types/react-dom@^19.2.3": +"@types/react-dom@^19.2.3": version "19.2.3" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz" integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== @@ -725,7 +1045,7 @@ resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz" integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== -"@types/react@*", "@types/react@^18.0.0 || ^19.0.0", "@types/react@^19.2.0", "@types/react@^19.2.7", "@types/react@>=16.14.8", "@types/react@>=16.9.11", "@types/react@>=18", "@types/react@16 || 17 || 18 || 19": +"@types/react@*", "@types/react@16 || 17 || 18 || 19", "@types/react@>=16.9.11", "@types/react@^19.2.7": version "19.2.7" resolved "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz" integrity sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg== @@ -737,12 +1057,7 @@ resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz" integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== -"@types/unist@^2": - version "2.0.11" - resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz" - integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== - -"@types/unist@^2.0.0": +"@types/unist@^2", "@types/unist@^2.0.0": version "2.0.11" resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz" integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== @@ -851,7 +1166,7 @@ ansi-styles@^5.0.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -aria-query@^5.0.0, aria-query@5.3.0: +aria-query@5.3.0, aria-query@^5.0.0: version "5.3.0" resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== @@ -889,7 +1204,7 @@ braces@^3.0.3: dependencies: fill-range "^7.1.1" -browserslist@^4.24.0, "browserslist@>= 4.21.0": +browserslist@^4.24.0: version "4.25.4" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz" integrity sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg== @@ -1239,7 +1554,7 @@ globrex@^0.1.2: resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== -happy-dom@*, happy-dom@^20.0.10: +happy-dom@^20.0.10: version "20.0.10" resolved "https://registry.npmjs.org/happy-dom/-/happy-dom-20.0.10.tgz" integrity sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g== @@ -1981,7 +2296,7 @@ performance-now@^2.1.0: resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== -picocolors@^1.1.1, picocolors@1.1.1: +picocolors@1.1.1, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -1991,7 +2306,7 @@ picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -"picomatch@^3 || ^4", picomatch@^4.0.3: +picomatch@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== @@ -2001,7 +2316,7 @@ postcss-simple-vars@^7.0.1: resolved "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-7.0.1.tgz" integrity sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A== -postcss@^8.2.1, postcss@^8.5.6: +postcss@^8.5.6: version "8.5.6" resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== @@ -2088,7 +2403,7 @@ react-bootstrap@^2.10.10: uncontrollable "^7.2.1" warning "^4.0.3" -"react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.2.3, react-dom@>=16.14.0, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.9.0, react-dom@>=18, react-dom@>16.8.0: +react-dom@^19.2.3: version "19.2.3" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz" integrity sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg== @@ -2198,7 +2513,7 @@ react-transition-group@^4.3.0, react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" -"react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react@^18 || ^19", "react@^18.0.0 || ^19.0.0", react@^19.2.3, "react@>= 16", react@>=0.14.0, react@>=15.0.0, react@>=16.14.0, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=16.9.0, react@>=18, react@>16.8.0, "react@16 || 17 || 18 || 19": +react@^19.2.3: version "19.2.3" resolved "https://registry.npmjs.org/react/-/react-19.2.3.tgz" integrity sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA== @@ -2346,7 +2661,7 @@ safe-buffer@^5.1.0: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -sass@^1.70.0, sass@^1.93.3: +sass@^1.93.3: version "1.93.3" resolved "https://registry.npmjs.org/sass/-/sass-1.93.3.tgz" integrity sha512-elOcIZRTM76dvxNAjqYrucTSI0teAF/L2Lv0s6f6b7FOwcwIuA357bIE871580AjHJuSvLIRUosgV+lIWx6Rgg== @@ -2377,7 +2692,7 @@ siginfo@^2.0.0: resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -source-map-js@^1.2.1, "source-map-js@>=0.6.2 <2.0.0": +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -2511,7 +2826,7 @@ tslib@^2.0.0, tslib@^2.8.0: resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -typescript@*, typescript@^5.0.0, typescript@^5.6.0, typescript@>4.0.0, typescript@5.9.3: +typescript@5.9.3: version "5.9.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== @@ -2666,7 +2981,7 @@ vite-tsconfig-paths@^5.1.4: globrex "^0.1.2" tsconfck "^3.0.3" -vite@*, "vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "vite@^6.0.0 || ^7.0.0", "vite@^6.0.0 || ^7.0.0-0", vite@^7.1.12, vite@>=5.4.20: +"vite@^6.0.0 || ^7.0.0", vite@^7.1.12: version "7.1.12" resolved "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz" integrity sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug== From b01a22c3935debd5b21c5e0ab25e7b8146ed270f Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Tue, 13 Jan 2026 22:42:42 +1000 Subject: [PATCH 48/55] Fix frontend locale tests after date-fns changed intl formatting and also attempt to format dates in locale --- frontend/src/components/Form/AccessField.tsx | 4 ++- .../components/Form/SSLCertificateField.tsx | 4 ++- .../Table/Formatter/DateFormatter.tsx | 4 ++- .../Table/Formatter/DomainsFormatter.tsx | 5 +++- .../Table/Formatter/EventFormatter.tsx | 4 ++- .../Formatter/ValueWithDateFormatter.tsx | 4 ++- frontend/src/locale/Utils.test.tsx | 6 ++-- frontend/src/locale/Utils.ts | 28 +++++++++++-------- 8 files changed, 38 insertions(+), 21 deletions(-) diff --git a/frontend/src/components/Form/AccessField.tsx b/frontend/src/components/Form/AccessField.tsx index 16059ac3..afcbd0cf 100644 --- a/frontend/src/components/Form/AccessField.tsx +++ b/frontend/src/components/Form/AccessField.tsx @@ -3,6 +3,7 @@ import { Field, useFormikContext } from "formik"; import type { ReactNode } from "react"; import Select, { type ActionMeta, components, type OptionProps } from "react-select"; import type { AccessList } from "src/api/backend"; +import { useLocaleState } from "src/context"; import { useAccessLists } from "src/hooks"; import { formatDateTime, intl, T } from "src/locale"; @@ -32,6 +33,7 @@ interface Props { label?: string; } export function AccessField({ name = "accessListId", label = "access-list", id = "accessListId" }: Props) { + const { locale } = useLocaleState(); const { isLoading, isError, error, data } = useAccessLists(["owner", "items", "clients"]); const { setFieldValue } = useFormikContext(); @@ -48,7 +50,7 @@ export function AccessField({ name = "accessListId", label = "access-list", id = { users: item?.items?.length, rules: item?.clients?.length, - date: item?.createdOn ? formatDateTime(item?.createdOn) : "N/A", + date: item?.createdOn ? formatDateTime(item?.createdOn, locale) : "N/A", }, ), icon: , diff --git a/frontend/src/components/Form/SSLCertificateField.tsx b/frontend/src/components/Form/SSLCertificateField.tsx index 0e7ce337..6ab3ea92 100644 --- a/frontend/src/components/Form/SSLCertificateField.tsx +++ b/frontend/src/components/Form/SSLCertificateField.tsx @@ -2,6 +2,7 @@ import { IconShield } from "@tabler/icons-react"; import { Field, useFormikContext } from "formik"; import Select, { type ActionMeta, components, type OptionProps } from "react-select"; import type { Certificate } from "src/api/backend"; +import { useLocaleState } from "src/context"; import { useCertificates } from "src/hooks"; import { formatDateTime, intl, T } from "src/locale"; @@ -41,6 +42,7 @@ export function SSLCertificateField({ allowNew, forHttp = true, }: Props) { + const { locale } = useLocaleState(); const { isLoading, isError, error, data } = useCertificates(); const { values, setFieldValue } = useFormikContext(); const v: any = values || {}; @@ -75,7 +77,7 @@ export function SSLCertificateField({ data?.map((cert: Certificate) => ({ value: cert.id, label: cert.niceName, - subLabel: `${cert.provider === "letsencrypt" ? intl.formatMessage({ id: "lets-encrypt" }) : cert.provider} — ${intl.formatMessage({ id: "expires.on" }, { date: cert.expiresOn ? formatDateTime(cert.expiresOn) : "N/A" })}`, + subLabel: `${cert.provider === "letsencrypt" ? intl.formatMessage({ id: "lets-encrypt" }) : cert.provider} — ${intl.formatMessage({ id: "expires.on" }, { date: cert.expiresOn ? formatDateTime(cert.expiresOn, locale) : "N/A" })}`, icon: , })) || []; diff --git a/frontend/src/components/Table/Formatter/DateFormatter.tsx b/frontend/src/components/Table/Formatter/DateFormatter.tsx index acb96461..830b06e2 100644 --- a/frontend/src/components/Table/Formatter/DateFormatter.tsx +++ b/frontend/src/components/Table/Formatter/DateFormatter.tsx @@ -1,5 +1,6 @@ import cn from "classnames"; import { differenceInDays, isPast } from "date-fns"; +import { useLocaleState } from "src/context"; import { formatDateTime, parseDate } from "src/locale"; interface Props { @@ -8,6 +9,7 @@ interface Props { highlistNearlyExpired?: boolean; } export function DateFormatter({ value, highlightPast, highlistNearlyExpired }: Props) { + const { locale } = useLocaleState(); const d = parseDate(value); const dateIsPast = d ? isPast(d) : false; const days = d ? differenceInDays(d, new Date()) : 0; @@ -15,5 +17,5 @@ export function DateFormatter({ value, highlightPast, highlistNearlyExpired }: P "text-danger": highlightPast && dateIsPast, "text-warning": highlistNearlyExpired && !dateIsPast && days <= 30 && days >= 0, }); - return {formatDateTime(value)}; + return {formatDateTime(value, locale)}; } diff --git a/frontend/src/components/Table/Formatter/DomainsFormatter.tsx b/frontend/src/components/Table/Formatter/DomainsFormatter.tsx index fc32968c..35e8393e 100644 --- a/frontend/src/components/Table/Formatter/DomainsFormatter.tsx +++ b/frontend/src/components/Table/Formatter/DomainsFormatter.tsx @@ -1,5 +1,6 @@ import cn from "classnames"; import type { ReactNode } from "react"; +import { useLocaleState } from "src/context"; import { formatDateTime, T } from "src/locale"; interface Props { @@ -37,7 +38,9 @@ const DomainLink = ({ domain, color }: { domain?: string; color?: string }) => { }; export function DomainsFormatter({ domains, createdOn, niceName, provider, color }: Props) { + const { locale } = useLocaleState(); const elms: ReactNode[] = []; + if ((!domains || domains.length === 0) && !niceName) { elms.push( @@ -62,7 +65,7 @@ export function DomainsFormatter({ domains, createdOn, niceName, provider, color
{...elms}
{createdOn ? (
- +
) : null}
diff --git a/frontend/src/components/Table/Formatter/EventFormatter.tsx b/frontend/src/components/Table/Formatter/EventFormatter.tsx index ff37ecbe..1220fa09 100644 --- a/frontend/src/components/Table/Formatter/EventFormatter.tsx +++ b/frontend/src/components/Table/Formatter/EventFormatter.tsx @@ -1,6 +1,7 @@ import { IconArrowsCross, IconBolt, IconBoltOff, IconDisc, IconLock, IconShield, IconUser } from "@tabler/icons-react"; import cn from "classnames"; import type { AuditLog } from "src/api/backend"; +import { useLocaleState } from "src/context"; import { formatDateTime, T } from "src/locale"; const getEventValue = (event: AuditLog) => { @@ -66,6 +67,7 @@ interface Props { row: AuditLog; } export function EventFormatter({ row }: Props) { + const { locale } = useLocaleState(); return (
@@ -73,7 +75,7 @@ export function EventFormatter({ row }: Props) {   — {getEventValue(row)}
-
{formatDateTime(row.createdOn)}
+
{formatDateTime(row.createdOn, locale)}
); } diff --git a/frontend/src/components/Table/Formatter/ValueWithDateFormatter.tsx b/frontend/src/components/Table/Formatter/ValueWithDateFormatter.tsx index 38352b31..d83ccbfa 100644 --- a/frontend/src/components/Table/Formatter/ValueWithDateFormatter.tsx +++ b/frontend/src/components/Table/Formatter/ValueWithDateFormatter.tsx @@ -1,3 +1,4 @@ +import { useLocaleState } from "src/context"; import { formatDateTime, T } from "src/locale"; interface Props { @@ -6,6 +7,7 @@ interface Props { disabled?: boolean; } export function ValueWithDateFormatter({ value, createdOn, disabled }: Props) { + const { locale } = useLocaleState(); return (
@@ -13,7 +15,7 @@ export function ValueWithDateFormatter({ value, createdOn, disabled }: Props) {
{createdOn ? (
- +
) : null}
diff --git a/frontend/src/locale/Utils.test.tsx b/frontend/src/locale/Utils.test.tsx index fb262501..e998dc31 100644 --- a/frontend/src/locale/Utils.test.tsx +++ b/frontend/src/locale/Utils.test.tsx @@ -39,19 +39,19 @@ describe("DateFormatter", () => { it("format date from iso date", () => { const value = "2024-01-01T00:00:00.000Z"; const text = formatDateTime(value); - expect(text).toBe("Monday, 01/01/2024, 12:00:00 am"); + expect(text).toBe("1 Jan 2024, 12:00:00 am"); }); it("format date from unix timestamp number", () => { const value = 1762476112; const text = formatDateTime(value); - expect(text).toBe("Friday, 07/11/2025, 12:41:52 am"); + expect(text).toBe("7 Nov 2025, 12:41:52 am"); }); it("format date from unix timestamp string", () => { const value = "1762476112"; const text = formatDateTime(value); - expect(text).toBe("Friday, 07/11/2025, 12:41:52 am"); + expect(text).toBe("7 Nov 2025, 12:41:52 am"); }); it("catch bad format from string", () => { diff --git a/frontend/src/locale/Utils.ts b/frontend/src/locale/Utils.ts index 018efd0b..d4224277 100644 --- a/frontend/src/locale/Utils.ts +++ b/frontend/src/locale/Utils.ts @@ -1,4 +1,9 @@ -import { fromUnixTime, intlFormat, parseISO } from "date-fns"; +import { + fromUnixTime, + type IntlFormatFormatOptions, + intlFormat, + parseISO, +} from "date-fns"; const isUnixTimestamp = (value: unknown): boolean => { if (typeof value !== "number" && typeof value !== "string") return false; @@ -20,20 +25,19 @@ const parseDate = (value: string | number): Date | null => { } }; -const formatDateTime = (value: string | number): string => { +const formatDateTime = (value: string | number, locale = "en-US"): string => { const d = parseDate(value); if (!d) return `${value}`; try { - return intlFormat(d, { - weekday: "long", - year: "numeric", - month: "numeric", - day: "numeric", - hour: "numeric", - minute: "numeric", - second: "numeric", - hour12: true, - }); + return intlFormat( + d, + { + dateStyle: "medium", + timeStyle: "medium", + hourCycle: "h12", + } as IntlFormatFormatOptions, + { locale }, + ); } catch { return `${value}`; } From 58c63096e449c75b4578ea86b1152b0c327dd082 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Tue, 13 Jan 2026 22:55:19 +1000 Subject: [PATCH 49/55] Skip color output for vitest in ci --- scripts/ci/frontend-build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci/frontend-build b/scripts/ci/frontend-build index eeae34cd..8b66a13f 100755 --- a/scripts/ci/frontend-build +++ b/scripts/ci/frontend-build @@ -16,7 +16,7 @@ if hash docker 2>/dev/null; then -e NODE_OPTIONS=--openssl-legacy-provider \ -v "$(pwd)/frontend:/app/frontend" \ -w /app/frontend "${DOCKER_IMAGE}" \ - sh -c "yarn install && yarn lint && yarn locale-compile && yarn vitest run && yarn build && chown -R $(id -u):$(id -g) /app/frontend" + sh -c "yarn install && yarn lint && yarn locale-compile && yarn vitest run --no-color && yarn build && chown -R $(id -u):$(id -g) /app/frontend" echo -e "${BLUE}❯ ${GREEN}Building Frontend Complete${RESET}" else From 4ce5da593076be82529a0a5d07882eada669c1ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jan 2026 13:26:06 +0000 Subject: [PATCH 50/55] Bump express from 4.21.2 to 4.22.0 in /backend Bumps [express](https://github.com/expressjs/express) from 4.21.2 to 4.22.0. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/4.22.0/History.md) - [Commits](https://github.com/expressjs/express/compare/4.21.2...4.22.0) --- updated-dependencies: - dependency-name: express dependency-version: 4.22.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- backend/package.json | 2 +- backend/yarn.lock | 224 ++++++++++++++++++++----------------------- 2 files changed, 107 insertions(+), 119 deletions(-) diff --git a/backend/package.json b/backend/package.json index 5a43db8d..ed143c68 100644 --- a/backend/package.json +++ b/backend/package.json @@ -19,7 +19,7 @@ "bcrypt": "^5.0.0", "body-parser": "^1.20.3", "compression": "^1.7.4", - "express": "^4.20.0", + "express": "^4.22.0", "express-fileupload": "^1.5.2", "gravatar": "^1.8.2", "jsonwebtoken": "^9.0.2", diff --git a/backend/yarn.lock b/backend/yarn.lock index 859f715b..c8ad524e 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -427,23 +427,23 @@ blueimp-md5@^2.16.0: resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== -body-parser@1.20.3, body-parser@^1.20.3: - version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== +body-parser@^1.20.3, body-parser@~1.20.3: + version "1.20.4" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.4.tgz#f8e20f4d06ca8a50a71ed329c15dccad1cdc547f" + integrity sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA== dependencies: - bytes "3.1.2" + bytes "~3.1.2" content-type "~1.0.5" debug "2.6.9" depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" + destroy "~1.2.0" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + on-finished "~2.4.1" + qs "~6.14.0" + raw-body "~2.5.3" type-is "~1.6.18" - unpipe "1.0.0" + unpipe "~1.0.0" brace-expansion@^1.1.7: version "1.1.12" @@ -492,7 +492,7 @@ busboy@^1.6.0: dependencies: streamsearch "^1.1.0" -bytes@3.1.2: +bytes@3.1.2, bytes@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== @@ -687,7 +687,7 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -content-disposition@0.5.4: +content-disposition@~0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== @@ -699,15 +699,15 @@ content-type@~1.0.4, content-type@~1.0.5: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== +cookie-signature@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" + integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== -cookie@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" - integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== +cookie@~0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== core-util-is@~1.0.0: version "1.0.3" @@ -744,10 +744,10 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.3.3: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== +debug@4, debug@^4.3.3, debug@^4.3.4: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" @@ -765,13 +765,6 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.3.4: - version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -808,12 +801,12 @@ denque@^2.1.0: resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== -depd@2.0.0: +depd@2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -destroy@1.2.0: +destroy@1.2.0, destroy@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== @@ -854,11 +847,6 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - encodeurl@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" @@ -975,39 +963,39 @@ express-fileupload@^1.5.2: dependencies: busboy "^1.6.0" -express@^4.20.0: - version "4.21.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" - integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== +express@^4.22.0: + version "4.22.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.22.0.tgz#a9d7abdce6d774ed1b4479019387763d1798bd03" + integrity sha512-c2iPh3xp5vvCLgaHK03+mWLFPhox7j1LwyxcZwFVApEv5i0X+IjPpbT50SJJwwLpdBVfp45AkK/v+AFgv/XlfQ== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" + body-parser "~1.20.3" + content-disposition "~0.5.4" content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" + cookie "~0.7.1" + cookie-signature "~1.0.6" debug "2.6.9" depd "2.0.0" encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" + finalhandler "~1.3.1" + fresh "~0.5.2" + http-errors "~2.0.0" merge-descriptors "1.0.3" methods "~1.1.2" - on-finished "2.4.1" + on-finished "~2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.12" + path-to-regexp "~0.1.12" proxy-addr "~2.0.7" - qs "6.13.0" + qs "~6.14.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" + send "~0.19.0" + serve-static "~1.16.2" setprototypeof "1.2.0" - statuses "2.0.1" + statuses "~2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -1041,17 +1029,17 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== +finalhandler@~1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" + integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== dependencies: debug "2.6.9" encodeurl "~2.0.0" escape-html "~1.0.3" - on-finished "2.4.1" + on-finished "~2.4.1" parseurl "~1.3.3" - statuses "2.0.1" + statuses "~2.0.2" unpipe "~1.0.0" find-up@^2.0.0: @@ -1074,7 +1062,7 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fresh@0.5.2: +fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== @@ -1266,16 +1254,16 @@ http-cache-semantics@^4.1.0: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5" integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== +http-errors@~2.0.0, http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" http-proxy-agent@^4.0.1: version "4.0.1" @@ -1317,13 +1305,6 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" @@ -1338,6 +1319,13 @@ iconv-lite@^0.7.0: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +iconv-lite@~0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -1371,7 +1359,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1997,7 +1985,7 @@ objection@3.0.1: ajv "^8.6.2" db-errors "^0.2.3" -on-finished@2.4.1: +on-finished@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -2125,7 +2113,7 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.12: +path-to-regexp@~0.1.12: version "0.1.12" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== @@ -2320,12 +2308,12 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -qs@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== +qs@~6.14.0: + version "6.14.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.1.tgz#a41d85b9d3902f31d27861790506294881871159" + integrity sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ== dependencies: - side-channel "^1.0.6" + side-channel "^1.1.0" querystring@0.2.0: version "0.2.0" @@ -2337,15 +2325,15 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== +raw-body@~2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" + integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + unpipe "~1.0.0" rc@^1.2.7: version "1.2.8" @@ -2476,46 +2464,46 @@ semver@~7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -send@0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== +send@~0.19.0, send@~0.19.1: + version "0.19.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" + integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== dependencies: debug "2.6.9" depd "2.0.0" destroy "1.2.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" + fresh "~0.5.2" + http-errors "~2.0.1" mime "1.6.0" ms "2.1.3" - on-finished "2.4.1" + on-finished "~2.4.1" range-parser "~1.2.1" - statuses "2.0.1" + statuses "~2.0.2" seq-queue@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" integrity sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q== -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== +serve-static@~1.16.2: + version "1.16.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" + integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== dependencies: encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.19.0" + send "~0.19.1" set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -setprototypeof@1.2.0: +setprototypeof@1.2.0, setprototypeof@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== @@ -2549,7 +2537,7 @@ side-channel-weakmap@^1.0.2: object-inspect "^1.13.3" side-channel-map "^1.0.1" -side-channel@^1.0.6: +side-channel@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== @@ -2660,10 +2648,10 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +statuses@~2.0.1, statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== streamsearch@^1.1.0: version "1.1.0" @@ -2800,7 +2788,7 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -toidentifier@1.0.1: +toidentifier@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== @@ -2854,7 +2842,7 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== From 2a3978ae3feecc22198316bb76f4aadfdeceb2ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jan 2026 13:28:52 +0000 Subject: [PATCH 51/55] Bump mdast-util-to-hast from 13.2.0 to 13.2.1 in /docs Bumps [mdast-util-to-hast](https://github.com/syntax-tree/mdast-util-to-hast) from 13.2.0 to 13.2.1. - [Release notes](https://github.com/syntax-tree/mdast-util-to-hast/releases) - [Commits](https://github.com/syntax-tree/mdast-util-to-hast/compare/13.2.0...13.2.1) --- updated-dependencies: - dependency-name: mdast-util-to-hast dependency-version: 13.2.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/yarn.lock | 946 ++++++++++++++++++++++++++----------------------- 1 file changed, 502 insertions(+), 444 deletions(-) diff --git a/docs/yarn.lock b/docs/yarn.lock index 985626b6..823a55c6 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -2,202 +2,206 @@ # yarn lockfile v1 -"@algolia/autocomplete-core@1.9.3": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" - integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== +"@algolia/abtesting@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@algolia/abtesting/-/abtesting-1.12.2.tgz#1cba5e3c654d02c6d435822a0a0070a5c435daa6" + integrity sha512-oWknd6wpfNrmRcH0vzed3UPX0i17o4kYLM5OMITyMVM2xLgaRbIafoxL0e8mcrNNb0iORCJA0evnNDKRYth5WQ== dependencies: - "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" - "@algolia/autocomplete-shared" "1.9.3" + "@algolia/client-common" "5.46.2" + "@algolia/requester-browser-xhr" "5.46.2" + "@algolia/requester-fetch" "5.46.2" + "@algolia/requester-node-http" "5.46.2" -"@algolia/autocomplete-plugin-algolia-insights@1.9.3": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587" - integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== +"@algolia/autocomplete-core@1.17.7": + version "1.17.7" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz#2c410baa94a47c5c5f56ed712bb4a00ebe24088b" + integrity sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q== dependencies: - "@algolia/autocomplete-shared" "1.9.3" + "@algolia/autocomplete-plugin-algolia-insights" "1.17.7" + "@algolia/autocomplete-shared" "1.17.7" -"@algolia/autocomplete-preset-algolia@1.9.3": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da" - integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== +"@algolia/autocomplete-plugin-algolia-insights@1.17.7": + version "1.17.7" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz#7d2b105f84e7dd8f0370aa4c4ab3b704e6760d82" + integrity sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A== dependencies: - "@algolia/autocomplete-shared" "1.9.3" + "@algolia/autocomplete-shared" "1.17.7" -"@algolia/autocomplete-shared@1.9.3": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" - integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== - -"@algolia/cache-browser-local-storage@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.3.tgz#0cc26b96085e1115dac5fcb9d826651ba57faabc" - integrity sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg== +"@algolia/autocomplete-preset-algolia@1.17.7": + version "1.17.7" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz#c9badc0d73d62db5bf565d839d94ec0034680ae9" + integrity sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA== dependencies: - "@algolia/cache-common" "4.23.3" + "@algolia/autocomplete-shared" "1.17.7" -"@algolia/cache-common@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.23.3.tgz#3bec79092d512a96c9bfbdeec7cff4ad36367166" - integrity sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A== +"@algolia/autocomplete-shared@1.17.7": + version "1.17.7" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz#105e84ad9d1a31d3fb86ba20dc890eefe1a313a0" + integrity sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg== -"@algolia/cache-in-memory@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.23.3.tgz#3945f87cd21ffa2bec23890c85305b6b11192423" - integrity sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg== +"@algolia/client-abtesting@5.46.2": + version "5.46.2" + resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.46.2.tgz#264a72f0e9d2fe0d0dc5c3d2d16bbb9cfe2ce9e8" + integrity sha512-oRSUHbylGIuxrlzdPA8FPJuwrLLRavOhAmFGgdAvMcX47XsyM+IOGa9tc7/K5SPvBqn4nhppOCEz7BrzOPWc4A== dependencies: - "@algolia/cache-common" "4.23.3" + "@algolia/client-common" "5.46.2" + "@algolia/requester-browser-xhr" "5.46.2" + "@algolia/requester-fetch" "5.46.2" + "@algolia/requester-node-http" "5.46.2" -"@algolia/client-account@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.23.3.tgz#8751bbf636e6741c95e7c778488dee3ee430ac6f" - integrity sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA== +"@algolia/client-analytics@5.46.2": + version "5.46.2" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.46.2.tgz#3f00a237508aa0c46c9c02dea9c855e0a78e241f" + integrity sha512-EPBN2Oruw0maWOF4OgGPfioTvd+gmiNwx0HmD9IgmlS+l75DatcBkKOPNJN+0z3wBQWUO5oq602ATxIfmTQ8bA== dependencies: - "@algolia/client-common" "4.23.3" - "@algolia/client-search" "4.23.3" - "@algolia/transporter" "4.23.3" + "@algolia/client-common" "5.46.2" + "@algolia/requester-browser-xhr" "5.46.2" + "@algolia/requester-fetch" "5.46.2" + "@algolia/requester-node-http" "5.46.2" -"@algolia/client-analytics@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.23.3.tgz#f88710885278fe6fb6964384af59004a5a6f161d" - integrity sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA== +"@algolia/client-common@5.46.2": + version "5.46.2" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.46.2.tgz#7f282fd8f721b0d96958445df2170f4c7dce6aac" + integrity sha512-Hj8gswSJNKZ0oyd0wWissqyasm+wTz1oIsv5ZmLarzOZAp3vFEda8bpDQ8PUhO+DfkbiLyVnAxsPe4cGzWtqkg== + +"@algolia/client-insights@5.46.2": + version "5.46.2" + resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.46.2.tgz#194b7b529ee8a4ffd5d70037745082996c3b9aa0" + integrity sha512-6dBZko2jt8FmQcHCbmNLB0kCV079Mx/DJcySTL3wirgDBUH7xhY1pOuUTLMiGkqM5D8moVZTvTdRKZUJRkrwBA== dependencies: - "@algolia/client-common" "4.23.3" - "@algolia/client-search" "4.23.3" - "@algolia/requester-common" "4.23.3" - "@algolia/transporter" "4.23.3" + "@algolia/client-common" "5.46.2" + "@algolia/requester-browser-xhr" "5.46.2" + "@algolia/requester-fetch" "5.46.2" + "@algolia/requester-node-http" "5.46.2" -"@algolia/client-common@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.23.3.tgz#891116aa0db75055a7ecc107649f7f0965774704" - integrity sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw== +"@algolia/client-personalization@5.46.2": + version "5.46.2" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.46.2.tgz#d604da7f0a3df1b3e2a9fe338d368e48fb781f8e" + integrity sha512-1waE2Uqh/PHNeDXGn/PM/WrmYOBiUGSVxAWqiJIj73jqPqvfzZgzdakHscIVaDl6Cp+j5dwjsZ5LCgaUr6DtmA== dependencies: - "@algolia/requester-common" "4.23.3" - "@algolia/transporter" "4.23.3" + "@algolia/client-common" "5.46.2" + "@algolia/requester-browser-xhr" "5.46.2" + "@algolia/requester-fetch" "5.46.2" + "@algolia/requester-node-http" "5.46.2" -"@algolia/client-personalization@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.23.3.tgz#35fa8e5699b0295fbc400a8eb211dc711e5909db" - integrity sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g== +"@algolia/client-query-suggestions@5.46.2": + version "5.46.2" + resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.46.2.tgz#f13bc5897bfbdc19509d430a26e9bbe2402e00c9" + integrity sha512-EgOzTZkyDcNL6DV0V/24+oBJ+hKo0wNgyrOX/mePBM9bc9huHxIY2352sXmoZ648JXXY2x//V1kropF/Spx83w== dependencies: - "@algolia/client-common" "4.23.3" - "@algolia/requester-common" "4.23.3" - "@algolia/transporter" "4.23.3" + "@algolia/client-common" "5.46.2" + "@algolia/requester-browser-xhr" "5.46.2" + "@algolia/requester-fetch" "5.46.2" + "@algolia/requester-node-http" "5.46.2" -"@algolia/client-search@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.23.3.tgz#a3486e6af13a231ec4ab43a915a1f318787b937f" - integrity sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw== +"@algolia/client-search@5.46.2": + version "5.46.2" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.46.2.tgz#771367916aaa3fb7a19d5944f8375504b0568ba6" + integrity sha512-ZsOJqu4HOG5BlvIFnMU0YKjQ9ZI6r3C31dg2jk5kMWPSdhJpYL9xa5hEe7aieE+707dXeMI4ej3diy6mXdZpgA== dependencies: - "@algolia/client-common" "4.23.3" - "@algolia/requester-common" "4.23.3" - "@algolia/transporter" "4.23.3" + "@algolia/client-common" "5.46.2" + "@algolia/requester-browser-xhr" "5.46.2" + "@algolia/requester-fetch" "5.46.2" + "@algolia/requester-node-http" "5.46.2" -"@algolia/logger-common@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.23.3.tgz#35c6d833cbf41e853a4f36ba37c6e5864920bfe9" - integrity sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g== - -"@algolia/logger-console@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.23.3.tgz#30f916781826c4db5f51fcd9a8a264a06e136985" - integrity sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A== +"@algolia/ingestion@1.46.2": + version "1.46.2" + resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.46.2.tgz#2a5d8a592d9f864dfb438722506382af56f8554f" + integrity sha512-1Uw2OslTWiOFDtt83y0bGiErJYy5MizadV0nHnOoHFWMoDqWW0kQoMFI65pXqRSkVvit5zjXSLik2xMiyQJDWQ== dependencies: - "@algolia/logger-common" "4.23.3" + "@algolia/client-common" "5.46.2" + "@algolia/requester-browser-xhr" "5.46.2" + "@algolia/requester-fetch" "5.46.2" + "@algolia/requester-node-http" "5.46.2" -"@algolia/recommend@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-4.23.3.tgz#53d4f194d22d9c72dc05f3f7514c5878f87c5890" - integrity sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w== +"@algolia/monitoring@1.46.2": + version "1.46.2" + resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.46.2.tgz#bd199368a49cb799cf12cfe76c49de6dd3021148" + integrity sha512-xk9f+DPtNcddWN6E7n1hyNNsATBCHIqAvVGG2EAGHJc4AFYL18uM/kMTiOKXE/LKDPyy1JhIerrh9oYb7RBrgw== dependencies: - "@algolia/cache-browser-local-storage" "4.23.3" - "@algolia/cache-common" "4.23.3" - "@algolia/cache-in-memory" "4.23.3" - "@algolia/client-common" "4.23.3" - "@algolia/client-search" "4.23.3" - "@algolia/logger-common" "4.23.3" - "@algolia/logger-console" "4.23.3" - "@algolia/requester-browser-xhr" "4.23.3" - "@algolia/requester-common" "4.23.3" - "@algolia/requester-node-http" "4.23.3" - "@algolia/transporter" "4.23.3" + "@algolia/client-common" "5.46.2" + "@algolia/requester-browser-xhr" "5.46.2" + "@algolia/requester-fetch" "5.46.2" + "@algolia/requester-node-http" "5.46.2" -"@algolia/requester-browser-xhr@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.3.tgz#9e47e76f60d540acc8b27b4ebc7a80d1b41938b9" - integrity sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw== +"@algolia/recommend@5.46.2": + version "5.46.2" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.46.2.tgz#e74bade1254046ed9be8ccd37f2a116ab9799508" + integrity sha512-NApbTPj9LxGzNw4dYnZmj2BoXiAc8NmbbH6qBNzQgXklGklt/xldTvu+FACN6ltFsTzoNU6j2mWNlHQTKGC5+Q== dependencies: - "@algolia/requester-common" "4.23.3" + "@algolia/client-common" "5.46.2" + "@algolia/requester-browser-xhr" "5.46.2" + "@algolia/requester-fetch" "5.46.2" + "@algolia/requester-node-http" "5.46.2" -"@algolia/requester-common@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.23.3.tgz#7dbae896e41adfaaf1d1fa5f317f83a99afb04b3" - integrity sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw== - -"@algolia/requester-node-http@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.23.3.tgz#c9f94a5cb96a15f48cea338ab6ef16bbd0ff989f" - integrity sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA== +"@algolia/requester-browser-xhr@5.46.2": + version "5.46.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.46.2.tgz#7662480143405e815e1eed99136b4b2acd838ee7" + integrity sha512-ekotpCwpSp033DIIrsTpYlGUCF6momkgupRV/FA3m62SreTSZUKjgK6VTNyG7TtYfq9YFm/pnh65bATP/ZWJEg== dependencies: - "@algolia/requester-common" "4.23.3" + "@algolia/client-common" "5.46.2" -"@algolia/transporter@4.23.3": - version "4.23.3" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.23.3.tgz#545b045b67db3850ddf0bbecbc6c84ff1f3398b7" - integrity sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ== +"@algolia/requester-fetch@5.46.2": + version "5.46.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.46.2.tgz#dee07f0131b75f30d083bafd6fb878afe7402eb9" + integrity sha512-gKE+ZFi/6y7saTr34wS0SqYFDcjHW4Wminv8PDZEi0/mE99+hSrbKgJWxo2ztb5eqGirQTgIh1AMVacGGWM1iw== dependencies: - "@algolia/cache-common" "4.23.3" - "@algolia/logger-common" "4.23.3" - "@algolia/requester-common" "4.23.3" + "@algolia/client-common" "5.46.2" -"@babel/helper-string-parser@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54" - integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g== - -"@babel/helper-validator-identifier@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5" - integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== - -"@babel/parser@^7.25.3": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.8.tgz#f6aaf38e80c36129460c1657c0762db584c9d5e2" - integrity sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ== +"@algolia/requester-node-http@5.46.2": + version "5.46.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.46.2.tgz#7869d67cb2926bbdbfbfed2b4757e547c2e227eb" + integrity sha512-ciPihkletp7ttweJ8Zt+GukSVLp2ANJHU+9ttiSxsJZThXc4Y2yJ8HGVWesW5jN1zrsZsezN71KrMx/iZsOYpg== dependencies: - "@babel/types" "^7.25.8" + "@algolia/client-common" "5.46.2" -"@babel/types@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.8.tgz#5cf6037258e8a9bcad533f4979025140cb9993e1" - integrity sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg== +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + +"@babel/parser@^7.28.5": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.6.tgz#f01a8885b7fa1e56dd8a155130226cd698ef13fd" + integrity sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ== dependencies: - "@babel/helper-string-parser" "^7.25.7" - "@babel/helper-validator-identifier" "^7.25.7" - to-fast-properties "^2.0.0" + "@babel/types" "^7.28.6" -"@docsearch/css@3.6.2", "@docsearch/css@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.6.2.tgz#ccd9c83dbfeaf34efe4e3547ee596714ae7e5891" - integrity sha512-vKNZepO2j7MrYBTZIGXvlUOIR+v9KRf70FApRgovWrj3GTs1EITz/Xb0AOlm1xsQBp16clVZj1SY/qaOJbQtZw== - -"@docsearch/js@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@docsearch/js/-/js-3.6.2.tgz#000d7d255e8387e7c5b82c7b87d3060398e1605d" - integrity sha512-pS4YZF+VzUogYrkblCucQ0Oy2m8Wggk8Kk7lECmZM60hTbaydSIhJTTiCrmoxtBqV8wxORnOqcqqOfbmkkQEcA== +"@babel/types@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.6.tgz#c3e9377f1b155005bcc4c46020e7e394e13089df" + integrity sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg== dependencies: - "@docsearch/react" "3.6.2" + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + +"@docsearch/css@3.8.2": + version "3.8.2" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.8.2.tgz#7973ceb6892c30f154ba254cd05c562257a44977" + integrity sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ== + +"@docsearch/js@3.8.2": + version "3.8.2" + resolved "https://registry.yarnpkg.com/@docsearch/js/-/js-3.8.2.tgz#bdcfc9837700eb38453b88e211ab5cc5a3813cc6" + integrity sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ== + dependencies: + "@docsearch/react" "3.8.2" preact "^10.0.0" -"@docsearch/react@3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.6.2.tgz#32b16dd7d5614f0d39e6bc018549816b68d171b8" - integrity sha512-rtZce46OOkVflCQH71IdbXSFK+S8iJZlUF56XBW5rIgx/eG5qoomC7Ag3anZson1bBac/JFQn7XOBfved/IMRA== +"@docsearch/react@3.8.2": + version "3.8.2" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.8.2.tgz#7b11d39b61c976c0aa9fbde66e6b73b30f3acd42" + integrity sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg== dependencies: - "@algolia/autocomplete-core" "1.9.3" - "@algolia/autocomplete-preset-algolia" "1.9.3" - "@docsearch/css" "3.6.2" - algoliasearch "^4.19.1" + "@algolia/autocomplete-core" "1.17.7" + "@algolia/autocomplete-preset-algolia" "1.17.7" + "@docsearch/css" "3.8.2" + algoliasearch "^5.14.2" "@esbuild/aix-ppc64@0.21.5": version "0.21.5" @@ -314,10 +318,22 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== -"@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== +"@iconify-json/simple-icons@^1.2.21": + version "1.2.66" + resolved "https://registry.yarnpkg.com/@iconify-json/simple-icons/-/simple-icons-1.2.66.tgz#d0576ca65f69616b49491129e17132316cf3f309" + integrity sha512-D1OnnXwiQXFkVMw5M+Bt8mPsXeMkQyGmMdrmN7lsQlKMUkfLOp6JWhnUJ92po51WXT046aF/zzqSmkKqg08p4Q== + dependencies: + "@iconify/types" "*" + +"@iconify/types@*": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" + integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== + +"@jridgewell/sourcemap-codec@^1.5.5": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@rollup/rollup-android-arm-eabi@4.24.0": version "4.24.0" @@ -399,54 +415,69 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz#0574d7e87b44ee8511d08cc7f914bcb802b70818" integrity sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw== -"@shikijs/core@1.22.0", "@shikijs/core@^1.22.0": - version "1.22.0" - resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.22.0.tgz#74e5d4485e5f7afa85109e322b42e400686f92bb" - integrity sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q== +"@shikijs/core@2.5.0", "@shikijs/core@^2.1.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-2.5.0.tgz#e14d33961dfa3141393d4a76fc8923d0d1c4b62f" + integrity sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg== dependencies: - "@shikijs/engine-javascript" "1.22.0" - "@shikijs/engine-oniguruma" "1.22.0" - "@shikijs/types" "1.22.0" - "@shikijs/vscode-textmate" "^9.3.0" + "@shikijs/engine-javascript" "2.5.0" + "@shikijs/engine-oniguruma" "2.5.0" + "@shikijs/types" "2.5.0" + "@shikijs/vscode-textmate" "^10.0.2" "@types/hast" "^3.0.4" - hast-util-to-html "^9.0.3" + hast-util-to-html "^9.0.4" -"@shikijs/engine-javascript@1.22.0": - version "1.22.0" - resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.22.0.tgz#2e5db29f0421755492f5279f8224ef7a7f907a29" - integrity sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw== +"@shikijs/engine-javascript@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz#e045c6ecfbda6c99137547b0a482e0b87f1053fc" + integrity sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w== dependencies: - "@shikijs/types" "1.22.0" - "@shikijs/vscode-textmate" "^9.3.0" - oniguruma-to-js "0.4.3" + "@shikijs/types" "2.5.0" + "@shikijs/vscode-textmate" "^10.0.2" + oniguruma-to-es "^3.1.0" -"@shikijs/engine-oniguruma@1.22.0": - version "1.22.0" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.0.tgz#74c661fac4cd1f08f2c09b5d6e2fd2a6720d0401" - integrity sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw== +"@shikijs/engine-oniguruma@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz#230de5693cc1da6c9d59c7ad83593c2027274817" + integrity sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw== dependencies: - "@shikijs/types" "1.22.0" - "@shikijs/vscode-textmate" "^9.3.0" + "@shikijs/types" "2.5.0" + "@shikijs/vscode-textmate" "^10.0.2" -"@shikijs/transformers@^1.22.0": - version "1.22.0" - resolved "https://registry.yarnpkg.com/@shikijs/transformers/-/transformers-1.22.0.tgz#f36fa4d769e36db9a91e09877cf48b3a04d26aba" - integrity sha512-k7iMOYuGQA62KwAuJOQBgH2IQb5vP8uiB3lMvAMGUgAMMurePOx3Z7oNqJdcpxqZP6I9cc7nc4DNqSKduCxmdg== +"@shikijs/langs@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-2.5.0.tgz#97ab50c495922cc1ca06e192985b28dc73de5d50" + integrity sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w== dependencies: - shiki "1.22.0" + "@shikijs/types" "2.5.0" -"@shikijs/types@1.22.0", "@shikijs/types@^1.22.0": - version "1.22.0" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.22.0.tgz#d2a572381395c9308b472c8199b8e0289753b9ad" - integrity sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww== +"@shikijs/themes@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-2.5.0.tgz#8c6aecf73f5455681c8bec15797cf678162896cb" + integrity sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw== dependencies: - "@shikijs/vscode-textmate" "^9.3.0" + "@shikijs/types" "2.5.0" + +"@shikijs/transformers@^2.1.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@shikijs/transformers/-/transformers-2.5.0.tgz#190c84786ff06c417580ab79177338a947168c55" + integrity sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg== + dependencies: + "@shikijs/core" "2.5.0" + "@shikijs/types" "2.5.0" + +"@shikijs/types@2.5.0", "@shikijs/types@^2.1.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-2.5.0.tgz#e949c7384802703a48b9d6425dd41673c164df69" + integrity sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw== + dependencies: + "@shikijs/vscode-textmate" "^10.0.2" "@types/hast" "^3.0.4" -"@shikijs/vscode-textmate@^9.3.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz#b2f1776e488c1d6c2b6cd129bab62f71bbc9c7ab" - integrity sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA== +"@shikijs/vscode-textmate@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" + integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== "@types/estree@1.0.6": version "1.0.6" @@ -490,184 +521,183 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== -"@types/web-bluetooth@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597" - integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow== +"@types/web-bluetooth@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz#525433c784aed9b457aaa0ee3d92aeb71f346b63" + integrity sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA== "@ungap/structured-clone@^1.0.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@vitejs/plugin-vue@^5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz#72b8b705cfce36b00b59af196195146e356500c4" - integrity sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A== +"@vitejs/plugin-vue@^5.2.1": + version "5.2.4" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz#9e8a512eb174bfc2a333ba959bbf9de428d89ad8" + integrity sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA== -"@vue/compiler-core@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.11.tgz#3dcd0c1bab10732f44ab1790735afb03a4b69edc" - integrity sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg== +"@vue/compiler-core@3.5.26": + version "3.5.26" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.26.tgz#1a91ea90980528bedff7b1c292690bfb30612485" + integrity sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w== dependencies: - "@babel/parser" "^7.25.3" - "@vue/shared" "3.5.11" - entities "^4.5.0" + "@babel/parser" "^7.28.5" + "@vue/shared" "3.5.26" + entities "^7.0.0" estree-walker "^2.0.2" - source-map-js "^1.2.0" + source-map-js "^1.2.1" -"@vue/compiler-dom@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.11.tgz#950f8fc610e26326fed008b8d102cc8ee78a6ce5" - integrity sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew== +"@vue/compiler-dom@3.5.26": + version "3.5.26" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.26.tgz#66c36b6ed8bdf43236d7188ea332bc9d078eb286" + integrity sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A== dependencies: - "@vue/compiler-core" "3.5.11" - "@vue/shared" "3.5.11" + "@vue/compiler-core" "3.5.26" + "@vue/shared" "3.5.26" -"@vue/compiler-sfc@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.11.tgz#68ba7bc6fed4fec6892aed118cb3ee8e4b180d06" - integrity sha512-gsbBtT4N9ANXXepprle+X9YLg2htQk1sqH/qGJ/EApl+dgpUBdTv3yP7YlR535uHZY3n6XaR0/bKo0BgwwDniw== +"@vue/compiler-sfc@3.5.26": + version "3.5.26" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.26.tgz#fb1c6c4bf9a9e22bb169e039e19437cb6995917a" + integrity sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA== dependencies: - "@babel/parser" "^7.25.3" - "@vue/compiler-core" "3.5.11" - "@vue/compiler-dom" "3.5.11" - "@vue/compiler-ssr" "3.5.11" - "@vue/shared" "3.5.11" + "@babel/parser" "^7.28.5" + "@vue/compiler-core" "3.5.26" + "@vue/compiler-dom" "3.5.26" + "@vue/compiler-ssr" "3.5.26" + "@vue/shared" "3.5.26" estree-walker "^2.0.2" - magic-string "^0.30.11" - postcss "^8.4.47" - source-map-js "^1.2.0" + magic-string "^0.30.21" + postcss "^8.5.6" + source-map-js "^1.2.1" -"@vue/compiler-ssr@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.11.tgz#02d9891c7a649bbf06490ecd8d24dd1575d53e60" - integrity sha512-P4+GPjOuC2aFTk1Z4WANvEhyOykcvEd5bIj2KVNGKGfM745LaXGr++5njpdBTzVz5pZifdlR1kpYSJJpIlSePA== +"@vue/compiler-ssr@3.5.26": + version "3.5.26" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.26.tgz#f6e94bccbb5339180779036ddfb614f998a197ea" + integrity sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw== dependencies: - "@vue/compiler-dom" "3.5.11" - "@vue/shared" "3.5.11" + "@vue/compiler-dom" "3.5.26" + "@vue/shared" "3.5.26" -"@vue/devtools-api@^7.4.6": - version "7.4.6" - resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-7.4.6.tgz#5e9249d6de3cee58624e511fdc727837b1f2d273" - integrity sha512-XipBV5k0/IfTr0sNBDTg7OBUCp51cYMMXyPxLXJZ4K/wmUeMqt8cVdr2ZZGOFq+si/jTyCYnNxeKoyev5DOUUA== +"@vue/devtools-api@^7.7.0": + version "7.7.9" + resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-7.7.9.tgz#999dbea50da6b00cf59a1336f11fdc2b43d9e063" + integrity sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g== dependencies: - "@vue/devtools-kit" "^7.4.6" + "@vue/devtools-kit" "^7.7.9" -"@vue/devtools-kit@^7.4.6": - version "7.4.6" - resolved "https://registry.yarnpkg.com/@vue/devtools-kit/-/devtools-kit-7.4.6.tgz#80aa30db65bf5b2b0eda4e818749d3c37d80f709" - integrity sha512-NbYBwPWgEic1AOd9bWExz9weBzFdjiIfov0yRn4DrRfR+EQJCI9dn4I0XS7IxYGdkmUJi8mFW42LLk18WsGqew== +"@vue/devtools-kit@^7.7.9": + version "7.7.9" + resolved "https://registry.yarnpkg.com/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz#bc218a815616e8987df7ab3e10fc1fb3b8706c58" + integrity sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA== dependencies: - "@vue/devtools-shared" "^7.4.6" - birpc "^0.2.17" + "@vue/devtools-shared" "^7.7.9" + birpc "^2.3.0" hookable "^5.5.3" mitt "^3.0.1" perfect-debounce "^1.0.0" speakingurl "^14.0.1" - superjson "^2.2.1" + superjson "^2.2.2" -"@vue/devtools-shared@^7.4.6": - version "7.4.6" - resolved "https://registry.yarnpkg.com/@vue/devtools-shared/-/devtools-shared-7.4.6.tgz#492c2301caacc83a32542dd95dfcae3980621417" - integrity sha512-rPeSBzElnHYMB05Cc056BQiJpgocQjY8XVulgni+O9a9Gr9tNXgPteSzFFD+fT/iWMxNuUgGKs9CuW5DZewfIg== +"@vue/devtools-shared@^7.7.9": + version "7.7.9" + resolved "https://registry.yarnpkg.com/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz#fa4c096b744927081a7dda5fcf05f34b1ae6ca14" + integrity sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA== dependencies: rfdc "^1.4.1" -"@vue/reactivity@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.11.tgz#d27df4fba10c2de1c7234701f18247a775b7a391" - integrity sha512-Nqo5VZEn8MJWlCce8XoyVqHZbd5P2NH+yuAaFzuNSR96I+y1cnuUiq7xfSG+kyvLSiWmaHTKP1r3OZY4mMD50w== +"@vue/reactivity@3.5.26": + version "3.5.26" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.26.tgz#59a1edf566dc80133c1c26c93711c877e8602c48" + integrity sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ== dependencies: - "@vue/shared" "3.5.11" + "@vue/shared" "3.5.26" -"@vue/runtime-core@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.11.tgz#7beccd013efe5d33981ffd6b6e05d0a5b9058316" - integrity sha512-7PsxFGqwfDhfhh0OcDWBG1DaIQIVOLgkwA5q6MtkPiDFjp5gohVnJEahSktwSFLq7R5PtxDKy6WKURVN1UDbzA== +"@vue/runtime-core@3.5.26": + version "3.5.26" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.26.tgz#3f2c040bcf8018c03a1ab5adb0d788c13c986f0e" + integrity sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q== dependencies: - "@vue/reactivity" "3.5.11" - "@vue/shared" "3.5.11" + "@vue/reactivity" "3.5.26" + "@vue/shared" "3.5.26" -"@vue/runtime-dom@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.11.tgz#14a3181ab7057de41b345b4b3d37b744b3ff8ff5" - integrity sha512-GNghjecT6IrGf0UhuYmpgaOlN7kxzQBhxWEn08c/SQDxv1yy4IXI1bn81JgEpQ4IXjRxWtPyI8x0/7TF5rPfYQ== +"@vue/runtime-dom@3.5.26": + version "3.5.26" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.26.tgz#5954848614883948ecc1f631a67b32cc32f81936" + integrity sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ== dependencies: - "@vue/reactivity" "3.5.11" - "@vue/runtime-core" "3.5.11" - "@vue/shared" "3.5.11" - csstype "^3.1.3" + "@vue/reactivity" "3.5.26" + "@vue/runtime-core" "3.5.26" + "@vue/shared" "3.5.26" + csstype "^3.2.3" -"@vue/server-renderer@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.11.tgz#74f558371dfc39f3b0f26f95d089a1a4d1676027" - integrity sha512-cVOwYBxR7Wb1B1FoxYvtjJD8X/9E5nlH4VSkJy2uMA1MzYNdzAAB//l8nrmN9py/4aP+3NjWukf9PZ3TeWULaA== +"@vue/server-renderer@3.5.26": + version "3.5.26" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.26.tgz#269055497fcc75b3984063f866f17c748b565ef4" + integrity sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA== dependencies: - "@vue/compiler-ssr" "3.5.11" - "@vue/shared" "3.5.11" + "@vue/compiler-ssr" "3.5.26" + "@vue/shared" "3.5.26" -"@vue/shared@3.5.11", "@vue/shared@^3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.11.tgz#464b840afc89be9373addff9eeb9dfc98bf3fe2e" - integrity sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ== +"@vue/shared@3.5.26", "@vue/shared@^3.5.13": + version "3.5.26" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.26.tgz#1e02ef2d64aced818cd31d81ce5175711dc90a9f" + integrity sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A== -"@vueuse/core@11.1.0", "@vueuse/core@^11.1.0": - version "11.1.0" - resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-11.1.0.tgz#a104f33c899a15f3b28d3eb7b20738501a3a5035" - integrity sha512-P6dk79QYA6sKQnghrUz/1tHi0n9mrb/iO1WTMk/ElLmTyNqgDeSZ3wcDf6fRBGzRJbeG1dxzEOvLENMjr+E3fg== +"@vueuse/core@12.8.2", "@vueuse/core@^12.4.0": + version "12.8.2" + resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-12.8.2.tgz#007c6dd29a7d1f6933e916e7a2f8ef3c3f968eaa" + integrity sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ== dependencies: - "@types/web-bluetooth" "^0.0.20" - "@vueuse/metadata" "11.1.0" - "@vueuse/shared" "11.1.0" - vue-demi ">=0.14.10" + "@types/web-bluetooth" "^0.0.21" + "@vueuse/metadata" "12.8.2" + "@vueuse/shared" "12.8.2" + vue "^3.5.13" -"@vueuse/integrations@^11.1.0": - version "11.1.0" - resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-11.1.0.tgz#1e2c1d43b2d389fc4b4d0a7ee08091665698b9ad" - integrity sha512-O2ZgrAGPy0qAjpoI2YR3egNgyEqwG85fxfwmA9BshRIGjV4G6yu6CfOPpMHAOoCD+UfsIl7Vb1bXJ6ifrHYDDA== +"@vueuse/integrations@^12.4.0": + version "12.8.2" + resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-12.8.2.tgz#d04f33d86fe985c9a27c98addcfde9f30f2db1df" + integrity sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g== dependencies: - "@vueuse/core" "11.1.0" - "@vueuse/shared" "11.1.0" - vue-demi ">=0.14.10" + "@vueuse/core" "12.8.2" + "@vueuse/shared" "12.8.2" + vue "^3.5.13" -"@vueuse/metadata@11.1.0": - version "11.1.0" - resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-11.1.0.tgz#ad367d2a51d985129724425923b3cf95f0faf27b" - integrity sha512-l9Q502TBTaPYGanl1G+hPgd3QX5s4CGnpXriVBR5fEZ/goI6fvDaVmIl3Td8oKFurOxTmbXvBPSsgrd6eu6HYg== +"@vueuse/metadata@12.8.2": + version "12.8.2" + resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-12.8.2.tgz#6cb3a4e97cdcf528329eebc1bda73cd7f64318d3" + integrity sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A== -"@vueuse/shared@11.1.0": - version "11.1.0" - resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-11.1.0.tgz#3bfc3aa555c2a456c21945ec7f127d71938d12e8" - integrity sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w== +"@vueuse/shared@12.8.2": + version "12.8.2" + resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-12.8.2.tgz#b9e4611d0603629c8e151f982459da394e22f930" + integrity sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w== dependencies: - vue-demi ">=0.14.10" + vue "^3.5.13" -algoliasearch@^4.19.1: - version "4.23.3" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.23.3.tgz#e09011d0a3b0651444916a3e6bbcba064ec44b60" - integrity sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg== +algoliasearch@^5.14.2: + version "5.46.2" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.46.2.tgz#3afba0e53f3293e39cfde9b2ef27c583d44bf2a5" + integrity sha512-qqAXW9QvKf2tTyhpDA4qXv1IfBwD2eduSW6tUEBFIfCeE9gn9HQ9I5+MaKoenRuHrzk5sQoNh1/iof8mY7uD6Q== dependencies: - "@algolia/cache-browser-local-storage" "4.23.3" - "@algolia/cache-common" "4.23.3" - "@algolia/cache-in-memory" "4.23.3" - "@algolia/client-account" "4.23.3" - "@algolia/client-analytics" "4.23.3" - "@algolia/client-common" "4.23.3" - "@algolia/client-personalization" "4.23.3" - "@algolia/client-search" "4.23.3" - "@algolia/logger-common" "4.23.3" - "@algolia/logger-console" "4.23.3" - "@algolia/recommend" "4.23.3" - "@algolia/requester-browser-xhr" "4.23.3" - "@algolia/requester-common" "4.23.3" - "@algolia/requester-node-http" "4.23.3" - "@algolia/transporter" "4.23.3" + "@algolia/abtesting" "1.12.2" + "@algolia/client-abtesting" "5.46.2" + "@algolia/client-analytics" "5.46.2" + "@algolia/client-common" "5.46.2" + "@algolia/client-insights" "5.46.2" + "@algolia/client-personalization" "5.46.2" + "@algolia/client-query-suggestions" "5.46.2" + "@algolia/client-search" "5.46.2" + "@algolia/ingestion" "1.46.2" + "@algolia/monitoring" "1.46.2" + "@algolia/recommend" "5.46.2" + "@algolia/requester-browser-xhr" "5.46.2" + "@algolia/requester-fetch" "5.46.2" + "@algolia/requester-node-http" "5.46.2" -birpc@^0.2.17: - version "0.2.19" - resolved "https://registry.yarnpkg.com/birpc/-/birpc-0.2.19.tgz#cdd183a4a70ba103127d49765b4a71349da5a0ca" - integrity sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ== +birpc@^2.3.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/birpc/-/birpc-2.9.0.tgz#b59550897e4cd96a223e2a6c1475b572236ed145" + integrity sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw== ccount@^2.0.0: version "2.0.1" @@ -689,17 +719,17 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -copy-anything@^3.0.2: - version "3.0.5" - resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-3.0.5.tgz#2d92dce8c498f790fa7ad16b01a1ae5a45b020a0" - integrity sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w== +copy-anything@^4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-4.0.5.tgz#16cabafd1ea4bb327a540b750f2b4df522825aea" + integrity sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA== dependencies: - is-what "^4.1.8" + is-what "^5.2.0" -csstype@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +csstype@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" + integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== dequal@^2.0.0: version "2.0.3" @@ -713,10 +743,15 @@ devlop@^1.0.0: dependencies: dequal "^2.0.0" -entities@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +emoji-regex-xs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz#e8af22e5d9dbd7f7f22d280af3d19d2aab5b0724" + integrity sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg== + +entities@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-7.0.0.tgz#2ae4e443f3f17d152d3f5b0f79b932c1e59deb7a" + integrity sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ== esbuild@^0.21.3: version "0.21.5" @@ -752,22 +787,22 @@ estree-walker@^2.0.2: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== -focus-trap@^7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.6.0.tgz#7f3edab8135eaca92ab59b6e963eb5cc42ded715" - integrity sha512-1td0l3pMkWJLFipobUcGaf+5DTY4PLDDrcqoSaKP8ediO/CoWCCYk/fT/Y2A4e6TNB+Sh6clRJCjOPPnKoNHnQ== +focus-trap@^7.6.4: + version "7.8.0" + resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.8.0.tgz#b1d9463fa42b93ad7a5223d750493a6c09b672a8" + integrity sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA== dependencies: - tabbable "^6.2.0" + tabbable "^6.4.0" fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -hast-util-to-html@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz#a9999a0ba6b4919576a9105129fead85d37f302b" - integrity sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg== +hast-util-to-html@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz#ccc673a55bb8e85775b08ac28380f72d47167005" + integrity sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw== dependencies: "@types/hast" "^3.0.0" "@types/unist" "^3.0.0" @@ -776,7 +811,7 @@ hast-util-to-html@^9.0.3: hast-util-whitespace "^3.0.0" html-void-elements "^3.0.0" mdast-util-to-hast "^13.0.0" - property-information "^6.0.0" + property-information "^7.0.0" space-separated-tokens "^2.0.0" stringify-entities "^4.0.0" zwitch "^2.0.4" @@ -798,17 +833,17 @@ html-void-elements@^3.0.0: resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== -is-what@^4.1.8: - version "4.1.16" - resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.16.tgz#1ad860a19da8b4895ad5495da3182ce2acdd7a6f" - integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A== +is-what@^5.2.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-5.5.0.tgz#a3031815757cfe1f03fed990bf6355a2d3f628c4" + integrity sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw== -magic-string@^0.30.11: - version "0.30.11" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" - integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== +magic-string@^0.30.21: + version "0.30.21" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" + integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/sourcemap-codec" "^1.5.5" mark.js@8.11.1: version "8.11.1" @@ -816,9 +851,9 @@ mark.js@8.11.1: integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== mdast-util-to-hast@^13.0.0: - version "13.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" - integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== + version "13.2.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz#d7ff84ca499a57e2c060ae67548ad950e689a053" + integrity sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA== dependencies: "@types/hast" "^3.0.0" "@types/mdast" "^4.0.0" @@ -862,27 +897,34 @@ micromark-util-types@^2.0.0: resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== -minisearch@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-7.1.0.tgz#f5830e9109b5919ee7b291c29a304f381aa68770" - integrity sha512-tv7c/uefWdEhcu6hvrfTihflgeEi2tN6VV7HJnCjK6VxM75QQJh4t9FwJCsA2EsRS8LCnu3W87CuGPWMocOLCA== +minisearch@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-7.2.0.tgz#3dc30e41e9464b3836553b6d969b656614f8f359" + integrity sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg== mitt@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + nanoid@^3.3.7: version "3.3.8" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== -oniguruma-to-js@0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz#8d899714c21f5c7d59a3c0008ca50e848086d740" - integrity sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ== +oniguruma-to-es@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz#480e4bac4d3bc9439ac0d2124f0725e7a0d76d17" + integrity sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ== dependencies: - regex "^4.3.2" + emoji-regex-xs "^1.0.0" + regex "^6.0.1" + regex-recursion "^6.0.2" perfect-debounce@^1.0.0: version "1.0.0" @@ -894,7 +936,12 @@ picocolors@^1.1.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== -postcss@^8.4.43, postcss@^8.4.47: +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +postcss@^8.4.43: version "8.4.47" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== @@ -903,20 +950,43 @@ postcss@^8.4.43, postcss@^8.4.47: picocolors "^1.1.0" source-map-js "^1.2.1" +postcss@^8.5.6: + version "8.5.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + preact@^10.0.0: version "10.21.0" resolved "https://registry.yarnpkg.com/preact/-/preact-10.21.0.tgz#5b0335c873a1724deb66e517830db4fd310c24f6" integrity sha512-aQAIxtzWEwH8ou+OovWVSVNlFImL7xUCwJX3YMqA3U8iKCNC34999fFOnWjYNsylgfPgMexpbk7WYOLtKr/mxg== -property-information@^6.0.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" - integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== +property-information@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.1.0.tgz#b622e8646e02b580205415586b40804d3e8bfd5d" + integrity sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ== -regex@^4.3.2: - version "4.3.3" - resolved "https://registry.yarnpkg.com/regex/-/regex-4.3.3.tgz#8cda73ccbdfa7c5691881d02f9bb142dba9daa6a" - integrity sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg== +regex-recursion@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/regex-recursion/-/regex-recursion-6.0.2.tgz#a0b1977a74c87f073377b938dbedfab2ea582b33" + integrity sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg== + dependencies: + regex-utilities "^2.3.0" + +regex-utilities@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/regex-utilities/-/regex-utilities-2.3.0.tgz#87163512a15dce2908cf079c8960d5158ff43280" + integrity sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng== + +regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/regex/-/regex-6.1.0.tgz#d7ce98f8ee32da7497c13f6601fca2bc4a6a7803" + integrity sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg== + dependencies: + regex-utilities "^2.3.0" rfdc@^1.4.1: version "1.4.1" @@ -948,23 +1018,20 @@ rollup@^4.20.0: "@rollup/rollup-win32-x64-msvc" "4.24.0" fsevents "~2.3.2" -shiki@1.22.0, shiki@^1.22.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.22.0.tgz#45d1dfff0e03a598af70e2ec8592f14ef07827b4" - integrity sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw== +shiki@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-2.5.0.tgz#09d01ebf3b0b06580431ce3ddc023320442cf223" + integrity sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ== dependencies: - "@shikijs/core" "1.22.0" - "@shikijs/engine-javascript" "1.22.0" - "@shikijs/engine-oniguruma" "1.22.0" - "@shikijs/types" "1.22.0" - "@shikijs/vscode-textmate" "^9.3.0" + "@shikijs/core" "2.5.0" + "@shikijs/engine-javascript" "2.5.0" + "@shikijs/engine-oniguruma" "2.5.0" + "@shikijs/langs" "2.5.0" + "@shikijs/themes" "2.5.0" + "@shikijs/types" "2.5.0" + "@shikijs/vscode-textmate" "^10.0.2" "@types/hast" "^3.0.4" -source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" @@ -988,22 +1055,17 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -superjson@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/superjson/-/superjson-2.2.1.tgz#9377a7fa80fedb10c851c9dbffd942d4bcf79733" - integrity sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA== +superjson@^2.2.2: + version "2.2.6" + resolved "https://registry.yarnpkg.com/superjson/-/superjson-2.2.6.tgz#a223a3a988172a5f9656e2063fe5f733af40d099" + integrity sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA== dependencies: - copy-anything "^3.0.2" + copy-anything "^4" -tabbable@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" - integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== +tabbable@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.4.0.tgz#36eb7a06d80b3924a22095daf45740dea3bf5581" + integrity sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg== trim-lines@^3.0.0: version "3.0.1" @@ -1064,7 +1126,7 @@ vfile@^6.0.0: "@types/unist" "^3.0.0" vfile-message "^4.0.0" -vite@^5.4.8: +vite@^5.4.14: version "5.4.21" resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027" integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw== @@ -1075,44 +1137,40 @@ vite@^5.4.8: optionalDependencies: fsevents "~2.3.3" -vitepress@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/vitepress/-/vitepress-1.4.0.tgz#5e879230d98e5c4e5aec91daade6945bbc18934b" - integrity sha512-JXCv4EsKTDyAFb6C/UjZr7nsGAzZ6mafVk2rx7rG5o8N+B/4QstIk+iEOe/9dKoU6V624UIC6g1pZ+K63rxhlw== +vitepress@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/vitepress/-/vitepress-1.6.4.tgz#1b6c68fede541a3f401a66263dce0c985e2d8d92" + integrity sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg== dependencies: - "@docsearch/css" "^3.6.2" - "@docsearch/js" "^3.6.2" - "@shikijs/core" "^1.22.0" - "@shikijs/transformers" "^1.22.0" - "@shikijs/types" "^1.22.0" + "@docsearch/css" "3.8.2" + "@docsearch/js" "3.8.2" + "@iconify-json/simple-icons" "^1.2.21" + "@shikijs/core" "^2.1.0" + "@shikijs/transformers" "^2.1.0" + "@shikijs/types" "^2.1.0" "@types/markdown-it" "^14.1.2" - "@vitejs/plugin-vue" "^5.1.4" - "@vue/devtools-api" "^7.4.6" - "@vue/shared" "^3.5.11" - "@vueuse/core" "^11.1.0" - "@vueuse/integrations" "^11.1.0" - focus-trap "^7.6.0" + "@vitejs/plugin-vue" "^5.2.1" + "@vue/devtools-api" "^7.7.0" + "@vue/shared" "^3.5.13" + "@vueuse/core" "^12.4.0" + "@vueuse/integrations" "^12.4.0" + focus-trap "^7.6.4" mark.js "8.11.1" - minisearch "^7.1.0" - shiki "^1.22.0" - vite "^5.4.8" - vue "^3.5.11" + minisearch "^7.1.1" + shiki "^2.1.0" + vite "^5.4.14" + vue "^3.5.13" -vue-demi@>=0.14.10: - version "0.14.10" - resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.10.tgz#afc78de3d6f9e11bf78c55e8510ee12814522f04" - integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg== - -vue@^3.5.11: - version "3.5.11" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.11.tgz#3e307183797629f701e303a0a008f517ae031483" - integrity sha512-/8Wurrd9J3lb72FTQS7gRMNQD4nztTtKPmuDuPuhqXmmpD6+skVjAeahNpVzsuky6Sy9gy7wn8UadqPtt9SQIg== +vue@^3.5.13: + version "3.5.26" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.26.tgz#03a0b17311e0e593d34b9358fa249b85e3a6d9fb" + integrity sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA== dependencies: - "@vue/compiler-dom" "3.5.11" - "@vue/compiler-sfc" "3.5.11" - "@vue/runtime-dom" "3.5.11" - "@vue/server-renderer" "3.5.11" - "@vue/shared" "3.5.11" + "@vue/compiler-dom" "3.5.26" + "@vue/compiler-sfc" "3.5.26" + "@vue/runtime-dom" "3.5.26" + "@vue/server-renderer" "3.5.26" + "@vue/shared" "3.5.26" zwitch@^2.0.4: version "2.0.4" From 462c134751e94655f06618c0f87b765d13754d50 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Wed, 14 Jan 2026 11:44:51 +1000 Subject: [PATCH 52/55] 2fa work slight refactor - use existing access mechanisms for validation - adds swagger/schema and validation of incoming payload --- backend/internal/2fa.js | 260 +++++++++--------- backend/routes/tokens.js | 11 +- backend/routes/users.js | 124 +++------ .../schema/components/token-challenge.json | 18 ++ backend/schema/paths/tokens/2fa/post.json | 55 ++++ backend/schema/paths/tokens/post.json | 9 +- .../users/userID/2fa/backup-codes/post.json | 79 ++++++ .../schema/paths/users/userID/2fa/delete.json | 46 ++++ .../paths/users/userID/2fa/enable/post.json | 79 ++++++ .../schema/paths/users/userID/2fa/get.json | 46 ++++ .../schema/paths/users/userID/2fa/post.json | 39 +++ backend/schema/swagger.json | 26 ++ docs/src/2fa-implementation.md | 176 ------------ frontend/src/api/backend/twoFactor.ts | 15 +- 14 files changed, 565 insertions(+), 418 deletions(-) create mode 100644 backend/schema/components/token-challenge.json create mode 100644 backend/schema/paths/tokens/2fa/post.json create mode 100644 backend/schema/paths/users/userID/2fa/backup-codes/post.json create mode 100644 backend/schema/paths/users/userID/2fa/delete.json create mode 100644 backend/schema/paths/users/userID/2fa/enable/post.json create mode 100644 backend/schema/paths/users/userID/2fa/get.json create mode 100644 backend/schema/paths/users/userID/2fa/post.json delete mode 100644 docs/src/2fa-implementation.md diff --git a/backend/internal/2fa.js b/backend/internal/2fa.js index f270c85f..aba9dd68 100644 --- a/backend/internal/2fa.js +++ b/backend/internal/2fa.js @@ -1,9 +1,9 @@ -import bcrypt from "bcrypt"; import crypto from "node:crypto"; +import bcrypt from "bcrypt"; import { authenticator } from "otplib"; -import authModel from "../models/auth.js"; -import userModel from "../models/user.js"; import errs from "../lib/error.js"; +import authModel from "../models/auth.js"; +import internalUser from "./user.js"; const APP_NAME = "Nginx Proxy Manager"; const BACKUP_CODE_COUNT = 8; @@ -26,38 +26,7 @@ const generateBackupCodes = async () => { return { plain, hashed }; }; -export default { - /** - * Generate a new TOTP secret - * @returns {string} - */ - generateSecret: () => { - return authenticator.generateSecret(); - }, - - /** - * Generate otpauth URL for QR code - * @param {string} email - * @param {string} secret - * @returns {string} - */ - generateOTPAuthURL: (email, secret) => { - return authenticator.keyuri(email, APP_NAME, secret); - }, - - /** - * Verify a TOTP code - * @param {string} secret - * @param {string} code - * @returns {boolean} - */ - verifyCode: (secret, code) => { - try { - return authenticator.verify({ token: code, secret }); - } catch { - return false; - } - }, +const internal2fa = { /** * Check if user has 2FA enabled @@ -65,94 +34,85 @@ export default { * @returns {Promise} */ isEnabled: async (userId) => { - const auth = await authModel - .query() - .where("user_id", userId) - .where("type", "password") - .first(); - - if (!auth || !auth.meta) { - return false; - } - - return auth.meta.totp_enabled === true; + const auth = await internal2fa.getUserPasswordAuth(userId); + return auth?.meta?.totp_enabled === true; }, /** * Get 2FA status for user - * @param {number} userId - * @returns {Promise<{enabled: boolean, backupCodesRemaining: number}>} + * @param {Access} access + * @param {number} userId + * @returns {Promise<{enabled: boolean, backup_codes_remaining: number}>} */ - getStatus: async (userId) => { - const auth = await authModel - .query() - .where("user_id", userId) - .where("type", "password") - .first(); + getStatus: async (access, userId) => { + await access.can("users:password", userId); + await internalUser.get(access, { id: userId }); + const auth = await internal2fa.getUserPasswordAuth(userId); + const enabled = auth?.meta?.totp_enabled === true; + let backup_codes_remaining = 0; - if (!auth || !auth.meta || !auth.meta.totp_enabled) { - return { enabled: false, backupCodesRemaining: 0 }; + if (enabled) { + const backupCodes = auth.meta.backup_codes || []; + backup_codes_remaining = backupCodes.length; } - const backupCodes = auth.meta.backup_codes || []; return { - enabled: true, - backupCodesRemaining: backupCodes.length, + enabled, + backup_codes_remaining, }; }, /** * Start 2FA setup - store pending secret - * @param {number} userId - * @returns {Promise<{secret: string, otpauthUrl: string}>} + * + * @param {Access} access + * @param {number} userId + * @returns {Promise<{secret: string, otpauth_url: string}>} */ - startSetup: async (userId) => { - const user = await userModel.query().where("id", userId).first(); - if (!user) { - throw new errs.ItemNotFoundError("User not found"); - } - + startSetup: async (access, userId) => { + await access.can("users:password", userId); + const user = await internalUser.get(access, { id: userId }); const secret = authenticator.generateSecret(); - const otpauthUrl = authenticator.keyuri(user.email, APP_NAME, secret); + const otpauth_url = authenticator.keyuri(user.email, APP_NAME, secret); + const auth = await internal2fa.getUserPasswordAuth(userId); - const auth = await authModel - .query() - .where("user_id", userId) - .where("type", "password") - .first(); - - if (!auth) { - throw new errs.ItemNotFoundError("Auth record not found"); + // ensure user isn't already setup for 2fa + const enabled = auth?.meta?.totp_enabled === true; + if (enabled) { + throw new errs.ValidationError("2FA is already enabled"); } const meta = auth.meta || {}; meta.totp_pending_secret = secret; - await authModel.query().where("id", auth.id).patch({ meta }); + await authModel.query() + .where("id", auth.id) + .andWhere("user_id", userId) + .andWhere("type", "password") + .patch({ meta }); - return { secret, otpauthUrl }; + return { secret, otpauth_url }; }, /** * Enable 2FA after verifying code - * @param {number} userId - * @param {string} code - * @returns {Promise<{backupCodes: string[]}>} + * + * @param {Access} access + * @param {number} userId + * @param {string} code + * @returns {Promise<{backup_codes: string[]}>} */ - enable: async (userId, code) => { - const auth = await authModel - .query() - .where("user_id", userId) - .where("type", "password") - .first(); + enable: async (access, userId, code) => { + await access.can("users:password", userId); + await internalUser.get(access, { id: userId }); + const auth = await internal2fa.getUserPasswordAuth(userId); + const secret = auth?.meta?.totp_pending_secret || false; - if (!auth || !auth.meta || !auth.meta.totp_pending_secret) { + if (!secret) { throw new errs.ValidationError("No pending 2FA setup found"); } - const secret = auth.meta.totp_pending_secret; const valid = authenticator.verify({ token: code, secret }); - if (!valid) { throw new errs.ValidationError("Invalid verification code"); } @@ -168,25 +128,31 @@ export default { }; delete meta.totp_pending_secret; - await authModel.query().where("id", auth.id).patch({ meta }); + await authModel + .query() + .where("id", auth.id) + .andWhere("user_id", userId) + .andWhere("type", "password") + .patch({ meta }); - return { backupCodes: plain }; + return { backup_codes: plain }; }, /** * Disable 2FA - * @param {number} userId - * @param {string} code + * + * @param {Access} access + * @param {number} userId + * @param {string} code * @returns {Promise} */ - disable: async (userId, code) => { - const auth = await authModel - .query() - .where("user_id", userId) - .where("type", "password") - .first(); + disable: async (access, userId, code) => { + await access.can("users:password", userId); + await internalUser.get(access, { id: userId }); + const auth = await internal2fa.getUserPasswordAuth(userId); - if (!auth || !auth.meta || !auth.meta.totp_enabled) { + const enabled = auth?.meta?.totp_enabled === true; + if (!enabled) { throw new errs.ValidationError("2FA is not enabled"); } @@ -196,7 +162,7 @@ export default { }); if (!valid) { - throw new errs.ValidationError("Invalid verification code"); + throw new errs.AuthError("Invalid verification code"); } const meta = { ...auth.meta }; @@ -205,30 +171,33 @@ export default { delete meta.totp_enabled_at; delete meta.backup_codes; - await authModel.query().where("id", auth.id).patch({ meta }); + await authModel + .query() + .where("id", auth.id) + .andWhere("user_id", userId) + .andWhere("type", "password") + .patch({ meta }); }, /** * Verify 2FA code for login - * @param {number} userId - * @param {string} code + * + * @param {number} userId + * @param {string} token * @returns {Promise} */ - verifyForLogin: async (userId, code) => { - const auth = await authModel - .query() - .where("user_id", userId) - .where("type", "password") - .first(); + verifyForLogin: async (userId, token) => { + const auth = await internal2fa.getUserPasswordAuth(userId); + const secret = auth?.meta?.totp_secret || false; - if (!auth || !auth.meta || !auth.meta.totp_secret) { + if (!secret) { return false; } // Try TOTP code first const valid = authenticator.verify({ - token: code, - secret: auth.meta.totp_secret, + token, + secret, }); if (valid) { @@ -236,7 +205,7 @@ export default { } // Try backup codes - const backupCodes = auth.meta.backup_codes || []; + const backupCodes = auth?.meta?.backup_codes || []; for (let i = 0; i < backupCodes.length; i++) { const match = await bcrypt.compare(code.toUpperCase(), backupCodes[i]); if (match) { @@ -244,7 +213,12 @@ export default { const updatedCodes = [...backupCodes]; updatedCodes.splice(i, 1); const meta = { ...auth.meta, backup_codes: updatedCodes }; - await authModel.query().where("id", auth.id).patch({ meta }); + await authModel + .query() + .where("id", auth.id) + .andWhere("user_id", userId) + .andWhere("type", "password") + .patch({ meta }); return true; } } @@ -254,24 +228,29 @@ export default { /** * Regenerate backup codes - * @param {number} userId - * @param {string} code - * @returns {Promise<{backupCodes: string[]}>} + * + * @param {Access} access + * @param {number} userId + * @param {string} token + * @returns {Promise<{backup_codes: string[]}>} */ - regenerateBackupCodes: async (userId, code) => { - const auth = await authModel - .query() - .where("user_id", userId) - .where("type", "password") - .first(); + regenerateBackupCodes: async (access, userId, token) => { + await access.can("users:password", userId); + await internalUser.get(access, { id: userId }); + const auth = await internal2fa.getUserPasswordAuth(userId); + const enabled = auth?.meta?.totp_enabled === true; + const secret = auth?.meta?.totp_secret || false; - if (!auth || !auth.meta || !auth.meta.totp_enabled) { + if (!enabled) { throw new errs.ValidationError("2FA is not enabled"); } + if (!secret) { + throw new errs.ValidationError("No 2FA secret found"); + } const valid = authenticator.verify({ - token: code, - secret: auth.meta.totp_secret, + token, + secret, }); if (!valid) { @@ -281,8 +260,29 @@ export default { const { plain, hashed } = await generateBackupCodes(); const meta = { ...auth.meta, backup_codes: hashed }; - await authModel.query().where("id", auth.id).patch({ meta }); + await authModel + .query() + .where("id", auth.id) + .andWhere("user_id", userId) + .andWhere("type", "password") + .patch({ meta }); - return { backupCodes: plain }; + return { backup_codes: plain }; + }, + + getUserPasswordAuth: async (userId) => { + const auth = await authModel + .query() + .where("user_id", userId) + .andWhere("type", "password") + .first(); + + if (!auth) { + throw new errs.ItemNotFoundError("Auth not found"); + } + + return auth; }, }; + +export default internal2fa; diff --git a/backend/routes/tokens.js b/backend/routes/tokens.js index f486294b..8a6a1bc0 100644 --- a/backend/routes/tokens.js +++ b/backend/routes/tokens.js @@ -66,16 +66,7 @@ router */ .post(async (req, res, next) => { try { - const { challenge_token, code } = req.body; - - if (!challenge_token || !code) { - return res.status(400).json({ - error: { - message: "Missing challenge_token or code", - }, - }); - } - + const { challenge_token, code } = await apiValidator(getValidationSchema("/tokens/2fa", "post"), req.body); const result = await internalToken.verify2FA(challenge_token, code); res.status(200).send(result); } catch (err) { diff --git a/backend/routes/users.js b/backend/routes/users.js index 8f51db66..23e75862 100644 --- a/backend/routes/users.js +++ b/backend/routes/users.js @@ -339,6 +339,21 @@ router .all(jwtdecode()) .all(userIdFromMe) + /** + * POST /api/users/123/2fa + * + * Start 2FA setup, returns QR code URL + */ + .post(async (req, res, next) => { + try { + const result = await internal2FA.startSetup(res.locals.access, req.params.user_id); + res.status(200).send(result); + } catch (err) { + debug(logger, `${req.method.toUpperCase()} ${req.path}: ${err}`); + next(err); + } + }) + /** * GET /api/users/123/2fa * @@ -346,15 +361,7 @@ router */ .get(async (req, res, next) => { try { - const userId = Number.parseInt(req.params.user_id, 10); - const access = res.locals.access; - - // Users can only view their own 2FA status - if (access.token.getUserId() !== userId && !access.token.hasScope("admin")) { - throw new errs.PermissionError("Cannot view 2FA status for other users"); - } - - const status = await internal2FA.getStatus(userId); + const status = await internal2FA.getStatus(res.locals.access, req.params.user_id); res.status(200).send(status); } catch (err) { debug(logger, `${req.method.toUpperCase()} ${req.path}: ${err}`); @@ -369,57 +376,12 @@ router */ .delete(async (req, res, next) => { try { - const userId = Number.parseInt(req.params.user_id, 10); - const access = res.locals.access; - - // Users can only disable their own 2FA - if (access.token.getUserId() !== userId && !access.token.hasScope("admin")) { - throw new errs.PermissionError("Cannot disable 2FA for other users"); - } - - const { code } = req.body; - if (!code) { - throw new errs.ValidationError("Verification code is required"); - } - - await internal2FA.disable(userId, code); - res.status(200).send({ success: true }); - } catch (err) { - debug(logger, `${req.method.toUpperCase()} ${req.path}: ${err}`); - next(err); - } - }); - -/** - * User 2FA setup - * - * /api/users/123/2fa/setup - */ -router - .route("/:user_id/2fa/setup") - .options((_, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - .all(userIdFromMe) - - /** - * POST /api/users/123/2fa/setup - * - * Start 2FA setup, returns QR code URL - */ - .post(async (req, res, next) => { - try { - const userId = Number.parseInt(req.params.user_id, 10); - const access = res.locals.access; - - // Users can only setup their own 2FA - if (access.token.getUserId() !== userId) { - throw new errs.PermissionError("Cannot setup 2FA for other users"); - } - - const result = await internal2FA.startSetup(userId); - res.status(200).send(result); + const { code } = await apiValidator( + getValidationSchema("/users/{userID}/2fa", "delete"), + req.body, + ); + await internal2FA.disable(res.locals.access, req.params.user_id, code); + res.status(200).send(true); } catch (err) { debug(logger, `${req.method.toUpperCase()} ${req.path}: ${err}`); next(err); @@ -440,26 +402,17 @@ router .all(userIdFromMe) /** - * PUT /api/users/123/2fa/enable + * POST /api/users/123/2fa/enable * * Verify code and enable 2FA */ - .put(async (req, res, next) => { + .post(async (req, res, next) => { try { - const userId = Number.parseInt(req.params.user_id, 10); - const access = res.locals.access; - - // Users can only enable their own 2FA - if (access.token.getUserId() !== userId) { - throw new errs.PermissionError("Cannot enable 2FA for other users"); - } - - const { code } = req.body; - if (!code) { - throw new errs.ValidationError("Verification code is required"); - } - - const result = await internal2FA.enable(userId, code); + const { code } = await apiValidator( + getValidationSchema("/users/{userID}/2fa/enable", "post"), + req.body, + ); + const result = await internal2FA.enable(res.locals.access, req.params.user_id, code); res.status(200).send(result); } catch (err) { debug(logger, `${req.method.toUpperCase()} ${req.path}: ${err}`); @@ -487,20 +440,11 @@ router */ .post(async (req, res, next) => { try { - const userId = Number.parseInt(req.params.user_id, 10); - const access = res.locals.access; - - // Users can only regenerate their own backup codes - if (access.token.getUserId() !== userId) { - throw new errs.PermissionError("Cannot regenerate backup codes for other users"); - } - - const { code } = req.body; - if (!code) { - throw new errs.ValidationError("Verification code is required"); - } - - const result = await internal2FA.regenerateBackupCodes(userId, code); + const { code } = await apiValidator( + getValidationSchema("/users/{userID}/2fa/backup-codes", "post"), + req.body, + ); + const result = await internal2FA.regenerateBackupCodes(res.locals.access, req.params.user_id, code); res.status(200).send(result); } catch (err) { debug(logger, `${req.method.toUpperCase()} ${req.path}: ${err}`); diff --git a/backend/schema/components/token-challenge.json b/backend/schema/components/token-challenge.json new file mode 100644 index 00000000..9d79cd92 --- /dev/null +++ b/backend/schema/components/token-challenge.json @@ -0,0 +1,18 @@ +{ + "type": "object", + "description": "Token object", + "required": ["requires_2fa", "challenge_token"], + "additionalProperties": false, + "properties": { + "requires_2fa": { + "description": "Whether this token request requires two-factor authentication", + "example": true, + "type": "boolean" + }, + "challenge_token": { + "description": "Challenge Token used in subsequent 2FA verification", + "example": "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.ey...xaHKYr3Kk6MvkUjcC4", + "type": "string" + } + } +} diff --git a/backend/schema/paths/tokens/2fa/post.json b/backend/schema/paths/tokens/2fa/post.json new file mode 100644 index 00000000..f6b50022 --- /dev/null +++ b/backend/schema/paths/tokens/2fa/post.json @@ -0,0 +1,55 @@ +{ + "operationId": "loginWith2FA", + "summary": "Verify 2FA code and get full token", + "tags": ["tokens"], + "requestBody": { + "description": "2fa Challenge Payload", + "required": true, + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "challenge_token": { + "minLength": 1, + "type": "string", + "example": "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.ey...xaHKYr3Kk6MvkUjcC4" + }, + "code": { + "minLength": 6, + "maxLength": 6, + "type": "string", + "example": "012345" + } + }, + "required": ["challenge_token", "code"], + "type": "object" + }, + "example": { + "challenge_token": "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.ey...xaHKYr3Kk6MvkUjcC4", + "code": "012345" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "expires": "2025-02-04T20:40:46.340Z", + "token": "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.ey...xaHKYr3Kk6MvkUjcC4" + } + } + }, + "schema": { + "$ref": "../../../components/token-object.json" + } + } + }, + "description": "200 response" + } + } +} diff --git a/backend/schema/paths/tokens/post.json b/backend/schema/paths/tokens/post.json index f8a639ad..470be303 100644 --- a/backend/schema/paths/tokens/post.json +++ b/backend/schema/paths/tokens/post.json @@ -50,7 +50,14 @@ } }, "schema": { - "$ref": "../../components/token-object.json" + "oneOf": [ + { + "$ref": "../../components/token-object.json" + }, + { + "$ref": "../../components/token-challenge.json" + } + ] } } }, diff --git a/backend/schema/paths/users/userID/2fa/backup-codes/post.json b/backend/schema/paths/users/userID/2fa/backup-codes/post.json new file mode 100644 index 00000000..ab2faa49 --- /dev/null +++ b/backend/schema/paths/users/userID/2fa/backup-codes/post.json @@ -0,0 +1,79 @@ +{ + "operationId": "regenUser2faCodes", + "summary": "Regenerate 2FA backup codes", + "tags": ["users"], + "requestBody": { + "description": "Verififcation Payload", + "required": true, + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "code": { + "minLength": 6, + "maxLength": 6, + "type": "string", + "example": "123456" + } + }, + "required": ["code"], + "type": "object" + }, + "example": { + "code": "123456" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "backup_codes": [ + "6CD7CB06", + "495302F3", + "D8037852", + "A6FFC956", + "BC1A1851", + "A05E644F", + "A406D2E8", + "0AE3C522" + ] + } + } + }, + "schema": { + "type": "object", + "required": ["backup_codes"], + "additionalProperties": false, + "properties": { + "backup_codes": { + "description": "Backup codes", + "example": [ + "6CD7CB06", + "495302F3", + "D8037852", + "A6FFC956", + "BC1A1851", + "A05E644F", + "A406D2E8", + "0AE3C522" + ], + "type": "array", + "items": { + "type": "string", + "example": "6CD7CB06" + } + } + } + } + } + }, + "description": "200 response" + } + } +} diff --git a/backend/schema/paths/users/userID/2fa/delete.json b/backend/schema/paths/users/userID/2fa/delete.json new file mode 100644 index 00000000..a1c53697 --- /dev/null +++ b/backend/schema/paths/users/userID/2fa/delete.json @@ -0,0 +1,46 @@ +{ + "operationId": "disableUser2fa", + "summary": "Disable 2fa for user", + "tags": ["users"], + "requestBody": { + "description": "2fa Code Payload", + "required": true, + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "code": { + "minLength": 6, + "maxLength": 6, + "type": "string", + "example": "012345" + } + }, + "required": ["code"], + "type": "object" + }, + "example": { + "code": "012345" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "default": { + "value": true + } + }, + "schema": { + "type": "boolean" + } + } + }, + "description": "200 response" + } + } +} diff --git a/backend/schema/paths/users/userID/2fa/enable/post.json b/backend/schema/paths/users/userID/2fa/enable/post.json new file mode 100644 index 00000000..bab0b17e --- /dev/null +++ b/backend/schema/paths/users/userID/2fa/enable/post.json @@ -0,0 +1,79 @@ +{ + "operationId": "enableUser2fa", + "summary": "Verify code and enable 2FA", + "tags": ["users"], + "requestBody": { + "description": "Verififcation Payload", + "required": true, + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "code": { + "minLength": 6, + "maxLength": 6, + "type": "string", + "example": "123456" + } + }, + "required": ["code"], + "type": "object" + }, + "example": { + "code": "123456" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "backup_codes": [ + "6CD7CB06", + "495302F3", + "D8037852", + "A6FFC956", + "BC1A1851", + "A05E644F", + "A406D2E8", + "0AE3C522" + ] + } + } + }, + "schema": { + "type": "object", + "required": ["backup_codes"], + "additionalProperties": false, + "properties": { + "backup_codes": { + "description": "Backup codes", + "example": [ + "6CD7CB06", + "495302F3", + "D8037852", + "A6FFC956", + "BC1A1851", + "A05E644F", + "A406D2E8", + "0AE3C522" + ], + "type": "array", + "items": { + "type": "string", + "example": "6CD7CB06" + } + } + } + } + } + }, + "description": "200 response" + } + } +} diff --git a/backend/schema/paths/users/userID/2fa/get.json b/backend/schema/paths/users/userID/2fa/get.json new file mode 100644 index 00000000..52fff724 --- /dev/null +++ b/backend/schema/paths/users/userID/2fa/get.json @@ -0,0 +1,46 @@ +{ + "operationId": "getUser2faStatus", + "summary": "Get user 2fa Status", + "tags": ["users"], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": [ + { + "enabled": false, + "backup_codes_remaining": 0 + } + ] + } + }, + "schema": { + "type": "object", + "additionalProperties": false, + "required": ["enabled", "backup_codes_remaining"], + "properties": { + "enabled": { + "type": "boolean", + "description": "Is 2FA enabled for this user", + "example": true + }, + "backup_codes_remaining": { + "type": "integer", + "description": "Number of remaining backup codes for this user", + "example": 5 + } + } + } + } + } + } + } +} diff --git a/backend/schema/paths/users/userID/2fa/post.json b/backend/schema/paths/users/userID/2fa/post.json new file mode 100644 index 00000000..bd13c825 --- /dev/null +++ b/backend/schema/paths/users/userID/2fa/post.json @@ -0,0 +1,39 @@ +{ + "operationId": "setupUser2fa", + "summary": "Start 2FA setup, returns QR code URL", + "tags": ["users"], + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "secret": "JZYCEBIEEJYUGPQM", + "otpauth_url": "otpauth://totp/Nginx%20Proxy%20Manager:jc%40jc21.com?secret=JZYCEBIEEJYUGPQM&period=30&digits=6&algorithm=SHA1&issuer=Nginx%20Proxy%20Manager" + } + } + }, + "schema": { + "type": "object", + "required": ["secret", "otpauth_url"], + "additionalProperties": false, + "properties": { + "secret": { + "description": "TOTP Secret", + "example": "JZYCEBIEEJYUGPQM", + "type": "string" + }, + "otpauth_url": { + "description": "OTP Auth URL for QR Code generation", + "example": "otpauth://totp/Nginx%20Proxy%20Manager:jc%40jc21.com?secret=JZYCEBIEEJYUGPQM&period=30&digits=6&algorithm=SHA1&issuer=Nginx%20Proxy%20Manager", + "type": "string" + } + } + } + } + }, + "description": "200 response" + } + } +} diff --git a/backend/schema/swagger.json b/backend/schema/swagger.json index 9afb51f2..4222f19d 100644 --- a/backend/schema/swagger.json +++ b/backend/schema/swagger.json @@ -293,6 +293,11 @@ "$ref": "./paths/tokens/post.json" } }, + "/tokens/2fa": { + "post": { + "$ref": "./paths/tokens/2fa/post.json" + } + }, "/version/check": { "get": { "$ref": "./paths/version/check/get.json" @@ -317,6 +322,27 @@ "$ref": "./paths/users/userID/delete.json" } }, + "/users/{userID}/2fa": { + "post": { + "$ref": "./paths/users/userID/2fa/post.json" + }, + "get": { + "$ref": "./paths/users/userID/2fa/get.json" + }, + "delete": { + "$ref": "./paths/users/userID/2fa/delete.json" + } + }, + "/users/{userID}/2fa/enable": { + "post": { + "$ref": "./paths/users/userID/2fa/enable/post.json" + } + }, + "/users/{userID}/2fa/backup-codes": { + "post": { + "$ref": "./paths/users/userID/2fa/backup-codes/post.json" + } + }, "/users/{userID}/auth": { "put": { "$ref": "./paths/users/userID/auth/put.json" diff --git a/docs/src/2fa-implementation.md b/docs/src/2fa-implementation.md deleted file mode 100644 index d1767ffd..00000000 --- a/docs/src/2fa-implementation.md +++ /dev/null @@ -1,176 +0,0 @@ -# Two-Factor Authentication Implementation - -> **Note:** This document should be deleted after PR approval. It serves as a reference for reviewers to understand the scope of the contribution. - ---- - -**Acknowledgments** - -Thanks to all contributors and authors from the Inte.Team for the great work on Nginx Proxy Manager. It saves us time and effort, and we're happy to contribute back to the project. - ---- - -## Overview - -Add TOTP-based two-factor authentication to the login flow. Users can enable 2FA from their profile settings, scan a QR code with any authenticator app (Google Authenticator, Authy, etc.), and will be required to enter a 6-digit code on login. - -## Current Authentication Flow - -``` -POST /tokens {identity, secret} - -> Validate user exists and is not disabled - -> Verify password against auth.secret - -> Return JWT token -``` - -## Proposed 2FA Flow - -``` -POST /tokens {identity, secret} - -> Validate user exists and is not disabled - -> Verify password against auth.secret - -> If 2FA enabled: - Return {requires_2fa: true, challenge_token: } - -> Else: - Return {token: , expires: } - -POST /tokens/2fa {challenge_token, code} - -> Validate challenge_token - -> Verify TOTP code against user's secret - -> Return {token: , expires: } -``` - -## Database Changes - -Extend the existing `auth.meta` JSON column to store 2FA data: - -```json -{ - "totp_secret": "", - "totp_enabled": true, - "totp_enabled_at": "", - "backup_codes": ["", "", ...] -} -``` - -No new tables required. The `auth.meta` column is already designed for this purpose. - -## Backend Changes - -### New Files - -1. `backend/internal/2fa.js` - Core 2FA logic - - `generateSecret()` - Generate TOTP secret - - `generateQRCodeURL(user, secret)` - Generate otpauth URL - - `verifyCode(secret, code)` - Verify TOTP code - - `generateBackupCodes()` - Generate 8 backup codes - - `verifyBackupCode(user, code)` - Verify and consume backup code - -2. `backend/routes/2fa.js` - 2FA management endpoints - - `GET /users/:id/2fa` - Get 2FA status - - `POST /users/:id/2fa/setup` - Start 2FA setup, return QR code - - `PUT /users/:id/2fa/enable` - Verify code and enable 2FA - - `DELETE /users/:id/2fa` - Disable 2FA (requires code) - - `GET /users/:id/2fa/backup-codes` - View remaining backup codes count - - `POST /users/:id/2fa/backup-codes` - Regenerate backup codes - -### Modified Files - -1. `backend/internal/token.js` - - Update `getTokenFromEmail()` to check for 2FA - - Add `verifyTwoFactorChallenge()` function - - Add `createChallengeToken()` for short-lived 2FA tokens - -2. `backend/routes/tokens.js` - - Add `POST /tokens/2fa` endpoint - -3. `backend/index.js` - - Register new 2FA routes - -### Dependencies - -Add to `package.json`: -```json -"otplib": "^12.0.1" -``` - -## Frontend Changes - -### New Files - -1. `frontend/src/pages/Login2FA/index.tsx` - 2FA code entry page -2. `frontend/src/modals/TwoFactorSetupModal.tsx` - Setup wizard modal -3. `frontend/src/api/backend/twoFactor.ts` - 2FA API functions -4. `frontend/src/api/backend/verify2FA.ts` - Token verification - -### Modified Files - -1. `frontend/src/api/backend/responseTypes.ts` - - Add `TwoFactorChallengeResponse` type - - Add `TwoFactorStatusResponse` type - -2. `frontend/src/context/AuthContext.tsx` - - Add `twoFactorRequired` state - - Add `challengeToken` state - - Update `login()` to handle 2FA response - - Add `verify2FA()` function - -3. `frontend/src/pages/Login/index.tsx` - - Handle 2FA challenge response - - Redirect to 2FA entry when required - -4. `frontend/src/pages/Settings/` (or user profile) - - Add 2FA enable/disable section - -### Dependencies - -Add to `package.json`: -```json -"qrcode.react": "^3.1.0" -``` - -## API Endpoints Summary - -| Method | Endpoint | Auth | Description | -|--------|----------|------|-------------| -| POST | /tokens | No | Login (returns challenge if 2FA) | -| POST | /tokens/2fa | Challenge | Complete 2FA login | -| GET | /users/:id/2fa | JWT | Get 2FA status | -| POST | /users/:id/2fa/setup | JWT | Start setup, get QR code | -| PUT | /users/:id/2fa/enable | JWT | Verify and enable | -| DELETE | /users/:id/2fa | JWT | Disable (requires code) | -| GET | /users/:id/2fa/backup-codes | JWT | Get backup codes count | -| POST | /users/:id/2fa/backup-codes | JWT | Regenerate codes | - -## Security Considerations - -1. Challenge tokens expire in 5 minutes -2. TOTP secrets encrypted at rest -3. Backup codes hashed with bcrypt -4. Rate limit on 2FA attempts (5 attempts, 15 min lockout) -5. Backup codes single-use only -6. 2FA disable requires valid TOTP code - -## Implementation Order - -1. Backend: Add `otplib` dependency -2. Backend: Create `internal/2fa.js` module -3. Backend: Update `internal/token.js` for challenge flow -4. Backend: Add `POST /tokens/2fa` route -5. Backend: Create `routes/2fa.js` for management -6. Frontend: Add `qrcode.react` dependency -7. Frontend: Update API types and functions -8. Frontend: Update AuthContext for 2FA state -9. Frontend: Create Login2FA page -10. Frontend: Update Login to handle 2FA -11. Frontend: Add 2FA settings UI - -## Testing - -1. Enable 2FA for user -2. Login with password only - should get challenge -3. Submit correct TOTP - should get token -4. Submit wrong TOTP - should fail -5. Use backup code - should work once -6. Disable 2FA - should require valid code -7. Login after disable - should work without 2FA diff --git a/frontend/src/api/backend/twoFactor.ts b/frontend/src/api/backend/twoFactor.ts index 13912387..b50b69f1 100644 --- a/frontend/src/api/backend/twoFactor.ts +++ b/frontend/src/api/backend/twoFactor.ts @@ -1,11 +1,7 @@ import { camelizeKeys, decamelizeKeys } from "humps"; import AuthStore from "src/modules/AuthStore"; -import type { - TwoFactorEnableResponse, - TwoFactorSetupResponse, - TwoFactorStatusResponse, -} from "./responseTypes"; import * as api from "./base"; +import type { TwoFactorEnableResponse, TwoFactorSetupResponse, TwoFactorStatusResponse } from "./responseTypes"; export async function get2FAStatus(userId: number | "me"): Promise { return await api.get({ @@ -15,12 +11,12 @@ export async function get2FAStatus(userId: number | "me"): Promise { return await api.post({ - url: `/users/${userId}/2fa/setup`, + url: `/users/${userId}/2fa`, }); } export async function enable2FA(userId: number | "me", code: string): Promise { - return await api.put({ + return await api.post({ url: `/users/${userId}/2fa/enable`, data: { code }, }); @@ -47,10 +43,7 @@ export async function disable2FA(userId: number | "me", code: string): Promise<{ return camelizeKeys(payload) as { success: boolean }; } -export async function regenerateBackupCodes( - userId: number | "me", - code: string, -): Promise { +export async function regenerateBackupCodes(userId: number | "me", code: string): Promise { return await api.post({ url: `/users/${userId}/2fa/backup-codes`, data: { code }, From d33bb02c740cfcc1abdb9c90d09b7a6cdf1bcede Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Wed, 14 Jan 2026 12:46:30 +1000 Subject: [PATCH 53/55] Add missing params to swagger --- .../paths/users/userID/2fa/backup-codes/post.json | 13 +++++++++++++ backend/schema/paths/users/userID/2fa/delete.json | 13 +++++++++++++ .../schema/paths/users/userID/2fa/enable/post.json | 13 +++++++++++++ backend/schema/paths/users/userID/2fa/get.json | 13 +++++++++++++ backend/schema/paths/users/userID/2fa/post.json | 13 +++++++++++++ frontend/src/locale/src/pl.json | 6 +++--- 6 files changed, 68 insertions(+), 3 deletions(-) diff --git a/backend/schema/paths/users/userID/2fa/backup-codes/post.json b/backend/schema/paths/users/userID/2fa/backup-codes/post.json index ab2faa49..ebfc8c2a 100644 --- a/backend/schema/paths/users/userID/2fa/backup-codes/post.json +++ b/backend/schema/paths/users/userID/2fa/backup-codes/post.json @@ -2,6 +2,19 @@ "operationId": "regenUser2faCodes", "summary": "Regenerate 2FA backup codes", "tags": ["users"], + "parameters": [ + { + "in": "path", + "name": "userID", + "schema": { + "type": "integer", + "minimum": 1 + }, + "required": true, + "description": "User ID", + "example": 2 + } + ], "requestBody": { "description": "Verififcation Payload", "required": true, diff --git a/backend/schema/paths/users/userID/2fa/delete.json b/backend/schema/paths/users/userID/2fa/delete.json index a1c53697..d308be7f 100644 --- a/backend/schema/paths/users/userID/2fa/delete.json +++ b/backend/schema/paths/users/userID/2fa/delete.json @@ -2,6 +2,19 @@ "operationId": "disableUser2fa", "summary": "Disable 2fa for user", "tags": ["users"], + "parameters": [ + { + "in": "path", + "name": "userID", + "schema": { + "type": "integer", + "minimum": 1 + }, + "required": true, + "description": "User ID", + "example": 2 + } + ], "requestBody": { "description": "2fa Code Payload", "required": true, diff --git a/backend/schema/paths/users/userID/2fa/enable/post.json b/backend/schema/paths/users/userID/2fa/enable/post.json index bab0b17e..f08b681f 100644 --- a/backend/schema/paths/users/userID/2fa/enable/post.json +++ b/backend/schema/paths/users/userID/2fa/enable/post.json @@ -2,6 +2,19 @@ "operationId": "enableUser2fa", "summary": "Verify code and enable 2FA", "tags": ["users"], + "parameters": [ + { + "in": "path", + "name": "userID", + "schema": { + "type": "integer", + "minimum": 1 + }, + "required": true, + "description": "User ID", + "example": 2 + } + ], "requestBody": { "description": "Verififcation Payload", "required": true, diff --git a/backend/schema/paths/users/userID/2fa/get.json b/backend/schema/paths/users/userID/2fa/get.json index 52fff724..ff8f9d4a 100644 --- a/backend/schema/paths/users/userID/2fa/get.json +++ b/backend/schema/paths/users/userID/2fa/get.json @@ -7,6 +7,19 @@ "bearerAuth": [] } ], + "parameters": [ + { + "in": "path", + "name": "userID", + "schema": { + "type": "integer", + "minimum": 1 + }, + "required": true, + "description": "User ID", + "example": 2 + } + ], "responses": { "200": { "description": "200 response", diff --git a/backend/schema/paths/users/userID/2fa/post.json b/backend/schema/paths/users/userID/2fa/post.json index bd13c825..cef5d196 100644 --- a/backend/schema/paths/users/userID/2fa/post.json +++ b/backend/schema/paths/users/userID/2fa/post.json @@ -2,6 +2,19 @@ "operationId": "setupUser2fa", "summary": "Start 2FA setup, returns QR code URL", "tags": ["users"], + "parameters": [ + { + "in": "path", + "name": "userID", + "schema": { + "type": "integer", + "minimum": 1 + }, + "required": true, + "description": "User ID", + "example": 2 + } + ], "responses": { "200": { "content": { diff --git a/frontend/src/locale/src/pl.json b/frontend/src/locale/src/pl.json index 8fa3bc33..a5fb2ad0 100644 --- a/frontend/src/locale/src/pl.json +++ b/frontend/src/locale/src/pl.json @@ -41,15 +41,15 @@ "action.allow": { "defaultMessage": "Zezwól" }, - "action.deny": { - "defaultMessage": "Odrzuć" - }, "action.close": { "defaultMessage": "Zamknij" }, "action.delete": { "defaultMessage": "Usuń" }, + "action.deny": { + "defaultMessage": "Odrzuć" + }, "action.disable": { "defaultMessage": "Wyłącz" }, From c1ad7788f15235e96532b57e79101c3825774595 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Wed, 14 Jan 2026 13:24:38 +1000 Subject: [PATCH 54/55] Changed 2fa delete from body to query for code as per best practices --- backend/routes/users.js | 10 ++--- .../schema/paths/users/userID/2fa/delete.json | 37 +++++++------------ .../schema/paths/users/userID/2fa/get.json | 10 ++--- frontend/src/api/backend/base.ts | 1 - frontend/src/api/backend/twoFactor.ts | 26 +++---------- 5 files changed, 28 insertions(+), 56 deletions(-) diff --git a/backend/routes/users.js b/backend/routes/users.js index 23e75862..7c3da8c1 100644 --- a/backend/routes/users.js +++ b/backend/routes/users.js @@ -370,16 +370,16 @@ router }) /** - * DELETE /api/users/123/2fa + * DELETE /api/users/123/2fa?code=XXXXXX * * Disable 2FA for a user */ .delete(async (req, res, next) => { try { - const { code } = await apiValidator( - getValidationSchema("/users/{userID}/2fa", "delete"), - req.body, - ); + const code = typeof req.query.code === "string" ? req.query.code : null; + if (!code) { + throw new errs.ValidationError("Missing required parameter: code"); + } await internal2FA.disable(res.locals.access, req.params.user_id, code); res.status(200).send(true); } catch (err) { diff --git a/backend/schema/paths/users/userID/2fa/delete.json b/backend/schema/paths/users/userID/2fa/delete.json index d308be7f..bff292d8 100644 --- a/backend/schema/paths/users/userID/2fa/delete.json +++ b/backend/schema/paths/users/userID/2fa/delete.json @@ -13,32 +13,21 @@ "required": true, "description": "User ID", "example": 2 + }, + { + "in": "query", + "name": "code", + "schema": { + "type": "string", + "minLength": 6, + "maxLength": 6, + "example": "012345" + }, + "required": true, + "description": "2fa Code", + "example": "012345" } ], - "requestBody": { - "description": "2fa Code Payload", - "required": true, - "content": { - "application/json": { - "schema": { - "additionalProperties": false, - "properties": { - "code": { - "minLength": 6, - "maxLength": 6, - "type": "string", - "example": "012345" - } - }, - "required": ["code"], - "type": "object" - }, - "example": { - "code": "012345" - } - } - } - }, "responses": { "200": { "content": { diff --git a/backend/schema/paths/users/userID/2fa/get.json b/backend/schema/paths/users/userID/2fa/get.json index ff8f9d4a..78ce1886 100644 --- a/backend/schema/paths/users/userID/2fa/get.json +++ b/backend/schema/paths/users/userID/2fa/get.json @@ -27,12 +27,10 @@ "application/json": { "examples": { "default": { - "value": [ - { - "enabled": false, - "backup_codes_remaining": 0 - } - ] + "value": { + "enabled": false, + "backup_codes_remaining": 0 + } } }, "schema": { diff --git a/frontend/src/api/backend/base.ts b/frontend/src/api/backend/base.ts index 54eed050..d56f120c 100644 --- a/frontend/src/api/backend/base.ts +++ b/frontend/src/api/backend/base.ts @@ -156,7 +156,6 @@ export async function del({ url, params }: DeleteArgs, abortController?: AbortCo const method = "DELETE"; const headers = { ...buildAuthHeader(), - [contentTypeHeader]: "application/json", }; const signal = abortController?.signal; const response = await fetch(apiUrl, { method, headers, signal }); diff --git a/frontend/src/api/backend/twoFactor.ts b/frontend/src/api/backend/twoFactor.ts index b50b69f1..855e9cc1 100644 --- a/frontend/src/api/backend/twoFactor.ts +++ b/frontend/src/api/backend/twoFactor.ts @@ -1,5 +1,3 @@ -import { camelizeKeys, decamelizeKeys } from "humps"; -import AuthStore from "src/modules/AuthStore"; import * as api from "./base"; import type { TwoFactorEnableResponse, TwoFactorSetupResponse, TwoFactorStatusResponse } from "./responseTypes"; @@ -22,25 +20,13 @@ export async function enable2FA(userId: number | "me", code: string): Promise { - const headers: Record = { - "Content-Type": "application/json", - }; - if (AuthStore.token) { - headers.Authorization = `Bearer ${AuthStore.token.token}`; - } - - const response = await fetch(`/api/users/${userId}/2fa`, { - method: "DELETE", - headers, - body: JSON.stringify(decamelizeKeys({ code })), +export async function disable2FA(userId: number | "me", code: string): Promise { + return await api.del({ + url: `/users/${userId}/2fa`, + params: { + code, + }, }); - - const payload = await response.json(); - if (!response.ok) { - throw new Error(payload.error?.messageI18n || payload.error?.message || "Failed to disable 2FA"); - } - return camelizeKeys(payload) as { success: boolean }; } export async function regenerateBackupCodes(userId: number | "me", code: string): Promise { From ee4220234882c6bd687434511afcdd44decd6887 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Wed, 14 Jan 2026 13:34:17 +1000 Subject: [PATCH 55/55] Bump version --- .version | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.version b/.version index 8bbab562..14239ef1 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.13.5 +2.13.6 diff --git a/README.md b/README.md index 5ba3650b..a27a58e4 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@



- +